bayesplot/0000755000176200001440000000000014563320543012261 5ustar liggesusersbayesplot/NAMESPACE0000644000176200001440000001257214556270424013513 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method("[",neff_ratio) S3method("[",rhat) S3method(apply_transformations,array) S3method(apply_transformations,matrix) S3method(diagnostic_factor,neff_ratio) S3method(diagnostic_factor,rhat) S3method(log_posterior,CmdStanMCMC) S3method(log_posterior,stanfit) S3method(log_posterior,stanreg) S3method(melt_mcmc,matrix) S3method(melt_mcmc,mcmc_array) S3method(neff_ratio,CmdStanMCMC) S3method(neff_ratio,stanfit) S3method(neff_ratio,stanreg) S3method(num_chains,data.frame) S3method(num_chains,mcmc_array) S3method(num_iters,data.frame) S3method(num_iters,mcmc_array) S3method(num_params,data.frame) S3method(num_params,mcmc_array) S3method(nuts_params,CmdStanMCMC) S3method(nuts_params,list) S3method(nuts_params,stanfit) S3method(nuts_params,stanreg) S3method(parameter_names,array) S3method(parameter_names,default) S3method(parameter_names,matrix) S3method(plot,bayesplot_grid) S3method(plot,bayesplot_scheme) S3method(pp_check,default) S3method(print,bayesplot_function_list) S3method(print,bayesplot_grid) S3method(print,bayesplot_scheme) S3method(rhat,CmdStanMCMC) S3method(rhat,stanfit) S3method(rhat,stanreg) export(abline_01) export(available_mcmc) export(available_ppc) export(available_ppd) export(bayesplot_grid) export(bayesplot_theme_get) export(bayesplot_theme_replace) export(bayesplot_theme_set) export(bayesplot_theme_update) export(color_scheme_get) export(color_scheme_set) export(color_scheme_view) export(example_group_data) export(example_mcmc_draws) export(example_x_data) export(example_y_data) export(example_yrep_draws) export(facet_bg) export(facet_text) export(grid_lines) export(hline_0) export(hline_at) export(lbub) export(legend_move) export(legend_none) export(legend_text) export(log_posterior) export(mcmc_acf) export(mcmc_acf_bar) export(mcmc_areas) export(mcmc_areas_data) export(mcmc_areas_ridges) export(mcmc_areas_ridges_data) export(mcmc_combo) export(mcmc_dens) export(mcmc_dens_chains) export(mcmc_dens_chains_data) export(mcmc_dens_overlay) export(mcmc_hex) export(mcmc_hist) export(mcmc_hist_by_chain) export(mcmc_intervals) export(mcmc_intervals_data) export(mcmc_neff) export(mcmc_neff_data) export(mcmc_neff_hist) export(mcmc_nuts_acceptance) export(mcmc_nuts_divergence) export(mcmc_nuts_energy) export(mcmc_nuts_stepsize) export(mcmc_nuts_treedepth) export(mcmc_pairs) export(mcmc_parcoord) export(mcmc_parcoord_data) export(mcmc_rank_ecdf) export(mcmc_rank_hist) export(mcmc_rank_overlay) export(mcmc_recover_hist) export(mcmc_recover_intervals) export(mcmc_recover_scatter) export(mcmc_rhat) export(mcmc_rhat_data) export(mcmc_rhat_hist) export(mcmc_scatter) export(mcmc_trace) export(mcmc_trace_data) export(mcmc_trace_highlight) export(mcmc_violin) export(neff_ratio) export(nuts_params) export(overlay_function) export(pairs_condition) export(pairs_style_np) export(panel_bg) export(param_glue) export(param_range) export(parcoord_style_np) export(plot_bg) export(pp_check) export(ppc_bars) export(ppc_bars_data) export(ppc_bars_grouped) export(ppc_boxplot) export(ppc_data) export(ppc_dens) export(ppc_dens_overlay) export(ppc_dens_overlay_grouped) export(ppc_ecdf_overlay) export(ppc_ecdf_overlay_grouped) export(ppc_error_binned) export(ppc_error_data) export(ppc_error_hist) export(ppc_error_hist_grouped) export(ppc_error_scatter) export(ppc_error_scatter_avg) export(ppc_error_scatter_avg_grouped) export(ppc_error_scatter_avg_vs_x) export(ppc_freqpoly) export(ppc_freqpoly_grouped) export(ppc_hist) export(ppc_intervals) export(ppc_intervals_data) export(ppc_intervals_grouped) export(ppc_km_overlay) export(ppc_km_overlay_grouped) export(ppc_loo_intervals) export(ppc_loo_pit) export(ppc_loo_pit_data) export(ppc_loo_pit_overlay) export(ppc_loo_pit_qq) export(ppc_loo_ribbon) export(ppc_pit_ecdf) export(ppc_pit_ecdf_grouped) export(ppc_ribbon) export(ppc_ribbon_data) export(ppc_ribbon_grouped) export(ppc_rootogram) export(ppc_scatter) export(ppc_scatter_avg) export(ppc_scatter_avg_data) export(ppc_scatter_avg_grouped) export(ppc_scatter_data) export(ppc_stat) export(ppc_stat_2d) export(ppc_stat_data) export(ppc_stat_freqpoly) export(ppc_stat_freqpoly_grouped) export(ppc_stat_grouped) export(ppc_violin_grouped) export(ppd_boxplot) export(ppd_data) export(ppd_dens) export(ppd_dens_overlay) export(ppd_ecdf_overlay) export(ppd_freqpoly) export(ppd_freqpoly_grouped) export(ppd_hist) export(ppd_intervals) export(ppd_intervals_data) export(ppd_intervals_grouped) export(ppd_ribbon) export(ppd_ribbon_data) export(ppd_ribbon_grouped) export(ppd_stat) export(ppd_stat_2d) export(ppd_stat_data) export(ppd_stat_freqpoly) export(ppd_stat_freqpoly_grouped) export(ppd_stat_grouped) export(rhat) export(scatter_style_np) export(theme_default) export(trace_style_np) export(vars) export(vline_0) export(vline_at) export(xaxis_text) export(xaxis_ticks) export(xaxis_title) export(yaxis_text) export(yaxis_ticks) export(yaxis_title) import(ggplot2) import(rlang) import(stats) importFrom(dplyr,"%>%") importFrom(dplyr,across) importFrom(dplyr,all_of) importFrom(dplyr,arrange) importFrom(dplyr,count) importFrom(dplyr,full_join) importFrom(dplyr,group_by) importFrom(dplyr,inner_join) importFrom(dplyr,left_join) importFrom(dplyr,mutate) importFrom(dplyr,n) importFrom(dplyr,one_of) importFrom(dplyr,pull) importFrom(dplyr,rename) importFrom(dplyr,select) importFrom(dplyr,summarise) importFrom(dplyr,top_n) importFrom(dplyr,ungroup) importFrom(dplyr,vars) importFrom(ggplot2,"%+replace%") bayesplot/man/0000755000176200001440000000000014560773547013051 5ustar liggesusersbayesplot/man/bayesplot_theme_get.Rd0000644000176200001440000000635714212422623017352 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-ggplot-themes.R \name{bayesplot_theme_get} \alias{bayesplot_theme_get} \alias{bayesplot_theme_set} \alias{bayesplot_theme_update} \alias{bayesplot_theme_replace} \title{Get, set, and modify the active \strong{bayesplot} theme} \usage{ bayesplot_theme_get() bayesplot_theme_set(new = theme_default()) bayesplot_theme_update(...) bayesplot_theme_replace(...) } \arguments{ \item{new}{The new theme (list of theme elements) to use. This is analogous to the \code{new} argument to \code{\link[ggplot2:theme_get]{ggplot2::theme_set()}}.} \item{...}{A named list of theme settings.} } \value{ \code{bayesplot_theme_get()} returns the current theme. The other three functions (set, update, replace) invisibly return the \emph{previous} theme so it can be saved and easily restored later. This is the same behavior as the \strong{ggplot2} versions of these functions. } \description{ These functions are the \strong{bayesplot} equivalent to \strong{ggplot2}'s \code{\link[ggplot2:theme_get]{ggplot2::theme_set()}} and friends. They set, get, and update the active theme but only apply them to \code{bayesplots}. The current/active theme is automatically applied to every \code{bayesplot} you draw. Use \code{bayesplot_theme_get()} to get the current \strong{bayesplot} theme and \code{bayesplot_theme_set()} to set a new theme. \code{bayesplot_theme_update()} and \code{bayesplot_theme_replace()} are shorthands for changing individual elements. } \details{ \code{bayesplot_theme_set()} and friends only apply to \code{bayesplots}. However, \code{\link[ggplot2:theme_get]{ggplot2::theme_set()}} can also be used to change the \strong{bayesplot} theme. Currently, setting a theme with \code{ggplot2::theme_set()} (other than the \strong{ggplot2} default \code{\link[ggplot2:ggtheme]{ggplot2::theme_grey()}}) will override the \strong{bayesplot} theme. } \examples{ library(ggplot2) # plot using the current value of bayesplot_theme_get() # (the default is bayesplot::theme_default()) x <- example_mcmc_draws() mcmc_hist(x) # change the bayesplot theme to theme_minimal and save the old theme old <- bayesplot_theme_set(theme_minimal()) mcmc_hist(x) # change back to the previous theme bayesplot_theme_set(old) mcmc_hist(x) # change the default font size and family for bayesplots bayesplot_theme_update(text = element_text(size = 16, family = "sans")) mcmc_hist(x) # change back to the default bayesplot_theme_set() # same as bayesplot_theme_set(theme_default()) mcmc_hist(x) # updating theme elements color_scheme_set("brightblue") bayesplot_theme_set(theme_dark()) mcmc_hist(x) bayesplot_theme_update(panel.background = element_rect(fill = "black")) mcmc_hist(x) # to get the same plot without updating the theme we could also have # used the bayeplot convenience function panel_bg() bayesplot_theme_set(theme_dark()) mcmc_hist(x) + panel_bg(fill = "black") # reset bayesplot_theme_set() } \seealso{ \code{\link[=theme_default]{theme_default()}} for the default \strong{bayesplot} theme. \link{bayesplot-helpers} for a variety of convenience functions, many of which provide shortcuts for tweaking theme elements after creating a plot. \link{bayesplot-colors} to set or view the color scheme used for plotting. } bayesplot/man/PPD-overview.Rd0000644000176200001440000000453714335220171015614 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppd-overview.R \name{PPD-overview} \alias{PPD-overview} \alias{PPD} \title{Plots of posterior or prior predictive distributions} \description{ The \strong{bayesplot} PPD module provides various plotting functions for creating graphical displays of simulated data from the posterior or prior predictive distribution. These plots are essentially the same as the corresponding \link{PPC} plots but without showing any observed data. Because these are not "checks" compared to data we use PPD (for prior/posterior predictive distribution) instead of PPC (for prior/posterior predictive check). } \section{PPD plotting functions}{ The functions for plotting prior and posterior predictive distributions without observed data each have the prefix \code{ppd_} and all have a required argument \code{ypred} (a matrix of predictions). The plots are organized into several categories, each with its own documentation: \itemize{ \item \link{PPD-distributions}: Histograms, kernel density estimates, boxplots, and other plots of multiple simulated datasets (rows) in \code{ypred}. These are the same as the plots in \link{PPC-distributions} but without including any comparison to \code{y}. \item \link{PPD-intervals}: Interval estimates for each predicted observations (columns) in \code{ypred}. The x-axis variable can be optionally specified by the user (e.g. to plot against against a predictor variable or over time).These are the same as the plots in \link{PPC-intervals} but without including any comparison to \code{y}. \item \link{PPD-test-statistics}: The distribution of a statistic, or a pair of statistics, over the simulated datasets (rows) in \code{ypred}. These are the same as the plots in \link{PPC-test-statistics} but without including any comparison to \code{y}. } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) } \seealso{ Other PPDs: \code{\link{PPD-distributions}}, \code{\link{PPD-intervals}}, \code{\link{PPD-test-statistics}} } \concept{PPDs} bayesplot/man/MCMC-parcoord.Rd0000644000176200001440000001774114335220171015654 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-parcoord.R \name{MCMC-parcoord} \alias{MCMC-parcoord} \alias{mcmc_parcoord} \alias{mcmc_parcoord_data} \alias{parcoord_style_np} \title{Parallel coordinates plot of MCMC draws} \usage{ mcmc_parcoord( x, pars = character(), regex_pars = character(), transformations = list(), ..., size = 0.2, alpha = 0.3, np = NULL, np_style = parcoord_style_np() ) mcmc_parcoord_data( x, pars = character(), regex_pars = character(), transformations = list(), np = NULL ) parcoord_style_np(div_color = "red", div_size = 0.2, div_alpha = 0.2) } \arguments{ \item{x}{An object containing MCMC draws: \itemize{ \item A 3-D array, matrix, list of matrices, or data frame. The \link{MCMC-overview} page provides details on how to specify each these. \item A \code{draws} object from the \pkg{\link{posterior}} package (e.g., \code{draws_array}, \code{draws_rvars}, etc.). \item An object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page. }} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{transformations}{Optionally, transformations to apply to parameters before plotting. If \code{transformations} is a function or a single string naming a function then that function will be used to transform all parameters. To apply transformations to particular parameters, the \code{transformations} argument can be a named list with length equal to the number of parameters to be transformed. Currently only univariate transformations of scalar parameters can be specified (multivariate transformations will be implemented in a future release). If \code{transformations} is a list, the name of each list element should be a parameter name and the content of each list element should be a function (or any item to match as a function via \code{\link[=match.fun]{match.fun()}}, e.g. a string naming a function). If a function is specified by its name as a string (e.g. \code{"log"}), then it can be used to construct a new parameter label for the appropriate parameter (e.g. \code{"log(sigma)"}). If a function itself is specified (e.g. \code{log} or \code{function(x) log(x)}) then \code{"t"} is used in the new parameter label to indicate that the parameter is transformed (e.g. \code{"t(sigma)"}). Note: due to partial argument matching \code{transformations} can be abbreviated for convenience in interactive use (e.g., \code{transform}).} \item{...}{Currently ignored.} \item{size, alpha}{Arguments passed on to \code{\link[ggplot2:geom_path]{ggplot2::geom_line()}}.} \item{np}{For models fit using \link{NUTS} (more generally, any \href{https://en.wikipedia.org/wiki/Symplectic_integrator}{symplectic integrator}), an optional data frame providing NUTS diagnostic information. The data frame should be the object returned by \code{\link[=nuts_params]{nuts_params()}} or one with the same structure.} \item{np_style}{A call to the \code{parcoord_style_np()} helper function to specify arguments controlling the appearance of superimposed lines representing NUTS diagnostics (in this case divergences) if the \code{np} argument is specified.} \item{div_color, div_size, div_alpha}{Optional arguments to the \code{parcoord_style_np()} helper function that are eventually passed to \code{\link[ggplot2:geom_path]{ggplot2::geom_line()}} if the \code{np} argument is also specified. They control the color, size, and transparency specifications for showing divergences in the plot. The default values are displayed in the \strong{Usage} section above.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Parallel coordinates plot of MCMC draws (one dimension per parameter). See the \strong{Plot Descriptions} section below for details, and see \href{https://github.com/jgabry/bayes-vis-paper#readme}{Gabry et al. (2019)} for more background and a real example. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_parcoord()}}{ \href{https://en.wikipedia.org/wiki/Parallel_coordinates}{Parallel coordinates plot} of MCMC draws. There is one dimension per parameter along the horizontal axis and each set of connected line segments represents a single MCMC draw (i.e., a vector of length equal to the number of parameters). The parallel coordinates plot is most useful if the optional HMC/NUTS diagnostic information is provided via the \code{np} argument. In that case divergences are highlighted in the plot. The appearance of the divergences can be customized using the \code{np_style} argument and the \code{parcoord_style_np} helper function. This version of the plot is the same as the parallel coordinates plot described in Gabry et al. (2019). When the plotted model parameters are on very different scales the \code{transformations} argument can be useful. For example, to standardize all variables before plotting you could use function \code{(x - mean(x))/sd(x)} when specifying the \code{transformations} argument to \code{mcmc_parcoord}. See the \strong{Examples} section for how to do this. } } } \examples{ color_scheme_set("pink") x <- example_mcmc_draws(params = 5) mcmc_parcoord(x) mcmc_parcoord(x, regex_pars = "beta") \dontrun{ # Example using a Stan demo model library(rstan) fit <- stan_demo("eight_schools") draws <- as.array(fit, pars = c("mu", "tau", "theta", "lp__")) np <- nuts_params(fit) str(np) levels(np$Parameter) color_scheme_set("brightblue") mcmc_parcoord(draws, alpha = 0.05) mcmc_parcoord(draws, np = np) # customize appearance of divergences color_scheme_set("darkgray") div_style <- parcoord_style_np(div_color = "green", div_size = 0.05, div_alpha = 0.4) mcmc_parcoord(draws, size = 0.25, alpha = 0.1, np = np, np_style = div_style) # to use a transformation (e.g., standardizing all the variables can be helpful) # specify the 'transformations' argument (though partial argument name # matching means we can just use 'trans' or 'transform') mcmc_parcoord( draws, transform = function(x) {(x - mean(x)) / sd(x)}, size = 0.25, alpha = 0.1, np = np, np_style = div_style ) # mcmc_parcoord_data returns just the data in a conventient form for plotting d <- mcmc_parcoord_data(x, np = np) head(d) tail(d) } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) Hartikainen, A. (2017, Aug 23). Concentration of divergences (Msg 21). Message posted to The Stan Forums: \url{https://discourse.mc-stan.org/t/concentration-of-divergences/1590/21}. } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/PPC-test-statistics.Rd0000644000176200001440000001661214556270424017124 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-test-statistics.R \name{PPC-test-statistics} \alias{PPC-test-statistics} \alias{PPC-statistics} \alias{ppc_stat} \alias{ppc_stat_grouped} \alias{ppc_stat_freqpoly} \alias{ppc_stat_freqpoly_grouped} \alias{ppc_stat_2d} \alias{ppc_stat_data} \title{PPC test statistics} \usage{ ppc_stat( y, yrep, stat = "mean", ..., binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE ) ppc_stat_grouped( y, yrep, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE ) ppc_stat_freqpoly( y, yrep, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, freq = TRUE ) ppc_stat_freqpoly_grouped( y, yrep, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, freq = TRUE ) ppc_stat_2d(y, yrep, stat = c("mean", "sd"), ..., size = 2.5, alpha = 0.7) ppc_stat_data(y, yrep, group = NULL, stat) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \code{S} by \code{N} matrix of draws from the posterior (or prior) predictive distribution. The number of rows, \code{S}, is the size of the posterior (or prior) sample used to generate \code{yrep}. The number of columns, \code{N} is the number of predicted observations (\code{length(y)}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See the \strong{Details} and \strong{Plot Descriptions} sections for additional advice specific to particular plots.} \item{stat}{A single function or a string naming a function, except for the 2D plot which requires a vector of exactly two names or functions. In all cases the function(s) should take a vector input and return a scalar statistic. If specified as a string (or strings) then the legend will display the function name(s). If specified as a function (or functions) then generic naming is used in the legend.} \item{...}{Currently unused.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{bins}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{freq}{For histograms, \code{freq=TRUE} (the default) puts count on the y-axis. Setting \code{freq=FALSE} puts density on the y-axis. (For many plots the y-axis text is off by default. To view the count or density labels on the y-axis see the \code{\link[=yaxis_text]{yaxis_text()}} convenience function.)} \item{group}{A grouping variable of the same length as \code{y}. Will be coerced to \link[base:factor]{factor} if not already a factor. Each value in \code{group} is interpreted as the group level pertaining to the corresponding observation.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting. Note: if \code{scales} is not included in \code{facet_args} then \strong{bayesplot} may use \code{scales="free"} as the default (depending on the plot) instead of the \strong{ggplot2} default of \code{scales="fixed"}.} \item{size, alpha}{For the 2D plot only, arguments passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the appearance of scatterplot points.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ The distribution of a (test) statistic \code{T(yrep)}, or a pair of (test) statistics, over the simulated datasets in \code{yrep}, compared to the observed value \code{T(y)} computed from the data \code{y}. See the \strong{Plot Descriptions} and \strong{Details} sections, below, as well as \href{https://github.com/jgabry/bayes-vis-paper#readme}{Gabry et al. (2019)}. } \details{ For Binomial data, the plots may be more useful if the input contains the "success" \emph{proportions} (not discrete "success" or "failure" counts). } \section{Plot Descriptions}{ \describe{ \item{\code{ppc_stat()}, \code{ppc_stat_freqpoly()}}{ A histogram or frequency polygon of the distribution of a statistic computed by applying \code{stat} to each dataset (row) in \code{yrep}. The value of the statistic in the observed data, \code{stat(y)}, is overlaid as a vertical line. More details and example usage of \code{ppc_stat()} can be found in Gabry et al. (2019). } \item{\code{ppc_stat_grouped()},\code{ppc_stat_freqpoly_grouped()}}{ The same as \code{ppc_stat()} and \code{ppc_stat_freqpoly()}, but a separate plot is generated for each level of a grouping variable. More details and example usage of \code{ppc_stat_grouped()} can be found in Gabry et al. (2019). } \item{\code{ppc_stat_2d()}}{ A scatterplot showing the joint distribution of two statistics computed over the datasets (rows) in \code{yrep}. The value of the statistics in the observed data is overlaid as large point. } } } \examples{ y <- example_y_data() yrep <- example_yrep_draws() ppc_stat(y, yrep) ppc_stat(y, yrep, stat = "sd") + legend_none() # use your own function for the 'stat' argument color_scheme_set("brightblue") q25 <- function(y) quantile(y, 0.25) ppc_stat(y, yrep, stat = "q25") # legend includes function name # can define the function in the 'stat' argument instead of # using its name but then the legend doesn't include the function name ppc_stat(y, yrep, stat = function(y) quantile(y, 0.25)) # plots by group color_scheme_set("teal") group <- example_group_data() ppc_stat_grouped(y, yrep, group) ppc_stat_grouped(y, yrep, group) + yaxis_text() # force y-axes to have same scales, allow x axis to vary ppc_stat_grouped(y, yrep, group, facet_args = list(scales = "free_x")) + yaxis_text() # the freqpoly plots use frequency polygons instead of histograms ppc_stat_freqpoly(y, yrep, stat = "median") ppc_stat_freqpoly_grouped(y, yrep, group, stat = "median", facet_args = list(nrow = 2)) # ppc_stat_2d allows 2 statistics and makes a scatterplot bayesplot_theme_set(ggplot2::theme_linedraw()) color_scheme_set("viridisE") ppc_stat_2d(y, yrep, stat = c("mean", "sd")) bayesplot_theme_set(ggplot2::theme_grey()) color_scheme_set("brewer-Paired") ppc_stat_2d(y, yrep, stat = c("median", "mad")) # reset aesthetics color_scheme_set() bayesplot_theme_set() } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}} } \concept{PPCs} bayesplot/man/MCMC-diagnostics.Rd0000644000176200001440000001674214556270424016365 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-diagnostics.R \name{MCMC-diagnostics} \alias{MCMC-diagnostics} \alias{mcmc_rhat} \alias{mcmc_rhat_hist} \alias{mcmc_rhat_data} \alias{mcmc_neff} \alias{mcmc_neff_hist} \alias{mcmc_neff_data} \alias{mcmc_acf} \alias{mcmc_acf_bar} \title{General MCMC diagnostics} \usage{ mcmc_rhat(rhat, ..., size = NULL) mcmc_rhat_hist(rhat, ..., binwidth = NULL, bins = NULL, breaks = NULL) mcmc_rhat_data(rhat, ...) mcmc_neff(ratio, ..., size = NULL) mcmc_neff_hist(ratio, ..., binwidth = NULL, bins = NULL, breaks = NULL) mcmc_neff_data(ratio, ...) mcmc_acf( x, pars = character(), regex_pars = character(), ..., facet_args = list(), lags = 20, size = NULL ) mcmc_acf_bar( x, pars = character(), regex_pars = character(), ..., facet_args = list(), lags = 20 ) } \arguments{ \item{rhat}{A vector of R-hat estimates.} \item{...}{Currently ignored.} \item{size}{Optional values to override \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}}'s default size (for \code{mcmc_rhat()}, \code{mcmc_neff()}) or \code{\link[ggplot2:geom_path]{ggplot2::geom_line()}}'s default line width (for \code{mcmc_acf()}).} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{bins}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{ratio}{A vector of \emph{ratios} of effective sample size estimates to total sample size. See \code{\link[=neff_ratio]{neff_ratio()}}.} \item{x}{An object containing MCMC draws: \itemize{ \item A 3-D array, matrix, list of matrices, or data frame. The \link{MCMC-overview} page provides details on how to specify each these. \item A \code{draws} object from the \pkg{\link{posterior}} package (e.g., \code{draws_array}, \code{draws_rvars}, etc.). \item An object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page. }} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting. Note: if \code{scales} is not included in \code{facet_args} then \strong{bayesplot} may use \code{scales="free"} as the default (depending on the plot) instead of the \strong{ggplot2} default of \code{scales="fixed"}.} \item{lags}{The number of lags to show in the autocorrelation plot.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Plots of Rhat statistics, ratios of effective sample size to total sample size, and autocorrelation of MCMC draws. See the \strong{Plot Descriptions} section, below, for details. For models fit using the No-U-Turn-Sampler, see also \link{MCMC-nuts} for additional MCMC diagnostic plots. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_rhat()}, \code{mcmc_rhat_hist()}}{ Rhat values as either points or a histogram. Values are colored using different shades (lighter is better). The chosen thresholds are somewhat arbitrary, but can be useful guidelines in practice. \itemize{ \item \emph{light}: below 1.05 (good) \item \emph{mid}: between 1.05 and 1.1 (ok) \item \emph{dark}: above 1.1 (too high) } } \item{\code{mcmc_neff()}, \code{mcmc_neff_hist()}}{ Ratios of effective sample size to total sample size as either points or a histogram. Values are colored using different shades (lighter is better). The chosen thresholds are somewhat arbitrary, but can be useful guidelines in practice. \itemize{ \item \emph{light}: between 0.5 and 1 (high) \item \emph{mid}: between 0.1 and 0.5 (good) \item \emph{dark}: below 0.1 (low) } } \item{\code{mcmc_acf()}, \code{mcmc_acf_bar()}}{ Grid of autocorrelation plots by chain and parameter. The \code{lags} argument gives the maximum number of lags at which to calculate the autocorrelation function. \code{mcmc_acf()} is a line plot whereas \code{mcmc_acf_bar()} is a barplot. } } } \examples{ # autocorrelation x <- example_mcmc_draws() dim(x) dimnames(x) color_scheme_set("green") mcmc_acf(x, pars = c("alpha", "beta[1]")) \donttest{ color_scheme_set("pink") (p <- mcmc_acf_bar(x, pars = c("alpha", "beta[1]"))) # add horiztonal dashed line at 0.5 p + hline_at(0.5, linetype = 2, size = 0.15, color = "gray") } # fake rhat values to use for demonstration rhat <- c(runif(100, 1, 1.15)) mcmc_rhat_hist(rhat) mcmc_rhat(rhat) # lollipops color_scheme_set("purple") mcmc_rhat(rhat[1:10], size = 5) color_scheme_set("blue") mcmc_rhat(runif(1000, 1, 1.07)) mcmc_rhat(runif(1000, 1, 1.3)) + legend_move("top") # add legend above plot # fake neff ratio values to use for demonstration ratio <- c(runif(100, 0, 1)) mcmc_neff_hist(ratio) mcmc_neff(ratio) \dontrun{ # Example using rstanarm model (requires rstanarm package) library(rstanarm) # intentionally use small 'iter' so there are some # problems with rhat and neff for demonstration fit <- stan_glm(mpg ~ ., data = mtcars, iter = 50, refresh = 0) rhats <- rhat(fit) ratios <- neff_ratio(fit) mcmc_rhat(rhats) mcmc_neff(ratios, size = 3) # there's a small enough number of parameters in the # model that we can display their names on the y-axis mcmc_neff(ratios) + yaxis_text(hjust = 1) # can also look at autocorrelation draws <- as.array(fit) mcmc_acf(draws, pars = c("wt", "cyl"), lags = 10) # increase number of iterations and plots look much better fit2 <- update(fit, iter = 500) mcmc_rhat(rhat(fit2)) mcmc_neff(neff_ratio(fit2)) mcmc_acf(as.array(fit2), pars = c("wt", "cyl"), lags = 10) } } \references{ Stan Development Team. \emph{Stan Modeling Language Users Guide and Reference Manual.} \url{https://mc-stan.org/users/documentation/} Gelman, A. and Rubin, D. B. (1992). Inference from iterative simulation using multiple sequences. \emph{Statistical Science}. 7(4), 457--472. } \seealso{ \itemize{ \item The \href{https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html}{Visual MCMC Diagnostics} vignette. \item \link{MCMC-nuts} for additional MCMC diagnostic plots for models fit using the No-U-Turn-Sampler. } Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/pp_check.Rd0000644000176200001440000000551014127610044015072 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pp_check.R \name{pp_check} \alias{pp_check} \alias{pp_check.default} \title{Posterior (or prior) predictive checks (S3 generic and default method)} \usage{ pp_check(object, ...) \method{pp_check}{default}(object, yrep, fun, ...) } \arguments{ \item{object}{Typically a fitted model object. The default method, however, takes \code{object} to be a \code{y} (outcome) vector.} \item{...}{For the generic, arguments passed to individual methods. For the default method, these are additional arguments to pass to \code{fun}.} \item{yrep}{For the default method, a \code{yrep} matrix passed to \code{fun}.} \item{fun}{For the default method, the plotting function to call. Can be any of the \link{PPC} functions. The \code{"ppc_"} prefix can optionally be dropped if \code{fun} is specified as a string.} } \value{ The exact form of the value returned by \code{pp_check()} may vary by the class of \code{object}, but for consistency we encourage authors of methods to return the ggplot object created by one of \strong{bayesplot}'s plotting functions. The default method returns the object returned by \code{fun}. } \description{ S3 generic with simple default method. The intent is to provide a generic so authors of other \R packages who wish to provide interfaces to the functions in \strong{bayesplot} will be encouraged to include \code{pp_check()} methods in their package, preserving the same naming conventions for posterior (and prior) predictive checking across many \R packages for Bayesian inference. This is for the convenience of both users and developers. See the \strong{Details} and \strong{Examples} sections, below, and the package vignettes for examples of defining \code{pp_check()} methods. } \details{ A package that creates fitted model objects of class \code{"foo"} can include a method \code{pp_check.foo()} that prepares the appropriate inputs (\code{y}, \code{yrep}, etc.) for the \strong{bayesplot} functions. The \code{pp_check.foo()} method may, for example, let the user choose between various plots, calling the functions from \strong{bayesplot} internally as needed. See \strong{Examples}, below, and the package vignettes. } \examples{ # default method y <- example_y_data() yrep <- example_yrep_draws() pp_check(y, yrep[1:50,], ppc_dens_overlay) g <- example_group_data() pp_check(y, yrep, fun = "stat_grouped", group = g, stat = "median") # defining a method x <- list(y = rnorm(50), yrep = matrix(rnorm(5000), nrow = 100, ncol = 50)) class(x) <- "foo" pp_check.foo <- function(object, ..., type = c("multiple", "overlaid")) { y <- object[["y"]] yrep <- object[["yrep"]] switch(match.arg(type), multiple = ppc_hist(y, yrep[1:min(8, nrow(yrep)),, drop = FALSE]), overlaid = ppc_dens_overlay(y, yrep)) } pp_check(x) pp_check(x, type = "overlaid") } bayesplot/man/MCMC-nuts.Rd0000644000176200001440000001552414556270424015044 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-diagnostics-nuts.R \name{MCMC-nuts} \alias{MCMC-nuts} \alias{NUTS} \alias{mcmc_nuts_acceptance} \alias{mcmc_nuts_divergence} \alias{mcmc_nuts_stepsize} \alias{mcmc_nuts_treedepth} \alias{mcmc_nuts_energy} \title{Diagnostic plots for the No-U-Turn-Sampler (NUTS)} \usage{ mcmc_nuts_acceptance( x, lp, chain = NULL, ..., binwidth = NULL, bins = NULL, breaks = NULL ) mcmc_nuts_divergence(x, lp, chain = NULL, ...) mcmc_nuts_stepsize(x, lp, chain = NULL, ...) mcmc_nuts_treedepth(x, lp, chain = NULL, ...) mcmc_nuts_energy( x, ..., binwidth = NULL, bins = NULL, breaks = NULL, alpha = 0.5, merge_chains = FALSE ) } \arguments{ \item{x}{A molten data frame of NUTS sampler parameters, either created by \code{\link[=nuts_params]{nuts_params()}} or in the same form as the object returned by \code{\link[=nuts_params]{nuts_params()}}.} \item{lp}{A molten data frame of draws of the log-posterior or, more commonly, of a quantity equal to the log-posterior up to a constant. \code{lp} should either be created via \code{\link[=log_posterior]{log_posterior()}} or be an object with the same form as the object returned by \code{\link[=log_posterior]{log_posterior()}}.} \item{chain}{A positive integer for selecting a particular chain. The default (\code{NULL}) is to merge the chains before plotting. If \code{chain = k} then the plot for chain \code{k} is overlaid (in a darker shade but with transparency) on top of the plot for all chains. The \code{chain} argument is not used by \code{mcmc_nuts_energy()}.} \item{...}{Currently ignored.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{bins}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{alpha}{For \code{mcmc_nuts_energy()} only, the transparency (alpha) level in \verb{[0,1]} used for the overlaid histogram.} \item{merge_chains}{For \code{mcmc_nuts_energy()} only, should all chains be merged or displayed separately? The default is \code{FALSE}, i.e., to show the chains separately.} } \value{ A gtable object (the result of calling \code{\link[gridExtra:arrangeGrob]{gridExtra::arrangeGrob()}}) created from several ggplot objects, except for \code{mcmc_nuts_energy()}, which returns a ggplot object. } \description{ Diagnostic plots for the No-U-Turn-Sampler (NUTS), the default MCMC algorithm used by \href{https://mc-stan.org}{Stan}. See the \strong{Plot Descriptions} section, below. } \section{Quick Definitions}{ For more details see Stan Development Team (2016) and Betancourt (2017). \itemize{ \item \code{accept_stat__}: the average acceptance probabilities of all possible samples in the proposed tree. \item \code{divergent__}: the number of leapfrog transitions with diverging error. Because NUTS terminates at the first divergence this will be either 0 or 1 for each iteration. \item \code{stepsize__}: the step size used by NUTS in its Hamiltonian simulation. \item \code{treedepth__}: the depth of tree used by NUTS, which is the log (base 2) of the number of leapfrog steps taken during the Hamiltonian simulation. \item \code{energy__}: the value of the Hamiltonian (up to an additive constant) at each iteration. } } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_nuts_acceptance()}}{ Three plots: \itemize{ \item Histogram of \code{accept_stat__} with vertical lines indicating the mean (solid line) and median (dashed line). \item Histogram of \code{lp__} with vertical lines indicating the mean (solid line) and median (dashed line). \item Scatterplot of \code{accept_stat__} vs \code{lp__}. } } \item{\code{mcmc_nuts_divergence()}}{ Two plots: \itemize{ \item Violin plots of \code{lp__|divergent__=1} and \code{lp__|divergent__=0}. \item Violin plots of \code{accept_stat__|divergent__=1} and \code{accept_stat__|divergent__=0}. } } \item{\code{mcmc_nuts_stepsize()}}{ Two plots: \itemize{ \item Violin plots of \code{lp__} by chain ordered by \code{stepsize__} value. \item Violin plots of \code{accept_stat__} by chain ordered by \code{stepsize__} value. } } \item{\code{mcmc_nuts_treedepth()}}{ Three plots: \itemize{ \item Violin plots of \code{lp__} by value of \code{treedepth__}. \item Violin plots of \code{accept_stat__} by value of \code{treedepth__}. \item Histogram of \code{treedepth__}. } } \item{\code{mcmc_nuts_energy()}}{ Overlaid histograms showing \code{energy__} vs the change in \code{energy__}. See Betancourt (2016) for details. } } } \examples{ \dontrun{ library(ggplot2) library(rstanarm) fit <- stan_glm(mpg ~ wt + am, data = mtcars, iter = 1000, refresh = 0) np <- nuts_params(fit) lp <- log_posterior(fit) color_scheme_set("brightblue") mcmc_nuts_acceptance(np, lp) mcmc_nuts_acceptance(np, lp, chain = 2) mcmc_nuts_divergence(np, lp) mcmc_nuts_stepsize(np, lp) mcmc_nuts_treedepth(np, lp) color_scheme_set("red") mcmc_nuts_energy(np) mcmc_nuts_energy(np, merge_chains = TRUE, binwidth = .15) mcmc_nuts_energy(np) + facet_wrap(vars(Chain), nrow = 1) + coord_fixed(ratio = 150) + ggtitle("NUTS Energy Diagnostic") } } \references{ Betancourt, M. (2017). A conceptual introduction to Hamiltonian Monte Carlo. \url{https://arxiv.org/abs/1701.02434} Betancourt, M. and Girolami, M. (2013). Hamiltonian Monte Carlo for hierarchical models. \url{https://arxiv.org/abs/1312.0906} Hoffman, M. D. and Gelman, A. (2014). The No-U-Turn Sampler: adaptively setting path lengths in Hamiltonian Monte Carlo. \emph{Journal of Machine Learning Research}. 15:1593--1623. Stan Development Team. \emph{Stan Modeling Language Users Guide and Reference Manual.} \url{https://mc-stan.org/users/documentation/} } \seealso{ \itemize{ \item The \href{https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html}{Visual MCMC Diagnostics} vignette. \item Several other plotting functions are not NUTS-specific but take optional extra arguments if the model was fit using NUTS: \itemize{ \item \code{\link[=mcmc_trace]{mcmc_trace()}}: show divergences as tick marks below the trace plot. \item \code{\link[=mcmc_parcoord]{mcmc_parcoord()}}: change the color/size/transparency of lines corresponding to divergences. \item \code{\link[=mcmc_scatter]{mcmc_scatter()}}: change the color/size/shape of points corresponding to divergences. \item \code{\link[=mcmc_pairs]{mcmc_pairs()}}: change the color/size/shape of points corresponding divergences and/or max treedepth saturation. } } Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/PPC-intervals.Rd0000644000176200001440000001712314335264324015757 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-intervals.R \name{PPC-intervals} \alias{PPC-intervals} \alias{ppc_intervals} \alias{ppc_intervals_grouped} \alias{ppc_ribbon} \alias{ppc_ribbon_grouped} \alias{ppc_intervals_data} \alias{ppc_ribbon_data} \title{PPC intervals} \usage{ ppc_intervals( y, yrep, x = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 1, fatten = 2.5, linewidth = 1 ) ppc_intervals_grouped( y, yrep, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 1, fatten = 2.5, linewidth = 1 ) ppc_ribbon( y, yrep, x = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25, y_draw = c("line", "points", "both") ) ppc_ribbon_grouped( y, yrep, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25, y_draw = c("line", "points", "both") ) ppc_intervals_data( y, yrep, x = NULL, group = NULL, ..., prob = 0.5, prob_outer = 0.9 ) ppc_ribbon_data( y, yrep, x = NULL, group = NULL, ..., prob = 0.5, prob_outer = 0.9 ) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \code{S} by \code{N} matrix of draws from the posterior (or prior) predictive distribution. The number of rows, \code{S}, is the size of the posterior (or prior) sample used to generate \code{yrep}. The number of columns, \code{N} is the number of predicted observations (\code{length(y)}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See the \strong{Details} and \strong{Plot Descriptions} sections for additional advice specific to particular plots.} \item{x}{A numeric vector to use as the x-axis variable. For example, \code{x} could be a predictor variable from a regression model, a time variable for time-series models, etc. If \code{x} is missing or \code{NULL} then the observation index is used for the x-axis.} \item{...}{Currently unused.} \item{prob, prob_outer}{Values between \code{0} and \code{1} indicating the desired probability mass to include in the inner and outer intervals. The defaults are \code{prob=0.5} and \code{prob_outer=0.9}.} \item{alpha, size, fatten, linewidth}{Arguments passed to geoms. For ribbon plots \code{alpha} is passed to \code{\link[ggplot2:geom_ribbon]{ggplot2::geom_ribbon()}} to control the opacity of the outer ribbon and \code{size} is passed to \code{\link[ggplot2:geom_path]{ggplot2::geom_line()}} to control the size of the line representing the median prediction (\code{size=0} will remove the line). For interval plots \code{alpha}, \code{size}, \code{fatten}, and \code{linewidth} are passed to \code{\link[ggplot2:geom_linerange]{ggplot2::geom_pointrange()}} (\code{fatten=0} will remove the point estimates).} \item{group}{A grouping variable of the same length as \code{y}. Will be coerced to \link[base:factor]{factor} if not already a factor. Each value in \code{group} is interpreted as the group level pertaining to the corresponding observation.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting. Note: if \code{scales} is not included in \code{facet_args} then \strong{bayesplot} may use \code{scales="free"} as the default (depending on the plot) instead of the \strong{ggplot2} default of \code{scales="fixed"}.} \item{y_draw}{For ribbon plots only, a string specifying how to draw \code{y}. Can be \code{"line"} (the default), \code{"points"}, or \code{"both"}.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Medians and central interval estimates of \code{yrep} with \code{y} overlaid. See the \strong{Plot Descriptions} section, below. } \section{Plot Descriptions}{ \describe{ \item{\verb{ppc_intervals(), ppc_ribbon()}}{ \code{100*prob}\% central intervals for \code{yrep} at each \code{x} value. \code{ppc_intervals()} plots intervals as vertical bars with points indicating \code{yrep} medians and darker points indicating observed \code{y} values. \code{ppc_ribbon()} plots a ribbon of connected intervals with a line through the median of \code{yrep} and a darker line connecting observed \code{y} values. In both cases an optional \code{x} variable can also be specified for the x-axis variable. Depending on the number of observations and the variability in the predictions at different values of \code{x}, one of these plots may be easier to read than the other. } \item{\verb{ppc_intervals_grouped(), ppc_ribbon_grouped()}}{ Same as \code{ppc_intervals()} and \code{ppc_ribbon()}, respectively, but a separate plot (facet) is generated for each level of a grouping variable. } } } \examples{ y <- rnorm(50) yrep <- matrix(rnorm(5000, 0, 2), ncol = 50) color_scheme_set("brightblue") ppc_intervals(y, yrep) ppc_ribbon(y, yrep) ppc_ribbon(y, yrep, y_draw = "points") \dontrun{ ppc_ribbon(y, yrep, y_draw = "both") } ppc_intervals(y, yrep, size = 1.5, fatten = 0) # remove the yrep point estimates color_scheme_set("teal") year <- 1950:1999 ppc_intervals(y, yrep, x = year, fatten = 1) + ggplot2::xlab("Year") ppc_ribbon(y, yrep, x = year) + ggplot2::xlab("Year") color_scheme_set("pink") year <- rep(2000:2009, each = 5) group <- gl(5, 1, length = 50, labels = LETTERS[1:5]) ppc_ribbon_grouped(y, yrep, x = year, group, y_draw = "both") + ggplot2::scale_x_continuous(breaks = pretty) ppc_ribbon_grouped(y, yrep, x = year, group, facet_args = list(scales = "fixed")) + xaxis_text(FALSE) + xaxis_ticks(FALSE) + panel_bg(fill = "gray20") # get the data frames used to make the ggplots ppc_dat <- ppc_intervals_data(y, yrep, x = year, prob = 0.5) ppc_group_dat <- ppc_intervals_data(y, yrep, x = year, group = group, prob = 0.5) \dontrun{ library("rstanarm") fit <- stan_glmer(mpg ~ wt + (1|cyl), data = mtcars, refresh = 0) yrep <- posterior_predict(fit) color_scheme_set("purple") ppc_intervals(y = mtcars$mpg, yrep = yrep, x = mtcars$wt, prob = 0.8) + panel_bg(fill="gray90", color = NA) + grid_lines(color = "white") ppc_ribbon(y = mtcars$mpg, yrep = yrep, x = mtcars$wt, prob = 0.6, prob_outer = 0.8) ppc_ribbon_grouped(y = mtcars$mpg, yrep = yrep, x = mtcars$wt, group = mtcars$cyl) color_scheme_set("gray") ppc_intervals(mtcars$mpg, yrep, prob = 0.5) + ggplot2::scale_x_continuous( labels = rownames(mtcars), breaks = 1:nrow(mtcars) ) + xaxis_text(angle = -70, vjust = 1, hjust = 0) + xaxis_title(FALSE) } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/bayesplot-package.Rd0000644000176200001440000001107414556270424016725 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-package.R \docType{package} \name{bayesplot-package} \alias{bayesplot-package} \alias{bayesplot} \title{\strong{bayesplot}: Plotting for Bayesian Models} \description{ \if{html}{ \figure{stanlogo.png}{options: width="50" alt="mc-stan.org"} } \emph{Stan Development Team} The \strong{bayesplot} package provides a variety of \strong{ggplot2}-based plotting functions for use after fitting Bayesian models (typically, though not exclusively, via Markov chain Monte Carlo). The package is designed not only to provide convenient functionality for users, but also a common set of functions that can be easily used by developers working on a variety of packages for Bayesian modeling, particularly (but not necessarily) packages powered by RStan (the \R interface to Stan). Examples of packages that will soon (or already are) using \strong{bayesplot} are \strong{rstan} itself, as well as the \strong{rstan}-dependent \strong{rstanarm} and \strong{brms} packages for applied regression modeling. } \section{Plotting functionality}{ \if{html}{ \figure{bayesplot1.png}{options: width="30\%" alt="mcmc_areas"} \figure{bayesplot2.png}{options: width="30\%" alt="ppc_hist"} \figure{bayesplot3.png}{options: width="30\%" alt="ppc_dens_overlay"} } The plotting functions in \strong{bayesplot} are organized into several modules: \itemize{ \item \link[=MCMC-overview]{MCMC}: Visualizations of Markov chain Monte Carlo (MCMC) simulations generated by \emph{any} MCMC algorithm as well as diagnostics. There are also additional functions specifically for use with models fit using the \link[=NUTS]{No-U-Turn Sampler (NUTS)}. \item \link[=PPC-overview]{PPC}: Graphical (posterior or prior) predictive checks (PPCs). \item \link[=PPD-overview]{PPD}: Plots of (posterior or prior) predictive distributions without comparisons to observed data. } } \section{Resources}{ \itemize{ \item \strong{Online documentation and vignettes}: Visit the \strong{bayesplot} website at \url{https://mc-stan.org/bayesplot/} \item \strong{Bug reports and feature requests}: If you would like to request a new feature or if you have noticed a bug that needs to be fixed please let us know at the \strong{bayesplot} issue tracker at \url{https://github.com/stan-dev/bayesplot/issues/} \item \strong{General questions and help}: To ask a question about \strong{bayesplot} on the Stan Forums forum please visit \url{https://discourse.mc-stan.org}. } } \examples{ # A few quick examples (all of the functions have many examples # on their individual help pages) # MCMC plots x <- example_mcmc_draws(params = 5) mcmc_intervals(x, prob = 0.5) mcmc_intervals(x, regex_pars = "beta") color_scheme_set("purple") mcmc_areas(x, regex_pars = "beta", prob = 0.8) color_scheme_set("mix-blue-red") mcmc_trace(x, pars = c("alpha", "sigma"), facet_args = list(nrow = 2)) color_scheme_set("brightblue") mcmc_scatter(x, pars = c("beta[1]", "sigma"), transformations = list(sigma = "log")) # Graphical PPCs y <- example_y_data() yrep <- example_yrep_draws() ppc_dens_overlay(y, yrep[1:50, ]) \donttest{ color_scheme_set("pink") ppc_stat(y, yrep, stat = "median") + grid_lines() ppc_hist(y, yrep[1:8, ]) # Same plots but without y (using ppd_ instead of ppc_) bayesplot_theme_set(ggplot2::theme_gray()) ypred <- yrep ppd_dens_overlay(ypred[1:50, ]) ppd_stat(ypred, stat = "median") + grid_lines() ppd_hist(ypred[1:8, ]) } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) } \seealso{ \code{\link[=theme_default]{theme_default()}} for the default ggplot theme used by \strong{bayesplot} and \code{\link[=bayesplot_theme_set]{bayesplot_theme_set()}} to change it. \link{bayesplot-colors} to set or view the color scheme used for plotting. \code{\link[ggplot2:ggsave]{ggplot2::ggsave()}} for saving plots. } \author{ \strong{Maintainer}: Jonah Gabry \email{jsg2201@columbia.edu} Authors: \itemize{ \item Tristan Mahr } Other contributors: \itemize{ \item Paul-Christian Bürkner [contributor] \item Martin Modrák [contributor] \item Malcolm Barrett [contributor] \item Frank Weber [contributor] \item Eduardo Coronado Sroka [contributor] \item Teemu Sailynoja [contributor] \item Aki Vehtari [contributor] } } bayesplot/man/MCMC-distributions.Rd0000644000176200001440000002224414556270424016752 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-distributions.R \name{MCMC-distributions} \alias{MCMC-distributions} \alias{mcmc_hist} \alias{mcmc_dens} \alias{mcmc_hist_by_chain} \alias{mcmc_dens_overlay} \alias{mcmc_dens_chains} \alias{mcmc_dens_chains_data} \alias{mcmc_violin} \title{Histograms and kernel density plots of MCMC draws} \usage{ mcmc_hist( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE, alpha = 1 ) mcmc_dens( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), trim = FALSE, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL, alpha = 1 ) mcmc_hist_by_chain( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), binwidth = NULL, bins = NULL, freq = TRUE, alpha = 1 ) mcmc_dens_overlay( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), color_chains = TRUE, trim = FALSE, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) mcmc_dens_chains( x, pars = character(), regex_pars = character(), transformations = list(), ..., color_chains = TRUE, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) mcmc_dens_chains_data( x, pars = character(), regex_pars = character(), transformations = list(), ..., bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) mcmc_violin( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), probs = c(0.1, 0.5, 0.9) ) } \arguments{ \item{x}{An object containing MCMC draws: \itemize{ \item A 3-D array, matrix, list of matrices, or data frame. The \link{MCMC-overview} page provides details on how to specify each these. \item A \code{draws} object from the \pkg{\link{posterior}} package (e.g., \code{draws_array}, \code{draws_rvars}, etc.). \item An object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page. }} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{transformations}{Optionally, transformations to apply to parameters before plotting. If \code{transformations} is a function or a single string naming a function then that function will be used to transform all parameters. To apply transformations to particular parameters, the \code{transformations} argument can be a named list with length equal to the number of parameters to be transformed. Currently only univariate transformations of scalar parameters can be specified (multivariate transformations will be implemented in a future release). If \code{transformations} is a list, the name of each list element should be a parameter name and the content of each list element should be a function (or any item to match as a function via \code{\link[=match.fun]{match.fun()}}, e.g. a string naming a function). If a function is specified by its name as a string (e.g. \code{"log"}), then it can be used to construct a new parameter label for the appropriate parameter (e.g. \code{"log(sigma)"}). If a function itself is specified (e.g. \code{log} or \code{function(x) log(x)}) then \code{"t"} is used in the new parameter label to indicate that the parameter is transformed (e.g. \code{"t(sigma)"}). Note: due to partial argument matching \code{transformations} can be abbreviated for convenience in interactive use (e.g., \code{transform}).} \item{...}{Currently ignored.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting. Note: if \code{scales} is not included in \code{facet_args} then \strong{bayesplot} may use \code{scales="free"} as the default (depending on the plot) instead of the \strong{ggplot2} default of \code{scales="fixed"}.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{bins}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{freq}{For histograms, \code{freq=TRUE} (the default) puts count on the y-axis. Setting \code{freq=FALSE} puts density on the y-axis. (For many plots the y-axis text is off by default. To view the count or density labels on the y-axis see the \code{\link[=yaxis_text]{yaxis_text()}} convenience function.)} \item{alpha}{Passed to the geom to control the transparency.} \item{trim}{A logical scalar passed to \code{\link[ggplot2:geom_density]{ggplot2::geom_density()}}.} \item{bw, adjust, kernel, n_dens}{Optional arguments passed to \code{\link[stats:density]{stats::density()}} to override default kernel density estimation parameters. \code{n_dens} defaults to \code{1024}.} \item{color_chains}{Option for whether to separately color chains.} \item{probs}{A numeric vector passed to \code{\link[ggplot2:geom_violin]{ggplot2::geom_violin()}}'s \code{draw_quantiles} argument to specify at which quantiles to draw horizontal lines. Set to \code{NULL} to remove the lines.} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Various types of histograms and kernel density plots of MCMC draws. See the \strong{Plot Descriptions} section, below, for details. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_hist()}}{ Histograms of posterior draws with all chains merged. } \item{\code{mcmc_dens()}}{ Kernel density plots of posterior draws with all chains merged. } \item{\code{mcmc_hist_by_chain()}}{ Histograms of posterior draws with chains separated via faceting. } \item{\code{mcmc_dens_overlay()}}{ Kernel density plots of posterior draws with chains separated but overlaid on a single plot. } \item{\code{mcmc_violin()}}{ The density estimate of each chain is plotted as a violin with horizontal lines at notable quantiles. } \item{\code{mcmc_dens_chains()}}{ Ridgeline kernel density plots of posterior draws with chains separated but overlaid on a single plot. In \code{mcmc_dens_overlay()} parameters appear in separate facets; in \code{mcmc_dens_chains()} they appear in the same panel and can overlap vertically. } } } \examples{ set.seed(9262017) # some parameter draws to use for demonstration x <- example_mcmc_draws() dim(x) dimnames(x) ################## ### Histograms ### ################## # histograms of all parameters color_scheme_set("brightblue") mcmc_hist(x) # histograms of some parameters color_scheme_set("pink") mcmc_hist(x, pars = c("alpha", "beta[2]")) \donttest{ mcmc_hist(x, pars = "sigma", regex_pars = "beta") } # example of using 'transformations' argument to plot log(sigma), # and parsing facet labels (e.g. to get greek letters for parameters) mcmc_hist(x, transformations = list(sigma = "log"), facet_args = list(labeller = ggplot2::label_parsed)) + facet_text(size = 15) \donttest{ # instead of list(sigma = "log"), you could specify the transformation as # list(sigma = log) or list(sigma = function(x) log(x)), but then the # label for the transformed sigma is 't(sigma)' instead of 'log(sigma)' mcmc_hist(x, transformations = list(sigma = log)) # separate histograms by chain color_scheme_set("pink") mcmc_hist_by_chain(x, regex_pars = "beta") } ################# ### Densities ### ################# mcmc_dens(x, pars = c("sigma", "beta[2]"), facet_args = list(nrow = 2)) \donttest{ # separate and overlay chains color_scheme_set("mix-teal-pink") mcmc_dens_overlay(x, pars = c("sigma", "beta[2]"), facet_args = list(nrow = 2)) + facet_text(size = 14) x2 <- example_mcmc_draws(params = 6) mcmc_dens_chains(x2, pars = c("beta[1]", "beta[2]", "beta[3]")) } # separate chains as violin plots color_scheme_set("green") mcmc_violin(x) + panel_bg(color = "gray20", size = 2, fill = "gray30") } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/PPC-discrete.Rd0000644000176200001440000001554614335264324015561 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-discrete.R \name{PPC-discrete} \alias{PPC-discrete} \alias{ppc_bars} \alias{ppc_bars_grouped} \alias{ppc_rootogram} \alias{ppc_bars_data} \title{PPCs for discrete outcomes} \usage{ ppc_bars( y, yrep, ..., prob = 0.9, width = 0.9, size = 1, fatten = 2.5, linewidth = 1, freq = TRUE ) ppc_bars_grouped( y, yrep, group, ..., facet_args = list(), prob = 0.9, width = 0.9, size = 1, fatten = 2.5, linewidth = 1, freq = TRUE ) ppc_rootogram( y, yrep, style = c("standing", "hanging", "suspended"), ..., prob = 0.9, size = 1 ) ppc_bars_data(y, yrep, group = NULL, prob = 0.9, freq = TRUE) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \code{S} by \code{N} matrix of draws from the posterior (or prior) predictive distribution. The number of rows, \code{S}, is the size of the posterior (or prior) sample used to generate \code{yrep}. The number of columns, \code{N} is the number of predicted observations (\code{length(y)}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See the \strong{Details} and \strong{Plot Descriptions} sections for additional advice specific to particular plots.} \item{...}{Currently unused.} \item{prob}{A value between \code{0} and \code{1} indicating the desired probability mass to include in the \code{yrep} intervals. Set \code{prob=0} to remove the intervals. (Note: for rootograms these are intervals of the \emph{square roots} of the expected counts.)} \item{width}{For bar plots only, passed to \code{\link[ggplot2:geom_bar]{ggplot2::geom_bar()}} to control the bar width.} \item{size, fatten, linewidth}{For bar plots, \code{size}, \code{fatten}, and \code{linewidth} are passed to \code{\link[ggplot2:geom_linerange]{ggplot2::geom_pointrange()}} to control the appearance of the \code{yrep} points and intervals. For rootograms \code{size} is passed to \code{\link[ggplot2:geom_path]{ggplot2::geom_line()}}.} \item{freq}{For bar plots only, if \code{TRUE} (the default) the y-axis will display counts. Setting \code{freq=FALSE} will put proportions on the y-axis.} \item{group}{A grouping variable of the same length as \code{y}. Will be coerced to \link[base:factor]{factor} if not already a factor. Each value in \code{group} is interpreted as the group level pertaining to the corresponding observation.} \item{facet_args}{An optional list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} to control faceting.} \item{style}{For \code{ppc_rootogram}, a string specifying the rootogram style. The options are \code{"standing"}, \code{"hanging"}, and \code{"suspended"}. See the \strong{Plot Descriptions} section, below, for details on the different styles.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Many of the \link[=PPC-overview]{PPC} functions in \strong{bayesplot} can be used with discrete data. The small subset of these functions that can \emph{only} be used if \code{y} and \code{yrep} are discrete are documented on this page. Currently these include rootograms for count outcomes and bar plots for ordinal, categorical, and multinomial outcomes. See the \strong{Plot Descriptions} section below. } \details{ For all of these plots \code{y} and \code{yrep} must be integers, although they need not be integers in the strict sense of \R's \link[base:integer]{integer} type. For rootogram plots \code{y} and \code{yrep} must also be non-negative. } \section{Plot Descriptions}{ \describe{ \item{\code{ppc_bars()}}{ Bar plot of \code{y} with \code{yrep} medians and uncertainty intervals superimposed on the bars. } \item{\code{ppc_bars_grouped()}}{ Same as \code{ppc_bars()} but a separate plot (facet) is generated for each level of a grouping variable. } \item{\code{ppc_rootogram()}}{ Rootograms allow for diagnosing problems in count data models such as overdispersion or excess zeros. They consist of a histogram of \code{y} with the expected counts based on \code{yrep} overlaid as a line along with uncertainty intervals. The y-axis represents the square roots of the counts to approximately adjust for scale differences and thus ease comparison between observed and expected counts. Using the \code{style} argument, the histogram style can be adjusted to focus on different aspects of the data: \itemize{ \item \emph{Standing}: basic histogram of observed counts with curve showing expected counts. \item \emph{Hanging}: observed counts counts hanging from the curve representing expected counts. \item \emph{Suspended}: histogram of the differences between expected and observed counts. } \strong{All of the rootograms are plotted on the square root scale}. See Kleiber and Zeileis (2016) for advice on interpreting rootograms and selecting among the different styles. } } } \examples{ set.seed(9222017) # bar plots f <- function(N) { sample(1:4, size = N, replace = TRUE, prob = c(0.25, 0.4, 0.1, 0.25)) } y <- f(100) yrep <- t(replicate(500, f(100))) dim(yrep) group <- gl(2, 50, length = 100, labels = c("GroupA", "GroupB")) color_scheme_set("mix-pink-blue") ppc_bars(y, yrep) # split by group, change interval width, and display proportion # instead of count on y-axis color_scheme_set("mix-blue-pink") ppc_bars_grouped(y, yrep, group, prob = 0.5, freq = FALSE) \dontrun{ # example for ordinal regression using rstanarm library(rstanarm) fit <- stan_polr( tobgp ~ agegp, data = esoph, method = "probit", prior = R2(0.2, "mean"), init_r = 0.1, seed = 12345, # cores = 4, refresh = 0 ) # coded as character, so convert to integer yrep_char <- posterior_predict(fit) print(yrep_char[1, 1:4]) yrep_int <- sapply(data.frame(yrep_char, stringsAsFactors = TRUE), as.integer) y_int <- as.integer(esoph$tobgp) ppc_bars(y_int, yrep_int) ppc_bars_grouped( y = y_int, yrep = yrep_int, group = esoph$agegp, freq=FALSE, prob = 0.5, fatten = 1, size = 1.5 ) } # rootograms for counts y <- rpois(100, 20) yrep <- matrix(rpois(10000, 20), ncol = 100) color_scheme_set("brightblue") ppc_rootogram(y, yrep) ppc_rootogram(y, yrep, prob = 0) ppc_rootogram(y, yrep, style = "hanging", prob = 0.8) ppc_rootogram(y, yrep, style = "suspended") } \references{ Kleiber, C. and Zeileis, A. (2016). Visualizing count data regressions using rootograms. \emph{The American Statistician}. 70(3): 296--303. \url{https://arxiv.org/abs/1605.01311}. } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/PPC-scatterplots.Rd0000644000176200001440000001124314212422623016464 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-scatterplots.R \name{PPC-scatterplots} \alias{PPC-scatterplots} \alias{ppc_scatter} \alias{ppc_scatter_avg} \alias{ppc_scatter_avg_grouped} \alias{ppc_scatter_data} \alias{ppc_scatter_avg_data} \title{PPC scatterplots} \usage{ ppc_scatter( y, yrep, ..., facet_args = list(), size = 2.5, alpha = 0.8, ref_line = TRUE ) ppc_scatter_avg(y, yrep, ..., size = 2.5, alpha = 0.8, ref_line = TRUE) ppc_scatter_avg_grouped( y, yrep, group, ..., facet_args = list(), size = 2.5, alpha = 0.8, ref_line = TRUE ) ppc_scatter_data(y, yrep) ppc_scatter_avg_data(y, yrep, group = NULL) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \code{S} by \code{N} matrix of draws from the posterior (or prior) predictive distribution. The number of rows, \code{S}, is the size of the posterior (or prior) sample used to generate \code{yrep}. The number of columns, \code{N} is the number of predicted observations (\code{length(y)}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See the \strong{Details} and \strong{Plot Descriptions} sections for additional advice specific to particular plots.} \item{...}{Currently unused.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting. Note: if \code{scales} is not included in \code{facet_args} then \strong{bayesplot} may use \code{scales="free"} as the default (depending on the plot) instead of the \strong{ggplot2} default of \code{scales="fixed"}.} \item{size, alpha}{Arguments passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the appearance of the points.} \item{ref_line}{If \code{TRUE} (the default) a dashed line with intercept 0 and slope 1 is drawn behind the scatter plot.} \item{group}{A grouping variable of the same length as \code{y}. Will be coerced to \link[base:factor]{factor} if not already a factor. Each value in \code{group} is interpreted as the group level pertaining to the corresponding observation.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Scatterplots of the observed data \code{y} vs. simulated/replicated data \code{yrep} from the posterior predictive distribution. See the \strong{Plot Descriptions} and \strong{Details} sections, below. } \details{ For Binomial data, the plots may be more useful if the input contains the "success" \emph{proportions} (not discrete "success" or "failure" counts). } \section{Plot Descriptions}{ \describe{ \item{\code{ppc_scatter()}}{ For each dataset (row) in \code{yrep} a scatterplot is generated showing \code{y} against that row of \code{yrep}. For this plot \code{yrep} should only contain a small number of rows. } \item{\code{ppc_scatter_avg()}}{ A single scatterplot of \code{y} against the average values of \code{yrep}, i.e., the points \verb{(x,y) = (mean(yrep[, n]), y[n])}, where each \code{yrep[, n]} is a vector of length equal to the number of posterior draws. Unlike for \code{ppc_scatter()}, for \code{ppc_scatter_avg()} \code{yrep} should contain many draws (rows). } \item{\code{ppc_scatter_avg_grouped()}}{ The same as \code{ppc_scatter_avg()}, but a separate plot is generated for each level of a grouping variable. } } } \examples{ y <- example_y_data() yrep <- example_yrep_draws() p1 <- ppc_scatter_avg(y, yrep) p1 # don't draw line x=y ppc_scatter_avg(y, yrep, ref_line = FALSE) p2 <- ppc_scatter(y, yrep[20:23, ], alpha = 0.5, size = 1.5) p2 # give x and y axes the same limits lims <- ggplot2::lims(x = c(0, 160), y = c(0, 160)) p1 + lims p2 + lims # for ppc_scatter_avg_grouped the default is to allow the facets # to have different x and y axes group <- example_group_data() ppc_scatter_avg_grouped(y, yrep, group) # let x-axis vary but force y-axis to be the same ppc_scatter_avg_grouped(y, yrep, group, facet_args = list(scales = "free_x")) } \references{ Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/bayesplot-extractors.Rd0000644000176200001440000000710614127610043017516 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-extractors.R \name{bayesplot-extractors} \alias{bayesplot-extractors} \alias{log_posterior} \alias{nuts_params} \alias{rhat} \alias{neff_ratio} \alias{log_posterior.stanfit} \alias{log_posterior.stanreg} \alias{log_posterior.CmdStanMCMC} \alias{nuts_params.stanfit} \alias{nuts_params.stanreg} \alias{nuts_params.list} \alias{nuts_params.CmdStanMCMC} \alias{rhat.stanfit} \alias{rhat.stanreg} \alias{rhat.CmdStanMCMC} \alias{neff_ratio.stanfit} \alias{neff_ratio.stanreg} \alias{neff_ratio.CmdStanMCMC} \title{Extract quantities needed for plotting from model objects} \usage{ log_posterior(object, ...) nuts_params(object, ...) rhat(object, ...) neff_ratio(object, ...) \method{log_posterior}{stanfit}(object, inc_warmup = FALSE, ...) \method{log_posterior}{stanreg}(object, inc_warmup = FALSE, ...) \method{log_posterior}{CmdStanMCMC}(object, inc_warmup = FALSE, ...) \method{nuts_params}{stanfit}(object, pars = NULL, inc_warmup = FALSE, ...) \method{nuts_params}{stanreg}(object, pars = NULL, inc_warmup = FALSE, ...) \method{nuts_params}{list}(object, pars = NULL, ...) \method{nuts_params}{CmdStanMCMC}(object, pars = NULL, ...) \method{rhat}{stanfit}(object, pars = NULL, ...) \method{rhat}{stanreg}(object, pars = NULL, regex_pars = NULL, ...) \method{rhat}{CmdStanMCMC}(object, pars = NULL, ...) \method{neff_ratio}{stanfit}(object, pars = NULL, ...) \method{neff_ratio}{stanreg}(object, pars = NULL, regex_pars = NULL, ...) \method{neff_ratio}{CmdStanMCMC}(object, pars = NULL, ...) } \arguments{ \item{object}{The object to use.} \item{...}{Arguments passed to individual methods.} \item{inc_warmup}{A logical scalar (defaulting to \code{FALSE}) indicating whether to include warmup draws, if applicable.} \item{pars}{An optional character vector of parameter names. For \code{nuts_params()} these will be NUTS sampler parameter names rather than model parameters. If \code{pars} is omitted all parameters are included.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} } \value{ \describe{ \item{\code{log_posterior()}}{ \code{log_posterior()} methods return a molten data frame (see \code{\link[reshape2:melt]{reshape2::melt()}}). The data frame should have columns \code{"Iteration"} (integer), \code{"Chain"} (integer), and \code{"Value"} (numeric). See \strong{Examples}, below. } \item{\code{nuts_params()}}{ \code{nuts_params()} methods return a molten data frame (see \code{\link[reshape2:melt]{reshape2::melt()}}). The data frame should have columns \code{"Parameter"} (factor), \code{"Iteration"} (integer), \code{"Chain"} (integer), and \code{"Value"} (numeric). See \strong{Examples}, below. } \item{\code{rhat()}, \code{neff_ratio()}}{ Methods return (named) vectors. } } } \description{ Generics and methods for extracting quantities needed for plotting from various types of model objects. Currently methods are provided for stanfit (\strong{rstan}), CmdStanMCMC (\strong{cmdstanr}), and stanreg (\strong{rstanarm}) objects, but adding new methods should be relatively straightforward. } \examples{ \dontrun{ library(rstanarm) fit <- stan_glm(mpg ~ wt, data = mtcars, refresh = 0) np <- nuts_params(fit) head(np) tail(np) lp <- log_posterior(fit) head(lp) tail(lp) } } \seealso{ \link{MCMC-nuts}, \link{MCMC-diagnostics} } bayesplot/man/PPC-loo.Rd0000644000176200001440000002624014556465326014553 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-loo.R \name{PPC-loo} \alias{PPC-loo} \alias{ppc_loo_pit_overlay} \alias{ppc_loo_pit_data} \alias{ppc_loo_pit_qq} \alias{ppc_loo_pit} \alias{ppc_loo_intervals} \alias{ppc_loo_ribbon} \title{LOO predictive checks} \usage{ ppc_loo_pit_overlay( y, yrep, lw = NULL, ..., psis_object = NULL, pit = NULL, samples = 100, size = 0.25, alpha = 0.7, boundary_correction = TRUE, grid_len = 512, bw = "nrd0", trim = FALSE, adjust = 1, kernel = "gaussian", n_dens = 1024 ) ppc_loo_pit_data( y, yrep, lw = NULL, ..., psis_object = NULL, pit = NULL, samples = 100, bw = "nrd0", boundary_correction = TRUE, grid_len = 512 ) ppc_loo_pit_qq( y, yrep, lw = NULL, ..., psis_object = NULL, pit = NULL, compare = c("uniform", "normal"), size = 2, alpha = 1 ) ppc_loo_pit( y, yrep, lw, pit = NULL, compare = c("uniform", "normal"), ..., size = 2, alpha = 1 ) ppc_loo_intervals( y, yrep, psis_object, ..., subset = NULL, intervals = NULL, prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 1, fatten = 2.5, linewidth = 1, order = c("index", "median") ) ppc_loo_ribbon( y, yrep, psis_object, ..., subset = NULL, intervals = NULL, prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25 ) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \code{S} by \code{N} matrix of draws from the posterior (or prior) predictive distribution. The number of rows, \code{S}, is the size of the posterior (or prior) sample used to generate \code{yrep}. The number of columns, \code{N} is the number of predicted observations (\code{length(y)}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See the \strong{Details} and \strong{Plot Descriptions} sections for additional advice specific to particular plots.} \item{lw}{A matrix of (smoothed) log weights with the same dimensions as \code{yrep}. See \code{\link[loo:psis]{loo::psis()}} and the associated \code{weights()} method as well as the \strong{Examples} section, below. If \code{lw} is not specified then \code{psis_object} can be provided and log weights will be extracted.} \item{...}{Currently unused.} \item{psis_object}{If using \strong{loo} version \verb{2.0.0} or greater, an object returned by the \code{psis()} function (or by the \code{loo()} function with argument \code{save_psis} set to \code{TRUE}).} \item{pit}{For \code{ppc_loo_pit_overlay()} and \code{ppc_loo_pit_qq()}, optionally a vector of precomputed PIT values that can be specified instead of \code{y}, \code{yrep}, and \code{lw} (these are all ignored if \code{pit} is specified). If not specified the PIT values are computed internally before plotting.} \item{samples}{For \code{ppc_loo_pit_overlay()}, the number of data sets (each the same size as \code{y}) to simulate from the standard uniform distribution. The default is 100. The density estimate of each dataset is plotted as a thin line in the plot, with the density estimate of the LOO PITs overlaid as a thicker dark line.} \item{alpha, size, fatten, linewidth}{Arguments passed to code geoms to control plot aesthetics. For \code{ppc_loo_pit_qq()} and \code{ppc_loo_pit_overlay()}, \code{size} and \code{alpha} are passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} and \code{\link[ggplot2:geom_density]{ggplot2::geom_density()}}, respectively. For \code{ppc_loo_intervals()}, \code{size} \code{linewidth} and \code{fatten} are passed to \code{\link[ggplot2:geom_linerange]{ggplot2::geom_pointrange()}}. For \code{ppc_loo_ribbon()}, \code{alpha} and \code{size} are passed to \code{\link[ggplot2:geom_ribbon]{ggplot2::geom_ribbon()}}.} \item{boundary_correction}{For \code{ppc_loo_pit_overlay()}, when set to \code{TRUE} (the default) the function will compute boundary corrected density values via convolution and a Gaussian filter, also known as the reflection method (Boneva et al., 1971). As a result, parameters controlling the standard kernel density estimation such as \code{adjust}, \code{kernel} and \code{n_dens} are ignored. NOTE: The current implementation only works well for continuous observations.} \item{grid_len}{For \code{ppc_loo_pit_overlay()}, when \code{boundary_correction} is set to \code{TRUE} this parameter specifies the number of points used to generate the estimations. This is set to 512 by default.} \item{bw, adjust, kernel, n_dens}{Optional arguments passed to \code{\link[stats:density]{stats::density()}} to override default kernel density estimation parameters. \code{n_dens} defaults to \code{1024}.} \item{trim}{Passed to \code{\link[ggplot2:geom_density]{ggplot2::stat_density()}}.} \item{compare}{For \code{ppc_loo_pit_qq()}, a string that can be either \code{"uniform"} or \code{"normal"}. If \code{"uniform"} (the default) the Q-Q plot compares computed PIT values to the standard uniform distribution. If \code{compare="normal"}, the Q-Q plot compares standard normal quantiles calculated from the PIT values to the theoretical standard normal quantiles.} \item{subset}{For \code{ppc_loo_intervals()} and \code{ppc_loo_ribbon()}, an optional integer vector indicating which observations in \code{y} (and \code{yrep}) to include. Dropping observations from \code{y} and \code{yrep} manually before passing them to the plotting function will not work because the dimensions will not match up with the dimensions of \code{psis_object}, but if all of \code{y} and \code{yrep} are passed along with \code{subset} then \strong{bayesplot} can do the subsetting internally for \code{y}, \code{yrep} \emph{and} \code{psis_object}. See the \strong{Examples} section for a demonstration.} \item{intervals}{For \code{ppc_loo_intervals()} and \code{ppc_loo_ribbon()}, optionally a matrix of pre-computed LOO predictive intervals that can be specified instead of \code{yrep} (ignored if \code{intervals} is specified). If not specified the intervals are computed internally before plotting. If specified, \code{intervals} must be a matrix with number of rows equal to the number of data points and five columns in the following order: lower outer interval, lower inner interval, median (50\%), upper inner interval and upper outer interval (column names are ignored).} \item{prob, prob_outer}{Values between \code{0} and \code{1} indicating the desired probability mass to include in the inner and outer intervals. The defaults are \code{prob=0.5} and \code{prob_outer=0.9}.} \item{order}{For \code{ppc_loo_intervals()}, a string indicating how to arrange the plotted intervals. The default (\code{"index"}) is to plot them in the order of the observations. The alternative (\code{"median"}) arranges them by median value from smallest (left) to largest (right).} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Leave-One-Out (LOO) predictive checks. See the \strong{Plot Descriptions} section, below, and \href{https://github.com/jgabry/bayes-vis-paper#readme}{Gabry et al. (2019)} for details. } \section{Plot Descriptions}{ \describe{ \item{\code{ppc_loo_pit_overlay()}, \code{ppc_loo_pit_qq()}}{ The calibration of marginal predictions can be assessed using probability integral transformation (PIT) checks. LOO improves the check by avoiding the double use of data. See the section on marginal predictive checks in Gelman et al. (2013, p. 152--153) and section 5 of Gabry et al. (2019) for an example of using \strong{bayesplot} for these checks. The LOO PIT values are asymptotically uniform (for continuous data) if the model is calibrated. The \code{ppc_loo_pit_overlay()} function creates a plot comparing the density of the LOO PITs (thick line) to the density estimates of many simulated data sets from the standard uniform distribution (thin lines). See Gabry et al. (2019) for an example of interpreting the shape of the miscalibration that can be observed in these plots. The \code{ppc_loo_pit_qq()} function provides an alternative visualization of the miscalibration with a quantile-quantile (Q-Q) plot comparing the LOO PITs to the standard uniform distribution. Comparing to the uniform is not good for extreme probabilities close to 0 and 1, so it can sometimes be useful to set the \code{compare} argument to \code{"normal"}, which will produce a Q-Q plot comparing standard normal quantiles calculated from the PIT values to the theoretical standard normal quantiles. This can help see the (mis)calibration better for the extreme values. However, in most cases we have found that the overlaid density plot (\code{ppc_loo_pit_overlay()}) function will provide a clearer picture of calibration problems than the Q-Q plot. } \item{\code{ppc_loo_intervals()}, \code{ppc_loo_ribbon()}}{ Similar to \code{\link[=ppc_intervals]{ppc_intervals()}} and \code{\link[=ppc_ribbon]{ppc_ribbon()}} but the intervals are for the LOO predictive distribution. } } } \examples{ \dontrun{ library(rstanarm) library(loo) head(radon) fit <- stan_lmer( log_radon ~ floor + log_uranium + floor:log_uranium + (1 + floor | county), data = radon, iter = 100, chains = 2, cores = 2 ) y <- radon$log_radon yrep <- posterior_predict(fit) loo1 <- loo(fit, save_psis = TRUE, cores = 4) psis1 <- loo1$psis_object lw <- weights(psis1) # normalized log weights # marginal predictive check using LOO probability integral transform color_scheme_set("orange") ppc_loo_pit_overlay(y, yrep, lw = lw) ppc_loo_pit_qq(y, yrep, lw = lw) ppc_loo_pit_qq(y, yrep, lw = lw, compare = "normal") # can use the psis object instead of lw ppc_loo_pit_qq(y, yrep, psis_object = psis1) # loo predictive intervals vs observations keep_obs <- 1:50 ppc_loo_intervals(y, yrep, psis_object = psis1, subset = keep_obs) color_scheme_set("gray") ppc_loo_intervals(y, yrep, psis_object = psis1, subset = keep_obs, order = "median") } } \references{ Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (p. 152--153) Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) Vehtari, A., Gelman, A., and Gabry, J. (2017). Practical Bayesian model evaluation using leave-one-out cross-validation and WAIC. \emph{Statistics and Computing}. 27(5), 1413--1432. doi:10.1007/s11222-016-9696-4. arXiv preprint: \url{https://arxiv.org/abs/1507.04544} Boneva, L. I., Kendall, D., & Stefanov, I. (1971). Spline transformations: Three new diagnostic aids for the statistical data-analyst. \emph{J. R. Stat. Soc. B} (Methodological), 33(1), 1-71. https://www.jstor.org/stable/2986005. } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/MCMC-overview.Rd0000644000176200001440000000742314335220171015705 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-overview.R \name{MCMC-overview} \alias{MCMC-overview} \alias{MCMC} \title{Plots for Markov chain Monte Carlo simulations} \description{ The \strong{bayesplot} MCMC module provides various plotting functions for creating graphical displays of Markov chain Monte Carlo (MCMC) simulations. The \strong{MCMC plotting functions} section, below, provides links to the documentation for various categories of MCMC plots. Currently the MCMC plotting functions accept posterior draws provided in one of the following formats: \itemize{ \item \strong{3-D array}: An array with dimensions \verb{Iteration, Chain, Parameter} in that order. \item \strong{list}: A list of matrices, where each matrix corresponds to a Markov chain. All of the matrices should have the same number of iterations (rows) and parameters (columns), and parameters should have the same names and be in the same order. \item \strong{matrix (2-D array)}: A matrix with one column per parameter. If using matrix there should only be a single Markov chain or all chains should already be merged (stacked). \item \strong{data frame}: There are two types of data frames allowed. Either a data frame with one column per parameter (if only a single chain or all chains have already been merged), or a data frame with one column per parameter plus an additional column \code{"Chain"} that contains the chain number (an integer) corresponding to each row in the data frame. \item \strong{draws}: Any of the \code{draws} formats supported by the \pkg{\link{posterior}} package. } \strong{Note}: typically the user should \emph{not} include warmup iterations in the object passed to \strong{bayesplot} plotting functions, although for certain plots (e.g. trace plots) it can occasionally be useful to include the warmup iterations for diagnostic purposes. } \section{MCMC plotting functions}{ \itemize{ \item \link[=MCMC-distributions]{Posterior distributions}: Histograms and kernel density plots of parameter draws, optionally showing each Markov chain separately. \item \link[=MCMC-intervals]{Uncertainty intervals}: Uncertainty intervals computed from parameter draws. \item \link[=MCMC-traces]{Trace plots}: Times series of parameter draws, optionally including HMC/NUTS diagnostic information. \item \link[=MCMC-scatterplots]{Scatterplots}: Scatterplots, heatmaps, and pairs plots of parameter draws, optionally including HMC/NUTS diagnostic information. \item \link[=MCMC-parcoord]{Parallel coordinates plots}: Parallel coordinates plot of MCMC draws (one dimension per parameter), optionally including HMC/NUTS diagnostic information. \item \link[=MCMC-combos]{Combos}: Combination plots (e.g. trace plot + histogram). \item \link[=MCMC-diagnostics]{General MCMC diagnostics}: MCMC diagnostic plots including R-hat, effective sample size, autocorrelation. \link[=MCMC-nuts]{NUTS diagnostics}: Special diagnostic plots for the No-U-Turn Sampler. \item \link[=MCMC-recover]{Comparisons to "true" values}: Plots comparing MCMC estimates to "true" parameter values (e.g., values used to simulate data). } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/PPD-intervals.Rd0000644000176200001440000001223414335264324015756 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppd-intervals.R \name{PPD-intervals} \alias{PPD-intervals} \alias{ppd_intervals} \alias{ppd_intervals_grouped} \alias{ppd_ribbon} \alias{ppd_ribbon_grouped} \alias{ppd_intervals_data} \alias{ppd_ribbon_data} \title{PPD intervals} \usage{ ppd_intervals( ypred, x = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 1, fatten = 2.5, linewidth = 1 ) ppd_intervals_grouped( ypred, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 1, fatten = 2.5, linewidth = 1 ) ppd_ribbon( ypred, x = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25 ) ppd_ribbon_grouped( ypred, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25 ) ppd_intervals_data( ypred, x = NULL, group = NULL, ..., prob = 0.5, prob_outer = 0.9 ) ppd_ribbon_data( ypred, x = NULL, group = NULL, ..., prob = 0.5, prob_outer = 0.9 ) } \arguments{ \item{ypred}{An \code{S} by \code{N} matrix of draws from the posterior (or prior) predictive distribution. The number of rows, \code{S}, is the size of the posterior (or prior) sample used to generate \code{ypred}. The number of columns, \code{N}, is the number of predicted observations.} \item{x}{A numeric vector to use as the x-axis variable. For example, \code{x} could be a predictor variable from a regression model, a time variable for time-series models, etc. If \code{x} is missing or \code{NULL} then the observation index is used for the x-axis.} \item{...}{Currently unused.} \item{prob, prob_outer}{Values between \code{0} and \code{1} indicating the desired probability mass to include in the inner and outer intervals. The defaults are \code{prob=0.5} and \code{prob_outer=0.9}.} \item{alpha, size, fatten, linewidth}{Arguments passed to geoms. For ribbon plots \code{alpha} is passed to \code{\link[ggplot2:geom_ribbon]{ggplot2::geom_ribbon()}} to control the opacity of the outer ribbon and \code{size} is passed to \code{\link[ggplot2:geom_path]{ggplot2::geom_line()}} to control the size of the line representing the median prediction (\code{size=0} will remove the line). For interval plots \code{alpha}, \code{size}, \code{fatten}, and \code{linewidth} are passed to \code{\link[ggplot2:geom_linerange]{ggplot2::geom_pointrange()}} (\code{fatten=0} will remove the point estimates).} \item{group}{A grouping variable of the same length as \code{y}. Will be coerced to \link[base:factor]{factor} if not already a factor. Each value in \code{group} is interpreted as the group level pertaining to the corresponding observation.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting. Note: if \code{scales} is not included in \code{facet_args} then \strong{bayesplot} may use \code{scales="free"} as the default (depending on the plot) instead of the \strong{ggplot2} default of \code{scales="fixed"}.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Medians and central interval estimates of posterior or prior predictive distributions. Each of these functions makes the same plot as the corresponding \code{\link[=PPC-intervals]{ppc_}} function but without plotting any observed data \code{y}. The \strong{Plot Descriptions} section at \link{PPC-intervals} has details on the individual plots. } \examples{ color_scheme_set("brightblue") ypred <- example_yrep_draws() x <- example_x_data() group <- example_group_data() ppd_intervals(ypred[, 1:50]) ppd_intervals(ypred[, 1:50], fatten = 0) ppd_intervals(ypred[, 1:50], fatten = 0, linewidth = 2) ppd_intervals(ypred[, 1:50], prob_outer = 0.75, fatten = 0, linewidth = 2) # put a predictor variable on the x-axis ppd_intervals(ypred[, 1:100], x = x[1:100], fatten = 1) + ggplot2::labs(y = "Prediction", x = "Some variable of interest") # with a grouping variable too ppd_intervals_grouped( ypred = ypred[, 1:100], x = x[1:100], group = group[1:100], size = 2, fatten = 0, facet_args = list(nrow = 2) ) # even reducing size, ppd_intervals is too cluttered when there are many # observations included (ppd_ribbon is better) ppd_intervals(ypred, size = 0.5, fatten = 0.1, linewidth = 0.5) ppd_ribbon(ypred) ppd_ribbon(ypred, size = 0) # remove line showing median prediction } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) } \seealso{ Other PPDs: \code{\link{PPD-distributions}}, \code{\link{PPD-overview}}, \code{\link{PPD-test-statistics}} } \concept{PPDs} bayesplot/man/MCMC-scatterplots.Rd0000644000176200001440000004236714556270424016607 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-scatterplots.R \name{MCMC-scatterplots} \alias{MCMC-scatterplots} \alias{mcmc_scatter} \alias{mcmc_hex} \alias{mcmc_pairs} \alias{scatter_style_np} \alias{pairs_style_np} \alias{pairs_condition} \title{Scatterplots of MCMC draws} \usage{ mcmc_scatter( x, pars = character(), regex_pars = character(), transformations = list(), ..., size = 2.5, alpha = 0.8, np = NULL, np_style = scatter_style_np() ) mcmc_hex( x, pars = character(), regex_pars = character(), transformations = list(), ..., bins = 30, binwidth = NULL ) mcmc_pairs( x, pars = character(), regex_pars = character(), transformations = list(), ..., diag_fun = c("hist", "dens"), off_diag_fun = c("scatter", "hex"), diag_args = list(), off_diag_args = list(), condition = pairs_condition(), lp = NULL, np = NULL, np_style = pairs_style_np(), max_treedepth = NULL, grid_args = list(), save_gg_objects = TRUE ) scatter_style_np( div_color = "red", div_shape = 16, div_size = 2.5, div_alpha = 1 ) pairs_style_np( div_color = "red", div_shape = 4, div_size = 1, div_alpha = 1, td_color = "yellow2", td_shape = 3, td_size = 1, td_alpha = 1 ) pairs_condition(chains = NULL, draws = NULL, nuts = NULL) } \arguments{ \item{x}{An object containing MCMC draws: \itemize{ \item A 3-D array, matrix, list of matrices, or data frame. The \link{MCMC-overview} page provides details on how to specify each these. \item A \code{draws} object from the \pkg{\link{posterior}} package (e.g., \code{draws_array}, \code{draws_rvars}, etc.). \item An object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page. }} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{transformations}{Optionally, transformations to apply to parameters before plotting. If \code{transformations} is a function or a single string naming a function then that function will be used to transform all parameters. To apply transformations to particular parameters, the \code{transformations} argument can be a named list with length equal to the number of parameters to be transformed. Currently only univariate transformations of scalar parameters can be specified (multivariate transformations will be implemented in a future release). If \code{transformations} is a list, the name of each list element should be a parameter name and the content of each list element should be a function (or any item to match as a function via \code{\link[=match.fun]{match.fun()}}, e.g. a string naming a function). If a function is specified by its name as a string (e.g. \code{"log"}), then it can be used to construct a new parameter label for the appropriate parameter (e.g. \code{"log(sigma)"}). If a function itself is specified (e.g. \code{log} or \code{function(x) log(x)}) then \code{"t"} is used in the new parameter label to indicate that the parameter is transformed (e.g. \code{"t(sigma)"}). Note: due to partial argument matching \code{transformations} can be abbreviated for convenience in interactive use (e.g., \code{transform}).} \item{...}{Currently ignored.} \item{size, alpha}{For \code{mcmc_scatter()}, passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the appearance of the points.} \item{np}{Optionally, a data frame of NUTS sampler parameters, either created by \code{\link[=nuts_params]{nuts_params()}} or in the same form as the object returned by \code{\link[=nuts_params]{nuts_params()}}. The colors, shapes, and sizes of the superimposed points can be customized using the \code{np_style} argument.} \item{np_style}{If \code{np} is specified, \code{np_style} can be a call to the \code{scatter_style_np()} helper function (for \code{mcmc_scatter()}) or the \code{pairs_style_np()} helper function (for \code{mcmc_pairs()}) to specify arguments controlling the appearance of superimposed points representing NUTS diagnostic information. (Note: for \code{pairs_style_np()} the \code{size} arguments are interpreted as scaling factors).} \item{bins, binwidth}{For \code{mcmc_hex()}, an optional numeric vector of \emph{length two} passed to \code{\link[ggplot2:geom_hex]{ggplot2::geom_hex()}} to override the default binwidth in both the vertical and horizontal directions.} \item{diag_fun, off_diag_fun}{For \code{mcmc_pairs()}, the plotting function to use for the plots along the diagonal and for the off-diagonal plots, respectively. Currently \code{diag_fun} can be \code{"hist"} for histogram or \code{"dens"} for density, and \code{off_diag_fun} can be \code{"scatter"} for scatterplot or \code{"hex"} for a hexagonal heatmap.} \item{diag_args, off_diag_args}{For \code{mcmc_pairs()}, optional named lists of arguments to pass to the functions implied by the \code{diag_fun} and \code{off_diag_fun} arguments, respectively. For example, if \code{off_diag_fun} is \code{"scatter"} then \code{off_diag_args} could include optional arguments to \code{mcmc_scatter()} like \code{size} and \code{alpha}.} \item{condition}{For \code{mcmc_pairs()}, a call to the \code{pairs_condition()} helper function, which is used to specify a criterion for determining which chains (or iterations) are shown in the plots above the diagonal and which are shown in the plots below the diagonal. The histograms (or density plots) along the diagonal are always made using all chains and iterations, but the scatterplots (or hex plots) above and below the diagonal show different combinations of chains/iterations depending on \code{condition}. The default is a call to \code{pairs_condition()} with none of its arguments specified. In this case half of the chains (or roughly half if there are an odd number) will be used in the plots above the diagonal and the rest in the plots below the diagonal. The \code{chains}, \code{draws}, and \code{nuts} arguments to \code{pairs_condition()}, which are documented below, can be used to change this default.} \item{lp}{For \code{mcmc_pairs()}, a molten data frame of draws of the log-posterior or, more commonly, of a quantity equal to the log-posterior up to a constant. \code{lp} should either be created via \code{\link[=log_posterior]{log_posterior()}} or be an object with the same form as the object returned by \code{\link[=log_posterior]{log_posterior()}}.} \item{max_treedepth}{For \code{mcmc_pairs()}, an integer representing the maximum treedepth allowed when fitting the model (if fit using NUTS). This is only needed for detecting which transitions (if any) hit the maximum treedepth.} \item{grid_args, save_gg_objects}{For \code{mcmc_pairs()}, arguments to pass to \code{\link[=bayesplot_grid]{bayesplot_grid()}}. For example, since \code{mcmc_pairs()} returns more than a single ggplot object, using \code{\link[=ggtitle]{ggtitle()}} afterwards will not work. But you you can still add a title to the plot using \code{grid_args = list(top="My title")}.} \item{div_color, div_shape, div_size, div_alpha, td_color, td_shape, td_size, td_alpha}{Optional arguments to the \code{scatter_style_np()} or \code{pairs_style_np()} helper functions that are eventually passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}}.The default values are displayed in the \strong{Usage} section above.} \item{chains, draws, nuts}{Optional arguments to the \code{pairs_condition()} helper function, which is used to specify the \code{condition} argument for \code{mcmc_pairs()}. \itemize{ \item The \code{chains} argument can be used to select some subset of the chains. If \code{chains} is an integer vector then the behavior is the same as the default (half the chains above the diagonal and half below) except using only the specified subset of chains. Alternatively, \code{chains} can be a list of two integer vectors with the first specifying the chains to be shown in the plots above the diagonal and the second for below the diagonal. \item The \code{draws} argument to \code{pairs_condition()} can be used to directly specify which realizations are plotted above and below the diagonal. \code{draws} can be a single proportion, which is interpreted as the proportion of realizations (among all chains) to plot in the lower panel starting with the first realization in each chain, with the complement (from the end of each chain) plotted in the upper panel. Alternatively \code{draws} can be a logical vector with length equal to the product of the number of iterations and the number of chains, in which case realizations corresponding to \code{FALSE} and \code{TRUE} will be plotted in the lower and upper panels, respectively. \item For models fit using NUTS, the \code{nuts} argument to \code{pairs_condition()} can be used. It takes a (possibly abbreviated) string to select among \code{"accept_stat__"}, \code{"stepsize__"}, \code{"treedepth__"}, \code{"n_leapfrog__"}, \code{"divergent__"}, \code{"energy__"}, and \code{"lp__"}. These are the sampler parameters associated with \code{\link[=NUTS]{NUTS()}} (and \code{"lp__"} is the log-posterior up to an additive constant). In this case, plots below the diagonal will contain realizations that are below the median of the indicated variable (or are zero in the case of \code{"divergent__"}), and plots above the diagonal will contain realizations that are greater than or equal to the median of the indicated variable (or are one in the case of \code{"divergent__"}). If \code{"lp__"} is used then the \code{lp} argument to \code{mcmc_pairs} must also be specified. For the other NUTS parameters the \code{np} argument to \code{mcmc_pairs()} must also be specified. }} } \value{ \code{mcmc_scatter()} and \code{mcmc_hex()} return a ggplot object that can be further customized using the \strong{ggplot2} package. \code{mcmc_pairs()} returns many ggplot objects organized into a grid via \code{\link[=bayesplot_grid]{bayesplot_grid()}}. } \description{ Scatterplots, hexagonal heatmaps, and pairs plots from MCMC draws. See the \strong{Plot Descriptions} section, below, for details. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_scatter()}}{ Bivariate scatterplot of posterior draws. If using a very large number of posterior draws then \code{mcmc_hex()} may be preferable to avoid overplotting. For models fit using \link{NUTS} the \code{np}, and \code{np_style} arguments can be used to add additional information in the plot (in this case the approximate location of divergences). For more on why the scatter plot with divergences is a useful diagnostic tool see \href{https://github.com/jgabry/bayes-vis-paper#readme}{Gabry et al. (2019)}. } \item{\code{mcmc_hex()}}{ Hexagonal heatmap of 2-D bin counts. This plot is useful in cases where the posterior sample size is large enough that \code{mcmc_scatter()} suffers from overplotting. } \item{\code{mcmc_pairs()}}{ A square plot matrix with univariate marginal distributions along the diagonal (as histograms or kernel density plots) and bivariate distributions off the diagonal (as scatterplots or hex heatmaps). For the off-diagonal plots, the default is to split the chains so that (roughly) half are displayed above the diagonal and half are below (all chains are always merged together for the plots along the diagonal). Other possibilities are available by setting the \code{condition} argument. Additionally, extra diagnostic information for models fit using \link{NUTS} can be added to the pairs plot using the \code{lp}, \code{np}, and \code{np_style} arguments. If \code{np} is specified (and \code{condition} is \emph{not} \code{"divergent__"}), then points (red, by default) will be superimposed onto the off-diagonal plots indicating which (if any) iterations encountered a divergent transition. Also, if both \code{np} and \code{max_treedepth} are specified then points (yellow, by default) will be superimposed to indicate a transition that hit the maximum treedepth rather than terminated its evolution normally. The \code{np_style} argument can be used with the \code{pairs_style_np()} convenience function to change the appearance of these overlaid points. See the \strong{Examples} section. } } } \examples{ library("ggplot2") # some parameter draws to use for demonstration x <- example_mcmc_draws(params = 6) dimnames(x) # scatterplot of alpha vs log(sigma) color_scheme_set("teal") (p <- mcmc_scatter(x, pars = c("alpha", "sigma"), transform = list(sigma = "log"))) p + labs( title = "Insert your own headline-grabbing title", subtitle = "with a provocative subtitle", caption = "and a controversial caption", x = expression(alpha), y = expression(log(sigma)) ) # add ellipse p + stat_ellipse(level = 0.9, color = "gray20", size = 1) # add contour color_scheme_set("red") p2 <- mcmc_scatter(x, pars = c("alpha", "sigma"), size = 3.5, alpha = 0.25) p2 + stat_density_2d(color = "black", size = .5) # can also add lines/smooths color_scheme_set("pink") (p3 <- mcmc_scatter(x, pars = c("alpha", "beta[3]"), alpha = 0.25, size = 3)) p3 + geom_smooth(method = "lm", se = FALSE, color = "gray20", size = .75, linetype = 2) \donttest{ if (requireNamespace("hexbin", quietly = TRUE)) { # hexagonal heatmap color_scheme_set("brightblue") (p <- mcmc_hex(x, pars = c("sigma", "alpha"), transform = list(sigma = "log"))) p + plot_bg(fill = "gray95") p + plot_bg(fill = "gray95") + panel_bg(fill = "gray70") } } \donttest{ color_scheme_set("purple") # pairs plots # default of condition=NULL implies splitting chains between upper and lower panels mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\\\[[1,4]\\\\]", off_diag_args = list(size = 1, alpha = 0.5)) # change to density plots instead of histograms and hex plots instead of # scatterplots mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\\\[[1,4]\\\\]", diag_fun = "dens", off_diag_fun = "hex") # plot chain 1 above diagonal and chains 2, 3, and 4 below color_scheme_set("brightblue") mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\\\[[1,4]\\\\]", diag_fun = "dens", off_diag_fun = "hex", condition = pairs_condition(chains = list(1, 2:4))) } \dontrun{ ### Adding NUTS diagnostics to scatterplots and pairs plots # examples using rstanarm package library(rstanarm) # for demonstration purposes, intentionally fit a model that # will (almost certainly) have some divergences fit <- stan_glm( mpg ~ ., data = mtcars, iter = 1000, refresh = 0, # this combo of prior and adapt_delta should lead to some divergences prior = hs(), adapt_delta = 0.9 ) posterior <- as.array(fit) np <- nuts_params(fit) # mcmc_scatter with divergences highlighted color_scheme_set("brightblue") mcmc_scatter(posterior, pars = c("wt", "sigma"), np = np) color_scheme_set("darkgray") div_style <- scatter_style_np(div_color = "green", div_shape = 4, div_size = 4) mcmc_scatter(posterior, pars = c("sigma", "(Intercept)"), np = np, np_style = div_style) # split the draws according to above/below median accept_stat__ # and show approximate location of divergences (red points) color_scheme_set("brightblue") mcmc_pairs( posterior, pars = c("wt", "cyl", "sigma"), off_diag_args = list(size = 1, alpha = 1/3), condition = pairs_condition(nuts = "accept_stat__"), np = np ) # more customizations: # - transform sigma to log(sigma) # - median log-posterior as 'condition' # - hex instead of scatter for off-diagonal plots # - show points where max treedepth hit in blue color_scheme_set("darkgray") mcmc_pairs( posterior, pars = c("wt", "cyl", "sigma"), transform = list(sigma = "log"), off_diag_fun = "hex", condition = pairs_condition(nuts = "lp__"), lp = log_posterior(fit), np = np, np_style = pairs_style_np(div_color = "firebrick", td_color = "blue", td_size = 2), # for demonstration purposes, set max_treedepth to a value that will # result in at least a few max treedepth warnings max_treedepth = with(np, -1 + max(Value[Parameter == "treedepth__"])) ) } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/available_ppc.Rd0000644000176200001440000000337114212422623016102 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/available-module-functions.R \name{available_ppc} \alias{available_ppc} \alias{available_ppd} \alias{available_mcmc} \title{Get or view the names of available plotting or data functions} \usage{ available_ppc(pattern = NULL, fixed = FALSE, invert = FALSE, plots_only = TRUE) available_ppd(pattern = NULL, fixed = FALSE, invert = FALSE, plots_only = TRUE) available_mcmc( pattern = NULL, fixed = FALSE, invert = FALSE, plots_only = TRUE ) } \arguments{ \item{pattern, fixed, invert}{Passed to \code{\link[base:grep]{base::grep()}}.} \item{plots_only}{If \code{TRUE} (the default) only plotting functions are searched for. If \code{FALSE} then functions that return data for plotting (functions ending in \verb{_data()}) are also included.} } \value{ A possibly empty character vector of function names with several additional attributes (for use by a custom print method). If \code{pattern} is missing then the returned object contains the names of all available plotting functions in the \link{MCMC}, \link{PPC}, or \link{PPD} module, depending on which function is called. If \code{pattern} is specified then a subset of function names is returned. } \description{ Get or view the names of available plotting or data functions } \examples{ available_mcmc() available_mcmc("nuts") available_mcmc("rhat|neff") available_ppc() available_ppc("grouped") available_ppc("grouped", invert = TRUE) available_ppd() available_ppd("grouped") # can also see which functions that return data are available available_ppc(plots_only = FALSE) # only show the _data functions available_ppc("_data", plots_only = FALSE) available_ppd("_data", plots_only = FALSE) available_mcmc("_data", plots_only = FALSE) } bayesplot/man/figures/0000755000176200001440000000000014335264324014501 5ustar liggesusersbayesplot/man/figures/bayesplot3.png0000644000176200001440000043342014057711166017304 0ustar liggesusersPNG  IHDR` iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o pHYs  YiTXtXML:com.adobe.xmp 1 L'Y@IDATx Y畬}emdNhBڋ2eNW/trM')a P%Jbkl˶Ȳveyy}$kk[9| Aױs@* q1q}t]+RT H.v`keժUee޼y]E@* \x 4jޭ}K9|DGr0/x)Koޤsĩ@* g hիWns=N=ͷT HRTPoW^,eRAI/P~w)ޑws@* 7 Xt2 @* ׶}l״̘PʘGa[^,eM@ڥSJ0&SgLr/5BX|NpF ]*O@* )020HRT 8"xHGw@*  {ή @* ="/Ka~9n9^'@I0%чt1 \jz @*pq)0"vXxqMRT xM8͓~ wzV=^X## @* \  ]*ST H/z tR<5la5%}o֕'jo\ =lkx_֞#f?,!ST _o* HPyx&Şxu0jLc󶁿T HRWWzr@* gߠf(5/(kNg6_ʍX5~G/HKRT p럮T HRT`P}: FOOXa؛% kUN# Fc Di@* -ܭع-@* \ T D'rU^Y#0C&5F5׏ U0pR,nϘ4m$ By&M \K3-HRTS`D-g @*j)PO~^XEuoge-Vʸk1avwf!Tb "dž]lW䌛 @*  `NRT a C.š9.cx$V؀M9/vD!h[22wwwADقV+؋y3.H&y ^7WLRTW`C,{4^xk{0(lPw b ڴ1\g$9eik[>@\!mJxxؤH 7HRT x+sz@* 4@D[[e`Q3 c{uMytY=,LykVxp5R(U}%yW,>xC12C/гJ* #{ݧ@* \` aVD V!'CIw̓ś)<`8 ȲoL=/*\U>XÙS} K:;4U%dw5XakTq:`]З5ɣT HgF_8ǖ @/pxf2{3S06-XRUv Wi(Sb\ڟv6N7!H?&Fu)nݶߴY޳{H/-?#;~u1j34T HRE#|9T HO@N-e GMY<k?Pj퀸1lfPH^/{˜0).K>+ěk5H@ڝ]xE$䐴C`Ds~UWMe͓˕Qٵ,K.ux'`@*:+:}* odfsx>,r`3ä c-nC@Ҷ/8eoH '/%#a&ryI - N"Y yZD3I=J&s.[zMjّ|J?_ZTSX8<164T~^/ݪ 6lrWo_ReZybg#an,RT H^7e/lZ* @*p<UO^!.HF.gY/G ZGxvGO-&B0%|q֮ eR%|V) Ad2+>@ׂK;(ׁïǗI̞\>/%z>RȋŖ,Q{@u=v_)e='S'7T] Z@* K:N(NRT 8? Fl٣!@Ιg C%s< 1\/#VTM3tmX30;JܗAuϭ4J /W~_o7M*')|{ww/._?\:H=bØ)~.i۳:(?[g݇Lǔ'+W]5i m;T\]ƳO26ڰwL9iW)}bÿq.e(sgK-{M7W :p7g~Ge՚}eNm~/ ;^-@, *02~FvlZ* @'3%8OX:<]$xx'iP5X׎q GDb(!4_LKlnP3.)3#/ߟ WrI1|?X͟^$>60tRx^L~33M,?]f-P̮rś?gɷks{r^ ++C"FkvtҶPF`ـml@g1Pn?_)ڲH9_CϿX:f9m6}%}~^lG7\|$4ܯ[xlp`=#HRP0җ @*pq+Z0yuD+~>@0C W`H93k"Ɨ+wWw9ʦ݃eQ5 >ozhs,;kcJ{|u˿; a\ vٶ3rY6HRR`DKH *IRT 0hޯ ~ө01Ae R^8!V6ٳ%\cKV>"ٗ^xm{>{N8!O/hA%PjPGafu;ʾ-o[,_욲eՆ}eu˿.W-XM,g$=k珷Nghm5`g!nVIRT;j* >8%~2 y2e &=)یWH#(ky7hasX +^hXh'oR֝~aA@%=z ?RVa8Q8.jk~+_+O,;ą]G~kEU Tm@`b|0 }^ M+? -2etO>X6l H@i@* r{]l!HR ]*tCnv%Ҕ"$dG=|{4/PWBMzRRm!H& jIh)7`& @*+0"2;HRT 8?h_6Z8$VXGj6>0e꾰(dTyo5!$D@P)^d߼&,PɿβpqU sXA99n  {dve aY%6/2"Jt>T HR)vӧG{qHk.u>qwB*++[V-'n*~ e](oArΛ&(oNNcuw]ӧL(?[;]}l2H @**0"ֿUm6 @*p(@B!~Pj6@%E=/p<@eǠOdxφtE^?d+%cQi/*ľ|'lYzjӾ2|{7uTY0y0 R$ڳ 虋͚~?B3e׭16KL(r}gtNRT 8CFΰ, @*p+X~~>)^*!v@!:@=tY`\uW΅4$SF׍j'PQ8@{ n {ʾk}|ᄑ,]:xd&%P X_I7Y4 T/ľ7Fiu S'Ѝ+:?ܣeczNS, Y+0"֟GST H.Mx ܣ0F %/z J\ާ+fud`lוkfmƭOӗPGb^Q0*C@*(RT HRS C<\ L* ıՋQ^#+ 4>̹&|Lm 3]}M)oTƮW~OăEzv' @*0R $N* @ỳ`x_]@01>8Ӄ+Td@ݴ^{খ@ Ƿv=|o`v7t Dߧ?_yYgE+{y]/sZ<VM#뇰',B *(%0\DڨD&WNz:V+eS'Lmt:2@* U7@*Wޢ%|?nU *nU?@ `ty1`@X/c@ U1 Pc }gShC~g iǷd@(.ioo1԰hkԡ2&r *{z,D~r+ƈ;@Ow={>`%h0PKkRPF~6-dCt Ā#0DHrw//O(5UQ+՝{* +0"vRT Hg*VBem_5xkUmWGMf@2}{ dD18B>bO2^02o4b<_51 uC^0hw^#oջW{q Sno@* @ع*ST x+`-,\6޽V IdqVЬZ([CH1@"a<-juʎx-<] k`e?ڸ{84bnefq&[ҌPK4oR^,h0k Tct ,|&d//㮟RұS_{lB[* H(RT HRW*P=LqcX  <-@ Ю1< XS,1xgML}Ex@}\tp(Qhޒ4{?=+}ڶתW+/q}KOgc?ׁr]sK9"1Q.ƴ=fmgB]fDk>z.TOSq Gn{* *6T HR \ _񱊗TǺ/ 04^<5m]ROz fu#/֚[ =_ 49d"[2zW e yژyоpK c`ˊe^)Y63m@ o>Phh apB@ % 75'@z+^\{i(>x}[>vvqM W`9tB#w}{)ϴ xڼ]oޞ [v_~E.F~Gn-oZ1M{ `o yUȌ>͉d}g`mե>*A>(eO<%E-Dz%s޾49I>.)V*=\^գ|KRT 8WOwZ* @*yKk]p墏;  Cc Vċ4PJ遌g#t н'|P6CArqo]ex GaB'=gKFcPM|֕/T~voyGkn>ЙTX2vZ$[`Ʀ_s07x@[DEYڣtʶ'=Y7}Dedjz|[/\Rb^Z3~f* ~eNUۿXNRT 8Oc\$hƃ4@FX$hi=}ɳ rJBD[x@8sjޯ}WP\<}ro|+ʄ?z0D?y2~$f`h,`Kjz协G *^3!WEc%U뽯pwD؂miP/l\;{%U)-HRsR`D6O9)+@* V5E,yj^muw\0 Tb<0@^+^uh"b "j񄁐wAK}Yչ*>=Vx.@"&#`c=)k7(q2'>2mJ "Pf䁺>3fyIӨj '8I Mpʫg.yE;y_fl{h^hZ+?ho<qLMb@w퍁 LKRT 87[عk-@*z(`9mHdQ?O`jnvٗ&{:B@b^zM-@ma⚹P2#؞څԗz9UY=`͹4@'/$"nΡСgXy/'MOX~⇮(o:#1` ))P  /:5/X ]OBʄ Zy}Њhm#AfÎP؀dژ9_CbKa;I^ 5 ]$c[5-HRT"T=Փ\g ߨ{$EuZvX64ۼhDdR9}˫ԠA"Q`y)k _.h[g~~]^~^5,^->ׅM%c7w@ 3f*Ē笁OUfy6Z5{Ό$6p [Do^V_5Z}ϽD=a+y#HRTd $L X$PN𷸷gYPN;\\ʺ/ s @N 4:Rhz=5l02!>Bwlc΀ S_B8B ^d8\glٴgS]R~7C@ ad2A )t񐁱~/qiXͽ2F65g lsNk ȶ>AzBu]/ /gp@* #`-n쇑5ST H^KBu[d߿ǫ7zr^$a<1X;BC$X&ayF[,XKw{$">eQ?%Oe:XVLFS|tmmBLq:jfT HX Y8~y5HRT|R86OE:a,Q]ZR^Dic7 l0B+A t[>b̓]jadC}i֍1>B hW.Wz뼲n2tB{֕5k -q* H;By?HR7ٌ\>`Ik^=V@IDAT^ogτ%ēD}XI `@gq$Qw]ftcӾ:Lt6!:{IEï^ l@Yܞ#J(;[q0:P5> ʌ=DL{x@Ll@l [\@y<vpXu>zN2 Sư[Y&=F m+d)t 3sr,v" 1oOyxZK*);E3y;HRT[;w T H^zt@;šWW ?t"/>Lluposxy `C6C <4NK- $8Կ>0y*5  @=U/\:o||[VQ~t4Lc <^QAk}&΂h`를sC sf<[^M3K@tQ Ck(HFuh´V ~!niI<{\M0o.aϜ @*p|[+عk-@*j+`mqxR/Jr4|wPnME(H@o(q'@-`"`gOh)jtԱ_7ǵ~m~u7/mnzpc ЋN{x.u]'i$HRTe"-HRTr[ s `wwߧ5vl0Gyj]e) }r.Q;%2'̀.L0B1!UP)4 *Iza1(?Pnϕ3e˛o_~{*}X2Pԓё'jwٸ3⾱˧qi I9+0|:Gveh-kq1j|ySα~ҝW ǖo GWE7,=d`\ҷו۲,4( @*p Ź[;w T H^ @8poM[_ »q$ A9pLV cr4x}mЕszს7 +gj| |5'{xxx*=_X ̧jۛ2FuͯZcmJBc3.N}ﵵ`[eɔKC(+XK~Nȱy* @'܄A4@mq6~6G"O{m 43F SBT@̤C@>rxWfY\ʴsʜhF aҖD/=xb@FՠH~bռ}塒x }2{LוvtdyGG7g@* Q $FZ* y@o0j۽ãizu-e/DG 00P=K@}`app.dq~x'Ūx՜qntVi1PT<_ Όǫ[+RX~̹aZyה}6F׆ϛ6_ 4n>?| 4E0kC'45tkhhWZ7ߩy3P M[zɱ1,Uq^2=? 5[{O±-y* #`?)@* `sdλÎ9T5)DBM>XBSxu=*ٷG7uaXMH $0=u<sŘn]F?׾eCʊ1'|UXPi0œ2_&$Ё.g;vvww"vy_6ۢPx0bpzlr  hs3t]8]Z!pK_E> 0HPd_oQ~~O=Vʲ1&~uuUM UOym035p'4] ?pa7/e$}0Հcç@6yxy0ԣ c\cIi@%y>os ,oyhųrs'`U@*teQ 3p5cj{ $AoL`K=Ђ&=ڵt`N]<҇1kM+:0D{U>$=]tnyϵA{bS/)_Φm^)@* +I>σT HR7"ޯv޻< 28 ڢ]]`|`y hM9x W{`ka8lcmklϙZz`GGSKG?_@* Tʓ7ST 6k pf-ԕ vTY; @A0@Ssφ2oθcÁ^XrZ'lyaO7{JMY?i@* 'Uo9[{rf@* `‚r,yo,(.{xo9^ǃ,x:< { z/Ç1c !B=~2`#,/x $*i3fޡ6t#ϗ?\2s\ټPM_Y8 vA3sy,b<ZtfXN#2n1vZ+fW8sh8㖆^Ȗ{F3`9WҸVG=60^Pd<[_`fys Qb^V}$5V*  ğT HR7ŷxeܙe{}0p 1W[4Z1;/ޢߴ"rsW$$`2]4; r<^:y~-JσhLԴ{bt[Ⱊ[ڸxNe-7- j=RG(bY<䆮m^D@* TS @*FUyK˵t5^a *u;萀(c< `ޢx:-źpH ش@vk k$~A O}Pxy17Tʟ}زCᅓo쏾_ 5izxJ1'08l%kmDtుQKPb Έ~1C%W 415'PɦѯqnXG7^0%>} L멒@* XkwRT  t' X ][eʘ78 5x,O;/pgV%9^3@1y@xZӗq;h+I+꾩($F @c2ꨲ,<ܖZ̸RT HN@=wksϽl!HRT\P]Ϣ|YW/T4~[K(xȷW| @Β =/ (+̰!_jZ*  o=ǩ@* v ;,-y7Ub j9À /J]x lż$ikj@`scRX𰀙=Aab}/(y߸M.{=xjb!)se<{ڨ1_4i>|F{i dюp ][cp^{_yw!8Ӯ8y™nStl#[ʺ AaKKRT 8#`'*@*  JXZ`qҒktn/ Y@@F>X?w`<=0}]o (cuM߲h'\3=C {`qP}vq+݌ͫIEa_|2Ra"7/xeԱe=eިȂ^*E@*p\z?_ǽwʤ@* k1n3cqnAγ1> D [7wǽ Z9 t֮X)0hĝ^{Mx@@.@U|36`k&h1U$""'ahwRzo5ˡa+-KZVǃ˒Kʽl,<ٺZP,?RT H^V @* \ X[dVbm_@|NzY[h8`PS[g8 9yۀ O:;C}(ҨOc\ʃ3{fnuR\s\KQ /O~~ede%7^StC_: x$ y.xZ4տJR*=:6uLw~ (!)kb^e\ <LG*~* \ ğT HR M lkdqe0t;_K5phBx0P 7OWdQƘ^ o~hI'\72`.e= +$pkhw̨ fMo/O(_RnnqYam !a__'9`DsܪFf6 11)!wexUVPP:WǷt)) ~6^`N$kGmq5|0!@6X+>V_>)*r݂ 1_V>Ha~ hꃞ1yec#?lQ`KߵyӜ(># @qhؗq!3`#!MSatՎ6%eO+$:ocM? g1Y|O5FUףjcRwʹq"km̛=bnc+̽yNN^ORTbT 4s0[HRTT X wΫJ,u--Er[D\ܼd>yIBV_Y0 kÞ'pƶo 9m@ojme  f"Z*w.O=^=5ΦUOW|WY}O` y2k;/{+loVhGy 8SJ}g*{" 0\>/1l8gty@Lj|YDT H.R'-5RT 8ԒQTh\2`,1ErME>%ү?RVVcN[K"k %2>8tP5b'5H7]UF\І3,u>c+g& dq4ck@36%ڒм u'B bA @R%e-6Eq{<3$J凩J/O$d*L<[[%H,HWr><% H{}=H'fͦ_MFLeD`S" N%mapЏ&X1gF8QM~쾨L?r˦GV?=}ǣsXpQ߅@!P B( O2){bHH`17|֊‹ۖS]l2[bI{چvi{_=: ٶfB(.<}˿B( C Whg9r3? 0Ip )Rڈ0Ğ8G>u}iGb#čM*\u!n'ѰD\": Tߚ2\_9چw۳_֭{]Gޚ~y]!#xVčrmfȡ(ք4MNt]/ѽ CÅ/4 2G<[X.~NLקuI#`ԅsm-L;;۰U_]G~}/|̋ 4{xFH('7|I{Y.%^"1A zH\J>˲R>aD`B>=kۣmECMk[D7[_v[$=D;{xJjF)[yd"Nf(CLa؅Ik ௏k|c:׷l*pcXDzžmkƴᴬ( B` _[;[ír@!p#2@ AۋAH3H>R&"cKb?.r;q7R/EK<3" _FF~m(#jDh'@wÚ$Fw"CT8a侏TGEiR*3¯H>l-O([B@:E#W?H0#kDŘvQO^95|8dO,X{=,m/ ZCQ11D0)9'*fzh;#(!^}Ę-IK&~D.l2#p_<'^VOe+CG~1*OzN&-j7iٟBe=w|2:bĻ~SZ.^!P񟙙kg(0)B-a օp:8ƚX Q/#Lg:?sGXIDH@D8eiw8WB"-&<?"A(#zWFک+r{̩Ni#?yvg[鑥WkRH:)ZGB#qzftH&|XSDHD6.V2wTKyE%W=z 8e7?s_ՇG|1i&M_HcXvuL+<:eSîL:C!PsfK!PxbSѭ~O.," $ M 1O!IԉD:&ĝX"w$W?W=];Qa3[VEqHOTPZ1-6<4}p۸vv|ck{ue혲AeSU"l;V EDʴYiZ̬oaS-+:JeĊGQųv% ' &O[!0B&Lm><'ּL[WO3mv8Rx|@xLL~nؚ>ׄB[4mk B~gV,F`!E}!#ObÈ2>%"Ix}>n[:_s 5Q1 TQ)9`DhG?+Wɣ481JNF]eO[~i=@ ۤM'L7;kAd~uwگvkUe!PifD.H9j5( 0"HGkv Dʔaa!2'5i8d\GZAȻ{D1N/Clh #߄ɹg }ֈ.D draSc[Kԑ}|r|ֵm;6#y]^DzTw 2B2Q/.8]ګM\-=D>A&"na#|DL+To"(fuMi;lk\L^_p՟%"bHI[[e8N1EI3i( D:ǭ[}#~Q_@!PaulWu( SiGsAP8G b[3#WTSiƤx1E8!rj;#bDd"&A]#|Ƚ2Eb10#G6 RI'JF 2'"zI^(o'vx\\j_v҇=oC+N"P`C zƧsF9D(SO6_ٞ{4};*xA_vX4Nd&2#94sM!a/vuH-ot8YΜm_aE E8`g!bҔ!!#'Bd!j<->7iְXkc MiM"c+KDh]`ζ'>c,Z\xU+W><; "|R\?a&=Kʑ}4*,g¬]}vgkf 6A>. BkOlY!P'$Eci=62e/eXkB >B(=":tLY4UP)ws>&C6׶ab$ ʔC ҧѫ;>ܶv_Ҟ{Huî|ri6b;Fa2#llG~6yԗ\מTFݑ_>SS wGO>:o^ pQ+bxHou&oVc^D#.kE2 ^" mw<:>}ΕƠ{b۵HOX&B̸o\F^ YC$Y$C[T'Hr0#֦! feߑV!z^QLDFH8"/"zq"Q! auVc}(GdU;Cnt"W7îˇk{)ŕhQX8z~'JdE@\$];ċuZv8T='B$3>*.B`z3AʕS|D"֜ᨛiO>*S$]0W~ K OtUjiX9nϔQ6Ȇq7~:F_u}qY=+ B`#?ӷ=} C!PmNhsNNӍ bLD\Db WrkQ}"t9E3p.hA&%?ʳ:)F6顧D!2DN@0O;k+b7_h|iU{泛Ѱ o_mFQ(H&QiY_H'Gdvvj$Th "x0@IDATgoqş EU~fh焲#q7v[_Na H|4Om!umxyê /d^ݮc:u@!06 B(ndBiXqn;_qxf \iz2 'x$`(HbO(;nJ<#|$:p!|b†6 Yj)lP<uT4ޕz^VLόi%?(.|ąHSNQӆ2@7٣Q|vG$`+ 2m!sE0}y#0RIFum_9]F6g\^rg"C ۷iq'4@!PEg( BFfH4+R-y Ԉ x8€ zK8!q- :#0_IDA A4 p_4DfXT[LT gHh2LTg9R8S3=Q$Lw|яvE%E>^ThA%y eq-D)ē8CT1> 3S EEH}q!ڢL$$F \z G_r-Bxk+X㓈Ɗ6P}xG]5 #eavo4sO/ o^<^yX3c?VJ`@!0紭LrPs"!ĉ Dx8Nފj;C#3ryEyL~M$%$u_{d݋3֣?QgB &-)Cb'ֆhQw7Dkz _kp[ڑ~4#0/#P]ȓ ػ JrL5$|Hh G"R"Q?!U;>*ǖ|GT3E}M^6g]F+;Α޷cy6i=ZGpֵѰ'Q}`4<,* B`"?3kO,o@!Pf5X6 ~gaD! 'DAi\9Ս@ pގ^4D`#æ`5S!ĖH\QQJǗ .6ȿ)~Er'|tWT.<[G[G2ZO|uc[BL9C$pF%%Ē$-{`#F48ٰ'rm(bE,)#"ynj`l/8+_rL^Fo*('{N||H϶mZٞܶ[h;y: ]C` ^k*܅@!0Hbm!p7CKO#AsI&1k6~H1ˮhBM3E.3\B}BԽFYq;2G3@6DȘ#gk}Q{ﶭO-k_|f[O{9 zqQgAm=mL@mM38٢^D9qe c*ceu#¬NӧF]me`q C 3y.10s"Jh,'6i>juxA%VX>51iWӋ'ہáPî'* B` ?3ko:-o@!PR"nh+[4 0v>Y1EDDDL~?BtCya'DaFg'B9GUpCEbû+1-sLDMYϾ:v$"\{.z_꣌ wJ{N@F+[&7>q-`قE(]kj7a$EI; 3"H>ѭ'BHC~I|4؉fiq1dQ)È0C>I[P_'uQfwJN47&5L9h\7Mfr>v<ޟ:~Q_@!PAfD98rɅ@!0 tF<-8/ !7L~:#D/A(!N)!x HQ|H~ .)K~-u#66/"j.hč5_fJ~0Sw_Ž껻#Ӑ&Q漨Gg>[l N]$ ճLkI䋨wI& 3F(S%s%ɣCMҺY1LuO!=Z嫢 =",S)0KNH8Ѐch[槞@!0[ۭN~( T48m7h@\E$&(6HzGsySݐp]t & "K"năkL@!*.F߾F({ۡKOinno/(WSG~/!S>AB#퍣<,N{>Xv5]ÈJ~m~+CG#&G P8˗F~ @GmxXD`iփƴD: ANEMr~^zmVcQ鵱lvLTۘhC!Ps ).+ BX958/nDMpbyf3<3bIozaC 2OE<ȸiwi_sNI#R(ྈ )<~"N&v"I=#6=t^2^/:6-BN7Xjq̈#(48R⇐v-c3|+KM~L$pELǬga| G_hי&K *um4-1fk`' 5f03feĴIw#[rIW\ʋmE BW BX9(8'QD $0kQ v#T(ͦ MětIʥ!,4Б(NKY"-!Dѣ)QOuC:SR(&27*쎶cESWbcy]́RR_st^YcFԛ@t~"oY8)]ԎDg|B/E 2DGTΉeDM^k.⹍;DsĜ|韬W#5է3=bKab/iW[tH™W6:l}m՗m}/^;>c}_gb͠xu(f53#@!P4~5H;2BB t sY9rțZc%DB@9߹.QgĚ|::=ҚF\1Bu(t4D<~ʼ^xuk_{䎨Pix*D ^(IS_A '*gvږ# j,E)"0!d>+Jb8TjmA3$IyƹCD܋}FiE{GPAto/&2A~.fy>NoaԹ i?.!wK{?y8ɴu, B` z6k;}o( ُ\fYx5܊{3K`Z)DDDMؼDV'Aa!L1 rnBV2Έ Δ6 b)t79Z"(taA\Eq͗y s.]ցX'Gz* B`!?3` 8*@!P~R jGAq[!nJC2'(bI ;$[dL,! @~$r_}m"9>6 p"+#M2*!4MT xDbc EN((?׎~T۹2*۟}mG۸~Eb)Y"V葘1iÕO,>@O/풨%> y>Y#anolNN"2ƨ/oV<`ckBe6?ٶPa-oW) B` 0+7/+ BH+I'3">*AeDfDzDݵרYz:Q bBdڬi#w/g>֏Ęq׎EZMѫ>|apwsb#3cf|eHCFk,ܱ6DWi_9ҳfg@!PFvV>(kV(œ4A/"Q ݴ.G,T 7qRD"&^BBgzGh#<.vYiwvWDM=d@x:7ho?6'wφiIYf{5"\ġCL/X{9te"#gF"i+v#ցI_: n䪞@!0ֲB( ;8^Fxi"ڭQGMMaG4.J%r23! /( !7;/Bp!(SF^N?:&SAz>#aa ’"*wv_)Qmζ|YTJ& qw/EYi_n7˵:@s} _Z4J"g6О+i07pQA7ew1~"JH`G?GD`8㨟z݇4noX=h{ۏ_BQ}fSG ~o5`B[?l1D.N2*G47Q2j.iAS'yw>_izZDՖ] vExOzGl@2SƁqC>W|#MKCiS`e;M|!l1 Nu`?f h'XlG ~ B(j~Et;ɪhdw<7-+-n RP3>bn!"|7 ^ߍCikqy.ڂ^GuOS}L T'_ҰbGWE%\h칭a|'nuqp\_0 !A|Sď)spwf-41a>4oqNӰ$Wo"L_*z&YDLeJ2eمSy?4'̕Q35_εXyʫG{6uFf?B(;}5`ǰ<@`$2%(q%2EDH]$$ ߞ%9FHA8q1v z#^0C="MA;!<2Ė(X y>{}bHMFiϼvʿˑi^Dƻ4Իwv&#rNrr}j_ԍ 54+XuN CZg-ncD_82bSDg}+3Xg& ^NqFw}ın_{r͡/Ooh0f!PcX B` ц-͐ZdVt|yN< ТV 1I؉k$A (QKt=X |p9H?AC7"!BĢ"1Y $zz}l)@vQ(}!?~ІC󿿶} W>Bt]&L&D='6*(Ś7u׌b_xX`FpؚV\KdK:6Ji3L 0v[_*GQo9lƅrܓV/ioL̻3gaWV\B ~Jgtf,o@!0;8NjlC dPڈ3E F RmS +SҬS<Ś(tDLBՉ_Sv:hY^HBw 2&N_O$lY`S7CXv:7~'^u-bs_[G5@S0%&a2i*RپbE^?R)]"L?.}hԏӿw Φp4.vU:A黠_GbJ/8rTJ7&5뚕Kڧז:o9^?xRU}@!0Й5?e@!PF iHrt6 &#ĜHi2^v|ȇUʒה>]( \gmc>гkY 2"@ԇpRe!$>>kwGXڹhOn!\5cTÌdyix0mCDԉHSɴS>˲ Q>0 J>!cb^q҈M.Ft3T(Қ. иG{>bLxP캸| [X& ~x|{1k|9ա( @΀MrN΀rQBxnED Ԩj -EnQ*ƒD ƸgH&)e!݄s)> N>%BG'Q:Q>j@;u޿v5"C^mִ4|i˗Fa'/?#m۶}Km/ĖDC Ѫ Am0SlġI$OFGiKGvƁD1IĩBxҹ:ƙ}ܨk{lۙ{soGC]Y!Ps`:gP@!p  /D?1zF4 F~䗏!I'Ak'Ach4xYWďz-/(fkTѶa{|)R'|uEw%Q]Y҈:u1iY <}_ʩF< Ƈc/nkDe_j˛-kd|kwx8|J{Y'%b$2H@| U̴I]0 K,3[/?@@G&l-v dub>`FdE3w!"NgDz'@Ğxs0>̢$$ZhDYFzVf1;CE}.\r?OCo /1/ʌBa>qb=.olcܹ,QDO_/BX_}CHM"zi$-:| ū)b(h`!iZ+u,k팝ɱGn!p mk.N^iHzY!Pwy-+ B]$'Eb$7@צ!ùK~ڔ5bEj b1-F!$F % yWMx 䋄1SDX'Qnll!koG>[[؋{ g6Cفc'|C'qQȺNw/;{S*m鯮 # Fh駌V[kcɘ ΉN>qX0TN~56p9#ʌ?bplȴXǶAuo;]?Dv(+ B` ?ӷ5`9}D1΁YI AaF0!-~ψٚ,ʒ}2D>,H32/n+[FDCf6`,*-|S'$%Z ƨ~icþV۴${WmVE0~gFm;.9Y/Yvk$ O,#\cV_颩SWOD@=GTGc1e6Vn%Ȧ^g-ol woNu`lC`F6=@!P,hBC`?4;%r"-'/TsD))"2Hfͨ!!G =$\]k[#}Lϙ*dkćX۹:|YϨ2Ӓl:fs bH/DM&}ɼ9؁HNޟih%H\3V߈z[jk+s_Kȍ_"Ȏ)LS |aBq-F$}W<]=\PO fEce&%"r)XpOlx)Ekm1vu~sFOl"5mY?R~ 3> 9}4h O~{E{"*Ή1ŒC:QXB/}{ҍ{Fu`ڱ…; 0iO\zP@!PFܜ(_])E@H4>7#a[{"ώvg)A~-&:FƗ4 8 Cpa5ό'p=c60>Z7e}1 -1?\] ?~wCu`_;َ\VA`WpŵtS B5$GEL ՍuMZ"",!"@sW?iL/;#e2$#,/n1|Av!ݢ'|m[1|icS#[ۯGsٛo]hAAih#WWjE>1eѬ?N跶Gv?vԟsz"-jD#.S|roDE"+xcTSB^p1.-]|51mK~[mY:F ~bo*O~)( dYCh_!ˆ.u`=5 5QFЉpةP40DF |T: *բ^M$*!PY6PSz<1/B˧[22I_|㵶r?xn}zRd{;/mv;˽ﬓ0EG?N6$-#c"aDjih6^4tg)գl>}1 9;]jWѐ旾զ[J+^}xOOgf)IfQ0 i?[y`\ZC&B&J7'BZ4(ܲquE'Dyh0t++ B`6#?{ӷB(nR uFH%ՔF!ʞ >)d/eMHHzyk|" haRbDzB'tSLM#zjd[`}cWkO.j/FqIlm[g;uL/Q'BE;U3Il>2k5 f"Ƃ1 ziSD:IR6~Z|Gnd)ȊKۡp+'31͍|ճB(ft6P݊@ԟ'4MPBA&\D-"S !0dܮȵȯA(2`#DGM5;KT4NLz͸Z\v.sm[JanK۱um;$N潣]% Ԕ˃F\"LuRY˥/E=c0%&tC<!O>"%}l5Qf-gl{``+anܨ3 ];W@ mT;x8I}@!0KVkjV!P|d$rm$ՔhAjb YLIvxy"z4,Iȳ(Ȕ4":SȐpω=;Oȵ:3Pu=CƑ!6 7!OzxMq= _>p~9D:h6?WwKՕ\jCa1d-Y.QwpԿ)֮Io7D3!Fɫ}h|"i|1JpSn OpK6i=όGc8ϵLZv_齶(|'ZaB̌U BH])bn᎛Y N"/DX!31Lw"ę dZ:EmD&(<5@1ڇ3!o$vl#5EipM}h؞}G_hsOmދ'×hMU.Da>RܙaB8q}" \cZ #1#<}2l$!z9'D^AED\w\mof[kw?|v[< x1 :qqW-X ȫ:ZQXJ#oUmt"m1.e`L*u өo}mߴ-@;q1޲X;VET5( ۊͺu( YP5HIBY"& 2dĸOC.iF~-X A}h cLyF#L7$Զ&+#ZdZd 3];zͷ]Eߞ^˱^{>08}/j6ˌh/ƃȔh~6];ƀvW6E76GYe%nlmg֟,zǕ+g[Ξ;>ю W/ YYG5( [B g'2=gtDQNp.߸)fw"ǝ!&z#QD;>r4KK!LTEGWe$2=qm)bهVu۟P[2?r_\>,apabX>wIaGQΘ˚4N`8З"sVd57P#2IEaʰ!}lkb^ꥶq=m7'6x?RvU, BG ~*oi#oMy( B@jEL CD5pVe/2ː]k,4:I]P!"m8W rP {>œ ~3ꁜX{O__}RGGoC?̆?5_ޮPz[+ѶP~QOZk])zMH`=X?N;An-Fh;})RpwˆmƤ1L3Q/z/1Ο?tƚJ˧1F(^`ƌB-~;G>UI}@!p#0 @!q"0r> qfjTlr}$! = Q&Z䙸 =Czd]ɴ҄Nfi{O 1HXAq$'c $:NohR}h;bwO/k_|f[^4aDHXyQsKz?Np?f)ײD1 !٣`V1BH]xf/+84Gޫr|ȟcRZskǮ,D`6ذ(QPccBؐd8B(f3YV@!0'G l7 v4iS HlN54U_r#L/Cz(VX.ȵ":z"qN򭬬5EcG1?on_OKi˛m뺻O6w!5a`@{e] ߎ #+Q0Gvn_ƝzNt>ƥ@dt?$DBc{cnvgpcݚe홝çcnţQَYPlCӶKִB(bO6tiJ8m95R, M0[BIH/BA(!4B?y\ir 41FDN&#-_#b |5:H .~=k~_J΋Bvݽҽ 7 i>nX WдMô޾?6ǹ>Mvƌ%̴%ǒ>6N|L$?Lla9QO(E`:nCu?*6W.b#ݧۑî( -~KC!PDMBB8硧pi[AZ 2&aFBSQN/"o({6@ʹ0SL #Ϩ(ت)(醴-R|wq݇ף{шta}ĠwqtQj7DMXD{S`'mEitD?e'1P0f|2Qz m?+rko= )!w}@!0k_[#~_<@!F`S)6̡ cZ%5l'9fD@n@#IE"D,:s4| ȮE$lQNDU˘M7Cet"h"(7k~-PѰhOk/6-_hQG3|R ' gw)d̈|_֪9ח0@$2PZVTOO"Q'3պB~1}ZcϸTy])A[ WOl_}a7/SNw^VlA ~: B(nG|Hi'4 y?^w39aÈ7y=p? S *dԏvNqü|9NhȗA{O iSh|x2-7jqn[1#gP 9Js/ϼnAD5SC?3l@IDATKY+e?[ucD ز >-vQ"D?5񦝊ҵDC9?e#t`75M0]ny[[QH;C. B`v ?ӷ@cPV\@7+a$ m6 %L Lu]"U]h_8"Ɗs_9B!oI/Zf'ެFT7mHXaF$ElhXH1SOOOQS阱tD26~>Dn Ʀ6xO4LLtxHo-y=mU$6Bռ) {aUB ~no#:}O( $=")KIpXo湴Ih=CXN^CMQq&"20;f*!KDcėhB!<MDb&جΊIo;okm}m碑S}v1[^X1V4N,Z`@箍;cLD?ErC"eGp1^wTEU~ ek}RqEc$@!06@!pS$9EJ /Ƶ(tĕiDdH6cVl=F0p!,V%^59oW/iv$HȇbȘ  ""C_ĹNꢞ;PsG=rÙxC~]kiƝH2٦GVƮ!"/=< ( Y@<@!P|dFƙ-D)ZGd!!H)Qq> &`i'͑#ؚ/ "`g"bM|9'=Q6u_ٞ ojmT{_91pIS@ QKv0cqOD1cɹ1**"j"0WGrܘ5]O( E3yic5N3cZ0ΘLlS/l[.x!҅W3gc0e~Q_@!P'r6l-P'NVn@ZwtbSUo5x"|z.Ȁ|Xs1)_CH!b"H.#(DZ1B QvOAT,)g^s>kl/}G6?;6O?d#[KS0X[OFnǿc-Nr5Q9z?i#^x6XF^vܘ@[ɘ3$ y%+*l 0+V,_Wsﵥ,hw~ ( YZ49힞]]@1.~D[W#r6cʠiđcv&d"3"M8_>k_ M72PB4?iDI9wDfKCDZ+F 5\|.L#Q\ lbk𫏵FEnGǚTnFs:1uu ? GFٌGDq%W7smY4[6H_>*Ib BʲB( F !C0'3 txxOn=/mMBEͲw2 VG!'7+eژ\Ÿ|}:X@E@PGF_O˃yB޶nFQ0} U'pLiw>tl8fu٢l}'1B' qQ-Waҩw(`Ƈ)(=Q@m?cǘVNW7]VPM  v=iC B[jC!Pw&B Q^d7"[aZ[)aȚ"z"]"2C{+eI3*F[!ԙHSR ߪ?KzYB0*uQ|V}X!"llu~ .3F"oEiy3tC}q)$ Ɔgi*1 ]}'Hk|+D)XuMW5Kg6/ g{OBϸ. MP')h{+ȧ(T \I.Or^43*Z<^}MJŧ«Ƀ2#Ӷ!x$$x?XFҲQmlRfmn+ y淟?᪾ BZV@!@R(ԣ#yb 6k5$%TJ~$0SEDUi *XDG V勴xBe"ͮv|wSX4Cew^;A폾^~1Ǿ@ fZ;O֟g-}gW/ƓqČ Qь':% {>3f\j|>@hL)8c^ƛ? g<~pK+q~۾%F8-w{Xk( B{VSP5/ CC*t"]=Z/H-™f*| %"R$RE0Rhs>\;""~4Fy/V? ^95ܸo>ؾ׎=|Q{Ŷڗ֟ HG1 *JǦ6'L?%Ý[Nƃ"6qe !AFYFƎ񭮌7[Ɨ1f2B<3E1`1+ 1f*ǸxIcք{)CwסlXOY_@!Pܽm:}C!P-$Drk '"8p_qD5!"ׅ 0хf: uO3yCEsDYQAzfn8{?^qqxRlm;n߉݀܌ @!fDK}ccu#WIlGҋrg[dE:u5DAoܝa3Q[qwb˵5dƿ3j m#Qw?8jvT ڰ˙_W!Pw/YV@!p e 0&| i9pR%ЅTa׌aeʵ 0+Z"|#ę &ʠ"lRʎ>oLͷ.y _%i<^)؉z"Pf}-U=x`ƭ 91eUcIY?`+W4y!󎭫"v} e+*aB?ykI(N]w"9Bb)jK$3lWd!)DYkocP6*WhE"vsC=DVgD:}ǣ1|[YY_`Cڟ)l/*d|>oOɸHA%H!$n%7PBk[6Vk<-XvN"e@!POZ6,(>^! 2] yDt*KZϐL9AI|AFAr3 l#+lM * L _'^fAh!$T8 F{,)[??˟l/_j칭!qs(w5&%`L3]*w0}QxxbcP@`dYh}\E>#k0E)k6Nt#? ?} n96[ўݶ48N|(ns6B(fĖON)$ hnXhH&™i~S02;",1e_|~(:"$#6[s>L7U䛮*So߿ 10 eWujyT4 3K6 L6A;v'_M'M;1t,bH<F̶@CJjQ5{CP-齪=瞳sɅnlgH}?Ke| M[(t Rg ikX)"9fEog=^JUۑe\ZEɴ^6<\ yc(k\"se̖4N3OKfl22n;X9RSd{ohhpol4444D"PB YFTP.68ϿAܜCi V[% .8/,!}^(..+etUӤL/~cqa#q W_Ћ.6Vtw2N0hsDR#J%1DoQX2Qi2>/ǍB8pSeSmA`$18.N/~Yx̛]^{444047 4 < V'`,D1wQ^}@(%bf!QT%KmM}͠R!l@(z-hG].sߧ\iVNp;L+| ClxK/Y 4/qWJ4˗qd$yC3/ PuE;CcwZJl0gȻIMdk-TDƨgIŭ Hu>O27y#yЉXIKm4440d50l밵44044PqP hD5"SHZgMHҦc  9h{Z&\@1"huhKGuW6KϯZ5KD,;37sB-RJ'C5DckԷȖ}dNxd /NЖWJ]h9p$[0S_4+]0L|/XGGii`j o}M~VDƼ-b.YIxV!K^u` U( >$Թe6RWݹ{?ZzX|cf(ぃ֛/.i8so,c"nMrO$"NS$ cMWKu2uxVDg+'ږYӵ *<@;wfɴط?/`ƨ{ؼ; mh[e7B@3ĔEZVY (u>VM?,!Jm"`%@Pն_@{iOymy~Su[ @^+rW|~#WW$כ7mtreI0;)bOh.*YBϹaHDs)}-g)# ]c #zHQUm ƨFUc߼3oD>bG,"ZEڌNb֝4.ln99싍3җi4440\56p᪈vMMM?.~"--)k!O?`)[_S̖N/D4w29 D|?EDiGD8ܽN|GJY{ŧ.->iqeQi"e,B漾:bH{RiˑXf{9gnMMMKv# [MMCM] nB*EDxL~u@<'.} ( +Ο`-"g%ʐ,2z X<}uy^g^vYLA{@OЄqel\4LJ$l]W,ekas8*7 )RH{dYju)c@>nM[T qƬ-p©_WtTwpS+Ϥ,9N~9dZjka ) w5a&MMMM4PF~.R>k_&*\@m!o .zpP 0'w AC7ODJKn;qQnV'-c-y_Xz9ZVDQ}?k^D<ŭˆLM$DIJƠhhY'awcΒƺl@J!ǂsƶcȚc×bp]yH1-mFD\W+KʶyO J=vvȬ&MMMUy?akii`i@ \Z!E0_ǑanEDFǁ`@Bi^eECDގy-ĬK" K 8=_ʈeS}8nXrެn ^٧rd3) vƨ1 HĴlwP[gCDf)mc+rF p8UG6n7lb#y%1GڪSmsd2 q#1yu{w!briii`i ouF>&[ MMMϘZP_Vᵯ U4Y"<&2ljNS E+0>A,W9^Q6 qҵ_3oG_,N\O/D{dSD3޼&K^,#!}I OFmj d|zfœ#&*"6pdqS5+)dIۜƩ(*fx5ivg/RӖ5Mט-#_4i]iǬڃpmXQ[{kh ۟ށhMMMhar aJKر,^@yH@*r|U=lկÀWǐ.)_5 lɌ5k0#cu^8*)UKܜՇ/ \05fޞ !Ȓ EČYQهwu"Oef۪ӭ'%Faad c+dy7V+<%!^.di:jXzko{h;MMMD=!`02\$ 8pB`]x X;h07D .X!vHj Sp-Q XADELROZU\`Z-?Z8y:QWxiLεđ}=2=Q0Kʛ%j|"BtSX*XF$d m ^`ƦruOy[e54 A!u",&YxȸնwjŶmhhf_mr}vMMMр{YH,z"}*, 7g/>\"]ADPr yh6%Q+ؗZTX^rfOpߺWbӦS/ϹvI骤ߞ~s1?i9(!虔VQ6_ a/$˰JE D^>#XO1G(/tXY#MqQ>ǂڒ(Ä}sP ʇfNW]<+bX4iT|h_l؜yC'M7x[k-4 4 4 ,j6oV"m|D8,cXz$1h|sh=}xU-+:f*cjy`,L.O4dR:e5 4 4  'Zz>ڤiii`it%0%չ.b ~J |"d9f^B]|/@R,)+&ej2$`gedB@@o/ż.eė Mj5&^Su%H?^~֏f \Cj'I"fls:(mM53Ƴq!p!_4mUC!ibiؼ;h}[b 4440L4нm444p4%0A]M+{/RVO*)jguExMIO6UjC`,g{[/ p]83:EפֿcS̜=6vboaQsa뱘:et|gؼ-$S({iii`hMI@@pҀHQ@B:.J<`JG0+?,I<[d;et04 S۳2P7kQL/D2剄g*e^ġڛ.%o^Οj!u(4dm`2s֦c!Ў7/b[Ȝ϶ƎW\4;;;Snj]nT&MMMHyt什m4444hkT:Q),$E0 ℀U06kJaݺ@(i ZI -::&e` Y喞_~8.kw>yxs.﷖+۰@!B9cXd8d9/r9N+a%ˏ+ګ48"rY MY"qxzx[):p D۶MMMC]Pv}MMMg^pYS s VXA'dWDf$)RF R#1mJG}}"k[?#xJUt5 YF:Wٻws>w,_ES;baw {skҀe-XRI(Vq ϙ`,Dql+cL /⚧-97j]c^%iIc gĘ&Ɔi@3F]oX`sR'r'kji_z8h o^ $,"UPX 4@ EIH:VI(YcN~]Q-9^W}VhuTw4du@6(zv@Voݾ2±*+'^|Y,Qԃ>[όTè?T0= A3) r֭k ]|W/1I?+u<@MCƐ_8XKv9 Jf1dɸy d9-NF༡D!*)686؇hq8F^4e؃\u8:яN@%Q WZg믏k6x/cǎώ__{s0ԺN3 ^X[{oM=iUN}~)kkCй$-Oh Y6ԫc8؅ocbqy.G"Xc΅ֱUa p<'Dcƌϖb_W􈥌5*^Wś0h405BCm44pmyD+q`493lI-0*uFÀK}`RJ56b,y%J?+-i\YXտkM}O.=| nyxKJ_'g*'@ȱ@i _؊1䔶D87)~͖֞}b.XgAيePyC=~Ҕ|Iz)eG?<+6n<ᐎwt~w";wnoV_E_ʚkcٲe1cF>;ݳUvzBwi4444P „$){*QJ =&JZ!cӨ5{}@)mXFj#0Fj.?T\r8oaP2LL:٤7NB߸2گi~i*by=i߃s>*eY;ΈǥK3 1SGe7; qa ;J۾/({=wW]uUq.4 <p 4 Uhhx5m?q20䫤Xa̟qŤKJ 8JԆZ,H T*ZI0 hMs\6',,^帳lY'wll\y쪘\Z`<^\JO8*iog0(Q\2摱@ƤʱmFj )e%*l~;}mY('=;x/]hNHSX".pKgF:싃}|c:)N/$ȼ5/WryD$-rWޑ׿u|_ܹo=Q^\rkit5Г?wz۶iii`(k@t 釮( VKD@(ᥗ"'jTQYNRU6/}xi@9BƲ-W|X2ǧs6WOmk/b:4g[= AD[NoEz[`2LےrheCm bȉ>'H3f=I[ aޞ0ndȞygǼcbl(;{mHz?Ʀv1 ~;8/}枸"fT|Og?഼ωU]ֽgý ĕW^W={Ċ+ꈞ&eFToMϸzBgwl445PHP(w`%RJ ^zHht!N@"<(%>Eʈ SP kcȂJl=R=KǃMe~ 6s1i2 !\Z Ȕvݱ^9^Gֹ#q"BXC8-e_u'N-ݑvE% Nbl":4.\ ec$8Mm?X;SivZn)ė9kVˎ/ jѯAy5PB qq\c\j-;B6Ӏ-(gJ1,鵩94l[~8/OM$bokge~s`gJ8p<~ Jma!~L̛ڋt}b_<cΚF)^xa)ynq;pxJVL 1Mz-+'i3}oOd;4k o_M! @j)R jm>Rd'4Fx!OlWؖP=>./HVMWHyee),i `}vHՖVV6#)!M/?K8O{!c7] u<̽5;l2<4c ]1Ps!YG&4[΍C05%k#ibC>#c"^l1sKh3b鼉iЄqcמN2SX~w@w˫>prʸ[Kzu,=Z5 - 46~v5MMO,ovI&USWY1uΕyE *`rd9_V˶<9)[C@)J4jp|Hms\֗Ͻni.~jsGƯqhxL4DܯJ%K9~G6gCy]^؂;g!;/fu̜9-ϟv M>3BM HGt8Kʤ9r$> 7s)ZI@@9#eC1?;>P"dQʃ0$(BPU7u5^lz."muv!x>|.4#r6o=y덾W^E+SIZm 7 tǜmѨ:6sdcNycܳSl ٸ1SG[dkY8GfuMCy`rɣ窈)ˉ65|J{ñ k)߯_]9FΉ}ɦu8ϓqKEKI,'%xD-.̹)-)XP89)os,!:+*Fӵiq^׾2cC.h.>^w`UijDf%Es<;cR3kΈQ0utq=LzHv&瀍; 1KQYGbͺ)FJʉvVhoo}+wĻXtix㍐)m@IDAT $igŗm_@ښ4 4 4 #&Sj!`X{> D$JpV:Tuթ|IJ$_f!}ȝ_ڒWW"52Q2uwvp2dx5)szl g ƠTZ"$HPu@LM[19.D67DZ:,LJWeg. ${!lNfG,{ʭLg٠J~7~#nXpa̟?|zl;Z_t&AXkH BDx0.>>*5Ǟ(Uq*vhʫ/PQB!%54n|o|اĂ 'CKoZ7>oYiutYX;EiqDX!#،qoƏ(bmEMצEY..9F,ʧ7즌wĮt(:M> T6s̸ r?kυo&MMM pDt"y| ^khWM͒dJ-eQ{œ "g"XȔ>4Bٞ4C8J;WvxAd#;.w:/S:0IyhM][_TK+1wX"<̋!`"dLM;DTzӪqޘqaUi>?&*lh8X_s0Gua[ʢKEtcbc.C0X4!m12"VgŔTiii`(j oogl5 4 Ny&\97#xXظ9Oʇ44404нj444c 9_1[~,d i">, X"^H MetI1yZKlg~?ŷ|4?؝yQ9/hx뮉(=XIh2'.$ؙ$ l\{l8*.+9I{`Pc@´f|FdlxݱXjK;o4 4 4 <hyiiR(!QH$U!E@$O>tI"& ]DLʾv QUyGrk*`6R:H87_cE|3ǢCs[D./݉~_ET559Q )2cșqφDهx'v_!dl>(w26d#]eX\oK!5ihh8{5ňB ~w1`"(9?=ctD TMR ]@#B5/Wpۓ? jjGa'¥~rWUs"ZѯܯѪQ%RA[eiQi"HW[~6&UDžc9cNSM{nMBgM?Ni~=@rңB})PT+Ѳ ;HR+ѯ) K9//tˎ}ѯr?p2ޒZ8wjԌ/[[A%9"]lCco΋ ٖ(r2-A煄@q yc3JC̴ɣbœm.Gl}Yc|YYz|->7 0T2I?${Ѱ\JDe3O(Ȗy-V?Y4__i/ۿzo|0_7o^xeiDksNKŭR@w"G3r|x|N o0E1l- `LiYE99>E2ɘ%%˕9w reɒXv](3o]WG剎?Z5 < ͮI@@3c.8+E!$cڪL !b5= /Vex&z%8YqWG7D'?w]̙9xG@\Ԁa8N6e s9!sܾ95mS164k+1Nd3ΊQi` _(1$M>mLY%?Tp@irvi_En@O>vo.iii 5P'?Q!<d yGȬf> 0(Ͻ:>#8. St@]j+?bZ^Q:O~_ܦXhB_w(^e/|RvzM] qĩ@$}"etB fXG؏ϱA؈(+؜Λ/df'C::]#[RCɢMosnܸ1>8p@![޽{n}s)p0> XJMMxK5c2yE CЈLNY')`Q HB`/P."B"at?ʇd-ѯţsP8?WyS~N[;ݒQ^Ki__DM|5׻"['+1:Ą GW03.[~ 0n,;р|yœF2F,#w\.!bsΌ 'f6{T|㇛c%D:vmgjOd\uUq?3*V墋/%1eJzŚ4 A  [MM=@ne[\/zl$@[!M^HB$EX(â4E`f#Uz޶sxh? -:7^`_ET.'z=w";?/_ϹvI`ݵMOJ$XTչ_}EIeI56uIxe #P?xF&Ƕh M*/-^oUiӦWrw%\&/)HW0x=f;}km4 V3V^FիּCR.[ih og6B@@4XZILV$wOd~)HrR^7(tLۈpɋ VPԙR-4P DZ@dJ!qyaw}dʼȻ+ώ+-v' 0`/N,́D]=(3Ηdcls9?ql_pao>&.~J|@< /V9<i jAsDIEdklS#![Hl-iKlhg#dɶƌ񏗅<^;;qz_!o^{miA'?Y.W֎6 <zB'ihh8$Kj ǥC>“:"xox_c9_!wuW,X ^Wc~nww#~=cv5üI@@@|O>VWb\MM'7y2_qq HTHeEԔfZ|CϿ(XM4*?Ho_)&yO Ӫ6.D}9#&v9PLOΖD WaKF0Pk<y3mrS Ԥ7ë=E) 2XH1^ٗ[|c^F|V6 JD[0j<~Oh/O7kgMUƵ/9Tv=MO]t\J$xKE:6,s\ivَl#qCal/QsgybuF6JwJ` SWn, z'OTt^zS5:+[|yٳ,Q IEgJ$،3ʼL[ֳUHzcM+[n-5i8] tGVo` "͊ A<&[ B곿A/Ja~z<;D«o~-(HY+Wh]&?|$ylݷ>?.YJ?Lgn 4"WlH 97۲2bM \06&a.~D/gu+ccZfLKϟ񚤱\3Dq)mXDir.:;ǹJDD6n_W5yM!X5zq6k2nܸ[}oXl*w_|COmDZlʕ?[֘0aBVBmmNI!`uJnάjDpBD J0F,!r8 XCtB8}({D;!h9NrwPRZ{GfM}/]zե}`6ix&5 Q'T!MmXp_V y}jnJ{,1-ًN>cs)kĆB}XJ{MRW1Uɗ÷v[YQ'> nԪH|o|eUC?JJr5,a뮻4\!y_|ٟYMoox]@{k8E $腸5ihhxf4P9$uJ>m@HXHOC`йgu:m:,]{ 2E'XhL=ߏIbqx0&`ENOǭVo4PɿQ`s-[vh$Cv)i[%=/ԁ7玜K=2 BsG{VnݨlW,烥n>Bv\歕3'Ko{,^(GSk#S\#[{wϖ~1sfNʑ#G5~M//ֿoyY}vjm8U mR=h5444T4L%+ LTjn8ⶄr}H-}[ϞA CDD\y~~n!JDLRqy]7 APzϗ/yERgO_)ޚNA=!`)ي4 4 4 L4CrY<0D1 "R/e[ |0iݿ"S :TF(;;P]߉)|k^} 1m <%ŶgV]{D)0aOȰG=A$MX%l=sp({2eR>,5u; 7;מGbjy@%aЩ!e?ǖ?| 1k֬x׻wygl߶i64&MMMS48yYB 8y2" 쯯0keY5@Kĥzhoo<< >L|@/m0^׀`tW%F<@O R.`9_Vl~:@#`vu6.xRܿ`,|xn(NVi@wI$+0`oVe"%5ќM46횰4B4NJzgru޼Y,C; ׭'e$,똻 #5s늦R:no}s~p[yB@S@$2qD4D=ID6@σa1}pg ]!,"uE€E`OyVc:KK_Чþ[EG?{g?3f\3)#n/]X7`Pކ4bSAX#e<@`_չ<5\~dށWx-CAQE{0S-Vgے+bmCٲϞ.B$ D\]p93r"لc{S&eOC?s&<5c%RЈ0dOg )vmMMM=@/'i444pF5cU ~l)`*oJ눙%}L6}V@ʍ8;WJ k}}mw޼_"al CƐӕx_of,7>Vݿ/n 1:w˝n?^өIau/;iJ!Yh [K{D؟K='r<;onǠwo1i#ކ=̰_%垡" M΀ܖ4 4 4 / t@!>7,zrsp[P{yPxEr_4#g([Ө4S+"Uz~ y,w_?qɁOViPH{@#a˼NtsۋMav,qVFː)u \2r\{ر+?6>~ػ{wkײio'z_dLrMzVd4 4 4 ) N3U~P ~!] 87)M[5ݨDr^GLzH65 \/-]__ӏg'$_>/~.m.XUCXh"JHSL$?5v<{Y0"_ce_NG̥z{-}Eo(=﫣>4ӮT!`lG$ a7ΥYrBC`%d!Dn#*ĶqeNcy0h}f/u}6ihhapM4nh85 B@4 iE&@ԭQ9T*e;Yo?SXe&Ċ{Ƌ^(oS5z&5in`sqRS鄜 식!aRKD:J9@Pta6爹ڝ3/0'.cM8Ty8x`Ib)' {&}kFPj:[cMMgTQ #(s9R[ MPV` RgtBxEπ2,?kG9ܔUJ4Ϭ._ ^/Zjsƻ?kWKLO^,˃@m u tͮ,bk"F3h~訏0Q+v\h[2EʥF%?5x89ol|b6D\Ȝf?}v&MMM=@K3Uθ `B|'P\!j(}PY$|+iFcR<^<~eBSF<K[|x>.2ߑ<y-^ZjKyh+UW"ŦL)0{0[>s/ zD={de|;}B_g*zfΘ/}d6)ޛ\y{i4440 4E?pQN [n>2%}Y9qͫDr A j] ? S־v 4SF:0sOrwE gE,.ߺ{sM~7D\(/MzlpMUݫGڶiii`LF::D9 NZVJ^Td獪D7h+RN SV[-};s~ȋvmE:3'u4>C!d:.zt +:+V=*n3c>%^41ɖo`u}.;G$[PlNL9]fO.wfYcܻ-o[L_6_ x"% vrAi՟t *[妁sZ𒺔X &!0 .^mmhh#Yv9y!d6 ,J:dӮUO,ADV]~"#_wסo}q)w<;j+UI]P 0S¾8P)W74))I8II;>mN:1.Y:'Cicqڎ>h\)-N=$Cδ>P䉌{mNE='`t*joeNG@+ 94/I'^ mV.H"e] j|ևr@pD|!^{[⋟[_;5{4=p8?4Bj5ڎ7 C 0;vLJbVeΕA"FEE8<#DLG)F|؉}1v?/ ؼrPF-R}/ Sǹmϑc6_4 4 4 Jy[ ^xOyMI-n=]6=U ##ѯ ՕE΀;e;/^x|f 9p>ߣssh-q5Syǟ|cF-vù\q Bc,얽!BαUDdB8dV9/j*}iK]z61߼gcߞ2-mXJA9Wb'Wl7ihhzBsCl444k D@p%Ms1jD&X,OH-dy^x[xĕ/UiK~zXZ5cqoG/Do¶=[5е?)ḭ(a QD^sY1˕4B7bYY@'7=tFu4M΅8VodۏzY,a_*"+joMM=@OXhM4 4 <F".DxϫjZUHBL's5xf@ ҇'{9dR{!_"R;>,x8'C?WƯoi7 `&ّ_Qf6\{ S(Cء9)vnEwfZ{sOdq$םo*\5Tdv9SH_]9{@@S@R4 4 4 ] Ren ex#KR &@SxՇ6k,"/7iqy)幁o\|/w]L?6.3>{o,\<)_hhoMgds8Nj+Η, !i@3sb[4Ѳ'FFX#<fؗa%ҧ ypڇ5:WooMMM-4kjMMMgPALGnx*l!Bж# rߐ\e8,:h암0!'m{h m SlcPE0q/@J,Djʠh iX̟&䊨x<1vM"Sz4f$}5ߤiiit4Г瀵 N@j{CzKQn[R+!SN9Rh  8H'͈W[[Z7 g^yuE8 `,ܷlߌo|kK,i-Ao__^8;Yq;4pk)†^-CG!C´ax6:r>a_-]riiFʇ]ó79YQlSF?{v}w?M@@)k o-s4 4 4 V EjO< ~!K2Dܮsebe~Uϵ/ B؀,O9m}#baHCry\Ǿ|hkxoܞD\vX@r4^,Ɉ%;]sRiQSgu H׆U(Ĵƻ?&O\Q'bj-ʽaӾsh}~TU6='jM=@OXO54440PR 8t!;& Ȥ !MӮ]0!pc6-(r^e<߼ړrQ`.q$ wŭ'vo̻bb\8cl,]1ozM_{iL4ˎ:ʗjoMҞȏ!{; $Ҋ%%R] gru(r's-LnD5lw,m/8g}rO{{ڭԽ<ڤiii5VӤiii`j$`)ż*~<- LF8 jP)mI{w=v5ANHuHz'e}jx~:^Y.\@IDATܿ#{ؒq՗wǛn8'otMi>`9l4pkT,iig )IRvJf K %l^y3at>=Ks̘;/fPÛH2YפbEUsTs7 4 4 <5 Ժog OH0͞6K4mi# :328" ꌟ7爢,",{M$mMڼ CR$7r9Ϲyi=_hX",eyjeo]=a5V?jt^3׼V.MAcG`ʀ6@sPhĸnvdŹn1(\,#M%f]_0=,smͦvBW*\2p`.)`O,?d\CGn#w%޼f#_`>nh!2D)Ab>sUl0)JhlpK,\t+Pe9e3Zm5-v՗nZv->mV3Uد|]SB"*批9!,~Oh10SS\׵H`D}c2"ˮ(JmiL 5Am==!X1Ή nb{7Gp^.7Gp-bD8ExCHJDцM9BhƸ8Od() !~'UE֫D\^aطg_SdŶaS U?ɾs;W- cl 5Dž) k ‰k=ZYxH!Y.Db! ''^\2]9RpE g+R#sml1m0'Nwzq%:.%ǃGx9bFo^8z }GHQ0CNsCp0,՚!(b^W6> ' gƃtEÑyq#>Ȕp=R|vv=ٯ?^*%+mֶ^s\^mgzy^ cI9KBkF7\\d'\T|vH,)Lqέ"< R܆=l[bZl+d˫Q 첸%#8B`LGv%GkMz rh8d8?q>pbqjUvM݉FÙ.1wH;M— T9w۷q_ e!ybs7fn9s^BHqC@|#ŵC7>Ȃ B\Y 3*yȚVkon.+/2QG~)|̩k9 & K u_8# πAp@ ,2Sd(+BnjX4ch1"8Odpp\Dՙ`Áb|*8l^b{^7DWA.g^2=nQO_Xp\u갺+9ޤ4h/4#2y3!% B!sA8t+2E uEUʞ!lV8ety,2<* C#mApA`L؋W;#!Ldw4)lh8U"Xq~_EOI뷞#6o}ϷW)/fMcj\eOd{+-GK<lX"+#p`Uz W0 By`lK6!a,+PVk|3ϲکʸ뇔ͶJʦ3ᝐM8GSh?"i!C'dNp06Ce Sd9?DQFDC`04ʐ~S&H(5Zݿ~qvwMOYՒ29p9*CWoy N ށa?yn(;W_?@FԄLD15N.lv0 ^vQdyfUfy@]f;|ڔ]tsnp Aܰ$y;]B NLGWd*8JDKD##,cR<Ź 8b#AQHD-U95eSsٍv.6e کN;Z.{lJH۠L/)18D5ue "4bm=F e,v`<ʕpߧ`MAqVjjG0۷)3IC 4!Ώgq^vsG g8CoF"ͼ ,"Es.(3!B|!t!pNOSkH sݚ<.-7=fkzjh-__zw.a aNV9Λ#e& 'Y-k>u#Cg9#C PBM5"%2oԤy`iJK&8ngfd_lPG%,X>#L22bB=QڃscG1t d;#{?x.mSͶiꯑ\;ڷۇs͛Sf]z<s1iEwKwG@"D כ.8?BOl:ŶdBl 7H .Z WaVVe+M۫FIn|9}JG/9#Ge9#ppG?"8ILxOVmp(GDa EbMW6~6Ոi_Xj[vXw^{O?IkIpں5iD4_dlu|bpb8(*\]N1|ⵊP#{X#;KF62Dӧ٩+g+,ִY_GG(5R@B  D#NKW8BAln#2YRvX$?Gd&R# x*lJŋ^⣪2Gl]}ɭzAՖfu8\X[b_~ZSR]dhTOic|I#TO?G@!ޘwEØC l.`dѹfC\-6\Ӹ*, {׭-´Ml > KPQ3Q79:.EpƩs p,D!c`0#8 `c!NF G*nCyoN-qRay-p4kٻvu8TD!@1B;A'8 SuH&0y.1DWF!ĵwvI߹h9W ˜UfӭKDP[hoڛC=ۦ+45 Μ1^":q✏0i_˝ps^Y r}،#: #r!;4_TɊ4Bɢ0̖/ l= p[=D#z8 xaת@Y5~yMEtBX8䫿;#;~s$9pG ‘( 8sK&*2b5X>w>m[uڊ7QkYrC{{DNQkݎ9d<$(-48P q(#BGQ hxpkbi\¯$8"f(} eha*u=̝ 8п;#R Rf"chzcO5>CM6g4듊jm}oӏSt:m=]9XCr8.q2]ʉp867!G"@p ?\! C  BV9AeJ,g=]kb XTk&Sg['w|5خtwS{NK;iEF".r8bN9 q^8l3[p.@m¸1m>yzy]4+" Fi53ԅs vں Φ#Ep7s@!1orGv`PG<߰Gc.h+GdHKl=#D6*[$ 4h+s/GֽVӷ>ڻu-ShE9X)< PHdgvԈBJ{H6b pG!6:*윶ؖW?yy1!T)/5EI-,0n8dLǙ 9r(/rsCAXq Ӓ>f1'U~adJu/‡D-5sfYj̱ySmk W. ^-c{L19p&=.&# (Z8CllJy5&E;U/c[f7_~6(G(w8d(5TQ؏1wDq|( EbL'L۸9@2|3CY0u7edhw2X\ּn( gϚnUDFRTۭvr$r! |g_CabEʜGDcr#x2"z6Qd!R P+ySmu*틗N:~ IֆU%9)֙dX!˥c"Ä#(dns7BYΡHN/wCMA/x 0psLvJَl7):*aklS; 4p Y0[R9Pq;#06sGGp^ |C]q,GѥDmR|;J]w=fpRS+fg?;:.Pkzt 81 Ǎ烃F!qR=#z -gF syq)6 ׸12YCzXgUjekNX˷nn))!=L<8o0 9DsJCWS]1bqx"M1 @@<Xp-3MY/\{v] W nXdРA,d+Ƙ,#09->#0 0f3&H|u/kz\"ke+m\f[1FZnNNt >Ih6 qpȌ$L!j8rD1_ J5Tg{QZH 8Dp 7tAl\zg?e{jV˪ED=˚ h_ 8N!C)ehpؖg"pWwIhdmGLTpJ28/~a#/912=dPѐ/Wg, YuRI[mQE|UcF3 鞨&,'1rXF$NN[OӠc7G8@a!;&aDA(qSL G:f̜a,!Vo?[fvg7쇘8bOc@|ߐc3[8r^n#093Fm^8j}G`b"慓ă3WWM]l{>;USl+Wn(Kӳ_/,8>Jk(2pb9A{>4Y3Ē#$p=LMY⺇W(w&Bp1Te\wZԓ:pBn9RRlmמ_"_v!`qc2 ߠG16!A#8=(GF`L j~8G` 3_dNQ6s+SRR֦>-/_rzg *MX8N#0qጄnѡ 3/e׮Aoc߸Y>\=ҋΰ tR\{Uڣj(%:87.8*fb߈??a4`<A,s_8]#Yje+#0(`e."4xNc)t0}F:vI5i wXHUXZdznspU P ;l8 e&v& 8(/ aī{` Xg}_ڿUV}mז>bxi!Sƶ9hpXQJ(w&pZ8P1CڛӠ<%4ʑ(!"C#0@ɂuOWT/*Epx\)fpȚA;{yauqAblæ$˥Cc'|2Xp`2?p&#8c@ƙ@} QfR١Ay%V}gZگ9R8FX3!?&IQa̱FvQᄱ9l3y28#?vlEs1܁("3P Fj"-GU56552i4bY,%0 Bќ䗿;dA C p`8fJ2_Uv/Y~mUh{.;+6cZAedpLxQ* W82rZբ|,-d?BhzQ+fNfY#0`~'3Eɒ#Hf܁7,# 1d𻶶ʎ^2Úw+z4Ⱦ۹V0F*G x\a|]d(Cp&'.&翻ՎC†W)Lg;^eRE6[)mo\b{mvU ; sPp ^g⅑;s0.Op^q8Pn#0%+/ 48byV(!c( D.¦WQz~)pOܡ,%Qe'o]8F/7GGhTd +\V'kmO.y!)[k ̵}6[1Tx2b43`_|r,t`= 1Ei! CD#(?"c_w#o"oPj+ s ~A}}}ڊa˗)mdF۱{8E <^̬L EP 8vǁvtsɃ.N"?KG2e>y9I٩߿>rO "޲N;m}7Y͜JR! ppTXLi%ZGpBd]bטkc2ʏUQ&2,:m/wqt"cn' 9DCЦ ԇd'G䓫 >©L.4О~~m0.Ga }g E@Q8-c5Re( n#0y WwG7Dqj*JS{wSmcCU/f_M6wAwS(Abn2>PN+wIQHQ"*MKj'dpc(rtu32ZXgNp!SźP(aBqJU4;Z)B[qmmh 'Ѱa5Cy BtL"C>Cmx笟n#0m'%9 ׀(R(ym.[TWbZ䉨&+ϳɃLsy1Y0?dӘHssDg~0wH4QXbc灴k;Ov0g p&^"܈qFsDʒ)QdVhpP4lG*?<[tn0dzlT"o޴Sap |7=).?pS lw#9C'8$8|9->=H/-tͷ\;E?!$P"r± Bu`>Qñ=t~(8~̬9A RDV`nvgJp6EᐹZJʬ9 r2AkXRMF Ȅ_j:\&8 Q-{GG` .<gS%^hK`//ʹo_ou ٓVT: P!So0'C`4ˁ<%Dl1S/ =>-9D  5t?$!^@I!cxRva㠕}k۬r5f*~"E#xqLa= oGeAMG 1`^u& -Bf_9y{]zmpYmfz>cy=ʊ8]i #AV DŽ$D&p+ry;JOܞy8NlGQf!c_cal8 kx :GR54Ġ1@@UP!l,cV`^)ZuDm1dה9MqqdF,/E17G`r ec#8<a+c-Mv~b[\ˑ'hUmPԞ=D3!qNpB0O I|ἰ e=Dibq(pd,ŦfcŌXe8 Ot>tT' B\Ay"Yr3d03={SV5E-%,c5S5<=[պI_i9gLS#"<YA(>Yޤ,"0yp&c"<6?$ ɓ/ags]qooǔ.y2{+δ =9yHm@Np:',"<0N*vc㼰%w |cb[|#&cl]ٶd;DE fW%N4`Yro0J͙e.J[iN۾-<0_ޠa|>*4F8+$ HI^ طma]BU'7Řt BGpMA/un#0Х>z9`GpҙJPH/67ڼrYǺ~ςCү9_Ŋ##AiT5e808CdpR؏۠' 3IچPƨ}F~%ƍY11gG`#-dep6ͽ.^A!8񐦺%ն|auA@%yֻ5`u818> ΃8/ G`B!0&M&q Q|qft͏wo_n_v}}g5s5w[IQȜ+  V(eDY< cN G'F[\H-BRN=1B^Udڂzwp rkGl6G`sGFo^8z }GPE /'kV{?wB-}]|џ{Ϭ~FaUÍ.'#v©@ED/0A#" %Z8Wi(bLHcNbX"o`p&AE{K đLJG$mi?jYͩ&ʷ?ҤnV[x3p--~1nCp' Dm0C]#.G`#ڼq!~y9x'`oV{6[$ Oe]~ ϰ3Z c e8&1F&p:X ppfW7mqȢpZO1wn#0`nB ."0CiQ bUO3S,ZvCU," A0#1c nd9{h:,w6~b!06l8 W.!ZO]mg|Gus-^Vfk`خsO (s$s 1vÉ!pvp r8Den#9 Y_G`! VA N!SS6Sy!mm=WW,E˧[`OVm؅&K2⥘B\pPa3ư1xfp1D',nwG˞a9DkyXedڻ/K%ek=6cUoמ} (V kY\8`Nb egZ``#/}!,83} BqbS #(7dd"Ѓ/SH|s L;۶M[W<&^AY#<Њ@IDATiq<6v$ 2 n,wGO΀?pzl#AQ+3{w$3 miӶ 6ox<bkH nb!(_I'0g]Y!C zdyXo#0z<"ƴco"DzFMvqn"/NF(h@lQZsJxDy8H#/7##̱) Y# d8&byDQ΋vXTR^n@{6v5 ֮lsm1`#-9<)q$8K\Á%ܺUFECȹ9A`L p?ɍ~)Dngݗg2(ʵ ןScu9ܪ}P&{PK/D`q&:8ahNfy_42dl!Fጄh9s(A! sR 8c10Pzdw΍6'p! a[8CŒep[ɸ#ȔMKTqЊ/s Sa=&uC4)J$ƅFH jۀSfTp.p/8o.Fo%GpF3+"bdOf{[㯺?Vx| $p \/~d^ù@gJHxV B7G8e8+7ua )v5#og|,+E4߫FRᦎc@46,n OT@ g9{ / F EgJp  ́pHpLc7Gp(<udDG=W|δ[ܷr|D>_= %8)2 a1 é"H?lS˘3 {)d1F>tY7GFp& W~~C}Wj)y nxN<~opO#xfdR RI,mquv@3 7ٚl,G`Y96'8`{^t[WS2N7 W#ryc#8c@_K[nugV$ŖVgA v5۠mCyscsJiQUGX,.bR8 dp_o!Rm_8KzNc8a1h21.,$qfr8Lgp^".!b.JJ 1X⪣VY+k56VjO<ʹY-xXn]112lNw~×'!Xgp]2*plչˈ8ARvs7f^N|EgKm V;~N3h8D|c@nޔpӧ< DĖ\γ'/m3tβN 4-"4٠$(. ˱ٞ#dؑb}x6W$p@ 24Cp 0$+m k 류R)i+2%T1EQ4nxp\apc`5΁><Y" ",#p!KvmG\Y_*/ʝvEYb[TV`첓Oew[g!S)>[byL MlL9j@(-UbH11y  92Jxphpp$lđqDF_ Lja>#8/H/p\HHK,_!;" c-f-}Z!}g(+]ao1BqTTp%dELNd(F!жk]CӾn#p p+_ALfK\7>eo~{fǭRCssFTQfNZhP(2L&nx,0'and؆R;؉/Fen բdpx` ΁1$̔︜mGx9Q("DP $X`: dՉuZ8r#F0 3.vWVۜ˃٪N ڢyUa[ +e##k9 =)yAP>"1J[4F8^O) PF#aa !8 g1h88XX8#2Vp@8T"vAadDx >Þ§SBhӛgkbN_ʼJ-#x|s|Y2],c{}ޥ4Eta*%4!XaWwC]n#0ƛN'em=v 6Om*\ڴ.X쪲0ߋ}hM(.N7]QScAl"Q<N‹ ‡xbM XB 8 pY. %lC,YvSDh(;;#8@h O(72@_0;:;-̷>mPMGUwC(1-}qE#Y7J@y}D^3D@ܹ]s]qt0vȓCsl^uwn~P&a3lm{3=Ѯl3+ [o0&k`PBy\.!#L Gc; 'RGI2žp> "}qJ7!p0#,2D& 31!&KUꅊJ ܲ|kZc=z%Һvi 2id@Zy1nc| 9.|1'Uld^DEMwG8;l KPpc˧nW%N,C8kOO9VR\Ww̝(-Lf0"('DNsX( ` ?X0"}jc?kr(8Ugp4؞4VX7l'{]fpGe!DEv/8^sX qDvQY?""clYMִzk]*K;84 N2l J! 9? A1v& < >o #Q5>#k~.֗yK8 [kO?p)E\qFO 7fnʔL6 Fͳn/7se΅dE/o0iA&I`l^ N˘_憑]c:u8( $8_dgysXݺǦ(W5[söͽI)8\ 2. /r3!)ud8w, #8c@FMUpyTOzmz:zm-,VV[ ^k`8*ӈ 6bǃo1ֱlÏ%&>u*gVusHLH;Em?]y=E%׶=epQvߟmSF2_ږ,F &hΈn"i#h"أ,C|qg`OD%#[M-A-‹,Q]Ec9A`AΉdiCe~XlrjpVpTqHsG`"ׄ8QO8oь6K׬Xu 0`+~=يa59=|&xL21u p|)4kXCƬyap<:.LmR'Kp^IDe쯯r&$d_w}^mP./O_:wWuY\FpSY1#Ԉ""/Ƣ#p<f8*F>ZNwEY G؏c1B Ar`C 諛#8MT8n$ YE Y2ÍŹi=KY4 l\u\C_:KCF* ›0qMU![el<4!V2Œ""gaS_83oq:E `)[vꟇ2uڰ^s\%oKM qr% J62 qōIN/&c)\Fi m"HW88b(1cRz2` bA I1)_y ln#7SXVg5$ҁתαϘk[ͬ)̪vS۬W*tW*lsUTp|ͱni! {W^{X j6!)F5`p^QDe_Y+儔u'o˶- oӓg"ݢn\t@M(!fJH;<NjB0;(\/"cj{Eh-1:qe<7~5lC6(AQCGxe"cY0N9hIW<7N9qHo*DCkmmT!K_Tt9&%ڈ\bp8.&oWcp?cm\OG8 Foކ~@6Io/mJm]J~ӕ#ꦙ(.u%c*0q)sGh!rGb_2Z';7p3JɦN7o&嘴P ;k][r.:\(d|R2xn#ȯd+K(.A P8oR+m3av]lFkj;TU@948-" ȪQCPK`܌Q#ȘoKAM5,qg7g [<U,'ʊ34`B87~!9[<!Sz>yf cyI@l16Ů<9_p@W̽~.XWy_+TLЎ:fB aᦎ BQ"M17nEȱǀH*7x,c9cbG $ ̱rB$Pr hg888 #Gq2,Oorʢ!Ei@Ɗꔽ%.yV=zz-b+t RXp'\ $e.D=':e,0camfpږ w2U #LG@! h%Gp@ i9ʯjڲ"۬oEv{PyJNP{.7S(%Ah7qJ"t:19\<nڡ; 3m2nDc /mJbXB4D16 N8d wGB rT|2' ΋]dg?y<0`f]5sm %t%0V.&3h"pFY7%p9A,8pN;c?ό#p`%=`lG@xز}ݖ,)5i鏜m3MHCQ0XC byܤ)N";FjH(qؗ0qȦqCgźA1"1b #0n3"<Q9.qC$?G8jR%gG@ TevkiuJ\*R7mHę6wCY6< _JƲDA X2;؇syRHP0A$jxʂ16"}]#p`xq;HvٔQp Ň-zSv㍫led;h߰}ҳl0y.Xrq+%m9t^Y~oUtDRHNXb݌B1 118l1iAzDp!a0$b!@|h8\'9#p#udb!ÏX,MYkO턓gZSRm tYn?1^'br%s; 9f<>B؆ 3&xteΓ}31/wF`LXIZvs\3$lw1kNn9H}'عg':LFX↍S@&Lbۤ'k#2a]zqF☍)Uab+dxGc'~s\MbtWODf7vFװ-yfDoGDS)E gdIa*̻[3vb> 8Rvr(GƦyR|NUF0 0'M_iGQ@$elGq,DU dv1Eo#0ts@Za;߼l}-Ww_hSlE 7^M2RQN,J"F-QsbCR3fnd(٠Idps8D[c]r 1"8@ d7yPp$+D}^,X఩~R+\YjۺEˇƆ6ۯz"F F<@ a|bqx'hCu#su38ofTQd7H#%c.2XLXKi97 ;:Ӫy_ @hlX̍QQ⋒:e|7("b٢-<+6凔eǠ"5΍3d3&7w 7t8 )"?GdlCbA%_G"lxn9"A:kv[uStL2MdJֻ9 G7X2Q|oG`!O>fxb 5w T{Ց2n;!7CYS|JY RDY2_(D) M8Ǿ|Tm?MYDw9q,5΃es;sfĒhX7Gp!"D,;<"=9w-[{{l,U8(_/.8xL8qD@%0~s^(b󠔑1 "`XPZ#0Rss@oRD{liEx _wP_|1n>x)Mᆋ"E7asbޝ]w͞f#$aD.ڊ[c7{;jqיm.әjgVjWR7BHٗ{'ysyh!9mg=}>s D$;Pb)5{8HT%uB-rĪpyk7`Y4&}笪H!-}HYR@@,BR"B-[C+9}IRxw-mcn.Om/}Xu,Www!I [ct+}[/z>u2B%^gH(6%f eaCj/Xg9q@KcaI[gz7ĵ7=#+)o5&NV tu}JWZ%a yWFß-utԱu!Eod{ydӵ[cĊV m,9i+gxJbN GfuF1Pv%s5 <ȟiKMM &RZx`WRqq#c?"^}Ŷ$?/RbA  d!u ">Vb!5 @W]@ܱzL‚ ̱. xȚH0q3L}qn}$$$pJKUW=[tC&2}.x@ٝ⿽X"EDK9UxD&H}ʺGe5 8Fې0X9dxMJ@Hy:II[q!`﹥&& ]=j;w$.yz,Kp1DtlU]ȢX;%0żPy">!c΁I0a 3)ʔ-?pR笧xʲ=s,W^,l).nIIITCD+ǩa"")v(ۗY5 4 < wlYN \ӍJ8ʀgK$yLv \Bt ,E) uL2"K)k{ȞMʢWR7ŖNe :^:;bE)0ԩ̋tՕ Kl!ke$S!UH$1nzM\S}6 4 < tO%cC$$БX" wĴpfG y~رp )0drPo2W=@ T"<,Ky3r&khPa1UW6*Vr"h DKnIII@/9a2˥ G.piq}q)zCУQ\t0&\+ #+:gsn4!Z:IL t5!]0 )` Q@ijGhO ⅤWd8LPvBAK 0&&&&Ye6AO/9SFc fT܋[>z[|b/TvC#O `bMbF]( rI+*O׻73#B:l흾$uxG`E9]HC㖚z$p\XO}ISWAn|zIZ^ΙkwW]Y @Y>X!BG2'2y i6d.6[7w1r扱'<*d2;ȕy>P+! xBȺ "alhhh&(:?>1/~/>/K^'hP*,P\^zb3Oע-!:A/*9B{.glS¥^=uP0^p)Cri&&99`,V &J4!/3FǶ#?x8 $Jm<K㴥Kc&žXa"g%⽪")B೹ - :MUAP"E[3\JD` gt߱Ѯcm.@^*dnqW?a#|-5 4 4 4 I拱 \:IIII۔@h*j/,^2kwi{~ݰqO_Ɗ^CX%YnR |eՅ^ ]HTGd>9% &1׹v#pjފ%iIT[KMM*u <*}`og ĺG{^C ™>&%8 T u7Z+]v,,A 9YQ= {./^=")L'L$ԑ.꺺uM^oIIII%@K8-~.yTG;T{}xXܾdpΦE2(L" ou䮫œ_F8'alcC`z׎K/0BzDdx(e6JW-5 8TEGR$^@U xRzn71I~LwP|"<5@2Cyc]$J>DK:uU.8xZ? T?>O֟9 Kj? ڮIII%`^=\WlQܵ~o,?{f|ƻ>zKLJEi+Q#`WԨ؀t q~F"'<f[8X@, rp 2,֖>1iK$ҋIԐ@4=ױ˰@/2p*xO4bjv#{J\1!S^ҺL a/#@4 @PTA NYd"HTLsl-m=B-c EJV s0Az1NK-,py?+1ި R^;(iU_\FGgqҦC <==6e3BB5X&y^C,0> ׀s C#q/>^Dkj YI= 칧J^VR>'郰Im{%Chhhh8y ܳgMCrkϡ\1#_^;RWŰrF6Cu< 5rnA'5DZ,J <`Uy_b D!C$m8+ہn;ݓK$E5fnrm琧&SA3lIIJrNVBc`Q>vb,߉Wɇ᫱M4zXԧ/=Kfs.kY-~RZ~쥗ǹ;/~`_,>cF|#kx @^.zˊ lD M/30?8Uqzܴc:7X!r@ A/+R?VϷM~v2Aգɣ*$$$$xK VXꧧ%HTس&[ز8y LpKyȓ d=Kx\!,3?m X۴+!WLaT\O}:NuB*Km$#yIs8=QcQB[͉ʱŪk58u,&~x˻W>ȵh ^W9& Yg H Rކk>@*MesO(#6LKªYQ^={{ZR#|$l VCH* hMMMM, &/νq©qvƻw]Lh[0sJ") N-sL'K Lo٪ S4F<W6a{(}N6 OS*wrl5|g$P{6|?`S>pG@Zk,}4^ri<1-?WoB8 *J<^6g?a,2:*CZ*W#P@qY7x}2:$(#i0zƃVRTcy4crAweԸ{`z/ovHyDs01-O#dC(!'?Au?wH!lH+/Xc@Ri mmId@܎oZKMOz  JM*+St޵ o/nMuū3F^D#iLP6lZ;VGF;䈇 GK#OPyu QF?H/Riu. D '0Ex-sm/đGPDXW8y2$)x K^FDBፕ{1Q%VP51!pJԇ=lpVԥ]M 6W\iM' }}$𤔀f%_b}ƝirH0 %.Fczw}8oq.;;' /wEܙ3|L.P$D8PNIpN蛰 ! 3[`cj 0H ;T5):BX7gBTym$$$$I?c4g7!>uF9(lNⱂ5!x/Ehtpa{g/ &%I*$,.uob(l(/!)$ ل>޹e(oI`z6!޹sȩD!s"5F:rh'wXVZjxI uz!-7˞xbBS !Lxa;zK̻z ؕdjҏ]'N՛TJ pۙ^ĽkH-x? A,` l(Ya,C$ -D4x/Bgx^Zq i1m ܂ꀫo fR>w-5 P8.vB=}I/^"P0 DKN<%jӂ|wɿ^Ϟw?Oxs/ : f]}Ӵ#A Bx$a%X,~B4<@%f:o~z@yF`X0Y2bYZ*b/2+mMMMMO* uBϙKЅiX~Ѭ?+/}?1kqz,+. "Xk90bkbP ;Ǽe!b[0L]eiY׸*gbP[D0Q^2bPB4}C#`-5 0ȟNKM'*2y~I|9J&Q~-G\6=P"E~Wyg wH_Y`::`śe^OR^rMHH=iI-1ݓe<AK'pG}j P"VW2+>@:jeW Fc3foKOɒy% +q'0 N,ˍ/oR?xx&$}{CH);] . s X(Wk7$ݑxǛ6[qKM'+R% @AA#)p>lV<`&;5L Sq߾8wΔ|p YW]Pb;+E@ڰ!  !eYn,ᅼZ4qaȝ( ! EZJ])]Q"xVF} bh>iBT뜵&' ks|SG.k-_ ( T%MŎdF\ࢬPe߱&73CY}3bIqhl/ĉePPs # o|@(̋2+v,H~gdbD* )ԗJx&2)r#N LH:J}zZ 姟%qñ2Wݳv8=adľтo }0Ϫw\L)$lQb4)1Q ע0 [H{LE z᡽eQr /jguENIsw1Y wʡ\oIऐ@/bǒ&z$(yZ%NDMb{.'n׿d3C柹".xIYxcp.9(j# @א!!@8/h,W'ȳ*A QR&,*<D,`"Ń `螶a[fkIIII@]~9^iqʙ>À'II?E^ A,>`B14C<`  a"$CT{0>"eQ1,`C~&׭x(ᓢ;nԉhڒ*m~>( ׷&[E#PpB&wTB^(w $ iX`&wƮC1hkvySc=#.> ѴϙB,EXsVGӦ5 r=N;2 \jptX[9:\ HW#_R@@+S՗g5Hlw$2OQ2D߿+A*/ś\6Nvsxɋ++-IfL/$ eL+bIGn׀+:9GYbk N?D˷ #Dχ|yG/rYq][jhhh8%л4}F ߘ i;mᆴ$n N-+ 2!]5^^Iȗ0x k aIL9u`\e=؊wM ϰN> Mڄpu[)sEI8I z-5 X%$bozIм{%Zp`y!$\V>8Ǟdj>k+6;?W=sivtpF8yKHxN0"bJ'̃0iB`dh^Y F2 ?&lbhsϼa DkK(HpAyÉpw{֋1t;C۝<^r&c@#`,VwRuUȎAxܗ(`J.RQIH%hONyS%81˿}_xۭ♱ mƤxO,@xhڠJ۹cIbBAq  C, BX&@3:*7_S rGԄ#Q&$$$$prJ(h,Z0+~0zo|bŃeqG,^$al˅9Ҡ(hXN")&oX4?2GUBD 5`/\0H71 "r7Wn!fBy`hDIP~Xz8RF;|N{0!cO ?'"f'7"oW7)șH\; KGc@~=_N$p$P )l܈ >KR@R$ wi$:@(~jьO ÿB|KsdygsbcDb_QԬi6*%J A Ś8PBG g = 9?!jIk,+ q^!jW˴}@@@/$lvمg;xo^wܲ#V'lͶؽg_܏~w>4! hۗQ#}w*1!-Xf9B-^y3cyH-8 ϛx0}$' 1:p1 SY1Fc*yjH>nxߟyIm1y0:FF=B+f5_bnX[c@~5CmI8J uYIņxQpGX ]#fz:-h~m+y$>~s)欚 7C;y23T@fbĴ!>9pJ!yS0X\gYLgsK>3?J(hP5юˆ$w~BKMMM!]4/Wq99'lC_tlJ՟yN,HK#XF=x' A1 '!ɱ`C,p,,^>9,w.zU:ȑG76@k"KK{<[Ua}$ sgɯJ`rKML}鞮ߗoaF3$ϛo9.䒸kkЪen'M߂ʗ1?2XYą& ҵ%ʂES lwh,ҳq [o|wl3wƫ~ş [dhFV~1TQqK&S eV 宏}aC\W/V6)^_6SWN]C~V>j_*Hm$$$$pjK' )MKG6Y &8^7 }^,9kQLLZ8}4gٗ//uJ,M׋ BRk]L䩄QՈk0:,…4Xkl TRo5D{oh;K䬎7_!IB-5 <kRCJ !P5(?!SDRib, +fΘ{uV^'@aϺ#mVoD)gR.S΁kB K2gJ\X!-I +$$$$pK'v_Ăfg ƻ߽6z׎v<ʧĶC1{XbX; B! 6 s㐬7uORfp~oOdD e\t Ӧ!vG^XQ3f`UE>`tLM[_܆ ҩ6z풿kD+{HlI'UDQCyNB$J΂<(bX({ S&Z@NL3p]>.3+Aes/g LrBՕ7%TGj<G! D0F^3QȢzY rg>PPbNzuIIIIK  [~X?Jl5$_??vClbfӂ$a%a/0l0$:չR0(8>)sE `V\䭲N09u\uW N|Vf 񈉖Eb,sc"WC`;oTۃ蛶8s;fp}& z~=v AS M ZjhhhxL0SI&(?M 8u}H<N_/Y&1bI_" yp 1"OCxܳ Ex(%|S/,}p^=Ln]WOH~D _0\[~kߦtSyI9}1>ў~<#ݶJqJSO>#nQB(>IX/bүF(Q A)I*RFŞX?hjqzjMU?wҗx O 9K(T07̳i@ %ׁ02~βGSn112z~Jlhhhh%pSO2} 7̧ u lc0^OC0š&Ki)_VRy o0ΕrOL\DZ%f=(of+y'GT4 㥶C[cnJ_]OC_z }H}8^+!GKUlT*G+ۮ8./npߙczJJz{RHW=;B:B$܎JT|Y(7dRŢSƈeo֤,f/}I ̜r/(~=p+/VШj+RB,,iM-y(|/4|}4 4 4 4 zOx;򿾖`/f^1#vm g8̋st_y򴾱(T'.JVH3+`rT8H.i96$HCa[r\_*QU?^CbkUu 3,s~}~dR^O1gY18_(czO VAteb,ez16a4-8` \g4G;K6p+uw\X AX_򶼙yN yK es₳OM2[0(&OLKw0ٗ7yB֕X/ Z@&f?`wxL5[1F=1wnz2}ywk0"Jp-`ḤMXnSVc<iUDϣȦg՞<ҦF8LJBO/]-TF%D[!uQ%4M -PN#$A[)ʉstRpխ+u9ټNu%%yP\c,VT&Y6E%\eᲄ>+9CwnLȔY:UodGVPDž'_8t?GSGQl(E RpCP2RXX*y(zBѮz!Q=h>b'e w{w} Ŋfw߻'/P|U$a81VR^)Y!WF[UB>ůOh` E6'z 7a9bdl"pl&&&&&'`E51"č_ƍw%3 %'ЬI9?~4dd)yΤ:wjsڬh8=䙳b޼1wL&(wќ9`BLI K,.FRU,/4>+cL,&ecc c!׌Iwn# Y4.@+j\7a:+:H9eHeM9GQ?f,a a,=Z7Mu{?y$p\X/9 y֓"ۭ?#>߱*%D@jxPd“ʑsN9P"P%C(8J^`G?\a*3[c1%աM7|XbfZcWwY n0|Y$Ic^]ٹU<>{Ggx+_HYe֣N @ `uW ۘ[MqMwֲJ W#^7@,e,V[Q:0B5bs z(S)]^~ \MV q!`拘i/b~BjGP*GǏhUXe()*^-J(ׅ2(J1R@I垏nROe$&rMO~+gR3fdH֌+te2Aj ѸD0IDAT۳?2fR@@@@ - l^2v [ĺ/cڭ) I֭ժ&ZrX,DIa[-td$v8ͫOO[:-IΖ,10sF ͞Ƥt L8>]qAn $x3`xt|Sf뵉Ɇ=G⦛ĵ>{MfO6R9o+^̘18[d j(Re8zJMPCʐiJ̶|u1eXlhMye׽Nd HD@شu8v{7 ;[rC%'1޲m @Gpe]Rw9iE9khoO_oP\lUu{oQn"Npp\)~Ĵ(+Q!eR> r:YmsgѿzqMZ~e|א ٷi={S);Z|Vı7kg {ILE6vʗBf9{,q",,\(ʢLJSyI?Kѹ>NF X _!.uE9k~n5 <1۵{o{`Wmݶ'ܿ;lmL ޒ+c)rȐ} rR&أ[;@^-$ fŢv{ Wך<=&M)ӦEX&gȤ~#dVd,<660:1a=g]'sϐ'ccJyr[MZ=Cߚk K5QءMcc+ce쒧eNEHӈA3P#uw=뽟uSr<=ᣵ{*+?AK) |k~Nz^*M燽T\zQjya}r/ܝP~`LH׆M7/Gq᪅E;)+|ykZdWVb(G-.O>NM ] ,' 'Cm1}a\F8U2=r #{-ۆcsqw.5~{lL*0,f ņd<ܱ9A>}, 9)V,+;g̘=g0/dzbF4ӧO .C& f,Yy,c k.2Y^!5?6%2gfal)qWY#ۘDB28F}gt6Vȝ^Y浇?[=7xU^'>[9=/űWs0D=_/??u];!S}2ġгmS~|lԻ8H/uSR3q\\y8EvˏER_~^0J!@ 6o7romSՓMe?O;o(~UWW^[ь/C>pA j5^B&)TP=]L`g)Ϛ<_KMMMMMM@!d= -1d>;!}OF2we@ZKl}(;Gb]eˮؿ{Oع7ز?vl?^6.P[3f$k̭]+8yݦ2q^leU ftP'q^i1̙ IFճs،vXx8,;VHSGiFl$ yb6kgn1"flDh)/c#lxӤbT7M6un81XtF%gLudXnt,ϟu/+᣷6棖GihA/t?"[8$nn"K[oUKu6Gz`V]4ޱz%qS̲e"Ryz**뒫Ί|IǏշv5*cׄI䏬ʕG|dI(ֽP[T9bPlvdoZ۷l 737m-D48)Cru WNr(^+9}ad=\e|5M)Qtxy /wz+%c\0@~=e1⥂&N%;r$DG2HLh;_wd_پE>|88sRcd?WMZn{ܙJ2_|+d)j836غ)XB]5//e᎗#pY(#ܜR6!,y2rt=ZRV*9oMMMMMM&xqCombAb+O잗 oԌj[2\?$f{sәov=q=~pl w ha\'{cѸ (æ :r!ˆ⌜cvf8B `.6yI΄5Xe4Yw.ylZ*$R"pd_\Eda69ʈܟc x!EpiOTos9dUU~9޳?z/vRGV׋%u=uSڗz>՛y_B Q^Odq*)I狑__ y_$ޗMFfILFw8|PDŽ5 =XVڿ@D/?ڤr7|86efrq%lt6j/DsWe_ ~-> /iZ'#jM듋C:$HuȗgDf$R;HoWei pvZs켡jFٖ' ?gy\s⢋ωK9bR1nz˲Y 2L$>b6_yRQ7 4 4 4 4 4 <>/,2l/cMr̰ph_Օ!hfehXfȱ@FrI6|;䜳\F{Iȗ[0>ʶbz.?89f͟8>8`]ntqe0ұ,lɜX`FlF̘5Kό9lVOk6-fmJΏg6*+?Wr1AG%,̽+$)|JsλUxÖLK1V9`je'_/CHj~0.,eˢr>H_ʖ.s+óoX~c:}4/[w=kw;> Asͳ_S:2u-(U{<o8x9Qlb^zY\1}gé"/? !>#;괫 f9 oǩ~ ^[]\|)}9K1r- 3VVOoS%x$Ҿ$Mr?&{G`>D+ ֎ ~sSo,J#+oB;o2'Iʜ w˳[:ݑ}>VY{$m!z\ۂSMs?13RqՈyvєI$-g_uf\xeqEE,FGSMJ pF֓ċkJiY]\gΏ5ʂuRqn/IT^kMMMMMMO <CG7dM720BECǼ 77rQgC\q@r<mk=#Ҹ;6<+vcm$Vo[c4 $i(yh76ܻ#]T!ysVFMΕX3lg֬i1-9=ꍃy>% iӦ;ғ6}J,Z^Qe41-Eײiq/0 D9 Kd\x0LK?LL̽'J&L9  CG9!rڎJ]K[GRn>b엱yyIw[k[\r6]U?-Ω+r~-q!`FD_>[s o$@(<$bUb 0@B-;NNi;}ksZNUosj"Ԇ`. 9jbZY*Au R4>'Y;.NNIt+C"kZO*Qf6IlȲ[ P5(Y\,fXbµ)*k%)*6-uH*-0,]MBT^M~D _]ko2SUʹ0 }k1 ꛸:,0-Ul\0iנ̎7UbeY(gbtHolm@eK61mϡc„cdYZ8~|[uXU䝣/!BI3p0(jȗK%EA#>JIyTa&MFG5NF2.fs"lP!v\R7[L !J0*B+i7EINfĝ<'E $rبi/ӨnP*c47N85CZZQeː ʁtVM+С PnTMIW E>"]4LNwY(xq1(JVH(afL:gd!򌝄'5e 6&JL7ER>:'n7R3.Q>Ȟ2}FQg\KeadgeUdUhaI>(W[[e4E[,*P'3 2*RZiQ fskubqGpG BAFَ[&"0%ȁ 30J[r(1*CBVoSWȑ̚{e̚Dfef%  v$reHUdU-a2*{ 1"4#=F&.g!+tj)pb&6\r7e(IQR +L26?*MLߌ9;g>eL&q´nBvIAHl"&RJ'D!.`,c9YzLDɕ!-\0L?@-l%\_;U7KRA,mr U/D('N4_d/e.&a"IHP͝ N¡rJO%|$SLGK! dC/mՒD.rbE Q?kISa6Y>.f ixm͢e -Y2X5ZEC|-2$oL aE?H(t9%~3[p~ɬZQXlQZ6Um ěuwc֦*1GVosm,~Ve|zE,Jx999.0uYHJKfJƳ(j"7 y,gAq&/|y(RKᐋ[d-(:)m'J3a.)UR:lcw8q-Af~yws)?5Gݑ`|p-#vQ|.4F$|)ׄτ#;P߳,-gȽ^ӦM [R*tji(rK~#B0i:R@0ElrqP.R N+3{fEqܚ2CfW ~R6~_-þ:]JS˗XVheM;mU$FJd$#\5S;_EP2VV>ȲUzG6"fmsB2k(mĄ e [ &)WwHwS+yY:>L2EDG8^ʠŋeU * e8X:]& A2"On&kN $h*! BDo;F OV" ;Ȓ"۴! [c|Y ӉnђczK {QSZ(QNP*6R:8QS ~e4QCP il4,E׮ /W%'es0k,Q–믿^9F]mcZ9 KQمkEK׭lJ`Ohiu9٥PiB*_mzAfM_trl]reqf̘!FVlk lٖ0{pwh;yd9ji5F@EX`i1Ј2fJgΜ) W_}۬.b[o YlS>xeIS&˦;iB\2^bPBAqyWć %WohyZG[~{o1-SwfUZGRyۄ#P|B&*u0B1Ul "MDdv4J* [ޑf-(GGzV$]0-v/y I݅Z#T>h`p[*?LQE~p) mvN_ʝOc?okxfwj2k7gFV~-!ENZK D}Uvw z1IhvSJКieמ6kRE,:%A*1R@3򳂘UV5= F7x2ѬsSbYlj-U jE,n'ukNivϊbg%1|SY]w_ KFᝏEgŭi:UNWvL'vGWgO0t ji؝"3\n)Š8~%n+S5RŴ-q\d|+y.L8T?v[&ġp}"#$ =>Ug9".E&q8UGMt)TZ'Tfgt[rq[D]N.B86ز%XĔ}xp2nC\?Z.Jv8̔ u#  Sgjz!oFKO<?Gcizj\Jeg |idgdl7*``Ci93aaرP! F\1JLjK/pt7pRScfƞzpwQgN8_Gt4h .6@!`䌙*+F\ U;uЄvfQP0+B |~9֖VN?` 8=B_ne  . ~{x_ !ϙ 7{\Q- ^|0}L!#o㏁%nGo/eyN;343T;ff a;Lg>SU@>|i^xb%!#s0qİg< E1V a,+f&P&& 721sԿl1z෺E W!y`l5g7L5yK#9nooi3j~yg}6l:?0?>qǟia|4Na#PUl 6eߏ2bɳgeYe˖d!K1x?Wƴo#-73D2_Ar&UW]>,%K12,+1ί CjY#CKӈGAaO ƗQ7#PGQ ]fx=rSO=5,1VRu ˝Qw ӈ~s"`Bq]b6[eV 6>e?xc}# !N6Bc,e3<f Wo7OglSShw5~Q6lؠ ǦU >AЍ#:^&#㜚vgkp}6ë 0h:ö<"w#AF},OgscCݎ#P:83=>#~+2+C9DGՈ jGyg׬YLڟ*`Xh\Lڈ\Er=1+{MuerjˇYy睳% &c`Ny4GO08Q aXo%A=#;'x={ "[c_VECc|_^{5m=+b? 5ĺ  |&KEpc%9grT5';wvwpWP8 IgqFxO4{(qg̘ޒ~!ϖ r)a(i9Bx^DLfK΢E KN3=묳4oMؓꫯ3<'c֫8*~s<3Q_|"407Sc!ϻ<:w4Y:Ro1}ݪHd޼ymM0^$a|OM%9~c(dM# ?jY֐Xċgm%옅Y#E#y,e 1h)6zGDY> q>VTTi_J>>%J' d 1H 釙c:ʗ7GZ<E |Qr(j (˾ OcwÀ &p>주k|V*# (?;@̷x5'|~~5/obA.Rq#T-쓝b>Y_Tm)R^4&3<ݻqE-M\Ń+p>ߟs!_&|׹6[ų~Θ#P 񧕁gO8Ff sd?M<@,)pV4Z89qڏ״y6obj_CϱR]pGpGp@-AyGpGpG.u18#8#8@py2GpGpGp+`E;#8#8#C\!ppGpGp" Xw#8#8#3,_j<IENDB`bayesplot/man/figures/stanlogo.png0000644000176200001440000003745414057711166017054 0ustar liggesusersPNG  IHDRwx+sBIT|d pHYs&:4tEXtSoftwarewww.inkscape.org< IDATxw|ՙsf$w+$` ؘbQCB ے'7B6R6uq6e7M ل$ ؒm Л$W43+WY{nyޯ/lIw >̙31 B2J #7¡# #a@H P U] ]tuW~V-nUt+ˊ@l sy#/f TILxC&f~I&`= PX]&b.{gʘɋE 邞0t hrh=OuO\Κ;gnnՓ zt2L¾xYIqAsb?l_3bw끳1s+WAŮmZ􇕻OA_LӀsxH`9pO_Can5 j.͠gڪ' UX;i\}2Ə A|g2xEnE٬Z;),V%sNLbALpCfX3j8w5O+~WϪg}1~X%L]PSyL1|/cʽ atC=؟{9ROLl;-!/aKH> `<` 4u-7%ʽNiܻ ;)x+֑|1c^"Qs.ȇ} hLOSq#cʽ-p+5o P;)7Ŵ0o܋|F dS |1J7(`-Nczʽ,a؈#~ܔgw3VE`ܗyBwS o0{V,sQ?|}1K"{/Y.+q5Jy9NZx "j9UX\oӶwa^2[xmoG!F@ǘ,٤׆2O2X{Lã)A¿6ҲwrdgK?%F#c]JF>;H9rϓJ?#ti;/evyʁ{4Qs%AFb_ .YB*2wc K ^;Kri*oC}1@J;-ߙ 0=Q=S8NRJܳZRGӠ_.[|s~5wS JBja킾 ˘ʎ7՞6rfjߣOASdb1E 8y)PF҄we߁ʑ{-aї1hnY@ʽG1a8wc Jл,Exq@f_VsaLy%p",CþYTFnwc r =U[(H_,N?+LpleK鲑;ɕt\/;}g1&V.NpTi/}2W徘 z+YɒdFɒzd˽ ^ r,C<{hyt$CʶR}&{)R{)-`ʲQ} VĘUnw*{9+EԾW¦mDe_鑲*&j&` J5Kgw Sʦܛ -=;r\Ȕ(&j?s^KY;)M%_¿aʚMޕ )|wSvv 9A;[Y;)?%9r^#ࣾ@,]NߙLy+ro?@;)i1"ДܴLfnrdP%Xs(%5roS5sJE2^n1Ţdʽ+\O 7oV.܂9/E)*%Q~ <5}" 9~wc˽F)&̞*"ܔ.%AQd mĉ_1( $W69I1ٗ۩{AP!Ug[S2r_ȸG,003.;1&rA5 Z[hL}15O89}4 5U|'1GNK}؍)/9-SypZ.a0B"Fq xN\t뮐z˘ÑY{sO;hnLƏ Vӕ|bYモc= [܊"&p 4a/71 b؍)5xSLSXHwyܛȋ@U6kЖ&u-y4,er$S''L&o+Hl;#wV7؍g9;U0i S#'!> |*[6rof\<?dϫevA)TiB2k$~*?+/z1ٷqnT 2 =϶vO][V-e쨈j`@6gzF3 9zk|g1X)d"]8&B8ɄY=&(Vy ؍f L z2ȉ'v]qx pe9Xhg7f?ׁ͋la\v(o#y/Vy'r{)w9$`*N2S+'r4/2zYҟ+H35O`F5&sSZjXOG+i2_#b3e­L<"E<]$EO9`-x]Eh]L^o ˜@j'(LKΡSA|BKĻ1sKЇzg;}12ۀ'+:ݡ')LVuG`j=ˋɻ$-T pCNQS]T[?^}'(7&(-3K"_ie&?1G"'55'_{DVA+)\Z]U]yBJ ~ړq rES>lV|*=NHftɚ*7.zX=ZD8Vlk> Cꩂ:8;) NՇ U4p{a۽~\n68Ȕ%Nu]#1\;y͵ԥb*SaG~ȅq{&kuϋLo88d3ɂW}M\Vy߳bYc# z:l8͘Cp!ɥa]!kLOll}(UK86">8]f88"3zOMqpn˽R&IoRHe5h!JR&W=[3߹ɂeF6m;t;rBA$sh 9pTzZÖωHW 6hJKcC}ae%V55ss 3dގw)u̦.%YOd?P-vxΑmph66*7H߬ Z|qȟ&jM4y"i;wBڣ8`&pv1HN͚nF\2Jpe|TQ{<{X87A'eLq.Kn޴ V!e9(3Ag>ksw$g*6Le2|#m#W.5g8$ru9c~;D?WթzUvB$:̍?}ș 5Cs@,!zKqtu;ZE.>v#azblbɳCh=<#?QB + \1>}`;U]oorF&VˠԞ -L˸JTo9vO >ҮɻSW\8G!` \'.慃س}ޠQc;Bڈ.$S#!=g&`TOjuW>fX|a_uLz7:.ΊǎQ#ԖBm)}LxE< zZ>s~c撷"8o8* 83d1Y9z6}0SP"~c_N.ʘqQ`+yc"!5sorדRږ_]~q+UAѱcZ2Jޘ~C'*3 88jB{*zx`.ΑmR2HLX'u{~ V<+EGhn%(/c␩Q@13ݞLF>zn7=η3zsnv\]ld+$!p|r|ƌ) `o7E\½ 4(dBߚ81.wE&o)cB-scae~*m[Dy0ˆcc 6ecʀ1j2Vd]wRuOJݛ\2WrK'Ȉq(({p)aw 2&ϡe{j{ڵo5 q k*:88ҾMQdr,%Ikw?t^n+a vQ ##jqH͛1]a(5M+ { >w s8`R؍v;Miџ*;9m]<FK<-ܘ;YȸG'dҗ]bJcj0(և<~d^ҒyKAĈD8&maSƅ [=/Vw]Edt8P+wpVg :*Xś%_R, eN r/E\Qh?5%V0Q|RÉMQゎ .`x,XVfˎ"i)PF694/\|YivT8W]sA !S P Δ=ӵ<qVgtӣЖ^[nHžw sU*483p^N{8HIKvb'^q / !τ123  A6;W|1sd831]Ɍ(dXsx;*:Xk-EB`&;*T8. &R67ފNBlRxw]Bf)qzgA Agĺx$"R P`j”b^ bۍ-f?/u}_#e{9%dsed 'D!6Ɓ-4X'>;͡WrJ=mSGM.aetM" wWtp~Gm%MQ, Ч|1:y]5U8!VE'ɲ jS3f(mABKK솗25@:*f_TbD`<@Eiq Ͷ /;hnQLAT8Mԧ+9% 9v,§"kX ]7)V\QACΐV%o(:mGҢ E 6r76H)qȔ^vѝ0IDAT .Rgv|G1r+Y0~RLҢuYԊb&{jTbRccbeKX^%0fdaqJne2WgD&Hhu1ĊH)ʃN.IWlrU>ØBLNx9Hhski+1Q cN陂tM,Ua^S(뜲&iu VE!+` zZ=K!Qg2JJu,]ɬt%ӣБV޼:{K$gO7Q 0<ɒK,c=|$OБb\bw5zHUgy]3!P;jbv&$]2g9.x޿٧yr7%Axqe%%촢Ϫ];dL 0:qNu+Niu-Ab ^kSiyv4N0"IqJ]f+M _ ҜzD^3S v42nEct>Bb}P˘0L9J.(d-{wn*\PצnBNBwc|쒁*^nh6Ӣ.aUb6gJQc)/Joc{ bd#&2,,FnØči¿Jճvd2x^GFgeLQ;岢 O.TOeŖ?xL61#j‚8Si Zu..7$2T;v8 A61+E湱oHѐ(Ű[q3Dݦ;*~ R=htܝ"ywci 'D'D] fK(7!$M+_QJ.B7D9cLu.fe&(i)xaz-)TN8g[zWS`|03EcΐE2ms4$Ċ!]lݘz%J.8,إ'U~^y>;C.9Id9]*U\@J=Az[N"`D9C}>ہrsHU 'DJ蘒&?͵ w}KNyc{cU>{97d71$1cgBbuM Wo|mlcYy `rE c鋁*{.cyCƷw}c7L~h7ЃuM> z\"cay*;wHJwmof@%h M_h]7ݘ4> :*CdItŞ+P[ \ϒhNA_AM85Q&jZKk]a+g olߴP_LjGi0onɴ 4e-1&%uTpNg\x Ck+vE?O;LCoN[~2q800"sT"EaCǺ!ȦdAOG從Q< `S)*!prrtH*]RqM?=@9џ]\Ý@0!*Q1:ݛb,2 Y =|u/'&E>Nk]#-}Cw;w!Yzp=MAy8O1S4'Oy8)L߭urG]flnLaFZ>| =-v` 1&T`A@2bM[0Y 7/CAz:cLN$@Sۥ=6S}"bh7/c1~%W+ <+I "z~cX k1/z^ neq+3^(6Tŋ޼3_cCPޓbpDƊ`}|zy0ч17t~-ٖC E_^rn}}1[OhW='3ۚyBo19w_ 4rPGZ=?>Rws֭Դ>z_ OY+D3V8t`}}u:kzc \=`bm_YQ{AgJ_D2vTDq)#i&%[RWǸ )Y ;#YM X<Ê|2"_OB*v +B"ءs{"G3ۂڲHc*l<;̡dls=AۋYK{cJD$$pˌ@Յ\ U؞C[/#0_cSYp pͪuMԾ'KlHS6*̇y_¦T Ɓ2rv4oBЛҶ<|3ɍ}g1;V5S}"1)iл/f߁jW`,WO뙽yRw6rHo ,1$ p.Re߁Vj @;9l;dyǰ.ެ7r@5QȧJy!@yEy\cr(^'pk#k}ʆLJrC?pnVG%dqLYwlzԷZqs@coLYwl[L }حԋm Łs2r̕_\Ø hSi!Sx;Dq_s:mL!ɃaZ)yw ڜ.߁r)˄K}?h=P;ɪ6\ >nstqk^Ϩ?^ÝO!$ﳟ$R@Yyrk?>?Քd K}?S4_ne[@;-FZs~g.4QspIg*;,ͮq@0p* odA@8SΖB>NpwֳY߁e)+#җ]^A६DDNfjyN㝂> !s=XHC\;CFZ)_kgvzmGeB5^S.s@13tu;9M959.p @ܗd` \͡\\Oy>gپ3%)NEt$ֳv@LxE%3L(H{}޼]P[@>od2S-LqoF \Z:@-M):?.7Qn|Vpp#>3=AV*:T%(:[tY@l_g2-GĖy!w[PM30Uq 0))&d[@Q |+w2g"] ^;!H) \( b7י,R}gDR;sdLѻqnK4!""A.dJZ;i":R80w".Kp*S9 Id&91QXƔ0J|,AR@O(,sݻH[.oo#zp>0^2@}o; y{H];Or)d΂|AO@މr@[<~20SLY v(ٴ\;Au[9@c:oȧhSD/{.p"h=ɩn8Aꀩsiw(=яU) /)Kۮ|?0iBBtVW}yNeܱBw{6v5f AuJR'TcKam+QlȻOf98vM|g+~ZNƟ )rt{j1EqWLӺcKymS^Νͪud{7v/?k9rcJIK@xlV$ܻ۬dZq)r}VN{e]pϡe$PN}m+Ӏscf% Xw\)r_DI7KɌk}g2xd@Rc_Qs N#B|lZ7kw|hdwŸ|g1xs_;Y[e2-R&WFo.W^_9ޭvoP63ƔE!o+]av&Y-3crGJG[VʲwkKW)ƔLė/E^!诀c]};Oe_ >! )vil~A|rLxyQY;H!(u=QOۚv4b-Czk2imT+czJ{1\B+9&jjLڮiY;H!rBj:t0wc>^ppZPٴL7.ieY|Y1{4gXwF=DA Ř2+GiyL7{g+fwcʉB$idrYMB=kS.Jd+ޱ{d6 `<Ɣ]|Ra1G'}ifbLy( yl<;Hi~Cˊ!wcJXܳd5 ;1E5z FYHCh?i'[gs 3Z4Y)pwXrR1ǘ +|g.ľÔ"+~Y) H>lLs=O~ A?_Oo})VyC;IY=jLإ*:b\X{̸Z} ]؟)iꕾ+R}f(:Y.}TOF=S&)7&M['>L/^YTB>%9aK$?gNa{Y!~8wc' I;1[|1r/PVm}s-cd^S;9gv+m89{[1[BywO<۫^~y4vq>>̮reoh3q{6s +2邼O@<&o^+zs#m 4z >]]r們w@TUsKo D7~1ʝ{jv8wu nZִˡjWtSw.$qoX

Vf>?+}piܱ++G0YS 4^~әnD r{gC8F05M`U~k'yZ&>00<)Ky#bڴkKup\!S9 Hq;<,VfV14wC8y +Vp{.fzUU ޠ*X|X5j9W/ׯyAEy qK鱽oA )9 3"2p_}x}qOq$sCuO+o}LJNDÖ+w'F CdFg98ɶ)fAy6K|Yk++G 7*=`GPy7/z\lerj5*0MHLf|gˣx^yOͦe 9pQEeˍ#N ԝae4`F,\|Y[jd (0O1.`+dUׯW%z<{5wzΗs6lS]os$7^%LI4!@&&1F(:BHō t3f 3c}f]yJX9Q4Gn@~NERCI;D8'WݴsByK)j0~D%P! d޹EQpm,Fi*RڂX U`$j2G1l?Πɡ"^@p_zNƙa$FF:u5ȏ2IENDB`bayesplot/man/figures/logo.svg0000644000176200001440000002316214335264324016166 0ustar liggesusers bayesplot/man/figures/bayesplot1.png0000644000176200001440000022411514057711166017301 0ustar liggesusersPNG  IHDR` iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o pHYs  YiTXtXML:com.adobe.xmp 1 L'Y@IDATxU,M"* tAE{c/n41c&ްa{(߼=slO|;wo3snSX/T@" AD@D@D@D@D@XV5" " " " " " g@D@D@D@D@D@XV5" " " " " " g@D@D@D@D@D@X&ZQ|UڱUҎI,6Nz߬?=~hd\Uǎ 3Xڿ<ڙm[Wu;TT|rEQSt EhΝ;7Y|KU[p_[y-/n\K:+&Ty_Q>%(" " " B1&}=֠AkҤIʅȚ5kVP߼ysk۶JR#!bPaY ӫj^z 1mI7j5g?zڷoo#G4ҏ?0m4mݬUVm [Y^v=#N;Y׮]S;h'm裏R]w][D;}]c &$qe+eZXg"gٍ7hS. 6{=kӦmbdĉֽ{,)du,;Ξ/Vadʖ{ 7GmCZf͖0YEFD/BK.^u `og?KccƌY>dט\D?$VXa;ӳ/_n]vYze.MwmGuu)睿 ~PX8͚KЖ-[[omݺu'x^yyDqJoygtP bQFUXhs\.K̰alv.˲ l=3Ia$D5\@_&QQ(dO<, #]Xమ<8Xb w} !k[f.4ys4;@ի >ܶb7=, " " " " #lf镫Ƥb˯%%%i XvҒ5:+>VUVYI* X.XZה uqzʈ<8,-Z[̎ɇz"_I~EӴid!M>iƨ4l9#,$|qZk+g֭NJi!FT)k"i7OdAy闿i)+GpurkSΝ*ODpԒʎ4\FysX-^8h [F'[^LR9\gB^E\6}#1(" " " Չ~h֥C$,8O>ǒՋ#ADI!Ƙ"bbX`"Y*Jy^z%/~<:ziuOpK4szg} u"w\sT)ks.r>Ow)疚>saSh)S ܟO}.7 {1C'橌b"_:E_΅Z =I\(<y .mV鞋ɜB]tQJ `1hss99){nL\|^1t1r-^T+Ci~u=_x0E[]\Iʔ8wظ;܆nGғʾLl2GL#hUKBآـ XeM9矟qx?Iޭ@9 }s6(z3Va?1"=:yx3܃yV@ĝ{1YvϞ[l #??*PQGM(YqT 3]QɓS>?Xwj'AvVq!㾎" " " "Ph5 'Zz, ;#;u. o[ZEZ ˰|r]ا;dvYgebDCZG2^GMd.c"_7ųkJ˺薘d4C1 -'i#"G`?/LtM,AI;ur6 25K~]S([:9uvʩevr/,#|2ΕW^ZRɽXJiRd@XȻX<o0(-c*܎^c (+>%gY#K)#x.>3\gq͒xnXI crCN`#g睰QRKl5o 06ֶtjg,;v5u@@{cbޫ*MX_Kl%v=*&L\2Qvo?[c5҄Kv)M9܀W4Ѥ\S& b}@5e2qgf_UvȤ=C1A`L!}p}Mb}JO>d>/ĻKuo+EpuS.M=ᝑ2>y:F{󬌐fkI\Jm]g8ؑ]4ۖNm OE`WV,H=UB#}d/ {`|G( Pg q_M1e#Rك޵V]5ec<`wn]vI YLY$!؄ >?{&}hKNcǎE!}@5  'SpQd_eLcBi/p@ =*|Rr3OLh Q65_ى/K0{aQdG/& uq/1;1GX|9 E#-׈޽{'G| Q=Wַld^␂1]}͗ot{EQb3GRs=<]+7> "OCҽW%% qrޱ2!]PZ!$9fi-a+{Eg/YEL傎,$`*na[P mwcͳVUg8(c;҅{ouƋϣH"%" " " Մ &c—&eKO\xǾdqa9B< ;H{lx7{K{{b!&_ee11E„HaY8\4=֭l.#WNNSD%QgE7[e Xv^rM`駝6Ј2#׋Zgclְc1xnkcEl=ٶe;xu@('dg Hl "اD۱vu~(8ka#wtoq"qtϋ(8i~~qiv]^ۢS!MX.-@b;dlX&~Ʃ<10dKasj>1(+]fad%a؋;ְ TP7"%" " " ˙X% &L@֘ؖWLLZN !^bP }yKf~%(Ŏ{xg^PL: 6H,=&&Gb2Nb({'R8e1+:_Txn$+s/D֡{}#yHc(eywN0~,'2b9%}E:GzA8р'1w%u2+ʌ|c`8š##H0~1O(Iq!P.,=Sxd)`YXRr/HNB p3&^="@[ ϑ" ^@1G􅠦>U=PF|/yN^*yLE6,ǂ 1iS+"%" " " ՅOR@'Os>N/@C/%>yN"}ubaD]r%E/+"(KKn۔]ٽ#Yݺ`jRgqFJ^r>/˹xKit/=z|ybJC;]|rs7)=/)w77P瞛}᥾Nt/ㄜϹ5.T//nE~POӋ~}^h[:)6V/mKe}'^ sI2RqKˣl:#dz!tp=sҽO>9Rz^ ^NMpu97WrO?P G# a_ҹCBnDSҼؽe@3f.rرcs.hSy|W7Yzqvѣs1؅e-Q/eўx\Rl }[/p.T uKݹK-9Eև~x03Q3E}c3"l3G^^M/po:xy7< w.%" " " Մ@= _q,*G58_7k1yཌྷ=YX+5'Xb!XQTa`"?mpNlXY|,={L/ oq>iOY1cƤeܧ,,| ,X{\x,[(,9 {ZO-2 :*S9 Yl GW^cl#ƋyAq_{~Xmr//ۯ{x%K(Ltge^a n{$e}`)#ٿDpA>O?Nƚ㏧vvzQ>}"ųC m,R+LbKZꡝ,%k2h'*]Ӗne),Vh#'|)j[nVpOLR#}KS嵉(+-CE}(~ak;#8Z^[ˋrR^^6M[Ԁ6TԎ(g|Qm2K0Mq^ўHep2GFhO!d\D@D@D@ E&x䰢4PZ,(qLW~1t4t #Dc!ODTX\eD\+.2҄~q|B<3q2efD|yiK9!}<&-?g"킞HyW-.S" " " "P]HUP;D@D@D@D@D@j=&ZMuPD@D@D@D@D@? ?j@! VGZX$" " " " " uXhuSD@D@D@D@D`[c`U4мӈV&,JʔWiksyqUіYG)x&,,"uWޢmOD_"}M:]֤" " " ՗VcD/^ HǤ(7BeF>>Bq]|]:ʎ~e7>$yOIw i</+eQW啮?˫]WD@D@D7}].=ݬYI&16m)s:[LR\W^,9~f̘Uւ0BPt;"O(y~B:V#2jQ>FKJΖS]h'oZnm y5\c^xCPfB!a > W^yŦNjw'aL7[Sv[z>4h`o9҆ x-l}gFY׮] ,Ϟy[al 7nݺg uw؛oipG_0olС?wׅ,|qeu>CXU6?cd))tDD@D@D@-&e'z8}1I^qStjW_S~qNݴ/ۇ{!.[.q![C RB^\>|1 ~_%UK̶% RHl=z*YG23rg{,YdJ̦O 6LXWwa{Gm)$bkذavM7׿.U q|(ʎׂU3O x =͚5+s1111S΢4=g[߾}ꫯ:YQuZD@D@D@*C@P4L²!&jq1xrD8WL@_sQG%k1$OXAv='N"=}2(2HW^&ڄH384iҤ WVG|(#ιN{2`FHLgQG6IY5qui`=ֲE4fMNcǎN8!- [wuoL_LbxӲ4Qg֒Pt&,k{wm.]J_Թsp|` HKh{Ę>a2Ge XbO\X;i#mDzꫯJOW;Wʩ {g׉!RL,,[m mEİ C:tXǠwgW<Æ]ӠA=qUՎqu L΃ŲwCY}?s?5 g{ V ~8?glI +/i%,ړ"3_i)c?K#5wƈ~gĉ[o=Ǝk_1'ePﳾTU_r%ed/K<'~X}y&ʁ NQQ Yo4~a} >W^Ǎs-C" " " "PYUno$!S&kZնmT^&L?6f̘4y%H&W&xL_I6I&I' /#P'N0FrF}0ezᇧE«*9b\>ee2as=$"'lB/F p/8adW^N}f'|KBxt61"-!hu.[k.$pa!H$OO&FdwYgr'%9W/46`N0D>#7 ˓x饗,fdOSZFA4]z¨x뢮z76΄G@ %СCt9q*xg9q/2hoqz>GEb//8d/)wK+hlx:wH (c.Vu1N@ɐr7Ɔvr3пb*~8SRG]hD,p),*R/9 ,疑ATG')-Z9 r.| \8P2}S[V >yLq>NqfąO SOsnQI')-^)n]vE~29|V') !')[$R_ʹ/H[(roR}l}:묓k y瞔c]GydskP.GYo'ks.r_M&:]>a|\r`Ǘ;m)-v'/2Ź(ȹu+B 9Ź̹p,xgYeNvq{RZҟ|ɑ$xwQhM4-.Lmz5,@a}a֩, `Y.r*KP6:\h,[XK],3$Vt?[?޹c #@O1#q \0\?Xb)>aE%{XF+T,L ҃5fS_z,zeCxjzG,?ewNCU1XaM9EZ>eL/X.&sq$.?EQGquc%&[L,cbX1IQ^#Kث^0&LC v&ڗuHK}Z%BࠁShLj#DoKg"0*ΉcyzCp$>Ɩ&e\ vGYb-iic):'֭W/,ѭoiy I'S&Xxz ,1|^lqˏd'=Â6۬)PfGS(9!NjjLJI>iml.:diBP"'/'m2l V;!GC05J{yNE3E<`ڭ;1_1f]F Kk~z2C-F,U0 g=fYdc Ct}- Y>psV6Jf(Ok}a qn =!n,)a+o͏!6Hƈ}zdթ,2 J"\౔J ]N(#bTbB+LhnIh6O29BmɦZ>&∃bD*IK`rP6` цCa@0`y۷8'хaL{s-B5b}[<4M}H=!zrN[YjxIzJ\e,~Ѧڃ%XrλXNz[ھ-R!:B) .,k$Q'],S qc{<_xD>_XIgs9}iXK CLb[%0v((su|l)+'BcM5IClSE! VIZ"/3( ;nq+99~ _SmLcJ}y8w)e_^!DpJTEt|g5,mLZ}C,s;!V|"8E[H܋'ׄ HߤIHVCt%}y,mE!DL{- 9ˆt1W'`)IsUus`E}fu'ڇxY+ƞWNa* ɒ;!1=_y\G߰^#?c$}\.~;|qy OvqĂ ʒXh16yba4); ="gs~E׷}jhC\(" " " B@lhdRFN] V#ZI8`2"%&ĸfw}%L$ "cDA:&<ŲAZ=~Ӯ#m#0g!!*L/8 TƸ'tQR7o[sv/ETWD<= P +cL?#qqA>DK"ɏ00". aK%DewώqXNa!,h[8wM4w2.c,C`mBTbq g[څu +$"w}ps\&S_Xx&YRMB,KW? ;y"pd?Fe;x PrW'01e/|#Zsc/LL,"1c2,&LtݍI3Lc3ǪE4+@{'X`|`2aRɗEb:ʧ#Ԉep9a„l+}'{:vb 2=#9٠Oݔȡ=,JY=ʢ],Mij !cO\plAp7A9WHimD2O~L~DqcB;{U"(X'؅E( Yzȳ%Mwk!-s(GnvO-sU#"w!X~gr5F#жltgƎriRE=q=&'0=6+ xpo<')pCOPE^>#=l\gC#^d޳i8f&_Sa=W2u." " " ! VJK)MvrHiryy,_^KWф5[${L W^ tܣ C&k@ys~q?"}yYYq}Q[fZP[(<7Ţ1 !j"O{󉾗WOWq)WQ"m :9kB6.Edee=%-!W\~ʔK*bE@%HURyI'yIӾr&6[NL@ӖG9?[fqʌ6Iq(/ۦ'6ɶsa%^p:Wo~9KzVپȅ|<͖[mQґq[ų\܎^G_,%ړmkE8Fyq1ҖwQNɑƅzD@D@D@D`QH- -% P%(PYE@D@D@D@D@D@' V>ŊR' ԑ@(@y[FLD@p\^d=QE@D@D<rQLLR h W^I/ͺ^@V:A`jR@AD@D@D`$*`ո[=쭷Jךh$ 2;l3gL%u-" "  # 0B~4={v%R+n<?H͙3QD@D@D|`s/aÆ麤dx]@]'ϷW3QE@D@D`A$D^,9ҚJR:G@6ֹ!WE@D@SV"q qR*Xb`KP@HUR[b*@D@D@D@D@D@*G@rJD@D@D@D@D@#T" "PVw[X$*N&" @r(QVE@9$ʁ(E#P([ZD@D@ 1@5 V AM$8" " " " " ՀX55AD@D@D@D@Dn^T``A@nz)" " " " "P HUAPD@DЋk" " UE@H"Z<R% Tq0XltGD@DLD@D"Tni "2Tr V@IDAT:K@:." IbS60 0=" " KL6%.R@$ V+U% XVm" " 5X;\D@ YP!" " ՜X5 5OD@D@D@D@D=cr#% *a$j؀" " " " " 5X;\D@D@D@D@Da技& {T@M& VGOm@^ea T@$ V#MEs{}k}7ݾ93ճ՚4Z`Woaۯjmڮfjgtlkm۴5Z , WEmE@Dc!PWX^e˾{{7G{~YgZZ~-*ͬj-qn{^neOv5>۰]lzݭwζN5e GSAD@D}cTd/3$9V fvMkzckocVYZ5j֯CaWl͜9Ӿ;oO>Wxߞ{=;lӶqvGa{[kYXFYsL6&a蹪C@$q`!+jL 􃴲y[Dnދ@#4嬤ą:7o}oѶX[^ֹKG[uV<9Õ $)pѬJֺi؜9st}/]|w_nAg6Ƕd Ǻ!Y+ĘK1RUb,-e"5Sy{*/*YD@DE"dy_z 2I|y}O57k-S_o]Fg e;Mlw1k,˕V UW]V_}Uݷt3ϾbW[N4 ; . ikޱVLB.G2 aze/b(3{:i?HHfȜ5iȚ4pG+$H" "P gr~M;褫瞳mmaQ1Z8Ven=`Il4i:whgAns1S/ٵ>cS.s+a56=j;UVne{@-Gَ| ?ڧƾk/>?}K,k{o탯4wFB+XͬKU װunض[c5_J|]I {|\姢/%җµCKc[l7~tS?UH/uY۶m} ib"eY;^-7zv.tCo>Ntfi!Lf`kРa>MC~oۣh7}-vk>=v[Vr ~i/}~j//n{>fѴoeki5zAԧds}=^y+Op^2?mm{zZu;Zv'n]sREt%% VA (ZD@2qՕ-o{ݏOq`ɶ&XwCiiiO;pR/CA!,S|{%r f_#ƚZ!m:[ߞCɭK-[6OyB㆙t-Z?8fL,|}K}h?9if֣m:_s$R۶YŚR״ E/s}r3݂8mu3InU[=mؾ6[}Ֆpv;BND@D`%*h aä+,zMA;G۞N^ nEblO<.z_JC 9֠|W_~m[v%Q.v^ڷY:/U@7"0h,{_3?ja o-ۭڹUYf5=]eSGF/!Іކo>vOgl̖m͇߇׭ZeePK&K>Ԭ " 5X'VE@@u`<~k턣Vh?vkhzU҄ciR_&0cYb B{ o죏>|=ObO%3%)b V%غF+[0h{+gG,,x~t1yQ(JҗTfEr[}eo\]zcnys[u찝G٤GZ^u/ݬNUIJ&" `HCW" "P$‹_xԻ'c.x܆Mi{19Yȇkx:cy7 A \aݛsoJ KZ6#Yu]_J]!؟{ܭY+4ib% Xcj5jȒy{XK#՟vTE"= }|;OK~y}l c\$q28&5aO;8]p~TWM7N}unm  -W^_ƥrH<__|i/$ ^u촦=؝^d7~ܵ~yxyMl@߮JyEBMP}@ 0= " " 5x׳/i;ۨ[&'3H:aGtD˥drs6qfΘiӽL_ޱ˻qٺϞSu񛍶A>nNzn!;ksa[؎[o&6r񧼪zIUE@DX1]yK{9dI'mǃ%޳~mͦ֩c{zRc! j'="]_ C1˘UF#_n{N=j=ٶbC۫sA|cD\Gyհj$`zD@D@jdϾ/r0KW#N{+ڌ3|R_%$,U—yicY>mM۵78vmCwu\ͳ-O5("| H-_]D@D``!a],9|/'^d\v b$ӻ{?R-BJZ-$]İJKp0w͞|]|v䁧ّjMl/vg##VhF,s`*X^gw+v;Э^}h{Mr*<X/MTtbLH:ZV* OnC{T;dq.FZ KNC-"SQD@j2 ;ܫ?_j֡slA w>AHiәjVQ֫=b>ƌWM7 e!s*,7\c6iq6hH{'ﶃ~}[}7nZg#/gE=L@:&" u@?LKjq;l/4ynRWøTC=b8hvufl谁OeKϴCO䬣GQ˟ݮ\aGztY$0" " A ,7߷κ;r[e@o;۰YF + ySۯan >9~Cϵ#ۖF.$!a kD@D`[ƀU@ `Y_,|ۯ>xy$~mu;ٳN}zr RZXB-bpZ٨QCo6i1OOn|(;j쾶5,{&j!*uID`9[U@~z_N) nXc55kVKN p,El{G.pIfkcmM7=cI,/"C&VPJHGEq" " DUeac`Ž92퀟oeF ^/+֣t"©=b5!ָq#[q6f0{晗=bg0niy*+75_ZZy~D@D`qH-5@e0}fx{˛kMbuspQn/-9.۝̞snb_Vٽ>f=۸CC BlGQTXe()b */e\xㄫ|]akQ?MƍLYJӒC&,,6re$$S'~$5k̶+4N^{Z6t=SvUپomP:(MP2:H@," UA <Ͼo~yefgmV^YÆ%m8UF!A Bl1֠Aݻuwm{g+_uu bcZkyJ~@9$ʁ($~awvuvuwjگ;І`/7,uyb֪l"ȋ}b%pwѩ >sω']t}&&cX֭iR$XVuJD@/S.)IG=vڹ'w~g ;.ycK@}U+0>YmР:w^whkC|N=Vcmmھmfd-5,y2D@D H E@D@*EŤ4!b+g_{Sf|birjе[g[`TK28E2(~Tgv[tbk\ vםۿ~q#㾛v` ^,\:O  QBtZ5w*>s{Ͽb w'ykѢ/m3HQQ^Q;.fs.]:YmmvweN#?M=vzv~hz/" uX]}]D@@ⅳ Ƹwѧ_Dx͝;៞Zt/2\r/'oݮk۾mH>F;'ٍS6h5qϢp\}(O@: " G ''|fcR_j^mG֓X]y,R~+W%,=xM6 6d;w3|myvA[leEW " XmICD@*I «ؕ'y.j;lCmIOּk,x6$LADbY"BiӦd/;Wؙ799SljSvy~vOw !Pe " 5X:5\D@*OOL؃Bߴ˯Nˍل7z9.Θ F:,>g-[4I7ֵn.=vȿ`n?Yma(gWNG@lW" " x]l _yˮna{ܗ6bˑ6хW=mU[%LK];XFo-uݵ/ְm^~3?>lq[م!L4%5X/VD@*E //^yۮ~;6xƶđׅW֫=^3fH2]ZT)J$KL Q,ϢM7[.xl;l oI6lPok؀Ubs~2J\aP"Pe$ *eO7?o<ŗ󬍜8ֶxf֠]dcJ% efq'Vی}٭ky]찿nc;n).+"P]HUP;D@D` b{S^_ϾپxqvNqcꫭloo}ŷ6'ѶMPVDPZϘsKWϞ]}6|ϰc.ݖ6y([ӅZZʘTKPX&$ V*" UC<_۔ϝb>ιX|֮ͪa>O(sl,Q$BADHiK gz&M\g}IC;]~_?kwRzW"LADz^ֈ@ \#k{Sν!kۉgh[M:uhS(7M\p=$in&Uf 5˕kvm;wNSvck1V\q"&!V͆TC " 5@񻼦(}8z钩ޛvıَ[ol]л|>({<FuuuXkTD/+ʾk=ܫvES_ٰ]lzf-eZiX5N[K T%9.֫:儑.nO.=vl6}&!VK`$# ثf4հ=^~];C.i/HXڳ+eJ_Xe̋ә@M YwAŏ2|6o#^vGEWNsO?7n_ִIMm, 0jcm$ VGU}5(¥~f7pUf`㶛h1Fo0К4Ϳh7/ZFo)XbOSɆmz\tĩv/ύ4qmh4h&7#(,[`˖JE"K,Ϟf=mg]s^V;lx{6]l' EB"P; [c0b{;oQaL\a9tS뵮5N A  v Ql(Hd;7M IHri;߽s;!f!h^S+N%(XqaA4ӯ?o{)8qkDWYVE@@M B]&n9Wp /8i_cܳ׭)!V S Hī28x}/<aIp a7Rd"L>Y}Jͣ@!tUzqb& ž6zw#X/^EcMܪEcgAc|㓅+o!YY@! Vj.NDD8WlX%Vf>7:~#tk.3 mԚիS#2TNM rM^-ѧ~߮q֕w߾h WQY[ Ѐ4Oɾ-TB$ Vp@7aņ&|ay==?eym;'6@Z ,`U@'9n{9MK]zvDn~bM7<4W_|-sv.:N:U,"d+Π` H,O&"W:a*5u.a_m>->E Dt5~ q2{csq+łX *@I'Oxl}}\}ᬓvV8\ !bIѮ@V}R5~(x3v' @v=q]H 4MgCIJ@,I/N[D` EP̙*$⬛l"?pgmsNED@b gUb?HOw낓=~-|S\ٓG#]wkM9tҾv` D@ @%syz`Zx9>\}׫D4ݹ7.yr 4KYd>B)ٶ2UmR@kؙM JfmCd'~/?>zw9vA;h%YGW`:,D@^,9p—qww_ΧӺE#WʊoSDE9L(S" "'K_m[STկSӚ'}#&WokQpghؠnVѓ*OCK vT\C '7S`s`qa텝:ڱ+Zm@V+cMCŸƓ}lX޵/N'صڵiVVX!X]&eTH ∀/Nx>^YKW3/8:u'b!ХcZzL|d5n9܄h{_O՞Q^ "\Y,b9,WL H b~/bv˚ ,^:ƧxAZn]pa>}xhl/0%gs6D@D nUs??'>b2^y{WY+3hث-=W :Bc7^tbY +"=?'<|GCa:>ԫ喽腑ǭ̋Nط≷gLs>h'6GQv&*l,ge|6k|Brئ8 G E@ X>OeoNZ|%[?g̶Ꭷ/7N)m0rtݻCf fz熒p^̴A}*2%P?cujV{tđ6ESᓯ~PǀѣKkjL4AV5='d|Eteq~ZN@,̔BD  PR9t"M{F_Xb5-[<_L<7"Ͷ% {wy>;Vh԰.S+G3_A9bц b~$E/X0>,o۪[N s]i)/~}7eR zB^нs 'Z6o:k:+Y 嶲8mZ"n<#1J *kAm-ћ?DǰҮ$o,ă_Rȗ( xPĬߡ1Nt#+meZUa5%\j5,Z?9ǯq?6b.*ХYvFjaM kת 峚&vkg[Qg#"P O>VfUppa¼ǹ_O&OA*>MNѲe#31׸Q=ԪeԮn=Vpw&_{܆9yh<$xs7юeT˛[/%ם.)Dp { z;ӆߔͶdڲz:gZj ֭]+WcŘ=w1wBW~\iK-(ױ>;擱un֤>jԨuyy++6N܏yr:+$$Tv1XS˚+ڲ#v?iђebbf̜I?OT|C]uڵ!vwK3kޱu4ɣkլaBzZ**2wwZlc?d{_4>+`u#|sf PP[zxdwh N+EM1M0"=w5 ش '`Y6mڄ6`Xc:^~=6l؈ ̒ ¢+ľL.[+WœE_&e-HU -nhӲ!Z7kujakը4,Ag=$F҆@&y.߉ժK-.ؘ l7 g̵IOxmaչU-3KYCob:5 IKK1Y%T E܊ u~RDYUlSyqF3{62RśN:eF*C珑[f>ի?ፚ֭[B4iz&Ȫ[}6Si駟F `عWsD7BwxLwd{GP+[67s?u:78@o;V~?\[q86YX>}+,oX?Zo޼y馛pg4H<cͱLKucРAB̙3?@qmِ͜Ux*UгgOt &LĉUqwPD`; y;Lơ o:?YYMRo5ӣpbkb-Ƭ+1e}}f{\(ʼnP49CtHCکhT2Zׯj&?楈f"/ fuh"[V\ )M0:-˗wgEy._ GʯI2 6[%Zs*s`yqA yr=6{|Z# Md;rMr}9(c&1Ici;qwis:&Ѕ9>[/^Qr nrT$QJVCb be%6n~/=˒p_x~>,N4Oc\r1;τy/kׯ_{֌G>n_~p9,^$j2YszASԠn 0>f-[on/\\bD3w5ٔ({hSm*kb6Ѹ~ T 5Mխ] TRe2="*ۻBͽl,OץڼܻΙm XAί//_/8ПupBK.aAP^3 wULLrUzugcH ˖eL_۹ǼNfcF9>Ck_g:k>OmmYMKY W+%-5Q\hrS[4[PMoXihi2뒉V,O5T)ɬPaMBdBO>P0y@>e/'ʰeEs[aD=xqbơ?ƋG"=f|xa dTH?]vE^ͱtRO6JcFi^fJM8Z b-civ#0֚1-q^|9>#w|17hZ@^kgCUj[sq6~+uLNAӚihR;=;7AO~OPlLJj/_Y*8KkFQ8YeݾrƦ_*0 o /t>_+6q~9myg˔>*Tt_K6kV mG|Tju|ņı[Lb|(ȕlv YgŸ}LgC:1]n> q:6_3?Dӄㅷq~~ۯ}ʐVXG] 6y')Գ@G.+m*v`~]|.YabmVklLKV1>6Fn\l_Xuq~[XZСV*X>VbKztaK"6wmoM/ȓFM<ى.:qWώ[ooUW]e/ 8qcwvcԯ_5K‡G6-˱N;_|<FѣAWN72/sc/0Ŧt`lw߹GW^=? 觵ȡ{_AyVۄTUIf|%_Ng@Ŧ+s`Z0]< ,IG~}5?.d2sߦKcVب$^6mx~@mg/((l`"~4y-{pWmڕ|?w4K,ٜց5̓g+7"b9>KY%Ey׋hY)94e]o25. \հBq*kU^]6(ٗkl0-{֯3̚@c-:0ǍnsivQ,xr93M)ZNѹsg'Oiaѯ_?wڵkk-^{7hXb?.?R!-_<nfP <=x7s8~їRAZ\T A Z7\Iپܕ@vUr/O9mK/Y˅u>s_l9au}nr1jt'W N Yy^\qwZ^yL2Æ ԩS]3BI&xt}nE/'`oVy͜9Ӛ_䑎i}GeayrqⳲ:KqE{eYE;Sppo?v:6}<,0_F͵_>b;in;w>9'6n8xa'~>Xpb×||z:pLýO.Er۳h;iWzB{X򰸜={ZDYx?G o,Dt}8۪r-:Z(b(?p|NЏ}|? ͛c̘1N=6$c*\+5kt&yl6d99=wr"{ϝ҈@%z*ъuɋmU0DɉWmț*欌7c-? cP8 8 ڑ1cMpܸq{ ۺxpˋh"b2<=09 Oˉ_Ÿ4e|#w~'Oc>x[pܦ N~x;2e*oO ]8ď99ll.7z[uU1?:bucpZㇷ"ۅu4m.ҏ.|Aqc<+?ĦKt?c2H4O>]~x~S>vlhs'n}4~$^~(y6cSfy\TEqH`+&nN1)K8?n{_8:_ GHL+k`ҙŋ.:4ŋmslBp戽{v#(9"uٽn0+-b RŻH))6 P |hk&r"PP"?޿Ygψ__8~3;N@~2RwcևmGl< IOLK0Bq'&"À.sf2|>>߰)<Y] 'xy`e:ˏyc18vȣ1ݶ\8>cŋdyq.[2mUܘ6g[.^Y\p@C0*xx!>x)~ߗϯap:l>c[Aȹqc78ㅷ'\s>}~M~x΅/^߯ q1# ^ [\|_HkYDm-]"p~_n''6 c ci;x&~~^7|:&m6vᰜW8,>n>MxoǮ}xk76,:7It;t9V8Mx;8M1xJ[x8,odž3k֯_{yikmm{[:6pذpxq9%'_y"P*sJA098-C^xeZ;βiغU+_~q,d8 GF+F ^\ӿiӦNX5iče< e]\YZ&Nwy0-holHǡi91xӧOرcqi3K#?H|&oذ&|y,Lt" " ",`_tuʼn'&l^HQE M`q~0~e[P0)8_`lةS'ϋ( (36cy2k=t c)|3GOn?amw@D@D@J,˩y EzGq>oy0=\HsRHqh5" " " " " "P`<J~{[ezD1Em GE?`VU(t" " "+ \(P+[6ov./=?2?'6 s.6!oB U V jez[7guPZUԴp-_@ͶYmkq t" " " A@,9Rr$@+b:ogYzա6ծ+`u̿-|-x]`.MѵCSjZ71aV B8Y)LQ1Q]U-'@+:WFQxQ,Z/F:tK{vQS{44VJJeR Xd9Xr5oٌV!ͤTԊt5NӦ8bmг[;tZ4Fj1b,cVXq%r>~J-%@r`w?Lշ>~ץ>}{5+5Q4+ͮ Pr%DjLMC1o7|-_ cjoĎ-5og۷mQ or" " " "PHs<ȡ/cy8#pѬyc뛵l 6wndDdb,3X6ٶ-̏֫ԴIܳ R6Yi?wS51r6dKW4_+*2MQi_׼D@D@D@M@lیCJ [&f<8w@z1sH3kE'EP3QE F#DZ1'BfΚŚ5;~!^z|-i8k~w@huFQ YXI@}uQD@D@ wMT"(nyS`DKw?| 9BelݺN<%k0+5נr̎GeY_Ri mog~lL'8cĕhڻ.=k(5m-ar[+SZb,`BD" " IH@, /N9),Z+9?l8HC 0?b”B5fPAw '/ل)&:}ث|8˱ǐӇaP]b̜Q "MkJ " " IL@,/N=9xEa5gb\xCx1d!8Ѹq_ ټ0#OdbM!$v1 Ę ^1-mZĚ6ml'qߵo7/93F:1( >Lnp2m@KKN&a58pqPZnD* JD ;cMmrhժټa=lϿ;ox~+nDk׉D6itY1 ۠\E% Vu4(2_t*3fٗދϽcO8kW7^l;=i#+Sz|֭#4m^=)\ܲ[8dN;+'3F@,7: J˳BLanj1{Ks15b}AFW2or#)fr;l 7<Ɯz f] Z5>k&1O@9$Cv[pu" " E > (WD >R(/sn55\x > 5Ze2fQ}d&&[o=\.lmaXLi,ƫs("hF@xISsN™Ç*nC/pL=kh 6oހmZsGLw?5kβɛkє.Op9( `;+MB%81绿0S1l`7;-J%A|pyZ8X8ye+Tn ԭU +#^" " " "PH@> ׸Đf/ @UHa(խSNfջSPJj 3~>+䕀X^)# mɉidg_~#JX?x -lB_dQDтjeݜe Y3'Qv5\xqX\&.FTE($Jٕb_\(VZ{yо)DK7%aN-a%a:8#t*\qC/IΕMD@D@D@D(튨<"fy ϻ>_wc}[B߾=dp 98YqYGj68߸jr" " " "PH+6pb/a*_w)" " "PP$ B"n_Y,tث9k8zlls 3_HUPٲƍbyy,\ЩC ݯ:K,_qw$H@Mh"#2y-N|tP\si{'d@E0Ǝ1i㷑3c1#J$pK@_GxV^} G|V=q6|sG4qLi|.nC`HKLcn:6yqdorBQJ֦ms0zt{X|Ut@+,+,ܔJD@D H%5Sn/kv"z 9vp:v޹ M6Wp]wcFW`3T@+38 05F,kE@D@D H%/#ѽd?j[/b/Fwkh:un 8 ڨo" VP$xw֯hecQGG5|0RS,c%l:Ұmh}>GĽ7ߚNBZMKÕ9@ VųQ AnV֜mX1z^gdlDpG`OSq/^4E4a-'" " " K@l{ *d# 0?1gpɇ"=;e~4)\SDNlhϽS/G/WJeM@d_?Z?:oxѾM37PF֯bt"nܸժVI' A}1?iD@D@D@% ()\Pܛ|xs5=6ef7k^N"kͺ޹5nD~8G0yN@K/_  0"gg tP5=eTQNMpӦMzɘXf-هwmOKE@D@DT(_*J'%EH`KdUV9>pxS֑RaH.acg1f[FMpiG9(Ҽޮ*@R,.N 9h.?y 8?Ga؁{CqHz7|` ++"`׫\rn jTK%w;*{O۹n<+" " $* 4_qل1Ð! SXtm&Ӭ0{շ?Ӳp6VDR$! $:!YA-\+oz2]:5weUSe;(Eۣo7Yy8GHFVtW@GE@t]OM 'i3U۸1dM%a(_~lDwŃ{|;EB@)#A8J>/ {6aP8zb_fa?˖ĕ܎ SpuШ~Hs{W"S.M$vt,[A?8ǝФ d$׭*efX@UՒx~}+U9g6m܏Έ0^ae/'" " " Hţ"?C735d0sףgv.ޥyV>7.㑑 wDhָk!sӞ@ , PcVw"\|#+e~_UK=Tַ-a5Wf#]ۮ},bkqg B!Nk Hih[(xp2h \u3αZs3DI.RH R%W]pwLpDg-tt$kRxuJ" " "yv*LZl%q+ LÈ1_ĘO< "4aLWF'|3n\/&exoޑ+? # @=?C`uk/9ukUw@|%IyW$~V#}k׬sN tx1nYk8eZڄtxb$7 :{#@ŗ׍wzj'ٕ@(" " "PH˥n/_!t@^OW:?~?Q8aBSJ:xkحcֲeK̵Mn~ g ;r0حYR] G K@^:< ݏ`Y w\M껬Y-ˡz ~Жa`yЦBث>U_'js{tZ|l+" " "P H"+\džnxq%gqݭk{%al)Ԅ/:Trl R\9t6~{='{O{ PV5QD@D@DX+E*^H VY? Ug]s*i)enX+r(%r58殻d8~8gqi~ąg]m4Eޓފr" " " %Xɼn*u.bN M<{/Cq`-%{u* d#5vV5 ztmx7_ |<ĉ8>Dg;#A' P." " XIup _9\KϾ..ϋ'}yz6%*E°*īF\r7d)k7Kv pݥO8'qƈk1?pѮUwzkEAȾ-H;" " " !`!,kְklt?<6;.:0g)+͹X+ߪVGV<R\BrqO9n:z"J%UE@D@D . XYRysUFX'OmVf q04+*rXJMb9J 1#%yܩ FB|iq]^畲⋀# A[n? }YLy!N>{Mt{Λ޲P+*M.d)g{J/j%S޳WuIС]s\zS`5v4\|19-Gd2@&i`a\+ ˬ0[xm5h.}> ^DBʶSD(ĞR~!>=Eᖫ+Nœ7hMB0+Fw8e!" " EJ@Hq`y%@E״ BJpr|d<{xmpC`6mTr9*Y[' !Qf(N ÉG] :Fn|Mi+Xg(" " " $'J h5Z?r0_]p(/o*v[H8~xO+,r \zh5l :o=D=OwZ@2GM < y.Dkoԩ 8-+A߰`y+6eRAJ N\DnY;ۯmm{ᢛ07>N>fe!*1>u;F()%K8z\%'evN8ׯw`yTX5B]fr͛r.K3g;V N:n *9Ͽ?[|A _|32z;w 6;t ~t u9w郎ZZE4W,}0Sn+Lɒ7f~Ű%-2;WνMkxɱ0h׺XϊQ׼1u@Zl/m  <3Xb 0{q2 WYq`%|ҥN@BcW{.j׮>uE \7|3LsOzh֬(ΝD/J*oGž& wY'E؟9Gq"B=[iYj ֮]Ef7w~u&a~tȖ*h{kwsٵ=ԫhb%HaJčvh7~x~9(0h7{ <4>\1xx/ ޻mի"5+K}gń qF#_w_ʾNm˗/ǝwމ#<;vthΌW8o_|}K^4iիW_nY.2ׯ_?'($4:ʄY.PRR YӦL0b*e ٶ̙3O K)_lSo/tDѨA]q`7#qo|[1ZʕGPњsW\ 82 ~.M4≀@ %'ʯ|?3fqܹk8>WӦMs¦M6hڴ)֭['|v:uYLۮ];'>uT,[U7|/V6Y/ 2︿Y[_0:dsA=E w,8 +'N5(KbD"W3Q5?LIAuQrj>kz,_X?kVMKWIVD*P;+W@˹{Mi=@IDAT]Ymh4\s ضVqK$vZD@D@A 6>|8v}w8묳ТE ={6*^t+£>d=s:tָ̃ݼysjr-217G߾}XDy:@EǼ6X? 7Z|SI!1c+SO>EonRF3fhtŕ֨z&/Xŋ;p…?,kV,6{d^{ z G˾[Zrʕ4iR4>`2;KV YɚiAY9 fmU$a^n!PF.J:|aNCN`Ħep:x~ۯ}z ?pr;vnargRB'yJ\w}mVVZuȊ{Y6lyY j0zfQM;mȊADI OM|_06)Q^m͏7ⅎM6KTJJ*{wWT0-\V1}qYOW^y ftP|7Fw!p yFҹmx!s馛}ׅ}Z,idĊ9h"LND@V؈+V@\GKT7@ 1?e %l=e/%eg <؍8οFSq. .C qtHqa]w~Pqݻe 6eX5Df yHHGMlԨQfw50H [eMۼ[lأG'xl+Z8ojժKl0._"˸Ʋ2G9`bKD@D@HHQPPp~xf̑e?6DytQq.1BCчq.:zO:ML|8~Xd503fت)c8E@D@' Q8+Hn 0"[bV2/cǧ ljY<`yƵcOU͚5SO9>eяV-6Md9Î0L25kp衇:F1I&^" " &ymqCD@D@@(TXWlxa}|'̓. bǡU36ȆAܧ)E@D@r'Wq*" " L gR ľ"6/H" " " " " %@`d횹/Qa-fLCh (qYby%@+QR'" " " " "PFSD@D@D@D@D@D`k`[3  BLE@D@D@D@D@D`k`[3@./,$" " IK@,i/N\D@G vJ/+n%n}9tv" " " "P2lil~j?SPٲe4Oɸ* " " " "PR l޼lYkHU.g7Q11V+z*  D@D@D@Dŋ I]V[U5=)\Bx"F1VVMK JX¨QD@Dps-J" @Ye*j݆ ۟vo4L1AjѬAu4hT;@v-ЦeԫSlG&ESFVw" &ESi(Q:RE_vf0c_~wͱZޙX`%;cM* )QUBIERz[oz6-*.%E}6{9s;sgܙ{{<9y﬍u[dߋdn3_5~v+ޭt9iLT`f-ab"0*bMRT̒ @xXpe$K|a?wS}CȟI~]w$YcU3Mrrd'嗓7IES!la,XFd 9gg9#A58|Ȋ$͸KͨHHHH  fko˔?)s+ՏH\v\tQIOohdeI[&G233%';[\ssYՠA]9ush`oåGoJǙ;*0na- $*` V -[{d )ii$3#?mз~ z.qkv>bUN*V(/ڵCi)=z/ .GzO}\043oʆ𣨙?sT⼀<   ( /n,Fz[ky)R|9ٳ{UtT its \&bft ZL6m,A^}=y7W*9YʕM*a!2A~e fHHHH/ϿCZ+7O\!eeϞHW1` #Rv J֎mZF^=H&%R\x3~첻.B !D$D,UHz ⌆a DhFIˎ~ӇJOgxe,R;4wV31AT]vKӺJF ϐl[TjT‘`ӕPX1$@$kЛm`YH [ͯW{e?ʍӆIӻY+lQ8dJA(fffQv+˽1{I7 jŹ 1y'@H@0y0WZz\=YrݔarS&>5aHn3ִiC1B;p]O;RekŠn,PuI$@ FJY(0@u_)FZq,|}rc|+W`mH!*0JXudc6qԩ&oX nG @IP޺]ns] 7m2o|"czIHHH0#_99dcs4Ǥ9=Kϑڵk3|!Ǒ'':=;L<@Uf `JB1ܻ7'>PZ1$@$@$@$PAOڭ\iX5lTwȲQpbmAQ4G8 '#^s,xay5;bJJ}t2~(*ʊr#   nƻK iXƘi~-Z酝Qh#]؁r ry'ȿ{R,F^(i x0/L$@$@$@𭛂RJ0-v9͚=p?a;r`=ZÆue&TwɯmĮT/cTp4 GCcڙ&HF}o&=*+VɄ.vl3Ϸ a1Ces>G|E2sLiHcy\ 5P;u:? 6̦fe}w- SN=ތ=hMxFyR{6_11([ȩ&']iY*iH${Tb_L Dl7_S^)!ʧJYv0c!/e0Xnm8d"^]Ƶ`y TQNL% DLJ*W|"#/X;)_OjJ3k2M JHn׮\s뙲eחOHC^!P< `:IHHH Џ+ʕ=\iѼMBEix:ҋe˦H'Jӏ?;Ѥt?=!8"@, I!   %nl߹[=]\7tάʶ[@)VS Tzf*%a_N&Yo"ul7 x0/H$@$@$@p煷{ϐzureXL&F\\9NSl,}yW4W%Ą#@,ړ `N=oKH{KZ%||T2eWҾg<9yŶ^x$#@, %  HL{͖P~o0)2vҪeSk=*G[ d?rzGNE,RfDE$@HHH⅀n9׌<=ݗ}:}h/%m"cn?칲kw= ѐ@%t @0N^,oxVڝY=՜Uο+jP ;) _\L1tW޵8yeV D ($+]/7&2rг~:vݗ*gQ4îR˜kv9`ZZK<"|mS|s=X*`! xڥȮ=2KϓvG,ULLܺLمdz}Grll% $T;/S#?Mz)yUD0(r˝sdMILi/KB    ؑlne_$H2hPi%X\aǬlIM-'yl}<Ҡn 0vTjQҐ@<4 @!?2e"ȤYcT撕)QD*a=XZrѠ~y?2ǥZJ2Z,xFA    p+ғȠk't2j>hmr>̽+aS5\yώ2YvܵW/婄o0 P @l `!F{`rǤ}嬳{J*d=MinG̨ߞ=Ҵi#~ lUӵ)/+^q/#%O1ƚX'   @:{"i5dгqzV(U*^W˝x{A& ؀QFFlTn2w2rm;k/5 60ʬqOC%M XIg|$@$@$@$PkM2"?#Μ}e}ŝ"QjW^޴bVUyh/wҾm+6]ZgPDC ^Ʃ'w HHH$Hfsȃs^Ls3]*aq'I *` Y ,sl~ 7wsyo},5CaLץr衭$  ؾ\+>,30WN0gIR2UړI%,|%T @4ׂ?3Ͽ"9D:t8\mVb JX9 X{{ ̔ΣYa3#;wgP +& 6wAe;  ""&H n`y]ӵecQɐisv80|6BP`3YaBƙ6gM;*c ʗ;be˷E#@hHHHJ|3-JNlN<̜1kr ZT#v`q+Sl΁#-Ya_wL5Ϸ\?SRSʵWreRE[.%)   1ߔB_"j"'9qr"z %y&2f i{rˣOjp[ԛ(iH E&" $%oSmH |ՏrΕ߬"8AX6S=|d)k e<5e0Mm`GLsVؑ\bޥșCEKRhH@ P;PO$@$@$@E oo7y,a7z33|3RyH6B6[{\"k6ɐo_e4,T1D$@,Ky" b$bˠ@N^{Զdʈ/ΐ RA S#8#Ea\eY6S>> 2飯gʪ5[JX\m=U\L, ĞWzcO) 0Rڬʑf(\~reM[K9K!}h&d 1ep9=RU)WI:5WJr) LK xLci'vٻy1Hz5_6Z]+@ ۳'Sխ!#'l{&ϒjdR+U HӐ@a P+,1' $'fUpvs#bI $L],L.pToZfL.MՕ]Y=V^BfރrkiT5HS>G*U*/sTZJ5L,Ji  ldRcB(`YYbcSJ;}th*&U^ UQx,/`¨edˍB!'=(7XUh׌NIٯccerKͨHH Q $@[+Q{n߸Yn2;Q}_㤣),mbwFHo mVR%~ݚ2uf}X9kd%V 3x$c=D/aHHH tÝf7{Mu5ߞ6]ާz%Hwƾȇê5np{hM8Kvub7_wԩUݎ@ȩyH   /'/3̑s##'.{v7=3-L)U]J$+gunSw>b׆M7c)F|^;^']M$@$@$lCܯ\_\5Aiu\GdmrF[$-ʸʭar j651c6mME "@,ڑ @"u*tLJ+3jk4>R;[4rh>oP kJl`XO%UVLyQʭ7Β~G=*_9M \ j@   ZatQ)ݺ@A E'<1EO@lPn8.Jn挗'*/*nPJ\SBD X"&B$@1"40ZvS ޶cqӲr+~$QiRZ# +Q(&TIsLfhJf\|<%OY3$@$@$@LN;3'fK]᧛%ȯ)AQuka++W]~^R% g>Q^{&*gLuk0$*`S) j};?|,~c+Ηe}jgq01<#.f *b.ǧ{Xx % J;LS:;/(Ҽ\py7lV`tyT<_ ,6BJ6Km`c4a^g}do7ʵϗ |ʗMtSмLt:wT<\vy^}V c4O X1sH$@Q%Pi8QM#&Xa yW̦ [&m6[(%+~aCbͅ{_t:!̹AR.t<8gdde7V^CKŴ ;? V^M~H]F.+իz*b 4 *dRzPA7[K0\5m>,\/.}N;ў-cG Yt^dTIH 9 jKN:u<@s ]ߴAصG5*Crj912=Hz;Za6L7/Nk⛂w\lVRɮKo\W^=[s2zqiҰ0 CK !@3Eń ojʳ^keY L;[߮rѹC2 :6:xav@b:\9ˆVUWX 84oPL>~/Iw*+BIf1ҡE+JBqHHp~-/&#JiQǕkd ˗|dQ[.=m{P@tMzMpیH*Bݾ̾g<ۥi(lr=㑇HIw:H a"@:gH1OEdP1e@MI'o|wF) ! "s/<\}Snӌv o<4C6eݣ售GI 1 M|mƱ

툁 hDhG{`S )SO9(|23e[]O~ y[(cm۱J#r#% ?0MBe-r 7ȗ_~)UPi(QE"FUԭ[7}oƍ2h ֭\{Rzu)WڵK^}UOo}&9DnVݻ)SƦw2i$B/TӍҐ ?|aѴ!| &o##]V˾)/=qH2nһ{g9ʌ nf~muS2W7?}XL|"b;%UJ*E츣1P.'_|hVOz\:k)G\Huj*vK\,o0[c.)Ӽ-0LjQJJmV1J 0<èeO6϶B{}Tg3J5yd۬;U|W iEx['HG}$uՓӧ˯*3f̐Yf?/ҬY3i.GqU4^{^IH5tL#(g^+}nټyL7Ms޷ {vaf %lnsGhNZp,S+76~7_ګ:UӁ>' `ݘ4?,w oUܴ#בI 7 wzu]}0 1o7׾"P``7Y-5&\Ʊ?ֵmֿϺO/ h~q_ؘ:ިDMvw7?/?E|S.WCZX(e-YzCW_jUU*K25dyR~R1ΠJ(knU#b0( TooWVV(*6U~')[l {naTX1ClRtb*UHxiG7=Ѽ^ӊ{M#iHH ue` &`M- k eku6Yfd?A?_c4C[1ˑmfnu'ۼ4m kL{C~ _rYVSNs} ~֨\@:„?^Igu/5pUմt#$ B{1( Z;i^vpQ_Խ /v\NoK yCoCpꭶ}Uhݺ969y&Yn|j-ZJ̑L =֕COj"tj!-7ƍIcstU\IUd3*QtWy WyYMHR[N^{5Yl4ib S~v ŋeڵѩ]کzcW^yŎHp 6άM6IZZ:蠃@-T Q6.L*^{ `J$&.]TvnP iHH|*eO5FFF`}VFgg|VVdfe,A%knٸylsVYa,wM"kJБ}Av=W捥u|pS8>^7U1Y^^6 jtHK ä.\L{)\˔++)e̟qLyV|Tib]0aś[CySZ>>#>i JRg.so7폿Ques;ƅtJҲI 9imIoXӴI):K5isc`K{*W`TSΐxc3JC>00ӌ"a 'l]|2l00a@т23w-O23,0UXN>Vy2Cz_?M \x 2 lQLb6=/b +H&uijYqȖn7o?SRki"M^5\>ms$̏+K0x_aLΝ; VF-} N'NݻGmGP1c}NR`9SbQ~C&Zr??30Ǝ+3gΔ6mڸ}&/ (k֬~w`|&  O AO|FxkqaQ'XS573 Ѭcb.Crc6-fLE4kKBkyдc'ga&Ffv2f;vXgPB{v[zLmF-t{i@Vi7ojJ>J$@$@$?өomQ mҘ^gF`|6kFFWN"MϾo;` ӄ8/&8m?auݹ{Uwzu߹/[_~^ֽϯ@?Ae{ᆻv_({Q)(BopSA"SL +jذ=#\؀o9huA1n18ڱFɺlҁ a 쒈Y'xb ~h(3>#>ā-;ud!^M7ʠA{예a$ =cSPS0g?3+;IH ?07Us Wnuʏ )ԫPv{uݹus z_T5~­{_]~Bt^n?އr_P~`_p>h@D j׿(k8cxF0:zy(o pGC$"QIDAT@$ GB$@$"RÂE SUɁBE W(Cn[!=ʗ[če)n8 p׶m/nڴI/_n VHHHHH@ (A0:ʥ8UwGn2=&w4ßkw1a`ܹs)f4MÅB`4\M#‚b =. [ZZZ?$@$@E"5`EFO$@$@IH b lT{9;&;U4<Uڃ{l0}J~/hA$@$1NA $9B)`fe)$(T0xQ1$!  _>9\ @L P)~FN$@$@$@$@$L%Si3$@$@$@$@$@1%@,9 @2Lͼ Ĕg$@$@$@$@$@D X26J$@Q ̯PvQA @pE +*`Z2L )P.3Y$@$@$STb $*`T+ @L P)~FN$@$@$@$@$L%Si3$@$@$@$@$@1%@,9 @2Lͼ Ĕg$@$@$@$@$@D X26J$@Q / a0  HVTo ("\DpF$@$@0 *`%ѐ 0 *`%ѐ 0 *`%ѐ @"\ @4 P&ME$@IJ['i3$@$@&@HHHHHF XѸ B#     (*`EF_$@$@$@$@$@$PhT HHHHHHh} 8 $@$@$*`+  p8 P @ VB P @ VB P @ VB P @ VB P @ VB $ }HHb@ X 3J 2R^N~7Nz%}]vW2A uɼyW_ɓ'K͚5eN4޵.Adҭ[79sdΝ6K4Z,X@}Y;VZSP#@o`ڪnEw ^x0u xKʙF"1X%ռQ @qISbE+$ժU 'JޘZсwPRP##bULaf𝁌@V`Xİ08jȅ%VR%Sˤł]>cF0 rKt >T "dޫE2k>8g?FJaުYa3zͣ7wร\?kB٫^mע _{ d4dxAv{OaÅ^_<Ͽ N(;}$#ZFӫ?\9x]:&O]=1]8{׏ ?)o OpZ\ 3CQѼ@}wH5MѸj|zu„i&v%=L]}=\D8{7Hܨpn]{^ǵq |o݁%aRP<{׫Pvw~v .7>?Y?PP9 _gYv^7}`?xv6ܵ wEyO8{7mF;ܫ^]{<dpyƀ ڪݨϐ >WLDcX WlłV!$d-[Jz | 6IFZg.T!%X CIFgKvnРϡcrzBmrp,h׮(so֣7mng~o J/ *SDK9,}|ؕk`,1n].]ذrx-_|`ssl_yr7XQWˊHk8@Fg?r)!IH9Nt^оcg]cǾcvw֭wEtP@gRnzv [1ݱcGiG8A/0b!eYlRv~ԯ_ C]>#rV:(9CKL*._<3#۷k׮L}:pP0׍՛\ @2& uֵ\P|ᇶ.A}=X;obپ}|7ҬY@S6n(_ 2rG!(xM0FqZG`Ap9`k>,uO|:SfB¶?w2rHl I~iSڃ1{~QQjoxw>z_]w%P:wlυ>}^~h ':o '|6ҬP2a@ _z%yM6vW_}U^6v0Pe?Zy¡?}'۶m~XX|ӄ 8b^rqw-P>ظ5|1c?q0Z?糷6I֪Urٻ'[y6èKvi" #[K,߉E_5Bɉ[;V6'O?TN?xK8PdlZI&è F5*ٳg=O[ƌc1l)n#]ty+R0` u(Lh(?}Yge '|mCfaApB6Fp.`}QmõE\ٚ3gC{C3Ȣ /` @53p #ZϨeQR 6 %.55Zp-  F }AOpLfff5x)#X m_HЃ} 'ȤI"XZT^=ƩD٣@5G+ȗ ~xm/N2q8'NvPĈ]>1 @/v΍+[-Iq6h a .4Wl ]A%Pa:%n{U@ ʢVxpƒk233ڟN WLO> a:iU(ίW+NPyAJk͚5 u&! S}WBqo¬Q@&Bh4U͆Ph(d%TC#*/Y_ڵeĈvZaCn3ABF' K.Au ꤡCY:~5_K(7b8D`(AQ9A/rsLjzЋ^K4]g4/,_|a7O2L߿]h Th= npv 4>xƘhZ p۷]{|ЀFc:===0^CFiӦ6_XhG6eTi\Q 6w\[A=z2\N.XQy98M2Lu(ؤ us-o[F'j 'jT;؜Ah<%IEtrSA͛Us &1 N@}zBݜb]yiB%h@Щ)Gֈq(&%rWD3zhX )*5b !iŲ4bhfB'Fa9SK$gt 1Jr7 6׀4n>C~5EC#[]`b+Xl.bO@isQ˗/;bjY׮]CG s{L֘ݧOACٰ<UqAᣝ1hLae˖Yӟ*Ap6ςb-mk9 i}ocwzg-4@N-6љ0*x2!c"tai]vU>^e$,|x  e^azJuf?pbbvm^F A 7|6;zPD F4p?(*wH?&?-Zd9Cn$֬Yr]w٩Ϩc0u:8}/mxY֙Bo8~8PSӛ!SPo%8^if Ζ@v.)daĹs*|SK#0;<3eȐ!gr?й(={1YFJOa G Qj6üٲyhnQ0wSL!Ao7QiejDcyŊv4ra̭~0LXoCvwύ4$LrxPf@G #|1 匳z02重5 8 ֎@$ vXD [&fLr-ںF XH1 +>v&l\4:؇~-I@e ͱ+'Wzu$r9U?F s}kZ(9Q%L>1GZ%{Wx~nxM PeʉW Xb,sA$@$@$@$@$܆$ $*`Q P@!1$@$@$@$@$@A Xb#sA$@$@$@$@$Tsg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o pHYs  YiTXtXML:com.adobe.xmp 1 L'Y@IDATxy,}I)ʤE:ZX$q(!@ 1! 0b(DlX$HǰDɲlPC8C93Y{wTWUWwW]zvUw>g;ԩRGA$@$@$@$@$@$0sHHHHHH0     *`shHHHHHH  ̉9f4$@$@$@$@$@$@eHHHHHD ؜@3     NkR*\.7 K%U"ֶ B# d೐%)" }OΓDr\,$@ P҇Xbh#_Db| *221iKDۂu< dGe. C Zׅ @X o<套^zJ~i!eXύސ$`*Mك/$:T*k')[lẒ {...d}}=ө0ӵauhZܕ*UV[m)MeU֢<8ۡW Hץr Š$@$P()`~ RH`$VYϲuu6nfeliqCu Sն,Zs8:Kޯ&H N&|;E_{;I60Z ra{tm{g`שsmJe6S~$;Hq8R Tѐ O X!D]0rH Rs(E"[fu|/"ڹmcˍHH vUw˵o{-Id1a+@ d"@$@HJ7/"TXNAT4y3sR @c)Z< 3d@,Kc-}]Q*P˒s&S8zc$@$0[J`j ,XiT(,$KS"Xnl!HҤ   bHJ7  ,&Ez \A39{ zUv0=OhaΙ薕d3`Ɋ(7 +]>>`́>phL9%`Yٺ_ *zlFH`00.AL$@$cݾY!-p8mH`4~kfTм;IF'06z|#m]mЙtuwl/H\B$0#]}{5IT e 78,[wrrP ^~Ay"jl+Й` ̥&@,3#x @zG)4)0:&V*U[ͦWwdƾM3,X.nٓEif1 $0!*`\:QGߑSI*bۻzY_aK*`Ls L#Xjg#FD$@ >AEg.&z&s`1r( A9&@,Ǚ3 Ѡ\+e9=8+{BZ5mllϾ*??SvuagI$01 ݩ82xbM)oIaDž݄&[cNH.]C%i4jFseGyy]Яޯ >XY ¡dI` &3t@28Yrrb\61©J1VďAWvG|x& ij]ٕgd;Hx*Uy_ߥam8)b_lҮX=eǔŽeux1%$\?$i#1 LuEƌI3[-yCZQ蜶t">łC7Ց^oʥkO4.2K7 HWx}ߍ$_*kF֜rK=!LcE8X֒}|z|ut >~ۤvֳ\rՀT*tuXn ϔUOr/^{w˕JKy'0QK DuTaP=@[0Í;^ 䐀\DeBSKHr`Tġ 0*`+Hr/04-,RLYK~GnɃU,me@H &S8mL_5L΄=|r$n [E6@Dd])`cfyѡ]Q L]rK(aG}qܑv[7PfUJ_ٹv925jg.og;saZ ꎯ9aaހg \ #r{ ey[ ma+.W+w^?02X L9!@,'A1HH`o?g˒'r챩WuÍX ̏fk  %WOM!*g96?M آs @nXvʚ'N*Z5ꪔj l. @SS-H⒈ٰ6 j=ot[-4M{2HUuM(&*`wH` DgT9:0_fˑ0vqVsw൬[Q}[:؋KH$@e|nUFgD$b2M$@$]w7l끴%G?~HEoj0ㅙ7z ӀH &qLqH# r@$0Sx>Sĩ_Z^w/#KX^@+K?B\zY1bSQ! p)=1Mή5H I XIJ c{>0,7\- Dl+1s'SY0ѿas᳄H`!&Y=Ý I%#%"@lҒ @&6u'BnZ}A7uwV=L0J l"‹`I`S ޿ґiFVQ$$PXQiw3~iN!@8y͔ @ս6y @_Qhw\es/@1p b1$ @dH$0R^ϦtF^5a0] m5 P[|eHH`v|͎mQBK qW(z&X.A\EF^-RM$0OԝIq@)^3ţ ̖Gw<]Ѱ=u+ MMS K 'ƄgR ٯ1լ7!GY Mvk{ZnClG!.*`~'z`{wWժ6m.5 (}M&E P?g_{\QYc݌B X^rbFrܹ'X1.VoomHX)kg$%>ؘٯ"•Ms\Wਬ٠j[_z's P[\KW QEKK:+j4&{W/K4mQ0I$@ $DS"H*%Z4: D||}jGX@7ps` )hCL˓!ߔ+ņMMZjjъ&H`(} [s* L40;jT>Gq c\uKCx/ ^BR*' "9m7dO>*;檴-++RoK}Ǵ)ð!_ L @*i/>oI2VuYU{FgH`P[ Erri[d H.$\}O)b=cc'@iJ)D22)F 4G}# =@-ABe7hڏvНBCcnk;e0{SL;t)iD$0:wjBvZ렶 <3Kk^qHc QP֒ڴfu7d!_\OC$}/>Z&-s+ W P"کc8,c0$@c6&8z# ENPs /sҪ7VZm۠xTJ 5*7I.ZQ&_}[|: #?gekw'\ $@!M89d$<)P$.N" UZk깩}.=wn]٣n,"{,¤6h ʾ]vBX+q,Ltv40L @uYɬf-/'^߼+7.Ku}]"" 7#Q2}͆ NkRJP{}1ϵ]EF1} ">N$ދ~]gZ ձJ 0Xwm)W.rLf%zkݖ.Mk(\|aS `rC}QH&]Z >(Jz44a9 5Y% "^xI1R3͈.z킱]r` XjÐl}Ӕ G`2p,t, @ؑ @~fv@U gt><G |p]dNHd FRx,-Y^zQ$07鲭VӁeDj;fq#yinhc#4;XY)`+ c[Y|f*.|5W}(l+vbnơ{ker,W"dg+D%"dbAP1"c14zY)TV*; !#ӬoHB\v^x׫,u݆a.S_= ~V&c(SI<[`d KL g^?ѳ6lY$@ P-3 Qwժݫș΂~yv]' 0( dNws"bN3XmTV0bS$j6t;x﫬KlXL]C( , 4h)( ̄`]lT˟ hwVҨv[)3b$PL=ղ(jX Yҹ@aXTI`$2o-FD$@S&6>l+L6Rvk+p60$0@Fq;(ڑ @$"dI QFYϝNmc{m}XJSyIF#+冭gt F::$I&Rb02[|.s/nl'k!Sdܼ'<\X mN$B#Om6G~ iHn6ݻ z⾣38R>Ʃni Tm*8Cb@$xH Xs}i4Rm9@oPvmmK[j?'n|v"2*XYDSLސ7ꇦM3̆A!Y1?qͶDO&lb݊7YEx10lAK(*`D0X@N-׷~S~NBG"rW(?H2F'$@Hq(aV,,AGo~ڂnIGW ??:G?x/XisaE:'*ahJQT4 v=FR#;R^u)+C .ǷfY0L. ,L}StUZ+e5o}G~̵ Pؒ K} ֒|ɫuEܽ } R)U/;- mAG)}m8 @!Ps*խxݫ`QcU~LLXG$cPd[tP2jdHYg V~*EFalÓpuIkN/h0ռhl_$mtC:{xsڃ޲ٱ6h4.h:cԇ'[nI#C=ٳ̷fSJ9dȁL~@\^}yےnօfus]yqy2hG\_aI`2,iZj0;j3]¡-g?# D`PfqFII7%'ͩ8My7PCv?'):*i& ~0[v~x"MC%-V$w=NoW` wz}r}}r}XܡIF{9*`3 ґ~mFtN8£z[}h086ͻJBB 襖Jݣ>[]'ɛGv a:!䯮_eZY@gmYd$\A>Z@vN><_GnjI]ɦ\{"tʗsؽ/Y΃"et+ ^Qf'D#lkM_[;]aPںC*1tf~_/ EvI4  FMݧopmo Z f80!$@lڅk0}c RYֶֻNF[NNLʆPDU5){E唳F`?ZbBF6,!-IfVȣ3h찍L$d0 FVq"[iʄ'$6ke ճ7 &M@ Pr@*RqS~3{tMXwi|]ؐmlrjXe5/5=on--5YKgSNI\FG۸zI%i% "c#g5EG/jwEIVvV vm}f W(g e!V}曞K02T~wb#4Gw7o;QXzY bCpfG6v\00k+l6*$a$&Sb);w!&Y,yE[ww^ץ[^g5=:҅{ұ._e=+^e9g'<r81p eN9'`賗#ZBT/70s3PY΋rB)҈I`2,"3 *hAquuus}.7jٽ~MX6,UEՑ뻲o`;V%G^tsO9#$QZ&eT.iGqQϘ%7$ԙ,nVEKI "M{틦4}P+ |bf> LJ`x]"]ϟ{Lh"#8 }'̋|9SVd#,-? #@}sc\;Xzo~_ӊV@^M3Z&bH`ekz/ ϡސ@n LA Qxd#9y}ieLˤ2 Y? fR)Tgm UٹRcRlm}M6vǛ;  -Ћv 'L> ,Yk@oɞ慾[]ξrVJ)6ڢ[ޯs_5V %G}Hh}}x9tμ[hy,)^kƑop…z7*kIARVZY[ߪ/ hd Xlb5)Ko)OЎ~k]59;?fݖi4 ,œVz ,#a+WeiYv.}|1NkBtbaH.+Y0qy~ " ?Go?(e] fRHݐJ%SԢwo 4!EL+@$bU\6҂Z_٨J5ٹqE+ΊeFdˡ٭/Of>/Li+a53`^жJV[tV`ksW\vmŴlFV-!)/$mH`:&S#CCtvSj1aYeؑpm  GFM|?kɍK,khi^Hv@n ;x &%rmM>~n'9㞼 7,mF`p%smro/xet*c1 o"%b#m XI[QV2űDņUpRUP &qL7m!RYES>j'm(@`2,)X h*$h'ʵ~z􋖰onW{QNF[6.u.[5c;  ̙uY[ށZVc-Sާlʺw]&7lx~{OYy@}Ag2< BkJI O렜z@+6H M#gj, 4j:cupu- F3#=<|-ٽqٖˢb>uU!k#\c6^cz "e))fV92Sm[(+A Jd$W W$aLƪ@Ae"WyL.=yݾՅZpHZX:3G P8Ճ|䍽[pqä ̍ ڴ-?FcA6hۮcՌ/I汚t:0"=nN+,q ,_tli X_D;Li Q:Sx˽5D0yq2shS"\Olw@v Ɖ~N P@nyP>cuҥ6#L6v݄vO 33+9 iD6S" 6j[sdD6\;̰X&cI ;lXZfk#Qlg3 YBPJR]#]|u_k&néɹx@)A%3< 9$aA$@$0hou콄.GMƘ!}F gؒdE7]/R! ̎d bs 9D9h@.̪FM.|tpv?C FGflD6B39լ7ڨY9~lo{^nn3]Ҹ>&LV[%z5ns_Tٵ 0exM鍆k*`8RJJHƯ9Qҕ\"PR= *O]kjlCQ_U{Fz…cuiOZͦ2-e9{t, ֆ-GeR][χ8(ڊL[d}\ aHk'jxc5Eq2]Eƹ7lq!4I݆'A+4ʒcic%a>Xf`JVnCw#NaH[ ~7?eaѬqv!|&θ# Lr9E^]dѷ< p1D| 5K ºnCFS=6a*w-=ta>CH F%$/V)Ǯ|<]jZ_zG/[y֐』Uw%6A0^[li{:[8)Jޑ}/ ̙d ؜etVaQi>{긊TYϰhۋnG'5p"C6 Z7a3&贏hvm: vD颅"evFoOgXCl;,ǡXNy?u%;k؉J{y  ,0Nu䣍fiE+gY+)\hS]v-kƠlk7ށބyg!H*+|U}xP&S_˩?f4JE F{M@_u_8̧arN;~Bt_bhL`%CY PSRd7NSPa-ECF='Ҽ@' UdSn<hX#No[%7bQ IޭV%nW(V9mj=Pva;h(o[x)EØbDF ^EL\d5XM $ eQO@U8 .)$ E;_/-{yHK0%AeRċSپ|UCꇥ#T~}g_~E֯h]Tw7_3_?n&g*V7C=W)ޗdsʙn%l롢2qtccԮu)80 ,X?C@2ǟ]PΟ-]x }];mVDZհr ؆ECy41f! sLI/4O0,>\^2  9v14g>aE)qH`T|Џ'v%Ggn,ra'ollm;Lgƪ;zpO֯lkG8҆F#-+,;>pٌ>,Y󎺭;yN/Er3xp]{z! @IDATB HFKJPגEuC$x]|'@,"ttETkKۗ fi${ڥ]..N.k~.j댂.үkɐ TbF.E#?._9A;fK?kT74&\@3JhʙDqڹ`5thD ,ERzwbn7T ptTBfh*vxҝGObdu-dL;\g {v wCsay ;gpH"}7H+遙Gk @XG.iisRIxcLoby<Әx&(3y `]h2S`ԯ> JRH_?vACܥF,BfȠhGXZ H'Rfkvdsh1Yr.}+:n-{r~V4f}`l`DҦ&W/+;/Oȋh7pã@[ԶyʹW4\lY+90w.NjږV=K+3(7D$ S ;GAix3wwk/Ëx&pTfcn2`gxPhy콘φ~"Tr{ZS>M@`@xї׶.y] vҊzswEk'NC"i"AFp]89K1VRT^s7_.-)g1>޼mF2aSkrC?nb3 Y3Ns gd~NvOiaIl }c ;kuұka[?Cڃ'(K9qFDϸ^ɋȂ=BmXq7Ip« ͇܄~b!{ !o(w+!z+⯃s$B Mzݾ/_WH1KCcwEy̜ftq EBߺ-_?L8k3]Q0gOv>:&X!20+W29ֻhŠoe" K/pq`[uܥ a/gCsa#!eqpѮYуoKPh{gaO .nzA Hm3~,,\߹urkp44uk\*O/|Ѝ2kf5sٻqF6#щtsЏe&Ⱥ@Np#`18& Å`h#((?#lQ5sm{ A~yW6toKW`0]^;6C7 "1 *|^jZQ7 P߾>ɇH1;0qEB ]9>Li٥ vmQ׃0mkg||cf L_8y0d-28ίF@vnw3i;xɦ2cu(b!  E.;W.Q^jYT[=)5 %jEE' t~v\*m Ȁv޷\2k_OymTuv0 .K]4.Qx궿v@ Ĥf[G9qיy->+MȎ~,T9L.S5^f^ك@aUݯ.'\ oح7d#6h|mD\WK66鉔/_Smp†?5 ČM$3J{w+vj!b>L%}<ͷNA},DJLs`3;:{{jYB `UHhnJ =MG{bm V˅rVv~\mS0R> {9RWa*>paQYvF H\hCaBG*ѳA=:5.[F:9øT֖]Xq83iJh 9c2P54&8M3ٵaqi>ol" 3ÆIj[4yڙ7kxOG}s x^ )`xgPhIÙx<)Oixs!WHneyS0fMh ۛc >x"j:V-m$p@Υ^kP+3ǶkQT<Pۍ`{uٛ m}\qa= v[bꦹ۸01҄G]J &C}\H_HxeZOHSymr߆^%W['u@#c(`ƅ`@c"TJei }8}_kqyFi4{Hސw|#(?^%<PG v>v8J/}{Qk-NZ.0V ]q嘼ږuuY8ʠ~#r-y ~u [":޿ O 䂝 *py`k02iv½V<exQ;WT.!< 9G;u>p`M7ju9xNo\j|vTs'f 6~:we(t"lV½oɭ|MneQguM㹖}Eץn" Bv9{ eʻ:gUxUcET-};< OvV4{_W.χi̹ 4ҽuɘVWoqiG ҥ=X;dΪDi}uw7‡?RP 0IFCߓf ~,&R0R>rqqa&y4u*@U?@e;\#>r[/]:΢v[ܗ~En)i\Q/SBtňɋ<>뮆pqihNo&6ݵSU;8i/]x!ɮgr: ^4.4sWWXc8j\^籚mø}\GC!.8nvyN깯jXePć {`ഥ6 i TU\e!?zD]}p,`$MOV!g࿢,-_%ٻr<%ʧy ~e!C^Ep{C/ȏȇ?0ӅbT@uV3 00a#;ܣo>ủB)?}xhK0;+===8l{mA~Љ{`~tvXe*msޅԽ|i!)gZZ;^CG6㲹a_(Mu @QM^;z\Օ˒<j̃Dξ]hh=I-g*_%97I~L0nL<35 u퇲{+.n2#hFyys_: .݉,'EށHDzkhyG]Ų5+~43-(ߨ[ڶ򉲎b3VW1tjPuU.`_U-?c킮^ץؐߖcF몦L&,멫*v"Ovےh4/uU햵7 OA!BϕǎqrC?iȁ0[gIV|KZnl`:byv āLL IJHڷe\ɟIy1}/QIsiltmPGgR R#_,'茑|Pˇc0<k8j ‹fQ+*,t$$w;Cԛ_a\0>Zg)q9O Hv@x|/ (;a|@r~,O4MNuustG>q㆓-%~e~My׺˶R"]GL͢yTQ71>1؃5}KFA0McP ˓,rdqg],ia1(A &KqWa;R*K:~r&W4i7 <.ړhn~Ts.R@ Y<.&C u0r'( ̎@^_^]N0dֿ䅗dl  C7ڡt#+kFYA>f.O4>5T ?.zu;λ4f\3s4aa&rQNL80X08]8ޝs)[?#ެ'hi#i}xab2BN>3yoV)`"~Ig;!лW< 1&Ʃ`d $@$@$@%Kl ̇@󉗱 @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"0tn +5'\! e&0C_EyMo3 @A D2 / v Z lH?/o]H- @LUUU(hL, @/"EE ޖ$$ &R_7Z >DBA`bIb킾8 *RV    4%ڪ:jk LqktA$@$@$@9#` '&s+gU L*HHHB@gjG'R?;TW<պ|}{Sw## ,/N#rIZ=W~ ۲#fK1_.K&WI_V{qy|    9K_%fjg!;W.Ia XEw>iљ[mUԹ2g9 *`L L& ]nجVI6^LLP9"z *`,$@$@$@$PpÖDU:m(dE8*Eis&[t98vm@Q/GeiMyoɃCvu>*ݕw?!O|{̭3IK$aVy.4"!`E%h$PTTh 8[kuy7r#eɝ=:ǿRֳ\nPR =(p` K~k0˃H$1tmkSwwe[zn6MϪ\IJ mgJtڭ}(zL6h+/* N qHsm7 Uo0ËkXvT=ǕRڡj^DPR:aK$@'oav!/֧qr.uYmJYj];c@.M>Z`5Fe,pfVhp"wU6/h[-K_Pqv!w=97K9#aX^u?\j[ *I6@=w _{u<mѠmc|lloYG{&$@!Qk{.EIJ’nՎOmTyߑg>/&+ ̏@ D"P 1Fc;B00Jڪ{ߺ/eF Xr$G6~7sr#eݪy^vSn*`9FBRcaKw?wi)f.Njz"2J;*`yϡgm+e>1R N6!X>^<$0GPR{!/dM=L/鷾0˃H N XﴡtXNү$%򈵧&1SF"b],KZ_yJh K$0ڃU8;lZ_:ۙ@I` P[ N[ʺ[+i{1z ڨyh[ʦh=X~QL)r(g:I&!OSlƮ1ڗxc$Q/ *`+%]1Lblwu;]ʖ~X d%.~VRsr!n6܋L$TU&R ~#έ旾D0#@lvl.d(^njږn)k6Рmft$P0] s<0{7\FN֌b7G$q KB@Z8pFWdi>ZK\ _eYUh6fİѱ~۟|yFKAû嫟x־i˙Bs}/ P] @n @a Dvw0lںx܂`$@S%vZ2gmS)y[eDG$L]پrI0P3`&ՎN"_˔*J$0OP`[/l1M6 GB۔kQSXETV WҀ#^NmnI-#Зjh@!`H`g w{QݫВ$0 YB>l1k_em  d ؠ)bsKȢ}x뎼m{Xc?f/ʖ?f?P[Q/Ub!(wYQ{< w\D!`0\ī>^5fn;[ k{zR"KdFp$&S8RiNޑO]kl"vxllnE1(`mPG˔"ɨ2MG+G]|eiZ~ͺwB=5W(r`aj n+ ~f7ߑvFQ]_S7:PX7ki ,eH m-Y"f]êz1uiWv]wBÈiԱ`ShCKH .huluLuMj_ ɐ'łF%< `v)RuuO.i\W-ihe5+UlPh 7v2d(.0޼SӉ Fo*_Nf`t0JL̆uo|äͪC* r7k".FƂd9tz($΀.۵m'(/(WۺUniݒGݑ;%ڵЬP 4.!@aL[At~|& ;;0V֫R;|Xf\S}$x3"HsfhH":iA|X|qV.ᦺ&{;nkzрH`:.qcQG^@z=7D+eexKG E?#iKOǑ=t;L)]RYQѱ:;}꫔,҃%x g}}C\}qdVAxP[\s#V}0Pd5ݑQ09zYB/;R6Xڒ@ ('Sz0Us9~u>:pxuu'#hhRۧbgSO%0y'WY MH e'!O-Mi0)'UٕSyE6=Mau Mj\TfIwa*WΜUin8q33Os9 ^4!-TH"9YW#Vq@9~M+,S fg>qm55KPxL@tctvGp:00 \2=Pv[ꁙ Sx=I3&ѐN''C0&wO<ȅ0/H.+/s6@ǃHH o}[#dV4|*)rbj2l4lq(6y"M9l23Xf# },3~l6|Y8W_CBq]|S[$ nLP|PF_ѭmUʺᩴ-)>Z jU~a4?r: @~D({Ÿ!{OZ ScV͜6t)u C&Zt|M͹ 30$"@z@a3^B!f#èV&-Z>Ν3_Woo_z(?m_|QݖĐ՘>e(Wh`㨶yxPJ#}+nxgA 6E})DLЉf\nj6گ7}=}__ /\S9}iә6j~7Hrr3aD]n4 u ,A1ԙrضuv{pZg(L555e>泟xb(>!;;fuu y38 S,ҳ1j!]w~5hM͗LDD 4# UČ$D47YHT- ;NG?Qsesυ[^^6{*q3l-Ԫ-+53#(_)pnIiiqL^^ s8XIU)Y5 pЅVm>S5? r7Igj3.Vxrw}ϙɹs|(h@֢^%/JWJȤ<Bzy;&}y/WI:`!A`̪B&:v9YRM:,27rBAY͋phH?pw "KFQ)3C'ַwEl1/ȩE" vOz8h~Q>nВ"A )1.#PԄ䊑c_rx`)tʁ$YLYJd!UB@'!Bj|A~P*נ%N"#0׺A ̈`(kt 'Mike FG G EZ琄RO?m>O__҉* ;_+`L"Pq2%W`J,DJ-b61 ĚUn?p#w㕋j+wb<,Væg-'8՛a)D RLHLxe֌ B/\]Sp:\bQo1S7&&tܠNx^%ߑ̜V+;v?vešh9 \:`Y >960b#7ݭN~ đ}͹g-V]3y'>"TE喂 " _i**@ }ULul* b̀˯IxHFhEl7sf|Vfq1ѮﮁA޼82l564fU(ﯽ[U/̘%3 {Ujfg}4eBX*H)al54DP@0 MMo#.\E0CkCֶy<{98f?1>mvuc|8|U3/h 37IbS&&͡l?MMc=Yڑ$gJItVRJ`aRrh؍ wTfe ƼmƌaR&j1?=e./3 A,))$&)@;B<`#*$D 3]BAqmO+&U4f06Z8C;]Vmk_ww@IDAT6%P ?`MK,/+p(f-' vY}.n/+nj _~5b^D"o TЎ6QLFt K3ϝ[Ɔfeg0`p @竄vE䎲-M ޕZjdWԂ_Y֭xt*mI # tA}U8 v怅hWՔ}5D?wC!j^.2(pO"y4 oشΓiD`h4qW:WUj\߯ɹfr~V&ĆVRYL:F8mgk_9`U='D 8-(uQӋ.Xᝐoŷ^S뼛gdc:=! )SM+ XeA{V*dv@o&q]nQ~geel#(0x'N"r͓%߅U "aF!CD -SEd #-3hf3r;l=$4M̊kؙ4 ;Hd)wNظhvx>7)*3C0=(U|JdO++m"M˒BGP[*MMW.'!=t;.Rw f5g>r7 |;Jח0ZJgX@ z-R\nkAD`pqdС/6˨P!CQv@Qk| ZT>ZX I*.) #0\:/܅ ♓YJsF^j^z%Oя~vm ϡ<7홟0ym@ L_Saie`;kcfwn?|3bZn۬N+My gB#k 鐽AR)adgDw<;U"PqH]t U ,ūf&ko;1x`@%Vv!b`0Ν3a/˿4't~s3ͣ>j6q0E) id0мHj~s<=lWus>`҇Ktdټ R!BmL,9ڸC8>ಣTl ?`eËa0*=*LL'(G,]̳Hp=av&+8^E Aѣ.E@׾7Mo2>q377g&''͟ɟn4{13}E2t@ 0'W~̓O>i^ש(=YZZ2w}޻gNaL:xh|P G0˃xE.A41id踩ٙBh[s}KHE,~iVFE`"&k;,^@Jspƥ`kLOq#?Q0h`S#(YC7Qo/yG̻.wts&E؍Qvp<._XXW /ny= )(6IeHCVU/(]2_ GA2K ϟӇ,b]8yeIƫ Q, QFG{|꟝'+ &(_!DAGGٳ7{ԑj*ϛ'x¼6_+b>O)2=G~G]wewc=f/ǟɟ4 -9a܂8p0QqbӇk!.M@1 T٩)/?56EJsڜV!<{Ȋ4}>T^- w+'.WW/3&]WUu:L.by]#/Ktd<Po~U̿ۿ~p3WWzT??|GҥK3oVVV4 q?3?c.\|0_͝wi__0gB˭奅{^0BDٙB^wW04~p lˆ~|ZN3ZXfuCN1L"]^4O7era^B`:pP3+" e гE@uF{Uʇ~گNL\]]UG *1_W;Ns5??T͏菚??Uz8yu6o^n+ӌe3(щdW/ }EQ"4Q]`H}= bc*!-akziqqrmk.Sl&c?dluuiZ[ [6pΘj|4N߱=ꀹft!ԅt>&t{X߶:^%I6D)E>&ٔM&+?6HK~E%@0Xz(ؘjr /BqMԄo"3+ WWvi.+a;;;fooOn5|n>8įT6/ӥ4I/N4…ӎ`+':}z],#@WZL7lZIȽi`|rRi`/uM3 @ba'iغUE4WV)mȒË l;p||\O=|ꩧ G q88'jV>28Z333.٬J&4 p @e&;kKBXUtݚd{(vߔƝ8q*Jn!\t+?x]2^6&߼7^VsiFrBgBBR…'77nCO2r@ǭˌ=u6Ɗ;mx56 : *"0[[[Lp0̭ުp.8f8!ѭG {_xwlR&*lS|^2~a[rGѱ)0գ5g^6/~Qpts̾,6#LX׀U"I)kpIΩ1q!aZZxΖ Ϝ5/˻1F,vmi=1qvI35jOk|*`>X6,`U /'UwzxnHLakmm|k_3oy[zh꿽z:"/yS?SDP7w}5޽7MNuF- `xWfԲ/݃|dbָ{^rb{z~6e38&J"`7kKzjpmeRJ*XTG,\6;v7N8yU)ɈC}MZ229Z`K Ƿ~w׼moSRwA*lv٦ :gguyt`}J|ߠcv˧luj :`YȔ6Ž"ܰPlrլ S'jAdVykOY-9;u3-3oA: ͅ"J׹X|~AHu;~FYf3ȏ2cbSa1 >!^Fߏ)D$!bR <-eE}C[ W%װ2?J9s]خx ar|"\>w_XڥF Z\U]m8lm c)ݫ@S!K6 lpRT}j n=Y$C@`&$P5LNm%T^: [bLD0]W clp<9`%9 ̈́t 5O#GmB^Flf|:4K7T\?IAgsfjnFV`  4X5_> 7"%yfͪK~+Jټt?o2 U*BAar:휿ݲ ! #`:VpX_f^r˭؎^\H^N[0 !Fy:S'ρgFڏn [%׫}yg[l/`b^@|pgmmp/5-s7sˋf|jBG[wV7ۨ^`s%rX$%tt<PTߞY^|+]9 a+iDJ'-A~jvJ˦N|Ҳ &1g!Kwy6rX1:(ⴸ.@w ,0nH@Wcgi,ݣOPS* +^+DW^;Us%oxn gWx|̝\2'nՌ#Bi^+=@f/2n% M}ƃ}!C FnONzK0{7wd܌8UxJ793m+p",N gL\!׹!Tǭ/_7^5]۴>c*@m[V'ـ,y"CjRGP*!auMlG9AQzl\n_Ik:Ik'-{[fve!bT4MJ$@Wzk)^E:7™ w.4qqúr pyG:]yN4$~I30@7WoLW],tCk*'JX.A "GL;^+ha88kDr4ii#oᬬ3 xe_LJrْI9fhC<{"_~\?x몙Y#baF'i3D˜Mc99d,u +7gj`j'#P[N'޾0۞8"bwsJgR>xLa-VrU#;R,J<՛R٥vp9>3q_4VpM*L3) u퀰)hi+ UZc`RP 0pe>Åׂ>e//C^Z6,dr{WygV;^912wEh8 U( DS~!06W=sgux;xonӧ^`"b->1C@QN8p|nZ۵,p a` +aC Wn k̟c KڂT2E0 K9![ Dd+ѾcKC %ts[&aC-^YtU=[:h&Sr=]yqzKkWvlqUu؂:{e :]! 4QHqZ8R@È]S\xh@?wY->']ɐ*h y^W͘R!u`3ż8_wfx\}:dV"'`ӈmԀi!Wt\׬xDW~9CiŲ%T,H#䑛6fثBn ."""CtТ.4O#Rñ{uZW2"u[n'o"C`(8p$,H hGXep+1 :`Y C65e[O[L$%"lƮ؄g|XNږcݾvS?SKi6#UgtJ!Z,u5Vv т,cǜDgYmYX恑K7^h/3p߾yOCGFÿOȸ'Mk}CȁGY33?g&gqۀr| ڔv-K~rF6aZih[ Dqs a-JҖ([$'i$2 &]J;15iO-S'Ʌ)e{wW8߮ 4uί|wvAml ]IOsC dm*/mj~VɝR }߯9/7ŭ2^ {UɺJ^~}ݽAZA86)F(=2E NeD :`x K܇GI>2sađ/9_BgԔ~|dEl9qm} qa"]\ a? jM5O~T)mT*$ ;ZKθm:`,k]jo6 ݺr.L7(D!% &n:stq k Kfbc|@]NRK}cLuy֮@.޲jf尵kc}ff{@2W /,xq6B'i|OtH-#m(Eswa81aF|iY!ӥ1N3f)3!vPNDrm88!ֳQt~9-)e.bAj܇!F )"!@gX)/}UAF/!|8G FEuXk"pfLg"S4w'Np^4E`6Cwzd!.>kQ/DW띠ltRjݼ PdS5RJo3ItZw4uO+4&X ?\/Gw+E 6 w䀥,w bZQ5ޥѧ{R "V܈k+Ywq{^UZ,d6 tVA:4d(e.7>40௵%Sc 3dlr/Yp+=sgBhmн6)uP_:Z"q)*L'-Ii-WmW+q\0w[?(S82h8`dGGQS+ƴ_%QQ,C 6xi]M O ĮDі0چH[;&>e/L6x GS|t[3`7cKĝgtFWdk•Vî@ѝEV6ul( ]LG?eE'\`C'ͮ'*x(H-S[ '?$eH vLm&̉o55 0њp׊4%e 0R:] ڭ#vCV%_Fښ<o^f_i8hmuf<oXx|uBߒ;r}F:ff~N1l# ۩ܫIMU3)e$/A"+ A1Kk.SHꪇt6/CƱ1P[p,:`c QDwsk!k:ѻ*H¸ܰ >kf-EiL)^izjo^kd&d" ѯt.yh`y<0weRC<@kilؽe6.\~Rq' aC'[ /;S5͘S$n!KqI _D;<"ς@0NzJz#VRt1&rp|{}?}"+"=v)78~PÒǏiDdzv@I$.f72<]^4dKÐÓ6Q3W; 0Вdya*h"cаml!j}ko+d ALK\e Li<ŵ1A_AsCg l#::>#qoSiL񈄑K gR8}}s7B1HAXz/2-?J:./Amx>mEXG`PgTL_fY2u0A mU<=o ටaK-aNs{8"HE]3 [k p6IX~kٲ$xr@nfT~zj؏+)z~_X%}y%ޑV9`YǪ#BQ28slFR 9ruinҰ0#\1򲽋=mDjq j6"TH$IH ./Q{GUGr!0KX`@vwj5; lD@ɊHG@It(N3u<`ҥ/dQLv[T*ɂ0^\缎wU@Lp7>[+fv4a8%Yz*|]vK%lNGґ{~ϴhOܽ );Igvq#.06ytpAOx)]0ar{q#`:)aH|5>a'$mtXt脓AP: ~RޞLԦ&0tCh>| ya]6է# ɛ87ѻX&C~ ~ҟ S>~L) SP(d? M TR䵅9`Լ0Jq q5208aGN_M`guhP$CssSZPEXmtB8o!iJ#q~Y38'/۟/K>#ʅ _#6iiF6;^ޏemNJy rOH㢴!oa)3"{nF`uW^2O5s\p f%7SrSrjreDV+\5fNxmq']k)&}H4~?/6>jPDۦ٘(/'Jߠ U8TYyHr:tuU|gkm 'a%<ݣ| /l7'EA<K줿ݼt]U9&`7ym.skEom_;ȳum]Wbݱ>6K fneʍhȗR$x~l⿊=f-؅<$#>'C˦`>!׊E~p :zȪΔ+TܻQ1gVQwm=ygcx| 4 .'Kռ' u(R"ۧ5G,}:[vCF9A\W2IC~?g A7 ʎ6+= }pK+:ɣ q$J7XT. b#,fffF{uͥ'^2s5 N{py|P}x\ye723K|Pl<$a0UĘbk/j$FVdٛQ f͌x_& ߬9( 1B'V ٝUِlY~ȧeIamQsNOȷ, a_4 %@HL ioJx p[%gv<ȇDAb ~*p4ecr\P FYލID#8I{AvZiRڹ6 p:7G{!Nk"W KRژR| 3SҎDm}K3';>-?w$_]5+xギzmgpB1N(Ť%N&|fn~_xYseK\mWUvI?YOsssƮoa$UW3;y].5tmC郠}jukZtYWDvٴQ] l]~?=Q;e5#ݖՃU? lmZRW9toF?삵'`A y'm|a#'[=k'!r <+؋;O|TrwrMxIVb6_gڜ{T{m_qe9vz&W;vUsWlda :- 3;^h8`32p6 }AsBoi?sUɎ 0ܛi}*y`}6S/EW%d;3{¦9=)Ϲ4]͈~]+~c ؠ: 6VT1;͚)H1 /vf\~SrpAvc`lڙ I%ImGa>ړ-qפ jƗS?!3&F e4x]< \N:Y0X꼼vYWxٱJV e@0 '#AYe ez Nh nO&'Y6[^,X<-f`Q9Ⱦ/]y'2uBKM];|Π)N] a]^l,$+3 Ap]O>mVWW3"wwwc=ff{Kf"69OH'#MCQɼ1w`q]퓏WjNǜU]2gch!$[Ĺ},{>i|>0d0_nY4`YgN" O=U4%KI!=pRW>Z*M1K^Y8!W+y@/.zcdJV;an QiG-l4b D"@ !t;D"@ D"@G]h"@l1J B*#]F[\D'i:Ay@{ X G.nAvd- D"@܂XFD"@ D tY "@ D"@* 4E$D"@ D`86Z"@ D"PU(" D"@ ÁhGւ"@ D @D D"@ G;D"@ DT:`h$H D"@p @l8ڑ D"@ D@#QD"@ D"@:`ю D"@ @X""@ D"0vd- D"@t*H"@ D@p#kA D"@@VFD"@ D tY "@ D"@* 4E$D"@ D`86Z"@ D"PU(" D"@ ÁhGւ"@ D @D D"@ G;D"@ DT:`h$H D"@p @l8ڑ D"@ D@#QD"@ D"@:`ю D"@ @X""@ D"0vd- D"@t*H"@ D@p#kA D"@@;@%)" D"@ D`Dc~߱NX1/ C CԨ څdv"@0RpX"@ZB]h :E~xh+̊"@rhk 3776̷msyuϋFkW\1׮]]L^tܼyv!D"@F0 /=_r H!Z܄@IDAT?~ae07O>&"@!Ж% aetpQ;H @+ #A:r;`5:`#uXe"լyqv")D Ҭ# h0LV3x;ݵى/VE/"n4f!C{h59q;"@GLefڀ#D%( D"@P ġ@`+_E Xg"@ D":[,3+_Go60vRM;0w1`3 "@ D.tF% w=mostpH۸t7͙7c& bܣ8j=%Dt|71t_r&D`6ӹpҳ~ zPGc357c܉EYvlƧ&Mmf&'st. 9"@|"0t~ѫ@uK/"_!|OLq?% ,6,-z"9`-I5!\ms,iIZc?/1z8RD{JYO"@ Dd"Йɖ }E[qxOO[ !$pv׷S1:]x‰ Ï'pYC"@21T7[Z?\YS7$~QmqūMɉ D"@WVmIC5V©eu6.'ַvOLD"@F 3"P}U k 91S>:\6p b>7"@nACr Dlӵ&8u8Ѿh:X  D"@@0n_V/ DEm[֌tq ASN,mq-A D!CD ܂85ƒe.vrؾ臠s D"@ j6 V]"N C@/o襛i$ʟý;"@#ଟ+)0p:ѹ@ C@Ya6w1Ig{:XK !@LEjy"(4v+cX t6"D8OfSKZC#u +7̮|X+Ȼpj.)̼(P ! _t6KW*8˅>x"0p+hskIOMpJXgms fvuVܴn51B~p׽>S6D`!kZxQ'qqے ߩ)5ጘ;>>Q|IL@8<8 2.28u}Wt`ǥAA쇣5lά 77uxjՌO#9 iGJ[" Й̀> ЦLRԸY{ysalv$՜y=zx^DTx]ޓK0;kf|jn?Aw7ke]jל >;}V2:u,N֤>;`ԤCbMpL_"D3,ɏ1B~O70ቁ 浵^Ւ"CwfKfjzF&_ph f7mP5PWZçlC_.4|a\‘'pЖᅰF1@@:` H*ۻ4aѤ䃽1L%:::ԭoh\JVF"PuD'gʒ_ pM=oD7o4>pEH"E acu ٤Vb!@wV2^* bKgP {;Vpg`n"@ 8XG vK#9'kL‰ 6q d+foA[bdE@ce|xv݆mHs+H\dbǽ[4#@1ȢcAq` @l0ڡ)hJ,HC@lCu;r-o-:u$bƖqD 8Z xQ"@-32'UD8 9mniQ!=^:anwzSB@Qc ]ohj\%1%*/I  !9`x8ym(VYT*pg0!o^ffbfJ'Efy{~OE@Et!uGC@gT=B@lƒb8jqppjWΕfsw$ -87w Tc_"@D [^`cOOch/gHF/{qE[2L@7+l!ԙsD*wW3XZYq08ӏx";6W)Cwꦾe&='SN'{ט,Wk$"ZY@ d"@ ZQG]M1]1č>R1c$(jѹǟ5/cfԲ$ 9 >=1s:e(5.?܈M@ƁAF8=8cRx"@&1 n6Ž͇ jM96S"턈DX^1uz;29`iiq@cG>MqhBd"@@K ކ!(1UHjib&k\鑜 ۵Nyۗ#CbgeYswnN&"0 8g 3z D%mdp~)xG@Y`[!.utIcpYҐ]:[]_la cF=Q^1$= 522D@?Hl]ğsf\pt8 cvLmEP!=$D,Ƿt$x{A. $Y ;tX  RO%b$ D 1+/}Essz:/߯n\ F|hRˢtM0 9tK&ƥ{@v&3iQKgN`V=1,U2#D ٸ|tn+]bx;o1NgCڮC~Z*ǟiDTqz-G :`UmфEn˨d//%K}َxlwܪ8:`eND8p]|E/~̬,7$Mdk[$lxID:vln! U-I/"ZV0C腘, =tc&ܖm/h3KfI k" qvk}ih eE@8;0sf7}hu%irpke(pt9[ebϬ*Wr5:UI1 l6{`LJrjPn"08TOkmfp!Z];w8 oǵw̉ [ȭgoܖg|*A""0x6)&Qb:QO;Tu+a&[  jHQc!lSg1(+ E@ `5+/TbbOk&?Ӊ"@l@bB=Qt9~f̌DW Ƅd߹)[L#UF\x98g>*utphNuƜ6/`1]$s®xެsI) :kW :`UkLy;?)3 +:̀)Dt2d SSSbc<8{i݉PzAzi9'^2sKʻ8g%zOd2$EF:`C'K-r*qGa"PXaˡUtu%tn]]7ufے'&M}[>,'.ˠ+"gw!w"0@&f&ͼ557JPq;6_ W9KN_pjMЃ6`@gX a$Kx@ފV.Y^Dtטѫ69n>=sJ ([wN=d, )D be-hX?KaO;5ʱ(("Й)(7Xuv7*v+Y1˅ {`d+aX% da**4ĘXylPDtԃ}s| ZHkCa@?0s LczT]T.49EFUof`k˶oYDl55|ɾt}G-'}?6]CD*ӡ7K|BVf|/Kk()/OLqqJ\(p2!(ZltNm{zqr⤅U:G$<_ pNj29`=yrEYXDƌ s0V-[2n~ϛ&6!".2پq\sffaNG\23󶄖lu~*&a28Tvn)L&UrkF aw!^W\>⽸F0?A E-qwh` #6rӝ2=kf~e\mf7A"@:Clᄱ%y'ڭH]V;%mZKɱe\86ဋeD"@ZC Xpq9snGG,),"́mA8zćYxGFQGoK+]M>@vT3rdg($) X:ܓ 7fg|:E0zhK@5PH&>7]3/\p8"6bON&]8uB*PV=V 6Η.8|oqtX |(mSl]fU,FΗfMQIaZAR/Dk; M/z')!c(ɿ225?cN~fA퇤8%XM97Qmm| +(&}`wnnZ !ЙƩ S.+YJ/D?9IUJ0̘&D3iQJ" nFaLNk+JᛚXJyaQzލ?dM* ִ`rdTVr nibbaM>?ِ$:Ҿ;kfJ*XRGpPjB|ΐ:D/'zș2qjzھjҶz(/Pss%Ï@g`1npw_lFT+;~CFeh:D+KeFs d^1  5iޥb$ E. Pu2>5m]WK68`7֥V .̔V2n &x?3frT;0 a (D+*P# Oh.=YeY/v3{[;=[S4wt0~V\qY)QE1,Q^efx|8 )@vIoP[8 1Nh"0d% ƕfV*htmJY9sLN1 WC1QV&;Y1D`6cÅG̵gΚYϑl=FG#Y%H>EL1 T$̊ڣm<'=R~_N &q\i:޵S͓'#rB;&6pl-Fy' ᢺs!["W~W8WX?=Ve9!̂o^_ 03L⽨Qn-e%1 e# ْND\9eKA~D`A V^8VÀuP>ra'DԤYC؀ymb\m2&C0/[*fȊOBTp-`v=)c@nC *3vq 7ISbS$IHc4#D@pb77WyUv+8knwvY-dJN |\~|Rv`_}o55QWʺ" #P먈n*}GU73^d= e #%IkUp,@ ,'z]^BF""\S$,Y4 ,?4mz^lv;{2690G%YvJIJ{T i_dǻr:WkkED` 4B?݂ @ԢGYBٚCF#}&IarW8 .,!@V!*T^"ӈh>wr,ZWbv6̞/z\HQrWæL/͙y9 >5Y3..Qw^D`Mz ˡIJgnld!@3R'[;!>ɧ yWEy$&e= F D@wňG\\+6:-,D\NiP# &:0yaA3lXPR=Z20EYtKJ\Vr @\u dU=)@ލq|3+EY,x÷AdN?PD~2|H$TJ,GHNw]O̝X W&զ%im?v[#r#DX?ѯpٰTZ]ebq<ñژx̗3v ~\ 6^Ik>YvP-E^8MՀ:1Sa0]JT9զI7v 9hCVۅE i)&-E.Fj"@V 3ҫF)%h:sK fjv~Yx-n{r䕍rND0iaaö* °< Fgi[<t}nyLL5llޔC|UթC2P$"@@cl142P6Ssp{54E}k;pbEHY59bz fgWG>swx)"oh %֨Q^{!:=9;To6{^Eo%>gT6<.' Sw\LÇE1@ ,/'^)5\Z"%֡|l~r48f3KꀩCʖUBu*i?zh%H*>#`; 9+},^\7`\W_w,1D`6V,W0ΑIDC ѻ` IМ[*E<^F-tnLҏ麖[*-2yΤX_ܤc,:{˹0i`zY"b(ȍO0Gܢ+.:IɲʊOrԸkNȓ5c4͇{ yppFT>Jnj(I1)-U1ڒa$;"####2`l5axDc#7 VBm5/)as3N,kS#\c2 9;۸3ԮrYȭy~JFVWqbbJRr\NReՌGKI|qap7@);LdHDY6NΤ 6- REgvv|ZmÖ qZr\ze |Xށٺnfv^֍8 Ts(6(FK9Ӹyq NDX 3y0H@/H[r'ea|敇0gN%ǯcݺWAo/[Dl*hg 37P ~ Z=U˦F"C !(/vmFb6tpÉBĨ`|ɻ^gV]g]m|\~Euʆbwg̐=YJ (kimrF">R$KK!g }F:`UCX[,r71ˇr|P5w|yąg]DjȗP!2Io;(4a *4K("0TtgD\M)^H.? ߷ѣ0I,kE7%LSEV|Q]fB #ЛV2Kh\.,6Y-V&2 !d98pBYfh*4X<tJV?&*+\7/]5#AQ8]n;"V68!ҬmZo|rІfh"t=-siõsȁ j>t#RӔJzvv ×5%;kf.`{hW~1 31CMqD$ O".?5w<[ q:eYQxvtuܣz:CaANWM/͚+&+`G!=9P&v쮱 ǁM}Ho%vML2&UF MOߨgzjZ(eI(-~gŻx>sLV51l7쐉 ~L ?䁍aql-waj-GeD|耕i d Nz"WbO@*vE[֥Ŧŵ ^Ǥm -tǵ&\SH|ӑ|bjR&peR $DD[zʩ2Z9O$@5vϋE J'lQ"`15 &}GKP!]M˘g5N Lɗ'ӈ@UuP3;P}8e4{uNhU}XPt`CpO@UVjUFTP(֋̈@I@7hP6M<%~VU2Is95w$m LD`p+_/gZ;L`L}s,>)q}R+HXdvN(JR0T:`iئ#KbyilT0+-!\,n )cƙf\dN$H'B:rY<F*@}k۠c~fkWj:W:Y@̦G ip\q_.q\R\OuVyvc@(i/3(v쮴%BB 2m ac08FPlc;0H Hniu}\:U~gͼ~3U*++3+++>QZe$ldw3 "KXl7\= [voܽg_ vuɋ~w`n/'JrZ%9g zI\!. Xo^Tu6B (w褄ܖn[TZXȿPmq*e0W˵yB- :JF[=h 뜊,U v1d:+!^Um=Gb-k|M8VA [VOi~&y$8[/ϒ-n!JXJ ۖieb\{bfMovb@>fesDރQTXנt[eě@WDj At.{O'^{8KmY:B e#CV 7x Tg I߱KA!>J\qV.zT/6l|Uɚ{1g@&Fu\c@$`}u ]> g$|:Y2L6J%u{0o4PJ,!b&Jwy %6 !8S.Sw8\xR ޻خ+9$+N3yʍTפ;Ka; ѷi*)0eSYT)7EY8 q,k Q(8ya2%ɩ4 U\q1J`H s7΂xWkAS9L>%S)$lh MXiS5!V 6^,^ 6}GnfrʭJ=V^,P4l>BHLBHtD)z u@OJTkY=f%3}Y%%immUbLXy]Ka gCV\+H|\x$\6 A}@%Qq++7V?yv3 V, MXhLӛL$w*+i&m1abK ~6vȒ/]_X&MW)O~5ll/{9HgFt%)<í;2w!D Z^e|nĝLKડR]4Zci]U0O8,͟O?gf֣B&q%X)`ֺl~p|kFWPÇ&qUeg<K+MIoIz%Ps X+6veZ3 %g&ܞ@KN|ҩlYӟѻSn5:~tlFߨjV"W''mnKс+:0f8:"Eq:, X %%@|djMDy+=;eaͫ ESWLUc@AC^UypUqV`tjfЯfX%=%UN>NW$#)SoՕ2ŦY.~hdu)ǜGӚGuGrl+c?7^DuBf*G8BD [nt%}}dwxmuLW/owe+ToSCqRWh^W1r#^ӆ`j<Aqrȿ7jY Q"?9 @IPG >\(HZJmL hH[SbL@@U Ўf0g*5pUz(F؄F'`g}XdY%K@ X)#LU9G*W'Ӷ zS#<&#IӲu0-yfw'JFiVmn']b*r2[›%Y@JO~x<D! uBӣm&d, 1[.28_~%LĤ jJm#?%P' Xj -mll&^%3pUl.CVb4['~muhVxl\F֯n(C{*fS"p1w7˷}ƝoLڽ߱Vx󷶦j*OL -']ץ+&!s^\."guNoSl;ɩ,H>?ǡ&}7nޣ[2[]fSK _+͠-CQJ0.t3nj߸&bhqh'=m;yLWҺPV+1Xn sf7< ig`?&M9 t_zlb'Ofd9gyWڡo6#xJLg&9l*}\dcgǝ}>%9%!6P/ g; (Z/ӕA_{ 7]3m[qqyDmٰέ1ء5о)9(Kvpp)Qnqj2'&CY'< *E}jiP)l.a.@el9A#mw0ǖܖX^h(=m1j$\afzZWv84Mo!8G=b֨ $iӌULG'#bHyo`rvR?[~"[c2;X9 QoӦWp1Dql)y$̦zV `'f]x WWeF{YYvfd \Y39RpD% XwWX̤vU_X%H@>nAQz2vؑ e|c@O)4LgiP%u>C/+Oj{%-H/ʝfMobܒ@\r/70\#(yJ )^ݱYxZfYB>KN#R~LOwVˋݺQVȶNǓ t LQR])tE D d$-7o8B|ƦΙZgI%P3 X*#9]/]@j:Clk'9Z"mڻq16p\65ɷfޥ|) #DGD7OX OhIB؝NJWX`wX.8Haԁ.PB\Vz VXEnN3ԭ#Dn֦ pp6Wlx ˥CU!Y}r^H nA,jMe|ww#@eE(ZK j]= Cܜh<ZbH+-cW xQe=FG].}Ɓ\йrA|e)UKl|!VYx孻2l`Y| R<$`9"XBzItk"|%Rw ;Tg`V8A!UD^^ujE{V94eLN'YR%^Yl8nR%0k ڮY*"B*E2[a(UDZbtE1.J`VYslm,L vG"`@ %@tea`yoq%ͽs{C4wse. ֶEZ"E&v]s;[=:.4;c;³Y YF D Iخ f3He3,g i !J:BV4o AUpO lz|ףk $~wrk7n'" DZrYsT[CJHE9dgJ wRIr _\#ePIO^>K=ىTE ,a t?y+&bi L=ѱܪ[%H~5cIo8lPM%`]hDHА^`LlUnw%}?Q ,>3S3kovIAW2Ӫ@BW9Q7s*C&)ٻ f)'V"WWS+mR&J`%P6y$e7mvcc[;xځpЖ9X)%5yw{+/vǜv#wuSSn nD y2ڳ}O*,D}5Ik$0X%Jk&MΔ[T*p]E@`?-_zGw5Gӕ#`7Yypұsԕ1ĠSf!C5#nd-.M'+rĜN9*smETTd((Udq${yãis&|Cj#hZvUA^*9W.^V;!;OeY`ؒxA'|M?Qs`2XM E;Ȋ&²\[DђG^,T+x'CAe}ǻTGxbt@Аgd5FC]ݍEE̕4_+()ߒ<)޵#4$VS-l%] , m~|-#tLd0QsD4'P>-"ipV?5")3>,e oNhvc~>+C2(6cQY>f 3$e0)EYZ[ћ-B+#Mo,˜ɕonH.&'A3Ї>3C7$n[L{ѡ^xa^͢mkr^VF6>:%:Gf딱Ik.wݒ`ݢ.xY܂Y̲53%ߝY0vu3 gsi& Q@AflaZ}%S ߇ܐ4ǂ %P+el6g!1rI|:QE x>.*z!*qj3(X8)ev,D @=5GK~">qh5=aiQ9 Gx}dKk=% QlSakPyy2Ɂ/Qs@%K/{6MhG~`h ʖC`ld>=}yU1aX *#0ȕR{z,:٪ N>Lu@P&Rmݦ2@'{-mEm CQTl*(n6Y ', {+O-xxsZqcXzǛܖrk4^zlOfor_U'C cq{"LgUZǘe)8ڥVqp08;d??IDAT\9;1$]U ynWV'ec\V.8~ZGϓ]n;uhUTmY :&"̌M?y h-_MB $+%0K ,fhH\~Eܡ]܎y4#]]Wʩzò0RF_>| $#]]BJ(km>yTd;߼>m_H--">R+~.:^VtUO˒/''VeS4d؊7~0X8ֹ@m{UC`ES8ԑ:rm.2N6,ْ:c'0I1,m Ǭ> ?abl\lƄ[q^ iؾ*)TnHkpvYᰶT]ATKL-!JX0H䯡I·pr[{pI+'GsyZ4 .c`chJiD !L9RXYqdzD'cAWŌ0sњ+2vH^g;N~Kt*{6-|b Jcv-'CrI.tR[Ŗ-o<ιeb1Tv-#Zl/l#صSu|Y1%qEpS'|pt5lAoFڭ|j9B<Q3! XP1vNaԸ/5 !B,w;,Hg »s^d \˯#'U)_Je3(rXf ާ#Wt#,&1hEKo ֻ ҃eζW޷B1R)Qq蜷8_X`[6崶ɔAC;I9XOe (%}7:&ʊj! Zp䋡(֊_!BUƒEȓ 5R|W Ua+˂ /)d&񡉢:ct-#aW/OYAHnTygkov{*_>Ig,{W^g@ZbTvC-8+t{qS =%(2ٰ-5FS_}Q9%X$e0%Ni.X^G'vj/V<0R>l͓(w}Rꇺ]ӆqY9-daZrFXx} Uxr'Mkgz pnsw}{i\;9#vlzLhLɮ ͋uk$@-m<1Hh{ka L m՗fm):jH8) 3{-+MoZjP?{է -4&I\dKO( "W[{CMuf(Krr0FV4س=sxʍ78:~j]a@.x tß·w|',Ǚ:IW7e1@{6)1ɳ&y{<>Rm8R@ &<&`hly>i~Œ'i`2?AA%*~W#k2G]J} uLF)V9m)3݇TջzhLBR:Vyj͈^!!U:}[r P&ɃW[@4s'p5uc}/YW?t4; F3&rI~ W0ZVe|-W<$o#䟏ph$SJCKeM|6uk޳ ڳ;|Bc#A_2-Ъ!K]icr}> ]u dKjyꆎ,F˽?>ws`<`(GtT @^#^$8}IWs)6 r\ 'F#y>O5r5C)iJi>^/yr5^I`ɦq _fWҌ&GAdi u(N-%>џ4JɭiPH\61H`^0P]=0fnQ:aV1([cn1G`dynӷnX:MliqBN=?y{ܮPgJ(kRʙ7l[_/P+<>A ?)\ȉ=v'U U'^ŭ%9Ik.*BS华2< \W}Y>mXaK%ݓ 9юon]r?!ؠ Zz#|܎ *nRk_W.LoHy:(:]Lڷi iϒ|?t 8y%me,#ɽvFI OвexI1Rct!gh7^+ >Mڽ]x/'pP%r39YI9,/' pU|I ҝСNxh#2gZJ>,vnl~oDNw7A7#zF6G @ḟlbͷmr۾dNoY w6zꤝ.xt4VSUt|^#zj-C(i'm+*th8'wbAJxm'-m2-5m/Eh#ڙ71SJq^;#e.v5t%}@W`?[mFiHCLڷZO <|]njb2ǐ s2)9܏qГi.K|Vz9移Z2Lj`:[({U(]YZ+bvȡ;~ԭ;q6(3"Zl9K<݄cRUay?di$4;mn<Ӑid"&8X)N]8.̑1\hꌓt 9'OrG1z1ɓg8|z3MXԲ|.M<i"dH|NOr>y\*|c(Sٚ&1g(B\!u Yq  VRr-5vsn:ϩÓڙI%{';H:`Jn׳9A tt u|N篎t: ^ 4h?:?)IpY'eOx)zȓ`tnݗġBj~ $ek7-'NUiYvϏ ({9jT;W483w 4) }h>}l5[o [1 6l(֖ V_->׶+<1+?.a8(dHVjlMS~SiMȻmt2ZSйpiP$[3sgY!/ yY@Z1P1G>,ZVIܪ"څF JOlfI][S(ِχij\&e5cJV&vB.) @(l':Sݺ6z]( 5kָ 9b~Mbq~̽{/ܽ/W(R~w]wun\lMgJ4)TQKhIC1|=|t%l3LYC;apDaԠ颭r >[IsꤾWFb[8.9JM "ֶ:/=9-FO 2?3Hm)Q AjM-?&qeKoGۧ9vj`ȭJ{Pv̱s?  k%&x-MeI߀](j}UAS]T@m*mp}[U*](i@MSȦɖ[h! :km?|[G* ,VN*6R+՗l aJlrRHF䥾(WLi/=":iZF8[ylmOgBh|p1ھF<#vA溛F?s?4tZ)>3`KGo~:i AmkwpM oy\23nc[2AK] 8)[}ssթ ñuVw.  %kA(^-MC!m5taH)NV5%ƘL y03XyOi̥eOn&w/q}F 2RxLt44MI{4+F#3| >?}!>,<2|~'[),dA}ݍ7]t rB ·vfGiUw$= uLZ,'2y cM}y`zr'tROa6Kw}}CCBsHbݛ]]qnƍRJQ>۲e{ ^vxf/GmmFVyឭT4:d=֮gDts]bL<80m<RUAGV C $۶os=;sɴd*_>M IY۱C2%di}[hⳲG ir=ȻcNw}NXЖIdB(zRxLN\)+SB ֱH2~CX:S/ewcw(LD|!(ݠLfxu{7hz[y~p^zE+賟{N>d4¦MNѝ/",woүlۑ]@"Q 쀘:NI& RS#Ɇ44x UC~⯰@oJ0pLA-zIssdR'Um?RȣBhVቀCN0(Ualmx$tyv!hR6;vp?g?1۶iJCObL4u<C لL(Ž\[2\'gڵyyn: ;u䡿)6CG–_GpPA211|]r%3Ŗ`,K2#)8Vt @zw'p:5&U9"Fqć0Ǯ3!KHi%(tke;pWʌw{384kBR }4>(7ռ=ٜLM"%J%ϊ3x~x6WWϽ<$3"bQǬNM,J\HʏI4c'/L>4sfg@\go_e&N:^:6zE@r0A}_wy{ThL<;n:w5רSw˝|):KY(wڵ:I}{ڙgqu`_lnr{[ߪ VJ'C[&Uc:Vc>OnɽLw0i0Up]_?G-Y[َ~JCN=Ծ]Gwy{_RsAv _',WUn@i!8!p3AĨlɌR+UeK"%_&,u~y Y f_^E:{ؿu¯^i7K80:VϥNF_oud.Zd]}7u\>g >6^Cb[ath.`@O^uva)~;< l3׼aWf V tv=Cx*_+=!IO-S@R~8x`N+}䠲)(dj$Pn) }" [ 7 }K LK$__xs Y).WS7))Z y!-JxI`Or t_#?mRPKk9௮eCG<阰 f'OB {k2Xfy y \NheɳA`N#![홫K 4&x[*\"9K3\Cx`_jZ{4Si@%8A#e+^v)j heL:"*_0;TLI0 iDҭoD*K4OM?"`@}QuxfyF6a侰\+sp|(# ~ü]_ +7:@2 ѕKR^|B]f7iVWP6 m߾]eGqMCx$j)0_QZW)? 5'M)8޶m[KL]ei!|^3ュ⋮Kkv%_5"=XJ> :niPT񽕚IC^t,Os:~'2v8?Z~[K_CDFGRlyv׮]iݷ?KՆqcdi֏ܮLY">-/c턁lBOXNb sO'iM $KI;~/(c\%%)7忌4^(nk.9lґK`c--h+Xv -)O?/i,Tc\x_^OQ !> |'{9ʶ,E~5|X:l09*hŐ㳞,w1hYK~JȋS`’cb>N^-E~ی>vж.e~KVvt8tbvfmɢvtb {>WW(e)[w_c?K`·ptbS8_S~,U 3P2تH;إf.vbv?څyÐ.Z=*( ?vG dqYN9аhęQcL.pEx א"zH7X ޞ7~x\P ]V/Y؁tۉ[!S^D׎/` G;"SZB,E4>vv^_e1y9.fًQ_ 8C?XD oK#}kfϳ.Si)[X,>CBNQGi?mj4㕗ɂ9GQgD>f$v5k'~)\zH-2BCmoER?1Rs u NBҚ票~0E&{ ,>V~fqvLH_B=WC-4}Ƣ 采3q{ e2&! ̑r-n}:ԧ>՝'_')g?:ovwTK /d0O袋Gx /Du])OyA7 GRNbaڝxI2*uA/uDiO{ZJъ<Ǘ wLGx_'[oU'e{K5Kttddu]vޭ/8pa~g6uӟGyD ߅yX#1{WP~?vϙ>[Y2hGGg0a9ѣ.P6mrϐ~Ǧh~YK/ԝuYJ=|r-C.Їec7zTddqùБ:ʽe/Kټy{q <% G#m};ISsۼ/ p z<܀|F={(<j hD~B*@r~Th4;)/$p$ϡL Ɵ%/ܹsWg7!<ȅr >1|'EW?74–-[ܿ*_?qmh|н}sK.a O8F/1K-WWcr}k??n9[g?L>_W''W0f{ɿ ___5yvEGD' g>] ]s5ӟ YNHُ޽{UW]PO+`;p-|SrW_}l5G>w8)]$L`` n@7ިԁ甘E17ȄAy(#쭅~ =?vB2p_@oG~mɣW?N=>@}3>9%i De1c?ڗLħw^׹[*ȃ?pU^ ?ČL/~QLşő(μ(?s?אFksېo^h}p#F"fgq,;wlHgvW4wĽ-oiHgƅHY l_;Tj\ve mlk0ïf5792{ՐAvCf4vڥ22?pCf3bt5/?2kӪq[no|=7ifHj[gԐx5~W~!)kh5~@ W Pz:ѐկ KA\.S)ؐhl}3ioJh #s??jO"T֡ /zы]3~M>dXn]{iG8Vs] d2|hed?5SƟ6IA.Bzy5zhoځސI %K&0*+ Аɩ\d 5%/yIg pfON? ׆,.4deOy>l><6O܍o= x^W2 )f$00iȟY VZd>̟U%Ȳ>w<؂g9NEg "҉ KMx_ BÌuK1 C-Dl,dpN*ҬN#}U⑏}NxǻĮ $~r=)S #ȈUЏ22=F7G}|lUd]|+Jmç5:{_/ȄnIY`W}.&:@ie n&G?y4~NNcl7.ت80/`H˲yLj8Zސ}X4 ghu3(JXivl'-,3UŲ!wc^3Dϖ 2!9ĘsH:%`x~ : 1xo þix'_kti'zJ'o|ý/v|+t[ 2B !GCx.6c 0UhXbD$1u1X`w+PCLG6C-^h\Ȁ yL6!^CK~H$y wq Ǡ:Iduje9]g=t6qO~Շ5'Qx+gzMLCy~}/`:N~~.3g&'d]37E:8UEM؀ڄ Mf.?A1!Rdvɳ6YZ0SA!M2Q#i"?KZpȷ 1j| V-_ְ0"`JCc`Ik|ӮU 84@8ZOj¶A.BAse]peӟ,pbO4n2pl1iNC!ur :"W7g_7wDOD| "vfj>cdjy{omoZHk3L%Μ,A[ #+%) K8\|AF>0CCFY`$A31=C58*U/fDnI>JW:ЎQȇ|D=EVxznd~ktwL: Ncm-pl(ދa:`H1a`uPp1wY.q8ىϘ՟MNJDljxx}.N O;t}2XgVGYC=]`''tm:±0‘:5nؚE>AZu*NO5Nn&PqL`_~J1l(62&faը.:?'Ҧj$C/'Vޱ p~f\d4^l)o9; ^/r 1Emx̀F~2|EYf{LhS,lDx7 H7S09JQd<]?Pe ?f=Xg>Oqm^"='~_wzՅhz pp?gLq@l[qU&`iE &&i.Pa}/2an3҇%еj<.N}Whl~/ ,ͮE|K+e\;Zúl.-v١²]>ӸOK[!܇p~y.A&l`:e[;LeBcepLW/hY2* _Wvϝ]Ӯ㣊]v8gK֠P8 bEa{-W:4Z䐗AWa4QTEpd˭ LL<|t$M;`_giuoyL[~ _@Z/u8f:Ted|Y0Y3Yry6oӏHyKt7h|V Lb?<*z5RFv+˿◪/]\;:txhf|U1^]CuMǽɅ*JqK_ 6[F D D D D D D D D D D N]݂8#t@@@@@@@@@@@-F D D D D D D D D D PqCǢlyw6J J J J J J J J J J ?%%%%%%%%%%$`˫#QQQQQQQQQQ=O+IENDB`bayesplot/man/MCMC-traces.Rd0000644000176200001440000003300614563172262015326 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-traces.R \name{MCMC-traces} \alias{MCMC-traces} \alias{mcmc_trace} \alias{mcmc_trace_highlight} \alias{trace_style_np} \alias{mcmc_rank_overlay} \alias{mcmc_rank_hist} \alias{mcmc_rank_ecdf} \alias{mcmc_trace_data} \title{Trace and rank plots of MCMC draws} \usage{ mcmc_trace( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_warmup = 0, iter1 = 0, window = NULL, size = NULL, np = NULL, np_style = trace_style_np(), divergences = NULL ) mcmc_trace_highlight( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_warmup = 0, window = NULL, size = NULL, alpha = 0.2, highlight = 1 ) trace_style_np(div_color = "red", div_size = 0.25, div_alpha = 1) mcmc_rank_overlay( x, pars = character(), regex_pars = character(), transformations = list(), facet_args = list(), ..., n_bins = 20, ref_line = FALSE ) mcmc_rank_hist( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_bins = 20, ref_line = FALSE ) mcmc_rank_ecdf( x, pars = character(), regex_pars = character(), transformations = list(), ..., K = NULL, facet_args = list(), prob = 0.99, plot_diff = FALSE, interpolate_adj = NULL ) mcmc_trace_data( x, pars = character(), regex_pars = character(), transformations = list(), ..., highlight = NULL, n_warmup = 0, iter1 = 0 ) } \arguments{ \item{x}{An object containing MCMC draws: \itemize{ \item A 3-D array, matrix, list of matrices, or data frame. The \link{MCMC-overview} page provides details on how to specify each these. \item A \code{draws} object from the \pkg{\link{posterior}} package (e.g., \code{draws_array}, \code{draws_rvars}, etc.). \item An object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page. }} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{transformations}{Optionally, transformations to apply to parameters before plotting. If \code{transformations} is a function or a single string naming a function then that function will be used to transform all parameters. To apply transformations to particular parameters, the \code{transformations} argument can be a named list with length equal to the number of parameters to be transformed. Currently only univariate transformations of scalar parameters can be specified (multivariate transformations will be implemented in a future release). If \code{transformations} is a list, the name of each list element should be a parameter name and the content of each list element should be a function (or any item to match as a function via \code{\link[=match.fun]{match.fun()}}, e.g. a string naming a function). If a function is specified by its name as a string (e.g. \code{"log"}), then it can be used to construct a new parameter label for the appropriate parameter (e.g. \code{"log(sigma)"}). If a function itself is specified (e.g. \code{log} or \code{function(x) log(x)}) then \code{"t"} is used in the new parameter label to indicate that the parameter is transformed (e.g. \code{"t(sigma)"}). Note: due to partial argument matching \code{transformations} can be abbreviated for convenience in interactive use (e.g., \code{transform}).} \item{...}{Currently ignored.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting. Note: if \code{scales} is not included in \code{facet_args} then \strong{bayesplot} may use \code{scales="free"} as the default (depending on the plot) instead of the \strong{ggplot2} default of \code{scales="fixed"}.} \item{n_warmup}{An integer; the number of warmup iterations included in \code{x}. The default is \code{n_warmup = 0}, i.e. to assume no warmup iterations are included. If \code{n_warmup > 0} then the background for iterations \code{1:n_warmup} is shaded gray.} \item{iter1}{An integer; the iteration number of the first included draw (default is \code{0}). This can be used to make it more obvious that the warmup iterations have been discarded from the traceplot. It cannot be specified if \code{n_warmup} is also set to a positive value.} \item{window}{An integer vector of length two specifying the limits of a range of iterations to display.} \item{size}{An optional value to override the default line size for \code{mcmc_trace()} or the default point size for \code{mcmc_trace_highlight()}.} \item{np}{For models fit using \link{NUTS} (more generally, any \href{https://en.wikipedia.org/wiki/Symplectic_integrator}{symplectic integrator}), an optional data frame providing NUTS diagnostic information. The data frame should be the object returned by \code{\link[=nuts_params]{nuts_params()}} or one with the same structure. If \code{np} is specified then tick marks are added to the bottom of the trace plot indicating within which iterations there was a divergence (if there were any). See the end of the \strong{Examples} section, below.} \item{np_style}{A call to the \code{trace_style_np()} helper function to specify arguments controlling the appearance of tick marks representing divergences (if the \code{np} argument is specified).} \item{divergences}{Deprecated. Use the \code{np} argument instead.} \item{alpha}{For \code{mcmc_trace_highlight()}, passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the transparency of the points for the chains not highlighted.} \item{highlight}{For \code{mcmc_trace_highlight()}, an integer specifying one of the chains that will be more visible than the others in the plot.} \item{div_color, div_size, div_alpha}{Optional arguments to the \code{trace_style_np()} helper function that are eventually passed to \code{\link[ggplot2:geom_rug]{ggplot2::geom_rug()}} if the \code{np} argument is also specified. They control the color, size, and transparency specifications for showing divergences in the plot. The default values are displayed in the \strong{Usage} section above.} \item{n_bins}{For the rank plots, the number of bins to use for the histogram of rank-normalized MCMC samples. Defaults to \code{20}.} \item{ref_line}{For the rank plots, whether to draw a horizontal line at the average number of ranks per bin. Defaults to \code{FALSE}.} \item{K}{An optional integer defining the number of equally spaced evaluation points for the PIT-ECDF. Reducing K when using \code{interpolate_adj = FALSE} makes computing the confidence bands faster. For \code{ppc_pit_ecdf} and \code{ppc_pit_ecdf_grouped}, if PIT values are supplied, defaults to \code{length(pit)}, otherwise yrep determines the maximum accuracy of the estimated PIT values and \code{K} is set to \code{min(nrow(yrep) + 1, 1000)}. For \code{mcmc_rank_ecdf}, defaults to the number of iterations per chain in \code{x}.} \item{prob}{For \code{mcmc_rank_ecdf()}, a value between 0 and 1 specifying the desired simultaneous confidence of the confidence bands to be drawn for the rank ECDF plots.} \item{plot_diff}{For \code{mcmc_rank_ecdf()}, a boolean specifying if the difference between the observed rank ECDFs and the theoretical expectation should be drawn instead of the unmodified rank ECDF plots.} \item{interpolate_adj}{A boolean defining if the simultaneous confidence bands should be interpolated based on precomputed values rather than computed exactly. Computing the bands may be computationally intensive and the approximation gives a fast method for assessing the ECDF trajectory. The default is to use interpolation if \code{K} is greater than 200.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. \code{mcmc_trace_data()} returns the data for the trace \emph{and} rank plots in the same data frame. } \description{ Trace and rank plots of MCMC draws. See the \strong{Plot Descriptions} section, below, for details. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_trace()}}{ Standard trace plots of MCMC draws. For models fit using \link{NUTS}, the \code{np} argument can be used to also show divergences on the trace plot. } \item{\code{mcmc_trace_highlight()}}{ Traces are plotted using points rather than lines and the opacity of all chains but one (specified by the \code{highlight} argument) is reduced. } \item{\code{mcmc_rank_hist()}}{ Whereas traditional trace plots visualize how the chains mix over the course of sampling, rank histograms visualize how the values from the chains mix together in terms of ranking. An ideal plot would show the rankings mixing or overlapping in a uniform distribution. See Vehtari et al. (2019) for details. } \item{\code{mcmc_rank_overlay()}}{ Ranks from \code{mcmc_rank_hist()} are plotted using overlaid lines in a single panel. } \item{\code{mcmc_rank_ecdf()}}{ The ECDFs of the ranks from \code{mcmc_rank_hist()} are plotted with the simultaneous confidence bands with a coverage determined by \code{prob}, that is, bands that completely cover all of the rank ECDFs with the probability \code{prob}. If \code{plot_diff = TRUE}, the difference between the observed rank ECDFs and the theoretical expectation for samples originating from the same distribution is drawn. See Säilynoja et al. (2021) for details. } } } \examples{ # some parameter draws to use for demonstration x <- example_mcmc_draws(chains = 4, params = 6) dim(x) dimnames(x) # trace plots of the betas color_scheme_set("viridis") mcmc_trace(x, regex_pars = "beta") \donttest{ color_scheme_set("viridisA") mcmc_trace(x, regex_pars = "beta") color_scheme_set("viridisC") mcmc_trace(x, regex_pars = "beta") } # mix color schemes color_scheme_set("mix-blue-red") mcmc_trace(x, regex_pars = "beta") # use traditional ggplot discrete color scale mcmc_trace(x, pars = c("alpha", "sigma")) + ggplot2::scale_color_discrete() # zoom in on a window of iterations, increase line size, # add tick marks, move legend to the top, add gray background color_scheme_set("viridisA") mcmc_trace(x[,, 1:4], window = c(100, 130), size = 1) + panel_bg(fill = "gray90", color = NA) + legend_move("top") # Rank-normalized histogram plots. Instead of showing how chains mix over # time, look at how the ranking of MCMC samples mixed between chains. color_scheme_set("viridisE") mcmc_rank_hist(x, "alpha") mcmc_rank_hist(x, pars = c("alpha", "sigma"), ref_line = TRUE) mcmc_rank_overlay(x, "alpha") # ECDF and ECDF difference plots of the ranking of MCMC samples between chains. # Provide 99\% simultaneous confidence intervals for the chains sampling from # the same distribution. mcmc_rank_ecdf(x, prob = 0.99) mcmc_rank_ecdf(x, prob = 0.99, plot_diff = TRUE) \dontrun{ # parse facet label text color_scheme_set("purple") p <- mcmc_trace( x, regex_pars = "beta\\\\[[1,3]\\\\]", facet_args = list(labeller = ggplot2::label_parsed) ) p + facet_text(size = 15) # mark first 100 draws as warmup mcmc_trace(x, n_warmup = 100) # plot as points, highlighting chain 2 color_scheme_set("brightblue") mcmc_trace_highlight(x, pars = "sigma", highlight = 2, size = 2) # for models fit using HMC/NUTS divergences can be displayed in the trace plot library("rstanarm") fit <- stan_glm(mpg ~ ., data = mtcars, refresh = 0, # next line to keep example fast and also ensure we get some divergences prior = hs(), iter = 400, adapt_delta = 0.8) # extract draws using as.array (instead of as.matrix) to keep # chains separate for trace plot posterior <- as.array(fit) # for stanfit and stanreg objects use nuts_params() to get the divergences mcmc_trace(posterior, pars = "sigma", np = nuts_params(fit)) color_scheme_set("viridis") mcmc_trace( posterior, pars = c("wt", "sigma"), size = 0.5, facet_args = list(nrow = 2), np = nuts_params(fit), np_style = trace_style_np(div_color = "black", div_size = 0.5) ) } } \references{ Vehtari, A., Gelman, A., Simpson, D., Carpenter, B., Bürkner, P. (2019). Rank-normalization, folding, and localization: An improved \emph{R}-hat for assessing convergence of MCMC. \href{https://arxiv.org/abs/1903.08008}{arXiv preprint}. Säilynoja, T., Bürkner, P., Vehtari, A. (2021). Graphical Test for Discrete Uniformity and its Applications in Goodness of Fit Evaluation and Multiple Sample Comparison \href{https://arxiv.org/abs/2103.10522}{arXiv preprint}. } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}} } \concept{MCMC} bayesplot/man/PPD-distributions.Rd0000644000176200001440000001052414556270424016654 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppd-distributions.R \name{PPD-distributions} \alias{PPD-distributions} \alias{ppd_data} \alias{ppd_dens_overlay} \alias{ppd_ecdf_overlay} \alias{ppd_dens} \alias{ppd_hist} \alias{ppd_freqpoly} \alias{ppd_freqpoly_grouped} \alias{ppd_boxplot} \title{PPD distributions} \usage{ ppd_data(ypred, group = NULL) ppd_dens_overlay( ypred, ..., size = 0.25, alpha = 0.7, trim = FALSE, bw = "nrd0", adjust = 1, kernel = "gaussian", n_dens = 1024 ) ppd_ecdf_overlay( ypred, ..., discrete = FALSE, pad = TRUE, size = 0.25, alpha = 0.7 ) ppd_dens(ypred, ..., trim = FALSE, size = 0.5, alpha = 1) ppd_hist(ypred, ..., binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE) ppd_freqpoly( ypred, ..., binwidth = NULL, bins = NULL, freq = TRUE, size = 0.5, alpha = 1 ) ppd_freqpoly_grouped( ypred, group, ..., binwidth = NULL, bins = NULL, freq = TRUE, size = 0.5, alpha = 1 ) ppd_boxplot(ypred, ..., notch = TRUE, size = 0.5, alpha = 1) } \arguments{ \item{ypred}{An \code{S} by \code{N} matrix of draws from the posterior (or prior) predictive distribution. The number of rows, \code{S}, is the size of the posterior (or prior) sample used to generate \code{ypred}. The number of columns, \code{N}, is the number of predicted observations.} \item{group}{A grouping variable of the same length as \code{y}. Will be coerced to \link[base:factor]{factor} if not already a factor. Each value in \code{group} is interpreted as the group level pertaining to the corresponding observation.} \item{...}{Currently unused.} \item{size, alpha}{Passed to the appropriate geom to control the appearance of the predictive distributions.} \item{trim}{A logical scalar passed to \code{\link[ggplot2:geom_density]{ggplot2::geom_density()}}.} \item{bw, adjust, kernel, n_dens}{Optional arguments passed to \code{\link[stats:density]{stats::density()}} to override default kernel density estimation parameters. \code{n_dens} defaults to \code{1024}.} \item{discrete}{For \code{ppc_ecdf_overlay()}, should the data be treated as discrete? The default is \code{FALSE}, in which case \code{geom="line"} is passed to \code{\link[ggplot2:stat_ecdf]{ggplot2::stat_ecdf()}}. If \code{discrete} is set to \code{TRUE} then \code{geom="step"} is used.} \item{pad}{A logical scalar passed to \code{\link[ggplot2:stat_ecdf]{ggplot2::stat_ecdf()}}.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{bins}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{freq}{For histograms, \code{freq=TRUE} (the default) puts count on the y-axis. Setting \code{freq=FALSE} puts density on the y-axis. (For many plots the y-axis text is off by default. To view the count or density labels on the y-axis see the \code{\link[=yaxis_text]{yaxis_text()}} convenience function.)} \item{notch}{For the box plot, a logical scalar passed to \code{\link[ggplot2:geom_boxplot]{ggplot2::geom_boxplot()}}. Note: unlike \code{geom_boxplot()}, the default is \code{notch=TRUE}.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Plot posterior or prior predictive distributions. Each of these functions makes the same plot as the corresponding \code{\link[=PPC-distributions]{ppc_}} function but without plotting any observed data \code{y}. The \strong{Plot Descriptions} section at \link{PPC-distributions} has details on the individual plots. } \details{ For Binomial data, the plots may be more useful if the input contains the "success" \emph{proportions} (not discrete "success" or "failure" counts). } \examples{ # difference between ppd_dens_overlay() and ppc_dens_overlay() color_scheme_set("brightblue") preds <- example_yrep_draws() ppd_dens_overlay(ypred = preds[1:50, ]) ppc_dens_overlay(y = example_y_data(), yrep = preds[1:50, ]) } \seealso{ Other PPDs: \code{\link{PPD-intervals}}, \code{\link{PPD-overview}}, \code{\link{PPD-test-statistics}} } \concept{PPDs} bayesplot/man/reexports.Rd0000644000176200001440000000061014127610044015345 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidy-params.R \docType{import} \name{reexports} \alias{reexports} \alias{vars} \title{Objects exported from other packages} \keyword{internal} \description{ These objects are imported from other packages. Follow the links below to see their documentation. \describe{ \item{dplyr}{\code{\link[dplyr]{vars}}} }} bayesplot/man/PPC-overview.Rd0000644000176200001440000001540214335220171015604 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-overview.R \name{PPC-overview} \alias{PPC-overview} \alias{PPC} \title{Graphical posterior predictive checking} \description{ The \strong{bayesplot} PPC module provides various plotting functions for creating graphical displays comparing observed data to simulated data from the posterior (or prior) predictive distribution. See the sections below for a brief discussion of the ideas behind posterior predictive checking, an overview of the available PPC plots, and tips on providing an interface to \strong{bayesplot} from another package. For plots of posterior (or prior) predictive distributions that do \emph{not} include observed data see \link{PPD-overview} instead. } \details{ The idea behind posterior predictive checking is simple: if a model is a good fit then we should be able to use it to generate data that looks a lot like the data we observed. \subsection{Posterior predictive distribution}{ To generate the data used for posterior predictive checks we simulate from the \emph{posterior predictive distribution}. The posterior predictive distribution is the distribution of the outcome variable implied by a model after using the observed data \eqn{y} (a vector of outcome values), and typically predictors \eqn{X}, to update our beliefs about the unknown parameters \eqn{\theta} in the model. For each draw of the parameters \eqn{\theta} from the posterior distribution \eqn{p(\theta \,|\, y, X)}{p(\theta | y, X)} we generate an entire vector of outcomes. The result is an \eqn{S \times N}{S x N} matrix of simulations, where \eqn{S} is the the size of the posterior sample (number of draws from the posterior distribution) and \eqn{N} is the number of data points in \eqn{y}. That is, each row of the matrix is an individual "replicated" dataset of \eqn{N} observations. } \subsection{Notation}{ When simulating from the posterior predictive distribution we can use either the same values of the predictors \eqn{X} that we used when fitting the model or new observations of those predictors. When we use the same values of \eqn{X} we denote the resulting simulations by \eqn{y^{rep}}{yrep} as they can be thought of as \emph{replications} of the outcome \eqn{y} rather than predictions for future observations. This corresponds to the notation from Gelman et. al. (2013) and is the notation used throughout the documentation for this package. } \subsection{Graphical posterior predictive checking}{ Using the datasets \eqn{y^{rep}}{yrep} drawn from the posterior predictive distribution, the functions in the \strong{bayesplot} package produce various graphical displays comparing the observed data \eqn{y} to the replications. For a more thorough discussion of posterior predictive checking see Chapter 6 of Gelman et. al. (2013). } \subsection{Prior predictive checking}{ To use \strong{bayesplot} for \emph{prior} predictive checks you can simply use draws from the prior predictive distribution instead of the posterior predictive distribution. See Gabry et al. (2019) for more on prior predictive checking and when it is reasonable to compare the prior predictive distribution to the observed data. If you want to avoid using the observed data for prior predictive checks then you can use the \strong{bayesplot} \link{PPD} plots instead, which do not take a \code{y} argument, or you can use the PPC plots but provide plausible or implausible \code{y} values that you want to compare to the prior predictive realizations. } } \section{PPC plotting functions}{ The plotting functions for prior and posterior predictive checking all have the prefix \code{ppc_} and all require the arguments \code{y}, a vector of observations, and \code{yrep}, a matrix of replications (in-sample predictions). The plots are organized into several categories, each with its own documentation: \itemize{ \item \link{PPC-distributions}: Histograms, kernel density estimates, boxplots, and other plots comparing the empirical distribution of data \code{y} to the distributions of individual simulated datasets (rows) in \code{yrep}. \item \link{PPC-test-statistics}: The distribution of a statistic, or a pair of statistics, over the simulated datasets (rows) in \code{yrep} compared to value of the statistic(s) computed from \code{y}. \item \link{PPC-intervals}: Interval estimates of \code{yrep} with \code{y} overlaid. The x-axis variable can be optionally specified by the user (e.g. to plot against a predictor variable or over time). \item \link{PPC-errors}: Plots of predictive errors (\code{y - yrep}) computed from \code{y} and each of the simulated datasets (rows) in \code{yrep}. For binomial models binned error plots are also available. \item \link{PPC-scatterplots}: Scatterplots (and similar visualizations) of the data \code{y} vs. individual simulated datasets (rows) in \code{yrep}, or vs. the average value of the distributions of each data point (columns) in \code{yrep}. \item \link{PPC-discrete}: PPC functions that can only be used if \code{y} and \code{yrep} are discrete. For example, rootograms for count outcomes and bar plots for ordinal, categorical, and multinomial outcomes. \item \link{PPC-loo}: PPC functions for predictive checks based on (approximate) leave-one-out (LOO) cross-validation. ' \item \link{PPC-censoring}: PPC functions comparing the empirical distribution of censored data \code{y} to the distributions of individual simulated datasets (rows) in \code{yrep}. } } \section{Providing an interface for predictive checking from another package}{ In addition to the various plotting functions, the \strong{bayesplot} package provides the S3 generic \code{\link[=pp_check]{pp_check()}}. Authors of \R packages for Bayesian inference are encouraged to define \code{pp_check()} methods for the fitted model objects created by their packages. See the package vignettes for more details and a simple example, and see the \strong{rstanarm} and \strong{brms} packages for full examples of \code{pp_check()} methods. } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/theme_default.Rd0000644000176200001440000000331114127610044016121 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-ggplot-themes.R \name{theme_default} \alias{theme_default} \title{Default \strong{bayesplot} plotting theme} \usage{ theme_default( base_size = getOption("bayesplot.base_size", 12), base_family = getOption("bayesplot.base_family", "serif") ) } \arguments{ \item{base_size, base_family}{Base font size and family (passed to \code{\link[ggplot2:ggtheme]{ggplot2::theme_bw()}}). It is possible to set \code{"bayesplot.base_size"} and \code{"bayesplot.base_family"} via \code{\link[=options]{options()}} to change the defaults, which are \code{12} and \code{"serif"}, respectively.} } \value{ A ggplot \link[ggplot2:theme]{theme} object. } \description{ The \code{\link[=theme_default]{theme_default()}} function returns the default ggplot \link[ggplot2:theme]{theme} used by the \strong{bayesplot} plotting functions. See \code{\link[=bayesplot_theme_set]{bayesplot_theme_set()}} for details on setting and updating the plotting theme. } \examples{ class(theme_default()) bayesplot_theme_set() # defaults to setting theme_default() x <- example_mcmc_draws() mcmc_hist(x) # change the default font size and family for bayesplots bayesplot_theme_set(theme_default(base_size = 8, base_family = "sans")) mcmc_hist(x) mcmc_areas(x, regex_pars = "beta") # change back bayesplot_theme_set() mcmc_areas(x, regex_pars = "beta") } \seealso{ \code{\link[=bayesplot_theme_set]{bayesplot_theme_set()}} to change the ggplot theme. \link{bayesplot-colors} to set or view the color scheme used for plotting. \link{bayesplot-helpers} for a variety of convenience functions, many of which provide shortcuts for tweaking theme elements after creating a plot. } bayesplot/man/PPD-test-statistics.Rd0000644000176200001440000001152314556270424017121 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppd-test-statistics.R \name{PPD-test-statistics} \alias{PPD-test-statistics} \alias{PPD-statistics} \alias{ppd_stat} \alias{ppd_stat_grouped} \alias{ppd_stat_freqpoly} \alias{ppd_stat_freqpoly_grouped} \alias{ppd_stat_2d} \alias{ppd_stat_data} \title{PPD test statistics} \usage{ ppd_stat( ypred, stat = "mean", ..., binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE ) ppd_stat_grouped( ypred, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE ) ppd_stat_freqpoly( ypred, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, freq = TRUE ) ppd_stat_freqpoly_grouped( ypred, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, freq = TRUE ) ppd_stat_2d(ypred, stat = c("mean", "sd"), ..., size = 2.5, alpha = 0.7) ppd_stat_data(ypred, group = NULL, stat) } \arguments{ \item{ypred}{An \code{S} by \code{N} matrix of draws from the posterior (or prior) predictive distribution. The number of rows, \code{S}, is the size of the posterior (or prior) sample used to generate \code{ypred}. The number of columns, \code{N}, is the number of predicted observations.} \item{stat}{A single function or a string naming a function, except for the 2D plot which requires a vector of exactly two names or functions. In all cases the function(s) should take a vector input and return a scalar statistic. If specified as a string (or strings) then the legend will display the function name(s). If specified as a function (or functions) then generic naming is used in the legend.} \item{...}{Currently unused.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{bins}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{freq}{For histograms, \code{freq=TRUE} (the default) puts count on the y-axis. Setting \code{freq=FALSE} puts density on the y-axis. (For many plots the y-axis text is off by default. To view the count or density labels on the y-axis see the \code{\link[=yaxis_text]{yaxis_text()}} convenience function.)} \item{group}{A grouping variable of the same length as \code{y}. Will be coerced to \link[base:factor]{factor} if not already a factor. Each value in \code{group} is interpreted as the group level pertaining to the corresponding observation.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting. Note: if \code{scales} is not included in \code{facet_args} then \strong{bayesplot} may use \code{scales="free"} as the default (depending on the plot) instead of the \strong{ggplot2} default of \code{scales="fixed"}.} \item{size, alpha}{For the 2D plot only, arguments passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the appearance of scatterplot points.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ The distribution of a (test) statistic \code{T(ypred)}, or a pair of (test) statistics, over the simulations from the posterior or prior predictive distribution. Each of these functions makes the same plot as the corresponding \code{\link[=PPC-test-statistics]{ppc_}} function but without comparing to any observed data \code{y}. The \strong{Plot Descriptions} section at \link{PPC-test-statistics} has details on the individual plots. } \details{ For Binomial data, the plots may be more useful if the input contains the "success" \emph{proportions} (not discrete "success" or "failure" counts). } \examples{ yrep <- example_yrep_draws() ppd_stat(yrep) ppd_stat(yrep, stat = "sd") + legend_none() # use your own function for the 'stat' argument color_scheme_set("brightblue") q25 <- function(y) quantile(y, 0.25) ppd_stat(yrep, stat = "q25") # legend includes function name } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) } \seealso{ Other PPDs: \code{\link{PPD-distributions}}, \code{\link{PPD-intervals}}, \code{\link{PPD-overview}} } \concept{PPDs} bayesplot/man/PPC-errors.Rd0000644000176200001440000001654614556465326015306 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-errors.R \name{PPC-errors} \alias{PPC-errors} \alias{ppc_error_hist} \alias{ppc_error_hist_grouped} \alias{ppc_error_scatter} \alias{ppc_error_scatter_avg} \alias{ppc_error_scatter_avg_grouped} \alias{ppc_error_scatter_avg_vs_x} \alias{ppc_error_binned} \alias{ppc_error_data} \title{PPC errors} \usage{ ppc_error_hist( y, yrep, ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE ) ppc_error_hist_grouped( y, yrep, group, ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE ) ppc_error_scatter(y, yrep, ..., facet_args = list(), size = 2.5, alpha = 0.8) ppc_error_scatter_avg(y, yrep, ..., size = 2.5, alpha = 0.8) ppc_error_scatter_avg_grouped( y, yrep, group, ..., facet_args = list(), size = 2.5, alpha = 0.8 ) ppc_error_scatter_avg_vs_x(y, yrep, x, ..., size = 2.5, alpha = 0.8) ppc_error_binned( y, yrep, ..., facet_args = list(), bins = NULL, size = 1, alpha = 0.25 ) ppc_error_data(y, yrep, group = NULL) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \code{S} by \code{N} matrix of draws from the posterior (or prior) predictive distribution. The number of rows, \code{S}, is the size of the posterior (or prior) sample used to generate \code{yrep}. The number of columns, \code{N} is the number of predicted observations (\code{length(y)}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See the \strong{Details} and \strong{Plot Descriptions} sections for additional advice specific to particular plots.} \item{...}{Currently unused.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting. Note: if \code{scales} is not included in \code{facet_args} then \strong{bayesplot} may use \code{scales="free"} as the default (depending on the plot) instead of the \strong{ggplot2} default of \code{scales="fixed"}.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{bins}{For \code{ppc_error_binned()}, the number of bins to use (approximately).} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{freq}{For histograms, \code{freq=TRUE} (the default) puts count on the y-axis. Setting \code{freq=FALSE} puts density on the y-axis. (For many plots the y-axis text is off by default. To view the count or density labels on the y-axis see the \code{\link[=yaxis_text]{yaxis_text()}} convenience function.)} \item{group}{A grouping variable of the same length as \code{y}. Will be coerced to \link[base:factor]{factor} if not already a factor. Each value in \code{group} is interpreted as the group level pertaining to the corresponding observation.} \item{size, alpha}{For scatterplots, arguments passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the appearance of the points. For the binned error plot, arguments controlling the size of the outline and opacity of the shaded region indicating the 2-SE bounds.} \item{x}{A numeric vector the same length as \code{y} to use as the x-axis variable.} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Various plots of predictive errors \code{y - yrep}. See the \strong{Details} and \strong{Plot Descriptions} sections, below. } \details{ All of these functions (aside from the \verb{*_scatter_avg} functions) compute and plot predictive errors for each row of the matrix \code{yrep}, so it is usually a good idea for \code{yrep} to contain only a small number of draws (rows). See \strong{Examples}, below. For binomial and Bernoulli data the \code{ppc_error_binned()} function can be used to generate binned error plots. Bernoulli data can be input as a vector of 0s and 1s, whereas for binomial data \code{y} and \code{yrep} should contain "success" proportions (not counts). See the \strong{Examples} section, below. } \section{Plot descriptions}{ \describe{ \item{\code{ppc_error_hist()}}{ A separate histogram is plotted for the predictive errors computed from \code{y} and each dataset (row) in \code{yrep}. For this plot \code{yrep} should have only a small number of rows. } \item{\code{ppc_error_hist_grouped()}}{ Like \code{ppc_error_hist()}, except errors are computed within levels of a grouping variable. The number of histograms is therefore equal to the product of the number of rows in \code{yrep} and the number of groups (unique values of \code{group}). } \item{\code{ppc_error_scatter()}}{ A separate scatterplot is displayed for \code{y} vs. the predictive errors computed from \code{y} and each dataset (row) in \code{yrep}. For this plot \code{yrep} should have only a small number of rows. } \item{\code{ppc_error_scatter_avg()}}{ A single scatterplot of \code{y} vs. the average of the errors computed from \code{y} and each dataset (row) in \code{yrep}. For each individual data point \code{y[n]} the average error is the average of the errors for \code{y[n]} computed over the the draws from the posterior predictive distribution. } \item{\code{ppc_error_scatter_avg_vs_x()}}{ Same as \code{ppc_error_scatter_avg()}, except the average is plotted on the y-axis and a predictor variable \code{x} is plotted on the x-axis. } \item{\code{ppc_error_binned()}}{ Intended for use with binomial data. A separate binned error plot (similar to \code{arm::binnedplot()}) is generated for each dataset (row) in \code{yrep}. For this plot \code{y} and \code{yrep} should contain proportions rather than counts, and \code{yrep} should have only a small number of rows. } } } \examples{ y <- example_y_data() yrep <- example_yrep_draws() ppc_error_hist(y, yrep[1:3, ]) # errors within groups group <- example_group_data() (p1 <- ppc_error_hist_grouped(y, yrep[1:3, ], group)) p1 + yaxis_text() # defaults to showing counts on y-axis \donttest{ table(group) # more obs in GroupB, can set freq=FALSE to show density on y-axis (p2 <- ppc_error_hist_grouped(y, yrep[1:3, ], group, freq = FALSE)) p2 + yaxis_text() } # scatterplots ppc_error_scatter(y, yrep[10:14, ]) ppc_error_scatter_avg(y, yrep) x <- example_x_data() ppc_error_scatter_avg_vs_x(y, yrep, x) \dontrun{ # binned error plot with binomial model from rstanarm library(rstanarm) example("example_model", package = "rstanarm") formula(example_model) # get observed proportion of "successes" y <- example_model$y # matrix of "success" and "failure" counts trials <- rowSums(y) y_prop <- y[, 1] / trials # proportions # get predicted success proportions yrep <- posterior_predict(example_model) yrep_prop <- sweep(yrep, 2, trials, "/") ppc_error_binned(y_prop, yrep_prop[1:6, ]) } } \references{ Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/MCMC-intervals.Rd0000644000176200001440000002535514404646343016064 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-intervals.R \name{MCMC-intervals} \alias{MCMC-intervals} \alias{mcmc_intervals} \alias{mcmc_areas} \alias{mcmc_areas_ridges} \alias{mcmc_intervals_data} \alias{mcmc_areas_data} \alias{mcmc_areas_ridges_data} \title{Plot interval estimates from MCMC draws} \usage{ mcmc_intervals( x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), outer_size = 0.5, inner_size = 2, point_size = 4, rhat = numeric() ) mcmc_areas( x, pars = character(), regex_pars = character(), transformations = list(), ..., area_method = c("equal area", "equal height", "scaled height"), prob = 0.5, prob_outer = 1, point_est = c("median", "mean", "none"), rhat = numeric(), border_size = NULL, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) mcmc_areas_ridges( x, pars = character(), regex_pars = character(), transformations = list(), ..., prob_outer = 1, prob = 1, border_size = NULL, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) mcmc_intervals_data( x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), rhat = numeric() ) mcmc_areas_data( x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 1, point_est = c("median", "mean", "none"), rhat = numeric(), bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) mcmc_areas_ridges_data( x, pars = character(), regex_pars = character(), transformations = list(), ..., prob_outer = 1, prob = 1, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) } \arguments{ \item{x}{An object containing MCMC draws: \itemize{ \item A 3-D array, matrix, list of matrices, or data frame. The \link{MCMC-overview} page provides details on how to specify each these. \item A \code{draws} object from the \pkg{\link{posterior}} package (e.g., \code{draws_array}, \code{draws_rvars}, etc.). \item An object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page. }} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{transformations}{Optionally, transformations to apply to parameters before plotting. If \code{transformations} is a function or a single string naming a function then that function will be used to transform all parameters. To apply transformations to particular parameters, the \code{transformations} argument can be a named list with length equal to the number of parameters to be transformed. Currently only univariate transformations of scalar parameters can be specified (multivariate transformations will be implemented in a future release). If \code{transformations} is a list, the name of each list element should be a parameter name and the content of each list element should be a function (or any item to match as a function via \code{\link[=match.fun]{match.fun()}}, e.g. a string naming a function). If a function is specified by its name as a string (e.g. \code{"log"}), then it can be used to construct a new parameter label for the appropriate parameter (e.g. \code{"log(sigma)"}). If a function itself is specified (e.g. \code{log} or \code{function(x) log(x)}) then \code{"t"} is used in the new parameter label to indicate that the parameter is transformed (e.g. \code{"t(sigma)"}). Note: due to partial argument matching \code{transformations} can be abbreviated for convenience in interactive use (e.g., \code{transform}).} \item{...}{Currently unused.} \item{prob}{The probability mass to include in the inner interval (for \code{mcmc_intervals()}) or in the shaded region (for \code{mcmc_areas()}). The default is \code{0.5} (50\% interval) and \code{1} for \code{mcmc_areas_ridges()}.} \item{prob_outer}{The probability mass to include in the outer interval. The default is \code{0.9} for \code{mcmc_intervals()} (90\% interval) and \code{1} for \code{mcmc_areas()} and for \code{mcmc_areas_ridges()}.} \item{point_est}{The point estimate to show. Either \code{"median"} (the default), \code{"mean"}, or \code{"none"}.} \item{inner_size, outer_size}{For \code{mcmc_intervals()}, the size of the inner and interval segments, respectively.} \item{point_size}{For \code{mcmc_intervals()}, the size of point estimate.} \item{rhat}{An optional numeric vector of R-hat estimates, with one element per parameter included in \code{x}. If \code{rhat} is provided, the intervals/areas and point estimates in the resulting plot are colored based on R-hat value. See \code{\link[=rhat]{rhat()}} for methods for extracting R-hat estimates.} \item{area_method}{How to constrain the areas in \code{mcmc_areas()}. The default is \code{"equal area"}, setting the density curves to have the same area. With \code{"equal height"}, the curves are scaled so that the highest points across the curves are the same height. The method \code{"scaled height"} tries a compromise between to the two: the heights from \code{"equal height"} are scaled using \code{height*sqrt(height)}} \item{border_size}{For \code{mcmc_areas()} and \code{mcmc_areas_ridges()}, the size of the ridgelines.} \item{bw, adjust, kernel, n_dens}{Optional arguments passed to \code{\link[stats:density]{stats::density()}} to override default kernel density estimation parameters. \code{n_dens} defaults to \code{1024}.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Plot central (quantile-based) posterior interval estimates from MCMC draws. See the \strong{Plot Descriptions} section, below, for details. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_intervals()}}{ Plots of uncertainty intervals computed from posterior draws with all chains merged. } \item{\code{mcmc_areas()}}{ Density plots computed from posterior draws with all chains merged, with uncertainty intervals shown as shaded areas under the curves. } \item{\code{mcmc_areas_ridges()}}{ Density plot, as in \code{mcmc_areas()}, but drawn with overlapping ridgelines. This plot provides a compact display of (hierarchically) related distributions. } } } \examples{ set.seed(9262017) # load ggplot2 to use its functions to modify our plots library(ggplot2) # some parameter draws to use for demonstration x <- example_mcmc_draws(params = 6) dim(x) dimnames(x) color_scheme_set("brightblue") mcmc_intervals(x) mcmc_intervals(x, pars = c("beta[1]", "beta[2]")) mcmc_areas(x, regex_pars = "beta\\\\[[1-3]\\\\]", prob = 0.8) + labs( title = "Posterior distributions", subtitle = "with medians and 80\% intervals" ) color_scheme_set("red") p <- mcmc_areas( x, pars = c("alpha", "beta[4]"), prob = 2/3, prob_outer = 0.9, point_est = "mean", border_size = 1.5 # make the ridgelines fatter ) plot(p) \donttest{ # control spacing at top and bottom of plot # see ?ggplot2::expansion p + scale_y_discrete( limits = c("beta[4]", "alpha"), expand = expansion(add = c(1, 2)) ) p + scale_y_discrete( limits = c("beta[4]", "alpha"), expand = expansion(add = c(.1, .3)) ) # relabel parameters p + scale_y_discrete( labels = c("alpha" = "param label 1", "beta[4]" = "param label 2") ) # relabel parameters and define the order p + scale_y_discrete( labels = c("alpha" = "param label 1", "beta[4]" = "param label 2"), limits = c("beta[4]", "alpha") ) # color by rhat value color_scheme_set("blue") fake_rhat_values <- c(1, 1.07, 1.3, 1.01, 1.15, 1.005) mcmc_intervals(x, rhat = fake_rhat_values) # get the dataframe that is used in the plotting functions mcmc_intervals_data(x) mcmc_intervals_data(x, rhat = fake_rhat_values) mcmc_areas_data(x, pars = "alpha") color_scheme_set("gray") p <- mcmc_areas(x, pars = c("alpha", "beta[4]"), rhat = c(1, 1.1)) p + legend_move("bottom") p + legend_move("none") # or p + legend_none() } # Different area calculations b3 <- c("beta[1]", "beta[2]", "beta[3]") mcmc_areas(x, pars = b3, area_method = "equal area") + labs( title = "Curves have same area", subtitle = "A wide, uncertain interval is spread thin when areas are equal" ) mcmc_areas(x, pars = b3, area_method = "equal height") + labs( title = "Curves have same maximum height", subtitle = "Local curvature is clearer but more uncertain curves use more area" ) mcmc_areas(x, pars = b3, area_method = "scaled height") + labs( title = "Same maximum heights but heights scaled by square-root", subtitle = "Compromise: Local curvature is accentuated and less area is used" ) \donttest{ # apply transformations mcmc_intervals( x, pars = c("beta[2]", "sigma"), transformations = list("sigma" = "log", "beta[2]" = function(x) x + 3) ) # apply same transformation to all selected parameters mcmc_intervals(x, regex_pars = "beta", transformations = "exp") } \dontrun{ # example using fitted model from rstanarm package library(rstanarm) fit <- stan_glm( mpg ~ 0 + wt + factor(cyl), data = mtcars, iter = 500, refresh = 0 ) x <- as.matrix(fit) color_scheme_set("teal") mcmc_intervals(x, point_est = "mean", prob = 0.8, prob_outer = 0.95) mcmc_areas(x, regex_pars = "cyl", bw = "SJ", rhat = rhat(fit, regex_pars = "cyl")) } \dontrun{ # Example of hierarchically related parameters # plotted with ridgelines m <- shinystan::eight_schools@posterior_sample mcmc_areas_ridges(m, pars = "mu", regex_pars = "theta", border_size = 0.75) + ggtitle("Treatment effect on eight schools (Rubin, 1981)") } } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/PPC-censoring.Rd0000644000176200001440000000774314212422623015736 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-censoring.R \name{PPC-censoring} \alias{PPC-censoring} \alias{ppc_km_overlay} \alias{ppc_km_overlay_grouped} \title{PPC censoring} \usage{ ppc_km_overlay(y, yrep, ..., status_y, size = 0.25, alpha = 0.7) ppc_km_overlay_grouped(y, yrep, group, ..., status_y, size = 0.25, alpha = 0.7) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \code{S} by \code{N} matrix of draws from the posterior (or prior) predictive distribution. The number of rows, \code{S}, is the size of the posterior (or prior) sample used to generate \code{yrep}. The number of columns, \code{N} is the number of predicted observations (\code{length(y)}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See the \strong{Details} and \strong{Plot Descriptions} sections for additional advice specific to particular plots.} \item{...}{Currently only used internally.} \item{status_y}{The status indicator for the observations from \code{y}. This must be a numeric vector of the same length as \code{y} with values in \{0, 1\} (0 = right censored, 1 = event).} \item{size, alpha}{Passed to the appropriate geom to control the appearance of the \code{yrep} distributions.} \item{group}{A grouping variable of the same length as \code{y}. Will be coerced to \link[base:factor]{factor} if not already a factor. Each value in \code{group} is interpreted as the group level pertaining to the corresponding observation.} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Compare the empirical distribution of censored data \code{y} to the distributions of simulated/replicated data \code{yrep} from the posterior predictive distribution. See the \strong{Plot Descriptions} section, below, for details. Although some of the other \pkg{bayesplot} plots can be used with censored data, \code{ppc_km_overlay()} is currently the only plotting function designed \emph{specifically} for censored data. We encourage you to suggest or contribute additional plots at \href{https://github.com/stan-dev/bayesplot}{github.com/stan-dev/bayesplot}. } \section{Plot Descriptions}{ \describe{ \item{\code{ppc_km_overlay()}}{ Empirical CCDF estimates of each dataset (row) in \code{yrep} are overlaid, with the Kaplan-Meier estimate (Kaplan and Meier, 1958) for \code{y} itself on top (and in a darker shade). This is a PPC suitable for right-censored \code{y}. Note that the replicated data from \code{yrep} is assumed to be uncensored. } \item{\code{ppc_km_overlay_grouped()}}{ The same as \code{ppc_km_overlay()}, but with separate facets by \code{group}. } } } \examples{ color_scheme_set("brightblue") y <- example_y_data() # For illustrative purposes, (right-)censor values y > 110: status_y <- as.numeric(y <= 110) y <- pmin(y, 110) # In reality, the replicated data (yrep) would be obtained from a # model which takes the censoring of y properly into account. Here, # for illustrative purposes, we simply use example_yrep_draws(): yrep <- example_yrep_draws() dim(yrep) \donttest{ ppc_km_overlay(y, yrep[1:25, ], status_y = status_y) } # With separate facets by group: group <- example_group_data() \donttest{ ppc_km_overlay_grouped(y, yrep[1:25, ], group = group, status_y = status_y) } } \references{ Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) Kaplan, E. L. and Meier, P. (1958). Nonparametric estimation from incomplete observations. \emph{Journal of the American Statistical Association}. 53(282), 457--481. doi:10.1080/01621459.1958.10501452. } \seealso{ Other PPCs: \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/bayesplot-colors.Rd0000644000176200001440000001265214127610043016623 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-colors.R \name{bayesplot-colors} \alias{bayesplot-colors} \alias{color_scheme_set} \alias{color_scheme_get} \alias{color_scheme_view} \title{Set, get, or view \strong{bayesplot} color schemes} \usage{ color_scheme_set(scheme = "blue") color_scheme_get(scheme = NULL, i = NULL) color_scheme_view(scheme = NULL) } \arguments{ \item{scheme}{For \code{color_scheme_set()}, either a string naming one of the available color schemes or a character vector of \emph{exactly six} colors specifying a custom scheme. For \code{color_scheme_get()}, \code{scheme} can be missing (to get the current color scheme) or a string naming one of the preset schemes. For \code{color_scheme_view()}, \code{scheme} can be missing (to use the current color scheme) or a character vector containing a subset of the available scheme names. See the \strong{Available color schemes} section below for a list of available scheme names. The \strong{Custom color schemes} section describes how to specify a custom scheme.} \item{i}{For \code{color_scheme_get()}, an optional subset of the integers from \code{1} (lightest) to \code{6} (darkest) indicating which of the colors in the scheme to return. If \code{i} is not specified then all six colors in the scheme are included.} } \value{ \code{color_scheme_set()} has the side effect of setting the color scheme used for plotting. It also returns (\link[base:invisible]{invisibly}) a list of the hexadecimal color values used in \code{scheme}. \code{color_scheme_get()} returns a list of the hexadecimal color values (without changing the current scheme). If the \code{scheme} argument is not specified the returned values correspond to the current color scheme. If the optional argument \code{i} is specified then the returned list only contains \code{length(i)} elements. \code{color_scheme_view()} returns a ggplot object if only a single scheme is specified and a gtable object if multiple schemes names are specified. } \description{ Set, get, or view color schemes. Choose from a preset scheme or create a custom scheme. See the \strong{Available color schemes} section below for a list of available scheme names. The \strong{Custom color schemes} section describes how to specify a custom scheme. } \section{Available color schemes}{ Currently, the available preset color schemes are: \itemize{ \item \code{"blue"}, \code{"brightblue"} \item \code{"gray"}, \code{"darkgray"} \item \code{"green"} \item \code{"pink"} \item \code{"purple"} \item \code{"red"} \item \code{"teal"} \item \code{"yellow"} \item \href{https://CRAN.R-project.org/package=viridis}{\code{"viridis"}}, \code{"viridisA"}, \code{"viridisB"}, \code{"viridisC"}, \code{"viridisD"}, \code{"viridisE"} \item \code{"mix-x-y"}, replacing \code{x} and \code{y} with any two of the scheme names listed above (e.g. "mix-teal-pink", "mix-blue-red", etc.). The order of \code{x} and \code{y} matters, i.e., the color schemes \code{"mix-blue-red"} and \code{"mix-red-blue"} are not identical. There is no guarantee that every possible mixed scheme will look good with every possible plot. \item \code{"brewer-x"}, replacing \code{x} with the name of a palette available from \code{\link[RColorBrewer:ColorBrewer]{RColorBrewer::brewer.pal()}} (e.g., \code{brewer-PuBuGn}). } If you have a suggestion for a new color scheme please let us know via the \strong{bayesplot} \href{https://github.com/stan-dev/bayesplot/issues}{issue tracker}. } \section{Custom color schemes}{ A \strong{bayesplot} color scheme consists of six colors. To specify a custom color scheme simply pass a character vector containing either the names of six \link[grDevices:colors]{colors} or six hexadecimal color values (or a mix of names and hex values). The colors should be in order from lightest to darkest. See the end of the \strong{Examples} section for a demonstration. } \examples{ color_scheme_set("blue") color_scheme_view() color_scheme_get() color_scheme_get(i = c(3, 5)) # 3rd and 5th colors only color_scheme_get("brightblue") color_scheme_view("brightblue") # compare multiple schemes color_scheme_view(c("pink", "gray", "teal")) color_scheme_view(c("viridis", "viridisA", "viridisB", "viridisC")) color_scheme_set("pink") x <- example_mcmc_draws() mcmc_intervals(x) color_scheme_set("teal") color_scheme_view() mcmc_intervals(x) color_scheme_set("red") mcmc_areas(x, regex_pars = "beta") color_scheme_set("purple") color_scheme_view() y <- example_y_data() yrep <- example_yrep_draws() ppc_stat(y, yrep, stat = "mean") + legend_none() ############################ ### Mixing color schemes ### ############################ color_scheme_set("mix-teal-pink") ppc_stat(y, yrep, stat = "sd") + legend_none() mcmc_areas(x, regex_pars = "beta") ########################## ### ColorBrewer scheme ### ########################## color_scheme_set("brewer-Spectral") color_scheme_view() mcmc_trace(x, pars = "sigma") ########################### ### Custom color scheme ### ########################### orange_scheme <- c("#ffebcc", "#ffcc80", "#ffad33", "#e68a00", "#995c00", "#663d00") color_scheme_set(orange_scheme) color_scheme_view() mcmc_areas(x, regex_pars = "alpha") mcmc_dens_overlay(x) ppc_stat(y, yrep, stat = "var") + legend_none() } \seealso{ \code{\link[=theme_default]{theme_default()}} for the default ggplot theme used by \strong{bayesplot} and \code{\link[=bayesplot_theme_set]{bayesplot_theme_set()}} to change it. } bayesplot/man/PPC-distributions.Rd0000644000176200001440000003037714563172262016662 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-distributions.R \name{PPC-distributions} \alias{PPC-distributions} \alias{ppc_data} \alias{ppc_dens_overlay} \alias{ppc_dens_overlay_grouped} \alias{ppc_ecdf_overlay} \alias{ppc_ecdf_overlay_grouped} \alias{ppc_dens} \alias{ppc_hist} \alias{ppc_freqpoly} \alias{ppc_freqpoly_grouped} \alias{ppc_boxplot} \alias{ppc_violin_grouped} \alias{ppc_pit_ecdf} \alias{ppc_pit_ecdf_grouped} \title{PPC distributions} \usage{ ppc_data(y, yrep, group = NULL) ppc_dens_overlay( y, yrep, ..., size = 0.25, alpha = 0.7, trim = FALSE, bw = "nrd0", adjust = 1, kernel = "gaussian", n_dens = 1024 ) ppc_dens_overlay_grouped( y, yrep, group, ..., size = 0.25, alpha = 0.7, trim = FALSE, bw = "nrd0", adjust = 1, kernel = "gaussian", n_dens = 1024 ) ppc_ecdf_overlay( y, yrep, ..., discrete = FALSE, pad = TRUE, size = 0.25, alpha = 0.7 ) ppc_ecdf_overlay_grouped( y, yrep, group, ..., discrete = FALSE, pad = TRUE, size = 0.25, alpha = 0.7 ) ppc_dens(y, yrep, ..., trim = FALSE, size = 0.5, alpha = 1) ppc_hist( y, yrep, ..., binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE ) ppc_freqpoly( y, yrep, ..., binwidth = NULL, bins = NULL, freq = TRUE, size = 0.5, alpha = 1 ) ppc_freqpoly_grouped( y, yrep, group, ..., binwidth = NULL, bins = NULL, freq = TRUE, size = 0.5, alpha = 1 ) ppc_boxplot(y, yrep, ..., notch = TRUE, size = 0.5, alpha = 1) ppc_violin_grouped( y, yrep, group, ..., probs = c(0.1, 0.5, 0.9), size = 1, alpha = 1, y_draw = c("violin", "points", "both"), y_size = 1, y_alpha = 1, y_jitter = 0.1 ) ppc_pit_ecdf( y, yrep, ..., pit = NULL, K = NULL, prob = 0.99, plot_diff = FALSE, interpolate_adj = NULL ) ppc_pit_ecdf_grouped( y, yrep, group, ..., K = NULL, pit = NULL, prob = 0.99, plot_diff = FALSE, interpolate_adj = NULL ) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \code{S} by \code{N} matrix of draws from the posterior (or prior) predictive distribution. The number of rows, \code{S}, is the size of the posterior (or prior) sample used to generate \code{yrep}. The number of columns, \code{N} is the number of predicted observations (\code{length(y)}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See the \strong{Details} and \strong{Plot Descriptions} sections for additional advice specific to particular plots.} \item{group}{A grouping variable of the same length as \code{y}. Will be coerced to \link[base:factor]{factor} if not already a factor. Each value in \code{group} is interpreted as the group level pertaining to the corresponding observation.} \item{...}{Currently unused.} \item{size, alpha}{Passed to the appropriate geom to control the appearance of the predictive distributions.} \item{trim}{A logical scalar passed to \code{\link[ggplot2:geom_density]{ggplot2::geom_density()}}.} \item{bw, adjust, kernel, n_dens}{Optional arguments passed to \code{\link[stats:density]{stats::density()}} to override default kernel density estimation parameters. \code{n_dens} defaults to \code{1024}.} \item{discrete}{For \code{ppc_ecdf_overlay()}, should the data be treated as discrete? The default is \code{FALSE}, in which case \code{geom="line"} is passed to \code{\link[ggplot2:stat_ecdf]{ggplot2::stat_ecdf()}}. If \code{discrete} is set to \code{TRUE} then \code{geom="step"} is used.} \item{pad}{A logical scalar passed to \code{\link[ggplot2:stat_ecdf]{ggplot2::stat_ecdf()}}.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{bins}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{freq}{For histograms, \code{freq=TRUE} (the default) puts count on the y-axis. Setting \code{freq=FALSE} puts density on the y-axis. (For many plots the y-axis text is off by default. To view the count or density labels on the y-axis see the \code{\link[=yaxis_text]{yaxis_text()}} convenience function.)} \item{notch}{For the box plot, a logical scalar passed to \code{\link[ggplot2:geom_boxplot]{ggplot2::geom_boxplot()}}. Note: unlike \code{geom_boxplot()}, the default is \code{notch=TRUE}.} \item{probs}{A numeric vector passed to \code{\link[ggplot2:geom_violin]{ggplot2::geom_violin()}}'s \code{draw_quantiles} argument to specify at which quantiles to draw horizontal lines. Set to \code{NULL} to remove the lines.} \item{y_draw}{For \code{ppc_violin_grouped()}, a string specifying how to draw \code{y}: \code{"violin"} (default), \code{"points"} (jittered points), or \code{"both"}.} \item{y_jitter, y_size, y_alpha}{For \code{ppc_violin_grouped()}, if \code{y_draw} is \code{"points"} or \code{"both"} then \code{y_size}, \code{y_alpha}, and \code{y_jitter} are passed to to the \code{size}, \code{alpha}, and \code{width} arguments of \code{\link[ggplot2:geom_jitter]{ggplot2::geom_jitter()}} to control the appearance of \code{y} points. The default of \code{y_jitter=NULL} will let \strong{ggplot2} determine the amount of jitter.} \item{pit}{An optional vector of probability integral transformed values for which the ECDF is to be drawn. If NULL, PIT values are computed to \code{y} with respect to the corresponding values in \code{yrep}.} \item{K}{An optional integer defining the number of equally spaced evaluation points for the PIT-ECDF. Reducing K when using \code{interpolate_adj = FALSE} makes computing the confidence bands faster. For \code{ppc_pit_ecdf} and \code{ppc_pit_ecdf_grouped}, if PIT values are supplied, defaults to \code{length(pit)}, otherwise yrep determines the maximum accuracy of the estimated PIT values and \code{K} is set to \code{min(nrow(yrep) + 1, 1000)}. For \code{mcmc_rank_ecdf}, defaults to the number of iterations per chain in \code{x}.} \item{prob}{The desired simultaneous coverage level of the bands around the ECDF. A value in (0,1).} \item{plot_diff}{A boolean defining whether to plot the difference between the observed PIT- ECDF and the theoretical expectation for uniform PIT values rather than plotting the regular ECDF. The default is \code{FALSE}, but for large samples we recommend setting \code{plot_diff=TRUE} as the difference plot will visually show a more dynamic range.} \item{interpolate_adj}{A boolean defining if the simultaneous confidence bands should be interpolated based on precomputed values rather than computed exactly. Computing the bands may be computationally intensive and the approximation gives a fast method for assessing the ECDF trajectory. The default is to use interpolation if \code{K} is greater than 200.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Compare the empirical distribution of the data \code{y} to the distributions of simulated/replicated data \code{yrep} from the posterior predictive distribution. See the \strong{Plot Descriptions} section, below, for details. } \details{ For Binomial data, the plots may be more useful if the input contains the "success" \emph{proportions} (not discrete "success" or "failure" counts). } \section{Plot Descriptions}{ \describe{ \item{\verb{ppc_hist(), ppc_freqpoly(), ppc_dens(), ppc_boxplot()}}{ A separate histogram, shaded frequency polygon, smoothed kernel density estimate, or box and whiskers plot is displayed for \code{y} and each dataset (row) in \code{yrep}. For these plots \code{yrep} should therefore contain only a small number of rows. See the \strong{Examples} section. } \item{\code{ppc_freqpoly_grouped()}}{ A separate frequency polygon is plotted for each level of a grouping variable for \code{y} and each dataset (row) in \code{yrep}. For this plot \code{yrep} should therefore contain only a small number of rows. See the \strong{Examples} section. } \item{\verb{ppc_ecdf_overlay(), ppc_dens_overlay(), ppc_ecdf_overlay_grouped(), ppc_dens_overlay_grouped()}}{ Kernel density or empirical CDF estimates of each dataset (row) in \code{yrep} are overlaid, with the distribution of \code{y} itself on top (and in a darker shade). When using \code{ppc_ecdf_overlay()} with discrete data, set the \code{discrete} argument to \code{TRUE} for better results. For an example of \code{ppc_dens_overlay()} also see Gabry et al. (2019). } \item{\code{ppc_violin_grouped()}}{ The density estimate of \code{yrep} within each level of a grouping variable is plotted as a violin with horizontal lines at notable quantiles. \code{y} is overlaid on the plot either as a violin, points, or both, depending on the \code{y_draw} argument. } \item{\code{ppc_pit_ecdf()}, \code{ppc_pit_ecdf_grouped()}}{ The PIT-ECDF of the empirical PIT values of \code{y} computed with respect to the corresponding \code{yrep} values. \code{100 * prob}\% central simultaneous confidence intervals are provided to asses if \code{y} and \code{yrep} originate from the same distribution. The PIT values can also be provided directly as \code{pit}. See Säilynoja et al. (2021) for more details.} } } \examples{ color_scheme_set("brightblue") y <- example_y_data() yrep <- example_yrep_draws() group <- example_group_data() dim(yrep) ppc_dens_overlay(y, yrep[1:25, ]) \donttest{ # ppc_ecdf_overlay with continuous data (set discrete=TRUE if discrete data) ppc_ecdf_overlay(y, yrep[sample(nrow(yrep), 25), ]) # PIT-ECDF and PIT-ECDF difference plot of the PIT values of y compared to # yrep with 99\% simultaneous confidence bands. ppc_pit_ecdf(y, yrep, prob = 0.99, plot_diff = FALSE) ppc_pit_ecdf(y, yrep, prob = 0.99, plot_diff = TRUE) } # for ppc_hist,dens,freqpoly,boxplot definitely use a subset yrep rows so # only a few (instead of nrow(yrep)) histograms are plotted ppc_hist(y, yrep[1:8, ]) \donttest{ color_scheme_set("red") ppc_boxplot(y, yrep[1:8, ]) # wizard hat plot color_scheme_set("blue") ppc_dens(y, yrep[200:202, ]) } \donttest{ # frequency polygons ppc_freqpoly(y, yrep[1:3, ], alpha = 0.1, size = 1, binwidth = 5) ppc_freqpoly_grouped(y, yrep[1:3, ], group) + yaxis_text() # if groups are different sizes then the 'freq' argument can be useful ppc_freqpoly_grouped(y, yrep[1:3, ], group, freq = FALSE) + yaxis_text() } # density and distribution overlays by group ppc_dens_overlay_grouped(y, yrep[1:25, ], group = group) ppc_ecdf_overlay_grouped(y, yrep[1:25, ], group = group) \donttest{ # PIT-ECDF plots of the PIT values by group # with 99\% simultaneous confidence bands. ppc_pit_ecdf_grouped(y, yrep, group=group, prob=0.99) } \donttest{ # don't need to only use small number of rows for ppc_violin_grouped # (as it pools yrep draws within groups) color_scheme_set("gray") ppc_violin_grouped(y, yrep, group, size = 1.5) ppc_violin_grouped(y, yrep, group, alpha = 0) # change how y is drawn ppc_violin_grouped(y, yrep, group, alpha = 0, y_draw = "points", y_size = 1.5) ppc_violin_grouped(y, yrep, group, alpha = 0, y_draw = "both", y_size = 1.5, y_alpha = 0.5, y_jitter = 0.33 ) } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) Säilynoja, T., Bürkner, P., Vehtari, A. (2021). Graphical Test for Discrete Uniformity and its Applications in Goodness of Fit Evaluation and Multiple Sample Comparison \href{https://arxiv.org/abs/2103.10522}{arXiv preprint}. Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/MCMC-combos.Rd0000644000176200001440000000643314212422623015321 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-combo.R \name{MCMC-combos} \alias{MCMC-combos} \alias{mcmc_combo} \title{Combination plots} \usage{ mcmc_combo(x, combo = c("dens", "trace"), ..., widths = NULL, gg_theme = NULL) } \arguments{ \item{x}{An object containing MCMC draws: \itemize{ \item A 3-D array, matrix, list of matrices, or data frame. The \link{MCMC-overview} page provides details on how to specify each these. \item A \code{draws} object from the \pkg{\link{posterior}} package (e.g., \code{draws_array}, \code{draws_rvars}, etc.). \item An object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page. }} \item{combo}{A character vector with at least two elements. Each element of \code{combo} corresponds to a column in the resulting graphic and should be the name of one of the available \link[=MCMC-overview]{MCMC} functions (omitting the \code{mcmc_} prefix).} \item{...}{Arguments passed to the plotting functions named in \code{combo}.} \item{widths}{A numeric vector the same length as \code{combo} specifying relative column widths. For example, if the plot has two columns, then \code{widths = c(2, 1)} will allocate more space for the first column by a factor of 2 (as would \code{widths = c(.3, .15)}, etc.). The default, \code{NULL}, allocates the same horizontal space for each column.} \item{gg_theme}{Unlike most of the other \strong{bayesplot} functions, \code{mcmc_combo} returns a gtable object rather than a ggplot object, and so theme objects can't be added directly to the returned plot object. The \code{gg_theme} argument helps get around this problem by accepting a \strong{ggplot2} \link[ggplot2:theme]{theme} object that is added to each of the plots \emph{before} combining them into the gtable object that is returned. This can be a theme object created by a call to \code{\link[ggplot2:theme]{ggplot2::theme()}} or one of the \strong{bayesplot} convenience functions, e.g. \code{\link[=legend_none]{legend_none()}} (see the \strong{Examples} section, below).} } \value{ A gtable object (the result of calling \code{\link[gridExtra:arrangeGrob]{gridExtra::arrangeGrob()}}) with \code{length(combo)} columns and a row for each parameter. } \description{ Combination plots } \examples{ # some parameter draws to use for demonstration x <- example_mcmc_draws() dim(x) dimnames(x) mcmc_combo(x, pars = c("alpha", "sigma")) mcmc_combo(x, pars = c("alpha", "sigma"), widths = c(1, 2)) \donttest{ # change second plot, show log(sigma) instead of sigma, # and remove the legends color_scheme_set("mix-blue-red") mcmc_combo( x, combo = c("dens_overlay", "trace"), pars = c("alpha", "sigma"), transformations = list(sigma = "log"), gg_theme = legend_none() ) # same thing but this time also change the entire ggplot theme mcmc_combo( x, combo = c("dens_overlay", "trace"), pars = c("alpha", "sigma"), transformations = list(sigma = "log"), gg_theme = ggplot2::theme_gray() + legend_none() ) } } \seealso{ Other MCMC: \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/bayesplot-helpers.Rd0000644000176200001440000002612414335264324016773 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-helpers.R \name{bayesplot-helpers} \alias{bayesplot-helpers} \alias{vline_at} \alias{hline_at} \alias{vline_0} \alias{hline_0} \alias{abline_01} \alias{lbub} \alias{legend_move} \alias{legend_none} \alias{legend_text} \alias{xaxis_title} \alias{xaxis_text} \alias{xaxis_ticks} \alias{yaxis_title} \alias{yaxis_text} \alias{yaxis_ticks} \alias{facet_text} \alias{facet_bg} \alias{panel_bg} \alias{plot_bg} \alias{grid_lines} \alias{overlay_function} \title{Convenience functions for adding or changing plot details} \usage{ vline_at(v, fun, ..., na.rm = TRUE) hline_at(v, fun, ..., na.rm = TRUE) vline_0(..., na.rm = TRUE) hline_0(..., na.rm = TRUE) abline_01(..., na.rm = TRUE) lbub(p, med = TRUE) legend_move(position = "right") legend_none() legend_text(...) xaxis_title(on = TRUE, ...) xaxis_text(on = TRUE, ...) xaxis_ticks(on = TRUE, ...) yaxis_title(on = TRUE, ...) yaxis_text(on = TRUE, ...) yaxis_ticks(on = TRUE, ...) facet_text(on = TRUE, ...) facet_bg(on = TRUE, ...) panel_bg(on = TRUE, ...) plot_bg(on = TRUE, ...) grid_lines(color = "gray50", size = 0.2) overlay_function(...) } \arguments{ \item{v}{Either a numeric vector specifying the value(s) at which to draw the vertical or horizontal line(s), or an object of any type to use as the first argument to \code{fun}.} \item{fun}{A function, or the name of a function, that returns a numeric vector.} \item{...}{For the various \code{vline_}, \code{hline_}, and \code{abline_} functions, \code{...} is passed to \code{\link[ggplot2:geom_abline]{ggplot2::geom_vline()}}, \code{\link[ggplot2:geom_abline]{ggplot2::geom_hline()}}, and \code{\link[ggplot2:geom_abline]{ggplot2::geom_abline()}}, respectively, to control the appearance of the line(s). For functions ending in \verb{_bg}, \code{...} is passed to \code{\link[ggplot2:element]{ggplot2::element_rect()}}. For functions ending in \verb{_text} or \verb{_title}, \code{...} is passed to \code{\link[ggplot2:element]{ggplot2::element_text()}}. For \code{xaxis_ticks} and \code{yaxis_ticks}, \code{...} is passed to \code{\link[ggplot2:element]{ggplot2::element_line()}}. For \code{overlay_function}, \code{...} is passed to \code{\link[ggplot2:geom_function]{ggplot2::stat_function()}}.} \item{na.rm}{A logical scalar passed to the appropriate geom (e.g. \code{\link[ggplot2:geom_abline]{ggplot2::geom_vline()}}). The default is \code{TRUE}.} \item{p}{The probability mass (in \verb{[0,1]}) to include in the interval.} \item{med}{Should the median also be included in addition to the lower and upper bounds of the interval?} \item{position}{The position of the legend. Either a numeric vector (of length 2) giving the relative coordinates (between 0 and 1) for the legend, or a string among \code{"right"}, \code{"left"}, \code{"top"}, \code{"bottom"}. Using \code{position = "none"} is also allowed and is equivalent to using \code{legend_none()}.} \item{on}{For functions modifying ggplot \link[ggplot2:theme]{theme} elements, set \code{on=FALSE} to set the element to \code{\link[ggplot2:element]{ggplot2::element_blank()}}. For example, facet text can be removed by adding \code{facet_text(on=FALSE)}, or simply \code{facet_text(FALSE)} to a ggplot object. If \code{on=TRUE} (the default), then \code{...} can be used to customize the appearance of the theme element.} \item{color, size}{Passed to \code{\link[ggplot2:element]{ggplot2::element_line()}}.} } \value{ A \strong{ggplot2} layer or \code{\link[ggplot2:theme]{ggplot2::theme()}} object that can be added to existing ggplot objects, like those created by many of the \strong{bayesplot} plotting functions. See the \strong{Details} section. } \description{ Convenience functions for adding to (and changing details of) ggplot objects (many of the objects returned by \strong{bayesplot} functions). See the \strong{Examples} section, below. } \details{ \subsection{Add vertical, horizontal, and diagonal lines to plots}{ \itemize{ \item \code{vline_at()} and \code{hline_at()} return an object created by either \code{\link[ggplot2:geom_abline]{ggplot2::geom_vline()}} or \code{\link[ggplot2:geom_abline]{ggplot2::geom_hline()}} that can be added to a ggplot object to draw a vertical or horizontal line (at one or several values). If \code{fun} is missing then the lines are drawn at the values in \code{v}. If \code{fun} is specified then the lines are drawn at the values returned by \code{fun(v)}. \item \code{vline_0()} and \code{hline_0()} are wrappers for \code{vline_at()} and \code{hline_at()} with \code{v = 0} and \code{fun} missing. \item \code{abline_01()} is a wrapper for \code{\link[ggplot2:geom_abline]{ggplot2::geom_abline()}} with the intercept set to \code{0} and the slope set to \code{1}. \item \code{lbub()} returns a \emph{function} that takes a single argument \code{x} and returns the lower and upper bounds (\code{lb}, \code{ub}) of the \code{100*p}\\% central interval of \code{x}, as well as the median (if \code{med=TRUE}). } } \subsection{Control appearance of facet strips}{ \itemize{ \item \code{facet_text()} returns ggplot2 theme objects that can be added to an existing plot (ggplot object) to format the text in facet strips. \item \code{facet_bg()} can be added to a plot to change the background of the facet strips. } } \subsection{Move legend, remove legend, or style the legend text}{ \itemize{ \item \code{legend_move()} and \code{legend_none()} return a ggplot2 theme object that can be added to an existing plot (ggplot object) in order to change the position of the legend or remove it. \item \code{legend_text()} works much like \code{facet_text()} but for the legend. } } \subsection{Control appearance of \eqn{x}-axis and \eqn{y}-axis features}{ \itemize{ \item \code{xaxis_title()} and \code{yaxis_title()} return a ggplot2 theme object that can be added to an existing plot (ggplot object) in order to toggle or format the titles displayed on the \code{x} or \code{y} axis. (To change the titles themselves use \code{\link[ggplot2:labs]{ggplot2::labs()}}.) \item \code{xaxis_text()} and \code{yaxis_text()} return a ggplot2 theme object that can be added to an existing plot (ggplot object) in order to toggle or format the text displayed on the \code{x} or \code{y} axis (e.g. tick labels). \item \code{xaxis_ticks()} and \code{yaxis_ticks()} return a ggplot2 theme object that can be added to an existing plot (ggplot object) to change the appearance of the axis tick marks. } } \subsection{Customize plot background}{ \itemize{ \item \code{plot_bg()} returns a ggplot2 theme object that can be added to an existing plot (ggplot object) to format the background of the \emph{entire} plot. \item \code{panel_bg()} returns a ggplot2 theme object that can be added to an existing plot (ggplot object) to format the background of the just the plotting area. \item \code{grid_lines()} returns a ggplot2 theme object that can be added to an existing plot (ggplot object) to add grid lines to the plot background. } } \subsection{Superimpose a function on an existing plot}{ \itemize{ \item \code{overlay_function()} is a simple wrapper for \code{\link[ggplot2:geom_function]{ggplot2::stat_function()}} but with the \code{inherit.aes} argument fixed to \code{FALSE}. Fixing \code{inherit.aes=FALSE} will avoid potential errors due to the \code{\link[ggplot2:aes]{ggplot2::aes()}}thetic mapping used by certain \strong{bayesplot} plotting functions. } } } \examples{ color_scheme_set("gray") x <- example_mcmc_draws(chains = 1) dim(x) colnames(x) ################################### ### vertical & horizontal lines ### ################################### (p <- mcmc_intervals(x, regex_pars = "beta")) # vertical line at zero (with some optional styling) p + vline_0() p + vline_0(linewidth = 0.25, color = "darkgray", linetype = 2) # vertical line(s) at specified values v <- c(-0.5, 0, 0.5) p + vline_at(v, linetype = 3, linewidth = 0.25) my_lines <- vline_at(v, alpha = 0.25, linewidth = 0.75 * c(1, 2, 1), color = c("maroon", "skyblue", "violet")) p + my_lines \donttest{ # add vertical line(s) at computed values # (three ways of getting lines at column means) color_scheme_set("brightblue") p <- mcmc_intervals(x, regex_pars = "beta") p + vline_at(x[, 3:4], colMeans) p + vline_at(x[, 3:4], "colMeans", color = "darkgray", lty = 2, linewidth = 0.25) p + vline_at(x[, 3:4], function(a) apply(a, 2, mean), color = "orange", linewidth = 2, alpha = 0.1) } # using the lbub function to get interval lower and upper bounds (lb, ub) color_scheme_set("pink") parsed <- ggplot2::label_parsed p2 <- mcmc_hist(x, pars = "beta[1]", binwidth = 1/20, facet_args = list(labeller = parsed)) (p2 <- p2 + facet_text(size = 16)) b1 <- x[, "beta[1]"] p2 + vline_at(b1, fun = lbub(0.8), color = "gray20", linewidth = 2 * c(1,.5,1), alpha = 0.75) p2 + vline_at(b1, lbub(0.8, med = FALSE), color = "gray20", linewidth = 2, alpha = 0.75) ########################## ### format axis titles ### ########################## color_scheme_set("green") y <- example_y_data() yrep <- example_yrep_draws() (p3 <- ppc_stat(y, yrep, stat = "median", binwidth = 1/4)) # turn off the legend, turn on x-axis title p3 + legend_none() + xaxis_title(size = 13, family = "sans") + ggplot2::xlab(expression(italic(T(y)) == median(italic(y)))) ################################ ### format axis & facet text ### ################################ color_scheme_set("gray") p4 <- mcmc_trace(example_mcmc_draws(), pars = c("alpha", "sigma")) myfacets <- facet_bg(fill = "gray30", color = NA) + facet_text(face = "bold", color = "skyblue", size = 14) p4 + myfacets \donttest{ ########################## ### control tick marks ### ########################## p4 + myfacets + yaxis_text(FALSE) + yaxis_ticks(FALSE) + xaxis_ticks(linewidth = 1, color = "skyblue") } ############################## ### change plot background ### ############################## color_scheme_set("blue") # add grid lines ppc_stat(y, yrep) + grid_lines() # panel_bg vs plot_bg ppc_scatter_avg(y, yrep) + panel_bg(fill = "gray90") ppc_scatter_avg(y, yrep) + plot_bg(fill = "gray90") color_scheme_set("yellow") p5 <- ppc_scatter_avg(y, yrep, alpha = 1) p5 + panel_bg(fill = "gray20") + grid_lines(color = "white") \donttest{ color_scheme_set("purple") ppc_dens_overlay(y, yrep[1:30, ]) + legend_text(size = 14) + legend_move(c(0.75, 0.5)) + plot_bg(fill = "gray90") + panel_bg(color = "black", fill = "gray99", linewidth = 3) } ############################################### ### superimpose a function on existing plot ### ############################################### # compare posterior of beta[1] to Gaussian with same posterior mean # and sd as beta[1] x <- example_mcmc_draws(chains = 4) dim(x) purple_gaussian <- overlay_function( fun = dnorm, args = list(mean(x[,, "beta[1]"]), sd(x[,, "beta[1]"])), color = "purple", linewidth = 2 ) color_scheme_set("gray") mcmc_hist(x, pars = "beta[1]", freq = FALSE) + purple_gaussian \donttest{ mcmc_dens(x, pars = "beta[1]") + purple_gaussian } } \seealso{ \code{\link[=theme_default]{theme_default()}} for the default ggplot theme used by \strong{bayesplot}. } bayesplot/man/bayesplot_grid.Rd0000644000176200001440000000543214127610044016330 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot_grid.R \name{bayesplot_grid} \alias{bayesplot_grid} \title{Arrange plots in a grid} \usage{ bayesplot_grid( ..., plots = list(), xlim = NULL, ylim = NULL, grid_args = list(), titles = character(), subtitles = character(), legends = TRUE, save_gg_objects = TRUE ) } \arguments{ \item{...}{One or more ggplot objects.} \item{plots}{A list of ggplot objects. Can be used as an alternative to specifying plot objects via \code{...}.} \item{xlim, ylim}{Optionally, numeric vectors of length 2 specifying lower and upper limits for the axes that will be shared across all plots.} \item{grid_args}{An optional named list of arguments to pass to \code{\link[gridExtra:arrangeGrob]{gridExtra::arrangeGrob()}} (\code{nrow}, \code{ncol}, \code{widths}, etc.).} \item{titles, subtitles}{Optional character vectors of plot titles and subtitles. If specified, \code{titles} and \code{subtitles} must must have length equal to the number of plots specified.} \item{legends}{If any of the plots have legends should they be displayed? Defaults to \code{TRUE}.} \item{save_gg_objects}{If \code{TRUE}, the default, then the ggplot objects specified in \code{...} or via the \code{plots} argument are saved in a list in the \code{"bayesplots"} component of the returned object. Setting this to \code{FALSE} will make the returned object smaller but these individual plot objects will not be available.} } \value{ An object of class \code{"bayesplot_grid"} (essentially a gtable object from \code{\link[gridExtra:arrangeGrob]{gridExtra::arrangeGrob()}}), which has a \code{plot} method. } \description{ The \code{bayesplot_grid} function makes it simple to juxtapose plots using common \eqn{x} and/or \eqn{y} axes. } \examples{ y <- example_y_data() yrep <- example_yrep_draws() stats <- c("sd", "median", "max", "min") color_scheme_set("pink") bayesplot_grid( plots = lapply(stats, function(s) ppc_stat(y, yrep, stat = s)), titles = stats, legends = FALSE, grid_args = list(ncol = 1) ) \dontrun{ library(rstanarm) mtcars$log_mpg <- log(mtcars$mpg) fit1 <- stan_glm(mpg ~ wt, data = mtcars, refresh = 0) fit2 <- stan_glm(log_mpg ~ wt, data = mtcars, refresh = 0) y <- mtcars$mpg yrep1 <- posterior_predict(fit1, draws = 50) yrep2 <- posterior_predict(fit2, fun = exp, draws = 50) color_scheme_set("blue") ppc1 <- ppc_dens_overlay(y, yrep1) ppc1 ppc1 + yaxis_text() color_scheme_set("red") ppc2 <- ppc_dens_overlay(y, yrep2) bayesplot_grid(ppc1, ppc2) # make sure the plots use the same limits for the axes bayesplot_grid(ppc1, ppc2, xlim = c(-5, 60), ylim = c(0, 0.2)) # remove the legends and add text bayesplot_grid(ppc1, ppc2, xlim = c(-5, 60), ylim = c(0, 0.2), legends = FALSE, subtitles = rep("Predicted MPG", 2)) } } bayesplot/man/MCMC-recover.Rd0000644000176200001440000001365214556270424015520 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-recover.R \name{MCMC-recover} \alias{MCMC-recover} \alias{mcmc_recover_intervals} \alias{mcmc_recover_scatter} \alias{mcmc_recover_hist} \title{Compare MCMC estimates to "true" parameter values} \usage{ mcmc_recover_intervals( x, true, batch = rep(1, length(true)), ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), size = 4, alpha = 1 ) mcmc_recover_scatter( x, true, batch = rep(1, length(true)), ..., facet_args = list(), point_est = c("median", "mean"), size = 3, alpha = 1 ) mcmc_recover_hist( x, true, ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL ) } \arguments{ \item{x}{An object containing MCMC draws: \itemize{ \item A 3-D array, matrix, list of matrices, or data frame. The \link{MCMC-overview} page provides details on how to specify each these. \item A \code{draws} object from the \pkg{\link{posterior}} package (e.g., \code{draws_array}, \code{draws_rvars}, etc.). \item An object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page. }} \item{true}{A numeric vector of "true" values of the parameters in \code{x}. There should be one value in \code{true} for each parameter included in \code{x} and the order of the parameters in \code{true} should be the same as the order of the parameters in \code{x}.} \item{batch}{Optionally, a vector-like object (numeric, character, integer, factor) used to split the parameters into batches. If \code{batch} is specified, it must have the same length as \code{true} and be in the same order as \code{true}. Parameters in the same batch will be grouped together in the same facet in the plot (see the \strong{Examples} section, below). The default is to group all parameters together into a single batch. Changing the default is most useful when parameters are on very different scales, in which case \code{batch} can be used to group them into batches within which it makes sense to use the same y-axis.} \item{...}{Currently unused.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting. Note: if \code{scales} is not included in \code{facet_args} then \strong{bayesplot} may use \code{scales="free"} as the default (depending on the plot) instead of the \strong{ggplot2} default of \code{scales="fixed"}.} \item{prob}{The probability mass to include in the inner interval. The default is \code{0.5} (50\% interval).} \item{prob_outer}{The probability mass to include in the outer interval. The default is \code{0.9} (90\% interval).} \item{point_est}{The point estimate to show. Either \code{"median"} (the default), \code{"mean"}, or \code{"none"}.} \item{size, alpha}{Passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the appearance of plotted points.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{bins}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Plots comparing MCMC estimates to "true" parameter values. Before fitting a model to real data it is useful to simulate data according to the model using known (fixed) parameter values and to check that these "true" parameter values are (approximately) recovered by fitting the model to the simulated data. See the \strong{Plot Descriptions} section, below, for details on the available plots. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_recover_intervals()}}{ Central intervals and point estimates computed from MCMC draws, with "true" values plotted using a different shape. } \item{\code{mcmc_recover_scatter()}}{ Scatterplot of posterior means (or medians) against "true" values. } \item{\code{mcmc_recover_hist()}}{ Histograms of the draws for each parameter with the "true" value overlaid as a vertical line. } } } \examples{ \dontrun{ library(rstanarm) alpha <- 1; beta <- rnorm(10, 0, 3); sigma <- 2 X <- matrix(rnorm(1000), 100, 10) y <- rnorm(100, mean = c(alpha + X \%*\% beta), sd = sigma) fit <- stan_glm(y ~ ., data = data.frame(y, X), refresh = 0) draws <- as.matrix(fit) print(colnames(draws)) true <- c(alpha, beta, sigma) mcmc_recover_intervals(draws, true) # put the coefficients on X into the same batch mcmc_recover_intervals(draws, true, batch = c(1, rep(2, 10), 1)) # equivalent mcmc_recover_intervals(draws, true, batch = grepl("X", colnames(draws))) # same but facets stacked vertically mcmc_recover_intervals(draws, true, batch = grepl("X", colnames(draws)), facet_args = list(ncol = 1), size = 3) # each parameter in its own facet mcmc_recover_intervals(draws, true, batch = 1:ncol(draws)) # same but in a different order mcmc_recover_intervals(draws, true, batch = c(1, 3, 4, 2, 5:12)) # present as bias by centering with true values mcmc_recover_intervals(sweep(draws, 2, true), rep(0, ncol(draws))) + hline_0() # scatterplot of posterior means vs true values mcmc_recover_scatter(draws, true, point_est = "mean") # histograms of parameter draws with true value added as vertical line color_scheme_set("brightblue") mcmc_recover_hist(draws[, 1:4], true[1:4]) } } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/tidy-params.Rd0000644000176200001440000001610614335264324015562 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidy-params.R \name{tidy-params} \alias{tidy-params} \alias{param_range} \alias{param_glue} \title{Tidy parameter selection} \usage{ param_range(prefix, range, vars = NULL) param_glue(pattern, ..., vars = NULL) } \arguments{ \item{prefix, range}{For \code{param_range()} only, \code{prefix} is a string naming a parameter and \code{range} is an integer vector providing the indices of a subset of elements to select. For example, using \if{html}{\out{

}}\preformatted{ param_range("beta", c(1,2,8)) }\if{html}{\out{
}} would select parameters named \code{beta[1]}, \code{beta[2]}, and \code{beta[8]}. \code{param_range()} is only designed for the case that the indices are integers surrounded by brackets. If there are no brackets use \link[tidyselect:language]{num_range()}.} \item{vars}{\code{NULL} or a character vector of parameter names to choose from. This is only needed for the atypical use case of calling the function as a standalone function outside of \code{vars()}, \code{select()}, etc. Typically this is left as \code{NULL} and will be set automatically for the user.} \item{pattern, ...}{For \code{param_glue()} only, \code{pattern} is a string containing expressions enclosed in braces and \code{...} should be named arguments providing one character vector per expression in braces in \code{pattern}. It is easiest to describe how to use these arguments with an example: \if{html}{\out{
}}\preformatted{param_glue("beta_\{var\}[\{level\}]", var = c("age", "income"), level = c(3,8)) }\if{html}{\out{
}} would select parameters with names \code{"beta_age[3]"}, \code{"beta_income[3]"}, \code{"beta_age[8]"}, \code{"beta_income[8]"}.} } \description{ Parameter selection in the style of \strong{dplyr} and other tidyverse packages. } \details{ As of version \verb{1.7.0}, \strong{bayesplot} allows the \code{pars} argument for \link[=MCMC-overview]{MCMC plots} to use "tidy" variable selection (in the style of the \strong{dplyr} package). The \code{\link[dplyr:vars]{vars()}} function is re-exported from \strong{dplyr} for this purpose. Features of tidy selection includes direct selection (\code{vars(alpha, sigma)}), everything-but selection (\code{vars(-alpha)}), ranged selection (\code{vars(`beta[1]`:`beta[3]`)}), support for selection functions (\code{vars(starts_with("beta"))}), and combinations of these features. See the \strong{Examples} section, below. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored because \strong{bayesplot} supports using \link[tidyselect:language]{tidyselect helper functions} (\code{starts_with()}, \code{contains()}, \code{num_range()}, etc.) for the same purpose. \strong{bayesplot} also exports some additional helper functions to help with parameter selection: \itemize{ \item \code{param_range()}: like \code{\link[tidyselect:starts_with]{num_range()}} but used when parameter indexes are in brackets (e.g. \code{beta[2]}). \item \code{param_glue()}: for more complicated parameter names with multiple indexes (including variable names) inside the brackets (e.g., \verb{beta[(Intercept) age_group:3]}). } These functions can be used inside of \code{vars()}, \code{dplyr::select()}, and similar functions, just like the \link[tidyselect:language]{tidyselect helper functions}. } \section{Extra Advice}{ Parameter names in \code{vars()} are not quoted. When the names contain special characters like brackets, they should be wrapped in backticks, as in \code{vars(`beta[1]`)}. To exclude a range of variables, wrap the sequence in parentheses and then negate it. For example, (\code{vars(-(`beta[1]`:`beta[3]`))}) would exclude \code{beta[1]}, \code{beta[2]}, and \code{beta[3]}. \code{vars()} is a helper function. It holds onto the names and expressions used to select columns. When selecting variables inside a \strong{bayesplot} function, use \code{vars(...)}: \code{mcmc_hist(data, pars = vars(alpha))}. When using \code{select()} to prepare a dataframe for a \strong{bayesplot} function, do not use \code{vars()}: \code{data \%>\% select(alpha) \%>\% mcmc_hist()}. Internally, tidy selection works by converting names and expressions into position numbers. As a result, integers will select parameters; \code{vars(1, 3)} selects the first and third ones. We do not endorse this approach because positions might change as variables are added and removed from models. To select a parameter that happens to be called \code{1}, use backticks to escape it \code{vars(`1`)}. } \examples{ x <- example_mcmc_draws(params = 6) dimnames(x) mcmc_hex(x, pars = vars(alpha, `beta[2]`)) mcmc_dens(x, pars = vars(sigma, contains("beta"))) mcmc_hist(x, pars = vars(-contains("beta"))) # using the param_range() helper mcmc_hist(x, pars = vars(param_range("beta", c(1, 3, 4)))) \donttest{ ############################# ## Examples using rstanarm ## ############################# if (requireNamespace("rstanarm", quietly = TRUE)) { # see ?rstanarm::example_model fit <- example("example_model", package = "rstanarm", local=TRUE)$value print(fit) posterior <- as.data.frame(fit) str(posterior) color_scheme_set("brightblue") mcmc_hist(posterior, pars = vars(size, contains("period"))) # same as previous but using dplyr::select() and piping library("dplyr") posterior \%>\% select(size, contains("period")) \%>\% mcmc_hist() mcmc_intervals(posterior, pars = vars(contains("herd"))) mcmc_intervals(posterior, pars = vars(contains("herd"), -contains("Sigma"))) bayesplot_theme_set(ggplot2::theme_dark()) color_scheme_set("viridisC") mcmc_areas_ridges(posterior, pars = vars(starts_with("b["))) bayesplot_theme_set() color_scheme_set("purple") not_789 <- vars(starts_with("b["), -matches("[7-9]")) mcmc_intervals(posterior, pars = not_789) # using the param_glue() helper just_149 <- vars(param_glue("b[(Intercept) herd:{level}]", level = c(1,4,9))) mcmc_intervals(posterior, pars = just_149) # same but using param_glue() with dplyr::select() # before passing to bayesplot posterior \%>\% select(param_glue("b[(Intercept) herd:{level}]", level = c(1, 4, 9))) \%>\% mcmc_intervals() } } \dontrun{ ################################### ## More examples of param_glue() ## ################################### library(dplyr) posterior <- tibble( b_Intercept = rnorm(1000), sd_condition__Intercept = rexp(1000), sigma = rexp(1000), `r_condition[A,Intercept]` = rnorm(1000), `r_condition[B,Intercept]` = rnorm(1000), `r_condition[C,Intercept]` = rnorm(1000), `r_condition[A,Slope]` = rnorm(1000), `r_condition[B,Slope]` = rnorm(1000) ) posterior # using one expression in braces posterior \%>\% select( param_glue("r_condition[{level},Intercept]", level = c("A", "B")) ) \%>\% mcmc_hist() # using multiple expressions in braces posterior \%>\% select( param_glue( "r_condition[{level},{type}]", level = c("A", "B"), type = c("Intercept", "Slope")) ) \%>\% mcmc_hist() } } \seealso{ \code{\link[glue:glue]{glue::glue()}} } bayesplot/man/example-data.Rd0000644000176200001440000000562714127610044015671 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/example-data.R \name{example-data} \alias{example-data} \alias{example_mcmc_draws} \alias{example_yrep_draws} \alias{example_y_data} \alias{example_x_data} \alias{example_group_data} \title{Example draws to use in demonstrations and tests} \usage{ example_mcmc_draws(chains = 4, params = 4) example_yrep_draws() example_y_data() example_x_data() example_group_data() } \arguments{ \item{chains}{An integer between 1 and 4 indicating the desired number of chains.} \item{params}{An integer between 1 and 6 indicating the desired number of parameters.} } \value{ See \strong{Details}. } \description{ These functions return various objects containing data used in the examples throughout the \strong{bayesplot} package documentation. } \details{ Each of these functions returns an object containing data, parameter draws, or predictions corresponding to a basic linear regression model with data \code{y} (outcome vector) and \code{X} (predictor matrix), and parameters \code{alpha} (intercept), \code{beta} (coefficient vector), and \code{sigma} (error sd). \describe{ \item{\code{example_mcmc_draws()}}{ If \code{chains > 1}, a \code{250} (iterations) by \code{chains} by \code{params} array or, if \code{chains = 1}, a \code{250} by \code{params} matrix of MCMC draws from the posterior distribution of the parameters in the linear regression model described above. If \code{params = 1} then only the draws for \code{alpha} are included in the returned object. If \code{params >= 2} then draws for \code{sigma} are also included. And if \code{params} is between \code{3} and the maximum of \code{6} then draws for regression coefficients \code{beta[k]} (\code{k} in \code{1:(params-2)}) are also included. } \item{\code{example_y_data()}}{ A numeric vector with \code{434} observations of the outcome variable in the linear regression model. } \item{\code{example_x_data()}}{ A numeric vector with \code{434} observations of one of the predictor variables in the linear regression model. } \item{\code{example_group_data()}}{ A factor variable with \code{434} observations of a grouping variable with two levels. } \item{\code{example_yrep_draws()}}{ A \code{500} (draws) by \code{434} (data points) matrix of draws from the posterior predictive distribution. Each row represents a full dataset drawn from the posterior predictive distribution of the outcome \code{y} after fitting the linear regression model mentioned above. } } } \examples{ draws <- example_mcmc_draws() dim(draws) dimnames(draws) draws <- example_mcmc_draws(1, 2) dim(draws) colnames(draws) draws <- example_mcmc_draws(params = 6) dimnames(draws)[[3]] y <- example_y_data() x <- example_x_data() group <- example_group_data() length(y) length(x) length(group) tail(data.frame(y, x, group), 5) yrep <- example_yrep_draws() dim(yrep) # ncol(yrep) = length(y) = length(x) = length(group) } \keyword{internal} bayesplot/DESCRIPTION0000644000176200001440000000446614563320543014001 0ustar liggesusersPackage: bayesplot Type: Package Title: Plotting for Bayesian Models Version: 1.11.1 Date: 2024-02-14 Authors@R: c(person("Jonah", "Gabry", role = c("aut", "cre"), email = "jsg2201@columbia.edu"), person("Tristan", "Mahr", role = "aut"), person("Paul-Christian", "Bürkner", role = "ctb"), person("Martin", "Modrák", role = "ctb"), person("Malcolm", "Barrett", role = "ctb"), person("Frank", "Weber", role = "ctb"), person("Eduardo", "Coronado Sroka", role = "ctb"), person("Teemu", "Sailynoja", role = "ctb"), person("Aki", "Vehtari", role = "ctb")) Maintainer: Jonah Gabry Description: Plotting functions for posterior analysis, MCMC diagnostics, prior and posterior predictive checks, and other visualizations to support the applied Bayesian workflow advocated in Gabry, Simpson, Vehtari, Betancourt, and Gelman (2019) . The package is designed not only to provide convenient functionality for users, but also a common set of functions that can be easily used by developers working on a variety of R packages for Bayesian modeling, particularly (but not exclusively) packages interfacing with 'Stan'. License: GPL (>= 3) URL: https://mc-stan.org/bayesplot/ BugReports: https://github.com/stan-dev/bayesplot/issues/ SystemRequirements: pandoc (>= 1.12.3), pandoc-citeproc Depends: R (>= 3.1.0) Imports: dplyr (>= 0.8.0), ggplot2 (>= 3.4.0), ggridges (>= 0.5.5), glue, posterior, reshape2, rlang (>= 0.3.0), stats, tibble (>= 2.0.0), tidyselect, utils Suggests: ggfortify, gridExtra (>= 2.2.1), hexbin, knitr (>= 1.16), loo (>= 2.0.0), RColorBrewer, rmarkdown (>= 1.0.0), rstan (>= 2.17.1), rstanarm (>= 2.17.4), rstantools (>= 1.5.0), scales, shinystan (>= 2.3.0), survival, testthat (>= 2.0.0), vdiffr (>= 1.0.2) RoxygenNote: 7.3.0 VignetteBuilder: knitr Encoding: UTF-8 NeedsCompilation: no Packaged: 2024-02-14 20:46:03 UTC; jgabry Author: Jonah Gabry [aut, cre], Tristan Mahr [aut], Paul-Christian Bürkner [ctb], Martin Modrák [ctb], Malcolm Barrett [ctb], Frank Weber [ctb], Eduardo Coronado Sroka [ctb], Teemu Sailynoja [ctb], Aki Vehtari [ctb] Repository: CRAN Date/Publication: 2024-02-15 05:30:11 UTC bayesplot/build/0000755000176200001440000000000014563223213013354 5ustar liggesusersbayesplot/build/vignette.rds0000644000176200001440000000046214563223213015715 0ustar liggesusersK0N7ET/>|"$i\\뵻Z:|%wK>wG^fC\^fk:'S/MU*"XosʕJcdD9Y5۝^4)H|ϸPAвԡ҂KfN,`pX/k+z(!`Rj 뱞cMu9}|89_ śSk ^S`4v2 + $ͯm+<:ӥPvg.5}Tula4װ"Vd3N _53hbayesplot/tests/0000755000176200001440000000000014563223213013417 5ustar liggesusersbayesplot/tests/testthat/0000755000176200001440000000000014563320543015263 5ustar liggesusersbayesplot/tests/testthat/test-mcmc-recover.R0000644000176200001440000000726014335264325020754 0ustar liggesuserslibrary(bayesplot) context("MCMC: recover") set.seed(123) draws <- matrix(rnorm(4 * 1000), nrow = 1000) colnames(draws) <- c("alpha", "beta[1]", "beta[2]", "sigma") true <- c(-1, 0, 0.5, 1) test_that("mcmc_recover_intervals throws correct errors", { expect_error( mcmc_recover_intervals(draws, letters[1:ncol(draws)]), "is.numeric(true) is not TRUE", fixed = TRUE ) expect_error( mcmc_recover_intervals(draws, true[-1]), "ncol(x) == length(true) is not TRUE", fixed = TRUE ) expect_error( mcmc_recover_intervals(draws, true, batch = 1:3), "length(batch) == length(true) is not TRUE", fixed = TRUE ) expect_error( mcmc_recover_intervals(draws, true, prob = 0.8, prob_outer = 0.5), "prob_outer >= prob is not TRUE", fixed = TRUE ) expect_error( mcmc_recover_intervals(draws, true, prob = 0, prob_outer = 0.5), "prob > 0 is not TRUE", fixed = TRUE ) expect_error( mcmc_recover_intervals(draws, true, prob = .5, prob_outer = 1.1), "prob_outer <= 1 is not TRUE", fixed = TRUE ) }) test_that("mcmc_recover_intervals returns a ggplot object", { expect_gg(mcmc_recover_intervals(draws, true)) expect_gg(mcmc_recover_intervals(draws, true, batch = c(1, 2, 2, 1), point_est = "mean")) expect_gg(mcmc_recover_intervals(draws, true, batch = grepl("beta", colnames(draws)))) expect_gg(mcmc_recover_intervals(draws, true, batch = grepl("beta", colnames(draws)), facet_args = list(ncol = 1))) }) test_that("mcmc_recover_intervals works when point_est = 'none'", { a <- mcmc_recover_intervals(draws, true, batch = 1:4, point_est = "none") expect_gg(a) expect_equal(a$data$Point, rep(NA, ncol(draws))) }) test_that("mcmc_recover_scatter returns a ggplot object", { expect_gg( mcmc_recover_scatter(draws, true) ) expect_gg( mcmc_recover_scatter( draws, true, batch = 1:4, point_est = "mean", facet_args = list(scales = "fixed") ) ) expect_gg( mcmc_recover_scatter( draws, true, batch = c(1, 2, 2, 1), point_est = "mean" ) ) expect_gg( mcmc_recover_scatter( draws, true, batch = grepl("beta", colnames(draws)) ) ) expect_gg( mcmc_recover_scatter( draws, true, batch = grepl("beta", colnames(draws)), facet_args = list(ncol = 1) ) ) }) test_that("mcmc_recover_hist returns a ggplot object", { expect_gg(mcmc_recover_hist(draws, true, binwidth = 0.1)) expect_gg(mcmc_recover_hist(draws, true, binwidth = 0.1, facet_args = list(nrow = 1))) }) # Visual tests ----------------------------------------------------------------- test_that("mcmc_recover_hist renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") p_base <- mcmc_recover_hist(draws, true, binwidth = 0.01) vdiffr::expect_doppelganger("mcmc_recover_hist (default)", p_base) }) test_that("mcmc_recover_intervals renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") p_base <- mcmc_recover_intervals(draws, true) vdiffr::expect_doppelganger("mcmc_recover_intervals (default)", p_base) p_custom <- mcmc_recover_intervals(draws, true, prob = 0.6, prob_outer = 0.8) vdiffr::expect_doppelganger("mcmc_recover_intervals (prob)", p_custom) }) test_that("mcmc_recover_scatter renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") p_base <- mcmc_recover_scatter(draws, true) vdiffr::expect_doppelganger("mcmc_recover_scatter (default)", p_base) p_custom <- mcmc_recover_scatter(draws, true, size = 6) vdiffr::expect_doppelganger("mcmc_recover_scatter (size)", p_custom) }) bayesplot/tests/testthat/test-ppc-loo.R0000644000176200001440000001722014556270424017742 0ustar liggesuserslibrary(bayesplot) context("PPC: loo") options(useFancyQuotes = FALSE) if (requireNamespace("rstanarm", quietly = TRUE) && requireNamespace("loo", quietly = TRUE)) { suppressPackageStartupMessages(library(rstanarm)) suppressPackageStartupMessages(library(loo)) ITER <- 1000 CHAINS <- 3 fit <- stan_glm(mpg ~ wt + am, data = mtcars, iter = ITER, chains = CHAINS, refresh = 0) y <- fit$y yrep <- posterior_predict(fit) suppressWarnings( psis1 <- psis(-log_lik(fit), cores = 2) ) lw <- weights(psis1) suppressWarnings( pits <- rstantools::loo_pit(yrep, y, lw) ) } test_that("ppc_loo_pit gives deprecation warning but still works", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_warning(p1 <- ppc_loo_pit(y, yrep, lw), "deprecated") expect_gg(p1) }) test_that("ppc_loo_pit_overlay returns ggplot object", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_gg(ppc_loo_pit_overlay(y, yrep, lw, samples = 25)) expect_gg(ppc_loo_pit_overlay(y, yrep, psis_object = psis1, samples = 25)) }) test_that("ppc_loo_pit_overlay warns about binary data", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_warning( ppc_loo_pit_overlay(rep(1, length(y)), yrep, lw), "not recommended for binary data" ) }) test_that("ppc_loo_pit_overlay works with boundary_correction=TRUE", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_message(p1 <- ppc_loo_pit_overlay(y, yrep, lw, boundary_correction = TRUE), "continuous observations") expect_gg(p1) }) test_that("ppc_loo_pit_overlay works with boundary_correction=FALSE", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") p1 <- ppc_loo_pit_overlay(y, yrep, lw, boundary_correction = FALSE) expect_gg(p1) }) test_that("ppc_loo_pit_qq returns ggplot object", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_gg(p1 <- ppc_loo_pit_qq(y, yrep, lw)) expect_gg(p2 <- ppc_loo_pit_qq(y, yrep, psis_object = psis1)) expect_equal(p1$labels$x, "Uniform") expect_equal(p1$data, p2$data) expect_gg(p3 <- ppc_loo_pit_qq(y, yrep, lw, compare = "normal")) expect_equal(p3$labels$x, "Normal") }) test_that("ppc_loo_pit functions work when pit specified instead of y,yrep,lw", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_gg(ppc_loo_pit_qq(pit = pits)) expect_message( p1 <- ppc_loo_pit_qq(y = y, yrep = yrep, lw = lw, pit = pits), "'pit' specified so ignoring 'y','yrep','lw' if specified" ) expect_message( p2 <- ppc_loo_pit_qq(pit = pits) ) expect_equal(p1$data, p2$data) expect_gg(p1 <- ppc_loo_pit_overlay(pit = pits)) expect_message( ppc_loo_pit_overlay(y = y, yrep = yrep, lw = lw, pit = pits), "'pit' specified so ignoring 'y','yrep','lw' if specified" ) }) test_that("ppc_loo_intervals returns ggplot object", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_gg(ppc_loo_intervals(y, yrep, psis_object = psis1)) expect_gg(g <- ppc_loo_intervals(y, yrep, psis_object = psis1, order = "median")) expect_s3_class(g$data$x, "factor") expect_equal(nlevels(g$data$x), length(g$data$x)) # subset argument expect_gg(g <- ppc_loo_intervals(y, yrep, psis_object = psis1, subset = 1:25)) expect_equal(nrow(g$data), 25) }) test_that("ppc_loo_ribbon returns ggplot object", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_gg(ppc_loo_ribbon(y, yrep, psis_object = psis1, prob = 0.7, alpha = 0.1)) expect_gg(g <- ppc_loo_ribbon(y, yrep, psis_object = psis1, subset = 1:25)) expect_equal(nrow(g$data), 25) }) test_that("ppc_loo_intervals/ribbon work when 'intervals' specified", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") intervals <- t(apply(yrep, 2, quantile, probs = c(0.1, 0.25, 0.5, 0.75, 0.9))) expect_gg(ppc_loo_intervals(y, intervals = intervals)) expect_gg(ppc_loo_ribbon(y, intervals = intervals)) expect_message(ppc_loo_ribbon(y, intervals = intervals), "'intervals' specified so ignoring 'yrep', 'psis_object', 'subset', if specified") expect_message(ppc_loo_intervals(y, yrep, psis_object = psis1, intervals = intervals), "'intervals' specified so ignoring 'yrep', 'psis_object', 'subset', if specified") }) test_that("ppc_loo_intervals/ribbon work when 'intervals' has 3 columns", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") intervals <- t(apply(yrep, 2, quantile, probs = c(0.1, 0.5, 0.9))) expect_gg(ppc_loo_intervals(y, intervals = intervals)) expect_gg(ppc_loo_ribbon(y, intervals = intervals)) }) test_that("errors if dimensions of yrep and lw don't match", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_error( ppc_loo_pit_overlay(y, yrep, lw[, 1:5]), "identical(dim(yrep), dim(lw)) is not TRUE", fixed = TRUE ) }) test_that("error if subset is bigger than num obs", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_error(.psis_subset(psis1, 1:1000), "too many elements") expect_error( ppc_loo_intervals(y, yrep, psis_object = psis1, subset = 1:1000), "length(y) >= length(subset) is not TRUE", fixed = TRUE ) }) # Visual tests ------------------------------------------------------------ source(test_path("data-for-ppc-tests.R")) set.seed(123) test_that("ppc_loo_pit_overlay renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") skip_if_not_installed("loo") p_base <- suppressMessages(ppc_loo_pit_overlay(vdiff_loo_y, vdiff_loo_yrep, vdiff_loo_lw)) vdiffr::expect_doppelganger("ppc_loo_pit_overlay (default)", p_base) p_custom <- suppressMessages(ppc_loo_pit_overlay( vdiff_loo_y, vdiff_loo_yrep, vdiff_loo_lw, boundary_correction = FALSE )) vdiffr::expect_doppelganger("ppc_loo_pit_overlay (boundary)", p_custom) }) test_that("ppc_loo_pit_qq renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") skip_if_not_installed("loo") p_base <- ppc_loo_pit_qq(vdiff_loo_y, vdiff_loo_yrep, vdiff_loo_lw) vdiffr::expect_doppelganger("ppc_loo_pit_qq (default)", p_base) }) test_that("ppc_loo_intervals renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") skip_if_not_installed("loo") psis_object <- suppressWarnings(loo::psis(-vdiff_loo_lw)) p_base <- ppc_loo_intervals( vdiff_loo_y, vdiff_loo_yrep, psis_object = psis_object ) vdiffr::expect_doppelganger("ppc_loo_intervals (default)", p_base) p_custom <- ppc_loo_intervals( vdiff_loo_y, vdiff_loo_yrep, psis_object = psis_object, prob = 0.6, prob_outer = 0.7 ) vdiffr::expect_doppelganger("ppc_loo_intervals (prob)", p_custom) p_custom <- ppc_loo_intervals( vdiff_loo_y, vdiff_loo_yrep, psis_object = psis_object, order = "median" ) vdiffr::expect_doppelganger("ppc_loo_intervals (order)", p_custom) }) test_that("ppc_loo_ribbon renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") skip_if_not_installed("loo") psis_object <- suppressWarnings(loo::psis(-vdiff_loo_lw)) p_base <- ppc_loo_ribbon( vdiff_loo_y, vdiff_loo_yrep, psis_object = psis_object ) vdiffr::expect_doppelganger("ppc_loo_ribbon (default)", p_base) p_custom <- ppc_loo_ribbon( vdiff_loo_y, vdiff_loo_yrep, psis_object = psis_object, prob = 0.6, prob_outer = 0.7 ) vdiffr::expect_doppelganger("ppc_loo_ribbon (prob)", p_custom) p_custom <- ppc_loo_ribbon( vdiff_loo_y, vdiff_loo_yrep, psis_object = psis_object, subset = 1:10 ) vdiffr::expect_doppelganger("ppc_loo_ribbon (subset)", p_custom) }) bayesplot/tests/testthat/test-mcmc-diagnostics.R0000644000176200001440000001270114556465326021623 0ustar liggesuserslibrary(bayesplot) context("MCMC: diagnostics") source(test_path("data-for-mcmc-tests.R")) test_that("rhat and neff plots return a ggplot object", { rhat <- runif(100, 1, 1.5) expect_gg(mcmc_rhat(rhat)) expect_gg(mcmc_rhat_hist(rhat, binwidth = .01)) ratio <- runif(100, 0, 1) expect_gg(mcmc_neff(ratio)) expect_gg(mcmc_neff_hist(ratio, binwidth = .01)) # 1-D array ok expect_gg(mcmc_rhat(array(rhat))) expect_gg(mcmc_rhat_hist(array(rhat), binwidth = .01)) expect_gg(mcmc_neff(array(ratio))) expect_gg(mcmc_neff_hist(array(ratio), binwidth = .01)) # named ok rhat <- setNames(runif(5, 1, 1.5), paste0("alpha[", 1:5, "]")) expect_gg(mcmc_rhat(rhat)) # doesn't error with ratios > 1 (not common but can happen) expect_gg(mcmc_neff(ratio = c(0.5, 1, 1.25))) expect_gg(mcmc_neff(ratio = c(0.5, 1, 2))) }) test_that("rhat and neff plot functions throw correct errors & warnings", { # need vector or 1D array expect_error(mcmc_rhat_hist(cbind(1:2)), "is.array") expect_error(mcmc_neff_hist(list(1,2)), "is.numeric") # need positive rhat values expect_error(mcmc_rhat(c(-1, 1, 1)), "must be positive") # need ratios between 0 and 1 expect_error(mcmc_neff(c(-1, 0.5, 0.7)), "must be positive") # drop NAs and warn expect_warning(mcmc_rhat(c(1, 1, NA)), "Dropped 1 NAs") expect_warning(mcmc_neff(c(0.2, NA, 1, NA)), "Dropped 2 NAs") }) test_that("duplicated rhats and neffs are kept (#105)", { # https://github.com/stan-dev/bayesplot/issues/105 rhats <- runif(3, 1, 1.2) rhats <- c(rhats, rhats, rhats) df <- mcmc_rhat_data(rhats) expect_equal(nrow(df), length(rhats)) ratios <- runif(3, 0, 1) ratios <- c(ratios, ratios, ratios) df <- mcmc_neff_data(ratios) expect_equal(nrow(df), length(ratios)) }) test_that("'description' & 'rating' columns are correct (#176)", { # https://github.com/stan-dev/bayesplot/issues/176 rhats <- c(1, 1.07, 1.19, 1.07, 1.3, 1) expected_rhats <- sort(rhats) expected_ratings <- rep(c("low", "ok", "high"), each = 2) expected_descriptions <- rep(c("hat(R) <= 1.05", "hat(R) <= 1.1", "hat(R) > 1.1"), each = 2) df <- mcmc_rhat_data(rhats) expect_equal(df$value, expected_rhats) expect_equal(as.character(df$rating), expected_ratings) expect_equal(df$description, expected_descriptions) ratios <- c(0.4, 0.05, 0.6) expected_ratios <- sort(ratios) expected_ratings <- c("low", "ok", "high") expected_descriptions <- c("N[eff]/N <= 0.1", "N[eff]/N <= 0.5", "N[eff]/N > 0.5") df <- mcmc_neff_data(ratios) expect_equal(df$value, expected_ratios) expect_equal(as.character(df$rating), expected_ratings) expect_equal(df$description, expected_descriptions) }) test_that("mcmc_acf & mcmc_acf_bar return a ggplot object", { expect_gg(mcmc_acf(arr, pars = "beta[1]", regex_pars = "x\\:[2,5]")) expect_gg(mcmc_acf_bar(arr, pars = "beta[1]", regex_pars = "x\\:[2,5]")) expect_gg(mcmc_acf(arr1chain, regex_pars = "beta")) expect_gg(mcmc_acf_bar(arr1chain, regex_pars = "beta")) for (x in c("arr", "mat", "dframe", "dframe_multiple_chains", "arr1", "mat1", "dframe1")) { xx <- get(x) expect_gg(mcmc_acf(xx)) expect_gg(mcmc_acf_bar(xx)) } }) test_that("mcmc_acf & mcmc_acf_bar throw correct errors", { expect_error(mcmc_acf(arr, regex_pars = "beta", lags = 200), regexp = "Too few iterations for lags=200") }) # Visual tests ----------------------------------------------------------------- test_that("mcmc_rhat renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") rhats <- seq(from = 1, to = 1.20, length.out = 10) p_base <- mcmc_rhat(rhats) vdiffr::expect_doppelganger("mcmc_rhat (default)", p_base) p_size <- mcmc_rhat(rhats, size = 3) vdiffr::expect_doppelganger("mcmc_rhat (sized)", p_size) }) test_that("mcmc_rhat_hist renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") rhats <- seq(from = 1, to = 1.20, length.out = 10) p_base <- mcmc_rhat_hist(rhats) vdiffr::expect_doppelganger("mcmc_rhat_hist (default)", p_base) p_binwidth <- mcmc_rhat_hist(rhats, binwidth = .02) vdiffr::expect_doppelganger("mcmc_rhat_hist (binwidth)", p_binwidth) }) test_that("mcmc_neff renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") neffs <- seq(from = 0, to = 1, length.out = 20) p_base <- mcmc_neff(neffs) vdiffr::expect_doppelganger("mcmc_neff (default)", p_base) }) test_that("mcmc_neff_hist renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") neffs <- seq(from = 0, to = 1, length.out = 20) p_base <- mcmc_neff_hist(neffs) vdiffr::expect_doppelganger("mcmc_neff_hist (default)", p_base) p_binwidth <- mcmc_neff_hist(neffs, binwidth = .05) vdiffr::expect_doppelganger("mcmc_neff_hist (binwidth)", p_binwidth) }) test_that("mcmc_acf renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_acf(vdiff_dframe) vdiffr::expect_doppelganger("mcmc_acf (default)", p_base) p_lags <- mcmc_acf(vdiff_dframe, lags = 5) vdiffr::expect_doppelganger("mcmc_acf (lags)", p_lags) }) test_that("mcmc_acf_bar renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_acf_bar(vdiff_dframe) vdiffr::expect_doppelganger("mcmc_acf_bar (default)", p_base) p_lags <- mcmc_acf_bar(vdiff_dframe, lags = 5) vdiffr::expect_doppelganger("mcmc_acf_bar (lags)", p_lags) }) bayesplot/tests/testthat/test-helpers-ppc.R0000644000176200001440000000767414556465326020636 0ustar liggesuserslibrary(bayesplot) context("PPC: misc. functions") source(test_path("data-for-ppc-tests.R")) source(test_path("data-for-mcmc-tests.R")) # melt_predictions --------------------------------------------------------------- expect_molten_yrep <- function(yrep) { y <- rnorm(ncol(yrep)) yrep <- validate_predictions(yrep, length(y)) x <- melt_predictions(yrep) expect_equal(ncol(x), 5) expect_equal(nrow(x), prod(dim(yrep))) rep_nums <- rep(seq_len(nrow(yrep)), length(y)) obs_nums <- sort(rep(seq_len(length(y)), nrow(yrep))) expect_identical(colnames(x), c("y_id", "y_name", "rep_id", "rep_label", "value")) expect_equal(x$y_id, obs_nums) expect_equal(x$rep_id, rep_nums) expect_s3_class(x, "data.frame") expect_s3_class(x$rep_label, "factor") expect_type(x$rep_id, "integer") expect_type(x$y_id, "integer") expect_type(x$value, "double") } test_that("melt_predictions returns correct structure", { expect_molten_yrep(yrep) expect_molten_yrep(yrep2) load(test_path("data-for-binomial.rda")) expect_molten_yrep(Ey) expect_molten_yrep(validate_predictions(yrep, length(y))) }) # melt_and_stack ---------------------------------------------------------- test_that("melt_and_stack returns correct structure", { molten_yrep <- melt_predictions(yrep) d <- melt_and_stack(y, yrep) expect_s3_class(d, "data.frame") expect_equal(nrow(d), nrow(molten_yrep) + length(y)) sorted_names <- sort(c(colnames(molten_yrep), c("is_y", "is_y_label"))) expect_equal(sort(colnames(d)), sorted_names) }) # is_whole_number, all_counts -------------------------------------------- test_that("is_whole_number works correctly", { expect_equal(is_whole_number(c(1L, 2, 3/3, 4/5)), c(rep(TRUE, 3), FALSE)) expect_true(!is_whole_number("1")) }) test_that("all_counts works correctly", { expect_true(all_counts(1)) expect_true(all_counts(0:5)) expect_true(all_counts(matrix(rpois(10, 1), 2, 5))) expect_false(all_counts(rnorm(5))) expect_false(all_counts(c("1", "2"))) expect_false(all_counts(c(1, 1.5))) expect_false(all_counts(c(-1, 2))) }) # adjust_gamma test_that("adjust_gamma works with different adjustment methods", { set.seed(8420) expect_equal( adjust_gamma(N = 100, K = 100, L = 1, prob = .99), adjust_gamma(N = 100, K = 100, L = 1, prob = .99, interpolate_adj = TRUE), tolerance = 1e-3 ) expect_equal( adjust_gamma(N = 100, K = 100, L = 4, prob = .99, M = 1000), adjust_gamma(N = 100, K = 100, L = 4, prob = .99, interpolate_adj = TRUE), tolerance = 1e-3 ) set.seed(NULL) }) # get_interpolation_values ------------------------------------------------ test_that("get_interpolation_values catches impossible values", { expect_error( get_interpolation_values(1000, 1000, 0, .5), "No precomputed values to interpolate from for 'L' = 0." ) expect_error( get_interpolation_values(1000, 1000, 4, 0), "No precomputed values to interpolate from for 'prob' = 0." ) expect_error( get_interpolation_values(1000, 0, 4, .95), "No precomputed values available for interpolation for 'K' = 0." ) expect_error( get_interpolation_values(0, 1000, 4, .95), "No precomputed values to interpolate from for sample length of 0." ) expect_error( get_interpolation_values(1e5, 10, 4, .95), "No precomputed values to interpolate from for sample length of 1e+05", fixed = TRUE ) expect_error( get_interpolation_values(100, 300, 4, .95), "No precomputed values available for interpolation for 'K' = 300" ) }) # ecdf_intervals --------------------------------------------------------- test_that("ecdf_intervals returns right dimensions and values", { lims <- ecdf_intervals(.0001, N = 100, K = 100, L = 1) expect_named(lims, c("lower", "upper")) expect_length(lims$upper, 101) expect_length(lims$lower, 101) expect_equal(min(lims$upper), 0) expect_equal(max(lims$upper), 100) expect_equal(min(lims$lower), 0) expect_equal(max(lims$lower), 100) }) bayesplot/tests/testthat/test-pp_check.R0000644000176200001440000000201714127610044020131 0ustar liggesuserslibrary(bayesplot) context("PPC: pp_check generic and default method") test_that("default pp_check method works", { y <- example_y_data() yrep <- example_yrep_draws() g <- example_group_data() expect_equal( pp_check(y, yrep[1:50, ], ppc_dens_overlay), ppc_dens_overlay(y, yrep[1:50, ]), check.environment = FALSE ) expect_equal( pp_check(y, yrep, fun = "stat_grouped", group = g, stat = "median"), ppc_stat_grouped(y, yrep, group = g, stat = "median"), check.environment = FALSE ) }) test_that("pp_check method can be defined", { pp_check.foo <- function(object, ..., type = c("multiple", "overlaid")) { y <- object[["y"]] yrep <- object[["yrep"]] switch(match.arg(type), multiple = ppc_hist(y, yrep[1:min(8, nrow(yrep)),, drop = FALSE]), overlaid = ppc_dens_overlay(y, yrep) ) } x <- structure( list(y = rnorm(50), yrep = matrix(rnorm(500), ncol = 50)), class = "foo" ) expect_gg(pp_check(x)) expect_gg(pp_check(x, type = "overlaid")) }) bayesplot/tests/testthat/test-mcmc-scatter-and-parcoord.R0000644000176200001440000003560714404651143023324 0ustar liggesuserslibrary(bayesplot) context("MCMC: scatter, hex, and parallel coordinates plots") source(test_path("data-for-mcmc-tests.R")) if (requireNamespace("rstanarm", quietly = TRUE)) { suppressPackageStartupMessages(library(rstanarm)) # also fit an rstanarm model to use with mcmc_pairs fit <- stan_glm(mpg ~ wt + am, data = mtcars, iter = 1000, chains = 2, refresh = 0) post <- as.array(fit) lp <- log_posterior(fit) np <- ensure_divergences(nuts_params(fit)) } # mcmc_scatter/hex -------------------------------------------------------- test_that("mcmc_scatter returns a ggplot object", { expect_gg(mcmc_scatter(arr, pars = c("beta[1]", "beta[2]"))) expect_gg(mcmc_scatter(arr1chain, regex_pars = "beta", size = 3, alpha = 0.5)) expect_gg(mcmc_scatter(drawsarr, pars = c("theta[1]", "theta[2]"))) expect_gg(mcmc_scatter(mat, pars = c("sigma", "(Intercept)"))) expect_gg(mcmc_scatter(dframe, regex_pars = "x:[2,4]")) expect_gg(mcmc_scatter(dframe_multiple_chains, pars = c("sigma", "(Intercept)"))) }) test_that("mcmc_scatter throws error if number of parameters is not 2", { expect_error(mcmc_scatter(arr, pars = c("sigma", "beta[1]", "beta[2]")), "exactly 2 parameters") expect_error(mcmc_scatter(arr, pars = "sigma"), "exactly 2 parameters") expect_error(mcmc_scatter(drawsarr, pars = "mu"), "exactly 2 parameters") expect_error(mcmc_scatter(arr1), "exactly 2 parameters") expect_error(mcmc_scatter(drawsarr1), "exactly 2 parameters") expect_error(mcmc_scatter(mat1), "exactly 2 parameters") }) test_that("mcmc_scatter accepts NUTS info", { skip_if_not_installed("rstanarm") expect_gg(mcmc_scatter(post, pars = c("wt", "sigma"), np = np)) div_style <- scatter_style_np(div_color = "orange", div_size = 2, div_shape = 3, div_alpha = 0.5) g <- mcmc_scatter(post, pars = c("wt", "sigma"), np = np, np_style = div_style) expect_gg(g) expect_named(g$data, c("x", "y", "Divergent")) }) test_that("mcmc_hex returns a ggplot object", { skip_if_not_installed("hexbin") expect_gg(mcmc_hex(arr, pars = c("beta[1]", "beta[2]"))) expect_gg(mcmc_hex(arr1chain, regex_pars = "beta", binwidth = c(.5,.5))) expect_gg(mcmc_hex(drawsarr, pars = c("theta[1]", "theta[2]"))) }) test_that("mcmc_hex throws error if number of parameters is not 2", { skip_if_not_installed("hexbin") expect_error(mcmc_hex(arr, pars = c("sigma", "beta[1]", "beta[2]")), "exactly 2 parameters") expect_error(mcmc_hex(arr, pars = "sigma"), "exactly 2 parameters") expect_error(mcmc_hex(drawsarr, pars = "mu"), "exactly 2 parameters") expect_error(mcmc_hex(arr1), "exactly 2 parameters") expect_error(mcmc_hex(mat1), "exactly 2 parameters") }) # mcmc_pairs ------------------------------------------------------------- test_that("mcmc_pairs returns a bayesplot_grid object", { g <- mcmc_pairs(arr, pars = c("(Intercept)", "sigma")) expect_bayesplot_grid(g) expect_equal(print(g), plot(g)) expect_bayesplot_grid(mcmc_pairs(arr, pars = "sigma", regex_pars = "beta")) expect_bayesplot_grid(mcmc_pairs(drawsarr, pars = "mu", regex_pars = "theta")) expect_bayesplot_grid(suppressWarnings(mcmc_pairs(arr1chain, regex_pars = "beta"))) expect_bayesplot_grid(suppressWarnings(mcmc_pairs(drawsarr1chain, regex_pars = "theta"))) expect_bayesplot_grid(suppressWarnings(mcmc_pairs(mat, pars = c("(Intercept)", "sigma")))) expect_bayesplot_grid(suppressWarnings(mcmc_pairs(dframe, pars = c("(Intercept)", "sigma")))) expect_bayesplot_grid(mcmc_pairs(dframe_multiple_chains, regex_pars = "beta")) }) test_that("mcmc_pairs using hexbin works", { skip_if_not_installed("hexbin") expect_bayesplot_grid(mcmc_pairs(arr, regex_pars = "x:[1-3]", transformations = "exp", diag_fun = "dens", off_diag_fun = "hex", diag_args = list(trim = FALSE), off_diag_args = list(binwidth = c(0.5, 0.5)))) }) test_that("no mcmc_pairs non-NUTS 'condition's fail", { expect_bayesplot_grid( mcmc_pairs(arr, pars = "sigma", regex_pars = "beta", condition = pairs_condition(chains = list(1, 2:4))) ) expect_bayesplot_grid( mcmc_pairs(arr, pars = "sigma", regex_pars = "beta", condition = pairs_condition(draws = rep(c(T,F), length.out = prod(dim(arr)[1:2])))) ) expect_bayesplot_grid( mcmc_pairs(arr, pars = "sigma", regex_pars = "beta", condition = pairs_condition(draws = 1/3)) ) expect_bayesplot_grid( mcmc_pairs(arr, pars = "sigma", regex_pars = "beta", condition = pairs_condition(chains = c(1,3))) ) }) test_that("mcmc_pairs works with NUTS info", { skip_if_not_installed("rstanarm") expect_bayesplot_grid(mcmc_pairs(post, pars = c("wt", "am", "sigma"), np = np)) expect_bayesplot_grid(mcmc_pairs(post, pars = c("wt", "am"), condition = pairs_condition(nuts="energy__"), np = np)) expect_bayesplot_grid(mcmc_pairs(post, pars = c("wt", "am"), condition = pairs_condition(nuts="divergent__"), np = np)) expect_bayesplot_grid(mcmc_pairs(post, pars = c("wt", "am"), condition = pairs_condition(nuts = "lp__"), lp=lp, np = np, max_treedepth = 2)) p <- mcmc_pairs( post, pars = c("wt", "am"), off_diag_fun = "scatter", condition = pairs_condition(nuts = "lp__"), lp = lp, np = np, np_style = pairs_style_np(div_color = "firebrick", td_color = "dodgerblue", div_size = 2, td_size = 2), max_treedepth = with(np, max(Value[Parameter == "treedepth__"]) - 1) ) expect_bayesplot_grid(p) }) test_that("mcmc_pairs throws correct warnings and errors", { skip_if_not_installed("rstanarm") expect_warning(mcmc_pairs(arr1chain, regex_pars = "beta"), "This plot is more useful with multiple chains") expect_error(mcmc_pairs(arr, pars = "sigma"), "requires at least two parameters") expect_error( mcmc_pairs(arr, condition = pairs_condition(draws = c(T, F))), "length(condition) == (n_iter * n_chain) is not TRUE", fixed = TRUE ) expect_error( mcmc_pairs(arr, condition = pairs_condition(nuts = "accept_stat__")), "the 'np' argument to 'mcmc_pairs' must also be specified" ) expect_error( mcmc_pairs(arr, condition = pairs_condition(nuts = "lp__")), "the 'lp' argument to 'mcmc_pairs' must also be specified" ) expect_error( mcmc_pairs(arr, condition = "lp__"), 'inherits(condition, "pairs_condition") is not TRUE', fixed = TRUE ) expect_error( mcmc_pairs(post, pars = c("wt", "am"), max_treedepth = 2, np = np, np_style = list(color = "green")), 'inherits(np_style, "nuts_style") is not TRUE', fixed = TRUE ) post2 <- post post2[,1:2,"wt"] <- 0 expect_warning( mcmc_pairs(post2, pars = c("wt", "am", "sigma")), "parameters were dropped because they are constant: wt" ) post[,, "sigma"] <- post[,, "am"] expect_warning( mcmc_pairs(post, pars = c("wt", "sigma", "am")), "parameters were dropped because they are duplicative: am" ) }) # pairs_style_np ------------------------------------------------------- test_that("pairs_style_np returns correct structure", { style <- pairs_style_np(div_size = 3, td_color = "gray", td_shape = 1) expect_s3_class(style, "nuts_style") expect_named(style, c("color", "shape", "size", "alpha"), ignore.order = TRUE) expect_named(style$color, c("div", "td")) expect_named(style$size, c("div", "td")) expect_named(style$shape, c("div", "td")) expect_named(style$alpha, c("div", "td")) }) test_that("pairs_style_np throws correct errors", { expect_error( pairs_style_np(div_size = "3"), "is.numeric(div_size) is not TRUE", fixed = TRUE ) expect_error( pairs_style_np(td_color = 1), "is.character(td_color) is not TRUE", fixed = TRUE ) }) # pairs_condition --------------------------------------------------------- test_that("pairs_condition returns correct structure", { # default cond0 <- pairs_condition() expect_s3_class(cond0, "pairs_condition") expect_equivalent(unclass(cond0), list()) expect_equal(attr(cond0, "type"), "default") # chains cond1 <- pairs_condition(chains = 1:4) expect_s3_class(cond1, "integer") expect_s3_class(cond1, "pairs_condition") expect_equivalent(unclass(cond1), 1:4) expect_equal(attr(cond1, "type"), "chain_vector") cond2 <- pairs_condition(chains = list(1:4, 5:6)) expect_s3_class(cond2, "list") expect_s3_class(cond2, "pairs_condition") expect_equivalent(unclass(cond2), list(upper=1:4, lower=5:6)) expect_equal(attr(cond2, "type"), "chain_list") # draws cond3 <- pairs_condition(draws = 0.7) expect_s3_class(cond3, "numeric") expect_s3_class(cond3, "pairs_condition") expect_equivalent(unclass(cond3), 0.7) expect_equal(attr(cond3, "type"), "draws_proportion") cond4 <- pairs_condition(draws = c(T, F, T)) expect_s3_class(cond4, "logical") expect_s3_class(cond4, "pairs_condition") expect_equivalent(unclass(cond4), c(T, F, T)) expect_equal(attr(cond4, "type"), "draws_selection") # nuts cond5 <- pairs_condition(nuts = "lp__") expect_s3_class(cond5, "character") expect_s3_class(cond5, "pairs_condition") expect_equivalent(unclass(cond5), "lp__") expect_equal(attr(cond5, "type"), "nuts") }) test_that("pairs_condition throws correct errors", { # chain expect_error( pairs_condition(chains = "abc"), "must be an integer vector or a list of two integer vectors" ) expect_error( pairs_condition(chains = list(1:2, 3:4, 5:6)), "length(chains) == 2 is not TRUE", fixed = TRUE ) expect_error( pairs_condition(chains = list(1:2, 2:3)), "Each chain can only be specified once" ) expect_error( pairs_condition(chains = c(1:3, 2)), "Each chain can only be specified once" ) # draws expect_error( pairs_condition(draws = "abc"), "must be a single proportion or a logical vector" ) expect_error( pairs_condition(draws = 2), "draws > 0 && draws < 1 is not TRUE", fixed = TRUE ) # nuts expect_error( pairs_condition(nuts = 2), "must be a single string" ) expect_error( pairs_condition(nuts = c("lp__", "energy__")), "must be a single string" ) expect_error( pairs_condition(nuts = "step_size__"), "stepsize__" ) }) test_that("pairs_condition message if multiple args specified", { options(useFancyQuotes = FALSE) expect_message( pairs_condition(chains = 2, draws = 0.5, nuts = "lp__"), "because they are superseded by 'chains': 'draws', 'nuts'", fixed = TRUE ) expect_message( pairs_condition(chains = 2, nuts = "lp__"), "because they are superseded by 'chains': 'nuts'", fixed = TRUE ) expect_message( pairs_condition(draws = 0.5, nuts = "lp__"), "because they are superseded by 'draws': 'nuts'", fixed = TRUE ) }) # mcmc_parcoord ----------------------------------------------------------- test_that("mcmc_parcoord returns a ggplot object", { expect_gg(mcmc_parcoord(arr, pars = c("(Intercept)", "sigma"))) expect_gg(mcmc_parcoord(arr, pars = "sigma", regex_pars = "beta")) }) test_that("mcmc_parcoord with nuts info returns a ggplot object", { skip_if_not_installed("rstanarm") expect_gg(mcmc_parcoord(post, pars = c("wt", "am", "sigma"), np = np)) }) test_that("mcmc_parcoord throws correct warnings and errors", { skip_if_not_installed("rstanarm") expect_error(mcmc_parcoord(arr, pars = "sigma"), "requires at least two parameters") expect_error( mcmc_parcoord(post, np = np[, -1]), "NUTS parameter data frame must have columns: Chain, Iteration, Parameter, Value", fixed = TRUE ) expect_error( mcmc_parcoord(post, np = np, np_style = list(div_color = "green")), 'inherits(np_style, "nuts_style") is not TRUE', fixed = TRUE ) }) # parcoord_style_np ------------------------------------------------------- test_that("parcoord_style_np returns correct structure", { style <- parcoord_style_np() expect_s3_class(style, "nuts_style") expect_named(style, c("color", "alpha", "size"), ignore.order = TRUE) expect_named(style$color, c("div")) expect_named(style$size, c("div")) expect_named(style$alpha, c("div")) }) test_that("parcoord_style_np throws correct errors", { expect_error( parcoord_style_np(div_size = "3"), "is.numeric(div_size) is not TRUE", fixed = TRUE ) expect_error( parcoord_style_np(td_color = 1), "unused argument (td_color = 1)", fixed = TRUE ) }) # Visual tests ----------------------------------------------------------------- test_that("mcmc_scatter renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") p_base <- mcmc_scatter(vdiff_dframe_chains) vdiffr::expect_doppelganger("mcmc_scatter (default)", p_base) p_custom <- mcmc_scatter( vdiff_dframe_chains, size = 2, alpha = 0.2 ) vdiffr::expect_doppelganger("mcmc_scatter (size, alpha)", p_custom) p_divergences <- mcmc_scatter( vdiff_dframe_chains, np = vdiff_dframe_chains_divergences ) vdiffr::expect_doppelganger("mcmc_scatter (np)", p_divergences) }) test_that("mcmc_hex renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") skip_if_not_installed("hexbin") p_base <- mcmc_hex(vdiff_dframe, pars = c("V1", "V2")) vdiffr::expect_doppelganger("mcmc_hex (default)", p_base) p_custom <- mcmc_hex( vdiff_dframe, pars = c("V1", "V2"), binwidth = 0.1 ) vdiffr::expect_doppelganger("mcmc_hex (bw)", p_custom) }) test_that("mcmc_parcoord renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") p_base <- mcmc_parcoord(vdiff_dframe_chains) vdiffr::expect_doppelganger("mcmc_parcoord (default)", p_base) p_divergences <- mcmc_parcoord( vdiff_dframe_chains, np = vdiff_dframe_chains_divergences, np_style = parcoord_style_np(div_size = 2) ) vdiffr::expect_doppelganger("mcmc_parcoord (np)", p_divergences) }) test_that("mcmc_pairs renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") skip_if_not_installed("hexbin") p_base <- mcmc_pairs(vdiff_dframe_chains) vdiffr::expect_doppelganger("mcmc_pairs (default)", p_base) p_divergences <- mcmc_pairs( vdiff_dframe_chains, np = vdiff_dframe_chains_divergences, np_style = pairs_style_np(div_size = 2), off_diag_fun = "hex" ) vdiffr::expect_doppelganger("mcmc_pairs (divs, hex)", p_divergences) p_treedepth <- mcmc_pairs( vdiff_dframe_chains, np = vdiff_dframe_chains_treedepth, np_style = pairs_style_np(td_color = "green"), max_treedepth = 9 ) vdiffr::expect_doppelganger("mcmc_pairs (td)", p_treedepth) p_divs_treedepth_divergences <- mcmc_pairs( vdiff_dframe_chains, np = vdiff_dframe_chains_np, np_style = pairs_style_np(div_size = 3, td_color = "green"), max_treedepth = 9 ) vdiffr::expect_doppelganger("mcmc_pairs (divs, td)", p_divs_treedepth_divergences) }) bayesplot/tests/testthat/test-ppc-input-validation.R0000644000176200001440000000531014556465326022444 0ustar liggesuserslibrary(bayesplot) context("PPC: input validation") source(test_path("data-for-ppc-tests.R")) test_that("validate_y works", { expect_identical(validate_y(y), y) expect_identical(validate_y(as.array(y)), y) expect_identical(validate_y(y2), y2) names(y) <- paste0("y", 1:length(y)) expect_identical(validate_y(y), unname(y)) }) test_that("validate_y throws errors", { expect_error(validate_y(yrep), "vector") expect_error(validate_y(as.array(yrep)), "vector or 1D array") expect_error(validate_y(LETTERS), "numeric") expect_error(validate_y(c(y, NA)), "NAs not allowed") }) test_that("validate_predictions works", { expect_identical(validate_predictions(yrep, length(y)), yrep) expect_equal(validate_predictions(yrep2, length(y2)), yrep2) colnames(yrep) <- paste0("yrep", 1:ncol(yrep)) expect_equivalent(validate_predictions(yrep, length(y)), unname(yrep)) }) test_that("validate_predictions throws errors", { expect_error(validate_predictions(as.matrix(LETTERS), length(y)), "numeric") expect_error(validate_predictions(rbind(yrep, NA), length(y)), "NAs not allowed") expect_error(validate_predictions(y, length(y)), "matrix") expect_error(validate_predictions(yrep2, length(y)), "must be equal to") expect_error(validate_predictions(yrep, length(y2)), "must be equal to ") }) test_that("validate_group works", { expect_identical(validate_group(1:3, n_obs = 3), as.factor(1:3)) expect_identical(validate_group(as.numeric(1:3), n_obs = 3), as.factor(1:3)) expect_identical(validate_group(group, n_obs = length(y)), group) expect_identical(validate_group(letters[1:3], n_obs = 3), factor(letters[1:3])) }) test_that("validate_group throws errors", { expect_error(validate_group(array(1:3), n_obs = 3), "vector") expect_error(validate_group(c(1,2,NA), n_obs = 3), "NAs not allowed") expect_error(validate_group(1:4, n_obs = 3), "must be equal to the number of observations") }) test_that("validate_x works", { x <- rnorm(3) expect_identical(validate_x(x, y = 1:3), x) expect_identical(validate_x(array(x), y = rnorm(3)), x) expect_identical(validate_x(y = rnorm(3)), 1:3) names(x) <- letters[1:3] expect_identical(validate_x(x, y = 1:3), unname(x)) }) test_that("validate_x throws errors", { expect_error(validate_x(factor(1:3), y = 1:3), "numeric") expect_error(validate_x(c(1,2,NA), y = 1:3), "NAs not allowed") expect_error(validate_x(1:4, y = 1:3), "must be equal to") }) test_that("validate_pit works", { expect_error(validate_pit("pit"), "is.numeric") expect_error(validate_pit(cbind(1, 2)), "vector") expect_error(validate_pit(-1), "between 0 and 1") expect_error(validate_pit(NA), "NAs not allowed") expect_identical(validate_pit(c(name = 0.5)), 0.5) }) bayesplot/tests/testthat/test-ppc-censoring.R0000644000176200001440000000445214334017766021145 0ustar liggesuserslibrary(bayesplot) context("PPC: censoring") source(test_path("data-for-ppc-tests.R")) test_that("ppc_km_overlay returns a ggplot object", { skip_if_not_installed("ggfortify") expect_gg(ppc_km_overlay(y, yrep, status_y = status_y, size = 0.5, alpha = 0.2)) expect_gg(ppc_km_overlay(y2, yrep2, status_y = status_y2)) }) test_that("ppc_km_overlay_grouped returns a ggplot object", { skip_if_not_installed("ggfortify") expect_gg(ppc_km_overlay_grouped(y, yrep, group, status_y = status_y)) expect_gg(ppc_km_overlay_grouped(y, yrep, as.numeric(group), status_y = status_y)) expect_gg(ppc_km_overlay_grouped(y, yrep, as.integer(group), status_y = status_y)) expect_gg(ppc_km_overlay_grouped(y2, yrep2, group2, status_y = status_y2)) expect_gg(ppc_km_overlay_grouped(y2, yrep2, as.numeric(group2), status_y = status_y2)) expect_gg(ppc_km_overlay_grouped(y2, yrep2, as.integer(group2), status_y = status_y2)) }) # Visual tests ----------------------------------------------------------------- test_that("ppc_km_overlay renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") skip_if_not_installed("ggfortify") p_base <- ppc_km_overlay(vdiff_y2, vdiff_yrep2, status_y = vdiff_status_y2) vdiffr::expect_doppelganger("ppc_km_overlay (default)", p_base) p_custom <- ppc_km_overlay( vdiff_y2, vdiff_yrep2, status_y = vdiff_status_y2, size = 2, alpha = .2) vdiffr::expect_doppelganger("ppc_km_overlay (size, alpha)", p_custom) }) test_that("ppc_km_overlay_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") skip_if_not_installed("ggfortify") p_base <- ppc_km_overlay_grouped(vdiff_y2, vdiff_yrep2, vdiff_group2, status_y = vdiff_status_y2) vdiffr::expect_doppelganger("ppc_km_overlay_grouped (default)", p_base) p_custom <- ppc_km_overlay_grouped( vdiff_y2, vdiff_yrep2, vdiff_group2, status_y = vdiff_status_y2, size = 2, alpha = .2 ) vdiffr::expect_doppelganger( "ppc_km_overlay_grouped (size, alpha)", p_custom ) }) bayesplot/tests/testthat/test-helpers-mcmc.R0000644000176200001440000002703414556465326020763 0ustar liggesuserslibrary(bayesplot) context("MCMC: misc. functions") source(test_path("data-for-mcmc-tests.R")) # melt_mcmc ---------------------------------------------------------------- test_that("melt_mcmc does not convert integer parameter names to integers #162", { mat2 <- mat[, 1:2] colnames(mat2) <- c("1", "2") long_mat <- melt_mcmc(mat2) expect_s3_class(long_mat$Parameter, "factor") arr2 <- arr[, , 1:2] dimnames(arr2)[[3]] <- c("1", "2") long_arr <- melt_mcmc(prepare_mcmc_array(arr2)) expect_s3_class(long_arr$Parameter, "factor") dframe2 <- dframe[, 1:2] colnames(dframe2) <- c("1", "2") long_df <- melt_mcmc(as.matrix(dframe2)) expect_s3_class(long_df$Parameter, "factor") }) # 3-D array helpers -------------------------------------------------------- test_that("is_mcmc_array works", { expect_false(is_mcmc_array(mat)) expect_false(is_mcmc_array(dframe)) expect_false(is_mcmc_array(dframe_multiple_chains)) expect_false(is_mcmc_array(arr)) arr2 <- set_mcmc_dimnames(arr, parnames = dimnames(arr)[[3]]) expect_mcmc_array(arr2) }) test_that("parameter_names works", { x <- example_mcmc_draws() expect_identical(parameter_names(x), dimnames(x)[[3]]) dimnames(x) <- list(a = NULL, b = NULL, c = letters[1:dim(x)[3]]) expect_identical(parameter_names(x), dimnames(x)[[3]]) dimnames(x) <- NULL expect_error(parameter_names(x), "No parameter names found") expect_error(parameter_names(x[, 1, ]), "No parameter names found") }) test_that("has_multiple_chains works", { expect_error(has_multiple_chains(mat), "is_3d_array") expect_error(has_multiple_chains(dframe_multiple_chains), "is_3d_array") expect_error(has_multiple_chains(chainlist), "is_3d_array") expect_true(has_multiple_chains(arr)) arr2 <- set_mcmc_dimnames(arr, parnames = dimnames(arr)[[3]]) expect_true(has_multiple_chains(arr2)) arr1chain2 <- set_mcmc_dimnames(arr1chain, parnames = dimnames(arr1chain)[[3]]) expect_false(has_multiple_chains(arr1chain2)) }) test_that("has_multiple_params works", { expect_error(has_multiple_params(mat), "is_3d_array") expect_error(has_multiple_params(dframe_multiple_chains), "is_3d_array") expect_true(has_multiple_params(arr), "is_3d_array") arr2 <- set_mcmc_dimnames(arr, parnames = dimnames(arr)[[3]]) expect_true(has_multiple_params(arr2)) arr2 <- arr2[, , 3, drop = FALSE] expect_false(has_multiple_params(arr2)) }) # data frame with ‘chain’ variable ---------------------------------------- test_that("is_df_with_chain works", { expect_false(is_df_with_chain(arr)) expect_false(is_df_with_chain(mat)) expect_false(is_df_with_chain(chainlist)) expect_false(is_df_with_chain(dframe)) expect_true(is_df_with_chain(dframe_multiple_chains)) mat2 <- cbind(mat, chain = dframe_multiple_chains$chain) expect_false(is_df_with_chain(mat2)) dframe_multiple_chains2 <- cbind(dframe_multiple_chains, Chain = dframe_multiple_chains$chain) dframe_multiple_chains2$chain <- NULL expect_true(is_df_with_chain(dframe_multiple_chains2)) }) test_that("validate_df_with_chain works", { expect_error(validate_df_with_chain(mat), "is_df_with_chain") dframe_multiple_chains2 <- cbind(dframe_multiple_chains, Chain = dframe_multiple_chains$chain) dframe_multiple_chains2$chain <- NULL expect_identical(validate_df_with_chain(dframe_multiple_chains), dframe_multiple_chains2) dframe_multiple_chains2$Chain <- factor(dframe_multiple_chains2$Chain, labels = letters[1:4]) a <- validate_df_with_chain(dframe_multiple_chains2) expect_type(a$Chain, "integer") # no warning raised when using tibbles (#160) tbl <- tibble::tibble(parameter=rnorm(n=40), Chain=rep(1:4, each=10)) a <- validate_df_with_chain(tbl) expect_type(a$Chain, "integer") }) test_that("df_with_chain2array works", { a <- df_with_chain2array(dframe_multiple_chains) expect_mcmc_array(a) expect_error(df_with_chain2array(dframe), "is_df_with_chain") }) # list of chains ---------------------------------------------------------- test_that("is_chain_list works", { expect_false(is_chain_list(arr)) expect_false(is_chain_list(mat)) expect_false(is_chain_list(dframe)) expect_false(is_chain_list(dframe_multiple_chains)) expect_true(is_chain_list(chainlist)) expect_true(is_chain_list(chainlist1)) expect_true(is_chain_list(chainlist1chain)) }) test_that("validate_chain_list works", { expect_identical(validate_chain_list(chainlist), chainlist) expect_identical(validate_chain_list(chainlist1), chainlist1) expect_identical(validate_chain_list(chainlist1chain), chainlist1chain) chainlist2 <- chainlist colnames(chainlist2[[1]]) <- colnames(chainlist[[1]]) colnames(chainlist2[[1]])[1] <- "AAA" expect_error(validate_chain_list(chainlist2), "parameters for each chain") chainlist3 <- chainlist colnames(chainlist3[[1]]) <- c("", colnames(chainlist[[1]])[-1]) expect_error(validate_chain_list(chainlist3), "Some parameters are missing names") chainlist[[1]] <- chainlist[[1]][-1, ] expect_error(validate_chain_list(chainlist), "Each chain should have the same number of iterations") }) test_that("chain_list2array works", { expect_mcmc_array(chain_list2array(chainlist)) expect_mcmc_array(chain_list2array(chainlist1)) expect_mcmc_array(chain_list2array(chainlist1chain)) }) # transformations --------------------------------------------------------- test_that("validate_transformations throws correct works", { trans <- list(x = "exp", 'beta[1]' = function(x) x^2, sigma = log) expect_silent( validate_transformations(trans, pars = c("x", "beta[1]", "sigma")) ) trans2 <- trans trans2[[1]] <- match.fun(trans[[1]]) expect_equal( validate_transformations(trans, pars = c("x", "beta[1]", "sigma")), trans2 ) }) test_that("validate_transformations throws correct errors", { expect_error( validate_transformations(list("log", exp)), "must be a _named_ list" ) expect_error( validate_transformations(list(x = "log", function(x) x^2)), "Each element of 'transformations' must have a name" ) expect_error( validate_transformations(list(x = "log", 'beta[2]' = exp), pars = c("x", "beta[1]")), regexp = "don't match parameter names: beta[2]", fixed = TRUE ) }) test_that("apply_transformations works", { trans <- list('beta[1]' = "exp", sigma = function(x) x^2) arr_trans <- apply_transformations(arr, transformations = trans) expect_equal(arr_trans[,, "sigma"], arr[,, "sigma"]^2) expect_equal(arr_trans[,, "beta[1]"], exp(arr[,, "beta[1]"])) mat_trans <- apply_transformations(mat, transformations = trans) expect_equal(mat_trans[, "sigma"], mat[, "sigma"]^2) expect_equal(mat_trans[, "beta[1]"], exp(mat[, "beta[1]"])) }) test_that("transformations recycled properly if not a named list", { # if transformations is a single string naming a function x <- prepare_mcmc_array(arr, regex_pars = "beta", transformations = "exp") expect_identical(parameter_names(x), c("exp(beta[1])", "exp(beta[2])")) # if transformations is a single function x <- prepare_mcmc_array(arr, pars = c("beta[1]", "sigma"), transformations = exp) expect_identical(parameter_names(x), c("t(beta[1])", "t(sigma)")) }) # prepare_mcmc_array ------------------------------------------------------ test_that("prepare_mcmc_array errors if NAs", { arr[1,1,1] <- NA expect_error(prepare_mcmc_array(arr), "NAs not allowed") }) test_that("prepare_mcmc_array processes non-array input types correctly", { # errors are mostly covered by tests of the many internal functions above # data frame with no Chain column (treat as 1 chain or merged chains) a1 <- prepare_mcmc_array(dframe) expect_s3_class(a1, "mcmc_array") expect_equal(dim(a1), c(nrow(dframe), 1, ncol(dframe))) expect_equal(parameter_names(a1), colnames(dframe)) # data frame with Chain column a2 <- prepare_mcmc_array(dframe_multiple_chains) expect_s3_class(a2, "mcmc_array") n_chain <- max(dframe_multiple_chains$chain) expect_equal(dim(a2), c(nrow(dframe) / n_chain, n_chain, ncol(dframe))) expect_equal(parameter_names(a2), colnames(dframe)) # list of matrices with multiple chains a3 <- prepare_mcmc_array(chainlist) expect_s3_class(a3, "mcmc_array") expect_equal(dim(a3), c(nrow(chainlist[[1]]), length(chainlist), ncol(chainlist[[1]]))) expect_equal(parameter_names(a3), colnames(chainlist[[1]])) # object with acceptable as.array method if (requireNamespace("rstanarm", quietly = TRUE)) { fit <- suppressWarnings(rstanarm::stan_glm(mpg ~ wt, data = mtcars, chains = 2, iter = 500, refresh = 0)) a4 <- prepare_mcmc_array(fit) expect_s3_class(a4, "mcmc_array") expect_equal(a4, prepare_mcmc_array(as.array(fit))) expect_equal(dim(a4), c(250, 2, 3)) expect_equal(parameter_names(a4), c("(Intercept)", "wt", "sigma")) } # object with unacceptable as.array method fit2 <- lm(mpg ~ wt, data = mtcars) expect_error(prepare_mcmc_array(fit2), "Arrays should have 2 or 3 dimensions.") }) test_that("prepare_mcmc_array tidy parameter selection is same as traditional selection", { pars_all <- c( "(Intercept)", "beta[1]", "beta[2]", "sigma", "b[(Intercept) XX:1]", "b[(Intercept) XX:2]", "b[(Intercept) XX:3]", "b[(Intercept) ZZ:1]", "b[(Intercept) ZZ:2]", "b[(Intercept) ZZ:3]" ) colnames(mat) <- pars_all # check easier parameters pars_char_1 <- c("(Intercept)", "beta[1]", "beta[2]", "sigma") pars_tidy_1a <- vars(`(Intercept)`, `beta[1]`, `beta[2]`, sigma) pars_tidy_1b <- vars(`(Intercept)`, contains("beta"), sigma) pars_tidy_1c <- vars("(Intercept)", param_range("beta", 1:2), "sigma") expect_identical(prepare_mcmc_array(mat, pars = pars_tidy_1a), prepare_mcmc_array(mat, pars = pars_char_1)) expect_identical(prepare_mcmc_array(mat, pars = pars_tidy_1b), prepare_mcmc_array(mat, pars = pars_char_1)) expect_identical(prepare_mcmc_array(mat, pars = pars_tidy_1c), prepare_mcmc_array(mat, pars = pars_char_1)) # check multilevel parameters pars_char_2 <- c("b[(Intercept) XX:1]", "b[(Intercept) ZZ:1]", "b[(Intercept) XX:3]", "b[(Intercept) ZZ:3]") pars_tidy_2a <- vars(param_glue("b[(Intercept) {var}:{lev}]", var = c("XX", "ZZ"), lev = c(1, 3))) expect_identical(prepare_mcmc_array(mat, pars = pars_tidy_2a), prepare_mcmc_array(mat, pars = pars_char_2)) }) test_that("tidy parameter selection throws correct errors", { expect_error(mcmc_hist(mat, pars = vars(contains("nonsense"))), "No parameters were found matching those names") expect_error(param_range("alpha", 1:3, vars = list("a", "b", "c")), "'vars' must be NULL or a character vector.") expect_error(param_glue("alpha[{lev}]", lev = 1:3, vars = 1:3, "'vars' must be NULL or a character vector.")) }) # rhat and neff helpers --------------------------------------------------- test_that("diagnostic_factor.rhat works", { rhats <- new_rhat(c(low = 0.99, low = 1, low = 1.01, ok = 1.06, ok = 1.09, ok = 1.1, high = 1.2, high = 1.7)) r <- diagnostic_factor(unname(rhats)) expect_equivalent(r, as.factor(names(rhats))) expect_identical(levels(r), c("low", "ok", "high")) }) test_that("diagnostic_factor.neff_ratio works", { ratios <- new_neff_ratio(c(low = 0.05, low = 0.01, ok = 0.2, ok = 0.49, high = 0.51, high = 0.99, high = 1)) r <- diagnostic_factor(unname(ratios)) expect_equivalent(r, as.factor(names(ratios))) expect_identical(levels(r), c("low", "ok", "high")) }) bayesplot/tests/testthat/test-ppc-scatterplots.R0000644000176200001440000000463614556465326021716 0ustar liggesuserslibrary(bayesplot) context("PPC: scatterplots") source(test_path("data-for-ppc-tests.R")) test_that("ppc_scatter returns ggplot object", { expect_gg(ppc_scatter(y, yrep[1,, drop = FALSE])) expect_gg(ppc_scatter(y, yrep[1:3, ])) expect_gg(ppc_scatter(y2, yrep2)) }) test_that("ppc_scatter_avg returns ggplot object", { expect_gg(ppc_scatter_avg(y, yrep)) expect_gg(ppc_scatter_avg(y2, yrep2)) }) test_that("ppc_scatter_avg_data same as ppc_scatter_data if nrow(yrep) = 1", { # really only a few columns are _exactly_ the same cols <- c("y_id", "y_obs", "value") d1 <- ppc_scatter_data(y2, yrep2) d2 <- ppc_scatter_avg_data(y2, yrep2) expect_equal(d1[, cols], d2[, cols]) }) test_that("ppc_scatter_avg_grouped returns a ggplot object", { expect_gg(ppc_scatter_avg_grouped(y, yrep, group)) expect_gg(ppc_scatter_avg_grouped(y, yrep, as.numeric(group))) expect_gg(ppc_scatter_avg_grouped(y, yrep, as.integer(group))) }) # Visual tests ------------------------------------------------------------ test_that("ppc_scatter renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_scatter(vdiff_y, vdiff_yrep[1:6, ]) vdiffr::expect_doppelganger("ppc_scatter (default)", p_base) p_custom <- ppc_scatter( y = vdiff_y, yrep = vdiff_yrep[1:6, ], size = 1, alpha = 1 ) vdiffr::expect_doppelganger( title = "ppc_scatter (size, alpha)", fig = p_custom) }) test_that("ppc_scatter_avg renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_scatter_avg(vdiff_y, vdiff_yrep) vdiffr::expect_doppelganger("ppc_scatter_avg (default)", p_base) p_custom <- ppc_scatter_avg( y = vdiff_y, yrep = vdiff_yrep, size = 1.5, alpha = .1 ) vdiffr::expect_doppelganger( title = "ppc_scatter_avg (size, alpha)", fig = p_custom) }) test_that("ppc_scatter_avg_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_scatter_avg_grouped(vdiff_y, vdiff_yrep, vdiff_group) vdiffr::expect_doppelganger("ppc_scatter_avg_grouped (default)", p_base) p_custom <- ppc_scatter_avg_grouped( y = vdiff_y, yrep = vdiff_yrep, group = vdiff_group, size = 3, alpha = 0.25, ref_line = FALSE ) vdiffr::expect_doppelganger( title = "ppc_scatter_avg_grouped (size, alpha, ref_line)", fig = p_custom) }) bayesplot/tests/testthat/test-mcmc-nuts.R0000644000176200001440000001157214335264325020301 0ustar liggesuserslibrary(bayesplot) context("MCMC: nuts") if (requireNamespace("rstanarm", quietly = TRUE)) { ITER <- 1000 CHAINS <- 3 fit <- rstanarm::stan_glm(mpg ~ wt + am, data = mtcars, iter = ITER, chains = CHAINS, refresh = 0) np <- nuts_params(fit) lp <- log_posterior(fit) } test_that("all mcmc_nuts_* (except energy) return gtable objects", { skip_if_not_installed("rstanarm") expect_gtable(mcmc_nuts_acceptance(np, lp)) expect_gtable(mcmc_nuts_acceptance(np, lp, chain = CHAINS)) expect_gtable(mcmc_nuts_treedepth(np, lp)) expect_gtable(mcmc_nuts_treedepth(np, lp, chain = CHAINS)) expect_gtable(mcmc_nuts_stepsize(np, lp)) expect_gtable(mcmc_nuts_stepsize(np, lp, chain = CHAINS)) np <- ensure_divergences(np) expect_gtable(mcmc_nuts_divergence(np, lp)) expect_gtable(mcmc_nuts_divergence(np, lp, chain = CHAINS)) }) test_that("all mcmc_nuts_* (except energy) error if chain argument is bad", { skip_if_not_installed("rstanarm") funs <- c("acceptance", "divergence", "treedepth", "stepsize") for (f in paste0("mcmc_nuts_", funs)) { expect_error(do.call(f, list(x=np, lp=lp, chain = CHAINS + 1)), regexp = paste("only", CHAINS, "chains found"), info = f) expect_error(do.call(f, list(x=np, lp=lp, chain = 0)), regexp = "chain >= 1", info = f) } }) test_that("mcmc_nuts_energy returns a ggplot object", { skip_if_not_installed("rstanarm") p <- mcmc_nuts_energy(np) expect_gg(p) expect_s3_class(p$facet, "FacetWrap") expect_equal(names(p$facet$params$facets), "Chain") p <- mcmc_nuts_energy(np, merge_chains = TRUE) expect_gg(p) expect_s3_class(p$facet, "FacetNull") }) test_that("mcmc_nuts_energy throws correct warnings", { skip_if_not_installed("rstanarm") expect_warning(mcmc_nuts_energy(np, chain = 1), "ignored: chain") }) test_that("validate_nuts_data_frame throws errors", { skip_if_not_installed("rstanarm") expect_error( validate_nuts_data_frame(list(Iteration = 1, Chain = 1)), "NUTS parameters should be in a data frame" ) expect_error( validate_nuts_data_frame(data.frame(Iteration = 1, apple = 2)), "NUTS parameter data frame must have columns: Chain, Iteration, Parameter, Value" ) expect_error( validate_nuts_data_frame(np, as.matrix(lp)), "lp should be in a data frame" ) lp2 <- lp colnames(lp2)[3] <- "Chains" expect_error( validate_nuts_data_frame(np, lp2), "lp data frame must have columns: Chain, Iteration, Value" ) lp2 <- subset(lp, Chain %in% 1:2) expect_error( validate_nuts_data_frame(np, lp2), "Number of chains" ) }) # Visual tests ----------------------------------------------------------------- source(test_path("data-for-mcmc-tests.R")) test_that("mcmc_nuts_acceptance renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") p_base <- mcmc_nuts_acceptance(vdiff_dframe_chains_np, vdiff_dframe_chains_lp) vdiffr::expect_doppelganger("mcmc_nuts_acceptance (default)", p_base) p_chain <- mcmc_nuts_acceptance(vdiff_dframe_chains_np, vdiff_dframe_chains_lp, chain = 1) vdiffr::expect_doppelganger("mcmc_nuts_acceptance (chain)", p_chain) }) test_that("mcmc_nuts_divergence renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") p_base <- mcmc_nuts_divergence(vdiff_dframe_chains_np, vdiff_dframe_chains_lp) vdiffr::expect_doppelganger("mcmc_nuts_divergence (default)", p_base) p_chain <- mcmc_nuts_divergence(vdiff_dframe_chains_np, vdiff_dframe_chains_lp, chain = 1) vdiffr::expect_doppelganger("mcmc_nuts_divergence (chain)", p_chain) }) test_that("mcmc_nuts_treedepth renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") p_base <- mcmc_nuts_treedepth(vdiff_dframe_chains_np, vdiff_dframe_chains_lp) vdiffr::expect_doppelganger("mcmc_nuts_treedepth (default)", p_base) p_chain <- mcmc_nuts_treedepth(vdiff_dframe_chains_np, vdiff_dframe_chains_lp, chain = 1) vdiffr::expect_doppelganger("mcmc_nuts_treedepth (chain)", p_chain) }) test_that("mcmc_nuts_stepsize renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") p_base <- mcmc_nuts_stepsize(vdiff_dframe_chains_np, vdiff_dframe_chains_lp) vdiffr::expect_doppelganger("mcmc_nuts_stepsize (default)", p_base) p_chain <- mcmc_nuts_stepsize(vdiff_dframe_chains_np, vdiff_dframe_chains_lp, chain = 1) vdiffr::expect_doppelganger("mcmc_nuts_stepsize (chain)", p_chain) }) test_that("mcmc_nuts_energy renders correctly", { skip_on_cran() skip_if_not_installed("vdiffr") p_base <- mcmc_nuts_energy(vdiff_dframe_chains_np, vdiff_dframe_chains_lp, binwidth = 10) vdiffr::expect_doppelganger("mcmc_nuts_energy (default)", p_base) p_merged <- mcmc_nuts_energy(vdiff_dframe_chains_np, vdiff_dframe_chains_lp, binwidth = 10, merge_chains = TRUE) vdiffr::expect_doppelganger("mcmc_nuts_energy (merged)", p_merged) }) bayesplot/tests/testthat/test-mcmc-intervals.R0000644000176200001440000002176514556465326021335 0ustar liggesuserslibrary(bayesplot) context("MCMC: intervals") source(test_path("data-for-mcmc-tests.R")) test_that("mcmc_intervals_data computes quantiles", { xs <- melt_mcmc(merge_chains(prepare_mcmc_array(arr, pars = "beta[1]"))) d <- mcmc_intervals_data(arr, pars = "beta[1]", prob = .3, prob_outer = .5) qs <- unlist(d[, c("ll", "l", "m", "h", "hh")]) by_hand <- quantile(xs$Value, c(.25, .35, .5, .65, .75)) expect_equivalent(qs, by_hand) expect_equal(d$parameter, factor("beta[1]")) expect_equal(d$outer_width, .5) expect_equal(d$inner_width, .3) expect_equal(d$point_est, "median") d2 <- mcmc_areas_data(arr, pars = "beta[1]", prob = .3, prob_outer = .5) sets <- split(d2, d2$interval) expect_equal(range(sets$inner$x), c(d$l, d$h)) expect_equal(range(sets$outer$x), c(d$ll, d$hh)) }) test_that("mcmc_intervals_data computes point estimates", { xs <- melt_mcmc(merge_chains(prepare_mcmc_array(arr, pars = "beta[2]"))) d <- mcmc_intervals_data(arr, pars = "beta[2]", prob = .3, prob_outer = .5, point_est = "mean") expect_equivalent(d$m, mean(xs$Value)) expect_equal(d$parameter, factor("beta[2]")) expect_equal(d$point_est, "mean") d <- mcmc_intervals_data(arr, pars = "(Intercept)", prob = .3, prob_outer = .5, point_est = "none") expect_true(!("m" %in% names(d))) expect_equal(d$point_est, "none") }) test_that("mcmc_intervals returns a ggplot object", { expect_gg(mcmc_intervals(arr, pars = "beta[1]", regex_pars = "x\\:")) expect_gg(mcmc_intervals(arr1chain, pars = "beta[1]", regex_pars = "Intercept")) expect_gg(mcmc_intervals(mat, regex_pars = "beta")) expect_gg(mcmc_intervals(dframe)) expect_gg(mcmc_intervals(dframe_multiple_chains)) expect_gg(mcmc_intervals(arr1)) expect_gg(mcmc_intervals(mat1)) expect_gg(mcmc_intervals(dframe1)) }) test_that("mcmc_areas returns a ggplot object", { expect_gg(mcmc_areas(arr, pars = "beta[2]", regex_pars = "x\\:")) expect_gg(mcmc_areas(arr1chain, regex_pars = c("beta", "x\\:"))) expect_gg(mcmc_areas(mat)) expect_gg(mcmc_areas(dframe)) expect_gg(mcmc_areas(dframe_multiple_chains)) expect_gg(mcmc_areas(arr1)) expect_gg(mcmc_areas(mat1)) expect_gg(mcmc_areas(dframe1)) }) test_that("mcmc_areas_ridges returns a ggplot object", { expect_gg(mcmc_areas_ridges(arr, pars = "beta[2]", regex_pars = "x\\:")) expect_gg(mcmc_areas_ridges(arr1chain, regex_pars = c("beta", "x\\:"))) expect_gg(mcmc_areas_ridges(mat)) expect_gg(mcmc_areas_ridges(dframe)) expect_gg(mcmc_areas_ridges(dframe_multiple_chains)) expect_gg(mcmc_areas_ridges(arr1)) expect_gg(mcmc_areas_ridges(mat1)) expect_gg(mcmc_areas_ridges(dframe1)) }) test_that("mcmc_intervals/areas with rhat", { r <- runif(ncol(mat), 0.9, 1.3) rbad <- c(NA, r[-1]) expect_error(mcmc_intervals(arr, rhat = r[-1]), "'rhat' has length") expect_error(expect_warning(mcmc_intervals(arr, rhat = rbad))) expect_gg(g <- mcmc_intervals(arr, rhat = r)) # if (utils::packageVersion("ggplot2") >= "3.0.0") { # rhat_map <- g$layers[[3]][["mapping"]] # expect_identical(rlang::as_name(rhat_map[["colour"]]), "rhat_rating") # } # areas with rhat. # layer 1 is maybe line vertical line. [skip] # layer 2 is inner interval. expect_gg(g2 <- mcmc_areas(arr, rhat = r)) if (utils::packageVersion("ggplot2") >= "3.0.0") { rhat_map2 <- g2$layers[[2]][["mapping"]] # expect_identical(rlang::as_name(rhat_map2$fill), "rhat_rating") # expect_identical(rlang::as_name(rhat_map2$colour), "rhat_rating") # layer 3 is point estimate. manually colored. [skip] # layer 4 is outer interval. rhat_map4 <- g2$layers[[4]][["mapping"]] # expect_identical(rlang::as_name(rhat_map4$colour), "rhat_rating") # layer 5 is bottom line. rhat_map5 <- g2$layers[[5]][["mapping"]] # expect_identical(rlang::as_name(rhat_map5$colour), "rhat_rating") } }) test_that("mcmc_areas_data computes density", { areas_data <- mcmc_areas_data(arr, point_est = "none") areas_data <- areas_data[areas_data$interval_width == 1, ] by_parameter <- split(areas_data, areas_data$parameter) # Manually compute the same raw_values <- melt_mcmc(merge_chains(prepare_mcmc_array(arr))) raw_values <- split(raw_values, interaction(raw_values$Parameter)) do_dens <- function(df, interval_width, n) { x <- df$Value tail_width <- (1 - interval_width) / 2 qs <- quantile(x, probs = c(tail_width, 1 - tail_width)) dens <- density(x = x, from = min(qs), to = max(qs), n = n) data.frame(Parameter = unique(df$Parameter), x = dens$x, y = dens$y) } densities <- lapply(raw_values, do_dens, 1, 1024) for (name in names(by_parameter)) { expect_equivalent(by_parameter[[name]][["density"]], densities[[name]][["y"]]) } }) test_that("compute_column_density can use density options (#118)", { # n_dens affects the number of rows in the return data-frame areas_data <- mcmc_areas_data(arr, point_est = "none", n_dens = 100) pars <- length(unique(areas_data$parameter)) intervals <- length(unique(areas_data$interval)) expect_equal(nrow(areas_data), 100 * intervals * pars) # If these raise errors, they are being evaluated expect_error(mcmc_areas_data(arr, bw = stop())) expect_error(mcmc_areas_data(arr, adjust = stop())) expect_error(mcmc_areas_data(arr, kernel = stop())) }) test_that("probabilities outside of [0,1] cause an error", { expect_error(mcmc_intervals_data(arr, prob = -0.1), "must be in \\[0,1\\]") expect_error(mcmc_intervals_data(arr, prob = 1.1), "must be in \\[0,1\\]") expect_error(mcmc_intervals_data(arr, prob_outer = -0.1), "must be in \\[0,1\\]") expect_error(mcmc_intervals_data(arr, prob_outer = 1.1), "must be in \\[0,1\\]") }) test_that("inconsistent probabilities raise warning (#138)", { expect_warning( mcmc_intervals_data(arr, prob = .9, prob_outer = .8), "`prob_outer` .* is less than `prob`" ) }) # Visual tests ----------------------------------------------------------------- test_that("mcmc_intervals renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_intervals(vdiff_dframe) vdiffr::expect_doppelganger("mcmc_intervals (default)", p_base) p_outer <- mcmc_intervals(vdiff_dframe, prob_outer = .8) vdiffr::expect_doppelganger("mcmc_intervals (outer)", p_outer) p_inner <- mcmc_intervals(vdiff_dframe, prob = .1) vdiffr::expect_doppelganger("mcmc_intervals (inner)", p_inner) rhats <- seq(from = 1, to = 1.15, length.out = 5) p_rhats <- mcmc_intervals(vdiff_dframe, rhat = rhats) vdiffr::expect_doppelganger("mcmc_intervals (rhats)", p_rhats) p_no_points <- mcmc_intervals(vdiff_dframe, point_est = "none") vdiffr::expect_doppelganger("mcmc_intervals (no points)", p_no_points) p_mean_points <- mcmc_intervals(vdiff_dframe, point_est = "mean") vdiffr::expect_doppelganger("mcmc_intervals (means)", p_mean_points) p_sizes <- mcmc_intervals(vdiff_dframe, point_size = 1, inner_size = 5, outer_size = 4) vdiffr::expect_doppelganger("mcmc_intervals (sizes)", p_sizes) }) test_that("mcmc_areas renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_areas(vdiff_dframe) vdiffr::expect_doppelganger("mcmc_areas (default)", p_base) p_equal_height <- mcmc_areas(vdiff_dframe, area_method = "equal height") vdiffr::expect_doppelganger("mcmc_areas (equal height)", p_equal_height) p_scaled_height <- mcmc_areas(vdiff_dframe, area_method = "scaled height") vdiffr::expect_doppelganger("mcmc_areas (scaled height)", p_scaled_height) p_outer <- mcmc_areas(vdiff_dframe, prob_outer = .8) vdiffr::expect_doppelganger("mcmc_areas (outer)", p_outer) p_inner <- mcmc_areas(vdiff_dframe, prob = .1) vdiffr::expect_doppelganger("mcmc_areas (inner)", p_inner) rhats <- seq(from = 1, to = 1.15, length.out = 5) p_rhats <- mcmc_areas(vdiff_dframe, rhat = rhats) vdiffr::expect_doppelganger("mcmc_areas (rhats)", p_rhats) p_no_points <- mcmc_areas(vdiff_dframe, point_est = "none") vdiffr::expect_doppelganger("mcmc_areas (no points)", p_no_points) p_mean_points <- mcmc_areas(vdiff_dframe, point_est = "mean") vdiffr::expect_doppelganger("mcmc_areas (means)", p_mean_points) p_size <- mcmc_areas(vdiff_dframe, border_size = 2) vdiffr::expect_doppelganger("mcmc_areas (size)", p_size) }) test_that("mcmc_areas_ridges renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_areas_ridges(vdiff_dframe) vdiffr::expect_doppelganger("mcmc_areas_ridges (default)", p_base) p_inner <- mcmc_areas_ridges(vdiff_dframe, prob = .5) vdiffr::expect_doppelganger("mcmc_areas_ridges (inner)", p_inner) p_outer <- mcmc_areas_ridges(vdiff_dframe, prob = .5, prob_outer = .95) vdiffr::expect_doppelganger("mcmc_areas_ridges (outer)", p_outer) p_size <- mcmc_areas_ridges(vdiff_dframe, border_size = 2) vdiffr::expect_doppelganger("mcmc_areas_ridges (size)", p_size) }) bayesplot/tests/testthat/test-mcmc-distributions.R0000644000176200001440000001511414556465326022217 0ustar liggesuserslibrary(bayesplot) context("MCMC: distributions") source(test_path("data-for-mcmc-tests.R")) get_palette <- function(ggplot, n) { scale <- ggplot$scales$get_scales("colour") scale$palette(n) } test_that("mcmc_hist returns a ggplot object", { expect_gg(mcmc_hist(arr, pars = "beta[1]", regex_pars = "x\\:", binwidth = 0.1)) expect_gg(mcmc_hist(arr1chain, regex_pars = "beta", binwidth = 0.1)) expect_gg(mcmc_hist(drawsarr, pars = "theta[1]", binwidth = 0.1)) expect_gg(mcmc_hist(drawsarr1chain, regex_pars = "theta", binwidth = 0.1)) expect_gg(mcmc_hist(mat, binwidth = 0.1)) expect_gg(mcmc_hist(dframe, binwidth = 0.1)) expect_gg(mcmc_hist(dframe, bins = 10)) expect_gg(mcmc_hist(dframe_multiple_chains, binwidth = 0.1)) expect_gg(mcmc_hist(arr1, binwidth = 0.1)) expect_gg(mcmc_hist(drawsarr1, binwidth = 0.1)) expect_gg(mcmc_hist(mat1, binwidth = 0.1)) expect_gg(mcmc_hist(dframe1, binwidth = 0.1)) }) test_that("mcmc_dens returns a ggplot object", { expect_gg(mcmc_dens(arr, pars = "beta[2]", regex_pars = "x\\:")) expect_gg(mcmc_dens(arr1chain, regex_pars = "beta")) expect_gg(mcmc_dens(drawsarr, pars = "theta[1]")) expect_gg(mcmc_dens(drawsarr1chain, regex_pars = "theta")) expect_gg(mcmc_dens(mat)) expect_gg(mcmc_dens(dframe, transformations = list(sigma = function(x) x^2))) expect_gg(mcmc_dens( dframe_multiple_chains, transformations = list(sigma = function(x) x ^ 2, 'beta[1]' = "exp") )) expect_gg(mcmc_dens(arr1)) expect_gg(mcmc_dens(drawsarr1)) expect_gg(mcmc_dens(mat1)) expect_gg(mcmc_dens(dframe1)) }) # functions that require multiple chains ---------------------------------- test_that("mcmc_hist_by_chain returns a ggplot object", { expect_gg(mcmc_hist_by_chain(arr, pars = "beta[1]", regex_pars = "x\\:", binwidth = 0.1)) expect_gg(mcmc_hist_by_chain(dframe_multiple_chains, regex_pars = c("(Intercept)", "beta"), binwidth = 0.1)) }) test_that("mcmc_dens_overlay returns a ggplot object", { expect_gg(mcmc_dens_overlay(arr, pars = "beta[1]", regex_pars = "x\\:")) expect_gg(mcmc_dens_overlay(dframe_multiple_chains, pars = c("(Intercept)", "beta[2]"))) }) test_that("mcmc_dens_chains returns a ggplot object", { p <- mcmc_dens_chains(arr, pars = "beta[1]", regex_pars = "x\\:", color_chains = FALSE) expect_gg(p) p2 <- mcmc_dens_overlay(dframe_multiple_chains, pars = c("(Intercept)", "beta[2]"), color_chains = TRUE) expect_gg(p2) }) test_that("mcmc_dens_chains/mcmc_dens_overlay color chains", { p1 <- mcmc_dens_chains(arr, pars = "beta[1]", regex_pars = "x\\:", color_chains = FALSE) p2 <- mcmc_dens_overlay(arr, pars = "beta[1]", regex_pars = "x\\:", color_chains = FALSE) # Only one color when set not to color chains expect_equal(length(unique(get_palette(p1, 4))), 1) expect_equal(length(unique(get_palette(p2, 4))), 1) p3 <- mcmc_dens_chains(arr, pars = "beta[1]", regex_pars = "x\\:", color_chains = TRUE) p4 <- mcmc_dens_overlay(arr, pars = "beta[1]", regex_pars = "x\\:", color_chains = TRUE) # Chain coloring works expect_equal(get_palette(p3, 4), chain_colors(4)) expect_equal(get_palette(p4, 4), chain_colors(4)) }) test_that("mcmc_violin returns a ggplot object", { expect_gg(mcmc_violin(arr, pars = "beta[2]", regex_pars = "x\\:")) expect_gg(mcmc_violin(dframe_multiple_chains, regex_pars = c("\\(Intercept\\)$", "beta"))) }) test_that("mcmc_* throws error if 1 chain but multiple chains required", { expect_error(mcmc_hist_by_chain(mat), "requires multiple chains") expect_error(mcmc_hist_by_chain(dframe), "requires multiple chains") expect_error(mcmc_hist_by_chain(arr1chain), "requires multiple chains") expect_error(mcmc_hist_by_chain(drawsarr1chain), "requires multiple chains") expect_error(mcmc_dens_overlay(mat), "requires multiple chains") expect_error(mcmc_dens_overlay(dframe), "requires multiple chains") expect_error(mcmc_dens_overlay(arr1chain), "requires multiple chains") expect_error(mcmc_dens_overlay(drawsarr1chain), "requires multiple chains") expect_error(mcmc_dens_chains(mat), "requires multiple chains") expect_error(mcmc_dens_chains(dframe), "requires multiple chains") expect_error(mcmc_dens_chains(arr1chain), "requires multiple chains") expect_error(mcmc_dens_chains(drawsarr1chain), "requires multiple chains") expect_error(mcmc_violin(mat), "requires multiple chains") expect_error(mcmc_violin(dframe), "requires multiple chains") expect_error(mcmc_violin(arr1chain), "requires multiple chains") expect_error(mcmc_violin(drawsarr1chain), "requires multiple chains") }) # Visual tests ------------------------------------------------------------ test_that("mcmc_hist renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_hist(vdiff_dframe, binwidth = 0.1) vdiffr::expect_doppelganger("mcmc_hist (default)", p_base) p_freq <- mcmc_hist(vdiff_dframe, freq = TRUE, binwidth = 0.1) vdiffr::expect_doppelganger("mcmc_hist (freq)", p_freq) p_alpha <- mcmc_hist(vdiff_dframe, alpha = 0, binwidth = 0.1) vdiffr::expect_doppelganger("mcmc_hist (alpha)", p_alpha) }) test_that("mcmc_dens renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_dens(vdiff_dframe) vdiffr::expect_doppelganger("mcmc_dens (default)", p_base) p_alpha <- mcmc_dens(vdiff_dframe, alpha = 0) vdiffr::expect_doppelganger("mcmc_dens (alpha)", p_alpha) }) test_that("mcmc_dens_overlay renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_dens_overlay(vdiff_dframe_chains) vdiffr::expect_doppelganger("mcmc_dens_overlay (default)", p_base) }) test_that("mcmc_dens_chains renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_dens_chains(vdiff_dframe_chains) vdiffr::expect_doppelganger("mcmc_dens_chains (default)", p_base) }) test_that("mcmc_hist_by_chain renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_hist_by_chain(vdiff_dframe_chains, binwidth = 0.5) vdiffr::expect_doppelganger("mcmc_hist_by_chain (default)", p_base) }) test_that("mcmc_violin renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_violin(vdiff_dframe_chains) vdiffr::expect_doppelganger("mcmc_violin (default)", p_base) }) bayesplot/tests/testthat/test-available_ppc.R0000644000176200001440000000462214212422623021142 0ustar liggesuserslibrary(bayesplot) context("available_mcmc and available_ppc") test_that("available_mcmc works", { a <- available_mcmc() expect_s3_class(a, "bayesplot_function_list") expect_s3_class(a, "character") all_mcmc_plots <- sort(grep("^mcmc_", getNamespaceExports("bayesplot"), value = TRUE)) all_mcmc_plots <- grep("_data", all_mcmc_plots, invert = TRUE, value = TRUE) expect_identical(as.character(a), all_mcmc_plots) b <- available_mcmc("trace|dens", plots = FALSE) expect_s3_class(b, "bayesplot_function_list") expect_identical( as.character(b), sort(grep("^mcmc_dens|^mcmc_trace", getNamespaceExports("bayesplot"), value = TRUE)) ) expect_length(available_mcmc(pattern = "99999"), 0) }) test_that("available_ppc works", { a <- available_ppc() expect_s3_class(a, "bayesplot_function_list") expect_s3_class(a, "character") all_ppc_plots <- sort(grep("^ppc_", getNamespaceExports("bayesplot"), value = TRUE)) all_ppc_plots <- grep("_data", all_ppc_plots, invert = TRUE, value = TRUE) expect_identical(as.character(a), all_ppc_plots) b <- available_ppc("grouped") expect_s3_class(b, "bayesplot_function_list") expect_identical( as.character(b), sort(grep("^ppc_.*_grouped$", getNamespaceExports("bayesplot"), value = TRUE)) ) c <- available_ppc("grouped", invert = TRUE) expect_false(any(grepl("grouped", c))) expect_length(available_ppc(pattern = "99999"), 0) }) test_that("available_ppd works", { a <- available_ppd() expect_s3_class(a, "bayesplot_function_list") expect_s3_class(a, "character") all_ppd_plots <- sort(grep("^ppd_", getNamespaceExports("bayesplot"), value = TRUE)) all_ppd_plots <- grep("_data", all_ppd_plots, invert = TRUE, value = TRUE) expect_identical(as.character(a), all_ppd_plots) a <- available_ppd(plots_only = FALSE) expect_identical(as.character(a), sort(grep("^ppd_", getNamespaceExports("bayesplot"), value = TRUE))) }) test_that("print.bayesplot_function_list works", { expect_output(print(available_ppd()), "bayesplot PPD module:") expect_output(print(available_ppc()), "bayesplot PPC module:") expect_output(print(available_mcmc()), "bayesplot MCMC module:") expect_output(print(available_ppc("ribbon")), "(matching pattern 'ribbon')") expect_output(print(available_mcmc("trace")), "trace_highlight") expect_output(print(available_ppc("grouped", invert = TRUE)), "excluding pattern 'grouped'") }) bayesplot/tests/testthat/test-convenience-functions.R0000644000176200001440000001556514556270424022705 0ustar liggesuserslibrary(bayesplot) library(ggplot2) context("Convenience functions (for ggplot objects)") # abline_01, vline_ and hline_ ------------------------------------------ test_that("abline_01 returns the correct object", { a <- abline_01(color = "green", linetype = 2) b <- geom_abline(intercept = 0, slope = 1, color = "green", linetype = 2, na.rm = TRUE) a$constructor <- b$constructor <- NULL expect_equal(a, b, check.environment = FALSE) }) test_that("vline_* and hline_* return correct objects", { a <- vline_0(color = "red") b <- geom_vline(xintercept = 0, color = "red", na.rm = TRUE) a$constructor <- b$constructor <- NULL expect_equal(a, b, check.environment = FALSE) a <- hline_0(linewidth = 2, linetype = 3) b <- geom_hline(yintercept = 0, linewidth = 2, linetype = 3, na.rm = TRUE) a$constructor <- b$constructor <- NULL expect_equal(a, b, check.environment = FALSE) a <- vline_at(c(3,4), na.rm = FALSE) b <- geom_vline(xintercept = c(3,4)) a$constructor <- b$constructor <- NULL expect_equal(a, b, check.environment = FALSE) a <- hline_at(c(3,4), na.rm = FALSE) b <- geom_hline(yintercept = c(3,4)) a$constructor <- b$constructor <- NULL expect_equal(a, b, check.environment = FALSE) }) test_that("vline_at with 'fun' works", { x <- example_mcmc_draws(chains = 1) a <- vline_at(x, colMeans) b <- geom_vline(xintercept = colMeans(x), na.rm = TRUE) a$constructor <- b$constructor <- NULL expect_equal(a, b, check.environment = FALSE) }) test_that("calc_v (internal function) works", { a <- 1:4 expect_identical(calc_v(a, "mean"), 2.5) expect_identical(calc_v(a, median), 2.5) expect_equal(calc_v(c(a, NA), mean), NA_real_) expect_identical(calc_v(c(a, NA), min, list(na.rm = TRUE)), 1L) expect_error(calc_v(fun = "mean"), "'v' can't be missing") }) # lbub -------------------------------------------------------------------- test_that("lbub works", { f1 <- lbub(p = 0.5) f2 <- lbub(p = 0.5, med = FALSE) expect_type(f1, "closure") expect_type(f2, "closure") expect_identical( f1(1:50), setNames(c(13.25, 25.5, 37.75), c("25%", "50%", "75%")) ) expect_identical( f2(1:50), setNames(c(13.25, 37.75), c("25%", "75%")) ) }) # plot and facet backgrounds ---------------------------------------------- test_that("grid_lines returns correct theme object", { thm <- theme_default() + grid_lines(size = 1.5, color = "purple") expect_equal(thm$panel.grid.major, element_line(linewidth = 1.5, color = "purple")) expect_equal(thm$panel.grid.minor, element_line(linewidth = 0.75, color = "purple")) }) test_that("panel_bg returns correct theme object", { bg1 <- panel_bg() bg2 <- panel_bg(fill = "blue", linetype = 2) expect_identical(bg1, theme(panel.background = element_rect())) expect_identical(bg2, theme(panel.background = element_rect(fill = "blue", linetype = 2))) expect_identical(panel_bg(on = FALSE), theme(panel.background = element_blank())) }) test_that("plot_bg returns correct theme object", { bg1 <- plot_bg() bg2 <- plot_bg(fill = "blue", linetype = 2) expect_identical(bg1, theme(plot.background = element_rect())) expect_identical(bg2, theme(plot.background = element_rect(fill = "blue", linetype = 2))) expect_identical(plot_bg(on = FALSE), theme(plot.background = element_blank())) }) test_that("facet_bg returns correct theme object", { bg1 <- facet_bg() bg2 <- facet_bg(fill = "blue", linetype = 2) expect_identical(bg1, theme(strip.background = element_rect())) expect_identical(bg2, theme(strip.background = element_rect(fill = "blue", linetype = 2))) expect_identical(facet_bg(on = FALSE), theme(strip.background = element_blank())) }) # legend position and text ------------------------------------------------ test_that("legend_none returns correct theme object", { none <- legend_none() expect_s3_class(none, "theme") expect_equivalent(none, list(legend.position = "none")) expect_false(attr(none, "complete")) }) test_that("legend_move returns correct theme object", { left <- legend_move("left") expect_s3_class(left, "theme") expect_equivalent(left, list(legend.position = "left")) expect_false(attr(left, "complete")) pos <- legend_move(c(0.25, 0.5)) expect_s3_class(pos, "theme") expect_equivalent( pos$legend.position.inside %||% pos$legend.position, c(0.25, 0.5) ) expect_false(attr(pos, "complete")) }) test_that("legend_text returns correct theme object", { expect_equal( legend_text(size = 16, color = "purple"), theme(legend.text = element_text(color = "purple", size = 16)) ) }) # axis and facet text -------------------------------------------------- test_that("xaxis_text returns correct theme object", { expect_identical(xaxis_text(FALSE), theme(axis.text.x = element_blank())) expect_equal( xaxis_text(face = "bold", angle = 30), theme(axis.text.x = element_text(face = "bold", angle = 30)) ) }) test_that("yaxis_text returns correct theme object", { expect_identical(yaxis_text(FALSE), theme(axis.text.y = element_blank())) expect_equivalent( yaxis_text(face = "bold", angle = 30), theme(axis.text.y = element_text(face = "bold", angle = 30)) ) }) test_that("facet_text returns correct theme object", { expect_identical(facet_text(FALSE), theme(strip.text = element_blank())) expect_equal( facet_text(size = 12, color = "blue"), theme(strip.text = element_text(color = "blue", size = 12)) ) }) # axis titles ------------------------------------------------------------- test_that("xaxis_title returns correct theme object", { expect_identical(xaxis_title(FALSE), xlab(NULL)) expect_equal( xaxis_title(face = "bold", angle = 30), theme(axis.title.x = element_text(face = "bold", angle = 30)) ) }) test_that("yaxis_title returns correct theme object", { expect_identical(yaxis_title(FALSE), ylab(NULL)) expect_equal( yaxis_title(face = "bold", angle = 30), theme(axis.title.y = element_text(face = "bold", angle = 30)) ) }) # tick marks -------------------------------------------------- test_that("xaxis_ticks returns correct theme object", { expect_identical(xaxis_ticks(FALSE), theme(axis.ticks.x = element_blank())) expect_equal( xaxis_ticks(linewidth = 0.5, color = "red"), theme(axis.ticks.x = element_line(linewidth = 0.5, color = "red")) ) }) test_that("yaxis_ticks returns correct theme object", { expect_identical(yaxis_ticks(FALSE), theme(axis.ticks.y = element_blank())) expect_equal( yaxis_ticks(linewidth = 0.5, color = "red"), theme(axis.ticks.y = element_line(linewidth = 0.5, color = "red")) ) }) # overlay functions ------------------------------------------------------- test_that("overlay_function returns the correct object", { expect_error(overlay_function(), 'argument "fun" is missing') a <- overlay_function(fun = "dnorm") b <- stat_function(fun = "dnorm", inherit.aes = FALSE) a$constructor <- b$constructor <- NULL expect_equal(a, b, check.environment = FALSE) }) bayesplot/tests/testthat/test-extractors.R0000644000176200001440000001057714335264325020575 0ustar liggesuserslibrary(bayesplot) context("Extractors") if (requireNamespace("rstanarm", quietly = TRUE)) { ITER <- 1000 CHAINS <- 3 fit <- rstanarm::stan_glm(mpg ~ wt + am, data = mtcars, iter = ITER, chains = CHAINS, refresh = 0) } x <- list(cbind(a = 1:3, b = rnorm(3)), cbind(a = 1:3, b = rnorm(3))) # nuts_params and log_posterior methods ----------------------------------- test_that("nuts_params.list throws errors", { x[[3]] <- c(a = 1:3, b = rnorm(3)) expect_error(nuts_params.list(x), "list elements should be matrices") x[[3]] <- cbind(a = 1:3, d = rnorm(3)) expect_error(nuts_params.list(x), "same column names") x[[3]] <- cbind(a = 1:4, b = rnorm(4)) expect_error(nuts_params.list(x), "same dimensions") }) test_that("nuts_params.list parameter selection ok", { expect_error(nuts_params.list(x, pars = "apple"), "subscript out of bounds") np <- nuts_params.list(x, pars = "b") expect_true(all(np$Parameter == "b")) }) test_that("all nuts_params methods identical", { skip_if_not_installed("rstanarm") skip_if_not_installed("rstan") expect_identical( nuts_params(fit), nuts_params(fit$stanfit) ) expect_identical( nuts_params(fit), nuts_params(rstan::get_sampler_params(fit$stanfit, inc_warmup = FALSE)) ) }) test_that("nuts_params.stanreg returns correct structure", { skip_if_not_installed("rstanarm") np <- nuts_params(fit) expect_identical(colnames(np), c("Chain", "Iteration", "Parameter", "Value")) np_names <- paste0(c("accept_stat", "stepsize", "treedepth", "n_leapfrog", "divergent", "energy"), "__") expect_identical(levels(np$Parameter), np_names) expect_equal(length(unique(np$Iteration)), floor(ITER / 2)) expect_equal(length(unique(np$Chain)), CHAINS) }) test_that("log_posterior.stanreg returns correct structure", { skip_if_not_installed("rstanarm") lp <- log_posterior(fit) expect_identical(colnames(lp), c("Chain", "Iteration", "Value")) expect_equal(length(unique(lp$Iteration)), floor(ITER / 2)) expect_equal(length(unique(lp$Chain)), CHAINS) }) test_that("rhat.stanreg returns correct structure", { skip_if_not_installed("rstanarm") r <- rhat(fit) expect_named(r) expect_equal(r, summary(fit)[1:length(r), "Rhat"]) expect_identical(names(rhat(fit, regex_pars = c("wt", "am"))), c("wt", "am")) }) test_that("neff_ratio.stanreg returns correct structure", { skip_if_not_installed("rstanarm") expect_named(neff_ratio(fit, pars = c("wt", "am")), c("wt", "am")) ratio <- neff_ratio(fit) expect_named(ratio) ans <- summary(fit)[1:length(ratio), "n_eff"] / (floor(ITER / 2) * CHAINS) expect_equal(ratio, ans, tol = 0.001) }) test_that("rhat.stanfit returns correct structure", { skip_if_not_installed("rstanarm") r <- rhat(fit$stanfit) expect_named(r) expect_equal(r, summary(fit)[, "Rhat"]) r2 <- rhat(fit$stanfit, pars = c("wt", "sigma")) expect_named(r2) expect_equal(r2, summary(fit, pars = c("wt", "sigma"))[, "Rhat"]) }) test_that("neff_ratio.stanreg returns correct structure", { skip_if_not_installed("rstanarm") denom <- floor(ITER / 2) * CHAINS ratio <- neff_ratio(fit$stanfit) expect_named(ratio) ans <- summary(fit)[, "n_eff"] / denom expect_equal(ratio, ans, tol = 0.001) ratio2 <- neff_ratio(fit$stanfit, pars = c("wt", "sigma")) expect_named(ratio2) ans2 <- summary(fit, pars = c("wt", "sigma"))[, "n_eff"] / denom expect_equal(ratio2, ans2, tol = 0.001) }) test_that("cmdstanr methods work", { skip_on_cran() skip_if_not_installed("cmdstanr") fit <- cmdstanr::cmdstanr_example("logistic", iter_sampling = 500, chains = 2) np <- nuts_params(fit) np_names <- paste0(c("treedepth", "divergent", "energy", "accept_stat", "stepsize", "n_leapfrog"), "__") expect_identical(levels(np$Parameter), np_names) expect_equal(range(np$Iteration), c(1, 500)) expect_equal(range(np$Chain), c(1, 2)) expect_true(all(np$Value[np$Parameter == "divergent__"] == 0)) lp <- log_posterior(fit) expect_named(lp, c("Chain", "Iteration", "Value")) expect_equal(range(np$Chain), c(1, 2)) expect_equal(range(np$Iteration), c(1, 500)) r <- rhat(fit) expect_named(head(r, 4), c("alpha", "beta[1]", "beta[2]", "beta[3]")) expect_true(all(round(r) == 1)) ratio <- neff_ratio(fit) expect_named(head(ratio, 4), c("alpha", "beta[1]", "beta[2]", "beta[3]")) expect_true(all(ratio > 0)) }) bayesplot/tests/testthat/data-for-ordinal.rda0000644000176200001440000000457514335264325021113 0ustar liggesusersŜݎE!)@+%cmyEɂ60ٵۯY@b^Os˧] ԏ0p~|Y}y3sLvc=>cZ83>\㙣cǘ/ۧYƐ| wwkf#~g}1r'c0>k}cX3V>8gkLr}}CL=2Vr::&>r6ԖN-r.S*w'kšg';a8*Nq|ɿW{PfRKGӳȑ|M>'b$4fu&jC"evyw֛{>Ԣq<&\uw1rgYl>f~InyVr8x/ W[z/_#jo\˟C)֕bsM^V706>з*RW7~f+3'懙{EGܴ9gd/i3O#GE_15<}C}0oIikӷ7 ksOso*[粎%~U/yװf3͹X; U'ͻ8+~y r^qv+2.H?2*7#q,39Z xk97X[jc.+_||:31VV6slͲ;y\yyk[ȳi::f?;Sqxg]3*7-W姙O=gm3=9e>She=uO{9fkM̫n.CFӷ"㶼#e"KbZϽ<;5>f6zIr޷-Ify ~Τ5^A4֖؜E׬͍ f(}avװi?xuB2Ǚ=G=ߕ^9v_r0m=j߼LfyNۼޚ&9{mMU3lvQ'ٗxj$7"cؼ&^O8mZ$_s yV_j3as#yU0]/Ψ/'sЇهVsvwl3sαY̕kUiz2L<|![}0&1f93a>*ǸW݅*0{N[=G^̙??xg(9-(U>Y^fw5D֌w^@3tx{g|yZͧڜVi=v|9Xnbr], 9@m9@m9@[:ցumh@[:6 Mmmh@&6 %Ж@[m %Ж@[m %Ж@6ж mmmh@6v ]mh@.v }mh@>FwG?P{҇!S}x=}ϣ/4۫??zj^.NZ/'6I?e8{].}[ ^}4~աWWo﯅(7$2I¿[˳Z??jgLbayesplot/tests/testthat/data-for-binomial.rda0000644000176200001440000001216614057711166021251 0ustar liggesusersY <]d Evc[J{Y*Q)kYZhWZUD쌝1v2c͖%KJ*-TJ%w<Ӽz|{{-Uov!M_Mpx F(,A_G*l>II Y\JOZ*7Bn(B寚%yA,?G)s5$^˯e/1F͒gs+(sƝaŃ91O81  _OK$fo {AЋhQF3^m~F-f.B`l:L{?"^8'7iI\ \&!q΍ǘ[haƈ\l}v6؉Qx 8?qr5\;6{l3=cƓ8l<ϙ9L_ĉdž\l6@=~S 0BcǙ~3_6=k8Q? ^3O3Vʷޟt8#3W<Ôscyƹ]Wf;L9?3OE ~6 { 8}gٱDZb+s/f+kiga͗}_}#GeBc_3Ʋ)}ThE}n X4+3jԚ,Zn3f|&;ӨZ3D./4mK/, Q(;PBMϞT+ͫP]ߔ|߹RޠRX]ᛠ2uf.jSf,BJwGa /p轐⎌gRhUYV6@+W|en&npEs_nD{Л$<ٌH[UzSWWUdBZTej*!c~9Հ&?)BB n}v V.PڡW Jʏ>ģpS*%PZ/kNg^PuO|uUҭMu[䷁.3i>j?؋Nn@vJQjb?CFC}ŋ 3c:o 6ML=_-BdXo? #<+>Ry-H{Q>nEvxq5,g5+Rw&jv˹B M;mPtRWV Y鲝[:&O6z9}^/7:dnPv=QZm% j+PVz_r;nȞA~Jm[lAen*r8cD/P Tk'OAj톰 s8rsm2"nA!5')o׻"GqwGZ7CMҒYa#CmDu.];P4.2}S\ Pr{/ ηuоUTP?{b4-'s=A3w:1yǛHd5P^KQӞj;0r;w|٨4$;;!//iÔaw[Ѯ!h&2q ,^&$+nGJ^QlWd/zmLAQ1fn@ q|dzVf.I\0RYVi\\/5TA$>;#7+&/Nl>Acb=OQqfT,<^<聢umLzPt@./JW[rg^x0TN}1; rQ!67 ICCrȐL=? vzzH]Y%m+fSpvy Ֆ} >(]םGd(QxЋ;:r5d2$~;^kxݵF }Hɣ+ˑk(CHLtH_QTZw·wDC.IxqS.E'1D}GpoY5XdT_='Qp4 VoIWh]_}5uXtvm47=#qٜ4ۇa~|d[г鱉)I }KR>b9m'܇Q{iGB:*:8yG(WRW-1Duj`Lfz9 e=#֠>Lf$L;XP|,D.F5Oc6[>Hx2U:Du?z٪t[RR2J.FdͅraT^`҇D/WC⺌nqA Fv'/K ݥoVoeyMޛGg߁hz4y\$i"HxV-|R@B~%7}!6FŒ4,^)\PT ܖԺi@FנIJ#жҊdM?>w/Jҭt{{8^D%S"c-ٛ{ t`>=ƜLL$—xI_CS%f-2dCG^dl)xRii{xK:SL獘#"5[.pSi9 =y7 $(*>BTG?o'/[54!w#u @kMx.D|U=шeq=aXdnCMEky>7U|NVnCә9X&:e#tQL'P_t  E@G6؃{FS&!a|ڢ~dͳD˭ q+U(7ĮCƢ]ibwkP*a)&UTg,xo`_ +-VC[CHQ6+4GyP|#{ӂd2Ur #ϰUGD8_םW+Դ] )G+Ez iޜ4u7m߆-Tb>W_\9m賑_zahe3T90'"u:iՒNZJw9 l}?oy-QlرOobE~BҖu2WA~ۍZnhew(6$<yy-KA^;eAU2)Q쑰gȠ ^ tggڳ'O.$?xMo0B $ekrr"}ӤXPL͝+kĥG-w 1$-~jSp(UGO{uh.߿.Q ףDRO#C~ ^z\v8>։ǒ7-ău7OGio9Qsx|``u%dW+$#˼PL|&g>ce7~?UȣT\ugoCojfO/zJrǽJ+kCIDOPLU۷g!P&+V(r(,c bȑj^{5 <%Efr.Tɓ͖H=7adz)8 b' $~i暈[3 Kw (!ykg' Sm< +]Fȴ9#Gie"bf}G܏NL{0Nf"ZY]}0rQ>HFkW\3./2"S-yT sFĽ6|nXח/6vVG* ¯KX*3&dLFɨ3 &òLY SeqDY[X*,  CPaa0TX*, * CPea0TY, U* CAdaYDAdaYDAdaYj, 5 CPcas#~7C(dluCB`d7$7bayesplot/tests/testthat/test-example-draws.R0000644000176200001440000000244214127610044021130 0ustar liggesuserslibrary(bayesplot) context("Example draws") test_that("example_mcmc_draws throws correct errors", { expect_error(example_mcmc_draws(chains = 5), "chains <= 4") expect_error(example_mcmc_draws(chains = 0), "chains >= 1") expect_error(example_mcmc_draws(params = 7), "params <= 6") expect_error(example_mcmc_draws(params = 0), "params >= 1") }) test_that("example_mcmc_draws returns correct structure", { expect_identical(dim(example_mcmc_draws()), c(250L, 4L, 4L)) expect_identical(dim(example_mcmc_draws(chains = 1, params = 6)), c(250L, 6L)) expect_identical(dim(example_mcmc_draws(params = 1)), c(250L, 4L, 1L)) expect_identical(dimnames(example_mcmc_draws(4, 6))[[3]], c("alpha", "sigma", paste0("beta[", 1:4,"]"))) }) test_that("example ppc data works", { y <- example_y_data() expect_type(y, "integer") expect_true(is_vector_or_1Darray(y)) yrep <- example_yrep_draws() expect_type(yrep, "double") expect_is(yrep, "matrix") expect_equal(ncol(yrep), length(y)) group <- example_group_data() expect_s3_class(group, "factor") expect_equal(length(group), length(y)) x <- example_x_data() expect_type(x, "double") expect_true(is_vector_or_1Darray(x)) expect_equal(length(x), length(y)) }) bayesplot/tests/testthat/test-ppc-discrete.R0000644000176200001440000001245514556465326020767 0ustar liggesuserslibrary(bayesplot) # suppressPackageStartupMessages(library(rstanarm)) context("PPC: discrete") source(test_path("data-for-ppc-tests.R")) load(test_path("data-for-ordinal.rda")) # data("esoph", package = "datasets") # fit <- stan_polr(tobgp ~ agegp, data = esoph, method = "probit", prior = R2(0.2, "mean"), # init_r = 0.1, seed = 12345, chains = 1, iter = 500, refresh = 0) # y_ord <- as.integer(fit$y) # yrep_char <- posterior_predict(fit, draws = 50) # yrep_ord <- sapply(data.frame(yrep_char, stringsAsFactors = TRUE), as.integer) # group_ord <- datasets::esoph$agegp # save(y_ord, yrep_ord, group_ord, file = testthat::test_path("data-for-ordinal.rda"), version = 2) # bar plots --------------------------------------------------------------- test_that("ppc_bars & ppc_bars_grouped return a ggplot object", { expect_gg(ppc_bars(y_ord, yrep_ord)) expect_gg(ppc_bars(y_ord, yrep_ord, prob = 0)) expect_gg(ppc_bars_grouped(y_ord, yrep_ord, group = group_ord)) }) test_that("freq argument to ppc_bars works", { p_freq <- ggplot2::ggplot_build(ppc_bars(y_ord, yrep_ord, freq = TRUE)) p_prop <- ggplot2::ggplot_build(ppc_bars(y_ord, yrep_ord, freq = FALSE)) y_freq <- p_freq$data[[1]]$y y_prop <- p_prop$data[[1]]$y expect_equal(y_freq, as.integer(y_freq)) expect_true(all(y_prop < 1) && all(y_prop > 0)) }) test_that("ppc_bars works with negative integers", { y <- round(rnorm(100, -10, 1)) yrep <- round(matrix(rnorm(100 * 500, -10, 1), 500, 100)) expect_gg(ppc_bars(y, yrep)) }) test_that("ppc_bars(_grouped) errors if y/yrep not discrete", { # make continuous y_cont <- y_ord + 0.33 yrep_cont <- yrep_ord + 0.33 expect_error(ppc_bars(y_cont, yrep_ord), "ppc_bars expects 'y' to be discrete") expect_error(ppc_bars(y_ord, yrep_cont), "ppc_bars expects 'yrep' to be discrete") expect_error(ppc_bars_grouped(y_cont, yrep_ord, group = group_ord), "ppc_bars expects 'y' to be discrete") expect_error(ppc_bars_grouped(y_ord, yrep_cont, group = group_ord), "ppc_bars expects 'yrep' to be discrete") }) test_that("ppc_bars_data includes all levels", { y_ord2 <- y_ord y_ord2[y_ord2 == 1] <- 2 yrep_ord2 <- yrep_ord yrep_ord2[yrep_ord2 == 2] <- 1 tab <- as.integer(table(y_ord)) # y and yrep have save levels d <- ppc_bars_data(y_ord, yrep_ord) expect_equal(d$x, 1:4) expect_equal(d$y_obs, tab) # yrep has more unique values than y d2 <- ppc_bars_data(y_ord2, yrep_ord) expect_equal(d2$x, 1:4) expect_equal(d2$y_obs, c(NA, sum(tab[1:2]), tab[3:4])) # y has more unique values than yrep d3 <- ppc_bars_data(y_ord, yrep_ord2) expect_equal(d3$x, 1:4) expect_equal(d3$y_obs, tab) expect_equivalent(d3$l[2], NA_real_) expect_equivalent(d3$m[2], NA_real_) expect_equivalent(d3$h[2], NA_real_) }) # rootograms ----------------------------------------------------------- yrep3 <- matrix(yrep2, nrow = 5, ncol = ncol(yrep2), byrow = TRUE) test_that("ppc_rootogram returns a ggplot object", { expect_gg(ppc_rootogram(y2, yrep2)) expect_gg(ppc_rootogram(y2, yrep3, style = "hanging", prob = 0.5)) expect_gg(ppc_rootogram(y2, yrep3, style = "suspended")) }) test_that("ppc_rootogram errors if y/yrep not counts", { expect_error(ppc_rootogram(y, yrep), "ppc_rootogram expects counts as inputs to 'y'") expect_error(ppc_rootogram(y2, yrep[1:5, seq_along(y2)]), "ppc_rootogram expects counts as inputs to 'yrep'") expect_error(ppc_rootogram(y, yrep3), "ncol(yrep) must be equal to length(y)", fixed = TRUE) }) # Visual tests ------------------------------------------------------------ test_that("ppc_bars renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_bars(vdiff_y2, vdiff_yrep2) vdiffr::expect_doppelganger("ppc_bars (default)", p_base) p_custom <- ppc_bars( y = vdiff_y2, yrep = vdiff_yrep2, width = 0.5, size = 0.5, fatten = 5 ) vdiffr::expect_doppelganger( title = "ppc_bars (width, size, fatten)", fig = p_custom) p_custom_prob <- ppc_bars( y = vdiff_y2, yrep = vdiff_yrep2, prob = 0.33, width = 0.5, size = 0.5, fatten = 5 ) vdiffr::expect_doppelganger( title = "ppc_bars (prob=0.33, width, size, fatten)", fig = p_custom_prob) }) test_that("ppc_bars_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_bars_grouped(vdiff_y2, vdiff_yrep2, vdiff_group2) vdiffr::expect_doppelganger("ppc_bars_grouped (default)", p_base) p_custom <- ppc_bars_grouped( y = vdiff_y2, yrep = vdiff_yrep2, group = vdiff_group2, facet_args = list(nrow = 2), prob = 0.5, size = 0.5 ) vdiffr::expect_doppelganger( title = "ppc_bars_grouped (facet_args, prob, size)", fig = p_custom) }) test_that("ppc_rootogram renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_rootogram(vdiff_y2, vdiff_yrep2) vdiffr::expect_doppelganger("ppc_rootogram (default)", p_base) p_custom_hanging <- ppc_rootogram( y = vdiff_y2, yrep = vdiff_yrep2, prob = 2/3, size = 3, style = "hanging" ) vdiffr::expect_doppelganger( title = "ppc_rootogram (style='hanging', prob, size)", fig = p_custom_hanging) }) bayesplot/tests/testthat/data-for-mcmc-tests.R0000644000176200001440000000526114335264325021166 0ustar liggesusersset.seed(8420) # Prepare input objects arr <- array(rnorm(4000), dim = c(100, 4, 10)) arr1chain <- arr[, 1, , drop = FALSE] drawsarr <- posterior::example_draws() drawsarr1chain <- drawsarr[, 1, , drop = FALSE] mat <- matrix(rnorm(1000), nrow = 100, ncol = 10) dframe <- as.data.frame(mat) chainlist <- list(matrix(rnorm(1000), nrow = 100, ncol = 10), matrix(rnorm(1000), nrow = 100, ncol = 10)) mixed_names <- c("(Intercept)", "beta[1]", "beta[2]", "sigma", paste0("b[(Intercept) x:", 1:6, "]")) colnames(mat) <- colnames(dframe) <- colnames(chainlist[[1]]) <- colnames(chainlist[[2]]) <- mixed_names dimnames(arr) <- dimnames(arr1chain) <- list(NULL, NULL, mixed_names) chainlist1chain <- chainlist[1] # one parameter arr1 <- arr[, , 1, drop = FALSE] drawsarr1 <- drawsarr[, , 1, drop = FALSE] mat1 <- mat[, 1, drop = FALSE] dframe1 <- dframe[, 1, drop = FALSE] chainlist1 <- list(chainlist[[1]][, 1, drop=FALSE], chainlist[[2]][, 1, drop=FALSE]) # data.frame with chain column dframe_multiple_chains <- dframe dframe_multiple_chains$chain <- rep(1:4, 25) # for vdiffr visual tests set.seed(11172017) vdiff_dframe <- as.data.frame(matrix(rnorm(500), nrow = 100, ncol = 5)) vdiff_dframe_chains <- as.data.frame( matrix(rnorm(4000), nrow = 2000, ncol = 2) ) vdiff_dframe_chains$chain <- rep(1:4, each = 500) vdiff_dframe_chains_divergences <- data.frame( Iteration = rep(1:500, each = 4), Parameter = "divergent__", Value = rbinom(2000, size = 1, prob = .02), Chain = vdiff_dframe_chains$chain, stringsAsFactors = FALSE ) vdiff_dframe_chains_treedepth <- vdiff_dframe_chains_divergences vdiff_dframe_chains_treedepth$Parameter <- "treedepth__" vdiff_dframe_chains_treedepth$Value <- sample(1:10, size = 2000, replace = TRUE) vdiff_dframe_chains_acceptance <- vdiff_dframe_chains_divergences vdiff_dframe_chains_acceptance$Parameter <- "accept_stat__" vdiff_dframe_chains_acceptance$Value <- runif(2000, 0.7, 1) vdiff_dframe_chains_stepsize <- vdiff_dframe_chains_divergences vdiff_dframe_chains_stepsize$Parameter <- "stepsize__" vdiff_dframe_chains_stepsize$Value <- rep(c(0.37, 0.42, 0.33, 0.47), each = 500) vdiff_dframe_chains_energy <- vdiff_dframe_chains_divergences vdiff_dframe_chains_energy$Parameter <- "energy__" vdiff_dframe_chains_energy$Value <- rexp(2000, rate = 0.1) vdiff_dframe_chains_np <- rbind( vdiff_dframe_chains_divergences, vdiff_dframe_chains_treedepth, vdiff_dframe_chains_energy, vdiff_dframe_chains_acceptance, vdiff_dframe_chains_stepsize ) vdiff_dframe_chains_lp <- vdiff_dframe_chains_divergences vdiff_dframe_chains_lp$Parameter <- NULL vdiff_dframe_chains_lp$Value <- runif(2000, -100, -50) set.seed(seed = NULL) bayesplot/tests/testthat/test-bayesplot_grid.R0000644000176200001440000000320314335264325021372 0ustar liggesuserslibrary(bayesplot) context("bayesplot_grid") y <- example_y_data() yrep <- example_yrep_draws()[1:25, ] gr <- gridExtra::arrangeGrob(ppc_stat(y, yrep, binwidth = 1)) p1 <- ppc_scatter_avg(y, yrep) p2 <- ppc_stat(y, yrep, binwidth = 1) test_that("as_bayesplot_grid works", { expect_s3_class(as_bayesplot_grid(gr), "bayesplot_grid") expect_s3_class(as_bayesplot_grid(gr), "gtable") }) test_that("bayesplot_grid throws correct errors", { expect_error(bayesplot_grid(xlim = 2), "No plots specified") expect_error(bayesplot_grid(gr, plots = list(p1, p2)), "'...' and 'plots' can't both be specified") expect_error(bayesplot_grid(plots = gr), "'plots' must be a list of ggplot objects") expect_error(bayesplot_grid(gr), "objects in '...' must be ggplot objects.") expect_error(bayesplot_grid(p1, p2, titles = c("plot1")), "length(titles) == length(plots) is not TRUE", fixed = TRUE) expect_error(bayesplot_grid(p1, p2, subtitles = c("plot1")), "length(subtitles) == length(plots) is not TRUE", fixed = TRUE) }) test_that("bayesplot_grid works", { expect_message( a <- bayesplot_grid(p1, p2, xlim = c(-200, 200), ylim = c(0, 200)), "is already present", fixed = TRUE ) expect_silent( b <- bayesplot_grid(plots = list(p1, p2), titles = c("plot1", "plot2"), subtitles = c("plot1_sub", "plot2_sub"), legends = FALSE) ) expect_s3_class(a, "bayesplot_grid") expect_s3_class(b, "bayesplot_grid") expect_equal(length(a$grobs), 2) expect_equal(length(b$grobs), 2) }) bayesplot/tests/testthat/test-ppc-distributions.R0000644000176200001440000002312514556465326022063 0ustar liggesuserslibrary(bayesplot) context("PPC: distributions") source(test_path("data-for-ppc-tests.R")) test_that("ppc_dens_overlay returns a ggplot object", { expect_gg(ppc_dens_overlay(y, yrep)) expect_gg(ppc_dens_overlay(y2, yrep2, size = 0.5, alpha = 0.2)) # ppd versions expect_gg(ppd_dens_overlay(yrep)) expect_gg(ppd_dens_overlay(yrep2, size = 0.5, alpha = 0.2)) }) test_that("ppc_ecdf_overlay returns a ggplot object", { expect_gg(ppc_ecdf_overlay(y, yrep, size = 0.5, alpha = 0.2)) expect_gg(ppc_ecdf_overlay(y2, yrep2)) # ppd versions expect_gg(ppd_ecdf_overlay(yrep, size = 0.5, alpha = 0.2)) expect_gg(ppd_ecdf_overlay(yrep2)) }) test_that("ppc_dens,pp_hist,ppc_freqpoly,ppc_boxplot return ggplot objects", { expect_gg(ppc_hist(y, yrep[1,, drop = FALSE], binwidth = 0.1)) expect_gg(ppc_hist(y, yrep[1:8, ], binwidth = 0.1)) expect_gg(ppc_hist(y2, yrep2, binwidth = 0.1)) expect_gg(ppc_dens(y, yrep[1:8, ])) expect_gg(ppc_dens(y2, yrep2)) expect_gg(ppc_freqpoly(y, yrep[1:8, ], binwidth = 2, size = 2, alpha = 0.1)) expect_gg(ppc_freqpoly(y2, yrep2, binwidth = 0.1)) expect_gg(ppc_boxplot(y, yrep[1,, drop = FALSE])) expect_gg(ppc_boxplot(y, yrep[1:8, ])) expect_gg(ppc_boxplot(y2, yrep2, notch = FALSE)) expect_gg(p <- ppc_hist(y, yrep[1:8, ], binwidth = 3)) if (utils::packageVersion("ggplot2") >= "3.0.0") { facet_var <- vars(rep_label) expect_equal(p$facet$params$facets[[1]], facet_var[[1]]) } # ppd versions expect_gg(ppd_hist(yrep[1,, drop = FALSE], binwidth = 0.1)) expect_gg(ppd_hist(yrep[1:8, ], binwidth = 0.1)) expect_gg(ppd_hist(yrep2, binwidth = 0.1)) expect_gg(ppc_dens(y, yrep[1:8, ])) expect_gg(ppc_dens(y2, yrep2)) expect_gg(ppd_freqpoly(yrep[1:8, ], binwidth = 2, size = 2, alpha = 0.1)) expect_gg(ppd_freqpoly(yrep2, binwidth = 0.1)) expect_gg(ppd_boxplot(yrep[1,, drop = FALSE])) expect_gg(ppd_boxplot(yrep[1:8, ])) expect_gg(ppd_boxplot(yrep2, notch = FALSE)) }) test_that("ppc_pit_ecdf, ppc_pit_ecdf_grouped returns a ggplot object", { expect_gg(ppc_pit_ecdf(y, yrep, interpolate_adj = FALSE)) expect_gg(ppc_pit_ecdf_grouped(y, yrep, group = group, interpolate_adj = FALSE)) expect_message(ppc_pit_ecdf(pit = runif(100)), "'pit' specified") expect_message( ppc_pit_ecdf_grouped(pit = runif(length(group)), group = group, interpolate_adj = FALSE), "'pit' specified" ) }) test_that("ppc_freqpoly_grouped returns a ggplot object", { expect_gg(ppc_freqpoly_grouped(y, yrep[1:4, ], group)) expect_gg(ppc_freqpoly_grouped(y, yrep[1:4, ], group, freq = TRUE, alpha = 0.5)) # ppd versions expect_gg(ppd_freqpoly_grouped(yrep[1:4, ], group)) }) test_that("ppc_violin_grouped returns a ggplot object", { expect_gg(ppc_violin_grouped(y, yrep, group)) expect_gg(ppc_violin_grouped(y, yrep, as.numeric(group))) expect_gg(ppc_violin_grouped(y, yrep, as.integer(group))) expect_gg(ppc_violin_grouped(y, yrep, group, y_draw = "both", y_jitter = 0.3)) }) # Visual tests ----------------------------------------------------------------- test_that("ppc_hist renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_hist(vdiff_y, vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppc_hist (default)", p_base) p_binwidth <- ppc_hist(vdiff_y, vdiff_yrep[1:8, ], binwidth = 3) vdiffr::expect_doppelganger("ppc_hist (binwidth)", p_binwidth) # ppd versions p_base <- ppd_hist(vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppd_hist (default)", p_base) p_binwidth <- ppd_hist(vdiff_yrep[1:8, ], binwidth = 3) vdiffr::expect_doppelganger("ppd_hist (binwidth)", p_binwidth) }) test_that("ppc_freqpoly renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_freqpoly(vdiff_y, vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppc_freqpoly (default)", p_base) p_custom <- ppc_freqpoly( y = vdiff_y, yrep = vdiff_yrep[1:8, ], binwidth = 2, size = 2, alpha = 0.1) vdiffr::expect_doppelganger( title = "ppc_freqpoly (alpha, binwidth, size)", fig = p_custom) # ppd versions p_base <- ppd_freqpoly(vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppd_freqpoly (default)", p_base) p_custom <- ppd_freqpoly( ypred = vdiff_yrep[1:8, ], binwidth = 2, size = 2, alpha = 0.1) vdiffr::expect_doppelganger( title = "ppd_freqpoly (alpha, binwidth, size)", fig = p_custom) }) test_that("ppc_freqpoly_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_freqpoly_grouped(vdiff_y, vdiff_yrep[1:3, ], vdiff_group) vdiffr::expect_doppelganger("ppc_freqpoly_grouped (default)", p_base) # ppd versions p_base <- ppd_freqpoly_grouped(vdiff_yrep[1:3, ], vdiff_group) vdiffr::expect_doppelganger("ppd_freqpoly_grouped (default)", p_base) }) test_that("ppc_boxplot renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_boxplot(vdiff_y, vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppc_boxplot (default)", p_base) p_no_notch <- ppc_boxplot(vdiff_y, vdiff_yrep[1:8, ], notch = FALSE) vdiffr::expect_doppelganger("ppc_boxplot (no notch)", p_no_notch) p_custom <- ppc_boxplot(vdiff_y, vdiff_yrep[1:8, ], size = 1.5, alpha = .5) vdiffr::expect_doppelganger("ppc_boxplot (alpha, size)", p_custom) # ppd versions p_base <- ppd_boxplot(vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppd_boxplot (default)", p_base) p_no_notch <- ppd_boxplot(vdiff_yrep[1:8, ], notch = FALSE) vdiffr::expect_doppelganger("ppd_boxplot (no notch)", p_no_notch) p_custom <- ppd_boxplot(vdiff_yrep[1:8, ], size = 1.5, alpha = .5) vdiffr::expect_doppelganger("ppd_boxplot (alpha, size)", p_custom) }) test_that("ppc_ecdf_overlay renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_ecdf_overlay(vdiff_y2, vdiff_yrep2) vdiffr::expect_doppelganger("ppc_ecdf_overlay (default)", p_base) p_custom <- ppc_ecdf_overlay( vdiff_y2, vdiff_yrep2, discrete = TRUE, size = 2, alpha = .2 ) vdiffr::expect_doppelganger( "ppc_ecdf_overlay (discrete, size, alpha)", p_custom ) }) test_that("ppc_ecdf_overlay_grouped renders correctly", { testthat::skip_on_cran() p_base <- ppc_ecdf_overlay_grouped(vdiff_y2, vdiff_yrep2, vdiff_group2) vdiffr::expect_doppelganger("ppc_ecdf_overlay_grouped (default)", p_base) p_custom <- ppc_ecdf_overlay_grouped( vdiff_y2, vdiff_yrep2, vdiff_group2, discrete = TRUE, size = 2, alpha = .2 ) vdiffr::expect_doppelganger( "ppc_ecdf_overlay_grouped (discrete, size, alpha)", p_custom ) }) test_that("ppc_dens renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_dens(vdiff_y, vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppc_dens (default)", p_base) # ppd versions p_base <- ppd_dens(vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppd_dens (default)", p_base) }) test_that("ppc_dens_overlay renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_dens_overlay(vdiff_y, vdiff_yrep) vdiffr::expect_doppelganger("ppc_dens_overlay (default)", p_base) p_custom <- ppc_dens_overlay(vdiff_y, vdiff_yrep, size = 1, alpha = 0.2) vdiffr::expect_doppelganger("ppc_dens_overlay (alpha, size)", p_custom) # ppd versions p_base <- ppd_dens_overlay(vdiff_yrep) vdiffr::expect_doppelganger("ppd_dens_overlay (default)", p_base) p_custom <- ppd_dens_overlay(vdiff_yrep, size = 1, alpha = 0.2) vdiffr::expect_doppelganger("ppd_dens_overlay (alpha, size)", p_custom) }) test_that("ppc_dens_overlay_grouped renders correctly", { testthat::skip_on_cran() p_base <- ppc_dens_overlay_grouped(vdiff_y, vdiff_yrep, vdiff_group) vdiffr::expect_doppelganger("ppc_dens_overlay_grouped (default)", p_base) p_custom <- ppc_dens_overlay_grouped( vdiff_y, vdiff_yrep, vdiff_group, size = 1, alpha = 0.2 ) vdiffr::expect_doppelganger( "ppc_dens_overlay_grouped (alpha, size)", p_custom ) }) test_that("ppc_violin_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not(getRversion() >= "3.6.0") testthat::skip_if_not_installed("vdiffr") p_base <- ppc_violin_grouped(vdiff_y, vdiff_yrep, vdiff_group) vdiffr::expect_doppelganger("ppc_violin_grouped (default)", p_base) # lock in jitter set.seed(100) p_dots <- ppc_violin_grouped( y = vdiff_y, yrep = vdiff_yrep, group = vdiff_group, y_draw = "both") vdiffr::expect_doppelganger("ppc_violin_grouped (with points)", p_dots) p_dots_jitter <- ppc_violin_grouped( y = vdiff_y, yrep = vdiff_yrep, group = vdiff_group, y_draw = "points", y_jitter = 0.01) vdiffr::expect_doppelganger( "ppc_violin_grouped (points, low jitter)", p_dots_jitter) set.seed(seed = NULL) }) test_that("ppc_pit_ecdf, ppc_pit_ecdf_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_pit_ecdf(y, yrep, interpolate_adj = FALSE) g_base <- ppc_pit_ecdf_grouped(y, yrep, group = group, interpolate_adj = FALSE) p_diff <- ppc_pit_ecdf(y, yrep, plot_diff = TRUE, interpolate_adj = FALSE) g_diff <- ppc_pit_ecdf_grouped(y, yrep, plot_diff = TRUE, group = group, interpolate_adj = FALSE) vdiffr::expect_doppelganger("ppc_pit_ecdf (default)", p_base) vdiffr::expect_doppelganger("ppc_pit_ecdf_grouped (default)", g_base) vdiffr::expect_doppelganger("ppc_pit_ecdf (diff)", p_diff) vdiffr::expect_doppelganger("ppc_pit_ecdf_grouped (diff)", g_diff) }) bayesplot/tests/testthat/test-mcmc-combo.R0000644000176200001440000000435114556465326020415 0ustar liggesuserslibrary(bayesplot) context("MCMC: combo") source(test_path("data-for-mcmc-tests.R")) test_that("mcmc_combo returns a gtable object", { expect_gtable(mcmc_combo(arr, regex_pars = "beta")) expect_gtable(mcmc_combo(arr, regex_pars = "beta", gg_theme = ggplot2::theme_dark())) expect_gtable(mcmc_combo(drawsarr, regex_pars = "theta")) expect_gtable(mcmc_combo(mat, regex_pars = "beta", binwidth = 1/20, combo = c("dens", "hist"), facet_args = list(nrow = 2))) expect_gtable(mcmc_combo(dframe, regex_pars = "Intercept")) expect_gtable(mcmc_combo(dframe_multiple_chains, regex_pars = "Intercept", combo = c("trace_highlight", "dens_overlay"))) expect_gtable(mcmc_combo(arr1chain, regex_pars = "Intercept", combo = c("trace", "hist"))) expect_gtable(mcmc_combo(arr1, pars = "(Intercept)")) expect_gtable(mcmc_combo(drawsarr1)) expect_gtable(mcmc_combo(mat1)) expect_gtable(mcmc_combo(dframe1)) }) # functions that require multiple chains ---------------------------------- test_that("mcmc_combo throws error if 1 chain but multiple chains required", { expect_error(mcmc_combo(arr1chain, regex_pars = "beta", combo = c("trace_highlight", "dens")), "requires multiple chains") expect_error(mcmc_combo(drawsarr1chain, regex_pars = "theta", combo = c("trace_highlight", "dens")), "requires multiple chains") expect_error(mcmc_combo(mat, regex_pars = "beta", combo = c("trace_highlight", "hist")), "requires multiple chains") expect_error(mcmc_combo(dframe, regex_pars = "beta", combo = c("dens_overlay", "trace")), "requires multiple chains") }) # other errors ------------------------------------------------------------ test_that("mcmc_combo throws errors", { expect_error(mcmc_combo(arr, combo = c("trace_highlight")), "'combo' should have at least two elements") expect_error(mcmc_combo(arr, regex_pars = "beta", combo = c("animal", "hist", "tornado")), "The following functions were not found: mcmc_animal, mcmc_tornado") }) bayesplot/tests/testthat/test-helpers-shared.R0000644000176200001440000000706014127610044021266 0ustar liggesuserslibrary(bayesplot) context("Shared: misc. functions") # suggested packages ------------------------------------------------------ test_that("suggested_package throws correct errors", { expect_error(suggested_package("NOPACKAGE"), "Please install the NOPACKAGE package") expect_error(suggested_package(c("testthat", "gridExtra")), "length") expect_silent(suggested_package("testthat")) expect_silent(suggested_package("testthat", min_version = "0.0.1")) expect_error(suggested_package("testthat", min_version = "100000.0.0")) }) # check_ignored_arguments ------------------------------------------------- test_that("check_ignored_arguments throws correct warnings", { expect_warning(check_ignored_arguments(a = 1, b = "2"), "The following arguments were unrecognized and ignored: a, b") expect_warning(check_ignored_arguments(a = 1, b = "2", ok_args = c("a", "c")), "The following arguments were unrecognized and ignored: b") expect_silent(check_ignored_arguments(a = 1, b = "2", ok_args = c("a", "b", "c"))) }) # parameter selection ----------------------------------------------------- all_pars <- c("param_1", "param_2", "param[1]", "param[2]", "param[1,3,5]", "param[2,4,5]", "alpha", "beta") test_that("select_parameters throws errors if 'explicit' not found", { expect_error(select_parameters(explicit = c("alpha", "ALPHA"), complete_pars = all_pars), "don't match parameter names: ALPHA") expect_error(select_parameters(c("BETA", "ALPHA"), complete = all_pars), "don't match parameter names: BETA, ALPHA") }) test_that("select_parameters throws errors if no regex matches", { expect_error(select_parameters(explicit = c("alpha", "beta"), patterns = "tomato|apple", complete_pars = all_pars), "No matches for 'regex_pars'") }) test_that("select_parameters works with regex", { expect_identical(select_parameters(patterns = "param", complete = all_pars), all_pars[-c(7:8)]) expect_identical(select_parameters(patterns = c("param", "tomato"), complete_pars = all_pars), all_pars[-c(7:8)]) expect_identical(select_parameters(patterns = c("param\\[", "tomato"), complete_pars = all_pars), all_pars[3:6]) expect_identical(select_parameters(patterns = c("param\\_"), complete_pars = all_pars), all_pars[1:2]) }) test_that("select_parameters works without regex", { expect_identical(select_parameters(explicit = "alpha", complete_pars = all_pars), "alpha") expect_identical(select_parameters(c("alpha", "param[1,3,5]"), complete_pars = all_pars), c("alpha", "param[1,3,5]")) }) test_that("select_parameters works with both explicit and regex", { expect_identical(select_parameters(explicit = "alpha", patterns = "param", complete_pars = all_pars), c("alpha", all_pars[-c(7:8)])) expect_identical(select_parameters(explicit = "alpha", patterns = "alpha", complete_pars = all_pars), "alpha") expect_identical(select_parameters(explicit = c("alpha", "beta"), patterns = "param\\[|param\\_", complete_pars = all_pars), c(all_pars[7:8], all_pars[-c(7:8)])) }) bayesplot/tests/testthat/data-for-ppc-tests.R0000644000176200001440000000161714335264325021032 0ustar liggesusersset.seed(8420) y <- rnorm(100) yrep <- matrix(rnorm(2500), ncol = 100) group <- gl(4, 25, labels = LETTERS[1:4]) status_y <- rep_len(0:1, length.out = length(y)) y2 <- rpois(30, 1) yrep2 <- matrix(rpois(30, 1), ncol = 30) group2 <- rep(1, 30) status_y2 <- rep_len(0:1, length.out = length(y2)) # for vdiffr visual tests set.seed(11172017) vdiff_y <- rnorm(100) vdiff_yrep <- matrix(rnorm(2500), ncol = 100) vdiff_group <- gl(4, 25, labels = LETTERS[1:4]) vdiff_status_y <- rep_len(0:1, length.out = length(vdiff_y)) vdiff_y2 <- rpois(30, 1) vdiff_yrep2 <- matrix(rpois(30 * 10, 1), ncol = 30, nrow = 10) vdiff_group2 <- rep_len(c(1,2), length.out = 30) vdiff_status_y2 <- rep_len(0:1, length.out = length(vdiff_y2)) vdiff_loo_y <- rnorm(100, 30, 5) vdiff_loo_yrep <- matrix(rnorm(100 * 400, 30, 5), nrow = 400) vdiff_loo_lw <- vdiff_loo_yrep vdiff_loo_lw[] <- rnorm(100 * 400, -8, 2) set.seed(seed = NULL) bayesplot/tests/testthat/test-mcmc-traces.R0000644000176200001440000002061614335264325020570 0ustar liggesuserslibrary(bayesplot) context("MCMC: traces") source(test_path("data-for-mcmc-tests.R")) test_that("mcmc_trace returns a ggplot object", { expect_gg(mcmc_trace(arr, pars = "beta[1]", regex_pars = "x\\:")) expect_gg(mcmc_trace(arr1chain, pars = "beta[2]", regex_pars = "x\\:")) expect_gg(mcmc_trace(mat)) expect_gg(mcmc_trace(dframe)) expect_gg(mcmc_trace(dframe_multiple_chains)) expect_gg(mcmc_trace(chainlist)) expect_gg(mcmc_trace(arr1)) expect_gg(mcmc_trace(mat1)) expect_gg(mcmc_trace(dframe1)) expect_gg(mcmc_trace(chainlist1)) }) # functions that require multiple chains ---------------------------------- test_that("mcmc_trace_highlight returns a ggplot object", { expect_gg(mcmc_trace_highlight(arr, regex_pars = c("beta", "x\\:"))) expect_gg(mcmc_trace_highlight(dframe_multiple_chains, highlight = 2)) }) test_that("mcmc_trace_highlight throws error if 1 chain but multiple chains required", { expect_error(mcmc_trace_highlight(mat), "requires multiple") expect_error(mcmc_trace_highlight(dframe, highlight = 1), "requires multiple chains") expect_error(mcmc_trace_highlight(arr1chain, highlight = 1), "requires multiple chains") }) test_that("mcmc_trace_highlight throws error if highlight > number of chains", { expect_error(mcmc_trace_highlight(arr, pars = "sigma", highlight = 7), "'highlight' is 7") }) test_that("mcmc_rank_ecdf returns a ggplot object", { expect_gg(mcmc_rank_ecdf(arr, regex_pars = c("beta", "x\\:"))) expect_gg(mcmc_rank_ecdf(dframe_multiple_chains, interpolate_adj = FALSE)) }) test_that("mcmc_rank_ecdf throws error if 1 chain but multiple chains required", { expect_error(mcmc_rank_ecdf(mat), "requires multiple chains") expect_error(mcmc_rank_ecdf(dframe), "requires multiple chains") expect_error(mcmc_rank_ecdf(arr1chain), "requires multiple chains") }) # options ----------------------------------------------------------------- test_that("mcmc_trace options work", { expect_gg(g1 <- mcmc_trace(arr, regex_pars = "beta", window = c(5, 10))) coord <- g1$coordinates expect_equal(g1$coordinates$limits$x, c(5, 10)) expect_gg(g2 <- mcmc_trace(arr, regex_pars = "beta", n_warmup = 10)) ll <- g2$labels expect_true(all(c("xmin", "xmax", "ymin", "ymax") %in% names(ll))) expect_error(mcmc_trace(arr, iter1 = -1)) expect_error(mcmc_trace(arr, n_warmup = 50, iter1 = 20)) }) test_that("mcmc_rank_ecdf options work", { expect_error( mcmc_rank_ecdf(dframe_multiple_chains, interpolate_adj = TRUE), "No precomputed values" ) }) # displaying divergences in traceplot ------------------------------------- test_that("mcmc_trace 'np' argument works", { skip_if_not_installed("rstanarm") suppressPackageStartupMessages(library(rstanarm)) fit <- stan_glm(mpg ~ wt + am, data = mtcars, iter = 1000, chains = 2, refresh = 0) draws <- as.array(fit) # divergences via nuts_params divs1 <- ensure_divergences(nuts_params(fit, pars = "divergent__")) g <- mcmc_trace(draws, pars = "sigma", np = divs1) expect_gg(g) l2_data <- g$layers[[2]]$data expect_equal(names(l2_data), "Divergent") # divergences as vector via 'divergences' arg should throw deprecation warning divs2 <- rep_len(c(0,1), length.out = nrow(draws)) expect_warning( g2 <- mcmc_trace(draws, pars = "sigma", divergences = divs2), regexp = "deprecated" ) expect_gg(g2) expect_error( mcmc_trace(draws, pars = "sigma", np = divs1, divergences = divs2), "can't both be specified" ) # check errors & messages expect_error(mcmc_trace(draws, pars = "sigma", np = 1), "length(divergences) == n_iter is not TRUE", fixed = TRUE) expect_error(mcmc_trace(draws[,1,], pars = "sigma", np = divs1), "num_chains(np) == n_chain is not TRUE", fixed = TRUE) expect_error(mcmc_trace(draws, pars = "sigma", np = divs1[1:10, ]), "num_iters(np) == n_iter is not TRUE", fixed = TRUE) divs1$Value[divs1$Parameter == "divergent__"] <- 0 expect_message(mcmc_trace(draws, pars = "sigma", np = divs1), "No divergences to plot.") }) # Visual tests ----------------------------------------------------------------- test_that("mcmc_trace renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_trace(vdiff_dframe_chains, pars = c("V1", "V2")) p_one_param <- mcmc_trace(vdiff_dframe_chains, pars = "V1") p_warmup <- mcmc_trace( vdiff_dframe_chains, pars = c("V1", "V2"), n_warmup = 200 ) p_iter1 <- mcmc_trace( vdiff_dframe_chains, pars = c("V1", "V2"), iter1 = 200 ) vdiffr::expect_doppelganger("mcmc_trace (default)", p_base) vdiffr::expect_doppelganger("mcmc_trace (one parameter)", p_one_param) vdiffr::expect_doppelganger("mcmc_trace (warmup window)", p_warmup) vdiffr::expect_doppelganger("mcmc_trace (iter1 offset)", p_iter1) }) test_that("mcmc_rank_overlay renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_rank_overlay(vdiff_dframe_chains, pars = c("V1", "V2")) p_base_ref <- mcmc_rank_overlay( vdiff_dframe_chains, pars = c("V1", "V2"), ref_line = TRUE ) p_one_param <- mcmc_rank_overlay(vdiff_dframe_chains, pars = "V1") p_one_param_wide_bins <- mcmc_rank_overlay( vdiff_dframe_chains, pars = "V1", n_bins = 4 ) vdiffr::expect_doppelganger("mcmc_rank_overlay (default)", p_base) vdiffr::expect_doppelganger( "mcmc_rank_overlay (reference line)", p_base_ref ) vdiffr::expect_doppelganger("mcmc_rank_overlay (one parameter)", p_one_param) vdiffr::expect_doppelganger( "mcmc_rank_overlay (wide bins)", p_one_param_wide_bins ) }) test_that("mcmc_rank_hist renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_rank_hist(vdiff_dframe_chains, pars = c("V1", "V2")) p_base_ref <- mcmc_rank_hist( vdiff_dframe_chains, pars = c("V1", "V2"), ref_line = TRUE ) p_one_param <- mcmc_rank_hist(vdiff_dframe_chains, pars = "V1") p_one_param_wide_bins <- mcmc_rank_hist( vdiff_dframe_chains, pars = "V1", n_bins = 4 ) vdiffr::expect_doppelganger("mcmc_rank_hist (default)", p_base) vdiffr::expect_doppelganger( "mcmc_rank_hist (reference line)", p_base_ref ) vdiffr::expect_doppelganger( "mcmc_rank_hist (one parameter)", p_one_param ) vdiffr::expect_doppelganger( "mcmc_rank_hist (wide bins)", p_one_param_wide_bins ) }) test_that("mcmc_trace_highlight renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_trace_highlight( vdiff_dframe_chains, pars = "V1", highlight = 1 ) p_2 <- mcmc_trace_highlight( vdiff_dframe_chains, pars = "V1", highlight = 2 ) p_alpha <- mcmc_trace_highlight( vdiff_dframe_chains, pars = "V1", highlight = 1, alpha = .1 ) vdiffr::expect_doppelganger("mcmc_trace_highlight (default)", p_base) vdiffr::expect_doppelganger("mcmc_trace_highlight (other chain)", p_2) vdiffr::expect_doppelganger("mcmc_trace_highlight (alpha)", p_alpha) }) test_that("mcmc_rank_ecdf renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_rank_ecdf(vdiff_dframe_chains, pars = c("V1", "V2")) p_one_param <- mcmc_rank_ecdf(vdiff_dframe_chains, pars = "V1") p_diff <- mcmc_rank_ecdf( vdiff_dframe_chains, pars = c("V1", "V2"), plot_diff = TRUE ) p_diff_one_param <- mcmc_rank_ecdf( vdiff_dframe_chains, pars = "V1", plot_diff = TRUE ) vdiffr::expect_doppelganger("mcmc_rank_ecdf (default)", p_base) vdiffr::expect_doppelganger("mcmc_rank_ecdf (one parameter)", p_one_param) vdiffr::expect_doppelganger("mcmc_rank_ecdf (diff)", p_diff) vdiffr::expect_doppelganger( "mcmc_rank_ecdf (one param, diff)", p_diff_one_param ) }) test_that("mcmc_trace with 'np' renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_trace( vdiff_dframe_chains, pars = "V1", np = vdiff_dframe_chains_divergences ) new_style <- trace_style_np(div_color = "black") p_np_style <- mcmc_trace( vdiff_dframe_chains, pars = "V1", np = vdiff_dframe_chains_divergences, np_style = new_style ) vdiffr::expect_doppelganger("mcmc_trace divergences (default)", p_base) vdiffr::expect_doppelganger("mcmc_trace divergences (custom)", p_np_style) }) bayesplot/tests/testthat/test-aesthetics.R0000644000176200001440000001662414335264325020532 0ustar liggesuserslibrary(bayesplot) context("Aesthetics") # color scheme stuff ------------------------------------------------------ prepare_colors_for_test <- function(scheme) { setNames( bayesplot:::master_color_list[[scheme]], bayesplot:::scheme_level_names() ) } test_that("getting and setting the color scheme works", { color_scheme_set("red") expect_equivalent(color_scheme_get(), prepare_colors_for_test("red")) expect_named(prepare_colors_for_test("blue"), scheme_level_names()) expect_named(color_scheme_get(), scheme_level_names()) for (clr in names(master_color_list)) { color_scheme_set(clr) expect_equivalent(color_scheme_get(), prepare_colors_for_test(clr), info = clr) expect_named(color_scheme_get(), scheme_level_names()) } expect_output(print(color_scheme_get("mix-blue-green")), "mix-blue-green") expect_gg(plot(color_scheme_get("mix-blue-green"))) color_scheme_set("blue") expect_equivalent(color_scheme_get("teal"), prepare_colors_for_test("teal")) # error if not character expect_error(color_scheme_set(7), "'scheme' should be a character vector of length 1 or 6") }) test_that("color_scheme_get with i argument works", { a <- color_scheme_get("green", i = 1) expect_equal(length(a), 1) expect_named(a, "light") b <- color_scheme_get("purple", i = c(2, 4, 5)) expect_equal(length(b), 3) expect_named(b, c("light_highlight", "mid_highlight", "dark")) expect_error( color_scheme_get(i = 1:7), "all(i %in% seq_along(scheme)) is not TRUE", fixed = TRUE ) expect_error( color_scheme_get(i = c(1, 3, 3)), "length(unique(i)) == length(i) is not TRUE", fixed = TRUE ) # if is character it should behave the same as internal 'get_color' expect_identical(color_scheme_get(i = c("l", "dh")), get_color(c("l", "dh"))) }) test_that("setting mixed scheme works", { color_scheme_set("mix-gray-blue") expect_equivalent(color_scheme_get(), mixed_scheme("gray", "blue")) color_scheme_set("mix-blue-gray") expect_equivalent(color_scheme_get(), mixed_scheme("blue", "gray")) expect_error(color_scheme_set("mix-green-reds"), "should be one of") expect_error(color_scheme_set("mix-greens-red"), "should be one of") }) test_that("setting brewer scheme works", { skip_if_not_installed("RColorBrewer") color_scheme_set("brewer-Blues") expect_equivalent(unlist(color_scheme_get()), RColorBrewer::brewer.pal(6, "Blues")) color_scheme_set("brewer-Spectral") expect_equivalent(unlist(color_scheme_get()), RColorBrewer::brewer.pal(6, "Spectral")) expect_error(color_scheme_set("brewer-FAKE"), "FAKE is not a valid palette") }) orange_scheme_bad <- orange_scheme_ok <- c("not_a_color1", "#ffcc80", "#ffad33", "#e68a00", "#995c00", "not_a_color2") orange_scheme_ok[c(1, 6)] <- c("#ffebcc", "#663d00") test_that("color_scheme_set throws correct errors for custom schemes ", { expect_error(color_scheme_set(orange_scheme_bad), "not found: not_a_color1, not_a_color2") expect_error(color_scheme_set(c("red", "blue")), "should be a character vector of length 1 or 6") expect_error(prepare_custom_colors(c("red", "blue")), "Custom color schemes must contain exactly 6 colors") }) test_that("mixed_scheme internal function doesn't error", { x <- mixed_scheme("green", "red") expect_equal(length(x), 6) expect_true(all(sapply(x, is.character))) }) test_that("custom color schemes work", { color_scheme_set(orange_scheme_ok) expect_named(color_scheme_get()) expect_equivalent(unlist(color_scheme_get()), orange_scheme_ok) random_scheme <- colors()[sample(length(colors()), 6)] color_scheme_set(random_scheme) expect_equivalent(unlist(color_scheme_get()), random_scheme) }) test_that("get_color returns correct color values", { scheme <- color_scheme_set("green") levs <- scheme_level_names() ans <- unlist(prepare_colors_for_test("green")[levs], use.names = FALSE) expect_identical(get_color(levs), ans) for (lev in levs) expect_identical(get_color(lev), scheme[[lev]], info = lev) }) test_that("color_scheme_view returns correct ggplot object", { color_scheme_set("red") a <- color_scheme_view() b <- color_scheme_view("green") expect_gg(a) expect_gg(b) expect_identical(a$plot_env$x, color_scheme_get()) expect_identical(b$plot_env$x, color_scheme_get("green")) }) test_that("color_scheme_view returns gtable if length(scheme) >= 1", { expect_gtable(color_scheme_view(c("red", "gray"))) expect_gtable(color_scheme_view(c("red", "gray", "blue"))) }) # ggplot themes ------------------------------------------------------------ default <- theme_default() minimal <- ggplot2::theme_minimal() dark <- ggplot2::theme_dark() test_that("theme_default creates ggplot theme", { expect_type(default, "list") expect_s3_class(default, "theme") thm2 <- theme_default(base_size = 13) expect_type(thm2, "list") expect_s3_class(thm2, "theme") expect_equal(thm2[["text"]][["size"]], 13) }) test_that("bayesplot_theme_set warns of missing theme elements", { dark2 <- ggplot2::theme_dark() dark2$line <- NULL expect_warning( bayesplot_theme_set(dark2), "New theme missing the following elements: line" ) bayesplot_theme_set() }) test_that("bayesplot_theme_set/get work", { bayesplot_theme_set() expect_identical(bayesplot_theme_get(), default) expect_identical(bayesplot_theme_set(), default) old <- bayesplot_theme_set(minimal) expect_identical(old, default) expect_identical(bayesplot_theme_get(), minimal) }) test_that("bayesplot_theme_update/replace work", { bayesplot_theme_set(minimal) old <- bayesplot_theme_update(axis.text.x = ggplot2::element_text(color = "red")) expect_identical(old, minimal) thm <- bayesplot_theme_get() expect_identical(thm, minimal + xaxis_text(color = "red")) expect_equal(thm$axis.text.x$colour, "red") expect_null(thm$axis.text.x$size) bayesplot_theme_update(axis.text.x = ggplot2::element_text(size = 13)) thm <- bayesplot_theme_get() expect_equal(thm$axis.text.x$colour, "red") expect_equal(thm$axis.text.x$size, 13) old <- bayesplot_theme_replace(axis.text.x = ggplot2::element_text(color = "green")) expect_identical(old, thm) thm <- bayesplot_theme_get() expect_equal(thm$axis.text.x$colour, "green") expect_null(thm$axis.text.x$size) }) test_that("ggplot2::theme_set overrides bayesplot theme", { ggplot2::theme_set(dark) bayesplot_theme_set() expect_identical(ggplot2::theme_get(), dark) expect_identical(bayesplot_theme_get(), default) ggplot2::theme_set(minimal) expect_identical(bayesplot_theme_get(), minimal) }) bayesplot_theme_set(bayesplot::theme_default()) color_scheme_set() # Visual tests ------------------------------------------------------------ test_that("color_scheme_view renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") color_scheme_set() p_default <- color_scheme_view() vdiffr::expect_doppelganger("color_scheme_view (default)", p_default) p_red <- color_scheme_view("red") vdiffr::expect_doppelganger("color_scheme_view (scheme specified)", p_red) p_mix <- color_scheme_view("mix-red-blue") vdiffr::expect_doppelganger("color_scheme_view (mixed scheme)", p_mix) p_brewer <- color_scheme_view("brewer-Spectral") vdiffr::expect_doppelganger("color_scheme_view (brewer palette)", p_brewer) color_scheme_set() }) bayesplot_theme_set(bayesplot::theme_default()) color_scheme_set() bayesplot/tests/testthat/test-ppc-errors.R0000644000176200001440000001044514556465326020476 0ustar liggesuserslibrary(bayesplot) context("PPC: predictive errors") source(test_path("data-for-ppc-tests.R")) test_that("ppc_error_hist and ppc_error_scatter return ggplot object", { expect_gg(ppc_error_hist(y, yrep[1:5, ], binwidth = 0.1)) expect_gg(ppc_error_scatter(y, yrep[1:5, ])) expect_gg(ppc_error_hist(y, yrep[1,, drop = FALSE], binwidth = 0.1)) expect_gg(ppc_error_scatter(y, yrep[1,, drop = FALSE])) expect_gg(ppc_error_hist(y2, yrep2, binwidth = 0.1)) expect_gg(ppc_error_scatter(y2, yrep2)) }) test_that("ppc_error_hist_grouped returns ggplot object", { expect_gg(ppc_error_hist_grouped(y, yrep[1:5, ], group, binwidth = 0.1)) expect_gg(ppc_error_hist_grouped(y, yrep[1,, drop = FALSE], group, freq = FALSE, binwidth = 1)) }) test_that("ppc_error_scatter_avg returns ggplot2 object", { expect_gg(ppc_error_scatter_avg(y, yrep)) expect_gg(ppc_error_scatter_avg(y, yrep[1:5, ])) }) test_that("ppc_error_scatter_avg same as ppc_error_scatter if nrow(yrep) = 1", { p1 <- ppc_error_scatter_avg(y2, yrep2) p2 <- ppc_error_scatter(y2, yrep2) d1 <- p1$data d2 <- p2$data # really only a few columns are _exactly_ the same cols <- c("y_id", "y_obs", "value") expect_equal(d1[, cols], d2[, cols]) }) test_that("ppc_error_scatter_avg_vs_x returns ggplot2 object", { expect_gg(ppc_error_scatter_avg_vs_x(y, yrep, x = rnorm(length(y)))) expect_gg(ppc_error_scatter_avg_vs_x(y, yrep[1:5, ], x = rnorm(length(y)))) }) test_that("ppc_error_binned returns ggplot object", { load(test_path("data-for-binomial.rda")) expect_gg(ppc_error_binned(y, Ey)) expect_gg(ppc_error_binned(y[1:5], Ey[, 1:5])) expect_gg(ppc_error_binned(rep(y, 2), cbind(Ey, Ey))) }) test_that("bin_errors works for edge cases", { ans <- data.frame( ey_bar = c(1, NaN), err_bar = c(0, NaN), se2 = c(0, NaN), bin = c(1, 2) ) val <- bin_errors(rep(1, 10), rep(0, 10), bins = 1) expect_equal(ans, val) }) # Visual tests ----------------------------------------------------------------- test_that("ppc_error_hist renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_error_hist(vdiff_y, vdiff_yrep[1:3, ]) vdiffr::expect_doppelganger("ppc_error_hist (default)", p_base) }) test_that("ppc_error_hist_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_error_hist_grouped(vdiff_y, vdiff_yrep[1:3, ], vdiff_group) vdiffr::expect_doppelganger("ppc_error_hist_grouped (default)", p_base) }) test_that("ppc_error_scatter renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_error_scatter(vdiff_y, vdiff_yrep[1:3, ]) vdiffr::expect_doppelganger("ppc_error_scatter (default)", p_base) }) test_that("ppc_error_scatter_avg renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_error_scatter_avg(vdiff_y, vdiff_yrep) vdiffr::expect_doppelganger("ppc_error_scatter_avg (default)", p_base) }) test_that("ppc_error_scatter_avg_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_error_scatter_avg_grouped(vdiff_y, vdiff_yrep, vdiff_group) vdiffr::expect_doppelganger("ppc_error_scatter_avg_grouped (default)", p_base) }) test_that("ppc_error_scatter_avg_vs_x renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_error_scatter_avg_vs_x(vdiff_y, vdiff_yrep, x = seq_along(vdiff_y)) vdiffr::expect_doppelganger("ppc_error_scatter_avg_vs_x (default)", p_base) }) test_that("ppc_error_binned renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") rbeta2 <- function(n, mu, phi) { a <- mu * phi b <- (1 - mu) * phi rbeta(n, a, b) } set.seed(100) y <- rbeta(50, shape1 = 1, shape2 = 10) four_draws <- structure( c(-2.118, -2.061, -2.069, -2.011, 7.604, 9.720, 9.7186, 10.1888), .Dim = c(4L, 2L), .Dimnames = list( iterations = NULL, parameters = c("(Intercept)", "(phi)") ) ) y_rep <- t(apply(four_draws, 1, function(x) rbeta2(50, plogis(x[1]), x[2]))) p_base <- ppc_error_binned(y, y_rep) vdiffr::expect_doppelganger("ppc_error_binned (default)", p_base) }) bayesplot/tests/testthat/test-ppc-intervals.R0000644000176200001440000001720314333522162021151 0ustar liggesuserslibrary(bayesplot) context("PPC: intervals & ribbon") source(test_path("data-for-ppc-tests.R")) test_that("ppc_intervals returns ggplot object", { expect_gg(ppc_intervals(y, yrep)) expect_gg(ppc_intervals(y, yrep, size = 2, fatten = 1)) expect_gg(ppc_intervals(y, yrep, x = seq(1, 2 * length(y), by = 2))) expect_gg(ppc_intervals(y2, yrep2)) # ppd versions expect_gg(ppd_intervals(yrep, x = seq(1, 2 * length(y), by = 2))) expect_gg(ppd_intervals(yrep2)) }) test_that("ppc_ribbon returns ggplot object", { expect_gg(ppc_ribbon(y, yrep, prob = 0.5)) expect_gg(ppc_ribbon(y, yrep, alpha = 0, size = .5)) expect_gg(ppc_ribbon(y2, yrep2, x = rnorm(length(y2)), prob = 0.5)) # ppd versions expect_gg(ppd_ribbon(yrep, prob = 0.5)) expect_gg(ppd_ribbon(yrep2, x = rnorm(length(y2)), prob = 0.5)) }) y <- rnorm(50) yrep <- matrix(rnorm(500, 0, 2), ncol = 50) x <- rep(1:10, each = 5) grp <- gl(5, 1, length = 50, labels = LETTERS[1:5]) d <- ppc_intervals_data(y, yrep, x = 1:length(y), prob = .9) d_group <- ppc_intervals_data(y, yrep, x, grp) test_that("ppc_intervals_grouped returns ggplot object", { expect_gg(ppc_intervals_grouped(y, yrep, x, grp)) # ppd versions expect_gg(ppd_intervals_grouped(yrep, x, grp)) }) test_that("ppc_ribbon_grouped returns ggplot object", { expect_gg(ppc_ribbon_grouped(y, yrep, x, grp)) expect_gg(ppc_ribbon_grouped(y, yrep, x, grp, facet_args = list(scales = "fixed"))) # ppd versions expect_gg(ppd_ribbon_grouped(yrep, x, grp, facet_args = list(scales = "fixed"))) }) test_that("ppc_intervals_data returns correct structure", { expect_named(d, c("y_id", "y_obs", "x", "outer_width", "inner_width", "ll", "l", "m", "h", "hh")) expect_named(d_group, c("y_id", "y_obs", "group", "x", "outer_width", "inner_width", "ll", "l", "m", "h", "hh")) expect_error( ppc_intervals_data(y, yrep, x = 1:length(y), prob = 0), "prob") expect_error( ppc_intervals_data(y, yrep, x = 1:length(y), prob = 1.01), "prob") expect_error( ppc_intervals_data(y, yrep, x = 1:length(y), prob_outer = 0), "prob_outer") expect_error( ppc_intervals_data(y, yrep, x = 1:length(y), prob_outer = 1.01), "prob_outer") }) test_that("ppd_intervals_data + y_obs column same as ppc_intervals_data", { d2 <- ppd_intervals_data(yrep, x = 1:length(y), prob = .9) d_group2 <- ppd_intervals_data(yrep, x, grp) expect_equal(tibble::add_column(d2, y_obs = d$y_obs, .after = "y_id"), d) expect_equal(tibble::add_column(d_group2, y_obs = d_group$y_obs, .after = "y_id"), d_group) }) test_that("ppc_intervals_data does math correctly", { d <- ppc_intervals_data(y, yrep, prob = .4, prob_outer = .8) qs <- unname(quantile(yrep[, 1], c(.1, .3, .5, .7, .9))) expect_equal(d$ll[1], qs[1]) expect_equal(d$l[1], qs[2]) expect_equal(d$m[1], qs[3]) expect_equal(d$h[1], qs[4]) expect_equal(d$hh[1], qs[5]) # Testing groups and known quantiles y <- rep(10, 4) group <- c("a", "a", "b", "b") yrep_g1 <- matrix(rep((0:20), 2), ncol = 2) yrep_g2 <- yrep_g1 - 10 yrep <- cbind(yrep_g1, yrep_g2) d <- ppc_intervals_data(y, yrep, group = group, prob = .5, prob_outer = .9) expect_equal(unique(d$inner_width), .5) expect_equal(unique(d$outer_width), .9) expect_equal(d$ll, c( 1, 1, -9, -9)) expect_equal(d$l, c( 5, 5, -5, -5)) expect_equal(d$m, c(10, 10, 0, 0)) expect_equal(d$h, c(15, 15, 5, 5)) expect_equal(d$hh, c(19, 19, 9, 9)) }) # Visual tests ----------------------------------------------------------------- test_that("ppc_intervals renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_intervals(vdiff_y, vdiff_yrep) vdiffr::expect_doppelganger("ppc_intervals (default)", p_base) p_x <- ppc_intervals(vdiff_y, vdiff_yrep, x = vdiff_y) vdiffr::expect_doppelganger("ppc_intervals (x values)", p_x) p_50 <- ppc_intervals(vdiff_y, vdiff_yrep, prob = .50) vdiffr::expect_doppelganger("ppc_intervals (interval width)", p_50) # ppd versions p_base <- ppd_intervals(vdiff_yrep) vdiffr::expect_doppelganger("ppd_intervals (default)", p_base) p_x <- ppd_intervals(vdiff_yrep, x = vdiff_y) vdiffr::expect_doppelganger("ppd_intervals (x values)", p_x) p_50 <- ppd_intervals(vdiff_yrep, prob = .50) vdiffr::expect_doppelganger("ppd_intervals (interval width)", p_50) }) test_that("ppc_intervals_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_intervals_grouped(vdiff_y, vdiff_yrep, group = vdiff_group) vdiffr::expect_doppelganger("ppc_intervals_grouped (default)", p_base) p_x <- ppc_intervals_grouped( y = vdiff_y, yrep = vdiff_yrep, x = vdiff_y, group = vdiff_group) vdiffr::expect_doppelganger("ppc_intervals_grouped (x values)", p_x) # ppd versions p_base <- ppd_intervals_grouped(vdiff_yrep, group = vdiff_group) vdiffr::expect_doppelganger("ppd_intervals_grouped (default)", p_base) p_x <- ppd_intervals_grouped( ypred = vdiff_yrep, x = vdiff_y, group = vdiff_group) vdiffr::expect_doppelganger("ppd_intervals_grouped (x values)", p_x) }) test_that("ppc_ribbon renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_ribbon(vdiff_y, vdiff_yrep) vdiffr::expect_doppelganger("ppc_ribbon (default)", p_base) p_x <- ppc_ribbon(vdiff_y, vdiff_yrep, x = vdiff_y) vdiffr::expect_doppelganger("ppc_ribbon (x values)", p_x) p_50 <- ppc_ribbon(vdiff_y, vdiff_yrep, prob = 0.5) vdiffr::expect_doppelganger("ppc_ribbon (interval width)", p_50) p_line <- ppc_ribbon(vdiff_y, vdiff_yrep, y_draw = "line") vdiffr::expect_doppelganger("ppc_ribbon (y_draw = line)", p_line) p_point <- ppc_ribbon(vdiff_y, vdiff_yrep, y_draw = "point") vdiffr::expect_doppelganger("ppc_ribbon (y_draw = point)", p_point) p_both <- ppc_ribbon(vdiff_y, vdiff_yrep, y_draw = "both") vdiffr::expect_doppelganger("ppc_ribbon (y_draw = both)", p_both) # ppd versions p_base <- ppd_ribbon(vdiff_yrep) vdiffr::expect_doppelganger("ppd_ribbon (default)", p_base) p_x <- ppd_ribbon(vdiff_yrep, x = vdiff_y) vdiffr::expect_doppelganger("ppd_ribbon (x values)", p_x) p_50 <- ppd_ribbon(vdiff_yrep, prob = 0.5) vdiffr::expect_doppelganger("ppd_ribbon (interval width)", p_50) }) test_that("ppc_ribbon_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_ribbon_grouped(vdiff_y, vdiff_yrep, group = vdiff_group) vdiffr::expect_doppelganger("ppc_ribbon_grouped (default)", p_base) p_line <- ppc_ribbon_grouped(vdiff_y, vdiff_yrep, group = vdiff_group, y_draw = "line") vdiffr::expect_doppelganger("ppc_ribbon_grouped (y_draw = line)", p_line) p_point <- ppc_ribbon_grouped(vdiff_y, vdiff_yrep, group = vdiff_group, y_draw = "point") vdiffr::expect_doppelganger("ppc_ribbon_grouped (y_draw = point)", p_point) p_both <- ppc_ribbon_grouped(vdiff_y, vdiff_yrep, group = vdiff_group, y_draw = "both") vdiffr::expect_doppelganger("ppc_ribbon_grouped (y_draw = both)", p_both) p_x <- ppc_ribbon_grouped( y = vdiff_y, yrep = vdiff_yrep, x = vdiff_y, group = vdiff_group) vdiffr::expect_doppelganger("ppc_ribbon_grouped (x values)", p_x) # ppd versions p_base <- ppd_ribbon_grouped(vdiff_yrep, group = vdiff_group) vdiffr::expect_doppelganger("ppd_ribbon_grouped (default)", p_base) p_x <- ppd_ribbon_grouped( ypred = vdiff_yrep, x = vdiff_y, group = vdiff_group) vdiffr::expect_doppelganger("ppd_ribbon_grouped (x values)", p_x) }) bayesplot/tests/testthat/test-ppc-test-statistics.R0000644000176200001440000001756214556465326022340 0ustar liggesuserslibrary(bayesplot) context("PPC: test-statistics") source(test_path("data-for-ppc-tests.R")) q25 <- function(x) quantile(x, 0.25) prop0 <- function(x) mean(x == 0) test_that("ppc_stat throws errors if function not found", { expect_error(ppc_stat(y, yrep, stat = "9999"), "not found") expect_error(ppc_stat_freqpoly(y, yrep, stat = "9999"), "not found") expect_error(ppc_stat_grouped(y, yrep, group, stat = "9999"), "not found") expect_error(ppc_stat_freqpoly_grouped(y, yrep, group, stat = "9999"), "not found") }) test_that("ppc_stat throws errors if 'stat' wrong length", { expect_error(ppc_stat(y, yrep, stat = c("mean", "sd")), "length(stat) == 1 is not TRUE", fixed = TRUE) expect_error(ppc_stat_grouped(y, yrep, group, stat = c("mean", "sd")), "length(stat) == 1 is not TRUE", fixed = TRUE) expect_error(ppc_stat_freqpoly(y, yrep, stat = c("mean", "sd")), "length(stat) == 1 is not TRUE", fixed = TRUE) expect_error(ppc_stat_freqpoly_grouped(y, yrep, group, stat = c(mean, sd)), "length(stat) == 1 is not TRUE", fixed = TRUE) }) test_that("ppc_stat returns ggplot object", { expect_gg(ppc_stat(y, yrep, binwidth = 0.05)) expect_gg(ppc_stat(y, yrep, stat = "sd", binwidth = 0.05)) expect_gg(ppc_stat(y, yrep, stat = sd, binwidth = 0.05)) expect_gg(ppc_stat(y, yrep, stat = "q25", binwidth = 0.05)) expect_gg(ppc_stat(y, yrep, stat = q25, binwidth = 0.05)) expect_gg(ppc_stat(y, yrep, stat = function(x) median(x), binwidth = 0.05)) expect_gg(ppc_stat(y2, yrep2, binwidth = 0.05)) expect_gg(ppc_stat(y2, yrep2, stat = "prop0", binwidth = 0.05)) # ppd versions expect_gg(ppd_stat(yrep, stat = "q25", binwidth = 0.05)) expect_gg(ppd_stat(yrep, stat = q25, binwidth = 0.05)) expect_gg(ppd_stat(yrep2, stat = "prop0", binwidth = 0.05)) }) test_that("ppc_stat_2d returns ggplot object", { expect_gg(ppc_stat_2d(y, yrep)) expect_gg(ppc_stat_2d(y, yrep, stat = c("q25", "median"))) expect_gg(ppc_stat_2d(y, yrep, stat = c("q25", median))) expect_gg(ppc_stat_2d(y, yrep, stat = c(function(x) mean(x), function(y) sd(y)))) expect_gg(ppc_stat_2d(y2, yrep2)) # ppd versions expect_gg(ppd_stat_2d(yrep, stat = c("q25", median))) expect_gg(ppd_stat_2d(yrep, stat = c(function(x) mean(x), function(y) sd(y)))) expect_gg(ppd_stat_2d(yrep2)) }) test_that("ppc_stat_2d errors if more than 2 stats", { expect_error(ppc_stat_2d(y, yrep, stat = c("mean", "sd", "var")), "argument must have length 2") }) test_that("ppc_stat_grouped returns ggplot object", { expect_gg(ppc_stat_grouped(y, yrep, group, binwidth = 0.05)) expect_gg(ppc_stat_grouped(y, yrep, as.numeric(group), stat = function(z) var(z), binwidth = 0.05)) expect_gg(ppc_stat_grouped(y, yrep, as.integer(group), stat = "sd", binwidth = 0.05)) }) test_that("ppc_stat_freqpoly_grouped returns ggplot object", { expect_gg(ppc_stat_freqpoly_grouped(y, yrep, group, stat = "sd", freq = FALSE, binwidth = 0.05)) expect_gg(ppc_stat_freqpoly_grouped(y, yrep, group, stat = function(x) sd(x), freq = TRUE, binwidth = 0.05)) # ppd version expect_gg(ppd_stat_freqpoly_grouped(yrep, group, stat = "sd", freq = FALSE, binwidth = 0.05)) }) test_that("ppc_stat_data without the y values equal to ppd_stat_data", { d <- ppc_stat_data(y, yrep, group, stat = "median") d2 <- ppd_stat_data(yrep, group, stat = median) expect_equal(d$value[d$variable != "y"], d2$value) expect_equal(d$group[d$variable != "y"], d2$group) # with 2 stats d <- ppc_stat_data(y, yrep, group, stat = c(mean, median)) d2 <- ppd_stat_data(yrep, group, stat = c("mean", "median")) expect_equal(d$value[d$variable != "y"], d2$value) expect_equal(d$value2[d$variable != "y"], d2$value2) expect_equal(d$group[d$variable != "y"], d2$group) }) test_that("ppc_stat_data and ppd_stat_data throw correct errors", { expect_error(ppc_stat_data(y, yrep, stat = letters), "'stat' must have length 1 or 2") expect_error(ppd_stat_data(yrep, stat = letters), "'stat' must have length 1 or 2") expect_error(ppd_stat_data(yrep, stat = "not_a_known_function"), "object 'not_a_known_function' of mode 'function' was not found") }) # Visual tests ------------------------------------------------------------ test_that("ppc_stat renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_stat(vdiff_y, vdiff_yrep, binwidth = 0.05) + yaxis_text() vdiffr::expect_doppelganger("ppc_stat (default)", p_base) p_custom <- ppc_stat( y = vdiff_y, yrep = vdiff_yrep, stat = "mad", binwidth = 0.05, freq = FALSE ) + yaxis_text() vdiffr::expect_doppelganger( title = "ppc_stat (stat, binwidth, freq)", fig = p_custom) # ppd versions p_base <- ppd_stat(vdiff_yrep, binwidth = 0.05) + yaxis_text() vdiffr::expect_doppelganger("ppd_stat (default)", p_base) p_custom <- ppd_stat( ypred = vdiff_yrep, stat = "mad", binwidth = 0.05, freq = FALSE ) + yaxis_text() vdiffr::expect_doppelganger( title = "ppd_stat (stat, binwidth, freq)", fig = p_custom) }) test_that("ppc_stat_2d renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_stat_2d(vdiff_y, vdiff_yrep) vdiffr::expect_doppelganger("ppc_stat_2d (default)", p_base) p_custom <- ppc_stat_2d( y = vdiff_y, yrep = vdiff_yrep, stat = c("median", "mad"), size = 5, alpha = 1 ) vdiffr::expect_doppelganger( title = "ppc_stat_2d (stat, size, alpha)", fig = p_custom) # ppd versions p_base <- ppd_stat_2d(vdiff_yrep) vdiffr::expect_doppelganger("ppd_stat_2d (default)", p_base) p_custom <- ppd_stat_2d( ypred = vdiff_yrep, stat = c("median", "mad"), size = 5, alpha = 1 ) vdiffr::expect_doppelganger( title = "ppd_stat_2d (stat, size, alpha)", fig = p_custom) }) test_that("ppc_stat_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_stat_grouped(vdiff_y, vdiff_yrep, vdiff_group, binwidth = 0.05) vdiffr::expect_doppelganger("ppc_stat_grouped (default)", p_base) p_custom <- ppc_stat_grouped( y = vdiff_y, yrep = vdiff_yrep, group = vdiff_group, stat = stats::var, facet_args = list(scales = "fixed", ncol = 1), binwidth = 0.25 ) vdiffr::expect_doppelganger( title = "ppc_stat_grouped (stat, facet_args, binwidth)", fig = p_custom) # ppd versions p_base <- ppd_stat_grouped(vdiff_yrep, vdiff_group, binwidth = 0.05) vdiffr::expect_doppelganger("ppd_stat_grouped (default)", p_base) p_custom <- ppd_stat_grouped( ypred = vdiff_yrep, group = vdiff_group, stat = stats::var, facet_args = list(scales = "fixed", ncol = 1), binwidth = 0.25 ) vdiffr::expect_doppelganger( title = "ppd_stat_grouped (stat, facet_args, binwidth)", fig = p_custom) }) test_that("ppc_stat_freqpoly_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_stat_freqpoly_grouped(vdiff_y, vdiff_yrep, vdiff_group, binwidth = 0.05) vdiffr::expect_doppelganger("ppc_stat_freqpoly_grouped (default)", p_base) p_custom <- ppc_stat_freqpoly_grouped( y = vdiff_y, yrep = vdiff_yrep, group = vdiff_group, stat = "sum", facet_args = list(scales = "fixed", ncol = 1), binwidth = 0.5 ) vdiffr::expect_doppelganger( title = "ppc_stat_freqpoly_grouped (stat, facets, bw)", fig = p_custom) # ppd versions p_base <- ppd_stat_freqpoly_grouped(vdiff_yrep, vdiff_group, binwidth = 0.05) vdiffr::expect_doppelganger("ppd_stat_freqpoly_grouped (default)", p_base) p_custom <- ppd_stat_freqpoly_grouped( ypred = vdiff_yrep, group = vdiff_group, stat = "sum", facet_args = list(scales = "fixed", ncol = 1), binwidth = 0.5 ) vdiffr::expect_doppelganger( title = "ppd_stat_freqpoly_grouped (stat, facets, bw)", fig = p_custom) }) bayesplot/tests/testthat.R0000644000176200001440000000037214127610044015402 0ustar liggesuserslibrary(testthat) library(bayesplot) Sys.unsetenv("R_TESTS") test_check("bayesplot") # Alternative interactive tester that doesn't bail after 24 failures # pr <- testthat::ProgressReporter$new() # pr$max_fail = 1000 # devtools::test(reporter = pr) bayesplot/vignettes/0000755000176200001440000000000014563223213014265 5ustar liggesusersbayesplot/vignettes/plotting-mcmc-draws.Rmd0000644000176200001440000003043414556465326020647 0ustar liggesusers--- title: "Plotting MCMC draws using the bayesplot package" author: "Jonah Gabry" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") vignette: > %\VignetteIndexEntry{Plotting MCMC draws} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("ggplot2") library("rstanarm") ``` ## Introduction This vignette focuses on plotting parameter estimates from MCMC draws. MCMC diagnostic plots are covered in the separate vignette [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html), and graphical posterior predictive model checking is covered in the vignette [_Graphical posterior predictive checks_](https://mc-stan.org/bayesplot/articles/graphical-ppcs.html). ### Setup In addition to __bayesplot__ we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstanarm__, for fitting the example models used throughout the vignette ```{r, eval=FALSE} library("bayesplot") library("ggplot2") library("rstanarm") ``` ### Example model The **bayesplot** package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) draws from the posterior distribution of the parameters of a Bayesian model. In this vignette we demonstrate a few of these functions. Example usage of the functions not demonstrated here can be found in the package documentation. For demonstration we will use draws obtained using the `stan_glm` function in the **rstanarm** package (Gabry and Goodrich, 2017), but MCMC draws from using any package can be used with the functions in the **bayesplot** package. See, for example, **brms**, which, like **rstanarm**, calls the **rstan** package internally to use [Stan](https://mc-stan.org/)'s MCMC sampler. ```{r mtcars} head(mtcars) # see help("mtcars") ``` ```{r, eval=FALSE} # linear regression model using stan_glm # using '~ .' to include all variables fit <- stan_glm(mpg ~ ., data = mtcars, seed = 1111) print(fit) ``` ```{r stan_glm, include=FALSE} fit <- stan_glm(mpg ~ ., data = mtcars, QR = TRUE, seed = 1111) ``` ```{r print-fit, echo=FALSE} print(fit) ``` To use the posterior draws with the functions in the **bayesplot** package we'll extract them from the fitted model object: ```{r get-draws} posterior <- as.array(fit) dim(posterior) dimnames(posterior) ``` We've used `as.array` above (as opposed to `as.matrix`) because it keeps the Markov chains separate (`stan_glm` runs four chains by default). Most of the plots don't actually need the chains to be separate, but for a few of the plots we make in this vignette we'll want to show the chains individually.
## Posterior uncertainty intervals For models fit using MCMC we can compute posterior uncertainty intervals (sometimes called "credible intervals") in various ways. **bayesplot** currently provides plots of central intervals based on quantiles, although additional options may be provided in future releases (e.g., HDIs, which can be useful in particular cases). **Documentation:** * `help("MCMC-intervals")` * [mc-stan.org/bayesplot/reference/MCMC-intervals](https://mc-stan.org/bayesplot/reference/MCMC-intervals.html) ------ #### mcmc_intervals, mcmc_areas Central posterior uncertainty intervals can be plotted using the `mcmc_intervals` function. ```{r mcmc_intervals} color_scheme_set("red") mcmc_intervals(posterior, pars = c("cyl", "drat", "am", "sigma")) ``` The default is to show 50% intervals (the thick segments) and 90% intervals (the thinner outer lines). These defaults can be changed using the `prob` and `prob_outer` arguments, respectively. The points in the above plot are posterior medians. The `point_est` argument can be used to select posterior means instead or to omit the point estimates. To show the uncertainty intervals as shaded areas under the estimated posterior density curves we can use the `mcmc_areas` function. ```{r mcmc_areas} mcmc_areas( posterior, pars = c("cyl", "drat", "am", "sigma"), prob = 0.8, # 80% intervals prob_outer = 0.99, # 99% point_est = "mean" ) ```
## Univariate marginal posterior distributions **bayesplot** provides functions for looking at histograms or kernel density estimates of marginal posterior distributions, either with all Markov chains combined or with the chains separate. **Documentation:** * `help("MCMC-distributions")` * [mc-stan.org/bayesplot/reference/MCMC-distributions](https://mc-stan.org/bayesplot/reference/MCMC-distributions.html) ------ #### mcmc_hist The `mcmc_hist` function plots marginal posterior distributions (combining all chains): ```{r mcmc_hist, message=FALSE} color_scheme_set("green") mcmc_hist(posterior, pars = c("wt", "sigma")) ``` If we want to plot `log(sigma)` rather than `sigma` we can either transform the draws in advance or use the `transformations` argument. ```{r mcmc_hist-transform, message=FALSE} color_scheme_set("blue") mcmc_hist(posterior, pars = c("wt", "sigma"), transformations = list("sigma" = "log")) ``` Most of the other functions for plotting MCMC draws also have a `transformations` argument. #### mcmc_hist_by_chain To view separate histograms of each of the four Markov chains we can use `mcmc_hist_by_chain`, which plots each chain in a separate facet in the plot. ```{r mcmc_hist_by_chain, message=FALSE} color_scheme_set("brightblue") mcmc_hist_by_chain(posterior, pars = c("wt", "sigma")) ``` #### mcmc_dens The `mcmc_dens` function is similar to `mcmc_hist` but plots kernel density estimates instead of histograms. ```{r mcmc_dens, message=FALSE} color_scheme_set("purple") mcmc_dens(posterior, pars = c("wt", "sigma")) ``` #### mcmc_dens_overlay Like `mcmc_hist_by_chain`, the `mcmc_dens_overlay` function separates the Markov chains. But instead of plotting each chain individually, the density estimates are overlaid. ```{r mcmc_dens_overlay, message=FALSE} mcmc_dens_overlay(posterior, pars = c("wt", "sigma")) ``` #### mcmc_violin The `mcmc_violin` function plots the density estimates of each chain as violins and draws horizontal line segments at user-specified quantiles. ```{r mcmc_violin} color_scheme_set("teal") mcmc_violin(posterior, pars = c("wt", "sigma"), probs = c(0.1, 0.5, 0.9)) ```
## Bivariate plots Various functions are available for plotting bivariate marginal posterior distributions. Some of these functions also take optional arguments for adding MCMC diagnostic information to the plots. That additional functionality is discussed in the separate [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette. **Documentation:** * `help("MCMC-scatterplots")` * [mc-stan.org/bayesplot/reference/MCMC-scatterplots](https://mc-stan.org/bayesplot/reference/MCMC-scatterplots.html) ------ #### mcmc_scatter The `mcmc_scatter` function creates a simple scatterplot of two parameters. ```{r mcmc_scatter} color_scheme_set("gray") mcmc_scatter(posterior, pars = c("(Intercept)", "wt"), size = 1.5, alpha = 0.5) ``` #### mcmc_hex The `mcmc_hex` function creates a similar plot but using hexagonal binning, which can be useful to avoid overplotting. ```{r mcmc_hex} # requires hexbin package if (requireNamespace("hexbin", quietly = TRUE)) { mcmc_hex(posterior, pars = c("(Intercept)", "wt")) } ``` #### mcmc_pairs In addition to `mcmc_scatter` and `mcmc_hex`, __bayesplot__ now provides an `mcmc_pairs` function for creating pairs plots with more than two parameters. ```{r mcmc_pairs, message=FALSE} color_scheme_set("pink") mcmc_pairs(posterior, pars = c("(Intercept)", "wt", "sigma"), off_diag_args = list(size = 1.5)) ``` The univariate marginal posteriors are shown along the diagonal as histograms, but this can be changed to densities by setting `diag_fun="dens"`. Bivariate plots are displayed above and below the diagonal as scatterplots, but it is also possible to use hex plots by setting `off_diag_fun="hex"`. By default, `mcmc_pairs` shows some of the Markov chains (half, if an even number of chains) above the diagonal and the others below. There are many more options for controlling how the draws should be split between the plots above and below the diagonal (see the documentation for the `condition` argument), but they are more useful when MCMC diagnostic information is included. This is discussed in the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette.
## Trace plots Trace plots are time series plots of Markov chains. In this vignette we show the standard trace plots that **bayesplot** can make. For models fit using any Stan interface (or Hamiltonian Monte Carlo in general), the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette provides an example of also adding information about divergences to trace plots. **Documentation:** * `help("MCMC-traces")` * [mc-stan.org/bayesplot/reference/MCMC-traces](https://mc-stan.org/bayesplot/reference/MCMC-traces.html) ------- #### mcmc_trace The `mcmc_trace` function creates standard trace plots: ```{r mcmc_trace} color_scheme_set("blue") mcmc_trace(posterior, pars = c("wt", "sigma")) ``` If it's hard to see the difference between the chains we can change to a mixed color scheme, for example: ```{r change-scheme} color_scheme_set("mix-blue-red") mcmc_trace(posterior, pars = c("wt", "sigma"), facet_args = list(ncol = 1, strip.position = "left")) ``` The code above also illustrates the use of the `facet_args` argument, which is a list of parameters passed to `facet_wrap` in __ggplot2__. Specifying `ncol=1` means the trace plots will be stacked in a single column rather than placed side by side, and `strip.position="left"` moves the facet labels to the y-axis (instead of above each facet). The [`"viridis"` color scheme](https://CRAN.R-project.org/package=viridis) is also useful for trace plots because it is comprised of very distinct colors: ```{r viridis-scheme, eval=FALSE} color_scheme_set("viridis") mcmc_trace(posterior, pars = "(Intercept)") ``` #### mcmc_trace_highlight The `mcmc_trace_highlight` function uses points instead of lines and reduces the opacity of all but a single chain (which is specified using the `highlight` argument). ```{r mcmc_trace_highlight} mcmc_trace_highlight(posterior, pars = "sigma", highlight = 3) ```
## References Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper)) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Stan Development Team. (2017). *Stan Modeling Language Users Guide and Reference Manual*. https://mc-stan.org/users/documentation/ bayesplot/vignettes/graphical-ppcs.Rmd0000644000176200001440000003634314335264530017643 0ustar liggesusers--- title: "Graphical posterior predictive checks using the bayesplot package" author: "Jonah Gabry" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") vignette: > %\VignetteIndexEntry{Graphical posterior predictive checks} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("ggplot2") library("rstanarm") set.seed(840) ``` ## Introduction This vignette focuses on graphical posterior predictive checks (PPC). Plots of parameter estimates from MCMC draws are covered in the separate vignette [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html), and MCMC diagnostics are covered in the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette. ### Graphical posterior predictive checks (PPCs) The **bayesplot** package provides various plotting functions for _graphical posterior predictive checking_, that is, creating graphical displays comparing observed data to simulated data from the posterior predictive distribution ([Gabry et al, 2019](#gabry2019)). The idea behind posterior predictive checking is simple: if a model is a good fit then we should be able to use it to generate data that looks a lot like the data we observed. To generate the data used for posterior predictive checks (PPCs) we simulate from the _posterior predictive distribution_. This is the distribution of the outcome variable implied by a model after using the observed data $y$ (a vector of $N$ outcome values) to update our beliefs about unknown model parameters $\theta$. The posterior predictive distribution for observation $\widetilde{y}$ can be written as $$p(\widetilde{y} \,|\, y) = \int p(\widetilde{y} \,|\, \theta) \, p(\theta \,|\, y) \, d\theta.$$ Typically we will also condition on $X$ (a matrix of predictor variables). For each draw (simulation) $s = 1, \ldots, S$ of the parameters from the posterior distribution, $\theta^{(s)} \sim p(\theta \,|\, y)$, we draw an entire vector of $N$ outcomes $\widetilde{y}^{(s)}$ from the posterior predictive distribution by simulating from the data model conditional on parameters $\theta^{(s)}$. The result is an $S \times N$ matrix of draws $\widetilde{y}$. When simulating from the posterior predictive distribution we can use either the same values of the predictors $X$ that we used when fitting the model or new observations of those predictors. When we use the same values of $X$ we denote the resulting simulations by $y^{rep}$, as they can be thought of as replications of the outcome $y$ rather than predictions for future observations ($\widetilde{y}$ using predictors $\widetilde{X}$). This corresponds to the notation from Gelman et al. (2013) and is the notation used throughout the package documentation. Using the replicated datasets drawn from the posterior predictive distribution, the functions in the **bayesplot** package create various graphical displays comparing the observed data $y$ to the replications. The names of the **bayesplot** plotting functions for posterior predictive checking all have the prefix `ppc_`. ### Setup In addition to **bayesplot** we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstanarm__, for fitting the example models used throughout the vignette ```{r, eval=FALSE} library("bayesplot") library("ggplot2") library("rstanarm") ``` ### Example models To demonstrate some of the various PPCs that can be created with the **bayesplot** package we'll use an example of comparing Poisson and Negative binomial regression models from one of the **rstanarm** [package vignettes](https://mc-stan.org/rstanarm/articles/count.html) (Gabry and Goodrich, 2017). > We want to make inferences about the efficacy of a certain pest management system at reducing the number of roaches in urban apartments. [...] The regression predictors for the model are the pre-treatment number of roaches `roach1`, the treatment indicator `treatment`, and a variable `senior` indicating whether the apartment is in a building restricted to elderly residents. Because the number of days for which the roach traps were used is not the same for all apartments in the sample, we include it as an exposure [...]. First we fit a Poisson regression model with outcome variable `y` representing the roach count in each apartment at the end of the experiment. ```{r roaches-data} head(roaches) # see help("rstanarm-datasets") roaches$roach100 <- roaches$roach1 / 100 # pre-treatment number of roaches (in 100s) ``` ```{r roaches-model-pois, message=FALSE} # using rstanarm's default priors. For details see the section on default # weakly informative priors at https://mc-stan.org/rstanarm/articles/priors.html fit_poisson <- stan_glm( y ~ roach100 + treatment + senior, offset = log(exposure2), family = poisson(link = "log"), data = roaches, seed = 1111, refresh = 0 # suppresses all output as of v2.18.1 of rstan ) ``` ```{r print-pois} print(fit_poisson) ``` We'll also fit the negative binomial model that we'll compare to the Poisson: ```{r roaches-model-nb, message=FALSE} fit_nb <- update(fit_poisson, family = "neg_binomial_2") ``` ```{r print-nb} print(fit_nb) ``` ### Defining `y` and `yrep` In order to use the PPC functions from the **bayesplot** package we need a vector `y` of outcome values, ```{r y} y <- roaches$y ``` and a matrix `yrep` of draws from the posterior predictive distribution, ```{r yrep} yrep_poisson <- posterior_predict(fit_poisson, draws = 500) yrep_nb <- posterior_predict(fit_nb, draws = 500) dim(yrep_poisson) dim(yrep_nb) ``` Each row of the matrix is a draw from the posterior predictive distribution, i.e. a vector with one element for each of the data points in `y`. Since we fit the models using __rstanarm__ we used its special `posterior_predict` function, but if we were using a model fit with the __rstan__ package we could create `yrep` in the `generated quantities` block of the Stan program or by doing simulations in R after fitting the model. Draws from the posterior predictive distribution can be used with **bayesplot** regardless of whether or not the model was fit using an interface to Stan. **bayesplot** just requires a `yrep` matrix that has `number_of_draws` rows and `number_of_observations` columns.
## Histograms and density estimates #### ppc_dens_overlay The first PPC we'll look at is a comparison of the distribution of `y` and the distributions of some of the simulated datasets (rows) in the `yrep` matrix. ```{r ppc_dens_overlay} color_scheme_set("brightblue") ppc_dens_overlay(y, yrep_poisson[1:50, ]) ``` In the plot above, the dark line is the distribution of the observed outcomes `y` and each of the 50 lighter lines is the kernel density estimate of one of the replications of `y` from the posterior predictive distribution (i.e., one of the rows in `yrep`). This plot makes it easy to see that this model fails to account for the large proportion of zeros in `y`. That is, the model predicts fewer zeros than were actually observed. To see the discrepancy at the lower values of more clearly we can use the `xlim` function from **ggplot2** to restrict the range of the x-axis: ```{r ppc_dens_overlay-2, message=FALSE, warning=FALSE} ppc_dens_overlay(y, yrep_poisson[1:50, ]) + xlim(0, 150) ``` See Figure 6 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_dens_overlay`. #### ppc_hist We could see the same thing from a different perspective by looking at separate histograms of `y` and some of the `yrep` datasets using the `ppc_hist` function: ```{r ppc_hist, message=FALSE} ppc_hist(y, yrep_poisson[1:5, ]) ``` The same plot for the negative binomial model looks much different: ```{r ppc_hist-nb, message=FALSE} ppc_hist(y, yrep_nb[1:5, ]) ``` The negative binomial model does better handling the number of zeros in the data, but it occasionally predicts values that are way too large, which is why the x-axes extend to such high values in the plot and make it difficult to read. To see the predictions for the smaller values more clearly we can zoom in: ```{r ppc_hist-nb-2, message=FALSE} ppc_hist(y, yrep_nb[1:5, ], binwidth = 20) + coord_cartesian(xlim = c(-1, 300)) ```
## Distributions of test statistics Another way to see that the Poisson model predicts too few zeros is to look at the distribution of the proportion of zeros over the replicated datasets from the posterior predictive distribution in `yrep` and compare to the proportion of observed zeros in `y`. #### ppc_stat First we define a function that takes a vector as input and returns the proportion of zeros: ```{r prop_zero} prop_zero <- function(x) mean(x == 0) prop_zero(y) # check proportion of zeros in y ``` The `stat` argument to `ppc_stat` accepts a function or the name of a function for computing a test statistic from a vector of data. In our case we can specify `stat = "prop_zero"` since we've already defined the `prop_zero` function, but we also could have used `stat = function(x) mean(x == 0)`. ```{r ppc_stat, message=FALSE} ppc_stat(y, yrep_poisson, stat = "prop_zero", binwidth = 0.005) ``` The dark line is at the value $T(y)$, i.e. the value of the test statistic computed from the observed $y$, in this case `prop_zero(y)`. The lighter area on the left is actually a histogram of the proportion of zeros in in the `yrep` simulations, but it can be hard to see because almost none of the simulated datasets in `yrep` have any zeros. Here's the same plot for the negative binomial model: ```{r ppc_stat-nb, message=FALSE} ppc_stat(y, yrep_nb, stat = "prop_zero") ``` Again we see that the negative binomial model does a much better job predicting the proportion of observed zeros than the Poisson. However, if we look instead at the distribution of the maximum value in the replications, we can see that the Poisson model makes more realistic predictions than the negative binomial: ```{r ppc_stat-max, message=FALSE} ppc_stat(y, yrep_poisson, stat = "max") ppc_stat(y, yrep_nb, stat = "max") ppc_stat(y, yrep_nb, stat = "max", binwidth = 100) + coord_cartesian(xlim = c(-1, 5000)) ``` See Figure 7 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_stat`.
## Other PPCs and PPCs by group There are many additional PPCs available, including plots of predictive intervals, distributions of predictive errors, and more. For links to the documentation for all of the various PPC plots see `help("PPC-overview")` from R or the [online documentation](https://mc-stan.org/bayesplot/reference/index.html#section-ppc) on the Stan website. The `available_ppc` function can also be used to list the names of all PPC plotting functions: ```{r available_ppc} available_ppc() ``` Many of the available PPCs can also be carried out within levels of a grouping variable. Any function for PPCs by group will have a name ending in `_grouped` and will accept an additional argument `group`. The full list of currently available `_grouped` functions is: ```{r available_ppc-grouped} available_ppc(pattern = "_grouped") ``` #### ppc_stat_grouped For example, `ppc_stat_grouped` is the same as `ppc_stat` except that the test statistic is computed within levels of the grouping variable and a separate plot is made for each level: ```{r ppc_stat_grouped, message=FALSE} ppc_stat_grouped(y, yrep_nb, group = roaches$treatment, stat = "prop_zero") ``` See Figure 8 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_stat_grouped`.
## Providing an interface to bayesplot PPCs from another package The **bayesplot** package provides the S3 generic function `pp_check`. Authors of R packages for Bayesian inference are encouraged to define methods for the fitted model objects created by their packages. This will hopefully be convenient for both users and developers and contribute to the use of the same naming conventions across many of the R packages for Bayesian data analysis. To provide an interface to **bayesplot** from your package, you can very easily define a `pp_check` method (or multiple `pp_check` methods) for the fitted model objects created by your package. All a `pp_check` method needs to do is provide the `y` vector and `yrep` matrix arguments to the various plotting functions included in **bayesplot**. ### Defining a `pp_check` method Here is an example for how to define a simple `pp_check` method in a package that creates fitted model objects of class `"foo"`. We will define a method `pp_check.foo` that extracts the data `y` and the draws from the posterior predictive distribution `yrep` from an object of class `"foo"` and then calls one of the plotting functions from **bayesplot**. Suppose that objects of class `"foo"` are lists with named components, two of which are `y` and `yrep`. Here's a simple method `pp_check.foo` that offers the user the option of two different plots: ```{r pp_check.foo} # @param object An object of class "foo". # @param type The type of plot. # @param ... Optional arguments passed on to the bayesplot plotting function. pp_check.foo <- function(object, type = c("multiple", "overlaid"), ...) { type <- match.arg(type) y <- object[["y"]] yrep <- object[["yrep"]] stopifnot(nrow(yrep) >= 50) samp <- sample(nrow(yrep), size = ifelse(type == "overlaid", 50, 5)) yrep <- yrep[samp, ] if (type == "overlaid") { ppc_dens_overlay(y, yrep, ...) } else { ppc_hist(y, yrep, ...) } } ``` To try out `pp_check.foo` we can just make a list with `y` and `yrep` components and give it class `foo`: ```{r foo-object} x <- list(y = rnorm(200), yrep = matrix(rnorm(1e5), nrow = 500, ncol = 200)) class(x) <- "foo" ``` ```{r pp_check-1, message=FALSE} color_scheme_set("purple") pp_check(x, type = "multiple", binwidth = 0.3) ``` ```{r pp_check-2} color_scheme_set("darkgray") pp_check(x, type = "overlaid") ``` ### Examples of `pp_check` methods in other packages Several packages currently use this approach to provide an interface to **bayesplot**'s graphical posterior predictive checks. See, for example, the `pp_check` methods in the [**rstanarm**](https://CRAN.R-project.org/package=rstanarm) and [**brms**](https://CRAN.R-project.org/package=brms) packages.
## References Buerkner, P. (2017). brms: Bayesian Regression Models using Stan. R package version 1.7.0. https://CRAN.R-project.org/package=brms Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper)) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Stan Development Team. _Stan Modeling Language Users Guide and Reference Manual_. https://mc-stan.org/users/documentation/ bayesplot/vignettes/children/0000755000176200001440000000000014127610044016053 5ustar liggesusersbayesplot/vignettes/children/SETTINGS-knitr.txt0000644000176200001440000000045714127610044021207 0ustar liggesusers```{r, SETTINGS-knitr, include=FALSE} stopifnot(require("knitr")) library("bayesplot") knitr::opts_chunk$set( dev = "png", dpi = 150, fig.asp = 0.618, fig.width = 5, out.width = "60%", fig.align = "center", comment = NA, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE ) ``` bayesplot/vignettes/visual-mcmc-diagnostics.Rmd0000644000176200001440000007745514556270424021510 0ustar liggesusers--- title: "Visual MCMC diagnostics using the bayesplot package" author: "Jonah Gabry and Martin Modrák" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") && !(isTRUE(as.logical(Sys.getenv("CI"))) && .Platform$OS.type == "windows") vignette: > %\VignetteIndexEntry{Visual MCMC diagnostics} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("bayesplot") library("ggplot2") library("rstan") library("dplyr") #Used only for consistency checks rstan_options(auto_write = TRUE) #Helpful throughout development bayesplot_theme_set() ``` ## Introduction This vignette focuses on MCMC diagnostic plots, in particular on diagnosing divergent transitions and on the `n_eff` and `Rhat` statistics that help you determine that the chains have mixed well. Plots of parameter estimates from MCMC draws are covered in the separate vignette [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html), and graphical posterior predictive model checking is covered in the [_Graphical posterior predictive checks_](https://mc-stan.org/bayesplot/articles/graphical-ppcs.html) vignette. Note that most of these plots can also be browsed interactively using the [shinystan](https://mc-stan.org/shinystan/) package. ### Setup In addition to __bayesplot__ we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstan__, for fitting the example models used throughout the vignette ```{r setup, eval=FALSE} library("bayesplot") library("ggplot2") library("rstan") ``` ### Example model Before we delve into the actual plotting we need to fit a model to have something to work with. In this vignette we'll use the eight schools example, which is discussed in many places, including Rubin (1981), Gelman et al. (2013), and the [RStan Getting Started](https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started#how-to-use-rstan) wiki. This is a simple hierarchical meta-analysis model with data consisting of point estimates `y` and standard errors `sigma` from analyses of test prep programs in `J=8` schools. Ideally we would have the full data from each of the previous studies, but in this case we only have the these estimates. ```{r schools_dat} schools_dat <- list( J = 8, y = c(28, 8, -3, 7, -1, 1, 18, 12), sigma = c(15, 10, 16, 11, 9, 11, 10, 18) ) ``` The model is: $$ \begin{align*} y_j &\sim {\rm Normal}(\theta_j, \sigma_j), \quad j = 1,\dots,J \\ \theta_j &\sim {\rm Normal}(\mu, \tau), \quad j = 1, \dots, J \\ \mu &\sim {\rm Normal}(0, 10) \\ \tau &\sim {\rm half-Cauchy}(0, 10), \end{align*} $$ with the normal distribution parameterized by the mean and standard deviation, not the variance or precision. In Stan code: ```{stan stancode1, output.var = "schools_mod_cp"} // Saved in 'schools_mod_cp.stan' data { int J; vector[J] y; vector[J] sigma; } parameters { real mu; real tau; vector[J] theta; } model { mu ~ normal(0, 10); tau ~ cauchy(0, 10); theta ~ normal(mu, tau); y ~ normal(theta, sigma); } ``` This parameterization of the model is referred to as the centered parameterization (CP). We'll also fit the same statistical model but using the so-called non-centered parameterization (NCP), which replaces the vector $\theta$ with a vector $\eta$ of a priori _i.i.d._ standard normal parameters and then constructs $\theta$ deterministically from $\eta$ by scaling by $\tau$ and shifting by $\mu$: $$ \begin{align*} \theta_j &= \mu + \tau \,\eta_j, \quad j = 1,\dots,J \\ \eta_j &\sim N(0,1), \quad j = 1,\dots,J. \end{align*} $$ The Stan code for this model is: ```{stan, stancode2, output.var = "schools_mod_ncp"} // Saved in 'schools_mod_ncp.stan' data { int J; vector[J] y; vector[J] sigma; } parameters { real mu; real tau; vector[J] eta; } transformed parameters { vector[J] theta; theta = mu + tau * eta; } model { mu ~ normal(0, 10); tau ~ cauchy(0, 10); eta ~ normal(0, 1); // implies theta ~ normal(mu, tau) y ~ normal(theta, sigma); } ``` The centered and non-centered are two parameterizations of the same statistical model, but they have very different practical implications for MCMC. Using the __bayesplot__ diagnostic plots, we'll see that, for this data, the NCP is required in order to properly explore the posterior distribution. To fit both models we first translate the Stan code to C++ and compile it using the `stan_model` function. ```{r compile-models, eval=FALSE} schools_mod_cp <- stan_model("schools_mod_cp.stan") schools_mod_ncp <- stan_model("schools_mod_ncp.stan") ``` We then fit the model by calling Stan's MCMC algorithm using the `sampling` function (the increased `adapt_delta` param is to make the sampler a bit more "careful" and avoid false positive divergences), ```{r fit-models-hidden, results='hide', message=FALSE} fit_cp <- sampling(schools_mod_cp, data = schools_dat, seed = 803214055, control = list(adapt_delta = 0.9)) fit_ncp <- sampling(schools_mod_ncp, data = schools_dat, seed = 457721433, control = list(adapt_delta = 0.9)) ``` and extract a `iterations x chains x parameters` array of posterior draws with `as.array`, ```{r extract-draws} # Extract posterior draws for later use posterior_cp <- as.array(fit_cp) posterior_ncp <- as.array(fit_ncp) ``` You may have noticed the warnings about divergent transitions for the centered parameterization fit. Those are serious business and in most cases indicate that something is wrong with the model and the results should not be trusted. For an explanation of these warnings see [Divergent transitions after warmup](https://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup). We'll have a look at diagnosing the source of the divergences first and then dive into some diagnostics that should be checked even if there are no warnings from the sampler.
## Diagnostics for the No-U-Turn Sampler The No-U-Turn Sampler (NUTS, Hoffman and Gelman, 2014) is the variant of Hamiltonian Monte Carlo (HMC) used by [Stan](https://mc-stan.org/) and the various R packages that depend on Stan for fitting Bayesian models. The **bayesplot** package has special functions for visualizing some of the unique diagnostics permitted by HMC, and NUTS in particular. See Betancourt (2017), Betancourt and Girolami (2013), and Stan Development Team (2017) for more details on the concepts. **Documentation:** * `help("MCMC-nuts")` * [mc-stan.org/bayesplot/reference/MCMC-nuts](https://mc-stan.org/bayesplot/reference/MCMC-nuts.html) ------ The special **bayesplot** functions for NUTS diagnostics are ```{r available_mcmc-nuts} available_mcmc(pattern = "_nuts_") ``` Those functions require more information than simply the posterior draws, in particular the log of the posterior density for each draw and some NUTS-specific diagnostic values may be needed. The **bayesplot** package provides generic functions `log_posterior` and `nuts_params` for extracting this information from fitted model objects. Currently methods are provided for models fit using the **rstan**, **rstanarm** and **brms** packages, although it is not difficult to define additional methods for the objects returned by other R packages. For the Stan models we fit above we can use the `log_posterior` and `nuts_params` methods for stanfit objects: ```{r extract-nuts-info} lp_cp <- log_posterior(fit_cp) head(lp_cp) np_cp <- nuts_params(fit_cp) head(np_cp) # for the second model lp_ncp <- log_posterior(fit_ncp) np_ncp <- nuts_params(fit_ncp) ``` ```{r echo=FALSE, warning=FALSE} # On rare occasions, the fits may not be illustrative. Currently the seed is # fixed, but if something in Stan changes and the fixed seeds produce unexpected # results (which should be rare), we want to know. n_divergent_cp <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp <- np_ncp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp < 10 || n_divergent_cp > 2000) { stop("Unexpected number of divergences in the CP model. Change seed?") } if(n_divergent_ncp > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ``` In addition to the NUTS-specific plotting functions, some of the general MCMC plotting functions demonstrated in the [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html) vignette also take optional arguments that can be used to display important HMC/NUTS diagnostic information. We'll see examples of this in the next section on divergent transitions. ### Divergent transitions When running the Stan models above, there were warnings about divergent transitions. Here we'll look at diagnosing the source of divergences through visualizations. #### mcmc_parcoord The `mcmc_parcoord` plot shows one line per iteration, connecting the parameter values at this iteration. This lets you see global patterns in the divergences. This function works in general without including information about the divergences, but if the optional `np` argument is used to pass NUTS parameter information, then divergences will be colored in the plot (by default in red). ```{r mcmc_parcoord-1} color_scheme_set("darkgray") mcmc_parcoord(posterior_cp, np = np_cp) ``` Here, you may notice that divergences in the centered parameterization happen exclusively when `tau`, the hierarchical standard deviation, goes near zero and the values of the `theta`s are essentially fixed. This makes `tau` immediately suspect. See [Gabry et al. (2019)](#gabry2019) for another example of the parallel coordinates plot. #### mcmc_pairs The `mcmc_pairs` function can also be used to look at multiple parameters at once, but unlike `mcmc_parcoord` (which works well even when including several dozen parameters) `mcmc_pairs` is more useful for up to ~8 parameters. It shows univariate histograms and bivariate scatter plots for selected parameters and is especially useful in identifying collinearity between variables (which manifests as narrow bivariate plots) as well as the presence of multiplicative non-identifiabilities (banana-like shapes). Let's look at how `tau` interacts with other variables, using only one of the `theta`s to keep the plot readable: ```{r mcmc_pairs} mcmc_pairs(posterior_cp, np = np_cp, pars = c("mu","tau","theta[1]"), off_diag_args = list(size = 0.75)) ``` Note that each bivariate plot is present twice -- by default each of those contain half of the chains, so you also get to see if the chains produced similar results (see the documentation for the `condition` argument for other options). Here, the interaction of `tau` and `theta[1]` seems most interesting, as it concentrates the divergences into a tight region. Further examples of pairs plots and instructions for using the various optional arguments to `mcmc_pairs` are provided via `help("mcmc_pairs")`. #### mcmc_scatter Using the `mcmc_scatter` function (with optional argument `np`) we can look at a single bivariate plot to investigate it more closely. For hierarchical models, a good place to start is to plot a "local" parameter (`theta[j]`) against a "global" scale parameter on which it depends (`tau`). We will also use the `transformations` argument to look at the log of `tau`, as this is what Stan is doing under the hood for parameters like `tau` that have a lower bound of zero. That is, even though the draws for `tau` returned from Stan are all positive, the parameter space that the Markov chains actual explore is unconstrained. Transforming `tau` is not strictly necessary for the plot (often the plot is still useful without it) but plotting in the unconstrained is often even more informative. First the plot for the centered parameterization: ```{r mcmc_scatter-1} # assign to an object so we can reuse later scatter_theta_cp <- mcmc_scatter( posterior_cp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), # can abbrev. 'transformations' np = np_cp, size = 1 ) scatter_theta_cp ``` The shape of this bivariate distribution resembles a funnel (or tornado). This one in particular is essentially the same as an example referred to as Neal's funnel (details in the Stan manual) and it is a clear indication that the Markov chains are struggling to explore the tip of the funnel, which is narrower than the rest of the space. The main problem is that large steps are required to explore the less narrow regions efficiently, but those steps become too large for navigating the narrow region. The required step size is connected to the value of `tau`. When `tau` is large it allows for large variation in `theta` (and requires large steps) while small `tau` requires small steps in `theta`. The non-centered parameterization avoids this by sampling the `eta` parameter which, unlike `theta`, is _a priori independent_ of `tau`. Then `theta` is computed deterministically from the parameters `eta`, `mu` and `tau` afterwards. Here's the same plot as above, but with `eta[1]` from non-centered parameterization instead of `theta[1]` from the centered parameterization: ```{r mcmc_scatter-2} scatter_eta_ncp <- mcmc_scatter( posterior_ncp, pars = c("eta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) scatter_eta_ncp ``` We can see that the funnel/tornado shape is replaced by a somewhat Gaussian blob/cloud and the divergences go away. [Gabry et al. (2019)](#gabry2019) has further discussion of this example. Ultimately we only care about `eta` insofar as it enables the Markov chains to better explore the posterior, so let's directly examine how much more exploration was possible after the reparameterization. For the non-centered parameterization we can make the same scatterplot but use the values of `theta[1] = mu + eta[1] * tau` instead of `eta[1]`. Below is a side by side comparison with the scatterplot of `theta[1]` vs `log(tau)` from the centered parameterization that we made above. We will also force the plots to have the same $y$-axis limits, which will make the most important difference much more apparent: ```{r mcmc_scatter-3} # A function we'll use several times to plot comparisons of the centered # parameterization (cp) and the non-centered parameterization (ncp). See # help("bayesplot_grid") for details on the bayesplot_grid function used here. compare_cp_ncp <- function(cp_plot, ncp_plot, ncol = 2, ...) { bayesplot_grid( cp_plot, ncp_plot, grid_args = list(ncol = ncol), subtitles = c("Centered parameterization", "Non-centered parameterization"), ... ) } scatter_theta_ncp <- mcmc_scatter( posterior_ncp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) compare_cp_ncp(scatter_theta_cp, scatter_theta_ncp, ylim = c(-8, 4)) ``` Once we transform the `eta` values into `theta` values we actually see an even more pronounced funnel/tornado shape than we have with the centered parameterization. But this is precisely what we want! The non-centered parameterization allowed us to obtain draws from the funnel distribution without having to directly navigate the curvature of the funnel. With the centered parameterization the chains never could make it into the neck of funnel and we see a clustering of divergences and no draws in the tail of the distribution. #### mcmc_trace Another useful diagnostic plot is the trace plot, which is a time series plot of the Markov chains. That is, a trace plot shows the evolution of parameter vector over the iterations of one or many Markov chains. The `np` argument to the `mcmc_trace` function can be used to add a rug plot of the divergences to a trace plot of parameter draws. Typically we can see that at least one of the chains is getting stuck wherever there is a cluster of many red marks. Here is the trace plot for the `tau` parameter from the centered parameterization: ```{r mcmc_trace} color_scheme_set("mix-brightblue-gray") mcmc_trace(posterior_cp, pars = "tau", np = np_cp) + xlab("Post-warmup iteration") ``` The first thing to note is that all chains seem to be exploring the same region of parameter values, which is a good sign. But the plot is too crowded to help us diagnose divergences. We may however zoom in to investigate, using the `window` argument: ```{r echo=FALSE} #A check that the chosen window still relevant n_divergent_in_window <- np_cp %>% filter(Parameter == "divergent__" & Value == 1 & Iteration >= 300 & Iteration <= 500) %>% nrow() if(n_divergent_in_window < 6) { divergences <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% select(Iteration) %>% get("Iteration", .) %>% sort() %>% paste(collapse = ",") stop(paste("Too few divergences in the selected window for traceplot zoom. Change the window or the random seed.\nDivergences happened at: ", divergences)) } ``` ```{r mcmc_trace_zoom} mcmc_trace(posterior_cp, pars = "tau", np = np_cp, window = c(300,500)) + xlab("Post-warmup iteration") ``` What we see here is that chains can get stuck as `tau` approaches zero and spend substantial time in the same region of the parameter space. This is just another indication that there is problematic geometry at $\tau \simeq 0$ -- healthy chains jump up and down frequently. #### mcmc_nuts_divergence To understand how the divergences interact with the model globally, we can use the `mcmc_nuts_divergence` function: ```{r mcmc_nuts_divergence} color_scheme_set("red") mcmc_nuts_divergence(np_cp, lp_cp) ``` In the top panel we see the distribution of the log-posterior when there was no divergence vs the distribution when there was a divergence. Divergences often indicate that some part of the posterior isn't being explored and the plot confirms that `lp|Divergence` indeed has lighter tails than `lp|No divergence`. The bottom panel shows the same thing but instead of the log-posterior the NUTS acceptance statistic is shown. Specifying the optional `chain` argument will overlay the plot just for a particular Markov chain on the plot for all chains combined: ```{r mcmc_nuts_divergence-chain} mcmc_nuts_divergence(np_cp, lp_cp, chain = 4) ``` For the non-centered parameterization we may get a few warnings about divergences but if we do we'll have far fewer of them to worry about. ```{r mcmc_nuts_divergence-2} mcmc_nuts_divergence(np_ncp, lp_ncp) ``` If there are only a few divergences we can often get rid of them by increasing the target acceptance rate (`adapt_delta`, the upper limit is 1), which has the effect of lowering the step size used by the sampler and allowing the Markov chains to explore more complicated curvature in the target distribution. ```{r fit-adapt-delta, results='hide', message=FALSE} fit_cp_2 <- sampling(schools_mod_cp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 978245244) fit_ncp_2 <- sampling(schools_mod_ncp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 843256842) ``` ```{r echo=FALSE, warning=FALSE} # On rare occasions, the fits may not be illustrative. Currently the seed is fixed, but if something in Stan changes and the fixed seeds produce unexpected results (which should be rare), we want to know. n_divergent_cp_2 <- fit_cp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp_2 <- fit_ncp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp_2 <= 0) { stop("No divergences in CP with increased adapt.delta. Change seed?") } if(n_divergent_ncp_2 > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ``` For the first model and this particular data, increasing `adapt_delta` will not solve the problem and a reparameterization is required. ```{r mcmc_nuts_divergence-3} mcmc_nuts_divergence(nuts_params(fit_cp_2), log_posterior(fit_cp_2)) mcmc_nuts_divergence(nuts_params(fit_ncp_2), log_posterior(fit_ncp_2)) ``` ### Energy and Bayesian fraction of missing information The `mcmc_nuts_energy` function creates plots similar to those presented in Betancourt (2017). While `mcmcm_nuts_divergence` can identify light tails and incomplete exploration of the target distribution, the `mcmc_nuts_energy` function can identify overly heavy tails that are also challenging for sampling. Informally, the energy diagnostic for HMC (and the related energy-based Bayesian fraction of missing information) quantifies the heaviness of the tails of the posterior distribution. #### mcmc_nuts_energy The plot created by `mcmc_nuts_energy` shows overlaid histograms of the (centered) marginal energy distribution $\pi_E$ and the first-differenced distribution $\pi_{\Delta E}$, ```{r mcmc_nuts_energy-1, message=FALSE} color_scheme_set("red") mcmc_nuts_energy(np_cp) ``` The two histograms ideally look the same (Betancourt, 2017), which is only the case for the non-centered parameterization (right): ```{r mcmc_nuts_energy-3, message=FALSE, fig.width=8} compare_cp_ncp( mcmc_nuts_energy(np_cp, binwidth = 1/2), mcmc_nuts_energy(np_ncp, binwidth = 1/2) ) ``` The difference between the parameterizations is even more apparent if we force the step size to a smaller value and help the chains explore more of the posterior: ```{r mcmc_nuts_energy-4, message=FALSE, fig.width=8} np_cp_2 <- nuts_params(fit_cp_2) np_ncp_2 <- nuts_params(fit_ncp_2) compare_cp_ncp( mcmc_nuts_energy(np_cp_2), mcmc_nuts_energy(np_ncp_2) ) ``` See Betancourt (2017) for more on this particular example as well as the general theory behind the energy plots.
## General MCMC diagnostics A Markov chain generates draws from the target distribution only after it has converged to an equilibrium. Unfortunately, this is only guaranteed in the limit in theory. In practice, diagnostics must be applied to monitor whether the Markov chain(s) have converged. The __bayesplot__ package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) diagnostics after fitting a Bayesian model. MCMC draws from any package can be used, although there are a few diagnostic plots that we will see later in this vignette that are specifically intended to be used for [Stan](https://mc-stan.org/) models (or models fit using the same algorithms as Stan). **Documentation:** * `help("MCMC-diagnostics")` * [mc-stan.org/bayesplot/reference/MCMC-diagnostics](https://mc-stan.org/bayesplot/reference/MCMC-diagnostics.html) ------ ### Rhat: potential scale reduction statistic One way to monitor whether a chain has converged to the equilibrium distribution is to compare its behavior to other randomly initialized chains. This is the motivation for the potential scale reduction statistic, split-$\hat{R}$. The split-$\hat{R}$ statistic measures the ratio of the average variance of draws within each chain to the variance of the pooled draws across chains; if all chains are at equilibrium, these will be the same and $\hat{R}$ will be one. If the chains have not converged to a common distribution, the $\hat{R}$ statistic will be greater than one (see Gelman et al. 2013, Stan Development Team 2018). The **bayesplot** package provides the functions `mcmc_rhat` and `mcmc_rhat_hist` for visualizing $\hat{R}$ estimates. First we'll quickly fit one of the models above again, this time intentionally using too few MCMC iterations and allowing more dispersed initial values. This should lead to some high $\hat{R}$ values. ```{r fit_cp_bad_rhat, results='hide'} fit_cp_bad_rhat <- sampling(schools_mod_cp, data = schools_dat, iter = 50, init_r = 10, seed = 671254821) ``` **bayesplot** provides a generic `rhat` extractor function, currently with methods defined for models fit using the **rstan**, **rstanarm** and **brms** packages. But regardless of how you fit your model, all **bayesplot** needs is a vector of $\hat{R}$ values. ```{r print-rhats} rhats <- rhat(fit_cp_bad_rhat) print(rhats) ``` #### mcmc_rhat, mcmc_rhat_hist We can visualize the $\hat{R}$ values with the `mcmc_rhat` function: ```{r echo=FALSE} #Check that the fit we got is a sensible example if(all(rhats < 1.3)) { stop("All rhats for the short chain run are low. Change seed?") } ``` ```{r mcmc_rhat-1} color_scheme_set("brightblue") # see help("color_scheme_set") mcmc_rhat(rhats) ``` In the plot, the points representing the $\hat{R}$ values are colored based on whether they are less than $1.05$, between $1.05$ and $1.1$, or greater than $1.1$. There is no theoretical reason to trichotomize $\hat{R}$ values using these cutoffs, so keep in mind that this is just a heuristic. The $y$-axis text is off by default for this plot because it's only possible to see the labels clearly for models with very few parameters. We can see the names of the parameters with the concerning $\hat{R}$ values using the `yaxis_text` convenience function (which passes arguments like `hjust` to `ggplot2::element_text`): ```{r mcmc_rhat-2} mcmc_rhat(rhats) + yaxis_text(hjust = 1) ``` If we look at the same model fit using longer Markov chains we should see all $\hat{R} < 1.1$, and all points in the plot the same (light) color: ```{r mcmc_rhat-3} mcmc_rhat(rhat = rhat(fit_cp)) + yaxis_text(hjust = 0) ``` We can see the same information shown by `mcmc_rhat` but in histogram form using the `mcmc_rhat_hist` function. See the **Examples** section in `help("mcmc_rhat_hist")` for examples. ### Effective sample size The effective sample size is an estimate of the number of independent draws from the posterior distribution of the estimand of interest. The $n_{eff}$ metric used in Stan is based on the ability of the draws to estimate the true mean value of the parameter, which is related to (but not necessarily equivalent to) estimating other functions of the draws. Because the draws within a Markov chain are _not_ independent if there is autocorrelation, the effective sample size, $n_{eff}$, is usually smaller than the total sample size, $N$ (although it may be larger in some cases[^1]). The larger the ratio of $n_{eff}$ to $N$ the better (see Gelman et al. 2013, Stan Development Team 2018 for more details) . [^1]: $n_{eff} > N$ indicates that the mean estimate of the parameter computed from Stan draws approaches the true mean faster than the mean estimate computed from independent samples from the true posterior (the estimate from Stan has smaller variance). This is possible when the draws are anticorrelated - draws above the mean tend to be well matched with draws below the mean. Other functions computed from draws (quantiles, posterior intervals, tail probabilities) may not necessarily approach the true posterior faster. Google "antithetic sampling" or visit [the relevant forum thread](https://discourse.mc-stan.org/t/n-eff-bda3-vs-stan/2608/19) for some further explanation. The **bayesplot** package provides a generic `neff_ratio` extractor function, currently with methods defined for models fit using the **rstan**, **rstanarm** and **brms** packages. But regardless of how you fit your model, all **bayesplot** needs is a vector of $n_{eff}/N$ values. The `mcmc_neff` and `mcmc_neff_hist` can then be used to plot the ratios. #### mcmc_neff, mcmc_neff_hist ```{r print-neff-ratios} ratios_cp <- neff_ratio(fit_cp) print(ratios_cp) mcmc_neff(ratios_cp, size = 2) ``` In the plot, the points representing the values of $n_{eff}/N$ are colored based on whether they are less than $0.1$, between $0.1$ and $0.5$, or greater than $0.5$. These particular values are arbitrary in that they have no particular theoretical meaning, but a useful heuristic is to worry about any $n_{eff}/N$ less than $0.1$. One important thing to keep in mind is that these ratios will depend not only on the model being fit but also on the particular MCMC algorithm used. One reason why we have such high ratios of $n_{eff}$ to $N$ is that the No-U-Turn sampler used by **rstan** generally produces draws from the posterior distribution with much lower autocorrelations compared to draws obtained using other MCMC algorithms (e.g., Gibbs). Even for models fit using **rstan** the parameterization can make a big difference. Here are the $n_{eff}/N$ plots for `fit_cp` and `fit_ncp` side by side. ```{r mcmc_neff-compare} neff_cp <- neff_ratio(fit_cp, pars = c("theta", "mu", "tau")) neff_ncp <- neff_ratio(fit_ncp, pars = c("theta", "mu", "tau")) compare_cp_ncp(mcmc_neff(neff_cp), mcmc_neff(neff_ncp), ncol = 1) ``` Because of the difference in parameterization, the effective sample sizes are much better for the second model, the non-centered parameterization. ### Autocorrelation As mentioned above, $n_{eff}/N$ decreases as autocorrelation becomes more extreme. We can visualize the autocorrelation using the `mcmc_acf` (line plot) or `mcmc_acf_bar` (bar plot) functions. For the selected parameters, these functions show the autocorrelation for each Markov chain separately up to a user-specified number of lags. Positive autocorrelation is bad (it means the chain tends to stay in the same area between iterations) and you want it to drop quickly to zero with increasing lag. Negative autocorrelation is possible and it is useful as it indicates fast convergence of sample mean towards true mean. #### `mcmc_acf`, `mcmc_acf_bar` Here we can again see a difference when comparing the two parameterizations of the same model. For model 1, $\theta_1$ is the primitive parameter for school 1, whereas for the non-centered parameterization in model 2 the primitive parameter is $\eta_1$ (and $\theta_1$ is later constructed from $\eta_1$, $\mu$, and $\tau$): ```{r mcmc_acf, out.width = "70%"} compare_cp_ncp( mcmc_acf(posterior_cp, pars = "theta[1]", lags = 10), mcmc_acf(posterior_ncp, pars = "eta[1]", lags = 10) ) ```
## References Betancourt, M. (2017). A conceptual introduction to Hamiltonian Monte Carlo. https://arxiv.org/abs/1701.02434 Betancourt, M. (2016). Diagnosing suboptimal cotangent disintegrations in Hamiltonian Monte Carlo. https://arxiv.org/abs/1604.00695 Betancourt, M. and Girolami, M. (2013). Hamiltonian Monte Carlo for hierarchical models. https://arxiv.org/abs/1312.0906 Gabry, J., and Goodrich, B. (2018). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.17.4. https://mc-stan.org/rstanarm/ Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper)) Gelman, A. and Rubin, D. B. (1992). Inference from iterative simulation using multiple sequences. *Statistical Science*. 7(4): 457--472. Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Hoffman, M. D. and Gelman, A. (2014). The No-U-Turn Sampler: adaptively setting path lengths in Hamiltonian Monte Carlo. *Journal of Machine Learning Research*. 15:1593--1623. Rubin, D. B. (1981). Estimation in Parallel Randomized Experiments. *Journal of Educational and Behavioral Statistics*. 6:377--401. Stan Development Team. _Stan Modeling Language Users Guide and Reference Manual_. https://mc-stan.org/users/documentation/ Stan Development Team. (2018). RStan: the R interface to Stan. R package version 2.17.3. https://mc-stan.org/rstan/ bayesplot/R/0000755000176200001440000000000014560773547012477 5ustar liggesusersbayesplot/R/mcmc-combo.R0000644000176200001440000000704514127610043014620 0ustar liggesusers#' Combination plots #' #' @name MCMC-combos #' @family MCMC #' #' @template args-mcmc-x #' @param ... Arguments passed to the plotting functions named in `combo`. #' @param combo A character vector with at least two elements. Each element of #' `combo` corresponds to a column in the resulting graphic and should be the #' name of one of the available [MCMC][MCMC-overview] functions (omitting the #' `mcmc_` prefix). #' @param widths A numeric vector the same length as `combo` specifying #' relative column widths. For example, if the plot has two columns, then #' `widths = c(2, 1)` will allocate more space for the first column by a #' factor of 2 (as would `widths = c(.3, .15)`, etc.). The default, #' `NULL`, allocates the same horizontal space for each column. #' @param gg_theme Unlike most of the other **bayesplot** functions, #' `mcmc_combo` returns a gtable object rather than a ggplot object, and #' so theme objects can't be added directly to the returned plot object. The #' `gg_theme` argument helps get around this problem by accepting a #' **ggplot2** [theme][ggplot2::theme] object that is added to each of the #' plots *before* combining them into the gtable object that is returned. #' This can be a theme object created by a call to [ggplot2::theme()] or #' one of the **bayesplot** convenience functions, e.g. #' [legend_none()] (see the **Examples** section, below). #' #' @return A gtable object (the result of calling #' [gridExtra::arrangeGrob()]) with `length(combo)` columns and #' a row for each parameter. #' #' @examples #' # some parameter draws to use for demonstration #' x <- example_mcmc_draws() #' dim(x) #' dimnames(x) #' #' mcmc_combo(x, pars = c("alpha", "sigma")) #' mcmc_combo(x, pars = c("alpha", "sigma"), widths = c(1, 2)) #' #' \donttest{ #' # change second plot, show log(sigma) instead of sigma, #' # and remove the legends #' color_scheme_set("mix-blue-red") #' mcmc_combo( #' x, #' combo = c("dens_overlay", "trace"), #' pars = c("alpha", "sigma"), #' transformations = list(sigma = "log"), #' gg_theme = legend_none() #' ) #' #' # same thing but this time also change the entire ggplot theme #' mcmc_combo( #' x, #' combo = c("dens_overlay", "trace"), #' pars = c("alpha", "sigma"), #' transformations = list(sigma = "log"), #' gg_theme = ggplot2::theme_gray() + legend_none() #' ) #' } #' NULL #' @rdname MCMC-combos #' @export mcmc_combo <- function(x, combo = c("dens", "trace"), ..., widths = NULL, gg_theme = NULL) { suggested_package("gridExtra") if (length(combo) < 2) { abort("'combo' should have at least two elements.") } plotfuns <- paste0("mcmc_", combo) not_found <- setdiff(plotfuns, available_mcmc()) if (length(not_found)) { abort(paste( "The following functions were not found:", paste(not_found, collapse = ", ") )) } plotfuns <- lapply(plotfuns, function(x) get(x, pos = asNamespace("bayesplot"), mode = "function")) args <- list(x = x, ...) if (is.list(args$facet_args)) { args$facet_args[["ncol"]] <- 1 args$facet_args[["nrow"]] <- NULL } else { args$facet_args <- list(ncol = 1, nrow = NULL) } plots <- lapply(plotfuns, function(f) suppressWarnings(do.call(f, args))) plots <- lapply(plots, function(x) x + bayesplot_theme_get()) if (!is.null(gg_theme)) plots <- lapply(plots, function(x) x + gg_theme) bayesplot_grid( plots = plots, grid_args = list(ncol = length(combo), widths = widths) ) } bayesplot/R/mcmc-scatterplots.R0000644000176200001440000007736314556270424016275 0ustar liggesusers#' Scatterplots of MCMC draws #' #' Scatterplots, hexagonal heatmaps, and pairs plots from MCMC draws. See the #' **Plot Descriptions** section, below, for details. #' #' @name MCMC-scatterplots #' @family MCMC #' #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-transformations #' @param ... Currently ignored. #' @param size,alpha For `mcmc_scatter()`, passed to #' [ggplot2::geom_point()] to control the appearance of the points. #' @param bins,binwidth For `mcmc_hex()`, an optional numeric vector of #' *length two* passed to [ggplot2::geom_hex()] to override the #' default binwidth in both the vertical and horizontal directions. #' #' @param np Optionally, a data frame of NUTS sampler parameters, either created #' by [nuts_params()] or in the same form as the object returned by #' [nuts_params()]. The colors, shapes, and sizes of the #' superimposed points can be customized using the `np_style` argument. #' @param np_style If `np` is specified, `np_style` can be a call to #' the `scatter_style_np()` helper function (for `mcmc_scatter()`) or #' the `pairs_style_np()` helper function (for `mcmc_pairs()`) to specify #' arguments controlling the appearance of superimposed points representing #' NUTS diagnostic information. (Note: for `pairs_style_np()` the #' `size` arguments are interpreted as scaling factors). #' #' @return `mcmc_scatter()` and `mcmc_hex()` return a ggplot object that #' can be further customized using the **ggplot2** package. #' #' `mcmc_pairs()` returns many ggplot objects organized into a grid via #' [bayesplot_grid()]. #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_scatter()`}{ #' Bivariate scatterplot of posterior draws. If using a very large number of #' posterior draws then `mcmc_hex()` may be preferable to avoid #' overplotting. For models fit using [NUTS] the `np`, #' and `np_style` arguments can be used to add additional information in #' the plot (in this case the approximate location of divergences). #' For more on why the scatter plot with divergences is a useful #' diagnostic tool see [Gabry et al. (2019)](https://github.com/jgabry/bayes-vis-paper#readme). #' } #' \item{`mcmc_hex()`}{ #' Hexagonal heatmap of 2-D bin counts. This plot is useful in cases where #' the posterior sample size is large enough that `mcmc_scatter()` suffers #' from overplotting. #' } #' \item{`mcmc_pairs()`}{ #' A square plot matrix with univariate marginal distributions along the #' diagonal (as histograms or kernel density plots) and bivariate #' distributions off the diagonal (as scatterplots or hex heatmaps). #' #' For the off-diagonal plots, the default is to split the chains so that #' (roughly) half are displayed above the diagonal and half are below (all #' chains are always merged together for the plots along the diagonal). Other #' possibilities are available by setting the `condition` argument. #' #' Additionally, extra diagnostic information for models fit using #' [NUTS] can be added to the pairs plot using the `lp`, #' `np`, and `np_style` arguments. If `np` is specified (and #' `condition` is *not* `"divergent__"`), then points (red, by #' default) will be superimposed onto the off-diagonal plots indicating which #' (if any) iterations encountered a divergent transition. Also, if both #' `np` and `max_treedepth` are specified then points (yellow, by #' default) will be superimposed to indicate a transition that hit the #' maximum treedepth rather than terminated its evolution normally. The #' `np_style` argument can be used with the `pairs_style_np()` #' convenience function to change the appearance of these overlaid points. #' See the **Examples** section. #' } #' } #' #' @template reference-vis-paper #' #' @examples #' library("ggplot2") #' #' # some parameter draws to use for demonstration #' x <- example_mcmc_draws(params = 6) #' dimnames(x) #' #' # scatterplot of alpha vs log(sigma) #' color_scheme_set("teal") #' (p <- mcmc_scatter(x, pars = c("alpha", "sigma"), #' transform = list(sigma = "log"))) #' p + #' labs( #' title = "Insert your own headline-grabbing title", #' subtitle = "with a provocative subtitle", #' caption = "and a controversial caption", #' x = expression(alpha), #' y = expression(log(sigma)) #' ) #' #' # add ellipse #' p + stat_ellipse(level = 0.9, color = "gray20", size = 1) #' #' # add contour #' color_scheme_set("red") #' p2 <- mcmc_scatter(x, pars = c("alpha", "sigma"), size = 3.5, alpha = 0.25) #' p2 + stat_density_2d(color = "black", size = .5) #' #' # can also add lines/smooths #' color_scheme_set("pink") #' (p3 <- mcmc_scatter(x, pars = c("alpha", "beta[3]"), alpha = 0.25, size = 3)) #' p3 + geom_smooth(method = "lm", se = FALSE, color = "gray20", #' size = .75, linetype = 2) #' #' \donttest{ #' if (requireNamespace("hexbin", quietly = TRUE)) { #' # hexagonal heatmap #' color_scheme_set("brightblue") #' (p <- mcmc_hex(x, pars = c("sigma", "alpha"), transform = list(sigma = "log"))) #' p + plot_bg(fill = "gray95") #' p + plot_bg(fill = "gray95") + panel_bg(fill = "gray70") #' } #' } NULL #' @rdname MCMC-scatterplots #' @export mcmc_scatter <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., size = 2.5, alpha = 0.8, np = NULL, np_style = scatter_style_np()) { check_ignored_arguments(...) .mcmc_scatter( x, pars = pars, regex_pars = regex_pars, transformations = transformations, size = size, alpha = alpha, hex = FALSE, binwidth = NULL, np = np, np_style = np_style ) } #' @rdname MCMC-scatterplots #' @export #' mcmc_hex <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., bins = 30, binwidth = NULL) { suggested_package("scales") suggested_package("hexbin") check_ignored_arguments(...) .mcmc_scatter( x, pars = pars, regex_pars = regex_pars, transformations = transformations, hex = TRUE, bins = bins, binwidth = binwidth, size = NULL, alpha = NULL ) } #' @rdname MCMC-scatterplots #' @export #' @param condition For `mcmc_pairs()`, a call to the `pairs_condition()` #' helper function, which is used to specify a criterion for determining which #' chains (or iterations) are shown in the plots above the diagonal and which #' are shown in the plots below the diagonal. The histograms (or density #' plots) along the diagonal are always made using all chains and iterations, #' but the scatterplots (or hex plots) above and below the diagonal show #' different combinations of chains/iterations depending on `condition`. #' The default is a call to `pairs_condition()` with none of its arguments #' specified. In this case half of the chains (or roughly half if there are an #' odd number) will be used in the plots above the diagonal and the rest in #' the plots below the diagonal. The `chains`, `draws`, and #' `nuts` arguments to `pairs_condition()`, which are documented #' below, can be used to change this default. #' #' @param lp For `mcmc_pairs()`, a molten data frame of draws of the #' log-posterior or, more commonly, of a quantity equal to the log-posterior #' up to a constant. `lp` should either be created via #' [log_posterior()] or be an object with the same form as the #' object returned by [log_posterior()]. #' @param max_treedepth For `mcmc_pairs()`, an integer representing the #' maximum treedepth allowed when fitting the model (if fit using NUTS). This #' is only needed for detecting which transitions (if any) hit the maximum #' treedepth. #' @param diag_fun,off_diag_fun For `mcmc_pairs()`, the plotting function to #' use for the plots along the diagonal and for the off-diagonal plots, #' respectively. Currently `diag_fun` can be `"hist"` for histogram #' or `"dens"` for density, and `off_diag_fun` can be #' `"scatter"` for scatterplot or `"hex"` for a hexagonal heatmap. #' @param diag_args,off_diag_args For `mcmc_pairs()`, optional named lists of #' arguments to pass to the functions implied by the `diag_fun` and #' `off_diag_fun` arguments, respectively. For example, if #' `off_diag_fun` is `"scatter"` then `off_diag_args` could #' include optional arguments to `mcmc_scatter()` like `size` and #' `alpha`. #' @param grid_args,save_gg_objects For `mcmc_pairs()`, arguments to pass to #' [bayesplot_grid()]. For example, since `mcmc_pairs()` returns #' more than a single ggplot object, using [ggtitle()] afterwards #' will not work. But you you can still add a title to the plot using #' `grid_args = list(top="My title")`. #' #' @examples #' \donttest{ #' color_scheme_set("purple") #' #' # pairs plots #' # default of condition=NULL implies splitting chains between upper and lower panels #' mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\[[1,4]\\]", #' off_diag_args = list(size = 1, alpha = 0.5)) #' #' # change to density plots instead of histograms and hex plots instead of #' # scatterplots #' mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\[[1,4]\\]", #' diag_fun = "dens", off_diag_fun = "hex") #' #' # plot chain 1 above diagonal and chains 2, 3, and 4 below #' color_scheme_set("brightblue") #' mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\[[1,4]\\]", #' diag_fun = "dens", off_diag_fun = "hex", #' condition = pairs_condition(chains = list(1, 2:4))) #' } #' #' \dontrun{ #' ### Adding NUTS diagnostics to scatterplots and pairs plots #' #' # examples using rstanarm package #' library(rstanarm) #' #' # for demonstration purposes, intentionally fit a model that #' # will (almost certainly) have some divergences #' fit <- stan_glm( #' mpg ~ ., data = mtcars, #' iter = 1000, refresh = 0, #' # this combo of prior and adapt_delta should lead to some divergences #' prior = hs(), #' adapt_delta = 0.9 #' ) #' posterior <- as.array(fit) #' np <- nuts_params(fit) #' #' # mcmc_scatter with divergences highlighted #' color_scheme_set("brightblue") #' mcmc_scatter(posterior, pars = c("wt", "sigma"), np = np) #' #' color_scheme_set("darkgray") #' div_style <- scatter_style_np(div_color = "green", div_shape = 4, div_size = 4) #' mcmc_scatter(posterior, pars = c("sigma", "(Intercept)"), #' np = np, np_style = div_style) #' #' # split the draws according to above/below median accept_stat__ #' # and show approximate location of divergences (red points) #' color_scheme_set("brightblue") #' mcmc_pairs( #' posterior, #' pars = c("wt", "cyl", "sigma"), #' off_diag_args = list(size = 1, alpha = 1/3), #' condition = pairs_condition(nuts = "accept_stat__"), #' np = np #' ) #' #' # more customizations: #' # - transform sigma to log(sigma) #' # - median log-posterior as 'condition' #' # - hex instead of scatter for off-diagonal plots #' # - show points where max treedepth hit in blue #' color_scheme_set("darkgray") #' mcmc_pairs( #' posterior, #' pars = c("wt", "cyl", "sigma"), #' transform = list(sigma = "log"), #' off_diag_fun = "hex", #' condition = pairs_condition(nuts = "lp__"), #' lp = log_posterior(fit), #' np = np, #' np_style = pairs_style_np(div_color = "firebrick", #' td_color = "blue", #' td_size = 2), #' # for demonstration purposes, set max_treedepth to a value that will #' # result in at least a few max treedepth warnings #' max_treedepth = with(np, -1 + max(Value[Parameter == "treedepth__"])) #' ) #' } #' mcmc_pairs <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., diag_fun = c("hist", "dens"), off_diag_fun = c("scatter", "hex"), diag_args = list(), off_diag_args = list(), condition = pairs_condition(), lp = NULL, np = NULL, np_style = pairs_style_np(), max_treedepth = NULL, grid_args = list(), save_gg_objects = TRUE) { check_ignored_arguments(...) stopifnot( is.list(diag_args), is.list(off_diag_args), inherits(np_style, "nuts_style"), inherits(condition, "pairs_condition") ) diag_fun <- match.arg(diag_fun) off_diag_fun <- match.arg(off_diag_fun) plot_diagonal <- pairs_plotfun(diag_fun) plot_off_diagonal <- pairs_plotfun(off_diag_fun) x <- prepare_mcmc_array(x, pars, regex_pars, transformations) x <- drop_constants_and_duplicates(x) n_iter <- num_iters(x) n_chain <- num_chains(x) n_param <- num_params(x) pars <- parameter_names(x) if (n_chain == 1) { warn("Only one chain in 'x'. This plot is more useful with multiple chains.") } if (n_param < 2) { abort("This plot requires at least two parameters in 'x'.") } no_np <- is.null(np) no_lp <- is.null(lp) no_max_td <- is.null(max_treedepth) if (!no_np) { param <- sym("Parameter") val <- sym("Value") np <- validate_nuts_data_frame(np, lp) divs <- dplyr::filter(np, UQ(param) == "divergent__") %>% pull(UQ(val)) divergent__ <- matrix(divs, nrow = n_iter * n_chain, ncol = n_param)[, 1] if (!no_max_td) { gt_max_td <- (dplyr::filter(np, UQ(param) == "treedepth__") %>% pull(UQ(val))) >= max_treedepth max_td_hit__ <- matrix(gt_max_td, nrow = n_iter * n_chain, ncol = n_param)[, 1] } } cond <- handle_condition(x, condition, np, lp) x <- merge_chains(cond[["x"]]) mark <- cond[["mark"]] all_pairs <- expand.grid(pars, pars, stringsAsFactors = FALSE, KEEP.OUT.ATTRS = FALSE) plots <- vector("list", length = nrow(all_pairs)) use_default_binwidth <- is.null(diag_args[["binwidth"]]) for (j in seq_len(nrow(all_pairs))) { pair <- as.character(all_pairs[j,]) if (identical(pair[1], pair[2])) { # Diagonal diag_args[["x"]] <- x[, pair[1], drop = FALSE] # silence ggplot2's "Pick better value with `binwidth`" message if (diag_fun == "hist" && use_default_binwidth) diag_args[["binwidth"]] <- diff(range(diag_args[["x"]]))/30 plots[[j]] <- do.call(plot_diagonal, diag_args) + labs(subtitle = pair[1]) + theme(axis.line.y = element_blank(), plot.subtitle = element_text(hjust = 0.5)) } else { # Off-diagonal # use mark if above diagonal and !mark if below the diagonal mark2 <- if (is_lower_tri(j, n_param)) !mark else mark x_j <- x[mark2, pair, drop = FALSE] if (!no_np) { divs_j <- divergent__[mark2] max_td_hit_j <- if (no_max_td) NULL else max_td_hit__[mark2] } else { divs_j <- max_td_hit_j <- NULL } off_diag_args[["x"]] <- x_j plots[[j]] <- do.call(plot_off_diagonal, off_diag_args) if (isTRUE(any(divs_j == 1))) { divs_j_fac <- factor(as.logical(divs_j), levels = c(FALSE, TRUE), labels = c("NoDiv", "Div")) plots[[j]] <- plots[[j]] + geom_point( aes(color = divs_j_fac, size = divs_j_fac), shape = np_style$shape[["div"]], alpha = np_style$alpha[["div"]], na.rm = TRUE ) } if (isTRUE(any(max_td_hit_j == 1))) { max_td_hit_j_fac <- factor(max_td_hit_j, levels = c(FALSE, TRUE), labels = c("NoHit", "Hit")) plots[[j]] <- plots[[j]] + geom_point( aes(color = max_td_hit_j_fac, size = max_td_hit_j_fac), shape = np_style$shape[["td"]], alpha = np_style$alpha[["td"]], na.rm = TRUE ) } if (isTRUE(any(divs_j == 1)) || isTRUE(any(max_td_hit_j == 1))) plots[[j]] <- format_nuts_points(plots[[j]], np_style) } } plots <- lapply(plots, function(x) x + xaxis_title(FALSE) + yaxis_title(FALSE)) bayesplot_grid(plots = plots, legends = FALSE, grid_args = grid_args, save_gg_objects = save_gg_objects) } #' @rdname MCMC-scatterplots #' @export #' @param div_color,div_shape,div_size,div_alpha,td_color,td_shape,td_size,td_alpha #' Optional arguments to the `scatter_style_np()` or `pairs_style_np()` #' helper functions that are eventually passed to #' [ggplot2::geom_point()].The default values are displayed in the #' **Usage** section above. scatter_style_np <- function(div_color = "red", div_shape = 16, div_size = 2.5, div_alpha = 1) { stopifnot( is.numeric(div_shape) || is.character(div_shape), is.character(div_color), is.numeric(div_size), is.numeric(div_alpha) && div_alpha >= 0 && div_alpha <= 1 ) style <- list( color = c(div = div_color), shape = c(div = div_shape), size = c(div = div_size), alpha = c(div = div_alpha) ) structure(style, class = c(class(style), "nuts_style")) } #' @rdname MCMC-scatterplots #' @export pairs_style_np <- function(div_color = "red", div_shape = 4, div_size = 1, div_alpha = 1, td_color = "yellow2", td_shape = 3, td_size = 1, td_alpha = 1) { stopifnot( is.numeric(div_shape) || is.character(div_shape), is.numeric(td_shape) || is.character(td_shape), is.character(div_color), is.character(td_color), is.numeric(div_size), is.numeric(td_size), is.numeric(div_alpha) && div_alpha >= 0 && div_alpha <= 1, is.numeric(td_alpha) && td_alpha >= 0 && td_alpha <= 1 ) style <- list( color = c(div = div_color, td = td_color), shape = c(div = div_shape, td = td_shape), size = c(div = div_size, td = td_size), alpha = c(div = div_alpha, td = td_alpha) ) structure(style, class = c(class(style), "nuts_style")) } #' @rdname MCMC-scatterplots #' @export #' @param chains,draws,nuts Optional arguments to the `pairs_condition()` #' helper function, which is used to specify the `condition` argument for #' `mcmc_pairs()`. #' \itemize{ #' \item The `chains` argument can be used to select some subset of the #' chains. If `chains` is an integer vector then the behavior is the same #' as the default (half the chains above the diagonal and half below) except #' using only the specified subset of chains. Alternatively, `chains` can #' be a list of two integer vectors with the first specifying the chains to be #' shown in the plots above the diagonal and the second for below the #' diagonal. #' \item The `draws` argument to `pairs_condition()` can be used to #' directly specify which realizations are plotted above and below the #' diagonal. `draws` can be a single proportion, which is interpreted as #' the proportion of realizations (among all chains) to plot in the lower #' panel starting with the first realization in each chain, with the #' complement (from the end of each chain) plotted in the upper panel. #' Alternatively `draws` can be a logical vector with length equal to the #' product of the number of iterations and the number of chains, in which case #' realizations corresponding to `FALSE` and `TRUE` will be plotted #' in the lower and upper panels, respectively. #' \item For models fit using NUTS, the `nuts` argument to #' `pairs_condition()` can be used. It takes a (possibly abbreviated) #' string to select among `"accept_stat__"`, `"stepsize__"`, #' `"treedepth__"`, `"n_leapfrog__"`, `"divergent__"`, #' `"energy__"`, and `"lp__"`. These are the sampler parameters #' associated with [NUTS()] (and `"lp__"` is the log-posterior #' up to an additive constant). In this case, plots below the diagonal will #' contain realizations that are below the median of the indicated variable #' (or are zero in the case of `"divergent__"`), and plots above the #' diagonal will contain realizations that are greater than or equal to the #' median of the indicated variable (or are one in the case of #' `"divergent__"`). If `"lp__"` is used then the `lp` #' argument to `mcmc_pairs` must also be specified. For the other NUTS #' parameters the `np` argument to `mcmc_pairs()` must also be #' specified. #' } #' pairs_condition <- function(chains = NULL, draws = NULL, nuts = NULL) { .ignore_args <- function(..., why = NULL) { dots <- list(...) nms <- names(dots)[!sapply(dots, is.null)] if (length(nms)) { inform(paste0( "The following specified arguments were ignored by 'pairs_condition' ", "because ", why, ": ", paste(sQuote(nms), collapse = ", ") )) } } .error_duplicate_chains <- function() { abort("Each chain can only be specified once in the 'chains' argument to 'pairs_condition'.") } if (is.null(chains) && is.null(draws) && is.null(nuts)) { # default: half of the chains above diag, half below cond <- list() cond_type <- "default" } else if (!is.null(chains)) { # Using 'chains' argument .ignore_args( draws = draws, nuts = nuts, why = "they are superseded by 'chains'" ) if (is.list(chains)) { # list of two integer vectors, each specifying a subset of the chains stopifnot(length(chains) == 2) chain_vec <- unlist(chains, use.names = FALSE) if (length(chain_vec) != length(unique(chain_vec))) .error_duplicate_chains() cond <- list(upper = as.integer(chains[[1]]), lower = as.integer(chains[[2]])) cond_type <- "chain_list" } else if (is.numeric(chains)) { # single vector specifying a subset of chains stopifnot(NCOL(chains) == 1, all(chains == as.integer(chains))) if (length(chains) != length(unique(chains))) .error_duplicate_chains() cond <- as.integer(chains) cond_type <- "chain_vector" } else { abort(paste( "The 'chains' argument to 'pairs_condition' must be", "an integer vector or a list of two integer vectors." )) } } else if (!is.null(draws)) { # Using 'draws' argument .ignore_args(nuts = nuts, why = "they are superseded by 'draws'") if (is.numeric(draws)) { # proportion of realizations (among all chains) to plot in the lower panel stopifnot(draws > 0 && draws < 1) cond <- draws cond_type <- "draws_proportion" } else if (is.logical(draws)) { # T/F for each iteration to split into upper/lower panels cond <- draws cond_type <- "draws_selection" } else { abort(paste( "The 'draws' argument to 'pairs_condition' must be", "a single proportion or a logical vector." )) } } else { # Using 'nuts' argument if (!is.character(nuts) || length(nuts) > 1) { abort("The 'nuts' argument to 'pairs_condition' must be a single string.") } cond_type <- "nuts" cond <- match.arg(nuts, several.ok = FALSE, choices = c("accept_stat__", "stepsize__", "treedepth__", "n_leapfrog__", "divergent__", "energy__", "lp__")) } structure( cond, class = c(class(cond), "pairs_condition"), type = cond_type # this attribute is used later by handle_condition() ) } # internal ---------------------------------------------------------------- #' @importFrom dplyr pull .mcmc_scatter <- function(x, pars = character(), regex_pars = character(), transformations = list(), hex = FALSE, size = 2.5, alpha = 0.8, bins = 30, binwidth = NULL, np = NULL, np_style = scatter_style_np()) { x <- prepare_mcmc_array(x, pars, regex_pars, transformations) if (num_params(x) != 2) { abort(paste( "For 'mcmc_scatter' and 'mcmc_hex' exactly 2 parameters must be selected.", "'mcmc_pairs' can be used for more than 2 parameters." )) } x <- merge_chains(x) parnames <- colnames(x)[1:2] has_divs <- !is.null(np) xydata <- data.frame(x = c(x[, 1]), y = c(x[, 2])) if (has_divs) { if (hex) { warn("'np' is currently ignored for hex plots.") } stopifnot(inherits(np_style, "nuts_style")) np <- validate_nuts_data_frame(np) param <- sym("Parameter") val <- sym("Value") divg <- sym("Divergent") xydata$Divergent <- np %>% dplyr::filter(UQ(param) == "divergent__") %>% pull(UQ(val)) divdata <- dplyr::filter(xydata, UQ(divg) == 1) xydata <- dplyr::filter(xydata, UQ(divg) == 0) } graph <- ggplot(data = xydata, aes(x = .data$x, y = .data$y)) + bayesplot_theme_get() if (!hex) { # scatterplot graph <- graph + geom_point( shape = 21, color = get_color("dh"), fill = get_color("d"), size = size, alpha = alpha ) if (has_divs) { graph <- graph + geom_point( data = divdata, color = np_style$color[["div"]], size = np_style$size[["div"]], alpha = np_style$alpha[["div"]], shape = np_style$shape[["div"]] ) } } else { # hex binning graph <- graph + geom_hex( aes(fill = scales::rescale(after_stat(density))), bins = bins, binwidth = binwidth ) + scale_fill_gradientn( "Density", colors = unlist(color_scheme_get()), breaks = c(.1, .9), labels = c("low", "high") ) } graph + labs(x = parnames[1], y = parnames[2]) } # internal for mcmc_pairs ------------------------------------------------- #' Get plotting functions from user-specified #' `diag_fun` and `off_diag_fun` arguments #' #' @noRd #' @param x User specified `diag_fun` or `off_diag_fun` argument to `mcmc_pairs()` pairs_plotfun <- function(x) { fun <- paste0("mcmc_", x) utils::getFromNamespace(fun, "bayesplot") } #' Unstack molten data frame #' #' @noRd #' @param df A data frame (from `nuts_params()`, `log_posterior()`, etc) #' @param .form Same as `form` arg to `utils::unstack()` unstack_to_matrix <- function(df, .form) { x <- utils::unstack(df, form = .form) as.matrix(x) } #' Check if off-diagonal plot is above or below the diagonal #' #' @noRd #' @param j integer (index) #' @param n Number of parameters (number of plots = `n^2`) #' @return `TRUE` if below the diagonal, `FALSE` if above the diagonal is_lower_tri <- function(j, n) { idx <- array_idx_j(j, n) lower_tri <- lower_tri_idx(n) row_match_found(idx, lower_tri) } #' Get array indices of the jth element in the plot matrix #' #' @noRd #' @param j integer (index) #' @param n number of parameters (number of plots = n^2) #' @return rwo vector (1-row matrix) containing the array indices of the jth #' element in the plot matrix array_idx_j <- function(j, n) { jj <- matrix(seq_len(n^2), nrow = n, byrow = TRUE)[j] arrayInd(jj, .dim = c(n, n)) } #' Get indices of lower triangular elements of a square matrix #' @noRd #' @param n number of rows (columns) in the square matrix lower_tri_idx <- function(n) { a <- rev(abs(sequence(seq.int(n - 1)) - n) + 1) b <- rep.int(seq.int(n - 1), rev(seq.int(n - 1))) cbind(row = a, col = b) } #' Find which (if any) row in y is a match for x #' @noRd #' @param x a row vector (i.e., a matrix with 1 row) #' @param y a matrix #' @return either a row number in `y` or `NA` if no match row_match_found <- function(x, y) { stopifnot(is.matrix(x), is.matrix(y), nrow(x) == 1) x <- as.data.frame(x) y <- as.data.frame(y) res <- match( do.call(function(...) paste(..., sep=":::"), x), do.call(function(...) paste(..., sep=":::"), y) ) isTRUE(!is.na(res) && length(res) == 1) } #' Drop any constant or duplicate variables #' @noRd #' @param x 3-D array drop_constants_and_duplicates <- function(x) { x2 <- drop_consts(x) x2 <- drop_dupes(x2) class(x2) <- c(class(x2), "mcmc_array") x2 } drop_consts <- function(x) { varying <- apply(x, 3, FUN = function(y) length(unique(c(y))) > 1) if (all(varying)) return(x) warn(paste( "The following parameters were dropped because they are constant:", paste(names(varying)[!varying], collapse = ", ") )) x[, , varying, drop = FALSE] } drop_dupes <- function(x) { dupes <- duplicated(x, MARGIN = 3) if (!any(dupes)) return(x) warn(paste( "The following parameters were dropped because they are duplicative:", paste(parameter_names(x)[dupes], collapse = ", ") )) x[, , !dupes, drop = FALSE] } #' Handle user's specified `condition` #' @noRd #' @param x 3-D mcmc array. #' @param condition Object returned by `pairs_condition()`. #' @param np,lp User-specified arguments to `mcmc_pairs()`. #' @return A named list containing `"x"` (`x`, possibly modified) and `"mark"` #' (logical or interger vector for eventually splitting `x`). handle_condition <- function(x, condition=NULL, np=NULL, lp=NULL) { n_iter <- num_iters(x) n_chain <- num_chains(x) no_np <- is.null(np) no_lp <- is.null(lp) cond_type <- attr(condition, "type") if (cond_type == "default") { k <- ncol(x) %/% 2 mark <- c(rep(FALSE, n_iter * k), rep(TRUE, n_iter * (n_chain - k))) } else if (cond_type == "chain_vector") { x <- x[, condition, , drop = FALSE] k <- ncol(x) %/% 2 n_chain <- length(condition) mark <- c(rep(FALSE, n_iter * k), rep(TRUE, n_iter * (n_chain - k))) } else if (cond_type == "chain_list") { x <- x[, c(condition[[1]], condition[[2]]), , drop = FALSE] k1 <- length(condition[[1]]) k2 <- length(condition[[2]]) mark <- c(rep(TRUE, n_iter * k1), rep(FALSE, n_iter * k2)) } else if (cond_type == "draws_proportion") { mark <- rep(1:n_iter > (condition * n_iter), times = n_chain) } else if (cond_type == "draws_selection") { # T/F for each iteration to split into upper and lower stopifnot(length(condition) == (n_iter * n_chain)) mark <- !condition } else if (cond_type == "nuts") { # NUTS sampler param or lp__ if (no_np && condition != "lp__") abort(paste( "To use this value of 'condition' the 'np' argument", "to 'mcmc_pairs' must also be specified." )) if (condition == "lp__") { if (no_lp) abort(paste( "If 'condition' is 'lp__' then the 'lp' argument", "to 'mcmc_pairs' must also be specified." )) mark <- unstack_to_matrix(lp, Value ~ Chain) } else { param <- sym("Parameter") mark <- dplyr::filter(np, UQ(param) == condition) mark <- unstack_to_matrix(mark, Value ~ Chain) } if (condition == "divergent__") { mark <- as.logical(mark) } else { mark <- c(mark) >= median(mark) } if (length(unique(mark)) == 1) abort(paste(condition, "is constant so it cannot be used as a condition.")) } list(x = x, mark = mark) } #' Apply scale_color_manual and scale_size_manual if plotting divergences and #' hitting max_treedepth #' #' @noRd #' @param graph ggplot object #' @param np_args list of style arguments returned by `pairs_style_np()` #' @return `graph`, updated format_nuts_points <- function(graph, np_args) { graph + scale_color_manual( values = set_names(c(NA, np_args$color[["div"]], NA, np_args$color[["td"]]), c("NoDiv", "Div", "NoHit", "Hit")) ) + scale_size_manual( values = set_names(c(NA, rel(np_args$size[["div"]]), NA, rel(np_args$size[["td"]])), c("NoDiv", "Div", "NoHit", "Hit")) ) } bayesplot/R/ppd-intervals.R0000644000176200001440000002176214335264324015406 0ustar liggesusers#' PPD intervals #' #' Medians and central interval estimates of posterior or prior predictive #' distributions. Each of these functions makes the same plot as the #' corresponding [`ppc_`][PPC-intervals] function but without plotting any #' observed data `y`. The **Plot Descriptions** section at [PPC-intervals] has #' details on the individual plots. #' #' @name PPD-intervals #' @family PPDs #' #' @template args-ypred #' @inheritParams PPC-intervals #' #' @template return-ggplot-or-data #' #' @template reference-vis-paper #' #' @examples #' color_scheme_set("brightblue") #' ypred <- example_yrep_draws() #' x <- example_x_data() #' group <- example_group_data() #' #' ppd_intervals(ypred[, 1:50]) #' ppd_intervals(ypred[, 1:50], fatten = 0) #' ppd_intervals(ypred[, 1:50], fatten = 0, linewidth = 2) #' ppd_intervals(ypred[, 1:50], prob_outer = 0.75, fatten = 0, linewidth = 2) #' #' # put a predictor variable on the x-axis #' ppd_intervals(ypred[, 1:100], x = x[1:100], fatten = 1) + #' ggplot2::labs(y = "Prediction", x = "Some variable of interest") #' #' # with a grouping variable too #' ppd_intervals_grouped( #' ypred = ypred[, 1:100], #' x = x[1:100], #' group = group[1:100], #' size = 2, #' fatten = 0, #' facet_args = list(nrow = 2) #' ) #' #' # even reducing size, ppd_intervals is too cluttered when there are many #' # observations included (ppd_ribbon is better) #' ppd_intervals(ypred, size = 0.5, fatten = 0.1, linewidth = 0.5) #' ppd_ribbon(ypred) #' ppd_ribbon(ypred, size = 0) # remove line showing median prediction #' NULL #' @rdname PPD-intervals #' @export ppd_intervals <- function(ypred, x = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 1, fatten = 2.5, linewidth = 1) { dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppd_intervals_data( ypred = ypred, x = x, group = dots$group, prob = prob, prob_outer = prob_outer ) ggplot(data, mapping = intervals_inner_aes( needs_y = TRUE, color = "ypred", fill = "ypred" )) + geom_linerange( mapping = intervals_outer_aes(color = "ypred"), alpha = alpha, size = size, linewidth = linewidth ) + geom_pointrange( shape = 21, stroke = 0.5, size = size, fatten = fatten, linewidth = linewidth ) + scale_color_ppd() + scale_fill_ppd() + intervals_axis_labels(has_x = !is.null(x)) + bayesplot_theme_get() + legend_none() } #' @rdname PPD-intervals #' @export ppd_intervals_grouped <- function(ypred, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 1, fatten = 2.5, linewidth = 1) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppd_intervals", call), parent.frame()) g + intervals_group_facets(facet_args) + force_axes_in_facets() } #' @rdname PPD-intervals #' @export ppd_ribbon <- function(ypred, x = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25) { dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppd_intervals_data( ypred = ypred, x = x, group = dots$group, prob = prob, prob_outer = prob_outer ) ggplot(data, mapping = intervals_inner_aes(color = "ypred", fill = "ypred")) + geom_ribbon( mapping = intervals_outer_aes(fill = "ypred", color = "ypred"), color = NA, size = 0.2 * size, alpha = alpha ) + geom_ribbon( mapping = intervals_outer_aes(), fill = NA, color = get_color("mh"), size = 0.2 * size, alpha = 1 ) + geom_ribbon(size = 0.5 * size) + geom_line( mapping = aes(y = .data$m), color = get_color("d"), linewidth = size ) + scale_color_ppd() + scale_fill_ppd() + intervals_axis_labels(has_x = !is.null(x)) + bayesplot_theme_get() + legend_none() } #' @export #' @rdname PPD-intervals ppd_ribbon_grouped <- function(ypred, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppd_ribbon", call), parent.frame()) g + intervals_group_facets(facet_args) + force_axes_in_facets() } #' @rdname PPD-intervals #' @export ppd_intervals_data <- function(ypred, x = NULL, group = NULL, ..., prob = 0.5, prob_outer = 0.9) { check_ignored_arguments(...) ypred <- validate_predictions(ypred) x <- validate_x(x, ypred[1,]) if (!is.null(group)) { group <- validate_group(group, ncol(ypred)) } .ppd_intervals_data( predictions = ypred, y = NULL, x = x, group = group, prob = prob, prob_outer = prob_outer ) } #' @rdname PPD-intervals #' @export ppd_ribbon_data <- ppd_intervals_data # internal ---------------------------------------------------------------- #' Back end for both `ppd_intervals_data()` and `ppc_intervals_data()` #' #' @noRd #' @param predictions SxN matrix of predictions (`ypred` or `yrep`) already validated. #' @param y `NULL` or user's `y` argument already validated. #' @param group `NULL` or user's `group` argument, already validated. #' @param x User's `x` argument, already validated. #' @return A molten data frame of prediction intervals, possibly including `y`. #' #' @importFrom dplyr group_by ungroup summarise .ppd_intervals_data <- function(predictions, y = NULL, x = NULL, group = NULL, prob, prob_outer) { stopifnot(prob > 0 && prob < 1) stopifnot(prob_outer > 0 && prob_outer <= 1) probs <- sort(c(prob, prob_outer)) prob <- probs[1] prob_outer <- probs[2] alpha <- (1 - probs) / 2 probs <- sort(c(alpha, 0.5, 1 - alpha)) has_group <- !is.null(group) has_y <- !is.null(y) has_x <- !is.null(x) long_d <- melt_predictions(predictions) if (has_y) { long_d$y_obs <- y[long_d$y_id] } if (!has_x) { x <- seq_len(ncol(predictions)) } long_d$x <- x[long_d$y_id] if (has_group) { long_d$group <- group[long_d$y_id] } group_by_vars <- syms(c("y_id", if (has_y) "y_obs", if (has_group) "group", "x")) long_d %>% group_by(!!!group_by_vars) %>% summarise( outer_width = prob_outer, inner_width = prob, ll = unname(quantile(.data$value, probs = probs[1])), l = unname(quantile(.data$value, probs = probs[2])), m = unname(quantile(.data$value, probs = probs[3])), h = unname(quantile(.data$value, probs = probs[4])), hh = unname(quantile(.data$value, probs = probs[5])) ) %>% ungroup() } #' Aesthetic mapping for interval and ribbon plots #' #' @param needs_y Whether to include `y` in call to `aes()`. Needed for #' `geom_pointrange()`. #' @param ... Aguments to pass to `aes()` other than `x`,`y`,`ymin`,`ymax`. #' @return Object returned by `aes()`. Always sets at least `x`, `ymin`, `ymax`. #' @noRd intervals_inner_aes <- function(needs_y = FALSE, ...) { mapping <- aes( x = .data$x, ymin = .data$l, ymax = .data$h, ... ) if (!needs_y) { return(mapping) } modify_aes(mapping, y = .data$m) } intervals_outer_aes <- function(needs_y = FALSE, ...) { mapping <- aes( x = .data$x, ymin = .data$ll, ymax = .data$hh, ... ) if (!needs_y) { return(mapping) } modify_aes(mapping, y = .data$m) } #' Create the facet layer for grouped interval and ribbon plots #' #' @param facet_args User's `facet_args` argument. #' @param scales_default String to use for `scales` argument to `facet_wrap()` #' if not specified by user. Defaults to `"free"`, unlike `facet_wrap()`. #' @return Object returned by `facet_wrap()`. #' @noRd intervals_group_facets <- function(facet_args, scales_default = "free") { facet_args[["facets"]] <- "group" facet_args[["scales"]] <- facet_args[["scales"]] %||% scales_default do.call("facet_wrap", facet_args) } #' Set the axis labels for interval and ribbon plots #' #' @param has_x Did the user provide an `x` argument (T/F)? #' @return Object returned by `labs()`. The y-axis label is `NULL` and x-axis #' label is either 'x' or 'Index' depending on whether the user supplied `x`. #' @noRd intervals_axis_labels <- function(has_x) { labs( x = if (has_x) expression(italic(x)) else "Data point (index)", y = NULL ) } bayesplot/R/sysdata.rda0000644000176200001440000622703314556270424014643 0ustar liggesusersBZh91AY&SY6ZN>;1}p< nwy\{{es<ǽu}ۗ}vm=ZGv{vww{N7лpgyn[;ҭڶZwg{+KEs{zݻ筷sRzշjKn{o0z;k{uMyܻn經mIxe{nݶ^U閽׸ֽ=Ql]{3Yu:7^oNwiY5A۷{]Qa^gqlkv{;mu G=n{nnno{Sݴ޲<,[-f]S77 ٭ n̮]s{ji庺۵ռw^wf9r=s\=l+Iz](4<5km\i˫{׺<{ݽ^Yιy[VZrT:=u׷wg@uۻۯn#=VfֶImm{{ۯˉ]Fxܷ5y{ƭ՗m׷v:{os<}q7=lU޾犠=甆ic϶}^^]ww{n{we{ï+tkݷnq{-v՞ڧvvuw׻V;v3{WyGa׶J{{ݽMktu7Td{]{^k{ۺ<]jqkm7on4lvӑn{Q::WW{mVGvw{޶^޶$ޯngv.{׋㷻ޣBNATom8uvt`{ec95׭=jYn4뽯M{2Lh5^֔uFk{) u4(U n]w^+Wm(="4wfu]:2ݯY绚u[mJh)@FQ],Fw ۧnq ؽO^ƞuWvu:ݹ`ƋiO Sl=dA=Nso[ʛwn꺑:^h=SmMeŪ+\TX lGqݩVKXU+Y4y]v^ǣ Wi)VӷuyW;vWAEQFӸ۽orm`ݬ4-gZmc{t{^՛m:s+v;YB9빭lmkr֚hKOONu@mhvmƻ6tWӽzvl{o;fiw[ i]Suvnv֞$Qlg]ݻcv^ӕ7`UltMۻ۹k2W]ivZ w^ T]$w{wKaӹlMG{oYZ [w W5S@}vv\ܽtn׽wy֞׮lιz;kwo4;WM9gs׷x{o^]y޵ww5K5y=Sץw{׍W]n]=Cw9g^R5xZM ^jPt{(JQW(>EHx@}@.ޏɸ7F;e `w.ݽ8px'޽{p}C ^xow <w˫ _wt1o;=9 ki^ٷwvۮǣǡ#{jm·w\޳j3=ݻ׋6}>WSݾ{׬Emۍ7zucSsuy!]o[Y8Y{u흫;9̯[2ƀ{k=^ww {u={{wW;.*w={ƛw=<ƞۺMvIsk3秉#Zj]tҏJ]{ۻVWZJv9 o=r^=insٷt]ezM7;ֶu{zwnޭx'l=v.z/{z׶Weݫv]xzf4=ӚuM{.rֽ=^f׼kwmͶ{wǬշ-{׽';'SRrj9j^ٻ[WB5]/X # u; &We3iw>̑.1//$dycchj <;`7w(<M8 ViTD=1!^%'O>rZf2=8%idL AR*gd][XF| JF**[0UNxYj.CWXU'HXcjQ:ajS9N\Sì ζR2W0 5PDQUB㒖:L@ȪEӋ[:>ZӃ > & -w}gJ^{`8h줏?pwړppD _t{Fnlߑ:K\^+PH;ah eZM׹,D#$_ 1~\}̀\`\>ڦH߿`$\gO$U>ښ'Z ?DX }4ASa m*ijI-Z|1N9eGu ćSirYUiS' ,̗.}|@ͰJ9h(whfV]+b*FAVcNP@nx9dqQS-Hq5E~-Cx> dDoqSk6MJ=]Z9H*\$TFa,I-m7jD+Xi#lvX&trwM>Qg;dc?aA=y@ae\}wfmkEFEtxƕrYD6O !HA%?zA1`S]D4"!*?mHVX Wzt.hnOUt\ }Ugnɗ!X:պ`1=b LTELkj0+H]M6\Y+nUH)y]"|g;6Q2USMR'Uz9x&JD𸫴C8|ۈ0RcR:z;ՓRSfZ<`DZ6C'ٟI2GlCІ Ւǝ ` 0]D?}%=MlC { "!xNT`9v]UrBNp Gy=%ԑ{OҩH+ڨ}9TW@bJa~'&Fh+P-L$%6#=ߕ(=kdzB:E9 TT 'jEr&Q-)A;dD!W&BI.fW@ۨ<&+FracMV}Q)yTt]atXzZ VujHCV'=a N&jUnM;Ox@\I)@ꅠAb7BulorH<r{f7{ͿvǸ$鷇rу2ߑ$JdkYN*Up#:$w "_q&`G:4`؅ZQ9 ;6nҔ}b7`9kqO`:w3ۼ3J($ %D2ʘ dJ&]ܜ6zU@1@!}?hʧ"L=g|Ć/p3->пby#d/(i*=nJ^Bİ@ٟ0l(Tmi mUU%D?eI! gzX0iH$7FDovMLf.^07mVCN 9TZߨ1!6Q69хfsbGD{1jn%i!Xq?GU݊;E x k{Qb3VJDl~~gye@OtˬJ[^ⷾ$v g-$ﭦ|1Kv+-o-m?0}NzӊDת.#io0gѠ-mwqX!b<//M[Х65Rt n\.EYm<*W!ID0>wcɛQP280AbX{G2ecyvoȍp"ҁ^rIM.y<Rd^첆UhPp)E6;Yb͎0MxTp+[qʨ|Oj+ _؋ڙprGHKu}z4X[q8q)EN3u*gzE^< =8| ʪE&GNIoЈW|i$}QI G~6B6~>qcE(s#]PIdR[) aj^Mxū?"/h[OƤUFt2kwiK]pE-Y5>s7SܭR%;3;ϫ!X-cQA$.D\@6@^bXN֕A܄y͞K%zҾ ?_船Y$Π8!0K)" 1H0s(DW/E0\Ɋ˘㯟uf.nj!tJI,NT<%Qַ*l'ޢF䘸EJE?BL/X沢@TA9jtٿQ,#|M >{t{ÄxR"]ho'Q"p™<0ivXbq'M*$s8D8@,&4VػzE9|/̼H9gyU =B'Q ؿ`.3!Cn%ª]W!˜I!0+/m@GEY|w|]rue;暔"+c"wbe(.IMVm&N?pϛi(Rlt5 eP4@օ> o9M2-OV3Al|/ %dĞTHE,-H֩cwwÔ /$i$KQOe ixuO嚱O %8jEA5a,g.JtNϱYAy̦rFO@VjW2A,PEinZFq bnJ#']l$eMxJ8>Q; tT&4}s1*QOBIjW3oeiC븨|>j;uw)DT[{BҺ=* SxN GA@ tgo^<3WN'w[4b8ԸRM,JA&_0ѭ_2kuBA$J %XT(/^N̯ԫv ;jkpy)<yOV N-*4Rto )r- v0滙ҕJX n=EGTӈ%ei׬}㱧RT- /wڴ$t">rԝR# 1InLia݂<ŏ);MSZ1s ie1җgԸg hP`( `?c,òן$pg/ P#yፗ)*kqzZ+nSaWjaHgʁr_g]sMAC(B7 %=Z c!" !fJCX:Wwjw@B{2?aJbNGmF$ P^r{vM3oP2/Ѳʥ kDB&|׭Jtc2ՓOMD%5/zmߋZmѕTѳ$ b@57Mds0ccHVu"z(u`rRi J Kn 5}DR|&E' lj}0j> $0S7 ېʔ m,\+UqiN}4+75bQ~-]sFD^LQOPt\܌ ~.j9nSQ(LZ.Jϳ?=2Y19hn|f &ö' 1G8 e2l( Їd*-ÎY~[>˫#wz.Fʼz'NfSzݹN)-b;uxO jm/ꝨCNu5ćՐ cVO8986b7z+'poA!RE 1S+F$nJHN.ĸH<)}E1G>V!ǘo %ېJ1#{ɚ wAtN (O#i6v@'bHӞ R5~piSleTZgyoE~7T2 UE?Q|;,U%"Za>Z^!+[. 3_M +Z Mⲥӓo> % A]pH@͓fUh&nM;=b_Q"CĮaT4P}ϥb֋U!!)׶5T}|V|^ZLK!e[@ 5!y_O*WѾ1:>3^RlsT/ݵ#S,c_=TN'wa5By S z{5w܎xQfNTߋf.z7txQVW:΀Cᤉ!\Q`}K6oa: Auۆ.L4mqf\Q8Ui4jNP>}KNzXQkKmX:7M>2|O%ů}Vwa8H/RAuOx>aa/]Sy2s9^3:>tޝFЭt$a'PiCۡP\mh& #i G32dXA?'JWoŸAP* h I5 3Y#Eͱ]f՟Rzlasd\A?c)^hd$(3jCHiR xʎfxNQxsw{a6gJ[9BiG@6a4Eegl! vZki :bNzBD">o6}?[Vr TaS_jO Kk YEh6fu{-=YyPv6Ix,Z3 *SJy®HE!2=x[L9$5N @vN_PgA< %3YOOYT(=R'7X.B*pT&:"D Lm`XPW-(; ZÝ 6T\V۹O6H27JlgYv_ȠsY&3;zAޅg6Fn_E L6`2{۠vD[KLns(4]~Hp %Ù lby9,Fgg蝾eԀ5Tt  6h@$nu ѼyTUrq,!>B٫:9e B n8lF _;˰/񢂒.ayƊzjc VNX"+OM}@ T/n\UR zHCwbٯ7`x28\+oHqj ZPd Hak{Ikyk*QHڦ%n$0AB'eDߤzV{I ¬:( N{9zu%DSx27ki7'!}%:EK["E,_|dž`sXE԰vv/_ f'p\/ramMGɕ:D]!A[֏R\G;H)Z;)~XJaOBIY#ڭ8D0_ec諪Ϲ|j; Z,FC`)=>TU b'61/%O',6(t6[eFu3%z/zGn}PpFOUӓՂK F Fy^[z~)>?5lK |&՗*=D̲j NaoԐ]VM͔jy4$%j6&jToSex7pDeQA|PyM41zpr-91ց>IcUΡ^6YG?tjJ;z=v|,9⍴ۿ *J*Iv>^YFyV[:A~4KI:|G@xm\,zfTQgR$K'.!ԭ0aY$&2☽s˿JaZTF lhgX3l&j9 {7Af}+8cY.C?Ж$׫]{@^ѭzeA}*Ue+ c!dXG:ﵖkMeqk^XHS5%c/T@{n釁rs"%S؋ csty(rS٭vŤ3݀+2EƍxdvўOGyʂ\YwB;"%`{'hz$;,9VIPdBI@pbo GE#U3<*NwǮlDG-by× _ 8_0B G=P=li䞒1!6QVh\C>lMTGHm?7ݧКŊ+pFFPj('7iأ/!N{@REXa|tx1Zyg9iT=#kD9rGv7# D;^%OBrCk͗#{Y}~ٖi^(3>f\n\;!H ko\=w>*wUu8ӥU>d 1! UA'!`a)(dM"8k6|$9ǣ$$쀿wf5"@ozX sApq-YFJXd^Kd+^!_N,5=W1ʨl.䏖/W5D\* kL. {mCc{J|fɷ:v1gI恑{)(yMzkUFbm Ar$=n\[y2Ae bUܵigqpQ}d]k^Z)Iv\))9F6T~ƈ_R[ε.[>@fJE)D-XXvH|@!*q_|su7VhnON%V&);qҖlˎ$#HD{ `;:5рaC`Y̦95Y¤h9L1{ŀ)?8m*vnk}Yֺ4]xLܟp@ⰉQ[%fmխf| j6]_c2`aZO̥Z+xHRM=v_o"y@olv462/^i~Ã"\/7o4x/4)o 7zE&wbL4~0& )۔/!ofǩ7=r5f Q.$e sZ;hE侐]8|۷3͆7k^Ł2kXzo[[ì]'vP˄1=u0NwLj4'/8ʤoi<_PՅUSG2?e*9WJ?Oݭp,PEܺ+qpR̡vǫ)I7FB a;(Thܺkf0\0]e|O#шbhL{ t8l=NNsNMԟa;0Y)$={F@Ln%oGFpvWV?f=^% .Hrl'-\IlP&BX*Ef#n"p^Ȓoj~i>7L!<\RO^;S!%6g;x5~֑P|XnL{2 `8E,P<0 8\).@BJqRMD΅6Ky8nt`8 R8[Inz?e]U\ 5RRؓ'=ѽ7Զ??:3^Mހ\YVl*)ҥձے>ܟŠ'X&OD% I/}yfǢPfT%[K AT@SgM?x«)Ւar:K `xdFޓ3t3;(QUGlntq<}E&f&AIGeDKcR B+b:sÌ"lێI%8>J?8?AUԂA!Cu2&>!*h)8].uPjXfsF'iPazXQe_C/%Х^^}m 9`EH-d(db-w% jOO=@1bVhe$ƫ̌-VB|0`_+p 䕿F9UW=VGa¬n'MtNDSE( TSӐ1y/SjnAݯe[ ȩ/)-9̤ښu9#s/E5[Q=}}niΡ^H | 'Ο( B+ٽg zclpC á.>)q{r V{>A7}?0iwThǗ7|\nZ6qN#R-ZMXw=O u45c/ӜE Mz*Q_rTGFX<ڔ}hf*(2Ei.֋MӺlA?VLޚ o%BIxτ,niHyXʡS־}nUt[a3-lȅ}df*A~' L`ޘӗ+,8DӤG _Nӑ90^1cz3Fь䋞tQ\5q6䁗}/ԶkcAP$AX~D61K}6 >4]V5V-4s+>Gse 4X`)"<]+/)Aq)u7,bI @ sS-[úGS( tJ/HݾYgd.5{1

Q*r.{ AII 3| 06){e~83uқ@y$ d`±OnUa^;0;:ظJ SN_ V 72K$oz1Q UCM [g[>jVW#6"fRS 4TReWY}_'$X:`ϐPEh(WE*+{tR8XKaT-!`[[򥮜iK ʕ9)yad:-: =,8Ieslz &ayAlWMUt3r|;D3[-+(~ڶv$5+Ь|ɣS濙m'(d=bx_`'p+r,Bfύ,عqY[7$VAM[($i,Xi=.C*snj*L3Ud.)9Co[d˖2|Koh(?R%VI ę!= #)U2͸H"sLA6d6]'edTU =U>xV,\(fo9pD@8J5&s;_zLZx,ݴ68Ҙ ֹ0_f] qb6:+ q0}~Ym SѢvI7w 'qAU7,R늘q *˲u\%Rb0sO? OAOtp+W7ۅ| ;!QR[5S*q-dJP1ZGZ[hGb;i82TZxmt)̇l]а Lg|[5)FA82z&SKһ2fL_r1$< N%_F~{`< ?3NYGE=/OѝX4W^L~1~}#2ٻq݄J ,_@pP!v2&$NRU5Y-~jo֯heUpKDL.}멍IlPHC~J/ ʤ~'s-&&y;G9{0Ԩ(5V+X+"4`l3}'W‹CfJ]4(0Nb}(|1kBY;A=nڎMX۞Ӱ8k~;N!2*V<˄HԼW/hA촰Kh>2 O##%(֨9$UukIrNeJYhFfd Jqƺ#fNTq^H|Z8.< XxDa(mG() ql!C<?A: +1tM2U1PoxϞ곴GC=x6ytc2χx(W*YrXjL3UFHR.%]l0[&'=O>6,ޥ̽c~B[aV]gG=y DCu{ Y 6&iJ8@zfa!%*\qjY饿CX/PRMlJ12ʈ? %[$8G6'GLntn^6_D]^zIualÅ{Y)ڦ:.uLEdg|eZcpn.{ +^-s\&Š4/s%. 2z r*ȁO2PS+N=pK Z)cm?tʉr?w 4C Tu0)\ R>_قt.ښUQu?J\#0BgIC) u&JY^mTsqGzOK!u,Ÿk[VdlRiېt9@ c]OqCBPd&z `úpfw,~uKJQDҲKO?NgHřzg%EL޵&sebg( PApE-A"._c_H?-&YP[TGwYD{r%8,'3)uN2jy P 䒙?%;$<n >&G#YK9[ňs|lQF}1Yf Rđl9tdTtJ=t.[r[WezG*.؜h6d?:."V ]4,Z3QZOE( }ntۺ2EVZ !N8Azn}q!,zӇR&f;o8 #(!gS} (#߿-sDkp 1W*ڥa%,fPeD+רJ\}͸ǘ-.2ZA|x'WrmʴhܳYɰ}2H?RHCXnN9کA%l ~Q._4@JӏzPpТ8S>g+L$j*)X՘ 檐-5q42a$_ʨia`Ι*XW P[XKEYy:F;D4aw)A D9&$[23*fFĦK˷O0 $O*]+*kƑ (ZmHf*I~[,L$"R<ĵhF( KxJ2n B#]iv{ ϐ9[aoʨH/>ӊp2:$ [R畽)̭jt'_uS4bVHT378Aߪc$kaȢWn9s%L<_`O.H5pZ#FɼAÒ%1/l#EoښM1wvfi^BN>03clb@G22 2>DFo)@uAV MZ}P X| QS{gBr'ZP7͎>T9O>Ӱ.M44\q@ܾ!{6op37%fr]؋vma2u5n7m&EQ[XqKnIQ+{EUҿ)JP t@ǵ;Wo\>thy'Wsr /, b]/<9OhHxKƸPƈAh-DXD-b؊ (yJ h]'Ϣl{L3R y3Gh03DM+p^Mu}@1*i2lFpi{!tk@3&VyN|4#rs;i|>N(v%+*|\?P!OaʷO]nUJ^ >uQnbA w տC zy]p$ P9M6B!qc4c+ Эj,ctOۙPp"^kU7^yVUDDAr8qiܹ[.K2G5Bz)zOzoyw)bn>*1wik-~&E6a+cB"2YTĭޘ 9em^rTSHƅiIR-cvrB^+ ?<;0 ;𾡎4~ WĂ( yec;B; ~cXu5+דgL,&o G0gdYW J7hPZ joߓ g}C$Fc!7iyUjD_. #X*/0r^. SY` ?D?;鶍Lp@pL[}3F.X$kAa,uЕs(lz>bCUÛZE17{u }Dl" -M|IU)`&t4щ+ H*m&Ad=^H'AFCiH m!?IQ#F/2;"o82ȁ$}rق#ۚO3j֫V~FוIҞw1W'T+B&ӬtFm]=Pi,%[5+L{3.5g" 䉼;膻^e!LY2U6$4EsUm\N7}&r?5)5%L)>Hw?WзHr\LHnvtDNAjt/#`tiUF*XսVDUdð2)xHߴ ]qL9;Wж"TCL m*>_g+^B[ ̵CLZKӳ`P 6T%iO 3FWE'6#AX @m$N1&9m%RA5bBF(*µ4- }AmW3\ IF #H7liE *<^nSnis|٢ ItniANyIpr,:Dt&^LN\<ݩzh Jn{Τ tc#"k*Vy`d3=ſJvg7#Gj䂡S}d1G 4i >' sϫ_ F+UQq^AH<MxlVh1Nܐ6l);0 پ}"%>Zf} ~n== d AoLMg)U{ ^lɢ̽<6v@gL[=4MA #'b[q(QsuO E54LC}c';Jue0x4H#>_x[ {pMfF,V6 U 4~PL2RC,;qZ/7Aɻ*`GNǺE3]ˋ"Y]!W J}LiOwXV 狒kZu{,z[#-Yű^!+P0%6"q>vȢ[י N+E 5n[YRԧ,7`N1| xe[5-3:Ymql^ 9]}H^0fKQbX\%I9SaФgge9ULZ379 O-} uj+t;MAiuꏅT{HWF}nd89~};۾}aꡡ2 7nLE.Hqht׹+7zdh'Lazo59].e`4:pA Ӗ*8nTdģƫj/IGVP)n).KPY+߭?;21ְ: /u VNU1 /@㸀{~; Rjy\"A"q8er=ۀG Vt!HRWtG,m- V꥕WlYwVČ4 Ig}>ONݨB`s(,VU>ҡ:Z]#.Bn.sE*X^=_蔃 JtP`Q ɓvYAB7d Vأ9 V9?,  wYlg1Θn  B6!f\ HiM'f}^! :/:x 4s =0Nw} ,[ҢK.o}P>ZdF͛SIA-&TrOꇜ7}ƿQsOzd؛aτʪk9'Ӓ+ z=fJ7 f6&\%jb#t>ؚ(![ˁ[V| f\yvxaA9+1b(X9āci\&xbiȬs׈ܾq@N_.&+\!-mW&"4l}VAs;Z<c%"0雞/(a@[ہܲ*^HkI^/ip{ʉJdc SGÛ V ֤% Q"z'+|2KCjX3[h!A*9:x^_B}'~cw_$͔fi|-ʺ89gCIU7I j>5b~k0jASn pr/ޘwiƁANRv@|-_,bFs 2>?q: r@ '2k+U=jvXN4ؑ䱢W9V [HGGfT} ~jO"9#I/8Nq9l+q͇XsCGտi|!}H>E/4 - &)OD@{{ / Kx: 3Eh L%ڏ77e/Tn L0b[?,H:xպWWuy8l3x훪V_ &?G +dgvt$T5l>T~T(CYeeQTu&,O>QQ3$ἨJ'e)I(KC;ɆZoN]W^9>2AL"<#{I>Xj@[RGw@s?d•b *I!ƅF=^Zk(9w$ȹ.N92ƍRhn[F x=^j|Y]M$Jf{]GD"cd]j](:4~7s!;266vN9q~ Zu!A!OB9 ph S_eb֏!ZbŸ^/_oF Y"vmx>$ɘ %~b*I_>30K^eY=-X%\@{wYuՅOV%鶲]pB\n=iSFov [S2ctђ"p 2I/zڭ ΁8у(4&h!k ޲B,V.H~p.Xn \X ާW*z:2jN@F.$) F¥R]b/\oE=z%j۰,,2;qaۑE,LbglK[P+2-2]Ti"qi&WD{G"jWw4A!w:MY p~N/^.# p;Ќ~C 7H376ngfύHZA"=MUQiKUxFOVKg7JYB/#+":s6e*m7GNb'eґvJATY ?@XzK1YJca$ ~o@ I]R$s0x}xc48 "yK@=G%PpY?AtqRz>O^qj_CvRn>) RU$=)P˶Ajq (f2[j3u6 ?_9T-قt?B^$ UmP}=t} B6",?Y!g|W&|{D'E0F9w]eKp? h^85,% CyGnsj-{ۡF 0~:N%Wc֙齋cXc,)Ƚ \9qUa-)'@~;]ӹRr+ y N9hF. [Uly1"LoY~a{7pJb}C96Phj$UT %`v XY;c忿r(XA ;5Joɴ&O=nrrϙ;5ؘ2 qLc]Ydԍt$,4kl+tHRO[̌Cչ# 6a)S4^} |ZD:}`,6Mט(4GS6ܘ=αv4koCk/9GV5iP9>^ ʍ@M[ؗv Xl* >=hMj $`+v#(xx*^ۍKrsݘNq.?Ը(h Q +Q%}H -DV~ ~ul!$< N 3(oTɏ0ݛHA}#A6wLQ@X^'oF E+"L+RѡbU8A$=ya Nk"fZv=\"^MxXeH2`k) AB╾ ߰$owUEBaf*}qeׇ֮oSXl }i,n/&y?ŠlwX }8(?J.)sQ>q.NB_: " WAw,h5ӎvU!ϻ"w Z;Ÿ6Z5ruRrrtUˣ^E6$}1[ֆ#.| |Hf“*Z|[3rWsژNe~SwA_[8EUBt 98A:3p(,>$X"ƸP)@/(Mӂ@OӡU7ӗ'1m*ӫ PDp *}< a5p=s x:Vy+p%&YD:j gF΂m>2.Qc#_']䍪 2}MHCGQyhhh jlֳ1 8=T_,GUEǪe**C@}m0&?>#$X]| FF}Ԩ'5 3Vk:b%e5]1-̟L]/nŒ0ۻZe &ly//ѨcF/>WGv-<6~ o?L~Ivk! scPl5i`+kŭ1 ~ArzFzM"'d:=4y5ŁvIuES6Go3fur{!n)| ~:L"y.bWVFX(妇y~oc\.CɻfC:8^9W=eѫ˪~ɜ@}F&{{>:fwuHKgU%x\ b|ZcDh=W-o:$(` ͻ#srM"e&裁%w8,|xNcNW oKgb.'*80\X]J9Zc\8GfmfNd&MX`;yV~U Xc}D Hs k!EװF#y, eQSoΤE!.TQ0!|TGBP>i*3Ӝ}᎓Zf=?;9>hZ:'wxk!A-ڭa89IWc'ɜgEҌ菍- VOm$i҅)Ȭ[\8}aS:~V ݺr*03*=nqnf-SN=u5RņcJw`b˹PO FF;_.2C]NPŪlq%ѡ֌:[v ,!b9bm)JN9*X=ps<^%D4|VW1/y Y]"7'mr(9;`#H=_3'߆{pE7O={p&sº;8D퉒w |M.&d}{8?e$Ӱ#hUS9W(ס!u喹$k!2rO+̪D3Zz׫kX 8P0E{gtR橶,u;&Q8Q~UM.bQO8Z LiYp!6Kn+Tp!XV}P84nr^ѓhL'<+NA(..z<XkM4i:pr.K˜ i4N_`!iߎ)|yCKx#Aedh:+aޅxya$+&5',7ew]y93S)U?a&d:6 $-+)WvHI]Zw-ϛ+n2mxbd!r$Gwiƌ&tկ 4]uu j&~M(3L=: ,G=k,AJm[.tZsU7I'qD)F%WxxOwc3٤ePϊs#~# 6b͜mo ~kh{ K@_%lߙނ.Pwq[i*) |[AmYtz|8%o0;WXllTVxհ]v30RI\N"~$ f`@I3@T9p >JA>5m8n`rkۡCTi82 SDp>WWl{3kl <ëYZbWbMv*h;}x<0l B?tcH@#"RrbZQ =~h`dK؋2Q8.uhmC eʅC0BخLf y³9L9cER続xGKS G+G3i02w. Yavȗby!X;qhR&&h_fūGVyb {õW]m)H ҭͭ!^Andot{*Ŝ s[X+_LbǽNH?΄.9EX1\࢑H|U>_raCyڅeW2w<FTbHc͗i_B;::'N^!3v1&RA *PQBkgJZΆ]ևѹG1(g>_YRF :I.RVʏ!j*+Jwo$~( [AJY inK'wxζh`i6 $ \e *ɵ:/6l;8P?v/M][*z ٌ)MoM沊Һdw {LuJZ>k^"$\_A4~X/FQrr\#Yhxuq}[@\aס6D-(%Z38Q$+z.{zi5ؚDʊyWkGnٰEah=:2R Hlpq l`.)Ыx55[#YhRo92~B=[Ӂݽ&:}_W,aVu$lr·sZou 0(]^Y^/Nojݦ{ԔMYF' P41.`]fXwj S6PZWߣ1y!olJ\E=.̘r$܌֣xe9;lLwAt`$6 }z"W:ۢg-]L(J/gѕ|ii*LtȺL4wB $/Riݒ~m ~\~λ*-TX "RĝrA,ڣCce6+YxQE-&DJf=SD"Jp@25› ҩ \_wvs]AgK]B~(hb!Y4/hOR'c4pop8nBVe (@_3  >F5IL9G.dB|(/ $r J{$lN '0 *b(lqjθYH?h oHx 7b{Zi ñԴL!X3r {)(R;\em]j;Ah D%گZ2\愒| U9~ =0T0X9Wݿcm>ew[Ï yI(T` ۖeEbz5vaWV7T^r6{}8a#vNayu^lqP;$SCNyQ tY!DH#J`\L K$@#AdJPziiwr*з1E=yC(?S^=J P1|9}p7QwO wR#]݊$"&Dt`8"D}\OEJPg\lܒ(4'bóDGrRtit˼ݫДA\^l3Wې{%wCA\!Į{L#&B?٫+gtbK4t 0Q0#h%{Bha~ *?ԕaH 6k8 O@ӳGitWδK"R(_=;߽_08/<});<ګ7U,LxY$Œ{I[f$Ap3-3wTm a',in_!T ‰?T7BojɊ '!0NTRi~?QA1Y<EyM1& 3`P1Ƃ} UU V ROϣI# uw1 06$kHB(F YH&7=5(Q7xPwO]HO:Z:%i BYqMDΆ$|Diy0hB%kߊ^M mǑuE 0`nr,l)ͮz@O'"cC^|* 6f9+oϵ.mZ]`qMVk8; ;,ޭĴOxm9RCHF+qx@LpmPGm7CS khȼ "%$$b(ØREɻ!w)9]Rʗe{PBA'5?O'F'[D>~>t^M^m LzjkY:%E~7:Dv`$Hj @ݻS;p`s.K@Fƍ9+-/Fo$QJ= d.ksY7fq_8GgtX %7 *Zx2vEi# Xyq0(34hͰT#]R:AhV6= l|"&t(t@L̷~, 9Og 9 8]up7DDP40pFQINePeMhYG4} t@c ߜCP}vU X=j1L]>k6괬ί4PN%2{]~rf &v]Cy^I& F ~e>z=u*)( ~~ɬQx ]5rcJV/򭊉 4$a޹ R~foOK.5[f-s[(ɳL,PjYjݒeW& 9G+")*r0kBGJSIv{qcS}n_G;<.:ןbQ?4 s=eӳ~Qf3{Ki|0* 7zn )LjPfNFr)q|=O&gɁ86hƷ` /7(i_O'.4v4ԐUSCD4&s&Ȭ?^,XO( &ܹ`צ=_CUZnD"āoؕTe$ϣyn~B/%K븮PVi<4 >O^AY *H(MpsIY#H)x)ۮ>/Co̾ K S/yB'@r;jD>7, z!6>*jbMN`!UߢGf h[#n<6^=8`}ݶ*"ypr-{ dFQ{Tt% 5$3L{l,|+GQp1.7Pς/Th6ŽBC+2CpA̿>V@x53bHLÆ6kFqo-9*sڌmŊA6$*Y6;OO}cd\ڐyݗ0bՋyx _&ͷhnPO%"ou˪嵙{g7!yS&msHlSe`փ%v|~~COle6iq#<"-Vڳ-WsT,w94(&P8㒯=f4YW+ LC5 !kgg]q_] u7*~hlˤ-J28_]qVeW_r̓_N?;vo}B,nӯ^i575! mJӋߧP ̽ϡSLk,P=v̕϶X 6pqyG%Әb0>Pa |_kV=N}odXٔʔ&.Sj8H 3Ac<\Xv'WH?'k:% U*$щxu!}E1]8T\0y"3k"kxUU8--P-c8iVBrOX^(b@E9$J|xf\,)?J{ ik@ _ps4DzRLi7nDa ,1 >ڮb/+eg<Ӻ.3+_"JrB"\eb NHm:mlӊ~'SUd4)fiZdTr:e1lb.r7 [pVs2f3{RkȚ PRXJJsE+tߪu'*wk]A bf2TK a#O^2-żZ0 LD9 5" -EܰBW(: qev,k|cǩm(k#ũyt5Ζg{|T*[sԭ<?9l;4Fue0--|^6]_q-Vb1g-5 ŕm J{x]8*V-WHCo &ƫcW1(a2oD򟍱 Z$oFdEz q9J}JEacO p1oڮWN&dA>/aW[C;fG`²XC#K!tv,)@wtEvj!u$wCQ]cX m;hxdnh;*:e!Ā0.<,X'I[t>Gn #Edp0QOn2s7ÑF!̿AKSj^aFzNy&q)=-WZ5 c92-蓰k US/x `&ҫL<зfN>%n%]@JF!{u)SCeqaO|4;*~Jxb} ݬc-O=AH(%4S^0y7sM9\^EsT<bݑ gs% 3 }vJ2M9ryPlz(覇X!w}ԫ@ĉY ieaT40Wf79#Fhi^<BqgL(F !_ LD{7`'ǫ`%#2XOok,.xF}x`H$,ςPɜ+9>H5IO'K$MV xZ,E.pDtz93 I+ zq&OTrj!?]~PįNgWB :=׹xeB1)]GplSW+[l#tbw)ƺ_G*@=RW=jj@PG&im5 l{<|(zdd?Jqh#ФHo]xJḋ(JPjUe8'|}Xo$vXHH6=8݆F0!hF{w(hKW]q]Sf k& MJ`>B L#>BÜ篟yMP:WKz2W8[X|LNm*/2 q;1p)UmxKrk[9~1.Oy{".dzC(z=*R@Q1kc R&L(Wi\<Ԉ<6V5eKGqv^E i<Θ6Y߾TmoJ6;hD<*w 훰f!n`TXX $:n&R?c,a#LÒCRDp.ʞ 9zszr(a\} bϱ%''d by .L}zO*"*a@uA櫲2J2:"Z_we(MN!Ԯ;Okb~Ɇ"y'9y#w޶, 4;dJ e~XޡӀ2ntp,=a3W+z3ⱗYnz}(r翫5,3Yyܘ@Պ9& m:+h#&N'G 6eҜUNqPYSHإ2hl}q(#XQ)M6E$#!ԗ9nMEQnYkCF};u=8A{˖n-K蘩bE) ٢oH3"T4+@Ùw,m]אEoV [8LIĞ$?<8H:* Zf&dcFwkઙl}o:JFZ4-yT@5f Ar&{:mpƤO?>Cl1y`O7&8 A9 R,eMf7z+!yU9t2{ ɒ g~Lu~ |O3/VLzW%йjb[GՀ(G3l.'2qgf`#x86`3><ASiav}{fHQWw~|He(LeL0,qޑ_k(;l:ǧf՞&_Pw@xJ7Fp 2LOs͏¾RBB@jp۳` $~FWt2pZ˄HYAV-Gn, ?Gr]J/?Z?i5\ S5u=oezb<vmuG58d`Ɠ&{39?bT9!6wx-V zZtOwkqP9!"(-pdW']D9̌ixF K}гyV;?͇^??98LRƦ@^Due?$Q`3u.b5hIt}H7jl wb!xb6dr"pܯkQ?E *TfYCWdAZY.mfjj$XiReyBP&1bL%N_aU󓲚tx]SlG U'Y?&(y`pq5$dy}GƊP9:ڥ㘝%6uDKh^aXYre>lۖm & n]ަ'P[90+9hS=GHT [8Yn#DPۙ?0^P 9nK+glop'L`mZe8Kl#o%?m-)e2-pv(3l1?ZTmzi=ٮ.ݳݵy&T{\kqio;QFfN OZ3skz @ߪz"@rȞK(sLײ5 qKqtQY < ƚ^cGN2G6E.'a K= H;ˑ*]Qd լ[Cd|u0AU7rԬM4g)p 'h!O,ЊPP. B}m8z.HCcH XGX,_7ݚ?kvר';0~Yk=0F $6Ŋ3rjhfXvvΈ4'&YBaϪ_X'Z̤EF{axJ7|."sԢ}.vG_a|չSQ0td GW.Bv6*IPD)Lh>ijېA6lPzE`8TH6MGV%lRF<=5Pfn@n*{5}( }:,,i6=9l2;ԩ2ŕ܉B lt5[uX쌏f5+וye)pmf7 9-l&> J@^FToix/ZzXWd9S0Dު;wB^uٵQqҋj嬟.@a@  wF.`-:˷_,E>y )p7XScsخcQIzF_4dвԪ'(ZzTfX6b2T|D~eHH͌"7#xyEy:jJ>wBss paB!;9VS$UTS@J*f}s@ݠbhK+Bpp <_;Aա-ʥ: okQmcɕT󚺎6ۙx(J5˗,a+6p*cinCO aX#=oˇl% 8QQEÙ%H(,$XNX|w ZYMfkš%(3 ,]We<&=_@Du}ҡS f x۰)i3X PBx^w/9HћЕx|D؃XϢ0P͠ҷv8^b tTً./0wK'ZzAc%=yvbN0e)r2@QJm_~d\<^mkא~_јHTyFpC?w䂣C/8&%n[J)_- J{QzAtA5P5mb8|v[K吆9ŽRfjRu'oNaHAi-8,6s}ۙ_v᱃bS{.Z]hGi)|s{J_>U&ۍ $['jhys95M缰/Z@`Tց;C0wr9ǡr' ySǛ>R@$Π 8Q$Jlyw`sf߂kI]0 `Y {Y"cUQy_[f5KbISVP9+ E@ o幤'gL}rS(z1`phavtK3驣WE!p{t,bƋ`@( O"9N5gTE/g 6I K-Ȩ&2-] /lyv`r'~G1?oHkƶXy*H;ZN_XɩsC ACr,٤- QbI]\v|I?cB n\0ȏi% ͥjVC$Ő>/v0EԨpUA">KhQl?4ЛG{Mޙ m^gۻPq/7. q1!W*OJ f؝j@eQ@Trsd 蛏l\ ՛t|` ulnГ2SD* c)ms2TyڥAxAK3X5*08'b.§ {"3B|`Y4L)l7.K姙 ׷Qu2e.œ3OhI,լ:~?&j/σoZJ,0 +͘o/dgaɶ6 qrfŢU*x&s7`<7xyBrOizw8vuWDz& jIn[٦# !/Ɗ#4Z$p{r_ſ] %~:unyrFg!E9!"+UYcz$!5ebB@WJ!a(A|ŀCLЕ1/.[jztG,L0p`ev+KbZ~2bUha 3s;/e5HEB_ x!FIcaJ\4ۜ%s'>|t&h5:™5 >!qkMw7 JJnVe~Dj;} 'u^ u(EZP,A\VKwٜwIMJ  gFA_e)83囹9y-U ҄M)ju?")Kjs5MH7dԞO;[hTh>HaP NL'tVkK ſ z')l7tLJ䨪˷0ebRdBf3 \|FIwV|=>ap( 5\1~m*/r]_wzJ#0s*G+uNUi(x4OПR%Ejb_Ɉ!r\Aq&!~\QkK) mDz/<\n[,jb gssyKi5p˾ǮFzLԑFe;ԥD[6:`jx<OۉXWuiyyVICS N( 爻Щ=~r7W?Y%Vc\!UĔrkԿ:qIV1-|&m#.A\E]t/ K/b!kC6t8yP?klO"s,3tGǵ?:Q*8qs3CY|6\vgYO!{a6Ξ5)vdسz |ukzf J?脡,.8YϜQrV0Fy a;GlH nd:!?|hXU#\ >D]އ&,ݧ>/7^@I@s1\K ȖyxV \ py)b6ĪT?$Օthz[NM8-`P嬷*x& (,POSNkkZl;ؗs9X9vVO/ExKܼ!Ek H R*B8z][U !"^e@I2@ I\UX7V_ׯKV P;y6%6k'ma\{-4W/uo@̢sΪ MgM-PP#_"k23/vO@5 O%e"nΙj'z7mPUGWܰWykif[yZY)>IO),p2WQ{E܏+Z'P$gپZ zک,4x .,0zm#E{q~i4-UyRFpc#\~Z #=àrͣ1X慷P W~úMc8y2 ~ˆ|LHst1@ȡ{5?ye l;t"oU'[eYYQ,iDЁ5F;rZu+$-"n*|MDAQD9,LiѡzL?%(YF)W@}olm5s-b68 '.˳{fdFVr%,(ǀIuQ7IDyiw[ZF}xL*.a-۽N*=H~p崞RVP IƑ  -SW91t& BKP(Y7ȂA@rDeޢ6F+ϼU^;8[HK~aAe|%#"u?sgA~4E`6ԧMb>Ĭ1]{Ц5G:ӌ[z| -rBŒx3 7DODoє0!|/sYV8zV.W@SH9-΂*"2Zj⧋#GfGH; ɽdɯJ*<4#5v8ffɲT;GX:U4لR$NN{PR';i3`o{c)f-ڔ JoPz.qz5)C3Ii8lh}#Ogʋb`va.NeRH>reÑ=ޤ;P%hh?$њ' >#VttۯHb: UDiغ3%BH;/0h # X˟tGt[Z(Rg"UC\8sjM~EgI[RdjE2\bQymoدI9ބG|:H?" C2BVfGz9r.3GiQB=2Obxe~vFy̫ 2?UDsi|D[@@~j$> q>kSΤ'F6p fT"J#eQKsJKksi}A?^U0ƫҖ4o)vsͷsr\=`uՆ6G^wU# خNx$m!{rȯ/ ,CXU+Y(:VW U}s?U08Ca⸁+=B |K Q6m e5xCcЗT 63(9zrX70A`KQW-Th^GW^5{Ƒknw\ p xkvLB+k%#H\p~QpN(1o$xo(YZ\( ̀Ç!C !EBl^$bx!&;DXB@?>&GGwEa/>q"HAA9/, _4v @>8.Ma/ao4ufv,?IZeO6vbKɎ.qC1rsBST+k0m: ԐVԝd,~+tѦ?QEHtdYrCpĒ"4,VS2?l8r=FO r 9Yom.d3)ajҿ4(3ۮ ?%3kz^I3SJ1Ìg\GxRͶO2^YGߤe4{TqY,wM$o@&g1z AGDoiF53苣^`EzfmUƩ?lOvxD؞Uf΋d%ko:UzXV%>Ȏwe[LU ^.A"wj_9H j5T*%|oT%WTIl_ H[&krU~eki4Mj*){A[X}FJ3a *nXMsDdw,`̃:&W*kV22n 6'Sa)+FVWzG[:9U)L |!:m'٩ Giiau%PM:׭P3\f7NK-D !+=ظKsk??s ,_N妬,B9=c "~Z;AE͌u,Xp0w -N YH+(~+ۨaoS+ @gƔx!ͭ:7|Ϡ -yAo|9O -4vadJ,‰RZFk2yGA[!dAw, +n/y0-QVEi= x8q]g08Q"c3 2H|H*ηAgM PL& ݫ.k da7av³%zL6 }\A. ]4k3ƻR1Z>)vt@4aLpGO@HˮhJ2"t!&eb&3ˎ-*@!_P@j6 4\Y(MG $l.d<1z9(:_ o~ei*y7%V/ŷJ1{vH+&垜;R䳻9l"B# 2g}ygZ3I~yM e ٗ JfDDJJ;oQWO*-'\r4[[.*+G\Ͼ?#}c> 9g(_#yJ@j{>ͤ3ƦJ0>n ꮵ@ָ5U+LU3>q}[ 9M0I,s)7kN5'z<*i~]v6i^ql}la!kt'_!eOu~5rV\>=,e28ۧ: 2tS\9YX?wZX[۠CCtD2\ل44Ju!` *@oꑊʱEZum9V~-5߆>Aݟ̃dxlCBl:Rkbz7ؿ--"ELuՂ~E 7JGf?y)lSiOW9ח BJf#?ҺqmE$i9A"vDqr`QT3Lʆ*v2;Lwҽ4I+KtE<%aO KJ%ГңՇaM'5! U޺ ]XRJ$ +Wo3HMNrD@mzsjPK6:t(>VƁǙ*=@q5`x5^X8ѺZ L_TYUєIn5{EzRGགQ}QT`Kغ%rY,„Cȝ1]hf3[L':h@:4:CogrhJ :PǞ*]G>rkU?^Do{[k:>ZBbel4fKZ"F#Oltbȇ8FZT2k݃rK)+uLՏFjz{Po-BÌ NN`H/)&/_s똔 g,R>$ vgGrTEd*(5p_(6vj΂# TW/o0{gpg KޠKCt)=:oq4¾FVu6='5zףŻhu>0T6fڦE<.1,/yN(X@{I p=T[txU.TWn- b#ʃ'a d({Eeǀ o9\83!Ϫ2Ti[ ;z4T(Z D| OWɰEh||' T8LYoW0`AHf$5(|ߺ3!@Ͱ.:\GkŋUiwUj|MΏc:uƩ,"VDEgj `U}m6bBIRk{4)ۏ0He״v)*R',S?ܼbHR%Jq2AI:໲eu}ⳳv)sA $(%t|)Q:82^3 .cK(^Dޭ\SL\ (_)VK]_:KŶVJuų2+*w)C ,&y7;(6yކb}y(e| E G{Taixreʖ7ŏәuaɲx2%s;ou/b'f;G(}X#`_՝k]|C4 );, d8TyXU6ǥ *,>/s,[ R N*VfMhp(2c4xѿ%uӛku4!r~wxF)=t7N`m}{VVrá&1AtQn RLm)ڏKuU21qOkO}W/6_K~{LMDP[%@7:$^|hJwk!,M/;fV7!i*fT8U+1S~i y"+-v'N\@+:xK6+\ 9 df,y_o>baK` s/\O9GrÜJ,T;k _$ysl[B J*I4:bXS&"G]M6תؔ[&e\Y|T̋t|& ߏ0֊ 9`|ieHr9ՊHFJ$CWW\0/ 9.7[vlIhAPv-_c<UcWl %G 8)7)Z]ΓR=X 7I D$ab3H"ƶ@6 7- 0#yGIhϮ'f*Q} -bK- jwt]\`B2GamAn`鲸oP;TdgOi (GRnZ_!*"\c-6kΥզs B h}ȝA*0,`̓=V0:'6OKs l(/Kg_a@џ}#хYdw `:tD PN*+P0w2ЦhVRQ3b+` 8%|H#4iG/r!5;EhmqB/hdœo'oc-vaCk %V+Va~l | 5JUiIFɃNy̠X؍ʼBIVG"7'O~'j2-:' aWc .2 1.H9W{h_{F8ViT;lY& '̃ h]83t!L\p|Fhض6kkPoDLDA76Lv|gyHT6HRy1ϵgUf2ꅘ)W\GnTj,? aAzkӱ`n]CXһ<+~U3Y] .˟ZXA50aJtHQjaH'iT~x8 Ma$wK2 $1V!/Ӡ_S祻M- 9֛oL"ڬl"}~=8v)$?zVHR-'$k:)ݶh7y+p* OD2O=Nt;GR6[,og(~i&잢K `a?f7Sh{2B weR*0C9n k ? ס _gj/ ?8 `t f6'gDݠG.l+u҄:ddD͐N}](pŢ3_(*<Ǒ.`qmm ;ZOu:rVgzűQT^ 'ݖ6mѮ!6Z~ {pPt|>䶳sxsX/zeBο ;CN@!s x'*>&bZXÙґuZCAQ*ޘtW} UηrSt]j)UHt@i^CSH>o^3ZO)S.*w+7pr D2t/6cu.M6A]:$BeTR9Z.#f:Zr.\弉6PњnXOW($ݙJ)2xYUtJ⛬ ʓ ysw7. s ͧQ`F!Uv*ȡ~XL1- xR )% ցp [|)rW2*3Pz-='0#5K:a @7Iq`m U`R+1 ?~&?!2ɴtP '.ZzQ&/(<zu[1Y]G[3jOI-; tlhNp+ :W XP|5"/%Q9)aQ0=<./`( 0IU%F~i>#WQ&] U ^}0ZsLDɚ =o o?y߻w bjtBA0f&ow[K!(g:B t!|Z۳O\r65tJ5q!y=8T#9PpFqb1mÑ!JQq03E 5iV]N{|]6 A}XD]v])?kȧHf͞M\.ABWnd7$FL2MwRW[ 鋜;J?O-ٺ}5!!>Z>9[ccl զ~k]O#Fwݿ2qˈ lKvݎ4E(tN9 Mk:rQmqu`w(q!ᔎgͼO|@5;PR|u?~<ÙёonqƦ>y/ɞH3+iA2tTp 4$W,j4ϔ_Y8,QxCͯ.-v6?M{`ңJt:G+{-i56;!SźkǞ-}}֠^UR]'b;g_\.BM;fWB=c3F<9v)&ʅJ̫# Z٣ͦeV)EM'z*@C*pp;3ӉH\es(*2Ҙ&F9.$ݓ7B ~gr9@"3Q?oA]o H%G_>vֹe* -,3%CFS'ښ"ՔS* &0CtdHE[mR\uUcCm^nQ)E3f!^qy_5]p\w7qpldl]½kdL9QBxbВdk1ぇ5@1VK 2Z~aBeu.]Wqۍ%)^NU vLȓOJyweE:xN|Ze_Fx(XRwTr]EL1]Hy-ATmwħ]u3Tm@˳`(U>Op QT#W`׋\3يߟLv'v#GbWc_InZD op>j\?ۡ[ƄEy,oeZ(Kn+-U~-d-TK)C>YLë5МJoJS Z"r2:=pKr5@D["/$K*xsK[1ά b,|y ^AN{2*n6/lM?3]`@НӚIV;H9ތcjU/(6B7{P$o&gpc1>LF2H]!i|'/asӫPA/\r12^avykV\Zf7DHF+\Sv1N!q(bk\>51OߋN4!c qeTF-[d~g[ӓ,ƠFh$A.t3$к䝯Wz㬷3ri#)vz(aχ !O7~>K`/"mcC8YH*jTUI/k5i5Q}:Վk$xu2[["wlBxs;0%peEY)yӹwg{` Y+ڕI8&r'4 A#P28bHd4v9#J2G4σ2gW\!0.8@ݗJ  qy qٗ]SVI#{\_ta )uSp.n.dK렁^]2fbx\,(rt^5_9ko46CS&rNSW,o&rk9"&О,cp?3wc/*Y(Nzu1`gQ {mG_dc!2J;̒ !e';Jςj? I:Kh^ďɎ1&M3 ӏ(_?Khy ф J[!I`v̴^EktG +Y: &'; ; a$VM~&#ubץ},a^Do[N$iy7x5@aje/UI!*kCǷЊDO-"pОQًs&--b6Xy0Юx9CߗQ zr Dk 4e`"!(qllQ!KG2?)g~q7DF޽߿VJS4PKYnaKZ^Z# R%=N+T/Hq1"[(afh\.fUHy&K+2(JT'd@eĉK1T=dzj@P-̄LE_a,lL6ezT:>9-u;;7}gό^GU֬ <ڼ٪rkRyqmUxLK\h ߸6Bg*:>NIJ=feНOXpWGgxH?a~E xZ5J;sT7UwEĶ's8S]օx c43#zrԜͦ5GHM-."ޗEgE8 :S1۳$r3q r g-h1S7=1[X*a*rttZ`C{ts@@iDMDzݿp|r<˺ v|˜BWf+y ߬SDp\i82֓Cg苀;gqa]H; ] OZl^4H DR6[InΑF)>w?lu[yxWpw`+m֝+'ZP'A|hA+mUnAXZ{]g%]HK5u4њ]#^:E<4^JZn!M(# lPjRİܕ kjwk4–K)PWpCI:k{1ܸHSoNrFPiz5 kLFSOM@E&5LULwT|3J\d0b'cy b5;6pȀBJ' щKbX|Ob']~#I. ZJ|9ڞ 3~D'ES#'';~W9K`i#DpN?Ad-Kľ9J0R*tY&i ?[W?x9N̩thς 5ٚ SMSJiD@Ð5zGtLU. +>bs|G ג} E' C9b#žq>l9sZZ@1 w/Y\D'Vv}uSKs}ɑ$Dpi7_:_ss֬FԒ.jZ N1 VԅB Y~;ֳ*5hiУp+eLq)~pStt.;5 bz_pH:9|Te('Tuz)Cfu#=~ E7 Wػ$hY鱐W'qn<W_?1!FT釗'AuN*hFAQ'\G"@9)NUz"_FW*?!h GKŦA+}(!B )_bcGZȌxAPXX) P|S@RJOMdO,qAG_Gs)Q&Akâ00ösOMKC&7z%5IС$hEyc#E7sN f}OWɛ0s܋s?)Ƨ(|£`gL&  liC- 0~%2 `iˬkr#ۉds"]_ʼ4'|g$ި EagoJ)ч(!Exbʓ:m_Z `Hso46 8I7ҽ??!ʾ$-NmT[6\c[ D21d e.r\b Gqw s0^ASgFR2x q+|T %H H8u{'!28ZqbϢ{1]M56{y'\4q|헓(_yjX~{X+vڄ UFogZ4`H)06?f>R,Rj/i/z Z#  ;qcoKԑ>n8D><VB:gS]og#`5?Ή¤A[GuO4nɚrǭe[o7;䘿A"hȔr.no3Ee {zl06&WqYtݦI&4hmwiE8}u`ui06OV$šgYJZNE{p">W% ~%dzLGR4RrJ(&}/KYvAKpKn=]ŭB}ön RB@~!W{j8 Ч/\)[η4*u+"SLiJaͶJ@- >ľ9'"T|3G(Gsw/(Cz4wf!lܖ:֘0%Lէ]fǺ;mpLȐc:>=FZAmbl|NV/ <$?DMTch8WI3,umqD4tw~pL%ߚ>وWmsbᅎ@b pGq7NC씹DbY 4,lO@@SXb!%C:,M@<&jj ;qQa?Oy(=[|Qbj{23:8)|cmBUg "5F#+n2%@yOQfuPEYPFCr5& UړGO"nדv\=R}aG 9MBM6q]֨̉1#䛰)0Yb̿ P[zx2rͻyȻ&"m}+(d!<,xM[(#0]S@tSRbr'. UVt+0šR0LdΜ$(U勀$K!ɻhur3=C1M}!w$$) P*>&o K׎F!IE*& f'gT ILv*|q#l~37U/Cm % ?>8m4qƖv+鐳8j13cV=U c8i×ipSWzcMr ӡ:P TMSe#&+n'HFwMJܥOFB9h7$T/d^gpf aiWM[<#I=fj~$!ik&a(} uƀ^.mFwwyTɔ+'XM gOg$18hHlY 5]s ?{ו?"vH9M(YXZ? W L;B1§w{]}?q' dN`ӂPA+btܴ ;3{?:9v^%V]pR6ظ^h7ҏ3gwc?^/Pa*'A*-ҿ_ 8' hjuU yvTo'Ù]}Z6b C^;6 Hr\ t3\3c^=0  Uff[+I*)³.=#V-9C@G[H}?L2Wb߹䮶XxWƬRFY%a]hO ֦یV: }eA}m؋׏#';;B2𦁲`ܐ/[X*3 ~6U֐XC|$:/ɕJ?ZrZ#6h9,v3lv?˒5k&LYGϗIjZ9gSSQQ <jbڟ~P]$cUcnkq1Yth iO>^~M]ԕ ;O5MI^*I?$fߛA14U{&1IbCVu;.!Xh2֘+d^8pFR:A3 o(]QGzJPG#q: y8qm"alsôړg*c1 UBR#lTZ ]Hv"jzWXm Ƿ.ڰ(WWvm…W\AHH=zкM @ȎsXJ:jN{άE-cFrYAK87-i; \sr%^)Q^m cPwl 2]E׸#twr CMhNL rfhʥ{w@o=0iOMti`iN UxizmT͑^f>v_5;wa,"+Wa< ,eZ3}lkfVKr ɒv_\/UH\+p'0S?k~Y!(ټ%2+94$ti2|w bV<, ؁3Qш w#Wɫ#n泃) dvRx m Ŗ_6Ů$q;IKgǠ>&N,[ل@RcPK YlCh:EgnͬZ8B[\3oɩM!?.a-:<;[>&X)zLꃪ#@c/MU_z!mnA*- P:HitsqX#jQ)\9 g}Pe-x"e_B,jcD"{c;~Np͓GZUcŔHWL5n5/}!PnSV)UAإrK_9o"PZOwbgxܧ#Q #!R% ^"X"2>f!Mda v p;1NHK[b iR`>ŊBA NiyFg@{eSCIfǭwY 8tI0a]ƍ@$bU00ߠ~^!`cFq/ÓXԐo't%=@N<0R=_kчNJ:u6+*hF+K ԭ8١CO{zb̨yr,AE~;nW [z WIdh܆# ߖWo_](F~l4܆lGgPSGg\T)"^ 2rG)ԯ̠S'p%qIPȋpZG hJj>AAIHdqi}/34m)>Q}KG$ֲ;}V:\v4F]/qESa2z`F;vgJW6QM^(l' sxynmٙqIc`wv!L$K7.3vawݹMHtN/ߦI>ťuWOmK.1sª!3Z9!3'89.)Z}Mf}z=)%b(|A)`/V/3BWI+Y}b[W; J6OJ*W{-zNVϛjr`\ԑ=y#ASR!""3h!Kq>2T45h2Cޒiܣ/̸ʹ2:!Y*nfk0n_rx9[تc8AϿw}45G_0'zuSP"X϶bDcH`h)j> t9\sEBb>_ZB~`)Jk $Dy%(*r&.[%1)a\ϪCx0V٘/\)$[Br^TVs'@ר9c@hwEvBV0*ACNhxow3ŕ*'3SeG3[[ gyKh^ፄڊ@Bx*ɳ\(!Q`\d)B +v<XGjm$w1] [gKhUFc [/zlTd?DhBBmtTuƦ3cd6olp.!?dIΙMBΦ9DI27p R*|srCXlH躵IfHkg!<-+Mvݐ:@0b_"vqj&j>[}xЂ$U5y~y `.z)ES gDxYՅ })fMv~[ )eb|fojKl׬+ R |&;Ά*JYƚ \/}gWӺV!v/`Xj(PL"L㙼7 6Ԓ6vْ&E[/?x^N@%!=al8tkw1e6cOub]dTD&pM 7tS5vN\{=|Z;ՙtNp@.L fAh#B(z~>sк6Z6$7ftUyy21ylk4؃}g xGJnfD}A7n94Gh|(Wߔf Ș 8zh̀Aig5Za$5YkNG{"^>  pI^ H/[(Cf|]p8yAE.3tZLvRsr(j{)Baa~#>)Rܦ;rb$&aiG2+"5$Z&Tda.c{.!Niw@ t+=/I<_2Ig~%I@P*$+rPnXl٣lNUH2~mL6f ea.Q?;9u}M,IɣCL`ӓ<65Zvr1kK26b+7 n.kAwp,+Go uyJk1!q t"ᇑwubUP~fq2BNq.ZBD^gкbM7A(Nx3m"o^X NJw >C ÀσSou"hāXHycm8l_K&B )ĥ{{s>1VC7mP3W|Ǐy4pk2xY^N0xh9q?td/w*PwÆ(vjq ^~z&b1 cInmrc@`wDw5 :|({;^FOAO]Sƽ.X3(p3Ķ'LO]` >aZ\\קHh^hpQ|FDε%R|ݐP1My2cCFAcm$.n J._1WV 5QZ30c{@il"7SuHv-6DĀ\F6ۿ;tmp]tFPQBu;WoMrж ?{.y#tCl!!C 7GIj5CɆ#[,z{jTVǎxo+$aSoW}[YP jʉ)i @T*H`? j%3DɂaK CW\zr*j;~yf;迵 5: j H0J\< D 5$3-ZN=@C޳^2h%GMR+G "n*i.-za$s>_@l'96\v[$ ׬D(-j&ɐRwlxLhؖnC -FsZ;xwNʕϱ9"&n'o0PjDf5 `rWe+߫w W*ƬⅭuVѺv=C:Ο)o,3",-\)=S#yƑB!; )}&;=aCH:(Mkuö\" ooX'5=sVLQH\6^7\8HIq`A;!Хƫ?` b_B_0B@F '`ܧ<9D"X^^ (Ә6Cnu{犚}"NDb84;D(4jK!ʣ}NBߣ< GUL${+˸8] cx2&gLQ ॼ^Yc6Ff[GCMC7 2G88PipO_ #sҭeʂp9 G7`qmک?0Rfd2I'Ot.v:QŎ[ ,]ћr΃{sʕ_xuӛ%~hlM|zn-.."ۤS*|w59J"R9UhY(g;,4=;b YJ)4.UTgIҀF}gtW̚=DC1L;P>LppPGC3)pi^ClC)M # =c~yqke m@w>QŮ_̻IbP)ދCkXҾwb`[iRƙR͡ ɾ vZ2Af[5^QݲrZ::b1Цյޕ9aHԠжh1o.Q=^m^Tgj;.|>j,M$kvpsjy H&iރu$hH VP͉CVlsE|¨L}T3w߿U\R$s$W\kf#LT3JK=vݻ|$3Cl[Ҥ(3=.lqpk^I1`Q_4*athCFpN[i4m8{Mb\l(zF'fEK Rܺz5Wy/˓ps_Exca7tM^+$;ӅF,Re&,<NA+n%fO{/%UZgY9rC:l*jFSVck9ƈOelSHaT0{A&4z8A{G,~ed,ExeG5< 6B^`qMG0(ݟ{HIZO\:n$6 5z.7r =Q[mJU|+=Xh77kϞW %'ɐʯ *&sظHWWc&bKGp8N].fCG51Dp7扨l/Q[[` X{Aa`W pQJm QCè`؄q G8[Qy*BߩuXz&] jxË BB=nF&ZG#uUsY2(%9 p]0+9 `j; &C_+94s:`Jԏ`lR4#mdfSaisQ=]Cϗ^}ύ>060MC}r6Yx.*ab<դKk>V! ER*=S$j-8 IJʭ}XM}p_1sܴU*!(+.vV) :4BTyzrƤ-OX1WPUV '<+QJOo]lv&}ލDh ;dB<ˏ}]յSwHi޸+j{aFaڄ?X9 HhֳSP2 3^Ml__c+w㥖_Zť콑-(Fr~ɆV5~8yIf‹d%uI3FicT;I&OKP!5{ŶZdfB=_jn>g̊L^k^y[ޛd[t|!/r2%)fX=z΀DNSUF#y`0@خ ۯ9q9'Eed68ӺYY򵩰O̿fcLD= P'Y4+RQ$vF-cBsI 8I?t}3Hp;}2`v &yS)ch(HayIeUjx'~n"TyCX5 Gg0g]4<)sa0z"$Y4y7 UmlA~BIO,O2C_GCŘΊ M y#peDzR xLzjqp}zxP﷒ .ie$<u6u?A\ xm￰/ e]sߒG[Bq{S&q_~rTGFngsSDžbhM[޿،-*S^wD4uN\VF_r_x:;xx%%Ը[Rʸ{k?5cM|dp/B̲ܥAew fA?j8~&V*] Y90H.Iuz;f_͆uɰWt%8AC?Lt"zKp I;OCbؿ΀˦ LA'ϧ[`]uy3Ky=5zc>irOn,l^d/֚51A{gV K;*R ҇Dڎ8$I OvB!G]KHiU:<{h%P+]Z_&a{i| 7=|G6Vgçrv5lq# ⵕ;ô_ PiB5MGVhG~'ZErIsʵ?߲[+_2 }!:MWz(Z!s 2XɎJK`fGJ$(dm/aoA$!/@@I޿Z %%rZrFppiU؋dK!g/&uP)u9]:( 4HplvXڝh?C(d",1HӢ5\CoBʞMbNA7das}-rR+3[0u KܩIV^\0^B!<0-/>G_FJtTd+e.eb&W 8O[j0wsiN!>':ID`izX7X'O*~4O:A ErW Lq:<Ath΋8N$J/)6E-2rOY#{1aw~i ^=I5x]̈́4]~} >|'Qn*N%'}w&X9,U{G҅dVzYo}~N2OσH/I|Sz9JE иDST={7d^I̠2,3`waGD.ܲyxEwȘ $\"A|CW r|V$iF.`g'_Q 5LN3/ot S#rbC%pJdU*+t zlHZSj È JX!x f^40}Z9P.&_5y$wt+IPU.9qY)E'Amu`/1]o:glE v7(KlS`1?*A_DНG :e 1S/M]U9 k ~e~z־S/quM\^k5]nM^)<$)$/jIM W֨BMtKJyg{=r!)I (ȗ27%̆ͳyqϠiS1HШf4U-B*hv\G+tfT3DyEi{ G\'mM@Gލ&Β.4*8Iz7Y*VJfOT6dn7Wh jp ,~:`ՠQx, fߋӠaAu0pK*`wx2#/kUM w 5u:gP``w; F9Y:WV2=jSڐQfZ; xɠ>^IIl8B~@"2"U2ro"B NvKiBg].R}Svy|G7\q_J~U7!*ӒBkR>ʏTh_.дemlZUSFAAASdSFrgd RSGR3!!׾Iyk_גgF_D}٢'uu$ _R#6kt+y43x_%4o#Ba'nrPGf lT{yGA48gF%HN k&>J X/JKH~lҐ݌Pӈݤqڂj| Y_"L_v J ,<0b܂!B3&y1 \DeOp l:2U]&2Sl&"+𕫙W*ɽdblbXl7n1"lI`h\Üw芶B=1="ޏ-d"sn!*(M¾aiIUW66H!Gҗ.SF ɗRv?@l9eՍJONjv0%#dJdSqs qVOG/+tj xXT4в4HjU |Yޒ,pBH %\Cgʴ;'H/^gy!lGzmDH0;a`=bf|7F=hFcMF|9;ǍЉ< j7VHqZ ;@(0l=ў:Jf T@9ǥ6.0g4X@E=/Ӏir #K]~|ۍ×y)x!N85޷j,l ˘"J臾,}{Drl؊L'!4z 7X" YOY!:hs'-ޑ|%jbC7vaGϒbӒpof؏y$rgԷ 136 ̵(=A]Q%2[M:\pL%6vhsdtfgvDG>:gng7u ' j;O`xv.-QaGV`dό},.jhj"y/3aK\U16Dqu(\1/(YbP$U{ܓ⦫豁"Z"iƲ"C!,QLڶ~5T /A?{R?C[~wk*OV _aiP?#4tJCvt5m.1i2~ J]?@tťR峦ׅDJsL^ `6,6$l;eP8xk8%^Oή΃ܣr@׶OO~Rt'd*~h-~==㫞A}+ alSpYFi g~-!=ɼɋz(\ rTU|Qo׀_#lmbO#Ó0 ͓2`368bg`/`E+dʓ'cD1<ђl gCR8tWkN^Sv5Ҙ̆ZV6FDV[p:! Y"YEnKvF}Ȁ z=bLeX.(5l\Kd;^rxz"|"#~f&ND^Zog.i׆γ9@o1OX3<x{ZemP2O(C,!@(vEZgJhЏa$/K ~ 7[G']>2$ouK(j*9t?ݚlA l0IT/+*22&KZZFHq8]@G&~]hyR|~J4T!I*:ޭv&\"c[ %֣_LF*j"RP$]E%n0ψD ݙ1|O2 W_PaLڂ"5e=˒t]FTJt63XLH'$!<[EFT#n=ŋYP,irr8\Qy ~z|u^/!!0a`enF2Z8eo7䀾/lxwHz`w`<⫶[BVpaps KTԔ.J#V~\QEuh$8dDN0vMe5*1sL!e"`!@a{FD-Q/-5N2/VJ\Z7K-}_T#OF0OnA +VFKFN'p';q@6~M?뗚cY'lbN :\kR?xrU'|i}(&%hqUm^ P9RY #]s#ѻ7?i5j?Id%8öSvy8n2/}6#Y1Q7UyjX.9 y8jt(ِ*"|E9}YQbjiR9^jLqw'\bL!!J.<:aOci,>^v9^2D;trKvYgix_MN7F19aHE0HqWyG cRRo'6*V"TjYEy$pa/ 8-j60Ot{pk }3f`pSzBӉ<_ >>pV- 5M-tb'O2{ja=C-?L?jokOӐz %il(Iš[E/ʐMC!LŸl!g+`Zu$rI@vj-w*ezL[d?urxf:s[8 '@K +J 8a@v8b!~V)j*LA@pP__ &rIVks|I_0 *W`Ap)اJQ|ܰ=Ql!1@o4$YH&_KP-74DS4{ 埜*[^,`\%9fu'9aS%;Ys̆QwfHɰM$h bo?;O"`49g`ږ#HmQ*ҙ`E!^ qL,"}Ǻ`ȹ>#sHbXY1@UݔK?c -ܝ{Guia]_fPq4sQ\љ?ec\sX;uOS~*8?퐩bH?{ #~}#}O0ɥ8r&{{j5~D!VblU ED _Tvb@&jNŰ4AgcI&2B8TxT42'YI͘a =1j)-Vj+o+YDZic&.IDIVG>{Ҳ"{p1{hϬ$7/u3}T)CG̡_g:"X /̪t-s/G.ȏG`o כoaChvo *CUj(}-ڷ;?řs,yc a'm):52&n՗dPPY'B^%u?5w?re$NYe[H0u3ZufƏ0VT'ťd$0]R}X7/I@OI$MvH돆Y> 5D{|f'2p%-j #ʑqxpK݉9QO1*Y}>ZsPPA9A(nɤ n(h=3*H44a:Fۀ` JBubƷ+Ba 7( lmBx[C$1J,ٱ[88;8X҇C7>_QI7mt; ?UI0:ET1 )SnǏ| tnUv6e6 H|Z>\gTuf{{m9q^t1Va0G+**0Zᰧn͢6@):S~#8xpDAla'A @ &k><#`_gѠ =Ef`S˩mJ^u/o}\&w,WDLL*'iTYMWK-Vd²dE{5+BY+ƠX(=7wcdwsĹ&1% gd3y\4#txPKoo&Ric0Apn|jy,D[|Pݦx+i tCꏻ aĉf(0اчE 8dk̘~pAOT'#do#Nn ɤV#>Q_ 9- !s"ζ&mFy\KQ)c)g0n!~{ءP~M\Ԋ؏k:6E>X}"J*>0 2GI.4w&J@d *"ײ&brn3\`f2'mhkF -҆ȍRֽw"eZܢ#h<ӓy5.vZ>o6tNg64f՜4_PA2U=;XW0E޷k@ %a.sR8$oY|PϦJDD!2n,/LÊfyB/"mЋV-=eWZX]nƜ{/<]<= 5>J/:9kPNvDpqoXwr2bAK]6IGͤ$e6鞄1 ~? w Wy|H`oLRJZ6YjMbΨT!n nؘ]4&w/ >c0N{]U5(tn҃nKٴ fUYĀ}&. H!ImpZՃe[yB ѭ jңr Z4=^2g9fڜ搌9}F%ˁ; x_kMߡ7p_Xv)CbR>قV/8veOsz#^=Tć.gsngpǘiP6@ !^|:T0OzF (mh Qc uR c&FIT rhF ]nΟ >Bj{(OXݟ2ڶICtRkqr3YV$'F"!$J35% N":xM G q(kOC>7;z:U<3po=QO$&Hsdw¨r `nDz)IV,5YH"d9BJvо&7REZy/|qBqfg00\ѭ@蚩"jX>ܤ&㡭2VA U T iH rH (--SL_4sd8@:$^Bv( ڬ6:'P#˼8=Vv.N8}~#ԽRDUf<;H샌]%;Wkt%"3߲ßIk%:'UR,n օ5#J1ȕf*@nQ 'dyAiXәfBa}tOն?kZNzP{.:*jm|^KB;E/'r`f oSD6zĺ\G_BULyשb߲HX-XꉮBG!VO'sG?s#k^&:V1Rh+ ,]+O dH #i}`KYI 6^U&g(t]:*6i;@WH*Ap3)G1-:SPx$&-` ?$;XEt=~0p0L+)?4G&7ѻ\=l4Wn3A~V"*0cJIB>+F;U](v)uR] 0ZLH6ɮ71*[$+ IJHjMߞ`F:1!h[>L+ ybPY ׽Z7eЯ=Ńb-Jl:y/N[^$v )gMܟxg3Po}tIZA(2!6 QMzpuL C8&}yClLcU33\e3]<[ \8 %DkkY؏yL#C128_ .c@k5Fd94dSKbcN5Rt[f8:Sk6U %ՙ7PSZBCM4rgRU`H~<*wr)=Jȇn)Љ"8- ncf gWm%|`kBj mY(`#x# fHe 4c_iJ;` g!& a^_b+gv4y!K}-v4 PF8VRj$&atߺ* ;"矪]du BŰP4rR2Ej!N$y2z q'K< l3h\{zV+5eyloĩy>k@g `Ne91I]r'xdN_yk4'i#N ^(pRxu!t MXLX:7MI4Ke8ub ! {myM"%1k}޻o j)ĕwQ LH(:]O9Y>AI1r,/2WFlC*rP߿69K9[?epSm'h6=N(ҡFɤil^Bv;GN rA\n0%Au\iſT@OP#`JBgr? Rrk!zĩ>ǮcK;N7c/)X)Hc[q4dӜ7ˌQD$L [|hd=;Ah-n_ݫm!Dް{"ж[V@n/?&(?_nƉH`hҮ@ 6is>+1{4npcZ D u-`V ]@`%cD@&Z61wj onP ~qdAȚ>!;й7K6z.b|9Y=QݛUrn/Wo!U(REƏ<)4GHNwQrv()T!4Nn>򼴉 Rڝ0umVgyx8gf Zs!ƮŀEU$_,á907؀?!zC22:q'M'C[Cd5⻴#wZlQuVw-xTDG,QF%wDڥz"XU+G9Y/f[dxL$ BGt: R>8Xm"cL.hʹmޓ'GBy wD,*ٯ˚W'c]*p$”XTTQrF^UoM`U,ԃ'6Rc~8]׋dJ"f 't [w~j,<Β|5l|=,u#wd,0g),u3H |3E#ΔuS|ߒ? W5 Ă)u l x- GG Xp(gdZF (E&lE/RP/Sws)}7["~4.B#mgh'8TOH@uL|R 2kq'A4| Ěĉ'5jjG y!h׍%0s﵊a5'D"/ Оm*Mah>L T^ty&-GwɆQCKt{^ H'MC]Z r5n}\A+&\rENӝ8xc`@@\8OQFehdLl҆lA1ނ4r[c&2Soꦆ$^Ee|"h1;nwRXX8&#nsu+[]DO|NIBح0d4]J4$ AĜl/ئuiK0g"mF䖿hԏ4Ƶ/؜Lv9(2'(Hί}KIV=*71]ۆ(xw?PZxhOQ-7 wg?T7 .190Dc..jCRN9ӄJ慒4 &ٴ1Tl7_hiԫfO~ *+ DM(Ȋ{R .sIX=fׁbz?|H6T@nU[Z 2)~;v(eK| A|P QD Z')`sv=:"n0 讀l$F %Car~e>L(tEcc?Zi;QxEn B;#{75y!$#Yd~u-~ȸֺ0|۝ 32 ՑZ*d 3̗4x`&)ף2.i~}q8 gЄꌗs/ P J Pؼr'@;xq.UXZͿ-!֍9UlmdC81FbJxEH:4JY]Hqn<}f_7.8c|xB*ePL@ &#*f@ռK鿈,/EL{6/h naI]#|wTyܜ>{E|M쵑ddAe߅RaUt7,x8)m$*QV  Kx.HWF_9de|DJ1fz\C/#sȱΫ/s=CƤ@Eyn+0qpL+VQ@e? %)vY6dאNUծ , BHSɾl+4 B=tV{)PE =Nq~A>P 1!O7BThwcSOB7;K&^%[h_Ȏ IA2I@E'XV+~Xk#9[;t[udG5Meedh^%ӱѝf@0h#0,688؊ ]Vp' Q%%F1O1[' ewNƎg¿5;9#aڠj4S-J o!Z>往+WrpB-V>c }2q[t~ :BC=pfUDO9hsTa06m4i+gd/FDpvz&cvKvhn#ynbN;=0?QOQE>}L)͏0;O2ׄ7QO;~97i=es}!Z"̴kǃjcG Ɏ?mW;r oV@Q7fsE}!2p@ډZfSpXl]p DGֱ&6u柏?!]àq*fVIUE6TO7x7"6"qDeryf8oq4k,(a sAKεf!ɳ῱m^z/\q , kƋ`;sϱD߮ )PM IbUҥ|$d,Pԭc/O&A?+X .Bpp7c){GC=qެ7 Ȗ<>Z0Hd哄F+b,4H|^:)dK4Cw̋\;Dxz\xs.gxfVDz>zk rށ9yS+D-R~{{g21cxvk=N[Xנ`vҞ " s_1o;oz}y*ʲ g=?vF cJ B`ɧHi09Z JZ;4ŵX}';m1Z@}qS74_$\o!Gʣ'ǂ%v]Dxb+M7xB>z \R]ٸ wc|.d'KS[q`<O[!aB?b3`'}jf:ss ~ BDhA[pX0bE翨 N8$뜻RʌsXZ]/HwgdI~r'অrt-EHz\Y6*Z0<]z@hLÛEUV$Ne9ZP١#͖qORh rL#>]}.O"(J4?"0*Ҕx'&`l;+V >j}?cR|Ȟ+P( )]u=m\-jo}4[{}ǽ9GNg{(vGHґ %f'=.CwF(|\&|M m-~c:pǬ[6y ZCQw'Խ>^^l{wO\RuaO˝.qG/z.*rmRgqxSi: Cᕍ':iX-TA UG= >gaY(旗ЪkU-O}ɫ(M;xU X݅(Ќ/F&K@$џG1tjJ Ņ&HYˉ6[4t+ Q,_84GxcdJ]rat s+"Im|0hбB ܔ|N?f>RUvQP& o!9xm+8_ޢkSSK8iRtTaAͫx7ıd"¬'v%% z6=pK[jBB{5ؘ4ZxlX-PW%V&+'wV17 ,gכ#A?کtqb信n|T^507s%qUh6hFNr¤៻8 % SNaN@${\% @o p%ŀ n Q @ޯJWE@n_z/ 4@ۮrqcbU=0{ٓtZAb[kһ{qWx5n*v*|0qx&s&5)"CNb> n쇞|A=y3-{~ĬZ \YGsfZRIߚ##n}4w4YSHi/ϐL}AuUd`;YOdIl@ Dl A%SN~wo lW\&g3k AKu^4z/ t<G2Mv~`63!7c#SßmKVRJn0Ho > Mih:  ՗bgMYzCx߫.ʳ5δTBI0T"m yM;cͮ)9ӈgmka`-9E(~ 4o&b+PgjOMuuj?q[ M;vIW1߆-'cĨ3aCxT4EPف2bfP#dR6?qo\hgZDC+= #`X)F5^5`Đxi}Ib,klckl %bQcEʾ9ӓB(RO^i2 *cAuѨ: p\@t1/SWy]Y'dG{O9| [QEU3к rA拘wώ-$2fRj~d#՝ U ـgwuyX nC1/Er*{Q@%~!j`&M7Sp:,/HӓS/1z6uR-_ vq$-</E!fzq DϨEB %23=_.ozPS!AaOPgtq-JtbCUqmadQd7Y﹟5~I[)`0Ks{Pn1֮ ЙHRFl_ ,T̡h@66UA_pDƏ{ ؗI 5yD|ˆ(=ZVBČ!qF ?qT6G7W;L2SP_@e&AC$mHGܛko*.֍0V)d"%MzZX &"e8b\ 1Tԯ`;&A\"YƇM'QgGCKӷ:;o dyL-p i0ct,<2ꙗLsU,;m(֖JK/D+:vKX\>_KA5D%yL}EzRSW?a6QPb~X9s;P HaAX|wjT%Љ&CCf`C#oMP'^w˃೰f_jYLVq]PE*"̟s-+&a3̾/m?gOiL8Fv.\Xx26\:nT3.tW'}3?Cvԇ7K Qex1U?|T^mU&x0V93| QJ4|q Pj.t:Qi+TDw:he@nF%9sDt^"JT]Vf(F$KUFVoyµaQq+ipDJ.іT~̣ OŏXG ū,$AqR,WJuS#{6K{%@Xa4rÙyh4䯍[9Q9pOF4mwUװ6$Þ6KIЅ0 EȬ_FXs3.MF0Zts$ \g꘹Qkh@5a;s0>*Hw_)erNQHRc L2Qb2KS@jf٨&%45r(*bW ##s6оboS lm.V RRV8`tS:[BUA"FxE1xj΁*IGnsSQ9_G_!Pp5q}Y}}K^Wj!ޘ\;3:i23#=_,ϻaKĹ߰l~8h0v/skҒw|i5Ilvm›d)Mʭ$ + 2K¥/14U 7;k\}$ .J h׹"=U%MK$24U:+(nۑ~ୈbz޼%yZ6R _nkӰ $vT Ϟ@6}<ȿb7R&82Iݺ$j^ ti9Ԉ9,'^;}F*E^F e@h?" Q/#̄xi氰&yhif+39 ym(E_iԓC$hc_m ,H#ZV+a?@c ? X}@bjW.\B2w!1Q԰Z@OCm S%I#*9LұʭNWe-B6XG\Qתثf`#(P[oY~'UaB2jŠ0@ܯ*0AosNM|!2 ex!,eCvs}eO+: kTB0h@'j /)yZ\uN f h,?w!wxX B*yp0DN^,|(>SdoN`n2Lbn*2lqK;JJKkbt:$eBWssh_>0I v0Yr0$oPٽoz5dzIJj_H.ln&%6c85D3gI*UXu%W hF)1ƘL*$d&Y=хwŘ~wq'DZM^H\73_6{K:+ i5gq"Fh;@(ixƩ*@@w?\OFBy<[-NU,|`!=irEذD3Q}aĂP&ĦB:iaQ2AG&'h]j®fHBtsIv|:b~.1yO>)(걢 ӮYH-rdo{&N9:o"+ 5 {A A֦j x/Xk=!y+vDZczcHzQ)dtǬ Xg.:D[K:֛0,gqI.+^- cqfk{YcNem ʏz٭i}H̦3’a>@^L; Rz0>24ElrsXЏP]faNS_6zswzRa/sA>vsy_>[o/7HOqXYQ @BsIBϕI<ٻzj)ZDbK2\nrᨌ:/bۀͥ\"fi鼵nz]=5 ,ZҵT,_B}u׺{c /EwM|{̥A|~cf68]..^>si9(uzڄr+ԧwQ,uQRByBdD3D>X7&LSs)-:J_s}&\s{> l⠈7FY b2#O&|="_[.޾o%*Ez51kQl5H!aC.-&cQݵ650cŶu[xi= $4AW$.&0eis+vqNmo6bLѻb18\i0',({~&-&ҪI>Nܺ 'ۖWغof\+2t2/м?.dVX觨2H">Kj'.WnkoVn_mZrc@l>5ˉ C<<C? E:[ܓNہ*!g4m6:2p)!B !붎(mc{\Q$yؑY }=S NNy&QJp,GmjB$ 4hG"e=6{hq p^OXyWv+BS_ 3)3|/N؇0𞔂aم" K X ;a1z d>YO%g a*ZnfuĂrV&]sa>Aq7rcf<؎Ww|@ zzyҪіrLr.D1GxN<96vAe1m+ [IU6z| "tGC^fZLr?~cMiq1)^u Xb\v{¯aOYrdAq6wXJw!vvɞl B,9ӶCI7%|>N#R?eҳr0 ynzNWdn@tD9|OL! +\^,NT;(!I.ts؎?<"?4%_e~}`jTNtlJ0D\,&J~.6?NHi.'yK ڎv^r&;/5uxwg1K ?gm@ f5_2j؁k k@(0Y]wr7dZYB^ɐln^^ wɕ+C?L.1e*rhGi'H1^x6R/u4aPhOޞu9B@RB֒":E KyQw#r %2.$r:K%IkʕV5xحqdlX+ƥ1 h5i`KQZΏn(16Jd򊜠|Y14\YuzHPm]6|]K<6a;H%g<,Kl" # 8bG-{tf֨}Yxw4Zx$#-0CIL[aW +4K%͗ݻTMOu2b;۾3vowq[|)-dI!|&NMIq^:*e+ '"+@st96wP'$}f(f]וBɌ8/-` ǨL+c 6AR>*W'N+!ʹ80A1փHDv5_:$'-GGno%jg`:sط 3YLƊPBT¹>]wI4%gLV@lAysFޗ;ܳ/H@x6X?i󔌙zIw\[˩3Z^\lTPah[g7.T&-@^S\w%*L7o2iNo>;@K%x$=8˭#9tUF 6{?fK+L̶=;CR"q1>&2hGbd@78m2W` ܠzt:=EO]pgk>qqy d:SoɎ{xd'l՚4+ɋ1$`YU檟sU(`9АɐQd R2R9u@b% !C6gȽ5m+ńғHoiMCߝtW3.UԲKkSnBZ;{L b8{ʙb#? [@Bxj/)@pD;Wt"F ϼeRd~M/fͭFpz!C$F_(|~eZ7R5d0!;(V \H@Z+[;QH'I-$za}s=ӤNPgh;d(e94n|l%;:N|qRmd#<g$VQMzZ bLp>["S*})>xRXt-yF.7ixG飝M0]pkoNPRAtE.@WTfw7XxN"' ዤPsUm GSdnB{A_V!Ȣ˒(=2>鬇{?+md!^pb㜡LXjYg9">9}G8N?.fI;" p1 @.gg]% \ŲVOE5bB%La3' W`!V >Eu޺}QeN%x1D-N:ol̉Ð# EI D[@$ċWψ >ڻ`ls`(l"ia(B&;/JkY]aev,Mm `ߛ~m2ιRcTݠ-\ ; u0m,VjG@k25,:uŠ߹@E)Q >)N1arQ8ׁd(i0xre=Rɑp1x}V*-%+*}ѯOB":F#wv{4smDBhׄ#rH\Rg2g!HLu cjJȃDurѦ@v"%sUfӮJwq#k<研o#ʹU#L9A2-8ƀc^BXv6=>0K]PC~mnW7, ,"YT|~>* 5q~ltbhN@!PJ>KCokfB/Q==2%'c0)A5׏''j&}r 1&JS-Lk.)\ :n6rR _oV:+1e41Q( uҲaaߞjy z$1R@t }:@263a;Voݹ[:!̜u-)Z}>&HF,ٸ52_RJ}%iW2%t*)ုr$4²Fޚ%RLHm\& G3/ԙ`s\;xx !|^mQ>(o9Df'f#$Ch$FZY5m^`}ǫu ,7wRês ÑqziKZfd"!Ƀ&j982oQ%'\kD*d񠲿:5:[2OU8&[8* nLv9h$g(̥-*(np6Ԣ9ӂ7Ր8Y-̒E,mMW~D&6%pdؚ۵tE2URIA*zG!3akqܝ6 eWS3*#W'lYAz9 { ++̭Qw'H?"'}|{j Tc]̴AOp$ t&TCG{|&Z[oT}'} `G7*oAҗd(kE8'/I|)8t6Rno斷k|| _pnqob`1)'S@&x7ew*gdD8ιn[E_Xt1w7ߐG0,^w)}^Y^LeA8,2 ;Kh0x} SkM#5}u B{ӜOWi̺ s,`Eg-8²".5u\{ H'ym* =𚸟L9\ NWxÄ׵Wz+4كuW7NwM 3d?ڹH/Cq$H$,D_P B>3r堃1BokXCQG3Z zNno }ZDbnxn=π |6o4>l& _F㶎XZ`_z- 2 es@32Q &U-Y g#|# QމcHrX6> E`C A h}#2p'Y SƁ>[aBH@]8-)-+v1劶Uݑc,X)c H ԧJ3H.5Idrׅ nYnMbACm&Ã]u +hG^[[tq!3\םmuj$MW>9,@!2]㧥)DBʂ|NHuφ4sv}Ƙ7řnXC&ԙG{Y3;u"l}3;CAk!DO2}m3 /q.q6z۰"eaKWWi/Sg`y?HqŅ"`^5`]bySY#SyDR"QuKI ٱ9^%vF L'9ցa9G?dyC6GfB`'v*Lc \Ul7 0XE\Eht7FUwՑ2.x+kYwEM|] Lʱ&  tٿ5/N2:fήR3 RĦ t׌a}?5oEswDр<%ϊ,7+-r*޶rQԨ4;ĩ(hE߱-@_{o kB\4+49Wjei;$͡5ALI:WC̮-.cH R>)ÏjߌiޥAz^ؖ͒N,&)E^sANԌF^. >S 'B=4P 'CIMzt4zϺ@`W^1byR>Vv T8|V@\٬Nr^]| [HaM_B,1u]|yHq`a`ĹsHRrj Eˠj%Dt&orr!+g,MV'!ůVlN CP.(5 Uܻ6BxMaot3w-L ̥:V8p^1L׸! ϣHqg$Ⱥ fBvdzE>[ Dײ8;Ac\T1}Q 0~;McM;CztpNaaٵP[{<ɜ@k1F[(gk(oM4E&<ͼ "nk&]B* . mԒ,(g,[xAŜaEe.4 ZB pJTք!wM9Fl_:?XuhRJ?B󇍞m;LOXw[ 33!vX-Qxڨ\nG COIxJ#1e0AnJA̹wZӜ xq;U ;d0\ĢĎ-o] C W!a(0$`w4#̆ӂ-NbXݷ@ao :*.z1Zc- Qa 0+: VdjiaO{wW9hf;9Jk4)!ˋ_^ޗȑ;V>ju{\p4NM:PW 2vB o(hLQً \)'ܜEXׅ֑LFI:*ubF۶9z' K&No~@@ȶ9'6t3}"2-JA]%=`ڣً x,x *Bbrhp喪ZHY?Ĥ .udSz0pM(DLb#A;ZSr]"Lk4?VXخɱQ0&U.BT-E18%(=1S3X:l:``'[\L*nt0pYiu 8Gw'cC5#{X^uM˖Ji ݙQ+t8  `Fl8fʘALCp4vomH>u妰3E xUJ-FX.^6T0*R$ҭDjʬ%HDװC2;hh\P^d<4Y_, #Dj8YI; >vW}Yrn< >=.+֥aX|K3O Zb8Vg2#z]ϲ3MeՁaD&xm8 B݋<\1^9bWD.gT2N_͑oĔ[4jO[KgNRA2tzh ִ4_OдgQ%o05qW9W̠I&RER%X1|K9([xru_I1bl Vk=`+v #b|7dzѭA {i$zg2^[=ޯ|x{/v9&Fk `t»5eITEx1#ׁc@#ggig؊qGZBB?SCQtu7jw;G{r-CE"n9pxE1gޟ~\y2c@JVz10~9,~&([k)ʔptoyX{XpvV{ܷPҘwu-0F3+-mmtQҼ 8 [m`lccu?}-~]3*"urZ&C:1՝rb8 ”B{h#Yvg1ux ><qF*"ꃠŲp-8ڲ6~S +I^dޚ+h0 CaSFAP W+'K 姩 ah ׂUYn ]3Li7cx8=DʦŨI0Ssk W} 0TL?A(Uߡ?bQdd$Q ċ~:xqC$R,+5zPw7Lэ5.i&F=,f|xтV/52xڿl dv$5" N'?>FTK>z #9}mӲ;GX=˜؉2*Yj9TZAN<9p ]R;y^aHubsa֡J 2ϕӸ/l\Z%չ!MQ.ֳt2>Kt*75Ǻ ?j3)bS1Bξ|lA6NV (E;,Ƥ]ZS] g1[a(b \( ݋mB#ƮʉwM2ǎ7#& +•gЫVC]'YCGAoC#ӲbxdpS!SC%%p朴-4l#pq?bQqDăvQ(08l2Kƺ<3(LýmiC̣H~,~p3 4v\؈kaI+Y%.%jEM.~.nޡ2y&J[ڎA\_̨"|&69%VːqbO}G*Xk =^pwÂtl $fQC1i\orOOp1vtfz*"4t7VhRn?y@R AyR̴ \<8wI+Un`◆2a2EJ{i벋r&?MH4st,mDou;IclĨO,|{SP3 ͩjfVaR;hɴ[1ܭ }\%ȸ8Z@"t?SVS֭O]V Ci~Ai=t,_NO?Bi(q1 jkkx!(J:_M]Ӝ:쟌b5:!T_~F/ I\o (=VYMxjp#7ى^&[3pyfm$~J(1҇ |eIhbOԥrtX~5TL7&dz{yPusZX T(cCV/J9_.}h`nx<~nD)x_w݂6k+Ң*"͊Oxbjlfmo&酳dSag B!2uN?. PdqF'2C,_`>WFaE9B\PBz֏:(ϊ0pcU2eERӘ$ݵe,F@ Y<(V!x2_dTfyyѨ0Ђy]2T4$Wnd'{B/ @}6ߧpN !v,;? Cf׬89m+ghCe{ EN&Z1ӎ{zwrN' lqEv:4Qг'aKC04,V.K.W tReS*H(J7~qyˁuӪ BЩjhw{9B.ciޙq@2tK^=vdӞ>g#1ʟuNWCJoҝl {NlV­7i7Qp5)*Cro] jk~C KK8.KO+w\Lp?x!gڣܱ%WSNGDovcEb"Ϋ3 h9#v?3"^@Z"xHoq^~,XXlc77l](zC5z+u sI t{k5OO}`iu.JY;.R`C@w!9k)9H_ ܬ@:^K4 bnGK'L,Gjc_=iS %ד@L֟p4V+eNϥB6`^7k$H'y HHYh/ؾĮ$oǻI;ehχ5RҊ04C[6 [/I9@;PiVƼb\K0sֵ%R~l;|,1mWoFMNa-$!e:hhzJez}&D;0P3:[*ȴf gEj㍧"U?Rj(~ժdRk\l.Ё^[<}T, v+RX-4J/H$O Ic$p9f"]|;M/(MƏ |ҏ<@)_䑾Q-|Ea3/QI0ߨL oQrbu_ĺg~Ʋ?ǎ Le8T7Gq>bJO-MSun&НHó7 Fڄsuyk XJ$X"qpA⤰ \kWanb sy ' ]mob=#_2jNŭ vPxdOƴTҁc#HCk ϻ#W qtEJFe@+,J~QZ oPQ T">ϨjDUD EV]{8uKcRH4+؈ wjJTV_#`|6)4|]Z5inEI'PUZJj?좚kS Y-q6{7J +zɱV7(j߱|L!պ ˘(jbX&5w <wZA[k+{C-|ɇroEf3/z@|%d2Ax.K\UFcKF\kP*ϋ~}Ck $wi2rU;JbG\5W![tYUC7(+,iNF[Yf1FAV# _4u% ܕ!+ J>t6T:LՀL⡎q6a\̟$wL4.Nr#{}}vyJn*i 2ܣGk1^qM2grjh7{;nAQ BDHCxƿF7@ <+T*ZF:@w ȋ}cEL D85\ //!.ڋs^ZIm^ xN7(FOVdYOV {Lqw3 +ֆ/ƥ,L=RGJe/!24* ʌ ~ˊ f[f 4H [zׂ;knX:Bg j#n<-bm-o﷤6(;H+@Qj܄7TUTŊ^W"D]x gfS\`TC]Hp:a©q;¼uDSLc[~?7g+W-Ŭְn-ݒAteY Fu[LS @v$jB`>uPLM {)% jgXo_8NlvF؉#cmΎj#?uM'/Ȯ ^YVƮWıeØ\"Jàb;#s{`oXt۰mA0Rgi0/Ձ,' )7=FYClyE׊;!Z[% 컗+cj p?IK9L8zDl-UڀZJ6SLJW NwBg"DJYv T>xܨ)1k_>h[aP;1s#%˙T-;Uȹ <~&5.&6+\_OnP8=o*G@r㋆ITc%a)qUM*7r`B< S0.&hE+ׅ|pA崰Iqㅴ8"i 2W5I 3z8EPߨ 胈c6j::ٴYKV%CB^ЀGwBַ}K{϶u(g];i{/."г&Q T0a|.@VgIBp؂y q#+aJd;af|mw(ww$viie)av۹H* ~UR鈴QɀӠ{BwXd# Xn cJ&]$Me4ޏt64zf5 &#S3J0QĴ\QIt_$*5͋zvoBk^SD<HY'f=1َޅ ӾVok5UOLf3~Bo#(^y{ɬ< A@hR4SѱpTҍ Aȝ$G ;±tvդ7y>&, ΧMRRZ p"ǧ^EO!~5M ޗh|h :|S;=7=T_JWOwfB -bWclY3,̳F,x-3G]34 5$tϴAkp P~Hz T}PZּUu!O4Qn1/&DesIO%lAW&Ci 5jһY/]02,APT( EtFɲI5n%1:Q)7^*D:qI(" #1x %}5/VGqyjThE t@GJky2[ՙ=KRE vO 28HWрnJBAG fBPH3꿏F+ 9܉m[D8 ofb'ץ{B,$wV6=Ow2iI gGn]j`p-QpE^-o$o8Q uG~#*ׇy䶘PO=>Өc!K|}ю+̛ rP{6V 4,Jx/KV>/)dv7to&1RfD4PiZڢSdF oD{&E`2ӧ< jB|ONR"SAqW]l5h/ɇ&7k@*Z,(V!mSLȝGoaW<$SƢ9cc oE`.: ֳxz0W;lnk\gɶ $&.p[u} 0>\Pd}ZIfJ97 ;GXWo}GU0$k~U>4}63ܚ]2o59 a)/(́\>oP#^7ـ͍jqIE Rخu .ZV\|g o?x)B18.^/FBCZ/EBAafPض  <#=W ]=¼!L4,ǣ(]oM!}lʵ3@/x$rF[6Y~g=8F'2bE-^tLR* ,ь8U)[c Xu+09Sr9p Sib@7r1n?O <v3rO\7T:]-aК!pA;ru+9~fv02V\q?UCG] ,eG6 DԝAxml=3yij pW.J #iJQXL\x.:C#!y6d/(:(IE>3$5!{ p:HOW__ @$>jp;[Ri0#/?(Ȟ0{@['YUpy?\tkhH8h*tс ϐrgB~96H3T =|)4N>zvYflxgOE ηj ZTJxz^._2nk,wTYӶܤYI֚%qAJ#HLsX5Jo2~=FJz6H|BNAxR cz#80#Ȫ3qYU1R% Ĉ޼Y[³6DM!^\^W9zw؁aidgUt+A ͎ASZTOtf)Dܚav/ "eՊ#U#۴HUhkOHkՙIm2[`h ('n0ë51m֔#*.*dy׊FB<$R "Lk2dX[* "B pu2xEB i ^6D]8 @vIV![l }~/[_;?nbHZvfjzdN%M*27dr \3xelAm3#=n'*G^,IO%<BbgY;=,ӖR9ksn=GQT#{!\a9!/\^9 ;C|^Seob0abֹʍ˔#|whX5 10QK1qtrPl)ݴNKſ*zny20zϰ/'ސkm9-1I:3̭IG$l~z,SGgcҴ Ns"`}*Z̨"ɛ:P %\kqqq udm"-jP\wk|REχTY?l c%G#6A5|0z*r .JAaeG(%W4YNRE#:FKD;:d\(kjVBmi*mP0A*%r8 T$PENk3(wOK( -/.߁5.6+@<ɐj~᭙QMC<m_!o @yL+Ar:'!▆g g(.oX챕qptn~`('iy:owrq|bp׹,L0^HҨG22+ą2zcXΜ8ZWHׁpJۺ\VnB;dԴW/I*RLo qNoUoP2!f/Ll%T(Hݍ$ Th'vCdGoDu'ŖcEohvq0Gtk^4 \ׅl^ts7si94[x10X h6$B$Ik$!@᤮(#ATיe Ӝ<؊DD*j4qBq  &] sDP B8wY}dF$1<@5(R kuڼ'q+}̓JlnUCH{JT0, 9]F xD*HhD▃ OD_)jĴLhO$IEW3hNj-8t}Z֣ 239@4=p V/+vm܈]h" <񍔆Bq3yQ H -dp=P) PPp,~vE{i#z= ˸#_<찇wnC:%p]h6P~3Ws3v#!3EZaYv}eڡˊ47TB`|/ۛȘx+;"i|o$ V9DWZpCj;z '`J@R*Ud׬ш p",p{iB'$b|@cAR"64l0i2]zwj&ca C_ml$TSJ>XTɉN aWT\v CwZt]/`=#@N4 ӭ>=[k{J>H]3J9;y<Y.}-HL;6١ +qpKb{$1n'/P_JK*hs7@Hq?Z.SS% «50+c政"TP"(9s"U<0KdQY]Zئ(Y[N%—HB"UȄF4-FbcFBA ^C{+D^,& `cf;+tEFe4cJY=gL[o G >dGFnEOMDz`H ti@6l3[ ъT`*R#(ʔȗ܇dS/E4azOJՕHeE< WXeoA`P#ư/b+1"1KsY<1m׍8;u(<M Hg_񥦖Q2送z[9"jCϾ[Y"T^zfD>Q!Bz[N3 ؘ坠rMҦKM鞳O|Kw!9zA.Jm C(T2Ll M^u,Ci.c|Ι> ? v1H#"f:zS_V68]¸x}O+ 3soJG,p 9.5U11nt4?{8|^u)qTܢkxRU']RVaڭH2~Hg4!s+:`1V@[gfnMKox]a踿jGj3-2mAS!8vLZK>}jix9<׌&"8ӷC{'!h 32㠄-= lMR=GX*e J=ȠΌ(`7ԎöyZځWWꕵ.=9tdeb@Gzp*@|2"szl%h\w=~-X .&A+=}5{0!#{\a&=.L2 if _BA6sl28pz!xt89tLdyJ?Ffr_#A,6k?i a%kft\ "Z4'yLY Ix3z{Zi6wM(apZ%KjQw[sue:ә^2+3H9w@΋1hйm\=5( ~šTwݤ̎ /:Y>4SyU]L.F)QsU3R97IZ aUMBv!("cϑs=g)G`^U>PCU2)$  u{ No4w4])2}p}3MV4epsN9Sַ^]S ,oRQ}O~`(-J^)ֹ̥חh2l] 'g)w_=f="x>mzUc#8,[G9ͯ萌~db8*Hay1o Qh? 0ʶh0a,(Z  wȿ7b+"4x\v2"Gύ{|磗 `-6vb({w]KKˤB1,ɡt}alky6Cct\z3tmwS kYƋKoaM1 "s-+ٮI&atViXyuhU}xj~ /jm<}}zԓ1EX4v}m1kIֆKQZ ES$EcL ~r8p'A:tߵJQjJb Q |9 h( tۙRiWy˞#}8.߈@A.M=I- .Μb)5a<;k7(Ukz@YAi^)`o?fŒ5s~#kP-?wtDؘ[ F?ME/|.N*2'`0 wv?[?A|, .2K3,3A 'H&U}?*n?@aZͼ.)E3~Hܨ5gYdHRmӣ m֛~:܅Sѕܚnqi?{ i9._-Xb,sUMEzg;Kz:w!MY춄CC|8`B{|8+kD`EF)L:8޲-+G-Vg5`0"mmtt._:\ Dh3~»E-IiN#ry|cj:|;VfZGi\qe.̄51ؿ..x'JQ3WBOO%m~NEr\! # ZyHڜW*c"hh~$c@U.a(9V"URoVyiJYSTt9  *,8NoW|}+\x=| 31h*J9\ӗ ebQKmSv9k[ ˭)x{Fzc4+GT%B5Cj9N9!+B5}?6\IWnTj^ PJp9\8G9ldZulnGXm+,z%@1o:u"a=>췙h%gbWDG1]$1G %e]T0HVj89RKxI- y)+iJY !O =.쫅M")9jF_y# NfzTYq̤M*OK'dc ʺd*scqyU{1};Δ/NzH Z5zg,;2+CI3Ok\ LA˓jem}R]v3-Q8)sQ2lF&i絚Ƴse;Idǿ>%/[r3#!"̾SCu^I4Of&eE)Rz0ҁؼ1CFOm|iP,goG-fjRshY_)"B+1}C@KCp|Xl$u'{y `BSpb qA= <o V@!M%A& 8YpHbB1"{,sK| /,*QT8GD+7oPMynנƸC]A,sìܧ. 4k3 XU2SiʶҼP4"*e1'(:O; \}^[0@~xQm.+BPs-x(`b; (&~JWIe+l ۃ$P@r7?DUwx.eROrCҀ;]Z&3Yca͚/).=CRMxg_U^3%* SYCA0Y>[s[zhXgq[ Vuwc \ҒK l)8LJ_vഠb;Ͼ&0Q?]f gXĻJTkhHƖpjR$P5D~ 3ی% S55tTm6~f/>d##W6 !5E+R {+gQgA3[lAi/t4mk fP]%Z,36 w2|wAdŎ"]T}HƲ/j9dY>tԂS"NEIL E.`[掎Qs)fOx\э]m#3_dS>TY@Hv<}p6ZJ (/` 9_ wJt#2 ;+ %*L+_]9oٙ#SmA B`s< ,hҡY`@U~2y{lLm}> &{""#'!]8*ua #+g3ELWSJNN# ˘ 83ǁxxzHry5 JH^3o0S+KW 9oZ(w|'GT [/DI|D-ա= j_o~\gYn~n+4CXܳ9 bhtj(c_n܋$d{H)ߐ67ݣw5gWUOux(]~ܓOJ 3f|2?aV6rG@>鶭C RUR϶PHЬF4Р`Wux vMZ LyY{X)%aD53vfojW[7[9dw1Q3% H^ſs id&&en6^B"9ǖ<9GWbF粧P Ir?:Ӭ)Ĝa eN)5'F;' "]s1ݻ$j@ Ǽmpr;i qI}^<X.=6b@hws>jy=lPk5sI2MAn]TyAγ;u(o%h&ÉFa%#un=[S ܓ`i|U$s Hta ݷQުG_}Ru4-e;{'ښ>xQ4OAmޠ~ 6a`m\_# ӑDxRa0AT4h!aL<ɾfs~j 6lqɮ~ji:mT8`)5e>;(i D6>qoܞpp ,|`Q:hHUHS -}A˰uX;mTVJkݧՉCfeZww#NJWr eCg0"k>@38tN40!^Y/2u,`6&>xjr Ͳt<6in?4%Ev=Ϯa8Asy5‚w $Utl 3ҩC>&h[Y@EymjP#D \+(M(mp !3F>bd&5@K_3q \ ~Hoa\ 00 @{Kf OUAw[?JPލn˴Pb\ۚD@q07߭{0I΂)Ok/ ߫IE@کn| HEcN4Kqn*|EMomsXg%hC. ~}A`) eB?vQyB,2'fq2lPHp=&i N@@pڷaٷK5j=X~vI-kh`?Q!z+H|D_ɖݯn*lFl:#I C)& +Vgpc rL!oDQοW$MvS rkWb9~z;m?!A/*v;.hЏ;UHT M\HrݰS@B|y}jP2>@%n. _l*Jn2(8xM"Θ5[hz, (z٤in%",rOW8[y?r8痦"{ Qn ҂׳.f@sTA.ʄzui=2by=# nA|"` Ci$,V cY >F8:( !ĮTxec@Lr|`$MDkp2{/MzXPO5 ).]Ư~O@r<qT#ϗ̞fE!i, +:CO^KA 9?3yUf{m.^P%Cf'u(wɑ 5E$Ē;k!/9Uw[&Ѹۇwe~ pԥ\ jS:7sz8Fk3a)fcf sx} a/sD#2qKUa9t9ZӷWy98H=cA"Azn7'&m KX `nB @t\=+bo|hxk0進tr^my}4Yx@P&U?ޚ+a߭:_ܖXn1:{[X@zj0-tbC `=sP @E_(Vj[|: Ek j_^'u5gvVܯ%XDx3;0 k (χx>_9@,1Tj=Y=3Ǥu0sѩvWrǼY LvL>ߵ󲶶 (_D e W!A$9hv ~ #^5+X&܅ oC'@7SgK_ %o |_* #!/%De~ě߃/'h8z# NG̓Le4,m.kkEB(U4P@ !)  aPf+ƇSNKppDz`{ǘ`YGKrl1 3aUb؝sPsE+Q{ɻ?i>:@baz ʫu~Hx28o?,ׅfxWKr~G EK&]%;}v?*akHy( } B=~@i34"@0jc NRo;RC#oCc A'Wx%KO{ClL Ò󡸚>ji=z>bUzRl>"pwXh<AZWdǮ/a=K0z1ݧKm&w[لq@*לl+3c <`:/H^@#UE}$PfT<c{VoqK Lb482E}`.! [˃7UʟH#c Q}N,V.GPNjE wUK(73AK q,$YQ[U,"3~%FXkj_f]2Fiߦqke1 J(8:xx>` F>}s4p礈5J5AP$3 6V _[2 b'(ɠМކ^cwhf6Ib{܀ȪLCV"XZkS1YQ>ߟLoƅEC3-<ă DX"O,8|">LWR6ٕ-F\+sY6.GhܡLjg!= & >:P67=ᯤg8$Zf6^ei=U6`/5hЉLqт(&[N{O` R*38SC26S+EO0\ݘ~ V p[>)/fV!JFpXPPGW(pS|4 8f~/O :6S^-216h, A .sE%;R [i%pi4-neǛ'QV$ !K`MdPpq#򖯧@$Z9ŏG"$R |SOa#ԣ(vˈ\rhП9%}bCѩ7jˌD),Bք 1˾R aI&䂕69T欈n |24F<"oHYbCann{*)ApC:6Ǖ@ MKv9 B8 'YBOs_YUZu`ϸ |U9 !ʔZ[ՙ0 'nm^"|lyQ*4WI{"|"IkB3tnhF`:& švkr(cnG0F>kԭ׉pR'EZAlS5R}z49 9/В+2aZfw*g,{>5hQt_ SXW`RE-.K04DVG"̧tqZ)co]Rӏ\+$_.Sd0.#h3"9cg' BVyB{F/jmz|QEJ͵ШY-U1aITEޘZ.O芞 .m,=P»xGР"T2чp ߊݛ+~ T$|:jJ4q-a3tn) 2) iVmDlǵ)v+%ުCUJ*Ʀ: &?+m*NJWȬO6pÒoWyQVusB媯v2&^] *IU_޼?<Qdw,}z +z/<4Q04"Ze#)Rugrz{56Iςҥq񐢨%ʷpѪ{'0'D|*^3 q#pY2( kK\ł-o; ̀#EcgUo*x$x8C|vΰ\iEr**g%`'X=dSf1(dЁ3߯ytw(cޤ$ GyR+_`;F Gj_'Xo?A\GKb2G,\, /ߔĸ7|ɆoKPCf; {f7+!;}L~-zuǺ($Ĭ GkґPؑB7{ կaW ̻pԦBHmU D?"1 NEH#5c#E>-Jٝlfq cߔKz> uM;І//j G wEWU1b[4yGx7#mI^WD85dSA3IYo@|TpXLqg,o_#eATuUI y 6LVM@&kBDM+ĺxP=q4UōR.@ %;wp (A 9>4t_rd:d*w=>ȇ 0]8 Bi=lװڭe${NR)L qt3Ѓ}zȏQ{a^eܰ'- p5}^K;-.lF-;;VCzfs{3rDwCO\"uu>x*UL aT҉vRX5xeXI`MJ/m26˹?v.{T"7J"7qPx%T!Ⱦt(͛Z5yk&w nN(L*B-e2̋ Bj4%JϾ Q' \R<9MA.DM-4ෟZ&hzkyj[W/#.s}ۺT7x;/B^ʸ2TW:M =ك"ij]t}zɤȵug7~ҳqy^t'ˠAL0v:m&s6?L"EĻC7Xd3=E<n`=}zカsUSpInUbŠΠ>wԍTnJ xZ9kehfKÚ:rśw g \Y8t:C(jgݦy=xO` dɨYڝ/ Kq}\r-?ė"1qq6p3_h;UQCCֲ?+!Y`qֿ%{!'mS~b!*-dpJ740:HY%ͻZηK9Kvߴ-aꁘն)2vMn ̯0oa*j/u)C֕I @k:(:ˇ6s]Vݴ)P#yʋ4X-l7Kf#;I^iaP , wR~^q|<QV߱WWhP{\8/uB qmu :Fn7u+9CqK:ޖgк3 rhZ7\|o?nIuu-U̠ .T/)X !vHE*/fH) }يv&ceE>F`7CfOQ-~Іʖf">A2,9bXEQv@pfZ7ʽS :2$Ijy^̬jH{@t:Mʽf'_aCR-;+iu H;YL""߅IYo%~߱;xܨT-tV. _c- G )-N1ؿw`=)0]DΐЇ6۬?Y1ۂp1!3-/"=6J)2v}mHǴZX[Rp[|0Ay2cC 8'C$p68̎gtȀ[TZmrZG#1E cge?E,"TMD ț*YA ӎYlFNUz9#1IgC~I@yBaH7x0CZ1 ]Xu HjԌM''8HFhTc7ji#F +s\nÎ5*Pa2Yp8{_U^fz_H'XIҼ f8DY.Pd{ِ/EkJt"adҟ3 rgU0 r˿Uذ$[/y^QnhuPA !l5 uIKxTi :X+g(/Sz*äs}`9E3HL~0jxbs%&_\TmmP+' oJm/LȟVs`,̂ E$D.}薜J]ͺO) *J/ոWc^J )wa U/1:UӝP9A=KdS;i ϶=AIޒk.$B'iCM5 nHb8mJG&?)L=2 L Q,AcgPLr[>D^?l;H nhdDd-i\3}Q(lJgCWs$NL >Nx`}*>t>2BeR=e,cE2g HлÏb?; yO_fM$cf4YHʜ@72EOݛyYp=7 (paʅ!ܲ'iF@=d& m|)5&SE%L 41id# hc0U)==̮Z,k+NLH*_F x'JKb=]ʡroDhBSR by) ,%|KmeD==[;>e+pl8%}L!4YJ/OJ=?P",gBm4v ld+N6{[J('C33juy\Y MIL܊h6Y /<7dY)&-k (A|tt4,c+X)flɒc:j=, +ɏ? >+ t%X\^Mۓl'Э&^,Pd$.婾|`5xgGT4aQGQ)S`Og2 pu~=Q_]fol<z[Kl) taT;q~7jQ&T/Bڷ#8mK=<] ,|Om"zF{F*DR1W>>5D*/mꖆ)ŝRwNy݀LK[ ¹ꊲ!Yrı/MyrfW䅒2_Los`upq'H@f"rl+U@LfE`_8my-UZfxv)AԤNh~)}Y~+4TC˿uZgԪǠWas`1%'+?gj}q{#BY+eE.0M6=(k!;"_m=CgݡԿDžđ۝p]3i\8|cڤS1Xeǘ  98D}l‰̎VXئrx0z=c|s\w۝7&-Vh'&AX3M3vuů֙\+ -SuE|ܧpb~nXB+ҾF-\ss\=ȼzOIMMaruK)G ;8jU/+ʉ r >rT*k#'Y .yҙ}9 NJӱBU܋}=gQ rx'2%=t3*A'_vLjfn>mzS#:5MJ:oq\D[$KQ%i; <ԨH`zJ폸bxHz`Hv t \mO_`Wyn1OWtNsloGk01ǾTı>RPEؕfAbMMroLd>׻$QypQJKCД rk,iD[_/cq‰GKNqwT3W8oPUF֓R45<1/Fftv`k>PXb0 1HQWp`XTAav,i| ~F׸A)\anE~fI gI0_4㼙|/%HbrbvXBg(A"37$%:w?*?K|23B ض7r"L2+ij ױa8kOg+O*-@5YsJ>zij7A3}dL \s ](G5x>F0?Z4Zxݕ:ߜ ]mVɫ `Ptݺ,sq!.PP:pKCT\;pSA&Q]I\-BJz[ݦːޡcy2[ܠNT)*^٣ܦU>q~fQV~xD6RXQz1)}5pdI?0]zQh8$9C&w< Xmx)w&q~ .0؆&ޤ:1w(]+PXR1q@P;v藃Kv'^{aԓ OFØJdl_9v0׳]|e1̆]H_t>e0cY@FMGHs,`[ssSQ/ ȥ-tCLey~)Ja]>C,1u^T!;lS&3<_(B7ZN|\`ff&?]^s)ZA 6??'h_OԬL o)sb<%gAENi dry1A8'nXVUlLG&;\Tԓ sZyQ| ,Q${>->!^C)a$mGdn*F'j<:rG˖#pDi] /$o!|=L(֑~|JFƭ=4.)aq }XT"R6kY1{>T-l_2${@A=3z>"8(UfZEt/0/ԀC4|8 Zɮ%Wg.SH⤢gVYؚE<\<;o!`5tk@3vx(@T.颸Zp#x}L 0YmF,A$>XBkVLvF7T. ܃`Z53H )%=mfz/)ǻ 7NdǏҰӺgMYYp,(hBޅxm,i'=gU_IE~2Rgoa3!I"cʐU/[niio`;ȧJv g^%u. -Z;|;瞼quW=o nav0my)bA7*./V1Fѣ)6S#JϟqjܩMH?Z3@Z'lkZ*teܞkdck/jGΒRctLyf;X7'ܫN{0_]Jsnt.-\[֖q<*>s˕u65/Sϕia1awnB=:-k3jx{{թLn/χjuSkoZ&޿^xC&S`ω_U"5>/ 1&}/LzA3iY=ti~jXC˫ ^gZZRX&F_d"k=3|ICT3jY(I031Q5ăDibΔ5q'?6ٕ2ndC{>dF!B|at Ib|V@hDY) Y+'B8J5&thxz{x`>vV,ʔrk@B<^] Sn$`զ/3IM.Ż<յHweW>I@W6wF/l{`"9=h3STW26{ ;+Zwۻn}&lu`:VW0Q[]fϠ\E*T@3wv} (5(VZ)0 $uGimVMF'q e[̫r$ø?7f a,&VuK`Kr`ԇghW#NXL.wgXAh:i(cOƓ}*Q@U//9` ae"|r%ޘ"M>4nug6& Kgځ͉P57jGY~R5_ 4A݁2OzRox JPAu8J4Eih_L qX03|Sv-~,#< œ[ nc{r>xcG` l*y9(pv@- W'ɡN-`ވd3Tsw-k ńSQjǗz2nY': }Ak'a~\+t\Gy^BwCp0 `.'b3;6PtALY, Ni=N4Pb܎,+PXv<~މ_RK&!As Z`ǵXnGeQ2Kl^o--o1zp£(1$-CӼTI Ickk4,|B6)k/g0Br$>C8 8$RZ/°T{nEc "KZ.AC¨yLڇ+M-V ޟZn_T]e$GۆwG~NԯZU\{$ϙ!UγU t\ hxD0IfU%H}f}g׾Oa/ĀІ-*LSeDI9?0Y,صVryf:)3p,Vy:q11 RElyYjݕ1@]!KµETI_" ".Y`Ho:hxpHE/kyY ZI;/xu#yX1Y@MzX"} 5^ke%}Gn(+n*+u,Ww"UG;ptEDfw XL=gI y#lEarX#kf'F'GgG/1rTDlZSj_Y?M{ݐGX a&Prb35GWGYbmU6}IRiETjL(+ K+JQv ڕQhgXDF6y답(a;x9Ri/rUؾu fgh[0Vv in<ʱbpE}[UHpG.s"rw3t?~о(]bv)FMɌHnDWyY]/#GZ Z21d1'\钼Vge69)$?+kF+gC<*rjaO ^/r-cԹAϥ~TFx0?E 7}+i^'vPYHlv }_ʎ٤&<$Yʻp܀7Jtڨ-H | Au`^8rlg/}~dƳm` rSjMNZͅx *b*ۡд7窬%g5$@2677B6Q T2 50( FDKŢD !i@ВO:Z F  %> Tk+i4m=&9KdBQ!O@L i 4vGEf5N۩012^}7B0'd́LdJ"jسyM[]: t>\DBƋI&W6,)㷸'*Kq*B?-Ps|BsٚA*`5ʩQ ce ⃲A9 TF•N#Larg`]' ԿY!@%pV2OK_L)H& 5jc#gPĞ>dOUWPdƂFCE3s>zW`$5Ad ;}#jJ ;~jz3}#脶Nrn&%cM-G/bt}fE'QlbX.WA( 2&X _xd<; LȂ꘸6D^P]ЛrRSD6iVvj?ux+ˢVWײ{ryܟX{?[yCI#&D DZ1rxڷ;%{,h1%3,FŞaA KtElw8! dT HxΥu& ='C)b1O`4kd wZ`y=yn6sQ]-T0/5:k Ϟ;Ą?I;P3 pfxF%$A ϤYp8Ȕl//:ገrx?PDbtS >J9R |T?eI7P׆P57 w+JU5EAc̀/[ g d70MzC=6iNk.?4P1_jx=bq5g~N҃YZAz ] L 5Gdч6Qj!*Gwb&VB!`xr!>g kIHgkop껺7rwfb$Rf]4Ÿحч2ADuoE, EGҺ:Gיe| kN;PS!؝8繗.>&/sD j4Rj906* hy 0_3.Dnst:7o0"_Oɻ9AlkJ2t҄_&adP( 8R[a+P7tT❃:uYR1)8 t{@kY+l;[j_JO̿FW&9[cb> 1wc۷#!>Bʁ 0תm$+8*?(63xQ'7 }f_<OFU1Ȋ$ˋ(@5w[&0h(|9Wai=cn]O+E]܌YQ-0,G^z0 d0)ϊ(JR'L 1F{ѥ31r0~B=Ƴ?9R90M:g**WBm40y>#6-T& j,t.Oܷ- Tpʇ+wh\Ws[ 籄]f6Ol޿7IUl}'8dKaHO,CdgrlXxN䔙[h_=>rv^r- oY4F'W$h]0v'mre]׌}̻^%x]vZYM+P!d1y|)1I\'K+-5# C9X4۰52pGZJM$ >&x/$7gt{U]VEs 6ht6;V@WC9vꭌ~pwQ:PZdBy (+E+(>+8؉I4 `7z`jxiHiމv4Lc=$x04Ó3s[x?,~p ֱ0xlZ7=~~a\>N+uUCŢ8AR#"V#I!6{v [B8H\7%D7 2{C^!ˇO6Rk䲑#;RHX-f{_w@$mÈPjzgQdߝ۷%ypMvlhn]?D a}e[#ӟS")V1ֈ@~1؉2j[֋zAEa ϤGvRb=jܗ:~A F#8CD.”޼z!d:0#*1s`2CY6[R.R8U7tκoy/3G*[BQ}GaVߥ<_މŐK߲bu6>Bn\οd]#Sg,*(gH4FC/e!lN^toa)1K3zR#MA2pc`8;ÚʔfuDKDr>YFWW >:+]吏x ~Y`jyy֘]ӑNB#Q_VՙiHƿijυ lZpV1q6:4)xm㒴HPԭ~NNPtmuA#eiJoA[doHo!yx0BPϪЎey偟, [Feii[%GưO(;%6 t('å׈p,tďU8 OrwQ΃0** uIʾșl=~>ڃTwf Ki5Gw$Y6=@ZC(Q92FFL|(MDiQ:(.oZm &Mı0kt$;f{a@g)|ҹFͽמ$UW[;): }ϔ%_ћIp^8 F6i<}C+H2cp[$9ej'㭁B[+HQt@&@A 5-;nw,7ãW#s9%h72.:Zi[lrX,U3 g5+7Sͭf@Đѣ-XK#L{JQgmf6]?{6 -ﵼSryiA*nrZ $FgC7  tb»K)Ny*B w9>8y폵Fq넡ލI5N`&FBwoRЄ!(cqx U ؇:Uxq*r8lp5Ru$`j _EDrJf9If_!/n6AwGڟ+G=-Lz3tah]\-6U] [k=:厉4^hol0vZ^ƪ_@_@ۡTaӃG+y{i،Tԅ{31cx^o}bV%xZe{.g._rgČݿKX|۸ˊO l32RD$>~uHvۓ<|!,-ˢM1XI`vT`&֦w=_>)ӽ0+nq]͡˶󛃸oNT)1ŊDx/QŐ!i^XeI^16qiք'_ MUukQ*:sٗ%IicxLJ}dZ27'O׋,:xiL':5%kK%M/N ^$,骒s ~t,()MAHYeEhwFSL+6=JV Uh%4M0a/%S]n[)]0zM zM,[UH[h$`'e6DR"ڛWL z`FX!E8({bA!cqR Ҷ}IcljTd2[`+=%l4bSM(d #y  vq¯ϟzIA۳04+O}* sK3R5=i¤?1c'+l , a[\jܞ*4# /`H\n/B[P8~:az3瑦/]w017 C [%ӻhD}bk\LHDt[ JdӺ^7HBf?6 H ]E: ϸBZ g͇9bm9<ހƣPSl pL *>fCg'%LFrfNa"ن)| HbEvCLXUyq7Mk3# %f}P;"AAۇ BwMF2Qx5>9 ܞ^r((;vp93Db 1ʜ-pz>Q,*^?D;YrLv0Pap #ǜ>8HYg暀8 N 9Qö??`_nڅHk=+SZrYIڏBrӏ$cN.G6J+Ɇ>,[imY2⃲aCwN\B^{yߢ9_4#dJr8Hmb$@|7ŧÔ:3L̄],pcz8T!`gb̲qib|Wa(0+8o}L:VF"*gwEex6OT)/mW;SS W >"]i^zf@-B6$'p~Lɐ d+$\w)g]i#yٷ)H%v'LmԩS{M]u9#amc8QaF8YCMAH~/ d2tRTg1IUw["`t/bsJV+މ+QiG@]*_Z#BJBsԗb4oۅ(<[ӀA@ʖF, ٠#]Jt+0D+J Z4os-3OPO~ ,!.z-ˆɣ{` f/Rщr1l&o&!Y8:PyJ,.n 0g!3$ '#K0Ksƙ {GT%-9LG4ވVlj4mBX( u ` =f46bD`6Egt8#@eb6z !q MiJ3I F4 rzۑ] %d/9eDo ZDT)" ~56I};kx m2>dX_* M&V63g)`yrp,∽&&/!"UA@_+ aQ ı=WD45FNWR[b  _{->{'}z fڽ a+ Hly'ZBnLRUB͐Dޘ풥T}AIh`+֗v%k O]AVߜmLAD'|E#-߽1ww4vstЁoϗ:>$ARօHiو/Ĺg6- o;*Z6 X0Q0B-gu C  sw|<7Wc,oB7f#bp[Dv׊M$Q'(aEU$N'MsЂv=F7wաzy?tj kW?woZ$-CXA]E$BDZrg5EuieT#KlAq-$.#;K1dn𾬙m~$S 6x3̐HȥE\%NcdANBK:ʵ,/\M)OZ׆S|ahjx(J 2l5Ek)+eÌ{SeT" 8s>Jӓ7@0 9Ui9y&I{CijLuElj™Sf$_t`6|$@Gx2~lʏ|r(NGK# ׸JG -)n2؏-V  W:_nj/ _SL!{y  a [<,Mʋ.PEw \Z [!FnYң998N"HZO4iJyQ<AÔ1a7zl\&\ ^,b44s>>-kK1_p}E !tE=׆$+Z[3pKmT)üQƚld&LYB9`Nbð0pq&TS͓ˠڗmZcEѫG'VWmcoe q xΟ`B HZ {" :m9ITGpEd'ppMΓrh:EC۰S |?blQǟY8x&+"#ƒAĐlUj:y∯2>C!q#_ RBAM^3xS'zhP0 IC*> =Ѽ8zLVxӔ@^~n.v@ǬG-Yf5,)񼡝%*4J3Uu 3BTo3Jpy9,d42M ; z:Qj7jjM|G D\GWB?l _kTV #7O# rlhc<ْP7H2pE֪d f%Z.Eׄrj{GQ\-W㫕r17kۊuF\-42,ܨd[oZҐCu(tAy椘Zf ڌt(zjiNYcgTQ:*VL )TXVx˕c$dۑHD깂äpbX2IHr^g:|7FMU߸MVT S0҄F;\6Cq8pR=p²\Ze}hbͼ>J5(s ɞsYF݇yHi_p-i43%q] vut BuD"j{.}\:@`L.-y#B#Ɏ5Ͼ~Vd` suzF! *tgU̹0ٜpޢW[!kEjxylKinywDy.~7 v5쎴spŹ1d'М90I C N)L 썂eYa {#-KI}41FXt{& Tɜ {ESܑvXبaXl-*̖X2/irķ;VVy;"Ό6Ll'/_ZOحJ(r2˩WU"%bY DA^Z+ʀiUR\LO y^=|/^E38~V`$՞1UZ 7``El!Lum\ g.IaX>| 'ю`q0w(GRHj>RZ}D  [X;frUR@VW@~Q8ɩP1ɁAteC;zsF/<8 P1n |˔[w⳯/x߰lpd *ooky @M`Cηi/umd 6.̶hcXƯ`!ʘv'GW-Zqi ^:,I~(CզzWS&L^ =l+c0'~YavBS ɣд3 ZoWk?khKn*y46P9Ԇ°3ePqpBx As: oGL2=PAWAEsD:uy["S *zbm*A߈hs'FXw >70c>$i᝹c%¿ɓ_ 15˦kձ5Z24atRǙ.36:TOf7o:,]jsukDu2(ڬ>6 H`<ݽ rD!%"?L73A=hcH3M-T/}Q{ <u3UHcdrggv.wXW +Ft/mb+(MV kW 7=-x±>raz}-FCI,S/ЏAY%08O=9UO<`vl.O s7P22?E+5kF7A@܍2>&PM(8{Ωjpr'e[|^#t@}k+lJnJ[9ԑV6CCd9Q4E)v`HZKda?0 vM {JP+Wj:P0xGu '͏ήd"Rb{llj^%Bt (2G .;/'4qL֧[3fݕLSI.X3 A _⤒LQ:A}v '`ϋ[i{$N9Bf*z9ڨ! ärfZiVUe6굘rd)|0G|O_Ҙ_s4\COxߍd7QlXڬ_r\e\-mi,koYP 9> ]pCKZ/kCO\Yf,`%ؔƚ~bG'x"V)-SyIؓnz bM.y,eRsl6 lj_ήf%[fG@HY:1W2=G?;A[ғWsoPC|Շ(Ž&A4#g3G 7.nNgA Uv۔\'l8h zk$N 2G`?Fѭtm(Ȑl .[ʠ,<3s$'nBr*(6Wɫ:_eaMmLHr(-''8C^*\S@ ՒaF1GyRR..+Uj \I-kҝJ6.zBHj ڳ]hkX)! ~#|I){ ;Z)~_An[[[5q+ۘϓ.ȿl0"Lb)[ S5}&>QeG&]65va2 \ag n%Hl+;O xx8c\:dp='4v;w ;YVQ VrG}ד{4v0#OE?4a(8P,ǡp6R~#v䩁ΫW z 2'!Uu{Kl[4l=1(0!F`@c>8u+A#;G) }/Dmq !Ŭ;epE]rk9"u/uڷɩ>49Uo1#0~lȰNCb_Y%0tx٤ֶrk:/a X I^7 'f^>L{浢= ;&`@INYE8Zf_3"ry R԰} 6-vw2ak])oڬ]c [~{ m;*boLAJo B,>#3mbݛз>=3lo;-U{9qyZ4ܩcVC*m,z_k!32ߍEQrcv\V0vFOIn yVC#*vh1˖2LEN4e]CzpiȒy|#צvpX] Y :Ȼf24aCLxm9+$m˝. ƒ60mB9n + RI?aTȸvᨰ } N`l|YOLn 0^jeMof?L%;< 9w5C#-hĚ$)/!191B &rZqh{DU L+r4r9sn6Q;SBםIcL" o%=izO!:4x9Wi{)o#N5*u7c+uj݇jE)F.O8Nxl:^wQ6Y~t"z&L2{,<]L8)~ǽl 䧾'?<&ѕLH^ɦәcHBF=ÓFv'" dXA1i9QZ^rrlYiIb NF=c mΉH)s V,q,V0”[8B&$.SDMAɏLy7XJQ6*VCp#W!?2=8KF,Z3 $#MJJ#'FB= ˿d['N:iTTٍ"o§Mȁn J  SwdqAqqU4)M)/M9Rsy,|<ā,+v|Sl_?ZW I.lז/W@M!/.*.?;`}& t:k8Y)d̙` ,Szذ!GVfG|K6Y<>g*(oZ~3S!LQf[# uѠQ >%N+É$NKCIQ}}s :T߮Ъ4qԃтxq`jyB-( V)WFJL R_4ɇJyVߠjX362~9" ԓm0w JIu+}h3ű8k,W_0r &RĎsI7k#K(}v{]A6z-QQ+\2ɬƂ_dAf0Sқ .|MS:nDX 0a<EHݜ0~6˦/{Oڰ.*g0M3C=NAH?>3kFEQcć <,"dqL'e324U8ɚNbFO}Aaf8K ܴkO#X7U}4iuj|#qrel.?ZR̭ͱX'ƻSIοr䥑{<\ޚ"n< TzNYns/ʻ&$E.w~سçR܌W/WZIm-jͩ[C r2 D.l-]')TD58&,u lBlRNHiGs CbjArQoy;cRhDQr [*::#!Br3 Ty:r,j8IDn$dPI$˚Qt@wr-s'QkN'GTgH o!CMsLg w^+$<6+g`?ih5JJH'i3"e( иh" H=b=AV:#o?3,2 Ňw"b([݄ΌUUA [,^IybxDi͟0bqG)%4%O w0h7/v ׸0ޅM^I ygf*Y3e5Q<F8p,rOՄ-MzZcБ,j G[?אu-#Eׄ̐&1X`w7DX >=;g4X%:" k|MZ{vWʑj8 :ddN=VЊw\Q!Cv ^mt跆hF1SM/m)7{8A"½ Ė+z8 ]кPp|⫃n}]hxO!ՖWF—$_Ef6a!utVD\3tmKC}z*-T0*)쭵Ñ3K~ ې! rEn~ HEŽC R8G"|be̍rͫ"ϚpDW.8QMИvtϊp:R_@d߬?Np^ˎ8 dZaTp{0l3{ÞO PAЋ`u̝0;j@H8xNHgesSQ U2>FGGrzt0+ zRcbBR{J-БK>~J.bGѾPn7X^Q;`L} KPQkK TV;N3qR1|ʏ %]\vvn/Ǧdsai i[* խ>W?fJ&[km(@WwE9>bz37$Z!zzv:1 BX\01Lu): !L[ Wm2:T)&*2cFm`7R 򜚧~|qt"UuS0v+ :4|c)Uq&P:@9Y24|N#i,ٛ@< )*hK耷)Ę(-cC|CŒ%LIA" @ohXDk|6F$|趙3`2y@I,30+k"9#`u[x sv3W8yp)$zq' ]7;TʚnzEڡlaZWr;ɘ3Bz`8pmQ5a$Fo$‚>9 6 r~Ą5+G=vM;HA@Ah"V~[O֔z4[ 0DU)-fl;FJm)HDބcҭ13)8,IfaH4Sc3++AۭC\o *ELYQWQg|*Ԕ%B"NuL'Z\a(ay::o%{?#cFrJh4~ʢ2w`\@c|  0I 9 +^#7 ZvAWo9dM{>CX_y=+J E.!`^(!0c'=Ä2!OHa˘N5?_˼sa -LOmcNPD, WN/ :& _l"rmraR'&Llq(q2 Hwx%\*gb!פ }`-EbJ0>g$&72xA#Ee)N[vR2\iT,sY:hZVsv\ŦReBG>y:W'^DWRG0ϝ#wX,wݭ:K6˧$\sܵp/[ w.f0pΚS"#礆6S+T'I̬KpUe$^7fH%O43o> ^ zM𝊅Ai>6'lIcU8UR5;[{ˎ)$"׼s+YWE#hH}եDaU3,&w|ʬg' yh!i{F\L?|i_ ~7u?&y}g'? !7𭃄{"?Iz`n+|y HܘФ5pAʽѹ$4;Ƀa{UL#vޙ[ޔGV1Ft蕎e}DnP h6])l$ۿX9nw ^cFYLYŌO]w/a-%\Kb%*7^M>i 軁б ɊD07(+E z 3nXmqD DDbyQv%Vo .GX QN:y>2A5MVUcΡPuWgy^B/ɻ(>ъR~ BE1NA ׬ H^LO'? ϕ!ÿњצOٚn`TXDƜ" @-pd̚e I;rnI)OVesVJ:VAX3p D46+umPlѶ.e%k$oz9A-Ǯm!$FN_ l%v;78ʽԓMP%<Τ ^Ox[k:fSad!}T)'Q N})nYG\戼}$6Љμ }P6 mLOI~/z&$fPϘYmV-BK~~*6ѧ(z  Mm[ͷ"05/iYc5iyp! Yyj@nA]Ƞ?Zo)R'hj]e6~z* GYwjhv!$T˽"@Bmq$N+ Џ&4 P<l6oxr "@ H P 3us૛:Wa(.p|M+{i Ҧ(--1%Y=! iZ b%)@{,J(<+aeoi6rE~w-[}+%/I7؅B AEBu:mmQ9:7)w>߹gr;oe~aA=3v%gF}C8 ܒ!`x^F6l\ ~ؒGWY]`dȠjQ5qޔ^\/ T|sC'Q%+hq:~.?"Ko?J+|K~V 7_ 3[Z{P\ #n{u+촓ﱀYYyNڮȥ*U143 e36 \k"[ޢɿǞ>_lAR'7)P6Q ._Am4{s+뿱hGS_cS?Jyzim}w>ȕ2%)U:T|=y'u;Oa5WN ?%j׾ɓ5RIeAv6=SNEWRc#P[QT73,*?-gX G,ވHeHM bWDZ*yH@q >%-2u)[+dq؟gĄ7P WIto l nԫiS0J{#F1QTР 0SDwǫre}O>tFv^}ֈzQM]Mm 5AWOS{I).kwt ɴ7 $׎ }t1B*%Q=ֶNXzŅ0\yȗ3C96BC I<+=`±;[Q[ 8hAqލ! gD EB[nQ?KbŻ]2~j|mݎkBG%8*^<[R8n8S*HJp? r >P=mPhb1 uWhmLB3bz zR*ƔiH\}͛F[$ 4>~vQpAQ?7Du^Yf."g'5ֹ//`Tͪ5m7ԓ  '5FωͷO`v@Sk9|\+,lޙ-^8m݈lCRw<RM4u52]o52B}U—t) Z<3Brv:+UfwH4pE#ϡTۙ%ɤ[󡧫^E6-%uو% Փ#G+֗W`5EzHZN&[2"Ӡ$a;N0=yĤ!ooLVߗq%xx#!)=l正[ J lЧ K~K%v@PO'ձnfAkP^]]zM+{7SSϡtrř a:/!?L`~*|:9d&fb@Vɢ88\DU$B`RYJcG G{&R}p5FB,ޝJ 5ef替h-Bgs!tg+$+:#KIZՒ> t) Ze?CFX:#o1_'sSGd$+To2@L%lT PV' 6q ㋯hҟY\0TwW~w<@MgBS41ZpSc&WQrhnD&{Q0V^- aSac ީyX!%~MfBE7 M ڑ'r.ۇݤsx|qnj@cD%"1ve@"Y<ίE-̅s'Ѱ٭o, ʂ o.o*p{(L$Z퉉(tbq J"{hϩπ:<6AoaaSe6 |8V/%e=մԺ܂Uv0tb<4{cg4Z h`$2W.eC%HP18dȨHx6J C"3M=b %UO2 ۝Kn +<}NsvH2dǮ @v%,rheQ@U5 N%sMj`0Xo֬k+Y2SC 9[ٰ-]П +oF72=̚䃉 GX^^a0&Cg]d꦳h#.x.!3]}ư#[ &.bX@uy)A{gU+OaL{9TJQ S$\RA>sQеW=Q|RY"cMՐnlrLy*"q3z_AW2G+OKdȜa/ňH,`#;OA@H󨺃+V{^6xnH m~+3r tԼ2H`ua Ө LXBaH0-&2FC2 봍{5aBwkvzIpt?0Zx-;&O|ͧU[@OaBޖn D.+hV4"Tt\Ƞ} e:wh& KsPq-Jȵuγ27cqNv'8ՕfE1W[LRs}(l0ą)Rf&JeއGI]k ^pA?e'IBnMpVyK붮t$*{P nZmn`5gnsH{.#3l4'F5QY0)ƹ N rS@sPMX%O4aR]gãu[K>-Ùd6&08%]ǘMѴ"e3_hR$bDn.݅t-&(>"#.]cu7=~Jq|8.Lv д(W58#!⨥/baq:OAK@]'v3eNH^w?ѧBЮ۹h謕h'sTwpj.r+=-ⵘxNs3zڧka듴nÜ IfHڛdb hj>gUVz{OؙO֚P Ls-%uOmdv k\]g{Ꮢ Q|GlbxÞCSElv vdՌ%-nF*1!,#xR,0cً4C>Gwrfy:m-y$Mw~ X. Q+gЋ]]I߉1A&ھלCR뢤L~ԗ;zR[Y:q]*N!q$rB\G pUբǠiWXbi9ȹTwN ;lQ@?cy [;3C\ 7SjKġǴXtr~9Z6f+r+#1nFnd)\_g+d$'ÈIp)K2Fz ?kǣ7Vҿ!s8y}; )C&fvAMB W8~^ef)%yG'm=Ϊ]Iq ;SUox^ 6~h MLN!~Z^l4ĹpYg;9m+ނ7F%5 d@:4u4Bld,Yo@n6:cyV݅'X;̿ M wբ S wv kۣ&q-ל 9;#R CwGR>t.* 7;^A:XV B\J#qe:s3C2T ~Dm>^x.qÃ6tO}D/jX?rKKU]ZΔSȎ}J=ܙ# &FH@S2gᆢzKrBu1c0=FLjNiܔ>E4ef7Ov=h8XZ;I tII;6Q=TUYT'ع= @J0Ea}7Z{l+վo)QA?jn|=}}PhP J *i +>a,q+a@i#/>g1^qNղ'T]H' h|L9N,g,KhcrU@#(rn6yD-|ss[fbw~,?_ۭ1Buf,xfPJy/yj13ԿaggS}?ʴ&ź~>$ 5k9AAŠӰ1[К 2+ACmP/M dQ"Lg 'GqJ|!MQR+' ^QvB3)[>gMvD^Hy-s5V|vtr-:}}FJqqt1\@ >DmGp>7ߧF:L;Ӵ1eKu5Wӳ b.RDJJ]vCtC\[\F5#Qlu؀bp x -1H"8{ w}XMBWݧ akdљȭ_41vV) yՏEѝ%J9şR^a=t@zN)8ڒy09I 4,=)QY3X ذiz(.ˏhlƑUσWtAI޿=LTّވ?S*ڞ:5?!}7 M B"OE܊P !1x@<[[1麽[M8n% ZCq)|[$EB 0%"d,h59VaRAH*PpE_ӻk-ьQg\^d5,GLre>EyynʮsYS4@3* (;D qBĦD!ݖP_\FCR<Z@hCra5Irw}'qC]4;Pn!092BqX2Q͐c ×b}+Jc9./S~cWT+Oy1֟TZ0F3a]G/H[9UXn+')չSvSMetqߛ@8'k.'0 X'Fpcz;EL|n|1)ɔWl'KbYC_Y܄C$߬Պ<ya"le`Х;ʡY [ [+Z>1ǂS+\daTj%<~*CB'[ ؈!Dx G;_?/@R?j`.\JaDcdC @e<uR3ȟL쭖WD9V>HGfpK%N#ab%ӫI{p% \uuڱ̩v>wFWZ<ʻ{Ŗ@wex*cۻo0Xu?=CjRcԈZk\eGǞAH̭6KrąDAi^cYE$#~F1q_js"e6 :᧫o(wZβ% $N/i2c\ xMJf1H8-fR`,Di+2闇DnQ&h깛ƙ/vDVU?q9YOnX2ű5}~_eAgu~-& 21_F -+>\@ ót-&>rJ("PZPdZ-uKS˔=ͦ~D"tEGt^.LݨZ8iP$ԙf & '>ߖNFNtbp9YOݕP*d.prk0{и-o9(RkƄW&.8=Qg̬ˋO?6b5i0Cz,Ud ѭYq?]vdн;`쀑F e~Ӝ#ˆѝD;fƋH95rL@h4z1]jzN1ϳ >\q̯#0/nE2J ~~BWna#!MH;٣MI$,Gtc~E5IQ_\=b֞ż@lԬWշHbƤ+ -W5r,7~K8Dgsn: '{Uȥ>3c ca"Jkۦ/Q*PԸ)YI_[V4֕(7DuqKݹqxwZ>,(:Bh iD `DrNr5* :oJ\{v>uض6YSF\ \P/D3@T#exS }s:&)++Te&En)`R}U] Еw>N~Z52+ާIryVQ{ДԩY5 oΦ\hw#j+ CڀY+(C)(j K \ /xPs 1YyLJ|á ]RHLxl|1tZA*IFu {؇_"kǡLx^]mlQ bnu!B:Y9{NŹ]WOn>g8O{K.bW^v6bzUe_xOql°C jjC 2z]ˀS{T=lPR[xX]"䖵$rg}u|ʑ /y Bt/"a؍am5!|Dc4;s$ˬ\C<ڛo9g^Ad1̈́ ޺K75{ $7x@'jm8AϫhH/:UyD涅?Ndٌ&A^B%cס_Mx "ٿ؁k̇Ϻ]̒tG!әt0;58k HS2{8,' w_n~V=/z+4̦b,?{*S&HI53v6Q= evc6U/Г_"f p/*acO0~ZZwI>zֽPL"^ևw=z=SnbݻW$U$˟4xWB +X2wWwzҵg{΅ X<wFݬ?9A|@ÆUj~i~>L}v@xC?%>C%Kރ]δ()c| 68]^S<}+!@ݤD>B=/>.==N-P=$"aJT.vB GLd4Z?д@'m_N 3$6;]N@k0y QU,k&zmvWJZff ̿c`貥5}2b2ЯNlĻ RF~kVOnkC -9k(F,K,/eUL_WT>q?[VBBpI{ ;xu[P=Z8¦#pX0z"!ORC4pL:<*{8.UkԻ0Y/_xFmZP ŊMLY3緼b;ajw>хqa][D݇\ I9Þ78x0і;5h)ԯS~}m+tXsI (4['$vzIX%TW|$FZɷ C/qtY֤CnzcrD{oeb330{UKV~7 rR1 ;J/جt1QY➜A} K8胷C+9F |.42bL(HNDL/[{H jX'E\`Ѝ $+XP]zʈoF-R/9ŏ:3zTFPpO2BaCY7bwgtO Rx_A]g߱|/FRD1;'~rz>i$<VHf V:+(=7t:bzo1.(uGa. C*tPPJ&kB3c5v Us?{~́\HV <x'?x1 iv|K &Ҿ(PTV-eqA@yhv-vމU_W0a +FRމ ^@;נ/!H9IF@~ PfJ(d|(LMM4tZjX2Ҙ"D0tc3Bn`t{a%c]w[TrT[@KKC9*Hm%C{_tq4(/Nj&Ҿg͋wdkmph~:1*7Yz>b7mh =ϛ./R̮5ՠw׫f,'10oS1&AWO*ohQ_g4:OH0D-P4=5Ib|ʏ&O5ұgހ~5ZlX Ѣb֝LKwM'Zq˯H2ڬ+͜ daݘf%лbF?"ՐRu1p *^.eri >o ʳ;eVV|o G⽬e"ʩ'^5\"fOd!ygb}b&q_w/{''iYEaon^b #u$1Ѷq",qc q)2+"LU~…%ӐZ1~J:5N>R}/>o0O6%($7L4U 9 0֌_x=ؔk*y(݊bM`# ZcG wr=XUa(}zdf7Ԙa.OO<Տ̅P4Vys(SΚX=t}Aw rb8J^wMCd7H{~bL3#:p=pm]wоw+פ7iڡ%")&gfrMV1(%tpxo3uQëy6ǥ_ 4td*E3CeQBhb@P/viSd!}'a-ۘxL&~N`k*!= $e @O|{ҷasiؼ[ io!I][Kq[l"^gfMeGAC3n"6d^xz-.@|jUw j\rL tȤEd<[ȑb"Ի "9Q`*4Fh5T~VORdbJ#$"=9#8L=:O)F.u OS7@]ΌELhª$ 4*=~ 撗G@,]|U22VCO½tWF|ӡʴzt#k[>i _=<Ynxx!5>UƋR7;m{v6HmS~VCSE4Q][_ͯ|3 5 6njof́!ѧ:e 5adP7mn-wf#좗h^>ZGHbICBOεGN*Nt@Ad'#tRzWBkq@6h9}+5o(|y)C/j=q_N%|L r^; \`'Atcn3tl`6tm6p_J or?n_#KT~s~5["I,u"˔UVFKwKj֟PRi%8WQ@ok ]d+b6oMMwu520TC,ߡW17MHO@ߣ9K8:,NUɼ_e|vyx^k]\)Tk&\l&NU#, }EYjۏ]"TN*&);i'ih$oGo;yKkL"W4Pڼ$LcH9LO,ƒ՘f(VxMuT%)2b .oE0(<<iQNjt>1wy<1iFj9Ol sϤn9y>$?էE.M-:%P?P* VQvQwM~lBgyu5w a)ޥm6T$s4P1G[>؋t6M]EDik/fx)&T[tn k\$ߡ}oۋ19=# BY驃ƂO`xG3X&=fW^.&b0 ēXjب͂seX}A  [ O'&zH:7r 8~Ӻ*o$cgl$RǟsH3#]Q/]4^\Ѕ ϢYEU uaM;HG a{XدJfєsV|9'[FsFt"z7^IFSSljBBz=8t4[$mRxlxާ:wSwD2o:F+\yMoKXZzc*H&@qKII_p{T_*SPXsmGVƯ4#Ao{q$#J2KF1gDзڐٔzE6rZbSFհ"T%u3hO?f19{.]񼫼pO)lXMw^ztIo+}yZ(gk@but&DS_us.j_192Hv_K oǞ ESb#;[媖R Ȏ*㣱Vmd_k+^SI9I ǿPħ a.TJ|nAw(V qfP9 %*2*TEd5pDlsB6 _aؘ3vw"GûQ;JC59V\Ȇ5D㭴f8avXO" )C!fp=4fӌWŝ[㖟 q2.~q ZpT$}4PBD9p&p+"#ru'_3; L4U`*V_MYP8?3& Y:U4\{I@60Ō,U:}, o)>h&v̜Ucd?5BU:N7^Dj# K9T9Ze'n &O:H2X|ت%Ouj%l"z4LNWK&Гv,π‰"Am؅k^D׸:YpK" LfX~aOۉ_.4lԷ.۬>vf/ߋLc$Rݩ,fޱ 6,ǔJ`Ѝ6Q6S9ڵb7RԍZmymUDB3 8Bj!SVW)]qyCgp?)>LGϒŔP|iw8?v^4uUKm_YYo8L"&\xqO0r}lv .[J2STeqT N w $O{>덎ȢZ+ l`a)G[ kuv8@vy *+H,<Z`Fsxb&@+OJ \ ?rnN,i8x\`hj"LĮ-|e\ 1Vտ S)hO!CTTyᙸ`cbJQQgmX!fqc)c ۩\Y(T6i [[eeSZQ!!v==Mx`a8BVRR`gq]T6EܘӔnOPDsH]y |VW4/o **YNO\Uʻ_EDT޽TDX%ܴ\~e ZgŶ@H_yCvc2XM|brmc&xNGXl" k(ӺxO̰728Di%ծ{C_&O`e//vk؏zZ5O]pVf/h /Z.ie 3ܡXK ys$hzxMVuI,e*5O{Cj\x-VQWpIO`XlYڞ*q| q;]c߰sKHYml%Odh0EP;_KL\EKB2;sp\5KaտYYmeVN%znɟ`O vi4K!tU& }{mSF땼E3`?fN͗By-CYCZWI݂ T%ϰm%]f4b6lo 5MJ\y4R:'ukFDp`̠cn۠\6 P 8=^՞*f}pq"!fv;6vKƜKYtWy98菐&lB`Q=v*\Y]N ~H~NܘhVc3|!7ThXoӹ: CgepND@ .m2,Kco#CU0˂=o٠ {=jJ]8^2zH-huT,UˣK%[v:i#COҵZ8Ec oΤh թO!r%>1r&* onGfd =}C;KwJy i8 y<2ٟGeF! VU%~lTO8fqCiI)HeӟUGl4훘/c/(o6(H 8[9Q+ҜӫJLW!/>]uExu} ?L2v=$79l}QX =?YZ稆Wjpî]9k8GQT̿Vveأ; ~ɂ,*݆Z!NSA~U3KLet{Z&iΪ[ BH0,(x©_H{%m $S4D!eQ@J,gKܡouO ;Hz FB%\פry o:hҶOc/D)dwjrS(jɴy~vۓ+k\mlcR}QwF; '8gMuZmjC9Ukl[bk>Y0o RhDv٣ŌF|\eBƏ;|Q%>u'S]p'Z 17kns9Zr1\!7Ǫj $xµ(,> AT:Ek*!ۯ<_O_GiU *o-9m|  I4딠"`чxZ4mFw;ȹc{` Q:ıv>wY/4ӘВx@1x!Qawi|Kz,(Uغ:@y@&ޞӐT;m/q[uaO_$}*M %3*al߸V8-Kfc՗Xdg(֑T0h_BX~34["% ay x"COjrAנ*+fjԒyΏ!_<YOm̙K ou|skX2WN;պC{ Llvg/g,`Pvis/8 G!U"{3%:_ @)6"2j9/Y_AáB>_Oupǁ}'qR6JMBsh0:6$&=IpB|NIA,rɖCXzPw6|\ԍIBd/?}:Sk8wޱ`S/ž>5rϕ+f/vF 9{YQy`u>B?eϛPۅM)' (r=BF[.g!m,4#p/¡۵0q`X!r{/[]7%'Kc-X ʦ cS_"bT]udA|?6"M8(tϭq2~!/YwE?}2t7Xj|abbn/qZ eN`(ɮJlVwE6Wb,һCO:I[PUDfIghގ`=i1tL})mjh'gW Y^-#[Ɉ8^ѿNѝH=]^eD]9hxp*>"0Z `Wrx;̱ K~em< \nd{⛞ص3%k6F֏B#R,̯? CV Eq|:G[3Nɪ=Jڈ|[mYy=S7#y*Hνl j!a=)>xKAmB/u{| B1x0joŪmf 8uړqR /ц=Ͼ:H ānϚ2YeZF U8g48[QSӖQHb49ɠok#I׹`R-H|lWx"|{C)|aۃkq D$t](ROm.N mcBf~]yRԡ9=N֕D2FR`CA%:N;TŎH B+*Vty-3ѭ|P r\\Bʌ }>A y8踿xf^=$ުV?f9;==Y+SsZn]5a1|ppy9W MӠuJbt*: &9 nWs=N?χ4Qq ?vn\*Ծ#[(hxT5RcIhb?{ނ.`DtE"OY_AJk}kpT?E(P*ǷWֱ+X e%1IHc[һ`̓K+𤡰o9X@dSf2ψIj^Oﱊ-y /EE(,wn-Q*&P{KP979zH5މQk^v/~ոz:8FP膉3?|? Y"F(jf561P }vEZZckn]['S.(YuU[.ux.:OfqsCx.ưIgn0bv_y҈E/E36Jѽ*It#Ȍ"&SN@ҙhJqDH oBȐ/0)~IYU8e˞Dc"`掻Sd&>"ȍp/j3 Ldqh!CHFl{DV=Ugy(]kJ̭I gU5C&`‹fO+B-FthڐvP1g@\^m_}~ g]"ߟxyHW,qg5mBɱΏl2=S raEZ-Ռy#$umJ(R‹^,'U HOmB!z'Oё&oyo.96HߡZQ=j8UgrN=+4 jRiM 剦|/>Uv ʺ)<|]"WEU6'_idt},dVQvLR= 2HP3Dg-Ar%Nnxy Z_Z b5*Ix 6oQ?ysP6#nsv)i꽻9(旰gt@ Y _y KG1Rʻ@!**v[)ZDEK) @ :s6/vr"e/Gqa/_jj-[ib@$w9%b% dTunNBMXDBNh4C,|"y[[(?aƤ6y4Ұ 3Q>$ͨm!@ 1 `'TYXX׏U>lfEd?YYlъB1-:?^) 3lUicj'=cc{ܪHR\'wnyg F1m/UA>2c[ c~2Fo{^}$C]u>u;B48fp82)t&tko%ORۈ3U|ȹRsHp5>^PcΛ#f ]k̀MqYx]\sH|L <ኩf@eB^[[ə'z.M)UJ'!zzum)4h4ދ#1d^;%`a,Pw~=Pf'^΢jrE.밋`#T<4? ŒdAwFvNo׻ Λޠ^Oq#Lp1%YaDCR1xpiXˋȽD%\Vvk[ Vļ6>ri2Ov/g}Fm_i"#ȋim#NdsCɱ-y{kg5n. y(YB*}o1hÿqxR 8RӀV"O+s#(EMxHahs{`RXȄ\zFGY[hM!] CJ1`B1lLWpԀsl4Nz٧z$S{?Vx$ /- }]0(P^1GXӌ'e|!3rWՈZW;0*4|6,B8i15^Xш-'W| 6;o=]\rgҧ94\d- ,vr0q (vmZyFba+4PerSړ'6/&>/S:k3O͙^cI3omMK܌–]u/2-^ti<Md3HtAKZ9&  >҇5SN,WO&*#ª9wo)SA8bF4rzj{W.ae5lWvxKT2: /&:1j7C9z{kM ֧= 28kqK湃u&٦?ޜ-_2͏fHiE)HgRi &>r~0-!26#$ .BjC}~btrD30pÑTpO4d46$ԓs`0Ił6j]E62e(Tjr}ƾ ߇1vPɎ7TFfCqI fnwg=:9wosZ>~ nLz.Kzmu(Nh^P@!='95M뼮:IҌ * [e`-X䷠ ]\ڞP]ޕ):Ҏ޾T>-eVkP_햖PATp^\ ͣQ8s8ץxZ=xwA(k4 O\~O4 R<4>]#o2[|{K6%Au_=W%yErJSz5"?|+?Z~ڂ({՜ׯVlCK&I{]M%oD;VEvE/Ѕ¹cG>ͷUx󆞵mT1 =8򠎶G"4;9/ހ co$#gZ+D]Eg{[$X낸yTad$= UX\Py&KJ0[GNBJ;$P~h vd}c{bO?mH ⦦i7iІ3@>Ik.9VRw $[$l#qoӈĥm`j}M^Na/醬# WZ!Q)vjp>Q}QH6{BX?2߾:.=ۨsX ux};S9?z}:UEdI:3/_KX2?g$xT%nA@ %Z3;G%Rps)~ǷƩEp\DZs;SM!=yfe$4ȧdi7(] cU94̛mh)݋쩙ϞK?(oTQl4!aQ2(jaկj3 L\;nWS`Sm ҭ],SJ[K& hf(N5KQ|NNB"} K}HuRItOxT@qB>톱P opJJ{2MEN6_f5|#7$P|c'$c}~Jz$ !^(DdB*C؈$FD7oC´6$Ⱦ/Q*EJ *uz@0l=Q& 4w=pH7u1ͅ'KyzP;vx/SU`a%"lQXh4p₨2qb!vmn\=Ti-P358j=Êsz+Is^?P&7P[3@:4OYXťyPrBkŨ<$/[NK11w>#nRBB'm<'m 3[٤c:-{)J"- #h&`Ďƿ>E\Kdl w='ԇ"RRyjע[4Ѽ0˸sq'ő2}:jTR*p%TI z?]8Fh{y݄ jp \ie/ZxeWxP2Ha+dNU-8A>j4^=LYB澜|1}F{/WiS+L͜觖7{v3c:Vl- WG_D30]|j_$HteN3ҥ y.oT=:J>G)$'ԥk5TDyg5H`n +@֤-QujjM6Yt>}k&00:,ǽi1}Gr=\||hmZxW-Pg*z#_eؾTs>|s&Eo7ү[S6N釆Vwh/ک2- GU^+{+-ݖe: WNn(𙮩¿MZB{>&p М2Ro\ 4L܁Sc npܷ72bR|2?mr9J6q?}nh;͔61[ݵ l*zm=@Id:u=k;H˜,BzjEֆFy߾dz<:x, |-1Z='3/ .٦HuHv{"F+& 뼐*<*pxvD)*f:۸t5N13J.OOYw5(,D TnBt wױQնVV$n+6`$^Av.5`b;k]9,ps{kj+ܑ4I/d2+&}ZmŮrP5iT4dxy&edgg{[(0֕?k/D H ^~nCYחfkI.0k!\wjmpoO6YȨ.}H/x A*f`o)PC5})j/z9C<^"Sprˍk11r!'& 0 $dE5*$"m,k(]^Wb~r| 쪱  kuPiO @mw_\n$ 6J>ac@-'2%i#E!o "e`?6 YFOH9 : .wGUe5+4ȢF@Fѷ`F&'{|?Y;hCbC=JÓY VĎ^B>H_)C|!*41LIIց@>78>%/>[8xrOڅނ ,lXFLCi㍡3*&d7ƙաiR,/fRBH2+JfCR TgƦzX ܡ|<, ~DlhI+;㴕FSBc Ցlj*@ x^||?㍗]PJ}`GfqN;tZk <'@|ݜ%5V:! =_YhB)At}CBq3k^q\:j P\|ΫY Mw,}"3šܺjRA o-by% >Wg@ Is>4OwC zęL`ף<(?tt 25hڙp$V:8z~3S". f+]ap*xFv+43[w>"O={kka@Zj/WʍW R@ʀiWR_\1G=RʼnO8'ARFaojC<{RݭmNG4λ )' P:t^̥H%s~ _50M2[ف~&ncV$DR4D0}"1)R_սcnu= ;ZS~6us zgE\Ol M傚w9QJMW p}?=ŤXcWp)R rD^:Kb7^W}6v!Yʂ^9bM8r<Ut-nCҒ0gTOӭH~ak:H-) Tg;E Y3FHГWb4Fزc|2`I <* ܰ?;[y u֟TIď+/hpdB%X`9ޟJ08..?mU}hE=>^ Ͷ8%R4;;u2³z鎇O h Q~n#;ӕ7ԍ~8AnPar_K[F{.]vV[JR*:S#+iZN׵yL-JH׮Jxme8}*sngt]LO9QU_1( ˟;56``/|ݢ2 WF8<%H]*GHv0O%e^)f.V>?FdDvjjttc* dO=VB5j{ ̞=Y/3b G\q4jƉJ LtQinGXAD*Nn%ʑ&Xb^yCa0TƮU_T_r>;a yAj'}>0+G*H&K n%ߵw׾ H$ 6? %dk~ѢC+,pytleNɡiǃc(HȀ@P+ՑжӇ41wDAr-΅v9g Wg]#?rQ&)7r=R'-c=XF @q-׀k?Jbm3`kѨ~@C: 2\'2ØC&ATx/2Sߥ4{rD7]o"l*r2dˮ$c'Zprev˿rp8`ce=z%Jyާ:U#zf]ja *"lJPKvݩQwk`|olp14V4%ìr),tS floyx߳%^3+}N Oiּ3ܜPR+]\֒bhvK ! nK'uBlM圳(ܭCϫ` {#w5QOXܿ q$ 8|aY,AgO;_"YiS5Es؍ʭ,ҪB Q,|<,oy>-,&딂J i^ {CzG:SXd$Ac$Uzz&E1IR @V¥O HP2s+?}4cA%9L_q;quS!#I aw/ǝB= zȳ.C”Ԑ:W &ZK,]U95oy*RcЭWGȶܬD#^SU'd':eeiZU7wܖ/xl-o,gwVU"LD+^܎I`ף~Y sdɞ֊4"➠h$ OĐW?9q$~W2Z[_I(h62FϖC67Y|>QA{ f\ȍj&OaTT.ьruJe;r~ѠF?VG^C؆|R&Jm luk?B7'ڹl̮W~, ɚ,Ѱ?6SZ EMQ=bPm -6̕>.9|"X\Cu4$%>y$PBk^l =ܒJ| ]ԥZi6gd)4Q߈ɪ,m!h- t+0»I2ݓ3>V0P+,>o\o2@TcM G oaqpSб̊6#F @3I-lx:'6&Z_큤2X>e11;WN(SSipXO_VZ6]y 꿊׻()A(}C]%Ģۺ' 'if{fḫm1,1q[YzfH\[ޚj[4|K5rY&q<,Į* m5WVpo.}f&y/l٭8ĬԸM@| s1s HrL"x!Z)EЫ(rC\t9%恦U l  ˈa"_vړס ~Q\ dWp0xXu=il?.)ң^QWKQc\cym(Xu钐l uuisrIkLh:Yc@ d{#y3۰FېZS" cHl%L![9&q,EhP`oeC`mL-gG˙ T?@{NeE'Dg7QнHSpry#Z*4b8'i5!a; x=HI$ `E{,&4W9֦PU5`* a5i;[B.^@wV W:|e8eǂɎC ԸDjiϸrAa4)?vhެm}b=Ox K6ks6g,qGZcחFĒMbdAY9Wݜ&`f1 hl?k:U|Ý{IBs"3f;U@^$l(%j*M&zr3Z%mT5m-v4qsQz}#m]ܿ F *o^K+B"*gsu|VlM$:bڷ1 a$>n Nr⢀Y}p81uR3)| B_ QۦûWJϮ ogM{<*݌~ E@BCPdv7 ͯE.j!ЖνquIF7;$,$di-7 o&|`bz9xq#)FHKU=~!G'kwiJȂ$57%,gbSx $ĬF@X#v98X[<1=X0JD'%lbv*6R,t'۲`ETX3.}][ׅ'݋vPGRDYOce;#9,RtR .,q5h¥0ƾ99iN (+a~S%)Dg$| T^ VVd㕺طK8;z1gJhl@v~;TJ1Rٴiϖ z4nh38? `N05o}ķ8M -vkԙd@/qt5a@St\V!6E5,?:P"`kfPymU*ɛHT ?.94>5p<_̞m5>Q{XR6Gf֐IcNi ]Mcl>A:,9Q?) DGٱ$S_@[fO]վoT0XǢ}ɹw9GcQ$z'Qř?݃-V䋦FsqhɞuS'L剾{Яjtp 6wN"@1=<#!'bP)zx̼,0J5޶_fQPm54^ϟ;DN}w5\vdѧxkDwo5O4*crp.#w烝EJD%eX 6 *R2w8eБlVY#9S4*cqjl`=Lb#v.gTJ]է2IĖ&jےVrP+@t5 s.5X?vSg~0?e;}ݐm4Ba^L|>Z ԣ,O`ڋaΝ$c<H|u>Gx])b(3bx.7YuJ_tc5! a `_FS\l l =`&ȓ1&nV{՚~)?񳣓_2Z}I/iw d(֊~ 6&i.&LQdQ, &zA~rRjٔ0߰0ai:R;9hn#)D}!cn_z4XW lgq-jX[myZ !np!,Zt:ͺ;iDJ?pqInjn%RXEXZ M8eViᝠ)YoVKZ5+ZoNmI-O#./`"ڟ+۵^F4s)7њi=[bPj`"Em}X Ll= 7p;3UB\>ʔvEj՜yPq6- vu荛[#v+1,v),߯m:*sfGӰkAAC$e81)J><ݽ aSVI_"F>h BSL3ܗN-%qtz[ kP w`'ޟa,D$%V:kEt$G`RD`\0kI .;gj 8Kdb? jL=zAg:u[L\F()l4b;|1EhSX8?Q90ps` ^e]20:Վ"s5țwu^w#37{ě̴m i΁RT,,)0ZŝTƎilS_P[ګˋ6w^VV[;mrQ`Di>xOQ8eo˸ k 712^M8.߁{E1seG~rb:q݆VģAАdmJ Lt2f< ȐP~׈2p;GSG0:[ #z)m*g Sb2EKzm4nlreM4RV& "ܜ0a{;W[%>{/;!Cj;B;$ ;5L˺jNXg"vkƔ!fG *z4~O6m}.m`2{~dHءU5|BFՙѥr=A<8Bkj569Ñ紟đm"֬T jJ'/ray a "7\5}~Z;mG70TgQy(&CSnf)Tjd _ouh=./+m=}2mD"ݥ-*mz1G8ʵs;`~2S)vv'qneM)KaeW1y{zGV g*T'yb#L1(8۩:! G%s)A"@x+Ab }FF''tE݄LxZc!TC>c(xUMÖooĤD)7c oLբν˙UK4L(|܇;7ӞA.|jx>hG h_\JMo?W??8]ngٍIw'T-!(8qgxĘTy7/ņ7joFUaMzPӛ5v8o:'Q p~NjGQQ8E1y>%~g& 9LVp U1B[& դL<$ >_?gcÕQMPEgI 9Sl^7ӟ- Z[k[hz} |>k8s,|߬4[<wU+:Ґ>Il-v)8;W Dpzq6aV]؝\担pOP7z1YffuND؛ZX+#/|X)RtmKw?,ձu%/pP/v/ݎ߀>jBM\}5y FiȞUԗZ0=_XL&w&[_Y7ZS]9-^ taQ4xMBW de%r^fTV4K1`liX)C.Jv~Z륺urΩϏZ;gŮ 0AvF~Dա:R9|X5CIXC\db=e{~nEe^1T^~+oˮw/Ύ nc)0 `_ 9#h,'?@H LfI֦)hjpfe"*L6(1I|/Nf>5BŸgW7B+ vw;]9TaAsE:Uc&| >f]9]iNæg$hoyqM\Rn(sKr#ӢA;]:>n8ZE4vzGR?"f9}rW:O/ԺM7~S~KD^_D x~">4a~ġf%D!m +G?y}2VZf*n6龵 0N{{BTgT[~;oK.[. ۷DR;764<ˏ[)(pV٩1d m2x2M*9ZkKqRkH`s?p 4*|Kd'Q 0>2}90k7H2{KROV :N2pܚ~t8 ֹ0WcNBTփ?_ b ZM7:S.9wT+:eYv͏IqamBXV ib*)پl/FOI>gKL~4kWp-qWݬG(dfr~h>+@#VocXΰ`kF#'l ެƄq P7kr;tyUK䵶G^/ _ 2D&<{ס g7qM _c%,Cz}\pe:߹j)]glRVg[JXp qv4֊`E\V4SfKپ_a_:qM⛶2#9yO^ܞ6=EҐuIk$fd}]daoc7co˯օvJr+NmC}*lj1ë>)oWO衚v7Oޭefr4v'fͯǓ~"ڐ@wSRqʓsQ^E螣ܒZޫppF.k q?5OU\)8rE5鎸|1- iOـy;%|6T>GrnEVg`i#K(&ęFc:`8CyRrһjI][[F( '<`OW :*'4H Y z(PVرa-E|`dZl#o>dtƗ9Q6w$Y}/:MIg,-C"Y>OiJ1}~=Qh)AY4;iQSǯnɜa%ڼ{B&KY碻ǡ~j=ɰ`&m[]eQ`;F6=[uNi.{KBF!*%075gY 7e[E81ǁ`&]v zmNۆ {V˔Eg;- P+T,!%޷$A6(7>+6k~:hWV K΋nb VSc3.IzoHʇ U|f5ɨXdirn|Hq+Wa[J-/SZ;JӦb5i8c)OH:,dw_ "XvSv{>*JStZkU! rSS[_ CwBp;l7T2{GerXW(։'΢szI0c~KCz|锆b}F>^k{0Ԑ8Ǻ2-wgr: /#Fjz cJD)#l[^-W-^Wʜ+n|)peHw QoxýMm i-ԫxoQ-1F&MVA_*A?Ws#S^2#g5tnˣg 67M/me_}.0Ik_ftӣ,эrj:Wg;ֆTrBz&ƻOM_ {;3)a+HgP$,]zkb3H@{}f82ہƇP}IFJPzl=q#)h aJ&^VoN$. \fm I1K l 8]stIg4m $ZBנ;H.=@֕-|rx?5n [eo.̥t/! 鑝u)T׈Y?̍Vmgb\6~]D )b5_HcE*`,vm 8LVw(bu%Om&>7 y1%|r}t3IH"',}\x:l…yZL9y V)m@3캓uJ?g)9@9*q|`IhϫZK }`dҦo7Kb¡6yYIK1=#L@o3dʘwyf42)7 wJ߮А_̦!: zs5rzq(+p,>mj>nuJ|߯sW>DwF0E8- }DŽud|ZcнVRJ-;[٪v2:nqTۛUt:g%l̜b2s]ewT)[e:*IF5uM "x L7EB.LtFl8)z釨 bC '`6[Huڢ;u]e=[mif`C6Y#GHiY" Wċќ^dTB2gh*)ҏjx5\L7xv~' Br.͸,z\3*ŘW>uӀ]4񲚲`߲ރ#̆o]2&W?Ǖ rA]+\BOf_)Rss9m; 8U,e~v &n`/e7>3׫fdEO܃d[◭So†^Iۊ# |Yq Wמt5-dYTM>T!PvG@U/p]j.hRPc7j}wl`!+B%T>Sv ){@p _RGuʀœ8ˡ@/"坝mQsH[l@[GJh߂5!hp@Q akrΑD}$d8("0yf\t|m;tVK,_JDmQ/nH75HCэ?#XF`o TDo ~z?4@WmLwS`_~U|yނoU~ߥ}bTy#؟).2,X}8u >gu 5,׺?OehSKOEqG/OisSEQJH~ lH GuچT>[o?A%f!pZ/pĆU՝ ~0ٖ.)''w7BZW 8wYt1l&- 19"m_&x)u\N!ߌdDܔcEKy"T2%^U۰'&85? 3 SɃ둣㮂Ġ51 }߮ ]Rl-QO+‰m "dsk+'2~ @L[G:VXh({;JW[)&eztP)(9Fw eKSbp'0a?J8ޝ;^JxyRdqõ7_f0|}PZ=k1O",JdWIL" N>)Uhv69yo94XA46z8f#۫n 1uycXW`6/'V?,c siZ;/M J;K4lG?ܵXHR?趴v. RhBεM9>h_M&CO0k"~W7:S$jLk1'ܣ"WХQC[n瘑ddNM]E`J(\%A5 j'yxa9DL^c:,͌kΖz_Yvӟcmٞq2{b;>{(ra$AR?TQ ~'OӧM?K=|qQɏ r9݅M>WGAyNj?u:콒%u5z2CMN'P uճ?urxQ6 F6rKPyp+,ߙ}bI&VL5:SCɬ$"(j91=1⎫If~+9!e9m|z_8oieR ]x1|jUC"Pu#pKv5jܤ#`[zXa=yAlra\_(lg1* 5Ɛu^iz>)PeY4Y197JD_6n50\΂,[$ @rx xOU6MI3ds֍^Bui6/%]B,DkĔϲu1ƾ-r=nPW;SI_[O\V/-54VKnoSzRODW]>2b26˯89Pq4s>5Ew8Il}DPRi|Akz8ݸ;83䭊o ҡaVNMwah#'\%KFGݶ^k h{'W*4ORF7A?Hg Q:Esl3 tAŽFt{I΁z;C@~'PD*휯@ ӧs.C#j gW01-^#rM~'໅ܨ >R>yv ) Scnݚ*h^=pL GW'k璭wF1tB!?Ue1fw 3yxńLy<-cfYVwrA-Hskl~t@{\3nZQt[J̧͂ *4}S Ќ2VyШ0J2\PYv_cpn"#<葃x.ۢ,yf ttz~PgnZr0ZBMYĝl&/ 8J01nF27o%/+^v%_M76/Ȣ]7ݪzѡ=J'#?*>@V /,s>m0E3XzC_l"GUj>UZ$c~~x9BTW:^b ޯfeZ[0XƳel1S O28#|Ĉb&PF*~iZ|g}C^4h$lK \$ dǧ8Q&NS. fJҋIe]O gaL[QQ0o.3仌&a&"4MfcDz=řrkp4kB, }ZqdBu"%<^"1y;Ӄjq-lO@Ǫ1~>r$mZ 铱a]yZH#}:%( T~9֬zMY1[KMBFJ`)Q1\VDk' G0Z>KxT(Q?#g3R臱b|W.5,rrmv^$0 \+%7&`we'O‹<^ N^׷i19kDŽ>9tVv!]g \W -p8vu$mh'#4 >࡮:>iw<[^ӽy- ˨eI3 F Nк ݏP'WyUvVOKMӭzx sT2~-npr-(栦V^9њtɇ HI^V7ɋ-O3 xmKSznj>El'`JVb9R8ؼ5=v 7ꑮ-v Ȥ]7D?i7&?yU#\2ne],.*rGë!5sDЏt" Pa[}^jB+Ep-vgclj=haYb2&蟌#+nM̸P Kˊ-Z]d!ιs kFc-$nƫ/"ҏ !GHB,79J<72< _%.9ϼ={1?:M S-օгxL Z'/\_Oa;Z/n<Ӂ^iU;"T[IJ? DcS)_)|3]}*2mn$b/# 5hQ4g8ܓ:zF:ZSX40 >eգ,ϡhl/͕`LŮuV6_պ5sK&q-gkTt]X**/?lD-&pbt>}&?_6p# oaQ) M>tH]:UYpo+kr$p-AXOx2<,\d4υIjMꓒ˽$,>a>l肉I]Rb&VYu"^|,v~mɨHL&.略C}v٬WDB=k 2{~+gH.׆&gS.yK UXZ kRZ:1Sk᷎hnF<HɄ7o弜+2-H2xݾ[Ld>yYhj:5{>Dk9LClsr@egx!TH*CBuUftsṁsr[ʷ/oݐR?̶S͋ijҠ|>7wWvH2zil)uN\c3i_9 ;T\c+bPCkPn_g\|5|$PB5 COt(l"a*ФXctMU:`N:1Y9 ?&#GU?22ĎW G?{wc#5 {.ߕ1  vyI2k'ÒEMk3]Jg^]Rvu`h\Ӧ{mV1r &tn7YADJJA[n[N`/EnY69 yM./E~tGrcLт2@>(+BtܻRPUAqJd$phRmv64{êXa#xuɼxTk_ч@&k~9닺uҳ12ut_Fl>?j?[\nTQ}_䮰RM:{\i.Y69@ca2-=a:묺Lx/#*:nqOl^6ؚTDcJe;z[mؠśahӴ%zF[ 6lD |M럩Xwak*w|^?T"ӏqXr-ڼ0饄@B+2OS[֐140 pPV#S/_LMg N?~o\L>_ 3ř TV(-}:\/ԫ%ZMzD l9`w8F=ꌐ GKn7oFU7'ӫ<{{)fjV]:M/+^3_I)DOފPPN>}^!4\A^&O\71B%wԇ[Q_Pڒhj=+fFiY(hf&{v7e!}TjKj8zsĉ>^,)utM.[7d»=P-㎏Z>pMTxJ%qWPIak;mqKc1D&bzL17yErUrʩdv ?q%p0hpDzH ѬN4)] #'MA&1<%C K2.5Q[nMpCjCxFׇk^eh}iYT9Ȼ& rTTT.DB+*}DhQ<ǏOC!myzf,RL~?.;o.,"V]s^'=;g4. Qnin5o:%2JDC햀Ijl&NA?! DΨ C(=$|D3Uu| jջ)f \$"L8\Ĩձ bzȤTr2+KO,B W!5_Zxl22yVpV 퉙S˹pxE!ntyŖ7*֑F( u0Q[W 2WaK7"01 xFu\"uJz&v˝T[?AIB9ЅTъL4cKfBB#Mr޵=u~Ƒz}Ty%HYR}/ CBg^S.s !0T5\r…\uTŇ/@\ !zՕ؛L-{&6S\8ur}'D]d*/DL H4)[ Əi0#w󯁸BL7V[ͽW1ĆGAK- ,ib[IXU,Y;5*pNC&:S@lQYEG;\ӆvX3Q qn KSDW[t|@K.uяwJeyLz0;<(r-$ndG8t!WKyPr?Zwߒld#U2urh ?TK%B׍Fz#s_b{%+=*N r^8{#ԗ b}UP5WV HԹ,:"k]2P V`mMD'{3^sЈ9U~ FOp'SX/:H7^{Rd=e?3l xԘ(6؋Tօbe{ɪY;$B4f.qEVqs燑Wߋl% &xᓔٯaWo ;ӓ.ZKBzs9]e[ bD0:({%=NK+{)Pu pS?߯R.nƂZ3I.y,ct\ 8Menia nN4䨟,s5ޑTVB묏f-aюkvS&/=6L R#bR/ yB^Ȁqg[|<瞒|ij~\I=n;/56+fPYoKgL䏦0yi!cR J,% 1Ax,HQ7Z_Ǵ1Jx: ENPpwb 8ʓG'qB_2Z$(eAVOBRE;ŕM gǚ(ċŊa1aip64G=^Q߯$x(m-!ʛyq~\YK6_r(dN˞l{䠖z'f.V(T 1#3YIʼZVz4* 5abk? bbj7/# 8'pi.ϗz/ovi kl;:Jn3Y` ;Of.SF럋QY4mq/ԇqrt>uFaƧ. 3ߘxjqc=2j>e? CQTr"+BBaZg#4 QܕpSuyiAvE)FծN魜;JODp€mW;]i~tO({~᫟ PC-f4>esS +?&Q)9:eB7-'" 4̅CUJ{=j?U6;Q9vU=42Qj8!&zCAr$fx=nsvE#m*1o%[8)u,c^RM04hhVnb˺r^,<3n"+PR=2NF#_y5N!i-mtj*)ݟ~XƷ=bC5D>Qz\)ۡt9s,Z9iQo'%zQQ' sИtɤ)c'ALspqRdq6iw||k|,# '\ !9h1~  v|Ҥ#8Q.xW@jY <@EE Y~üc+ 3jXTn7' Q;}5*boJ<, 'WdM= ?[Doc|X=AduV}f5I5p?C|$o&2Kn, !fxf̝dqqV85&gir i>+/cM9&lfDc,BOQS׆e"E hv#0 =d ;" Ҷ[SJ7kq_EEt/Sj7AD%xAG7dʗĸϚ^$ '򓑋\aIշB2?BO/"#{A+m~UӯSc3c+Mh 6dut-5`Ъў$W!h8\U#PM*3Thxt.Y$Tc%ڠb>uWES)[Kyrqzث[ A nx;_.1=c܎$4a"j^S;vJ ȅ&tyٺj16g !q]ww o6,Ǜ EBGO&;,',O?Rm\LV>q-1y: GDk-H2#u9߉eI.1-4F |LۿfqB@yJhj.0|}W8N[hJ9Mb;Z,˸CL!6D]CI 4};@&w:< Z\m6-HqH-TuY}["˶[Jx[V&aφˢx8Fڔw @Z*!=oO# 6I4b #]"._.k9IQ ەy;aG>3%6Xs!Ч^7O_fk Rx@*WN{cMhj ?)Bm4Rמkq Ͱ徤qۂC v/)̱or ,IJju;ܦ*ȨnU߾Lʒf89jqF2u"/[jX F<εUStP?W1 +Q`U2і Y+G9z 2IO8?jMu(Ykܴ=bg S>MxwX݇c-fzhحD \BsjJ׬In(݈h띋*̑S?8[jmM&w?nF4"yy℞^SܰB7At̳o5OU"vbX eZM 崠V 8^q{H$GUpZ֬gvKk PF3͹@6o.Bx1"h_s^lf=ttE*WϾ{ jn t *eߕϷc s?7`0qQvFFV3Wse³EW9{uτ8pR) 3sf #pvh)lK`d*oN mQE[AiLA?$'V_dPo͞7\[VkZ< ZzZq,W6Gr1<[pxl?bHH{.+g UvknQ9 *;~6Jj1N콦tXR+1ZhzV(a [aC&$sGHƷ iOYa>ߣGeUYT>}"F1lD7"Uc ؛4庽\Z ];&3~F'p:օ/ )st;u3_z*SʀM巟1w!X(Yָ_ʰ>}ΰg  "x{ 3i`(e0 rAmG+^HO$LC*;S\؂3I{tg+DeS+.u\D{f_?pI%?nm\/f7):b]n03<~ 80 i7>}~ƶcЩV| ΋s(〻ڐ}-vXJ%ѶG%xL0"v8ΗvMhS(0PJWL%c{/gZ3"UNwрw.8V>2/!Y0/eԽJ*{ptC`z"nΜuWiK_`'؋z`J{.Cɂ-qpF' L^]s~~9篧yxIf(zoJO`UQAy/kpG6c=Kt K3b?_@<%qY~ [%ޭko^ nCB*eg${LlS+}3NHӝb9ځE҇` c`TסAc"1syA]lcPT+^6xuy:LUTWQ߭ zޥ %mp?*ӑ.`ЬdLg9لu.vHw%2hjhsQ40t;leèJݼҟP98bڦqaқB -.:oVmT](UK^i?s#uQ.4!$%xt|ⅦrfiݱƾvoϚ#;p;ŸݫV!AAe.фU^7 _i[Y֎}9 Ixjy8z&7'Lki$#YT$]]4 Ja'>~ I!M"bGU.Qdqp}:e] D!;Zw8zA;Zb WƔ$(yNRI4['ZD!53K|ܢwoOb\%SOK& $\_R p[@C{d60ײrYԻsw~(|?_bE%+)Bm[ %no wi6b5ӋǢFZF&`|U}irO]N:^녡:AщhJUlkCfir/}Io‹tifxb51ժGx5{\_3І ȭHoqIKz>aŸDCZ5ֱu!ğVV\o;!D_y-\z$}vP$M7F,jll2 ?BRtƅp9X D`Xy mUN jҒ3Y wjr|sױ%"^-:a⭽Ku;p/w4o'1F(]5|30}iݴ>k2\(fʆw׆<M) RD #12g午fNpS0ؤ n^cfIIgG?VC)6l'בkB@Xa\ĹyQ eȟG Y,䏘Q}whPԞo>6fF̏[mF-? Jmw5:ԼIBLkOG:XcmbI "ږ qSnp]/+}\ѬASh?0,v˸r_x .PzZ1XII*~lFzȄY#F7BM5}V%J553N:[Aq:]fpJ&ZBed.ZkSn(v$<qƣ' 7aX5% < XF/^SaY[E'7g OCbA ݯAƛ9K/)y*+N Fՠ\F۫+DnqRv?AJ=/8=ǒJ5*JݎNLo1K?5=I/V])r0,pTzy0e5HkOku,uFbHw ӣ4G՘@ EԘaJb e B.Rõ[/*uߵjFW`>鍂4a_U]0.:".#vJӮ*'\'ҏ7k1f`%Ո1NdKX*q= aO2R8UqHiٞ92 K3Y3.nU4oV:?nL*$OѬgYDb2ۭ>M֊8w[3<@-^xQ,W O;y`qW?mVrJ(`VF}\&`rBKW-Gy*4nK$D<:ז8:W44JT,KـDR 91GNl+.#}@S!QCQ2ۇ^ g= 'BšD~=og͒QO&{25&*B* \RB-% Kдbfv"1>7Y+mc>`i2+WGD:=qGVI{hnm> u;BӌTTѮwo  $Ji_oM+h N8c]V3$1Q]ıuXn8R9a}>.!3]j Tq͏IdJW/N?t$ʘ~-/\E-*;ђv܍J=]O#rByB&ĝV0٠D/MUi"g J}f}>3yZKKjcN .6у^zJ.y_eq8U&G3b@^Do7=m wyZ,A,݈E9' H?]Pe^L+t]* w1 qD̅7AqQb? X}ng[[/huX<ݼ\IClJ-edF_LG?dW, $tUop#kCxhłэm_/].\B=V ֜e ̟Rb"J$"r+Jep3򲝡M>iX^Rdci^)Q M<Ùu:]1p6:y?4vώ8O.`DRA} 9$UGENu׳݂4Q9 b0`eIN]pO*LEmxLO/лw!;/ #Jm )!_>U ^@bw( )I ُ*~{W 1;  UxUͬ#f!4n<9Aɓ}((ak-Z(: N&l!'\"1 g58#b/+ ϙ Dվ3KifO ʕ1е+0 .b4VoXd.u-{ ;#X޶I1[FaJ"qX=ȡ x뚹'@>Fh:QF r *j9=Ov_~cy^*vX"-LK=Np JO)J{J<5CjZoS-U#y XF(.,ǣT?Vҝ伭K8r^>Q]CBvr1~+;PEJfݘ7"/l[fɬA#֭ WP@|{\dl RʋUw΄]UUuF^3dI|Mƻv`/zv::FݳφjoY/jf n(܃PdH9uA3 >i!-2t!bu9.g ,Fl !m?eA҂S?in`b|QC QeH`s(#IE.ES=CH^U`> ۞"BCWgn|4.6$ϵD,YmPF&y!_|s-kh#q ħ#7Ow#"?-K =Y-_tdg,~&-մy>h G6䀇u=H8wbw*Rq9bXLA=!W%+ vz"mϵ;^Ę  :)@Jկ%AK#$ E*}AwsOK/}zaͬ#.mM[P W\AvrD\)$<cVfTp (L9=#?$D.^ZV>`dDh=ktN'C5ĽB BJ>91 A_Y0]qÔmyo.knL1ݴqGIf\GE=b^_,{ %%$H2^ϙj ʸy$}!=Chcqp)*U|'Ȟh"e3^xVIFu%M檑ݬ WtOcp78DhDS)4jFt +?3&oy}I$c< a)tCE *Rn8|(0}N-Ǥ/n8 {9w˸d}iX.3ԂC"a0!w?WO :y2k>}+{sm%_AYveyBekopo|,4-.Cf|FF!2d"3R)J"nR(`fSk7 ,bsǻ".8yJyVsI97.nawM9Q{29B9^rqӎڧM/2,BYpc_2{s2^}E}u,Lޭ978v#sz@t4vth;WmrxvA>5Z)/̾[͔ WGLUr#{)ov;ftYfY݈^4#1Zǜ&c%R> KݼהeQG=3≜^TʘȂ*(ݜmö7ʓyC:J(ju>C1l!..T!VhV㣿>o(95em`0c 6PcSF7H~BXd"xa"-;6|b%n3h+͑gfl.fݠ5I Y.rV oaSn $S+0F@Ǘ]3YGl OT\bhd1<LkPz]ۻh&.H 质Cw›GsMOU^X%Z~Ьy"ϔ.@@ `Mx."BW~N.C]ލ;L3QVn1;#-~X>=鶄#;8r8g#K> )ZjIBAYj!(dPM;.a!}2="$HTp{6kZ1y s*/"*(!4M95#pvB&3f7v.) $SZLe}VD=m7#rck)7Ȥ0c+caVh"mדy[JK]5썻,A3ffDo0kw4i,S0ʛjOO6rk](~vO%*\] ]$#H6zAY{56#$5P[{u{'m(gbBpiZB }9cXLq۷({uFM GbӟRu;* }?_e7*'($~ 0j 5|7-Xa<>탗]CeM7e;k; T'.ʊJۚ~^Ԃ? h@}}Phd}!j IL[P*>A?12pdߡBPIݞ}||luiՕ;f7P>JB ! es͟|Daĥl{#-~b,%+Nb!1o(H=Cxv151rתs ^; "/7&՛%?DQxdfr#}/npoKkLJsTWg6Tr]ŭD2ɳzFYDk;$.zܚfaJcUqgVLu! bmh=TF>P:2U#C["rKUg.{%OA0qP5^M2x_D;0H1m|=^ h ZϬG:D9X%)%əE Ntcc'&_ô_ֽ԰Z'eLQgjq m1c sLܹAwdg,A ]%iv4Swvաq$nb<ي}rQP6 r}za\ 򚀪m)n^ʂC?KH̋bI1>γNHla n`á_'J t\i/Fx eD`3mO[8-rQo7-u`dl69 r "1\RO0 6evZp'`~pЂ=Jhʌ?>%9#F_j- [,!# ?snlYlh\ BqvpE-T`90>OakKr 7 NEqzFvqM'[ڡl*[<ȯDm,ˮh?!Pis[s/"SݮV\_hx@Yh= a$l$i]+5/{^$*uE9ZڮF;b/KdA7 w;Yh2fHָ ˳ ryjȢȝ MD,͜k#G4=ģ,=I{偟xęR=DZ@ҲURbNA[h*O9KGGť$ʻ(+{Ywh+ D#8(Yj:]gpNϘR$Zy UG"H AS$M =u>Xn;VnHle%$P*[M$Sma$ ZZ=c:$ؙރ%ZC&|5"g\?oj$lQg$%ٙoޥNVoa_W+8Dz!&]u> .ΏC@ڈyf2"܁oE\;cs<l&{BCOrdP7rzi)!Rz : ]^CZK>Nvr"dC+1iZg7aZkkr*n't\8°5UF:a:f4_Ʒ󷧽c-*5ʈzzϺy}Ȅ)CvW.05eU_T^E:xd ݛ~aKMP_F"RL"}?{iY7'8⇰N CGV枋_INL+$ RknGRkG5Vl"11˟; =i5k+).RxOtB d\ Cu޻ ](Ü{Jf&ٶt~QΘƳ*[;Xt3*8= x^j\E}&&m7;zFθrx-F\:G73v߈NjÀJ+}( GO:}}>5CD9g?D?CEœQ5齮^p--ϋJR#/G0Gq^gknć /C]ɽ7hmqL!SH.#̅=z*o`*^Ezͬ^[]-lC?fIn5#'zt9hyݰo%Ӄ*-S@u\C'^~=dHOoXΪFr.11,|(C)fJC3ɶm,_rW/v6:«¼HD^f΁9of5Ao iOkixFq;_YKȄK7т{ T ocxsTPLG(>9DŽ]У(#$Xk&Κp2l'Q]kd VN)K%H|ch{⹈%{9]>w7VWŝ [XX⻏sAלcpRuF<89wl5`R-Vs1~->4)]J,?$L8?3)^V<]__3v8ʼG6lye^ͷzf?-v`V/q1rkDTW `6B6naW@$T, ^gĔe{)="K[   :kkos F #5M)0h,`)Rx> Dił E/ɉDLov|݋#^56B4B׳9OWފ+r奇x-*Mꉈi}ct9(vgUf~2281Kw^ ]bmS 8xƁȦ>\l%۟Viqm! r&;r$˴YiAu{{1Ok7:L3:V EˌkǺvmw;4A_ :lnC LRoPע9n¤EvjL hTQqFXR# XgB[ sM,z",D "bǧREoL$3I`>1 znYTjŅƸc oB3Մ:;c;>"6+qMpkw"h<3K4 WihѧgW-jpXق2Oxa潂fGariomA*}]"cSoVԘ܄NMR2'Џ$Be8&$ӏ|ڞ/PbSJT9_Dbza9pdz y$((+lLc I1OAΧ 53z 7[Djlg􃱸CZ?yjItBlo`dVU Bg+sM,F$ ȇq-Ew b Rokn>rsm{f 0o7ikg_ ۜms6B 'm:nȷGF0NΞׄQ"(p 7΁HH-̘?+]DZ) }e7.61#-1fH{mk2Σ%t|nR)o Dy>)vpgKrc"% ^*݌87pP7^&Fփ.6(2{*gઞl-VwA'E]h/%. E]Rxx]\%mqTĬruFC(67@Ȟ7=?%wIot-;l 7JȪi >8s~V̹P`\EYl/ OӯyŭssLҍui@^E\e,<|VDЌ4~^JqF$,=cK⪞?͏_|15dTn˱+O=TtYK9^>L|+{!Ȏmm3:UO*ڒ/2jdW':g e6HSkAL0eYKpRru\ו_t5Ck3"!ñFj|)1WaG E&zI}xByv< B A \_\zIՃ2:aWҚ xv;hW/IÑT72%eY?LC1k̳nJZ7q2|" gO;SNp~ɨje`3Ed/]W+)b $U֨?5Ixa.%a`*؜,"w9Cj{>BSV?AjdWzx+ /TRV#O(Fiaіsnaqtq%Mo~-˦y)_lZW'ef[zu|,s ^Чrw2 Xf nKsʪkNb+ YBV388)쪟v}882_AƳ)wpcڽO^J/\ ͧZݛپzbQ3}mNx/]|5{¼hp%gx 8>/6U:_Zr%cq "U)I"eG2gdQ凨XX" nd>pAy ㅤE8kJF7U O"`FC{ѯQEoڡGܳ ήog= ="1shXj7%eJ{1P%&[U/ŝkvW?Phpz8k<ӽM: 㺃7~C[-Wh$^,wkY(ŋ"τcSݎ[An/akcXH<y >đH&n|rpH-'(c0@gPswHcO@;]|=&q2 5oM]h+$XaR)76.7L1IPP:3U(ר^Y?-D^ML&n0 pGk_n?wn~)F KRh>M}P/R5 oFKYBЕǘ𐻫In@(X7Fp6♌W~ILL6$(sW̥YC#"xu;ksa3Ye<5q^`Rk 閚"$kLkʞF;Wc7qs?r#iE?)a^ĂJrC }Cϟ? vmlϣuLR* O흤thߓ>>uUi52wSq332J4MɨGRM/wo(Ɩn\p)}4_[Hl n~E٬1Lit2҂5i/c;}|ᭅ. fFJOX*^W.оc!ާ9D Z,)fXUۇ(cl~Q:<܍BlϷ*VC}%_%`MAõqA\kHPфkxN5ĐyUK|Xo6|c9ueV䁊>lof(zrhLR΅~%A~' /2ob`H\3ѭ2[Gp^L)_1f#"$L9*H+=HyK|JZ>n1JPN#Mޓ 1C|3o1@.P hrd#ķ̓car?`fOAߘx [3A|6*@y*(rK0 ?jݭ .(e;ݨkk൱K:v;OeZ:ngozlORw.Ne[XwE՜jl).wc"~WĦ`g{dVהstY{B_N.#j/~XeZcl(eWjq\w^hJS)ov.k(GPp{K̬`VGhy[:9lǺ {35#=}C7%|N?VʵU'tŞ\\DC[}]cu4 ֣E;'eJ2h"ԂF a.4 2< TǓyKR^3/b ODH 9W/=/ 7EEK ɜ)$UY5'JaJ8*z;,݁=z|6ǝ/\-lIKz>͏RUꢾtYM@ӵv{0HC'/  ݔwӦ.;`sY]TH KN?]{rdE8Gg5!\~3Z{V~x)C%m)܊/j9}FPAYaTx=oZ{f}cXfjSr`f{| PKT(kFbfR˞ YH;'4~ h-C}"bŻW^HSk鷐y9$`aä0wxKU:Cj%M)Z5Ihq:ФxP|8J|VԂiG6܄C&E'QG S1GRM.>hz1䓩mė*Vh -?TS"d}wLgȶ\GDfuWadcz2-;LglE a=RB (ũ${T;5i4:BϚYծ1MP rgly)~]n{F֨puΜ"/!'>VC.Fp3"XPG Mu;5{׬Vu8к9[v ;J r~+BǢ* qƔa{-q7n54i:S4&ӑ_a^B-Y2zR-4lϽD]i?+CDe`“$YriNF[W_i5þ&'H8L=%OߩPC'Ȇ7A]\")&-pmnj%H#LJݗhlX@%^jՎT,= H ӱzn&!+sH~z)APM(7/͢[3gVJd^ 1lPa]*er͈܃K؄\:IA՝t[eq; 81t:D5hw9tnȥTlʶuLs?ux}vg'djZ ̮xNQ`F|V$`0=n o%2c#1gu+_)@t,ݲW;`hǖrP+tj.DIu}ocl%2~q?HO-e`#N#;eHu6(q0(Jd nG(ӈA. l t{zq+7hjjޯ)t憎{Q+pϹ6AJ$$&e3xIX ƊQ;HWhc:i/縐t%JI+e-!fi#2useuaofh{fm\=Be*o 8B.h6Ԋnwt0ꍗ^tsm6gӛX+|qs1@h'M6f$s*|fTx`sK4(&$ԷL(miad1 |}+JN{ q޶l )5݇x{| p%N'`QGI۹vcWl-;334wq+ ڤr /pVSp@N#S B17=g$!U|R ,*ɝ~6V[R:1M_UlґX@8, !s 1oa Xebӓ"4ٕf˘&B jb.mݷSj v?B (J#Հ̵Y/w)Q* eˉN04Jbc'uh&GZͶ$:~́;󩎚ܯO3M<6{߰aޭg}f/sT>݆uߗn9Ktw5ϵ@A*v!E^3H53pEB PRO"b)o*Obۑi& ֩PT% LlՀb2lGA`)|5URmxQu$|1 %y218)'|v}6]$W #<kxT~]^exڄQ!jBjFӘW˥cs :XOa^,4+" !ԔFD̋}I>|n`ͷ@sx"Q$Te&vTOGԤ.EJC|ޤVUԍgvZqԍt³aзyig /hY}rK:VG$DjAņ֞AѤ >"N97e9MKmeDRwOF>k䦉{❡r<:b}ǏvnweNY@EBև; 4⠢PFPj mVݢ"?||ivJYZ4N|R5⸝󟚨ņ9YRG"yh:X>S}{Պ 18IJ\bHðx;>9awNDZ2tZ2k`F,6^MZ(ݳNOVso ]}Gݦ?'㵫r64՜I:&-cxi5PS8+w'j."GھMCT6oy_+t.wI"}-;*. 9lz͓h6&%2ѼCYhZ=NtaVWeEĮ.AT1 ֩x9j.m/s^PNJK:I(i$xЕ!Rls(KB/!5(u ֔K8\&P*:miR(*0{rm>6f)b{QvouLdnBbY )&Mit0|[l]#2UD?ǧ/W,> ` ^/Aw$kϟ=W[C  ͥ~B{l?QxMztf~wą W`L*β%S`g&&ڰEZ8w"_bW"f Sv*;M%n\5yK-xvq:Z\8}"p_m0޼=Ř̤A}[_ƐC?.H`(څm`}~2o+zge/T 3+ :JB.~hF֭;e_ybdv {ڨzCu2ѱ_anE{˽*:W#dsȂq =qH _<; .h X*0Vj17Z?s.ѵ݅Oc$Y^}ph>-,O` ӸJ.,`c<߼5R0oHNbz_оP+Pw(5z*qDy֋7_f}<ڷP,[ J t,R<걕eskJ|v620hISR i>P$U:e`6RԶY!1@0wwK+`}ACSPuؖ`YwV7O5bQe4-"  b;W|TifSv o! %{U(6.7KqqF$j{ SDL2n8oj3k;}6.b YMay@w5/y Pp\`*IHIy}%v pe,W`(QIUchh+ʜ}J;gf=?_VOql:"I41VVK,p2 MtJ7ZZz1>1Ń]IsJwAz쒔@Xb%ʆgPbQlg`J"ѕk:GDQTP;5tK[GB <k6\$x˨(Hmh8wǨ61ux[0;;Y@_`g_^5LθMUيXû 4W/=99K"ռx%Zj-4;gCa|e5sQ+ޑeJ۵ E{)n~X-4~bT DCeuwJ R*$`!L`\"O@nlwD<QObib, Y3o2m4ndžݮ-;>R9u߽S&*ވ 3p ?Ry&r]A:eʽctš= LzY,AZXwEkG^%=ዎnp*z4"}ȓ_4t_f{x93F3N¢-s V[iO4?G mtu PtG{2]*W;֥*D#NJFޓtUZ='.Z/ðߔJCgO]76yT*Y\} !Wktfhcz.kb]#hFn&&8hH4VQѥ39 0|s(UvB~oߑŅ"l^yoQ14+9ǿp&?ۆو} dzt>]syM -M$)YVO|camstA&E:pw8lm|[^T0!^&ɟ.LdݜSgcPxy|CIR"V(Pۯu~M"5Pzlkö ,h^9Mxui`Zr\p/t7U4NIơ1®Ҍ:so }Isljujˈԝ`KٯA 6%FtH.URqҍfyJbU#LdOF;"rXuW{hXV$_dN&4PJ;!f$kg-YɭP6,Ĭ_@x\p9 V,Ydֶk٥-+=Ez铱"|iwNCc\2UN^YϡH&yü2"aB4HW\t Q$pH~SH0N*:~s,MxF1y9i`r/4 8 ujQ!$F111OAX0椤#F%s;JI;+DaxbB{F"% : Mr{0JZi` Ʒi| u^%F,O/4:813~^uqy0n1.Y82[VYҫW%fZY|#m<}HCs$Bv@\YIu> "I9ЮKT??0sr[K~bT@b's:+I»|(\J$Zz)T[y ֝4ªI+agѝZd3ƁE앆EN7)şp[x-H__8[[YLEލ0״CK7eR\FǠKp_P`f=Rqqp  *$<0N3Cq\& nna}9DFL׹aqNy@?"^6طElq[Yv/Ac=E2rPkzg >76~:x> +1Qr^53:xY: EvcpI^:` _Ry 'jc;W ]Ŗ9< v3O_^];tA[-nEFJ}rӻQv.H aL ulZtW T54yvy/^q5|9=u3"ɲjq֯iHZHVuҮ E s>ڂ {~uEE9PH*ӠЙdۗ]T@TnO@Y낧qd :D~0X@~yӾh[78#/-D`ƍJ<'DmNFU w-NJ7-YAs_ɾJ0BȫKGz10$h)|;^-1}u e }8x=J.[tr\w%EDFU@oJRC woz|x =OWmsogλBooy=f'̤*voAwq950@f%o1PtaP~AG;x?V"6}/fIG!,U;nl֦jHuEџع&r/$:~Aؾ!2FrUw^% OKt"@*wb7v [ i?>&dS&uHn:ơ9882 6V u;U\y5An.0Hͨv-Ǫt|D2gKCVj"9p !<谋=oyjGdʪLNdyw9B !4/v/DX;xqiITEZu{0ڡs˘'`i<~{=5 wt;>'Q@Ia̐$o]qjY)^ a7+4 P-tG& g*m_D5=w9+D#\\z91 H!n~xC{'9wo\ | TKV Ip,zvvDQȂ>Zvf%euoqu7T4M z0pw-b-g/)Ha0m7 hQ<\_2?w,W׷>'[>9lJ8nR>]`ѡWwqt`'_ 2Yګpr/g5ܠ ƣRtI"Zl_4#|6ۜcfO5eR&g]e11;{Ā%2xsy|,5l}xPOXv֥%Sr/͓?oH|R\YyD&r a Bwo=0ĿTٸ|癭9 1w(XqubIZC3_sdZ4ptfN]{Up WЊ7t 6MAF # .܆H 1Ʌ-G![Ԃ[FQQ1xZe$:f93ʑ_rTj2*`ڃ'Ne6bTuoJ-*5"J57mƖL'GtJ/\duEwGq 2m+ ;@Wґe ژ+hݯVȵ׮.̶4/a,5A3WB($5=5sm;Kٓ?Yػ*iK~+f#!sA\z*%x-Uhe_\=vѪ _ޙ_crud}[>DP>-r}ւ7F]zVr~cpa跊hJ{(^kk}"(j k/젤d#=>_?+Z_L2٢ 7`e-ʐW- J†1FiϨ6Mwdl?+0JN4"*Be\ƳFD $ԥm:Ծ:6RHpuwk3;Ѱڎ1z󊣷^<_$^cC`r10GbrewY7\pR2ævdDSq7ocf=V_ϝh~몧(ct:_q"Ȼ06bQoihd Ǒ9~z iAԈ zbLyZr?dHؙw4LS"Nm0>^NunUo ·6ݻ]ޟm:}'|W"YvR3*V=Z8d?Lmf6s.8Z7[aX {@,?i0f* 0m-&j ecݘh^<@{ _g4P]`&B&Ea8ۺW;z_.lZ3PԡG3+rJp!_!=Q[ Tn>LUGQ$dO7mgIMz]|Y7Dz$!jyuP|4y;5@`Q͂+TKz~S\H\?AKI BdR6 Uv~g)IA r_z&F@J ^~*nƒD,]._]ĉޥEGVt״YQ^6^~$ V$ěTYN.m1g iz{҈qdiu'Tܡ%] ]XX7̯{Jֱ',zttXmfW'fKn-aZn^%YIypȖ׍ MeQ,%T:!BLZDE U kQι?k7 3P4V)U.k< C@s=E̳7*7*U;"Ɗ*5X,dpW0+坊ѵXwK`ՠŻE?"0"螻!n8nMo3|g@ї=G ҩ1`D dqiCiA1m̺W-yDa1a@mu"G&IuVLo\6,4Lh9" 38g2Ҷ1%ajm3Ėiv`c%#D:sڔ (j߇%'K| .Q *e4ShLa=Ylu=pu U GtqV`;]#،CTU(,2mZy_g2=45{Qk3KXfb`BstàKVz3?*Ы_b4tBsu<%5dU@F<C!,W-*9aQ'?X$4юrǒaZS5WI-7(8u2Mj\<ͷ f>J<䗝;D,ŃxWˆU(bm;F-u?O{fB0CJ<í8|%*ZiB7>Ǎ _DP\`ּkH4OC@Ӄ4'%cjİV}) dBJ\pǟhƜv>lc%o]/hyTF w/g;`IZ_S&$~=9Cj!)l<7HZlJ@^$UUR"rdVNcj7r? xbf3гi_pt_3TM!@nwџ\1‡U jf6 h>14k?q98_f|X:۵y)o䑘)U;)r±1^\ F`P/'LYûgi'!ۭGrj2ؽ.mI2 f9ݚDѾվ ѸȠKk$Ls )sms^* P>i~Bk;R sOdF @ʍ5i±y1ȶ?5<D.BASukKM=~;ۢ~\kx[2_8aXHQ:~CX~Ǔ=MmkGgϊKJ. L?Z,AUmWM9ʻgYJ6޶ԅQk[:L&M .Q!+W@d={iZ20뱵v8a4w<3eկ0Q`Q俖 L~˳:a]Cי=_ iL(Q ih>,զ( <..ĺMI'cvo>HasoTuSf҂\ oq{aj:s݈>[e'(92X`RA,{q퐅lE&nQCeѯ'ta:Z  ґMҋbn > >QI(pr3uuگk:`̠D-s~yq>Q׶OOuה"j ÔJHO7>O ĮR:N'VvC|MNt5 *.1 6*g 7л{iLn끣;ol˲1(O i4eӘ<h/\vED ύN_.eͮӣ7ia\-n}cB.h|t,uPVi+ٜ99kTc$`CDsQm'xt*M=Cb$9g2$~:sfpn[zH<@1k΃lw[5LL|G8=mCh5\ej/J4H $70ЮZ2(ܘ~p(֪x34p8> '%e_+V+HVrI f)s9T 1$>GH l8/q[uRm/# 0:g)dlX&{4]32k6 ,oC7n:z;w%kp?,xGMaOđλr7vXօYCxкMW/[82UӔ4Y˙Y^Xre\n #Yt) Cf.9!Vng 6` 4: ʀRtffx x/,k*p5ۉd_ΣCLEľ~a"8o3!Z_OXjؐ dCޏ" M7~9" 2.8bgzFP5^Isy1 ibgP[j$>NƂh Deo ~h QQ9Iiک\&gb3@23= +4|UQK5}L)_L qu wXy#!T|{#w,|we9HT^<֫5 ?=e$?Ru"r-JS茹 84wtNjV;Z:(}XÇ 0EH9)^ʇbgU5+\#[FvhsSb oOu||Ⱦҿtfl_1X= kuU`ˣp|h"t9{?EJʃ:]l"v"zy񭓦-%i$ѶIab¨S`|4z5%jg,}tEW{,K{a_ľ&Nl'qSxpcvlK4%P/Vc7B+ Q+^bJ|w4ayw׏gŠz㜽-ʗ G6A>-*Ju/(a.uƤϯbgo/@L:GH{3b"0QƋt 5b{GaF/~_}d3т$19ΛlWHɾ} )J!D.ƍS;S@MW\e&.Sћ6?h%8DGe>aѪu=#6?/ k<IZM]SN=폇& 椊|n }V뻢&o >,Dg$g uD Q8|hp,8bU S"I-m{.i-]MwsV~p8n;]nSs :0z 4s\+3)!JxcRsZDW.ܲ؝&VM ?Uמs`r js3KmhfV"ÒΗK,' SXg5PH2<ɚhř޺XD}$SljR)C5.]֍e&NbdȯqQ\D+d*Q^}DD "ҜIJ['QpP:eÏJ=b,{f]?murp=^:n`RhSkxӔxެAB3R@cO8I;6HcA_8BקALT bu9[ $VٹTmTU3hvϫ@b=aǔ_.-WGGodtC(Ou/&BSM:A# ۹/+(x5Y'Sڡ =QnDIAL-^t+Ώ+#^DOoXܘܶ`pd$ 9\;hwb猛]9I Vt9N8K6/-0FK%O%Z&WF/Jޮ•8(w2-_ʐun*>jmT `aɓ`Xvxz?0!T LX|"G JՉC+9Bo9{NP曉<cx> 㓕|YHuν9寽yW{NH'}RDkS8TF KM΃(*P߉#ouzA,dC6K=5bT|w8"syvtR:E*%!)'¬Ḇ.;GV5ڻ%c=M*C;VIaB0lFu5OךRق<^GAWU7v)M9@X `k@˦Fw2m/S+,"HBR֍U7(NytJ#y ?O>LqNDUitFxuWCvg9Ս&vW|fZ htTenxm?zǷOIQnŬ}{#L,)l8H}rN)k=]' 53W|FbuiG #os߭ϭOƩMQǟ4mnu;6 jbό~"_) ,BنpK7 ]D1qOע9Cd4EI{ VU*%iwxZB CvPǴeNd>n={3-8>_RH]8LARxoa(FB S$2K9ПpŕN!vaN1I51aNwaA:b4vAm\8y|Ieib|+̒7Q}k݋7hS\tLR 8<|#z\[S u }DTz&F4 {([Kiҳ~d99 8! %Ah9U0Yᙃ)gt».Se йo;e.lA5"ǙwZY[&W <Β"ky8A`A09H\a m2=۟FV6Ygte۷mͥEMI.@uk&'g[T}O=9B:yߺ6%>ZM{`ݪ ̷#V5}8>Uqܰ ~6ckTeNa}r 7k]ӖW&_8A*m~GL,դ{,./jHJٗX"*gg2`Nmj7scDmj淉ӫ"a2:VRP$vcj{,|{d-9}7 ~! BWLzXRr8eefA~|h&үcƮZc\O[4سPg 6r! Gi}7Jw?? 9y.z3#=dӠ"phY OU${6g| 6͒6 ?BA~ PT~My!PvfDsAX\:ALc\h oS-3):aaKrObRM d4G0ݫ^ LJi'վ(ac}0hʢـNG? ĉؿ4c-!@PЙ8MpBc{:VF/qA$;^rwXE]+aߌ`ۗzEcNmw=;A5)za;"Vv=zLEMZnDsf|V5XWVOב9 İ h]5]C+0w.gz2j8 pARIYYW\m…/T2]eI>=[<~֯ 5aI|&PP yĊa5|ZA/̗_| -Bz?L_`Ӣ$լiM@ ɧxSwI=*ɫ1|ԜF|&_d]J·2I:ݍYbQ(%D4 9V&HFo[ѴQOuR~j>A&^hT`:FM/  ?C.ʹ/X 9N2E<~Fgz 蒡ϾZ:з1Qop6Sh`6DWK3nQVD|4{2SsHO6N7`(#2pҾ8V`5n}RI q̧yʆIbN2#I/rKvF+o7\}^ h"O՛ڀa ċIBrCn7Uʠ=qe+M4(-D GJ]:ic]Lڜ)>D\k..kmCFkW!{kWgް?0a\;@ƙ ޲60:(wwP ¶&{[-28J#GȜi}T!%WęE[AҪ Й+ELq& рT[b b(g"~@{s+j [zsm[_L4_=^[؜\KoA'!S,$1+V~k{iһô4pd`è+O&5㔷Atʌ)cՒ)5~ \͎2d<\\*_紪?RnYqV r?}ݯ"JƶvSmZԹyAK2NX92G-~dqded Zj!K%jE^V/-:B.~L3h,MP7x2Mv6_iXt֊7UhɻDo%f53wVxm˛,a6]oƸ=U8.!:6\:4~mUTx50ׅU( W5˷P!Xz[cb`IibHh g`Y3}3G^ ǺO [rKA@kJX ?'-igҶL߫/cO+`4PV@'v^i.uidb}urBC)T kOr$c~1>.Rf3:~H˕ӱmU:NQ.NQ&B $^.1~ȒMs7љab%e,>1 |<"=][Ę 5}`cr[sqƨԺ]_5 a{(H)Oi5vV (Մ6&/#3 FEUn<<)h,93H<cM4?KIE7Rux s4dhD(,[XmLL25f" <:%V{0kJg>S68E[(tE '={(RaVq3rDPA"[(\fH3$(ξKݭ_^O'R}3/w=먓K\-CX)trRjvmS/˨0}0& 5`,(Tsf F_a@zUg &PF$Ɋ]AMf®:.i6]S{ptX̖En71W$l<;!&B!$yk 0f(&p\ =v@mQ$$9Bn:VWo\j̨Ӱ;.iM RId#R+ʱIx2Ie dEm}&ƊDX7$œ *-@3?0>dT'5&ї#֮4?yJC8,/!sgV27qZj_SN"_y*5F+, W^ 1N>Уphw8?i% i]3MӨH3ʛ pԿ$6$$F'n~ jMJ{97'O)Gֆi_Ys_Nf:kI49c@*nUH݄0lm:. t]>|n١`d11;}?3UPq2dÈSԛOY) yZz RIlҲ0cUbeSѢB;A48{IoE Bof; 6$]8?P3zXY#Um{ҲU|"n"V?=\ +e9O ϭhX֘?7o4#YJM yT E^g8HXdz_wJ1j|8IX #m>(,'Gjn[ű`';qQHCrbuA^<"X1GTucvk< hilЃ9S[?4O4&Wӽ;C)!) =HN_Pm:7s"yTnû|d-.P c=^l#z]mhqEfd DlDwxWk;fﻘj~0cU,+xغ64OnR>__s[ g=BACI+qr1K}P[` {$Mm/ks5ڲeTWOo(`ۗ;%Cء+Lbj|Rc4dIM NHn+8 KVG ;`b!)NhE]ۜou(r{|t uXyIW1}x٪ZI$I L`WE=.F.oUIp]O˩EiZx^AYkXRgD툑hbÕTnbif:̛HŖLޚJḎ;!}AsOHܣ1XlPِyO2wƜ {M-t=cw=V{k\imG߆!Qषp%9,?Ĕ|; ϛc*F(D{YY+]wa}} N%aQ;Wjuƈ5{SJx!㑎Ӥ3d0ۤ `?*qx<לJ]Y?P].9X [ʎd"NT1NObu Sdxxɖy('z)&,;:L,z#[mr&JARgԖPҴhE qοi9ڗihnPEX2dk|\U"GRFL, -VUpoe/)Ϗg2yVy$l\ K"T.'ek?llt01zFH# Z޴ִ,~L}6!N=l@!JSMG2-a֟J5@KQ;Dound7+N)7Ͳ3 vFj 7a"sO(Iӿ`i*:$_ɯ(Oet=OUtdKLfX+y!P-Raݐٜ]t-ƒxTE5,xh0/~'Gs5u:z7.q$Jp L{M%9Vs^.$'XF^tׯ?aŊ{Os=j }z%!2VVDLN`&,ڬH-X6 U9)+;!Jt0>x0aX8T.pͫAP=e<<SaEY_"xFT 64_aො1=9">+KU<+m]ɛ*W>3E$ÈЅE7E|H*nءLgosKoU' И̐9T^M؆8`+&\jڢyz!>j(6F:8n >b?U K:vy[Rg6"}1zrTG8G=5;t+(;:[v z}b:n^K*jYō ]Qd2UȹG%HqYb`_Gj3f)..s spݞB!.6SC3|j ^n0LX`՞{?v.`!.Df%-B O^plо:b 8tҭ/Ju@e6Bd׈}gezf33>8 [A1bHϷ`xvad ȃuZe0l7SoSn9\8q&̡[.5CowK&y!scsщ h+_>Xԁ܉|(WrgS*I{9=&Ɗw)h{d)v~74Ow52au7XAP:Uͨm݅'KfaE~[?E Rc*`+ECw`Z5e(ǩ1 #=kY9Oގ :b7\< ~>"ٻ(E?Ts[7]F`@<οe7k+*V]K`gJIPA %;d`u,AP0O/pƚԗB0(`[fXI%[2C$Orl7qroПNca; 2J Zs sёmCLT.~-SQսj~>(K OviU԰W.WCsIy[ eԡohy0o[27pyOPg,+bO﵅pA٪o)',-G渆ve)lP@ѕ ` J1ne8 ! ˔[qQ? ,m028eyǍDuȇKD4Et F9e! `@j #wPD D$@Ƴ8L hʣeiqLlU Ez prr'/BG+o(gx$Zׅi{Z;(vs.* Fj{#>&'|٭ԯ|9.Y$ABpwpƚ+&bҖ`!6bGKޠexاKvXW?aQKWJ~N1OWs;"TRgQEc}TuP9!e V/'£Urs|8឴6ʈ (|-yජuY;ZNBe~q~ )G?J4|wBCXn`Gn3v(|QG#. LGE,>[++l"йgLc1Xb;?#f90q j#>3dy_ܭBry4 76T2T'`8? F.ZoA-GvXD縴.D(VK sJ Y_&3@tbq4&  /$؇|̞G`W7sJW׺fW/[@gAL9`yn4LZx[wxQy=cXqu:&wmDnWBT I{Ց grR"z]MmsrG H:EB D#q!'8VȾ.)ȇryA&A(~S蝙[T/o_҈ֻwd{%.ȕAE/0( ANS_gOݾ*,w@d2Ԫ@G+ ~:r_gtç:n9vpi4}wGШ-<8 ͮ-3scαE3pEz(bw$gsj(QUx)^Ӕéj*42n27K+`PvA&x6?]IJ\ R݃vEwuBYQǶd=zWDO)1)D@csyfcI;脡!=f3j^"SAR'hmNɚ3LӮL}ۋ"v;18⻤ӆ"?\q`q%*/b\L|\IVQ'q/52`m^;L35IbC9]uVʹn!F3RШlJsKC8"2SpVJ8)CN#ZwLU- ɂ#OXVβ,sK\Ѫ5\]Wlm +CU(nAyҞ7.RGn?!c ŏ̚6EtW,ʁĊa?%rt/D-d  n̏WzҡWPV:>;_JYFYL⽽U_bHX &'||\XLJn$¥wC:#4r߹:cTy/:~_׿3+y&Bぷ eʇ$ Uչx"M}m(/f5Ԉѿ1hv[냰B32gJ:=O=P;Dl Iyt}42Z%mql[D8 ];ˢ`i=dTDMFb{_LUgD/"d[&>YT5kVV_-2Vf*Woq&bGp{gAGP^F Oh/!4PBaa_.*ke%uFe|59 VsmNGj.ʽ0 eRYgmw`RɁDll;ӓ-=\ϿF$j,'we>83/ q# N,v ެ]Q.sRfCKAc\-h cm 렰zbD^նHAz: HoKx`Cl&z't r6uzWLsTQNƢWq!5O=d0WbgQ7 EXۣ* `1I#~Ь"P%\.cȮɷ!)! =ɫ~ c䚞/Na *Yۏ'Gz+Vm|!. 11c/o+)7}M _B]ʚSA QhߨM"t]2+Wbיbrh:7dycvyxOԢ5|OƒBݱW1܁Z,#`"YjVhԼq\˞ʑَA MZz5LfP"ּ /l.]hKc\#寿Nw~y;}ȎՐh Jn n$p7e^Ū*2^咾Xr,LB-RUZhtknJU#|V(r6߉RTTD`PB rX-uzAʰ4z~u,\v jK)pt Gȿ76ᣚ7؝x'p [R L)b:}[\ޫM=pQtΨbDJ1}~MBlokAixWg0;dd_i 11ѐ ?A\=t6EX>nttDW}1Yr:? 2v@vKd|y)K?ȱ i8wǸod{L)1B7쌣DN%'DX&T@0}ܣV.QJ~2sCvҥoI3&YP^ƻJ %cѿj;(߅vLbڰ 4[[^"^*l!%ș).&6t!4# ZպLIY%eb`9&E+jd_ jD tgP9Yom& M~z laCϖ~@NCi!q>#=@v:FrQ̑$'$hRP?AXC9[&]84Z_Xh lJD}@ J?!f6(}W\kr<i6; &X="sdRfZZT =G30\$(8A7of\fbz!R}"gtn2 b8\v7"*.%= {ݪBʫZ@*(p,8}ky0P^{3{Ϛ<>W[Dn㛋pс|J-dڨ`=| Ǭ`Fn1(@{ zp1F@oG_lu!;e.bD*'aK7O;F&)H2|RԣOK19T'A02\;7Ŭ<}خ5jcAm~hz}Yħ-"9>qQ[AE


M`QVƥ Ď45 UBm@~e ~21?{%z Ko(#yVf PӞ%3_KtU GKx͉53ݷeGCФ$i$(U5Q<*cx0|T mZExca0}q Sq:nMɡ kQ4J5ѥq3m&vZK'=n1 j50|LbD@?UMJrTNP:8&d~Fْ87?mvgJBSxE^4N%a 'y'Wp>L>G&;VK8&PkY@R-c? (v߆RD:g=B 0 etAOht <*jQf)׸̼XK |[g4;+9XJ9u/xQ`jRa7$d$X2@p| V NOqxT d2AsF`ŜXEC]=6=rqEaZŻdHc&"rT9=Q4Т Z7፼# nIa!E4xUc(^mfjMY Ah&dKnsU8/ӎ!gO 4Qv͇ͺ\|= ߓ9j.ůb%Ag4 ާk=v sr5o$ذ5 jKcYXЄbdZHTJ֢{DE7D`21mqTݚBkC^ٲvY޹;M3K>  AGA3\Wهj%; r-YSOkξAç p#nEݑ9ao{ )(Cg \  E^)%5EJ ϷmII(]l f@Kʕ)#}Q vFIcΒ}fO9gD}RGXDSA$e0yԯH V-G8\;tB*yw+Vvn<Ҁ*3P/s@ :۷%u6 sC REI#,FDM9J83ʞMطFe Bv&^nonnR#(KP=kbR+&!AlS*oYrhVل'F\L`O/7bEouIB+4vl (8mBg{wIy h7#y_&SĮB q&]i˄'-rؖ57&n{TLm$dtgj6{,׺6q۹{(l SM϶YuNoeir2hg 4yDV ZhY?* W/H|s|;b`pfT'>;pEJi ꎴ.Hyh'"!cĕ"zAOʎq׷~~Ogj&kW)a-&4bU^M7.7;C^OY[e/UK4=2'C= VSa KCU 7a 8+Z=]UcdKڤ>EAƕՁ#Eš9= Sc߸BI'|Wyhb@! 7EI\#ѤzLcWٟ=~=e9&̃BzJ_ ]IAڼ]H>R+{4~ uf)#J(e3kLu3x $8$)'9at0RPGb n4&7 Jt@ YJp8VFb"ߕ;׋[c+(FN|!BU s䘡T?BdYKbm56K6 Lʆd:K_j׃p XqbVN)Zw!EORRY8ƆGQT\YxjZ/>W[gD|{t.IleFw(%緊v%o LON .J5xO4e?Dz̓J͇a,c;o7V/ 6TscEVv.*KDD>"|\sfP`*v,ļoji$bm8\+6~}:]f 6!E=/jy 2zxk[}oI%2VqpRB"x Q$V&~:q/ |;=ʦa0,{mHֵh<~8F((vvMѲ#FXcjVm5Y*goHNA\49v|qR;Q5L$!e̥^DㅹƝٮV +DUntb}}a[*5y{sz׷6?q|7D}mp܀N'2 :4alx~Fq'$DDUNnYŪg-ζY 0XC % +rq'#>:$ >o4U%?Ɔ UqvdsD{z9}_k Hّ'j݈䠬jHK ly\?`20&Aӝ/ z9rpġ}b>!AG зaF YR4wo}Fvw=Jn_b _ \x'j>uAǷN,MH%J9 hc-{BHwt߉}٦IcWOA)Gժf'ŲC '/(ܝI 7""VMp9,D>KFS^Ըc'=m5xl;y4wdBUe*pȺq+*^ ֲ?l@Oct[7A".qԱLJ񴺱(sm4 r*CdR?{Y'Uu ˭;t`;T_$iN7?~#=8DEfF{e Gw^e-/sǒy/JuL. '(nMM 4z`]&E 0x2k?7Se1]#P7/(W)ed4ųiܔ1 0`6סq V&}tSrA2ל>O,!@/,e#J ϯ!`Pjc*ε( ]WD+€#UplW]%HաRD"slDJq O a{: 3o A)3r- Uh!vGTKy=QgeԴOĂՋr&C}A ,:}7"L3$ fq@{x;H94 fOKWi쀫,R~)rŔUPT*@+8]dy({ iDayJ*: ,|Kp1>v>Xa$Pɒ{N5WlVj\7\&ErG`gΉ1R &vNO*go40@@RP,5o  `c6΋gXLJc OiuX76`+ *=@X-]_jXv!mF1cC?vd| >&}:}f&'bP@MF@ 8'-3rʫa$1#>4 C|ʹ `NAΦЎU|ZFac;jOI^G~/At%rF9·P$9.X6+DP[󭖒Bg$!Q}v3 -Zn~2^@xġ2l}cc"T*,gMy,OFdtl(*Im9.\_8_,ǁS{^0 syT>tyӬNqc*d9H E+(S΁ |+R 8S^• XSU)Fav̺>&>&)xZ\ rgWڮaVzjBH17,I;zHy! QX+4+s1R;7>V{KB_B~iDhsJv<ݍ ~-_Ͽ),q diaU\ɓ]VW8w|?WɥMo ᠺ_\˺ʺ%xDuȵq[XhMeA(dy#~z0fvHMkLLaVVLGRʯŜ\nSŤT3n`Jg]KgbN wCi Y'о[CFA.WPÀxqGlF:ꌍ3k ب S?j/wsM8xerIIܑgՎIb,"h6: K T,f0b1dG@jF7لVn_mbXw< M'-e,G(T _um4`Bw5,i9E|@RM:^+B P'$"pSK<"C:P5FЍP1P%:-l ʦdlYmN<}g2B朿}DjSܮVb ph] ty|iI+x;U$-G{Q$#G׻mYR)F]-b}/@ἀH`R6*3a1P""/&iRHj USEk}-D+0PS{Dso!V>/!)GΈ`LXji(0&fu]þu ]/T:5v.(4V~:ue T]p΀)BBSɓeGn@+jIb.?6lG‰3@ 5z , t p2w}0Uk2^q_|SfɌ}ۂ\L `w}K!ۈ_xd+Q]'MsAB^6x E} X(OϻSK};\2BHB!\.RH^5lC9 w rR.BĤ@kdqE>]E?+Yj$H4Kmu</:vy$D1 (P2 JK8InBB7I6uDU`ePHr/!)F:n{RT*fRi xkda// \Rb ~o6*'-] Ty 4А%'.r9Яz{t Abt rsBdZ|$^-PXKii`2|n }(ֺpt-*P]Ve.I /H`)=X_ ҞXө3#B{Nŏh"'R&hϸ)vqnŐjjJ u@c aPV nnށ-_T-fuqo꫻&W YFַ Ň2V'|XDN^={ozsc,De]ƕ(dai (hi˴1ev2PKq #xݶMX j-en8QDzEY]"b"OP;ZBG_ hجl/fI㵧W  f}*0_٩z*Ó ZJ 3?qk} \KclDQ>`7y2mH'*VY*?Kcz@CXU쾮vX-%zn1Cz(4fֺbRZPtvMuo(q2V+`|Q@D qehpܼ5qr,!7WVB\JBB Ʈ(W8U[Ic7b`0\E~ـ&Uz7&<"^F"ܷ zۧ7GWyYg(N `[PeM3;iWk?af p+"%Co >p83gc댏t&w#3ڟE|ZGv6/ִ'EN>X]&-YKPk5̋} @ౢ )蕩"0tygjdVC޸/Lٲ/S8?uj#U h7ZmQ]x<_ԍ 7pZ~vwLQWTF2-l e,3bp -yJpG s qȆ'ywЧr&oП< JiOްM ^6ϴ펡3TexFhc^gث~ щDvS T<zGŰ7jM$V(^0NgE>0 ;I@78t2 @twB8Q47. =Ȑ6ؼ|ZC$9U2VAkG=lGˍ˷S /WƴvcPA{w[5JbÎu;Y(zmNw&Lx7[BC,^کiI-^wW7@$8>6iY4˰9UJFӳjz4#mbWi8z/ `v~NC=߹{&ZW| Q Fؽ dӼn"J^.hJ\[ϥ9g* CD3Sm.`}RhIkrzl(Gg}8uQxͤyZ!=R%ٰpÞ쑟X÷,<Fio-D48Ēd_uWS=) 1WGR.n a&`= (GEn+c–IM hq]UWptp'wc˿שU!MeJE$&=p;@\q%' NW;TOz 1ǠyANt[ՖseUK(TqE()A4^ffVQ~"}F:cV W%k*}L'xX- W!Mܱvۖ8b1ﷀXվY Q0|`301*+mi w cm=>N-ܘfNPRDzOV̄$)bIUX_>y,螐0:yH@El%5l4!ɵ,Oۆ<]yhn@M @\_Uŋx]HmU13hX ,0d&]( ɴ"&r>TN,q@dvA!&H'd;IMwk͖ / " !Z|4dg"ϫq YtJ 0(I- ? |H`.A{ڔ PM]j^x(:jxC5ER;vEo@!) lZ$)7Ǹ֫+6'߅ z(lַs~kW=؏`+P>!yl tmqz߶4%Thq@*dd M[VV8"@"t{%-;[yąnQz`.]"d$QI g}>3&e207c] ~!F37"9>S@-m6|ƹg;0+&YV 1BQܬDhS/yYGչY.k-P"(DJвP ^v 4"0rYAӂ3BEJꋘPD *&G@qھ-WvĚE۷Hk.[F)pNh>Oޤ+9 EݿU.ajz-| 8[`oqp /m^LH|t&AV,@/Kn]D` ǷXHH0ܾ(~Va 1Fiꅨ>%g8-3 F(Sӿ,O\1SB>D @hPgWgs:j i\pY07%ÈBTI&?@nۡ ~![eE*.695~ ;Xe)+,d@!b|YR(1,5^ʜP8ʐ1L3Y~]VkUX*l9!Py(4 m.TȫÞ}0@ 70O 7 } b_Axg<Љ#E$]#ƪQ$^ȶ@8 treQ+?(A _96-D/?1XADSx `zz|5@'VYU9bd T ,W4SِJ޲2pBqn)$ø#~n< 7g~D4o*:C:oA&;4ߌCrR wp{Y jup#YS)W/$yt+.+y5a=j|V+P9Vу~=u,~E%8Z %e],V&\|woSkYS c_2*fVfYX 8oH zt< ոĐۚO}}9=O|;\ݪf1#5~PҀv?sķdT C3] c3g*'> !nحmqDxY)8e?;cF؂-k@0H$1=leyuP!" )~ 6g)v0$!;[@^n®sQaYc=73K{ǷZcG)2(L< #cK0@DvM r~,@ XcF<%Aq (n+) o$"X?F(4}3H5ҿ$R /}k* A@m#kW[yEM'㬬c5M ,5I7Sx$:6TeѦ.^Z朇Y1Z|!B\īYV7eb?<̋{cU44avqY hA{v"["hŗypYQEY3~0C90k_?a|"N,ަ #-8F5``V)n%p*#3NXK?Μ*8蝤4F̩RD( qtI8nS@)<^wj=aH?<ku  `5 2d z~BL5aׇv)wF%b> qIJ[rk{pԉ*P, wp|W_/IPmq%7ڸcV/5;$?O/L< ݃7hQN($7&[]h/[,c`?ߣezJᔴ2-HC k/Rt!56Y.4$k=t:Pytv\l`J8"AWZbR bHD0ĻPW *?KA.׼;r1TV2þ#j*mAY5L_Wf_/q逖{X~T YKs 3`:*`bD=WSu83GQeֿK PyTC5\O4hh9?WT{4K.%#'H*2qܵ. Gh0L/n]o:ؠ@p~Vv ϗ]Q W♍MU_pO]Yf9cw7H)wܩE<01A,W%ůֿ# ] 9W^RM'QQC `cCu r|2I{.a_ Q dlf|]V^boU(UBG5Ɇށq{J a}k+8^a:IBCIt_da0nUQb&0b0D!P*3 i`V KI-hvccWQq@5@\?&iи`-/Xw(>eϏZD8y+e(5\LAO3d9òW/QUe4+tb7KI@zh;ꛖTD37NRL#mCNjDfշ?(n堡FDF56gnLe-minи, zɍV=Hf&@-:I,*8>Ef6(UO~FD}jN(E+9D{V/$H<^\7`o'_U gPt 㽻3r}@_lOE*+P:ZZ-D QF[}jO:PCyq"ieڼI#NBh) }DO(hbIݏ!ZI[T}$9DfNO )x5cx-.A:Pw[M>(uBalre|˭%KDJDQo"+1rWb`F:%†d;q";+D㑿#_Ch  F U J`&^ oTS 8cCsɹ@kSn ɬ9,: D@듓HXaq$$gf@ dfE/8]b$_zIQm"VTF?8  ¯r>k$ǤNt`+7>rJY LMoM{;!.! P`6.]m5D;C?KO?f0z6P ‘m+`("mNjA ګXp b۠ƖT7J| Ȫc\E; @Z}gy]XJN͎H@`VXx` `ƀQ>۪L lJAfӾѵvr;Q޼Np<-!DǾNiâ[\L3hl)ZS@[ŸuZxr7iuCX* EֺBŽCAh}nE:0rL -XBS kci(&∧b}B];Wx ;Ȥ& ƣg^2.V'Z:}ȮB"R1c 4ҦمXrѸw0׳@6{AF׈{VEF׌ H0@H֏U'J?[`wjZ_)5C: ' &E[8>]=sMDasE lk1ʚ>Ym``G?+oK=wZtF+q,ǏC: ~lD{hJ"|ky0`U݄DXq4|5a!"*|[@|rZ7*"S@E^TRpS +:jy vFY}%`]KӸ4.@GqlwR]%+,'@f qxpҀ|cl.ЏA(i$__dxn®}ކ7X1qr@  3;0Txлh7e3Qo"$w֌$ {LU mᆨIzt Q՗y+µ푾湛ߴ*8T!a3UЉ'ԌFE( 5d6#pcd &,ibMYj)EzmO/dpue(/ٺ#SA8i׬I&9|n`*~W$!xN$:%kiUuŁZqDqT$% v-;/_"sBpT{a3U$SO( 0[")/M㘫4@\ԉLJK(=4k\[6_-[TT9#Ūn]f7Юs+> JƯ]Gyh{ QpmKw fknT7mzCv%{BG$,%fDobW_YURB-t4exwb{øQB@Hj`ml dǣ{@63Qؔ0cb2/~T}- eqOHs)MVc|}H(fR9#=yZ$XexyDtNğs6#`j0eGx~!  ,{GUPĤ[9odhiNw Al.t|% w'3w#N}'}(UK [bL>nܛEI\gmEn 8kK0cbuUʮyOJDP+MI( -=@TWh(w К^ #:}?=|5z`{ZQofl(]T c55hua]R~="}a qkY$Eܛ+ =+{R7b+L3k]<j;ڿǡľ<Z6h>3@dI G -B>ѵTZ oۍ=1vNx CC2'ٽTxN0h@@2#smqC ' \ Ŵd D^2߅'0we 0LE=x9Wd4fgxY7מ=}>եkx 4.x Anz[.Ds 8t˶&$˖>Gn7֬f @wyЁ0#cο)P̿nźSV,;xQ4 rŌf|ߊ {WbB:QP" +&`ߒ0E݂$">ψ :Z+AT9_rI -.L.9>?VD%K UϳBLEy'uL.$ /沪?r%&DTU+iyiNyI=g@{CP;&-Szk7?Zn"dr:e&h ;, px۪;itu٭0Vg9# z|]մ 0b3{orʏhUŌv.9u۬i66s4smW@eKyB\v$( >ðx/`2llAY!Vb,kCb0J%|"ەT,urNZR5= V %&$^:<7 Y?Ag 8<˃5bu׼ hV|Ux;u6%}꥕ &=]\II/=YiFd7 ,WdT@%\4pp:y3]z׼A6| =e"*F}9ze@onèuˈccbD`b́MZx0FuR@ W=*ceCyz >q*/TA Dpx`0 :ཙkxބ2do@!7mNH4ʥr !ghBu} 6-jB =f \_ a\XL JN v;=mQi *HPڸXxAACn{iLSZ/9+fp19"GrܞEkS||@p{9^c p1 ub@*)dn -ҡK r׈ݼL;;nR2Iwh؊1rU-x:dTD=dYn0V$6^0Zn k1,:~hyx aլRށ՘;-"nlojhW^"͉qe+$.NyNݬ|}heO߁ګ |X: 0C؏SQgd\~.EM 'Cڥ1rMӽxټ. |aV՞IXX3CGBbF(*Uj,C'D,iޗu[f:@StT ^eED²ɢ-kWoKW*Ohx @ھBߦ ED/tLx;(pR{'̟ gz xQ[H1nLp*8: 俅S c+:!eacM -.{@H`瀓H{/q[A[' R}2~oO+B7k]o|P\\#Laj{" 9P.=u& Ο8?Q5 6dH7^<(%`,Fʈ^JdJϚA`vf`/,[~mUqR 5`4T5`DsA1BbboB~^g̃)c Hɭd0*aGfDU(?¼lqA xpX#q FNSPOG}RD^u0y 8C|PՒVp^#އ 3^e@ EP~ gk yzPzzEs7ndg^:vppTްN!3 |]d#h Y* 6*q+JQ1#K끱ՐA{)_FN{}~>XUx Jӣ@qw+'p#<A^|aE? O3M[{K kqEn!+whN\8‡gv (.CW:&X+XOR׈Ѣ.#i_p тxRS|k(; " c(>7%ׅd͛܇uײf跋?4sԻ8 D'I > VfpEʇIf8l6nj MP̦P:)1;"w3U,xIk-lWQ v^)]T ]3{t]n*m:(F˓zdq|<>g蔘/\8e6׏(ͼKOU˥޷N-]7k"[n^0OyroV!YK8ȧp z.w*5AŻ=\4<ӉKn}H4/ χM]00zEmogTkU9INgOsA됂U9LE l}V,#+owbtDŽ,s%݂-(  N|4Z:)۸߯|ƚ}>C cJhl-" #n0 t gDf ԋ:&oCyKcǁUdsmOYD-߈ki&|v5I״vHqQ+jX r^5Xo/TmUoYvY?cLP;d}iݧT6$4Oi-Sum6} Č lu:Aߴj+.٣ٸz"Hm;V21A@w+<-ۆ6e[eݝ)fE;5+;եa0L( gʻj6辕gXKpɦa@Q"^~ #0,$FǤ*$EダΎrʿ}D% M5CQ#"%z !tS8mO5+U>'x(_U.@B)#fyA.?m;" (Wj) :#AuQj/:6 |sgY9@ɲb+_,Ceh-k HaCK&i[>7{[R{9/Xq;)&lOM;x0g;gĪ&[~8/SALNL( R_%_r6}!z$Eg`'3Zv& ,DP2rtBKhPzT#0 J̆K7 2pP@=;F_"~l2t@gi'dss6 M=dPO ty>Jh?kƑ U4[jIw mhS . FM"ApoezQl-;ʊ+L]Q )&ś-1D9Xɷ66S@=%2ƺ5j*Ub;"*FJ<¬/Z 9/' qUF&#YiHj0\`]:Q@E+sD! T $3f΁ن$bP}7cZ  j8O!0rYhB6S "*"Zz&W"GI{~mQrkt-TӮuĩK|ȴ qgi:vsg;s?pSr=ddM=T *"D"<ʴ+_f7Ie+P8*kzmuYWk; :v /[RM~s@ rS7 }7YMD#L'!ؒd9"T`}Uy˝}zӋѼRz (NJs[a1jTP2Jqϴ*-s{0= ׁ6]| & ,-2HpD"}*w6r#U$Hnz 21άeՠL:ml_;7}˷ܦq/Y)h^2fwSwq}-}*Cn'O^s( x NXɜU`[5@ RfXcjBƮt&뾂hⲛz`Q #zŜ"X/?t>8oaC[Zl0`]Jh>@ dztdJppM9}>ψN0,զp߂6`@ۅZ-~ #po}tZ}t ӘCW֗/Z y~~(U>w ^Ҥxݴ{95`8q®˂ʓZ"aʷ7}\Byy+zsf'V_>(%2 @#vUR^ՇgF Si{8pT=R#g^;^һ, @p@'YfȻ-L)"P!OgH8te`_A.- VVh1M,|1a#n6eQ4wl݄&6!% u£HB $֥lOTlfC|0 NXyNi| vdQޥ3jӜw63S'mOǭ{+2e*^S9^6Yi׵B}EgdOZaW'u~&8 Ilj}Bec0$ @& ޝt(oh V6@w]c؆D߸\ᰛDSj1U(^3hdL~ڇߖҤ`PЛu35?(i8|`aʌ-yQhl|ڃ 5ʙ$Uus=>Ucd`--BܝGޞ!z{)W'Z`l/KWSǹoz5ۼ Vx &ڪNp( }gqYڎ(y .O"npSzQI:~o z|xl^J?PI*k+ NVvǷ)w76*E8XMu?q?@~~Ӌ-h䂀'J+)/;pUF i \Fw"Ͽ|ƽ01~*0J =A!saT+QL0cX>")eNm ZӼG @i]X 8)uv~!L`W؟_ ^eX[Th kj^MI^w?MҨmVdjG#^;=0FդI4_1G^G`x!1Nz܅ C5 l>G@lC^a.Q}n(>%]ܲ$Y eG[+Ð[u˗ڻcYy8*|qy.5vN`֯%L7z;cc$,4泒0u8W.*p<i"EcTʢg)cCN|P3k)>Ƃsgȁ(SdM"}7mw['Q) G* r-OKxy"2 ;|Z!B 9Жw,GZ@퇩JЧU7o_gc Kz,ӱwȢfjӱ)lXS/~ Hy~F#;Bم<%j;$FX( p2pjjO|7͑6" 3xM a)ֹ+>a}D8B_/<}U0w:,U*}t8^:!ziq~Qdl!o Ti%R"N@Oںț] Lǐ5z J˦;+JaxG ˜l5 =0܄'/(hka{ϡ[~ ϲa"s!8DR%'Q^[js%^-B \w&'.WW\S- 2!!z_^P(yٓcI=k2x')q!]Ow_y4qD3QW˼+C_[ao6ϯ Ry1rUjSr[F EҳJw_] gxbJ5SbPɜOhͤwݐz9ӎF*{}{/G;0jQ}πW(ת2?a aRiZ" i}=c״3x/.OwZ&Yلx{ w㏣ @j܅w£`=Bo@Jb*2,檕?}M3=-}| Vc7ᰛH?3S|gs C@$7ڢ=IdV@ԌDW,pq6~b?U' Ru0)҇Y{'mhM#>iצ/D.i&uH($'k-ـ@ACv |VOUV>h1ǩ:IOmuι/ro˽fpzYx *[6;4cL r>zCI{h>8a ItLFz~7lEcm H*/ʩ![I}MX\?lᖀ_kmbJҿ m5d=B Q.iop]RlCd\kJuhF>\[>,3ld†T晤X) =.#҉ E|E<1{n"V P6W%`u}lz(@M Aw,f^@R.P$v̮+!]\Ƥͦ^hktw sWtV!FW_ɰ=nR4?R@@˜D 2e~ 2ʸr_ft cޏ~=$Ɗ!R1(UT}Ijob삐[}}>eU)m5}E {XOu룫6}fcJCsQo :G/XY[j_+wMWk=þ"o=Y-j7zaj5s DA7ZI 9,p*`|e[ϗ* O_e/ص }DC8<e[Մf0YDrif0X4̗>`2@ߋUar&#"P2-ԐyVؒ-@ԗ%snM^($Ea`-C;9dwt 6\ 23 a dE>FCM}"6\viXSdմH#r[Ͻ*xm7.ɾoWphv9-0)gncgnlH$ҿH^o BisNJ֯-w*|T",.X!W+6v7\<0Ⱦ2l<!u3X7 lz`n['Er4JE18JZUmK1.RO ˜)eB((R*]l=/+<…vt?6g 2M6kJ@fO$[I #}S]N+3=Ŋb ׫p ߺ; W釋uԼ%j2A^Gf}b,1ocghS\(ЍRuS!lcs[k=EV1kbp<4 *jE )ydll?1o@]~>/~w ӋB]R&Av'" >v|q<ƻvAPRvTz3|_b"Lgo]UTƫ)-v^&iU !} ^B4͌Ĉ c| #iŽ' MW7m %2Lk#UTw!K5g^7}5g9mp⚇^{`Lҵ$+xCXh2_ϳ\B]7xIMƍj4V\vn.l-JܺI"PAGҊ.W$95@o_ n/Y[>sڸZk<]o5SelDFc~rx6K^:}$WXf{Z[-D~&2[ &읏i8Խշ]cTDKÌ1BR!V8¶H% |)rgg8bat, Aۉɭz#,:Kԏd6|<;'=r[/1{r=RVwO}mj4ix^\{%@S:<[[0,-fxf[8"P\YoMFF6,Ik.ü'㹓6TVo)v%6r7jX$DN")7K,ƶ63 @6O6^p JkfPSå8ySz!/S$whbmu8&W(%I7C\ E` nZ+ ^]C끧bٛ˻v;N+kdf ݞKBɵ5}:L!w?KIߣ:o]sUQ55) ٓ=P( ䷉a#VWa$R,~b?{ 5Um-!Sڝyγ8bd]yB \l5`3h" &`&ָ{z#$-ۺiX |^E8.S;J_kay:σ hqjWnXv"wǧ1 9F`:Nn/dy>Lr#oposĖ빰8H D=.͕OPK4a"J=#2]:Gy_af 3XMyJ %f8ǥ2gα\`/v$ My7B-Ea1hU]|U'z d~p¼ yz9|;wr~-KVe<7/U{WklZ ց).3:aN%$DZ9ƹDFOl8EQ$N3g;nyf-̱* agn&p/3=v!-5c<bOǷ'e27>e=WuMɽ㰵4/y)Gϰ9q$~K# 7H;7[dtˋ}6"o5JO`hȇ;gi1:ŭr{o ߵq v8Y-ꃇι`Xݭ>JFZKӷsrnpzHuSB-hočB79߄KwN8켾t ӿPH )^+4RSƫP9x_hB@~.J\^ u K'u*6FNZɬǠWK}dzxY_m^GBcxUZg%=G^m2K;}ဒ!Q}vWo;^| 'jeӜnϡQ6cUiT}4iR\'c[jPM}.W}@n2VL5זyfc!E[9pݙS|4bx!(~pڪL>N@|(H %Jx绗_P[Wq%&xH\SZ3TO&o?{ŠEu}#ǁmVxǛ-:#u z>q,om#mOqq9񕪷T`!~FƇzGl ]‰2h|Qh~+6k܋[ mǴ!F6WʔNiSĦх_D~ S;=,V7j=5/⤺b~]q=z'#pk{ͤ< ee=n7pzazb±o󬁟-DOkuu=j:- \v#_Z_ݍ O]"W֔Ū_Vc6kә~izO/^CGhاF"F۽x^fXzkUo4~]Odz*xoV͒ixgb |ePxA8x"TE?' 6H |?5|?[lAr|(аLN͚pڈ-I/mbh];쾇0eBo<| iWnʀNr+3' ~4n~vfG :)ޠ0J0,Z./uS1kKcMYǂ#ȉG|:/$܄eKC Z!4]uoZ*O)x'ewSˋ̃uS|D/Fϐܽ6?}͏)UGzb\ B@}N3L WĊfN[Aۜ?ٕ.'귭۝SgՅwBX/ciP<]OGsR3t";d2.kmqԨpK-$ \2&q~2&zmɬ:^EjmS RfDڦ6JEj9e4CS{XȡG~˿j+a_%IxgegE+l8S0xMqeޙzYpjGjrс(vki\39H GW?2N-47>/F7*|e1NZF> ݥ5x+fPʘd3f3gһiGE2A_Yam&IDY3)4{ԽSbv=v[vL2I$M7aZv&Tۈv\wy0G&hI^Zej"l!ww; .iuk^'pRaVwQ*e>_򶟘Ul3N3%0G0R.լ?̈́co|w7B+Oy*w04[ eH{VOG,Yjerj~|7qDO;LF8Qt=뾚LkϩaD F~~s"2@HBtwZ{)EM=3q)x}/X8wmܼ7g9{tع_qOA:LQm $k𴚠eq Sa%绷V*8RHѨǻd!F=I{o1Hς& \!b깝>j;(`AQ4|2`܅1͋.BFPۉK'^-?7a)*"\fM$UG56,Zua<^<  [>E_t=8Ua6#;bw;\)8 rEGXJ =w-\ު9C FdC$nt5FGܵ4'p>) ܶ;~/+' PyE :05]h01[)Eo inK`43SS5J=h0n=^uihFT?J}"E?@j&J, Áa^^Op69 J-H-7 l±P^{ "6Ѥ2/Si{. ޻{Va9gVlesXҜC4U)~FJ>vQ=Zۏ˜WpSB{_ݧ/ק (ZKYE#k}X=Jv6O&e~^]5yI/Ai7߽];QSj ^ (QUq$5\#j^ }5ǃ4t&[Is ֎o2,U_Kl >_~s7^]i7wJL@Oy%JWr9~KYx(ʃx~US{ƇXEy+v}Zքv$oU[p>*md[)tga:p?<2T#˖FԌ<]?OzV_ o4jptYdzbMcGUo FPǾ-6m5h YahCa#S4/7ׅ`/s8gJm^Yf1)}5k\۽}V;k>/m-Zcg0lz*يuKeJ*>xT0FN:h^_7_ /'>a/MVZSDH`d 8%`GY_ٹM@GX,pHXteg}³W%evE=0zvmʻ-HS4l0 wзԷ@$K@\M ̳wڬAb'rﻻs|ẛ{otCwÛp*j(Ft$?ߝA@LvyV6NV{f*äXhǣHWqv(>Flz+K-hK,/SגvZ@ztkn|V޻#5[xkE}˩}Һ!}. ^'{U 1 dzE|EA ѣ~IvFcUe]h| [!B!Dvsw"#p`qC2N6@VуC']U¬Pi"^ r'|>҅zsd89_ @qQD *Up;z:jٷ{3'251Y <͸Kߎ*վ٫2rE5aS TjFpZ0ϛUj&ELl:@!3x x2Cb2c=<^S6Yc<~5'+c-) ¤_h} {}wnY |VuxxY[~ U ams2ݝB(^# aT<{ ruJBl_M붵LYӅl8N&\HBa1q>;Ef 1tWIE>|F9veM_Fy@B>,EQ:~}+ avv;D'[NlOCd0 :r+%fHC+(cG 8?1HY0<=ӎM'?fYau _{ z:f5;"m6=;玿5&:ւ̡C4m{JmRavZiZT cL|ү[D/{?HF׀unX{;u$a !}p(m Ml#RͿT-g\Sw-႑N_Kk$}9w{msoS9nBøks 3G.YQJ]Aa]?[VfEZvY`_鐵=)4h]jz!X/X}1BSb&NV }%h80,@ /xzO'Ykx0Q -]}K|.yQ5${4-7~6JY *A\#/|W g>'.|i}sǍݝa1ojm+>j ͞a2=] ˥Tb!0l`me_4,F7`9f$o>G@9tCKIX<B"AopMtK"1}ɛHJ.e/S47)BO۱4hOMiJ(yGkĆi୎!V?'u4u#xCٵz9H B'P;>p4N6ۙ Q4(Xp^Gn؞W*Exh-YQ5 1g7z8baj%I7 ¡B>CHT mmN9.kQl%=KxU[<-@l=̦ 3%oحzSslWtztT]gSOtE1*>1Y]&8&>0<_ h6ZG3UBl\tN8en3KmoaC Hdy\?̃eVA)qld%x27U]Si}q?KF5cXW9 UPgݯ͹MO\EB5Qe+\ 0PMIC+]?/|VXF̽X_;S$M>uo_6ͫxÆ:ޕ9BKimSd2L[}B&WtY ܛ7E F6nR:'m/@qMmĵͼF.X[Jk~* jK;h):uX %ѕ|DmW.,fڗ/naw6g.?D !S>`<{Rh 47lBĄ'k9/fjgnR\\S; G_.B>dEIrwK SE؜0O˷?q=J0! h<ǯaNB6 wmba)T D;}7+&'siƚ@l˽Q%_i>J-XvA Z"h>҇xoRte4^A!b 2Ddj%ZrK669Rg04Ctn *x\ywiq30(qe3{0Ibme/cQ,Ie Mu˫$]Y沈|~ eX^] :*_gE?'&L# +a^!WuyEַ_fUYUΧp{X vy "E , }~hy-}/l rSeS_m{fnʹmQF;'IE?wQkҺB ?յ>Qp*iҘOBBhY%2)nX"& ˁ!kQ4nXJ)eupuQgտ >K_#j7kKhأUrgXUӍ;ԀLgQ2Y-4ltsP{tҤa ݊Upz)^q;SXkxw`EN/X?"+BfGCK~c>eubVDe1#B$XT,n nj QSOcMZ$l?ޛ 0:b%dʌIS g2SCNVe=xq6Je(vOPu>nҏLa_Ntih6'Pل:{6>ibU0}S%W,p- ?:󫋄Fk¬gil i#5f_ŰNբ Jec pJԧ5kmA?D8srwèTسwpĬ:Y->F!Bs}4 RRTCQ7m2t&Z%X vf`p*''\/J,bt!cw"Cf2~ >8[^64 y} ^G1-a`-V*@y> #5T4<0Y'>=k Rw­D{4S2`-@oKy.w2bq%%]̟~u7! DRΤ(+t\1֫$JT JޖNYin{VF!?<:nƅAZHtY)ֿ"Cx;X[ >fFg9xXwF(u# EYA8Ryw YWZEXv~ l^Joՠ){曫+vηtʾNuţr.!8i {ymҍ,88GC|0Pws5]0B; #r.l"]ɺkn%?Z X~DOwc\4 OcWׅVi"y鲌#wB)Pݽ"%WWfј|WзW%]~VS0.K3"ɵ3ݤ Fu< `?t+3_vf0яJR$>I@X\$#8$ 9l@Hy1ib)88^sY8p^ʻlfXL+ʏ8YVUeZ4wM]c*`%Pz'dhWvcL'[6$i`uOѷqdUd$Mg܉WttlJs*#;Hșp|)ȇPaahO?處)i^=LwָiP7f[ǁQrOKꬷ! JRu020(^߾r4j۬~سN zGͱ'0e@`w6Qnrpt=T#TjKU )oRᲜArd5hBՓ溮I+)+p3sdFr,˷pJfF,CJ6TϡRmW*E/?׵ hP}YJK,{Kv=n52²Q!YE={fl5˜nznTLh"TC[p5FGQ"U=̛nhYuԕ,TOka 簻JR:ﴝ5כUg3>#Z&;+8`e/`t:J/cNpU@%gEi?]ۉcmBG@ú^fvXe(t7 v1y5yZ[F,EO~/cҵ@(c_/#?pZmjo 8)UsI;Զ1,=Bz(@J0瓔?E';Ukc_n$w ^CڻO@fԆ38?_[~f9@nٹ;! (ۧ:t7_nDznWZ,p <#0E/tF8(Őf(xk+G$QJK k@dQCJO!p[DhW/鰻HǥܖR}j YFхB.BxmWєFawUgטIXjTr,EM]#*vstn%'j i!Nf'+ ApNM8tumf u sױ Ǭ0n?TcPwlr2-/[-Ԟ *25qkqܴ}w!:01%qB' ~OU-/feg+T9ٓBśXEXN{ ݲ vO NB_o8ZMX:XTgL-z|J:x\~Z kNwzej>#{U|cqGwΥ8IyE) _71"p+ߦ_'W;>1h/p玜z>q5wվ8 _3 }D[)7C3|o1rx0lb>[nNEUGz@c_o,lLdʰeQ3@aPFo}}x1QFƩpɻ`#Wt;ѹÒ5պ^s5E?ªҸQ_SY->FRx\"2E.IJezCK`yRگ4:u?NǸTUu%@X3w j&(y6~/3672Yz2DZN:T88ގ9NU_#;4Që7|oK+ b5e* {bss=%Brv }Sٵ9 cDڴ/ un BX]sF]yZ~tG[Л@uMhhd,\$<+M#=c8=FE ȿBT0P]g3n>o'FVJk8R~O2w KD8 1(zM_1l#pRq ا蜫,4CvuFF{+sVp-$U&!LѦ0H .E֍=O@hR¾ !Yv.IhzQx9jӣK0:>d+NWFJ 8r7Er=%{,Ρ!z7~ pXj,|7\֋L~1dE@5W+ j2*KV4$Rc;`%h _Ɇڟ#w.ɒ]2$& L/~ef!tE|lE[a p痛7{M'4ٔx !д?Rx /#QF AX A7b&@[b%v"JXP5xm"@jۍj#Wo`ks=U2҄%~C^ :XS0j4 3~BgE˫VroxЧf;r ')LM$U_l TH- ʼFzɁ;-ueҲSk}GVف?sYM O@hp*E(hddv~U-X]?Qu)> HPG+K$bX@ʾ6}7T:=:w2rq+!n|ƔYw fz*KBC-zn;XF̡h}L$ʓ== QDn?"ZMpPN5\9NG *tD 餴nC} e-z %Ώg5q中_FT2>0W_>E^:cn t-bnz \IT[8C⅞He#_-n}] *$CJ`y}ꐛGY&%)Lj|qJWG׭g4$EH0={ӉNhMUˏ^1N#"A<3H G/Ԯ^!\$5ﱓ",+3d>Hj&*mεiR#7QjbÜN'L'}V`g'lY{ t-acrV]B)B4xx}ј^1zj*ea@K:5#LK]BBY j'OcdA6V8B=Oy FҞ<Fw|]#mni+b@PN@:2T~ԎP9Gt&c><:@P{ש$5#6 Zb*VƈK"UE v߿850Vo̵mjZtra1ap@]z'Ƥ劖ɳO wcxіO*hFQɢ}f/ F//Op3$w2F!T= p֩"%!bg >DeX6ӿ"wJ #LrLdUE{3 JG'am $ʸڑ1Di8YEOU1RX zך,%H ]*"xeR25oBHY #(Rܢ$=xa}'`%y){=rPʬL'hD"D YSs9LkLE 1&*:{ vƌBie7Mp+s؊" HZU+vPq}ޱ~S @oeo2U!x09t^[t:0!@ ˥p ?5x0ۦՂ!1 ż% p25#YPXgqKQu{"4@"1sZp yCЁO0!1i>".^|}C.4TL2x="aF! B X֤/!?@xQo5@E5ykԐ0r !ecjL;֙1(6f} vJ3:5Z],=A Zc;ⴡ1UlCD\jF4/S{(ʥ-=H,0|)#TTs'E jWL1 4@x^BىV#"/5DR?6C0j(]/>U~of 36"uzgY E1̥dQ.l~f3(аTuE@EPd4?:2"1cgm2aGa F筽@JZSUU Z?qИ/ y}beH? D|X^ϣ| *eq7H\s~t m8jh<(Jsf S*Y9 J-04^f{GYb:<P@!@ɽWvR2P^"0_y_>8{OAh]wBtQC@۠D\~žHnea 2'!cSP9~@TK@~TX:*2N)N8FH2e$LBfEFH]o-+Re~R=>|dR?u^p#{<$ @G؈>5Wܡw@Vi+ɿ?;1"؀ǡѦ$n͠_H( o|6'"F:,b9jZ r1؊C xW1!D@I Q_k 8{0eDQ >,٤ k­o:H8 ̸J9GMMD^{$%t#AD`*PTXQb =kUU}o$~뀦![@(T^Vy1 !P7m]|5mL Y"`e5@uBhDz3˳ۄMpFXfŬӗxW?mc ڍ t´}W*7"ax"Dĭb&ofn:y b!!S9 'bjș8e4"F $jB`:crUWi>P^Iao2#FHM$!??G) v)r0'i(3c#\8VQgEǞ#ju5ZD`X}B~?< E4Q|6 &Z浡}t!DmT>͆QFq،q3zv%Dws G yDltc:D?D)eܐ:T&&B@Q$DשoxBߘז0hGXi7F40u`+k ju(r r-QC($!QD"yOcP48o8-Dgp5n;#@ J]X!Y6U)sf)sO*#A'`E] uxlM0"9Fwf&N:!ѮS$:( `aFã`:e6<(f&:Ue6gS]#SEܵ"AEH)mɩETqy&*ĩ~+ 4t;߳,{Nj:Y %xjMQ#ɆD%G^U} c8*"!*oM]FRtx+<%z$_];jcccH~_礯Wp>4)=gyz؀\VJt"z3]$!f he?]EO }$_ MA'(j 43˻EB4i_8B3MVI`,ktG5F3d!sp]*O"ųGrZhyno-0."ܺ4mh:qCFguaP0<_O<@}avI ܡDq94;B>/G2)0vB$F~U!QG!jD F:6'A|" 6@Gwz::3;[LHVΨ" }qFb^V*uZGBPQLt*Gd:L1I:drUF8cʔ̢dy`P fTإ9c  9̟y"gH̡!DPg?@‰vc@ ;a|E4 qlR`̤&ڿL<61[Rޠ_\aC<L0uADxPIP;MAz&ʎH79Y!M]$/(K ZK [}kPثP!?%H'`hjdIЬqؓZTGQ4S%)?r"1^ '(tfs\YǢ484D=x {|BzQ %#e]d( $(9С*z$)ȚlnB#p(JѼ"[i\Н%OڈJ :Z|ȃ;€)"#@^X5@ϐ 0H4[ +TD/vV#toH$'M!XO(@đ9f $I^,GCJ?T!TS ш.>?n-+b;rDG#vG9m¢㡂`Fvs.`Qy YV-ğwq&D8Rǽh\o\Fjz[#7@\/`$mҘ03oq$&/9"~ڢ:hV;d<'U y6Yp  ]QTszU#H+3x ۢ5UIvm!0#‴ f8KVP+C8/CG/Ę«9JW "3{HxUo6r'!ppVe?P۷A""30ֶ"gVF_8@"gGJTO6U+nGҍ z #!@oQFEt@s[F."$>6=  ǎbE$L5C~*%"؇c@z6(C怖Ooz);&HthV$1Hh# .;ʪY1|#țb8*b-9mXD2"ЯhYD!B4]S "Wf E 5TtKP}G#BB>pmḚXɗ^7;=f#ga8Dw^#8GiؑE#a(8rϪB2Us]1S"vdHxR$dlmҀT@wؘuGyV E!1fxQW@摐 U *vHڴy\D= HL#)T7H?բ5mɀ>ރ> D $P2ELLZ{4%d5õ<$.n(~ p14T SoqzѧsEPr/<@Ӣe{ k{d/Ov[W7FX%%B܇QbMх1"cPG U^.HÁLFV,θ!0!M\ #55H(%i1q"b5f8KlP7T4?7 Ȫb*ԮTdnqȉfy|ұ@А?b9q"Y/\w.J|Guɬ{\E[Sl`>9#ќkzDSY -aCL 3FE Z|M$oR5XԮ "$;Ex89 ʄ*YV@YݻRg.FdF*E)(?d@iak < ѽ a֠*rf2M]FC sKU/= i =M'q4EvR!#Ac 9uˠ|D_n sH';Fh\+`:h@SxDްKXK)ݓB] p2N r?TGY'&a"4jTi:T6rv'vU3oRw@r6h;?:>{>MiNW-7jOOڈߠ  >=6#{l2Fs2ܼ2]_Ƀ,"^wƢrK"+'k`EIxR 5&&i`& &"~W1tL[NWuNS'\K_Q^z@y'f,ϣpTi?x0oeUv, 8!=Y$xgo$c֒Hߣw?(uW )R lMvb2xB[ݢu:yߐI*J,8apЅCMFf :__ܱK&g2i6V:KaGTz~^B^G?yTy5;JirWQ 3"7Ƴux_#RZ{N6[_2=MXUd}",U9FƄlW 뚍/˾ZS6#ZG~aDv739l )t˕aˈL$ay`F6r-h],cpdEJO8[S׭`tT6۔Ee Ak`pI6'g±̜ahgS|)N4zJ@0GC@I?0lQk3FYhG_׼<(#?!܀(hC{8_;u@>})xgU'^ "Pr;XDy |C(-GQH1/ qȘ! 7d' I Ns_?+{gTTDX: _q"ZMfW)8#&@"$@X#" VCpUU("J9HBT"fHkH 2Bp?tMRt6(?@Qxo!'CD jHEo؊E@x߃08h1DIH*o Z.BUcDYH*楤6hsq&pHEjqT$LGj%G('ցؘ@nX0vջD^!9Aͱ34awϿRxҐk=hDTQ'H ,dF/j \T9HzDdP <퀋roD£#D"":H>&|huP#5{D+"G% E%j7uF*6?q1T}9s4)6msMhcm-!@B٤q|if.ˡئO 6 ?$$г C"E$L#IB!GʌTa2 ߠ9P U,B"6!@-FȑD`zFVքOр@RyLg4uQEyʫ?́阁U8E S<*JR*'DDMb.LeT('@tp ҩ"@W$eQ2@D EydEƞ(eZG* ax6GP!IfQDJĝ}-.h!'QwNq~rM8t2xɘb0 $N)Q.l)YlmtF5t#e0 hc0#>W{ѩXǔBX(/c֪!#@|Q_). A#ZDH $hVCݍqL@[)U* 'D*9Ɖ9 8(124KDr4 "U# ;tŅp~b(NL09ڣyF*k4DD+{?ˁԥ}"F8"|1݃}Р!kFցqiLy- St $,C쫸ƗZ.$ r'c0@ٸ@7gd%yC2hc,MV?cԜ#hH>[jQן6W=7D M Z&0sb'.y5 ΁ޭ^jѐ!Ա <"֨mTAT;@OX:GwSo*9j.0uhrjшjz=TW:_dtUu3SeK0vЄVdF&LE 1Lc:x\LݍdoY'Cހ"dvm|5J7`:@@E$gbH^3tD 1߻H_hi6gY7EwPi:Ȁ,H"f|L@Do;dž3pP#vU?HH,s :>8UDV;5Kč j#y:gk証#"hԢ).Jn"i_M?a@Q} ɧ(K=Y4j"qa'|q/&9 Jk5f.\Dj $U1ptW,ø[ * m J#{0Mv^w0X3]#@ qȿ@CJsd Fs,ay0_D\wx;'0L^ި! 2}D\zr6zuҖ1{FG-C< T $q9_/baDdڠ!huF,H3Lwj zy "oo)cѰ #h/u][1Q݄?&$*2@ E2@t&=Mŵ",F&Bp lB;tLC&`)P,ւn Ca@䪭RdrBr"&$]e\!PށͰ.dG:k8Ek5DjՄUt0X  { r3G32)H*NXu:O}&@o "{Vi&. 9Iw^(jb s?nLDO,]~'hR "Ys(@Q"*tQ!bV o>Aم}![DqlE sԽ]Liъܘg{^4G)恹)D;a+E\4eH*4@)4t;.ȭ_ M!GP#BiSk#"AMXBXv}]]T: d'D1W )=B* z~mz~\aRa Cc4C4r4Ve(mS2{jc P|.kab.OGNCҗ0Um5FCl.oeåMFv}Js n_i#"g<||҂ӛ;P]xYь*[4V; gzSyndP.W+L1IO;tϷ4, !g (d=hWf#8jnnkƳmB$8,b '4{8; LV@n1ml 8t@( /ꨌB8DA؜Zb\dQ`;hű9̠mQ @)pd{%<Ձ_B4D2^U*Ae1A-B|Rd@Aș V89C)8BƳWƭHP!tDe[@PR9 oՄϵp4B,-yZE wM^e`(L4FAA:b:6.C Bb-YC`+bn# 2`8Hd%E&$Nڡ&:Cpݘy= ĉG@Ylb}h"yD}|Bch410J /Hy6f ]#Ȯ2maB &|MIE93\аZX"%(wyMU5KFԈTܦQ!%_2hH0 s Þ> ݠ3zc1 !""6[ 1Z&d_0 Z1 7{;x6 pj;)“"h琉H؏:TPLS4D6CNP>SDl,H*#ZѸ2]Q3\1#EYZ0-r|clآ5XOQ#DGi}]ėiiDQUC!6BDG!jPz| Y! R$"Ɓ Z"O`0I덭sD  "@@:2Deoa …e &DI!5"D˫JcpǠ-"EfF`*f ڰKz*tf@ *Qt#SC WZ :8¯ ".(ѝiZ"hy!DM3埃QB.T<>f=c%hD&Hj"nH[ĭJ:;'U=*F:FoS8LሤՇkjj#\1cQ: H"҈)2&3gD&h@t9W#@Z_ADQE`e z8=[$h͑^/ej"w=k޴ 4"#kbE#C%`e֣:DE 4dtAFU`whGя[.&>+$$ "F&@XS@Ơ DJj%hې#*c:Db#8o*k Kx4s жF&բeȚҀ|ϑVNd6+gȈp" 7rp ^3U- ?K_X{19D@ء&T[vQDLx@ X34hj ~Vդ!U@+,Z겈o1 "z\ S@ :š8"h"m2ȑD*嬂 S)#FrXD(? |?+*H+Dא#Zޡ@Ab*a}P#=&aun9 bw 3pTN1FVbYcGAB)XOL׭mA"&E"l ?@#Ӻ0#F҉]}(?h r:@Zd?@N"y9< b2DkYhr҈D01_.K+0# `;`E!# B$GdMDk'.Z\tI GQ#EB"Ֆ>M<'k{ݱnd!Y@نb jYEQ#h4(UG=Th,eZGve4 Z[G7!d՟QXT?[!C2r;m).Ȟz5EJ@i6ʜթBA('0TA#DՕB@TXX@FT\ťَa@ނ Dhj-9@VQ"A LDZ5}"Vbvڮb$(COIyH@\Z Ew}<+H U(geZv'D !s`M@L ,l<Dz #+iytĉr#jdHMo7֠kn`%Kԍ@IQƮG%\zS ƒ@sQ"@ '$;${ ps<#wmkpޠ|\[ b'H @!_:4!QtG `"M'TtFe5R XfeWUC*1N z$ً8F4l Vi(j90taB޳@*]UFౚL@<@"Qz"賈ˠiXGۘ8&ح b=P}\$e|[?|m-NY"DkDwE0gIs*E % TӄLmJ=r7=J~+@GNeWjth3T_턑(v&Xԩq=oPrqPqėͮyeC>c]|9Od6 Tb>.7|+WmYB4O<^m䡏 CљwbEI?5!+7%;M2q9<2٣G+WÒZtn:_u泍r٭̱ #6/ 班m =UoɻAvQA{{jkymnˢz@ywȇ01$@yRH^Q`'h4tնd2=yǑ" Op0D605!wVf%蝚' ('b1(@"#D wO$@=O7+D $G!@:#ojDet06VYo`XEى*hB8TD EbDCx >@2pobȃt>y-jƄ!Q1t-j- XI`MsR i*~&܀/1T;F 0ؠ .WF<þÌG!`324!Pő#(@pG!#oP\ m&D "#1DABLdP؇D$M@?|G, 7DST_@D78(I4HJb2Bf#Y0"$Gb wv"U $ b' ,2$`?O.ςu s@cQگ"iO @:D#;;D ʆ]@(M-Z<3@|jh+cP|^>h B54Ay@Ri[ehEUKî~r F"z|AEP1Hєy7gDp*rDhXNRdI d,N]_0$k`>pXX@CpEۢGu4e6i]pP4TD7H &g)zQGz_GRS5 R5LIȓ#E{:$H E-R "lH(5Ja˰!oD@ԉ QF2k Z:Jshc 6D*HH݄4]tO`$8"]cDt`xفʪ2 #jDEcF) * ]QTM FSO!<]FD:vPYzDD[DbQ!4D'0@94}(@u d mr%dq@VQG 2 `P!B=buHzO_1TFQbg;\-$"qXyiC@Du֔G6HGki9 kS4LR]#Ή7QM>躰\DŎ@RQW-8m2 gD R0;WFuX1iE ̈́C E.>uGNwmsD!G?`+2"\α8hmPt]Y0XB֦ i|sB K"Mi#@"J؎ 9ZP̉ lȝ"#(D*c$@p9!&`x2TDD ;ʤ& @j44QH'p*,Hnڀ혃ذ#Lf7+ߢ! ۗwav@BzCHߝGhVMB$^L1HYm.Z(iV8xU b솹i A#j3o)}W ňKȀ5.J=MC@0D:\Hm@ j,˱͎ ht)-RTOXDe4G6h#(*x6CT;5H"vm_ ?| Z9GC3"a 1Yc|GX$@Ġ#@΋uT>ʉ[rd`p-Q@j5T"(A@ @Tkw`Q`+[-$`Ne"&6.(DdH")j^eֽ$ЬOFԅ%fhBYHƠO$P( 6 1$A:L71C't#@HQ\vQ"菋".(@J#t~(|pNMs qpjH,іJv,GUS@RB&_3?^Ph{BYxHw ܏mwЛ#DUEL@Y+KI"zPHPȡyD 4@f;e `/ + 12tdRv#H *Lk nQISnØ2.Q@~ʋ0 ^-94ƺ!=@F,3Qcl/c5lvLIx'w2s)ʮDŽj(i#iD4o{G?%2MKj_I~Ӧ>I͋ŽNTDEMJ:4h j>Ӏ|(.yj&Fah@ T#(";D>!@8 "={ :f+jZu]Cub"A> `&:I 1y311]@Ԡ @f| @$NðѠ@ 6Ch_@'ܨjQb }*Vye,lHS-m Gqb!3 BC @y׹A_Q7AIH@_@'!‹D(1`0 RѝR&;(}x"eQu,lR#(>$\\lM|BNI PPʣn!EG-ƈã; =0 Mbީ1Dnh G ,>|N=@H$ GaZo'DQ7Jb.@XZ}@9#Dakͱ3;(İO+ؼ-([P"V&h"MBv bdukR\6͡*Fp5\#p"جIQ6,FDqH& %"EZIp90@ |:h' z'ʁ,(F}ȏT עMq'&8IȑŪ@O Ai#/aoD 5^ !MoDs1ARXP=Oph~5D 5z PY@ðC7mq$yHȓvDF쉄˰4D)V5\8@DP$H't4TqX:2 [aD F3](+t"`Hڤ! xa|_,D %h  bHL@` 1 -D12Ta[rG#@\Z-0!L1đ!jUDt Pq Ʌ` ս5K@ y]ctX؍t刉7hDjOЫ~$΢7TuGUW.9ːh #U@ѯ.nx rN@~T ~@_5X"H#K@b"$_PMNXf/" fL7}Q;Ɛ ;0lD  :˕8DH׀zcQ#L@bF0E8%)]HYMMЖ ;*  ]Qǡ҄""ѽڐ@<( z:Db"D戎 4Ds@v F0D!Q")H H@@Q@JDrL@]# yG6"@ uFĶ J@Ү=TN7wnE-ZDSn@Y"2#NIXDKQ5U*MFGu| F=mh D6\6ìnݲHk{f+]CC!@^Vt7A(k  ^ 2aFh?hG;uݷVdPd@ QVm 3~c@2_etDD$cF6Zwp >B!@ oXduD9 #8}J5b!E"@iW$.tQ#*(7$ @sL A:ZP Vp\4D*./9"gZ=D[la@ 4MM@@F"e - z\164 /",8=(=B@=DEtG#D0'}lo8 7gQSكm66ZD@iVPꀉ"}J*-C"qrQ6?*42͘bd ^2QuQi'qDKHrtP =H^4~&$lwO eaS 繱 EONP"```85T\PbC"wJ'm,yeFH$h;BnyS CƠ~l׭N_D}ѐ<QB.H:?}%X'6 #ʄ?0Dǐͩ瘈TF5K6e;$ J!z@Z[CƩC#D8ܻ\%K"51'IgiO&,HJv}?!3th]J|6 }\Dn VbY&LJ kW?9YlRt /OhPsDIeWM_r? X+?8 [_{7e@!ذBO~>mb7>3Z2/mxyE5.mqgkW;sEnd`fNP{K(\y˰O-00|ӛ'&${pNF~rե8C+!-rx= :N<+8q+;Tvs_ʤ6]r0H&KUiIWɨ3LƼ-7,5 IF`S76933Ypt(&/w{?gD-MڍmN|a0vLPdN wm=C̈+h"O=yߋ@gwQG $:^dB<>D/˸cLsa@ÖKBU؂uuK?Y;DR=Lj HP"lF/*;I nȌZDEF݈#@dY,h2:5V\G)i@}\U3C=XvN5|. b8Gr+TS.LTPԴn(@@ҀX@Ϣ u u>T@yAD@NQ*%c-U];d |u1`%Rlן߳ʱL LH$@"->&Wՠ@PdzR@%QVX#lA[Ǩ0OuW@PzN}J`m"wb96Hݠ R<Ġ;OWJh^"/Wl⢢77!Jzd[KX2@ZxhrDp!=TcK}rx0"O"rGĞ1z{0GΛz_'h''`'͑[Y \PɪJ# EM?Փ<"4k#;舯h#XʣTDwHr ސFe, (ߨa"qF {$XnYiȣy@`0Hɖr_ p.DkHH #`&Эu.@U]xWsQ$*k {WquE_4H̡~LjaDq&I!B@ET 4ɩTw7xwD `'HCN7b VsxW5jqۉ" aDr}"jeL3N5JkTQʒ0$H$ fȐGQG!B "csYPDB*0̏E4EB$v\D!DzvMBN2o0'I0#t0ٸ) bJ@; x IQt, *&tţ5; djWH#1@{g^ FA#@#N?j'X@t3 B$-"69 Y[tbʰѨ+$4H%`FѢ&0phTP}4AׄM!#1=Dj>@2е-F(d * 4FyDa{015ZehT{+Hbh_d(ĕ  gǡDV,Lmzw@:F`{ӈ3DP q@y#=AR^DD "DM?z$vy՞^G>CbOO&ƐDMr"Ub)n=+@B>9cS_4HUݰ1EG$:U@Z#Ȉ9$A "Ρ0E\ "%@^R}w*Fƀ࢈@P,&uB$^ȑ"vS&p@aZ;{kR".D~T?B.$P~VzshP $(J@f'Qb8U@MFR~U#; %DU= J$t:,jJDU48(rn}n 0Q2yKP=k^ƘDK}a '0iDD m(:;ˈTu@Gݭj ^]PcD?05t$ 'HNo(D}ڡ:nkZQ+$hr 'Ty5DOqkǠ\\**"N} {$ Y;֎UCI@T!"!j"@!@DL@* $ t$AC9DDQHNЌF8 4bֈ[}hDIН E"sD7t5F &ވ!GH؉J|=77_ Z G7+H y8ӢOn{f`!"m4Ġ#)6A^Ģ=h4B1&Ra_kΡw *GU 96TC4jk5Bj LKj@ZmB>/hڠ#V@ jr$")9e@H&"`>^x0D)*"EbcPXNHɥ1G]fOvckPhK/Jhf_.(2ls?M+}\388DREY_>$@FmJ *:"h_bth tж"shFFq UE%!@_' `'hx>DUB j:R!@ZPd@⛾hWWB-]c~@@02 *P 3d WĜ:t@* #>WG SfV$ op#0Dz:4k6z-3dH:̢ TV(@"D$w :\F.q.\4hː:D!ױ"0-r6!kʰ uȀ-M9\4 JF:T M$Fˏub=LmM:iDMc <DgPu<ׁĉ*#"^KWTfh?1&J"Eۧ1恌)߭!yC7 +f U.z :2"N + [FbCbNMcs@[I$MPIʨ QЯ=F#bFa@tDkp3?B-s\^"%.hee䍚Ұ?E(>(M E\z.ItlFel>TvM!WC67{0 \ЩX `B6Emy@>ZZ0S,H<9|- HX@`Ãa!f"H҈5$o['vdxV?&ֽhF|U :që6cDUzB D$ g~<@ l NP)6&(^tF84Lasb@ N1HYHp0a_ؕQJ!@O|*#H$@Rs/6֘*ƾ(+ʑ4$/P0N&/^#D@Hѡ"R"HP@^*M9|hB 6 WC :VT#_):T(@P7t#t\[Fv ViX : bhW@쐗gbeFi*aB ~Ri"!@ez͆p Q?)Ɩ.E}&Ny*eƘ:w+d3O OfEG;C瑳 4@4&Q){K&45_+t^,uD;@n: ۻ(!ą|u5LcFeU2)2y1-88|?3,}\Y_qdiFJAz#d"f _tlB,̫Isk>러seԱ.vjVc?|/l(tـB8)|[molՇ1ө~V%F۪p{3D<&pSTyyD~ٺP ?+4M}yA'Gq0FQv>ʽ&'#P@_ᴮ!@ f,Ęα";(XPDM&?F4q!bM2Dbl1TD!P"܈4fȌj B,(J. "؞n@ 2e3@H*,DF?>: P8 A%~>A//U|35gw H.*$zѪ-V">I @gk|D$+Kzȉ2?cDaS5Hc@>D!' , yU l"x*=J%4iDcQ݆:1%k0j~ "t\#u pF@9&hBuF+i~:xq4eV1 q&(1!Ӝ :Velℵ B$p"/^q FC!(a3D #yauXF01ʎ^\ Wêܑ@#F^ G |03KdQv.>@N4DBk`mhv Z ڒD<*hNFRE+G#4H =Hh mD =5 kАi@ȐD)lV@V9g›Z2iHnlOeG5@ di%@x!}eD ܃ޢDrl%怣. GyZQxI QooFv-wxЫ58Eȋ2\EA ď7YFMF} `sr"05^v 2 V;VX^zDdLqF,:"l!Ddq*sשsNPpQ2zb ] [XKQBtRUv|hH>Om`M3s!H2"Q@wQ$?4,|H .4(r4##0)8UcCGZrQ@`Dr!,_Ȯcdh"ҷ ">O:RQ"MAe[橚#B{5 ,Ԙ7ta@#^5Kp"D$$t@W0":RP3A jo`*q E i7f"sQ^'DC.]b2v:(FXdNӤި.N}̐lB f( D-Fy3)" 5D{Ienn2#`(MPs}XZހFҍ@/-Hjj=#V K|!V &.lBHXԇp5hl]NDLPۡQT EU<˖ְb8҂D{~A\^`||@H%@LA}"F$( zO r nO;H2"gbP֊ =F'@bt qbL%֦$Jt54 :HLzwB 2"`e!b"|"܈tC0D P<@g@@3H$:4#GhZN YxҍX4qs@mnQ uH@"ĉ z;<@!@w*j"Rʀ$(6'ht& }a1@kNV`8,5_ zP+ڤD R@rtW0waYʐ:d'DPP| :#h:$cIs: G.7d O?wB,Om:2#""8b)(a[pj6q(]i"b" +-`ok"f 'ցrR(Bj( ."ΰt(hNDߑ Pօ04EDD"LCƼ2&@RPt e2h_B:wkvsW^H EP5 Zձ :h`-*4(Dm(k#d# 8s:Ɛڀ1$Nu4hev !Fs@PM D'Fj55ќ(T0P:j3*+_ขo p3U1@Q nÔtN6 ."~B@Q MMBc[ʎ%w>؛b'*(7o|"OcW6Ѕ *& eF|ؐ)S @=B(GD 3hW4.kDADB7$I9j ݫ?sp@Q{R؈Z#۠MQ1T+(j@D t."FȰ:~ :{Ѐ(" b n:7#TAG' biﮋ-?&Rhʳ/z$g3%_@FdM׵1(d"ưV$+Ӧ@QeiG̾ಯ02lAi>",&""_`{( J Z$cȏ&Z NHCB@ :$њ+ @$^n+M/@ꩣODU"Jm@Wz:n$D Ɲ+j9tG]=PKЫVMlZ l(@KTM&HV YkšTL&(,e/,D{#\G0H ^2"9(|Q$hF*ϡt0u#\LDMK? E9sڗ );<' C8ڗ/Qr[}躡⨌ P(aQ$u[Y%}KZ0b`h=RͰ yVnJ3dM=}'o8ݭ(@tS39` ҋM,.I"!}^8D0#ZB*(Կ M>x6K]`^ԓsp3hxYJrOL(t [Db_ߌB5X(j,n2J{6~)dCD8Tq([biLN 3ը<7BLbsg:b%VE954tֈq \ylݙuB)ifu޽}2enJ7E|x9'ڳ@{x@#7D: "dn+܈ (%6>#Y+6#@PYr.Deۗ6{4zd|˯(n&FH/hDeD6f(QQ 9H  1yWhP#G9`G`%̐"b"#p,Ĝ'd#lGPy "mG bDJw=D8{@2#҈E' Ȉd8f GJ iqjC#7q~?( ?T((&J>d5["JP34H$KѿwyMC`["FV) Ji^-GaTQ)FHrEoԭ,H0 @!DQp %g]ST,uىDmgmD#GCI`桅DAJ[hA@cM/@zDW#Tvω7{lWQ(tH"5ȑF-H$kSe1q( a$"KI^'B (WESVD*vJǢ %~:N!G42X uܡg@Dء@ֽ=,uA  縀/KB*o e]@i@4F&W0P~-^$MN@GUKJ`@'Z"L`mұDj%?Che˫a V_KOsOЫ@QŘ 0Br pNK5t:U44=hCSQ͘ YjFq:tVZ'/`9hƠxJe(P"VmD~54NW@#@g hsU!s-z8M*۞8R'ԆrkPZSHѵRV2?[}q@HP"H/(C߬cDAUj,3|uKkx 5GCGu]Q{ƅ~DfT 2:@e9HKP3n8HpD't"n&Dr5{&0IYC}xc1D4Y/J!B. PE$WT GiFoull~^ЂTTm,M4_?:x@#XCmH"QQK=@_WD#*"F84P@%!e@uQFr1 b#+23~C*wVN9]T%t8\*qG 1#oBb!D2/D6yL`.v" e(#@̕8ԺhQBYPF_#1^QB"0JY$Kw"]z>FCkj:XVQlGQ[ŬM&(ryz 3qe4=:DM&*VV:EqЪXG+8LPtHt}D~.jDž3#ufƀJFA׸丬7 *1`DeLQeFȭ k >Êl **SȊ#1plflFR*E1]ý+B@!P BG~8#Doԡ^d-$ G,cZ`0Y\9H @YѠ Pvt̓f GВ!#4]%rH &KWx^Z1$)'#DB,hFQ+qa9sJvؔ `$KJ`Eg:n$#J$h|&|9#HmZ@?0B&*$n#_4荚5)Luc=Q: yy&Ыl U"N 7I-ݹt<@(BpLyӚK6(D+%%@{^HQ- ۤ|j"%(琁WpglM0C21h%hC"lH`opH"2"HƔ*ʵ$LMi#J2HR"Db24 R@R$;HDa"UˣVT2>aX~R|Hh,"Oa8K2{ +Ĉݢc"hvQ/(C"YZ#HZXFP9Fv(cDN}LFZ3΋و#H J&*E t[i1/wy yt,!@m4hlrЕsQ9(ZPˈ+®9=e@E#D@A!pQL by ©q?Rڸ@ڞNu '!OU2v"L*Dj2BX%"3S@0* subO=[xFHPh1Zd"=U q#!FD2l#̅,#4Utբl(1OS|'<&2‚B½6ge4@5JQX^WnP4d{PZƠ"-- f8[8n7 1@ ?NPH" ȌDajzȈ @"D":B5q{ͫ@:/L@cUHf)Sª'ѥ G"< Y΍^p#@aFԌ:><\e".XXˆ@b+*6>WiuobbM=fZ_q4D~QX-iP+\"FCEoa!Go݀#@@wrjh"$36W~ @"(f\҇"= Q%%HBunj"*\[+W.RiU.4Sgݼ]'@XFB")D͉qu<3OL C?2H?Q4dh*0$!M4 QMl8(:Zo]e*kF $[xx 3I3$jȄ}BL>%O-Sѱ,E5F@?Cl@ jDE2#cCm4p#6'pաC0#*#@eL`j@q64 m2@LvQMGXѐ@`w%XE_U(hԷ9ADAq"mh D" R`l oۑFX2[bi@_EyZ$7TKJko=SG= "s⑌ 0gP"H sLti=9@wՂcsC_~B@S5o@֖&_3p.Ce&3胭ŚBU #6ލ4NЎMfDtϤ(*dyƱ %l,kB>(hЋNQhLu/m[TZ&WrPTO ,<m$VETVY?jA:6$xِbqm yl:K8U *hOT"'z8 #`$ -]6bhB:TDxeQF!]P&H45)GסmTh8m˰BP<2&n>ZpE2[e#_Df[ /"?Gqk ;8(ex|3B|:^v" '_I jLa 4ElURkv!v?ꦠ9(BSXđX:DǴ]graB. V_pEz<7mCQЍ܀=is'1K ,ΎXfv#5` Qt@؁R Є@G $ַ!AYzo`NYb`,(1DP^BzDB yU$zGDQk&P"%WiJZI Z^GRQE4qRikDL CBora;i7k‡Q$i{(WO24i(̤tCy/KF *ŰCTEZWOx58H_?JCa3Bsv"@^1#Xn@Q<8˚eDãԱ0 ڏ? ;2 hFWikڕZ{2b*;Oc( W}i `3͗Bk0 C/AכSD@k= 5HkQ#jm$y3@Od@Ni7Մf h>%@Z(p;}pGVţǻֶ[gSUHDW gc0<` 2"g`w J d )ܪ@ ZTZ/bm a)@poF5J<|LYB")ЫH]gM;FqH>-Ƀ:TN |U<i?b硦B1t"dl23GD OY  4i4DTqњa֞7wi%71Ft 9bfp%DfD5>2Dkd>YEbzH#d&9RYoшB܌iY$D[FƊ) ٩2=c8(= 4l~1""{kȠ5]4HGxK0G7H:W!2I5bQ >|#>2 4JЇDk |N4epLDZI!C[`lB}RTy(Ol DyACL(P:sHmZ4FP:7}Ql_5 Z&/`.5G6 lNE \L> ؘ{&)=Њb#WPWkK^n %D*,ENх\fAȼ؊;1%et#1-\q)̐xcOC`It[qXKxVV|.WSsW* mV?m.T3=(d|~8ҥMu'$Ey$4~m񆲿VF1r$D|M+Rk4jR,D{%,{^#B%Aa(_tXqvh PkF/ꍙ&ƎE5cO#:Ȁ#FN@4W Ҡ#qF6! v ֵ4G"]w24 *czP8' $l3'b"&} biuohέɵS7bWN_B6Q%(Tů\8l2[!*4՚[t#Hwgs 6էʅ`t(!`@ R9:^ް]PYO{=6 Q$@ Ft ~[Yg9i¿DO؎e &p`!ЉKLA!YB\Tdm !}@XTL@Z3r{SQk(4< WF)T}z+* ьݢa"j(J^'z "9X'H+aP񥨑xXt "KLv_ $Ѓ@G(MrD "hHRT1#2@ &ԅO;n@P"*:Jxz"  Fhjg^@ՠ-w#0&SpEEj*E*;3׮9T̠L@gF: @ z$jQ7yS"JeRtdhDgQ"1cR7{N@ 0z(PQ1d@^U م!jpR JFT;m!Z$.K? 61eYEF-!`yh39rDiP"Y:҅=1߆g410 }0(˘Ǝ_Gx%B\F62 #ßa+DmSy&4QdQ"3:#@aA~ Bϸ倿e@!SFZ%!feOUMJ,gE`3q@^wM#9\;̀" tN#@xIL%B`=f U>QT-:>*Imx11꛱WmDЋ">ioEc'2᭼05:[Fd*#t2 R5|&lFqz^Bhg@0'xI}ES4\E%oUS}\d[UH]#hKrnDQtv2Czؘ[d^dRE j59Ĉ OWo0Q*U*1Ʀ<M< zc.#_@k-Dd-D?0+71KޠʡƓjJ46$':X?t,J cD$.!! dO flOֹ/BU`%9{zQRNPyh3@FiA0s=aDQ#(_1!N~5PZ40% Ũt}(wv%~q$ݫixdQshk3?C,)̣@SfIfl*ADP-LBz"iM>{+ida#1Uب_|uP.ҺHPT*-PYoEt ZDS9t7j<Ƀ%f!F@#{FZki-"/=,&5(bQ*L{zU0z3Ā}Jl7Tzb;"n-mϑچdI,п")2;(Gh/ytn*6a@ j<\Vڡ wgU]OD}1+Mؑ$ƨ8FNZ),`y*t+uh$E6f#D;4i54Tor-pBҨzo~?}U{BOrv mh @m 4>|[tO#V CB&G5x YU@Q2Hpv)}Fꀰ'zYFbkӊaB#o/mrV9%G%5¸@!TfC*>ej]-]Sjħ.R5C^f#cAbdhQfXpl5[-YkW⡚m"'f'Re%~`#Hi;M#˛Ddco@r .Ovπ<"jT_$O/LH!U[bLf!HBP Q8#Tf&ކa# ,-w@jWuvM#ZE_щC*`&K\!Ķy)o#[uQ rG14$F 1낔?*)&lzdD+B`f҉" R$HL'[J];K(%Vt,rg;1lCi5\e5ɜ9G%~FSD7tY썵@QD`8b#DHe 2DJQU!B4ћÞ:IU=oH rd C˘DEQ ul1GLfeoؖix,P)/ێL~Ytdy\m^mƍ`bq\Ue4/~1MU'%u9D&'tW֕_nhzjg.IV/׭t`7 ٫+rEP?+P|Yer`)40vQ3~fd֌ʜ"a00f[WjE$H2b}a+.H~uCxb!uBA㳈9 q^dH5F]w#ó ET`>:$OAswX 4ŧ<$r_3NѰ7Y~ME[q3O_>opZD u ٙ<=WޡGMnR9kB&i50KF&eD"=H8W$[Fu5 t!4\gM{x3˂]xm._ urYzY @SU u^[S@m" z8(Pݠ|S \N cH DWIfPL,>ƙDC1"h#ܠB.d=x7mG" 2iK>׾Mߥx9Cr d-hw7x?XPhrD5 5~'" Iq@"D4E t6A6h%{(D]Q#F9hU4˦\U b'xVn|׆bǰgHQ1zUVmm7DXDКXL}mK $>ȁ' "9]nɼ"F?QiF?^#sc\ȏ3vPGXWDypbh$B,^P! Vf ,ls61$Ab,K(RDKvLr1@e0?tHL6( PC~M8KF  %@m:@n B!C9ga/ְ75Ȱ2 狏24L 3^v$@:+_W"Rf#b{1+SySJחlʣYӱ49B3Bi/_-ۆ ,-`Pj]yx=i7D&IVq9DY?8ѭP m K:mDG( F r4MF3 ۘgP]3@ bgkV9 %˥0nKp!N/9?"6h})wP! 0#Fe13)v=x6{B'Ka]iȋ T-α8hFʆm69ik3$ב^R}S QFm{WA op1(]4#HW{L|v" **vD!KDޖXNPF;է *[$?URTEs ei.G1} f{8G b3$,摈B0U@ GѼR5)Mme7@j<e@h{< Co2X7[RF}G5 k^Q `EǾv;J_4`o iX[gQpʘU%x{N0RUG" L r^u$p;I3)(Jưuu7Zlm¥`E" q]ЎNKٜC;!`>b(kTTDe,Z3uRͫ,iȓE?R }+@jM)"%)cB_$#k"a|B$f@333h_=c?‖Ҿ7 ِlR0ia nцeA 4J 6Jʀ/}ꛆ M*O jȡ@ =$5|3f5tk#U^=#}sen!B؀!!CDLCtl:1:SCD($!޷+k7G}R>cZ3V z~8zYV ZXIsh r"H( #| ^  t %?_4DIj*vB 0Y#<ʯ@lQ*҃CAc*145W K`!flQ:tO`{cBℍG(u(Ds#//cQ*" !E:;A#]BE@mtMGH3Pi e ,9:SV2D_UauS hu]GhtZ<@DZ.%wӸ_ @}-.:FR!DB <(Ffd<ήوbƯPȎBDI;&l(2")kyk:%M!^4,5VR( 8:s 'F=NqPd:lPP#!_nQ! ȳkL `2L$cP"9X]xpQu[0t|td q9T!( 4;2B[~aGA`c `]'.2EX5fsЎXvM9&c 7:q{#0"dV6(%6R R Y< @"4NQzA,Z ,ڏ1uql mN\ؙ"|Hȱz.N QDGDQ( ]w@׾ ᝐqD `XPz"f5=Ƥ"-X$q7ڴ,Xsw@X$IT5Bn5k|~#Ddn{'h9i7*VxPN[0tD\ lޙ>_x0(~g݊%C>X ?tÿ.Zj^РBb[as@S ЫoN|%@.3,!ϰ:Fzٻ6,:'V%a@8m^PFt{UkpYئ:30M0UfZkR5 e ⍝-W9/ ,st,@1GGzKG>=or/mg0`6}fBnq^#q,G@^Zm,kT9ǜ<qK SmtjKVw:?k0xЯx;tk}<nFU*OdFx΢S8LK% ڿU}w0Ua*.55a^9ߟ)xb7eWSD]P(|P^G=gZ{|" tx&5߯s1 Ul1+W%eE+,w$19)x9v#}ɴbZ 4G!f;,O(NxÕ3AgmD|/k V ~3\pz_WNE-j$m>r7=muCOEn+aU OZꔸBɔZdh&aƻ8b<>' ec@J9Lk#'aD~P =D]@B.m7 t>(GcFҺF*R7xs :;9wux8СChT#D 9?}^|K =\%G$=' d^Vڧ{jx= *!t@C݋[c-yID1E焞4 59 ݼ! &̜kԐ'`JTl<Ƨл̄(XV!CM"a70,Gk UшUT;f}aBK7bpNVk?\.QV?x."%tӁJXٰ 等#+M79!$SL94]"hMU=`;", 5s n?q.~00#T@ ҟzBqֳ8"uvmuDx7 +@Z=k(qR%_w4gqe\2=2dn>T\šu*Sޛ #R+"&/C!BT!St Nm꡴Lrn#( r鈅ݸ jd*œ#CQ?+< 7?~f Z4]џ $(H> ;`*m]NTg~Ш ]QF]2յX-PE`1|Ѝ)쉇V2d*0L63c@QMd#G \U2E7< -2סa4E7P*/h& p(I8o2y6|ʚku]F L4h̍j4%W pG4Bburf4 !P|[DxmqzO\dA9ИiwXUX@R_Gz_X҉r [BT(zoE L}%^[ξjH |Pȡk^Y05nEQ'ܱ$3P53/eDAHX k4|X ҹ!G1\ש\y7SjWxb.C ½;Hb;T"8II7PjzF4vr[?pj2.|+B8+YT^S$)2 Zyxa){ltK1KhF*ns^;kQBȏnB^NgV9 ] ơVl6[ D!-Bc籙X6g~b埉O1Ō^oW_0t9Ih@ԕ#hzt{t'q񘎅_E_7T #RD^TAx&og@/L-SB#:Ob&êrXQ8twUP™QH 3T~Z/d"- gzn@+ pWn4 (DR #C`XIamǔ 8BR!җuRD7!ԼD4qJ$SjeVk/)g"c0d'_PWtT!WT)Dc"BF#KT.y ֏u?.qcS) 4, @w_t-1>CgbnW&[T*  Hכ|HTa];_VT 52c_(u][hU5!BΤj !x :ϳ1: ;HP_/] !SRUU^$}IztlڴG~Ï_&(\Wݪ4n)7N'Q! (CD1w讶GZ)"1x:l5@[}ECkZa@\t(0,CUnyqkn`:Jic{ HBJ;#$kefZkOBvzY=#*C9h$+3cWߴn* ި # BN4 ($sJ;m0,r&AD{1F_CGT Ǻ~pnqMeЫU9@kwd#LETªTۘBp,a2~Qr!G"%q|^;Ѿ?F9(@P*/Hot]У 8mdDo_q!G߬D' /ҩ {V%(P LТ J*]Kb&KR!BЅ!KQUnIBUWu+,$NFxǘ_99lƏ+x 7|9yڣŰ3'0hJNz(r Ǒ_sLodpxN;ә}Ǿ0!R17uH r)CpX0,;rmC$9 eNkIDK--@m} /Gk&oiNq3{ ́$IV60p(B@kR sVS;TWl}M\Tׄfag5jשz6Ad6!&;9=rbD J"Չ`;__OkT}ɞuqGe;?V4l jFRu=|n8jܥ j:+#һargE?j-ߠ1h#h@H""whl7]M E 5NW$~*3u6T=V_N!`!˜00w]@, $r˥vFԩ$XK.<2 n,7} Jp(G&R?R`Fɾtq C 灀#C…倬NU4_"b!NPj"!`@ -*DeXa"t# (_61bE닷@D, 7EE'?܄R¥Bd3 m8B9Q,ZbctJ 2~H ux&$ cKbq1`yK?D.ؽLZDe|G w=N^UFGQ<_u%|1EzX;_E,8f2 L<4aQuX_IKv3_m`@yZCʮ<8`?M*EulKx Rţl,hgYkw>&wG؏1tʇ٤6dލb;H 꼥 !mE+XeoAҤ"1 A_O-` %t}]Sk..Dƒ~4>ۈATYP)=#voXcRFY80F""H`uB֭JPȣ pu7bΡwF$8q&HhV0=D: sBHakUF?ި|꘰q˷; \,U+ζ^>Ԕ|Y7f`/R~k۠5OՆ2ˆք "u4MhJs38ŐAXdz8mgFq4Hu(`35C@Y#|xL6}WC+*!B؀ 9#]DbD:hXEŤjUf RKeIHp2UiUt8f ݪ+S\wjFK+q@sזui V(4YJ8NFЏlz<PN9xga(4~~&-`}bWy}f2%ՙLl=GjIJHM|,4&˗ Ҥ8^;3xȐ5Z'b6W;#k98j=E硖1*"![OX$bqHm  #w0̷.uʃnG^]:yTfc[o .v==p#CTΓ5S|7pƈ "WH4>GMzZ[ȊNou خvRX1Ù=a9BtPrx\uZ.8U!#1Uoү!S귱3rvNщ4CČxWKLUxYG<'j膞h:8 "#RdyKj&'KiӘɰ qxwaZ/(i7|E BN򗇉 7z6Vd׾?!WO'|𥡨6VɼLqL \;E3|mk梪̯fd"1TH:ԓr<527aFOx^8JϚ`(1 (pmB:hZt7 BqJ J@Jrol@C2gϪaGD7XgGA)P[ص8j׉ P3]lNt3'\-8BT3S.1vuPG#B J@iuNsd+mP%Zn/2GgдءUXg 5EB׊c_]h;nO&d=}]\+0[$u 7 ڰ>虺>wS+XDH"2;R"?/{-$"&[|Cw@`#v7E/= 7!1:lNxd( !k'H&u%Rf1KgʒîhW,3xN[dR&wYOS[UK[SmmP):TD L7unq '{¤rVLS "f 4^CaŽ?BAia}6 b'<,OZzGDofmh__mwlN9 jU$L;xlg/v)JqEXTяEeRTUf,l:σð۬y Gp:Dr(OW)xW%Ciܯ9z9gϰAPz1XQ\ac-?jV}dm 8 #%W ڂߎ!Z"1>/ j>]8^4*^F_/ݛ>6#΅;Q_ vR8Tax3RP@ޗ8v<֪k}y4I9oxƝHJtRsB:/j !ΝIjן"zZߤEʥqnD?KU_ Ǖ;hPIEe@SQuA3^ֿi5SVգB&ZҧힲVE-b#JGopfg|= %9XY/i9E^͘H*ҭ5C n/ԩ*8 q&X 0#Kr4)o8XMB ]7}XsM׋*ֽYQ`t,1FyQ}vB!Y]S1Cj. !=jMtj6(6)tJsejId}V[ u<~+#Pң 6Y78,T w ]6Ftrlc(4ddΫPKm!i b rZp=Ҥa}s ٥mFr=`:\_$"m?Ů%!UlG$#"'f~N3ݯ4uy}Wu].%]' Y}q\!胎exp=_`}djJ#AMYf/[`iֈ?^W~2rCk/uC2|AK?2p }K\/EܚjQof\,{@73a 5xX <( >bnGApŔ0Ig܀ܱo] .ew+Ă[ƫ/P (WK !SEtj/eӽ_2oi*Ǡp( Flk ^ ՚X-b?6q29GFA]K,^Ϛ܏:sbXATov{ GIݨF|z2 ;IU~) CjƁ\~V 9U?ۥƽ (_Ƹ"&}\IkTNs38oІfѥ҉%\:un,h?T4nrAs7&*Ry#x:QnG!a%HB‡I VJ߄G]?MQ_/2<|~\ ¿{NWgD[Rn.s*{7`Z:g&= z3Dpfd F#gSQEX1 &#x&yTLW`=Yvacπ Eh{p!9VuY\$t?D>#,hsP!!I4($]$,2&llbVC!ÀV.@¡:@YmK!]ݰhw&PjdY`͘j,&H$-So򐿱fX>g5>hHTXH' |?E v8?֝Br^|6>@n4jӨ<? n/ V(:4g`VWb˰ʯƬ "ʀپ8_+#=3=w0#/9LkҔM~N9FUĸc)HSѥ,5E7O`xPbwz$}WmSɿ7]$WJT$bW0k CsC_XxkCVWr5+^!yh=.Qۭ{g-YλsW Zɿ87kA 37 o͢@BF^G<\ަޤ۬cI8Y_ZdPzC4RpaۢEq-SR}u=urHPE_+KiMk=BHҸxUjOq͞Bz[)C`( D/vJdqDs _ŭzpƾNdD ^pp!!6m4Lk߮n7CǬjq J^6D {Q|vZ;Sbw uMhywVv IIaG~=5x.Bgkm)~{Г^_0"&H>Ve(.Cʦ(Ze*B (s,!%vx$rM!ͿUڠ0n"0Yψ@  v%M4ޥ8q[LU7>ЈU ۇR߸ec1D%6/ߢ61s==fX/[)O{w'\;_& _t#:*5sT =c(W'@iљùۚ`=w q,Եѝ]ϱ>KXR>l{[I{ԭ@,t^#1,tYkԭyZRqgax~ڛ1˦Zy0 hybt/pa8n06x4F0TxtS`У>N4iI3 ASbNU)*#-fmބgb{]l5Ghi.+R+Z#0yf7Z3: 5q*2:@n?^."̴hd._"B7ugT[.t6.[)aRADc#idGNs}3' o`!gCO֥)Wt S%ID'1jJUnzCz7=;3%Kv&3#x/,s*XWlԛu}~PjJ-}T%vFob;}y$B=8P[eBֱ4=>W/D4]r'v^,xKm07y: B*XsD!R[ -.'DYYAD\2"4?aU瀣a+ڝ(j\־\j%?y5Rr{C蛎koC] }xRdLa==1e\Jg1{cq|@zQM/KN+o+ayoĊBlKL#eL%^6#h;9@G=}C.3\d%z!CˣD7ü9F{ Nk`i/ڤ0e}_;uƆ* 8JCQafN_pýʷ53FOk0(2HžkcNqhs]"oteP!![- e2.k1!Y]NorycoG Vz F 5Z3[]7 UvuF7v"^Mԛvi޼"`Е} }G [w.ݭswU d\ve@C_ܥH?vArj_?;A|RWj# U ߓzEW' Wi{Ѕfgvu/,HU囑嶷ݤ57oՇQ̯!(0y վiHH~MϮ<.6c /;$dֹggC7;- :5}4AS2,k=Gc `m)6Wr]t{lʚ! &nJ!B8q ]rWs~ezq\&θb"Ucett<CUi _\czC涴܇ U;gw<%F>>ג{Rh. Nכ4Pަ\=F7 ܚ;V"IwV K *wځ2;0G H" xE@qXFMJRCb]_ JšK}EMu;UC^{}[߽HS0'9P>ogTuG=9ͱ(,)ܑ+UPLŭ c,/󔰓-Bf0.sߥ9ؾݹLiE4B6i+C,QjQ>sQYc|;MSʆhl?Wπf[mHhItm0IA>HmR!_x ͥW3_'CpfߧE|ȣ!Yœ]C9P ۴8 7r%ᛂPY=A-y^:L[̰ϲm#nD{^v)-rqf}.35]m{/m6O: s=@` [B) qvN`*uBE+4WݲTDtTҥ3 McAnwx7s jcw?~3V7zL;f.F{h)Lv(^~nG&C>6#; O`:>ƧWJBC.bޤ&[:m oz8[~f3; (V/t 5Հ\,<|}< E1Yk.,dE@V8t$G%iyS]>Hg(|s<~7}:檫~5*ϭp;3>]#ͯ0O *[i!\Lǧh#˦J^20\>,F'ӷU,S,'̟ 偫tNIjIN:ݴo}PdQoehY~ G8▍ ̞qM.FQ~Gjuxaz38B@, ]kDX3l]ofUZ$XCj\[=|_  |(QY?i[n4i7_S zX!^oU:E>;ٽy+s1e8nGŪ.>-cFa+:ا2Y52R[pUzJC}ptX;\CD4VLѥ}};Pe vv߶e^@ptR׼*k| c&N[NG;}YT+r-aLvIZ!pq7~z:\ Q\[Ckm52x«̲q(lvoB |CVQN2وzY׺#3EșN%Lp`#C,fu=sk%*D-F}f;+G=C\sCcIh?l58֩~Ӎ%=y0sevEwf U$ͅQ+E¾kDZkR>,4Ug*ʏ+;c?o5p!\1ћB K79u= ɏz+Uv:"Pj4ibk=k+Mgʝ>U&2E7,Fs^LY ?M66pT 1:ob(k;C(u zFRƪFXSeFVkg|OߘzU ժm9AX˜CiX >r7.t/0#;xJQ`[8q#xƸIЩ` 2C :Jvӫb3V iMf6XVã<>]"fzxV,k@TР}u/saМӌNr0`@@q Us GǐaA VUӄu7VWs}CVQǐ w(y;CTԒ&;ڙ+NBxXdQ`(FOoc KG+]6+24G*/ )6RSJ At?msW=gL42c`k6թFXPU4B;K ׀s;]̈H jH=ZmVJktpXҢ n62f6b=kCfm9<'c.–?k?;L)1Ff4}LAhjx} f+cy3%FBj;Ƈob8N!Ʊ'Q,u<*NzvF.se|5r,70Ħdx'ϙ2:pGSPYXGYȍJRU0,3}uWYlN#v3Wi/0,"z4_|. 7a(^M>6{6E+n|+}* C W'eoDvJ&PH_z@,FD*TivC|0C]u KK6{t*)"D&ӎ+uq?U-'&@-[C%*\՞IG}Qs(,{{$th;{iUV+uhFR b(zͮ(~_/b#vM·$nE{xpX;~IXgtb;E6gd~MXhBl#rAoܩ#bSwݏQ^7k[Rn"/8θyzi3sT4*Z8BӘ{T 3r{,[%vlP-:W_HꍑWv}շ^-_ݴ!C*9ڻdTK),@XjW"p-dmx[TLp"J`B͖yOsq].m&Mk3?YoCBI @B#*S?s [ߎ[:{8o}GҫK%/fsqk8!LS`HuOlw ~$Z%qըATۻڣ GaV7~SSvQI]^1,W?ᲢdIi/G3^~ڻTkYVzZDh*l\1ڧ׻C;C}(HϯUiTݯwRD.~P89DbWL<}є7Fvy =mNhM+zۆY#3Y\M: M4]UQ3.fufu]VGtDV'{0P1[pycON!=Uz8J< YƇsvoZYw$]'MMRiǩ't5Hrn'Sg~Pn̚M}Vմ4T}mv?l<=ZFk2>ٽ= *X|QmZ\SkNxe'kN/ 1S"@b?D 2h i!%RQ˪X&0Ua= ʿ>^QIҟƖ[ >J`W8 H3r.$i;b w\kbqS_ @.~j |Pν:Z>7 NL-P"-&#н)0i.ߺ"dq{UvhJпA6~%JNF pXEBR 8*("`xq;.ގ+R+you!b~,cNtN'GJ\xV—ߡ_|}q;t ~FDN&ϫc)S Z`~OJ]g/!ǦineSwq d” ͩ77Ng޾AƉ>9&|{h c4-2 9RlCgWaM:/oeZ<%6J[dUyd*\I[_Rd/aՋ۴]Hn\CN05D`5:?Z/k RC! C8A@SL}!|^jP.Y<>Jl?c8WHBbp<([B$Dx!+q-ԳeQLdTMKz=h %6߄vg,Q)xycuj7s_>'l2D N ;ɴ0SpWGe^u1r0OYشkdʓjzʍ%_Ppfy74:YU.L!d<Knt{FqHRnh` G4ᇟHe K`@p^Sq~^8ՒCdXe%,(&Vq [3̌{C406L:~$"ri 8 6bnLsE<"G@ A7M| )d&JW27J(ИU&՟uӭxcVˑ_N0q`J%yIaAr[w;*YC8=X w^[Ie# ?=ЙzxtS9fd2=oC:[EBq>Ibv*3ItﶳT灪Q PX(MTj8@>iiF,UV~䉜^moHҽ_T[CBeG?>vl<[:ƲOK(7}n5Y"&9\,$5_PC?#$:sō$XHbdz-hR{yڵ }MPsm&-xh'qn|.|ܱk(. s{IK"Ո8=R,zJW1(kA `P HUx@~Qge|Co\B] l qB!So~k<.>z;*ˣdcs+NLoyQ!~nwRGuwp V2٣C)W@ MeŮ\W-Փd9M&A}uDZXAZF j }8 ih-/MQuU5J3HĿ` ԍC  p\}0ھ(pn(`zcU3Sh‰ZڛJ+ U#&eHu+ UTqŅeʵ!$ a~ = kuQ%|-*05*f0NLe[Ai%ӀostZb[x3J#!r8Aڤ:T@ __)- C_gK҄804B1mC/ s CrG 8m3l:QtӸV*j͠Nn.ؗ mʨXj@2Fv:Kq 8 )okCPB[hXg }Ggj:ԻL']Ke~P^ߖʡH1Vqp/ч^]i!@X/&)Üà!2X1z@0W7%Ԭ.dm ۅ+dZF#?\-* 4F7~{ swKH&obpCsH*`rːsMNf%*bIN%ˠqUÇ+O$S8!3Qn۶wjd~H۞'*L?KC]\qUy*A F=E1ӪQ<y|[)d"k' !x2S&}t) qX$c>:f87#E1ky0h>?r̰'hӂju[D&Lڈ: !M`,U~^Pz*,w>XeRHGmx$A#pp0=B0"?`g@xd{AmF0$>HHB' "8+4LU" ͿpaȽ`S,! 3kRR NEʎ]}y@v;~S >hq58%m.K2O8#= NnӴ^b,κ3)l y,<,xߺL4@Z%ב%(@IB42&UH4w`SFI} z t8 l9cJMݢd]k'akLᨮ9+_< Su}y]q#(C1ef€|Òg}?_!?/do;g0-cCwsFR&fQz߻CHZ&&" /3e#lȏ)<_}02")lN5{|=B 㒘9v",~싟7rB~)^V0 <g͓P uB7==<: E2Djiح7-C&}^G"nJLGݯMbDUH?)ќ9Ѕs^$~.&UgՈ-' 冀o1cPW0C[* {0{_/<ןad5~R<TbYm,cj-"}9 _pyh@1)C@HEǍFy[6&ɼOneЀCD.@2Hj_gUXqh,@ xIpp4 r"&{ º dymR;L,%P01k4sI)Kו Q9MaPәr6{~ u ƹ5$>δ NluP¼@Z;N^oz^ 1IՖd!5T21f#H`1`AGFOf[!qYWce_OPݒ sQ1Jƈk(CeNq-z\SGŰ>l#N( N"\ZS`39't2 @;MwHSHc] f 8QD3yu !IPςL4ܼ5CswH?82y*]@ Ew  0'8=h:ԛ>>Wy8:r|/{Y=>GC{=R1 sKmoH@Q9p < >ussB:!F]O#@0dx/,1pXYo~1Mpa1|tb5/n{hg&1mYqO_+Uց]\p F4!{VSb5(VQ܌Wh)%;,G²9[!N1^Vw|Bc<]: 2/ō 5YJCZ3}s_nХ;(ݑn9Kk_=*j FWke*e V%eb~^)NOyHstݽ?[ 0.;lxG}j/?ޏ.Ij/#4E*){*p xhzi6J袦7)dT'ƴpU~ i;DY۷ۈs1wH8f&g`/w+z_ap3bMY趼_JGGlRnAn6=`Y|b.5.X*7LS^%㱨OK&lB.Z9M ACʂ}1n8EҔ,v7>PDm;\8kڽL.?Y b+tДR6g-,ܳE׫S᮱bC0pb9b?BOܗ}z3-$k+֫ѴEI /{'.#PkS +0MPC݇ BB%^oS{j}p Ph'nvKݛ.0]af_yPnH naZQa;zD< D-SHx5=nR`8i 036" 5<݀(߄wC Y@WU($åPڕ&FpV 0}FgKG\ %%EگEb0[AjЩSSNw RVX\1P(ٓžAg v-bdWYm9Uz:uĮnq-a8X(3o*H|T2SٗJi٩G~}zm[\LϧP9—) $4=AXþ:#J#'m IhK FJP 8m7ou>_(,u<>N YqljSd:4 Tt=\s f@Ϗ7$Nb+ZPZsJ9S"BVmwy*-Q%w1yYRXoF#qEbt[8ݜK8T(J:D(ԧzI$hMA Ȕ'bjL^QkTG^v`wxf8skW:r26ђwl@DBfnJ|뫲E8vkb9eq\Wq-x7- Mo:N*{mlWm'Byc\QDY0|n4cPݝZwOR66>1"#&,ޯ|L*.e u*e&]ik'wY-%TzYnC{4fMkhW,qSp^ 5YLI\ G\TJ΅ƻg؅F,&,u_$N|S~rzvL! hu8-+>Lpf;  7=hGm֒WR\c)2*bn'$dXߌj(q,_C̥{51O@+2}Re?)M;{R&lmKʰICgW"Ze2{;I]糰hxSĤueßXӰ4J\sLUk[d D K1މ1״ UEab/a6v".Lu,[,qPxYX>@hx`8lD>_^5JėfG9[jLԁV ,'Y G1FrE#T:L͈v[D0izăg1dW503yyzz5Oe9{5i>!L#>﹄C!#!vHwlji3ӏpab+S_U US[8͈+>*@W8^i-WTOȦIDFN$| [֚Wk8 ,UP;2K|o'O*nbg7V'۱ ~Szu< `a;Ro@쩐˾S]>OP=~`/8S*L0g$0YPn8]'igzxD~S8y+#s]^B3EHEKyG:kSs Ho,p34YCڣO; hߦp08_J6N_;i@G1|ڠ%pW_ݨE&{wP4nƭÄ0HBAuO/h'o?|_0=DXIa$XHU]A}ɏk A.!{(gE{H@\8Du%}Z; / D]") N:ھh1W8~ RU}X: b-Zma a]QPi5DĤDt\P@JMMͱh;]]/nCȝV0e_O"/L hC(*~Rz]6x%0d4;PC+~{*CQhru@5PlUqe;3D$Tfk*щ",GmmW\%xx}v 潤 r˶*W~wA%0򐷙M5T,!F-P #Ɣcy!P]DɠIĒyiB:bB,oh?L5-O%BA08 r dG{tܤ\Nr>lѢ@A麋ȝz~-K@B)+d y5ófS|f  e}~~ RX> J9ŽiG'7>ֻoC7BDGN9P&jQ]1\PUAXNN7,iAa'1 @ ^3U`+t)uRd$* ½aJ›cF:8!`+l6va%KNy*I;2i8=Bp7Be0<ГoTG1QGf5QiCkmmrQ"` 2.ztriO˯.ͷQk=H}Pmqq]I 5AtpUxEv+ӸjGʼ{˾@ Jn'LrЗ(i6(S8FIM3:7?㪕cJڡۅ7ZFj\4J7C\ȃ~앹s6_sn|Q>gTa6z'VdK74eЬ*R#A =Z9g=Xe=F7`Z^Уc4Zr|JL޽wŮ@ASk30o%v!4-id{Uf>CǼݔhCi+BmmK0#oS5)(o%. Z1|_zsV3և=D-| Ew!`e4[d@eC~:'LMF[`ԉ]:}1*6c k  $C[Dl1Ùrh+vd|ׅrP@ 1qqT4w.k1jB<}b./\$Hጀ9y=%34"e *i<0ݧ[lX$Bb W( Z|^%A"]-ރTovk F[,Z'OX!CIN'V`# ݤ2oH-*  kS&i` 9XbIߋ1 o,d3{Rg{gt9-4u>B¶qGF`??sf2^*0AGWS)Z eDTn)Gd}N)^ 1[NjS~#{ُa/ʓpS(ֆz!RX$MN/_<39BJJyQ."F*<[MoHtprDN |NV:1.OdYj2Ӹ1]ئ{q-Hx`/WC\ }cu4GHe%S[iZÜٝB$%@ch'{*+t$=@6|S/բ6kDgX<,]ڶǦ}$ԉ6kA"*yX߿EIwLЫf汌\xaڷ&@RY[4" o}im_zL( t83\ Qu}ib=Z2 A=HzE*x{Ȇ\>ilqhޮ]B9. N(=8čV;7,{7MFhQ:-kB^TТt߬NVF\ǰ*e)1:-@U$>jd.Tp.ɳ%K "n ?I }dD|bvMu+9ؓϷRUW|]&ɟ DĀ9XY w]<:+PhKsJojEa vwLǟ9Y hz;0 Q4dBs:,GjN 膂8_H]׶H֬bgUM$l]eÔ4H=g&<,^mhB !VϟvcBo8X8{PQ'|JީZjC&9&_ovG L;ނw^m9 sî\#!ߨ[9O/PyTt20߀P?cZ֙ bHa`*9$jL2E'yMEn1Y(E>u󬘑 .9]>q4{0O]I$ڞbds֝&i,V5xB.%+ 2\m9i9?LK+nY 7PT7nE1dX¬l{nQav/ޒjq4 (THP9̫~E1+DFHgEPycLYzHѪ_pMӉZ㿥_ ;m+l/'(2VamI:=[TI5VAx Js/+|.̉,dVop\PJ~nA"`$&5K] p*Wz>:6՗j=2A>Z:-tUґW~sL}Vڒs-(S 8c \͚,4)_b|19\/TAû6P&O 犹̝5Iv&gө| (7N ,;h )} * .7䑋e풒^,>)Ntr#ZhJ߅D骟% ALC)T LXyրral~nZ@fC[2G`=y%p5r}@+܋ U&BHH׋F-I/wzRr?^1ЄFSNBUXz֦g=F&4/{-NQaB+ Uډ.-wa)ݎkg]wPJ`Wӕ|ۛ?+..ӨQPgEl!Nn@pغ435іcD3@-# fi]eJ;%kNȐ!'"ԪW'5 ǸTշi 㩔~:6-WKjSVgP Іߛ4A/ò^LزHPsуe*z?x!D@!YƂq ?[#_I !SR>EjO6"J}{y '.=o*# N;qav5**I20=7 Ѓw#ff=~ngݮ@ֹ[^P4.2U{B+_9J@ܥN͹z]D;8rB%pXRt8N&8MZHE5v ^ !pNf[q  LwjЗ+)H)HqY(p## X_QIB'/_B;T6OO-,wm\D}62,J7%^[F*z PAA}TCѡzpFfR߬QϋąZG??2c ܳa729CDʣl(ƯfڱG G'Qm U3%V&"n%NG,_WJ*GX{q#T[aNWכtL;F{<4SOz `ꤺl1a\oc9p[JZm!S b"b!fD$r yq-eC$wB(&&82\c \(\[({P%e;\?IRDzR2uﰣ0"X&^Eo0fXա%SlmgЈ}2U^+qxUtoAh.Ǎ5P~Bl-5A7aДk{6ʖd 'h ֆ OB_&r6B){]IBܪA- pq: Ǟ/6!'m (sPLoAtvq_d:gqy>N;< Z .%t $-`(4?FALg!R)*eTHI'it}ȂZW ge[&[3ςO#7Idu*Ɣv,TZoyxZa)ZBsUsO&zn䞽w\X@^??>ߥ)O!rz ${3~XAkD}Z+r JPwFh^ W`cvlp[2!w3@0"T.tBq.0Dw.t\7 0 ncD,R3dOn !#wӸ<̨=i,:C.(K6+RA0-N֙T>l+@5-30{TgON)# Mr1<fw+Zbr%T*n'U)CG> -{9|3w@ 61 >axD7I0}P*g5o lXf7~ 4ZG% !|1Z"rA)VjHC-؅.< @ HygqF\(DŽ%tA23ǘ8|61`;a 9^½xA`xyBrc.L|#H[nfQh2n.!GˇQ) u?2yuz` o)hr`i 5fjdb0PX[mF# d`KHmdD4i?EAXnϖI[')T> 0$o^T|mm+IBC,@543k@,Ed`vtּo!TI<0'+׽g!/qϷDuN S&g^Gy$ǭ3UFv(Nfns z/)OEYa`-K?}s}0~K@Fj6/nGDNbҹ{ܢasHILnY:;=P1"FnH$_+XX@,Fi׀cYܧ`O1ɓ /,W yRJaf5ݔ( g1~:x)zQ[5kBhW(r]G ؉#=KT Z,fqӢc1..aX8 '- TyT&W g B5Zbt/,_>2 ^cfpZR ~Oz9htl9(>2rkN y[ G2%ʥ\ H FnNSu)~x :Bыn{Qǹ'atOmh_%['ߜg&!I?9=n3'Aw`T8l/.jKz<`g6zq`ݵ!& {jq(<'+ bj;Ϭy Q;.v{eHƽamr ->~(lv)f~FʃGau&9P;/QX~t4"wd¬C# Jyo {vo^v^o =8XTmy7._^T`:@_00ѶE#܋ܲFg!!" sx5%f3D]!*K ,08 LdRcZ\0-! /cOM^Fri4I @Ќ/K<D&>3Wv! Б[!b{(b*g쐄WsԐsXa={&?9urQzw+J0jys㻔\LY<[4q ;*h +'yxx< SY_0]!0DdZ'f_1KLܜ#gPG431:j٤t@~cġM$>{F1W!`.Jo#/7y4H 0Xa=d4Y#BVxO!7pp>=7(F^;a S>ƹ?v_9]5U΂JR[VdSETkR=6_5$ܐ"! zS7bwHXK .x0I.$/Hlҍ : w 쿫ӄtCs`,F3 6lE !(qM,GTsQ)`W5la^z'n2Q?($s&}3S!+Dv]$U &πSo:~O .IGFuO{ ,df$!~ZO*Y/6a ؆~:4 ~5aLޝ]AD87NO|K V,O ¶]+B%@=&è0phෟyˉAvy-\ O>*Eap[ILWY(l]φa+*Y8.Fڜb[eiP<Ϻh0!$`J҅*߯`{{.տg@^P"?Í~wC@z>O]{TY(=>M^L0O B$<6O1MC6rY gV12FFL($` ,m' 9[ح$56ALlEi52;w5њ꺀q H|?Lވ3{+P"L^j̑Ɂ.f!S4;\v r2r*r&-?u;GL+HgU*p)O;]A 9(qf CnmN0ء'[?_6v^rؚJz®' K/_Cdᶶ&^&;(x߻=r0c`_[]a"_$"44xue$/#:Ilb5|b8eX(1Ŀ=>BտrlBҔ Lœ^0PYf*H`k?{QHK X^ZǸ |dт%4ܩh2;% #Moj{w$=14Wpדv;Vbp!GGyu ЮbP}`c`߸v p:vu dOOpD}ϯ4bw@렽%e 9{<Z7wwtcUϢmӕ RPMlfGx( D Hl\a-iB% `JjP֑ -z #UG PNq}^EO<%5Ύ~@ WHRF٤?\,d*;rj KfS#4(`cM-y^¢ݏL@c{[DqnAޥ\ 9:9VA,݋kV~i9O7lfw :Q}BÅ]&n6L'~\+IUCU1Եev]wMtzzp]ʺ"[0ٮWR+>@/ݲ- 'vM V-'|I8jE܎۾Й^˜3 E6}<k"Nm+ҶcӻMStH!P .wÏ(5wBqȗ@,Y1珕Ot?Y3d(Z 1JFi&H 3TJ>ϖk< ~Mʋo"XqJx|+t3U|QAG?)0Ƞ*ܭ+xm;OYTR穔N;qHDt#ɯًHhI)"i|aR&SEG )Ũt~q~֓FȬfTBPP-V"b{HtI,*Ay,b󬔐, ;>!cL6̨^.-QJ՚UՔ>,^fÙ4t,@1cł15z } ܭX %V(9n"+12oJӖȦ1Aء M溌x`g/b7cd?)P-ʴ Pi b2{/-!^1TZk8qp1Hal Jgʡŧ%x$w/Z3c|nA#h6c&;b Q9kV 7a){nC(LzAIW&Fxz=o 3մZO3uf pReB(44iὡM}?X9-C\؈0)};-A:=;9k{@X<*S+蚄bE0eRco=mAD\NufOSik!hwy !{=F$v(b/: P q~KZ \#)14g:x#+vi9D4cNIhQo># װENsL?.((N϶TθضN?B ^>ݏ]ɺI2Ojoli7@mýI(u# 0 81c54́\aJE#c%y:fza^dPfb5(E+nm| _IF셈W+q quj"JrUO!߲Ƹ)DTʓWɭt@9\?VN25[xc QxMaR_a[;Ia~z(/c tr U.ݧQ~F}gស#EkNf׭F.s )ٍC$k9TA10h0s@K 0S8 Y'βr>>BKciU %?<.Kg_X HZr+4z!$ mD#hޚ:aTU nܰ).4LeLMXUDLd)Yމ/{ee8Oodjz%m"_<*5Xi|h0"y*7DZGAfKjٵ_)'ۏ}(H٢U]QmB̡GX_wr+A}Ew/PsYL8QAy~~i![VM ̄N*5@ ގd}e pO=N3lt[SL㋴>o&oGe]>(xZX1G'enWĪ% be]R/1Yiؕ7M^5&L֍p T~2ZZGB,' {LɜjK|Q_d?xeVEO*oԠrMLr|T>$ß$Yߗ?1/HgCc qXU r.|A cEnn LصG΃ VOuq?!+j< }{<$ٶy6.}"6VɈiݏCo27T=ewD(9?7bw^ԼŞCy*v* "j "GPoڌL+"&ay%kj&h\d(I*կr(yGO@ j uQ4Ns/t6?1yc a\t/儔XKR yi0/wzլGY|t悡췐H>&:A/" *#p(h9!~^LSM±s1~ā\?p_w&-7i3V z*T N= z*,t86J 5G52CI\/8Y|vf[U涉x4 KL !t s k<ċ){e`gr;P }oRXabp%NYKrϾcޙpb\bMR`N ~WMG_b_VEuX|5F@."XQoKSG/n9O2з:Mٷd8pY(V;ݐK^4Dgء!"E9ds+,~\BUdg |vؘ\߆灘  }3" PAXh q*g Sn],BR.uU <ٚiBb0uM_UDR~G}YʍZP[e1*c=g[mZedx 8"{ҹ0 UwM+tA<):eltJ6l { U)s2蟉r"$܊_"JM\Y[oCypLD޲DܽfE'~ $&|lGx!CiEH40۱Sctq)*$yWxMR[6ߔdD!><[7{a2Ctk*m6nT'IhR2 ָdg1_3K\VD=#ˡSо mGH&zt;%aLoe& Sc(oC8̄\g:0R6E :qÍj!| T W (yqӨRro"˻X>ZrOZ)7`\BzrUmY.,7_^PisC7-[eqyJ|i}nJb)C@˗]_KF9\Y4iHR-ձ>0S!ѝ/!+abxD)#؂%㹓B9FF?wa x!{*)nr潡ڎvaJHiT峐avDJxkߧq} ثF mg=&ĬU|/eR5%zT#47Ⱦ^ tҫSh &,=u9K+cZ-{iYbY:0³$韥OPE{e<C:;\co'/#cb:Qܹ{ڃTjLHÃn@ܺ[fA b=s[!?gߐ[(0V !\t k+O!TJ u#[cF5C؟aR~D$YYo$]V7OqPК9:CNHk(CK4B4iIo@ͩ4h$,TPCHNP|]Q'? !Mc9X1`IwԦy*NGj>&UF(_o]EL|.`>SW]gfEuKs|$t'}rXrL1zMNAm0e-yɓ+UrSe(J+KmWWץSZnFA>SMayEfc5YYPT5<4t)Zw0R"+a2*x`?s7``Z1ŧؑ҆%80\NJqDHfOAtv^[$^{vư; 7 }T9 7wu8~0$=I$ j01,a ~7{٫UHR_cU ! A!ι762j9jT&h8o}~P~Ad?nt9C.c)Bq]H΃GfFDo+-`zS7dm{-n.A7PIM%/sI 'Uú+>UߍU)0J:SolhsFG&]{t]8\U6MnL|gBt90ɞrw<׍%?Y'T=q+hi9*a=JY?ͷ7MԼGHW^`YȺZXwYlG0 u Qś1_L*jz Θql,zh0[S퐓% V@߅W28 R't 녡mABjSfaqrZM@ 9r|ߵf#CLG_3Ek@KnF*P{'S4Ĩ$|f2?U'w&ճdak}5ļ(B_bP XJpp2^tK7 c-܊AE4~0[kz:|OQIMhd:U獃zg%rX)B 8[I*Dk{\2+vfڽ(*>3uk 1ϥ?pL<EEk義u_.n0u>2>M-* ([dT[;rlakZ[h97ݘ|+i]-jHy\1- e&NE,b4/ȓhV} 7f^X~Q9{Ь-aM kDqn!fdOMx0$LW}J 2,8lh/{J GhHŜ剞)5aԋ;lіN8r뱞|L3B g6U"6bv6yt@}5fct\= ݍ@FĂ颿|v2e:uqWkUn(W"ROCn%Gh̭\>\@Co qmᤩe3HhaqD~VQq pϳo'gmFljΐ3P|fJM1yKM|*Z+VmnKR 1Aom_0`nKK ~Z;(+(E`O4h7qXAΟ ӌB$gE OS+3ާqN2pS(*n[ixԚz\V0p\v^M]4*bYSˋ_)o /ffKyM#AQ\h3 gL \g&h{U6%Aϡcê;0WyU (9w H&i\ȣ&qڬ.z{}|Q$5Mb18GhibE;O4*EGjCڣvAvyᔛ4} BGL%lRHaDCt;8.pUɛ<meJ)?N("x=P˕aQ i/Hf9_G- Zs@Dk 9f|uR`,|5irXm% ЎvڇQ{}E?D")6'.ړ}vX1jUf9/{gkỉܨ xE̕ K{Pwf4jJ#O۬s %F JN PX| =4 kwf^ѐ:z%ɨ8C1Lz9ivi-6N(C:2fm`6Qɑd)K%,L/sJ4KBGX k4<(DF\K% ?eԒ6޷xs(%INMx\Klte- ַ.!&rkzN:NQ'oXtСKbƄ*QB^][tլ.;dNS?N)aicZbf)AkPk9/G0ݥkOXK$IZ=C X[˕* kђ]R3)D_U d@)#A 8" Q /{E&S&u2jiu%rh6nFUVG0"bjc}g<.=Nkip5rtd Vc 4.-/r9$Lm{Okܥ-~VϸxZ'EUCrYIt[fP] lc4-}TtFI̦gwg3 %lpYfu6jvh¥BiEt\Zl%`Pu6>GU3;kUƳU:5]`H>(16TXA;5䦕 V+pKKgH P BA |-Gi:QXhA̫ ~c@\@gRa>E-$'3$9opsk/BLWq\D{[$+A 2@֓rF1ޢ[) CWhk(>,3nCnAqrW $} enY_HDJ0#[Sk5@HKb{$C$?'Dp&{0:۾oGذEU̯$2kdĜ8!/%hxvs?> 9we@kG,M+_h&t! 4FKևN"5 vLQS@PePy~8p(|?!衔Ïըy1] DZ&ұ9e:j"%+ώW|N*Y~)a]>6ߥ; yn󡶫՗qa] 8$x0b˽9J֤H`C ^-_CrWЊ;Ie<%) k M \= K"؏7|9Bj>/s U4 [`9z4MבG^&*2C=?H]Nt#&M]WYJ[(A M%-dMJuxS-0[aB2f)!}p׌ڶA2E.x1d{Zi dL쪟9#w5MеthǃXPuӐaxZ~7bbfr[AUpwzۖ8lNH*źH@QD1X.=PŲ/A1.\mU6!#䱆$KT,UWq _I;8Z~i6ubBԼ]s{i>' G,Gu4$=wUN@ A=I݂p U}9Y OeLl<s*Gި'ÝN4o᥽VH}9տG"$tqW<}XY5B{f#n)ǀT9Y#PVX *A\XuFL_NLw8ߥ@0yAg`O;XV%>?ރ VԏM`6lUS%?"P"tKxÄ!V4YyGVYf'\RMqބB"A^ S1Uzkzg}BHPeiBn6~"Znx4K!Zngu*NpK~ܑ+d\ԟBjBљ;dkи'I&cg02eR ㍷3FsbR\Hdw¡,xh^( \$4MFz/V+0E^'ztkv]:m1[}G.<$ڇ<Y]e57 L Ls\F<˅?e8#MIj.A[|N/M"sMŔcVjR]W 4U*. F,{u2ߣT˿'U%B u[ VW$ǍNf(T(=Dkw#O e 3r`u*v0-xӑ' $3|q$2~8;|{&^)̭W[%3'UH 99ƃi~8vVBLV[)5%#rƳਥj՝jPݝ2 SJ]y䦗lV))D$PQQ^Svl{ڐ+^+]q\w:A20dǚd5|Ԁ[ Kہݳi4"[i! tpjɆK7YFK"jU^ښt_lLcmV=??dJRpnL${6ARdP87u}Sΰ~ 9%kB@?߉HڢwxsWJ'(9 4Ҕ9{kDyb}iiVQ"6WNJ/9 Q>v+/5lq͸X !WߏP_^7¶tnReL &+I}Hy1oKYbu0LILbM kVNZ8hr+Aܿ^P=±6an4p1(5")D(^ c4vX 2(Awi*!5fFOAbq+N䫏Bql#b`P[`pb!x'/= /CjEf@ o@qВw”nj#}̻r9k!sP2>->vl%*Ʃ_43눬&b*rLol@ϭ ChN{3lOLa.+1]ݭXN )&gښGx͐IY;b]S) {̤`tM B,5 .1}Uq}dɚ=%WU'\>5"if .:?>G@P9zE8}ܶqZ8Q`o/ gi=w׋qb$p[t ou1EO{e 携i "4ֻv0M` wV=zOp<4D.IKe;M Cr$64皣M|VJX|#a|7C^mb~~[A逶*Z~waI8WUoHIX{FMyE˻\vRAxď~k8uu? R)z_JPV 1t~̋^@w #ą2Yr,EՂ(g8JHߖE1Y ŋyZ;RǴ=$MMQbc?)q́Wx,k54f- 0KxVUa90\*n1L}!%Q|)0Aw6!Cn *H\cR޻j^)Y?!Zw(L +Ӆ'ܓߝeXq/24NB]tte5|Bfrgl燫 :>* lY4We2~2Q#wŇ%#Ƿ8[KB^` WNɊ굦{z>1<}gwFό2p׿|k ] {NaxAeT*$|yhhΕ=叴&pffU@#Yy-`2%#zh Pɢ }{餒YJo;7$ꢨV FA)f̋I"pl܌lJU}*iEӺAѝw ۖ}~qdv̧/j2=arr - =070Dx>(йƒȫ| o\x y 9deWފ tfW0@C8~ Ǐzgф9g*̒"R /~dc?U&{Ơp66ŽJ *pob "?\^].8yUIAj-3cU"P QU^({%&10st,ΏW9DYwCJ }BBb$A)W^MԷ:g(EN%NȦN/10D N-Xk!%%c8PFj[g#its,ùZ\'"^ ꡭQ=PM> R\掗> P0UR 5L:룳zڋw".~]TLepE=5-D Nr,݇]OIvRB)~Yh_h㯥޷MXǘPX}ȶQH;E F}A  l<{|qP{vC͍)=L+0oK|n־9~05ٚHS?X! DVkIsh>ޑtbW5!}1u|Gc0^-es/k\12 wL=Q,ʰF b'bG% c)0$$yJ-)a!c6k >Ңp'Ar֚+q0'TGh{Ǻ- QȠ]Y!14`bS-Lr>E]b`f9D;L4=Tg1]-앖F)U ?HTV" K Fqe\7o}3[b~75L%*h;l=M Wp_y_wczY)*_3w̮/ZS&ȶHhX@9Ę Ey0ɈoQU,[& I]tFB>qR=R<%4*GZN2wt!D*@ ^WD-gN 7\LMNAWLFU`[:꺽8 qNcҿnIгqpA85Kr{6xgFKnsB;1 ݺ_atpg>{,ן1b%}2?zr@J*Ձ"d'>g]ΫrF/=#|K7vD"ڡl4PiMZer~'Enŕ\i Y_LtчI6犙Gmxvq&?Vx%:dr~#LT-8$F"}RHvQ&,|HvAACx+'-R9?&D;VPGJWMj":̂ Y?-O`eS䝌\`t3é%["FSaP<,t)J u %ߢ3o3dlEV``צę@9ȃ ԸC*Ym*B['Ԭl)0!З9'o0ozcXũ4{ޫp khSGM_Ϸyz NKׂ oO@23jQ.&}MaBɢWHoiuhPT{JFRO ʎ 2"?,GB46zTc$6c k!"E h(Y~:3mF,DrHAOP %B'Qcw E\wu7FЇl}QQtl|eOEkTajN2Koq ٩7d'_$}faKKpɕ?B8pF7嶛%)csix%t#m}hѦ]FN 9R`en:Tt_g>ZZ5hkV+JOWX М+5 ZůZ4Ss/}^\e_e j!^^ΡI&8]hn;ʞڄd&Rk"BP-ЃVzn1jC<6$e:,Y (<3zA>1tT.n @z_zedUL:>6=n!|ęrO^.tr:VN/lU "\L48M"/| z%->n$2zf.X5 #u5=)~gk s7Al14Gc/ kyWŎ-4nna{ m@tD  %S@]$~FOy}HyĮPE׼"HL/¬&\  2$ZJwKu4 Ky͂83&TXGdg/.¨Bz>)(.ϼ]XzwR:ze8uhpe fubƪ!-H4-#5ĩ"UKñ#u:qԄi!;В*[Cl J)(x&3'tb)6ZBJl+-оFs<:łgjJBcBEdo,afPu_IbXKfOnw=­{0ǃs}|aEK 7ИYIwg;Td!.eC(Blv" %V(a=/W *s;|.B׼шdj]tloឭs₶G XȴʾAH ?:&ҙ'$xm\W](gUVկMw9Ox\*R'60e3MzC.~S7HIUe;cqT Nz/q~d-ZAhcI8tV(Y0a4Ljs=ϋ[[<ܗ $Tgy=1z^J O'٤ӳZ%K>Pi hyD;9ԄR NdL\N=jOH3K(7L$]C$@F` g־XMj@Eߔ{$TX2ړ As7Dm:}&'\kSGkH"$]b[S?T[r8xDiԠ+4upb`jQ, ɩ=k. ;1SjؤR*"h*+Эr(K;5B=@0ŽRYKx?-ٔHTR;+zi999>E<>' :ҋGTkpG=C gen'7<fnɂ|YOrQXM (8P ۷H$;MFm~Q #䄍/*, r3Q2a4A8 b[5V VMڝwЋ@M ~5J/:#3 %o˰)YV!u{ӰRS(l +0 g! Xff@~"{wt{^ҨsRsMI%' .;j^5Œt9AIT-;NJ.aܨ)mQHȃ y@Ea:w wyzc]"}٬E*b;QFHL]%/rP @Xy{W҅u]:&wa-8Tp,ڷ PÔZXkhBtt9ɞ2{ &6=aW Uj/% „Ge8sU?0aHzm;dzIҔSUوRl9ϙO 4h= sP,p%梹FO;gJ\Q!SS.b\") 9,x>YBp:|omqd<> FT^5P}#.!Ֆ–e gbl5=S{ɿP̊+""c3h~z2k#i."f g%⎍̕M~ yh;j xl|:?2y>Lk:3p:۶]ڥ0XLF ݴAflb {šP ogF;YyvTKı |n6 v^#5bQo? %&he[@VuwYYp T/ȝ%VY E^Yay]'n]@3zx |fRnӇ 8WOhD1!RnP1Kuc BuϰtP R-=CG}y^ )0Tc7!SJኖ[WaMoܡqLW&%+?;MێIc)>Ʉ|jߕ mwǹLa;Z #d@F=$~Gv%z9y|7>v C+`D/\Rwl&TN-5# ߊkih~}y鸺@NoMOn5_,?/I9N {& : oQl"+z<% Xf9l#>Bk"5\t㻹C/7)qU\TZ%2Y B|р 2Z .aw5<8&-OSʺ?ıM_*u܄RHi7 )jׂku8 ̔ϺW)c {_w^ XU8 dpp(f{a _jp*$NYZa秨7.1’d4=fœ+Ą( Vyw1Ǒ}meI-"XZS. %yq}*MsAM%ѶutFp:+ZmnQ/ɶK&[A HڮNvJGU 6Qk< grJ0>3!%+v*c\zˢ18"c&' P= UB<Ф tN2֕zfCBO;eAF=~<1 I3 م1UZF./ތ&k9&RwUqpX|x (xXX)l)I-ۘ='o{phG}N\tN3ϱxJIltMcߤ:8B2tyN(e+Ox:fyZŦ׋=F5\]." RڵygxXK ~_U rJV{ohxėt~3鉏Uӣ(Dz|]ߞ+p{&`X'sLudO!9^T%$lةvX8?OWĜhﳟ Ĭ/>Uf|.o`nVC2m99O{*viU^+?`fңՏsyM{ (M@,]:d6;[Q74-Tw=ͶAgN:zG8ͦ¯M.?}P(78CNm>GyqCr`t7AKN-22H0 U<_N}1" DƵbnV`~ xNi(AG0ېLM!23?0J-)33H译L9Xj(AU>>Zdz-m"lot3EkJ gSξL _YhS#$byF}H.A.'\t-l(d]sgKR~D2 uc^ZpB6 >Ve:o+>Cv!xKH%mHMT!F:Du'/\Ѓ[72sg ydtSp=Khچ!5neZH#^%yFg=2 Dy ~gd C"|%cbgz )DO FZ|ID:ߤ^N'8ovw%&`j˺J:rz'=z(ڂf$6BJW) ]TWЍ\[Xʒ50Ӈ^{LUtT>>PL_EןP%.2/ t S:{LՂhQ6H|ԍ T{,8=Nd}Cp$yKlJkY,D>% χTWYǓU\gGFb/gQ:6|S3/b?r{N.Ł/#P\15eC8sED):B#<30¶c~>ezk ЈD$0` j腑\GȜߵ[Z}i6jnA7ԦbxͨvG(Ͻc1(}/IWV8>m"Mۧy!5S&H` MAbfQ$1f_Sd.J( &㺒I2s\7eY_pH!G_K` Jwl.z`ȣm~кX X;G1" a<Έ'1Xл8e.@FQO{GCaY!I@Gڡhe.h Dn"px2ⵤ#K)D38껢6?8[.VNӨ٫.r/1m>V˱'[PVXIʌ<(fR,uAFWh^N^N1nLjRC{o!-y6YMۘN4%`*nogԃL.}(1@ se~+u8Hz use .>jgvj TH+0D%ɑl:^r/ࣰ[IDeL:mmTj͆=aT䄷 ' eǯ! O3%MIgz.Dȩ!Ejӊc:ƂDc.C/A )=92+j?$ߤf1YMX̤VNZ!΀$s };"mv$#IL5͹@BujÙ¾V#넽%X\lrX99 /+ ΃FBQfr3[2XPK;ib qny3am7XF߂cNd~R+(_fc8DGVPj"gLnAڿUq d/“-:FXS5^8o>%y# W9Qk z=˳?jrBlc 3z xjLwA2s>ƒ>wl8R!]*]OߡTMj( UWᱩ}2W8(T׿ ='@~ u &9uɩn<(󵻧h"fUDFj6k|2a5L̊CJjmAQmFel=ϩx λE#ŏ{hk랰 q: F/ZF ϋ|wxJtv!iJKU0PUT]3m =,:0&:~[b5EoY v3o?@ky>He,:ƚag=G};st uAt:?s9V`jpI;q6HgSo})%+ǹMU43//VrJzi:"<+8ȰƺlmO}F03)f{$-冏0 aZ bB Bvdr޳Um^σrB#mi9vy~)+r!w<(p|n ز-E TJ2*\T3 L0aTqvv5-)EP+Wlr -0&]ɭ9^wzj;I[;NA pp;tEa\GҚ`c{~ܪۏxr%*U|HMgs:OA$ҏα|]D*9č~/$qB9gm|wisvg\'Q(:\XVI~lFk X:cyЙ}LBx6Ws*x;3u%rZ8 tWkCʝ,˷>X,Ob#:]ˡ_j>iQP1±k1n1]k 0KdC&.@oIɿq޴@7F=p9/<eA}n9/5E&H];EԵz+{oA|VSӜȁ$w!,S;ͬwv<]I%w(:TdcyGAWl6!Lpyj*N1W7FxZ rlAǑڱ7rE5#  E&^ɑyɟ4>Q.mC`DU y΃\&_@kJ)is[gVQuN8Oap{+ĦCC.ɥp$q%#m `í9 @&tPFhoԼ180cYH%.Mͽ,~~b?K֡uGmjۨGoXRi =jR73xy`6«NC T]LhBeY=cj0A %@;=}c:Vr-3 U_U2~Y U;?$߻LBV֢8E<me2 L* "\o´ߏI}6uD=.?dB4aSX]A9);7:A|UO/7Y'!8ŏs FFoj#^kT-꺺\4B䥓 䭘]UG' 8tfERnԼkZykQ^Iz-cn@IeAQ]R\~*MRtd(W3*=`TnP 3ne F_9f#Rfȯ 5WZ (:/; ~DgᎮ2ålA#^4o![LKPd–.{)F/A J ajФNAX,NJ^3tٍ-FL;.7r+F;71νNi옛",S!h߯*`!ewO $Ҿ h%j 2KN@EiU:?IS 'B5,?^; MmKGd[Y4VX`tEo'U\+!A11FPe /(JLD$n¿^eH!uX@6c4F`ӝS/INGunbߏ*#I0(VlVOhC16YO 7Z|'lߚN^ʵ3Re`>W5k+ ؇Dq8j*$ST rV249Bs:N;>U ;d*З 1& ?%vRHp+ё$ESdȩyjϛyR6Buxdǔ`tI%M} T=PA.cw0-QQ n ;x_+E /w,aP,=.KD5&j7 jgeLT7ܱeVdxntrOܘ[WՒ~@^]1*IGy&%aZDFHKi ChT%ri>@\ʣS (ϊm92m.S\%wGCkmyE[ kQ uhd Q,VL;,Ý>8f7ih3D *lc6v.9`7T^m\alѤvoѵU3^ *y$l&7\Dq]H2#O2Hs熆z _nZRR2踢-D1cBY%3{P>J D1PFߔ#XhlaѽJL1% Tݟ^K5rs1ðle¬֊*/c_O4ߟ xSA ,ІޑVz2GZBXSohx$ކxQƕa.]IA OC +!snU\75vVId]AeoUwaO'LT!S}ܔ  a '-7^X"N|v.;l ĸ& ݎkz8T{T rUoF)f#O\j:? 4K҅մ* ,nF >m!(o j}v(49͹eUSaC[P PqBʼܣў U|K.nm\Q>k pC YۅkkP~שa>= A?^xpVl"QM#8QhDba&Xv\=z{Mo#&=o)axE4c&@b1xʹ?ȧAD  '٠XNGo%Ri,V9'fnۀ2d9]FO!xDr%VY/Mh@[(fq'jtY#W<d!fNş-icB}ڂkF`^aҭ{)Yۦ} Wz@RzQMϵb塋B6QY4-7S̺c&\̾nYq<3"cuidNw":dp.dNl|Ϙ TvԪkVdžˊALݛ(./3?Z;s٨Vhw:/~266-;,9T@p ;}JѪ7VUC[QL;JyI9, K?*`51~:-u0!&\hJǺo^y.9yoBGKwЋ9Q ~s}, a`t:hA[EMiHnȻt 9# #e2tO&9H%i4t$Jz z#y纂INGpF-osP y[OFqNuɸF@SŴĤ]cj)UVqlہǩLolK#ŝ]?_#L +ǖ׉iA1J\'r,rW OTA%5w=_xײ',(&mC~h}Hy_Z ]c<y瞶|4'n˪yزko.(bbEkФtS#1IU9- TwľeLm,HmL &)Ҿ( ?IlgW  ځĝa . =!Cq W\nF=2DG<'X_qmgύ"Rv!Oz]+-B)\dG?CY.a>J_#_@H{Fs|_A^-~#}rƱ( JCWr'>ƁɶӮ+RmwOξ#`Da 9 N"Ys=?3W{%'h S:l[(Oo7펗6vk |{,>Oߝw'7éb<6$D^ v[jZ0u~=kƺW^ہk0K&(L\xYlX7uĹ(pƢyd`Qu{2qLd 4ّlX"ƆpXU<ZSS!YÝ3d7Onvo% <#*(7CZ;Kx=_: rgآm&:w2W ZI_s@v~zƘΨ7`dw@k_+1^%IB4q -尢2H#$R{ɜf`A#H#5-7uCФ=Z2 =0K&*%P?6/!uyJmkI%"yJ_Aϩ+rgs޲i-p|\řfs:Lzkh}XkʓxYzan+~#*bT2LO@Q+j5o+䐸WCRHVvdX('2 ?CcSbV5 닓6b^M&E#zNP˥#P>%tQ*e)|OUB0iĂD",[6`Mj.dyZ, J-g_(,34"R_;N I OԉwG*Qϯ[zsG8l%r8lU^u`%xˋv @`a}0/҉+ ,;v_M'HP<&[ 'Y-Sef|;,Hr#-փHSΘN@3$_ {G`ΕQE7q$24dh&qtFacpW e}Uf(>| 1kzcGcjrŽ.wRD=CP CۍEmaA8~l D9"ِNO<7vCj `) 8Xq)h`G\?ڨGF/ s\VcAlrUt^\<gV1UDG;|ʛOb0՚ehNƭA&o6*DS,§1;VXI=]p#74pR:AVHxHO +6QG-o.ѿތ&8iTm7S٧#4ԉ ZKo~%(ɇcEkޑ H:^p)8i)gBf0V.6iYn$v$òMlnOkItyEU.b``$p| X}Q!o0&hV]}۞7K7Chʤ F.˥<^Acq` CP򩅂>71F1>lsyhy[H5XOVͲH7Tꍒ-:3|: اg%Fڶ(r5fㅬ[蚸bPv> AzvRc`iM$jjhkhm@o[gGPFFD KKIOuqBS{D _fʧNON]AM(d:V5 HJ~[ Nݎ S:A} L_?Zq_(-w*4w٥Pm#; 8 zXn!_ׂ? KtI>@z82 6 urMjB<"a5OHٹ({ m˱G"/ ,? Ҵ:(uZ!зg|@e<1Sl0*R/?Xzʽ ҉K9z_=tr]^ soI4abQ,'h''*>QmN\V^lH@4RLNZ p|asZn@T+]^'Y:Hs.%' b@`h'Qؚv=rQ|:%}9noM =/3?LQq|9mndgwVmͮ_{5gUnbjk<1? ŗWgvL 8\mlq9\E/Ynԏkw"šeb|jiI8B)6o>[[qi<[m"ESzZH֊&HrԬT-2]b*p6 1؆TΚeZd2+yC~?t(B5?Xba2@IX|Ot*<=rJ[ -g>c{mBU$Jnk4ŕL.ݔubf5[Ì>+G.#f\k_aImNݐhf HNs#_ ,*dҠr]"<6 -*]>1=kNJ )iͼ"嵻fĵ"CL=w<SER^rwڐzh?AT|mr{sF6 TL}hŇ݊PUY"t!*x _ay|aKe)>"aVmUw}8]U[B`HքaU7݃ѡ7ķ*~eX 9,<؀ߤڶ^} $&T>mGұ= t`y~Y-8f3k6)s42A~Rr Jkܶc?I}0تZB\A4%>p hJ Ǩ]\ys b"xwwb .EWAI1ijXؖ.EpwU)yۜ, NxXe#^BT|TZKݏV*Į2qϊӍ%I7q_&)A :U@>M;D0=A\56Po6mOw>>uf=%0#C/'hgONPf&j0 /I"Ak^VZc袬hySN?sDW:LEIddQyp rlϲ0I6qb)jh{} ?\MP[t T{yéNXps+yQ 3-毉Lwf ʷ)HC+B #\)!](Ow|ys _9R=^Et1uE#hxr3gς<`c:e7 豠O? Ѐ66nXQǑ30ARs1~`:~Hp9`f*FFͧ8H?)۬$ji]%x:Yhɳ$IEdoeQBm@.[LL9P.;{qnC1a腼o[Mɜ*^2i 觧!E.3)Y%Sy y~1LY2ICtgsշoj󑀤f}%G(|mǁ;cX7EX.t:%+'յ5R,"H$LjTr&|Hw"YxI!i-ұgɐf2ytM(ʛ%!@r~K+h(2ѿXs8'nҭ|z L5Xh6h3A&J۽)zoriAi0xQyӛ.4J (^m4zw|͙/RI~`OnHi,änKCn0!_$r.j z\嵘 "5ZJ5 #<̜? {3 W'bB(}(vm f)^xbw_bK +cCnyZL00VHZfXPx^":Dưt N"w=0h\z~>sAE.^?n)6\{nXu3H%F+5[ mz'J뼼Ĭ/y.숬RA0qp*|V&[Bރ; Uj?6*\6P/91Y,2nmAcsj~eI2'z!_4DvJ FMwFTUmy#\c$*oƵ ߂ƔY):w2ʼnPRZ[~5qcFL Z*n vjiv0-"n@' qA_k67ieRYeXR;0`5bjPߋ }h=3VSiNrWđaykbZo8wHjw\0~چiHo+|Τ!x0e֦9U1U}9tsIe&M0 *FǽCK:ȇ!4sczRܪzi/ u%=WܪZ m`H~ ]cD*ҵψ#P:X0=} C8<"Z,. ÷8t] Q^UwDpGGaR現kngNu;<'CCP#$aN5 Cυ"=mdɋ%JPݙxS kx8NaMHyI-$HC JtT8vc$"#5p.DPƨJڜ4^srQ'To嗴JHɨ8wph7URGx&Sludt8v WbF'aqCw-n~_s h0Ĥ'Hb(JƉҝ$5?JC4?`/oC?;*7<#v\4L"ŷhHpy&œ)<% abAx4#Y= IْHlӁ s܈fC7s*[w6jl-?#"- `\&NYZWdmPs-k+Ԝ|d9T#P 2infBx§Mse/O]AaY|.n 2(iwUp'u#J|~{zA#$Qj '"9^6,Z GMY˾aXsbi)Lx Z(4%s{>R- G]0/ʹ>g/=6#\hY7Q38RAjСr(52JjRIYݘ#a>xRayXH "˲=//DM w;F5? Uۚ\ءUSPntQNǜ-Z]ER@ [#ۅ%  *⴮QLiyx<"? aϤA:߳gxVH#2`}`+`Z6 2H(ŽYsSDj兵IeèoP#Tk`H$QO7!=P.Gs.63ɠA HBKMzO&RC0Tl fW/!'*\QB=ƎZA׭[Eŗ5059zHW)ksE*V5l]eIfxv,,y/I4ZA}`w䞮X+u,0 MKoFz~kdMY˨@f$S.byg C-Y)+isܽS#VX+7*"V [Ỏ6ni:<] , {r ׬#["ʯ]֔kew+ExW\Ac"n'Zz_[4?-3>7{*үU TV!N4m0<ӟ18%Uͳi 7}o\}=-&ٓ^kpK I+"O1=6 H޳J[w4Ӝ>,3WKBVA>L'C, ;/pI$ :MJR[PDHT'6WL,apb]W(*Q&;("0,! 6sY`g~c\fF*'c)rde=ծ/P17jM:~zR. p.܎!6>3-?ϙXgB2ё)W ;c3\BV$\{ =O!jhm8~1sὺe6 (UMuQW6_PoiBfT͓k*nN<)J^bDW- n==0=P"隣<݁~sW@JӊE3ic=(&C0IKtHYJьÅd 8¤MdPK&*3ixZjC,G/)D?ջ21.zπ2̳eu=bZ}PozD*Tuzf dGV\T5,b2kB~{dU(Ǡ[hNYFH,uIz"[=֊Rx1Gk֞rRK]qh=[0Jy+ث]bZ`_-{>j8{Q,] }n UCTM*y.Ze #8u ?>`"ehD2yan֜p< 4].OkZV`oq`.'ѓM|׼*:<)4nGu^Zút+&)X\sSW純TXN%< Xh/KsB dMZGbܢC{4m{UL!8Ms8"CߢdUGaKvuڋz؀>:62m&Y#kuKЈtF<3qIglIP}(_)2R9)'g3xH0H #Ԧ.o&#3 ?uN3Vⱴġe`?b{RUn]'d;s4V%G#^ІX_)"XTdBώt]rK a1pq-8XitVpnv(ˀ[(VNدFD-`c%-,__ۮYL8%Lڃ`ا(qO[ e #XsWo9P; rrf{ ڕ# ǹB9ڧMĴt "2[MU7Ԏ@@|b GY> <XW1"קQPufQ ,9,T;ȦvVˏ.A {qZ:(,Q:'-T>̢'\dDQGZ]ؐRBHU7xHP7p=d\irFri3]b2 tM}Ú0"qV}XnHHkAA0|Sb)Bx!qp_sM\!* ,[FJґxҤ1X.q'@ 6 ŀAD (Lh} qA rɴ{ukZ糽q=LB"EIEgƃy&و{m?4u. 0[-1t\Nv#Žqş ˯j#롪~aeՊH;@O񃫽ZS 0"o7x"qfߝ,cE QZJԡC^7!$nR%!Wnm/Ap{{@^0[mdfx ZN:KͪwDT:J"Z=]$_2Fэb)+LybœX)i#R~u1mNhh.rY<"s8.VCXfB2n >"PZ} U ގvux< PC xڲv9!WRk`N"ǡ_ ̥M@; >?L$G/> 9pxw|IbaYsuF.I!LzUͮjkZVvmY[кa= Ea:M&99/OF9Vznd/FIߨ[P`~W|T % }_QDH?h,gХZ@K"PǦzEz*D/XyTm^$n.4 oarnI|̬~l mpsy)]6,T ^V"/ZqXc]߂1d7_|r2_z@nFPg?HҖGT|dL7gqD6DCOQ؈GREC,6DBA$&b,Fq;dNX,ɚ&h[(=<>sзynX5U\Ep1!f%J`dVnCS+a;;;G=I:|'pQjfrMG <0bpU.+!D{I1r{Pjj`qnNBxcM ,cPMc1ƀS6-f(QA@[`\{2mz)+YlUʵHyu7H.|:ziօ ^ tTrZ܄SIaQ/Q1ulMIRTY#ZiJW%]MWF6G}ww4K iN[=U!% #P W@Tq/ݵ)m=#xE]LTB#3@j>1/'9<:I(OѶL< Q7\iXD 7nT-(\󸜇HeuMl`G7ҦTF~|72H2"[+J[OaT%97=0ͯIgeT`mtb9 6Lvvun7;sb)J4F&_}q7QDwƒ9Lmh[$k]t饫 n1yoR;cH&87 ڒt7_ͤDx3NGbh5Q[ 'lP~x ?%td8G%D)/UHMZ@ lr5h ThO~UCtBzB/zT(lW>Sζ $(Mn*EE!UqQd Ue/v+f|D|cY}JnW4L݁{&< +_}e e@,ʁY~s?hn=)SB0&w ^ڃ!Q9.& ,vX #P%j.g'epCh,P*k'~#;, FÏeQ Sݤt7HF %&X'GK[ sx{}J Ԟ#qsp IՕ5ߦKb1+Š=n`?tg|+U,>!yDVA 4"ZhL|s1Ese}{I4..oXJ5%G"mٴ3rOX7.|‘D1{P1fC܃qTG MU5 zYfúNpzʓbQbaïlmOrֈqIў/~0&#k+lz{ciVgUHV 9|=MD>X,V˞fKf!)`*GP-Nɵ mQNH\.'B$itV&!gU44Y__ ?5SOeaQ:sDUPmO;(r^kY^S@@g I$gPf(En;j&<^f$@?P~0Ѹ}N}ϐ7\amS`ێDq4Ĵr-@f!ğp`>Y++3{n,}0r-@M(WPV.ߨ-:~Ԃ1C=T΃->{aGsbɍ Dr 03Um`N`xCG +Z$Ni ( UpԹt`JѴwYP{t>OS.x[qӗ ǿз&Q{ ?l#>frҲdQNyL7=)exsYۮS {i  )nvA?[cGZAI@fE#]ʠ#)h5yިђJI[BCO{ ^?V;}hoxjJs_2F(~SESKIm,^,9J=pHz휣l/웼qbAEL'cvbLW~9nQb0INP+ 19hs:_$*M͙'~,Z͆Rީ?9Hb0,"3xKVk{y\)cM%Iȫ!XQ6?wtj~wE e3BH(ÉTd|2K<ݸJ9}Ù X7)r!=\XLŮ|>Y}yqoW{7 9eejUK YYעR&O/4bcN앆wmrj:BpqR}s5 RsZO85 S4A!M&R{HmpjP)n{z*Kry@|jM3NxjyE5YitT 'fSʣ K oe U'!Sѓ 0ǶPoŅY-4C!戛 x 46D!b<%CڙAO$#섻t֏jڥhJ )MfJƤgUqdxەZ^)͌@u a7M~t<{R۰Mi6`NŗҀ0dM˨uc 7$Ne6LVE9q3&5n[pC@5=Q(.Mh;~@70㻙LleqkĊNb^K) cڰz4y8lmr-%֨-RxD\9J [WŸlVl4npW }Azp8X)fmA@U%K|P *Y xǎfz'NۡAɧ΃>hdD!Ʒ0DLalޓs6e=vT=wEg|p>jSAߤn] *u DTAzIQ(}µ#@gmTSL9IJh{uWy`ֿ@I0լr3WbK2Q2(f.6~iaC>lGLNJMPR#qRdbUx!ا)k̨Yȡoc^BHB =@( #|=/:{^ P$Jeÿb^5'gռwrp=q ҟO<kzZ4GKezC\eJH!KL'M3gO4|h q2,Ss`ZVMu!a#nt=LA-n2e* y=/c`t;y‰!d9蹘mcx(S3tnm0L8J@u;3wlKXwT9VoƐ cY>]-)Y΍"buXɨ̗6*1G͖ RZT,=(G5j;$1[GU9Kѿm,ܜDzt a>k C3e'„Sj[/l[{We6&Uy9ȑ{3c#5ߟt㓎,J=d|kۏ+\z3fPMK#" $׎W7O\E,~7Ց0 ۤRZE k$^pCol&QVl Ɏ,bM_GkĢ,,̂튿Y3~J{( rq݈g"+M[;@cl. lLӳE2Y9 9!Veze\30>$=*_ѳ+Xs1CA]יFU}]2/JT}-#[q]Wf%ڰ'\,V.p*o*챹ZCc}O> @{,QD_D]eQE9ΌWf^{(<Ў{ W=jl0>&XO/| bm(^ȱvץX.I8I5݆yijDNY$G =!!0nq6@HeƶnDDAzz *:# JbI-R}2?D~LĻG#)v$8|).f~ V/qL2]p ^[j=ӠxLbUyIn8^cF^JN%0a5boLv"K+w7#]QPI5+8/&%b:cݞ46NqFCi!pʔS me5j Te@kI$"eR% ]crRPR3u-}tRa }PwO]`=c; /;2gwu/Fp""lռF'ӝ۳EE˃<g0P_Us$f4; 4|?6kvq3'wVc,`r~"E7v e|cл/ʰNYOoY6Yp,Ax)0Lc.z U/,f@fO6̀z9>p ֧{–Q{jx2]!./__(aY5GA 醸[7"e,U'֓qTZX?޲+Y̓NWEBP9l*\40:g䛴آL`2+qLvFJqI6|º;C^pQDBej5v l Yp/e[YU[ӢXF]#GU/qV;TzoQ{[BM2'E?V[\)Bp6cNLeԊcuj'GNJ_4,TI} c @ f)!.TX}'a . oj_(ͷ G7$"*\4@HV-\>\e2t vmi%)9Y3x{Yȃoes+уˎ@&&^\E(P CKFIN Ȉݙ@*d,sC˨.wMnYbyE%K[SvIs֝`g45Y^j|M?'n./$Y>?jI? 5_Lxx`^ߓR}9N:g܊7E Ĵh1aʩ (l-n>:Еl6ڗ“E4frE2 Ȏ 6ok? ]BpU_]/\COoyS*=CŞ_o/hĥP#y8 E.Eyr(0Ewu7;+XP̧Ro"s3P}A[ކj+5JG`vJb5tgrsʦBW6 Mht}jА4vXR ޑ=~I+Rh TR ^@1a#KN󼐓Gp$ dwY"_цXDŽD;Z4,.?LB&-|W0M4sH~e4&СtáyBC.p7N3Ƒw&#<OD}_sjr8= ;m X1n.6 א:.oG,PbPME9 S's6șʕc/ ꬗I`d n D!GMś 5,j]A ![bePEqN9%;"?8!tݪTX6 4Yڐz4, U% m(V9he!k%%)d1ҪYʱi;=TSheT@Veh<̜6߇a"\"uJ͆:[8] RZթL =m2!*dҍq B#i"QJKXJp|ߢy\j0I9adt׹AL&3`$ѣ $\L΀[?1`T0;^7&"j-MhQC,p5PH\LeFw'0{{( H@C~Jg skBؽG-[uT'ϕ?(L-@*Sr:5YAH$ S9 c Ot E4U^rz \~IT R AWE?Z~0%}=*E%,e/߀?_|nE9p8 ei>Wߝ+'pͷ84]I!#[[J0D_hqIu0Kptd[w~QP@hZS5h?sj.d(iǣj⿴+c SA@}+O9C0V} ҈m*#d䇡POsNF8!Qk{8n?s)mE|pTq~r]ѨF\Yǥ9=>l)Ķ?vm,ڟvH/d|m l')2VhmPr^\5v+|b;*$6@x8MҗgM8bq|F[?_h2sk0@KsΫl^<c^㏏Cq67:'r"p/9$-aYC$?i:p-ENk >߭WHp̑r@*mhQNSW 'bY`'Ǚ4H-pK}zMxІ~}Y yvp=*d 5XW}Y9?XXc!>rOjr^moP'EA4+2'PK@Ptr,9$*?@vVYGKm& byG}A1Q ЦuBBzx" qd"E~y< %h9s<N j(Kx5Z@MkLUw+AD\9&U" vI bf F#@D~J.=EWۉr>s+-Ʉx`*| w=E:EE0cTBj&r.qk}^e4`w q2bx"+iglỉ1>S)1?CL?Ot~Q CӅ/.TJV)xtnh_`.Osf.&0ආs#9V("\1unr&GBaps`d[$ĬM656̌5B4Ihb"So.p`-[U`ԅ{0bqj!rވN<>:NtVpѰ}+U{Pifzs0Pk| #We)E "-'ƴy7Lj'e؎woxHcּ߂f49q#K.hۛZAWX/R,aAs8A [sy[s.s F=SHQ>!se6B"9Te4MD(x;pC_W5ݤ PTƴy;f) rpT>8&;T&HLt9拀gvsFgC䫑5/-mRn!ӠhIvx J _hAog ʻ;)Ru+yZh4\nYi*_C<rQG-\C#OZxnEt.GhJ‚ˆ=ҸF$`wfKQ kTO0R\ir\۹\9Qhg©gn05Nfk:,SŢ K\C#6*pCxPENCVD prL)c]|ɐ ˛{@.V^S)j}VLNZ{ܱ[>k;I링T[V7+J:h)&jvn=|.4 #_U]!geW { q!_t S<rlFS842 Q;3TIR?>׌d/*2n%]LfVĐG֎^qoyƖhrn.xtXA }2YQ}<>fM4z`\ų%4"`_>Be}F%o& VrAqޡd-4=#Fz(RRGlM\qyuT/,Ъqv;"#Ta<`8 vNY+tz]("#D9>utzjo 3=쓄ȷ}NHC:8%!꜅"CR1`괽ȸm]w0un&=.'ynғN*>' kpupsV6 ADyE^,7, ~|Q{nt .h'$ #>=4 y [~]˃0NUgfc iv`=/Rn z ]l3?}~d[)hERp3Q}C:aaN"K\to!M[зⴐR,dͯ7o$a#=Ұ<)Xwk{|Bz5Znz}us{ ZZN^aJ E=yj 5;"+tyRw skBK`Уzh֢ H*(VH8V%o C8d,J7v >;wG2 1xڪL֚P+Uj(?m:g mϥਡikH)l5csݛF#s#_u4g CQ!/wNiJ3g<4fb#rZgr'B0l} 0_|8`Hh_бGhq|dV2*pᶰ/@(ơ"')q+K}Jz{XɜC2R uQD^rd9v3cL5@-+iZ')Z*i =?v Z"5ZPK'\(Q'-;xdIb,Pi+F)8|:X((`/TU@ Zc _ ! (,FaS !utҋSS ?B4 AkZL8L2Kϴ貥hD6ħŊ%zJ{Z*WN: u D/~gXk$.;0[(E-&=Jp?e-1i.]ԐC,L[j;i4&#s;^}}!0.(4 &zڰ?P $mLѻ }Z~3]d(0r |DU #Wk:O5=#wob$T|w $YMW-mp֯ :m؀h75nZr:i|hIn?W@1"PAAp*fV+Y|@R:=[;iXhU3/4>Vɛ~vily в=~Ndl_Hmhxo(0K] /ʟb1 iWR G4}*М"Ԭ$f~\,CZ"˕v׻ڞǩe\E<[tS PJ\h$haxL\>XY!t>ozH#@G:;3B\S$$njoδh3-3e '˲D\ *1mlH@XO(ύkDE^\R,tB9lj;ZRmϷޅb>^cGJO!]KG:UzUyuB5r8PmRƯ C D(cևb:v}3ʛM=>2 ۀ|-wiMDFGJᖉY\2j#g2D(M40ȮpdWLVlye:QZKO^.ܽ͝WVJgmSRhB?<2 TYTf,8~ŸM J5̧/z{GIl1ۗ^d-ZĄw2TЄP!-bZX`:9f%xhT#6béu:M|Xz\ ߋ)Xl,pc+v3UB AIvTtA}dTqғ$g?4=JQA<nYue#ژ"-5+ip^{cW͙*#[vQ!sSb10m~mBWj\'[Qw }FyC1:(C'#7MG CZD+7s@x /&oTc! pLžb8`*am&}Urt?L/?R+v"?7 MMR&a$DIF03̨H6zDX^T=#=!yk`\zvWt/8(154䞘x}]>۞X R73!l領6' zglC) b҇gl[*k{JAqn+S[N0^{@:m&E!p^ W쑺0g/1_u +o~k$-ݦ$jmBQSpJ6rn!mWBvq-:"- Ix+"cF ];hz6p?m:RCqx$mtw9|r'&6<2I<|i8e/Zagu᣶-(O;>wD@,(^TR N˧:PTE$@>̷)W(&8ng]cr!zأyTDH7eh憔Q+\&v5-7t/KNN=Fi_mv)j\-~n剣3wqmHlq-)J|$)Vo6/ld74ll= [iO`v}ppC!C@xK۔չ+= \hnt3֎+ U}4o.?֞+1n`J||/}Sw rŐ:VeH$#+S9W=CosrMSzU2@@h^_$Qŀe ܺ灯|ge*q,2Q;ՑB'MbĞ7G$JYThϛ<\=Daiv z8RY jre9&H0K_iKot&=3@Ut>;TL/ I J8wMÌ˺QD9b +3&Kn ۟W'@e˗n=;*wz 1?c(){RE+Cl ]E3܊gePQsLk40հ|I3ɧaۊOUvxpIfVJIM9Er&%/@h$YH/]:c#6ifdT\z㞉s`~ȓQ|JkU{zn8Vx(Kyp@ܡuNNGs4$LP`@B7Y˂_![mh| _e6/c3vC!x"L|S\bň,[J Edͫs- :$$ hhں_Bܜ&1 6rb5MIm>}̥!JuU}q aw9XYEW%]Hy\ d+lK1w9b#2rK6}ˎFI^Ggs/`GʕNpLع/P:Gc#/B$&Ȭ[=\3uN W2Xa{ $^] t\ K!ۏQZ_AwF֚:PF"8opd,YOTS+3˾`,"BNUUnBa1}:hUfd~:azcPD^SOJp*U[dV⡲#.y fS,9/w3GrߪW,f}F~8^ #x3`@Cܽ۔U!_G>ܢ֏KbS?V҈l$39.ԟ,ɣS37(7. Qا`{⃵/ Wȼeݥ7ZoT,4\!:J8 牗-5O{&"5wᯉu@d: <1U_8l "ױh\^2, Xc!'n@L[ zfxulsEαb[9jg)Tf (YO]dq&4wjGJ8]MP-jhvBpR dbgPGzES0KzӔ_r͓UC9[Çհǽf$DMPYʳXy[ 8e+\ cuo@S9T U;f7x|;5[J:WsF?{; L$оڢ/F X;%qQ1>3@NŽfLq$ErE""HMg؏^B?;G+g;_﷑.d #)RͿgO錹W̱ME R)[q27-(@vPٟ=񨰙Q +"0.ȳ9,my~ ?NCs7BCz@w6Ra%Jag5%!` %e)zgiN!f$zwԋ,S68{ ;`- A2Sq4sRd-j4HޘUjB=!tYދ'טxvUqQ?.;U yiiǏ@W?Jb\6a' jI)+[?īnA6"\æ/޽yt &_.Eb?äo "u6s5Bؓ5xsFx |@-{FfN w=cCdh.DlEX ?iZ ǫ~uƺaC\ ~ +q%ȶ3K2_s91D1*/ie-d&TPk`ʥ%pEO> 7\97&P#Ĵ}<$F>i~ZnoZ ]nQߪZ'u&=(hVJcSY@ itϼƐ.$-Mil ѭB 력g$|UIl0O(WޜِRW? Q/Qq !0ALs8Pӿo+8BqM[&nSA 7t'"wdX#b쐁ۣ#pL?`ǚ`5g=EaJU7wB-Α;@e <8 RqK}=Xڊ%]Yc뾳I4gW(_o讛w۵'&@ą\OB[%Ƚ [@ZCZ荩9C'_(Gq[j%7{f^),8|a2-.w:F-%>_[SIrD0lME-i~Γc[fH!pvq.@%n~ 񣺎)zRDt"«剥jKW9n#ucyfb'QT'OҀ?ГM-ȘS=r9\rwTEbgL2>6Ёta+<⁐I-3sG1M3hK+tpf̫%IVO\-UA3Rv3zcW#@didQRna649!(Es UR#D_9%}rΕ:]58H!$AdDbLȬT +<2۩GXO^Ty o&}L Rh?'}ip宰lpio&΍fFm UcM5>dG1^ G:W ]8ΰ>g@*`DouFT*(*iȔ XC) p~}@,Ը;F;*J7l5?1 㒓qJetS!w0$^ȑ_6.ߟ{*:'A݌䐌DUiAO+K{(#nnRB ! _+)(aw.34|3@ElaJ D-㺑jU|X.j䰏1Y-Dс|C7ſOA{-wncQ[0o׮^p@]ʙ6i5x_Yl$`KV کѫx]/]"rYwOb%y]I)73\JcX+ mprO/X5*w?PĨGmo: N]=(Kx`Ĩ.8Yp%2޾!! * uvr Z&Aۏ+Ue[tˆ='fa?Jd6kv 2ҡfQ;+@P.f65ю=[N5.#Ȥw4oҥ~V;~ $DR -EsgFg~\!zm=Sv:=.Ea43| Q7wJWL,YV8Ɠ)+ Qn3+Y 26hmh@{uDt qE^Fw6\*{K/q ywf)Ya+q7`*Wnmt|rf)4-ePh9M^TkpdIGaw5̾ͮ!$k$@?A#;~p0=ބ_ l&^ jr'.LySP8@DY1tac,<a)T!OqMu"]on!J0o3xD)ꁩڮAS>SRk3g|TD{Zv,{ (ݦGHRs7kH# z7;5Qַf` `BTD`dd[ο6`q8#ё yr%DxyYwqOOo򀮼lG7TrIj*u#Ev 7cܗ$/@RԽydjpCAEJUP {% oy8>W޾dE4vZ\]rEםл@ uyK T->o ^ܤǻ =@$~ԧʖ͹n?P۟NmϴG'ܹQ $hg>õ9&Yc``UqB}-G^I0Tx`=DC\[ Ѐ靡eqѰi\bDmǁ;xY&E%ߎ3 7w"fETHnpwp ?-^2nP eP.xk"2(/یjFx3C Xq`dD (ݫ)a( yJ~6Sx̓@MNfYQŮcT2g"ycB}V½=i TRJe[_l!6oY^> < uJMvs@@.>\>q1r{u_D1;fܿ][9x!&ѐa;0v7z$bx@u8FePw&an6t#GFȕjeͫ]fŲ35O?310EUr5 a\S儀rZm+ԉ=$~c8P~5tY OXi돿@mTg a { //'*Iqٮ˓7M=tTlr |g1bBe+'s7,NO1ϛǘùBlbM%J%˃@#).m~VJ:GL =[_[>\64v UE::!_V.opjUL\dg¬I9˰dL`aEDe Uy1/nEwR9}>v|ht W6Z-"&" d9fd6eށۭ{a(+YÕ~Dl}P-U= g{Rr8gi:ln^@Z5iL8S{V27C~$뢢;c)|fI ,bm '2s %eO@<68❅! .YkG:R*A'KX6;RxE,ǝc'h꧒:ԩW),ݹZWhmc*15RlfqelyDga}ku« [u4p(9-B$~Y%d 7;gHl k#I#/uKw!KeDq=G^`an#/ݲ)w]M<#À_<0KU9Uu!>5`=E;qоZV!T|P΢AԕQ{.LXS5! QkO%|ȟo$] ZQ,pL~\ҫ#2ɿ Z'2!Nuʊ]&.P 35b -l)ŽXJKv!Eā̀=lmbLT%/T ,+x|PkqbIN; àl< 6>61p~ec##hj|ݳt+Λڢǒu4, MM?vr%~jatAq0y}D6/vВ"d$2Dkm4;_~DZ GTG$Q$7J'\+*euwMDSd P*u"|wr;rڜ[iAA@-*=͟$j! +Wh{D.H(b(3 p\s0O%ĺWh? ObBG ('d$.B:ִ'e )X'0E56aWgذy0\1()F?rw,tr"6e~m„fK!^R.ݙZ|r;2n.njZQWY(m Cide]0Q+c( -悰:".](|r꿨"gMJ\Z)M~%ܠjHA9ࣄb/Z&ͶDAØ pf) M3 ON: v~?)dR.~xVKa`J z IQ\:} T27"j H5DPq@*̫}]F ^< 4+Q% ?҈#{2jUsbD:bMNYbqyNJ cz;&dwc =Q>Ҙ ́gAb^W/9mوh۷CK9̬g?9!/2:ύ9{x (Jz"Й"Y.sm}D<>淄M!-D|HzYM`%c-ָIOF3J*(_ 0î [hw~y!1<!VMEWtU8̗3WtQ%dڋ(üQlA2Pv1niD( hYy=Aǖ0ƀ:V%l;ds'CgQwԨ>POۀF2q,sҌfkKxbCFfR@:%6כ]{a 37Hc&PKAJtI`2̋cJ#:oGz{@*zm࣌(m,R'C]׎E3$O63?=&T(wJn::ϙ_"ם#Zq<19VB}AX5XD!|)%S!%l]A3d'&j 3QԀlų=":𥌩ݣ" z "eo{ikީ?6F:v M>US`!H?[lעB"rIr/̜oFO!;(.7IW7^@Dž=C-?n!1[*lm3<1B01ްw`&)@(cuƂsVb [ȇ=rsb ,CF2lZX ̘SwwTi!)x~ˏOU;C:xcdEZ}̫;g_K {4@7 $ cD)/ Bh<,@vvYt"ڛOnsJ5-AMjtd%+,/[P6~^}KحCEJO]JD)w8 i\%*NW%)Q+de1"oOf ~P}=!+@ߏNO{Hvn%<ǽadyŘm|,&.VXqA6$2/fL3>.Ytr%TS*mx*H-iӱ3Ċ/i`'t\'PޒPXHng.oG`],2!NI>1l€F^`< vM@?>0bNCGzghMDMAms-lr{ @Zۨ^Lr̃*\E7:1`'퉒\sV7pțq;`[`o4leYgrQ+#jgհk,rnN;2pATyox%f*EM(0sۆO#`|^Z8)׈ɞƄl)wHqti-X[C|E Uck#J P lb%a^al8B -$~wpnw܂FFld@*/&F5&E|)DcޗV}X:C]GŶRV?"&q]3'G-*0C+Ii{S D|\lPn6mĊdJtS5$Ք^`pf4ME<}nR~Lt$gL;"GPwZ/%u rxeҿ>pZY3S(N)8hy9_ wkpTrCEaZ9mLQ3JIٕ{:¸Leyd<( 0~kp>LsYMIrqf HPA1_!9*|h ~ L8X:ݥuFDKMt(jԍugU3P9&@%hWm  } ._W|q1ĭd]L> fز\h|sYi+GPvO'4~(W oh ʝTs L K f%U,"'Ҿ-()x >r% e`,Mk^) /k/!8J)lVQ3S!gg &P85[.!H6ʑߐ2q+-Xm5iVt- IefuW3T )#0Kr/ m|1Y_2O\ۣI'ӌenByDefн!et(ECYݞzzoJ׍b>1 ٞKr~Kot^`L(/Tn017w pH'37iRA‰KH{~*bɫeP:)B4PRDYb9Ɲ_rryAb;ϵxj^jn'8~yW;X=R`'WsEho%.l.~bT8KJ~ bikDOWhsY7r R> 2_GB͉ o D_eɮjtQykUPF?,f{茨!BL{P_ Kfł1E ,^  wq(}֎Mg)v>6"&bZv6Wm3rfU3Y4cä (dTֳM` ldJipGڦ {Ms|Y]BG5˙I5ʼX3bwF,#&NڵZu CQ4"QX|$6[fC>SN;[1Jם1q UE1JXh2;0tU J-82sD醺"ň6uD}s&x&fg-D&=$ حb)P ȏ\Jj#_#hL6AT|^rmeqy~ hnn@q1C7#ҖIG xf0 '\qW N! ӯ+ rtyMs~B=XeX&֒^HMBh8%w|ip$ƛQjE>/l@ 5YER:"uju,̘oX3/1g~Ϫ/@̈f,q^mV%W#,mjƕʃC bS@Ɔpb b;,I /+Qʟp )$kETX+5}vhtqO6qo hZ!(vfc"NIzL֬*3l|`MX+Cu*QоPF}d0D6BMNQ{B\|2y?"0zXGzha]w ֣N:FysnQ۬՜aXOG\]UlƵD)ؚZ+ClĬv_T,1~˽p|1! I$ )fs\\„TZwL >nZюň\%_K(RrT7@,z΁( C:z'ˮ7 Ox?>A][p2"ѴÛҳZ\}Oim<\i^W~PZZߔGOPa_5\3ite-\If @#oZӸJ%sjz c"!=JSkmƆbCȈvLK,nncK_SrHe{ c~Xe>`Pb  (LV֜hot ~J'>%P}x\~Y%p{@MANXǓ* 2֖xI!m;ʄ@ BItYhW;-{Y\}/A%o2yבVl8מm/ 9xI,v:h >fh!SbU{|x {إPr9@raNnywln<ir,//O\fKx̦_M<$> 53B1Qݑпpj3G=܎9C N%[J !U~:{I/>']|3Y;zF߰Gܬ(%o q!^飉"ЊIW{*RUC>YEX3l|^tl c V f m~B im{yk=qQ=M6m쮁oLzMfv4(cq? N؝:`I+=);o4&GBЪփv[Kf6;'Uip+26,X΀;w5tVTݳCk{ǶfȰ0# hDgF8QEZ;%zAܮ TK@O%/_Xq>X5Vv[uW#F8BQQ,+eŵ9'Zĩߨ=n&wYA/WZRoA0>ըf'ljb> @pVԥ'fIy9^Zְ#LԘ{] QF0&Uȫ\drqP'Ñ4~OG4[9:$܄(2 <+=5XYpgȸoKKذB=P@wmB%M^Uh.k4/J0#1vV9Aza.wr,o"8r5J #9iL4\}āw,|>K&AT"i`T'و\IG<;ly-w&翚ІYoUA>P~]c7OSAފR0аHw ;M)b=yNށXz7d"g$5ǡcǂf!, Jw NR$Ak¦Rà/2w5NfA6֊/L0[\#ڳŴ') Dlɨ"W:tʈALP`f[\5edǀQ7J|nsi ~Yݧiit!G0:>?t">TFKUh-歳cd 93[p_!yZ0j,WPf\i?#6JHzɷm*$_x$)n Js#XƄZ#Fe`oF41DМV%Mm"o!8TRoQL#\c`mˈ+Էz,Ulxo/`Q 9nQsWf*ecjRFT=*.3۠"}!\.43K9CKz"YTY9h "RO^d:=tv]˴ߒb+ o ;YZU?5j,B8 aa*u&tէtHS49{? ƭo f"ϼhM~ݵ-hf&j<1Jrܖ>h1oLѽhW8!Y塚b`#4l` lIPL-U"C0i/2A&(EvpWJza wp|굎sGX|XK!Cn.ȯyIn: WmC*x+ EC wlJ^7*sBx4 Lۃz$8Y3(#ɞ1` DMfTE|OѠ5Mc3bƄUގ h)X, h?EG5\Yδͨ^|f\q:>m6Kq$&y^ةռ()Q6zu |ו<9!Zd|M2 !A>$eB)3}B4dC3BI6UeԆ>#͂p2:m$h:r*EcuV"bZ@'qV1;N k_hȬe|vo𔎥mHvw U<>ۓYuǩd槊vƕҊ&qG/ cȩ΀K᠎lDsHބ8pJe0TJ>:&_:r[-'m=vb3oCnFKK2jq^0ڭpX)4iƐ=!RX5V \4q>8K_9- OI 8Ώ];R1E1֩_sr%oqT'Z3 _ECyD'`)7M_K )̦ӺTC#8Ҫdfsp%)/Nv):p}ٴ7H:g*!lOiʇWoTTn#pp٠Қ7Lѽ3M<1D^dqs\%%' sMBڣC;VNp5LAW NEx(ɇaj.F@M0r?w)wގW˪QlRxp #`]$9=d858nJno0A` 1&m r'#ڊ\]YF|R#MYwtnΌӂMLsFnD^@c# D/=<d5 vR'I.5c ~Hf~ذNLVWz= ɪ][ʶW;W _, rW9bµol["Mgp"FDIlF4=m =$Kr)FMO%ZhB3LNUe¹-a԰ Ÿஸr|ф`h uvsui}x3IvAu+9>"8ı:t78; $S@Oٻ`y? GY2I@>,l(DskFⰡq#"/A$p(`XVbkg@5 -#Z?#񋛬׋p۪w^@T5hs0 K=FnZcUl~v6`nnthD<WSIU]'1u v6F+-19Vai6{ c$HǴ3 {OzP|!ݶfJ[ ]f/ӭJj Wl齤y]L|z8JpkVS !Q98"X'J@z^ s{_;IDN`>Ï D(c/i z3O#^F05mFd0Hʊ n>Εs1O_'A"Kht@u#5B{P\ xKhV bRC ڏ%C]7 & /*d|^=#%s(bjƃYg5`*hٚ|gsIVSH= IB}A1ޙw*Yz{#el,P\ٻ2NJ|MρUR-q[R^3=1@. Fe^1Pu_g]0" !8_gj@_dF~m JӸ_jM&P9SÿC_>fJ{Z.d!&ȀIYhef+]h/dS9+:V~d[ٷ[k+V]|YH,ꬻ:x c"g.3$_IU z>!s!K{O _n$]B,cՍ, KJ(Br:`׷Ndnl,z_* 5![jeɵvh- 5Z%(N^~]PP]M"+s >M'7R `VhÏUZ }eUމaqT.[2ScjIphh X[Bš;CW=lz!ߍr]9XQ;.K LW\rj*$$0R &wyNs VkL,xDHyLL Cў'Ӊ+~vvLJr0S&\S',21Aa'X?Y>[>n~4%&9@~q5[_3|0Tv;^QHjȂÝ(NLqHl"OJfkyX(2RVPrb*6&:%0 й)YAcqJD}<<(ʼu3]9CY^X/+czjw@*4mGlO$P]?,&y0t߄$SabZRPA.[̎&d2鍬rѧ OqĢRT6d"5Z+g\7HIr&@|kػRAcb+"dfݨ*m) }H(=E+Al 52]jKkْ$OZ[BZPv}@ "Lq)x~$u<͉[y1\/m̬.jb([aM=HK%tj:?a;GaYWb%5F-h ?gْUMgn~$\JT! 䚉뤳+scg$B%3#BSdة+,&ȥ&3@va@yMVA*uFDt+0Dvŷ[-{ }ŭ; *6`bd}Ȟo,H1 +5qIXɃ`ٙ>mȡ:  PU!}LjBJCsl̸F2Jy4 ӰsjzB^Uї7INFXB()dOp{@FN4EwL# Zjn'uGx. [HPwk^ Cy(*ձ,QR<\*#d:~>v#RypJ S$s߼-_n]v;%C M##s bFN7.g  <@RX'O`r7)]cK٬1 38FƧb2D. 2jm(0O׍:k淆Ċ*#t1z*ssj-k|ƥLb't)y7$KMLcTb;:ч.^'m Tn4n RL:8> `@dH]ERX}}->QC3X*Ux0mtB#h,np߄h1i[1ƞVElF_j᪛Zc=狍6 +IFJKE od+@ ms؝|}ELITO+2tTvjd1 Akn㭟^*jP%Ţǒ̎i`:r[2ӒmLbQ{\]BgwUO p x?!WRH%, ;\,`@f >E;niYV8lOҡƴ]DB?6]"8Tz\|Ƞg 8t( f:SSIvpf)&:^wʫ.@ l &=U8&^#z "-7zmX"֡0&yr ꜳq6ZZE"'d~ $pMVLrԽζ=|AÇ+ ?'N{sٹh?@F#8\C,7n8IRm  rj"P!cfqD8ܑ{2;) q^Co_?PNH=ä?FV:Ap>_nԧPM'd㻡r9HD:czP.d@\S+Ӥِe{ BB8ykV81 ҜN`fos"FK@m@Ap Z=;8=SOXduMN} qkղ iBR:olÃQcًһ4~%MzfuԸy[Fy.o۩w)Гnek&K*Fn~þ%@nT[ ]yZ3%QHezPBӠi_SQ{$n/#+?"Fw.7Br˩d򁭼8w8Im ^=aϽO+d-J@LoEBa˄r++!gsIT ) dLc SQ.c9"H&l#2Kqb^Fo;J$n.ZVE9EKwe{{kQȩG7dsN߰poέ1\ aR-@RzSӄڠQdf oNρ-4tߋLCWU1ws{KSbSSKHliqt닸N~H 5aMS^oƏ#O/WiW)FSUࡇ9n,뽴lM/)_yw!~Tz`6bB/4+o8 u=MO.]a SX2`|8eX$R=aYpl^Y<61ksD29D2ԙvûZHX I+lFjn8xSv6&4gp}ӟ\WY'u$KZ=^H,|/*jQY{dSJ} hw;Z'cS_:eb!em D$?ƟPůg!L|2Ȇ/R}ļ9dT,o)_W1Ã{_VĥD+xXʾ~Y/Ȩۆ~֕KGugyҬ>HEhTOnvd遶x$%U$ pۅ;ơ'zbXCP`M:FtmܐBJ~.-(na1g:pLD~0tB>VFE8hfq\˫Y{6i*#f+-%2RCữ),_"ܚcoY}۟޾("#>4u8*q"N3kU!s::xgp^ Á슄e+Mo~.Ȯ|̩ 'N LyrV7!2m ڇC x%Dl~#]>aԎĬ3M垣%t]NwGab@"5&~h1CܰŸkȍ:EWqsRxCp65*Mо6pf׮ۦ:adDIe0&D<$]c0zRq?{'+9Ĭ1nG4T5yEiHAka"2 d>u&qJɸ{)FG#m).E&fBy&GJQ[*ب P "w &t`~H#u&RꋎHz3Ao.<m$&!(Onm`V,]|,r"g6n칏}M}VA#uCW>3mS__r-͓91skTv㢢jH G[?7 B$?e4dbﭧ.8)6XNAR 90ϬkGC=~: 2c9Mu°JR<'Tr~2-Dzݨ=a4.xC2^4Xy"YiIqFA_ $ʈ 6/]P7WU$?WWtX@ 7L'tIɀ+pVi,u>*Qrc]˕c% @'t.+K!IQ0uQn4ßEk{ۛY>=EiF5E)W>XEٕb] lee@݋_C$q[fu:rz L`ƌ 4o>Dk> ?3 2XK])w%2!qz?]r)ps.M4;l ~ǨA_f3[ KZ񁟭^ ֙P078_q0~g1q0!d{z@I .4)=ņឞy_u:{ʕ7  rBhyȖ48hKf<\yF:iU~D-IFPG׈ l#8i\_$lP% [q̊o~\m[wBkmDh]Ǡ#`e s/kAoY4ȍ#^,sLR}KsŭKYq()CH{Rݴw(΂lT^b!8U iJgPb6~jE(ae'Ǩ۟GW'(~fg!8S,sM 붨NN9T8B!º XCu&#T_-rVt~U0N;(lB aoP8AUxրc 0Da <ص?y՘,%a1CSAFoWU擩TP9/ `<=YĘ̍OUat޾UtOؐB<$-`-s.b~'=.JLaZ=HYPdf&YÎ"ռJ͉$A"1`DL+"8@R*h14:>pҠ2+\xOWg4?Ւt-E6$sl rsX $hO2 ;D ǝ넡|14[|Y"CFoE4bw am^ }~3ބ Mׇ?QrK9bڀa m?u*&Z/t<Y0td^|OwęT;E|E$l=)@Û5tGtc8jZ>@|~ z=vlK ׽3VE#TU%c ]60#.o/=+gٕU/ݕ /^jgu1giwMaq.D6r9kwIRs9ODRwJ[f10%{9#d™U{(tki.'݉Xy7kטئ?j"@/E"|$Jx )!cζ$͸N#`E%! 2B$-[02 A4p8TLE MK%sQ @_׶ Єx.f/ZEOz'mR׾# y>gXFh`"351l)xO>e[DA@b5DQD$i8ؚ'e%λ זlqDd*GAvg•+]X%OzC~ $?K8+Ra'(]ƄUd}Z Rf$un< >绎ˢ)YHW 5?4n}\@U$ugd,Q_JvRC8\U:I/-]]~ J[%OEM^J!-BV1|v`Oe2 #k'gkIgbNLU\Gf)g!sr(lGВ@>&} 6yA_ogˉ53yڥ)3S+<萀""0dvg QmclO")BIzTZ NA1s*G%sRܨQ tb.5tfkR*eU/6#lw| p57_*|FH:ѽwQ/4Ypnȑ=,O9͇d5+r'~QEܴ%!0AUGs66ۇVkAFl~w:QAͩm)ox^>1HK;D-a\XUDƳ F1sԪlWWyoSE} MI=ϛǂm2 O|l(S0'mx8ŋPd}t $wDHCEVMt;tx7SYfĆIqe0;m qSjŘ@vjRqhow_4nQR[OŴʽ\q g0p6PfA,^ūDs 8vID+TNETѴp P?k1.FiL 6[#ScawVI9|?]L)뎎\r ? -'@!c IzJt6"O.O"dsKG]=*_YG0iZ2ăY"ċ}Ӹe|r Ya3.'{}oAXzEPF_g}};}憫Y}F)U~U(k^dP 5ˣx!+63>_Tn3oJk45xaL"5:3llUE}uHxޖ>8aTx| mEbr*S'G%},xn=fg VGOldĮ;ױ"܎fLZfjNcPj\iŮTwTB!-u~dt(EzCAiA [loxޒlMT33W .|o~0z:ȣM#g7/jeT"b0ޔkٙq~sim3ظ/Yo9\ɽ3ˋv∝lVkg*p.[nQeﲕ7{[\{T-ֆPb;q,呍DƑo>P}s>2] L`>{B{bK4x׭XHsVa uFr]' 2 P kwc̺A=C3)b8e߬<6.s{ޑul+]W?&k{,4F̀@X1 Y_ݛ7lz=ٸ>7+AvdaPv[qs]:RqMMx߿ 8>04eEhnP-S SŒDVh<ަw;.gT' ԥTZ!Q/ᾃ@vȆ{mKGX#D,=iQ`%8omĉÓ6$/&9y$a5ιAKaY;7׋0 EQD,AT.$Z%i䄛N/wYKP6/XWW/xj/ڙk!ē- ?J"}5H i2)6[+ kdcSsmHp@\ߊG׭/J?I 㰈]ݭr1wHfN;|ӨvցW"Tp"#fӉ;[LbtFιmR9@A,^'nCx̫3S>«ب?dQ COt#" h\PeBWӎR-rL!? {"WQV 5o^{hCHS;/%yQƅFGBnAfjH҆gKWsC&\RCN5ck#yLvNdcǘ!?[ Bj]PI$i;MZK}F.J9|`DlhѽWZS tF #&XTϺ><^P!:Ib_X3peF^32\.gʹD[rh P) }}USdˆU}k$:0|<gEțfhQ9< PUeǢswےR4G `iOT0eS~YشBѣU11͠2y9t ?S--6 zkPpwТh}[N/" o/95#or/]R.~·J&|@Œ:@ >}΃FrK#i㷳0Jk"2s{Fv̹L rzuf07_QoIج3{]j-b*lI(eEծT=nMX*hB?s_b}@N 稱Ŵ0=)Fb4 jb ΋hotAG;i( =,V=X 9sr6E@RgokT8+Ҁ4(Ub/A F /idd)fۃ̕Bk369I+1vMM҆f MN{yhyfzӕ\al<j-Y3'|_] ڶU.>"0*RP[6%` UO'(RPB5mH]+Yk.H]~L_CD=9U`kX`~-v&*rWXk͊@t8ۨ5gGT GH4iDT7I||cB)*ȥNγiLSڌ.EruxN[сM R5Ukzأ6NWgɻCNÇfSiDE^ VV :Z1wf(d1`/Y0wDAKئ' ;ޮfc\֎$+ȲQ9եqP0Wj"9}(/~n϶!0%2K-\;R"\la[ѼItf:C ">l[ W8yR}H%蹦.TkƤg,sksmVV6>~=9wPMviH3nN,ca'"VWp }| c$$SbT6جl6\e"k Qi3/.1S* ήƐ;{cߠp;ӑw/wyݰA(Q{sJ>΂߯TG!3AN'% R(&C>{nx!%!M?XqB1bvݺNH3pU8)4)ocY99?ds,ꍱf*s@Ƹ;ah7M >n|īnAfo8ej7b*q]<|NNdsI,,9cW{2 Pb/:86 ڲ=$8^)nbBjB?ΐxIy oh[(ځ7gqm^γE^Ba* ]mڛ"{;7deQ=Շ24XtZ!^d5 ?MsܐB1ȿhwSʝ6 C^3ZOFŶ jY99/v<(> .Wj$9oe$-oA>D#V1 * //b D|'ei];!}+`,`L^n.'8O"(K|a`j%V!),nKg;JH/w `~9>d:Aڱbl"j9SoH3mTF|GvO= ա+2){l_Ltߙ Tm张)`Jg +<OY8Rf|\Tcj|f[`ݒzVE Kalr\ ;['jP瓝k>:Fe=Q|^ \=f<c+ h8-#`[#k2ao`Jk`R>p%|3ky瞗˝ڮ)ֳl鱿iٟGW6bYrה"g!5Dz{I|bRdE:X]ִ ^2mA)$/D"E0%' !MQv5ʓO>zrM딸f0sE1F׼/Sv{A #M&`ѯRX'CӚ܄]{J.v*. yd%q|zVuU!O `dՖ@8?쀯e(+ h;(w7_ϡrwaĜI0jyC 5 cf}m̐ Y&yeB -a{c@CJTɝuުN)'Į>S>?pMvQ@~ .NV7$aYcRo2k[\m&@XO:gϵ`k42`uH?"mN`&%UϓHFNZK߲ 7$8#gQ2K '61%j wt oiS%@<(B~ĦkQL*oh;1KQMLi9De>i&Q8TAjWnFΝm`(L5~(sO!4=-0:[**.,'Bͯ9I˥WٚӼ_sR9M]1Yҍz Ԧ敕~V%h }~m'&ao)}Nd,OȮZ^dT 8nU%AoC=zfIgD.eR ȢMى%y2E5\E}%m+J?ဦD5d3m4[l5Rg;3Ak^]rK "Ҵϋ^,w97)҄[5WY-@9"˟f"q̠&Z Oo +yL>Vd+mtP]~e:`q؋]ao·䛍q% ;X"=K*}/˅$atFbGVa 2#\?tH!۴pUigp,(GOhYu@@1H+ ֮{\^C$?r(hM_к PuPɈ 8+u)y=hĒѝ(@U4>cvls)ؐc-ӠFfܩY|iC vj-Ѥ#+Rzb&}Q$ƛiqyo;{=rId0[N4dcC:\ l9 ݲ?< #Q:0WɌHEy6߲RiCfO~́D`]QoRb"&7uN*E oT{a08@C/'{EYz&Y75iLlvNZ/n?Qku qtUA9ǰ`0/5PsC`d* ${XSsND; ~#ʱEO .EN} SId_\h1*, ` 8ؕmn@T$e qb">{]6^Bvp=VHn)jz*Bz1d<ʹJ>`_67w簩P>Ymq ~wo\taTVc0;;c`,V?Jؽ&m2,~C.lK/ifs|_Ǐ*::VR\a`J6g rrM)C(ԸY ˆ 3T:eÝbT^I9Ǹs'-(1 JhBKuMFpߌ}It)85!e^![ˉݖͶU ?'ap\ 376tpDE2x5 7~!eйpv2B`8#vKӡ6Gbvp?* Iϳv #֝;( 1H`zm(ƌ_*c٠q\qxCT% EV،$$9G}$Q%-,D򌈳ݵoǏXUMĵqK&\ha8 WҴT% =bS9YUJ  0llRI2.B8Ӕ+Hcb%JC~̂{Uf\5dXF^! 5rB>^MM L"pFt(d ]ǾƄ IkxX=%X'kj>gUYD?5L&h zf%:Sm"965-@xJ)?F=Y(KoqKw4Vp #R2d5e9 FB3/k,u ]dx:xZ Emr¯r!ڝg2rv!H {@偎Y~=0m##>[ǮKZaNNI߾{I!\}8H'T?d3L!q׼Zo|eLO¯ .ZY/>e]qU6CU %DJjή1r h΀5tzs8 @s Њ^yAӲQAOzEzAɸdƀ_ DO)`,՘5d<X =YXݫ{SGw%|\2J)$ [sĪgkkN|oZV@*=|&bG'2G {wofE27Dy0ƒ]@^Zgct =:\>>csǽP;Z( ò|<\)^*\{O4N+Wb A$-׀o nMq\7/YN*]kfGEYA MA1Ai/[D)mcD@𹈑ڻcw憨GNOqRo[)?}̝ųת^妗c`kbk;k}sŽh ~2(PAc=[0ƅe^ >r #t-'Tf[uO{$ & LeHA$1bXծFH;cPt-FpUJ3tOdy[d9څ; ұxZXdܜ$ F4<l6**Ǹ8~M3)e o#/rC>TKܠB :Xbk EBHzށ `YŽpЍ[CyR@u06r"i^Cd5O_zVd1;Dc05;4S 1wt:9tDJ+gF=a{MCu6d$=m*e쁒545%_LXVNdB] O(nes%d v&|it~O)`%,wp^gvDK3dʓvTBp5xhzB(uZAB=L-IP0iT~LH=!j@jP*&f}Чl[_T}yp8e7ʪلh&Ѧ3YtjrSt77y|.mܚ] ƅun݆H㻑16+Ѫ-jЕqt:%Y"XQd\YiuTsA2*A}*Lb{޹(GmCM/D5Ywft +z{~4JZOU:h8̪=Y2^Jtyh}OHSO1֬H_cT˹ xޙ>0y(iM[aѥmWfqfQ.͋AQ `9|ނ NV YƨJ*?%>+% rV4@/a`bN2-M,Raو$PɃuLnSF*`,x?b2quEׯWבYٷ+R!x+ J>UPX#>6oйRX JӍX0@:p2R!jX>ï"? #Pv"$u&XO&/rvTߕQ+*jxDMŞ􃽇QE0/lI wd}n)lUK,F󝏯{=Nfe,M ;-/F!t;kĂc/ǫ rSI)s˔pQԺN%W8՞6(͎!e6_>KsX\p=&F8h5ʂ8+\PLTdkrKU0k!Zh^ְx0 nHQ6hp)rQDFk) 1WKwVS:`nGTbYh88X&z{6H 6Km+pfZ)ȓ [e'V\ /Ϧ9܁"JGܵYJd!^px35Sg-g1>^"/gLk:Vę*"Ѩ:\ǩZ廔=Tl.r܎M8sn?&ɶ:머"i6 uV3! KyavOH q[_ K򿛇¶FVscmhnܘi23̷:&c=s,њ̟ Ѹ -V{[-p H|m>= < ofxJVyqZS X l%Ahr$ypf/2J`8פDoԉEԘ dUǏ: {wk!)uzKb _YjZ< L/Q-2:q8G؂aOj\;.#>4gXjђ&:7 ߊ.߃ D#jMn"Oc+\eeyWsͯO&"[_E~fmq'[ɴ῵h\LL?;C@塰 *OOePjV H,D;4!7gnseਅ?WSF#ѕ~; GpK![^d`Zo g>m$%9Y7%PMhPdb?ZJۦ;ixc+>F'f2{">aKrRk&ċFS!BƳY%֑(d/(*A>a"n6ř$B%EA9-Ku mQn!zp{3}T^/Eq#ƙ뮹0vyqnsJ]'#ê ®wЗ  1bc5ʹ~M5=9T^JWZjsVûM U-=BXo~2B^e6/!q'};u;ghzkyˇ7 qC-L%E}2EE)8]1(52o?̿Q׊!͑'0 "%LkҝeC,.w\bHյԑf操>z'hv6&,E(fOFAu:' $+-\V!Oe 7- KᘠN)hGzfn~Xxp[Y mKP[4Aݽ^Liq+D" kU&|}٩8($*m3ss+<Iصo}H Jd訍.N+ijAUa?RJv( #sb' QU_r jɐ\`o/2)'oEt &o"j';Jn :1ˢsUؖ] lÂ!ztΘ>i.I%?RX'>n7PIՐ2r  (L|֗帐S-zaX❦<7Zu}δ J=x(}6NK{bNX&pi7keX^ 겜- Sp gzݏ m +1Ц:_.n rKB7D= I|5aE t` 4%_]ZTNT5I?OȟyAGEEU 2HrJ.RI'TRoe1~VO.1=D)#It{: 4;scbʺz uҦzYv+nZ2\!C34їPM5%tA/9MA*x^-b|캱;'&G8Qɠ2$٬U =|_Z:ňbJd8(1ᛆ⩺wyb_;xR Ԩ: C8A੤o:?H,O\5{ul`=Gd)BH1rp\g #c-:A3q Nl(YdzC#g !S@0Ńyy^#;:4ˀkdx}^JhidPA,C@?Q bt= $U!Ԅ&Az]cAR@8DYj+r(Q|PuLP\Q.} al0RO"XdV(_mIudJ(nRu ho8o>-a3BI9UˏwK,7ɡib0+O6U(jZ}օSN8rʆتK0;U/ Щ̄X:U:Z;5- v]UA#!h:-9Mom"&+<\#m#8#:|H]sdQ~4C"tmAUlfrZxys ^r, "6^j_z-V>fQXf՘̭ݶJ<#+̄#hb1 %GnXlMNۅP8AJۑOB\PvP+`?V(an8~DUq>(%&N$Sxs^uEWL'8`8Qm=l JWRo>{A>J?J䣝LYNĄkK&5~@ã,49}>i!c' sHkHyI@FG!rm>GS3E뷊y},.^2lz%lZ$U~@gϞA2 j@@s57\)כ}A_;fmG1s7'Y`X׎Ur wWtp8aGNIRul"͈+6/ZkO )!Z){Y;'!{bP 9$̓AO]Q%xaIo\Y^_>'@{Ԧ;`GLTdĤBd4uWEzݰC]图H} j1]]kÆmw 5[ l^0 7Gۇ\c3t7G$%794F9N~l:`WXIDOp ˢAܐ5EǁV%jGhD3k8ԺOVNԀ[dht7*@b-a&U{K+2$ɤ$)7._"䯙!njU\m3֒BTS\꟯*sRPgVՐy^@A>PUANPoNxdΧ WK9"nN6JNW, h2Z2⹞?ul_YUq;BVp5'۪\Pk '}s\v'ouc: U7@}}oek-ZA6ѝUs,?קI4:ؽR\;S,+rhPۘ́.Р;!^svp qqWI%P쁊S wr3Hl6\&y"j>&2Lj@߅M)6<qfbgiOec#2A9-XHbNwԩy˭(!uI. ?GcL4Hd0Դ d(JghrA{}:NQ %IRa 4%l@v&P" | O2ŝ];w%E$=p}P{L!]k(R9~in !$VvWWMt`Fr; FڙN5Lup7FC Rxہf\L2F kCy2ovۭn9 F|d3BG?oƿJxsF3Lܪ㴐b!c Ifc$D?cU躽A !d x -aRH_qvġz:D(/a :t텀aw1KcI,"QxѪq-xIY2Ve&ˎ:U/|v8I`ɧt"H#@VHb"N`pOz6KTVE^eFGp\8G]4czɳE**N#mbp39n% ( 3X6-%_OÌSPMe%H@YWR-xbqa(:ᛀ~N=<qTC=R7O·#xaG <}+Y1-״$|akJڃ; j.& L%A>@үyn`_A996}A yq80. GPz,cl2sOgJWJg-{lZ&n!pt)r@Qb{uwI pZI;1"Sn<$C. kk<3CkM1Khbx{O4n|?wf^d4-{ϰԂ_ӍgD{FfЕd7>~ w$Ƭ`%> fP%Sͣ(͍ ]qEx8u2W.m}c\(v/,F̯a3WEf5m!%9)-o5|CH=UQxм,z V^ 3NtCP..e`ixQEa~:dvcp]8d8eakepWPM28`-Dh@qwn'WLn_8LQt';7̅VHrAY~s'FPSFLJq mpTj eji#"lP&9n5eKy ME5cxc-p8욙jLQrՖUOݔfľ}8k[~qӯ'%u$`fALJ7Cl}. nǞ\ `cICABK @mw,L@#lGڢȘЗ٣>zPp Nت4/G V+IfvX j>[OyadI+p JTS@!D>XwV>8NZȁ-mf >ɕѳ%NF;cyYT歂m;EZ \G" $"dLB~!Y%7b^*.6.9CErCI NM[u=@:],qJTU|/ԈĂ ߛv5FdIO/>F܀gkq`<‰(sU-Ţkwd/YU JJ;> vbV=ثj^C&p 0 Fpc,!賁lb탳)@rFeD,=o [VQ DQK/A[h1Qnns%&5;ntW27\a#*n"R`## ;2F܂N\nz>{Ď#n5g_oTшYŸUUeqݷ?-*sH36XztmPq` "|ӫiuj“LKP!|ChDf DbMYWR~PNc+H@29:Vok'?U/k$ XЭ2i:&S#c Vs Hkb`KOPѯhkȤL {8UKҔn達?oMuy0>ϔGdWY/ w#zKf_Nj졨;ϏG@l/t棂J#jւתuEYVvWB- BT)} ǿǖ[h dn LbClOl&U{Yf*8EXjXڣd/nH.k'=ht/o/ ,ҁ.^B+n bclbM3GN -@t2`Ri#v(2jI1# ,t e,65En\PxE]ٌN4i.YFgHӹ4׀c"RjX~6ݑJ[ѹp&KʡKҩVFc&r|b$@~QukShHo G1bAR`)Cd3ǦU3p.)N󂁣pw[Ck ba(XWOx)u-Rjre}$Wmܜk"i(Cʥ fxFOR'X" Tx;?=?Vstm# va J3w'e7{iz3Cw)X^Au29ӡʎ:`ng!<ʪYx{06-圕bPb.vSw|Lq%rkiO s._t7KXTqTfh%(u\iHJD)j{ h)Ò|vbqq# \-0a}1Bw7cbɔe!&|}{s9p'l%0;8:׹3 ,TlR4Rz+QU (8C/%ی `?:DC\\9LʥF;\\D1ft$p0a'@akb2ۜfWlrKʢjp4Y^&0 =8E*J4bq{m xvSnyyu tA8: Szޢ蘽Iv +Ƙiu)&s |&^pb犭]H(B\y7nEhYa6Yke1ֹ gc5qf6ϣ >.F YW2^=*ML}m91nݬKvѠWdI6 &׎mmꔀrd CQB]^(VvI&皞ԃn9=V4z|և2u( m;e!u5X=>Z[xQ.:B2Iʊ z*x6VIsŶ b0mĂhY.0To_0G#~o&fm++8)x~i! Zl"B/2 u1kBZݣZkxSF^:D?? ]~`t@(+B /OTH(ŕ㠹_Ș)֧!vח  VU-;ɉgrx h+6I'oMbQt5O };| 轹&pf'tQD\ 8߭.yaO -t[r{|R3SMHa?lm$C\Ob-MFi=]=U j.I؂Y-4h nulK]n9tCK&vx#`kIsN1=.zmE%6+OL[A0@]>c)@} G}Ąf_/Fx` N#,A_v7sCv> ֡qɳ*-<\P-G2*C@i,/: Ld8U?88Xcn*$PCPw|7θ*-?#0FyHR1<_>ee;t4xxb6TP(* X,ˇ5u:Tz u +[C%?8j{7s N˘e!d.f90U*{%Kww2,Fz Fs Kh2o.r;'$ZnsSycN*ת ֶ!J^%$3e07X/BjQH]ڽ/$&C`7dz,. +%N@sCsOD%=n2 j&en)*=zy/cB}vkjkqjs"Yf 0ڕ(<n CNQ#awHM +;VdǿB^Kd]c'QVC(Wua.mg&1efA4B״y'5yH"kە%, }A%Bȿ.6X~ߜn 3+ F*yߚ6vdH%Nrom1dBWwA-'z {)'&^gckw񹇙rp5=3XylSn~w  \82+{{/bcC- )GZxլzQXߋT"^mIat7%]kA'nS$Mf||4vNrkWD~ eu vǤ*na}.Oa.Cm3`#%.j]bJKe:ub1mVi-" {؛uiЪsb ԄgBj +}nJEmS[eh wۃʛgY7ĵ +rK%Et)q%O4Uepg}rusLUvIW-$tsJ{t<ãG^26쬝oW^y TW_nzdCS){"Au |г# (\*k?7-1TM;ksBLC7䪃Jpn™Od\*GY1% T7Up= wEw "\[[˰럈>jyUebac.ML6%^jlhsX:{-Hޥ&t8U# Q!2\2GoڮS. /l+:S7:l"QI^:gZWB95>[@4pp0pߪUT4#o ?uܭ$ Md=Ow)f;@0,=W4! %Ȼy}{LŬ zY?M0*iQf_Ov̔fhIfFCjs7 EU_ox>Ѱãn_ໂB,+Q;x+?y_vѢT jzZ4Y/ ]%?.]ҏtuQG]J9G3PcB6 σ RLa]x|[E{$ӢW$pxz['pH-A"&w46 0V3xsE=l?%D-bB=9w U*L!Qf7 32S,_UyPlj5|an {y%>7LY'SL9oQ_ܕ 뛥ůG|EAHEM #qB _E9ՍA1AyI4ɑ(Bͨ'`>al"Lq-vQ-]+֨㜺8J*pڧEvwx5M6)Nǀ(*ѭ+ȶ]mI_ 6g=<&(꾞͇⧶1NQ种w~&g- ~FS6k̋A81^81QWH1iꈁ12>,dMA*t2%G5+m7j[4u,; t98,J7,6!•L/;[AO@N 'Y9oa#(ğ{ϛ|]Js}uh 2\oY6qx "ORט?1uӴ:6&,^=> jCo/0q"-O9p(g> xMH),^RK=nv("لu>: +o<]دA m^SXB, )fq8'NQLOhb C|uw?VFQ/ >?2MGU0'%_Džۘ9{6ߩi|  4J~vmnm&Cm&tLW͘Vp F +ۮZLH-/G'p F~ C`jzm39y&{.ΌmE (?P\u3M6^D<ʋ^OȲ-i~xjku[8R'4V gR"Z]y˽ZS8 IH5_)0 z=0qñhS,("2Yʐ,*,3:%o#Ttc'41 *{]*c֐P11AGAqV%:BV~+?ݪ~ʪ=[)bW 0FXg_px Lq3?;Ov`>Anx]d:1blVllՃnSUB4/SqZT|!IT&@di|s12v=e=wPq `U_ Lr6~,FJMʢfvtl`LAY<@_@z4]\2yGo: Y ?8$cYQ Qgr?S8%B_uxarfv{Unnk):9SicQj+qG,PA&^A)wnh@_=pBS94yi4"&1xxG0Nc:?/xfp+lΉ@hp}Y#/GUp~>3q)WOB~PG#P0j (%:j{;=pMjҪEZIŐmG3Gwtol[};UlɕEeEG4I t  7)19fts&83t>R#k/ƨ300V3NhFN+ ,2t"0C5/9w"Ī1tx"hQ2jCZΘlPv5k_6fDXڙoֺG_$ǯjnP}d9~WU⒐D(a# 4Ro.mE]X+_w s3֫]#,Y:صsH2>玪yebM vY":ߵzVE(U ZDf>$^cb֢4^ܲȮgkV6I\2US2ܡ^ =34bx 7vBy.*$ Rli,d_`UވEnHR#=ŎNl AYqH \ ʉsd,b<k3T}P]9?Ji GZY( z)=%/.F>Q)5VL:n ~p(7Z\#reW/5M㼵O4 k`6 c9:SpAsj4Pm (퐖RFtnm R<܋쪝*f^ǷhF(+^ꅌ:nw=؁s&!pyˎ#ZnT]{%%X;©(^?LG?18[I.2IŞè(Otdٿהhƕf(2Ivp$n'pYS>2@F,rP?I~_b[frGB,K(;0ϻPm1.U0eR%'Q|s8/#<W6f, e>N cT1qM) ]% IρdUF˓Q]2J#E[P#H2[kPB]±\s<~^jW)Lnuq^+,jɀY'gOQV(rٙl~p l`jj(HRN|3?R~ [*2l\V ׄ/6xD&uK# 0G8 ;tKN*R6=†~G4#ECdE`> ŰEĔ+ s*R䞬z8/0TS" -]FJb`bf{+#_)e!4f .\nj3#2'hךR0'@J65JݑTkFv:O=QOI0* "4m{&Y* @}ٖ5$NC^/0 ]`\'c(oaRJ;Ajg"T&pB Yl+s=x7<$~od[?!m[?ٳiT#_K9")xj>̙e rҠ>]>˶dUP"d(F sI!}ij#LT3IR[Ugfpqծ% |lg^}0HUCP&sVe,7^phxJ-tkMfP?p]tK!i|LUjuD{"t>[O^~RA΄46LUϑC]WH&f0XǡMmN{/KK7u/BS$a}ez㉖a9MqX9N \>Z xH&߫\bߏ]Iij&5҄ :1(8 Tڊv ,IL4A4g$&忓gΒVS?=r4dwr4/ neR8hmOm(cEӇJO JFX yw}]Y?ƒI[+P-r&EѷC#E&ͥT:"an2>AFF`rpXSU{6/B!Դ AyQS 27[8#+Q{uϹH,eCؑu Hvd~xbĂN!ȯAv."hE\̬y@'ީB"BLja5([ܔsY +SQWnoKצ\rVy%ُC8X {ѝMW$T/Z)e[yӕ%@nn֊M- )QjޤtB9zpxg&l}鵙ӣ~&l6@w?V|AڱC,6i|cJ~sR$c\ x*7J ,ز =;rBO܎Rn:-_ VU!V;T !,bUdFQ>ϋ<{}JܟaPzLc[f5(%e[)@K֭,#4Vb;<O9R~t~@M+vn9GeF.' rBh7E:x7mYߓF;U եbwOUwKr4dYdx*U $oӓImݴTOuPޥKNp3 r8jBPI{KܑR|Hgaw[r,FVhyrf>E* uk ʏ آV ]J"ȭ- xq?!\)@ذRs>(+ |#NT/zj/8 1? \Tjv|}̱. Nk[`$~5( jlЍ \ *mȊA/ԁ(yB6ÕN.!b+s瞷@pV jrH]/\1oL@^p5$+UI8go4@?6.91d-8Q4ËC*+HxE&nj u˝_B"u]j:?qoRS+!Z7T1u"[P6Z{վt> xoWzku ~'F!L6M\мBj`;]4A <>`\S hU_Tl8إ݋HW`T!HQ h]d܋7*uNnMEi0Z1'п Mn3G#65CF;Ő'-q$6^0^JG1Zw7蛍;cF(;t w{,/c/n2(*zrtP.Zy]'QG4_ 稕 |@uK(|`:hMeHݼ9vI'fl'P r'䴣7=!ф)ۥ`uZ C>-'l>?9YfdÄ9;*+a["m뵣jX}*;+VU>v[Rh7> tD"voFbtgpbI{%rgpgSLX \ {rՏFa#..T/C<'OO 5pVOV u6|S \S^oqLZ3<89 .4xrK1f@CO_z(L ^CϞ?I/52 RHWV;'?ݷӤ; /\K(P>U^!XwdGiiB%>q^mCjBzΗY 5F{!Mǖ#_[ƌo=SK LVIM(w0)Սӹ6p_IT,` [Y֓ ]iR#ĝ|-9Z &12ėlɘHˢd4e=ÿ[*,]4bA؋]dT:;aNy}}w]x9`@T"H?&cgbz=A=*EV:8ͽV`NTgaQ5Y 8e=;f<ĭL d%'gB"W]+%Z]wqj0X[%1؁FJAg L+-[]l2 g 6^Ƨ9e@UG?gM3JܰNREq!eCQ'1Jؼ ^Q.!=݇wDpNIz$]_/n Kl0m&v (ރwY#Ɩ) єxܬg>!tAe4.? u m7v&aAV$p#']*k!{LbapACi @› UVp`2)-C0ʫfL=/}XЭ>&ľ%32@kjbV Hta vjn> bJj1S>M_>ǑUlRi hk7qAM 84-j-ZUÛ^S,K# Qx {VTsha'jO>TyU2@*u:O`*Y>?RLL]BaF^>=zqQ2V 8Χ (=.1x;4z-ٻ^lA>@ZhjMP1ԎTHndҟ߬JTgy E I$& rƠnL8]9D up|B` n>9>og[]ñ7͎jTZ|&'J*;}ý D?"k(z-DN̜ 00p&~v14 .UcM&nIݾ^awW "J44;(T&/.@ +:ֻ"y~MF)*OΥTxS;o;-:QcZG#˨_RH>gy$h&՟*r x<V5YZ^*dgH}?aNhxfV.9Xok:Y'?GNM8kw6sig/u[Muh## ۲'"?>5,7/9+vH.՛:bQ tw"i_]΢ -<K/(PYL%Ct=CRti9jQyu,~kiqƜIЅD|h ΝKJZkmѨ%(EYކh;PjFhr;a,4<89e6!cq-f%U_҄"ebL ?n₺D]Vk ܨ+惹m/Q !YȒ%_͍F&9x>E ?'FɆ_?>O?#gcevDp F`4o:o}I*[;‡# I %@_Зw6z(O.#N&!"cc ayXpa(f.1*-ǝh]:e#!c26=Y2`lC!-??][Hv z`L6w_jKV3^'a%"}0 gݗ8y4tH?{i1Pɣ C;p%Mn9:2޴ yGa? DKШxoX@is",~ .>UmE`76QFVHWixKRJGԛ0hfI ĬR*/l YDwԙЍD* lܾn1NZؤ)w @rb)*S`Gh> !Lp}qK~vr&gL\Z"@9L"poQ&N i5L@ :rpu&cU5 *6#;ɧX7=yRcuh*gXMLoPb /8xc=P 1-uch}NSd{, -Ƴy*rjf_4=ANz헃c<pPuj кp^:2 Wj bsMXC}uw9xz?̢#m:_s!/BvԬt(AI[AJ4J$SE;\rllr0NMR`0b YAB'VHZ^s4%1(cu;^al[~ oLo `z!w,H~IKpk_Uj9Գ*@y4$FAh\ۍ ] n,p?AXh@ڋ ebG!<c4 3pcp 8f gn ߣ6V,!iBЊ>cvVF9eRλLBn$Sl>`25c&($NCqߏi ~oWi3$}Wr%FX)b`Дlv꣑e+ځ[TiVQ 3!ffIN+|v4vLh?+ I+pmkS:%H6,EM CNt,ĉW<.QC3J|꼟30P\7$/h 9S:#Mʀn|P?uk9Y05jq2iV&45f]1aB$8ǵ`GIHóoHvjV8BW e:<O'g;TIRsm"M_uHմt#^[sh^[F 6٨YSE4L$[3H|1" W?&~CCuf{Ն數Fe~RY[kA$K>4oۄ+ *V/!!0L]lDZGч /Ñ-f9#"ط889+.$)`ـ\d ѼwDe="NJCYF+P@˅JH!XumD]qF܊{|l[YEɣI`AX j@r D\v@ 񍯇,4]@I&1܉>\1m$5G&⟃a;ua߯BTjjU⯍X1UTBY<$k#uum,X huL qCI $P,ͶU+XI֓<ܛ':~'MNC>5\-+GeтU]x*yus6“a<*v_d[+[ @;?W QL vӁa9e!6;!JPk_C%2x(P ۭ^yޮr`c]ll@?H;D%vq+=t m~XLcᘧLVk/cm`y^J0k!nŇM>XU^NX!iжG=_)ujj:sֳdin{ 8n.JV#wgkʊCMs͙ןk w1{h|7$0}{;q`Ч(K29&h Kk\nRh~p+qV!f581CbFgβ:+GM.~i`؋.}.j{M!DUؚ(C<qlu-eaqMAk\hVPffDب8ݛ/=Bfʩ7c#MUYBarO^-`2a !PKnFrx~ol2fθJ`Yr uFg#az?S@ըoǙ '.;wd'7"Ş*A=Ǒ}؛0{IssCلañ_?R } Ϸ 3"b^ jR5;}գ9I#Z`^ -c0/91q^t4OB3\t(^]x4/}IIwG0rwW*"`qEx)\SxPZrO,+TsEn޲z>Zzn4)k[*%v4j8 Y>1J(") e店t6D,\f%(4kuyR!5# 1!Kؼmv͑e5FJ+q|8\&3 t|]܀{xޅNb|t#$#9)z3$@]=z@^PZФDYRQ]ae%Y 2 ϪtX.!T7+v5  ;`Xt(㷣E'lTr%D-{XԁYPPik!誵5ig0sdz-V x8NRDĭE`(| Y@7#dC t^%Ŭ[P{tYUբދo EFKkC"l .#R0[-FLmd3 A;vO(pby䲑=H] ƖA@%,kqx\,.05D4d lh6 -M$*$HSɺF4nieģc`n&F^[şnc8kz\ȹ@\[&'>1 ZKӀެ`1v-EnLDrcod4 e4XՋ*1kHX1s>Xm+{+8 PI<"? 2 u5aυ}KVuǰ`}]owa&* d&, >h?TgF (}]_AXDs~cZ,Мo+"_:I,ɫ=,mL#ɸZ84ޫUt̸fw>O ]9wp[|N`k%t)D@]NBN a85^<sEI2sJZpE]8Y6e8^W_[]#`Hn&AꯦZvFwg, e5/X"YyY.vd '+J5A}Th96QU8ɪ{}=+"(9?OҊkh')_`5LX1wъbmO4u<{e~eс!]Ab[LZK&RS_8g 1%S8R/B-su)~rRlL񭙖k12 To:˒sOY|,, ա&,b:qUGo:/v8?Mg\,Lsjur)Y$41C! h/m2>!&5E*0 BAkvu*bd ߚfxHv8cIzo6)Ԥ~CPckqD+3?={8ciu| CcPhQ2{<貝 foe !v>"AD(b5H_*r8+u3Ώ"v]0(IJ>  QRf$ѫ'{@W׷d՟q}&jb9 C,DF;꧓0HL5C{`q$m£qɿra%LѺS"9.gs9|qn%S7|"} _f!Ps֥4ULB&bUϞr,F4i GLhc ̄ NrO1s |zxpsnͺ[Z!+|KmO~gJ)P2+M A6۽#K0Q3G3x@?k]|eޣKߩ[ߏ>^vP5.Bk # 1'GDAd,8OB? q ~$pC:OZs-:@,tV,i8Ųb`MU:`%jS_7&֜|*tʸO ShdSuL*K>WrI ՛ėom QF*>,Qw].<͔.oY>]W QJq^v2<5H yYXxJt~9DWvcN'FV -з"DR/}鷭#L8&i#oj҇At5 b!Կ;yV([,9;x)O!߈ %+xT"2&T ҆%q tP1 =1QՔӍ QC%Oqd˦r҆+Ef>G~xԳ1y 5%̳͘/J"BޏnTr-$<$)q9}pQ^Uђe:y\za{êɕy0,A@[̣|s|Ɗ&A4.Ko"S@dW( )f)svI̙&R^і_ $hG=b  ZBEDڪaȢǍCs}KX5Mrm8\23)>K2wKV(pUG!(ߑyE}jn;@֋` W YA}{q_^5 a1(b߲*L#܉K`l):E4IoH]XO{sǓx?Nobf/ + \q뚌AA _UbA%u;E\#V@1)I#Eexi?=#XL'AJ*$gW##~QMAnpFCxQQ纂k$xGBFo**$ge蹤CHhJIʖRa;$|**s p+n$R!-ʀ&D>7=n2W|pg D"5@d\g@%)\D@Dr3?;XI #2 AR L$_awd~,b +9ءkU|c0ٓ)L@QA"9ҠV[Yr I.B}E g8}z:QTiy '2a.p\a I_n/,>%[u)f!a&QދH$G拦av/-&72  >= K'Bc έeN:si6Iڌ:~O]ȌǫIzo2?6kn `( -,'|׭YjezuPsCqܒVF))aW$:aiʍyk%g~`Ʋ#\GRn#K3Aȫ~^cJU<%7y"ǔZZ\8X9b+ -EM6##) mT;zx(=1]~?"BȲtV޺$-k^ITk34EL}C g[J*+rV256@+x7ݶʯ:ip9Pw OGסӚ$W.,cj.VrQz;Ȇj,OPٗ9)Z>0I&`6,1gS![̞1fHʖ}P(:kNs3иE*JS)xl噘 AJdJp5oj6=DZvC6ʝ)&V__L̟X'L߶w+VШmX`l`U .ՙ)J9m8.Tq?huJ~/3-$I6>"XD:o0EM0*i+{O*wcuB]ҳb}TksQiW: @V޹y9YTQKތh&VdIk 6sľ?C76k LӤ~#e߂`أwIysZfǬ2p<\ ,ZKKRq(~P@RhlzxJhZJ *UCr9ᾠdEɷ:fmY򂹆i|~YVQvcpYqj0[BbpM sqh젙ksz Kq[#(Vda'Ȇ%x+Yc[9WʪImXX==CTЀn'ۀS˗ʴ Ou: ࢿܐ %%0 tj,}4xќ|tǦmþKO|JhDEE&E)o\OI,5ljTQՠmY҉z!>㌬E`YAkݤ[﹤NN.hil qx|n33~IJBR,Q1(5T|oAkg[F0<ن2MM? 'HvIZ=Fl{pHr'C6ew7D^]%?AzhE;K!{un a *:ն裲WD&Q2m2r SJdWq_XԀ25׻aO oyCR|JoOc:|ԸjĈ^Rh~#w۝}Uݻ;a{–\Yg9sBfƊK! t-'>)~Y4$ɂ:%r;IWrzj K$28U{D Mb>^1/P=)vJf%`2^(pZLHhv;̰~k9qơ+//De[&:*!S$V*bFv# iB}81-ԣIYFv }.C |YB9\xF;G`[.2aT)@BC']2`zrRo`5FN2n󷞉e W+KSy n4[h`[Eܮ%͑vƠ>/W+ZxpikqfblY_qL ~M Ikkׄ,K=9HJH'ㅃR!%5[S vrUb^H&1(yd5h)'&䗊[sG&wV%$zjJ{68 \%Qu>f*M5Z9cCB , `JP 8W,QM_v ';kxסS6]³"n=w(/N]o*䅓"I2(kv) Qg#biEa2ʁѐX_Xj~FNNcEd.^fM:~CKYy&gY?~]+Y7.IltO;{}b&d܊do,tkpwɥx:b]dHu $iۛ ,2]rY"\KA,&NJ'(P;ALQ`CT@>w3ᾸTNEt0zci=<&j~Luޭ T.lXX*2nvduKH Av=w2ĎeQC7=âkB'Ji6[<ŒJ})PF8`rf)3ijT { t>e}/Iz5oQ_d&xO%0WgG#nK5ppQyP}S¡&5Tycm5Y$-쏡>&O8RKݡ;8#M0ȉ C|l,a2%z2j 8 = [ͭlΕBmζp٤%_+e'f$`*.q<{>%nMYz$>0xG@8&j Hay^zEm>1_Fg,kgY3؄'=D~yl'ph̎#(ZS<,lVqT:[Atx9?b|d<9ݏkP%z- { \}صԅRJs!:sץ$pԙ$FAC)8Դ+~Ppb$a QzsÃ=߮AFj-7RO]k2Sg߱!!#zPNdC*<3 e|SXp׷UՒh+oX2XqPAma3$6NW$;K Љ.4"?Ԏ_40d$5hW[V '1@JQ k (>f0*+Ug&/%8"'z-|r9=_*̹96-X1As/:I&Az,|@ `:&'XMMHmJj(F)F޼iSYzt<-U׉!@QMcI  6MMۻ'y?J6ٻԍIwJD'H20$3լWdYKe#Փ ߫f Zp1I о&#[Ҩx0Ės ѷCoc×~'8{[uN`͵rmVRZy]SQ!3Y fI0[̋BY`BA>.:D5[AKur ekڈG:tGGK% \}؎Ed砶P ,Vѝqb;*,KeaI<SKeU1,3@R;V kKWIB픂2"*T>,$&.6J;}gk*8q3wmK2Vh-AfI()!H0~0kG,ZqcR{!R1С7_4fT9M`! b5A,jdtr*V\5Ee 7FO0MW4= i =8/D( ހ*=6Z)!yhUnIZnTE\XB f89A:kD\cFBҊ? /^:Hj3Ş{vo w"g)MThW1 j%$:أ* mB'1wa%r Z0x/mq» }a|oٞoS+xYG[5(xzzA~0` |o{:k! "m,mK[6T֢`4$!Go*7fg}yL낔df]7F |Bc<:C*)Y8kw"mDڱE=QJ?v8@8FTBDADpoQŘ~W"yHLDzw\*_IHAp?2t J6dǘ:ĜD͠ijiiXvuFҁ.)dCh/?8"U(ep|nFˋƷ[KTg hH[J.y&ASjW98{^(oKN]`}JmA)e_ ̊R,A ѱG_1\}ݙB>gafe^v0Ox^2\l6A!M±\LH@H-tpm^'uN%'K^ Lrmʞ_vi_Z(P|KM I5]JZL "iIfckt1^.dW'T8|8 LY"q }>r.S2*5'lV_Ւ^_6EX_5N&n$s~s+j0>O+γ g$&[Z{Q{ȹ0&<y?M_͖E?A0.(2 JtNeer(`)"]9ŖYg@D7 &yU0 M!W e0rjg03JB_D x3>Y&L?hZT<0XCAՂbz-C *j!kMYi0eQe"UouX՛a\ۂ,-@i5 4IgRaH뤷 g E$m s^m-r Q5c ȋ>.&3) L/:R?$iu5Fx)LM -/ wo=wT7fKD$(f#PJ,FrW] k0)s9/=ҖgtHҌY!c);q+s/"keiSr+^̾? AFs'^JVhu c3/'Ͽr"x;Ehn 9f,w͠5(_iHhP-wc*)MBP"ËRh6*-_nZFįX2=vL,/|7/r6^p9Ͻ^Ut#.TsY+c"U1&TAY5ec r&Oe)~%#kXVYI~R-׻@5uW/q04u)_btMJu D4'%2h~1{f |Suwj <Ռ쪋W moϹ`pUaXl> 3ɉmA^<# RDم} ]Mq_s_ߢ^S`^I-Sr*$E95-Xu4*C*uz Wr'g W!9lآ*:X˯́^KOxnF,- ",ƾd#tCenύ҈t Hvn1J z7iHӓ(T7iy03Hs٥HK/+BK wu*)}9 4LeSiD5&TYew$4#:r2 g$E8Qn摫Ŧv}(<+hYvR]Ȣ:\au DWF/a.BsY [VToViJH/bQǼ|6)P YlXe!j-ّt`bbq.'UŬEry 2}XD ~:)`r! /YݵV{_ܭEcZ7J L\x cq{vu7|M Xh^B r%{نzAI+^;/dWu"ơQA,YHjú\PIںvQ̶݁Àwv5$$g22!ԐLM\Ǩ"P 7BIצ077ېzms ʘ 7<وs0dwP'S;S&}x f<,ny<ػ,P9>kw26o &g1OZo$&Cm,viSAǯ[oYSk<`<^h+Bm{!ǣD_A7HFTUǾejJr4X]r;\!|NTaI;J>X'VZR̾4irںd=QVgVXQ<-V>v7#kqlv*X3Y_8=" IW9<WB&GsB@*= 1GAF$>𵧆zϤqDeN,.,wCSmv@r#CDDNػ{utm3Zxyu?xVՂ#~s(zKY Z5Y=4xAxJhz˹9D7Q'C`xR=p92s: ޾"wdG(5؇}J2 73r0bC<)jS8C$L Ho8"ĵ{JDmn*TK]c )2LU湺G/]Wm#z@*znW:hsT3!XG4Mf̨̠0L;\@6 M.te&B *Qk%^۪=e6έN UwqXy-``s_4 ZX  *[)Ĵ_3x'aƎ#)3 Dh40m+ӄןW=j01jCA,.:-ZSHkx!O: 7K0DŰMcs#xcz7MR`7VI& B=<=\&95`/l*#><0ržh +XP2$e+joUurywa^ZCY!&d[NDzo2Һ"N2]S&n3C|;ɾCY !ߛ%n8'L$Qj$D~ECTq> I@+x u= JN Rp*-TvaJ9jk3U濮*; QFA%OHB! z/@/tCC6U["%YZI; Oz玻UFVw nOT7*åتԣ/^}9 uaWCh9i->AP4 i/O2VF .O.KO|17 bȱy_m&{TfqvԊ T %fW#cNоRmMh@4 @&1pG/t@%4zf|ZC}C!4{h21ӸlA&(+,iK4H(B3 &ganuHw]VH%gv:-8.v]XxWqG Kc}k{x}6ay < ?V L6%!wZ\+ $NaUTF+Z#(TPE !9%{)О&.L Dđ @Z~^{dOF` ol 뇹ɔה ">0ƕCvCCnz&#K]h O($}jQqS~YJhy5-$k ՛mUuwƽi1+2]]?ʎ5 JJIX+@ׂs:S]cr`M Դ.EќiQ/\cK?bBӲH+,s ͯkmE*.f8y \ԍTGYђ?F@U_A[O7 &#%$@\BzZܴ1+IAʆ;wX.!J5ηTƝ=Q*; >TK uX* KmWz28FVHznd}u3U;A@ TN<5SS+`=aTy9芧Mū`WŁ-0[„&QTg"qNTO`n\o zC38dhm\ H X gA-p`L0:zc:8t`DWAe%=P 5Lτʺ].(|+%'=k$`@Ro58m] 09b;h{Y#zb8>1Lۏ9",YBSު9s.nD0=n;H F˔(I լ9I#<~omM|7f!}FQeF&H \w+pm^_Ə mX*یM<9#:sRˮ*v oLS#d8{|ڂd1Y~GA'*o2lP9@K<@epG_ 2ͯcX9~LI( UeuF-IȐ?3%Ob%W͕ܲrXx7O8*fYN&6|pFPX]H)ޝ u}wbW#.EveҚeJ,P㜦b|@@FGEc+җT"VkOTW^5TIA cȅV57" c0! B ֙}(X#%UGI{Cd .elr|}"$$GC %rD8BozC$#BeZga h6Rq,)mb?_@"mP4+ 6ƞ3lR!>aHh],Gdp(''fQDL8zɓsp7c_~uNXՇڔ%$Npv  UԆ .#S˦DcsY+knv5h5GSԗs\ѤZ"`@y*enq_X\ yTly"˳FNL,Dodܟ)$mrfG/Wr[L+RJ _dwȘ.5.EP"0ė# [ݺRHnб. y ݗƌHv-]0&>&d90;KLE qPyGC=> ^^[#G( ȤkUf6> .):B-]Wq^֧%Gзv-V9ВiC'5h{<ͮ޼fP,[}ddL=&AZwP 3)ȴv;'0רV("6OY| z6-.њx~;\)0~Fn_%eZ'3 {+h =DgCgo .t#AӀhwu%K)CRPY4UEFszŴ0qO$/{Wp^TW@U}}o%Ș̸Z<;=0L*YK^T[ڦD#<2g)!WG{ Zn?BZ56º5T*&Y)X9LZ3LL=d>%%{!m"I| mS]YJHM,zd\b"Q6],"ϫ.(Iso *ƥl=YU?mvXF AUza2OI_m?зl ,ZW0i䃐(%R)@a0Iϰ[fr;Ze-!PX4I5Cx}_2J-](rR. T(\+޳j:^ 1plY}= 0ߌջh6ڰgZFϊJ)#SƘ4鈐Gl<" kRf+}i8 ~\DM\ZDƇu[ZτE,Hذdÿu0%fQ9]CٟެgpfU&'0Ona mX8݉J<>sGZD; ?ڵN,G,B!z)pixL $+Gvܴ:/YJ TV \򤗌FJ_KBlLƄvz {A3=:gw>dP53"$#a])l -2?ZUB1~@ZN΍P0+2H KF?ׁy_#qɺp?TtMY: ->="k2gF֭>˒I] = 귆ek^-F5:_mZYv=H$Y'C DO* J35@\N">Kn,1QjH4=2]Rv E2d5X]+MDN|ʈ{oYPۍ¾ -$S8 Z`<պw-TQ3wH)@W\LaZJ@VbGos vӨS]a_q17MH~J8R$yp"#>yw&*F.5 C9btW^OixHqh;u~F!2ڱUeyz=Pd8ƘAEWrxuzkU[թ,81BҙݵQexz 8Ewܮ 0+sE`.V-yǑ ȮnRpxC2qwHFg2-2L1{+ja6f+_-ջ (2XADpD@s9d7]Gi‹Dݪ'O|n^zwYf =ߐ=#wux83x[k'DC+{`!Mlz1l69ۅ-`f3O%Wd/QBncx:tk ~Dq^Ḓ㿮aӖ_IAuno?nEۢl#іPvS乎t⍟iYL,ɤPJqh*见q[*$܇GLj5/+wp"mVf`oYDYGA=-`'q^4E1Vɷ د—) [a%ˈ\ k"xH KH?\ M1<):E?3+΅18g?9_ǘIB=axQ)*r+M [~ 7cՖ)0[.aw3m2ocm= a]x^ +RTd^-vo:)ǙP pwX+ Vܦ҃ci/]3{A9jHy6.RUE-ĭe{%8$⫺;ⷲseca|" ݴ}P$[]tq8Yȸk` A=Z,"klKޗ㵼8Cx|RC J*Y}Ně:F<] yEb O H-fd%>ӿBLC:}zXX&8%vf0}mTc!͗&!C,շ;hCݬԣjtAq\&Ma3LaVu#`=vvi> [)~ΙTY󨚧T!"̉9Y+:ឳo%wsjI . 7VV|-Zפ@e;ٓ'3I3Ո5KJ9ב}VC+O"餳Hr` 0^ j|WgJu^QI6maSӜm+O`ts۳9VE:dc,kU*oQ7}Pt /\ʯ y?bEXxWkUY'N*II kMdS9:D@)mWtrVbzkm Qߐ4uO][󄱻JJZHyS4\6rw9¾Ӏ})*۱rpHƜaP&B )Xckl%ͺt}쟐\E/Pe̝mw3.[JC BE2xZّ>>[ƏX )0qc_-hL*Ba@74)ػ|4lۛƞ kCCbkaŲed(}DՑC.;@7 zwJ{!_lH01X=.$p5 }6.]Ѯ#( N?"LGmL)0YwW= )B㳵 kq\m;\2i]#Po)1SKFLi RU ⠇j k;,+"ȏ>}oT!PڰS,?^#-<AWcou)% wP7ڌQ=-<< VUxJ@pӹXYrQ)+GH: OB H vwgVVEYXI-nR")LH=[պŶoR;-.+R%c b3̀32R8Hɶvuw .ɧblr;(wRڌ B]^(tjR_Ԅ-&o_\j{E;͇ˁ.cߣ|Y rC̘!-5`+CQ[4ay {>+m).EIޮv  j& 9YuXc~?%܊2}Z.e?yq5y< iw9}$Dp~\)zJQ.&HdҺ`IXj׮xV"&]+Yg+TM*˝{1$hi=դ'/4ڸDyeG3/TPp]gm2R#Qksgӳ/QEȂ$2GǠuvp۳A{_6cW*㦯~`9XF=#N"\Igw)AՍs]Sī7`e=aY y dg孵|P~)G*UZz+Y-" V^{K>u@ !45#[@t)Y\*& BG$dI1)qfB0~DJ)P5gCelWw]2aӃM'66eҪ8TFojxsB:eGr8"WftUFGBYYjXcLD3e+_"Ο kĻSlc DcۢVp,RJ<\$Vb1 M^V[Urk |{axN?Yy*-Wb,TvNx{!(? JQW3l~c$J^* O/hAYՎ:Ž Nd ./ 5u fmAJؕ{bh8ۅ(VN:YtRDO/Imt 0/8%m$8nHX\@Yjru1MiTjJd?^c /Ҁ?,4L 3fT䐔6Q.˱t"p"q@|~Ac.g ht񒽪yMJ [096&\ϡXiSzޞF#6OA#S#=3Ƴ:z&}<6!/{.i$#Bw8/vO3h&F8\%kdKmε Df.zRO}ׇ|gDE!MXUfDIS_Mq˒c 3ʬOE_g6 (@d˓pR ;*dm߫e"CK 1U39q 3+ Oo`\dafn6hE8L.4KPms?h{ˢr`?;pUoB69b#4PϿy7E2hʖQoݚm6S /kӺ+/ A܏ukXg[[ ըhŤFtL)G?pLHp_0u$ :^cJGӟ(cjw)s0dZcpjO*+#Rc…GwOb2Dm B0#gd{;YX.^G9ը!sK0-`}"]']/%IKa`i̒ {d?.9܆ %)1y& RM zKjh7yPmJ3D#_2P;Le>QLC\Ƀ/NA?%Μ )iIE%d Yj{L]%!ѻ_GG/3غ'SKlTxzv֯K]?3kN#eJq-;.*M=;ӇEED[+a~fIÄ|5D.(4}RּMk ?֞\H L0GaA"y,MWZ ⌤LɖR|K-לhqjmvu#XIjjӄY+: jO)LO(;$i;X6~+}Z)m|%T^N$#<,?ǨO@#+sӞQx:mݴs s^ZOzpn!up>׍KA!ãWܓ`Q}q,0M=-3 WySܙPGJN%I^*tĝ*"XF挱kkSޑq]|͈7`DJ1DYjhNUQ$x'˨B7ZA (̼W쀅<_27ߜvk07\2ffʖN)X{Td<. 2q_t~sdd)efQ,f@% 0+sQ(Y*oiM|cH6pA_c!ܕnHq;νSn/h#TʼnPmwKl^@$kp|![)'?0õOйGkYDr#I'шvI|S#D;Jd`B?}V*Y-MVBxAϹX_$/A9&oAVgoeMZ _1TE~ I\ WQck*[3z&0f>m2|Tzku.@19x>_xЇmxnT%Z ElCk~A$Y/EF`F?B7Ģ_<&_Q}%n|20Fo!JڰR5ΚX7OSה sv_x !MS~3 S60v\{WتA6*`#@츛f0^zi\ˇ3UNZ[Ӵ &(ڐXp1 {ˆZɘNiP3ʁ]RXl@d&E,GXqZ=,S7)WԞc.P%&h_jU6,=̪eRnìؐ8{2!ȀfxQKĦ〤J#ۙ[kkqvL=07T>DY3RqDj)V4j?j)ږU5l !f, 6.Iy V2S (8#TtB . }Kx>0"*jK2b>mMhtGlgm_xm}2iN_.mԒ5_0DCrgOR`+U֋5~eESJ'$wV߶z1k?cqM^ڈYi*]=lVr{8Zd=a7Ug`D"kpp"Ț`7Kd$fC O6Pлs~N$O~"-1_VF kuּ2`G$v9?T _?[Kj@txMRtc1FiIRRpF)cX"4YI?epB\,[h+L"|FcYFwmjNld6t: :t a IDn=ZP}2T6Fǵ|:iESLiYs439߆Vg%{?4P oZP\NJvZo{sϯdlf\Y( ^g>MQqV&Cf2t*;n n,xjzx44Ϭhp2diB[X˒AJ67WA6'RA09kyoE֣_r`r1n՜,ĂSɽPH0fKTtJZ66E*\ D/WqgHd5ѡ&R)fX+mm:ͻL@όxŴqenD 0$I֝R #PU钴 4ȪM yة; dlkGkM-A$dz>tИI$Nk٦n%|kbqtdr<$*t*z3 @`[tdq 5cMP?o¦ve]daKGՀL)V pS_j%M}is9kl~9"5} 01K)pZ1];i@kNU ِbz,sƸw23#kpt=l-d|A@]l$ܷF#ݡ"w)h^ Bd kS\'{?y큦/EIU]|&`4}g^Nv:б(\ѵ߉0NSUtO i!@S_DhcY[Ñ)^k0ʴm.a]99_[DaP#IYV-a^aW`4@&l1'ʪXJWJM:y4Jv귰B~}B$ ln!!*[\LxGsl)+. NlgHI#Y3%\2RkX"__1/Z+: Da_M Ѐ9/`o?}SvA B Qqa2[jy~>v99,#4e;;IF.^= )n$$=9'sP\,ƶLY{Rl-ުM;*[lrd8O ]o$ &y8S?[W <Ϧ#<[Gt,z#7Q|4?4 z_a82KHB^i(g<օҤnI2K> Q+ BJ"${Ò_㜀L'5F©%P6@\>;GZ`sXQR`71`  zp= bvwLF%eLND GBE0B`ٌQYh2rfP[:Ꮂ FmzW2<553DLf]q)Oe.5G/Z&x V#_Ty*ȠoTV =֦  2pnmL=+5dC{Ԏ&yhu;%eyY{l+_0e+,EeŎݖUͼ_u{eXUD<ͥbudyV^? 9*t]}'@cA*m¿iN* e$u&$55P) J,TmԚKGDqݏV;{sÞ&ߥph*, 1b?Y50\Q?`Ld8Gay_z6Ĥ oa piA='S, ;5kԍ_AK(p7 {owzGcm;+iF8~wkB-ƄPY~Z"pSIS ,>V^[;?Oŀ$C*38@8x<hs֌W,\co㭄?: %xP`vq⮚>tYV E  N?؁:wOE׫ DCB f FbAWE)v&| Z$}if_:f9iBG4&ck^R:dc5 Jae@Pi`Gd dU ْ*"0~ƽE8Jauӹ4k&p؏ ͙>V\P۟]S~5T;oVIo*=@E+IJg%'2&Ȕm{x1E/ VJ6ucwKfghn2%`a)V۲Va%.\:`.lq!lbî9q1к$ڝPꚛºfpNXi`zbSG3|L/[2&y^G_8i(dRp- K79f"hhgNJ~{Ex= R$kTȸ0I"@i&&`10m'#Jmi}nAe%g {lU]{Q]HtbKMPS$Z# 3=Fz^@څ i":I?^̬ ȫu;ʛ}޴. 3`Wz7;I&YrSfԞ(u o a@1\~ċճՐd`M  j[&_I٦@Ҵ|u7B%; -bj( }7V`@F '& l1Ü2P5-j7:OHri>QS۷kDXqX)MvD_·d_^jY[+ӑ@JQR|[I* v a1MkswbҤ5{cmu9w;h EQ\؀҄""ʓ8*1T';h蜬6G!Os49=Q'm2`-͔Bɽgɢy7Xi[8T;`K?P>5<3{p{<pIbH3 3Q -q~;[6|ҵ^4y}ϭI8'{}ZPARjKԘK᡼!ĉkTYmA g5#'_B2"CܚmX;HΙ*hɑ r"1?9 .ۈc|C.#in-T!EpȉȠkE*r5.2V+MC ^݁=J&v6Š[Jx rBloXjї.ZBRCǐ8Xooȥg9=FDR}_iuC&:ln6,Kj+Қ/b) ۻs'*ū7V7Bֺ<~0_K~'XDhaVE/* 7i6Q 'q;XK%xԂQ=qY@7nmmR[ >ڴRy#*sn' Ct,U״F"n(o5-JY}ҹ.[ \ueij ĚBY4" \%YC1U6%]PuUTM&Wwt?Z\uͮ$e\(OGiI%~z9`B-UԱx +okeCq?i/U?Y.nYtDaEZ-pM,?يt!c -Y*FT3(@< 5g%>UllMQNFv`[Դ~4w$'B*z-*ȶ-PW/|$NRTX4I #ېn|i7dGZ䜬J¡^VXevUoVL7 r 3N4EUق-+9v f[J :݀lHD-N—!L ZT#by r$cVţHB"hVD=w3;Bkҏ,09+%eîSX>!r3I|Q7sNA]dX D}ȷ6i8>ƥa?BU^HWGNumtŕ8?M(v]2 bGc*\G ַrH%࿬ )0e,~gR HC١ge 6)} >0=hmf:̚נBZ\]\K"V>A7b"X:5szVm(Bnhj@^Q.1H-2PtNۡ d+Rjgg)^*k2=(oy|*c Bha6Zp/_(}d~}gS}a^ռݕ Yå~֔+lSG6q_+uq~;9!zk|3{_sc]27ˈ@~VE7#>cUTh´HDȪn9IL򍨄f$;S8܇'S瞏Qվ"Ȕدė#\Z[CkQpSn{bߘgi}LXdl9<Vʘ!6 +zI2D>#SE҇)q:S'}gOx1I2:n\IDzC_/`_N@,nK0MƸ |\z[--~ϓQ+MU6+|zka ?ҿD]XD8|QNɛz&D6p*>@SFj\1TobMhX sKfq#&ph"Ru,&{e jF^rn6?x.,2nhZAĕ\$N'JhEH:f1(XS޲ [EK 9{ZK\C8"~ e% ~.{O(b? ܾQe!˩}htF)ˌ&j%fZ,ź0کō V?Dw7?tD#=ϴ[#cU_v2Ő}0EZ.|&4",F"Zs5 7 ͣ-l]|N/2hZ-?h{dHt:q:Z$#sl;n&(W4̚#%.tʲRn1cH>5~P^dC$ίaT(֍ذS=1E1,,Fxk(3عo 8|i)$'{Bn; Pʊq& p;+V-d\,!Ul~~EANfUfIԝh 4l%Y?ٸ),>B|Wwunc?a>@In` 3Jt^ w&w,ǖq؍kb4*kԞg1fƉ**6uƧ6qbr'}?6t{]D< x+K_3e2f| ks^q`<= 2/Dc!!%R#.S V*?Iyʛ>X",$]t~aPhI8N~.ztP% RVZe|a1ktͬ Of@\XYLցA__ 'eo{S-ڈUG U,RKy`v/mW-dJɆRw#6heN> ܹ S**"NܩEAIIi?#١ն?j yT-XEf#Vh*4Q ؇zG޶T$3q7VӘ4(~uN{,G$Ԋ zyq͠D40CPϑ/Fg#Sl{JV'7dᚒZN VO72.PpōLw1RA|a<̹T" :ZlN|$X`e}`GȘOv@sS- _YkTHٲ$эEZqj ߶qBx;ѪQrS[KN]qtZ&^=vR P܊=ɭ{Kɦ5`kK09w~1;.omzʲ¢V,{Yx/4錅*dQEv0>*)k :z\z>Љzcu`-N1aLH/h ioȊ[ ѱW26r ")m=RmE"/( ?hm2K|Lw$%LHY|H7S؁uvVΐxAHLyCL;T9 i{Պ ȱD㍠OEb;̣ l- k՟FUPB.#AA*YyD_C;dDKNjR`e/42_j9%OԖP+1Js`ܛ)-aXa%A_*t`1YD"u1lp Imm?: )P$ގy=,D|L0xߞrg}KA<: Gi9\ITljlR)=skIy7l 26-n. ILebНp[i)r)dw$󴢅#,-f P6vY}.e#fӇ`5}0]8E YsG| <Bg]X}-uq `^7aێsv8oJFcki~dWdKN07{hi `Šukظ 0qE:@K)ߍ'EC L]MFte()Fr]vI 2هЊ wQExq26amUxdRsDU9TzHa/l[|Êpfy$9;44QfOq&#LjzEKw۫cLu6>1)%2{#i8ʾT%rqdQR"XUځXD1 R7+. l>{l6w]j`㻵 8?dJ]j)ޯ"#e7Kb @`$xjEs M[L6a:T3{ؑj5Gy0F%e^˛L.c[B1V t0eL @d{2Cs0 , 9zidzqDlq/E4y@ֱ'Z4Or҄ʱ:D:,b ?_}\+1IXO4W#.߆8WWw%C_,6H|Fh-ZM+󟺃"ŝގ؁' 0&I yf` a+ha#YMi"jqDxt)%4XXYq.t?34I5@- Q~Yp֠-C\y-aO~R߫'k "?|!+G;J^3XOw> 8 x5-zO#wޡBW*kp#&a,ve5grUm<ȡr7@Fcle8rlZ)П1(*&2 tТF&Y3‚ZK,u`` G`cENiCU\aaە# jAC%vYAr\jN} -8"2G S !xC;`xD2/psaE)5}ׄ2ojG SW9VՃE+!:оOpl(:x,.*Im1A4FA$8X.!7AqBQjeɸv.:_.';u'Q_XK&˩% fk])UGuS-v(7:bOvqI0`li VLA )*4L(u t\ W|ɤMG6^ 7bD8S@mV>tƤI;oSNt/rzJh]߬STRLmxڧC7o. ˢ7\g/ 󴠉]}Lλ }U#('*ɽ-9 Z)Hyxi$^ZܐJA7́BGGtn8;xn9=/lfeu9wHvm)y$ч`ۥވ0Ih8z>EbQjgxֹ4 Yb \^nS[՘g0Cە?ةmlxgC X=/B:Q8.>}On1FP0n"yLU NdbaNJ#epC{0L==tKS;گ/՗z'$-_ 6Y.77z3B M7һUG\Yroq͙Pslf%`;ۃ3/|>zR3庋jIeTpO.O94v rϜJ$R(o]{eL6׵P,8DCYŷw$3t9| 6n; i3Ou/DaLm$Yc 5N{5yeYi Y@4_¾Ax7)*p+QGz+LM3ރi ftოf|\g8+Ӭ6=X]$Ɂ .B@^9vw<>EU0O?#MZ熯,Kw1~zʉMa+S[R]W8_9H5*'vC$p!ㆉj:,3gYRr&+ = ^t^=W*p!@n6K^5 8H!@eŰUS~vv2hRmވu=OԳ"v9aw_+2`u45g ĿDNƫDVo8y-?Wa\zAx{dĐ#€[%|HbpAAӗb>YBJ1B57,v@X9g{2OC"8'OH/h5#َ iO̵ofAJLo"`,U@l2ъ-Kh Zm (~'boمaJ"syTU뽆N. /XlgO^-u#i 8!rΉ?bj}zkeEܳø/|'B8`77kAw j50Zeg!rnXM.Pנ]"|\X3i+Qrڄ5F>?#HE%v@1xFqF}0ٙMCorJ/dԂ=v!}VWRX}gvk?[҂(ip=2`b,9)[iv|<=~@D%ސb )^DEC04J#›\<'O6m|hAq|w[n-E5)ڠ`(7~grСBx0ASzz .k'I JYjy)(y,"]b")AlK&gT'O)OQBF\v< ^I):U6B9tGy5^"{:x?| \ v5ߞBu]4l=uX4xi &\Zz{`_TЕ$rwӀCp6k(Ir_ÕvBk}W[wbXRr\0WU)5w0e >Ѳ#RC52{Mo^A_tps؋\5=λR?`I~g.392G 0\;:MWR׳KUl(@Ğ'KMyNV 0K /:T󇗫YL@g{ɠ@J՘j!Aձ;I`zl{YQ۝He t|+e@} z|&Nq-&8:Ro,$ՙKi%'D%1{#qR#'jQܩRɾKvC!ا`b[gQKٛp/E&~kFby*(s*Amtͯb*(es{u,&7zM83[^,!}^ ~ #K/ )MJ,׌j<KqW3@9I̠i2Fy+)>;L7#`! Zw*EgSA0 [0 &dpأMD䓲%y6Wm \Gd\mNH @,Ҝ=^_/Y%+49wًm _ZgȓYZ4#EP]eIa<2[*&t1ʕdTOBņQţm].g95y)N$5A`r$>$!&615De*& ve q{j%b' oMߋX-EU`2NMv IcA"5$!ڰ*H}Άy?e/Ň]@w۵)8" 9bNI xM?f,H~5eF= 0XV\}30i -T#q"x < M[8݌s^44hzU<m4i{Y*fWA" tb0g#Q+t{Yr7dxSWm_%|@^uJYI݇3N.6/z&Zֺ:ԯdƅh<.X3p'v c۵apo2*iLӌ"; BwqvK'v?WkyoSZ' |sYxZ8mD(#M@)4UT|`xTA) ̪779:wk!.: yZp6$x  Dx TKEϓ6)lG41bw_3hvq^ktRa*5Tnwlge 2LŪJAK3^BńΔ;@IV82 &꒎j SjE [ {*,&I*W.wy]A9E)7_u4Eli)81&",'19̓`*mRL՝,a,9o^kzԲ^Yt@CN}=={v]VHjLqUŹ(kЛV̥?AW Oa$u-sPWqRV=*aΐZn_OGA2M8uE{\4˽a!!{42E&~te9KϬ6 fUp!6k/PGqNh.!V; uj]RD)%u(;V7錛rsu46? ,NjWd=+. V}QڔbyaEXicC4 $`Gaԍz|eYZɁȚ%1{&9ɋT '/CYMƹhG͇Ha ?͊L~{;S_߯sp'0|mbDo!OV`8'$uxyfP"׈OZw]jp/.3'e-=<4! қ{B"I~lMܟe[ʞzYLe| A"i@ ,VXmQ{9M `|gDI.^+a)bۈM GR/8= Ekn3 ֡^z;O9wզYU½䘓;8Ό&'\Sq$zyJ8SPp~ t=)^S?n/Ft?c*x|LϠ T^I˹.izj[ݯ݄ƅ9\Lp-sK;AzciCe57i Y-;̦wwFa2᲻SDq)p+8tDR)$6!/hM`w_|VWea|lx]d_ Id`'k(u9R$Pg>rLwWLw\U̥pM&%յΞH#*6!P{lMmpN5JNa^0Aјr]&muiKq9Q5p?K.PHK"+Q-KOU~Amp!qps<;t{P^˯9Dݓ7ޔc1bB/*uæş? 2) -2Z({]Xi -?M1ۜFPa7=F?{.L^G%l)6)Q(mwn1+5ҴC?[C2BA‪erMoQ"E">xv~`7}g+<CwaE HH&1Ɣ+Id"tG䱛c1K *l'ʛA@6fN,̪T[ib|*Xs9y8ݍѴFX nHUq '~a[ \ GuxK%U {~ -0#2;z[HmgIaa"cU]=?EPɯ,J1t*3H:#B܃gR|.%)Q ko^PΟ=al xi7_Ma8~҈E|8 Hp]ɣ MRoBYG/#/ by;܎i ;TIapS@A0G/sVN˷xEoQ-8'4WPC `;71 Sw^Wox<3jR12zN~CS.(h hٍSZ;f\*'İ\y$ ߍpY#gFɶPn %"kbsqʼn:8X j)6úJ.=MMwm?UPHE\$[RaվXfi:, pVFR}s V U5?Lv"l Eo!6Tt)*O2 P <?NTbe3]DU7۸zv@/VmQ'!7(a-Vg4/3gzq? iWwBi\U 8)oل?6"T5G+"N]&m-5C9 k~/ d4b鏼PP-fv2*8G SRMnF}\dIϗە΁\|)QV#̜]@H}؇(So=,[kF z4Alm>_156:9*mȕ ;FVӞ\| }#E?ST2dYy6GRˑ==ӡULjMxmGJ$G ݨ'_rí wrߢRiتgtJ9atdʕΏisz)N CKb6(XjDzfٻQh=W3M 2#0-).z0O9 < g2p@^adG#QanXԒ}s2-P*2vsӽI2Έ6MՀ,'ӜZC*tRq'֠)1[+a .b#vSR|<q>ɒlݾvBM:t)+_)㪙nИn:`ѐuݞTTr ?$# ˼pp,G<A޻"R`^\^"-O1hYkO&шi3i0(E2Y0 J"d}&c2ѹvȃtUQM$mͱ1'g_u>yo( Õktt#ĔpTC.(or]0zq23m_$u׋wN2Y ?\7=)GńBS`ja~)` &'\aH|o?(VYP=Bg:E;Q oׂr,ϫ&_|W"ɕj/QRjdgw%#/O5,KC{p2^` cn~ yė̐Kz#7؊0*'^pIcE5\Mk Q2`<4ܠf"Ó4чWձly/yAr5U4<:_T#5pl娔t~DLH#D8d- HR-}ظ#ηLW;T҅WTE41<.b/@bgr 67(RF,k)4yoX:=r0pbS."t͏ll8I >cgCq4IԯgA6Oi<1SL@z ~TV @5DKBCj63v'f&"D⫣Ëg<:Yֹ͎Y*+BJIü!rvKx"\_Ǫ wKw/p{e|tsܧRE4QBh 砎Cw߉KR iګz͔| Vlsg lq | :31Xc+~FC=>5Q#ʎN/[y3[ ° "/&i:%b<ȡ蓽z #Ao.'yo 'А57bLQ3dd ;.W=cY'aSݛ2>ə1j(ٔb$: DQqK1RN=QJbNSd||+n=qŒx8 zb2u_ UnۮdH N灭? /ag;.fP|7|"iW/\D"4rt,T#;~@Dѻ5Cs`#|`tDы4D-4WkH;Gm`lJ#TE`Q]@kQ oYn:G#Zq %$5ǎCw ϬǭB ^/dFcMjf͓ /NDt$P\d\aH2;<[* M㼌,FOP訹h!+,'Ƭ+[7ݨkj8N gۤv巼4 US-yopQF+]{J( ;aDƇ3AZ,>-N+Z.?MQ!ZیAQq1ā=,V=SXK_S5Ϙ2qEL qV_Q"&}s:$8@FF_!(]BWwb0:`})!1-d)EBO^wT jA5$<=7*b ڳbOGy*Ao=pPƓscƅaoY'V@`? z* ӮlSjwS;\%9̓?T>ӪP hT8$R=:AX$0p᛭>`t#hT!hτyǯhylԢں),Nbff\;4iD|DD0ig']S[tLsW~]wIABWW*˽f5RK. ‡NZj*iyQwqyREҏLۨ;L.ϝ5&g {yȒlL!GJйD\VwjX>;!3{t=RQ Ha_ hh8/BIHijφv˘\(k]Sp&nFuANdH*Mt\"ҖIK," U3ct#}-j*eI#3+rfo%_+FNbS\/bMmP9SVTWkJ t߶ky+:]4 M#Hec~/UF QOrW)m!ƪJpUuϮ*O2׺?ƩhVh|#q\;$Y '_S?8z+ZdTS./ɦ>l)2U{9IHb**zpB/yUUvAݼNVi"d?iCmt3F?pJө\pכ'P|Vi"V4]QKۛ;h/ qTZKŰxƇ}ɛ{I?ః=ޑ=Y[e"151[t>%~a].!H7EVvbmKןq5k \%~W׎B|ewZr'A=,s6C^ Ipt4!!} ƀ8J0{ő`٘3 dl r 5 wǐC>0|ϔ 96"GzBxs;SU|o&LQ'3 =׭?@loE2(P860 ;xX `uO8QQ+%N-׵Jy:l:tup g`tlRO20˱K'2YkF QQce@kvp.ny.wYGxNuG- { (2g? ^oiLj1=[},BXIձ1߇b.OXۂ0c*NFy 7&]e|]=E 22;BN=B' tO.+ ;xE2r9ѩ)\ 2lZMzc+\28)_F"N.z/Lj=0QyTA?oF>j *{<N5-7l]zO귍MFk %LxH@ָFo"?y+ 7Hc2qV#]@wr5|ziH9Zzcig}Pp']8P/W_sH~ %竒I/ߡR\wHupBj8kRRuvD>ըiZi@;8i_koN~:IYkh1|kSe!LJ o鮚aG͵~zO&FE0+{ HR} (Ur^6~n[uD'zz>^6F>"W"iÖzvϚ(0"4KaOA09GeH̔UBnڛX!̚נ`rOnr"錦]9PS{8j~iba^Pʊ%+s} H .hfBgss١}t!5c{,e- aA8TF+=F1G5@|?X01r !Z AsoFĴpeD: #18ut`bf;Q ~ 'ecȔ+uS&RJ0$M3λ jIΪؤ#8|}!7'W'xYC41B|)G/%;AdBZLKdCibu ^hU2ʗkI ,F$`J_b򎨬jL;]MuQB7%a `.Nn)y sh~EN8JjTEx9٩j5wО^o-bmi15m&fAcmIFC0f !aUtk_UeU-h].a'L[d>iURuDZ90 Wp'MhuuӭG(4>y,%!C$Z@/ ADϬ9~YNHO7,c$X}'İsV0aS6,ep@*L5ݰ-oYai+?d?*IwF23Au2ElT g Mg Oϐ扣*xQ/6Y}-0sO/ +/BBl ̘2ʓ[wQZQ$_)BxB,:%9LC$aI:rH hr :5"c)%O7Sea{2nU]DʐS;9v$D = sw-e]FħUpJ;Q6C&yپ1o|"ۘ+(5)V _,_5bpDF&u`)2H&BB_/#:;sJxQ &I[R;}|հx>yG>3d\N{WjU.Z\{-V(]@z!n9%4o24LVl JdCgP g IpX&y .C`ΐ´2b;Nxˢv" .j\4y JD˕/`WJN'^'ώNs9)%I+ I/-pG >b:;R"ԣ99~ pF`lT0-0i"$Gzm. q$;D$M5\&BUsdo [=2Ψ[_ѯH`[jo1i걹Z 宑( ;H,=A&DL;;}g6=>+\ۑ4,u(؀UlM=)e:r& qn?cJ;EhۖhwϾE S|uc^ Io-qQFĖriv_O4g*(tY)'?x4%&bGҦ/36 : IvAI^:x~Dd7&ЗT5L4ḃe%+xвX^Cަ9Ie Zf ^e^׍WkŻ&Uii.Y.b@vvVlҰf~=K6y.`?@k'dɃv~Z)/1m ZX^~A'B C-iXvl%.؋N}vEף2}Fb ir8-XĈ gM΅ezhKq0>< pIFWVM'v Ud8eN0OmL=c^w@Op:.{@:ox7F`Q~hK)&b.#}zi~ Y! "x4Ii%]Ӡr&]݊_,_;]T8.㸖4ǥ7n"IUƌuwDH`0VpVeh:C82Q,s\Qp?b8va-%ʨb1l{1Ӵ.8NywDlU8 &3S8 wo#wCHw ێREeۢB}O݌6Ƭ.mA1!>dװX_RF)tfnGIn2< 1$-t7;[큪5N!CS؁q?K;r<]ÞԢZOp)2,PaArgRo86h,uNnj7I @GoRc|KIB]Gw&oW 2uWEXW .Lc.gGwBۤ' L`YʯED9 U ^('/Y|wIfJI5rTOl鱠 DFèBy52E.UzY&v$ƪiVyky$iF3oL:`꧱շ2';ۅzfOC)dЙy%0 IUAG2K*+ g|bmY'U']'*ppRU6Y V)ӪsSх-8}Y"f;5ؓ ȣ1`1gfY bY0uknd>Ԁ$Z1KP$zsBCr%Ui8X)D,1/>!<3l>8VL1qUb书nPSs0C;0 f=2O%(k8X+OQiCIP֟\ V9ga`ƫT'Fdj[h[$Ñi&k%06(D.u@1d+ŹRrIa^C%W*a0S7 >J3$D,V⍿3`|QdK$h/ț /[Kg@KgX81q FuVSQK]3(`)kZsK]l7yYbT#DJSc[ !uڠZYŐȟhM0[LZ8Ҿ>`%P="|Vk0Wj+W(? yϕ- 9qX\? C%cʰ~N $?Y-)7t|BƳ4B/(%tG?{MGF?rQi J|O.]!<QhICYfokL+X7Ku5* tBYʭ-7z MCƩǖ2y2Oz1a0'7y'$A5rL#c895gp3mF<wHSHr;-ʛ=aZu 4E${B4ʤ΀FX T#ғyDE6vEp8j`IOfY^.=?LH?.|6Г_uDF`B9y ;gMv^ W"MQE:F!Rj0.b`i$ZJ9û3|lo(z9:=RqOQ maYaBXsߑs:'"TG5T#N:P\4+'`{Ce$Iu(nb<7OT)2<*Dw()NMU!#-%*OC/ʰWOΰSl3 ,浐.%W+=ӧ mvd]EDc7չ"|('g2*0mjNHcH}"ng,@\kf.|>^_7B@@=~_a m((>$&آ)(LzA@YX=;0INv9Eԃ Ԑ<q@Ggb?-Tim?2{7SE-JHE;{BAm+@{q$2oo)uC^jTǭV'Tú&FvH0y0Z9~?iҲP< {K>ETN`|#: ,>ؗCJ(P7,„f9Af=^u=]ݻ7Zl; VQiض&bQQwU {(i@$[oـ Jx`J0T?/Uk@)c}H&+el5o-rb9,dpt+mW#DU]k|I]ARuaС2ow7ܐȥ 7wa^MS (vWY)<$| V4J񀇏)߼DL~ϮHlvIGQ2V0?70%u`pNj4Qjr8R}F~uS]I_C|u@Y?NI)۠xNF=Dxa3dl755.<ZTf/J1YRt}ep\"'BOOoJun Cq}XJ6|T8Kr0:2f/WU qwGcPx0Uoa(7gRSp@flćir.zHm7 (f#P=>qUm Ϙ’XCߒe9fKv]@tx|촥 9D58vݞśm~Fu`~\{3G:~hjCl6"MNԹĤkQ$KuO\(p,w˳W;8N@+D=H廒)yVk@Cٯt`_ ^Qʖ,B *['%^L:pQ`Eq*'9"Nl9CB;wX-orܠJWCgk%!Ո#coV`1j%2H|tO͒ =҂V*qb _6i|MW.OXD/ Vp7wVCS!#lM!ǀ ~^ ;^9e6z2_-/1[-6wᗓ%Fz~Q5512"~ F:_p*eرX@#(njSя0m/Chas\UC~|xF`AAOH[nSP\LyxM-uehsMY` c!b)!gY p59+S)xvU.h6i%dJ{upkQ킬B׶V4&@I CGXLE A..[?ǟ'KI-|02q&Lzlvg.bNC٩@հ/:> L^/OHܽ_HsYRŻuDF?*6[U N+:[wq<14<R`*H^0b;m!i 0ulM b[(:ʾr7[}t8uf!I[k'V!1VR!’  d J"#C! @Ë_ڸ3!+B{ƌh<'C`X7 rjNb6~I!&^Sl`P>6p<\%a4^*aqhLF݅-qi2A6p;csQR }XCIx%q ޾߹s ?z.A|0M;Tr0٭i[6%Lr(2YV۔%A_Ʊ?Sш2-Ɓ9nGh yUȗH6|C ==dD0sBo puG[2qX7CLG-s! ZšҺk(S Ԯ>-+ÀMDp)⇎4ҫNYqDI}R㓒,(ak>2RM|e\tE  f㡊Ę$;QI)&\Nȿ >,YQ\KXKg>2f{oA |zډ"Ѕ4nDG/(X3X!K\^LLR;7uuL{?ϰiu6Nx2ߴwݹOh;^u-n.Uͦ ],}>Hoh10*8~$ GV^xthc}@y72+(Mye,F=ol^[89%'z!^Z'# &AE?AJ;1B,"&OP8Lҹ.xCOK(g~rlK 9U #TGJeUIEY^Fባ5(#sSkf]|D&7d1 ;X[=\~Ŝ^"X*d+KRGRmYb6﵌myqnWI,~ha7 ,#K˥> E|γOCɅZ9-3!8v_+CS=4wD <%?YI:Kǡ]=MerMYZ΅QlPIΐ1+L7`EhH#cua(=ѱUD/C^Oq/2c9QHtMBe.z0%BKqf >KB2 Hr! \q 6_.+7}ytLrCBLabk˦ߙÒBH* zT OH!n}B}cgGY#]cTi_ ]jqh]41փѷ,_'nȰ?Rz@0O9=GVwq T߮#v7BzU [BSj·1@D[?{Gf5,JAm0\ t7gG*RVt3ψ<3p,<M)Ma*P-ʌu`2}9e:rӽ}ax<2-?e9%,|ԯnqp[2%[3)xY\`+n~Ih]|H!i. lmHkP_C veu0w\n[y[ lu]G/X$R,1'!^^_9@%[B.@ݾV.5u#{+t[>|6Ua4hZ0螻 >kNXalMzD5哀7#8AE@3C+P^5'yl1e:i!H=K>>b %6)ωoDP0 (#%xg'1<bUfԹБky=r6@b8X`P3}ָED"ly4WVPZה;XTI&D,`IlZkzN`R9IS|!Pm#2+|}I+4bQ@T%&:w Eʘ Z>.)|}ҠU Ʀ:UTM?%k[󖫊qM0_Zњ"5"?#G!4,AEͪ~|"s^il:W+ LGUz!c$mp u~*Ul|#:rd87$g󓇮XͰ.Knia|lɞ,Cq+\)3͝< .L ^Ћč22i]y\nG L^٫ ܅wm#n[gMl61j's2W& PM#(No}umT9 Оx@CH~_ӊƣWimj9^yYӈ`*0t" 0I)!I)]9x$]:ރn8]"঳&,+<eonƭ떂$-`.-N/GP>33697{6y Y)VR[ɕv $-Нқ1jZعӏ__c)є")nUuV+86vRSPI -PUR>VuC3~) gdq%c/ǐ;1 8xa ~W!xrx>U qLN%b11tjxO*^}TlAs』&dִYHo+62eA>aKfk5˓ΉsYELech2P [S.}R@ t{ %F/_y` b3䘈 _)N˯>M6 ˼嫛b| ]70H<.'4%z1?܆i ~=C" C-jC Q?}.P* !ğ~r;C*L}X%4=\<Γw׿"*ffx#DJָ@*@-?w`V^kV:Ĉh@,%_R~X~LԞMDq G:? DV v 8R[ڠI;p$w8bsTWi:RuU.!wl" ʻ2CKngEk0j䛘mRcq`]u $ 7l]|Δyl~l =:9Bb&]gMPAܠr`PP{q"FA60N-K a[!DB΁Ej0Fyq)*߿\|z*.dZ#␔qp #kb\4ʍ@*1QMWOY 6DY\ԨĮE=j/H2G:q'~UukI1BTu47/, LrOGb{P bYE&ɩd ~=d>Rɗ3VfQi 7OElEOz }?{t"QeSoQO\ZyO3qVk#WWU0i'r(`ߓ"->\xgqM&փjeح͈8F}Av7\lᄄ7t} *l "%5ZCJK9(.H^hf\s\KԆxC&<(.ؘ r$4sqT]2J:?  :,ycB^9Ȱ@H*{ g}#- e T%RuM/GPŠVc}SI3Ip ͟'9q%`hbk6,m8c@ ] $sX "h^/HsQ^L6 Ȅ q!6O'n@eՏ+GO BX  |ރ4HӴp&\x. n7vޑw>]WdR{]#i+@oL9 eH]nDjHV }zk"Cn𣈍$SĊ)t8R E/2gҠ 6ng~ǫ'!0bSWq5|~c QAtKV2/1Mc&qjԤixH5jןV&CA851JO!AIwJ]i HDӌlJ:aÛqYg1HJZ> 9 yJB̢{X0xѓTLJ؏eEv% v wI%\DiG "rSͼB\åǜ8e%-JS0_d {w}Y]:=eCKz_W 0UI)Æ~=d =[9A(-L uYf-{O6lȝؘ%a+d>9BEj j–cwF D&OkLqh ^G Zǚ 饚'a354Cס*0:Eǵx8[DO(= E(/^®@ .Rά f${c l`ćRYoQ,VAKgEѢGpe9fҕl.Ԕj3 qp̒T7"#8e7ɚ>X{@X;h淠{2a.v~a:XJ0H$ qqF <R[tIFNueF~hA6hK~Q(W\<7]o{jWA|PAY13:NcU]{LAjO@E">]&ɝ.-W"k 8*Mq"Y"1 Kd\ ]"u_p8NLM]QFj%n`{2Z& mL>)X*5g]J@&.HK͡ "%EAHZbר-!]ÿ]h g ƀ,(}y8LK˛/x՘Qd&0tref ˜X\ӾbaW3c3E ?*; v3Fx4 4a_vӣ*2aݩπB9zYjzȑk^=A5hT С(` !3# '>bk~!3*XE nȋ1iJWMg ꧛687d^nPU-y 5 ɍyL<ؑͪ5`u]_pԾ"FJHl$k| AGzsKsa٘9HDAOiOI :_/lMF9c~1\AF[&E1&'Tm 3ڝ랾gi<\|UiRyRhZ[w nu_{dVE6NCڜEB0%RunjJ&1o.-iaD9 kYjzvD'h̉z+E0H,1["F7YVhQȘΕ3׹EAm͜Sp~d+Ӯm͞wzmfFAږF|(/|6{s뵗{)ÝE˨VG?_٧3̩L. ~˶h_3YvE ZfBfh-/r|i4@ ȋv4Q7Eb(9{5()M:"I`R'_0#^~LX}љ|e6(; =0{=)bJ3n{\/ Lj (sg겓;6|0'<|ԮRQϨ\;A/^UG";(՛0/k)a{B-of1~3Wk|S&zÊ-8 8)Q措[,qdeEyXp–)Og3+̑KP#gp[?\vwǕ.=G" fXKOS~3*z/ORH[P^䰵gj}Äg ~p ogi}/,LN|l\,*ycX(c>ܪD|gLu46.h6#d ǁͮo~%!ae@'#UbB4*CfwaMڐeݐ`MSXnfz+Wik뀀YX!I2=pԂj?Za@ mP P{3t_,!!| Z_Q({]>`z9^j3ֆkEQL]P@^8&4旧,KNݦE&u[ ǒ]Xح*}bTYmbxk!Hy$m!O.ӗޒ}9bl (UZ} gU gPR/x9; wUr<6Lfڣ {W.CXdObUR| :͛qwoh>xќ>"?,kc8 T#=sdz2kK [Yln\qi7Y!0*[0Ϸg| G?EB[fȱ |D/hgxxϿo~I)e&);ȯ ;kz%U ܤ:%3?iW%sr4urPTo+Q`Mh65˓ xmVi`[Z~?K> ̫8V̗ܨ&6=:!fB$;r%`$["GTg|x>H{oj[禊^ΔQ-/evi2!-&q9w^X3iQ;6K2( 4c_`yԍ\ :U+^/D d]p .YJRR KP[$G CB>8At%A2s_Ln*AOT@n%CFua05d<}ɯHkSL Lѯ)Z)kZjL+%Uz.RNfW#oA"+΋ *7Z jvb~J6sv R&W*u L[^z\͊N8,S cJ%}Hv=ֵjJNy*=70˛piחp;s{ 3,-Y>c2< -kaY4v% _5ZNcչr8c=wB tP-s@cS߂0a|ڢJ8˛ g!.= kM*Sy+"$/EANS<8-Xp!農wt|DQ!g8S}A MtE.*GqG!#w5f<g"u &X)yCaLyX7w ^=MN}=U]x{PƇNs$A!ל] gX6EA.'֡U/]kSCA u դ&侣P]z؇To<;uZBkKlnI[#˿f|x)!9œVPs M6kB;)ViH&lØ!rO_: 9DhX59RwcH'r:;=*[mO䙤HN6ɺz;U[dz  2TL2غ܉AF)Y>q9h$BJ 鶈G| gPa2b~Y$):4ȭpw:Yws.΋0"6c?RVX9! Mc;*J>3Ьy>^Mfe_҈W# ʳcC,t[B&|x p[*ZF1/ޖM٢qeǤbQ0CB'Pz qE+Nb6:]芓>1咳rve>%$'&=I)*sGow^3pl=ʡ,pC 3pkGs..I<vp:͋@8h % $VL SȍOsJruigCmU#Q'=F .jOIH7|NAG j^)Acш[iu4n#'{W"Q]B53t@ȫ[)TMJ64:*v%^#E03nrh l^*N|Ol`^4 nJ^3, 1&Sh?2T,2ݝK d ,f*V ܠTq&JM^9O\izVGy]s0 #҄ si nA^+Pu%G'IﳳrGѷl zm"7h HE|CT 6mثKuZo's3=؃:JD7?*E!v5"(urtqҟ\TImNF*ϤcyrH3jNŎ 810>%h 2ُK:"9$ǷVk>e8* 8O T%EtE1܊La2Տ[fCtȸ^RM"Ɔ2{b2Q{.miUU+5\ZX`B5r[] c>B|`NplDﻊܹ?V޼|1U,%21؁je{г!y4c.h>T( _rP=c+ju/n~#F`a*`-¨#S3HU 8榐0:jtEUQb&@ 7daܶH5:}Va? ׽I6N]׃9=k;q$hU1.R'oDݜC9: qt~XE!j,,O ^Wm]Leʼm}[aXrxT_'؉>fM[Sv?|,6&ԣ禁 Fp{eo\74G.SK H yyk%F(CA N]D,Ub -mI>ACĻ=Fta!^}]9誵jy 遦<@ fP/=8Ӫq:9^s IS `  f6Y}ڿn1:4Myk/ iw38:c=bjzף3FIp +ߗJ/.BCޏfǚ *&;\Az{MZy3t3oZ߹k l[X:Fׯ #)VNPB4׫±Ї^@"y 0n$W 尔+VO4dq FU@ǼJg3 mX 73cXWid{ؓ[*ӅDhոZց74q$*ZaѮ!!oE@P$CG˔Bhm~1߯fl"QcX]HS\=byhU0͸Rmo W&(%>GjwE Đ#޸M 4StUA,6h(b@$FWGOZM;=kU+7S9S Q= t5qDƑd4dJ)Hd*6.]סּ8"R]AA0qDF>@k 2a 7J@ &ŮOPd-S;qD%@y)JDDw0a;2@wʙCIQtDy, > D]Z Űvdj.rL5cNuT1DrHPd+P%pPyɶ:nIR^Lc*Wx0Aqdу4)BYsI~T-JLy[wuzЃDV` R]KWd]=_䋀53o0w~th c ~Y׀xmE ݻ7窻 &Y.[)2E8D1%GQJ /p4"=@_뼂HBA6{J#}~IP[GmpY*)(3<9?PT)i[ĩ{֓07W|`je |!bxJٕ~07 z9yl)[~\3TͶJ "Ƹd޲o+nQ4o&AM$|]W@3I%.9gn [Pouf:<9=Sk/-y&K_WDɷd7'+7<!w(ƒn!9̿8&CԒ%u;LJUru6ν Vg FMb=3jb(p%fyjTcUv# ə7}ޯԄ-R+g!At No/FfĤ_{NX+Ta!}RR hf[ni !b!%e$.6SwR̠R@x=Y3]2G#efgxVR%Of i),UkVS^.,yyĻG`]$߫b?j4RlL`S}9Y0hT<hgwX(t>08@Buxg2xY/h^J~ȉ b4Ñ+]G&=,>q,GhH$ nu'#?HfVU{ "ކAvlIhBvLMd5wHf2UM 4>\UaK/ު$OŃ x; YN`lJgcT BH^U?A_g;܃!M&X"]8'Vw=ֶP3sRNaoŚ2eH|!]^nCŨ:Ok6aw ;! $KACBKJ; ߆/ *z8?>HPd;=6 "^@!І"ា!Gsn8`soB [:7Y&R,k!'~)Zť%8{͒NklY88bRk}rMgG@:Bqvz򢻲sG ?>80aաD k.x]Brk50R#tlCTW;vίpLHx!ҝKUHYcOUO-aA2>أ-L%uIM&[9}eV(A8!Х2)IJ MRT#*jkãҜs8)@r)3 E#`hmZx9˷@'p݆sr')R7`zbUч TrsqU{!e'/_Pf )ѯߦh)fxeX9N9I- hICp,P,5 A){uf {2P¯ҕz" O0$ϧR>&PY$J#JʂTEhCDbv5s@11\^|?4W0's `jvC>5J9M^]<*k:N[ࠤ$@Df'A$7+T@h|Wx_XxJzp (_۷a|/Y8 awkd|&W nR8Ft0/(4+>~bRtpD`⾺ |+"}ev®"'gRD q<Uws؆IߨGH5`'@CԘ_`dk!Ëѿqs:E׌ޮuuU :NFJI&p1A PV0G68 #VV\n[0nӼCcBJ!΋M8NxL)֒ԑ)9yuG[?>`x)]T\].6}>, I@Ix$# KVp kH$ {(kB<ֈƠneN aX92gqԲۖ6ԳJ=K cC;zm]$cJ=Bv?lp.|Efy&&t+:~`ȥ0JM.W 58m L,|qW{⟈p@͔~Q`^XIv%}+]`Y#Ow O @'[zQY9`+_ige'IhL3)A D"g*{+FG8ۯZqҪBVi*9Sk| CBI1559؎A+A\GPm5pNDH7(F}8HDG\:KㄇhdڂI1kGpyňzaP#]r&5]g :c HŸxkF ڐiZkk\4GɩP,x1*4Ikh =&5PՊrvWZ +4 8sѰ6G=J<2y.ZVt.ij^OE{c%N2S~0ALS&QssrC-q EŃ`X89wJ;=F0\ KGܱ;f&@t] QJSڃ~mg1s-ɚ'ʖʅ m*ZYk0bDJ-i9h6Oynaё,{]_b3An8RJئiϑP7'qR|wctp)mRk~D7|C`T^'~!dzWܛgTڧ4:if9OZf{y;MT.G!ZH9+ #~j LwE!iZ4*ܗ^yr!kI/.zyE:5V2rܛhn1 #b; k?n7 %%J˂nFm/(-% o|KMi< ̳7͒)|ܙ>* D^鷳z8ˎ ξ\Dxe~)qVeFxY vٙwj&] .yk:0?3GS}_s J"H;yҧѪHFecmd1Ee~\bF'pIҸȨ0 L&]U.Jd5_j};Gl_D_9"8vc\)<&J+IXn>~Qp-w$`|e$prp,>ɊvRݿ1 oaty *!vJ* mL{e[J1. S)0Xj/nJ6 *%f:cy3P^fT=d0CU02f=UmkvhPqqV0wփ?A#6XBKfKnѳlGmͶK#efT",epCљ sfj4l~w{76LR)aD̳ ~|vrE51[-&Xnbh3pxYId7~i'dk MίCvxHOS7XulX9C@1g:t+v> ]Ȝj%5"}L65^X|ͻ5]SSe[2q5}G{"=׌WΗ:O&zE ]lrゥ2p+J"9yʯV&(\W 9-^WʟҒCw6Axf,3C\%11PݶJPR!2cřQal[ywo8%T H9. gYV3VKLx.Gv N45x޼ EeKi_Z6 ZP-¨]އ-׫fdYX觉/od{B{p3>ّqoWlԺ9eSW&dɀ\QA\Yx8o1]<]At|lCF.6c#Xii^śI1?CvQyr1o׌55X6xEnM&guE‹ݨ]&#֊K5,6{ǗmȬGa9wMc~;p,9%lf9Iw/:,hJ樛 = T~"ׁӈVTON<]Dߣ_z;KUg B w@P)onRH{XRbQne78 -R|o qA`S4]Qk<ɶY7 $w5n <7#j^;xI29l€4wPc[}r7X93> Pz]&4[nMT k$LH&§?5Q޺ri% )΃Sm/e颕?KjXrw_qwGqQR!lJBMk` h{nf8S;C`ëH0)kjbasZ8lׁ $-kPDOKY186q[*0.c,5Vi=sBFA(qĔkn%LdD'itB*4,#Nk'*W"{ÀP̜L>٠g-v-c$ar[fIjj;u)_P4 Gn(XEKo`p$zPVsnB*%D~TSْG b+]e\#kstr'zY W >FIQ7fc6|Bb~Nӹ^Ō\duƣ $0&D-:Jܯ62=iM"oN%xޡȉ|b*;=pgVO&<"s'*:F&q:44gabbV ĭ?ܫdiozLB?̃lkvqZ5:~PtqF{}aZUqgDMGB<i2"}W][^KУn=%6%H(S]kM뢲0GNou^Q[yA[|7CC2@Ɋ~|َ5Oi@t{ܯ#dM)n@^09-t5vʢ8εﰍ D+=!*wb-%ouƥ*"x|އU29+?n譮{'|{`Ǚ*MG `ua3ycS鱸 P<6+t`ɸw2lk:Scl\  f kC[13*:DtHES7tVAgUfwbOeż4Y?YܚB*.@Խ![-h_ZM ةUޗE gՖ`]kI& ZEYpem8u;ùhcTs+84|Pĥ^چ44@z"nlWT*I!c@ilZsˮϋOD(i(*UBM2F꺓: 5ZG?XF~ * M!48a&ox :p+;kq%Ayn2/rěar{xPf& ڧSghp^¡6f̋ ׼'8^~k\edW,ѨokTC(}R8g]Fg  3ow59 NbТX4YPR&h w,o <aK΄+oq(䁚&;@Es[ 7]g@* 29LTHL& ?:3iL>+8it`\cנNbAƑpFFHF-%r8M o{CBԥ/XM'CLiU_|1Q/F%: *gJ zB[Ȅ5zbSZ4DkN "0< joKx oql ]??9is2OK8$4^f9~' P1F#]AKz?dZ;fBPUUs{}bSa|^7(i=3&10 hA2Ĩ'}9TNp{hؽ&M(,%ʙt@E@j/ ;9pIIt`*[k~TB^hF{tPCm~ GQ̇4ʼh>UViJ 2UEyX$~Oݑn`rm[<' E{{4Υ/΅6D Vdb2ҝuIHCo &DzC8s&my|eZPY$>uSm13&k?@SheYL]8mc3=8S24lNԏ|> 6oKM16JD4spF!؅ N hT;B,jMZ-\teyHb?PcfX hؓ~۽j v9]lb$#$-P%gwGk )BaznƕBEҬ&#w~\ {χ"w o4ԥ5wrƉ'fh`Ld'صL AO|%Ĥ2DhAƈ>pEA,@.WJȒDz8%͚/hY>aX j'C" w>{@M 1àdS?$7j^tRvnZ \N"@ 6Ww`E񿷎< ynݍxԹ0Cp!v͟vFg*_ YMD 䀱{gvV0e*x=sH%j0Q%cC?@Uv8M+*tS* uk‘ /&`P[kÍ}M;H4#YD@&IPSK:>~t8%FVbrÔ' -0$-rk;'+mcO'Wo6c; HxܿÓ Qr]U?ݞv y3wPB-h4LΈh\$G] 罉/OzBqNJxYӆ ,(05YM娢 nq42[ \0h4|zL~~7%B*gs ˛.aϱHO>i塓A"*1k9WD΄QBB*d7Z|f3,o5i\VuZkM]?['dr! \ڱ7n6?5VsdR#T.mj_Ջw…t?sZS'\-mR؅@˕aG&.MH.LUM.EFɝ ֟u-_i-N+ݵ{Jb.dWK a-\$v~HGQ`&P*}jvӱCΞ3L40'ng1 ?W) 4//]ޚΉQ!݅0V#jz<^JĻ*ޏkj<ҀokcٯgX+j 섺1Un싋cU' \.b@3RM(lzwlHE.w$J9>=v0`6"!r'~7*5]gӃK jͩ8kB4;fU;WYuB?.u<:VLdPgmVp1A=#톆,=|`gcs \tLUwA=dXOM;%W8Or3 վ}3ThiAz'樥#U9 eP [1>Gֳo}:F;/XCIIkf͵BdA|M,kQo6X 0fJ˺n𱉱x`9f.4!S}:Wge_CU^O^H)̯p'I33ǨMx n,a}Bk-qwOYUMIy:z;r aC@#1&PXܤ"o~:!8<0oYDEFdp<50Y4w67 Rldgڳ+a3d*- FCB 9cm;.:KKuX /Yٷy9md,ډiP^-nylO fQrt0Nぉܝ5[BGR e:fmK: KtMj`O4߮܊"^.N9KąW}' 6Ӫ[$\R(k .֌t|đEgDrf؅aW:hU`͍08&Ct>T4 eXs4AA{9 jͯ^o>RVӺ =P5wN?*qMveOrHE߂:lV8{B{뻧#]j$5WOmdL:?"] oJO::I2pQ]uycmG-PL[z|2(%S$7tĸs+yW'8AJ5lp1ht C$qg")ȸUzTqhЊ@loBۺ+nM}K:T}_lv=*6#1>95rh ]uώ!s<ӡu$Fh4UXIwXeuDؑ>DxɮE( T8ezIQTDP_7g==IOQ#wh\]XXn>MRmu@Q13 ,Lm82 .QVpu)%}&'z1!ρN:zMW0C*KX?6QyZ*,>Tw(L%!n20Ftc(.#_ˉior#|6eG=і(Xױ `aRFy_H(>F (`nH=dEv(g1I"bxEFy}2$3)I% >"f~v1r2J\, 0 , Kxb:4^1 :$hpCG ΝAdU)gC?AsâM=ÞE5K *L垏"pw0iirzԦ'~(}]nZWOˆHk2<>'ovFeNUшD|I7 zu Jf8+ŮT6Ǣ_zP f{7x!DodQH{x c]Of:Gj ^ڱ&zhە :!m6 ojȳ@ D{١9tg_1Rqouw|CD*,8J tY4WlVc ᇖDwȎT ]TQِӜ `l!GsߎHϗ|V|[dlC^o2("˼#ay7*xEh B{ zJ@.m Z'߸{ܕg(xJ%Wm[qɊxR*cr9T_^0T'蒃<*R{RGT+Jж[;kq] <7j?g˕tH 8!ΦaSZ@o\c"̌}! Pˠ\0#MNنhB|6_\ ɭя͈2S,d\5 qG{zu$OQ[0;ߴXWBS+@9>m_(yP&stm*FPAk}F6x Bƛ^fM icN^%#Нzo8d+KwQ0B0# ;,I]g#یIC^*Y 3uVY:DEJ#SAy^˻a@ }.B#uO:STCeǝnX׊. M@Mbec'!"d$^CJª`TPv>w9xk`(~Pۑ֠pǸu/]d) ZC3 \hT|7 Zc a!>y*Эk쇤gcD>C [ZҪ̂1Ӓp*엤Y<t@gJQ[ -X~,CXvuxX)a߈:qC>I^JܕBY]NYGn,4u3ޣ]0DHwm/XYk5IJ@հ &\,e hXi] t2QCdPyye"$0S+ņ d<;I)G6$*ˉ)LMC;NԽ>r-Pe(4M +b)hiTpWd' #GǏB ]!9qLRwP, Ƹc#+dC+8 p_&IHȶ6>GM D|Ys =}q5tr2KXEWT䵝 DО(c̋ܜv:UO!Q4#꺊Dmnmēb^6-& N tHzԛy5qED"29j / BqxxwPV/&1migqP̠ux7™Ͽn`[nux([];K`4&abUs9v?6aHi̸".5;8Ov-z.o`\Dž# { lW@=vŔ$)5V&qWVKonȂ^5h?[ǕC(I` !n4!})@<OdMZ $K$w)so_j4a}d g[P[e2 s:wUƶV#!kJ|o{S f$QO2nf \MTUlIȏNf &?<9q¯ˎ!r-mg̿K"b:ѼܫʞHji)ɂXgQ:C7!Hnsk:U~-@,!A Cr(rB W yB~cn|ϣA yMJi[4ٍtc8C[_#G`=GtV)Q[ D)qlt 깍 ]ہAtfؓ>u=;An+v*4{->WNiEMױLeXamS?:/y$Y۫{Vktlg2[w.ل6憓ze(}']\f.+ ^aYlk9Iv5CM} JA1bLbkbE!WچX,@\Jbv͒H96f  "o&H u s0cEඋ݈ & WZhN?/!df^dhgc8.1 |Ui|v]lT>aހE4!#BW c LGN<@V 1h/w 21H-28H5ӆFҞHG.#^?w=jRha_h( v!}R֒z"gУٕ@V!ꇼ`%C Kb. xB 4N)@ * Y+mZiaLcYRX}@ٕD'WE+@\QKӇoݪzW8sפֿ觛xJԹAZ<(ޡyacj~~AųpWhm2d (} fa91Q'!G#ԑ<۽ ϶fX]ȝb >dmѳ߽7=\0Bj3ynk} q˪CXA$뻛0Zf!8w(/qx%2Q"-{ZcF [M^]A_05u(ME : PrFI&钫ü,ʳ} nn"UU!]eBc &$J¬v}Yǖ e!v"P)Ρ۲@12`6 54hػfc؊YV"-F 44lZv,diz:v4)EOM0pB/'AO'x?hb]pA_ZMHt!&g[U%uĦ)7t{'o#|͛46˲'sbsY^BlQ@rC^wtv yq "t렜X4 8 !6&`askͬgNrcpAvg Я d(Z*] xIiF ܼƠgţ‰%(95F` }GQ(ڻL iA__(Ô<lAk)N@%CѪ4LM;kƽa?Aa5~c 9+=1+a;x.q7[CIu1UC壟5쑒"_م/QKZR I&A*aSUAdhOǒLW]@^,yH!f̩Pv t? (s CVPTQG@6#Mvd%z̈9*|Xrd![8rMjSQRy:0\<.EQv}In&W :rB=H6z?Y,BiN frrDRgI,2!̕E@lkG}+aryny(x (uWLڜR-Y0j,G~/Gc6eW9iV^#fh.Kڕ.$,CeXF6!XŽz&l!5yV\W )ǎo(jPwiȺ1k@WEĀ(^9Ȫx#Ptf~Fa =1SLQ.(;@,9M8=SX?!:yF1џ&as%Ar}^aQKM$U\29pwp|4qfnmGS7<7@V AvTI|Og~AC99x;xYgfcJN GZ9wBGz˞cVIL 1J ҝOXdE))Ȃ4RvC.p< ▲tmoю_-@79tTvc.jPDoro-NWU+\^;hʮJe`šI(t5@Wk!GV>~BTZ B:'P q/L-TͮgrG8n?v6 VޡW!Lre)RKϻZ:Ho\8YD!\h`*|0~l97aʌM@;&$ۂɽ,a!-r-_@)G@Y/ LA+Z ېl(uxs)g9݁A` E{[h]Ǩ3_sG@ɭ=0ߕ'#{#\&J1|)QmUuRjji7ëfm*a{!Hp߈Tf$-0IΒ+i~M250<+V䆫Tưn4z=M Y}B KJƫ,I{Ee~@.Uj0lg L>]6MlEB Y]'c~ɎP\n`aokUl7Q5#!ydv2>{nQ(*c,^U q{ziT-G=FnG'ܠM6o9 N5͊gd]×WUժ/#'%w@8[8ZDUg=>P(;LGduJ .`5nB|FHAxc:%h蘺㢬hI/s{p*h EG9A xg6{d$9:HfUevZk,K"ۉִA(6s\Oo-  x5orߒ}öҴ Τe(sسkDAǞ.~Jl.*K9'uZrnC{W |"}Э2Z@_t3'._LŸ3\>)9t8aݡ<0I8\ת$k*=h/͍ hVr,CKe?kt**7'ĸ>"^J`d%ӗtVz ~ I`YLdp8d[zVg"3Ik*A6|D=QQdr> L%#ݗ#(_8QZ7}m+W5 "ҷK(Uz(r`!T;qKw |Է!JI4)N0L  $oABgXL3ðs F1 ŏ:essD|[4!EFWj1;^oPI ="s E'H/42?^g?>GZ|Os((LTܨwtoYegf}UY\Ep#imxx@ރKG'ܛIe[C;`?`cIDo]'8߽$W<.ޟyhw.qW[z?jq`*-1bw(nn3%.@I$=hPdZDP[S ߤ|r¬@&>\eS Am\̊$[anطz6jZ!??k9ON k+C뢭ȥ]8?vQ)'7՟Ewzjz #,Zݣb& (_|Aj<949/ͮ8tH 42eL/LΫO![^Q` $d[M mK-)i|3?Z@)Lu+SyXl~O \rMB#Uc[P vgs'AQp@*OB.D^d?c< S5ɃYp=yXiAgNr;Q:!EΙ&4=Q)=,$;TaR ~l) aªU[ >F:s7-N/ @ yB@ eb22$_.'"KZ>LLU ɫKnT{rK"}H[ڹyd|0i(Rٜ ?T6WFU+;َ$ LXCgub63{I-x'.mHEu.5-Ty?Ms(\+CAkt26_L_4qPyfDHWAve5ngcNԿ:ԂMb#^ _-5T}$(j˙<Ėzj@2K A;MrѪyժqSlxp#^rnErTVy{NVpݯq Fs2KZr<- ~8u4@>yӄa|w/u0o,%4t!,j$Q˦TlL2]XZkiվ`xx¿j: k.Tr}y!&3U!⎔>!:)\c5r&)Awb&ֽe_<)<$| #0֌ _q.xxtExH0[5׶_"-'ry6U0{K"{;Z>ŕ5J4'T(xh3T?w9o`^{Gh :w$v*$puwt]#{/2VLŪ%:7'ZA $"fa]5i-ctgsABeKj\//e0Xns]^o24yAZr礐CZ#'Z؏\3DQ-ZBQ"]i*n9^Ӵd/!'FpMߊ6,7nRN3뚻-UDn!/h $N\ 5cLߒ(ɀKv7#;#q رG9񉥆F6tn@'p)~)i9q+ۃP=Wkgrn|O#sUbo19D&!J2z/< GC:=ҵ1#i 6 +kmp{]I)Mٿ}&'IPmD"GxɿNTlQ0|k)yGK'˔Y8v0u }2# |`.S{Xv! Hj ,|=dŪ|@ڋOR~tM(e+e#?NaHCM H9A62K7jHf=עI"J]W?W9dŮ 3צ4R ח ~WO]oxY݈. YbW'!~mvqI'ߗq/ڍ+ 0-ju0Mk֢ ~ #9 |PAyNEI*RzO$ \ˆ=Vd3ܿz=u oEn{}]7QUΗbJלeA>.̛?2}EyvZTώ Vpu!5_BB},*au{sRNXP}pϒ tB8ۏu4] bEҨJI7$~9gq q6 b^M$vvʀڜnz(OsB@%9 &!'`蟖MCҭŐN XRPqw s^ ^D:v{P%>97LiF t{Dknǔr\;Ϫ.$-;jP \"R~K*y%9 YS)~lu?4?hI0 TCjxgmZ/a 5u gOud|LKhahF u\&ҵ{sH18>6k2qQCThWGJ; gC"x1'e8=C {$rlf2#ȍ!B.!Tl3'|STV.mP|z2\Ózĉ䅠pkx02dxbh_9jԵ :9xK`2TNN97|:jj̬Vg_±`R(#2/=Jlźhoe6f8,?ZY:8gzwol[ ,Jp(7\ة烍̣W ғ*^X>J՟YU mG&x=sKPuCSHr OcaD9JSHp;i7 ۮhl(v{\UkAʹW ~[$dlz~1^Wq(68%ІS6XkSጤP?`UQ9)e/(&$iPZpާI}`1-9jZn|=$ 4%0 O-vwX>.u6wdhR< }bu<+KKYEp ;.kz}ϋe *H@CCJ$/>pD슮f9"291<&˾$%M`kTX$vp`oԕPcq5-wS~?"NyE4|_DMy?!bU0J4@? 6Jc :]gj~GcA9ʁ^5F=j͖|}NyO7rGMR1K+O@ L*XweDs ABa nAc*IdiKI8=W|$W}TqS ؛^8T s!D6Xj91,gjLH{Jj?HLk"F'8|jg=,?e^ls\w6r'_3 l<4n}\dwyx|ۤ:vUT'OHzl))/hr#HLy;Aݣ)녺Wbȃo&ckqߡ=ew\F22v*n@PuDjeд:L̋A?"4d)?jel>Xi'|=Ua)ߨ ivv`SYJ)z x%h簾h&d'֔8-%8#P% VNs ͔۩ϧ-}"@c.x֖(nО^CxʓCTkGǙ!J:h`E(Y{FI!cU-p5=6:wөϮNJπkZ~Gzp?O5W[Wt 7s[_ko"5JmPR/F*:"wdQS9wy-1N7UN"LStҗF28i ,I{< juBYe6[㴪 C;>cD"ӋY=5"ųM~h 1Ba61:& ;<"|d,M!r>.$C^T!׉Kgˇ'UbɉE"}zLnJTb)!TPzkae#:Os"Zkō<+٢уrl'HiAذ`^gХU)p"m˖ǏKWE%3 QĆ9)W& .PDA1 R fKWv^@v>ړv潯e渉a=[U Hse#oQՁ6cҏȩٴ$.PuV7Mnc[~_b"27[EMt.p#BX,qF hr#N̒?W!_$@#d0h|<Г}h{$0|8SғJ0pܙ1u<訩Tg2;V:0x? _ӆFp 2ΰ`\kˍ`YCxU6so&M*G9mC{(4fOcѤzRI#ڑk ĘS S\)'pZpbE}̼{  0g(_ bhFY$hLpL9/v@P̈- zKu*:5ؗǐդe7b~taXF^)noNMUY@V%Q9#3pP;Ļ#EX Ъh! Q0v*/R9KA6B4P+je;lSO9FRkP YKЪ~: yΝ 2o]"">_U*YBV"I5YH`8Mo mvq*P2&䫩 [|P("%1]pHR]> n<ʃQGpG605"7 cv$zlN'YM~{HMMKccEBZX$W'tS-8?$`ʙ>dE'l((m rs ;7xk`ΖJ\`Umؙ 4^3oGVle/fr.azX @|X  B=z:= )]p޾ˆ#z[~va'<.⑈xrqs/Q_ -j&5t֨gwubWڱ|kP+/cն+;0ƫܿ rRcM,}ȸ80&Yǫ#OLV-_{p|Nd2У7HT):E8H v6ݲ~jE;R';*2_*d\*Cƈ36`:(/&63iuCɮ4V`#"ʵ;8 d Brb+T@q K9[&r];}*]WXUZ2^k*ɳqƗQ.T{H;$.DK13G\z\2el6ޕ1'UWG$,^ Wa*.8n{;S!P {Wɣ^a 9YMqlH_?$k Q80qǗWbYWm]=6?_|W]Ao))Rpzq.eB bi]C}S=hR8N+$c+QOlꓵjMiR*'G-qh9K7mLv/ZgCc* bB w{Õ W\| WDOL7#Och`˔dž1qFO"öb plJoTzQ'Q =6#v)¡rp%'$x\ %Ϥo6  m&_͌e܆Wh ̛q迲;ΌR[OYkE:}A}Bg_}}fFbu]ya C4UO1Ѣ1{Zv^ 0 O&34ʜ~3L(ybA0?Ŵ/Ba]$ (M#goi:gWf`94"cPa4hL"]rH]ntG)?Cx:+!oB|0A B2}ҩtrhd&ੱ xisTj3'7?Gt 7熮Xtj)\/ՍwG00 Lm"KJņ?$~"VM%ӳ_b,q 2%ZE CbXlB~)r0QdJfe'X&x?:>eO݀??DSI'1Hֱ,٬NrQmk۸͞H)ԃ9$Tѵ| <[\\~ߗu:8>;S8;(}F "e0f5U[Ȑ\K,*`pbZ& \',[EnG/ѹEQW\!k@ҢN'╶1$;[em$TcJ oˉFur;^KR")pj(6)7SO/;^{$턺vh,OFWA7rje972RI #oZ4|qmLq?/o=.<[4$8h$){EoEvl~4.`kEqw>M0*=p\4ى*DOmQbCŒ2 ?.`SfX}{ݥCGz\ '* l>h;aE:;iU}zJ Lw]0Osw&ۑ8}V=SٙTL>!a3?/PvG+̷ki wiN}hҥ[$etIvRYƴ1PJ" 8p&lܪS=˸@l*/4O?u UɃe\{C`\oc.-m +o{+eqɕ }5Q<8h#(2Xxj;g+ ;?"mbR\`Oր U Wq$E+ېɨ:{}"}{ gB/`8%-Fcnх _L>Vn ^D;k]MEjP@+b$@PmLt;Փ$(⠣%o2B]&N0gv0 欺J +XeX>n%JHa:!?dj`TEŐ8a2M13׭@+vC.o++|Qa=i"vıG{7/B\;U \3"GWR͏/N7,99!fcå:xi\@M0؞y*A5:rzDnMsj?oi)>og<^ ]&q7zeQtQ31r2T @ X[F}h #=sؘIvP+Y澗:Su`0&dęRwhJ@,W9TQm"~Ak ř'_Kkr?kf)6qmtrM.}y=3\v3{5@N]p^Lp?ũ{%5ݾ JnZʑ'\=L̴;moe$Q@)&%=G`|ߛ.[c6a E @zqdP4< 9z7QП>L5Rnnڦf:a&к~ІR}3x=7I(V򝔁@‘#gca 3Ax)#JV(P0ב?fu} ;;TCRWZpܠf LvvyNz@7~{c:"{ ì'hi-X:8Of9B,Bvlcu[b !^a뾸DI,"Nww -kZd"t@"nW{*Vmy_9pVcwZWő#^5>ջȄIbH& D 7^ $Y(3YD,_6Y, Ac9Q¸g0w!/gymB9!mhvp}*պc]㺟6_ YbGŧNXI;5ͭ]XܬsѿL%ՁΥ*:\2;A%bnXQ*cEre4 8ɇ쫍XcP@[P3u}H8登 R vVLƠx bzzC̆4Q2&ur[U[f=7u€Zjd齴`ĭDʷ.Ň8  ~XZ'&`2o^yYJxBHf5hmRh> Exk.jcdI܀AZwf$)Iw(@υf( w 1jq?h#5r0x_l@r*jݗ c6P3588զP=1=LTjW\#4D nd8I=et츶Vq-*\kȼɆ(o̼E00)o?yy"~\gmycXr=h&|ظB G3@8=9l=8Y Xqvk޾ATG)  9=60yBG9 zũLg^Io6ZW] i^"٢*uAw|U87YYCNj5-o9,BI[6BeUa]>eDou]M>Mj) ݵ/$ h ; ek;e,I4@-!]L2a5୤v[~< zOnX`#cSƲәOzB͸[ZoTEsgpK*7 jʃJ-v Q8+4(Vg7.1W)wKWet3yvN(G؅jTjξy іk߷MwL0=aMc`Ux0љSH)ʜ&1;ԳN7 2{´v5?N,Q:%ݝGQu"27t"܁aWy@ߎEEX9ͺ4X\=3#fdZvE~?!.kcP凱Am=hIo x_;˳&ô]SVGɩ71 &,|Ӯ$ܜ%DlmdZBHZEyI6Zdh[ks8 :-&\)X9+wƤh ogiG~i EAC2F-(bt~tP'HVݫPuCUu3P|6,x˞=sWt! ^ !n7E})I)( %ܼ`YZ; vO\bBRfU+Ky3v48=JfaN*G\W?qTNa xGR:aYlRXt ^S~U밑Ƨffq@}J;p+^:6QM_u1vtg@Q[ h^?vmy6R]tY}I$*.(ųz 4W{|ډm̸Y?K,i LJ1+0晬l"N~EزDҰ|iK dv'"/{<mC1ՏNo eĈJ*/Pq$ߪƪf?`BC09|^6W%9 i`zAms32@1M!]o#b;B|4#$%#4+5c9IÔfg[uG;Ю寉 hXy%!SVBv~45X͌x Xo%%DBawBpwзR#5ӫ`_<(O'@e_ў$> ϹX1ʞ)X?evFB>¶GEԙp'lL.䔨xεjGIٞ;iH뵍9Ş0خuS SBBsINcKrpCPf$_o'Kp!u!x*d̈B qQ ‚7T:[rdkiv(\+`#Q8G9EE`?rX}]K2J- 8x n?jb!6ZȆb DP?R&wڻK.%jki1.')p3pk;Q1gHl𥬿oNjC#Ra!?=-7Gf+MQ3}[ ydp)~Je <ۭH7u$5dJUv!FSZ3uE H:kdô{l~Z+ Pś@u!0 Ρ[dbb=2C "y9Ȟ+9HSTy3'jA _t^ :y0#VdEDS86k׍Ԁ(Ws@6p!Dʓ48gY$\qa:.LJ3 gݞBB+O}0d}4~%\^1[`("f?4Sܠ72PV1sPXӍź~%4 B(]NTEMROpkשH;6F$8$KrZdP Bnޚ P& 7VɮEz.yV/DdNX/R< V?dv Ϫ(vŽJ(cV{=YxBk1-XM:U%[~MЧ86mke$CIn^Լ|R!rׂ۫ϐmW'ڄ }A oT(CnR/poct ṂG:?W&8Iň,U`U2&)+ǁ}A^>h.,'鈴r:_*&j"k4 9`NϖY;,`?H!Ź,K@='\GmtV<ơ痼7q %HE]~Ph1A^ŰQqfWVvKX Fی"dya-yِxΟքB!NT3{<ԘhK!6j3AhH.ћ$W%]d|Z2zhxuwo2/oѭU-TvުD| @>,K"aFG6W2lQ ҏ,.TZD&m=4Y)WR ^`8u] 7;q:i~kؙ=GuI#R .4Mܛ$U: h 5䡡->H>4H;h}*! ,{E+d[N[ &W$M *A\{xdSIe.z]+$x_^ۊroMT p06 sG(#9G)-)* 5![{? d"֭&QZΧ;qL´ߟ@2A~*RKQAG 3z^pwkdYYz0b`rhL}Qs嫉?4UeC ˂/,JSڂ;}?QFگ4Ӳ֍#Əх2L@y88=q !p.ˌ5Z" z'T㐶!F9}/^'HnDB`R8l߶ۥAlNэPeÛc\EY46|6YPg%klA.~NҨ9c|9 $J"cxyBaMN{^/c0#Ř7yD?Yӟu|(@GG.+^Q擜qI^K 鬜h摆&y [rƄUe8z-MitA.%\{H>ѣ0+ o~!i9Ͳ~r^ lu&˴-)όeH s"v3`4$#u?dsOGsrŧ/Jv{NDriokB*Nc_2N^N?.[ Q7r +NdWC'DTǓG,jW!m2]y` CXL,?4ke)F;FFOG^dy,FVT=^EN: y-$DwӟYNXnH!w׺AeKz.>=F',1{Sn$Je4U/)ͯz& WC2zWaY-:|5u(]&v9r$" $^Ltz@D}hfyebHK#FڞxuM[хw/^d/UGs >p#d*ث"lE,Xu:uL6&Zc4ԔZ W[~Is|6z'9J5斋f]Fx_%1E37jVQ ٚKX<%2t6JOև#?۲ykaW /y'!qrMIyIHj2DM` ʉs|,GwvFCoZ7| l܊(&goEǑ؍)1hڭz0nfć5]1˝z *t6*LadX$W^\rI{~;J8zΒu@o+Tu4_LX8BծS7MSTK/yjOYzh(U'[Z$c/k;:԰? woyV'qj0~|T1vy`]r ƝPIPz'I7*ثFTwUyp nX?dϑeZv%oV,,u 2<.÷E9y38xI B~ })Q ^ 1v'* 'C.iV$ɥ"7 Ck8v|b4Y ,I:t;5J~ƾ+ )\ɰ,kʵí<͖͢R/cЈ ! 0BG%C⼏jd:TBU0y'[T{ٚkB>L=a RۇB$| T]G^a >OF>ЮrlBTDl~s7 ,ZVt{u 7ZY` ! EIx'p8K)^yڵ]{u+ܽ10 ngz8,K/7#h@ ƣN!E` q[)|Q0L7¾`ֻCP[ ##ChZ`=xqٹ-23 -}ZMa^MN=n_F=xGK*ו:1ie]`LtaSV Xwkղ)~4F@N8߷B73h{jۿ_ ,h 32Tr ۴P(`I{ODX?A$WtP,'SRBW`K;ER d&a8!2n/h8I Y桱n93tTD5LYp¡⻜ȡXT܊0zsml敺&Ff]g AP @ͪZ;7ҋNYvaroOGg?ېc#$(Oƫ.zxDR.H[~ŧ24lşvM2uۆ?| Y5ڽ˱Сÿx(iKQɥʇ]/lN 8/\0TFc)1?̂tDR肻C&B/?#>4_ϣv5|.ʤ+sNxM ǐ=06JJBLCA)O;7oGvg+gAWb#d,8$ bۘJk,HY3c+&t E%M@ I"mP Fdz SW*ѧVkƭ^#r-H($Dye 'PAhzC/U HG/o @7.ݥ?󆘧=XN)L$;"q7 zv1H0L~h?, a+v࣪u m0oN9yMyě9lG8JOӈ-csfGɳ|xWO3w['F!k${ db̒[*BRD%|a +uA /\Ln, OQ3c}mIGZXAs6HT-jZp }X l2(t1$e)HZHS]|FMCj{5uW$VKݹf) jޏ9?m2G`l\">!#hfX E(;:I_c\l)=9NOQ i: $)Ňtb]N|$VBŽ݇f$*vV{Mynz2mJ[Y$%3WB}!&r|[*p?COp&ş^zQ:[> #CW1T mѓXMfg6rp͑v, XJ"6j0Y)@՛&W?ܶh?u"QQ>h7*C[` XBlhv.X-FA>EECEҚeX/gN,8gbAނ 7\m[E9КYd\ #\ɟ k/ǧm𚦴S\VhNlO&XBl_c JYXZD*w]lS?ibz8g++NC 0冓&& w_*hm2~tʮϦ;(ϣS9vvh$CXSs8l犙D2|pbFQ ޢA/C};%:Ry6 'Orjnx2z%&L2.+֝mQ8"3M$t(N,jNUC 6k9SKFV])匜$ p۷^O-TŻdl{82Salȷ+3b d-;iedGA!a>4bYdaN׵or'ݟjfpYϗ/@tjӨ$#" >X3gHU zPBM\HV,q~fW үO ;0YTEcZ>~gHf0*L;иRPz@_rF]ʼn{\͋/4lp?ϩHK<˔Zf`/.;J${q j ]K(u_N*f GeΓGM@D}Hxf[fݸH"6M9㳀.ЈvX6oȌoifL,ǭx] YybXr {ۉ'Ccz)X] S:oxh2Gxx:A/T6ʷU'dOum*)> L04 a:?HY{9K^m2b]|F]##RA N&nur :ZVPC4U<{2oIFO1(6"%r> k1'gN>ߛFމJR&cC2q\#f_ja8+]F P|%@dfsѡCSlKwmljڛ̚1VO5o|ۆ{EKƨ%A֔}SfłSu5EQ@nQ&L:T>zߔ:wXiفh8/$qLL҅'pT.&MjyMGݺ-3a@FzӭUXLsjѦַʚ~؈5,)N&k XxTN[k8 FI_u "!SZaTh+?Rv[9Rw1gI^k|D- >]w{ǂB*^A]jnZ4\esz|X&{83ĵ0r<'6Jp_or<$ŽIz]+07BtUg,7*8r( m⇨-&[%dr2 5vQ#Z1qߡƃF0J\ZuٗG*W!W4VEju#\i UN}kүj}\Gő)D5oj X.6ԫR{qTsp*I1Zo٦`HS`7wf;MFǯ1]ԜbUk}E=,6F#Ĺ2D/E?0f8h]\y} @{SOaoS`*[4[W@Fs G!'ӣYLz%2l* VY#Y2QoZ|c~$yaz*'֌!T%@7`G%-z8μcs~~n9좡g84.7Y.lSƢ|N5nWr ;iWgK-Dd55Qzd )g~{mZ2)lc<pYB6vիeu:ϯ9A^p{$`}皁1%̀_6ц>=Byh|N߮"BQ3}1+ӁFVq";ppۋ'ŞH0+~"N-נg/cS2x*x⊛ ۰[nsajLyH+cr,w) "~Ņ{2,!ԔM|]t&cю'u[U6G,6IJ4LgĈARq^Gir!:<wB U67DK/t(Ӿ.$Gҹk z+$ 2Ɩ3t$IU*ٙzipl ؝0syI$i"DO7qx,Vюa('l}aɈWb  rلPUn) 6L`4/4daR161j6y 䠺(@ b>ݎnPy_g=,Rܴh0sXlzׇ0n-x v#ɸhƛm?-8-6؅e2q_lƯ0m2T¼h͝ެ0n,x4DzL-7wRŢx(SFaY$#pHGM5P/4`? bGڕ +gUuH/uuTpˀF gyXE +a* } :+QF_ݿԞMɋ'۴y(F}{UۍO,ZgPBQl $ZSAh5MZk嬺U}?OR`O^},< @0?K;pRCp"B *(O7=Gӓ0 v Vl 1)!4h) 9.r`"?\i@61?[)n z:2[[l@.dr! 5jrazȘ-2?H]/\Ucl4"i{a'oݙ;[~Ͻy,'PğM,jmF3q-$wVaB$@ΚGocZH*z`ݤ;Y{1 d9~(9}rVS+]YRo!Vʾ3-zryTlۗ]*⎹ ձnյHs V?S Z Y$gi 9BGS$Љ$]; "$NǦ/xT+t<3M*39,l['IB v%Ӂj5=Yl2]O4KRΌtdJ6ThtR9 tR8wx6dXF5Q =:BSU-{drR/ęe~/DCڱ{d!R[oԑv1_v {a!1q[" ZAk<,"d"X"նrwpȾ8+bqi(UZ04URI~&LOBub3ޛ:[SӖg'c 3._qމDc}Aaf`>ԹѠb;U&]?AGxʉRTқ̼x=V=5Y7;, _aU8 r @/HgNtK =wӮr$x M@ŵ~n 2:T>ؤՄ$;5\MZ&JﯭB0o& T֚:\n3Lr-X݉48@`^fGbg&\i'főe3b,.0tE/>-K**'3'oj r+߭ Z)Ǟ!t@Deo#q~h?%zh:8/`s:2D8X f q %~=|0h4D[1oپ'U/=g]06HO3Ë!o|d/`3W4[ʡ'FR%CI1 2hR5D R*&T_>Ɓtq=Z^(kWZ2䭰NWڃ38̟~3;\}wI+-ܛA^(*#W_d#clif3 l{6sDRBC3⵲9G Mt&FkI ^Ň5 m.X~ьKy ˃gD$ѻ}1s?kdz Rf_kԋAO\kB#)L"˄; `I(ZߟAe 뙫]0Z90 31rϔd bd(#J)*ʸI2E.<,S߱.w) %_&Q#u+Pom[H$ w(Fjꭙr-97lSϲQb!]3f]\-KW XB0BD\\Efo c< ;@ܞN!T~؍B6a%\6e~a62=H y-/HP 1g/=jMn!4C'tb<3dY.UgL|| ]1DTl#oŗocxFZJfy„(FQkw1\g,41Lb‰bAp!D@|mw^,*"G_!N0rE,pp1~^¡9{,tg(EoX C$Ug묵9zfib}G]Jw"dHWrd? ѓwOf ƽ8ջȏLiy>xH 2V:>2Ӵϟ` 죓F?!0R3|>&9+Sq_$ mİf^}%ý}Z^);Y.U' zzAtL9OTsVk,e\ԶBBE6ͤ~Xpjt8)@ oOL[ªij9&'1#[QoHc=0.Ioa~Tv6}p؀kG +ٴx-J/E]?w COu`uo>׈sG&#+-!eql\[!:<4L?D j|[o$PC9і!Eď3Ob1w[Z$(Uڻ(d"!3 )9b3٣->Ė?@Nf&:PJâ]9;o| _d|T B7}S۬zWs+&0dlih"zD /(@dïpX݆O C0ڬq7meIZb(F  AKءV5Xk}D`w8!m'-R![1[I1?M`8s\|aۈ)/~2lݿSX$)X׊F@9v[NLSqQ3iȕ8H~[u(u7;(t@ Dn%p}d akA9 Tf٭X81e"* c\tݗ>[A'|)$b  ?, qRN1YCp*0fOTI9._&pRc>7Wf Iޒxƿbq<{^k ;UPKvPJ!YKJk 8!´dKtu]p?{X̦|H@˽P;m -Il%ՎYlτ*j6ET޾m-JjQD$qUFsB =)J[ӤxvpL g@]0MJv#-2:mvIy,y\o !nV8 s{yϚG2A=nbqW ČÇ jq? H= )^:lt껇a5BT9jilEȫ,MugNUzurwӲ_Vm߰IAr&4Mi%r=M:2mi(-¾ o(7-/G}eY Pw\n0m$zT $H**`9.'iI`~dp Ɂ lZc){0O")zJ"yPQtEZ{>dK6àhVCr҃!&4_vyS*̜n\pkW)_8cL"HYMYxrq26d\Ӓ@{pFBSߌQ7xR5Ixh ~f,FINU`?g;խ@\h%-M5d)t_jJ"cMHà!;.))3D,<Т<|m)i^Gfou iupZ82G_4%uj(NkilaodwO%]Gb2خ[$ 0B(Tys77 ߒVYec6j' 'k}|tF\:⠪;DTcr,Lw2.BBe`-^f:i9X>!A>?¨ $\ᯉa9'7\I~MĭO.,pY%8d-mvIfNsU_=2k7bU/+7-l;'@:Qs\\ 0(QM9@m-@&RM%bU\>`gHڑK@Sg3'h5+ra$Moc Zp.45JoޫqwT Z^zpT*kF6Z $\ aeʭtnn[H5MITN+;U駢:Ƨc#wŅg6,d,hhu#\,%pT+iVV$,W]H UrgW09j&]˧Ca@ɵM( ZiNQUA (/@`zlC'9o&^ƈCB\Wv[$Ijh Mh' g 6Dxsܩ*IyK1c1&$6ӨDXC2v&d|鑎~e@T߰!6D10<'ˡ'lMZZ/[dZz*eZp̜Ljf%b+ez9#7?35?u!oa޶E҇A!C%7bRϰ\u:L;|WlR7DEƅJpRX G[(s| d |ѓAmG^P=.JPi GJJ) B-Y{|3EdR//+A>RJ7?sPnD>Y! G.I.gPP.\K } vy !-FJz~F:=rku2OZ,&ISۓ~ήh=b~A`UJXvM9&?E%!v^{E=yBEB^ },tq}UўpR ?T_[ {w4'adHH= q!j <8o1EDZO kP*UE̼6 j^$5I֜Gv~$)d>rۚBsD5Kt' وY_IBcINNM88O0p39t2"bB_PM?Sr:iH'7xYZ\dE:1Phir{YiB6u@,1@v*kĶc&OKZJ:Ҍ$JF.j_g`D` -(kIVG#mjB@aKG 5ATjow߃cyw:q/eŁ(YwZ:i晥#0EءSiʵAAʙ3"8m C]J%ڌH(a7d2R~7ImM'99A0\dQYi 8d#[tf ̲+qk <'.go?8g|EzÑ7mƊ};;ƴf\ul&afx ,gӸoogϹ$:N8gsf@;Z9ޡM|5grAJ7oa\ *l";F gNߘ \ղQM$x >FDoV* qy#Xćc~rzz. @*-TrkleJ'uJbm ,nFMKV^@)0`_g;,S'OiD&m%2ںm Aԇ ,=6CТ 齡L5]0!7]1xLJ8K/{%lL4H HO38,3opb 37jzx%cQYFI²ml%PwF(ll=}73't!S/ƭiL3ZsJd̫8X}o $0^HI6Vpofi(j>1#9 > qVܕ5zX=Q<1J4vIt,Q\1o%Ybm@aB%M)0:,p6q.2'G] D6Ԁs T"Uxa~C8zPd)>`qF/դɈ .%>r2ֲPF1.lnK؍ǫhY!ThcHPbⓚ8l'~Z,P1L7d((U"9ǃil?CxHbQ;"EʰW+6sdq9 ;0LU?a]"A..Rid%ڄW;jqCW4G3mkSF}pTM,Gna'$ZqCL="M̃s{+ XBɀ haKAO6P7D6S?6w"ALRK+7|OxT-}nLnu DϢD%'p*P$0GQ $5&?p q*Z.YTCwC쯇3`%8͈&|_ ̊ GeɋJv2AgW;MIM[˼|0Xya/Ĺ8ЧP.*vÑ=G_. xJ3A|.b`* ,E7Gp>Fn L02˼[Z >`tV)YD L%6rwPӀ c>pA"88(1M1rӺ%0fi0Euu_)[-=/?`ɷK(09Gx{㕬zy'hN?ՉOj_#M\+cf~&-!ܢV[b岖?N 6%η!C:8_JA^_zj]YHM,p?4B~>NFmmmh7(.Vt*\ D`R}>QjtB@Je^)yo]KV/e[`) SE-_(dU/-bP<~>" c, !Xu0~OBTJny[_bsίRCJqHt7vQ/Iɍj'>>V"K%PRVsA%%8BF'>+4T\CEJu2@ {!scdCl͢g /<8X F_#8>qV4hr/ i^&?CQYt X |2Tvn祼a/K&ToUyĨ !ۆ 6y<8>x^rxd[u(zObABÆHRXp9J:ryּͫΫg8݂[Q!6@Wr||CQgBEPGkέQ`]02YxtZ8DZ}^:q}eP*nhy܆hw:)LB~D\Q (v胁eMz[UA•lW. +͙"hOrk4"%%6;[g2/& A)O1/^=y֢3Levۮ+,ï ?l'mpgB;HT5{k+fx}m$)r*%XD,BOWD֩ x!Ӟ 2|M @B!NձَImk,HnYou7qsS{ i~=xg;̄'&Z ְiOen@`{'uzv\%Ř4OQi!JGb=G Yt$QR6ZԴ~Ez{FAuBya4hġ1Jx v ^͎5:BlEn75 D1 3rϨwdSyBDze%+!n+_4~7e 0*.=nfR<΋Ag[ ϊIF+: 0((71b_F QJLj7b߬x6|W̆ .sΉoܧ":,# had=(k@%S'0#T|> ń늣ҏuhlN"ee7u( }C6Aq(FjPx[?2)j@\,llp!:cӭR<&angyU$>"y[*!aqƙ`%+g(8旲"lLqB0* :ADXcyh pIlv'fRB4+>)uK[˗rT&Rzr/Yd,WZS HszT ڊ&pKtA!:KwL\ 'RL8i]tOO)\ᏯѺgk]0yYRb}3#KKrI 阙uaHTM0S5PhϷSGM;Ĕlcc;>KYy6>ʫ4NM8G-d3Oeѹ] >hSm=mO<|6D ۴Œ Ώf>`)ׄтkjc/ Dy@2]-(+P!*]H0[a'KjJ6NrA@(9 k5eTOR7fRNmJ+"MLkH@]"27$NᰒR:H1JВiE@,bGJLNdgf%>),sNLVtpD~o3SP}W ;ld4#O;-١'*8'wdf82u_ޅ` ;҄]kl?<ӳKҩӟOQip0;Z yˁ7Y&Y0tnRvQo7|rּFCAB۽8v fUY}رB_+V2#W* .KRJOZt#=wR xqSwdmq0?q 8֙yzݲw.,9o5[,}G7Bà7"J#1 ũ:N4 bz=ćGZjZPZ562G˘Y~]*R  P:0t(Ƈ5>}Q/0}ȥ̼%\GgPIN CR}X3N(ح i.C4j1*ʜrv:4!jS/zȝ/vWp/1 r3b߼=2H|c= kxCW 8HJڸJ"Т ^͟7s *,%x2:ΐ",hd\i8 'ie}CJ fD/ͩA55`>"bA-l&_eGҎrm,\;t9~,&SȝdZK|лGY*._6?a[}L0ZH3_V7|U#bY0(8hʐI 5*ؓely*d\J}reI>Xfa8$Ua[<q.h뽡Y<e(ۛHD]6~tEEPPWfb qNUNH[V$YC؊;G1.GѴ Eo: jc4ECXMInJF^[Y#T] GYèa{ ]9@`ڈwBe|A0H"\\xY smA-TG>!Y:<\#X%o.6 FT<=-2#5FI lj UniTJŞ :.U4^%k p/j(FD4j2jC:pqd]F"- t(=aĊYʐ,RY9̭&5+S6lr$X} #Yn!")nRb-Lq{("땝v=w3g{8%F?_P}nvaѡ}snpɞl _]ﶋS!ptsOD᷶]xF˩?v BƇƶ Eۼ6j&2a*N pf{*5RsM?? $6B -l(jl|փ͋+vsS#vo5by3 XhgY42Qϴ06Hxkxn-HHl֥o[«m ޸_dȻDf|ӑ253ݚ[ D%Ⱦ SCD,AEgu A\TD09;va;eSJ|MXc@>v: &z ̂V 8) zȳ 4ŪF$ ryӝSY4U>d[Kvhڸg͑b hq{{X#/ćm2uN{k A%f-~FwBA4>Ն K5{6=)5ÂMb^#y VG aр6=%̂Sm:s)Xݫ Y7cڶH& v5[Tx =X4,AVFhBA [AS r?UC3z[ O$2GXE)FDJi)- IXD%GbʑϿ^jܘ]?>F6( +Jd]cߞyQ{棷5}2 ,d[Lgkɻp;6ǠٓŇ=eܖyu3Bv6/ev} k1&#uD.SׅfZ$?TR=;mgw^螹j_.RdY0gV[D ׊c0 w,qX64hSaؔ 9rP/B!O?[>iID;Q]|Tж#+ k38!~-"QXenQQƬw5A0FfU:i \Pi/ƶFT~w9OGH i0*J¢YDgIՁE Wnl1^rYp.k.&[RalTVϞ/p{JTT +x`iFܛSj@_Ӥ}_>K'3_9̆Ykf,&[~Ǚ;:lܕ϶ek*5 -aхr$`0 xAy~?Iq1PT}$_U؂0y[akJ"Yw^JEgØK\SK. $A|j<$j_/Cqӱ2|^H%kL a4qY^N⻀'$gGW lḞ^'E~ne[vrv?v#xQGhɣ IBq&  n-%zk*ru绸]ן:Y8Y'bCdx~TDE kjq+noz\C%ժ5&/Vӟ;!k7zm8N2y1zV! Pk_/ ?rμ2y"e$5РgN tA1 LP_Be1iMBٺɮF_Mp6S9m@1 $X; +'h6)8EKt a9ة5M8yy8!r(SL$=R(j%2ַ4}.'(r̙n_ 32Ƞ6)~$(>A?5 aI>i !L\;< J9rj7EBhSxG$RX8y)/1mOJ>_l \?b_3K_^h, vdf D2Et>`%|R6:=:o`XkR˽a-7oݛ06u#GHFY`dĆz7Wz{Ѫ52 W]AeV!<Q"TV46 ]y5w!aC1$hVP~dEecft)f~í앐pp| 5%6jf]$BS!/qtQ/7IŮd=> {,!x2#sM&mʁYClnfp>2k ^a `)ABͯ4' `clE983!C }BRe6a|.JHԇ^Vxa@/P +ʚb'$r%j[|VAFsf $h6H-Ez3z; 2 +S~T  1YZ祯)X:E#e7mќ<*q`SKF[ H8,?_[hd-mȫL!ɽc.đٙƸIE>Vd_"jOgTZj|慎#7[0^H0 ;`2ʒ7y^+Nn3ҀϢ/M${paK9`Ek*>y\l kl׷9Wք-rX[^y² 9ݒj?ү]+yqxCڄGew\ƚ 19nt) 7#![K:K@pz3-_`ztÀFeG?dP:[|4|xY%,W*8̣܇?ã8=;~8@s<`&q75Þ( 4> kq hm#qF1@HLcU/dZ"MzkaРX5_\ڵWAEE> #WV`qdHV߶mCsq:J(y~\n@ 6mID\| Xf0c#P%S8㓝}|9u%qs-'`̵oXXfV!z.%e*95&JirMlσQ8<; Dy;ruT\Dh$5zyP/ӀU3J ʒNϫ*e*OdB`"so ylAOL0u?ʕm0A(bV I['2sIɀc<%P7q8 N)]%ǕhJf.j7jX_uT׊=(G o#*ar?-O`(*?]7i9ۀKMNN}ZL^BIBH&;*YG[ U^9G{5΃?y+ WT梪 I wG]X Zp;zjL'&(YDYh;inOay`n*5GwU9nA┓ K%(GP6/c.¢H%2`|0~RӅlU6KE0nh%]ሹ0ZZT 0& 50vCΔ&TӔz*, &Zrq"WE OԭcFsccAP8T»_r+U$Z0*ٚouhlX&LbI馧5?eE[Ѭa uI8o+R:tl.ڊԨdød+`ඳ8+8m YSت$^Y-?6SаQݑ?Rz1zͼ3ZxRTwIlR8Sϰk&v(,?:5n=> zRfr_hmX&aCoN:6>dÊ҂xc/uHKP`i{ kK'RC&AK^ =de- &ю h:WQP=553*I<.-oQX:M~A @aRB?AVYDAԡ@X=\Dp( ]ʗ*B |,Za%Biv!tEz0J#G4Oȕ'f.q_Q&S:g\ va Ck|+`fK}%ؼtȯ(S.B9-<_C"{Pfjzz7xvp VLR9?Z\ +F$ u;0՝!{!ͮ?VT7&;%(F!Qiw* B*c+`&[N"U@а | Bgy B)S;o޷j*F=[w”&*/uv: %ϗKҘ_Yi)7ϵ hE]D$~j$ܣ^6k)+ s-Zhűax(ZYZ+$Qq@^K#ee,x~f !F@ll7RdΜKvw4# xP@FL;д^Nws^@Zr;ߏ3IʜФkqeŤǥ T ~اr2`.g 8o_QG~+yK;?>>09~=J4+ڥ!۸ 34yCIԛy7"dXip'RT{5n \&T<4|3>kJNc!wt|:=x h~oA9[tR5S8cR1 ԝUt_ӬjJ4(kR,SݴJnO.`(1sZS{?34QDd3B H Eu \Qp=z[pW͒UdT .q SgW[ܒ|qGa9x'P C!Jt7B9F-eɒ|`ikks]}gehZP{ p?wI*.Y%ct+HU`e0Y*z|#ozOdrc5&KaSOޕHoǢOE#jRFT{)!rR#j$:!|Vq;7Ֆ%U+_#|.lpfQVMäR -v>UqDD[D«gnK#rK"m^\F'fyzi4R[3 OC#@#L&c|Bqr?*KƇ %t_1HdL0~s -mFe&~2aT-`rr$45WT)BB/KfFy7 ?,^ $rhZ9nK@qQ$Yd6X!,# c Ő|P1A{;;DAk,#yR}e793%i|xwXž۪oЉȄߨ݈wT ҐlP&VGLsX띄U"vV|it$0;"1 eTdM',݉s ɜoh!`3Sm!YEq!fī 泲r&c_ zGÅ{<,嚤zE.h\. #76ӶBz+3nȴ4*M}ճX:(E ܍A\,"-$̦\ [Xۮ;@$R; 鏻=Xf8NMc 9XE;Ћ(Zտx /uzc?+O mƷV2ݎ?$c N@(˖sdM%UT1Q޹%եD@+XQi9{,*JY(g t)%ar`W }o|j?ƛ<\i|O;7Q\ױ~@Z4TmOUH@~&jAWIzه pm}xp&O J7|<#:Z !يco!uv+IpO%.ZѣZL.Zz&(˄;lS B?PީMCJt ̶Zrb´;-/YLC=J}Md]+-&ZRBCr +Ř[Txz/lB'm1* i o8cd#fz+S!41Zn7;JR4Ya~b`N`懁T1Y"זs~2)~43njҏ474(+oS%O"6NU)VN-K^@\ -4~w T稆k^޽s_B4#QT:uKmι(D|,s.cm") 06lqE9oɶ4ȠU 4)˭O,ٖ3;NZ@/% YYsKI^Tlu?W%.׍ABqF ^yBCG*8 OS{+YdᣇފDX"3 [>r|+RM[95HI$@K]d!S&"6pp'>NՠVgme×$ۏX4rUrG ,'IiZXM( |iJ~Q{Ҍ7T{Mn:׿Jؓ3yJ $vyId9]%8L^c P0bHbv6ȽxP_MTGb(ǖT6xfRgYDa= uQr#]pEȇֈ!ݲ5ZRٝb}AVcy $;mzBn !g3Φ[ ZЮUrL̒%cvp"8cs͈WKvy?Cy/?p$2hx)V7$]9/mp%[ +_u6!2úA05 +؀'9 AcҌYI{%;>hLE7_?ċWz27m(Gc{OnwwlT>8XycY<|*IHQ'|DYW4'bGsĀ)>,ܽU&+u yi $7l%9CǢoxƔI#NIL!cWe۔MÀ Iy32{pfqz0z=qs-P02(]Ւ^Nbe~Unu.MP,4H 'H7q}NPc ¼t5^-@)3NY3V*Yj]ҿkVN;bzl/N4z"/ \?-[U%W<\(;E%o#+fF |]m7\ȉNټDm#\o@楹E c(]'2~l{/ 0x E>r9eб(4d~n+E7)BeU\HfiX_БaiA̔LЭM2ƓI42oAFL:ťƁ1%-%)yn9B2#lm_ .ʣĮ8Չά T"^`Y^n˺dHzA2%L,n8J+nJxvA1$2!FWu N0h<-R[+*RܙsF1-@!nV>3|TWsc[q/0MQC.VȈݣ戁a:D"S٘ʜh*dnmAgF+(I4&R) },=8cVWW5)%Jb]Y~ٸi?{&+Ց1B=z%$Elq\cٿA9~h#豳o9;_M\޺Ǡ )=IL[0>䲊{A, / I^f$U% ~";5Hz4C_fB1ErqSً|&L_>^bhijUGiL(LuQG$M/qMᚬ,z$ex") i!c f厙!!D2ԡ -.ọ+O''>ʡ ]:Vx!9"ՓKrC5?Gl ה(Yo){ζ' +1 W~.!ᕪ/ـw7v(W#WuH_gz2Eu.曏V!U|ڣ4du1f܊Ej$d#ڭx˕ȷО _tװn\Ϸ # b;[52*ץ]DjFւ4ChtkF3[%YBDC 7v[=p/L =J\D5Ҏ[BCeZÂ5 $sVOߓ@bM^3O$SKyނ>6cI@ mZ3uVa*&Ϲ mT9 r"gYwHʔ8 \~l >QG#G-MeгEH &MWi %v]ZCa2y ۶$S%pň#IW2L߸Q(önoyH|`H5]vXeNOUHK(i(m[ю5}zv u ԾCoF7S:JZ21D A<Mw (iՍxs4Lt{P ^^Y M{}&/?fOH8S붜bG:`)e 4=46;tAINX,m)x8v\~Mк1e4U<D{-ʞͦBap]z]׃}^?c]wC<@zWOUH4n]*PwAi:3M̼5*,HQ,h쪄\ .{.2!Kwx nJLCs%Vso!ٱ&ŹmYC}# vI8դ q-s6?}JbQzm[ɇ_]p۬GG y.a%7ç.+<ݓӂG(E͠1}uosdqwƮXPb%J7J|(ڂDvIA` ƻD/<(Qt,NU~X m"ǫW֣ ݂A}+r dߣ?ÖΝjql V-u#S++ #O8PN]QlmS+z\vTBxmC`I>Y dTgӉD #Jr/KT(9^d^28?y FX0F2tI7hE/IXGW*@|s-7ڔm$IM,Ad$IN;&zc#Zo0(z*ȣ7~0e'"%<#y9{#9z~[HAS.7ZKM~pL=;z4'̵5``@ɟDSG}(u)i|xkCF4^l?+Ψ?f3=pb7 LQ.fud˔#^m7o.KM|p ̦}^) i=xd[}C0"0fUB$제"fA']D%[9M-~Sua[IDx8@qf :a%((l #.ԆW4[htiZ",S;ƞ@jnJqDtYg`.6i VS]!oƍƮ&=!}-{ؾ/:_6B\X69YHq >lhhalyt { .G NkӻC̐+HfPd\ݷʧMN1DN%0oI8vRrd@Q<;.V*k([.3i&CvxIaBF`2b|(E46<9f]RZ 9Y5!l]'8o#JaX\ZDO=P26np-V>DJ( ).%{K(h]X5MrHd]L@`\t2]R%P wHe$6ش*~dm fU !Y5rA:RH Π{p2&)`xЏk\Y-7]+Uh_HPst. 0b̢TkHht;ND2/`j5!ې;ĵ8TAlDiő\L-m%yFfGƈI)5@|5BfDaZ:]Y}⏓O~ 4IT ZfÉ um%7/pћԿ7' xI *E9DݺƋ1;%[[)e"RPB/VA@dl&e锷Dq޿gosuY( >.k:K.S;T>AO_6HtD:0?K` cĎzmTLM~}p}ۚ]_Tԃ^Uu"UՓGg,{Wvc"ѳXsJ,BtT)i3S yb*>,ItHl*gOօ0 'E `0;9>,I̥.\Q-LSQ0 ?:(SyU D*~֞Q %'x&х_lӺdZ#x6% ~KoCK Eҥ8,i_" 4QߣR/ ,Pd*E-_t qOUPMR׾그='H$pDZH66zW&ų3g-%2UNwj vbǦAfnVVb1SFb~z=6 ϛJ~ WFl6μ zq+r\y=_Wb`2%rGR8Aj=H/B}nαH5cObI | r}#&lG&.zv&0zc?\Q%I'͓#3?]ưFVUN 7 7>,?J2ݣs)*6 1jyR0'G|!;=ŸTdlBVmQ?xE=)5}uTd3|(ѻ>fiq>@i IF\.xXZ 3+3axp!,?@/B1s ]Ã|0DR#Y[-ng"驃 J_Edp|C"a#x?(p} xe@$ :ߘ[m8a!oi ނ!ciL:`:Eb9{۷CW1RǟY!ft] c=#6PDxydUaMzEEun)lBhK?D,R}xVmY%WT%Df?-k G$P…B@hf:^&vPmKGGrOX~ޮma)p} ZL6$Jb} zn(Iw(`!~S{!t8=XϊSQr2P .t*utlYP&[ цF8P|A*Ѓ΢_?0rՂ뿾rѿRKqUK >P5Yڋ2V>[DEAT+ܦ&K6j! Z91aZ'kG˺)uYyDru`5ta803y>c%ze90>yhyô3TQ({^fH(r5ܐ ^0؊4OGּ'jց FL9^"e$.9,cp  WE]m,.hp3"lĵ¶IK۵P'c)iAj}O3+7J± c}$hS7SOW4c'ڠjb Dupx?W[A:@!84I1E{ZSnU"3] vư1B濋yp0/Uj"tf7o`Q0 ot݇o \ -9DLHˤRdL 9BPLi"7S9zF 3 38&3 |!VN e*P9Mh~b.*J V{RךpYFߢC@3(9+uܧV azV솔Pý2} b}%ffUnOVtD|az%k=mS`4\VxNeHYY= S\/\Pq -6.%h6u@v oݷ(T8uY%`Gʞd5c*<앰xMdd#;w !рk"*fmS,mQΓ؏I"ɩN~]\Ի\xX( yd4OHeBm'K 0~¤IIˮ;ɶBh>t c7eXNo<ٔ~\['17T Qj\땶v1x' {H)ZgNC[K h}ˆn͓_]v 3D*Eyo*:K͊OQ1%[oðJ}z)y !oӁr%b9 3=^&ޤ_`~D&l L(™g|ʉU¯R2ȣ]Rwں! , i<hx/yDŽ5r} >Q(xMRD!`-Ċf[h$C ( _7&ǻ0r~-ݜ6G]gHZmFT(γ:eb&$ŨHO3DIEF| x1{h]6?զO6̬F߇ZFcd$ i, gzg e,Q GEV{za`}ھw:pDXE6_DvT|&n1BRdhwU~1mIlD]¼z|}1J*|~73%UmvΎp ,_.TN"aAwF?6C#a,+x F‚^7t&&ܶD9!^"&17lvAFlQk"e|q7u>HȟA tz,7ˈRԃ~B)v"ʆ{a׬nj6Vzg{S6b{U^@$\'-IN@ӂX1)I ;\D7_АgDc[/2,2& /1Bm--S b{0'ECꏞVs5 &?Cɡņﰋao睬(~_U:`5(j8JW{ԠbRϖ;6J.&%.qʰ@5 |g6 _#A ]HTsKL23'xx%J= =p3ꄎSbG]2~=;x@qLV7^mD:uQk9 wmr~zeN:UOӆhtрEQQ }Me;8ktP&xXe;nu;У67t4nL"2t`OG@z߾EO؁,EuAdWy'<1a;7hy2ty<@dofٖ}Qa[Y6VnNP2L)y>H XBbAy^^vN(SOF¿*4/G:+,*sx=Rg DDʭQ_) ?1c CI~Mm\T_a?ylI[jAt 랣gBGĤ:y5 ̠RwH5OZOk͕EydGo&:6@0r-i=X1)Ҁm$F2>B N UAhd#Z3@''N+49rھ4Nh,1dYɼQ?k.\ɝ*~^pbP@28^Q*l0B͉OgsR|}%.[Zj00OGl?zN V0[K9b2UL=m7 ֟[駡\[`A+1`BOyqBx7}^H\W'' ky6AnDNʲJԈ8YP0`UZPc^2+T+!IT>^Ћ+&8R;u(Yq=U8&wIŚ+=bZ`9$_Ђ'zn8s.ֿvW; -czW̯&Ks]Bu˴Xu+*% j䉾#nNM;+pʝ|(mx `*֦/iP70Փ>`"LO7@{:9%Z~cՀ4qdze6ssb.rj3E +R}9 -gCuM2%ыCK¯Ds.v_wҢ9 uC\΋pѹsMǗ!uF.z`%`i''I2 03>M JG\)92 iry!3tRp%"+t$Nδl?L'b B)NJlXvR_Oi?eVmk"*gL2 mjV0+<~vmաp#μ%"'ߕQ 0n&o$4OMKS!i+w1W]?R!2QoNyx(h."#=<( ~v˅+I7ԒJ&QOC7Gr{£>l딣Grw?#jwQ;F@`kԷe|Vōvyf`R@\ P@(4׾Gd*|>^x3+w>8U?DS MM< iyׯ5=Z hE,i-a /YDO:7}sn{fMFڈO{ Si+B7F\K)hCPXdaT7l-b%#{"rQbTd+{ɧ<`aL}Ym v)Mvӿ"eHYd/tzM25~8/I>IMo2[s{"Jk!D.dr0!:Z":gC_FfvH)gG .>ld} DRAE28? F5ǡce3F^l)'s+'̎"' &/Ⱦl QjZ2w*p> UyB8@dv} 0hz|,IA8u8Ԛ2=9ݻ傖(ojE׃JrXdnd| V5.f>—"j0,šYv!<`B)o(("1_pzoiUΈMNSQ" uLG7YwC%w+; Nf;Gx|2 N-־T;d1|!GBL4"nG\Ã~Z5vGTBXާ;9:[Iq 0\>.$>xԸ]Ɯʜ)"שiRۋ/'K%327StQS޾i2R&Y7jNwmvipb)(DAc޼ou`ՠ-r7T9+#%1ʈP͌YB_{f}*5M(E $MtG<\&"n 娳𘲸3OFf{gc>T= k1) CTZ :B0&Օ(5 C՛7 ١=z a+6Ml8xLq[T^a~eD^lbUQs{lP;7fq-Ttjg_?MtcnhwuFTػbCr9 Ϗ}IIaz.kh(o'$\yفASe8v;9kE*oe &-JJZUԸbv zHFR_:drj8ZOٛzo o-'=(BJ_MzHqgՉ&g1C1Rw>O:]Q_>}_$d? ͒~eAkjCђxeiE~M4ПAk78Ԍɿcwh$]JKwlUG8qF-6s.F7o[$ G9%OsC; [q"2"Ҷݽb{Zf\C(VRkv hD;K,5uj5)JT=|Džs/ #V,ٌD*6'T&Ƿg ?8e2 VueMf1#:j}L: !@0p6O^KjځbP0 4惨i4GNJHq5 /[[.f1$*omj]_;Kd@ k2B҃6_phN7uдM+c-w(T/>S9ˤo"%ՙ_OnQkn\Npސ~+Zu($H?>5%9nV' lV$M1WcqƓm 'q).Pޟc3D\qZGe~:MN-R%nT|1OL#P, tHv7\h {q@RRwAxŠ^蠊G&o6 ;ro #Ɓn@)$[:za$W8Shmj;[7+t!4!}Y7@'p\xi]ΑFjSVQ]kœBdi}K[';J2c{QQezl.Y.QX"CɌw qtw2U_gRx1Nf++9]sV^,L*67 dT}(1GdF84u4"R;!'.gS?3IO{KŻ j`9b%޴$hZaTsr`%z!p'y㇇rFv>KZ"*ͺ0k CFYX| >9~ aݸ[W #C z[e\ ڗ*LDMaTXeLT:#_߇HؘᡙP]3eXvL1(Ʉ7 3IpP~Ô=*RY:(r(E4iAVD,NaȨ/rx0սr>-#_}5vGwᆠ:}nR7NLh&B-@}Rj3,m<'ZK<;7S;zCG%H:1&: Yf M#,C[##l!C?LnP32HJC1T2\?aʪP`|SQ>؋;KZEW?7jD$9 FP 2[WmkS ooy&IxU TH!̀FhXdqVv|NTy',(s3txŀ=)le9m@_ 1C\2R+ B.0@]jMu {eǩd3}([o#?[ t*zeF| Fω*&sJtC4P MߚZ38o0xԓaPߓQ>ᷜ>.d`>*F^tW; z5?K^ol?#2sM#iws%<:wAʱxޡ%X)?)UhA_&sZB6v ۼY꜎^;U" Ǯ 4žTllވp39X*̳J JWe0Xsޗsc گ4Ȫ+ f,2h4%R;1 Og&*\-CR_t|f| Ny{22CՑ+ cHv]JG %FR;v mrtpy}D"k('k'VGL$(bFv`]zd V n?մ[ h/S˾ciSށhXn/t ٮXEB2gRX ]61Oı7 oAŌ}BHC_ g .qj'2FDꮢhx +;F$ܸB)u8GJa[co.J /ڠHYoHd9OQT]N!:w԰?)Dm~]ð EuX| [|#K l;M[SžSINlQ 8[N#?s>>ss Qtt$.i$ TQ2<:)w`z}=We p4Җ|F,񴓩IDSGfYAI~N{7jxb,wAO@wKJ|;d>Q5H#Rt]\FKisya)B z|}M8O3EI~Wܣǀ7O#^2[쌴yz{@ЌkD4X  rO+ISWG2?P{Ep3>`@|x>q{fڷL\ùsmC VP{5@b!$ WB"NMankBnkFQ7yv|ÖB[`)RpD3u5EMkDu3B҉pbIxB`.=a 6ʵ*' 2 +`gś-yQ$IX|ٺ2Q% tWs]Ђ6r[x#)hus!FowDZXF\PȤ5?y~|d=p^0,i0 zmK]`l)GԪUVbW,qJ$z=>n?Jd %^Z+=C@ƂY Y ;{X *_>iitp/#V]ԃ'&'c^݃HLBsI)[WD}S/Vs#ҙJbr2cFNCH/lO-C!$B =H<&\~G@/4&ou[LDEBMUv b S!ø'.m!_^p3-dPF)/߯wwi^FEO6hHLzԫy߈;Uurd"P{T(,U}dlo"⁇3D H0Zl3s5/"ca84[zFI8Hy lR%jqOF?/ظ v~F:9XџӻRc %/1=tdw#P& @ҕSF O56S,"_!mB) &9+~")&ȹ{S}l)WDF7!~)1HLbkt;2nKHp 1×$ШcotߪVkfnVw`5Ď-o՟ܥϚPu;%+0SaU^8k{FoA+ӳU;"ÜeZ#v+jv uCH#ϩ Xf H3Gf1=RDGd=!tif|J4a\R#w|5+jHg5-Q] wDd!2E%૥:3qːi rb[^ '`43~3_V}9DO^(#N-l9(r7voEzD0 .DMߛsYZghh4e,/ f(WtO^f3H?^I{ F”p8l`7NY3"S08[RNG\hJաbSb$DsQ"|Ն. i' 7, sc'NfFdѲ ǵq]ř; gG~kP!z'B^W1ݐyFQc᝾a|TS#Fm*˭ʯ4%,ͧ`T /Yh3ڭ;m}=2^e&NxɻNwמv؅Hf8fꄯqn5`gzD[ ?0J}Bcz|˵T.rS6-3pk\*h.s=ZE" y7ռ)=HԌ>HN5',{숩fGE6ِH&pQ!D_y@9BL<|\ Q𛓚J`5kTO&}vp2Fr Pf@'6R̈ܯ%3Yb,I} #lX'5LU{CAݧӎ`bi+4k\^Ϲ|a#} C2ڙK!uv]T 4%i@Vg~& ӷA nf.`)S5E;V'E DΘoQUsaf6[ܾNn ].@!ЄX}(TKg~uQU%-X \`m]cBn-u3c:CӘ* k~huTOkLlˣ/dPrmf$,tz}#!KW*EgpPxu1]jZFK0 H:I Z|B^&YiuWj'U_6oG8 |4L]K ˕p`C7wy 5_둯4hZ!+I^ԅfL@,a=~}5yo0?`Դw>1VG)]6a7\ 1wH"WZT.,_) Q^)42⚿+XQ )v4ab*ڔ0c:cdr9Կy2ޝh\i x`i/L @ Iٜ}OB|K?/R 1%N]%!媢uF3U)WʾaSc۾%n%m2իo0Ack'R~l~Le< 獏VhVBaY(Rx(l2RJgH{PN ?yhQ˓#ۚJ81s5m,3Q4dt`ewKjNLdSYb(ƞgBeS~nbLOn&s#(+,K hC=AmA0gCaةhֶ1]~ͻWfFEedNbcKA{A-4rFJ uaz tDT@nI-*$֞ !γW*ŢD'ޯ v p_7C$%T:PP >FQ&:>);:!B fOKN=tKr͝哹lKxJˇ>'s~E w!C؛DTech+SL \qPŬ$0_SzR\ Yhej?Mjn_ =†0d92bcCKJ1@?#+$5_˕Mf#`m8u#i'>kupCi,wa<piaۤ`Itc5!U<&YS3~ qEE vLc#ܭc4CuQ6d=Ă/q][jGR|{V~wI._^wn.wԂ ķ[8B GD鮦<  ٩P2xL$%kUG]BPld"&2D IZ}%"hS SX\#Wo8L=c.f0&lFx)jW2e~כE*KdYF̦OG_U1KCE&m[FRby{DID?Fކ@0i7nix9iYn= CdL3h +zBY߀弲@򣥶<99''^\Q|%Of?=ztvRLX"k_6=+8{6YRd =Ez(v' 0ꁙg/ԥ>@Yn}njvg"Idψ'U!JR(-ݗ٫7O|m; m٧ bVDnDO_Y^G`OAXThqmL!H…*bQ{VdcO:5B >‡41 BFDGSAezl-tG7b ے;_/1_اe6l ^Ŧ+6q:L_!:9z*"- RGҟy7L#gNLŽ騼Ep7?fY8u齁j^gR* ll yls,nMG͂J.aEb=r v  HgpR\Ӝ,7ftX},3oJ\Yji !p]vm^і"{֤P#ˆlU1L/Nl{IvFYR*ӕWI{KR,g{9zP{~20ψ+Ȣ؃ n- I^0=1qoY0C'&δ\*r? w24XD05 e+x `F'`vi>Ƣ]cO 3ֹ ) kgl6kj d1 -^d_gѯ<=MGz6zA;vmc~25 /iGو֦YsH7*(HGeEvOO$p˸ o~ 7D izG)PY,W2v،䖈+ X[ 7HŃ@2u|/%_G-s Fe%KĥZ?@3xQb)ht(\/+wt-j3O.HcQ}c-1co04{# bVtH ZLn/uz. [0J zSOR(v) D4`\8Jujg@:ax\6cŵ |#{|(̈́n@Ϣ (SB}3ꥡny"*/FgM߼l:1Q11I@ރh; K~3x+ &p ,<1"SN R.AWZ$+ @a [P'V 4hex=(1YD^bhρ%SU[fr$.0Dj<--`Y Os/3g42Y\ dJ\+aC2q/hc%O; 7%@O 0`s uQYLG:h&_|^[VKN<Kt>B gWɫs7Pu6=@Olf\!l3 "cO4mf} pG .4ObJDRؕ׿=.WFlULӎ Wu}s_ 7C u=s ` XYW9k8US߮ti1D}KI*_;45J؃b= J{pz7pWg 5] |Ը~䌠L]v3>&FzU_{,op#>gS,7&38`R ;'wR -/a5kZ 2_*  \GiLx nbMJa{9Dsmڽ27m2B9LSj2"1RmPl V9Xʩs+w{PKE[|Me-BZ%ܠdh{ܩ V5֖`OSjr i.$k{YgƝdXu h?xC򺆠EZ$:u FӢn:ךt9IAD %ڻN|:H\aC'&./Ȧg:ҼȐrG)*OJRD<|5"J91`yl*.ٴW(dTiwΗRƐq*u#.830T'7ŕk3_".|^b:\x +J,2\ />Ty[ep5ig!OM &Wmf*yۺLl#>q.+?D3P5jkv9Jh ެ ӊAarXaU@*Tj$SŌJi?l1J,05R)c#]vPGdW 5pμP#5jcꩠ@X4kRLgN$0iŵDzYlvn3Pn8 2=/-zuU.=Lsjrxȭ KTCf54¸;B Y p%LWR>6~hgk! ?(>=V<ނ6}Ur+yYz,^nlq\C\1|X} JM4[n#m` YjzshɜLb3`8:C= ,JGrcl.\44 ud ?HiSyLMMfBFށQ2 c&bf[_@DIHE|\ю.ݗb =n&&E,@8*3 o ;\o|cS% y\䵸+Mo`rpBW*~ ({_FݮFH$^ AwU`<#<Ԋkpikp6ߔr+Sa=^=l.5&2yEi/?nW~dwX{t] #Cswm}yM0?d&ӺCnZƶ‹aF7%- ZtrU.៾9y fS5lB+nwulh?s>>kRvs AʂZb!!*4rIW\xIJz!o2}=|wz3"Sz~koGGmqx@LGwgѨɚ<Bٳ\GsR2`wR?@KmY1QC;aGW3K;\l}8le?sj88ŽNhw.] qPQ%-#iTY4,ؚ&;HcmGL'IF"ȦGw e]I:gh~RDdݡtͥj"!}5 ~RG3^|is(sp˰:62TAmPk!?P"OXcj&![{R&tSsEU XݥA <~xlPDF)0wH$wq:S +t-Y q䢴Zdioգ9iL=kRHŀ@gR,`qYhD\ę"ƋM{+zB\\CPx}E+yǦ9H B 8s"='R7")c6YK>wJ7>:Qp80i4ؚ֯r>Bhi)IuM/=WĀh^vȯJ E e^ 䃦ƈ }={zHd`,$d_eNz(pm3d_j J8K`oJ)N`DR ZS D/7K`:Ⱥ>Ky)APMOXA 3\zSB.KB[֘)Axm 1%cs Kr#L Qp%'M!UR"ݺT9T KuƓh{8M % KyV 4U%ύBA+dYIelE2xquץ|ߙoj;'$bq@Kѷ m8 h''zѸcfHS_ZZMLƝJ+6,( ߦnf`6vIh,Ɣ`+^uhOOfzsֈTo_1$;?}WRG Zr OAx3 VMDU<%#fw}7y0rfr7DԻ~;@l7p2,ދԨIsq9-2QN+*}%-b5~ X{b?nKA浳 UҔGlNP_Hx0(uׇ⣎FRY'٨Alc6Fm|S,fr[%Lo'2VfgsaM(SX#](^ɓ6 1*f)a?ʾ@XeXL2@`S Ҕ!TW1wOʠ$%wu%qh;ئJСIfa:(β4n8{T|R̳)r`*5EhA[g;>@A,AL4c]deZ<ǽn5q*WFzpy1e- :I7؊zj8`jdyVz &֩!>(0-OUk_g: !#e_)U66LB {xŁ9ٝlDZb?1aGzvpX2Ӌ1FbQm,eV}`V&<^c(דVo\ou'yn3! 01! vemA?洯k U?]`N}6*0%'=_JO8[yd k#>đO#m% USKɨCⴥs{_h!Ѿ7{PR '7Z2DžNk1Մm3IHpiM%5t+E%6l* ґYYS  nWJ~jZ.pNbrT( tˤҡ [M!ߌfy![ ia&hrڛ_'M'Ae$ F+㔷ms-rGpȽ%k2t 1] L>ݴתTv-z;yK9"|Uе%3 @1/O(iB~*%;Ƀ%5ku @7̳lUg9|~Q Z2?y4IDNiYЋ-pl7^w:IB0JXZ8 1|YڲnZy|Kdl?$ t>K1LG֞zwBĀq*CQf ʖYk%ַTaڦ-:Ww~ C!fyp%IW1ĂCE)GfC"=N+Y`5I?iA uoWz(,l@S j+\XyaZT h%^hehHBa=&Zuy:ΰb"0n.F O*Dֆ+yRXܼɂA4` '"VDs";Y,{bYO+|ԀU.Q? "-W:p7bT[BBʋMAbvNw5@éGh;c"P ÜKELW<.kfՏoO?$]{Iz}bYA܏hw o 2o`9+m:ӑ=uGԩyɍ2v8eK-n84ZȜx?p$te1L<gXSx vJ݄45ρr1ф]A7wv1@xXm S:Yѯ(OaCdd-j>b{D;а!YT᠐"! 0?) .cIw=+N83b\_䧏4Ű&`$ ,[Rƃہ˵ B1B*^M= n6k2ig;ƮD+,Qye_آi<#,1oD?߈@naW;KkxA S;$1{Rڭ_EOD`Ҡ҄u{ω6h/Ӑ5g#V_(h @Mיٌ&rxOu>@πjvzz% TF-9`s ]E/Y/_ޜ"S㰱5Cd`ټww$Yzqycd܍(Ap|e ?A1Mbj7#F9z,eVA}DĀX,=ƈ<)g[a7C`* J%Q, /Y;3|ŗpm=9HjEObI.Γ;X#5m"M ,#U뢪V&\KPְ zȦ\~^yMQkgfGbMH<>PES,ކ?4x#r](DFl5 r/BB;K ]bl/amf=ٚX&Fj0qt] AJ<7cԽȣ[Pb̴# !iP^~* ln7>L5\!+\ϙRҝpsexNLkxZ@q: tlr&8Ɲ q@mZJl_܊G* fbobkqZ']c]3A`=g 2t@1QT}j+콖I5|1F*˚tu@MCdJa[ѹt V. Ok&\9:(nEY3)J A<*- DjEM<<0P' Lo܏PK퀪#vRAҜhlj?nZ|OIDeb\{fsXa'KXp]'d&o[vym$m=v𘥲7@JC@4ۮE׏"F씠vL!" 06 -u\-UmSU-dtPї-QtWhb3[4le煠Z˷m4rdc59{`"ܽS%8!/´ >}.ުU´Fl줩s >L9>1Ah< :p20+b]2 zT*vwB *}Kzƕ.s+SSiGFNttMٛ>W49-MmOA~3+6/~?;w\0礓.O dc jU8Zd/T/[An61LGZEmWnDڨx"\64@mbfMm +R Rת}Nj۲^ba|G'lpI!Ʊ\Dv2,3VC)8NC s lgǩxD A };eCi 4@`O̅ b] :!ԏ<Ԡ> }-Fj%6tzIur*} nV0wM'v@h}5&rR+ctOGʢz#D̡Qlבg_2 v&i3Q܋$}Ym>~w U(U+G82Q#Z?I2B U9T>EPڋ7wrC02C ̓#pT[ث*.cIE9(8jTbK٫@ p͛kBR'l6xBc(@|2_ eH0fS.?ߨRV0( *؜xNcH[ndÊ['B[B5bnqf=z2@FO/Om¸%_~'WX+afn jX+@$p;Ҟia,^|KLMixAbh'D&:p]\I Mq׼w7mStG7|LLfT+_S^bcRq'ڒ=P"L4Pb)EfEH&Lv /ꗘ[GmQvodffyyNJ` _BIYCKi:F֝ ?]J毿n. K"ODmؿ%lL5#]ItW~CfxԹbN6FOMOV:"\_ 9#xHrMaN"N>GpG4`W'AǼ 6 +l$.%%IZ\?Eth};炝")G^bIvv /ycEs?18)i|p/WK]J7g+k΄Q}1ź2+0H>Mtj:9gtS Xe&&5Z`/dO,ܤޞ Pe|(pbj2 L^]b$d-zVG\б}겣Rgs`yd0Y#KJY)腃lѽ X%L J 'vHxRCy.`)Z}5'ňWTk g&!xhU#X\0P `B\,;vƳqG(En 24;N/| ApiM ӓ"XANXVfvKm>7*)ɡB e-^(H]2FF@Wu&2̉25liԈ=aRᙒ3]xg=\e&mN'Q''Y0bَ+/y¹Dܴ%7xMtMWfLGps|=Ϡ1jIrEv]Ԑ1'0J%ĭ?,ԑl͵Jq:YY-idR@"_?}O`Ha0>UGjNFm+KYYDqq+Û(QV@fYHN#Z0l5q 3*Cl#BU2f\_ A+VI+ro, q%H=\wv͚=Jf7[3o\zboYus5G``tFzRC_֊}8.DzgZohIqն DpscfƬc-k 0H;w*r jL.U fyцm} XZd}KIIwu)RRBczbF_q@Ŝq JuA4LK +'DіCؗCЊI𗯤Y)ϤE9`Q ,e]?.a: ljlfoiO{GIH8 qt0HIUc6x-K "ʗG(4y'I^(TŚM`k :~_Vf&NRyJ~/C(LкI23B-/c_:y'^  @=e8q D̓ěUkV̓dY~N ZzzKQE&׆2h=(D2!?ˮG~i"םb8 YМWkEO޽>mf9X'F #G(XqSzUoS?μ'бt*FcwnL&R/W df)%Ȕ- B\T܁k־Kfnb-8yрAHa+,D186a Ɵݽ 2!`*v]Ub8Af4GF}h͡MQ$ɟ5x\u˜ b8ֺ H$w}eJQw3+|ĤF4sz(+</e|ё,U@ |IH 5t9y܁V!Қ#b)GR`L^BvIJC=8Υ4N*rBk\US}-VB~r|wMQ9P8=1x* Vvg{x]55sfk CWd:>DsHy6-<Ix#1l;ɒR#cQ""p9^\DScKX{bohƸP/$Pt;.`46Dq[¦qF눥 ucP*h&M UM*׊$w3Mfb"=DXޗ\ZYs˪l2"m[DIe@P\7$v{VbI|oP*[0+t IoVѰ' 2EB.wЃ<ǫ#f~b.' obvN*3gk $@ n#bNX nz6Ϥ p"t'=}x~ƜWa)K:z喼m8bx!!hKhty<~j &(i iX8ŗՊdgRӓEkzQR5&F(<cfInN VR횸^3)`hzAASx NUgԆ3օCfjV^hN(uU  XB)&@mgHoZ= aǥM!;06PM`m2ߺƣ Բ߁ߙK^a[  >zW`Ǣ!C%CAŬ{wmwn|Ak(²4nm%7l>0.J[ej֮{.2 k$ӵ11+}׾qYl'(GQ+gkGif_9p/1xCu[%]{Wi>jk94kݲvY>paGU)eثUgNm7_&Dk-m iȖd?٣̓u@7w}((6NU$X:B]0K.R-?uu8Jd=Cs2*!Kp{3fMM>#7r`B'y &Z_t 5VӪ؜!ň t "f4Vݔ$# hUñut`s#_fxUy82a %ؘG&A|M@ A|,>G횅q5ahX#b=ؼo_˚+n6c{㳧`/_8+ ,D'ʟv>Onu,=W}Y(FR8iwPQp7:/@2=xrHͨ2398|/UrC/45M ľ#X|.#(X꧑sZiL/"?X0TdFПǠk"op aP^ TnzNc޹ƴbd1{]khO@VDخʱ+CAtj7/K;onuf^Fs3[y ʗ:D)eﯮ:$A;=14zJ;aN2k퟈4iN;n$%i:_){xFm3 L)V3)_2)|̔r@uHu/u ,VX1D3Ap~թhP49Öm &4ґSl=qb#ZB r/P{#F:blq`!%YDeCI|" 3Rߘa7"lZ"<5X7=Fs F|z($ )Yq|iϠ^:bR"/ V`u튄ʢ8;gDYm0ޅ[^H:@$RXnjPT4"SQ AP \0 plzpEFVpՀh·br[@!xBhWTn3Op*^&Ox+o]D7SRԄ,{$0X Ldz\F:8TE??D|eg^-p}xScrU_N]ibI(&*jve~Gile̙ ;gI3j3 €iì|UӀc¤A d['g*/I$3(p64|!Otn]s8E!I*Co_]GLTAS81MR=mI7 `|tTx/W%mַԚ,:Xy%*RtBI+`\X\?ڀc `'~ G.є(`p\I &>. |;^:P1<9R%J$<$Texi+jIq _Ǭa_yBudy@(\Xѡg$u`*A#lYL<:[dzij >IKn@va_"Jۻ>HX_jV! G/y. %0&]@9a:^:떰En7e>WGnD!6W!9!:6S%IAVO?~~l ? HchY+pyΞ3+Е*f*J&*Pt?^_<ߔ G:܍ {4xf5U9`du4n1aOG+=>g䌽k WpC-lc#bSf)(!cMv$ #逤"|e="DJ2g'R_M-l|c \l`f ׍M5L ݳR)|k", Lqk7-^q q 5! ˰/ @=ol>K=pW#_o?(/B e+hC9 C&bJr vc o)MAWV88GEn1:p'5=;_:a 8~L"u$qs9jxW=eme[&ڝ]&c|ęRIns$c@*Q]//427BLlq&4&_yfAB=jkJ;viξ@QY'%<ε$*yQ>&5o** %}ilX.\̊ZM.;xeu&tbZ󑤐ͬ%ISfH&P6Jb+*#8I-/ɅxhN{Zc v$kJ \;O1 (Gb"zYڕߡGAϼ 1]NK`)&}U4*ѣn _g rPk|CT1j ' XqsLDث!ߋR|Qs+~% ̈#>Yj(gKRkfG&FOjfuj !<.]e}iwt=K~[w'8iK!CnD9NR@\~-iҩ0pEI/ +"ٔV@P.&~tM'HF%.yraRxNc~=B?!#8"Ne+Vl-Dqz/&~X0g=vG^Z2b2= ;c {Xi*Pw7i`)Gϟ H$p*ro.ch|[3hh R!.;#̅3_^۶}4.Vq~Rmpxt=pQ{q"a.A4x1Mф*7~$"p:K#M!}yIx#_A&+T|?mQ暝akh{Ydky- HLGʨ!0U_DuA$@gUl G|38q-4V7ACOV.Af Ipƾ+;7yAOclW֮bQ%OBGC=)@ͦh]p-8Hs&KFԎk}OZ}=ngxkWc|T=ĦXQZ=dXKoW<6*۾O ~Q h8wMwtQGi(N}ARԎ!B=4 [=bŖ.%aoF_ ,;u8V${-t_+`ޯ0 I~_wc~2a>$f%=3Y)p]rIXifQIŶ~ ͳXb]xKqkk z"kg=(ߚp=:ih׸؂H˽^WPr8&*G2.*dxl 1zldW~SYs|L&<Gm,Dе*AHU,iB%)R2  ߭n@).xTcYs $ b ­ւ5ˀZw؊łC/dOM4&TX BPRʭe9%ixJ S"e _bfT^=eU6(jsԃ v OUr;VJv.'(js;2}xDu'ZARe"F[PxV!/3F+&-mъ1I[b?_suЖjqkxL ̘=8V^|7W0)QXw*@Ӵt98rQw?<=YF*믢1~5yfV{*1?ȋ=&@6p|0"Bakg]`];{eW4FVtWJ4(kAp(u) /I! X|]ItGSmL>psd뚴~#[=J ,0v&0&"ǻum>]mKt|ZLI(0_pVp|$ 0bs踽~73P5Nh~h @i.+2]_ft."]# N>yO8gfVKڎ_IBRL`3a90?2ІӮa=w˃wBB 71 C$I]fUq_mMBLFq!ˤepȓ],"=8eU'bvP=E \Si% j3'.1śU+&y&";Q}zQW7'HE 5 C9[lr4}d1&dT#]c E*K;J %ʹ7([9Z8Jܵ} sS.M.=JdE}  `6L^J~.Yۏ9fMCnJ:n.}uFf•LWAJH-ח\$;ci207f2>3֕<+vL2HbRtu.g8`]DvXAyu=, 4߫7#r8&}b`Jxysmb`vJYG pj9߮NP5L4rVDtq8#HPd@ ?jdAx0(pd'pYuF¸`>穇ϟeWtOɲjEsʀY㫡_ J u(&оOgXR*O$)TS\%r[I))L[t+m%iW-żu3K"8B!2Ci,ʖWMV;C?-1Qn`*pCYwqR ޑӑtL~V4tII'w|ͥERk.vΒY j5b]Z\ aK?tKTս aIAw2\ D|jv"l J);:V8 cMOvC7tBt Jp)LUBWa+I\\FݓCocygvex _@!' Pj,r߁Wi8Ty^v=Oo[B>9acv @NdLeYR L.PnmŏO̞LvyyDI-Ө$Ѐwe 73UN<{߈7Oe尣֡靅5F.=]]}/.P(DE"aGTU\A<^7`l?߻vk'ķ3ѓ?nZw3;M%Bz~FA\7A2WO@Zt"hKm2@Ef_&]` 6 >}Bq=ǴD˥.`e+"޿c㑣gQ)"m)am[(8[RR~hsA!ɞѭ&;O  :H6kܺVQ~sl + %lwW_F/< M}F}X )G=ɼhU2QnR@;lޯZɩa;(ti>~>EB۟Rz8/mTV9h<: 98 Մ3KKmHOHc%3<"L U-0U&iDBK\,?ˑJ#Hv=P7k1MGH2%9S ^.^cm#EC36lu7qSL1v,C\%:SZ?}bHJ: lv- W[oxʾ.:hI0ĉ֛~q^N߅LZM,\s> N Z$B"9tYʦ÷\pcRwzȰA:1]|`cٛ֡ 6!}dcR~C&hHq}Rn)[."f'n/71@-d$WӰDW#w$. =p-;@27O=Mf P"| ң"4E}4f"&ioo֛a"w$fhB>: lJE02ctn))a>YD+cn;+.BU+ytgIs>B;?u;?_t%~Ɩ:f$B@>1 mçy xK޴aB=)C2C Ɵ奘p(e^5(|0xt.|ώ<Y h͡CL3!L9  R;y0dP5/l7S 8! A|C k[,ˣHoefv}ҩHP8xVSys5ӼT_Z4G;oSH$ojqm1p} jl0*ao!L_l3dQ'X=gG\jS6$afV}9itۗeS={}X f q>[_=oV8$ac{_%ہ]DZ҂s2PS\xA[+ZT1#Bw2#6zj$?gG@jIgJQuYRveO4$kK(*xL88k8 %svyXW -I sƦ7T{_)[/+P\уr¡`H-yoN}pn` /ٹpVGPb9.k:\{oL Jttce􁏿}I lRH'}5Nƞ枨\ h7HEm[Լ5LCPjz]uGU!ݫ M@!SIql.d0s Q(-CwMp &y+0^) | XUYR%QVBٽ(Aj29Byj},,2 |$! Y)AXrkE?[bYn8@@aК`=Ο2n |%WrM|p_'fis٬S?l$3%2HmLxwlX& akt7R'#p`.Cf/@#nCB Yk~oǥ (E/Xܵ;WɖwAfs[œQ2[@"vWFMR}2đcn_nsRd}Q/_{}cχ"5G-BH 6ι#6 fDTa$*`CBme 2' ~\vjGHWa$e+J*!UDoT;},3t)cj),enrP1wMzm 4H5:]6#(IdY7|$D$ƞHB(Vٽq36iW'ɲ DH2ݒMkx>6t? p++Q 4+1_ P:.wvIw{c5OY*FImL!rq"{|Dqq/c/LE@<Ɲ[m?e\ZXAe6M?ȹ,}̢n^'e NvcA2ѠfMgTfw[3Y.S +fãB J_,:*y᥋9ffzY1H-w}=?^]g)~dA.HR6I툔vix'ȒPL+JK\}E;&,(* Rm2PYf37Լ SB 5(8ӓ2@)Tv\ O@3Mn?!&ὲ)~Cq]<Ȼޢ)'K{*f%ė 6`C3~e80_|,fG> LN8&\#`=pm4^>\4 ѧ` @د|6DTٿы+ӔFf3JTodJZ:~f!%&3 2;K̠PCBep&Al@\ҠtNu á+a«,ms=(q*I!髆 dp2yвzF^N,3,6 qF` q)[h7PӞ0mS*'w[j|aGbگ)smlMenRZ0ۮ (8$k$͏te6m#Y6R3q ;`PQ6ZH=>ʄ\uJ2e'm&3NēMF“5Y%097+Ts@q#UYVS4j[XB#77KLE)1yj+,e=p8N `5 Q+yZ3٭0vnpPR#vD9V}8KzS^V aWbl-BOkj7vVؚ& ̑mJ@A/0,°Јj~`2bL2/1^4=wpc YYBe)bm Z't:2GA@AMAX)-k۲;*؂xK1`:ׇ; (28 %\:70Bajq&" W(sói_oNHwQpD֩[ RJyDgx*1ϨJm nD]wm/ M:>yzi2ͮ\۪'6qh w ރoLk!ڎT!3 n T- XÖk>C@, 68D2vޡo{I8դ .&4q\%>eFԂaVQ*.Իz]!*@JgS!4xK{gj>8-;.L`[4 K5I6g\*>CpUh&d7>ztM aet2G7Ȑn0CWq-a+#Li q+_C. p!պ?4pSnP`_,.jV~E6]_X I~S-i**g\Gbh`$}Q%YP?A,dzyUc;vEK>/#(ɢnw)Tb_R 8![*e`FG O7F iS*"tj4eȦ_5%֮/Ы `|Ujɡ@9ΟFϕzLYAJ.q4n ү*,M&ݭ7傥:&'UB3eG"Tt>50;g!j9edSb0J@MVeKM >XjۄN \+ P_&heXL=%M/DB IxVusIv`HgGׇ"H'݋MGKj*rz >?0plΛoBetko14c(de0A {i %fx:ʉ~e  OPzߓ2Zvw PftZQ(kTI}*ǰJp,<8c! CaH6>P6l8ʜqy1*jc@`Mu?F ZkFMq CD֫.%r9GRswL \WWKS|ƨs.,cjk̆Z̨WP:T%TT3<>T~^8y+VZ܋\ s (-:)v0i%Wߛdˎv8+2hUZ~QԄ#*^ ~ q}00(gd>FJYݛtfql`E>ZaE;mzEv?ޥN"B^X0?0㸘1VLI\^*ALJAU/'ӆ1 .!w Y̘Vm}{ j0[!&`88~[tCg񍏡> t)TYJ$;& M\6"@=7DBJ c^E{,$I( 킏#@˓$q# VY}p^B̪bvY` 9$uQhP0grtF"r(̉jrV)t2h'e# ٪tj`?JSi jg]÷I1#gӰ+%ǩYO~d+UoH=+**$fxfL@"Ќ?]*MAu_ytc矌8T9?q5Ea$FTtڤdspR<;pTqE}) 迁+nYbBOfV݊ͫ[fg ' //;jXvA M3fjY*4{^+7{N˲,<$.2gIDu$Q#LMT ;%wMoÝi^}}A$n ވ<^th|ngs **)܇   bt!SRU :Škr1{"dj ! *&`2bOhfCMm]_?t@dxh!sTS] ߡ'WRfӝ/#0h˫VJ R0@uo5]tQo.N,쿥<}n<޲g!Is1=y5ME85e:WyZ"̑)܀ƍn7^KDKzU}L6KalÝ؉؎|o,2 ?4/Z/;赓>FE?T+,甦E9QHd:"[twW\ͣ@gOKV#.R`!qN _oW)R6h$SM<@byjc9%*=gBv7dq\f+&-u!Th)G" u@[$)(-I0sH]UNqN" %gA6?B?AeH dYհhia%i|̶I_WPPZ; }' ~т{oEvVɭ+`CnI],\{Fɑj5sNJ$G'Upѣ%6Wx~7׻PyT>@J~@TZ%U] 1I 1R⧂(XAR.6ٚ8̥ft0CBC׫'SogUcԆsV WU[9EVrenM !p$s(plpo_'2\ϒapޞX&0Ų`?(\Rů[EHsDΙyw+$= 0;w \|+輧E! SD7-<FhA ^I[iSM5-.ȸdB{݅`hoa-nCD+Dw8QJzPI7q[EPIaQyO?#xFzj}&W큏=(=ۙ5,ryM`HF-,\^}苪yYW'\P! aDcIAe:me;sR zo/Ł̇ '+$Bp ?ar`?GyJDtzz%u$,13N^pÆ+qX8` qc9- X$Mg293,>s[>}ƓdgͽZ`bvMr2m ÿC;{d}b> >ً!U M,W>:@.Vg59q=WaW%EJMPkۖ5v::v Tݖ^` kG[uΘ8?/ßw$Ztm35 LO ottT9y>+%gW 7EI%cnn͆ևJ_QM?)@7b#|;?dD6h^yS3{1c q- Ԧss?9<†XYGjhM߅ut䨣\f0 #b RM`:9:Lْ+2Ҙ)0wV˷XQCޒ8!iQ#cTҡTkVBjK֮GOUSr8(cxa[P6&~{q}.ALrplF,zsk; Oq!Q+ e 4,3A?\י8WҬs$~ҾiS"ef@ʽ>d(.h25Z陌߾m-+zcLw4dU*+(%7.!K.ZsD,~6TAK{s<{%m{ؠKJܟ>'kKO'(:.!ښ#aݥzB6S$s,K mjBRr{nIDdilK*m"czZ $vX{pb5<u9d=} H!?r($o1xEϺ*rDD Ӡ̒H?GuJHR⸪* =q1Db+Vp <|e!iLxGYs.]03]HQU*'kaaXdF1L?; GSp_YgZ`(Q1=EhJw<߫|!DBHeEQ0Tb`ϓ""kJECC`F?`3JF.9 OOs_ (\גPǺ*+z~ɠ\"VeU$0s^a;J|1~ڂ|GA+}+,%lOKy=D. (FƧ:l4-6ԣ}rv-k=rk󈒻%d_p޽ }0,6\@cPa*)X wz6LcR V~5%'`ꌫTi4G7j( ]dޫI8dX + :39iStQ_sV3FS6[,!MʻI踙UT\V]]"*ߍ<ƿ_q֧w,a0坖3sM VY6oT^O3Dب ,y;7okRG CRգ $Yӥ?{ TH^#w$CMp!I}߮g̃(;T%Ө5|}USVԺ]?a:M\Ahp߲H L$\հW.Ao@2CFZc DL a&θ4*Y2?p!J=}2[?ePrhEtANF"*0YK,dX4/IV|#ByeQ_87fvhMb3i/ji @̫¹1 ,[&'MlDe˜!kq3ʂ a>F.$Ɏ`I{$[,A(yYi&邚YR&߄Dg{lU܆,̠bU[:VIhfD&¸˱BJ9Ź>[E,m1  '5/SBB qY!.%*j #}L6J91FayOFL7p6=LT㜪2Sz~ =7b~76ófS3lf @ԝ\'s7:?wB4)n]cD0G  Q8#W6a/!fG7¯,F4&.¸i-TmNAݩe.Ey |F֕jw,?d)%G^PWX|rvM F8 >J(vg)RFkT<Ҩ[ ɯ"=y%|vi>A:p3vOR‡]~cEú34ܷ%:k4-F"EjR+eaE*/YPW)򖌟3K=%7m<6ϸq4źMz= ea7?,w0?9Փӹ?l|U謋6Tu&&ZIJmK#}[uc(%@T\XHjVsps&T2AX \({G7R#ҠzG$_qvh:[@Q׈o_MxˊYeR$̸ŰZͮokQM'&\~ u38'[.1?9 榭*\Rp3Zbg=.hݨ)$XD v_XNJΗXNf"G#lV,`FV?JbIg9zN :zHM3V1:Ќ5E7vlW#EX.3bǫK$66MfTMZ5a.@׶c$dmiӞ{"k ((ܠ=KH [~RTQ޹HWE$˙k.;*VSǧ=Rk[2r)"ڂ7]Sn{39m[@ʹ@ⓕ\ #Iu Z׎/"/(/7ʩD k2K kB2i+ʳq(6nxUݕKs$/t_GXHKd|)8y'|.픹w*,zڲ=A(Jm:WY G)(m+_ +j;"*4R}S6ꐟuOSC@Zᴫۣqʩ0nWegD01g|ylGjC\:/AocOs˔0ׅSK5,_dK)ygע%/ 2-fٛ r2>KAn˝qvLā,|O7Y&P,EA]IfN8Kg)^!C>=v t $̀]nBQ4"}L@y5wLHHs1dz>,~(JC;*eUY]KNfoL-Ŋ#+DȃAc UeLFI2*'hCrn1<VnHya͕h`-ٵIq)6`y0 ! ӌU>+o7x06"@~ *׆9{ȶGs`tR_Di0 ~@:~ ;Nԭm][NjQ K="lї(կoM8\0ɊR_ ڻxg 7J|mD`G@ r?V|JKs8D[D=0}i^lU8;(*P O`d_^%͢ezv)A.ĴXahf}}ўD r"Zszw?&KИ-DwSPf\NjO@tu +PQ{ƈ Fm8 $ſ-6MWsM&ȿ*pAݠѝDM/]B`W$j(;Qgk)].oڂlǻ si\C lǯx;s5k[# eQ-㶻W rCm(G8(ӼZOp;DϻsOfmSifQ1J{: *^aUZ?"K'Ҋ{gl7JVq4P45kU*vI՘4vęﱾj%6%@AxDyq.F4⫐r 1=Uk-C`J_plڿ_cvmiXi7`Jq; 01M&*`PKZ э3lD]p@H䓁겱+  ` ބ*A蠓},$A!# n~Ȫp#XQV"ܻ]uU%t*MN1!!@ 'vsNg_If@4XEfmVF@ ^ʏXr٥Y**e+>27N?apx" J(ͦF$6B dqњ<1|2LP?0er mEѐ%0)W L:l{96uM򦆓b]t<›?,Z;2{DZ8"n嚶UȔsk#=&'u|.V'#u|Ux  (ggbU:z\]"(bi ^%tôv"9oro b'8YFa׷73ɛ ŗ-SRvK2ڐ ,C $, D-]{`)oD|RZjl9a[FL_`@Oң|~i0􋫀cͳEmд;g+7^.((I< ueuÌИѠ[ӴeʐT.!O>RAoA:uGaMO}JwՓߙ9B CgBPE۸o^ňKCzSO (ĹvqaLO=EL-3*oL0D Nhfp3^ǀ%67ՋV$wym}1;c_QtÔaQ-"{ |W G81hJp JkVw-4.s:º_tkaDlJ&w66\׵dŷ㝝ufon K߉Nd~y8Eڗ1@y4OQ0Z$JcG !5&GsPv&Fu )Gf BAuu,h %  i +.slܷ4yb&a3!:Z<*544ӱ_(jI~^ܵ1N1`id7dw.Tz Q ;JܤL!C^ PIr(@(ICtz0)3H9#sүhcf.3:&92+ 7~\P[nVU0e_I1Aw ̳&̃϶wIS\Ժ5t5K/isuSøɹX>rTCdO25@@XA΃bha5ynu|kϲ?60\Rd%Ly|6 4і YsXp|m1yh΂(?2DF.i$N[+Y@ȍ_F.mH ,Lނ߱4>{K UmK>7H_s8H$5y2zYᶐ@9KmV Z C(p \'vN[XgN:3z0/=cLK@v%%OJDb?!<P@}0Y!ȑI|.`X_HXCK6KgQӳL\6^]GP7q/lJmz^1ZL[h-jkuqB?y rgxMu7roAN)ҀP~UGorepŬ^,U\^q).,${Xz͵,bFBg;W<uE ΨXMRSQ\_?KIR,B9{R[|)FD ~[0w'#& `GfTT} G dY9qHr|a>e+]_j@{]]eFl:dݍk>G.Cvsdb(OJ=UOMTnmy6oH"|¹>5q_lQIu$hwY!־L) mňP(&BH&* ¶TCsm/c_+f?5gP@tviS_ 03κ$}zɄܖEɉ?5ۢ)A/9kȬL62âulR)M}ẖߞ8cvz(DCo[w"qBqURQZ5i]6nyp 6A[&=>/m5 !v\.Y U=Kw:u{07^W| 3d]NGh~RR}NR="3&;leiz95%ٕ^H.>1e6lL##.뒛e6 Rmm׻N)cYX=a*Ejay(O'l¢; O,[o_|YVKj~qKZ E[RQFJ'"&JGv5O~z3S8 HRJ ) 9/)}>33rMSi0 p,tpj,7fr0D֝xb*bg[WZL5 Jh=>{y6vx H) w;D+dΨa&DnBhRS?wf+ppCO9s2}sÔ8gE8uZہi@!'%aMaoD7]wn(=9m:|̍""( |bN5eJA+' X&x,D^ ]6)rbõhN5Y$(@ ǁbq3\;s@/,uٶMr 1xtY1jWF>^I&o./T+>2:ĸaSm%k(5ُPpmt>fz"^A\{&U[_(nV.,D#2wJEf*~W$/J`F5,i&@[WW5 O`5=\rzfnj*m\Qa- ٔ ^! LJ J8z)g8::m;裄@%5a^co;šrEM&棎RE_v6 /# '$K€zD{} )׳cR{1^gŶPQh;)ʴABU֙fsR3} vˆ V(BB}Oo aĂ4 Ua:Y׳Y|Q>hXGos> q7nw~MF;& EM C`婾9ȿ& iD)G7h%x$wudBhG201,u27m۝Pԕ /#|>^Q/P.ӸTBcB[,VSr[/U䡾nD|^m8 x=P̤H)G~ Ps,dr6^Lָʉ/z&(GUv2=DYt 8s>j0tK~hI?:NETC%[&DʘXRPdR 7,%>yh\YH3/y !X2H( eǽIBudǺR)GUm L;"R1t ?kgظp PSA ޳@>GtTdbw~ɘV`$D `2-/ņN5]1bf J)_*(7k`M̀ۄ,SƤI Fby|FG! he7/3|nfVƧ >%.@]FQ6&ރL`?wѩwXB #qʦ @S? l_0Wgb;ύ,V:)h.ż;zMAa ګؘbh3o.ruӤVQ&ƨtP@wcRDɨ_~a1aa·.H݄mמֳ-9LMHICě ,ctv- %턧{pc?`͜S4hp!ћfT/7?GA˂DE?(ǎh< Q{5AymQ.mrF[¹% g_<-g6=[ }:Ǵ븖@Lt8Y'Wz0(9jt{ >"/gO"t)\1(F]~ IB1UiT! +>&ybɯCRd"hz .h|JBָ_xOO*'w(jXUAwɅY 2>0EV:@O 3HRF]Avq3p]itY[>c" ?A$B$Roݞ*B|8Zj$|DCoU>1"17p932m;b B4!/%;-xU 1r劾KěyG{,F}~=G ߳yKFđvT0J]M- @jO")9X.HڇfW &J>l|g`jl>Ȥcmjq:V!`΅KIX`3ham'5BPlW~@n-Ijvnb5&mKu`JKth'M0W:fq:F\mbРyAshpS 3뽠p`j<\@ԀCem5B9〚Z{uǬ!tQD-?\ZYf%*0jS[ m @$sLi%FWex̆j8xNj[@❯`Q\2U.&:v ̑tÉ4tOmIo#c+i0ݞ<ԭmY#Yn\9dEǰ4hn; {AGn6q1ELeStԹTyChⵧ7a:O $l&]c ZڽV30JvvL,m?s_=>,%2dIː>6e"j749(FT d  zO9ïAVSڽ/}D'g uVsa6Z=֭KF#n !ZKӁP- *5#;>zFX.KZ o>eQ愷ϙ4G H|RJ/帺F`{au8ij9Ӑ\n[ߗMިgyA>V OpzM4(w ɫP?2g E˧l8kVNϬCSaׄ5!W`ZE\ks-"~@uX7&% []*YXA?4[ǹ&|y.x'Ε#}3 $#n)`g:-ϗBi5C<KJլ;:s'<  YKK ԻK}bT;=$AZY%SqGe)*'A`zWZhТG ܬ\ T1N(m meTv[ޠO"l4^$)um#^pn^?|<_Sg3L&bf~F}Lc|mg _`ʗʹ(/>. @yG֢a^I7LLrZȨQl>i',bJq4R׻WapމJn(sD~7h',^ co0)&*%XfOf?Qq31g0G՘ 9y+) X?G@Yy`C~ޯy ai"C[Q84g  %u G4B>aJko!jA틒%sJ` 3y0/⻯K\YIr"[ 8h q>,Wg44\6~kKPPl`8ԡ)Vwot5y$u#^z%L]T`_+ iعǜv&TmlvqÕ +~bT$hxMYOO mYRF7kAoxD]@ ɴ3VޗG&5>cn4$4f((s`"mH9l Yp1>/T͝ _cFg.7Hczl7]Gd,_Sy$[p@]ivNʩ:1#G}1'@TLF gJz PMBz|{-=GM yd%N!qHee:M@`@Iyۘ x= d_^{"wɎBIO\>hQD햿meRL'[XJ\OLoJ/B#h}! &=7wKA"n< RR'SBSb3_f tN.H;>J짠vd%Fzf?ElgX % 8p\ha6qt8O7A&WJ7^QD\K U pI8; 59tK0OiE `Bu#FD}) ʠ,"Jcx^/qK]uWza=,raQԨi`R:2ReU?5R!91WRD'{WڈI: fS&O̬<gbb^`XpXĪR!UVI hI.! \=+~a=+]푺Mkh+y)#|xaqHRE<>*}EBę|bWP7^RL:h=(o~zB1 4 pW5p]3"'d,">";9)IMfopYy 2ы.ق[﬋~#W}z-,A .*[w7 0kӝR)\ qdqUY_G@+9F>q~uk+dspb~/U l}pDcP&f @)SJOyi)05.Hl]|UuQXa5nyyo!|3'8R?ud|a4Vya'=1eMǎ(;eh.`7ˌuNܕ"Nf  9̪TX-{m{hh Sbw/Uל@-:A)G)զcCY fBf:+ 2l!#֩égByHv018%$)fGb[x|5oL_F䆡쒪'KV+P@9SS Jp^ AULwׂAxb%V3i͹`ߣiD~L:5\[+g5jn92k?O ܎'+”O*ag^w18B1R6XANс P5^ EFFSmDtf"֕0r/S[[gSĥ}UH(51P dAj`sEzeFK IǍ ;"IωjU, Ѡ |6_`!$}eJ1iCVˆ5{,}zwa, iL jmCQ,cgWr:ZhL@mþ0>^ur\uIUr'(=S,IPMF 6.X1ˍn\IFđT}РG<<`waHC N.h\̲f4}X7A3O@u@UԀa0eY \!(HwK ;y[qϥT4&;'uJ^Ȉ+r+›=M7s\UpwGυXAG% p3<͹l9k(wX}g;•RbOV<?&V G`ӽXvC|hd8jTܴOnh^:h[`Oߜ/‘{-?CjT-3YcE 25ZR#pƞEYIbV, >$B혯bG NF,gc2y25Q !{-tRT1| k|(jo.LNԘx9ۀKe c$ƪǝeI`3vl _>_uZ}̬hvQuUFK DkqTeFT@]`ϰ ]/_s%ֳ|qO/JZ)Ơ Ćk6]\Aޝj[| P Nķie!Uc9Nxj!iך!G̈́tټ4 4o cqZ>yаޮr iVЖ8CLIH5!e|.7OP= gbZ,ko\-VAkMVIUwb4RSv˲'dAfeDr CȽ Afmj^l |mHc׼"ې w8MWw`~ .֪249S5L֧BnY9vb)oct!2>\nf`<$4%kxCKj!pkVpެNSAj,α Ta(U_P8s'^/Qxk$kUq iQ>0X9Xӭ vda%a%qFB^`exW`JqH*%t [ZKGgjsBU8+ \ڞا} 1@^~v6t҃q>aO=VW:G8>ڇ ?D6t2BTH]E+0!,UMo-ݙ4{,6"?BRJ;+5 z?gh D65##EJJtb3(wb= ٿR4GC`Bxer%@ 1<2@lGVJy&ZcPі#3fU9Q?zY/bz߽&p |s"%zd*V$VlX F Z^C-Ӈ<~&ɺ`Ϗ^YV.74"s{ a̓U,oVrE=-P4x*qI@dَb=}>PFqd[J[3`Ar}/EFQ c2El '6!5Lz(Lvw@T%&ו:{cFmo|zDZ]n evu5U %vU'b!ؚ|V?1Qt '8yؒ% TXJ~@= fZw0*ɇ Eu+w (m/c^6y4f)lNŃ dT˼@Bb&]`ZďJuq4"ĩAƣ8qa(a7A؛]4h%U_>5H͑gDh4:7˸ؾ>+0q.#9bmV Aʫrg&fip5%)o\HzL5AJt?/`EQi攖o.{+؎敏t"]ܦQ O8_!^A ~IxcJgkc q\! /p'ABrLhEVu`.e;!6T%wKBcIЛLq,u%u`j 3& SAZMaaDn65\tc=SNUc,M_C1dD@]}͕ 㜧@/~UsA-L|toh4d|s4n7oWٍ3ob5ΠHZWHPsZN4$^+M F \NϾ'OC x(kz֫ ^ jFb5S+Ju,p-8J,; B/˒#f} #r1 qq]( HK&42֕ʝD`8B#H "*P橅9TCu-2II>BXnûS ww/qV}+R_M0lke$Mzwգ)߄`FHi0*' /Nq҅) ]{Рqr "jW*^?=?fJݷu鼼.M&R G=}|d/xK5qeJ@ӰErs|^ .nة7eϿݓ8,wÝ3h<7%DY]_Dhce37O۱F!g,\T~AinІ`zXs^0~0+%nS{Po[]=g`0PNRu,wέL}F,c+SO_x٘jzWMs'0u\ 0a?a5~>#X7q:D 2/9;NY$ /j ݨRLz[(D<9"Swj5֬X ew᳟_D ~ZMy穡] {h2ߕ;H8D8S#Y9~C?W_Hz]/"۽"a,CX 8I%6*yxw4`[i`8O0`?F\ς6?pxnc=L[kԙ~{r4j糳ty(!pԗ T/BĪ=^^Q$Q:ɧK['>ҒW\ubGSw:Y"(_GzX&~=4BnCU4"$kSy_,=7T>j~5IL4juѰu4 3s^6gG+K`5yF̍CuEw*+?<3ywE8&,?pSX&>?,L׬4WN |c4dpYc2W>FTI"M`G@l:F {8OǵL{q}MTM:/ݚWHfJkDvL=5@Tm)J$@ G8+}nZĴ$MuDJ`R \̑DFn ƀK<0vkWDiJh"Wٷ43 '09ȲGOv[ʦNG"{};raQ'AF)^Yf]#rÔ `gٙL xcByaM[DԕqAfWC,_j*hJpuv0vR PiI9E1s%~ q <w1ei4&}oXFgNuRcVgF"R/q@p";⠆ \uِ} ";dSvܻwp/%Z|n%)!QIZ F4;.q'm Ndz٪uHI<`X6ױA(p  (_KiK*H @͹$/x V4e:֨ۄT*G{9&myY#3OsK aA!g\_/Z|A95d3wMt7!Rf+v#_uh 0^دdn/V5hyK4%o}4rSu ޢb@mFӓ^tYS\SBk/@@yڀ|7R͆$pC_ %,H3sxxe|k%<5/ϰ0R&]` PGG|Հ1T4M vF7Q/@*M< Y;cE2͠twɂcgjQQ-]Ov"c4ǘՅROQplaf}~DIq'rمwcKLm`m#m(N7R֌HnaXKSn#mٸ6K[\D;6* V/,O)6MmV%baUDrC -w+ )m )0;EN#L j R >XlC0P4 L48ƛ> ehN06p],Z_ut8/|oXtHߏB@R~e <Ȉ Y 䪯$_9i /F.[J-gA5H@YsY%H(w5QC1bُ)FBN<՟; J; =":4-˹Q "mӆXV[:Z/Y^ #"g)%]̽*Mai[N x]ki:ֶMVP`UlGW[ZQe s0X*Q|z-t3#ň@` 'rf<݄b!py'? e=m=X>z=;0gfROC4c}F]'!kJ$j xDȿc812aLao"^CMfpӶO"th9%~(5F3B %3߂[I j,iMΌ NեL6S+Ommp9P#f !3# ַQǥԃ4Hݾ<,2c%]L$@ݢ(ǧ(KiMj$IGSKZ8t-c((>/0DWw_` A_20 nBo#7DQ? whR| $dU.%Egۛܘ(] γxXg*9-˩]"_Ӛ^G[vףZT1c >䞖t'2xn -A v+9YEAJWy87pqO;U$=_o~T$QSifq.fd ;jat`BCX3'OG ԘW8NsI2SmаGf@ *<[mLzg-y1[0(˾0BUoa?;m %+@ )fXl90H%h3EWш'ʌՂD$3\XišHg%KODC|5F=9Ye{{ˏZ)jK6le{{eL$+ R16rpJ`U`OdsnVW:J Cɬvbt%enw|6 冃zDC Zj]zGhНc#,]"| ewph3'?y+%T\L-lĴn8haU=`7H0yY[>`;SBkDIe٘1% )HښG]qplėWV1 Tܜe#5Nz_ "w{cUkNg!Z5>q)+6tT(6d!RziZJ&t=л"b'ܘh#ԁƆ,Gzl>=e~Y8o<[#bU6{?T=jL/87ira./, WLaIg!BA5Yąz;4rG@ jOܴJI)4_K͌Y{d5KI5ZC-:?8,.,ox1e+C#|6DP t_LXb0um|ow4g]̘7u{ 8 *wi0QP|·&-v7 V0[X lt!Y:uI$M9JTGßwi88K}éV B%t7҃8fCt5s]"Cpl*8蘨OZP%dw:wAr*:fČV.dܫolaJ/v}IZMw.L!GgoEt]}H W- vo\OլM XyI&v(cq=.hnS*SӳY 4F;pruJ,Ub4TgPe!+Z>5g D5hc[=*{X]U*^D0/|JXeqoYye7z 82H_*}1c~?VҖzC!i;RoIdN[Cd%ǥ gE呼[,I|Z..Sw6CGXCZ+XtY\\]*zU/?COñ3Kyy$XH/W+!Wy&<H})#C12g8EΧl]%2{Dџj<(Ц _fmZ8.6u530wqB$\tncn(ܼRyɁ[q  ;?r3r“r(_&c!S])Cs5h`hmP+Gӏ j6h;tӧiTڻr) \'GlEc?_,G+תf )x+_@Դ:†1"/=Y=v/k@sOfcpES*"-pSP3EM uq։p>'`ZJUko-v@ >ױM 6Q>WP}'~. Ep/M:v^0s؉KNmIAJe{?n2I!c6+,r4,<$D%|ΦA2Q P<^Y²3< /Us}lF]`gp&8RU}AlJ8Ib6Iə>,-Xǣ?/)cp*!aEq} MafovL12di@?{MZCMBE09B,ý~XdD.%D.>v[3D62!sgf$IjH V_Iŝ2PKwRfB M-W#ȒF*j hNrhr[>nȊGe;a wl0"V~W3L:F<OƖ2W1!%#!1t"%30eGj&O<}Q;)~gcyX/rk#A+Nڗ׽yuCi,̨KaDUFZ~;bb K@W*@L '&Z,(bGA{dܓM⺳IQ:_\4M(ܗ32Xۢvn&RF`ʏA H'}>ՠ  4T<ә*y @IDQGJX+y>w7 v d( n"YHgH.zƳǨKJZMHFSo<16ނi!V58_PN.7&+E|y3ؚ!lg1ƼrUd,]f"K7NcK G8?zQ4FpuMy z{*G"?t% Tn0D[Lgzp yTy?Z@ے{8c0k~ct= Q3!0HVu x HFw-;|^{b0Ƹz6pFd EQc⾽S&V/酑ÿV#\YqDdtI'(k9^W6Rpp~ÙTHzC xa>(]]LJEQ&흾Ư) eRfu*-H HnN_AFˡ[DQSGdD3_- K`t/7ˏaG' 1"!oh&`G娥^S\#̽R#qNapPPcA3ug>_pRy9a2Paw؁g:>~9m=\P:'-AvJbPx70t82w|(n=ڒ%`>QK~XgnbA(on^"1*QxO[N2(_+wLTݯI$$\W8 %Nym(>%ʕ+6 Qק1ykM.|sf7BT4{y]WcM s+C5t*OŌZpR9W!{9.[5MWVb'b^OaۘgL}jeN[qDwr< D?cB g]7s) -;!ޣ4w|1UQ񿷊 .p x+#;^&p̐sMgڻ UCq:af#޵O'=*c)$ðsL`sMwn6Z#.GC⇐H0 %51~_܉^]cY*X̧YvY I"x, @#8Vl͍J^Pb]uǕ6?ǥ[|+s? l,G6[\n`XO6%D2 &X,6%]@70ŭi0oZKR)[{^L#}(pet_(hS;Xivƌ)a@E=٣O3@>N~cr1*ͩ㚯+(H2u8c_ǒ,wQ~ %mXƫ;F)z̘8]H\q ~MrG E5SvI`TtA᭫!w۱bߑB =O%)8y8iNz7:8`]y=s0}cVU|"v2l<>Hms: QGsEi8諢y{B1,drlVek9ZGDn'Ie`6 8 Q(`fina+woM*2 =RYܺʻ[>svX7wfM;|?g`o >3_s FN*3>J ^́ɥ$Iq ׄ߆"t(eߥa9yN5TJWPCIiC.W!ՠowyR BD(C8 cf"`J@FQOesSW{q ښ:iN:( ۫M8=C|zH_k1/bUsKe""Q`U?YJcH_*HN"{ }̫FV.E`>d?jv*>A2m oR O>r<"Sw:$#EVGPNp. *`6sY:slS0JYwF85W1=,6^\qA\be ~fg>GvHpvRp2 8 M$`{NP+[AF;i48 VkhYe)B28mEt4WOKrch50,>u1_6 fM ~P[LFC} ~U)pA<,yjл@ơs͢T!F&[e,ƺ^"R\X uoLPR&쟲w2CRSIsUƧFVz7iԷP\|m&G?|%jlTqKa]G= EhWH)E:='M4*G\\%&Ш=E͔>.q"kwd)XǣE\[Y+qI8xQr)w)EMKW$N!bC[eASN "1nxsyKnHe&zȲ?!"^Ïqui6f153cICV5cVDLɎ2&կsϥ6Wm$DgY)WU/!4pi>"\ݶPXreW1W5TƻP4P\miV VU|(Ogo"u]Py 0"Ctg@roYw([Atps/߰bT\52yw"1N4HG̮nN&TaPm#ؘjE V%qD{|y~ [aܻg¡ǯCtsVe բNbSzZ܂]̎ \ppc6}&"־KfZ. w%ņ 4_mjɆo߰%'.U'RFIɒд|JJkbEcҀ&id.wMxyC/ UU1?4XV.Ublsil,В/D (6uA&ktj{NB5ws_(z $㹨IUXhcqoAPEKYx[5!cHgwI˩^\RqrCfp7<@]Lj ƄU h],%0)mZi#j5PfiܼAW ť2܍k,\L#HeVzz~ū&4i錡+h $~1Nrei/,*hұ4T+}== `% iN [D͓/׸Nd:`yK似>l S!/R*h}j6VMg2[F)O3 m1k[7eTm]ܞEp aɱꏝR'U iަvFF [ZewiΔ vtMza6.~gA'|>XU=n̮hx5$K Sw[>T 'ل,})X %-{㶝/c{!,mi H;QD!-с0]MQn*a_UXV Mۿ {"]8k5?24Ds ABw m |]$$?j :AbrD cܫ#FTCܶj0(D6&3U{.IZ+-z2TM0<Onz_Qyy9RRy-S]OG*?U&Wm~mDJڂ&p5 S^^=-]nJXQN?眔* encO;3: u:L_nkH&)ThOw@^ ļ`CkB JY3 ݈dI ,{R42pI2q%TK8]/w0:`A` e'+2y+-LчeIafн'.-=z7퇴qa6^Dfrax䵓%Ž.0 εX%D"I*[? -I#(vt ΀~ WIKb7|c0`7ElTk]rbN%R]$:t#Dݹ*VzFN7$;_BπhV9`ΟxkN0o+MÒGP>70dp1z yFp}S2TPE8 W>?X>t-Gz.869sfP -$eFv8P[;Iwъ,EQ4$shӡӄB~+GB_pb?C=Ov.8[{c R_~V*ww2lnnև,EA^ eQrM ?QjɽvY#xE๻gw_A@H$Wå#y ަ-Y2 `5->Brx$`Ӱge0I.~~Ex ?bFfA~5A'|'r0 ^uH' \N}<ϫX4%D9K/;T{z!a T!,-;_ϝφ!,\<# gbg fPqpɥ0`hD0١~KL&p5Rj%(@хه6QV=.0,%֖:Ry1zTjZHN_J*žຝZ2T PϝJ5Xaa""'Rn3~J\zIiȃlIK#pfn&q:Q%&e&q࣪s4F k`㑤c߫bzPe;L9(ur$ QQnYqHO$}5)XGc ZD;{.24KuCmu6A)~)L\eEܓkL]%W[:<8kڴE4}Eޜ;a4橐&=]y^%5X|a_4P %DfcHLG6bxX|H+.nUy ⏍[ۿIA['vSgTA鈛J_,)I-hCט_@ ʣ |;zFaӕ7RT~Qvzb.?aAVa6 7\Py3x^OJ--A~la:J WN?=-ib^`egx {װ+z!imP\ ,/ nM5rB @O)Kjͨ4 hvO/nwQoLGcܝRsEH"j Qi&XmCj޴ K=q1vw kǑmFSiw(jYnE~ CzMǍ fIH{kU1bV|L/CMR]JIw p:OTJe( W)V8?7{WՖ=ܯ$ncD c\}&CoF";L=lSb>ڮ{9Ծ p>_&K9c6ֶGwZ!HhDm%B.96۾-:i#+6N?LOrh^j@e|5uѲZ^DcvDYsWn3skd9.Թ;ٟ¿K1_eRyQ5]L\b^淾U7I8l0>k(szj2"^%tٵ |Q Eu(Lȩ#K;LI6hNt$U46D:#GC  ih)ܱn}a =Leu0LdȌ@=/~~l-'c%C,!goR'qXSX>ܾ1U+NZI9BVv<S:wwKĶ@2 U0O;we#WfPi@="&!Ii/+;ޠi嗓X;"S..1 1Z*]ݲ}ɍP6кgŗ`[ k}o$Mz3< uPwpdIX{A"q Tsťe气Q|uE(#"ۈ5pN^!7 GjIW(z߂$(-w ١y\Ь^u06 PxM#W[k5u+`6P| + Q3; n_QQ K*/ b`k$6D"["4K+Գ&rԄ)t+MQ.U:UW_bdX.w6i`盛+^dfI`5߈Ղ7OUCSFW|m8\'!>%H%$o-Fe*%Mm5:y~ fz@(+ qX/{E==j'[iRA%|@\"/Vc A6C\)c y1 ͗._Ebu,Z/P1Ij*N_(V'3IAF2.ф$QTchnMtTut?;mz Ǜt:-kVU_}z5B6226}k mn1D$$Ek26Eɪ]f YCո -/.Q& ejhj`@ MLs&(oG6qLtqZcЮME~eL~RCdӳ@-.j Ďgx^b( rnҜo ʙ/y0afe|ks)(6i, >wDP/Y-k  *,ܱp\wt`+3]mLSI'^C/ݣ{4S&O 5?_ux*=B}쓲`q"8{2As㈆o[^\_6So0syk@VCEHP=Uw9nbp>>:=(Mm۱'?/ըqa/0~'1heK]hG ๕vaLɨeq| RgddfPi-D _=YI;tnMۜKPzKzE>c YJR.Q-Dfa$19$P۫[er}b4մ]0=O} !Ji5eN p|V|`[Fy Y r@oLQ?hK'bkՉl^Kl?Uka?rwc_r_a_#D' ưq zkeVsJ b"HYnKtFO$r�Kkor .eLq?o_d#p5_L, 8IpаF.^0f-nsu)o@a]G0=C T#7-(U4F r0g~#uN--6631d@4U`#sV ӗGgdijX=F'YnAD I9l8h.4B .ٴTк)Ƹ"). z~C #(8AdP%[e6,@_eRaW!WP~rK[S~UN`='S}/".?+qQ/.r1W^lZlg`Fs7VhHƪ}w$>cJ WA"]( yTPC.(v ߔ_ޮ2ٻ)v'Mj"oF7J[M]{(U@E'6/R0P]e~5 k{@ 5I?^05@i?Wi8Y4qVHu%,l[&-bџ"GHD3pMߕoװI* j'y>( ^Ao1%|qh bLf"0l[[|ъ:4 dm5vlE0N-2<1&4i\i0Y|"U9'hʨѿ`^{}>e4yUs laF+:*^gģUqkK|a& 2cR_7ݴк_u e`1θw(mmƢ{ k;x LG01YeK&j?탗swP ݇@5G)[p07}hw;[AlhָOYB Kcw#rH^6L95 `ɐtZ\A |V7QUL:G. b؝_6%aPo|UaNdˍ z7`@U?I{TAHƢua6}>|OӡDjV[̧ChPy;r\;}R̟VA ^s]k1)PлoSxKGn6^j$x6\D˄OʥUzJ[ FQ$͂0NKIDԠnGrp~zh3 b 1! d8/p Baӟ>%C+RlkMd(<5#%\,"n.a ,eWR ̵͜%F:մ^nt3PsOjX8xm)(Kw35jV6с)BLß )H45xHR Hѷ8L_ܲ^,Jq+ߕD(|??ɕԼ1twIcRa=G?M+!nG}MyJJ%"!։|`Z *MCSz l׎aMA ,3M 2>EjGt`E4}jM8.Z0RV4[(sB(0ٺ&TfN65X1\@Hbf0NM#cتvW0C_(5IN=]|P]ڈ8/&'%K|1"Ic$J{eX5EIUNlTÜ&ʷe8 xɟ9Ħa|:u^fi@Ϊ:_׳+鍪K1FPө8-=`(f+!bd,ކ, Ru?_*@̏"}M:[E/g,dmkiMle YQќ t+.4e3 1cMGxf\mvrVIݡ ]b9 };`c=Y*qŒ!fHDCsGk&/tz# ECo & /ZL9˻v~Xn$ZY(Ӛ "n|V{LPc^H\\b{qߪ[BG3D`*W;Ydy#|Sڝ\ԋߝ} 6i܄I/Ps`֐EXӥC :`sP`TnT'TFSvm7֋V,;.v9W'(R| E%_1}LjO:۠J;3AeE/gC1bj2͆o.'-w07`10J8F#m4?.9#+%eA+jU緋/W5Py<0fLJTSnuX{8:sЍ}avf࿝!.1MqSH;xXqX7hRz(Gey{U^yI#kQAb0ahޚꦾsS~ܞ7ߜ5i2 jU=4(kc;7w龀ӪgL=lSXዉHg}6 W3Y8KHyFYLx.huUL=b%Y61,滬,5rp k~!*Imr-ͅrsAq)Mf>ʁVWa&W,=M:UaM QҗSHS:EGOHt`"`.QvU4\[ͥ`-(>7m )Xi+/.WpWP:_-fzWwa,^ g0Bx@iQ|PNz%Όjab@ q1umsVB\7+=Eiߛ0bpZ]DfF5՟61` v||/"]r`s2 8<Gߜs .R1V营=eLwX[Es`9ס^5(`Z}V߲ Rwom(C#}h9Axm UQebNK(H ZA^)?J|BƗZ<5{)1P+P씀93l@B~d^456:5{?w<+4,;p^o*٘u:_Lneذ|MƗGjZ}ъ$wRkv)+h=$?g>9$\OhFmFtGV{yx g^u|G\VMZRC6uue*;99@GBjH-(XBO]0j( ؃j8g!W}'}/02J!aH)>wBhtHCI q-#8,Ծ4ߓ |N7w!2ޭRSs/b{*<P`9ǕƻGI5\۸O=ݰ0$׺)}Q^9 _$v2- d:= M$&y$!IIjN|h_]3D]T֞n+/@N5wq]BSqp-\ R~Zv<4['hV48>${ xhY Jte%xv }:H{xtNoaVl`U\PlCB<>RYtYXD&,evl/HnrY&O_ pZOn}: [x6 $&(~&5 8يC1Tx%p}Ɉwz}'?'dN\)2=09 sF2?qNK܋@h'j(֮oG٭xC{Df0S]:{WUч@lj^b= NkLI78VZaYu¶bX0Rev< OۙtgKYOż3[>ewZ8#oe>w"1&4 jbkƬf1U|BY934GltSzYKl#|"6O{0RnG6z͐opE٫&(f E+:$E 3OjHgiLQDv#fׄqTm,<~F͜w[K)g`$[ХWFmgCvea.;9 5JǙWL| UXdbQn3d%ԖiA)pOwBYʐb}ccAxa/lsDv}>3ɞ/CaP9qx+, :4FsWW@!Mb $ҠD~-`__uō3bN76 #B:e WX"ɬ v*>yJ/,C,k0s2.R!Zw{.qc0{Σ-oq@\!N%v| {,-bW8f2CBxR[ȵx p_˫Dug.˖cjBqx)!<5{RQA$o%)} PN=C@H1W^r>>aKUR%:21DHG/Mμ0G^t_mLx($EMD3鑳257yw-\ڟW0}\.C4Z  NlZ#lm&oGH }Is4VO+I3,~P$妑:m?Q]Fs6 _%RnKoTݮ9k ZWER 4M-/MzбPBbR12b== 뤭 y1G)B+5Ĺ'ԟ'HGK8\ɏ=N߿Lne{v)-^%R8fn-gΞy+L7tD)0/:*qJ,(R={0Rus?(rqEp4XMR޿JC)TQN.ǰO!JÝP`Ri+TW!@zSA/dMA X Dh:3;D (]VS! RQͽFn#|GnߍLN5s^v 㕒D0F3,͌Vаv̲CfwVO8?+)QIVy5Yx{:ɬdREVJT@y*ǚ{Pl"{7שU6HR鉢*a~v6ZBmtɇv Zd2LK:os2Yߨ@u*``퉟OXL!zUFۅO?j+gThC5H?8\$0mIN/΀vkөpA *;D3"B8x6U;fcwM{q7,ć;C@$e0yn]&ٟNQZvedJkη![>lML2tWYeOwvT7&LGz[QtbJl;q ȃLk!4)6`x9 p[w=O$,؎t C}X0m* Q \= 8ѸPK1)ϔVo('p|/x-3bG~b`b}0 NUْP/ڔ- ӕ[ϏwWTƷ %^ \12H h'l .y-I! Z~2Fi>D3~P1 h"K(ڻDC鵞gvxXڽ<ü+BⲴag-N)L\\, :7 Ȓ&f^: hqZR8Gp%awi^f-m?[.7|)ψ%(vI9#Gs}ɘ|K ex)i#XQ4~ sk-&W?חZHCj< ,Pб!ٳ,+2GJ#& M̜`}d45@u|~*BGA< (.h=+fzͽn&R0|㑵 6ސ@\@(u5)ZU(EO[(?DAj^m4+CA+KW3ջ2C0E{]GE?Cr ZDR}(OZm/ n K!ĶG:*ͽozWv#+B@aEv^W~RRlblQVz AH"Bkg/Jנbn.9r?OXJ*jh>  > gXs=W7lpd'cj}UEʤ(*r(Lʝ,@7jFbh-|8 urn}t%D߉ oQEhf`Dq#Da@5eBբmolVJ8z*2YwɚDAD|-lCvXP彁>9N=Q= 4+}BUD^VNp" Jˎ$ڃub46% 3rX>/z|NV!{f:VQ=v}gz+uũ:栉JlՓTנiUU1ͦ+b1D'dֶ9 3>zL0  K}Yl|_qA1$] _;"yeP9{ᖄ.^rB&<L?m\B‡%sz*ǸEw*&acY*G\OusÄP=bNf{"܉(B"ǑScdEm9PH7/`*`ym{γ̄^bOen 5VS!x|E cdɸ%&{'W">h8֫?gV)qOmUQ 3nx݇Opg 9 s r\6 331>\fHL-l"8ϕ$/:hlwU}G<<i^5!n| ŊTs JbƿhtlGƍP;isZ0S;CP&fċMojR> EU HEټS:$ML4 KT?b5> ~4ZZ?%e#$ګ /;lB 2c$ohXִL6Q[#6ZvdrW37m+p$ŌUBɍ $l ys9oѧ[ys=NW{d!OcHܓI M{GA/A1+eznVl[%y~ySzȃš!3x0k.i免,L9[\̶r:DRZUwpVT bo&~[|YpWtȷj[ϴ˝d{z4m~cs5Lds,ఌ.U+v[ F/ /,ApD`+{h6] #Z*WBr&6 ݙ3xItAݎ׳y~5r UPIK,OVX44nD5T"oWJ+b#D(Osg#5MiG m-Br`NSⱙnh5 y~+@wA~cRpG"59xb@PĸϏQ.nC$jw"y޹BeRLhп3yQ'nŒޠ [[3/ÀXhǰ;ܹR?W!}R> Z|q] \q5y!$vUd=8p=(,eJQW\aXupDhȱ"]Q|#,G<'9=E`jCKgZB'*akɗ߉OARxnVbd/Ϩ mXe2Q OZxk[I\;?#=Ef9;HFi<)i6QL<0{~B>Bzfі6%ټǓ>xUƽko &,`vRh/Dqۇс7ɔkÈ=L%_<|7P]>q~@+M?Y]ZSꪣzNK UrJv;S/x#z[+Xܸ~c9*Nӑh73rwx$`@wU:2w"uC7P{8TdoE]!!&ݾ)]bt-٪Pѐ=^(q'ksXRsX 54{2m5_I;j,{)o5X )#4ܐIߚX zGPҟ>gneӂ;B9Aš]'ӱ [KD%RT̸=PB|6o{ɉmr/-2{3Xxț$/5!#^wPcg kӌ,4R?cߘH4 |$Yà ݕ{F &|qG=vP_soP,9B/|c4Zd:60mCD zX?yJxZE} Ob^nr1 w"joii8x'Ӟ#Mxc* &ɸ_ۉOSv27(òL(r \MS]Bj " &_\fu?vxəpAXże(8ro%B8z)0E,^mWߵB1"4Bz <?6tKEm;MwJR?<*'(7=$hfbGkVn3csz#ie/H[ǭʊ]"Jr t, (JþnZQ ;H5 v O.6@ ^M854!CF; &Q`hM8sHo@dT:֬R@ʍ{(.<7s;)I,U9.)7NLj80>9e0M2_5!s!&ߠz^>F!'92$T {kzt82R9|J#mkR+f5\'R PL,EVHgƃ zA`֟=4k3yTxD7 *ct|𶠤Sph5&= A&q0&9$-@b\J!y},W59Q*Jp 1ox&)ALQUcWI^STbU`h8"W_= = #X|yqhl7;!#_a$Q D [q7E3M\kDۖb7XC.EaL9'1@)X]X-G{Uk Qiv4<Ehdݤȗ /Kq5!!Zጦ.nL2j͍{2"e`e,zʎxE?hA~!Ԉ_)X!@\i ]nAH^6Zk4ʼn.yϒ#AN[2s!@P. F^u>6׉1[#R8re[I.՞kٱ; I@Yۊl`"#o-AI[mg9q9 bmC.%E,ε~ I29!e>x%_~\_Zw?,"`^Y݁]׊P`|)β" vgC>e`1wS B>. hV 4?a#wf;-iE&N4u)(Ɣ־n;0j 2B#šܖ GW ֶ)_?N+#+%"y@ w/VR2 <g,>6?ܝB'YW UAvJBj GN}0>jsH2b6zKFTŨ=2l"/8 UWԨ]/ÕfDw 1XSY7sG5tc39PHKg -8Z1!_b!ekqҺ`)@?*OYQ긹5 R yԶhYCՏr?Wkvr|.ҩg֒y5=H.LR Rz-6WΦAS\%0;m%,;A1F0&r *%x$g lCO"Y`("B,`-tT<@:?ϷUJHdMV27NП%iM1/.\5h*?&:ۼxe5ekUkwUY+kھWk ,IXo:O:])13º|P>\(^s I*KW`'m$N-EϲΝڋ%]o }‚/0~Tg\[-<;V!YH9m뛙9U v [͎0TDi]F4_'Id}RrGI0<ЇN(hc Q=W<_g(;ApO'N-pw>eL I"mEN@,(1X*J0L-J 84};n-!!q|-_Jj6NQv#iŅ2gQ.cmcU‚E슶o]zn~ԿʌupY}Y1E#; uߟ:s0~9S?#;@?p\tt9ض<}cGxQ̪[z>I2 %ُ$fyȍ>e ՙ̷`Gm ҬT/ntw:ŇxM_(bWxpۇ^xP>;聠hecX?5L6cP݄۵ijWs0"5~y>ewZ3՗OlXRF5,4|U^=K%g2WFܨﴐ+dIIO68V;\=V&40iӅES> )d;Nn+M*6 6| 0?mq%屓fnJѶ['*TJ#m-|Tjg}ld"UMaU%p5(AӘȭZDhRr 7XBu 6Dyx|}І蚕b<6)NY%V\iKh5z|;yx-欨 ncfkag(HkE[fTgdžNqbSv`yCSݜnfR<%9vژ! {$J5 ZH)\yq_#]L9=㨻ß2lYT\``;` !Uk#5RIT+X]uqAsbñ` W\a ⧰p=/<~vݦhgI'J컈1\3CN[{ `(`puSGpk.hΓ2uh`HL$|Rj^6Kɡ3”I;,3Rj5⣲pDgͼ Ţ4"u8Ί?.5䝴Áp9^ N؊9;{Vߤ#sJ{&3ǻӃ͓U>sVBHAGEG(wL6:h6LD= Y˕}$Go¦2:z`1ʶ"LifrXB=2\.!VC(`cPD3{ΠYz^E8D.>lc7j|:C6H5JI8Pԍ1dZG>b9P]ŵ~$qxFnoZۗ7-cIܝ>4="+pq_m)qW?xR::EeEgIش }+7P)CśÒHFpi}..v}d̄ɷ8hűܢwnU.ܖe;T?Nl$[UF IÃT!||ӫﴽC_j-@izU0LGPKفDz?t/r!%ҠrBs'[鷘ľ^<|Ea&𫊷=E2a{aBHNJM;4 IHC9Bh\<+U|~o)m~U PaĹpxpk7 e}|CzF[a\el0Jk"s! zaT:, ZEcP ͤO?(VdljiN]룭<&V~S5 %H*c0X"U [%'(H_X\p\`#-!E󖚢+"D1}'g1`F,  nBΚiO粒$/b1:jGS6Us;u8][zKյ+YL"46FVjsE/ $jV|uwZ' Mʆ=TZYi F<9a2SKTb!EDJV'ғL|sҪZq1V+c (0bԤ܇@<7]b""yyy[j2#. 3J6}FCc)8S 0zFvP}khx84>!VyV[Ebt"-Y@mC 3Lό8&:}M:&ڏwcg< N8P@H[ ]\,^(H%;9v3#DZ}=)GUQLEC|:L" n>oJ]`SGYbeV?V4}qQ"bB/Uu:[" źv4vqWaӯr#+*22n$ 0C#GgdoX`1m.7AQ邏e/Rb4%6_y>x"cpi;O6լ3Y7ڏ 0RNuN}v\@~sh(=" jjn}Ed۟hi2%Ri(?< y:C3\'9G#%+3AoB,6iuYn0P;틂l~5ͯ+z_eh#N\ -{wKMcLe`sIfῲݭ\l :7ZFcYhDYǮǩ^G0b?a]# poK%ҵ:OQ dOH xj1Jiⴎu]3y`<=c?DٿvZ1Nr=ȱ#7?^?f_0+Yg]T'wpQ\VCqHfk$7ԁhw=x([>FQXtcApURcZrLc/h,5穲nq bq-T 䚠7cK+%1<a#yeo4{9.< 1TpK{l`d8 2aĉ;]HZPQmБUA`.FFC|:sB!5u( ˏ_`@.A h<1*چf Lz#B:}wy3qBLJ gH%5ټ9'L*F*%T"9) KY͒˙8QГQW0'kI3'%=J7XP,ЖsF)la;* k)ouWe\ȇ e>imP>1V p!Itŝ \ ⇶h| 0|o2.^$h;o"5♟lD /W.c#G:16]P;^Ё٬I>LF% D\mRKFz bĮCnZWƜ= 9gdO}G f O% d+a7!0x@ ;5+X^#,8u Sq0oT( FA"G~h|A$:vOBJbO82/s1x%db͒-`TsjFI,qpl!LQ8GDox85PF)fdٕ_}|U- =順a|ӯzp$i9 PYZJ/aTB]*z_m]zԐacNTʼn/*M|2XSK ؇V8h%LyXRO9y<ҟϯ:ȯg:J Eiz",Y1#I6;_-ϓOC]^g[rG'd!C5l\)s˂R&h J$@ e\4)/W/VXI1a/"X\CQ$t=}?LSݞM=N|oY 4{tnNzFXڭS ǾTaBٜSGb61ybj^L;MSc3zDKi4y}& Nu>pfY^"B]?lw7yB}1$ BL2Qc׹R <: ޷hχ&tsAx?v%EiSkeL31ݖ665:'1'`=.c`<k?HzO[ hkMi #蚌ސ %=^]!6PVIw,~E4n.ˬ^6A{inUֵ^zu=ͽݽ^ʽ/min5݀a׷w{.Mz{wwuuM;m>At }Zp3k什 }}7L#^;^xoWgxp{vyt>a|ox0p=}ַ|l[ou}n+m9Iݽ]cuNݸkg[f=lUյ˛<6]{uj{Oo'owpc==o{otys^{=f{{uOwέΚ8]{^q;moU핮G^v[x[fZ{ͳ^^Wk{gh뗮=n׎\NwY{ݹnz7z{{Gեn{x޼7oO=ݗm뎴m5ܡէm{s]ï{闝=tmYǭ<{y׳ݍ{WuNΝ{u]]k[nJzڷh3oHra-镵vy{޽w;+m;wۅw;̧{{m۽wk\·G-e^Kvֲx;m׽7nzm=ٙx巜[Um{Kݴ콵Vݞ\˻gm%Gw7omvnc]=jnκ7%kvzmof[ܷv駫na{9å{AJmN^uzu[yݲҝ^zn5U[1^;n{w:)s^޷x7uۭWyxKw{^;]̽{ݻv$LMjזcFm[k^VUә{5\']^x;řl׽uyjs{o:]w 0N=q48FLﱙX64"14;A\ٓɛoJm)usq7&/B \LTGC=y_V-kZ ~x@,52-8Iqg'dlHiK~Ϫ4ct\#&,QY6˛pQGVHXD/$=OQ<|c BBc:A6r;՗}*Qb'W +XDbqlUGʛO𢭗{\}c (5zx3}7icv?Ҏj>"#n [~T s | 7|E&˂J[P| +LtZMU_hZό})w/"f{_;{Vx`9zE)nErY7a au&3&-G[/>Ka;XO VZacoz%,,5u{l`[QJ.XEM{{AW޲m/~Y D7,A&J 3¿/Y B٘^TwTJ5OЙAad/F'r [tF+t9BJA(xaҍ1#]:XW1m$/O`'t[T"-IPHee){dJޖmoz0Q:2Е)u|m9 i] t%2UWyPr3CfV"診MJwD5r7gK_i81Q0fl n{b0c7v bYQ:Bܤ`a2hY} ;}5<&~آ\|sѬ ЦvZ|\ E7B" #2t:@N8'$g2\j9`GQ@o(H&ͨ q|ET쪺VD*AK:H#2(sffξIOIWD}%!NQm6OT9U9;Ш9r\a<}hԓ^097oS9(X^,v?P*rz3EԢ!gRK_~/ _lqPi/r5| -aj^_*_h䍨2[*B& DXJ~, ~΋z')jPu"q??ب9^L 4je;7MlC55ƽyaݥ8 qh~,#Y~ )&Q H7 P5BAr^qV2ۘi>D 4"Q"v c]T3`DUy.( @Z> LjQt0OE\mRCd[ $B_4q6+r jb&fj\?~{@rq(5UF-'-@̅}Ql~ExO~9&Ÿ}v݌j+$??;X龃5֩P*G`ӽ/g.<FzD Hoh:h.0p0@OT1Jwф$+c=%C"l_,0lꇠa2,XiMDPi_ NHbŮ3cV6…(?E'hhߨ,!^q/P~q}ѕҦU(`i^%dE 'c9}YCl+)I(,;3O r+#W sy&ŹLr{ƤvNX63e~VY|lW 8eʾI@ݏm"pf5s>,'7r3^~ J|{i(PS/(30Rf5/[=bOGZВ;{\&Qd[J'1Bq֕5h5cP{DNT/gJx6)}{ s;'BKQ7sf6WՃۘ<7ri_)>a[5Xk6 N\8Sos4i~̈́]ˈmnZnp9ỾNˠb bzTa}˹2'%__:: ~x \[ʼn%V s3'?szn4_M%{ nLcѺKط)-Z^?AԹt @t o6cIͪ`!CAXWCkTܿGQ[ۣBъ>_jP,\rrmvJmNϕ,5bRֹQON䙞6HԇJfOil&A4RA0S1j0c>h~|ޟ- tBŝ*e/=vjTC~ED,AvaFL`-D^_tגyNuT@xşΔm(K98 E$NZ Wl&|Z0g1I ij/TW`!U=̏"/FZ1 _ =.w[-uUBHcF˿fpi];@nX?Sµ]Ygxw9ip46mXZTE !KJú4;1C)!ѱ-NrLMc% OD{':g;,3B#LSXT~dpJqqhxfU#O'kmծO+~Z.~?]MH>';<.6ӱ"Ӆ`({l|_Nh-GVhs(!:m~MM{„G9A{ Wr,6[<:Y|g< )$Tl,"8Hޯ&8|/|RDb!r04Qt+D,] ?;lE EU5 9@xP\˩"8LzQOG|̱> j%~&[[:K:ӁO^#nU/hM e_:-#M_rS ;'<ȮM/!JFCit+fbcÑnX8#JJ{oR]G{Jڸ6cLk .JNP)>u6L(c Ll=XhZI^3keotע(t L̡UP[d~!a3G*&qNdq=~^X\JF)׺( YaDr˵Է0۶+:ϲr" n3DJvxV% `W,D&\Ȯ47<ز:<5&x •;D“P'acžfSIim2+a\x8Z~*lq bgIDr׺Q]=)+#]S>q;: [ &}B![X~n2Va<5NC/: F#fdNN4Ueǂ}8`&{ZJ$,:~֖JX;v0+J(V¥}w,f\ƴ-/cKW@_60q6LW򅎉-j J_N01M 6 ֚ji ist|Cl#i ~zC8XӨP>`m*y\&,6:35NO7\8F,&XH=lC]6婴x `@han}0ļMu{{аZ˵d_Pݙ,8#54Ӎ0E! \0XnbؤJV ytāVǍ3-ߘ6`Cz ;qQqI\F]Uub0ΔU 'TV)L. }/inݜwzG CR]8Ŧ1(VPs&js;,ׅ0,ٖ\Ylby]b ?OdT gx.ؾ_&pݹ0lr.-:c60s ˧H._d}t)?ٍ *'4wia=L#"VC. о&+YY~RL,__L`;iD ԢTxCBb&)]aJ"5%F;a/V~%"C\` 庞7M[^F)ob.[?y#ӔFکeb~a Ao^88C[̸!:b|/kybA2=G%ɾ.2H_f3NVo ep"ReCY z&y ҄44׻ o%?E,UDii*ۻ*CN=. Ґ SSJ*:&3lPb`+Rެ]UbWH#I2[ D.ږ;屶?f@Ct:E=$fҥ*.@=m蒧~}X5`S ѨcN=HBT3ss[U1 E_1@mB}t IJTum 2 n֬߇3Q€_$$mr4 tcN%{ !" zƛx_-&{uS uNMye6ݟpN2J{ǝHWƃ vI   ^Hڼʇ0B0Rd>f5 Dn`9n5B 2EA&.d7wwJ*Ir׿⢧ չZG"os ATZE"zIi煝5>hYĄ!YQ-o1..ˡN1BHlci-=x'톼D4X(LUFA,­pk5n5P=A?@.`^h݂j>EW?S0`yؽ {tDeId +4P {S3*a!H?e/QF`Ѯr &^B ;xse` %/tJAoUk+K$WR3cDv|IJ~QU:,p]cv](ii nw\UX\gQZ[l IѩU4",U:$}^NKGXI9lk'7gB{ 93ֿT-\#СP]2fwMɗ$%Ar5| !Ÿ678tEk(ުmrhXh(sՎi$Yl|-֡ S~sG!z)\BrqM x5Q9t`6UCT06znv.~/BdiFdOZ|kth(lsf]A,vwq5i"*+$OQg:A@RpޮLkŃA B7|: ]p$$,3i-9X}óR K߲掵a|868#}sUt7i?-(U62rx t~ :4)7̇:FYߞ4DgU K^Q}Dc&J';5/C,{' sW"I`dђٰ ̢e())[q}ScC*I3@u|F 8_Cp4yHMu' ȟuS~jOQX]3Х'Zɿ6L?N^eRIm`$R1¸Fo6鹠$+шl ZٚmxJt++UFvgV0'E2 v$.˳N%39ROetû)Z^5fwk޿ڐ z\Z\YP`m"S!U?Pb2]Aڻ}L-2{RT?vUd<՛zJ s$+Hkk7`a+s%e  9re)pD0"<ȿNfY)ૣҥ((/L76Xҩox`ĝwP?e7bqI̺zv[_>l$ȕ !$NL`J?9Cuţ6ٍ~er)>D,Έ}aT c5xD=ܾy5IQ_6r>:RT%K@mrC2GjaUf)7TjD~ q-TNjlתѢ(nЛ|dxw63G,O0;CK 6'j 樢aƹ'H@.@۱e(W@$qm YkI[06ADlQmfJL頮eQؕ(y(>tXoov/rB`f|8r= .ocΠaٚU(7Z߿YWel5@Fg"}"{6=ldqeF:fELBg~Gٌp!O_ףk !݉m^n7PǒSqpPv:x[T,xDعqvb'f-_OX>ʢd<1M!^BXMԬmem%=|I4ĴҔ_yY%[I$!YLn[kA(0\ؘꞻztc梶*(daB@&Xj)a`ͬ$I2!v{?ԳOM2uG< klPAW:.3d'8h#D2]WDPGn̥H Ș~gP׷?(#8.AwuV|6GfZdaQL=975*PUjVpۜeFvqq7**7TM(Opd*R?FGؑUXv9WߟOvyBx}~˚Y:]0RQIwx~:Q;u$|UE+Stn}ir= ad~!q'%Dj p$Ӂjs6ʃ-%B[q-UqS}{ KCyG{dE7qSy0wAEy&F(C'J? mx{1>׀~EYȠ)j+hdDբ4(ǯ S.ECHQq JKr[Uy䤿L*3C*ܮ'|_kV[]-?\oi+Y TpTPh$k7pܽ;(b!r[4Z˵ų .!PX@WfC;U1SNxh3a;8BO ~6 9 |H9 |νjDGI8[_ӗBרM<k,hZ+O]!p >lKAJN-D$ U!OTL_R#n#P%utI.hRD-]տLMuPGcubou $^=Dd/w+Bߩw;~e ,3i%v0B3hN1WOA5 jռAHPmW d Sevc0xS:/!Jl,t-{ Alm y Ͳ҉~uu s뭉Q0%xT9{4qPKf$enTPw}!gZ샇A 3gv-VK'Pƙ64Ldց%7RL'Hh)c6F/ɸ XF mYE;up$DPl=½CfN#'f\N51e Er=85 % 5;I* 957uyá)B4zҹ]fLPUUZQ~# Ⴡ& Y`V-l @. =z/:qM.'hrf>Gحj*w?i`ް`],<vΜ0d^iQ8ֹhAmŠXJ= F=<{f_!;ari(Z-4YT)Jytv]FOcqX"J8mN7ɸuﱮ-N=VEyAi;;8xJB(9OF#(_ح0w2yne? "f5Ըb5"t\ #FǸQyƘ|8rX:4E5&`cbb#%lHu_pb5̵GR/XUfC;G㝜 W̔0SQE0`4, EBs= a*vgx۸~p~ 猒_3;6Gthtx#ԸJѬPa}\चF2#&+a-$rTK_#u#D3qC}Pq#Kq.ϩ:aPN"P`T|,dp,,HBӳcJ6Xŋi񎴵-GW %lT]k߲4?¦- ޵ iqrvN8+_. g.N@#P_d&'wcԅ ʤ?N²"b34ȗLx髠ڭRFٙ:v[ZڒBB_74Ύʈ2̍rsEZ|(h AFlzXo>g23Pa@^o3!  GH u?ˀo]-ˊ,=eb֯?ZZؼ A'Ւ9.@| :<痏.Ņj8M%xB+!MFYoZ]4TTF6-iDcu-¶sT ^{ |X_Thax?LKu1xS:LF%t3}ڡPomtA)^zNNB=q[J`Wka>IOGvq`FPO_FcVZ k|ߠ]SLčO #9VnÍ'n wJQz@G⯧쎭TXvgv Ia#ujF ={{J|¶Mf~\re.gk `j(l%J`Z Mvh-szE+3yjxW^KP ?eЪpAH7Wa:SH[J~x[&AXmǹ,^]C\$=׷P>̖ h,#iX#C+⼦*=\i]@x>HMOkLٞF;h#ֻbp:Dk Q C@b6=S$PiUÔȿoql䜤q1ux.„dzNo3[P+ƙ9dmk xz%t8 UH<6TrW$LRfQ]i8FoCF:RcQ3NRyaNQRY\$Yp9L IH?o |!2ley+5)%ƿG;G]HH1$Y_%Ӿ >Hq+ 2].E+: _pG/ŝqM8`OheQ^^0Ri96{dk'~o2TxP +ٖv̼Tz:>W`BR]eӋᡅ6swzBAnQ>?3qrhhjXt\ +%!\q?zڳ.(sK(H4H:cxU#lHkA8I U!dū㑚]MԕCQ/+7 ,%sUj7TqRTj>G @ӨBz[X%tŃǯ[-zHhQA̹V8?G/鴕^(hnD@s-qSwb005g1 oB:[YJ& os~m"YyzIOҹy)Bj*.⍑n[bJ_([{Di-<( AGK1sckYLnBXו|6s{~_%ם_7x1qT40B)s_r(#ӵf- ;Ò~b"u;_%r6S)P7 N|͐1] 9n.C^a Sq(>&~uI#h-bRd߶U:QM&a<"iJ棭?\϶ZhXȚA0jP#WcFlRͰKh}~,285qfBIIgఢtQ7:A^ J0|xhOe+k@YK$٘IBъ&-(LTRNL6:~͸Z^ z F<ڦ_{@fG)kR> ׋"] YrW:V)G7m]НVIdʙ>5Gd>F,QV_kQgJ.[emݤ<=y ~ɐ `grq'j^jScZm-AH@B\$#Q }تƏ BB@yH6Ej<%vǭi蕝 73~bj'G":DSwn492Мjs)XZI Zjbޏ#*GౘHeՊGp_Ȁ$|gvvi17j8 Z(TY? -/o \H_ htDF^E )@/m.>~"%+Li\8uP/h<>7v}q¼p>aO#!<6wK@Ε31|p~Xնx߹vv!$#+w/t;&B]>|6FŴpS rkV/| ϋ;"!39`j0S)Kw ь+)ZmJr>BoB%O9HxOAT"xyX$?oL}`Ŕ%q/cJ#txbܖ+3(^~ByKOD*qG: _G,(urv@TaTΞ`}h$anB!_77Q2 0tje, lSdv>-/t0mO{n;}R,39S/75Sxһiz- 8@=~`Fb؇%S zw0B(e>Yӵ6,vA]6!h5"O ՂM^Y4UfuRJ0k?(8Z=I [ dG4e~??jREC ѣKCPAqD5Q.HMs!-NRL&A" :X'eeZU6lG =׋c֊7iz`̊2KBrun7 )duUUdGD[͕{;]j]\$Υ7$.;{6`,Oh)ҐOtI.6 ʥ '%$RpJ7>4zVO\fIe}QKZu̧FMgAʱ50:Ot7\v8 n#ȳxCI`}IS[20 (75Q _5C HGTo,܋Md,k $V4(tUt6uEm$J6}Bө$tdilaZOEuvrǴ#RY?|Z u vA^5=3C%;Ta^_ ϰsa%}%<YCAE^l=@fՎ(J|F"7s}2}8jeS*ڱfR_f`^_8D7g9i!J>'Ӳ!4*!Hz+_E0{j7jU˗Q0D9d*- 6âE~YC:DxS7L ony]{O~/wj98 y?'zR Z2@|I9L:^#?V=먩t PH/QU#&{4kBwg?;CRS%1z'g5+F%̓È?t۴ $˃tJ/z/*}t(Y"M_9oNQiPUJ<[91 {GaFVRCxU C+j,ZgTXԆ!;WCU3lJhkf})Eif``;ô@pz|L.p˗ ʽd6gurEA[Ԫݗ=I$C#8Lonyw]fVu˦  jD;bFFĉ!ƒX'BtUC@7G:ѐb~=4aEۉ*%Hf*|k! bwS z{{} `VoA|VdyĊo<#؍0 _pP)= $]:c,"#7'Q]/ხ>rQF(.aPNwN^vh%cMz+e`M!-jOdC"k} # t< =p&5qSR~K{ >,ߥ!+y -l eD='DNܿ=<A. nT'ÛYy(;;$ \Jxn(a%AaXlBx\tC j>ʢTtG0s(ȃzF4*%4ePӅPԟ2 U52r*&S Fwnk_"gI3E˂brM"2b&hi[#!Tt IfBpxq*W%"D!Ă{ޯ'{tM*Decc^DZ7(i {_OT*PĔ y;g[|Q Y6OM0ʀh'YG ](|+z&*F /٪[P'il'OxXs2Ή7ʮ9jyM[jtЗlp:R#]y+豢cGg|TٔxBkahQ׺j'bc1ߋl %Å LŠ=^m!([  9ʩ;03&Q+QL62$fPXL}ޕ(^rr$Z(T0@oPs$QsrY>d(a'?P[|A˖+3V0Df%UHs] Ó]>b;ER(/ ?`3C ,r$YR5q873 z5KPC:Lui~^^x2'/ ma|Hl '.?QȦWk'g7eYW<ڿ4P-CZAQ^+nVw(.8 L}?|AL(kY3^z'/Z,m0:MWD-Z\GL?ȬkP̋N;ޓzlgB?~f0|(h4A|Ol3Khu2HX TgAI1؁电8 l~>M<'R\R~ >hʨ ذw@F\\D~'m')}kYxsi?8{ {vREEHwi#ב4sKOpI QFGā <&-Z$*12aG]YWX H,+&<ß^|`]4:Nx?kۅڭ/O4&Ի틙 .,T`;9@^bM2ZdT'̦ `poUP\jEroA`)e`_+ڽH\9H*j=#^]ǃ| zp7#SF-i1rK# I驧a/*HO;u,> ׆kg]T Żٕ!s?ynp[OxG;|TFÐhHw>h% ? BDPN6c?ں)Gҙ6;Bk% +&Y7"1b¿AφQBQM>۠FĎXV-e:y RV{MiBØHJQ :'6FEw#ȕ>-w]e `P`D UBRVNȪt`2jUYR%^>YpJoWF/]ƲJ!R46U}*v$f?76~B%",@҆)mC]>.:h$'srNU#ɔlX{ R*I&}BI'>zݫ9GbpsmLtrD~Dl\h*qĨ~ts DȐ$0,9;ыz"z$;l #>zD v׭ 6B;7KҋcܝP|GbkRE~n\&U }Wu Vf^nF QK\7-stEⰪcXEӪ2Sb!V_Y $t̻kbk)Av]hMG !Uj^P}{^KBẍ́9xv4u Kv&kf!(g5%Yꊒd 3dSX-f"%lvHz!X52#]'1&:psb_- _'eۄJtzauJ>j`]5(9x ymK$W8 z>ANǩb)^M+M9>Mvd >Ǣےg!.xdfG?e~.=htuYqԺ1Iߋ1 i=.j +jCG<Ykn|x %[*jk>YCPlj#Њډ!ěmV1pg *8a9MR[7~+du(vaKpߚ*rM|;tZ)Vx\},d/|Xb_9t"5*37ifN`r2O%zuay u\ Š0'JrnzBFa1PuKMp&80NxgrJM(|e4G65l'AM)p"uO WiD[~\ёʋh?;nްqU#9& &'_fv,W:|n 4Apd+y?X?q\.)q&ALKrpǒ}xF: u[u-7' Hj8fz/[4>7M T0$ȯ Qզ"w\3i 3e/o\਩? ,) y6X!h)>B//+18Q{mEvNN+\Q_ZM]ߨX}? M70tTr|/W&8R1&pq CH@b]<3,nzm5RBf vQiy^+1Qk.,XM([&UK@ X\L_ck@̕Xo Ѥ_ˆ}F: Bk&S}vh3h2Vq^zJֈ͈)Ӛc^7"%Qx-#Gnب8_2%Y8 {b𧻓OWdbW9ՠ|cgb@Q"Izkב M~ nn9tD5h~$SNܥM.]-?z14ot1׎z VWqP U9 D Tkruogָ2*I*ذq?}GZ dcN|=9J/6 FG:eRLLMBy[kt뫊0}ӔP:NL>{QK*EJf< #^m*kw`c}ޫе _ xGMOP'܂ZO=x;U">.*ڟ3RY%CFL)oo\#_](T 2yuV+~(lxG -[GG {j E| l߽k^9rDеS"=GMqtc_W9ppe(u\U6q=1>@n}]d C&DM}V7zpSA0 -i( On*j?X Tƾ0'f -ԃ,%3ݑp:_kee/Of0":*eˇ!|^zw]Zy-;..dGĐ{U3j Cm{+6 F"S$.qءoNFc( vVMG+`3vJ_=K,c^.롱UnA#9Pk,Rٮ/09+Gh[*/WK"b+eH#wuD4Zd1#FW̓{ ٲvDeKא;z nD~z?NJ" gHƗƂ+`wΜo4"Ed/ٍ|N"(qQ,LJյJɱ%UwUZwAsJY*ڊ:+[iB6& ^nH9z],]9dA8[o:B* &!m"9(_:/ #5m]41:W㬑=!vkaYo +kw[~=]oLDpMPd8sӼʍֿjJ"RT'SyU|e \xlcC% O#~Z2YtDxTP_]ՓuV4T v"2slw PҁOs@1Ϲ́Uՠ HQMuFm^F 0k{&KTQ 5Qz{϶\0saqmBX&7ӇGlRQ F@PZ Yjտ( |Ʃq4! @ LO[d%e}[~w!Hʈ pv^1SAQX ȄثaD[-rZ᪹W)Kg!1lX:b<!1?\kdGs!(%Xir% y:n`ԧt"Ř3QbyV= z~g` DTΈ+t|жtpK..Bw{j,hA(g ^li#E;vw\G𠿣A{dJ0AFz.끉_-0:V2u_EE h_*{Wsl/KIjN k.b: sһKRB_9/؟_ -ZM'r N' l(q'Ӄ]Ծ|c~Txb㼼C"<C,d9gK& oʘ#3e /;32:CLζν"(b d:Jc:Ͼ1.t~amQ U[岕َ"&;Іy ptvӨS95ghW TP{+!cPhͿ24NA/fHe>VǢ9V-$S ypt՞ R$Z!DB\qjg'ɦw&$#F\@e:q}N(a,3'3ZrYٜF> ډzyވ0Gdzf Xm PH _@W|98aC?TL {ίAFP{}e"!CsxnD&Yvhc kDy&u#Hq!e$R57G$my~=MȯH0=T9?tϚfʞԕr#7!oSƝ 廢g,EfudY$NWCWb 4Po[P>=z8Y{#0ב=MNy=+;iu-#,! ;u=fYA&121݆pmD?K:o{¢x{: H qa}wˁhʼnM 퍤մfURpFNo!c7h<%+$epxsx0* NttJoF|%Cx/j X1x=Ć-^ =ۨ(UP'-}\`CM!\ƢT "ku1Dkعzhm>#mÒ#?mjjNu!xD"q|@sM\ ]d}#gFŎ!>z2M: d*Bs{g[!D-~-KoQ/vO~+4p&bdWrvI]gZdY8{8_ MFqAS؇!nz5|]Tw {[UHK+qyNӾeilmt" )#@p<˦FnbN Ȣ 4ROe;^pf`zVגh}qbCDSkȗjs<*j`D)wҐª߶pv@ҁ!{H'3AF5ob̧x$ 7q^?G6YrvWUOW7ᤪ Iܧ4_PQR ݚ?^$ᄆRN9W_gZƬ-~V|n&Jф9O B<[ӕnRl"YmL9ӥ-tD41oyMjoW؊? C e^9^;3p&P !0L< tC":ʽkU=),c&#"  oˉ˻ߞIp-C ZhRBފQVa hl-j3mge{ܡZDhӣƹUFͥwSk', ߝCx?u- ZY(@JBeD2땓봲ƿLtH"`|@}ǒvk/>T+) >R|_4)᪲=nB1mN yO6$OSJד_?uZf/S~v1XvkNrG! {bRJAܽiiYyeD&Ӄ.*$y\2"aq,}rDC4s$WW'Yvjgl4bhDSc{$gw>Hl(/PMCT L 윇JLZY6@0tͩ(vN8i_E{0#)kx.$rg8yqR]# 4熚Vo)!|ZHҧ`ٵ,UNH@pk~ ΂T&,9;e?T8M@nZ/fKcjҾd!]28X3(h]: * ?m-5PJ}HЭ&|Rk7lǎyHk򹩣ƅoMdM,!c)%&Eśr>> bv-"KO1'E0@LH^⾦PDOJ΃'cuYfR Lm5Grb|129SSc-Wz"t},XWn%fH7@ΪL SAASVd[E_dseșuocاD:Hgq3r9bB"sHGo/cºLżubӫ {U/jDuG,xmimgjH]u:^2W<-U#I[ ad:JnsI f"9SkӺ(,ּSm ŕW9ˏ>/,:UEAܷتn*+0 DҚL4žSzy FRd:qn'>Jg~I6!̨U[g{GR`"(e R' %B[7-d߃[}xZΘNuRT?]K }W $FۨdAKr#Hx,L75W2Jǟ7㺜5ƍі9n kW6BޣaP{IC"iJ>=me9dmz9^N–-#8*cGY|*vᴐ^8,Ws%:v革Eӈc6Ƚ3r5Í ZE+}aiHQnF?DԽB x \L*q0.a"o %e%_؉)fѭK ADs " X3M0K:u 0Z7׶)z ?)VsZry2ωښp2y{ !I/ŰKZy#/" H^e2.ey`;y]j(? mxWucALֳL.r^/b/ jYEf(1#9P b,ϲ"y+}5) N8. O*;UPKcƾ InNBfCc ~P g?zF.L۹Nf«;'Ghwc^lNEQ."Ԍ2w(ײ+/YA'wR"Oؗw=xBɦ$kd|$=. uQב(K_h8a0j,c={uU#VzZUDG.P 5/xH<vlW*G! 9;A=0{ڲ.!m{PQ6Ed{#E5[/en)oRH kܒ1'oъ6EOqwRm|<99&Q#ū^E_1uNtɉJY̜\&{3r} oF.XlA7vM |VǷN#icٵ]}_H[/3Du[ٷ5SHx)Z ~Di.WaQ\J~  ~J_6{'4ŊKAJn뤫DՍ`ON%9 +z"89VWY}1Y6 K߄k=o,˵/hw0rOx4}^62p?d+ԡK+[,ԵC֒RQʎECbex~@iJۀ+)' ~  2(T`؂"x<kMƛIUpytxRD7kjՊX}nnf7cmVf~X{]q ͋I /5بb͇- O|CSك]Gk¶߱D';jIT'(Kլ ז5=ݒ{i(JG(T S%^6 @@,LPu{el+ kI f{A7, 5b)gPA3Irb_I?lWI, )`H^_|B1|+삞Z)-űPm,TSȸrg1I\M(3ܜ\Hc@dPXU9_\qA#_[,;C{눙Np-7D>oġ%. ־/s3-R(KA -2][JNFDr⯎Y9v˧Àb*T[:/󦀠'"`A% X;4eqL#ZMl- 6-LVgԹ!p*IU 0;$o к8ADWE{ғ LnzmyҴf&Ow)%|O3@]@Y)j{x)R%TGB83X$e]Ig:T3ϙGB_=2#kJAiLF$)l7~j)J= Sji(eZ;+ȻѫX^#O<}po|[CL0wt^nߕG.-ﴥy] 2a[c9)[q_@nC!3c6^پeF 9GFM/4Hhɮng3ikp- Z~ sjF0څ93*=igͩY߃w88:!eeOCj*dY # "0wy"z~u!է}fiK!>뺣o'ӼRfu*ݫ5k'%^ HF:7BV0m@x׌C967K^0麋΅t>b  (۝)&>f:MO) L)u4xH]2X%. aw^v @jKwl* ^eE^tYBrUXӗqu,7N:d :s͡ĴQ٩{ڋ`#gE U:@j؅@|bYQY&!׫e`-?zQb`Zڠjog(%аGeePyuDHUZPAߐ*n1 O!#NJXP&ؗXJT2Z] 3,|(Mҋ;qw)|8stC!3cn;tgm#Svچ6MU+^ Ap~O1V_&4Xe#mGb^0꿢ּe^n:䆡e!2skWinڇawcHUՋݺi:9ݷfg+})Z̛RJpAPۀɠIX&cia 5i3"\~B1Vlj̫}LW_u'<֜S6)r,}gCHY2y`- Vj=v@ۅx&#+KWDiVO~ 9'fv8_{Ho79nE0pNm^װ+zjdf4)ib`e !f[kN\r +뻂DBZ~wK!uADɑ+}Ͻfg#%UW2l@o;˝[g(M\!Fu<%lx$Az0tOQW0@[?et@AAD6J58al(50ڸl~n$csQ}Mv{ʹw<ǰ}m&3G=>* tRht4iM60p#btSqf4ש_2L;L+Ksdi-mĒM睩a!XDbvJv[[Qhȉ*j_ zsGoGPY(n3ީuvIN TO ;?J:qVO8孼]|\4)I_ FCɱrSFӕg`fW.nYQhEZL}pt jgDW"#Xl` %E$s%qP%@$ >8D>0[CF{5 vqF ͐'_hWHi9R3L yJh(F~+;@Zy\F_q`WBe铉=i/]=`LᔙFRNi;= <M$bGmppP HuM% eK? #i(w\jHJ;.NUCbBY9Jo=ml= m_w%UϥKzr +Vdr{"?H ziҭ (dwm Q\%{[yP'7*U~?EhcxVNom< o# WHIU#"SWxHlwU-|1cp<3JvwR8wb\#>9DqG^>w<#&-zf4vu;\i +7ʟχ+N5~=am_y;=*=a=+G ^^(mv gq*Ί⟓ڣ:[M}w֨eO:QDP zbPBnr2r nUto;A |5* lCO פN@׈653%z;bi\ycEʎI?Z5ɬL8uqRBx A*cˉo.x%Ew %nJ_F_Ā 1)sהE`zU}95=5ufnXy0$(վHiِtxAC<8#['iMŚ EƬoqG*3>ȒL73E%7X c%v~_*p t{Zٺ,ܞts~J15[" ȒuH418z KG%iqh*:/89j*&Itd^;.$Pl&QD| nm:Y$bBTURi}GaX^˷MԞ幐v5_($)W ~oT6up 6|{¶Q_MBtʃʦj. IF5!Z}H5Y)0INCJ஘@6IFW]"8]1v:dK[gP1v,-(҅eS\ 0nxp{i!r{NT'?w3 ` ]&cS9ʓ1׽! 4'"/0bݺ yyԦC Տtr[O פKUEY:xc㤽\5'iZאe'N ]cN~r+1hV!m,(NbJzՌan]te @Q|Qe93q5-Ko*BT-ZY2($pX w42|VGQ-OTeܦjqjwc D};;֓.Y# 4ȿK=03`-PI&"{@# *Es25K `'IL'/bytjjT9|`8;b7 Je {K畵hqC'MUt_Ȇ@?"P5jYHV wR 妭sˈ|Obe\v i'x'#6Ox*Yg 6MюG,QUS@HVyWESHْ}"Lo+DwmJ|NMK3O~h2^ ;- $=$+I?H{{)r EWw5tRr h9 ZI3ԹF$C$&}[HqBGS(nMJs 0fL'ԑaudrw1߾CK:  r~_;EPR`mpAVW\]ǹ?!.cпCo\ERa[69ZT$Gy ſd;hBN>Sa *v o'{\P5Xu7gHNȘXQ$X<窸fq0%@3͓?fE0LIZ=YY+ЋgENʉB\ 0 PEБ|CG Ad@ '.Xɮǭ1=Nznz;esJ#] [A'=#F]F$vwLkRٙx2Dz* 6č\^#CkUϫſKJai9/94T}iUώ ypY M4HZ!2䈌^?DN8آzQ6$!SpƊp Ԙɵj HBZbJDu^/D 2p<9s"_kKd'32CZ6$0N-tvy-*BE:I|aGA {Gey&d7|a0s ?Xhέ,pd_D҈* NXxљ <4axڰQ wdDPzCB#T>x^G)`Ȥ& >Kbt.սtsCW#$S#GG٦&]?}bta ru& Io|٦6b_Ss&';fkh㔝Mqgdvg}6su?w)Jql>5~Swx9)qR35.S;GW)IY<-_wW+`=UKbs |= T //nm@.S(M_Njn25/ U˥n_ ƒdw oY6)pPyȤ\&5Z&; \s}ۅ8?>壋9!h~ܬkz>'%" Am1Ө[*:w>j,R{5צ/ x2{MOon@-谩Lw4V5@9'ĩǚЊ:X$"$\ +L,f@.xt&?mD~-bvSP]-]3{zI4nRtBgeo$qxKUzi){ibVЅ RQLc+~, (.c;%DIOaBB~.oU2ͼ۟M.n\|>l)g6\(s`H:/+0>gprY>$U /0$.I@"O/kiȸl K?/l(oFE1`V,㢗/tTqKF2չɪ4d&ThC4pDk4› >ǖ>Ȉ9D]ו %*@&:~ 䅄s#v=ݗVor &rQ*XR…Y[ Iyr3K9% ȾnMՑzk',2{B4σ69IJiLXex= 8pg/ PB-z)Ъ(HkB`S8[l;tikFA>]V T}-[87SMծwfڷ/M4Z%a:EN::Fel%%CYL5uCx]]X .<^HLq\\31kꉒ:y&]//x-C?Wk3.2o+/;jJhw8RK!z{ SU8AYJʥ˴]Bf-5w[9^m,oj0E V@P95GDp_a/}\LࣣW@]8; e:5xOJQ/(k ˏUٕ(Tӌ!csҮionH[>H;(IQ23> #4s ؃ךPS(ѯjwY}t.úWl ){LӟZoe-1zF.z% rӗZ)s =nx)XzAyi20qm~'|c ?!GXM|sw#|Sn8i‘κ %oċtF#7%N$oEc^ DM&F%٦c\B-}V<[̔nP͈glF D6HĠ:1*R_5r`{ݵ*&J(UoOcOоWibtaq,#")rBd#syAPp_իN0z5}6mA䨘HIO}O Qe 03F|{8fz&XߥIr9Gݙpܼ!e[M"m@C{05@Z(.Z@-sl4:Lf>^c]”f8_~9)B2va@8NUti,H< Zy,Bi .9‚}La(rr kk< ξq/9N"rM&1X"ފ`H2D%5zoc4o|>6Ǣ̓f*+ߑTspQJHUY <i gq n,ak.X,LĎ}7Xd13A*M!o"U[ <,J3{kh/-3nY`hkBϘBPstol5jVw9(Pw2Wt#O?+ 3m;;:(SmfѠPx±~zZuJ)vJ} p 3 EHRiZ(XjҖStg1o~x|_4n(v鄔 aBW6J4mY?n9qþ`P6kT3 DR뺱$oHfs>87rӜe}4b?}Lvٻ fT'ȁJ<0.͉C"mSK#^$CƾWUq(kES++-:X 5dmGmpa!Dlz[0oM|_Zh%EטNGN$Q@c ʦ¨5p @lb2Qm }b?7S陵A MrU=AFޅ!.ZPG`l@ hȜ'̢Wr<N;b\ p 2 yt4p+8c\H<)MƖ zUI U2D?&X`GԬc'x>-Yd eYfe45RxLsjI9zuҐA'y}&Ίe0١ƺds VS42A~L! V~I&!F^Y Tn͹u2lN1A2l- B@d\d񈄲vC;v(#d,{_kBN5VJ, e#͗HO{yHku (0RLIC (ĵ_o;}V0QOb5ՁQWUH0Gzdc,,I*NJ0h eoyf,v_sGFc6 }TZ]7RzF i1vRTBNiȶMf\*Kq-p7q,ٱV%m`6Y[+؈?:.%utXij<\~ǩh;yH3dR 4 {ok,_Ԅ$Cq܊,E9¥ޘf Jd?C>󗰘%Ԑ!zXn3=%e-OjI ]mf'OHKT,Ss Yg{2ϸyL9w(2gS7 gOm2pJU4UPX {=45gݼ,g FoiC@Q?ƂH?P8e<+~?~z yIx 4,@TO\nVA.ɨ;5(z10 LpE15|#1c<FM \/'0$*uոK-՝f&zk\Lդ0Og Wh~~1u?l EiGr>Xs޻Tңk!EɝןU?7ېIk*g@IN{ s&lMR(O ^wɲ=h}N(HA!c<V,cl`QCLWU&/S%cM`:%QQb2߷Q(yZ˯2q2juqN [,&JÞ$ōR#l#(yυSY{Cn֫L˦l偿\)*Vt-@ gRǚ 3H@U>AC9r!QQO]skq⿥p w.IeWˢMIRr/ȉH?x0NqG}3҂@_)&`OMN;?k5~ onvhIfj(sO ץ9B|e{^N[0'M0 ;-%dQ6AuGP|]7H@u]]s B7ɘ0;P\kssv}Y21EHk2L+=2{^/à:“ǫ-9k ԐcZ0WOU`6>0[w12qr$o554)w{Ӳ@h]B֐NaVroiEIy5)FhnQQFg9/ʪHE^0^k} p.p~5{~.D9`n1G? /^=qyPYÖlY`z&J_+y_pw/juyYppdɌLIETgvy`)$boWaNQfDZrvxyaЋgOh&^97lLPa`El:Wߕ7Ёbia4enNG̈ic>\ Yn>ַ&6˥c+Dh6ۈpmw L jQ-sr,1{3#h$({OikO)JN 5q{4>#f8ل5 c˙؂ អzz^)&Z.3;72"\Ճ /׳N4$1+:qDr@e5+DR}&GtVD}6-~|FMJi~ k'L`K}2@֐9כ•ST$rJGtMtYwէwى?Ó|a! bU!L1ʪ3at;TTE B@΃!lLazx/?촑]>o*sRO,6Xkh/ o!Ԗ.Q;=N:a \g"C3loqݏ0S2$kBGFb6~M]ξ]f'oGő@ C_ќ&:?G|#$eX݇1G8ɞł>]>tᓣYܩ4x C.\5 &ja+ J˂ڑYk:LV)9RY~>8_dΖۍoZe/)ԥڨHCrٔ]u4F8>0U fV;!Qwř_!!hW6#\ϺpLl.!ܑ`3eth[*Mk'{#҅9i[c cA.m*'݉tuhDnLg(W ;Q/B5޳R$=rVq#|&UbPOT&Cjc#`iuLr"B9;^cJCG􇅱oIr2;gLWS Hcd:Z|__X;#Q+* FjpE$mO{,īu5bso G.5%z:INkps.Ӥ{_G0Hkװ?&4Gѹhq2X׈15>=%PB]] tMv.6\H#at5-:_SOHhF5 >EN,ߑ`e[2abˀQO6^- 7 qAi6^fUqY(4*]:'RvZσ aF$_aQ[vӅE~(ٯ̞ړA!6;olP0tz谀SG@sÆߎrvMA ^cbnF+'h r?ut=NunDmxJa)ERRo)ZZVOھu%R& Qy+ {?qXRq#Ţm爾$a6#uR Fc D<׆{DjY X')@6 mg B<ҷa㤘rOs:h#l}Ғ,~kZ)w "1Wj2Q;#v7RkV>g sCU&8hy5M|T}Z#?y%PlUK%tN1鮁Waf2\6y_|j. ");*ǘ?n,ݚ/A1,%!/ |)E| ðXg?aоLO;q $Un^] HMkxxPEU+)HVC|2'z& w3J+AiqS^RT3ƹYylTNQop4:j\oZP^ojH_t0Cw,Qi@DU,tu%PȐG8N^;0a4Zex.t$L]{\T4:ԥwSExT< AH I#jocoΉ:T>{o$lA]˅Mŗ^!@G`ZzH1K+P_dJ Ɉs$PmFMu+xz!.'6}DtH"wG~V Z&1 Y<">lwR-7*wH좄n%w%LA͎kG@Qma [5Vǁ{Hy !Lh-vK4r4LX:M+}8+Btd.dsݘ=nqQ(ĭtJJ;pK尃E*b{2L,Jzi+Q#2TʑGi<&$9@pX:BU{FJYegϻ-JuA*$w̘LPDk"!lm(JX=uS./j](5aE`v8~ĀvmaSN.*/ŔLBJ@aT9HٸލE\ojaM(|qkԁ(⡂0m80- @Wm3aSNT7t*KApa< l,N9Vg~dg(H` 3|Xz3q7\eG2)Be_'kcsOF+zaHr~]6˭/hC73U*}&(nC-J+8]rSVZ?CQy[c-*UĶo[[3*IS~t2\Ƣ10&B3o‡,żT uFOu*/1&?8OG3}!UYUnY[9S''>E@W-FbE\Q~]u&q{ wK)iK0ˤ-Aoϔ[JR|g:Bc!.zbl]<+Z $Dd3(J}I/K \`-FkHu]ɺv# O ZvN1˦Y3PnUolF k ,.y2iR]ɃS4l[cωZ8~9P,9pAf&n ]rr%Ҷef0#FMPbj 0j);cǏ!2VsTH2s( ;id%\Ln<JzM*L5e7!xYcT~=I@aܢcB@˘n̗'q??E47TP:&xUA`L(fhIW\B \U @GpRÜ#L t2=ۊ}\J7ovC1?'̶ ފ"h!%R" ^%ٔ ǫg +elWtYF g]@1OlV })9L-{[⾳ضZ+wxzmîٞZ)HP [$=w\eW 'nĘAB8t0([5I Ǟ'd<MbH! CTW Od:sa-, &HJP Zq<-z2rϺhl++ ZEyC%v9JP%hzv#i :e a[Sjݓ[BOB PPdz1 iJB)):o=>ཆ3^EDu}1I%Y#-LZ.gE5+y1b }bw7%XV uvJ8c,1xtKbF)Ե3yĬd<ݹhD5? "JoN"q(7% knq C~^=ZwcV;#RSֲ&D˅e*8fV>YHcDŽ4hq_;Q}(8b)a4hqA=hE` \t->TOGcm[V 4y݆EU攑:`+VX%g/-}^Fʔ$hi6WV7%نOmTw9ʑ͢X4)P/ہX4f.(802=4x|4n_T/,o0V ;y?h83~/+kt,sYe聇{g3;>yՎwbFɕYDxAFy6&>5VI6DRdy>"Q\~~P:&|H/stwZ!vL!mԛȕEl+Y%KyWߺ*Yj)V<n$`\vW(ud^%]RJ9ej~dJ^sیr3%^1k9 |r {r:p}:#FЙQե+PcOX(P;t悶01ԏCa:zVvmvB"RkF6TO$Q^ׇ t+Uahaz.Fۄ p-RtޫPi=9k'z<= ;( chh-Vl>>$ Ua7{_ a(3赡Vck34'k*,u|>fl6ǻ4 ܴa ĭ8O"J=XAՉ nꂳ*9:"M04|L2Cw'ojbʰq5f̩%u|Nљ9Pqv7:k]"#9uЄNQ۠[>?h`5Ҙv?])`Tgxg &6e%a3Pgdq@\ 7S>rqK&bt2 M ;թdҴ46t\͏+|s Ua~Ād Jɤa|z1/>%qDD695qHb&:Ty?^Gsx$"[rY:. @m8UfiGˁ4UY<[9>Fwz~WOK8 UlAN$1UԭSU›TrgҔfx]*.ʩF>ln]]sks}W~<.a"rb& x )afeHn. bT%1:yhcRBAl hW+2A^Cwֺ쐖d#x7iL>ˮw]T3I{a26ax mhoof) rH;_,ih/bI@U -)QYEm$"#SZy8[TAaz/r QwDٸ5 Z#bSN/_qZ8jL'aɑ͔q< L;ołR}d(7S*D`40:nbbٲY,oĨcy@%Y,aqU=$ـj{b&d Whϫb+q̾4JOV6p۠jP9<=]r69oOI!$sNkAr]tQ (=]ܔ(χO9*vIh'u앆,kyuѮCo]s1on$#W%Pa G\S9ݐ]*7e]]0 T!`t@1Է@k$wiC20TGPQnM\-g̑jM:j*Eیs=$UE .CkO~=h36Ҙ94PmS$96>+e G.ʖo#td׹:i23LӲ7.ҙL񫆽 (Rϼˍ`59;0O8kzިd`Q'"3J:q 'TSHG8Q'&.G$8/:4}nnt`( < :aD+$gلw421T;S&/vV?}exI D_ XekN4[ Ү.¯Uw=aG#tRT B;.bŠuy)tƧBx5W05j\b1xNX$6 ՇH _+,e*~)$o9H@aTz Y0Q^5F@*ib/=-u󫷖|KQR*Y/t4"sd%cu+J52QoS}*/Ǜ8Hs~mcG.Q @h=o-[)PY;=Q7 Vs_;=#m6x(M .d;a lDHkr}6,򃢾4N5C3#"mLa2ܖ,b1kAU YpvdW4D<Qp~z-v.aY'QX"v,e;,*Eַn#{q8vQ ny}ڀFx%m6@NQEyHʴvF\K3| f*~[TuT bS!RڷA#AgGfBv-'Pn'l/,O;#,SJ]@4D?GeL! +Grc3,f'wG!uiy̱.#9/H>zݢǶU?ʳC&(=MPk3{BYX#D*](S&:5d2`1A_6٩Gm> ?yyyN.,6-wd&)7LA4<ʏ H5Rui";O$S#a_E2x#f` jE$R`bP؁},VAL'z{1i'YdHaO֬3,:b c Dp9^Kz˧|ľ p.kzhtvt3l=5mKe]&J?4>QA~؞-`xg*4{cx:62+/l{L,85Hc &_t/m䉯$p|hȎ1VGz.Byi?m͓X;҃'.ve+ŪO<;x$9F 媘ԇ/mK $_Wt(FVHMtk]%OMf,)aSPt(!Co蛍Tl /_X+j$;([[xKk4"c6XC7I~orW5n&NݸX6pPÊlͲ \Lh/w18ԧ~ۿ4,%^jU.roJp)]8gL{$5"QE|pU"T LyNmgMPĤ>,ԩ~:DdfvU!Gg- \̦={YL$t;MH-WAxR#*Yp"/-DJ ICc]|}&g/p8 ^f>7#P]n1F%GLq,82QsPmoTG&]P'7Aˏ #PecGB@IZ@cu:tIV ~SV}:4;ogY!Wɶv X~y3{zaش8d]|9"pI;Jk/iB$: 1PHM0`nѭA؉k -_QFLTis Q@ PR~' }tB<^9piZq`.vҐ$Ҟ  yBrwb2 99F3lxqHQ'ZXi3ߡ5H`;|yTkaX k3y1cd.҇Ns1bGA 2[<%R'(ڒ yadJ͊oHd\6Pnr$]q(ILK.)!`ߖ'*p@8)=Nk5\?҈fzzQ骴n" l?x 2}NL9Z"C֨/R855R&4Ki%bRiBm?҆1Pn풥 9{x$â b w8,؄9$2eaIuHa-v1ʏ-$cJ'B46Ი>jm VpOPeMYo[k sRTiB+S !%?)ֵUpZT5uzRp5 b#dBșXqipw%SEt+q 9 [kQO4 ?o%b,}578c%Wb[?MD,} GvWKa@s]M jVc*.Ԟ0:YF"|\t(LrF0̪,*V#Ynnf}''GIL"cX"$35"K[lo٧w6$c?5B[B#8'lbΑW.XH'cP OCeW%xQIٵIB=inZ37GSϬ{[u+,sKӟ޽HϼK<]4h ǡmob1tcdzㅻ3-ò֞_g\h]oX>;NKo954J#1vZ\ov0KYMb,3\L[]Q䴄fxGN#L|XRRVwx!Q;> $GY8 X*R8/ǒ;v(ꮮ7*FQ%øa0^K.5&yC Wj&x=qNX2v51̈q44Ć;M猬˜D-ʟlJ*mOKu V, I%rYn<-`o F:PY:n`nA)uxVA ,\Q)^oEe <3kٷNϸrLa|K/G[ kJ;h1h$Yu{!B_]qLITч:gCU]e7fB"qq ME2;<Y~TyId)VL&ʠ)u}d` oC(h-Y'$2e"i!X&Ρ,3uA*DvkgCoV#۲]pDA#fȠxw .mI$H3 i`jԔ﫝QM7δhHBkA-aVޱԡc㺚#< [7 Fnȝ*{ʵPi]LgUocjT(zR@ډe( X; :Ɋo"ac3TcU=z"3"y*H،m|E3-&O8*kU.D2yPDz0)6A xZ(@6-Ya_'+TbUݲNX57 y pl!؎$p<R (6}~H|xٕqpprJddլ0ofB4~tB/ )-C`uO}˩n`Q1Lʹ]J#/ Tw@.9 vhL$c6:ęj%R[)<"lY0[dtN<:GKL;"R7ejY5OXiT| @GXNT{ݛ׆WOl^Rn^<5$sÀ3t 6-{;;GGv0jWhiD*~=J*h2e#LŠb`d !&~Bq:MQ(ªr(.Պ i<+8ZWMuUR -{3x:.B()A+ |p"Bq\|l}ẍ exvnҊ8*$H0mF|jT)cDT18˜ds&񋹡4 :][}}B@6WHeFD6ao 2 z>k]u5:P5x FD\: `=՜CyYJvE2OϠ+8_ wH+TmD#YAz[}Â8.,6[9=9m(̟ bVdSxY^KFTtN q`3~oܭ&o.;ȗ4MV3Nr^d~m~+Ɋ5KƝm2 Wv5u̵3o46i) {J+nE8raj:g&NOD[T,ٙ 3i`Koʠq8n>Gc+svAUlmN?SI.nax<6rCC} ηWaT`[&ٓ7/_H%7Їe6ŔVu,臋Bn+ bL::K)Td CPXY  (W$^Y| R ^m^L`КM@xAoHj+y\#k;fkO {Ng AS囑6?BΘ;9-,?54 e5$XpmAhbw[#V'6Ye֜[,1BFrU327E2 }e[Ԇb]Qhb$ᵻ3e2/B8ͷ& 9Gm5塘|ʮ-ֱP׭%55Mu!ECOi82fGeMog_'ho2_nM/2epl|Ǜp1{[!ӏ7х 20ΠOuo.3iO *Q@!bٴm"g*y6f} 63QY( &P80uZpBXLK1 QiAl%*#{LՇ@>uJdbUپd(}%$ЋEvO[ 46x"?7 'L7IO ^5fyS"4*lw',wUc-a3)C$5N -('4fER"bqAo'<ˠU3#u5mғODW*{&dzty}2|d" h>9}Q5FC5dԏxRVyU9ݳ@TIRX-sWPSFL@6b-9Gol'`rb 50.Ww} M]!5ŷbg&0$Ű]gt/hxov ;Og jʧd ^uf&PRJr{F pt)K\0}7~q&q'ywHIu͍ "5Үх  ?z(iPDbtU^쥗5!Vj3|xw(;nl]'JZR=`Vun1 _ IeԹ%OvPz<ŖՌ OL,> c86:"n}Raz!7<.v]&cngC[:g[[F/#9QT8e0cZb!)?? p A)?L291! u'%Xذu8)]ɝ&<ij}bOXuMԲO]bv@EV{QJ3Ii2Zs_$[(YLƨsqT%gX9 T*玱#/葁Tn/ǘ HSYukP6q&Mvm-QϿ˕قNm/h&{o]C״Am XM}m7*92,ٸ:8.piTkQPmýaI8+(HGD|p *TiQYz7,6\~imTж0\(~̃<WIJƎ:#b'rwxn["h{gOعI qnY`sbH,.C#8ĉhғ0sU>wZ亱˛|ϰpQʹɐ+,`YŊs DmUI+ȌX L5BT`.PIr%}qpORVP|Y<xƥ }fy_!PQtW}7 vyJ !`!,%Z L[W`0`6B#{ 9_V*vj̏n4G'1MC#f|`dU_mQv|E1#AV87$iv9fyb6F1D趐1^>0)4)Ӯ%X ?Y`:FmR"ӽi GTGh L;+8dW,5Gl~?f vC*ŠEj8 HI>Smx!Rmx6=\u;+ĕ?RGީjzVRU`0<'$ˎ↭!R鋂PO 0biz|>;0}UpJao{u_"V@R};n/$#s<βϹ`{ LgU+:P5>2! "f &Vy7yWa{Xr)? p<l|of`[[ H} h%Qrvǭz! 騴_:1ƬrP'FYfvj"bGw_jsbQ1v#w RfDf iܷqbi}{l$z#~X.>LS l)_WJ(`e-JI %~hJ KQ\I_Բrܠs!|0A-WHO~ٕNb }r|Q7Y?y>,3z'nF}%.N!GO5(.Kh虚`jnԢqGa{՟8O$%ߣgXsdiDWCYqE#)eߵKf6`n kU-ehؓ$`pײ"L)2pȩԅ"w]t~NN%[*cE>dIҲljUp^n\G酢$ʿ%oә/S loƳDvrWV\ ufE@2<<|E}2Bno>iӒ >wvx}R3D0/7U9kd jf!*2'ns?%[G# faPSS֏j/uP\=Wovr"m,l]8=`}aS#8/=5$D7oӌ~GZIhxp;Sqq^l+3q ¾kko\+A?~u-l-N=t)vNwM!ٲ4{&žT2wJ _q %.;yG2sQ94>/LG7bn`|zو|[r/N=l9B?M_ZQ6zm'5[h%%D)IHku>z^KcD<#dXdkd#`[x&8҉$[6udv HQn- jH02_IALAWHe3ϵ(y}mŝWdW'HQyi1-(i:08ˆ3,;8!K*v#ۅSّ7q9d5uLQr#R̓bIL"-W'4i-IBRƽ!FzmBtf Kܟ&S:pΘ1{ɋ Nkڶ5au5UGi ŖP-e/"^Pf| q:~@>oHnƴ]^5l'oO}DQ'x] 44w ۍpS< Xص,@5#=i7)<#. d S3ue(Qf ~Td̜#%)'S2&832fI~~:'7_ :5x|HN.@`uZ pQiJFܔpr>ЕOwG L֞C2xgW٭8mD&Gw60(z5݄?J= (=$ bQSJ! fjQ_qh <^u[6Ad=V ^8!]ϟd|M4;śE0*zc۾_{)5x,)D7zF'tbD|Lj#LДAZI泳\mfyn <_j Ӏ V. . ݧx`& N ?c .}dR^SN@]exK w ^& H,Fj,TOcPeѭ`!fkH}H.kֽdN]1O0VlB3&q]>|+>4R$ bYv zYhh%*nt; eb0ɓ)CH|E+62m* ,iR'ֆG=UcjUVBN >[_70'=iz:UR6ˮ^SJK6p?,.`vԈr*0Q5C0/V"?xQVb\N}t*dukq<\ )3lyYf ƅH(yOxdVNşL$,QBne&_ H@F[#w+Ob{\@3g:F"Ȩ[kR1 ;X.F"D\򙵲/\=F!ٓ+/.m27FS2vԄޙH bO=lDhcz{T~o׸y?.ibꝀ0Bf< axY0gh#-<*k9f"Pb|}CW?>sÝZFsbL'zrU.[d<,6ڕ;"Cs(t,~9YeDl@8S3V ܍NdU| #%1?k?ԁdb~e [I -]PxX=>l_&#rJ)?kQ˥(L4Y4D\YCrݵ4>a'Z.J8C~ F icDb,O\JJL(f3Dz} \\s=RA:B3x{]j ѵְ^ݪg{ Ͻ =90 {<\tpC2u1X”\qƫsV"ֽAuwp]G"yOk[m' ZFmٞN{'*`Kh2.ྔ/fCLjBkuH鱨wo:wjRh}]_B7Gwk?,!#L #U说ZOZрG;xheGd0H:+FIbd]=F+qjg{?ӱBFe4ܱ?3)i5S艓³e3z8g{ozTNw*xJ_v%кC\Py|715H#87S1(_ CˋZaG0wEWkl uF_E*W=5r֬eg.q_CNbeok\""풢>p̺XCg~}Pg^kS㬞ݶ4q:_!=NJ̧EN(|܎o !&/M@ 1fGx4NhB݈|9~F{7:#9ϨƔdT֥j܈UucVRuU~5ť*#!?ЀGB Uq[yNT 9~p5l}H9X }E/3A %!M/~ݫD TW  [֭Nll^RczJ$wg7(9%l !Ō͙נVytI\&I3USEYǩ!]הy_]$8pBTaapcN?SjXNúyR a!Ք)wH;mC}%<"W2,C7kC a{U$e ze{r& hKίG6G׈Pz @ I`RDmOqoibzobC.FxI̽11h $iI>F_뮓q. ǘ uyy&- S^?Qf6YM"ݛWr څ ¥Y9G;Hۋmt*p1"6t/8[347mՊMa.ufLhH91r)`. ;vQ.C*_-IUkkAַdV?.|.uav wT4E=f$˾+O޼^D"˴VnCHlqTmk~Y#6 ^Y1;Z*!BzmGV؋=`;+#l^'X H/@X "RG%|ђ/O#썾NŹjnB=[t]Dm<'K;gRO/uԔ&%g|AӖGIGm/$O@`ۘ'n+ *@Og1ĝ]1;JG ~EJ2NÒ۠Q?^<|3h~-.Ҕ$%}\6n"]+=4uYz8Es1Fk߯HS UwNHGUn֣k?5%# < fIWtGo6~UGN''lߤQa2WwWBwQ`!ҜZv3ΨM,rpe^>4:іIfSZ"Q ! *XK>ySϑsLI2fhr>e巻BzA:xGT׊4b2E^#]ε5g rs+)؊uA]G*yL{y{Wx uºn:++LIa"Q$&c!^=X|3؆9U0 |)Hᕸd,0sLe ܰ3DPY] ) *  Z۟'#ͨe{BmfgH|s4oQ\z)$iV]kc=&4TgwvoWp)<6ȅq(,s\[s Ѽ@EV9 rѓU~}nsSФ{;PeyV ypv- Q%|ڬЯbQ"|J-vccZdיgcL#&h-[w}ĦO!%\$}IM^-ž!yf}ި' R"f ѿdj(nb=7ʩkâg5[/ O!dD Ըp@Lg 0U B CC (x[~Cù@Լ7G\̱!HMw2$D˳h3 >܍jqc8ϕQgZ楣#Pf=lUG@W7J4#܋d=;,!ܥ@Ѯ+E??xm*/٭Yoť ޲YgD{3jO)"sBl0]TϷ. UTYh=EETu%_%\uYE!4#DkGG~Ⱉ/qA}.L8Zm/$]}D 1#ow5Ze'7 r< Ȧo;~a7 Q!.a BRg&+w1$KʐWAcsIW\ gSܗ=V,Q040A9 #hdz@ sW#o*fa> V$y&[Hg1 <Q<<V 3n4 'v,g_+ʎNTcTr lA1.󈳹 j +ggcA 3+#IV8N L6 \ D28-jf&^ȮnJ9* w/NqC<^y[sʸYgmVGnHyJ\hZ [p51-ΟzonqjUoӫX{: R/ ̝q^.S7JogN܎T\"!cjȫ{{clP7HHl1N+^_K[6dHŹَ]֫U:?b7 ȮJhA,zEi]%W׫Q(We"(s831H}G $sۓ./N @L@xJ t|DL$LWgNDQ[ -e%k+/Lr2gF#_2-!菏Nz|˟.ɄЈ(XPj~+NzɂE}$g#?dJ/p&#KvMIؾ>vKB`/l iBgx1LeՂO;(܅+!?^u:>AxގtOCv56>]9BV9g4sJmP#!:!^ +k8hN.C׹yϓ16'CsId)ȤhUwn! w*JҺn0͵84aa_@pESDO=JwLL+Yqk*ǻ#p;%()™2>aP ֒]XqⲜ I!l,ڷ'GT#E$h:3Wů% X}A5xkYt`sY-O_Lu>DZ[%(x=VMzN#iv"xڄf <,`ž+N5ZWj) 90Tձh$fQ(l! p҈ijlfkwBZ ռ̗= éH&c鷡g2-ψ(_Cĝ\ȍp*S/6o $Fc aѵD]0'sMA9 *vC ;\S(sNě1_s/ u8M!\n;B Y') O.ւm crHTR"}_qr%A^?N",X4rj[ˆaFQebEf3x(z*,$_#Y@Lg8$;'j4׬,l)_0G}A~ .]8~S?|iTq.a[T ~d~lce#xL$KK~ W_TyutS{i m:tB:9#bTE6t )[6oq:/ å(Kua ȅ5;в?Йm++UQ|uUFX%4'hHQ@WZ o4QDo[i((r%^YnNGdc ?MR4ܙb+i0VI _&Mf,:Ƽ.:f22ȶ.03X6 ĤQ2+( l5tlvJ>^ZڱsU>ܑ_TDwX+?h;NVP™.) b ZsJ]cRs V߳KsűF[ $iUG4-m$2_!6~31d1bvLXV˨tƂt>Fa8ҫ7v}Ji DGI0;UU{֝aNBEFnC_+O! ejdIAaQU-Ǔ%gP\xNB}3Q[i(iWĦ}'M擋r1nfVGQ5Esep{̷EUoX\u=ad_R5;Td,1f GRW+9Zl&xe~tK ڤ{rp؜4^.R`p: 9o~ xG我a:sQ|'DeJ]h1gh8&׬ggZRvE(fT&-?"!eLdEܨv)z͢ohvGjTaYdR;d9&NҬhaֽ{ jNsMF]'OqU8n  C;,b{Xsu$uN?WCBXUoT ab}q/\p'}L JSA`ju7љ=X>neI_^k K %<v!^,…R `lЛ8k~[lH[MXOL^؍^/Rw"Jn3*2# :bxig75p=5 yz#'[>gWߏdU xp?$ 쿞i0!. I; I81*prk6 K JRѡ3U935+q7G='*8XH5!Ͽe.T/Ӛs~ g[[<9ka]%ť|Ȅ@8~aRiC%to%L y s9g)㯷|>,a? (*S5I?^L`:Urc0`i4O}zH݈d._<l#v_ xn-4d7* oߧG%4^aF˔BFcBjëE #*AP:*Pj?۩V~HKC{ ]\:n# tS^z*Gu;xN03m }Be ,/yKet1H=9'@rhlNި#cVO.R`&=Oa+:Kb]FѠd;M"ƶ snǦ=n%9S Yn@{wd"_AVUһeLͤDV*~ZW06jЂ *k{Ȥ}T"2_F]d NI/d}}G!gB卒Js:fq?5n)b q4EJtxz4RR{ʔ^16\m,j 2Mx }k5ƨ>S}!Nc:S,cRv`ygqN*Y0<Uc0zH KrFH2ꄕv2AA0A3 zBqƁʤ~oB9a\,隞 MOKH|,ewwgO`1o?y1[ϫ( }y«u WiIe]5?L.՞,|QAlNajjX> 8T12T\!̿盫`EgNQ+K]jJ"Cvm&f4GƤᮄBfyᴿ86;sHG(,<ɵYߤBy#?<[J,Sz4i2%:2cX 6Z"k)za=O-n`#XIGs&(IeƀKOrkKOWgRQPb#l@2EDF<;1&܅J1Ç S0\kxM+W*E"Q4~p)(lHc_H3!;CEh'^ᠶq})LfA:VÓov>E>W`|m9.jQlSsbA碮Q?ˈ0 }nGjE(pһFߺX.ӿ(bE|MXGO>m Ǝ4WtS=mBl))Us.P#\ls&h7ip_xh_kd&KSY>xl5 A߿c9@c>nFDuch1576a$7N)ܢ\%=obocn}\{D';ӌ~م3s*&puywYx\[?#kRS<,tR[SMf_f]_vy8;WCD]xkݘs5,ɑV J6ÎTj͏^4aoV[ߤ2䫑ƯGtN2T"hg'C~\6ѿ'sZǛRH6F)r67ZVZʃ3,k^27Yh1EG΋l)"OH 5Z D1QcTg=ARTkD^n֕A,EW8rڵpʞ!Zʱ9.^[L%R|.fz98%F^:r` ~m9 5yePΔOQő"pȊ.,@|if3FBxR]XN+G9M޿jdn#?2eqZ'pͻ${j ^1Cd yDju_;Ġ@I CJ+Ywҷ0CaߎB}:{G3`ZA1@K0Q}-Ǐ=z;kb0@[t :uD5Dj~)w^UͪƢV gk_z<- XNX3r{Wh4|Q$azDH9EXrDWR%P2ӯ{s3[ʌtb~rL2ņBe ߗI."oMieG[9KޅU|Ҍ.7pZhym¸JW(R wchg2{e"[@+$ kEjLrzQjD<%b țyjyȅcYV+ش8 p99du)ɽ)^x* F`]Q{2\Mu UqB2eQEbM/۔;^-dJPGSn"eM1%؋uߤ"%hT2M}ڐǥ_G"c+~T@9 0UILa *@͠/fּOY(%RÊ>x&QS,zu):F&<`B"UT{hC+}q_*c݇zS  Q7,^3CEfh7\(%uFL96A"#׍h+ium^Pn'.(2`vnD ԗǐA +u9oHmƬ"$%юH!x{F 4q6D|O0O=H0ؼ@S`{@d1#jSQdc:괋 dU70=k+%<#pB !pu >5Cp5 ќd/kWl6[ӳgXa?s"!J>JJg Ah('937LmLJWl=nqbt1m!W؍2RDdSrf=׸.1%?C8AUVV櫊$Ѫ2{Y$Bs3lA~m7A.eK`  Nw.>7I=J Xh=;e}+-%W-__s8/7 )Qa"*qXȪQ/.0kKK`3J)b'dKQ}N #3:aq 4ᴡ۴Pr޸PE;CF*#NE{lqz 8no<\Wze9,-aշl;D>U}Wc2\z[~<&I9U -?yD9/EZvI,a,ޝT JN!ۮgu6M+m%p4Mh'kdnԐRbqr9Vӽp֬"-0?n5ePK*̯Ǣ@X "QN|Q,-siӹQCń?R뽿e|Ʃ_R7혚oz:qG{R>XJE q.ihtw$b-,wMELz0w>YTSʆ bNw >UoKQ~4OC"0jZY<|ǯ f_([4M;4Y~G>hd?<"lu(iZ@2c®/8j?f ȭ"F8m|"&+==o4@ J`dlq U*IUTQL nb`\*U2e߄^#k@|dp`rFogx޺G'o+m}~±&x2\~Ħ%蟷ВGPϕi$ۼ''LKzgBhtũ~,l1Gc H#cYU^&iXp  Э{ԥQK3dd "(3 ;̣`_]HqSEUۜ[A oz*CK35BY2?sKc)w_$xG9n*K8aYV(7{bpk\e_I '"0T3G'|6RG3$]Bx{%3;7؏6J$:V=0>I!͊W<-$clm$.gpk}p\-ӔG@2+\`!?PekRTLط70bS= ߝI?8:/=X@"P iW1ϭ$0wU ʹ+;!Ȁ>1vxVсhuk=6o w1&Y猵EotUlzh.7&Y$W/cyDXYDuFI0>lYcک hwKj9" ߭8 zoutJhtE߫=c[kГWksM ߙnͼ=&(zTLEեy? @aR6w^=Z؊V/ygp};MR0B6W>u Ihܚ(Sg{7%sZtR) :FH\p lyw.7#dcOQ:1Y[b-Tpx\zz"C{ Ԃ/Kh-h(UkۂFg(<4V t6Yo|sX\܍!vOoѝ@ k]hIN$d :[FE'`:0CED€G֬5,Hm]o,zh^f^!>oEtЙKg3'TdZVOդ“)&u |;s+,c?\q*<!"e)I/SoߌeV|/Z9d) $/nv|(<5٪M49 pwp={`Hyk*QՊ4 #ViXwK [\8y*WT~:kKQj~Hq>3C`3 mcsA%Ҋq6va5瘭 12L]?5OAEXEIw a." Py{/Г=V|% U/jLOhU$ !{ .BPd.$%AM :e]?#ft͌X[ĈuĞ `{;dL2gZ!V z,qTCW[6{to3p&4 վ t&zX#U:䜥3zsִq!JCxnCoMĕͫLB DG*ȶ7H.'Ӛ w^x٩Z<CgBxg󳾫RE7V>@H@-B>m&;iw`O{8;1Q\ܨ zpXy+wr9bVWz bS qN>"pNlSK7mI*tvK쵚LUc6H[jf_]\VC1Ls+t/L8BR+u\ bw^IBS*O9@1WNYSf6#Pisxsm^P:0?QZ\.! )rzqSire1"L% Ru]2E%.o<5>}$H5[?@ƅr}? fdN!۹}U8O@aԒO=?!1f'۸&]%QD]X_^N CBȤ^'E< P1TB)-⠑]sJչ4ycTuֽ~( =q dfsU&‡ݺ 3[)id̨}[oZK19.>;7$䯨u*@˻|Aq-WC+fuE(o#'a<Ņq]Z3rI 66(D!9&o4A]dɋk-OyBN(aÑ$qDk|SOAHESH It>$ f;7:Rco/@1*Nkr.e '=O>|uudWzwͨwTv|E\x^&я? 3nCRPR^ uz`PE[Nw3:JB0[sIaϞorS_(3daP6O@9/x¼,rpRT<㸊7Uup3+AުB-*& b8iWPie+xYQwM"Xs[bJځaTk#a-Z՚ c¥3t j6CtoWJP_?fF!uhaaQT^Tu:킕qbe _k)_ kX${gzcC>L|n@SZpOM‚~{dHTTw^léQ.ct3qZyY‰~m_'hK1cK1jL7ľy`4EF\wG4̛[we8v> GٴҴT>EH@Dža1 !@5LvejX-H9Ih6(ݭOYW2ttTL Xи&:oLzUnDYfT+p:DXïj%kykZ6gOAŹ_TM0[qT|FV1]m3W{rC"}QNʝ +jb6| iPϊ=rӎ+Wڔ"aCXVǶ>ZVL.$gOϫ6R|SpjQXeep}ѡ֥w4SYOރ|8Ppn.c! Ƅb"Ǟ ^:V،zrKJgH"/{֯`I-@ .E7X7a Av#k%XmM8g.@iRY7d*t}tcHӘsJUwJL"HYqu ] ,&g4и i`alQTCն -ƹ|R<|%+WК_~%͘hE7SMjœ@a0Y\}ء/b-KkbOpI SS}@pÏz<^W9=\VVXp Czrcd"ku@hX@%v":yHxԘ0Nz>C:ػasc{+zmLլS2Ү,-ez0d1Y u>&B3ޯPx;??/`F~#&3?s3XrpA6`_ˌEOslS)p -rtOG4&FOld o5~;@պsa)N{FbMDa7L?PmbӺvH`ew< 5r{S 5 y=z3ЩʵܤPU?@h;cqV16Vq*}Z׊ /q ks"CnVxsF|b SF[.PVQF*)޲?Dhz';pm3 4HlQl/ka`ϋM*b&7-m w[,*Kߎ50B1:!hgd @&:stułgޤOQW2hs4']ӯ`(&V 7.Dk4G{^7 x#CF"fMRX%2 PJ4({v qe.&qYt ⏗څ-0I21u܁TJwei%dЂghm_$4!u-j k%讻ś7%d@]1؝sxeI|5bp-,58_͟y+MƬ.;l9y%1k3hM!Ϲ[1.ܟYzMD$کEjryՂ|QQOjJޑ~k2ܜ˓ejI^ɩQ-Veo. })* #ȋ\ua2!xBfءrP|{쓢o&J脿!9+g!tLDX7>7Gŗn/DXV/|Aʗɔ twx QתuU5#d5ur\hLa 8ԟ%O%K ? a !-9B i!u萕sU/oQ ZQۖ0O mӺ"Xk?FJԏ?%Kΐ$.mF2K绫*:`Ԧ'E,bJi1q 'oBZ5+bt;2e]#+p,O8rO`.N<oz_+X\2H?`Z.kC.12⧳5wȻzW"I'{53kMc+׆I9.\זe2 #(May"v>D@<0+zg kzR@ k'&;6&nL3a۳M(8Iw-݌Qң&K~$$Pyf B1k9038 !hKiJ %'*Z ,}DfXcσd ^ӊ:mwZ!t*0ґ1#Oӵ?.xW/2[b$Uc.,DI οgBɃRZ&~0/jEPBEQDIr7 ttGe220b h]W1@~m@P8)=1򅻅owo;eF 3u L|{V)5 ǩUE{x݊֓1tz03$ !<,L*L]9|2VfndoL` ԢU7Y?_ߠ_tcĈe@fML(@LYJ.CM¯AKmĥ(wNg !g>8Z͸4H\M!@:Kbf}1&E٪\Yc1TU ..<> [1<'xrl8q!J=DEX"ihPYLGsnؒؔ}?-j--R(頳)p H5ɚ!v#87! RՓgI#onB%9 hZ_&\2kHmrv㾔T ֦C$h֭"R*4,͝JJj#+L _֤ p |x/4$Cm͓jYӭǿߊ8B]#[@+I3w毊KBB'-([!|(@XrHU* q&ʏxou_! 4eC؞A੉F|{9Pd$ߤzMǬD}FÜT …zbw r C%gyƖUq0:d dbf&v@}A;#W@RKuef9D%AﲗIc=,O0U SWGTlo˶|l csO{F ;~~?PVWh-2N7FʂvSE.g9 bv(J&ѥmOⴰb2L8xd`Q)J*nhC1bX2FSC:_#++bv>(FjxhDR[wj"zL gw|O\jj&>&Ją0[_bfy \Qnuqwf@X\ CM曘M?90ta4/ +8*x ~T^+Ǿ]Y8 P4ZHlTCqv7>$\RL/LdRz}isYGb/x|I&v$t >@ t3$ UPv_u.RS*bI)48pʶUXEestMOB룶r·@\M]wr't0j'$X5}zxԉ%V9HJ[ &&M"9rOFGdjkC,CzDsR} )!9~!N q&bo8%׷Nebyu"%峿ټuwhʍ.AuS:,jaD/&Č}ly>FGpy:vt LPu@ 9y75.F6b#NjQ#itι8-t+T]Vg~x[yF6WB-oSZ:m C!Ҝnﯬ"d` %l))r:ai]:J8:gW08C${H E>vkRsx}_쳷ɂ%dF`Mb-ԛ\M턅laR ]MQ2 T ]uoq(lAM{ݛj줺'֙@Xsz[)E(|?t9%eyIY`V1hR)dNwhQ)&ΒB~I=)QՈ$欋5RQDM!dq~Y,cH Dr##.eE2 0 ڣr&xLm},>vaT2<$>'si/yI)"9 # #Y}t8~TT,XX(oq@0+'~',`]M;bMJ#Xxjj6&7I>$BҶ72µZmUJ궷L%Ӧ ~b.1;<| _]l?)+%(R:'.`@ZF[KxjcD!N^H%m:u" WZಛӥB#m]dr{PgÞ6C+2LTɈhBRQRҕ z)Z_ ku,8\(5YL -}WsQ93}MCb%~˵cyceҞ#*N9zY3yt >qj5a;庢/bjhMKN{9y` (UFn "VQTI0U2;ΤJmÅ?W? ]ye1Ij>P>tV3~*&I7(sF{Rޢl)Y?ȯ:=!Om0eMĿ^eV#}7$Z`uv d.Us} ORZ8"gJhEώ@Ϫ @B#c9 j[ݬ[oq]e:Yrsp0A[ZnqxU'0c^<|w=.VI'nI@~95JrAM7;i>xDE[п̵\S9 v7rx ڱ!w,kW uiGJj?c&|!j6ITqMw?JG *Wg..*&+&|U?d]ͮp w%!O[<h'4LL>ƴmMistg|\wZ?O,gM@vÇ1>vf 1wZ6hp~FYl- aJlRv~VFw,hUW*̵T3'lI^CnHFk)! KwUX{{݊a^NI9_>;],;꠼a+툆l CWhڔ 1<~˄2NVNwB9!V=}J:\+|Y5 _NpO\w]d[`aVSwRNFGgpH/D*+W;u/\,g ۚDlDE?9NǤ7П YL+r?s}@^K- )Vt8FZm(C3 X4ToG4Jz4[]U?IKheDl@@Ez>cI°WO_[-H5(#%-EJbH_#)Ӌi(C968̹ %e;Uզ-eg('少A7GT-p`vmw} 1ȝ=1m+~$qdآBhNwt:C)8!ws?tMs>%kXPCH- 53evoj8^[sҡ&4DH,@= fdlVAᛐYtF'VLN I :%9mU{\ ?>L(@퉀cTKi2_D]8|j"#Rs臱m e?HdB]ڨOB6Ml i+jÌ;SK?yH(L^blj:&obOzj^B@}R.~byHaY]S%%fŸzSp$^v=2sF7,$=mޏw# IA"q~* 8pB.Lvv);Y]6VE:1*Ӣ4:h}>mkłX9M!ϻ7gH %8.:h= 1C^Kmɢ#Ԟ'*nB\ilUTZ bB)s! p&C]xW$seiȂs(U"tݻbc6 4ssCN/%hCz$)ܺfُ j T9EFt>'2ĥl1VJE6#`BϞ&pP ݹ>e3+y%[keS,W $iX6WݯnU{`e"k|vy-F1%(LJ#Ѝo@8Az^8P} `hR| 44'o TRIâS{߂^-J/rm g ؇5!-Xʽ6%Îy'9=$0G}ࣹE .ң~ťC*iUi!oV&B vhOf!kSepT4: "U`&0(Bu\j>}ޥ_c7tA&K~ERJEKDFN9q>'dFSbe˲]"˴`+I1:2XK.ݤ:#fa*!N[s$lm Xڈo)`i9"4`.ׯ1s) HN \pхҚ'ëB?%oJЩ{ $dYIVTRq˜D Rk [FRfpHYJ :]7fNKY/6.@]G3þز˙0Ma ɤk-wlEV EA_BV]P3lЗ/fvHƚ'>HSQʫO.N 'CƾL+G޺cJyJ5s5F`3V\s *:` 1'{;PHaeFT,!L8UɊhb5LgI8Fѽx魯69*b>d̀<9?\pi8=vJ>KT..&5ߌhӥ# Ò񑜧c+ĨaٝrxȸJ8dCAʽPкWZT91rNzKGUUY^E@)<~)ûpԣ#nRS5awPį (AVw-vN[Wʹ"6hZ W }!m ]]O}?Rbˠ2|c6sf7bDvV dCݖ l12p-Um{ 4`ڡ@H M-sRfL"<910y94/ >w2:Hjn$,R+j`#c:ZGĤ*F&95lG>z{!ګue]ֺvPpdz@ @M ޅ ̐j$j9RCyw猣#Twա !R'r9L9q[Ϥ3Iz\x^j'Ʃ(%eL>]-#mt]D#D1 Vd@@2`B҄Whdx>_4Y=Exx٘;*hF.?}cT5,5h+?敿)$'zW熁b&AW)vEvvBd(ȧIaײ+wdDi Ar|Y-W?u*-U۶N)R"FcBLer t=6aZ^k%?3){F]Fe/ XaX^2׀x߽֌C6ƌ%?"FL/8щVj:yp #s -$[4裬_xTk{z$٥܏,ٹ#T} >)oxB~}hZRR^rM8T'VX+zD} l\4`qcф}i~Χq& 2Dq}:7dVRʀpx")WWZ/FJ2G3Dax$GEWn#u: 8QS=b[\Ч؊ӟTlL1p=8aM'+׉r2qi(®Kֱjb.Vl^ap7G% 6 ?R=^s{[XϚ=^@jTlz\-ھ[jP2uθ@Q'aLgLځeF>&)Rb-y to$Ag@_dAƲS h_|dtgww}- 5es~x\L[ Fu1L-0 @|QP~>M,3#ٞ(,{ L'gE`{ Б-,KEkl/Ÿ":bjf1S" 9koRnihiΐH`ӓ@|,뿳'~K*bV'ֳaں"؄)4n6Jm3RP.:0=jL$Ϡym5@A+Nc ;畲˭"e1мC$2 :&DξN9{ k|K_2aϺ|[ }u))MSrk]A 0ofIڶ6'tx t_"\6E#v 0d2,bOE&SDyMyըz()OݵʫWCWWS)OlZM{MS5vQ&C)<Οd+Ӿ\Ӹ4I.ٹ~0F ôƪ+sxM&K#U/iI}k5' v- -*IltU avt_xωQ1/ywo]k;|V՚L:W.T1?(# = 5c>(;X%_ $ZtQ2{ܿ~ mnξF8noMl#`|ő7%?D$?XyϳC_#8עk|ڱbbķؼ`僎Pfz7#L^S&b]uwHRnMǷI9K#{CVTvpt$c.\ZR5 1y_٤^ e35_Qzlu8A\ vD0 /'=@/ѸġK%3ZH䎿s*Ӈsy:Kl%r#胾0 L0(!^1x ,{ӕH؀kM!$Y ZjFqv'wrToįRËU <7)8#$Ogy:xM89sb:eUY(ӝ q$&THQSX#t &[HZzQy9Χ /XcŖNzԪ`_I@U(̑({ײў^ %/m5;,Pv|&Z{s(\;fRx[r-X7F1(خp+\k颳qy|aΡ /W2nq AY͸>fFxFQ=Y϶B%w"=7(gƖ?aeIվW`6pU8BHva$#cOב򐈧V.B[K7؎E 6rרG58>aqm_>kTH]]=Utռt5|p_ZyV_K=d|.ԒK;OkVᚺ:r4ãOﺲɬ5v ץmei+{S`3dCиh3ɳ:Gej3Dd_9#(Q07eFΌ ].(; #F:$%|S jr'\m1/'f߱D+ʠ<vc#B;C܍V}y?ݒT(7da93o%?f/9vnH+9R譟 Lr6#o mGQJ7P_% U;K~7͵<4plJQ4#5k)5Z9 u-PgR߾aҢ,*? {P%Vt$老Q>;YѾr{Y,{58mMbwqDdf+l6Z@RUa0,Zf0.  ^ 'z2ֶf"ybB^EC,& }78RAr 070w^o%c#!s?y|0hME,n63hDx.Ԛ~H[4LIE]2- 2G&n1KwS+Zm;0d&[1b}Nw rs a)2n^d\  n#d?XЉF%46(Uȟ6<イc4Iw m#pgpJ`D{B Ce裑!A#&`˨ĩ+;uI!WQJs&5TDSpjXa\P%>&'|D\Ǚ BAtKI}"mj M GM-LoQs_w@ 8{ E`sG%:dp*nRθ\#E$ʮZ`P{̹Fɼsnmo SDiHQ 9>qCLH#R' OP>"$.~7V OSsǗsУl,ͧz =."y1NDԎ}dIZ5gQҀ1UiN 5L ޓsjIZ u"l nXf>&|-?4O~tDpl(c (w\QVU8.T`# D1`GTki۵g n6 oSItm46=@̟],s uZ$W+6ocȥUab@vgAN'} e pϺ2Te!Ģk U(< lK' (3yZ4fYcQ uߟ߹g& 1w2^Ҡ4|,yTQs91\/X!bKeDl?r5uSMq7=<F*fwZe%=e/.'|GzJAFny%hZ@!MivU.`r6S֜SkU?^N0⃏L|r[)^.(0?@CmvcYu 'X7*3vG aC& XfVѥ `/fG}Dch-w[Kp AjCc:g @nr  h:i8KMcpZ|P$dFF. Kx?taWjCjGgbkIR<O5VM.+YE#i15Iu8_Q 쵚ځ_ٙ4\m_;(&DVHa$,2;)1kvWy*~s>nm?w-K$4:>!b!K`&^=_HG ݡyw2 =AwNT?͘MT }ZƫD^ảYW/]+T k_YJsGWk] {u^pc3@GRs{`\ M$ЀAkxc8xAniFBׁz{?$7[P3ˆ6_V!5nUǿ3Y|R?u0@pJehlԘLicL:+s;PU恧_ELE+-P 0]QاKs̰x|8sHlNI``QyYFO*J:HSǴϮhȊe-$'6󩞠Tr_p/*e!&}+)E(_V,SՃsDC; y%oD2Z~A~,aUt:$+! !4xR8XY;b+>^$dW>ɍuNn5b%mDmj'lUk0%K^[ &`p\ q|Zqsv|7dvrq|O0IvI;Ҟ֓ z63WQD^'D 8`,e&L, *_:y!]Wfo.LUE7ܾh*#+i}GLEC8@~j8[&:"+  a`NLcY=͌0~-ŝs_)~Lo>1ngN5ԾL4aH|fWCxV{' +9@VϏ(01 2OZYR?DKWo6$|Vp^2\T2J_Q9&ɒV0bx5ϣ񦁣SkTښ͑Πo,_ Ux2 L57-jz8pءكW~1:7GLe@}Ƚ#IfY!]O8nҨ$ZEME nk$d_;X&~mwjtd?i$\=&pbM+ ú+grsaEwݕoˇ7&c¥ʰ JY9*LafqltsV҇wk-p;o&ʹ|V}$__݌//{ PeL+VЯH`seD$38aUWɁ>UF #:dH4#rZA,!1 NJ iņ4 ĄMٽkU<&/Y&e{ɟvŽ!-qxwU=2Hg6S^De7eđC3S l0!MVn{j;(}]ݲ_|_$0 &q l#f43"V9ɿi݃]l,}Yg4\."8,+55D a.6 ;6UC۸b"KI w*ct#})~?\*O&?g;X0lI\H::xdŜ\xnO7u'8䛼D;9#8p\F&FlČrˆq; gX|:$ ,!: |gRI5N6ٜ| !cDT#8Z0Wه$YߓG6C.:e !ca'Ͱ (7?}ΐ*} =zXD$'ndFhM lPgS>I皜5Js@a"Y3rŻiD" _Z+ +n/h9r wLs3ऻjfI{B[əյtc]AM?rz EF -XwVE7$y܂("̇@,s2G2rYs'7Jew#fIZcp]H- ].Rmw5ht9ݎu|kA Df `qc|JvE,utUVQD ƩiRQ5ѐR}l w u@;z ŕ=8-Ngxsy3ip[kjsYư&ȑe{"ȉ 'Eǔՠ}JČM2(m'ևYb-^ĸ l$ƺZ6[JNio2- =٦y{Wfp39ҔвIk%כQb #?lm/pvB>T,CmB#\D!oe B Hqڄ,0lxHcX4)r4A%}6ɖp&?i=d"6\i+}h@F|4 *aNcۻD/S"-h,7KImrX"'XcXJͥTD Y%P`' 64 $UIaڊ:5tW3`+"?z0& ="a0/Ty~WKhMyQv$y&5Z1HY2_E3 D 3MThThFPƮ,Qye1jOؙ2yy|BH4n)Or0tj}4m-@h^$l|p+g# } 4T9i;vI!Kv ]SҥW[a1Q2@K6jhlW T>I &K2@"6-LT bY:K..5? 0 )v+'f;^2r3M/2{*ψoz`:3sq 8ko0Yx#W'6 \*Y5Ԋ+TqU/[B-ls^[ktOO͜{C*hao!J%dҬs^z;@eFPByBn\_2$ gki[JK%9Ts$_s:3~'1ckʧ.0MKJ ĭK>/qT /N=ЊM̄gЉGU9".Rc5r ûc+bƿuJ$wyL|dj JD4ԃUbv3W {O PZ}TM3ZZ'gبcHp'F􌄙.]D/GҋpNw>n3=:;іV̐J'׀={.r%.l 3 SGo#ɦF U{j0//=H7 A<}]rwDZw)` JO-C!EσMglS|t™$2ds*f眢FxXmKD JR PASBFF,>\zJi:ImAB h-H")Bm콆h;U4:eJNpmr=dYc<5)H8GH셋乺 !R _osw+薔ѴBݫ∀1VZ 타ɳ+<113QP@z^lζzS]`*~"Cfꞿ?HBnRzN?+*Q Jugg2 <:ӱhMu }/^*P[篪 h8,(|jDtBMTG/cTDWkH.#JR6R|)<GnN'6'-myl8I!phf8<8QD*6 amp:rqb1ϻkcV;f2rȹʿ !eh6I NG]9rJe#zdsd7 oJ cWfE0 uxGR(R{f5jXzz^cu2dx็E釀"yp qޓ~-{m,Ad~ ^.?ி6Nqtzq~m7g%) v^,~EDv 䱢:@O> ;ADltz7<'w@ UŐ}F-5DÄ8uu羋͠GX|u7Ή(:Bozgv('UYE&-Jb&*N"S*CMA2ڋ8p \F(SK*sP=G8?oxYPXUvm6zyW"y~bt-Yu~Lzk; ,mP8'^`/ed exEr7x^]ͶFI*749Vԑgi"H.dtxǽ$?$)Sq #5@-|,a>RZyv-EsYҒ ȟg`+rh$nlSnUAt`0tN0zı3{kg|M1Fs}@>7GU=>#ԙQ=D$kU"SOa@y&az-h)%%zbP^H+m- tO#yv,@̖8Vzͳ,Hu9%cm޼mCG~h_O/E#uH҈AN\Æk3#Iͬ~u5-ykiQx#r<>L/b4ǜx!lޤ0őW.rOVIOҺl\GcY`SD5쉲{ (Uŧ)TXM fk/^|U )R6gNف+*p5(Pr0'C' &>@?d 3Ih=D@u{m߶ ԏ1Srf4(qjmV>j?ToƭQ{B*in[V!N/F1ȵ\Pp@fܿn8R4~Jn5o9PG( %_S$zď+yModp2S*##K?ِM$hgZUApfc7Z cÑ2'_^ )~|\?YS) dcESߢf?Vb2멃6Vd{^}{WӝZד&֌p'I;$.rxPa7Ƚ{%j9Bl'^ O .2}B5F]yҡ9sfv}m/  o՟/:"̕)bh`@˩ll̀RW+%*Dc(K$,rXV-P"^J$_6oV"Jf &qW9Psc=I_=Yea`\o^i{9l]Mc>|fv~gb ].z]iXUXNoS0$qihcZ?IW?a_>Dq-%@WFCH<>.O+{BV 5iggyP PxpvT2 DZ-(#g EX S'+QR6) Udo UKdH1,A/*Xq@Zlbch W4aG5,q2G a~kT(̑=&F댹K>+t.nږ&ѱp{ %k#r:$c,a.){SQj9MjC{ѶPGtLq U ^7RI =}W.`~ (JkvPB9hh&9h$-1ɽll#MYgovpp !ޮ#.ZtY1iC]iRX=`d}fE·r4(*;-plqGC KoCgѮs'Mn˜ pZ:wiC:LU޹8^u W;('ZqhD%J>HY71_+;,Y3LsRKo`(#[Ok|Ye dPUǤ¥ň!ZwgNv'ns,=_dq# `z=N@ ;?aX`vp'9ס&$(HK(I5bȅ ; R,r݋2xܪ/bh`xE‹{eLN\ߌx٧|s ^rXبU61NN:K~YZ].N HNc:;L +мkU=8$*n䏳6r캮RIWDdA9$>؉h]%o}p~0e%91!,HjnCpXQՋ el35}}{ff\` b4z+y#wI@.k3*iݠNɇK7"ĥ^`ݷUZ)S*c[zO^ u8-Lb}a7~v?ly:9#~iYg"G4M',+t'r]'<-,Y 43tkT*r!pP^#ZrCsZxY'x6TIub^#߇0k^pϷ6`n׺/e  4n8Td5V09cDwgAxl2)c:_x3 \WHŒ%peȉ J9*fc}*Nby8Z tly67Pmr Y3S_;qe8sp7w?dWUժsWu݂5 w ЮDS¹>cl@ApauÁd8ZFϹ1Ae7\*P9.DW^-{9P@g@J@YNi!H2D!u(w!NxtZ/w?'t!.\"zTv NGϓ*ct~ yUQCx:Y*O57MK '-$CLp׭ozWUkW4?Jw0aWwo65u%آ{fV)%fR>Sg \չܒR\n9P=ELl;n4~At$yO - ąG}Q_-?=?B.j=i @Hp<,ǒsG9pw&}/{Tno[tbA1LFTf\2B(XwΚm[ðJ:)^Bt]!? OYgx%s‚^S=8Kbe]x uT X};lW< ]}pHp rXwp'%͖RfN /L{9灏VX eL]dp(h~5Jjme8Z%yJ[ndCo,z Ms)4b:vi:8s|I-3NvMkzqQI-:'5L֜/*} uG3"Pپ̒ht"'{=1z*&ǟ`?+~rt9*@SѮeI at!KDt>p?ְ]>$u:Д88 T=8â] r V(lAu (tFzQ͹cQ^FP8tkq{K=c|"cKs1F(,B zw4 taW=쮺^ቒȮ=5Ch[L}GBWP&PgI}]䵞+vF_ihh#|w^4sDGj ukmm#mb6R. C%?' vm UaE(=u\#Φ8!*')>Xr@'-1׷0X14M F:S2ID…0Cs8U6(æ^Xbzc3p=|d`gxלFG&7/V >et|D,Зdj{N2Q?%00"!h*e^e>(ŸTZZT ox}TRz ҙ*f tH;ؔ_U=H X ?mSQ|h Cu1qu :zh? VdʖAx YyVXDDkK~㗢yK @5~+@2+o$w5=_:=?xZiJ??sVlU"" I8HjkKyR4ϙp*G흏d2MӝTrz+NaoKh4t ےxu?)\>5vYL7">GIk[@VzV]_"%B z}k5Y_"ޥDƍTU VaʋzJ>zNu{ 4PE"j&ð_)j^qPÑ8!j? ܠ r;L|dz?ΰearֆះ_`D}GL(t2߬͐Fkr(3`3asϏEloh3=ԞL\ v [a͗:֌򰕠/8ixua=_إQ `m6>]VtmƺAߊXRܫR/㜉FO k`Ð;<d Wjlb1g ^^RN0Ly*O2$U+IOz#I[Ԑ'/LsRӅrPM kO0t͘*6\gz_4M=UX0Tòo 䣥Zu=w^q# Ui¢I<'޸hx"N!K Іr_7Õ4R%Ƿ.L&7'pR}*=IdW;y;bX84 -%9 H] uO![6ׁrU\o)u[<x&;v`/ [}_YAM|bM! iWPӆR2kBW>`={IxG7u^tukM:7%!:|ۼɠ>d5rNAq'\Yz&ǥ6 w7]. ժ4f\/lg*/_#zH3JBۭa-ř݁Ycʔ۞z+Xjm[W=m VRa(+ g e^쏲М2;PZ9NVvKQ]d lC`~9= tYvˆyj߆I!SmdA4p;n(}xЗ10CV-eUw  2#4%R:(x fu #O"{|;ϏqݠI&"yz›AJxjmWC~z<ڵET=씊zfPRIiq!ee3aԒ.W.ΔɀC8 d!2Bw?uQfxi+]bf|"Zjw}+jD6tBFV|8G-ESe% ǂ?RÐ!=n\93<]i 8T".n`Lb{vꂙA6C62IZ:j1hZ_{e`W&FœC.uV' ]7C급s"Gz(ھ 93dL;KxWGXYXd;8B"eq.ݶW =Iim9*w ?y DξC^xۣDCݽmw/t|^yE*5V_WiPdPx.E;ⓩJZE䊉J35fH}.R$bHEŜΖv#,hsZvjȷr~1 ǒάΑHK1fr5Qfd}9& V"Ĭ@D'-#,spDV}KKa`1Rƕb5s}\o]qOY5ABDH?ex#imbd`#LC3+ ¦n[Ug<̤n#4)"K7} 6pl,㧛wDէ96q ܮ\SGjPh;2aFrnm"7-:TڥNs:I__kbOD8buFmd)J(Q,IYU/轆F x{9`HϴoZ㇄j#aʉ _Kج`% #^+kωJ$]ԞQ݀Y N꓀kڡ͉PZ+빖rxOdt\Y^/Qm DZ:!ߞ|8rOՈB[P2ה}"tX3V$[^perOa{8E8AO l8 'UMFMg8 cܯ!VlwVq"|Mʦ(=L4%NrqrkCd5Y۪]fd,GqӦL^(Kűtr$ŷ&ǁr :z!QyG <[,\tƢ$$>DYn(9]R*91X 5i͋sPSngގ`[$8#IR< M Z)d_xAC#'TnM;];9{ ]t)yG\k TIm* 5CkJ0tM]WȄE3&Q(ExQ.농Xϊ[AȪnSO*ܾe$Ze\6CRŜ4Q/C4.ִ+ƁcuflYkl'T 逖D+]AW(^'<XZE"JU$vq_?XBT;:Jlc:&1>u*p+hY YlcUAn ~G,lf䩤Bc*kϠ!'W^FO-Xw:g_$Y /t&Ң-E߅0>+0Hh^_bq ѸsdS,aMs\<9 t? % t N$Rތas #trRZ' zo- H˔2;;#D Ԡ|SMV^[[v@@_E0|~14H`&̑eMDnZZɯ KNg>tD햊'0t5S'1<7pQf g)FQ:C<{_PPj;%j:_c r _~7 Z)<2Wr/Xe -Ppeh>6ͷ%%?&)8 \B}(>(Pc'i 䇒<%,K37鯪Ky'XoE$~G {PTɀ\?w!V?xW.PUur7ĞUtĮꢷ~mό] 쉹m;/QZ(V5y:~FX&+.WHp%Ґ3>yh:oC?\sU+i8]܋UcO&,.Iimv̄0FuRVɾlp^2DaRDQmLTι҂#Uey 1| t#uϵLWŮ 1+V]aR&pjDL7P /lvXh=11XeoetythN5.mQP㿏 HJU+MnM1"\jBddlw6дn:ɒ\f1ٍ. }SAb8!0E/~n뜞uqH#eo,UC䀻$vBNbV -`8hbno@0(^j@jGrEEV HYŘQҵBay3yd4\4.xAΗ:SE@ymeLE9_!5k tmSs蒍EF}2X+_p%Y֬E]9|nT%cѩ-n:,S%1$%L =PD>Qp۶F0-7B=phWBebg eeGuJJ'AΈ u!HR!Fe`,ţ`ʟ_dƙ~ Y=T%AWÐ H o,?B$yQpL* GIԠ* % h(=j=7R#^vm',,e艝hK(6ujc)wZ_<`6 44:̻V[wI\ARż(ț'9A5D$!`f @"с?7]ajQ5#y\~>d glDls̜䏑/D !G2-o=W,[.IvYO$!ԹK3'jLԯrg |u\τMEo*i^,2-0q؊JpA,VbɄ Z:{E`_ҷTV;̺@Gl7UE5*3>SqT>jحIrxG3¾ѧ" R+WͰV$BlbNJ M2 9Ũ.ϭ6731YVr%ٳyxM ho8ڷmzMW$GԬP}X$IcG m_l8"A^Kσאn(abP{V7:^e=yHNQyXҌ;}RL\{(=? ª&W嚶6ËQqX1}J)L}4BM~. ).ˌ+ QRndGV[MW:1$`RT/ԗ.f% $y҄0 $~}8^w\+/MIU| yaゞAmw$(|r&n{ Pm o._ |qA;jj /Xnq=EYB\!{RKJLZ>$-% z]ЫU?c5MsٿxLC#VpZ.vƂoDEPnَ(ؘK=8&"הxm8Y8I ccV ttde;׳xCw-%0w0hg!IOG\"i(6j_q) ;C84m|K֗ ZOe%Y#5:I(HD33d}XOuɹ Q) +q!Riǁ_2`|;zcKG3@8`7ls 7XlM*RAq/!^M5Y0Tm+jC5ceزvk6dqNzj(/ D0Ϯf}Z**V5U&9RҾྚ.o~9%hXrK6ri4vyv&Np<M̨1qMXygV>ɾX=.ֶS @۝{k *חIPѷiWɝ;I|x|#I~G ^Ѳz6ɐ?/ɣeҁ9I}ZP%-]ZD`R$1^nzVe*t W[֣BsA %BoNTSWaY\,Y [ʔj59gLs LYlco7Jj[KcCd0n}[OmܩEO5b"C #|\eU|A$"))y0͘9άjaDc(+B^* CL\rϙ \bzq=b.B"T)_CJˬ Y.]1,u;j)K>k0_I6(;#D#mlo+_f~: 1,unJ'X~o}GdaCA{ѵ^!ń\f,ӑsY* ~2gj] 葾f'=M#B;!@}$m0Z ԗl帛_<>TfevP NK( !!RQ#$x5I,G|_ YqRge-kmW133De1?z|ICο$VT&DvP wWvt5BZKjŖ[?vyX,tCEx2;oX멂}si9\p 89ԇQ D4YDO|JW΅B:7:75'QVI&.M{MZNˍ"kpqTth++}sB`iPO4QN`Ϊ8o0'._ZBZpDVgeO3U~n!ɻiR<ܦ7 ǸG;N.m۲z8M\s#G=V\)ƚPBa@OeOd0SDxDő4"847- =/[_aw9%c)Yo,LYb|oFb BD2D4u2~k7A<$kH)8'31KAІLydBMP!f2Ԕ8cf2ha ACjWkwhW2$׃*5F"G|_3`Z!}w8G|u! y "T.+:Alkk? 㫟V&fV%f^29Ϟ0")$#y`m1LlPUԆ2ul0CIcMXG8icCv'DrOkb\o!?9Xa|!]EVn6FEtP)JBmGF+Uc 6Ao"Ѓz癏<;`檮ş:.lVqզ" B QˀG9`uf~,Nkq*Yɚ*L7J\5aGǛfSTbW?g)[J]6傃ō@('S(JJqc`+g`@9L oݖw}L@U @l<֧ںdwKd>$ f߷f9Q nFx-xRIKmI;@0-L^ OAҭr˨hF TG0 |1"F"7Ѡ" ~(D,Ue{=,Z)w3 ]:SLK4 1K1C b|7!@:KooM7x%ZS ih8dvk3 b5`Ss'wOJtf75eTe>Ƈ*VZVe:%T3NcnR WdX, .DZ.|ףpARiռ, !͛8^` 7XANvJ38D罇u W6"uN9h2r]TKq6Q`,QjۘQ_duLr+`x$TXkD `(k_us)>#fajY J+*2 X.2a\P! >F?5T~n؊TJlAItЋ0ϑ9U)n+flЈ6X2-,7.􎣲?;2cRޫ4"nl/Gƍv JMP_J`ag1l nm-[JH@,5>O[\Q"iO@̴:^Yʔy\ml rMnK^/}$'ud/4툜aU֬y̬A=gCCض8CgB,-09ougWO 7GxB`P,s Ҙ ^I#«ɛPj)XnVkPzNjQ. WB|+ɤI~^~*[z(;a!TW򄉀z) H'a4hŝQgMTRk|)+H&8ܫHh,HLi{&܃{#tfW bQi!Q+iG6FQRRw=%ZAﲋB|ۖ){ A+k2GfԸe}CB'j'W A@cDm'ka2KuZnkQ&_ӁA0j$fܮ: `t+68 R樨)`lR7ÿ㐉3sf4V2eFִnl߻)Son6ųhJQ̐v^ :-c]Sd24̰(>Sj,mG%G}J +!aatE_ v-gD+z_:qe}iuVCڌ~+$=X^||zY:vڄi!` H ׂg.&1wixȃr/7}"P&_'i!M'9"M X/:5ymZ@^Q0VHa+ Rz_VL>d1I>F/g ۈ*G,GGZv1ۦtӛ81(h,Uti.&%ς%^GWs: Vɧ('Iu gOh:v݈%N Y̍'1^$bR;_.}A))$)'~PY`hhL%@&y[/)Ճ8(VɾM q o+Q)?~-CAl:@V2ONzkfL)[b47 匘SdJ[%]ab4ip NO) ߘȃKƩpE'^[[ ʔGvԀomԑ?Ζ{90\AN`/";m|I`*J*Nl!7Y)mJh8ºhsYM6rP dd}: "'9@4PnVBCocD#vzoTIѶ=#NJNEvD`ҙ$s Ch^GH*0;/8ϕZwLt``N4*`֜Թ{*z4)6ڌܜsBp@>A, qR-6b/ 7-n^:Nȷ3mHW>MU˩bNdionY/bk1k R)1̱-rXbcâ5 ֜G"Y`9IhE͔>m7( /9S\/h,:EBB?E ˥NB #aT0 F_ k+JMg:QgEt .Q@nS I޻3;_MT;h$G|Gyҝ#ga#nG8VdS+G \tQxΖT4IόUs+HzVݖu G`Oy\޴dQBr~Ș$lR|WxU B ]ܲ>Yp'_ )>YdM':= z<qC_g(욁R5G>6;#jKW{y b!a tL22޽rзh4TE M@ӵλYL%Ez￾6TcQ'm)x@dt(L]2원'y`AQCHׂ0Iˑo7 B_@aoR,zk)eUH"tt. >}/\ dQdTc7!6W~ d1 7slvT)T9 ^'+ΟfQ)%],ȏEvƯR]6DX_'u;\{6$8K`,HjqPګN4򈟍)+>'GO$zW P0 GJL(@u,pd^`,g*v xP0e]u)6k4̥խ^1q$U.6"1XJk*l(葼DzJzH\Nm?bCFXS?ࣕb Ls/Zlqk@{7ߞKݱg8>5 "ZIڂ)̜OO]XDDNSZ -Sc,wt9UlpA@V3fs(R +֖8Yf4,(LH{[ +1>6[WJbYPjA^30K?=yAsgwEG<֚OXyi1wx]|3)7^cXQyb{Bw=lhp?-_;s5|#>)ί>0EU*0"}\62Edl[ 8!4׽ ;+m.o'ZL v *Hn83Lk;(tn.#˙/h nX~-+dZ6輹DxW}2tr}(&;26lG/;JSAZvW1cjjXdOLᏍzR72 ˷ndǜ˜Wd;ݖ\ϯI\bRQiގ_p7t)4*<=V!Gڻd "AXG/6A]LK&nyB {} Wt"Rݟ?0Pq2]vx(D-!?RUa\*uYQPu)+ݠ)n#zjD6)@^Aj,|CoP AlJ0gp-7M\p-XW-v%dPژ\ JpX0Ŗ_7~fx\oޅ|=^_}{ɺ:BE:Mu֤zFQfWamѰ'LX\ ^=Ј&z?8{dK[RC5a rl.y}M>j傤ZkOh~;\AfEҦXItPM/$h^uae 3(hu)|0 PITnP k~I΁!ຝ(-VH8$juzH?9ߊBO;""+/Se9BVP>4QZ%a31j)RiҙK=&%0jb-VfCjbKW]U:kN{|ڄ#@Xӆ7ڤYX J'&6@F+=|NMpx? ǟ-鬶q{KiEJW#hiSۗG'a'/#lRcӯw(I&rپHxK&?Vg;Ҍ/uث[Y3lI۱ K5O;,)jqcc( hzKbd/+rXVq p(43^s=2SRU<)o<nM`p%Pxp'8_Oy. ME#[A}\pX ?}mCP 3'*k9`2Qn#Ƅf`KD WF3 :N6nH l)I6Cx9q&{ E\ъu W`,hYD/:ኸ/O--OB( *[E BAƄ .q⡆&B HhPYE&^D#|› ]yC>؄F_EI 6wH.(lXqt#zQ*{7mP'3Hn `n$N3H)HuJGR Fܻ = yF~rqi0!\T;o Wh3jG%ـ>Z+KhCBV`a3T+L4-o]}  1ZMD4r**<2=W-.{|GEϜ #[o:4Q0Yi=4ȹR jCjVf†3a4X; ܨ~$, vaCnD|Mn9} s kʚʴID܂jf\T-x8W1zu.?4XLѬ[Swن}$r(8VRTsf!N/un8AG$pO'a.".ڐY$PaUr-APh \Gmј)?䙟FiÇȂ:^U<ǹ &o)ysvɶ<)P#07w6DpL7.09KPͩ%Xdl,6N[ A@sS қ 26sؚAϸKr8@Rĸ U '7eGiY<4TL;Jdq ˑ7p2\@aDh%bWB1[#;9AWDB'^|kW[ VwdXh|~>;>x؎+:|KJ11KyhdewԨ4x#;{5a-Q[ϝ9M2ك=|+qfWSXZ,%Hm< F(A"3pt% k^F;օUDZ7ˠhw;Ab.wmƞ"# cMLd/p5gE(вpr= yCҺ7ej[ G0%< )3ԡ~ S_ q7GKKh1,E vG!:J&Gߊq?$|YɢsO H5Ohʸ)dLĺH ĮB^&4q06l.L̆ &K7Nù z}xD/BLtq -fH۵rFGlA[q@~x eG*y(c~&fHzy ABA@}0ΏqbG%5gsk.@ٞhu@5ONtKkL/yQ4NC̠/I#X{?%2R~/3 ÁH/na~RLGu^arrm\4=n4kd"N@wi9 `LVK8o2D~V úy_{uh Fʨ/gw̟9?v5y\NF<ұ5`Mo-XIZ0fU c.~w.嶡`="Zvd|5+7sٮ暨W:%ƶB ;9ATH,I_4T- Bǁ XekFfQ ORF#fs&=I$7ञ^<3S'T C"M̌mR_Ʋ"&b  ɚgdGi@wSCƧ mD|]T@# j|??m:Mh!EhQW:1ȵPmFze-]da=7a`xDW9 &: GH/h/U 02=ǫ*xȹ#iʫ; ݮ(n wH~a8'm`*4ԔЍ]Vn;X8XaGj@ kW4qI|PCxJ8O!.Ž$yEϗ!>VUEf>q<#、_\T}/ ,*de3k'q[h8$J4$l#V ԥdM qV=[<=iG3Sc>@-';zuk$MGA`|'mepeӃ8T)H5z8@D|)ΕPm '(s3~w%蜎sȓ@xN!Io0M 5h 9DD`5ƩK]%-%"mX5@P߉Rg lFg PHLro/&;:ƃwpolBg*ߠ㬰B a A)BG VKͰ>N',TJ-u9pQ w,(."]*h1,)b/b;X鐚(9q~TSeP cj!VaoYFa;©PLPC"␇6b&AbH1q桚דN+<ݐǘ[ wlߺ26iʈ(.IؔgV%dI)V8;3>gό4΀)uns;8:,l x ]Z4;:\Ǎ^pK2.&N'菵dr K-ò:.TkIG'cVc w`mQ`8R V1˹?Hc?R+?\tCo"3H,MjH8GR)kujMo3!jل2EQYO9#nyј1+7OV͖, >' 6Ef5*h'89GFƂ / )l/\6M>f+[DuC'Z2O[+"h"+q~hdf2X'nB"ݶhh5Q<&8h. =Vne5vVΩip԰wQ'`:z7F'D4@R*N 4a)?gxp ]?"]XUXL6Ln n'ˉQ ~VX@ۃvV\F*1; ra x٧?OrF;^YtOr` PK@nSY(R\rqc@oE!]06NR5Z}+mT2jY`k릗5!6'[:6jHbM5WsLǨ?erÅb ws0u,#i!m1>.2o ԑYL֚~Ӟ6wI7|pL!0~b|K4/wZYGM7:opщrzQQT<$[?h0)5 :Ƙ]M3#|B!!=edk%/ƌBUCU;1?:C"35x~~m6rsNU b˸ Pw/- ֿMQ(0ܴ)1]=Gva48P֒YAZ0U#ޣaXɰuOeeXFGu#-VhK?HE 2wڥN(V{N8WzEU9KPͬQ>`"4 %: Z‚*)S:'({q$*UP&(tOt,H JtS/]1 9VXҊ8q[`2{L&'+nBhw&"4KiCc)ܾhZ"*FaTe(5UnE4\"}Z'^u#$ƥ]"Ajn"WM=_c;S4a d9D(;I"ML9y;j+_Eg/G[1ʪ##V:]O(F BZ"a6yuOb5 V<t+/IGԵmeg;s ڝu}gV8[ h?#q,͚ 뎩(U ~ Pv[]re&P>ԙJv~ 9mWxgX0(.VHdPF{1z!zįL?҈o7'܍@4ufT wR0Ħ靠 6Wb֗x-61C5o! mCvy̤lT䣛sa;ØAItvAنش?|G*8᱔'}^YG?x8i<)H?cgp/Z Vhp`+֫w'^1j>s_uOUY0 #_SrAňhFӫhX43$98eT]@CQ=5`ӦEWAq'?nW@F'<Հ0s391gpTiE|u\Pz!T~vtahQr P3S&@f gR˻d EPJ|QT " YYHYIժO$yPPI,R&|r Ӗ*Mqn>\G2 d`>]Ř@ z0Y4< YKy8Eh {Q۞CHK,ȉxe_HU$WnF$3'My E.B">X<6[eTWcT.ŇU%k6H9/+i;00p" 5$cS}Ik+f#ijGW//E$@0 vW?-VgqW3$Qj x8+K1@wIa1T1@慅ۘzb _ "X{\b Sڄ \CKSUY-G{r˞(},8˹^TG u0A_J¶h(!QQ!5+K!H?w}DI6yߪ;!RiL^j0xD'xAa+h nD^LV6{Va=/Cѐi)^Z~vWj+ B(ucwНةc_(\/2s!J>]X]S^"=IEl n7D rW)Iܭ7F t5v{L{Քw *s첝~ޒv; Cr*.,f'Ư@hc2z5wX%Mk>{ ,D\^t|-=ן)3+FYT iw*Fc=+|C8$6tظ1x(Zn,;F`XuxZaC}Dng'7F4p:lJ̄o^1/m.N&g!JS +ÝV`_/?p#%d0x.z?1 _^9mfpM0^+أ) VCB㉩=nv=k8 0X9k(͎$PcU̴1 R^IvS jqSL<®L~NEQkHa yA%AK(P|!O >j0M!cgdgX~z=S:0 ;ɺvzQ>gi7,_R0ա3[H8^lR(|?$ksf|Phf==9^&)З.uXb OI5 Ǜ2!u *2zHqE%> bQ͔fk>.ex}%j U4Jᾼ7LhKl#G2zk>ูtS DŶU )8Kt/e\O) ^i5ńze2qBG,8YB3 ʁ cRRr0e-62s#dXnoT3aK*vDbz}Q?~˭OẄ tw3 p.CTGfN'žLFų17 W>L."$nsi%qi7x}l1o 5h׸߭{g񿜌ÔqB$<@"WNk}thTμOgX\at, "zǨ]ٙ6h@H'"Bmj0!Zb9^-`l'4dNϸ?[H P|rVQMخopg+hp],zx6}A}j×rYaCFdH)R])VspQx7#^di#q3uY[(#Hu uɸ'勱-G`*2'5:AH=AQQKԂ0Pv# =W9IUd<τ&S GEմ}A׍]B_K,+3={ L%"Our\90]X45˚D1*2.FJkļ> 1ACҊ=?ϴ{̞z-!zG$)c(.3ۛ.)a5D˃_8S’}W>s{hM%b>óś,K^jl_W4 5OBUێ&Y @%ߠhJR(;^˱Z DM$il$''ԇErI] zށkj' DH0`e1X&l! ֦4-1iÔ$Zi]ٵ $tܿR(_c/ur3iߓ1/nWi['nʄr~ Sxhą*}!JBLX=dG%n[:2K}xUxg9 ٖ_ 6R ʠiHppHt6=}IHSNS1- Ҙ^3 . ' %pݠ%HL 8v&3SE{%X\ @AXAm/%4Յ$rX7\S/L8RݸEG->wpG tئD.F/J dmۏŅ>a/%HHw?Ac+/3&N珋k .iOv%IHg@#եְZW{C9 = BguZ 5`$ƗU&Xzlo(B` l$]|*H$\ra/L/hI*"@6G \HmOI;ZĤ5)tB@hoͫrֲaj.dV>D5b=N^bR_ʝ_IpZ%0!=vdTfPר|ʼmo;:8l@:ipv678N AA^Az-􉉋Eyx‡dQu [dU_"H@Le*}s,cu&ĮY648 Xad\<Ǵs@ct'L]`_rkzDhFd~y+ZܝU^. 1nPI쒉c,/ԩ}j3s.+SIO`{1:u8o;;iY9H>|IRqr4YLdMП!sp:%l<+NdOmT/NdL@r;dbL:ܣ1JI! n-tYro񻫗'%RtJ#uщ\ʥ#|k>ErVQC7n6 0E٬35[0EQ)/t1B7`A8>k(LD InR kɧetr@JXJLeHz&G:;џHrœF yPfI9mlUI6[qw[STPQwW G7s&'G+HNV 7 Crɬ=ft=e=@Eϫw,(y܈k?ZۥN gRs$vEGë)WϻkZ'%3@F3{fMPC<Ho%ɷ<)䏏P١O]MyfX>ʺ_F'Ӣ?V3 Χ5~hA= B*ZNF{Sd זM?\8#sǿvK$} +V#,8ģ {yss!k, \b{D㟶R'MWJ2<7M_{evLZ!ȑX$V8%[D^MƉ. vbDDmM^,?q)g ڵ[Ag BǭnWVf r^ۯ+򙔧83o^`(6g.LWqSPv鞾9 {Xe 2[yq@ݮ!Iփ= J4X^6{Vת yXWh<|}LZ׿U(%R*JUMB5ɑM(UH0 ,H'VQS '꿠9yԎfN*#څۑ]( O)I$0(Ch;P-SInku$x *4\ô,iJ1sgRuIYBuVzYt|jm(GE}O$uRrh;ۨ e^}#F.trG;(PC.]#IsMuzδv-^24ɍ)mrD'Kg.ob.<'9<{'vhP&c5jbWvC2鬈9%L۸xL4%8~Rӈfdǀed777pm$XD $;&+41#,.b-U)aLJP.ZD|ij6Έ^(Y!lo%ؖR n8_ρ=s鏚[p0e uLp\QA3spd6r'@ʟ X!j OStYƻaJ2],^2J$FwU֑ޝ< b`܍J /NӓaHur pCƼuGGSZ⭮Vgn1^1eYo[#>?vd VqSr?y}s¦P>[QEj@VQ'ʙ3L7Q ڏ+V "35-^%)z81O r.fD5R/i{ 't)|WJE % AQ_{cS MH:ĭ_/oHn ouPA.|dQvu=+uc2661n╸ !)mD#[r  zX}B;kYW6̋LQ m#} pUsBM0ȇY <vK1s}OeѦO3,@#y1h5i4vуhugJHTHY4^kB c %><[h-Z-ƨX.Y3Gd2rajvh?Ym3v.=Np#Ѷ%A K2+tԒPe7P6EE\T1>vRX!ϳ^ %M>}3dUJ4wQ{ƓQY\  UˊPdبPY&BH-zQq CaGod;`}ņwWW]K~*^N6wgp M. m>uϚ KѢq=Nɍ@rʷ = j1Lv'--a=8pk,kp>pnBX'"kԆX89v7^TNE:XG$kT>d$:^wU% R>]rKG!6j:~8g_L.SC*<\ !間m#Ɍnqt}:7c<ՏJK%_ m[Pf5 LF9"XnWӾaRF Р.&jT/7=Re!ϼ_A(Kyv D،´ū0qEA}#^8EHi=RgD/,uN<yo}U 4'X8WQ!rʄwG'u@<9 n B t~ myKݓ=Nml5ma}7:YΫQ%fO!^,4I~?Tɰ3o(_ $ s;qgV'fnC0Wy, 5\-36@w&^֧- Ɲәu6?HX|Zw;'c|WiP#H, * qR]ARKU<nR}ֹiD"T'm~1w#:k!& db2ؖ3V0 JONq":ߜpQԹLٗq/i/)ί;A.C`2<2j1<# ;E4lKK܈?OnWoOȒt0*%$gTC"iمvJf vpRE dǏY'p%e(G[ߑtM|(}l!3)j0iUjW~!/A>"-+S$2J`ntSPi nS={F!v2 -,~W3H'9;qF ǞGcTUucA>ZqH%}|[D 0b"kC@+v%s¢pDSka[ s/"?IGdw'a"KqЀhUL]; ~ffNTH=a $bZoy;ٖvuA }89}_֔{ 7,g_I ~Fj3c7Jy":]) TG?&5ߺψGn@v5{Lc`Ąs\}g@qzrÉ>.n>Rk`p9lqJ}g$S=lt, :uoD$B慣'EEVFCљ0F!=5Ƽ^t~ 8Ɔ_Kf~qGj̀5I^ò6{ rzi13T7r4cˊAHNm@9H)M bgG47A$t=}_D6fNAyj|XZ6bc(( L+}PG̷8Rɧq8(.4R?dWV1]C|n;0=A˵[Ot Ҁe 0cK4p$cx:4BD]2r1vr.Qn\:ZNM=)^9L1bҧx\yfS5 ڨ_l+Im9t AA(SQw90jxkQ0{. s / 7!.p}%(뼂2 z /q:?Pv^3T#O=44+!GN)DqOA&tj !Qɀu^ SюR l?'|vG9d\<=k~d(ȿ@ߒr\*eDm*!`4>dC %DyRb;P%Я_6zWWɃ9F^2!Bh "N"JXss$hdPN)Pg4R;^CDV oLlkЁwHiD_jJPw,Jj;)7tb@'B =i,Th8BDY>(*c3^`sY[QѹԱ=Ȥ:Kx,gF $Јb7ؗ#V?}}0cI!דs4Yֽgs;}V7F`"<R0xG F77J*aS95uXSV  DiA]K"Ef8M}Q^^#y~@A26XHO+RJexgQkL6]0)ߪ~'N.(+8H&1ҖwRȋ7ܹʴGR*ߡXMs]_t\oڼkWSLj(tI()l%nI=EDŽb2YȽ87AUwDA}2 fzdG.JIgԾu {3 U3.-In΋<}:l9Q]}Cw|ZD܃tk="ga$?Rd"Jfg۱`/HJX̸KhC࣢2'iy(i1*y . *ϒ[$(C%f+ dV 4+ҧy%)~C4 `09:#qizGm$ ڞ+'m5"6\set-qoL)Vpk=|9Ւeu  hU(]kFL>!q!2=g.Gftj%@d4]q XP ^?B1, (:y2jsIvmxp| 80f p7gn YH;P v1.Xl $Y"lgTpL_ ۀU (ws^e"fhրcx(%;c~N*.>P؅дw Й "MH"* s;_wSzl>c^Ûi1Ep}u[E8H DZ2XdTfEcΪއcLa4F4o']݂6K0LDeW YnmKl8 ZT ^f s_xԼ4UM6%i Jz#ᥝ0@ٶ:ZߣMUZ*UWE m{O&@?$C`jtb=bR̪zr%3S׀ wZP:kX9 syauIjZ,<3[2kƲ!lWfƱZf%9O?'m3ɐ2,[bzs}}[itN6oSՇ%cZj,-? 9o5|"L9"56O=)90W$wFi$(ANgW?Qrvg%ET_lU>C 1rSaTdD6ì*'+"_9?+(Ju[[Z²Ql۾M*u$2tYJnn  ծ'HD&TOiҞwM?cGpizܤ\ Y(|dw%KFdgKU,Ɂ4@ʎ3e!tjz5VZbӤ19jcsO̥G`؂u!1{f g9,F(ID$Y@\_d(֛ T)i$:,O3R͸J).V(3B|9k"EVz'ro]2_ ."J0akp kI/RX>sf߶Doڍ~Q,&1t$Tqa;ĩ@MU=jB3Tbl Qw Yt c沎xȘV}qLT*r s$egTdo ]ExX]"1B[6Emfu>;!~ܮ?Bm jb&R∀+nT/7Ru";#@$TT fE`2Q+0)nQ9-pS@x&lqCC0F:CAs9sDA -Vcu0:dDAB^zu[_֒uWG 3$CXxΐwObT+bn=>0NCRt( p 2rA;(b7w ~L٧=PEiRRo!)I0]{\xnu'fg2tXwZK"v޽[%6q ?=^堺uY/x:ՃzCVȰѓ^#ǝgb. 7iVbhU8sTMBS]U S4ݵPŔx嚟_ Nr-EJf;IU%&xZm,X0 `o~iw"H*xyJJt1?Nt*Z_MZl%oЪgf"i'QxYw._f&|zTZp=r8 +@NA{U9G}SG=ڵI7:Xb a۫?h=zV5YLP M$^?7$檔E{lP6] l `MFv+Z1 ;/Ò}P~5Q!j hD[BD?}z_5_{OwS`O2UjѢ2o-]K]i:e {:9׳؝k%8! c}bl^AlFʝ"B.Jk)dP9?%E@#*sMkX$axI_xb@meӝFgQjbA *;Y u;y} M\@h5XjkUrHF\K /]{"9h)oӝU#o0dwE_|=9i=qO@vAck#u'[޵G谛Yt @da 4ԗ-;+8g]'8R2pZE8-RFc 16f,sMX!uvGF uˣx] ?/桼eϡ~"`B{fn&sLAc'l5bo ޺ z(7eH|#(U. OZnuE*L9ǻQFFh.j 5"Zص fAi b `>uUAKTi~Rf TVh';^/v(?y[Y&(8Th`q FJ|ף=ea?ޕԏY^kfrͩ!Fèoskz /Mtܢ&ϬXmD70WfeoTVw)VK\ER^ ylb/1mj.?)Hw.uX`}.<q8 RoҍO~ZSH,/D+v7>k>!0 Vsnc)j\^:SA@8KWAC_%0 ת"U"Ճf%XM@> ӻA'1Ǜxi~撘?xQHWmѮ1[w:nB0cj)bl&ff:c,7f~#ˮu{0Y7Xˠ*ޑ8f~X{JɃ{BCߪȫBq 'l_C 2ӍEn[ sty+]8}Af CMe(TVy5RةU%,A9!uZ P^%UŽ3} uXl1:9!GY"aWe.xsl%&8kMxc >҉V"Kyu R9Uw,XE)z5:|xAg nb4^-rN[EPb.(Z{ cS 5y!pɳ2#XK7 tTX۾C/9f|y` 5 #Q.X_ }S9$(퇛ssr?l+CeYwU~ fiꚢ6EM1aj tڷ瑫Oeb hct^y՟b9^ _Dr|LMT?ٚ}^CFCDUhO+"ZXP[2R8[!6P2{7ci@ DSj=0,jS<<7ȣȆ;11I|S^HDt"{gUǎI җ%ꉯUO*;&=ѬOϘ?ۏ, -d?eqzY oQ/PWh)/̬nEXJ!{t30Ǩr~dkdh!5}n粥#5FxfNrLc‘ V3t|XC5=Y]j~PV"a`$JfGR]I$F_9+N1 ;bㆥG=`M_ftxXNnoSvZ?[Uv'tNW^}vt )NOi)f QLDcۛNHt'E(Q@JmSѲpX1GiIWBSU%i&LS1R|E vjZ\~d*d{c""P=xDe>Dnx]YIZJ9s!ܙQ*c(dQB s V,臗(UL 杈ڎxBBkaw\vfP7:8g'Uhr2Μϵޏ۶;Ʃجrpa2uN[gʏ'A7lͣ7^ʍ6AS?4,^F+HOOoG2!u8Chܸ>#21+%28m]ཉ*<vyvƴtPu: a<,'HUw]aad/ ˹v*[ob]rP@)T{>f#[]`(Ir익gBڣ zT`S1|Hx7 Ma:U_TZ>s%w8LbGox~I>tRhQv&)!!׾@&RO%rIUpŨJ-jg\lF6l?m6FU(T$bnj--9#Ee0KT[t?06VXK)ZW91ҏ> lKdӓj>?-fdO Xx,EPfS1'{_ڬ#ӵ#Wh!-45{֒ co?y?9j.Yyޜ:q=Ut{X't`/Pzfǒr3ln{WmA5I9.23SpG€'4ʃX-ځvG}$v1Ĭti! e>wO1k l Nʩ+ =ت0^bNW~ak`F#d`#["ax܏^EfobzwT\eQ ; ;A.Ą,ʆ\H- ʈkr-S|y|@id .E=+7҂GW`OixŵlQ]Q@x?Zvl%Z?@<*ݿ;HMpF;f}X9[y%4U6<#'t 94>SʳjAY&՛fl<_t$|$rUa,AN*v%4m>LjJt`[ M_F0LU{|^l'-Eޱ}?3b^- n2,dn(N^.zsis5훒 =A ѿVPNw_/jgOΗv 1! vx Eƥ~J=xw4(m\@Ȧoʵ1po1]!Z[nJ_Z,#>N9Qu%pFxˬi- D6Ȯq:؝3.95*d૩C|ՆB>;OX7/ߴYL.nJM{.^ )VPmjϟP anG`S]i!ݩ=K;])SGUA\Hc+7ďP;CHmO:Wn ]VwPs}CCATbRnS|UjG[EKZp܋0'6Z!)jߖa t.ħt;ڑ' "MitRIɄ#KAyjgirwF˿J.y8@E;nyh^e"^EVf)@Etemk æiq?B hG#fթ@WtCkg|UάeUbk%}#<0D05+ Ej0gv}]'~TCQ\jB{S(}»R+5ِ ^r:vK3  {w&qǿ8-$6Y]F7bj+^*禳B s[-zeTz.|I75Rˉ|!t*0b]1@NE-=wb&SIB>ڱc'A<&A^+ߡXWt= dL%^ASJdmGE^\Lz{ JA=w6-dm.q8#AMOg/7>]դP>>nG4NKy99uj޾K -59AD55u̝b͍_H\E*' :'zi,<ASl4{ [/8ҫ]"O1 [b ٢CchhM.Xԭi=Ȯ}J6Yt@Uz[, OT1H]С=JpxtnlVLڷ $c$0tiHQ?Gw@`dQ7<+?Y;u!*`' 30sS3>`mlYgFjmEFͼ4qTҨ8Ɛ 5fgn":`M[RD< tbj*s|.ìD0}}` ]P;l1LXhwf<;ՙ)lxN>˔׈|q-7EXzn( |8xpQ995?q<-^cy\/,7RH=q 076TwM+~6,&z||o~%z:9$D6gQډfްkH7!"(6hS;VBb^dCP.fXjh{Rק(a^|ͺ Vۥ:hTb;0nod={xrXNRqPLfz\Dy4N蘃>j/OM8q\zq^`42x<"Ma.PelӇcj"V77xG4AvkZBۡF BlMa)S̩;B^p9ch[_3W-(qBRߩ]="ƥ@gi{Ba-bեXTĒj$)&){ 8&Ӱvܾccq?W!exlR#/kD#Tv4/]2⅙<ڦ5LbOX\:5RDCxs}L8#oy)\PAb48vӐ2-ɴ%9`uRݮZ)=JI(!(S|5YRw$֫WJhhWfF]]LR]u 8 YSf(Ggb躥 %s;!353!ja(˲ewDM^'./@SyZ)S.^A ج?yHڠ+hYri8^R@t?b@F+Guje}L! Tw Ѕ?,(@cH۩KUϰqB#i_K),e#n"WmІTJIyV%Ul ``iFu1_G=O$7toQ~&9~d>u(\vyYts> e.wLh⃧s/hDkauG ~9KBҋ)M'Jϗ /퉫3 #`wTqk^X~"$LZiEp~2K  ej3LSJ\bm5VǺ) UfѶ6sTs*PicRr[$u$i+~%B-V:e@VWDdw@L^8@s:F  Ep V34ِG.=OfOz3pT9(1#lGbWS0  ;<ZLg)&@шQIUБazyMrR:<$(W@h7/" fnÛ ̀PăVO%sHSP3Y PGf+-7YCIC讄,pm'3Q5bj \|n y~G#zZ'Rt?q柌b:w'Zfs'8Vej- Vf AX*y]P=¼PF:bN&n5-r-F30Z )"pKdn /hlyҧf0@3*6i'1^-`Y8;,Q2D>əcKRw,4)`l7Y_e)!mKRULE+yP3N-Vr p;=|P"Kfm!6ź!0bUtP_60dX|8YK[';f 0C }߆ q.TxԦv ?NT5Ij>hOrn$4J.oD{FbS+Ha|uwT"yjdμW@E#6][ qy3 7bQkmB C p-/uWSO3(R9@f8shͫg;6$C$\CݩM/SJrn ꓀!$Prs,xfno/ЊmAl'"bj.L>=YpeքIVqRn!~gnFSx^ E& vѽ,}2hC<<'bC-f;Fʧu!#Sz1Z>Dte8צ y!:5(W`jj]n4l(oc~a(zkAMqb!²`qӲÌmYz3;goq'82}ҶT:uw"EW{=%m uydYNi1K-]5B-/iҎODV&ɿE}^*<Ul.濙YT|K,i8+mi꿒ef|on?wO'IFG0V2Yo[Թ.ՠSuU`b]|\q:=צv*eT^pW`ԥT9كEyKȺ֪ ;πdes' [w]j(wlƚ!ŽrwqNrb)MGjOeF]B|rPD}€J@k2F@cL5{ Cλa0n!r*Ã*~9t0`UaF+ t){=FFʗjzt mdh9Ι]Z#y }.SŠMg {XEpF1n,nNzpIrQ Ö7*w]W) ,p" l͉tBH񆵘cMS Xy3LlƖ9yÊE"6~g ̝勦t(|D_s048>̦vWT~W*`ܱ w?sn ذdKV dE}=qie Ϳ)ׄu65ڏ$|W' DR8+D ¤=u§d?(!:#hZ8tHkԦ6HӪ|!5ݲ]46ܖv/*V󕹯=_1xyWP(?lU-љv![^R9Rtn2 gY,L gQ[>ڭTj*M@ֲ߲iQK}nŞi|wٗWO֋:ߪ[5ش-D筐,7.u֌؜nѭjc(>+M&; 7EJJ߬xry8 2${[fq%:vl枻w$|<:z lvxL-+g1 /]d qגj:gL4@F ͖n%C KPKirX?cŜ}h!!n\琻|7_T iѱbqCVwCL;$.?r7%?C:~ 'LPVn$=N̳;ܿ\=RAsړau AC8@[:/<".j 3h5Uo4"MmNy%dT I:H˔`HVT[i8 SFҷ  V95b}G ++HEC"3Zf:mUUqYŽiQ§hLAdS n\.IMΰZwUhk5Y$8) i|p]#q3d."ʒb ݋ ."ў{ f2 kϽdQC|DVbGD>˓;H#ha(3*lI\s߂lQ Gp믛gPۨ^-hF&]Qb052g^i! ѱ{[*F:rBôX=σ;ݮ=h,kUi>oPSn7w;ov]4lwQ žQXU+SX؞GHZN[v@$2-2C:?eL먀o7O.|J|Mg/~ǛDD@l%S -=LvHEo! p0=`v̪ny/#tp*0"t1P$L{7hU2bS$C.SV0l[X>SP/>yQBe{Z!7K'yfB"TĴ#?G8w!G6/ Ő`\V9":Tejb Vza^o|W!Jg)5FnW4hw-_>ɤ2>ZEjJH[;F[֗D7ipG|bPq/=S{8-_kWeª0z\_ȇy<dW3@ўಛRc(5Wl^_Y%&z}ٶ89wV&Sםѹ.^nشyz.d<X\qr $sY8bFE.9#F[{Le}SX}?xfOJKKgfㅒE*|,3׈@71m֡[=xB-2QEGPy.?K6-x|-|OӻbS.0^KT h,d6Cg#6+br{9>3ɔ$h~}:ܘBT{NCJ涏߼uɟ[ٔ7HTs 9B2ϭen~r1s)WN9(b8 *z]_?4JBۂMSUہb,-;d8u6a@WǠ0Dݒz. yq}W̎A&r%ѫSbƁ H$`i 6^4Y\wtF˴7TN}[".#^̤i}p8j“ui9D i<T=R*is˗ HCmgܥ\`Qv۳1=.eF;?'bd.ʴ͔A7c;>o!%:&c,۠}Uiw ĩ3S~ WVn/noNOEA%K lVTx:;B7i!A P6/ ༰⺰ ->vy[DYC{~L 3ijJ&c,\qF7;2D548mwB}яRZ JKZ ^76BxʪiohUgQչ[![/d(U Nq]ڧ3GRlτ:4mI; }NM(SB;K^co&`y/K^C)_ K"mIl߮R{668n诙jޗ8oޛp9E[sJeȂ0Gi&ۃ214#ـ⮞DR~-aW|5Y$<q"49y3CQCPƋ7G>i@f=]'/$-vu-a5V<]DkVty(ҾQjU{rɴ{hJO 5m+#Z<ռNrvF%6;2B'@$)‘]b,|EOQrSvgX~R̟u1>gy?2%D0,tٔm$6#g&ĹE U5_D1sïWUE5U"ط"iF$wBfNE -5Μ>TJH^pv1e`<@ccVS &Qky7y̦ "v߹uy!}0m CFw HtFb VQEl49Ow,FngGh;3l@+GŷXwk頻0w.謏/X/uNK4 crs8n>Sfeǖ,|?oSaŪ=Q3޴ TG5Fneg O6T}$?ʮBLni 0xgI2XhlȈO FvvG?SG>R[A\)trinگ'Ԛ;婝Pd<:GuQYrnL'a`7ҷ@o/4<12z"n!孆*7("1TmDa26 B..{0JV$=‹PD<]F5\i7ed\ $I/c 2>"]e>r7F]:>uYȆFJ\RtnzgչP@O1IJ\Y$jk0) jl@f)l_[ o d4y>U,{+%8ieXs@Ӽ1՛-qWO++MdnooC59`4`0v5z&wxA|#Ǝ&%Ɋa:q+QG79=)~6bi]$ƕ=t)|Ys!BƾǛƃ<9$>2K+L\_ߝe4>QlH\o2Gd5`^_<5+xGӀ:(3 $98.@ _E4Ű濄fpt((>Ӹ}q 86ކ7r^#oDӈ)LZ0z+;;-SW "]3#HCEӓl`SS9"'/C LYG7n{.GLeN?X׳xdMN{|Glm1oq"N#f#ЖQ-6ŷN:+mhg *ow$";-,3Z9b{W 0s~Bdo.k4-멬o)̧q1e կ%mP%o;4FWeLbWɈ\d_m=J~ СKŢ>8:_o;c78CX_]AF-R=Mņ`/X|LV$Fe愐b=ދ?'/.|^2KCdSj_<8W~]1P3ewbC(RL[ 5*X@. W2kÛwN7`f=@}N)0F¸/=hV5S9іL,#Y$Y>h-Xb,~ s/2"v 6f91`u5n/1kRt|w~E75kߪqn(7c>0yU%)L* E:௼Yvv{=A$_u҈RF5>F{$uN[PCˤմwZ7TZJ(1~+yz@i%ӾƜqB+Q%Y "'vUr eAQcNwG*%4f*=䞳ZnK3&JZ&TAhl!RێF,,c%]=#} <릷ۏ@^z[D5"t=hZS0Rx=IflPDLO—NhؓR|J>ѵ\OcgSڃb??8o7+z^p(rn0),,3aJs0O{RGup;gi92*X#QiJ*Xe?J2пg>DdX-^ˑPIKɼ jLrŁtX́cIEkk#-zhI!v|Va*TWd#ak"J5DQsZTmYE7tDOz'ةC~ H~b2t ](B/:?%PO`e!r-5E._jzu'X&Ί$ڥeAo On">=s|)гt  g*4?,APJ膁w> Rs{'+}TbysM&w?*c*;*QV uu넿d?xx>nWt\fjH7 s+j{-})z*"MPbFp=e/x%ŲHcE=X).I )ԒtX遮_5;0t<*d6QA8:_ m8dHlKi=1YY,I1Rז\V* {tѥ˦_f޶]QY6. gVLv4keoDP "&Jn[QfE)۳^T9F,DrS@ @5hG>ܱCpʎkBŋ.u;\~miKkyY!~1}`q:*3ALeRk/~2MST~zAo1@kz!vI=NMQ4nA0LGٔj,dm1Ɍj/K=cs" O!WM?Lm|o@:'͕G*-F\ãIWz&59Fi#]h0S7r}6(6]kEOD(SuɎ䊷-5F Gߏ+O&|CWefbYG*?4auc| V 56"?S|&VJ~]Zhsk05=+"T)5*굎jZVgqC,B͛[6ג\(pϻT ڦ׭|$1H.f"A'1MZeӵACU~#_Āi!e[n?/;WC(d$+_ssgz‹8Uy{1j45U\I8]la5T^Z4Vs|n9\Z!(l0Ʈ&Ghn 9$#8(T_ 2ױEE:7nk9_Ai뾅Fjq9֬gմɳ2=3Dwppρ (d4 uW7/FWGzoDK30pcٳ79:Gr-,lmv#5VO"RT glQ .Ft)&\/I^iY:"A:bw3T)-ڛ^j+S8aIQc{3/"QWT0%At}Lx a,Ht`p(z-q$ZʪYWK;*Ԙ[Sc&ɩF'-X7f2h};/kqyRI}^RUf|/r\yaZZۚ2fYβT3v6Ktpk*~"tᕼPѼ!T{ީIiE#`DYȭsW)0ZХ<|K^`<sڜp~)ˋw!fF$5*cĽ"bibof^h]ػBߔvk@tgyV7DsZcqmѨy9􆎲[P8wext?UꝐjN022KOHFV~ر2Scw:>@v}d Ж0OJWx v2p jk_$L fiA/Ŧ?5!N`hsajPuV+ %s']FLeYf#H>?o @-Kyd5*Aʙumw.joH藍|3V/aa6"`%w}ފmS%BFL vI?#Hٽ rcv9Z*|Lrꊅȝ+P 9gW.i"]Ȳ3([^}4 2PoU_Bu.6RBv1iA]W/VIz ^^ƥ }̉D?%1@(2˻ԆqoEJIgr0rq R3iM]2w(5"VZAMO%vwӯ'sPF-\'bi''7$Di +]@`6kʞZV]E*r2+5`,_qm[oGTɖe5k7 ƍa/ +JrC?.(XվR.- eZ{V# vEA>ZI~)shcEp( 6|Ka>.XWKB+ I  #~k|$$%[~EܽQJp$T(j&jj+ GY{,6H%HuD1"B֙;ɇmU @֕(puY A~х\T1R RfΩS*LM}G"nVm7:XUDh:CYXǠRO˟䒟  "pqNM!MOV;\ǶL4 _FOρ(P4.0i=+/CCv67YObyiWwrAWH_L[C}6;v ?‹c$Q |RRњXhlIe]ܰVRWJ-tkCuzࠝYAhe6zɡGju'ZjZ"ߙ`<zQ,p>vS6ebSL TN( `U/ ӧ"-ΈwƃwFI.2l#BQ-'o?D[ tkd$Y(ɺZءX#j6Ѡ k_M 들D;dh ψ~f,gO7= ٥`LhbWw}K,b8!rxx&L2QkX|$Ĺ?"k: IC Ċ r ւ"sH\A;[hJc& ,1vIO8ἄ`bDe 2ka&] XW`} "[ MjD-BMV41xpFvx=5|2$ҷh ƎuϻÀ+{$)U/|.TQaƻXg7&4 ·bm"ze{g dD˙*L)zotdkb9ۿh_KkP-^ǂVݶt ۟lœkȳd'6,S%U\8eg7Nv]uLHWk ~ rXɔ$̂7pJ;E]꫊ZamW3QW2j!y/+n_wfzCqDvbu"I jgHE$*zznDe4'#@(ْ#{q9TB+Nv!AERTG2GM N٫}k agKFB W>o1AީP4 3ݷRY'Iöo'Wyu 'u= qE'O`k(׼\ngD+CKw d2c俰r)#F .hj-V-bEZ)hO5#\?'S\@M҇B!6sM!s-j ״0#y뮕*LR{R!]S?lZ$B_,A\!Iu?)'c˗te-58xf{It#ӧ ,9> ֨=\Mvsm,Qvը[ʗtr ںP1ѪQiL [ ?4}^Mpu^eyw7s(8o$ff9Zk虄.JSKho^iz7Q]2>ao3 MP#p3M?F7\mɂ(7>[}0XDխu UClhZ{Âl::?`kzAURCiy@,dy[LUZbNJ3di:j=@yq =p>΍Ĺ ^n|c6n.:ƚT,rձ3 DN)SP꼹DM!x:HJ6:4.kty186QWcKة6)^a+Cm'.\қ 2!*`M=ދ˺jB^֢mpf_MOh,ehЌb ~998qY mt89X秅ס(,hsl/1A^[o酺Śkj`g;)ԙ{[_+sA~KS`JU#7yZ~w%**VUK9JJZxůߟF f2WZ9]uziS^GnO%-jn&-J (Lz3U 6A%2NyT.JXܨ[),T̷W?Bi[uz)0/E#m=SO O172boG_J[Tn}9%z.ċB?#t,?*cl~E6YQp%Ol?xkbӺ[LaKgʪzD\fBX ܝUP[_d&E  'Nf (.*Cy98:W~Ͱ':Ek,"3 Bx=}G2*#Ozss;{\ Զf$9N*c݉'gqYи[;zt4}`^_n`TA3hQޘ<+gJ 9`(V]\8g\rpQCƖ˂u8sFAV8oS+oG~JV[/g EL~ڀ+?T8io+Rx*%YahШʜN ]U q)2 ]⭿z<zW4s! gE"X~5<捔g=FkoTF,] A5܁8]#ܸۨ|d? "wo:%}M!iCھ4}+q!\Rr~`ݗ(;O}&F)cCm^yfP{2#(RL.,ڟϷVC$ۘ7*΁ dgV_S³ԓ& apω(OʴF돌[кVQ6!i>SK8u+'h> u>Ŏ1)i={.A4}{i07ܥSQ4NI$oć+ Ӣ.PA߀d棶+q])4ۺhϦΏHCh|1W8;.+9k i 'C{:^d"Ä/ 8`D=n"Yy\=B~&GC۴˜w1cGZ$([If6.14 &q9&{ Hmoj~#HYwڋkrYef|DM0F,\`JXT/>hhِcsjqW9FxۙzB `N`jkYfU[@r"z~xJ.6:[wqfsT,П+'FʄܒeĮu%:W`m']8*v-[/QΚ2gqUo $Nfte>b*W![8 ` Ҫ&ԛJ״鏝e-gyB*rʟ_5LjRk}$ KW n(]z_mi`*{k\RtTSܕv0[_l7`} 8Ao?z.h[~}bz2-O1=dKe׵;nt?OYD5]\_\E @5xeձ.̯XUoZágSM0D  =*1`dH'Q*&N7H.ZB>Qgl_Я ص=-Zezef6|6:jL85Ŭy2+Srf^Rum_u9E 0b>T1n^2z9}p TȃiRIWU\޸+y / ?[Dn$&.;"~ YiuZetIi_Vz<5>Ie\ Va #@a" MʃغǗg4*8$+B&@l͚iZ*LmѼj<(f̦2P7%*N.[ ^#8&lw5u<7ԑXyE!; 2e0l<9D>ыV>a +Sx1pF^aJZD\*|H .*_:&SyB{;;FergmcuS5y/ôh<kZqK*qyRΈa>sd,9~dƧڣkqWصB1~vY߯B`¦o;a{ ھv[|@TXY=XGG;cu<50)E|DVnZϩs8Z_7HFVzIP\楛w>CW*|@a9y7:#7V|ق-ڂXvE T--*0 麌k< 8$?*-w - ㋷ΚVqy?ʩ^3C~l,8 9kVѩ>k+jh N|{/Az(i$ n࿹w6}#J-.s%K/CfaAsJym([3+aI;bjmqs8`w(JC@.gu4YHHM02Q{&Gwd&YFm/}B.>&|6o_ؼlK1-Jt%ϳ|j_*q%ox(K񍏬̬z0I>O;E@[S=,bиDt4tvxTԼ݋=ȸ !WJpU*ii9`,ƂqΣ^N9-1{@D1W$ptA@mJ+85}2n74H(OPSRc$|W#xT18K!7VC ͇}]`l.iRFd)_h6>F0m+51B_[R9ֆXDX3ֆ)Bن-5]nr+UK2]('# SiP4-IRwY[QoM9jz!FV?~D?KFbN||2=a<}ˋ$:M3 l:x%e{Ӈ.\M>0Y561^/{v5{ _.dk[fvҿ ]Y140X]:doHS b4+>_*jjtAK} Ώ"k/̧|è>L?HnV@-,l5.*IcO9LVqcf$t% RV1*#c݆Vgy:qwnlVl6SuEm \IS.p@-t 7)↓OX[\o:Q+ 0/g9焠a&w|q؝SҚ N7&,r-X}='\M>0l`BPfw %Bke*n5RnRUD6h1 huOL@2#^=PEvK!q|/RXEtG)ʃjGY>՝TMaiU*X!yk/ eifGT׼-m*E=Gf:i@%i3MYBhG||ow7{ν)U6'ڵF <[%G7L7ahwf vu`lbHCB/k =gmø48@<2sڴ ,ᴦy##&||ˠDJgh pw.8n)*_{.Z|DzdMmiۂ?r͘z_f}}ǚ'(gSD^E0[JYL3-`HtҥU[>>*o7x#CS:I~`yޗŏ/VEC[b2 (;G}S/|񁹞+DNl:Å̊06rsc"K*0q 83HYXdkIqb eTFg o5#lx&y]n %z0⨵|V?KăT>9EO,ڗ3{\jgQ~:Xb@>TuㆲI)gKI;F.ΰ[4J֌|b'WwQBb\HOqa :kd5QP<6*VA%1 6M-b:ĥVJzSf 5婡"Xq YG[*YB9+AF_: ߟঈaPHlMH`8J!G-DG> v1d`MܖoF%28 Ȫ@,AO-Ž ?7weZ[ a3C~DQ襶|8tzUyO7ZC̒ ܰOgHN̑' S\k$eJQ1wF6rT<jN80RHԐkkWge=%M54#gAhkrbVڡ@d,ZS![u+@Z]kyrZga x{zέd t5K孉X>|hMj ^/_5;jAwA":CqMwy"hK"!G !h#0=Qe.W#h vqS .=YDMOy%{2Mp19rn-C[=F2C85sߜyC x c4G-W:R^-pgq]њȸ0m )&1O5X1hMo I@)XKp$&LסFa:mn\ZVľǠ~-N }zcaea%a~tϫf(ʾ!H1i@fk%DEhpe0,&z1n=b͐{ /; \1l4qOsʣkiVD"v\$RQ3Q2b0ɛb44(ydpbjzpD} b0|MҬX ?ݝ$V/ 9{BIaq;1Jze5#bT IcU?8*(8ԚDhsuOEVG}Ӿ?&L4;>/-l.Ъxr~j?~0zz٬cT؞y6ͺ4K7+#1\On)*9Fh oKbr'0ÎSM"61 /g1c[1ӝ]$6A guOWgx^>Yv !#"9~lY-?[^ j[%-x[Pif&C:}+iANp1g9p~AØĩrA೯PTu$xu Ĭn6GhԺ-ݲj{-2E; sV Â*r[&%Iqs㖆DrQY<.C69dͯFl?HF,ۏNb=!J6tEo;Gkbx!՚LZ6IgY)&|m^[% t2 (?90J!Ϻ(LS|%տ"# " v8dDĢki U a9ѩO62M.)jb D$Mq>d.ǧ&15J^N*Z3{EnHC 17b',Z%z$({uOZ슥TƳaO5Xgl 1kے]f7"޸ݩ#R ͩs/N y~ ?=DG C'T!C3=AWD1x}c͑r2~ Kָ[%fXolЬR4Sɼ c&O;q4O_mF!Єvc;4t&ڹD&3,6d7Gmr`*Fw9ǵX e:g\ɊQ%lkd9!Hk;<_σZ-a\Udr©#:qYjZ`ˍaqG{aP  hBI3T2[U돶q ܱo :WlɵyQOLc?.CXoNՅZ8*!B%~=f/N6O ,+19W-=;F{@>&3J`]WVR#qUZ4$8N]8 S}sG8Jf s;v}5@Aٌ{|MC [^:}ЌഌŞXԳeԭ1E(@wj xlR{B_llQs[Տq{N.@Lw8Zq ,BP-AkWOz%^O^)ASHA( xcq0mpɹd 3}yj x('" o{7wXUɢ9 Kp`?|g_C3m!w.qn-%.rFKիl5V!ucVZ]fYw8Qػ–y% 4~"_Fۗb5LjvQ-yYX8QJ)z31ܒdlK4]ө!E8IDZ:A;ү3[)O,0AĽaNtly/VbD5< JJ$Ƴj(\ÜJ֛HtHs6D_21BNԶ2r&3V8*Z?"Yc7`+3<@^cZtc/JKGEgg) ܖ TwZ@zط-qʺ1#AR\vSѷr1 g,iqs<(`g~Ca)a($o"DaZWh/]:J{.j 0^Llk1 Pg)P{z"GtySݹ٪̳k*߽LR 2l>:b+&̞k&T`ZhnK@!Q`ijbᇽEda{KKeD~ ĶXT'$X{m*CO}( Z4ڷ|luՐݨGl?9L^qaIUP8ca?fk,e)/2?u~*S1B,_xz[nt|׬8eyTL3 NepZM\զ,:S( Ƒw:Ay*=&^4q_9xsփzNc!ـSm l2qo-s4ɬX҃2&%L( inw*Oi<{S7xL *h/.տ8͛#^)%TߗX)P 31{ <@Bw"#by'VR =$ /7pP ¶ €EO:1ҦP J )sļh֢xf;9e?q οqGZ}nQl)цs)521|@?SXJbtaXkjYyMx&EHכAҕ)/, 4_p1v}%W4ma{ue8DܩWRp`~bnlkS:xkeFc| g-Q)r|d+W>k@VR__mhb ?.6GZpg굽eڱ>~w|rG\4&s,0pl 7˺̎QF*ڹrz"а&Kh~$4 +%2890Ռ!:yl-gC2EKA[rĕ9{q콸Pn7R jko@u - yjlg*ISK}Juɏ%3Nc= !h2j vm`(,{.ETWDi bAѤ'r Ng,ʠq=%1 |x[UZ@4cbZ{ PKRItl?'Y_9`)b&VF7: $^]ze*Aػ c*%iu{a3C1€Y_Jv<%] ;cDCT-PH;~|U*kK+nӱ2DNG^- NM1̶LuyaɟLMv9=ЈʏJJ9BarYray6}sQs:,|B}b7yJyA .-mw`/0!jo|?!rsB# (]Z&84utwq p%ݲm&3bkbL& FZ, b!_UoeOg_E Hx;0^%"IA) jPS 3o'kُKeI[*PkJ%ޒ(Ndެd@ĚA$/E{K*㷨.2oȕ{D]W͸# S|C$dT$eՍrtX!`M JMC4IDd68MéGfV BtLް&ط N(\."=X{G0 !zWrZG=`${qcV*tU@%1jح9̻2EZ)ᕈCݽO XWOǖ-HeC<{T\;[̪;QU֚) c5Oݠ&s^Sj|n'nI 67q{h]Ҭhcn(#w$a\exZ]OVwZ+:dɻD,h@| o.ejx}φ/=ʒaP– S0P>C*v0{=[|{/iTrV8z*vC^['?),B`mjGgt*uJ֤KH- XE!"iB K. q9gS_L}h$}BhMT,f?~}|)%́=ܳ߾;OХut,:@?S;FF>z iP#~k%$5;Wxܕ9 lVcE:9i#[]1nf12XL1׶#pBSG 30ebo~Fʳv}fKؿ$7Jw-̋NafJ>'cRrg.)ޅ~FA)w:mITý9Йctd%AqfKyj-lUI;.%*5 р_)b\@k);勺Cľ %DyBmx wQm3M=v1d\q{If vzc :U@E"ɮ?#| :<걙C<" 2!qW':xOӞD1~`VM>Aso\gێ _'jC=w3^F VxkΌd?D9f5Y־w? "~ ? tT2m܎bY%)3]x]%YR<|u9aԲnID bR;8BԶ,Iq5%1> !Ls+Φc\7Ŋ&>wn%"~EŸD(eCծC1uRrPQ Wס;mWoA`'pQω9C00i97-D+" NiBE`_F^z;+䝰or=5qt4&V s\B7w[8h$|ㆅ;x=Wr1m.BvF;n+Q*_P* A>(Ъ3N[UpJY:RY]f譠<9r͒֨oZvx#rT:.b&ꢮ`T~;w ~ڈŸTM@JXRS:ވ9rrJusGB]˷z|C(^7ʥ+쵡k6+M'[*Puml[~d%ѱƓٶjl/KĖ]ЋɄ+be EX46EF+\r0MuъuhqJGZA (LU /Ql&4?hpwG  5#%RO *=#?h^0Z/R:'q4:< %Qwe7`)!_gW^R6~0\i@\fxÝhK~@IZ$ɀpӨ٪()>jqo);j.9}=65),"ƼǑ'{έtFD3/Ѣ)0 :`}]qZN- @9R-Բ\vFqSmh&iPI^,d(i>jM_4#C{k(!ີ[-o*l0T]G@*5Rf7w٣iٸ^FQ2#M3o…V)aPHlVDuiL`<ۻ27M܍Xď0 p/喼)Ri:Έ@di[ZyH ֚f'8lT`08 hH4I7Bf48w%1SYnxL.Y4'':Mk1vHOE9]}{F'ܪz-BC_-UW}֒aP-_^YF0H}4wzR$h.:"˵ǿ[;_.L< MKjWrO 'Q3)b0SfmwWϲuK0k׽K}/\ϳ1+^P6=fЎ6$|+-ɌҜ}RYjp #,{2R7Pi+eڢȾߦj󰸤`lϺɞ)Sɓt]3-xRkSυβm 殑с5a4~-&kex:OaxaΝ+?c.p}DT|7bJ8ٜШF H6ט<=x^x!ў(8fѐw xNJ=Q&80ޥB)"(úyOnm>@9q2`=ڶ~/TI5;"n]M"S}=sаUStsU $Li)F ʜN"ԋɜ2z}h]4,%[lNds=ut/%ǓK9zo+zNQaH>ažQ 2V}=YAˈՎ<0ͬ:mi%´Ul>e@Szvkaː؇!ƻ6(*X+n9X6_Ex;\8NFl`~OTLqW ga4 bOۇ: {!DyI8YTvE'yUpŵz.R3*i!^H{3h55 ]B\Nfpc97ťGV(o> T,;:-&u\M/\HnYw(R.tR-cii>P+]#_lMZU0y6oHX0 qv(FFA񱃽ta,i8˕u*5{_;Aԋ1]hCч dKX^܆{mσYJgQOP(->1p!ύ'gisW{ .DT Շ` } wocbfpq+q2;_5"i knḜ|{ԘM嬰Bu@UzZq>KgE2fWAg %pTLˊnf:Lez6pEfBxhV*X`bi7?>P ^і/2@ٌHLOP PRmrV֜Kt`fyZD5:N ˆ`̊d&ϮئW 5dSmn;1pKZj]0S W3{SZF `Nk?ʫFf_`7zB(k[P1tB`~¦gz G߶r阆}20wTIFz0uN[uz]Y?JO}m!Q7kcC~aֹ.a{Pl>f#1?n{ -:A-[aXiub%o@vWc鴤K8gbņRʤ M z*4mTSgtBx+3y.İi`>5..rJwvpF:KO&ƐA I%>R)Saza?h6FҖeWj04w6c kq:*kt1.?]o78DOv'D"u5 snG"3Q avbt:vMd$$B,O6̗YnxHy@(=wDSՎauȈc@셈̇\6׭ݙZa&Is,i8Q96FjѼ͂:u:\إ.ћx0*JM $KJeY̫cPu mvWS*p^;UiI~PTYv'Sf@d쩚Ιaa"C_kUŽoRzb+xH^?)|O1+)\!0NzAUNpQȏܬ?WI2LCZXgjJNTXPN@ zygIf0 o͋NjBlb @!;BhاQ 8r m+.H]P5U}av4 vR=Gʭѷ 1wckΗe2kLMOHtۅBQm.(:8 i/KGtӜ^ҍd1yrۺ͆Z4[B\NN1B1p{DZ/3flOywd=M=6ᵉj4} s1:zc( Gz7*L*4>SG,n\ 9BW'X1nBz/$>ZcK]GQna?ItSIL߯k.G0<LXacxxqj9-[7zYl`Mj:|/hȩC x.LJ@cQb2-%W7Z&9Yv87x;' 1QL5o׻z%qJF}oX.^Tf?:7!V54-aqkF:Q(QaXAe~74zWbNA!-g~h :dcl+:=aW7;y$I$D(W?O﹍Wq8 x.ecIc:T8# j^!) ]j aM\Pe˸u+IhwUJ9Rܟ Ignw URsޏhVa\/e" 6ح:.rNzXMQjaDehXogfSk^ˡ 8V i g,4L<4\Ks0h'FS(@<~ 3*)a#z` ;>NG yQ dV {4xx 9Ἷ7T_p DR:7.y1wӒCҽ/r oi猶X>YѠ1,{{vقV"INzozk))=*t*r^Ĝycܚ;mO.r;wk&b#}HmKMLӁ~47;--~Jh;!c;~ PO*QYw`˄φw z do&J{f.X|lWcL<>Qg-FT-`օYџJhkJ&!TaQ8lA_T'*b:l{4| jCѪ[>=m-T{*PkJÅiM.~f cjSX2Uېzp[rΦdC"g~-6/7O3 .^$23Yb m*a&/w:y*Iӱ>ɝUhhwӌd"bPB?QJqi`5 \~#[̷%F&,g gf'9TGoj s"[\cop@]IMv{s?,/Էyiە86bHOq,K#{¥̜hϝ/Krz;m|dcF&/AߒcdA$qK+[~ Ukd ʈx-RUcU@Sv|/RnnJfkVV%<ī+xEVl KBz=L;2(rV`iߤ0fRm/bJxTjq5R +sX锋$:1ye͆_3pNVq{z$dhUbǠCGX=@y-U(;K*Jٹ΁8׹~1]0 ǐ3"Y+q5E/&b[|xd,(.oQLŜ2bټogk¡-:{!qzGḢ?y"gFTO FٓL2#k5/Jq5.V v#]iK>L#0RgԣhP׾69$709 ~^i-ȋٮ; 5`T" zU_QWj d Sߠ2I猄Sr[KCԱ~,?T N(|v%3ڎô:)&ywx'= ]ّY_)?x (b+f ̗PR\i7P1{F[5c$e6ˋX~?^S҇9Tٟ%n'pnfA窇ׂ\a?KɻТz&u=Z0CB 7sa.ҵtk=3~a< Л/˂x/ƵE;$Nߏa I#T֡+d WV6z'`׶ ZmQLfAw uKbxWT_<(*آQA\"%16~X9({Pr}wIJf`A"I=͍yleJ]PCu{y+2y]" ÓCrCxxu>LYd:2H(Y|R~iחڼ 5IÝ7J;y^XR;~\~R<FH\{ +iNnhbm]Zޅ[m YH:g-\ %X&lJEjڜXᘬ׎oBE#/u_%dl!faG Bx?saY2[,1 si?{|4:qfA&y8hۇ"z$iigz,*6}̽lB*&-*ϫGS'7 *8"k-NJ8.*k궋N|zbJkm_N.CKKg0e\Ui4=hUc)/VYnj2]4UD͝dSQYush5?4Ѝ،i*)$uH'%y.T :.\Lv $(< A* OIJAكM[l22so4Cdf+,\k~G ne+DH1{3XJͯ2 6Bю|z~31Οt}p .L4vAc 9%?j4^`ٹ!#^=bKer?V[i~*I?2WxTn1'+p@Df@#g6[;yzK%(Up@߉ya쎱5HX':K=ITΣŕo9gpˈt^"Fv7;cg{FEDmJ]ETy$ՃRUd] )ZI6Qd͍QWۢ`8RUx[JtW/ Xnl_eQۇh֐I~αF'&y ,b_Zݲ#*: t)cd*Bön㖌KW_dܢ13|<">/o0wxōَڌHCpIn p2g?!n[7^`Jql`SCn(T|5ngc=hT3r[q. )q'$v$*i+Om@ߒ!NP**Tv ?~MR9X-gR9S|/Q`ޓջWTj~ES1<:4+~[^!- 5 ʼn 4d%s%Y{]$C94+ibƍC!d /]q\J _IX{FEP1q[)_t_n ]ZbDMtaSxw^z Bp'hoHUiVbRP.V y١H^1-mZ|.^3ފxb-YӃNt:A2;z2Cfܱ1RToÕ_jvcD# ?U08U%2ac"^2dza&o.Ԓ}.M6WJ tŅƨ,]%"?eB*P{fU N+ 9l$ N}J*ݓtnי RȯdfE^7=;tEy-&<*z)(l:PTGWh/LvBmmu'pJ=b.%ո|HpvE,UGt3a˜OFU0l&.č;4#@Xkd ~%;%ۈ>9@4k \1-j@{ =5=Jh9NT yHOזs&{/olkm+KUtAU1I|8bYHeƖ3k3.5ćrY+c֝nl(.Wdmd\ =|-xNjP2+?;UF9չJE?n ՜^?e^0 `"J$ 5>vxdWfN YP }{0U?Jh5Ģk#"p_jǒV(jcgE"163Q d_!>uQ`&-wBl6uE|"1<؊w\DjIJ2{˫,oV1,#%_:m /4gN(ÓDѤ.l#:֓ʕR;fcPXUo-$`M Ɩv~YN vj:O#6$3[& DLgG*"QEIA*zHi9lf|5G!^GS.} '!ꩨy^tJBs4,'>oߨ+)ڥݼ63Qv.̅e{h@0!fYGvyʚLoKGoIMMNa Nc8X7ĦC1HC4]$;A:0ς :HP7SEq4R-C򴋿BČlO|Kx~%kֱji֦pS`,^Z8Ro)Ta@-,'Oks *׷.qH[VϿPe,D)\g)oLn:$BOmN}=" sS?[o/jΓAԱBhj2iHWąx}Cc";p-A==+ ANpWhD]^Sm% %)ҹ8L!Ә ׄ'jEB@zD×R1leoJ֚^b%O0`#5!4sP!j^ ѫnaMMd|E=^4f lLԍf! X|mYΗ(nB`oFwyd!m-jjSZG8RBbݝW5(BP#C;9,fOcg ?\Be0{PNVZC3`, tl)nZ`U ,!ҬWFs5:؃AY}^h]eЬG2C4|%uaj?D 8yIoxZFڀpZPyO,: 8$n˻`<ͳ>3yt00 ~U$ W2exvfc5hcfx؇*aw Ve2b]ޒMg`|jcϛ}W؊vսIagy581 UkKv:Us?hΘ+_dheeA9> f K0>"!1] 58}/j¨_Aϐg<"DІD:mIZ5[9s0d2H0S^˰lEw+-#UT%I9A= ^+z4CmK-YDOF"ϭ,cetI7#K5皘yV3SY?~ 3A ʱI%GE{48 - Q!Ŗ T7: (s8H>ґ>ĕ@ @$W*JA{E&xAN4N kmSNuXH~2c% Qyӫ%[`}VQX`SvzP(8ŘeVybMJdJFXDJz<7|J^Pŝ $JիgH< ػVܑaI4h8ugP㊤qw=徂n1yN~. {̙EdnBIY(7  ,f1PirvO)+|.kk$G~sKxc7CXK(4RZYQT6=k$]" nũVg,d|!͸5U=uYas2i$BsUg9IĘCk&uI@VCc8hߞ6AS'j=!.Fvȥ8<Gq[ҼCJۇE!d?rd=_i='{Z(=4[oւcd*+y;_-iSWB jr~gIHE],;O,+.V]XJY@*G&ip`MZ/JL]!`g3zZT]]ƥwv6@,C\dcew[ AqNƓr;0VW9Go~71r,poŤijla *E*ֳ*_ݧqbTҟ8 ';gʕNҼV=7CG} p.#qX+dz}I84z$7X?S!B3#'B?Ax`x'b͹ Eh6dx3LuI\haw.9QazK2($w[h8-m;Q;^τTii#k(1G[ۺJ< X_Os[_A_@MF1ۢ6: e me[c\uL OE k0VkJ;F4ES9r)$kD:{аX|?vnhF;pM 勽+[g#)+M%|?|%ι)>K/O_1!~ qa8a q*nA8֖:\Z"2wΈa}JBDK!\n4/LZov$ ?j3K/sץpU5IKKHaN_L%h8R'I4ybew1ș":G Y[{ky@㡰ŏco@F>$4p(/!5 Cۓl:eIs?=}3 a6Hoߎ=W&#_Kanu*B?3GO `ypKtipk/~XyACJwO^$"VZ5|p0{{s`*PCe8/ZKצ]tB# q|C15)іC Z  xk uԙ|¢GgI?]S8yǙ[jQ;A45+?hw'qU ?ZAMLMq$Ad33֒\vLήI-*cT@5{I?M |MΡH F%,#FлtC _&Z+=!Cʉ~CGA߰bG\ J4C9w"u8'X9;s]5q+ S% bCΈt_8JQ@m8d+ WY 3Y4٠Ti{Pi==f\u&m+v6⵩{3:Mq"*G%qoݜ6C`#Z{wA^=*f /-\sQn5D+J~||/uϾc'K d?e[8w$|?a"Yܑ-bB+ !OZ Lgh_kCk_a/(72iW!T#{A=ղD3I\؝@0oM>q|J,Ǎ?I) m!|+0RÞJoQk8cuȅk/.1Dl7YڢOo,[u;[^$p`{}+lx"F2YvkOw,(DEZ6,uF7מ ۝6^2۶sLȌcF4&5J*wZU/(- ̔\sPNL-h͛sG6IT٭4]I3ڼ+zw]K${<6G{ۂ V2!/e2,gy hy-^0G9 gz ?AP?(H 4tF<Gh0~b-E7[IG@U!$zǑz+pr }~QYsZC9(VfJ>T4rfT QfStD7aw^yx7_$o9.^E'aNW2 F\7YZ 8輾0A-KHG>E>/yHd+J6΢Ҡ2dWOC>?֝i%*t9(G 1"t0O(w?05I)" B^w7׿\t[֨&oS$",~ŇWͯR`he2⭻cܵ}r1(pOrF@v[ {F㴺BFFR,q([|rIS*4IZsr-yb_ :Ww֓ L-;(ɠ_L+j;)alk&s1st@Zݘ BK)2OEjW~ͮU?kbg+uƙXs1$:\XFGk팀u ^=JѪ4j%>3zʚ[Zc8NyFvv&ء(.ɣXjNui KȼofYt[ێwx~zGٯ ڢe|=M2;P/v*xc sr WXoW֪0Wxw[\_x&Cݳca+:R7APjl('>g npqcT"Pdmr>kkm+ts'%?#F bL\P2+j%sT;`pw?^ w$woa3@g*,|꤬/Gdxd()&Vkn&8}Q0A+LJv^7o+)>4ƅ֌a?NA{Op2g:WdzRs;{|Ϊ+!A@z?:iK@gR+ Fmg 3sTvJ'l("J['ZB[v`·g>T: _76rR#{:->Йs݋ s6) klq%_M05XJ\\1㦹 @0 AN%w0>LS 2 ݿ>㶿8vnZ$YSiiAsNp2Ycn#p0=ϣ )y5~ &aEfna4 :[tvzə?H+6@T?PfV#M SId}{cf0[{cC өuy)Bwj`c|~dqWFQǠşU=wZwiuN(2ȭDcE|p;ÖcԄ&^1Y7O5U;p"9@dtC$u[0=H-'S'u?p^*GF }^vx!qO)GCc" ۿ+='܂oF3Jx@l#]HKC0 أ7w2x_rf/ɼ'6fECeliXi\E}#n/!ֿOpM6T,9k+5 5D67 :yȔivש,r9>p f 4]ǟGb{IcfC> Wzf'[Rl &EtUO]+%}ez4~܎3*~l(7"uY<[Tnɠ攂GWN`0lPn*˼+ `=/A,}.egğ"P }>V&Fs_ښҕX':H+qS僛 SSBz`ѱ%syoO_]áNJ.j- @ 39-eW\;1^/-!}ŰK Rx6OP#}!˂9&c9QBx~O0G0x l f[g%6tl?E/V&xu:&9F, s̛ղ?ku=jtC>ðmdYUJZSdۿ+R6@eь$ t,K{RWQhm`uy"H KB18BHlf Z>q=R&O4Cb}6TD[j̶h}D$Tc],yE>%ߔV =GH'R>kÀvY!^}F8b 7e97һXW'=\Pk \Lgssb `]<T j)wn~[яvjKE$ a\UL(]fG}ښ ,%*c_B3GzOĿH[3P|Ia,X@|8z˃6 yB إ<+(z⊸k[wKk[t !y.I @JƸzʵ4y#W!㝛9<.ڗ+@M tyDL.eA8,v8rtm4]l-~ \Q`!w;u\̝Y>aX:C{]Xp4Mfx=.B v'TNZt\\W]HaDz] how[muX~&OcǠ? ILeao"ɿ7Neoo * ~o4 ůAi*N2Ij3 |;0Fld6k".PC@Eo^\>]_;sϮq<^%Yo Eih?H.RL;.ϛC%3v'T0r*2t..6X2Hn즘9q{\j6&}| C )=K=;Ovd)1=M4xՙxV\*C!T7&`[n*%~\{YŒv<6c<76ؚO=_5&81T9$6qbgR&{`8e z!f}9݄7" A^·G*M8sn7^s7×{-G$r(l^CIu^KL]0:{|b@T"_'3!h8dSG<2/)!jgxQo8K} &*ʿլ:V%/OKם~}3;]cN5vهN؍\py߬;C*3X=]I|zl06Ek[A:%!tPsJ)#?O4]R1e`,u&[*ݡ`m>Ƙpx'dHOSTR4+HIvPVsn~7v3͆Gte|mnZ̹ O֘RqB IHm#6CH؝X[qy vB5=}Hzᔴ˻.GL˄Ytk+2&k3N/C!]K6.eH W c E 1=ǻ41!ϹNX )!:t ^e2ʔVBs7,hVvk~1,@;}hNnJkT!ϴm!VGJ1x,9RtA{wAo,VE;O6SMާ!eUׇFo?CA\[=s;1M9fի2G)z!5%^sLt&̫L/2RѲ]5!zͪʃ| l-.yHk;d}l%.BTbjzbCϻct7>oۏuo@Gc!CBxԯ PuRċ˛G&NK}'iQ"fh%9|s_1oSS?%y-0~H "[еq%%(W kku)]e. ]9q,%# .'5W'6ߩPVuP+F?0٬!g5qdHs /7ΜEti2vb1`Tؓy_H싩۩[G'br+2 (* РOWwt ZDڱ$]f`y&S QvC1啛}#/c8򍰑 :ϒ֬l2-^=j*'s=hB]cdMz9{z*SV/rmTOF:uޠP\KL܁@`qNُ.WbR^FGYP{U<ɚm66yntI<H?jD<ٚ2T:%P5nBC#|ˑ3QdLh~C~$2(B˲DqF""QKA%R c>ǬJ v)ǻi @<.l虚/slT^:o^D~`>T#6 pRH:F ( Ǹ 5S+nWE 0C@SlrJL6Q ZD?ńh M-Ƈˌ&ƫ [$C~ImwQ@Ӝ)j G}j;['i 5~RB(q\w$)aOǀyf3#FOX F4orV,\`TּB[' $`{كCFv2 pr((j8̘m.z.#Lwl맸3<A^bo:y#ӴAXV Q?*"\z;{uְ[`lZ}?@`2udSp*HuhSP%1%n!T0&:Wy%*fBItO膹 JJ m=K 4Dv}"74@⏢"\5ݝLjT1V^ˣ%,$Ht0+I߯U)F.x($'d+t|V:0ě !9OŦOCuvI}. Ҝ%mWi5͐x $p?b=mdw>ӿ$Ka&HΖVY+ I~X#,co;2c`|gE/5ۊ@)wC&6 L,VTea`hnꆈGٜ Gm :ӢùPDžhоEW2ߑHP,y5 =-F3')'ڊUC"sWWu_vS#$DH^SZC]Ey=y+p7쌹<^CPiZpC;Ȫ詋:7Զ"/1[?Hs%B3ź=LA`[xm@}WG،M\鵰kz=6%lASB`p3HXݯJ]}m#v+eA_{!e4I u " nByx2\-HE{dM%?}A˥[@>fXt-6[cK&*t<9hcC Q սqUA\6`7O33UBUHҽthUcbv߸3 3j}Y4 |A{![Kp3w 2JkS[tVf}&1GtA^ < $A| }?^L+rؼ:젖NI^* EzEG!yZjv({w/&?Aز9`fź@Qђ]p1[L.g&3Jx5uhx cV \k@~dxt^7l[:mʊ]9m ?5 k3L7,BNsouEbB8ʬ0g4J!IWzďk UO@G4K^Kp!.)FDb ӨP)K7{Y^W@* Msh%&Icq0_EJd?@?˱R\SG'q"f^8尚),?!͹)]:U;LN6ǍQcW-mSO,FB4>1n!Y#% ZAn0LZg BgW^O'@g&odIV `NH]u@o]l:c rLuw|۠0SqE6_';$]‰R ڭ0d&Q69`uItfP{Kkg, Dzc Q+W}TZ;7],ؒz/mZfP<>t޼Y09k3 nr=ǯgsi]}38 N ȣ;H4`)QO`5v)|*?E6oLh aQBɦG%{U]l{E_ gRB7 T2v8GpqDZ 9up yvT߅6CF?:WOB'ˢE\#Pv.`vhY#kywKU}%}e5yB7lhWiʑ'# na.AN#%~FGO6؄ʸPC'b`F/"s=7H{-:#|j$x$;UJ-! 4my*}&> ,;c zpuFGAQ5tE'a Սϐiב:@jCeG-BT uo62dpPI<ۺ˵[ks@NDg3UIѵ[nQ׆&\J佋خQ 2>TZY-9¿pgq'VM"~`_~SY,ג[.vMFPe_`Z{,m/AMMU}#Y jQ;zV1݉sV 8\[ꖎ8#K7A]4,K 8Q2_4GhƔӡ <:`}M7iǜ=NY|>a`ڧ)koZm A:0Š}qOa` RyIxb_l6Y hΪ0HDLfCҺЅŸ=`(\r:aﻤ Yk.Μ2g@4|D$ŮF2dM'i,ҚB}w1`ɴ4r/@S1V$FG/fJMܓ̮D+u莐yna2ښn{{6a5c/DX!Hl2ͩE6~5p~j-|$Z잆:vz%CƷXo~Wg d##D MK~^tZ_Xw~!T)<16gKYQ7g9mKM@Zw]5H%Fw>|ν;r1nNv8 [J/ʩE7LfW pthB1ln{Uo}£t8 oHT܌6Xđm/:Qe|0—P.J `ʛ#el+F=~ĮԂ#NL9fXLz2'%jjaSh!mfG aEOEz¸hC]?'mh_$ jUͧu`>g^sS>aݿK#-8\6ֿ# >ګXߡ䦠oBtUusRBJhzTA6R85vNLB~W{cly t:M{O/]J%]U)eeϔ'JlA;m9ya?<0O2`Z_+rpIJG&g7cx--ć.'#E? ?z!'q'mu+J2]^9͆a|/ MapAqJyl4d!RHP_f'i/\&K͏;SdIٓ8w/HóԫI 6Yv#j K'cUAn>ZIܸyΌy0킮޳5Aeҥ~R0u؁e %|Xc1pg dL:.\Sd Rm&iǫJf駏6B|ȡb}'#з:}"̠~3ūB PyĎ=tu@7Ld"Rt"’ev(!`~~38L݊ !t޻?pnu{XdYsFt_`ZbpGйBY}M'64PNobzYmjYVܶ#C~JlIrGyTJLNil%HN^-k7j#@B fL$x^ymh,˲6LUAsdk>cQԸ/#୓: Eҟajڵ8ѷuK̩z|Pjı ߞc\`FnBWl C[޵[!>o]xE2 PsY bHiJM bhɝ{',f\I=Itbtr;_ ?<#7J<ü <;cLwkL& x-=Uj%2݌sXu;Q:CX&GiXD~`[ ,MsBaQQ íe~oڧdo07`FlIh0dުA a JocţT4fLvsR#_kxSI1nt]vH-9B!lB XzҞqfp;' @/~ǂ 휣^z L{U9]߻=y4V"ΝI3-jz>]*hQOK+J_FI/b>}ffU\>&GyWŖQ_>xYfS:\6'ew{@x1`MpN9ZPpꛖ7t7#P90*H4ɺ-|ӡ@*SFFyczF$j8F/r5fhNx62YI;P\!k~*  )Jm[ܪ~=f |P d*<4E_ yb#buV:fg"1>i5:hm߽@c6 ulcoo}:|?:@]lRwk5y>a;k64:kS2>v|nt#ňp'ׇ]CaoOY9_|G?p(qJҩ&?USh 2K!ʼn_$=v'nO@:%w%GagtPOT̀[jͱU7nzhyt:`W9֩*)DU}eOpYJl N)}+B@ @pA^94 @d@5#O>,U)@~7>TM6̧QizYtv: p%+nYڐWpWF6ӕ&Ԩ_ʗ@9.E+rSU}ϻ/CqI",`4`Z3RDCjC *QbOa 2;JdƸc )';qBM^

e'uzH':\=5:~X`b Ђr lb8e2w|vA(PΡ/8[T91j4-V1Ѫٱ9B6:zh]:_܋M")S u lpA=rV9ٴm)7Uvc^ CۨB(9>CEOERWK\ZՌ*=E%=5cgJ-f8:󤣜2cB$Bv;Fic-]Ai4K<vXy4yzԐinHHFZ}9$ ,q_/1ʭTG5N$EX)M?;AK|^2ge'r϶{e/L ;AXuҢ_d^#~JwJN: M(oaG+b >4o[;%۾_/ɇb O̬ vZK-i)L[OuQ}ȃXCb 4}g4Hs9uDf F[߽M{W&ǫͫ 3%B$,`$1%#|r.$yMچ?X96zN1T5|a,wϗzd{ 0όgJ;2%?j߷E Csi?PD`pj_M^z$ѕ!9q}in9[?I2Mٙ¶Sn|R?ř *O0.4g= `GXa!$.:DxdŸӫ[q2r0? ,.#qiHʶcJYn uC*f'o!z!6y1@LL~E=ŒS|2bHžqչO.k P{!t_TI_6!n5(K`|hcwKSc-K'[cBB A#l0_xwŨSM |n_޾ÿ}O1]%hu :1k^F -EbO,Cs?6TBIh&y@y#ietK ؛FT;* Kf "v3ݎ#A6mcb.½_cFk2X4NGP VףaCݍ Z kڅ{и}!BTUJZ^=YwfV/6e1'U8\T~ dT6gK/CW{Z#)oZ?D6IUipERi+,ݖb[+Gv&ˣ( Fjl?ah5~q\RIr;h'ǯJs1f*J?f` .O9l'*I3iI!G]>sH?LaD;M odrKHOCHɨFl1삱`&?ju&q:oG,!̨> (|j9y=~L2f1qkzXRuEӏq)8\dRRd#a~jmYF)&ʡ^dmzM580pFػikۉ6F2Z G "EװɫsljM}PzY(@[}BI(>GYR>9 [4K#fw ?Fә]7%g*D:HKAI3IQ7c܌ƪZpl0ilԄDaDHf /BQZ{<h4Ҵ}g8AHR!W4)BAS?^[`J I;veIo!3˂gw-}8,􁓹\korӠ3/tN҇TX'{trŚw1fx3FnTˇ*3z{q OvFdžA69Kg2J?ҧM6jv0ݱ\]t>,`rImԵ/!u {R؄n+1ț|x8F!|M~a -h.,<rvܺ;17}e[xfR@1HojDQOI; -^`)['5ܾŸ$Һy0~c;pWLTs4_gqqP?Mic)׺ 锢/5~гOjTw&V%T0"{78>fmeñ&9zV,8ۉQ3 Y D渳Z+&gN`Rq =9\ e+SCc^ EuIbn҈_5gh17%p}7Ik=nN\VCUy1 y63ddM L_ɺԗ3l-)фz8FL/җ oЉ<ؓdAV6K;Epp˚K=ՑM їosl %/5$dtׂd䇰>f18 E\S686JSӏg!L0P2KdD=g|Kd>0!mjyvZ4Ϳu(sWr@_Y \ U'/Sw=\e̺DT>Fxp (^F]CS6+髹cweX)>|F:Oeyeh,4J.} v0.]2Nr _Uٽt+FNGRཀ)ϥw2/K1.OQj}LW -:Ak5J#LaM&!M=+|),vif1xd(חmRKWO° )*{n+ _$l@E9Q"NȤ )շ_ro昐/VJsf~ωmxZ8I==<#~xV)LE(:=uJ.F h,ǽiquN/j< ȢK⢚jdҎ(XB5 B샸b~mSMc~:ZD#:ǏuRM 6pvbvUnFOxه)vj"hI0wV/4TOyB3YT&꠬jruR1*7w)l.6%.{11o4'btlV~lʹGc9^7lǶCtfCJ߽"dw3|z5s~n; " L<=Tٮ[zl1kBD%QB5חvc:[>\O?#Ѻ쵒 OiӉM#=!,Dg~ ]gRd_̠Il#d}ƽk-Oc amxV9B@'`/.e4E:.ZxrBtSx`466EIEdrfcq¹m v cNIG3;pPY5lRP:%\X71{}J+۫&'VhsCVSI-Qe ,iGxDk3Ԉ0^}ogӪK+ ~C W-_s1b̺R0 X>-Fy}Dך~(mLi-=RbGjRIEb #r"b&W# y*sMCL4Jߌ%Jjk 47jY4=:]3Zٷ\ zl1\ګYu< Y ui{T"ߐ;>]"J஢z9g.vJv鋤LF-\T ń7n1\;Ѱo `edȴxt$2dy=rQ[cƫJ5}? u`r;Ir^#Ȳͺ`&V1nI,TcQQdpn`>Rn33bp%``DOZNًqb}\u2x F;v*bI)KX-[}PPIdANI?q4sw򻾤9ȃO VtֈobBƷd]@wL:qq6{9O8q\ ӞAl h`}V^XbnC#eW,zP̕P0=&gY$s߻sAU.3…[$3?d@le~`ey|}8cq@t7PL4Bݵd8s@k17|e2uŒ~^0=S%j=N&_F;+(4re.V+zY E-igrĶIsa=<KUݭWx &2X&UZ̜GuF+ #nr{,4"l_wV]Ue[6OFM.ldsn˩=ZhK?iS%m75$^OL.H-!U<^FZWA\I.+=ANy(%8F M\jZN'`Vg;'J3_:Eߩ/^Lzm~*!⼹!Ǻ T;^ @¥ɋ@F *RT#bJ(JӜ/xF ;㝶.1C|JqKKe\p{h+K{R + OzNF

F h;ImE݃J2 Be9`i9i%IJFoBC~2((׋>.dV_J_㍎>Ly (i)?d8qIGʍyɊ,+.(sm?KixD2lBiށI? d~K\1 x/ٯ3Ll'sMdOzV?/h1a3}Kءh߆<8ZO:P"#5>:^C]!FCwqPNMe8blc5w 68Ͱ$iy $C`O,omIN`˳[{ଦ܎ .O5' k<ك/GpLE!^EN`ؑ՜@NUpL輂YW]}7IK95R*Ǒ_c 5xW1 H'BW/5VTQoˢ{T(x"obMD銀_Mc:Л>gG:LZ*X1Sށof`ͧ[ mR'_7sv|2' Zru7*LѝEĚmgIWe?6JA2x `AM@;*Fʰz9ōu$1YZ&MV@}U2,mk?9:O&tusۯufb߿R(J.ϓkqW<Cf*W5J>!ԕ3*ҟ QH:ASO~򨴨|E^ sqDxTtiHgWA|ko 6G6߉KP_ XDTHTԿV/Pk|&<t\ʱ_ #vTAH_fw6ZUG)M q#嬯6_HdAz<l$p$<@ML`K% USZ igN eV"gZV?Cȳǡ_ή |y)0x eWja:xc ):BayD3'D'68a7"{omkWy"USpQM9ԂO+|WhRv85Z| us=H6 ^B*q@]9v2 ^AL]?rm( phbچk˟Z$#>'~A* -^^:*r"1+3X`V# N')n4.pSRQ9R ^oJ3yV8u̠o1f0vh6DoLbV鉭9Zs<Bn7Jv:RgIy헂; |9AIRB;#1m-)[5]K_ޠEH"-DbM`c1LdaF'o 2y*e,9ukʰЃŴd!YM2_Tq.̵[u .(ㆵXrO vyV8FѲX 3a7ͭo@V@C}}đWo!珬2/XP_ͮhuDFdćJ!V/E[OPHɗRexGf΂#>$ 7##niNzoN9{ȦL`oq}`r2 4TAsF$P6Ut>띜 {Rv zBʊ)}1=bvuuߪO)[Q?8ͥ$h-r me~k$PޥWqe0# |dbJQ&+N'W,AL΅: 2q@ f2 LFr<*=+6Jα]AoY~W% 4Y-)LQaeL?<QHPj3Iq3!kLcFhIBCܩ-1RXX4kLۚ!(.E\t{DY5+c#1O_a'2hV|XTB+,lZb Xm.?ab:|qzV/tKzwh<)~G};,ԻJAgQ0/,o1L;QrU0 (P8yQ1 L[fȥ~klkmjTT'Ί"+ou~ǺƝP.$=71CN#c DH:Lʔ.[oF_L/ xNOowsuJO ɚ_G[K:~R0.[ivGt'U?{1g-FYj&1nUItkt7:`Pe wi{<ZKL5DO1:Pj(/C5 ŻƁEcFY5O@B74~g=#@R?דw<T7B>.FmW~}nػІR@O(G8e{9PYHnQ2 ?FŽX8%Cv18f$ Bb*LCϫ!D3nߌ45T4<8_׾E(d̮~zQ??DܨNrZO_E0)ZS^ ڰ3o[jVB*kX> i)ݟI'e;ѝ}+2 $wL̮;$bbqvV`@ A[> r)0)',ڻ:ls:o.$_DgꕋR*:F8re Ƈ3%cenP0r&.;́o-~>N<3W8'և}DV``ǷHؤqwس) z~7B0)L[)|H|Ocqh8T"NyN<."g gh=A?BZv̉>_f#+]sUFM‚?ѣ#TTHO}D..;JlG?i J< lFu»{[Nn8[zHfL][m/@T5f/EM^o)یHT[-#甬6d=Lct^ihR# 0}}>x?Eۚ >c)HQDh5e[ZUơ,]jO^;yxsOu;b) \R _>õ]k"Q-R?b-W\2w*zZ\̋˔ ή}-Xgojmgr8!_zpO+$rQSin|Ѳ6 -W3[;v<ԣ~ gsxYvx`auPsܽ:4m(`@V<޼KۇCOlDt^C {>Ϛ7- bZ&BԕJ% =(FLZ*;Xچ\2ol43=߻ڸPӀu£%Z^Btmz^v_VZs>a"ư(ǘ{Շ% mӿ˸}8^ÿmݍ~l/jTVROTvG"bTEA-ͳ-cR;Q( 4=jyğ-n.B{ZD ,:)(Y_z?>/$ Iu\Y{GtJM9VD~G8jWFzNJA{}Z  bBdrgmT"]A+$\|b.fھ.+1e,;ǷEm~|E91r A:?7<0OVR3ZW\LU LY[ j9_(F㋫B.'_od3 CSNZmքWA+1k[ , IwOIY~v>!aڦ=x.Fe]tּ+ončwfS= K͐B/ȽMefS.1"#-/,e䫬+jpl9V&Y7ǭjYb_~DQ:́<ZGv}4y0UkRT1>},l9@5=AϪm(Mtg,~g=skuµ7\R_ybb3aa$< i{gEGI['i6M:@ w곛Z-W5GRc:̳ 'NS15]JPܮ z@퍼Ečz/,:s}=opF~(y|srYn& G6H> e(›}XN(ACXڹ73Op3jgDq_ؗj}CWuvλmҨX&ZXni3cS۳CCkI7q,⿸%-vgҕr# ?1oųFy t0[2q{k>x s,|&PYfR=a1[">Sw"pHB)ź~\iv7aAlKDUpLۦ,lٓ5/TֺvIVtM>-uڝʝ4kQiΙ@WX$^-@%:₎ YU*?>io,Cm`pA!+bʝ"+E>f4hh| 85:W W*$ij&9l|u7tX/@n.4EhP3asƸVU,'!cxh_V'hMAh }NB vnf< 'd}sX ӝ9 = ۆydjBq9ɩCxz]m4}%3?oמvS.qT=- TêzeWaUalbmذ 0ڟ K2{p4WƶPGƮh m6%3nK)ZbkrTBe8;MhYPt'-Z㘍-"`* L/yjGAB :6Ő>#/6)?M[ {^^P+_4Д$؏RXoJexfIb'D_5Soԉ|)ytih } 4q`l*;-ٌ0p^$mY+Lq&qkDlCsM!0"i d)H }qk"} U6n v5XzUlBxR?.&f#?+0<,,syv~Z\FqBp95ʲWq J+FFJÖߠI(vhk&{B&ND$V57H\?KE]z{?)| ic278B߭hUz cq|1nS41#ǎĎEU<6w]P0ƞ'(\4XS axWN1/.ߋ gڨ6W%dqO-1XJ*FyTYN.#fv4-Դ7՗1;J-]H񪱂O4+0T#<A9Tvvzn$8,9fK&í0u>4xje˔gAXhf?88WцjgZ2 ^t0mb& p>ai]ZݧR8@isvc)1䗜Ϡ>LlwGԂIqAVH\k$#،~YN갫Ol & *p,X.o8C,}4$CjgWr{qiлo/_AOQKǦ>`{—[([[YHN[@+Hث)&㘉=$p8B?=znC.׋jN+Aba&sv=zGp@O~GNr╝hV<ۀ۹*swEcLyA8P =- ta{j3}% 9Ұr`֒R v2*`&l`Jڤ5|oN4=zƜa3|X,xmU QAh3g9|B .%SlP {xӁsa]@ Q6{Q'˂lˎ=[5ٹ&]$p Q|̛|\i$眖  PxEw-˱FDی>_['MĬMF1_hpi#r '|hXض͕*dQ@EQ,S)R {^)zߙ ;㕒3=ZP[*+ĸva)(Տ"uEufpOi@p۸dB?PA<(h O2q]EDd;$> vb.&i5JV)nݵT.Q[V|Vh@@zTW*Ѳ&G{v5YeO='AbGWA%4zMO@A3aCn8D!! p4F F"d پ6wuH.X.qQ; %;k}Cy@A'?^/AT_ڍ8j\*A?O-/wױ܈$}"dӹL[#H@|1po`#zIpp3TX׆N?5H|x54nmR6= sDQi_(˴5Yk1؟͌`Of9/QKAۈ+20YCvGQf`xzLܨ^LbH)HX+ <װ/2EP ok{Âf~Zvص/JN!g"~= e'V7^W~6qk2}vĢPdܯyWrYe zImxVW}d+ځ#tz}:E1ozrjiȨތ+%๮&].Y8g 9+{F(;? 1v^s|痂]#(vbkY61-FQAw!pvo πX' aAt -9>U5k/FO !kOoivmGFAӓFfk 5{ q%ᏺ:T !x5oČȤBZ[_3??\l8)i$kQgM2S`MïCK%]b'ߕl o8m,u:lI[=!bڒ,GAq r24-zb[p I>Q^X4c@Àӫߢ*/V.v$ʽ/a$Dq+(_ɱ[};me(\$+9ąl{TMxwk'~iFG{sUlC$BA Ӂ!n|>C(M$BF=G}ׇGflzsMAbMYLb0i2=j`@TZ'"rͤrp ?0"'3#M8fZJ&2cϚW . JԺ3`=y1k&{OyFx41ߪ0]NK_`r9#rb7g 7ՓpY9<ꦃ)H^A@.ʄM7Zܟb猏t~Tg^YNi |j4 l.{P $CYTnz1;8^2hk1lN2[|Ta&{Bm`FR瑯~fkQJ .?}u^cXmoG c4ԧ'[7Shd10?ލ6XU!N' *b H~گD) s)撿gCJZ0buD$V&Hsb`LZHNkj 5F4(9&SeQѯ1 {>W:]n Od^OPn aXGeo5;ꏇcZB~}ūC^;^*r!?oq3i}Ac84.s FP`T Ġg}trQvS{< RvVH"O} 䁉GVĥt-ren^Asʊ[30a>"{[3di̢b,lhaLԆ#ZǾ:dǩ@+a/8́n2-y_ ,o(6w&h:?J.M/v⁄Abq %e< Xo #$\i `nTE]TN``d[kYLsI5 U}ՓIx9wTٿ];6ʼEtp@5J~H4r;p<Ξ?تNd9p>.}iTB,3\3k2?+6SS&|J=tG&`P{ɏ\@g,fş,PNTL9rfݟ"@ti0h54*9]t=^?u xH4؎ yW%.bJILQk}8Y'F&/yɋS$&8,SR;jHZiS Sq0s¾|jBD3Z9L+șzкbe7FC"cZ/UMyQq x}y<=#ЉoV V'cBQlKCR`˾7 =g;nz ||MeLFŽR%sǾ,]NZh =sl\}mG_GY'2" \F#᭫v4o<ͦ5!0Hȹ(Fd$!(zsB49s{|C\ ˜) ٽa6LzX ш; z|Уܘ#4 v_VRdx|7Tvn[Q+}2| 1IjĔ04HT2x:T("ӓ[ajN;!~IkY[+c=~\a?tY$|*eYTџM[kcNԘ:S,Rھ,x@oI[mLPb!qЎV.Sl!5Ȩ~5q#]8wE,Pe>veo+0!%̂ANMcujh*)\D`&;t-193B$ݮӴDs(h*mLo|h k}/矕J*ęJet Ap) Jg]KQaS#D(H᧠QZ_t8P<&[EKC<&m`sJ5CRs Uɋv*#3)^]a|j᭷Y w9\QC:yδW |X\I4]/2Wo%vNLB >TR{pr yrR'eЦRIr/fv4NCX햣a5yU_ ;B?w瀉27m[ 7Jzg訜TGPrȟKj<ҳ]Ro55/ya j)҅M{=I :nTplљv N? Hq)J4!{q~? $~'ph`ˡ{po$(f]d |59H[lxBo7Jg >"jxj-rQ4:#07@G A񛰣Tr:1;c8$Cw1{Xt9^Zge-gAi|:"?=XWԧA뛼M9@Ȣ;3W0's1S jh`%xd8_N”1%7,[6 mڹUQTavL8|<>YJ}?-̶}H|D5K)]Ė]/Qdj *b寬~_`-SEdl@b@ yq8b^:- X8Xdc$- haX uQ(Wzڮ qx'5m\F6U> %֍_EhlK핵˕AxMd5/E`+bB/DS ?+ ?l"zya>XDʟYʮ  <КB$I$ ڒ/!-WS#=/l2'˒VP2vY܏mS[\&IoZX~^R9=Ews( XYWMW>}-{ (ϥBD)GY(Q衚OBGTZV80ZqHHD"7@9R "4uJ=۳L^h ) ώ|J&miGX4dsyYq-Cj*Gߴ4P.+ 3WkBXK[{11ayh*n(ˁOL҃>ٷXiQ>b쩒–br[g fQ[= [lOKWSVvQz["Om_$;_i#8%ٌ(٩MC2"ɿ{ WefP0ٶ-t99p? Ul %/}jS0w ̃>OB`A,&Ҹ`^^kc[ߥ˝ Đ1twF)#C6VCR֯#P<ԑj1qhd<Ta xN=2 1XR jx̦|]:~ڣć4[uk!SduX[~:T -*K4?imJybTi;ayb~8r FA)ydȭDb I=^c_bUҭL6e*"1N >{_Du̓Ga^^(MP:= Xq_BYY`zEO2;X해*L?UDp݉ Hu(\ %}kэ_ N>sʈ g`|SLvML3wB68|ڀ5 zC ]$gjfMd]] K`n?"YQ77*2zۡ=KE=^"#Woz֞Y P}bk-3:vxj5Tk/PZ{Dg/04&*Zq9{W_M^4w9X֪CCΊЊ~%^^b|ontHᝰKVz/vM:ε;vZn~(C{y RHq0ƉyVutdQ9i,3Js."ߟ/G 0Gn~ʿ 'ءԁv+{ʒ_kK!$RX?E%|y)/XL2tILe;E6hdZUFWd涢z~*+u nlw]Fߕ**unV`wE?)ϪμXPz 66'aLdNr.lV$5\c=U!1Y:Dc?T Ɇ`%2RN-^ + n=Nm"AS##%) TވGBKHFnن~-pޖBEZ=^JVV'% _~-,NZ'0콐XDȏ&gM!TNcB SXR=MVd6XAX<|W쬔$HzPU ڼW&BVXbߊ -Q/4P%2GJZКnFYQe_OT=N*'G5 U[ZG, G=9be o|ޢ51Z jys{ ;z-K?1 Jqh%}0. F3X)wۆE[X9;SU@?$DžSI2.h5MHlg;BYndaË́-+YJRޡ _pM*qw'YQK|X`G5X/0Πw]Sْ%zc xvuL gӤ8涄ngœ3R!F?6n Rnrh3(w${&}=$}S=Wd+`&ޑ捯6ǿOL.:~jo% a%?~KI8SAP[ 3x{aߩtd:qش wg,apv /!e KtһN0  XՈ{ĒJ$Mt_S\f=-^v&b>x5LQx:p6˳bFD ˪ t'R$9.E KS W.%=嫝_. Tğ/&}MkgO1 t` Udmːqr(pRx=#i 'b[ ,J >C/G9V}I6_$4_)Y+blnuɊ0Z]\]g N]lhwK$){D4N,z#0 C 5 _!wm1n".tY )wC GDBbV76t89JP 7)gDf9Q ςL]}ݟju*V .pX2W]mnBLZ A(GDSۅ`wNKQl2prȞn$> WuS8H+鷺AIb3\jI'90݈Uo*zݬX }iR-&ѩIpL% P`2r{0tѸyA֗QIҸoޖ9G3d7JFLO1^sO>`Цkҵ!$%pLY@|Q9l֝Fm RXk [~dӱ#ؠ bĥv܀Psk֨{.2mG30QP8Jm!~^[u[>1N("A4j_MO-%N̤3R†at,\벮?Wiw;Ϣu^F,LB U?lVpö]E۵V4{MP#׭I9Rm]ԉܓ.‹/Kd$_-^K}!+tlLMP{. %+tc3⅝J>zu^?|GiO%(Wy9+uv -)W{xw]0hPC%?6-J)IK5FxBD#5p-kG#C֦7WV-['.~0(vZ8> :#۷Effs/8:3nRtXX^un.~1]J^`閮5D_rtrk`%mN_W<*,8N<2JD8Kt\T)k8 eud+3+{;tcϷtFͩ4TS0#qj:d-ޥX Nèca2CI4I@mą`N h_IG7'hC֩)>`638oWK& pg5Ճof⑈b.PMZ$aoIUߘt}s;/ɾ DM@:!˨F5nrjN&`TzUQ0]ظE T#aH#@# 0M" -Cnfp '"RZo(( ж(XW VI7f j w)69M36ІMfP n@?fK]>pŞx~X{G,?g- gbsbt2^)ᾧ8Qz jIcaqKy BVxӹM\֪߫Y_TulKy!ybTjQ: 73 sݸEodYh3M5j9@yIU*mx4rIV3il.!ȺC\$A"Eo1]OU3)]Pӿ!, GVp|:)k?59KiEH>uf$(]4O)mfv6W:M%+M`ɪjŘyd0ށ's2z,m܈~ [\z$e48]LJq'&TH {bܠCȇChj|x,`J^^[V|}l,4kr\lQ ]GB="H'ʯ$AcrJbET\XrF2[9?d Jn7P$A$'S84XR9Cvf{oZ5͕%9*r5C[q Xl^4}8*ozDU#rd6r;J)~IDC(5?  r2HX0􉠿Ѷj3.6Z*w޾ӊFסxAo+.w(6T-Ře|hLܳ6=lGh$*nWWaZ`V.T>( |O< 5Gh.Ѳ7V?X~7rdX*CNyu,sT1x(xVaӸ] vlB].Oz= ɻSfnScrikyf^S{pU@қ_Ƕ߇zO4sV#|:V )i.l 7(ʔږkx^}=8kO?VL>C8vPݚN jx,B'7|Z24AZbEw}=ӁAjXק;qE!ٸj "'5j' q;ZHJ_+oJsF%ANt7KBʹ{bԭ {N ~c֡8$d0{᫧ܴ)+pG[I3ϊFL.L{x'wVIr7b~Y@&RC0Yr13|@')yCu~SOR)J[|c[]cŕT=SoKa[CȈC%8B$"=sɀ|ՉGW#-' 9 1he9rBvok9wIX4åD/~,14Q[gȡ8K]F̥%bm+^Z(XBy (Ӿ"\BEW*sD[rU!u?G)v%Q6Tm9Ax|2AUk);$5>?\^"kG5ፂ!~ /|֯jPIHX 9ogXWvDQkӶ)XWMD*161^ؠkrme Bz[!G?2{lLa8[2jö}΁%AdӐ:FƙIn1׻";:z 6ُ\}F1\ߍݦ|$_Ebybqxygi<T"#l)ĕwj$1:Ry!Hi<;c+<7XrUX ̳>J@МNi{XLSځRzɑBjYz@f˂V[N L rKc@̌[*tNH``8!{upZV\cF@YT2y+$4*fFJsrIž8j`6!lx*үߩ?G+$~)Y` sVFu4/ڠ x&U( FF@zZ!OdP@2fy\-Fю5@w+.FrhJcI`Թŭkըdꃯʿ|zO谾 ՝0['HP hDOhtjpRL`@0,$w*_3ޤAF75 2w'9WzXưtj(' ]ndp@IZ,nQƛCU,Ķ{Gi_KTv abMͰ902|3bߥ0c,#+ auԤ @a5Bڢ'I0'5a,'RNy㼦˝z]Hמza敺 4sSx${_-英:?b М@ХuF;Ӑ]c2U8y-ɐ/4~Wif_3WN{3~2ZԺFLԬt唴_e[8uZςZq2" 1rXwծ*ˬT;]|ҭ?ѷ]OKZR\rSc1x㧑CO&*CFQfe@vQ=? Πbْ?==ԏ+u4y Puu;rSVss).{fz\Z!ov3387U\hJ2Mx1!dmRvS>@C.}ŋjV~:fG7F@e y'8&%Aҁ~ R)~$ )?.AT@6&ѫQ_NKCUֽBنbsrJ'iA˾Lm!ߟ ^BOy腡`,b^iCـd2VA%D3Cjaثº3jH%ۻh<ؐ6Tu1W`|R?7>x>%J8$+/&rE76:@*vxN\8L~'Z6l>§'v6.ВρYT2qF zIhQ\lʏ,$ƬC=B5_.QW1=\pǨ3ڼJYbT.?&-ܒ dE6sm+mOU_bJN(@NG($= b-t:?z_zfwVR"~A8cEA[a $sgu&٭8^1 G|,]A10Uú ?B=țPW} 0ٸFL #B87Aj20KBq =Ϗ&0Yl1)jae1RADݒƙ^.! fE445B hsNƫsm )ñ wٓfڥTf)tbQ޼2(YR'BVLT/<wIY-kt&=ZOT%;tU#ޟZ]h]pe83h0WR7u3"͢D׺1pC:K#- ʅׄspoF.kH*&36/\͠{qNܻs0 51^ ɌIviGGCnT%TDP#g򠯉{8L>1@}&RﮱU.~-q-/Y޶TQ):'F7!,ٳW[?') fy7n] ?6EC ۮߊos \惨%MVfGn4R16<_xƄY~+q9iw14GR:e)7%GV=u}!Yjz{&ܸ'm';FaXh=s%,t8:^(u8#-+ߐ: >tG| jkD]> ĘPR,GLBuհ.*// O ^]O'מ]/0~g۴SOjZ0Au:(ne\ hZsiƣȯ#P1/R#sj{@KC"B೙v'dQtJ«> [҅=6MRTi`p6_Rb4ƒ?9<V[? ɊDi1qNpQĭtp,^/iMÞ⿑Zl'."^Wǎa!g[HIUE`^Z -lq|<&X\9 +梪a$[5͸0 pInI<?dj.WlLy` mm[{y*PN_cpCLJ}_m}/ƕ^` vjIe%y6HI,B\}1ecrH tFx`%u^'afycʩQ>H"0n3i!bٔdz-P|u `\? v ׀ #肴4y3LwhwG.QbZBBlbdQc'jܑFO {%s.:~mf~rX 7:;(]Pk8Z.DCNy*fDBY\snO θXl=Yk9|)Ww#\f}Zm̃DՌɓ(-SUެIZ?4 £QfSҚ͹ô7Il^mhsPhMwRA Td8uR1?GP-w1oR½/҉ ^O4ۘ[Nՙl\gPUbV&%~cx*K>۽՛7k"9 c1+5~J5+39w:!#oMWK;XJJՃ5C=WJZ5cͯ9YH\8%A_V}{2zuLM'cDOl d7c"Po[iOzY8 H-톮g"?ydK$VOE9axbRTRge^To> '֪a!pƌT -ϐ9<_ Qv095fS%;Qo٠=IWqDyg_rj߰Kң#K֗ޭ׃@|_Sdj<'`- 9w#AEImcܒ);s}NfT).9?X(<ᑧ.'9ŬYP%L 퇌ij7O!yw5a,T5J b0vE˒NHXҙ7f44tcNӜhϼWӷ E'j=uQ޾7ɎꤋRx:H3% zf7]qRv7}Bp%&Gb/^ ߆`dsDZ+FF^m]_:(5*[i68X:xsjCH:mڌ{˧i҇42f*I?$.}CslӬkٲo̜lL ҈CU5_u)TDm5/\ЇʂL &5S;T;X2 1ǰb7i75FPDva3H< qЕIϐ%gt%`$QW7.lV С<#Yg}|C@ γ߲c[5~KŤ+R='Ghcqmm} 'X,W|rB5LALP(Fe".IO~(;Re%w[뾘>y*?]ZZ|ǿA^+Aan^חm@+~,Ԑ։q74-l`Y/)|–X!QG88Wse3S-if'Gߜ?i漛;zndPI6gHaf-b](ٙ5;c};}*S%br؝҅A]lunU7+&B(;Ot#P4~xa#o_{!;mP,Y*#c?|t#w`$7(:_F8(Q:8/k(WMYzA?7O2xDe}qFC9@:ָZ$#4\'9ɺ#a>(.3sG<=vBiTQw'YCkfƁ=ڐ"YUßj[88ᯧJh0@rKDIYxx')d}7 K޴hNLD+qnČ}t_o!~f/ZnNEȅsV\Z1̹ujߔ1Y A\=r[p6..ZAgWyf$oʹ).\._3jCg; o5gIہF^ w \veizF$HK#ɥ1vs˝ZRFZP'~`wX/@E,zIm*\lxFS0>tM{.- ;ǶFCk߿=dYu/TF^7GU qz|9AwHEMi А0\Г sWpBMOzv,|oKbwJmjN*2sc P}|xq5]۾{lB6[qiQտ#jLb"j'AnPx`R 2Zv+=AI⏱Q/ ^ )vY7ELW-V y1orƞ­pd%#~!"cCn'1 AUb xۿ]Lk,8s0W#T ϱh2&G[6 j1e\i0%&S@3/3e#g⌳%~INmFwpy;6%#o #c}(tn-lZ"X'{ 3ѝ݃'LF9sIۭ$C3J<ξ3WE5=6TfQ8d.e'aӜ&F*=V=jC/pfЋS s}w>Ґ-XldDt3!s':jx\I?<_xuU2CŬo菝<Y`a\U.^9MOvgdZ9+ORD@ #b諍˙y7·kNСϦ W݌FkZ"9Q_r0-W nH 7T=uyꞹ Ci˙ίkfopT 6#. #m:Su2ygs jYU!{&Q4j( ʟO[bYHgۓ ^ '{)]oJ*KHְTE'$fgGm>93 D9,ē$XRM=|C Ɗcʄ*5B,`'&_nhъ-F$QI<攃)m)?:5BZB4Hws ?9} V_6J,El)zu|Z ~mqm`( _/&II4D5BRm/KiCʼn[0]S|Գd:Fgt%-e|,mOa<@Oi߂ m¾O7ƱmK9/ ؿ ӵgZ<.W_f3<6  qܖ ٢qF b*v4YKԾr`)kd챓)|G?^p4>cB[FyVPUmň,0тqutM/W1PtGZOƄ`tv!K+? SkOs|Jq=`tfs>32l)tt>Zf< Ns@(# E JUlͤT/wHb}"ߎmY'e3`F=QZEGz69!hdZШ6|ck@t+ DU@\Qg 00*9#Lw:^a|E[w@9Jҙh|Da $vu}MmV=4%"vD eݟi]f_%0‰ڲϱ"~ NI45c<"GΥM4!#7!(CnNg|uʓ n]9q.{/F˩ҽOW_C3 Jk0Nzϰ3!}I&t0D2*7:AYNU|ʠ 71!ݝ7]/kX)U)_Pn"? XLܺ@@YNͅ.q(.BGІ}9Puh\ŨoD5wU_vz}(l8Z׫9+'5nў_D'P`Ŷ3V>;9!AIvKs{.!D WL ΢CK 6+} ܝ;/z 462oN_5[f"-nhF' };V@~a wu\^)&0o)<7~E'Y[11řW9YB"oU…`0!kdz׊X{ =ɽg&0^qNJ5)ı-}V ] X[ RYD-''F2TH!{n6R%nD19YFӉ~u)N׆ŻQe͘& 6M!5ofOVr5YӲ/|9:N"Is@tL(F_f$nsQCFhB]1{ST V7,==](wPb$(g[vfuIOW3rZ'V(#GJ WifrLSKև,+a=6q/ >T-Ja'p}'˘2O] 6w "Et U±Nkթ,{n 2<W'eq=L\lMmwN=AaKk5a| \ •z|C5QIX+@,gh1f _T<313UAH_cJ {yD`80|]=UILn{O,?)۶E \0 rMdZc׌SA0s5&G)̴]v+ek_`&Ed}Eʴ'n,vOy8IuT'OrN!5hmT$ڢҢ2UVH[0${l|NwDW]p[hƯ,1QOV D^މi$e͔#DϏc92}OI|c$hQ1./~Ձ5cwg@{4a '{~6c1 zQQmjqbF0y6QnI%)%Vǘtq>M1[|6vevU.2)>ĕ8y3؏W@ްUteσˆW3;s_^[Mu{ȰZLA"OX( ` JTi?OxLj5jlۉ@ש[MLqIx)G(Iq{hUushJD{LvJն3Jʰb=cfuPmQI-L=\ yhRv' r%nad'U/\,r?1dX*jݿc6RsJ?qG/ 9di'ΰ"idj4 d$um5[|{bx| .yb : D#>CȣT02(n%%mPl\ 9)p^ip/+ϻ(\.#]i2S`W?&:MzaURUlyUڌYUF,TrB/2KF֦UnI($_X9Pj_YͶ ή5M`P\Tm@D1!vk:l0 z._VL (s#}g bTƹOhpu,)$?AϵiF`ZP.!AXH9޿5u} ^Vf,>LmzDƠ җCHlMބ0T7kXUFڼ}hB p@ lDQV86hI 7zoHQ =;߃ ,psR:hR=}5^+p:ܩYI{j /}rR~tP,m*gUjshZm_f1:ݎs^f=$ GeB[K ~!~XT(l7CxR)Zs=\e Ԧ}~E%GmX**x^h~XsQ;adbYʜl~K ;ÇGB1: hل9a=,sH[ǐYPՇ &O~e5,7"|#pA%:"d,t3]k,p8*XVŶYQ8CiTe|:ZVgg:@[L-*´\?jPiC} NL4WQ+*1^9:د}7I!VԜ| ps< q?=S}Gm\c<2𪞯2l0/+Yr˝7ʹtf8V_kΛ'z1"mMsseqpAkjnkIkZw'fƻ|JԤKC_E̼mLT]usHl]6*eV'i{`Yw@7cf| -LG?̾K:4RȌߕsztضzRدon]Uǖ:T\[Q[O);vN 5pDg߈T & hfѫk?շKyy)I1EhuzR'qH%zCDEͺqRHYn=.uQpکuM.LnqEkeլR_wFFj1℆yNdzzE\ǙC.g]ө){1VCU=q᱆g{ Y9\>6eH qm&c(ʗ'ősܪ;Mu攢;4LrN,]e3]v (L3^B4gH]b|R @4,"łI48Ktً7/c'|” Q̶@>õFtX 4z4_PyDt턷rgw Y)bGMx`FwAǬ \ +Г+0?dY*lXbΓk5,U63M}Rm̥ZØ 5e{3垏mO5hh`~bjΉ@n5!S𢡥IiÂkQ_SG'E J`@HE^l cFG!"HNHzi{N x.De\wNMjzuVB ayUq-evAJX%,W_4>:h3!„_5e37w"3p0\0읠~Ǜg]{V Cˠ3u7I-ĸM2n0ei"S7Qġowk#yӃ* ,jٸw&zƌ%aǓ,-ts3F?G)B79b{ 씡tQ2vUc>L,t{+`D($U)$I( vܵHc2"S[tqo%ê.2iiM@ő_H d%:@ͿgǴ~5FFCLod.eB[*"x~#GuUhw_4fRq-R#U'[Ԉs?FԬHj5λ=D$,; 44w?RWz_iwJ5E ADŽ,К}|/ XbT>X(.CcLd8)VX1$e: e4݈C$-(k%9RQBa<+Ws%dJX0qb>D XCwI52?F$-I:Lg=W8eZ̡u i#7mg**#H2irCN^-uTϏxLfx8o8`k2)m+zP=.ajPLtۀpH/ӱ4WH tF5e|ܬb'fVt ̈ 0\^Oˏ{ŨG[5xk=>x/^sЗΒcYºPߞa /^: 97h&-X* *0llwߕd<FuWf6QOK"GHcr_0rhP: 8ob:,((#?/YeϢ~B@?'KYt rf6q֛[வ`aPo\xd`KߜwĒU@'A<_@wbX Ue=ST2,4سv -VTѬ"L,6%O)La>ex'd ?݌2Zb{bUH D$W̎;bb VOAuI~odpAN2ըs ~X~+vVS:γDx褈j ң.VL+,1™-u ˉamy1rs@z3~Łಇg*vxFX':h7wº?1z|1|#֘DLZI*@[@۾y?A$W" :Ͱ[.Ղ&A `Sjw4Oe!X\^tӟ|n,IJ8Gv(zr0b6Oe.z\[l ȂsQ 6jz,)DiݲUx8}ѥeڵ1ַ6L96~ S̏g8T '6nm+pzV"aD#11 [K/?%*IMՄxXLaЈ݀ύ-#0st "'a-k8&Qo+<8 R ocjI`{Za-Zu ۩tUFw6"kC"1o⦊ T ~KoBhG_&76tc\{$ˋaAo(C-qgKpv~sV{E >HI4ړ &tƯ`vP3E0aFbV3ݢB7-: {WΉF=I'q @ va1AٶM0'u}Iew;cL<@$JMw((78Hr+.ށA"XX|`$X` r8a I&BHxSh `GbwnOg~;ʉ@ل1\EL VR(˃E&rR ZLu ʙPk23NdD N˘Ia,1!܃"Uu75 50MWk9NwY:q$x{\ЖE񋻂a"VVnG9]=O>}ZبbiFdS9>h>ކKpq 5pd\ ]lEqwJTvL|W~{Kي6b)Z EFthIP/ְ0/;$x2%UGeJŊ:\eI$/QػtbD+%@(o f|_\KZ+zNEEk-~`bb!R'g!b>cLвq `*-1E`Z*IQ0 U炚ф)uB9b^)^V<$)4H[V\ܔޟrDP7W߂;I-u Uz0'Jb$9?!\b5-*m|Hޠ@PoIƥˁ V/Jx )(:ÄZd,Hn?1nqz6qgNP{/ᗁ|ԬO|SE@/}50iaxLUpA=/tGױM^ɺ[<ǗzB(qbCdD!gWȂ3ezy*Ą 9N WۤTfH0uecNPXw;N-(@~9̥aոX`Uǣb=m :9@hVQɯM0X6{CIܵ>h /rT(mwIs^XnxQ+\'n];$DaTxEh-Ec @{/5 Z D(ѯIc*!29r_^tީPhejOxx'IgЉKr<,[+0'%;{sbԾL/QB4'\38JV15@Ԋ mLK镲V/9BNw/ejUip[d,Wg=kfyNFb9 / Xt'ϏBaAF{XT w`r|092r5)4j\~%XӚI`<<#?J10(2${-+:pZ(Nq6xT'`c-'*.FYu܏ؚU#)tKoK*1eBf=UU@on$'T/0>sD8 9㹺$ 1 ](?bAT lWCJ`7$\3)S7̡OC5vO*(;9G7~B#͇@@__qس-2  k}W *]$ w= xlJ,FLa.Y6Ts-xiVNH|ͧ4hN= PQ87$9h?$V6.r%M葔_Ն1/c-84B Xo-ef'eo#Z/0[V]A)DR)*`'_'S䨥`v凜ޅDۺWKQoWB"$Qc6Q}2Va:*@A= "E8WHqaC&t[I+)=,I_@VԒ^ZQ,,M [s4H7I:Z֍H4ImMt_c2iz"b߲$^wġ@Y.@Kc};p 3/8H | U*RMP1O l̋^ 끘ӽA~D.:} 8c @Gtf*iLRS ~<+,/I7]EY ɋdXfR#MO3A{t/Vܽ*-of@rvMeA M^W5Y<-`񗛋Qܰb1$+A@1AAcS}.`:kw fAPʨ_{~p37,pMf$/rS8s6`bKzh IsI@ϬC%(Ϯ JQ5v+=e h@Aؖ01w=Œbj8DV XqzdQ557:3B;>֐Mb,:ATPE9&P- @񇘤~Qjc`LoW!WcH4j g ~-yvr==D`6"^2,&pwNh5 MޚfC3F4XF˿O`"xWR@P5 c k5 !&hʙ*2RpjtD8P# #6DMV6%=azN~s;џ0[1p Cn<釄qsTI?HqYsgK"'Җ J& 0uD!,@(-'"`Oinq&IHn'aQ3.bGN1 %>m,peΩt0Rx>k@S^N>T֐ pwO35v.Wfnw.}6N[E-EJHzoV򏬯WQ:uI3VQsaleIM֣mrQgfYߔ&9F:@$6EڊN(=:7xsꢋX/6Zar0o 䭜v,/LĀ/:ݵŠ z-G!=P*tw4ddfp3/>rb?bѓp*FP-!sQRҠuY\Q8HlIk,bU0Lְ!ի,ܙ3 I&H:Q-f`I6<iUEr dNFURhܒ$55:A3pI~Hޏ8 y}V}xtXƃ4t5j'5E 񨖋Li9#XlN0:5P}Գ'@B/-L(GY[V?޳~2F{vR8eY"\ݘ|)dV2 K\,hvNSVPB@t8!*ƽR`-B @4]XSh{P`=P?s9 #W/>QE$YB e3 $XN# s `d`i:Xd޸x5 e0V|Zǫꫣ> 9$^-VgOX梯V:.0rV\&$[Mp)讥h4Ŀ@a8\%M~f2p 30ucL&ȃV*xG=@`*4p Uk &c'7G9%.6ƇljT- W^;נ_P5?!?m]+B~RN<:M9>pU P>-c~{)p+)S?TY c{l8[ռ.I0NyN5oyYN)'HVnS6Yk0xBPQp 8'ճ3č7"@4.q&=c6D="6vU,8 9x4@Ā1LLxG !$AxWRlo(.Hc-\Rr&_Q#AXΗQ5CO?a_= 1ܖ;w(ę>-1j>F{/\fTб^ijw|P/;$6٩2e:dkH#LD,;LeQ\+ L˨(z&NpGsy:T7X-Dյ«As?k60hxA/H5 ݦ{6R /2_C&J \`@|@cw)N!M& "^'`:)N2Y•M\i})U6a s _$`p` ԄHz G?Y;ڇ"jp8QI;OD ?9r J,zr0Z=I՚R T&3 E ;2 4;2cocبgp0!w\<+>ZNudmSAb P;T@<-@otn4x0&T-^h&kO[QmYC}ֱX>r'"ox] d ramm߷Tpk&̑?J.,m @5X"o\Ɍ/SZ.܃@ĕYSxE:~z>kj4kutO造擁Ro-:uJf.>18``Nj,'gQTSxu)#A?8H+3X 0?`NpCin~ , |B>@&<Ӏ.#Eд@D +(/ 5ГCYM)xǐQKJ o .{\96Mz |EvNꆞ h;!hw趞 i!?=<*'AB]<'+(!MH88j> 8@R?۞pËt^!PvVBE0@oPp [!gC_MFqJ öa7( gBPb~yoZdY<frzr1T tOn`: h:4 ?T>՗ <^+krUI|CE<$W%o9 ;}j<2yf)>ݰ!],4m Ny Jj2.בPGB)<8*DAz*c5ѳS"W$$Sv-2:݁p;` CDbzC-AdBFs푢HD w;g܀@wɕϺ9۔? ; ~U,^-Zs,DD,I6DXh@pq)SEX$>nᇟ3(O:EQyF.EcSDnfȳZ>(!gn(>PZ0 W.$SC($BZE/;[gX]ca3[qχBZ!sD9!˦?uN|w!nU[&G+8-=̐Qo"6g i$ m@  &[FgIW,k n#e>A lZ0'ntPll'Z9FuJ$=VR.rXj>6lCc 1Mf͊!&EjZTcfW&^f&ɓP\&d~;eV3/ sJP P 1658zXu_BȊuB<]3X-YGv܁שHBu=.-$k>QUwجLn0Rs{p <[a]6;җEI6 Z%YBn*2>/5|RV# C*v88$C3v 5\dv8Φ[AvOJ@ h?ZIX@jSҥ]*?kБH "3x DzNW{ Aɡ')Olq5?%wRi{vP^}"Vr^ =q\61@qo]"И I&P@'s)74YarwV?K!qWp $(O+<.iz'ä8 ӽ.xE} G::lSc7~Pn}w]uV$[WosCI{>gDDxOg3J A"Q]*&2QYV7zMaJt|ǟ>p=ܢG1?ⲏ^ !T D, % M!aU E]>a 6>Sd; Vۼjʺ\lr7f/Kt9$!fzk5VVӭ_/ւ5rUR•ؗ"Α`ZABq&! Gb [lAP̎[Z|gdo #hh >`Aan2bc> oy90nc$Q0t"BB]qcJ|nHkSt čBZ^"-;R8 p*A^ ]4(Xڥvމ"Yme)<,#@q^HK\%%Ӱ|TvXH+s)Om"j=x/t%D>s[U,,(N+~,J_/Lʠ ?6h5*z- aμJRL sQ7mTnԾYq*ךּ@WZOyB0RX%_n?BC&4_;P$0ǬNYg(/Mou |?p}J!c$wNpI{ !"ʌu?H(@l'5iX0z9콆z4H=1mo׭|Ƹ^ߩ܎oG oO߿D78L*f <LQ]yU+o,&BS| ?jBN6> r<Xok=ay$l^82e("8d3R׃*lZn:!jaXN_B[dM5$ȹm1&fZ "тC+,^}NꝻjq-"L>e6L6\)iD06̣@#>7 !SY5vK:TY';#_^xiLx QŊov?";òοج_ԠvLBP0(~@ *h" AXTջB(m5ϗb04D3==ABm2M=y܇[ .ў)0NROE/kN025xn\X$e@ (*ȟh)gkn{2ms# z3] j ̽s i Z h;i.I~ww P+y7kp']/%Xi$UFz1x J)FJY=G,qE,/~`@,\Ӫwh#Ez(:ffL!2 6 QꉀɵO!l *rb+jvZipDkLese>PV۱F3I &[5cFYI!XT7v zd>)#kwLk9u^[6rw6Y O<Td)ЍݮLўOg% z=ZBwOD%=tOFcZRU:uڨUf+lXN{W\Now P|mpo݅ w#U'}TVTeӅ>:U 6ŠD|@a<#t v /!:&UE6#鬪B ʁ@Bx P=(= 3Z F-4 Oh*< U ]##Fb?Q,F-=?n@ǀwA $0]YeM#P|2aMYrhP$@trLvWV%]g%WO|Xݜ3 t_3 ,֬>[A `ro,% V!v 㨏7yɂ?3I#uN]2 ,=c@DlW'J9ܠt4 rVpLѼnu>a4.(Wȯil}U3CBE}WAb>w;Y z#~Nv̸fB| 2UI@gϿ<04|^[[*H|K:d"h'L9=7/f-`2|)5JytS8nEwFdIڑ8Η>eO#|c+Spr&r'%x wmmhH_XcFGu ?7ITېdrز59:V5 # 8%yjVKpFdU5 JaD^X1h~t;ּ/KلHi'ӛ#+ARۡm37Ft?-/)憴Ƿۮ4-H7z6O6EzeŲe^&.|@J ^*gOh9*7QqtIP=yWu[:O/wr+NA 3w(L]a]4e\}[W/M#҂ئ;kMb;^_!Zo룔`ٸn6{g[c_U7w>}7;UE{N࿛(; ~'yrn‚lP/ Ϻzgn>T*kzaRNɺ@PSZF iV ۄl(IeuB~x=tc hQ +tDG?g;90cW-S--6 aIrU-3]F.O zPdoA.N{ƟyMc6Q֧xȋlo Ch.}f Cls)p~8MzpЈ ̫pA &RBcf뒠C}1< 6 vO΀ BKbRPpTRQy,M: 60&]muDL_j@Jdq,f%LgIuNiWveéZeD}I+h55ǩNs>4R:.S5qF@(`5li\k )AkO%  WJ( D xٜ"ABjZKQQ _!yHdM٩?hMU0q0 ?%&@hՇ/ n._^ȉK&+L|.iGjHnRb@t{7z%!z~/]fs@f}~w-/0קd" M *T}CCf"`>%,hn9.Fnko[-B#Q(W>Am~cTn 'Zge p_x>2)$&R%0 5>=w9WSUB0&a+Y:l_Z@edI;6;ˢypz ~tAbw=w5T-O#_]WtE/>Yƾ>Z{}`6'6тo` M~I(F| p"``@D>L5?ksP6@-&4jNdOxɼG[*)~#+8&F]ٌ0cK~C7 vRx/¢⃬Q'z7bI8<s"pl 2%=^]xlE)=+L.8ܸg+f$NwTwyIBAA@Nm;HϘD6rKVxܴDU@W_\I쌀a¦K+s)T >^m]> "t9NhYQlkշK2 +Op7;JVGLv2ws6)hVbKPޫ3Jobn?0A0#s=)->iB#ztM/=w|\o &o{\p+JR-Hֆ;R4FO=$Ax1M?#Eslnixg)|;ڝ $.f˓lj{mwil_$E0 4Qa j7hy YD-hQd337T%QX ]M=DX!ַo]jKBhMA x,)U|E洺خ`5w"1PPN5ΌγC98 [|"c~u}mԯ.v;QnU}ZȷS\Eן[a2/ȱU,S.s,<`k) &Iě݀cԀ.v$DP}t 72(.`a%p`ƌ`/YQ K+ Z.$0!([~&U4~Cj\CQbsk%Yt**ں'H +q9[Z_W$չB$BN7n|oIz/:N^贽-QnajSM? ,meU1v[C:2uswæ,  ^Vh/lВ[o0h9ut ic~I”O5 o^rwWpK}vkvTX~,~ E${Tߋo4|f l7CtݘozYL\X3H:#?j_9 q#VjY;(_.\T4, u fk`̈́3X ͕]i'M_ػW+;laka+Z^9ttK{ҽNU#yt8x2]M:!6:KOyGᾟ٠d('PjƾSzH`|Os:5]eM+Sc"g ;m{Wj# oʂt,:quc [INgЁS` P_錵~$:834 tVߥc@PsS%gW1Agނ [׷?R8$LdMH*c?fX)gyz18PpwmomP[Ȧ ܬxwӅXz{{}|9 F"/|i#7oJ׺z:z-f/"G4 c.u|XBdH_}$oӈeLU(1b3;ȤcUqEo[*4)=w+y{\\,[vP-n)nUXټ ]OҠ*N/Ɖpښ-?/G>; HWwۿ<&2 ۯ8cQL`%>;2>wp>`WMh]*ҝnP}.ٰa`<(=b^_r#<\r/ =*V蠜\;[WhL3,=]ԦcV,mH2ڄR*?}sE\G8 QYt~pP+R? 6W_B'BzkI GvN[v ߜ  K&=7`Ѩ a73 ય\0ߔ}}FTۂ='{>4wɃrCsODZvYnI=}F]3ZA9]g'F HyKވ^0 AA`L X@n9Z62(lqxR!ia#VFGsfMN߯{RcEO|ӍsE),>IwKŖG2l˓'zzg4|"նX+˳x_^f1;WdPqhG|S*zsK*IYmE%4m&2.EPU0,2F,h@QE3Js'] ANI``2Tf4L}_=mYnrV=3@ a砼aM2Ge883>#ތ`@"hB冩Ahggu]L~9/ĪrNjhO\IO>W13r`Sy3nY(R}NdWhBtb(Ò0sr͓KD.s8K8EH0OA'X;} YHc]4Zғ{:SεPpvڑP%\@O{oRh0ywkn=? }FK{m"⯄J*ӳ:8ӱKzI`I%T<~k7v!pZS`:6:Ԉpz-PIUAb5P_:/tZUZ˚⫤Pݝô^k9 e# ؤ_ N$?80G@ފ l4&1bS7 HQ@uTxJB¨7}N'i?~0%e"''G)>$B߃?THG/&M; >Sn$]_'-icAQ?e[8(Zt;Whc==Z>oqO<JEtbj@92w Ÿ DK QKhq! # .LXz7XړQU>Be7[UVae 6*X*Nn}~&BXpwF ⪼fd6Ke %m%>lVFi NM*`.]-l5]S@~S\C̉Ů 1NB4wa@5DD>yu<-pI:ygRR)\1=!&41`sO(P^FHŐ@@x0FkJ`CDwm׾vEI=$+ϥ rHv=Mᗍ 'os@]`$W˹6чۅTvѨњ9~ S`(l=TWt3Ȯ\R/ SdzL&p9χ90L{w[ڸ:_ڎz>@]!B"J4U X^.:[ \d,S+H`w6LB'A~+Eރ ?lfli'~6LGel+ӿp O%Y/!KIsO]6(ŵ­ uG+Iu=iO0Ԡ3M12ueJ#{S;+|g  nVB\vBϴc`h8P< u-XvJN5"@mecURZO>P<:w|qE%1X 󎯾W(bG24>aBu>KM$ƃz/K,%9pGgx\8s) LwVi,~8DdI^Adʺ'"TR@5a8;?I6#g.dxYSj7o*ٍV\Ԛ[}NL9˽ŀEksUN?tj>d'Yp;56A2.t262S|Ƣhu5Yc"tZJ0,"%__vucNm.xM_!+{nXoq֗~;uן4@]h}PbRс!Bc 4eGDOzى)uHfHV1?Z M_0bQerŢU1@)?X͉z + zZ5mI1sSyH/mNҧДles`!։bn*mToaeDZ5G@ٕLYE>g6^uDfR>P.Qa\x%7-@L-qz5$O6dxy `e4X p#Kz]G\X3fz2ێdWiEd4+v>QךOKMp]m ҷ'kzn^ɟ[Gɻ:2 _3!ZEDYY„ѯp\;-B!^Ka<ݼhtg8Qөʟdu/_nO aQgQ٥VrfrO$JpdJP }5@˓I=_}Vg2&5Z7hX "\#׷n.!k~'],SYVY. @!L0@襏f5[ɩ4\ tk^3L u:\$7r9_]~"]HhY6جljixqRXMnqumŌXW_c/?<7>ijnbӪ~5I 08,&H\閊eHO~e8}^AE J?Qyn.'"\FPt* NZku(Ծ7j R,r*[Dy2fB֔:6\*%w\z"3UΗpO` U xd$舁Yu 1老2`Y TB̃346T8/7tGJٮP6'TcT5խOݠZYh 'F $K>i7s޸i;½מ3mЫYkkcw魺jOQ@d[^㪂K/j! X09C65 Nlb/Uљ)J;W#~\ڡ&g\gRZ6'߉e;ުq篜w~kO>!W èpOB 'UfT@TbL9}2 sngo֊5=ޟv2QCF f kA HksB|ﯴu*F;O+aωμ CM)ϻ'ջx©ܔƞ#s/C*zڣV[)gvT>(Ot_P65y/hdS[3[6`':@BOeff'A~޻S4߲wKe$TNoBx!\ꪭ[,㛓īG5B0ƿZ*:/9maaIbtjxt<UԊj]v/Bv9mC{h`<Ǥ* E [Lβ@ʿ ɿMI0 ct>c˶2p7ZCn#+) ˜Mq 8b{XGnR*oک#F hO y:q]ѰЪ]ˌX oleL#,r:*0#YaM R|XsM.W SYozsѐ_&x NJ|=w^~3ҩ!Iz+8 iLAJ4)$?:[쏣KڎƓ}J2-w8fZ6J51|#^pb&ĝKQ? x]!zki.r(oy214ׇ<P e|e%`p*T և f8NT: z!{v\,#J0WZ3JVЕhyA2W| :5=\7(ikK(о e !8G&'U|?_]ϭ-U'qO X]tӜ E =8/T 9a!{(!Sav>#¦ @b$^N?Hϣe,ޞ,4H1'pw,e2Vn.Sv'c>v*&%V6=8K ~FpZ'ugﰞ0p?E}ϵxxP!p=֧SyŇ@D^/$#$)rp9oIW'K "hD+e>;\^@D@EGF8}J}Vmڹ&Nҫsk\n FNc?'mEBv5(./P"UnVBXUѓ +S,HᝠܼA_~N,QeJ뇯`whS|2 Xzn(sa`/9&lx##c)qɰ@bs.sނ݅d Nc. /?*cԼ57o IN#ONnZnaWZXf7PoKG~dO,1ruJXv :'1/|ekܱ- Ys@ևBSB$o FB2vO^4'8FF/-o>CNk۰Aы?WO\|z9Cd 6L2A$ߘUcw3jv!눓CW!R==8*NNDq XcsbӤ!՛]U$B3awiA.ZU,Iߵ dZ#-.l/vJhG@G"e my"9 ܿrK).Dž>(83|[Sw/p` 8"ܺ6@UI_8FZ6_ {iAS:ڮĺn 0 ;㬜'u6SR<59Sta=1p#.-|3I@^:kձF ڣ=U4 ;S|$ [z3PS} lhQ731;4~L*Ա7_{Q+.-s>42*J}ahCn%nQOo3a S+ErKP=uˉ0%SX:l[u ABaL/py(I&kM~.3CE2z(l*Tϼ=ZFrY~6*_{!@X_KrMO3{ЭSӚu4 |epEvwL%CӷVzC(JmZzB=M|%_jҒ&RhttfnD u#e}tAczZ) TqVxwl?vAx՝y2S]U$*E~Y8(h1,^ /@X<([ 1ecT/&}&L/X^ibtwP 2T}nBǛϠ8[~TX:uY)PgWjQ_n%{thi.K*5Oo}zGn0\c]V`J ӣ C-_>zwv}a,88֔hI7h _F?6zc>:%s \1$.F"iV?__ ]{$hx@L[n^"+W3\?d#kʻQ`!N9ΞnY;vFC X~|QvB]?V 죂U)S 8&r;M f쮒tTqj5w|GF~dk }xcGPR?^N;&=]oE: #.P[ǿOl_,Ϳ%#f7ګ ۝^bmGR{&__~&xs9h4lt ~(by:OZjGuJ?m]TJ{ ]x/FF-R]Q @#R~ʧn)SY 4VPƚ[pJ8Hȣϳ<#ivR#*c>Nx$ %p` q7 tXߜW/0Gv ]rsFY9x$tT'$}4K$CP^!Soi^%\v#{/kBJA됋m|+r* 5M[˜oZЯ} U}AhzO "|[acWhPmf؇vcgWl7vMXðy['9 xQ'|W k`*-q.RvMtK~j]oո |eBɢzV\z{7~Byk%K}t>wu*GgVQa^{K?tP-({ʟNR]¶Y})WGqS'J'mR;|sY c ܺ~niV7}g+I}N1Ⱦ}ڮoMڰi ?KliBJLd{pW%(=oW՗E jp=U\XK#c>cpf4*\4z tj7d1 uaZ47L^/};S+&aI%w ȟЫO$ymYY-tB"A/cm-LΈic.ݦV:Fꃋc˴z*rL%z&IJ-G7A#LEiC>i~Mۯ*)l5kZ$8J`#g[V<iT]XT}5DHJZjqH  Ҋ5fHY` ^Fv$j 3@W;sx vrO<=iN¸y2{%OoSLu6fy2dor< gr(߬;W֑_9/ۮT]q&lC_WppXc2TcA.t:ӈJP9ظP>eb %y,}1 1 x um6|[ ~O~GVfNRk Nօ;R :}̃G\kS>sj~_ނvtK!$Μ'P]d ڥv 2c/֕#z5 £42= CKp.n{xh^')>ԛhPbجMu5d*R5-CH[MR- ^AVbZ CGt6{ %1j-5]kt#gom*W1Dh=n9>F\: s*m_&F/$a^(<j{L}~l;mA#{B]L(J Uu-l?Aae*?~01.ݿp2i6ĝ*ӭ/2mCRM:8 jVBT(WR=.=Uc(fsvR5Bm؁oAۘQY?+ )ȀL: ^8i?mWAʆ(N*s:μ0aĬ;Ggq^F֕W%V~U^ 茶u.apMmR4q˫JdW`5gk#e75~]ϥn7ʵ:Oaֱ4ip Ә5*={}/UIuVZ.Mr+ ޫCqv/w\5YYTh)o*5ޠe*JYkceaD({|I,K 'rgH!INwڕZ^r#=E"-xttu.HWўf:w9f/{h|6+E1P,CņR#okHV Tg vThVh69=@DlU󓧨y[/V_'zIw+![=y0_YnIu\ ya% GS՟7MQKսEf0 #j] 7@&:{4nu1%41`jJ,ӷ K~..ME P0#M(悹nج }^/MA+zԒ(>@́,/J%|nA}6Oպ?kI#EF٬+1 m(/Gv|U/xJgwR'l#mI#bgвzTߣ\//|/8 JcX ߰S^i vM{ Ox 4 QԵgWWq<׸i`7f(V[0*c5^TSo"?. 'HE|oQ6=FPHDT:L(V|ÞqkkĞO5uZFp&x˴ښ#k8V#~!Y}dP~Uk`$^fmV"jލM B +knxʐQ4k&}Ɲ?UuW#쥓J#D\%RĬ*Z1 uX6K)wcV.&}jի i %!.hӈ9z[b ]O9ϴ*n`cN3RDV +\tO0p! wOZl'҉Z7YU̞͛EWJ #8J:+K%T&k$vM=*xIG)M%'ZQ |IXQ x*qH߅!g Wg%V'|!"1\tP;v[gZ ZBiW~ꭵs#B{/#g?+Y[V3ͥ`eMUfL|9ʊ_ 2ׄgo5Hک^f%[+V$JӯHEt궱qr6Da~`|zN}ꍤ04S@L,~1(6u\c ;74^҆F+NM4nk(? X,CKn*‹Кh Zr2+ f>'GuuaT콯&)")(5R!w(:h%S͡aAsto.%;]s<<7xV \`9|n ]j 6v彻7T2gDh6{d~?({ZAZcgK`X%pnejyGΈQ)e5}~z+2cNToӉ?O(߮ǯ>}rOH@g+Y*pJq N}4˜#(`.W;UѬ7tUDvYAq=.42L^MƝ$0{O.q&~o-ȉrӱrphyzSǗ@ 29"/О51z*᧕px\~Y,S <3J4r[wmnNy(z R$>a髰K-`φ5(־W}VTeP=}Q?sCG\/}6w_fǗp|;6 bȥA~v|BIߋV%^4c`లd0Mnwx!n`0e-;zN잾-g[K㰯X '7rʻnߋfaxEN7s2j*쬨; v<-Ӌݿ@!oᰍFvhJ!ѥQki }h%z uKݟ^aJEeN(Tt.ثrx9b&:j&UBF1YeLVYĦ t jW(ר2ʓX%G.196S:_6VXTy Dezr۾eܾ~]7%1] ZJ{ 3Bᰒʌ=5<=bGU*Tm_DڝB»bLkw 2kGuz@UtytI.k]b.|#ҋV,ed(hܱTPDTo}K^,y{oaO~X}Z#vIa6/VjsA,ޟW&zN8 :!Qg?58hOhd6]bHybKOPY;=H[׮Wg;@mel/&@ U.O$1 ;(eШ}F2_kESWܼ2Riەڸg!/y^~/k}{O)+8wUtGd d=Vw`߫>y ?4MyɘF=>1e$OO/U{l<Ѵ/W;GP5\;+ @P3t3/wSb'mLk&v~З)+/7sxxV]ZIH*>TsTY)J u+u -%E ڀ#VS&b?Y+HWnw ihXbMH^Dw ( GgmzlcyOqxfڱxJKns85G]61N? ':AGߊ~j[?tjB#9v)Oyt BCcQ{[|;X4OwO}_.S>}=D_3}|C<5fk,U}.30BT~c8s_k0*7n+vW.o y!8\no] ̣Mfm90J VͻhWQjN9EU~zҲqܤDE8jU3g~WFr1N9ʦ:8##V HLr/~/;G5]ٿ=ď Yd,vKL9<#~)h FO"|+5vS'pB5YtZƕo&on㇓ZY }G#zѣG>Kjba@H9gdj @c,aTnFf?п=Qe,mMb'F?H럜R4iFk/KU^lxw0t0뜣׵ ;ڈ ^N }q)A=s7þ#tyFЯ]{w@Xr/+^ sf،F*k(O{W9D?+N#ڀܨʼn JpGBǑpW/߼F|qKԾ7pGŹGh-Iʄa/;' /?_KlHIf\•HʹυuMUnqhtӫ'U}P"g0@An>0rF<ԗ VzںFY[Z3Q)C]XH .VT]ď?ui&96x *¥Vcp=; ƷXEĤ,#7)ͬ2U6`sHIaav&t\iҘYDY0Cԋg/l5qFQ=4YP]9[ u662&]t?V=~)O?yҔ\2Y/EݬH`H-E/qVQ)덯~Jөtǭ5Ƹ3Wz I܎q #-jƮqJN7uB!07s*)xxw>Qu񸜆)a2_"PXwy9xK?@0i# W$7j1h4)4,rl1]:klKL"5c8fTp>] 6|졙0V5+a^"i$l&(HU,Fxₖ8SQ!B>鐑\2N-3YU6\j5I~)t)cuU't]%a%-6p+7gfTY-f:Pp(?up>'6g"ڏ6̀0G)T}hz\( dwթ{`onrX\i裾)Z b pg^=Gl:2  r0ҊGP^sۑg|؆yWznEyr]/)dPǓ[iMa; >9ϋTyY|UWYi`3e.{, [g\ʦq3$lw'+A]3o}4Ř /7Dyy(ߙ!r2nMlM%ϱOU@Q[֢(=ط6Q@]NXӡ2.dC!<w 6buR* 2XU2W#Z4ģ3|!**FW}"\Ϗk4:w)=3 t#ȍNq6]F?%-) LR}$.3A6]c %/y^epJ|7!~X[(:U o} N]YN#$g_i/*i!BwA{l[gUݓG*mYx Kr_FHޯL\s^=(UmM'SZUl͹*0Nވ5IE@GZWtuW_7} P43~Z˵ b=Wj9wD~u"a]0m4_H:=@y b3}T\ T69C'HZu|,<8![KtN*= >5 '9ӉCN,{v&"!;3KϸU>ң`Y -WrQ7E0vu8˿j|Atl=7CTXJ>! X]ZBAobQG1:Vm?`SޖGw~w9]686=ný.TB18~rzs&U@S;Ӆ LhʊzlkM~쎁Z.el`sײַs q/!1=S憀1æ]%UuH"Ԩ\j҅5Q;Xe01=zoMqm*:Èid11jKm!Be[wHuW%{ֿuqEECqeVߙj2$:]5*FQ!GoF#QzCX#j6;ύQ<Ȟ UƧ rک8_R跳ГٮKCDp*bYmdԇ+Si5/k)/_4}h+Ѡ0|~g>%8wt,DXΗ)v%ThDPSmTLMVi3>P.?GaI϶% N!aչ09D2l@JO:uF-M};Hl nǛSXcϣ/uU-gd"Lӗ ",K\;-ֵ[ԉ?coӿ[M:bԪFЍ2eG*!Eݖ\K/R<~~9uC1ʽDIM\Csa綶6Z&ZDJbկ}oRWñ,zQ F2x^k=~B>SS\(]; 5n#m=WVvr$G^pBfj(Cek|_*4M#B=#3p B)uz P.yb7ǨewAI#P ,\]_ka|n>Z.` {W\%ɗ8cWӭMW/8<}E{A&`&~=4#d0$lg*f(J''aT9zwJ^3ZϰoH?AyF4Q~]Xnxzm9G#_Dn~+tf ʕ//E;t&+Mnt:M*h:VZR*3967eZ<&\z~1^7-9P+ZIKimb5>R"Yb[9#kNƳ wipW$6\~gWpXV""Vjh Lq 1kA&8tb+ܤkFhQ:vo O+~Fӓ?훲uc ޝG;2`#9SxԖ0^0Mɸ}vHpg'Y&3FEY<]d$jofVЀ`8@GU)mPn={SjOx[Ƣ%6ve< 1z]a]tA)6Q~a!fƞ25PܵިiON}Q9=>Wd]tc9Ez.զ>8 j𲣰D__( q4G\qja@Hеu[AX=wcb2R\Ob{ cTB8+lbuȃ;uTB;AT( Ű!3 g&Hީ7,(_a^~e5}|=K=/B,mCbaFD^eGV[,}f&niϏ,%iԚ2邥#&G>5֚.*LyO4B#O ݇+s:jO߲ӕvP4ט±"ȣI @$+݉_fh!4Z1K4U~MF;'0]cSwM?P@Gu#lb6M$8ϗtvjz oNZܗO!'ysyC;BjW}{hx/|zdmJ+=X-nBltf,x+}yC`*;-"VX;H^ZkN!ҍUofPqgZUYhLV;?&|uq}ʁ(ˠrv&__Q/jxʊ[T#_Cθ0Lj2vnʧF‰P>|b3ᕧjP籎3d2 nez8(_CϘG:mLuEXW"T?W]+Q%Hd'_{g eYe6:7;\؝嫙>(ʱQojDZaIfXov״~lN!JrM@j6t};C?^&F3jccvCVrиu*4ѪQ4UU鰉a^@]} r .}C:ۜ4բ16W7oN!87 MaG[m^Pe[ >є)4kmBV=hr-l14N=0.Kw O\jOC~߳89J2M#xW/Jj^{vcMaB+yЀ)*O2OGvT[FX'ڕ‡w&hE:1iL#. Ik,J,^;\.?#y훦:^}z#6W_8"PӴQ6LdU-2>3\fZٰȆp[ )%H@W.TƯOpN˻( ;$5t[9WQ{(7@` ,eUPnȱAtP&]XaZKzq4z9vMe\@^Xf|9y7nF>OZ @4UO zQ<­Nѻos[at&+Ҏ9 -;iW9|NZ]A1D綰]sXޚlfK پ-8jV]@aߐ}gR N{{Se"arD_̟S|$JeHef-etҨ IL`Z'lYto U]ݯa)'gLUPZbE{SzMvB>Gn",sYƏTgݮ@TCڅ4X5TKnf@uzO7a_5LݽB5oڝXXθW=|Yuj]ʟ|Lk);apCf69'ͼ=@^m_AҺ xnplOi ͻG ȁM# @qZЉ@ #e\lyƛ."2Tųq^Uvm^\C5@GJg|>c8)P$yf_GT 5fҙf!GHغqap#h3\㯈 m(veKR*´Dpdsc ܦMT3i;KEve13`ȕ1R8 ŸgABj>*8W5Daû( "pMoIm[mD~i?K -Q}ReSdx={AB_Ҷ8ZIwl*bc)@awaVwV&m[ #]r!:#܍0ebdal+/];Mva5sPSpnnCϯ?pX 5n׻V8||NQQe\xJǡDmV)0Ͱ J;"KWzˣ[?/MMDl YŏDoQ33zU+0[X[­|}^4L s6 IJ}WjsXhazt&9+#;oi "{<:VZTC`GeJ12\p.5$B3sGo LM˸}дf*jev|&@tnϘE(Z&1\rƆqr}ɋ?a۹aZMtO̱NUSobKZ'a FaƜbo:(Zjܳ[1ǯwv6)T!O]/v'a_,( Y-0|f_QXFJaD9 5:ҔE Լn[MRX 2(:Nޝ9|kC%8`5 }k!!XjD;wpK*KCA쟉bT/P\j,oε2qҎj}xgQ%^F^B[ϟL-CUK rDC!?rS*Ag'݀ǘfcZg3_dX%m mf3ZЂTsIEUi;)MHu75⊰r/*ט6]d5F藺=D :nm;y.8kylW8?I}$S'jࠏZpVB{`|϶E~1!)[KxI@ќvHu?4:!>aqe:Hۄ$hZLjnzcS_畒B٠{>m4C»bo '>F -h n˧`ouTr@|'_KVX&r#{ت)Sq/-MV mS4? ^,B/uȟ.zn50#`\D"ţi ГR~뵅!w'y屢6!VT/02Y8Fn d{1}D6YV/y-Ιǚҍϐ{iq1MwD٠"[mߕ_p v.iVͩuZ7~'>1fo}E6@c !lCP) !CөZ#Fcw!S$t-y 7ڥAiԍH6ڤhl %w7Dk3&ryQDNpNNaq\+;iy Vܷ'xTJvtog"L_kr/L;2jp7 !cwa Ts lP8w">{h!I3kjU,fHQK.-]voEF̄2 :T9zSi᫤+;$K䨮%xg Q—ka/E Ưa8\%'huBW$h,slź4h"3w=Â6I6;*C[unPXV؜5鈣j>lp[lz1JOT>.ۤ"xǾ\+ۼ$ 24#;j eȽ##c\Y]ySW#̡NC:浼#J戱+e|P arCX ץi՟"DgZϣxp7Bƭdaڶ_L;؎>UД&3sNgXe0β/fS3w9@fy;qhI&-sQT.loq|[)/0ȚTF1d-W8O<z, E COyxpC{q.JHvcDvl>HsP)C6Z !8Ph"ϢH.>NM=asqUL"*oT]Gb7Vm1 lވPEᙒ=Rz+..G- aXG- ӌ"I-rGdn-4>@wn_)C֡⮫}zueְm,X,0(l:~g.jbxwsa%e܆JW{#/ki=C\""O#\Ty-|#mUTH0kAet)wi*kݳʑiOu 9>lvZtZ("q;/^cEyu3NIS }aӅ Aɋs) (;xa{a @F0@۞Y(ֵ5:8 3(-b5EVs B/q":٘[:YV)) xi-CaSdF TyvTPES>.F~ |XFPO.5$E1 l%1Ù}S;nzҭ;5<㵑OGѐR=j f"c!*n5:/m?NAi2Z` O瀊bW sE{l?w#<0ZPޣ_._Ϋ,5ˆIxNPRNjKPc[Knq);kQ8QFS3ިYsR>y -TОv!:z^so9VڡRBꌍR67 0w2FUo I< w4cCsFN[1}ƨBCJ_Αkr:1U3Te~LsT(=g( Ӆxn= %o մ_M"U`&\#Q~_2&#DBT-]Mҥ@}LiVv~-GíD寀Xgs{ֳU/E} sCP,5(EW6wZ5Y >Tb#G;򨓤vVT0L5h 1wrpToZ`6i첣.ͣ1mRT?JcѪ:@kVAhxWP3//VW{րg~z3 Rn!\&St7 9+'qB[`]VWR6/#C>EGzvp]^D# S0ډf7cN}W RFe"1wGfTC`%(bAd_#:J+R t'+j<-Cokz3e iZ$cH]r eTY"(ڬ- /JraۯԠ% 9óR"F@b%/Q[XZ{;\ÌEQ{ss]\Fmd$Zv)c8 폕 fh63H^b%|!dx F&;K6z=b5(S4RJ;,*T*0!\ZLO1?"?LHm!Ɠ"/7) HJW.:{Iҿ )Z^K FMPT=<_+kJj٢'_#Y$o9d3H |.i»b6V٠O!Q>3 -Ezکf{ENGLb3jEc]0C][8xPٖᚔIWhN#PFj),0]?4ԔEy]"y@G:Es48ar!RUU[2 uIW<=sb8%GhQ Q4*l"xxPOOΊ€F"&sf+ݩ^avJԖ>f/K;\QJmy료_Slf!{M#|=R~ ;h Sa4wuQU- 2]u8mn<*"^ͮj#-Fr_5!jOQb,v&N\ \sҪ081ty)&x&8lUDm{O"ݥ1GPe~[$2T'*r:chLbUJP±i[r}C?Āߣ[F9]\U}GmVk&͈\9~8lLށ.?[qcRWiO 3_zXD{4y4cTa"1;T(EPuP\%tb+v=?%o=Ŭ6Vt:`8L55HF?0M܇1XѲx#~Z._=6i)|cl+b*UVh[R[Hc)oZY«9aSfj~c/-c];/D!s0!Oe]Oذgu|Z}\-cKϱH\w2`x[ \*s —Uj0=I|ZtQ*+ _o(gS8Z7vD.r' k;Ê I^!.O]]]Qd%'ZՂs']8vPȮTIRaS͝FrA]!2ϥ]:XjW/2 20,V۷8&KF9 F= i-Aim{=8b?qٗ#N9N{y@m)BrʋƩT=$#a>F5Bts(Ő +0p{: :90Nr;ZQTtt BƸ@j 0*bz#+Xeܺ <zl@oB憶 ֹkJYd ¼9N(>uHa^P7.r@~|OhVU*@TMVKsL$mba=];T"-M{vRIs(6@zx zĩ1z)S!.GƸfQ'wm{PR51wD4cYގ1DŽMJ NaЮ!җ C?oX<nѠ<4(2h6toZ/ ,\*gGL6ܝ '^qYX<",(u!@L%PD[f` rԱAM\tw^>婀j f#1!GVv04*kVH !F0xX46an.6hGgpBohƵmjBG|%k6N^˞.Q)ul/Re͸QսB\ >dԿ:2q2ﰸw y('wScGb2 2U԰kbWc%9u٣RPtM:;rxޮ7I U8ǸyPdu*d$v] .$gGvZrP#jnxu8^ˈ2Ca DaD^~'F%ϲ*(ڻ3w liiOԞX#k:Sş7mꢛS'L{CK]Bpktz9ء~~[<6(]m8Pb84 UO0(D&cP@QiF9'8 T3Zm,7Z8ҏyv`$k,eBDa3P j[Vrcs_ ԽG 2QU|UTB#.pD'HO}YjT{izBږ",ef!\\g0?L®!E6ckom0h:Kxh\$'ihpzP,TkYaFAce^z4!NVB2FN0NX#tJ? #+]poa@FLp\vaXz8*N3P5@j^ug{eݣ B1w5]& -(:e8Vpǟq}gc~lg ( 67$ެjL?QHXZQ@K#J^9[ G@zQ#aWȎ-$2.CqT(( 2H2"=:3H#WC!`!Xc;=@F3pZ8au-ByT8mIPo :"DvDPcȝ0ftJ銧wX&,"8(X 'dHw9w~MXdly څ- ꥍ[Tu +yc~[7<u$R2*i%j] @r!REwRQj#KETYTm"v jyR?o_#P ,ZTE3n#J1ZP.jڈ(uC0[vC *7t0LQ5D(_8"?WV4MDhT;F#Y`oĈ٘A}Xk b &cU3QiD$,^C)`" Gch4F%L^?{[ z =>cBH}cCXԭG1 }& jPݰ$Q@ eU-ڵ[{K ˪B~'Xڐa䄁|8 '|ɣe@Ja*%f"Eu<7WdіC@L'1#@EnP7""TZQ; "1̴4Kj}2ZqP @s/1p] G''t Ш?mOU&TEencwc=@oWN"KJ5;YM{d݌Q(R^G_14s^P]؇d rU.!`쇽vY r~h5@/7b9?jQUjZ 긻%`A@k~!œBBUR9S۹իkbVG:t3W H@15,r5/qN-pGe֞HW7b5^eٱ7ѯ΢V?UpM#^ĵ9&2뜺[-v63rƫbFŐ5pj.b{5B􀹢4*@x~?|D5"&X"d\7\/2=tVf?UHB c; Ko_1*zDI@t G"vz>3TQ~9BBG':~ZXo'hfZH7# e9*B9dښaFbJƴM R12~&n%m$8w3{z@\i 6ȑI15CEFz(OP*!Ba:(BnXŀ0#zD$ehW2 gP+R ws+[PDj:{3zQX5 Z9yX4S=EQ"Vư0![4GY CW`hH`'ʜOr@3]q "H: ތ ]XtݦF[fvE@ JtR<# ٍ }+` ]%@sFxӸۑO,T+6"ꀁWVM 裨7"sab@10_ut0VC̆5 rHcg$'(G#F!.S<$p$.e]=GB.h n #d nTџR4 }!Y4N@r49Ku JW!@#u[#N Fo'R'ȹV& "5U5hP1X@F"6.&g}>"P6, 1. J"((uBT <Bx)STS}8_v"OkSt7ZjJ g}S7MО5)yg\bUP!*2tGþwh\2f/B$|Q>NEx #hrIQH=h r04[HhrP"a K"X{҅Z?@eP3dlLv:r F[>ne>@P oQT64(hPsM5^4t({8DwO'Έ̨XJQL@ #P$EX'uS YF5'HK"f,C|"k1&8 "4l"YkJQ#M}`9 :kڠȟ.sIxWEC؁ͥ0Zκѥ[iTD f@ dV ˣ$1 #H_ bĢRPi"ʀ[؄EePgE QMH2<( %䴙+(4UuYӭuu 3 Xy4cci8}3SI* #3AOy#~@R?+8*RqPPv%'H͐`n4W̘ãBW>c]DW"j>9 18"@iӢFŃw;hp7(S1V7&"xa\$A#7Ttz$B"M ~'ˉr fQ6JDIR;Z b(5DU(o8E hƞ 9 Yh#2Qbq܍Q<8v5(@tjRDuU}#`G*K7z[#UhGt\]lo+{#\F{J`IXPDMCQg*JL@G)@Wg ߕ2Ã}GWɵwb2P~LKfЈ!H! bl}2\WoGN_ 1;UZe˴gk iX~x ̌t|GX$-Ax7-|E =Loi\N]纭 p+Q,F?1,rE-ߙb-9֒pL||R$)9]NuKsʹ0iu"9(@ "wKaWl0vF"PXa *qFHC܏ypiL$zz\Ѿ@\Ubbs"VT ʄ@04٬qm5rxcj#?ev2=cޖ뿅n UuT^k-W1*8Џrj mTF2+r>(`ZsA- RƈeCT(t*)+[@INˢ.j:#cq@"f?( ZMPt !Grb2-!ܓ$!l467+kDRN72벁Ĉ#=FZjI@xPcbdР4Hސ| >k~če%Sb] 3(򱸓j@pQ7QzCfԐ <<みB0͠"(1ZT wR"0"xM#D l]4E7/( r<@C"b?haD jOM[ƞ,߁4$X oPlh ڽB0DZS&tF -ܝw @K$H4Cx!S4Q\@#ƁAN8U`>hD əxpZ="21 *'ֈ$@ט":V&?;bXjC~.*c ܇x6 mBD +@/ pWڄ* zƘVڱYb3#=DXRtlt YM"=背C+'j E\Ì5@ϐ@AL4_2HW):\d Ab!yY,|,϶ 3\߮|, B3s@Yէhg-gI.el@U#(OO'^`\4 jVb!le؏>Z@KŰ 7QUNUiQYX@9ec@zveH 9:F1`B9@ H2U@R(,X^6,j 4e#$=̪e Rۜ5ȃb" RHSlZhi3|2Df, n F4T'(k6@EK>|BF1gzֽB E㾺JXn#ơq$=TDQסO0AXАc_.* J5k jj"W >hDP`QBIjlB51kF!.yA+KR yМ "U$uGd>"@`5:О#d&eQ6G5@Wt Et]965j`1@ 1!D+0VZ6:+2b'Q4H*G6> ZA rYbdsL?~#(mK/E`'7kc v 8D{2) "׺sȓ!8D W3&J" rD Fl#h7 *OP?e9D ¢?ܓ @2 0ؠ$F(*jȀdA }W`lGYe2{ȋ?rhW S,'@6V~ 4Q  }- E"/ :A*|.NxiY Td&X4h*\Ņ*;뮶˄η[~@ xq-Q,ۢ ]T3;"BKFhepH5}(&]Bm}忠U,DZ\?lp{cHz1i%J5ْJ`зam5.:%|9B:zStP00!s> 70՟Qy_g *:-벾4MZꋊ@̴ "i lKtFD - CϮ~bYӣ=I+;Xk)`Y+9 5~_@L>Ik n`ý }65|ǖ.Cb{oAFu1L(6S=.̼#tY[[Ep~NT³=j3x&>O>gN;gsPwfBX$4~E8wV|4}Dz?uP@WSecDK"hIӀǢ|@NZ2FT"*6#0nmJf\*j!i uB ?qz dv_2BЉE 7_k:NZD~HR~Jf}8 +F?3w,zPKEYO2HoBuD>1J|hDbL4KY54GxчsRʑ9@"HP0!)0 +G:Jt$"4@J Dlؤ.ȋ:&uP"זbDvh %Q"vDO-ـ @8%HP/1<|b "x(4;DsW$Q6CHLQIP +HBK񼹸:"}u(󜓁 3V5D5,4#4âm ~>b!DND*^$ <8/剀@@ڱ-aoX@SH#1DB. ["(CHtiqh.Z+ Ia4 5di.5U5Y4'*"fTMyJ!Ȱ~4Fx{ׇ74o +a΋@V%4!"EBqb<T*v(hDr<]P0cE#CD"cHɗ')5.X@kUnZ7Zt?eK"4a4^B+Hw2T4D:聆@'5B5a#t$ܑV%谳"l,BegˆG ~VF#H|pN#l~(5,ZE=SDi0þ z"s`'v`uw7B(T@Ge7vNDlPqP0`X(4DA*@'~r#J@I   ܗ=D]*r )j裋Gb@ϐ"؈#@H|w JY5%|JЅ^">-nf[];k0*b lLM[PP'tNTĎV 뇳8j"+pAdHyD̑( |iR#B2 $j"s1t&P\}h OLH8hAXC,qsqzfoZ4q؞z -bhj gk[fMlNR$n-K~E |j.j">kPܰ"pɡ+DǷν0;(h)V#HGA96nϔ E ~*Ĉݓ8@t !c]D>̱ I1xV9)C !0Z% Dw%GE @:>6U)5s{(m3@&#[Z`;*`eK9b8H(&܄,X /(" Ҩh8H!F&~Fw\D~V nF!xGbj5H&j "F>(zB( B}|Ȁ;ȕ&1\P3D`ll3v$2<{8͑#anIB}`Ew"Bۡ@e> ЀA b~tĈQM`73;:4@s9uȹ'VPK) M J)FB[b A6z80P=k2@NQDE"ƮrdDE±$e}DP;TZ}Fi@q'(+^ 1` uA"Th t^PU`p(_GΌIE"P""?GC}ɘ/"J=6'VrǜD-/oA !6WbZfh'ݡ9@L%fDjP >xR4`DUxw!F"./"|ЉJ*1~Q!_E-1 N01q0@"1hUvmQPs| L}ݖy"vC 1)(FGt?NzB]@I"lPB|#Cb3iW $@@e؁@XQKP!@][z`oDP-Bb'Du]4v{TO *"h4Fhf ܗOY>#hq )U+1"53Gì/mЈ")ȓB0]"#H+Z<%qhLGB jWE&,p14( 'vXGU Rg0I@Jk̶8FBhkI1dFm2)y@De&G€yi9&ʑ?ZNad<ȁ zh #N#3@_CJBS#`cJc4Ca75>O)N%d6q&DN!-cRVh} :"cb}7CxtF1I%ۚ]\xz J!!0!D"G 8ΐes^4D4%Gp=)г&'։ǣF"{8 uGzzm*b3(؀0T+*C@`r> Bڀ:l#0QvpșH.n:E5&W=gQpdLL:"(CAO:>8IGM1)1R@ܵEZEO4k?hUDt@LM d:L&@X#t9nҁt ĝ"F uxv!\܈NFG gQHa$z F F*.=Dc>DL[jb@D*Zt~9 flFj}`^H@;*T6DO*

  • NWD:Xٔ lo3 fbַ5V:4%"#@1?؀?(Ը8H[҈pCba~FqZ[lna==yDZ"=8'J|Gc"mW"oܘ6?/u5ɬӇ=(Qˆ$"yBJI4nPmMgZ$r(^Vn|)yˀfb敷O@Ӑ$Te6|4_65{Q \!@̥ھ+kG!")6"`3-˕`vr:N-lEBפp\Lh r5a@ N"fbMV_Fsa#BYĉ:){!F@M;1#*7t@ sH(&(<.N$H؍CR%xPLdvEv '^o.m> +2ĺȩx lqǫi{_ԫp^w31_,a2S|jnϙ 8m+Sf_8@Eܶ.V˩-zoFJ:woD@7{P3RAG9m- 6]ra㤣Rbzhi@Ș&͑MU>ty굿dZ^b zVQ,K(#x@El4UpG<:N'@ jꋐ&@PѠ4IȀ%$p]qhԻ-IkXak13> 9N4JP:yc `%]Dym0t@/B4Gڈ#X#J " $"U@'D`5[AeQF?dN@|sѭ{a '&"*120#JJ3 ڣ9h(&:D*$t!ѷ .h`"?T U׿0OHDE@D`,a+@ &ئ(z {|4聜D",xXJ$!sC&֫ G)-@/%d/(+r @;hV& F> bB"`Ȣ#H! H Bd4Ș#c!0Ԍ 7=7fA5 #(;-{c!@ ExbDI5Ȉ FFӐa^4%Q}:``'(-؆#DH vP8<_j#V-pHȱŢ#H)h+`263$ 9 r "JNvNt0he~ !02ͼiH#"EP<#Ev \P#&jPA(@VQ,}LEN4ъ0D@b;Xo3<9𑏠f^Z4ڜ܈ #AF`zFL "@c4I|.amj6ZC .#(P8tD}"uh$?(Q%hLP@fP+Dx 5>FZ- 1/qwQ yԀJP&!p:jZ8"L "kG(:]B0co@à)@ i航`y(ec #1JVc `QܠE3l 9B fh&sv`#{/D "Ub]3vգDWHGR AB"Ҿw aﻈ#>(isd5o.DLPn荂 :&Fމ C HD{,?hn(3J[hǯWPr$KQ3?)C"qrۚ9D z@8iȁD5*(zCމ~n@1 z*iT# ͉!1W<(H$MQ$1~>: E<o TM@$L^]΃R{Dr^A *5`EU"Dsp3@i& y Q_r\&މ9FՌIJ|Aj.\52)Ό8lM#à@ΡC@^mP-C& BڿDB#.\ c: ?$gt@:=Di{,ژoQ]R!( zDF/Ht@$%GO5 VmxDZ"b'ڶ\IDpڈ PHN EDCZ 9QDHûpDr&6D u}R "E1$`А"(UQB0'uF@ ~PQ2<_%@H&򁡭jXr#BXDu*+09G8'R Yuܠl(6%4D* !Bʊ8J5lEW>h\.,H1Deak3$(PyRɳUB3@r$Ɛt)as5F3(QPZPn< TU#m@Vߥx"AqxVTS| "(bcFTAsw2*%R# bH RN.~X D [TD Q1ȅ>[x`@oQM-%GI8$H$nX("2,DQ" B$w;Z tPE^uDR$u "8Mc@V q(x!,"u $JP@6 <*h.ԛBdI~c|tK |?-YRPea?p獺k9/vCS +WB5u:͛|_fjs'Lɂu!9F "gn<>ҁ>&V1*`#KMTԣtjj/_}K6W&G@IdTKt9޽QkqNnu9[gan& %`Hث RoǮq24 R ŰV9BtZ ύ[ c R;?1Ljwr .['%ya8~qC&C6(5Chu:ceWC;E@&ǯ]t4:rF(OB&zF<%!+қ ;hb,_Qԥ_7XoB ^F_?3T榙?c.'Һ/ADt?åׁpū^&=zMUvN#47R bGyM ׅ2)ԑ4 5F>$ P|M"pPw`E?f+iP֗R2S@-€"R꾮"h.QI,]'>;Hՠ,2nPDv aǀ<@~2ߤHn 2&caFPH@w$MPYDK&߻t9 9k(mO .5 iTS)SJ#0B> E>(ݯ84Hu7<#gD"*{ڣDpDR +=iJDhaDU|( q"(( ?Da)"DʖwWtˈ( 5<Јr d,FN~&PAp-zP}i] W:30C;p?;Q6hE P(e,h=nY1qV$iQ!zy<)Z G4.( 1EQ@N qPTH 7 P w%k~ˡ }` $ <"!pΠ;HSG;ey  l%nPM bQ@yG"+ &hrLkA.컾21>|/UEJ`CGϺ*W`F:n $ R+RGYE@* Mb*`> I *B˰ 1p8{|CC"lM1lĊX9Gy]$FfVU\DaIVǷ^@^zNb2=3GUYBdĈ$H"D"Mh'3@QF$ ܲDZla\\@DOD2fAH(Yuxf5,FpU "H6 "@؏Z ?P&%I\@b#i0ODD P1 x+Tc=/qH"7cE3B-hHWi@@2QD31JN%\ GX āU@ޔ"hDāO^ >0"#tF 9@O5K MB~G]<`Qp"kh7,KԻQ & V|j,% DY "p7BjG4L: G?Օ0TiL PZy`2 rD]˃DG0h;fH&D !^dog HH3ՠ+HQEٵcvQhD{14A~&\!5 VD:6UϞ`C҉3A?Bd*~+@#* UAncJB+Uz/#iBd(2D ]C؀'SG_i@rQ٢lLB{c&CĴ(A^HZXĠE%  ]J#H?dH#IC!ah"ȑwC $|1pP+Z d'>`HDr70(Е]G#BDaB)Zb/DP&'a;@/N9/:$>:ôF|_hl!J%Ĉt&$+\E^'4>f0"=XʰqcDf<1SdO$+ )UI sou?DD֠tz UD RU:BԍZ7IRx#ʉ,DX]‘B"s+2BSjEX@\י<mB&Q46h`P 2EA@X!PJC\A:Pm/à$h?8#F dA?ƨF硋@0=s*@J&:̈`DE,J:Ȉ"$"-H eXjr%i)Ly1'epb{"g})!Gހz}2Ht Yxő*bGt YБ ${ ټ;VQA %Ea-vtL]@SgGt "I8a$,-|z.yƌD$hQ$̀!YF4édb014 E f$FG%l@<5韻MCtrh@P#j~Aq?%@J؅Do?KCWtQFExsTR KP;\4)Ȟk>?h0I6it&"UrCb80WuL3 偀6(-ʧQCJF ^dd( 27$"EIdDiv*e A"&H-F,C#@z͠)h*1$FDZfCrMEF=ڣv7MgCqΠ#USV _swr"A(؉͸PU5JkN6\$e&/ڨp;M;Q wyQ5*a8*ֽ>DWL/U'aS2ȵ!ЪeS1M%_Hc|Fg flxdGdk";ʜ12sWN[.(!C G`-"hD^" f5yT~%TDsPhQ,H`'JąDP 5GPQ"(( "LDZC" |H2hJDЉF$TADQ.gH#d @䑣"eH 9LJ(4+ a0%_ nWгF8Ҧ;:@; #5^Y!pdfHdI"~6ThWuV@$F"bD~&HXM 81+'=@5HcR Wў RJZ@UWvRh# :{ J$W&, 6z4N5=tgGu704Caز'ȀY@hڱ̠-(-06HnK"y4+jZ,2$Uʙ8jsZs3: ^x+h Rk|WG 戣#dV7/ iY#k7aGeDr"EUJ'@?Bʴ"9 \>6:жgB/NN" ע 5CjFàINoQT@v~HԹjUD Zui#AFfD j^ N`#0Dmu0]. 2 /*,шe蜢pM 1(9 HLnHRQkV߂'/Vq@)ME ($f czAap|ʠo(B*JgD ʂ*UNq8kjCD 5Dv!"'b&HPhOSնTGw4` *"b~%wdm&*@f9$)hY ij B 4+y~H(O YrvT"'nǐ5^Dc\0!@QHJG̢\"ghV$ejȘG#Ή%Pw6#mZYY#Eh8 Ex<BzE"&}JCoaFPd, '(?FM!YH6mb _:v44vt AYx#A~W&>eY 2"zE6;VK!DQ}P+RZͣF"4諄je(lDO 3$ 0A XebEPpVP< Ơj3Q.s|v'B$.HT4QzKQ#P@Mb( j<#'ބ+ȘE`t(h"fEb;&ʼn'~D ya+@ӢLN₠ܜ@b| c ^EjJt36L. 1(ӚϢ>E@֑ZG܁nGTH3HD ȏETGH3FpJJKDߑ\J'ČcD #1#̈؁@ :P  vV^ J$w/ n'F&2!F5 a"rF9x`Dd"04E5TU 2Z#L@ )  =TF6 :k$ͣ&DlbH@P@  ʼne B&8:/VmzP H D6ty=^ zH `, wFakђ NE@ 'X7w@V9Y>0(D ?,9$,HԠw$ywXoc%hMRCA".[pjr؏T@"&ٯգYR B0^f4by(Qz0#+D#dh$H'4!@ nj:(4yQQ"=$ɐ(4:"1i, hI.1(F~cQK!=~nBO$Dyԙ5eԛ1Q#Y"fȁs衾@vQ M]t0k@KqnlFEC#" j"+Y_@S`ڍ ""~@1 `dGIƠ'bm"@K"T S6aP-y #WBNXNDI4$ o5 A\@j:Ny ͤxLQ@UEB%I6wS۠eh ́L2܍DKT:&"Rؘ#9}ae"ę27Q@E 2HmA 5 4GG⁺j4D ~KZ&V FyIIDO, vv *C@ bf$1-p2D=/`AO@$P1$@٢ZF%Ѵ@ &Ȍz<uXҐ rl!F7@rh97F'ח`:6ȡDt9B@r!'.3D@@uCr& C!4@y20(Z, /wE`2 x$L '_+:#LS )f#&C 'k^$rQ#DRF44@٬h]t$AX\]d B*;v#a|1.ɮG;$@Df@` H>@X˭?oBҺ*IM!6Apa6ߚAM )XKlM[4|}]WfBH$;|1냉hHs3\q)oك0,'pծoWuen}Ngq-y!ڡ:;J{v!7r$d0NW[aWɾ|Nt h^bȾTLOc [V8һW2$KnS^ ?ȸ![}_HeͿzB-x̲U؆`~] 6JM aqk|b(@ $8Ԑ6Q˅ܐ_|}i𔗿ǏVB(ydD=C6Eg{E}0SYBǗHs4d2E{bnI-4h|^lS 2hpjM$QyM"n4@z&F\4Ov#@ ʃ!;DP5@YwDAEp9Z{ewTDOqQav@,4i4=DmqC̅7q^&',@#| 60 #('DQ-$ "2MFq :=TID@)J*F*@\A9bl+EK^]Uj$T8yV°x:.c@ ER"ĀhIs-)\5D)"[8+$~ Ki`F(# 2;4GB2%4 fhK"Tg[ :HDhad*#dׄIDbSG2{I<F@SBP 3TyZ"yqck@Wb/(TbTB>yʂDXQߡ+^GQIU!٥WH:RnN6CxDUюe5UP"@&JvI2ðaEDlQ~DU2(ďz `3p1DN5F1#b6&Kz4=0,C##(Tɸ9@䅭FQ-c,"<pTeTB6 tQ*""-蚢#/pb`U>bȉJ$aLAGX?@uzL]hn 6%@|ВK$OQ#J "cbL7kG 'DJ /#k@s0 -b# KT 孈x7NdT@ d UJ85('NJ_ohog"~lXʒ!Ty1ڢ ZLcPT@+0+`5hvLFpKbA`".B]laBІr,Ъ9*~Zϋq4(4+GfD:G=/{"9" ^hO<!CabDJ,.("!)1$('kb <r u Nt@!ch y)v[v+nUok@(*@-ZxofqK&nK#H0Ț24(j#n1n$ph#@mqn>r"a mJ"_"(MU~ > 3tF Qy<>yu$Djʢcr9@,1-RkKWލF{. QY@J"Pe ' ACDrZ 24V$3 ʿ , #$A# 9c^ʈ"!yXI8(D5L! ZECD?@DET`b{]: ^fѺ!2Bs5nqc(QfUנ@3Sj;*["!Q"a)9{Dw-Bq U˱_hM@ „D^2n1 MQ "`&dv3H(lT K1 D]AFEp2JMv" eTLs@qGHF$"4u&b = ;]hdMa:b  i 0HRgf"E(H6@혃@JW b9hj$k/=CڦN _VjL֣q͵:kqHM"FIXF n]%L7[Š;f& LZ ➣W@ ل~ZĘ#^6FՁ?H"{HđHv@ݰ!:c+@ /\ PFGG_[YDZ"€3W@G%$q3mB$ #7Cf x @pNVE c{>ծ@cPey@ "Y `u8Ȝ0ֈ3$OUS%@&tuB"6ݶ$TP(4BR7ȉt('0 nH@L_ͱ!XU<0NFAF֓xk"XyX D e9Pr#5~M5[@&Ǟ' Tx6])L-@TbHC#:ʸ&NtY2 [P@iP BH|D @e( &h˭>6;J&@OY!ŰSFBUSL] 1ShP25MF!H$ q`DyF@nQh D@iD9m\E\eb ƆBҀ5@ csG[`ehٛMϦH?EP@Eъ"z L`bk`Fd@e(jK0@x5 :=f$L#\"a5e{Q5l"/;$QqD*Hzܣw5b|XGn[X|@ jDq uTqߠ0fn"%3Gri>=@ʳzԠ6hz"8 @Σ@U$>I tP gP;3F?a,cw.-c@-HIf7v?ϫ' e^\ Ceh=Jڪs:x7.杕YυwN)>szYQ?1jl5h9HÈ!29~g,ĔqC2|0iz!#׼C#F/a- /mhKFPʄ}K_J=4O؇R-z涱{bnX̵H~YG Q<1!]$?`zU~">sO]G;PGIz'XLY3 WmT#@x|̚.Y?0_Ҏ,K7#9dgwfڔ\41ߖ{ca<hG}_TX|vD?P+ItXXWV^2:MOntjM':P#HD}Dy\U o!9t9D"ZC0{`F8*kh #-6H "6ƦtQ!Caߚ8 vA|X>l¨(dwQ!BT_N."Ԗ{l"،A b"p""xH "D@Ynn m1KW}fP;2;(;4zv(:1-VSc@ b^b:(oZ̪KFFԶ f 1}e 2 yFQ)sdߵztİP15b@zR:hA*T%/m o.|fܠ.EvtD<U}n#, L"# rr'@U1@I Qj0&"Gi]HJ"abD=@%E0(G+Kt~bqb;\&e0eh"ЌGcȉф .Ϣ"$ NDTuxDbƲn6Culmfg@- W+sm^tLI"b12K8#\),Eb']Bl{P<}Dʑ# hbKŠq;c%(Bx -HU-p<$z4߰#@DP:jf\i@D" w u"?ӁР\@ycBSmH~, B/7DP0$P1f*@ 5(Bߟb]`{THzDL/"}IQD4R0 RLI/0!mRTbh ِ15}tHY "뉰8#S_X@4to3FGTܩ *| j"lOu "܈DHP"6ZD ']dL2+*D"'z0#"wDih$L"c+"D2a1kC䅒`*b#F1=lC phD!gt<S١B0H"'ظ%QG55U aБ4Lc2"c.7ߡ+B!VD2:u@Pw0"DNF*\Č7d5蘪3 窿E$P,BE]}Qk5EI &̈`I)k$D&d#F~Ţexpl@B:{h{.u@G:J#DY(&AEU֭=41#4Ќ<vuJl_a'-ZnG[h9HmsVt<B X $hZPPlDyli5@P;k F0"2j0`1#W a@A"N&!uGhEя#ΦF\k[FCc24*̉t#B#omܡ=0a{cψFW`x1,HXiHy1sHWҗNqQ5d)_D\K>!VͫP "n:$SjG^P'3?ȍZl@KB IJ*!dT4g꾎J&qɭ!WC[ˋ0{GD^"4h@ B!$D9 r$T[7GvPL>G)Dԥ^glP`Y`Qʢ:S)OV0}H@OP>uVBj1edDИy$ 0@r#k Y*r5G|4ƅI"fxa8!*C``j=XPSU4 mqB?#:YNGX"(;(B.4cD]NI"x5 zd p(7@[lc :'OzSP&h$/#!13E~]D]G(v1t870"F$ܢnh$LD#ODޓF J#Ua.BHem /In]t$&? >=]emUtFZ")X" 'L~#rҀ7@!@ġW<ִ0aQyNOP# _v$з+#a_@V4*H*GW D|&!U]ٍWވEaUfk"l@<"bX ~hޱ EMC,1"!L%@Ϙ 2n;t >${څm^l!YjIZ#(ӆQQDp !\kMSmK*πۢ4nh֚@q- L:$۝ SnNܨ(TG ZH~av @ ʃ:Eg2Iv,}A &'/955\/? _h<-T+߽|} &KZ1(evڪe @5+o;G;4e >MDyhJfg:`w[ ZD2&ڴ#iL?a]FfœmE= tGI֞_R(P$D[) )$Ls JIK2Bh+sG,MU

    /20Sf\i'98uMѥݷ+0署E29|'CP4&>X| YRr T̤dCM23@ +UY.o/8X9[V4Yg%y;̳TPfqJ^,-K,DĉtŭW _E@Pr4Xhu|n<:qeGo)=&hTĖz.dGy8+mY!ƔSk9y_R%.G"Zcű ߤkϖ-26tmEk!=# ^6JN^04q[nʲ8lMJtxƋ䰵Y9u2}DqLQIwӶ1Qy/ҞZO6]\ʪ%>/kq~7R NZԋ]Sҥ5}3 +#^ ž1B3k2I[ec];1sLD4'IqJR [DQfMW0Ʃ֎g2ᣴhkԵ)8'j]ޥ/~oK.{NY~rTT`ux[ݔtfCRo:/=eN"n.ҹռ|DY*d_i:Qga3ފ i5fq\/d>{@)f`$R[&$H$ޞK …">̥|X!5owi΅QW!#xg80AI*sa>x/2CD,pAqbKEr{"ƚ*- VLBm7^ҁ+'S5gVG-_ӤЗeY0LRi]2/~aiA$f"rj\ '/+M+F:%Z_Tz~0eٺ<_O21Cd`[DȅqD0;GKNPD,sx68$OG"'$5ȴBH ?b4zE,AJd{r"6ny &kAwLk/f쫋8FA M`D{SŶ+B%O3芘ǀ+\86,g2 fљYv\ <δi#\DZEoaD;7q3\c»[%rLSǣ^]x"xc6UP 8ZCӪ+46 ~3jXOucB18|rJU Z"y{C!]rs.S,"-:Zy$v^ HXtAG ˊ!0ǑJ>AH㣧(}ƑG#Bu~/ dZxRew e]>_IWrd^kT5Ը샃T lϚMՑ"h6-[՘]B?0^Ι %_T\</H**(')sdDM' ^9%;pBA)+y&3GW"JI^YD7ߥyt%:Iyrkկr'b OPP2ʰYT1®ŶɴiF\!mDbǡf),x~b!fQ5~6QM !v#x:R &gWr,E^N4C'czQ/ a=/SfJVUҾ%v=h&֮[6&Xb!yˢE:Uu ƆQ1 qKAkm/VٽuEu#Hji(m;_森Fz$#D%\?ý+DŽOF`JUE_ͧ])9P+,4Њ9t( JR2gP lܞbVHxhDE88 fn4r-u8,QXJ=eOFK!(#CB7e&21;v:q`LVTvoS;FutIeoIvz-(ILJpVM"hĨM<`bx-cImvBKHC"nσgT~Eai{>r[+ͱ}c.%g2V#hr9c`vjrl M}A!WVHG9hބZ4-liΫP;)g4o@6˰#t~#7ˤu5Rľ#k T`}}}:4c CF!ELl0fjr@,  >XSXQ P&9NJ NEYY(emH2~hj3r)AkYoS~צ8Y I|Dܖ)*d>;MJ+e<\ɻZPbHyyv0-muѩ 7HPG(& K(Q>HYń Yā|X)Vt;#qn躙±!tCEne;;bd%şI@nVDfKbA[ wk vSkPh$/€Eڝbщnmhr&p]ќ̎v_iK_kV 8vsrM u0&I͈a{Ep?Y=˙qwEƂ;($ 7y<j$V)Nz`N)=U8˦|$>|8{6<9BԽ7$SGWGbIOTJ:l>~;~3u-Ajk( @\8g$LVK }k`8< U%Uԓ\Gh<uʌ5Lr 5Dv0`7B\*iӯ6t/L%i7ЇuwG3NS2ڠʀ[LiB6!3xj&u2`Mjx!'_'N|7=U2?iO8۪+%L;ۆ@:2T+1h$ňrrL@$ފ2uK)/b'UG˱$ui趻Q$CԈC T&zޒ{/ě P=ͪPHWd!i )8:T q\HIO!I*cP H0PZ&wL0|y Cb!4*tO7Ѭx51^P=<{TfoiC0Wa{ (Э[h4 ]Jqeݣ4t5)`2m97nL{[N#y+9_v|5P6"PۣqŷL`=G1E{ء|ʓ^*+|8e=ͦ9-NR}DtѤ+4̂R'x ~ku>!l|WVǹ Xytp>jkZ $jBOAA';g a +{[f*ɣ]mpHƅm[sJD7HXN}Ta9Zd {A oa-^HF2|fkyȷZH$ ge{d$ 2#%5)mO ҌW薰"Xhf☻X0Z*$$88Bc;0fW}w +!ީ [!eޥf`<V.v';|3eBjI/}qL >uwQpj {V[}^N7+iΦEo=xܽK& ?O _m S@a`FPX ht -B1[ϔUipab0Z6J-V"wʏ}ɱ0^ <_]A2_f(H렒6</Q>'Rz'Be'\ f^Q]_!8 ]LnʠǓL'h'zby~硫9Blf[m IύR}@<8G^'A ߢ6:#|&jwy @c=$S4|\΃eCzSLjZ –JA@ꚮTQ1x5a_u0g$U T[?ׂ<k-$H-Q?xghɮZhֿ2K@^^#r`BDeY:Ha2x NjL~& Q@D4Z4Jگ3%sZ@L{qq8G<|QNlVxz]J>iE^ZSe;ΐEf aQxE#=67U {Mұ;,>Ȅ>/D/%uoPcL%t^Hka eՋoxC:Lev3oimѾ8=}p4 & &J~쫛S+y)5'  'bl>'6~+[h}z@ #Yn'J=ņlWw 6՛8~JEAM?&$_iqamfy!2IG8 80n7@S}C'ƥ\]_> b[(WZ$CP_^q+ 6x-J2*~3\@̥ly4Vh(rS|qe~{v]mmiF}?|W4TIa42~3P OHJ%H+2<Ҟ66ɣTpׄ<5 nV Ptz+Q3rQUeRCIKNP>`ܠ#-4x |Q3qPRTnEAY Ȭ f*R&]PL"~|fk(I#&C +vϪZl([@$Б^!q(R-|xa^!V9R$)Qc$>=zaIb2:_NdC7P_yܖ]_lOw<}X7:}uJаz0>\flfvujVI, {ӫ)~Ԉ_+Κk-&G~#D9CĚ<9 qRn~C> sk? ~ &첖IC)Z” sYUTk2WԊ8zx2+BK~*nDBCs=` )C54aPB@}}"6{HL3f0+U%P>i7gÎO(MP.dFwNw_l%(e_cX4kUKwE ҿ jN^ % ZZLr=dke/ABes9mWz<2y㊿WS {d]Քu~D*1I*_hп/w]8S.!`;9ХgCT71I5L8ȩ[`|ji2da)cّF!|a(C^9P oޱޯp\E/]|OBgߧFj1 ' ŧ[UW&E̽OWLHy('~ &}3doEȚ58{I;қn/ej+0,TE/_7[}Wձ4u V`-Ӻ?Dν<շ6&N37M|N77{llxC)bfy~z^tedZfN),c6qkٗ0v$vnxf;JŎI( P% S1gm['l[k(V4n{N](л_0.-j>bZeӉ{z9 a3bA|29mi<y T2F@us ;(O&Ib9GA]:GV$se{r[aE wr TǨ_= ֍]5qYPvf*X4~q!ۙĀ p 0H`"V Nf9V_ YJN=A<_1aY 30:х :SiÓNgsqD90e,waeƒ~dmw nmZd*׆:6QXrЁ٤޶C.i>M&vrDjDVZ@Ӊ j"7${A,b@@d40agmWV~CB@5Q(in3ITM3*\RHݤ\\Cl Sa4H%Zc300$#osޱU Uy d > ZoȎl̠21QtZI8Ŕ2 1*,Yk$H/]k2h'jld M7V O6[3v9._G](,Opʓa:kWQaXx˱FlE5$D?NO߯ck|xisʃ{6" ڼm4튼w W4"ÄW1f FsSIX~(:JaZW,'$جmx[We‘ˆ[3vauקqWH;YL?3Z)hvs4;@dg嬍p9-poy @W^pPaoIeqIOA:C}=>-L#HCx呀.zEdžfЬv qnw=TF!{w7j#?x/ Xaˑ4z䃒H{^ZⲤIB߱Kx|ց 6׿w?>8߸Ek6o+ۯ;~ip Sx2GpPcn`>I.%/& 8x>apH$~LoWX -Pbl[pN ?2g2 [F&&ۘj+u22M¿@QQE+ [xm1"S;j;Sݞ(_a1G(`.{6iD4{AWG-I:U?HDJ+(w#X\%U5wF1K4djUÓS`S9"-zPu0:=rzh={#|*=0mvP:R OyU9PFS馋9`2r RMgk.i傞Rwo-C;yp]dLYJ!sLxaNSRQH˃ِ,Djl/^x s],*&Ox]ԛY-_vId1`_zW1W~hx. =l v0ł#1|% ~%'`p12 1Ւц1"Hs1pHPcNaRy>$*籵 b0SXX;ҽ碌OH\dF)bm償4[x8 N7]_')h * 5#%OMEC8/nF1|ym&(/.2 ~Uakh8VX*kQ#@Poc`( r"q]wc:;=bhМ >ҚXm#X/k/S%=һzp_yfW鯢+c:Bڐ°VJT>0Bł73(<]L)\ LU<p!L LG rxsYPbQwe_uP9y7$1BgOnKA aT?9|堫 G0eWZLUpW&[@|i"रDg? L ݚ:LWg:kQRS28_c*EQI:!)KZ7;nQO$(= ?z 0|+թq]I)@FGAi8pNn}Ԑ\VwȟVx*wzҙqSk$;2s Ŀ84 xhsz8>'Þ&?g(|;T2)}F`=}n$bo(٘H%-_euU|90.RZFhiŨ?:KD nx \z+*A/=s 0PG3g@!!H,=psm9|U/dC6L}:/OO t/>zcUА[D?J@ht{׎aOIzl:`X1r/nbc>esH9w]v݄4-O,Nj>87IS(LyL+b[Ǎ.뚤 Dh0M]k!A fC=1*|+s>F&sҷ y|A,2Cѳ: ش  #eBk&ntNw`xu9IýXK&߇tؤY3걋j-Z)2g 6ik=t@u^%? e{4` J;݋G6@Us >pUdf{[p'gf?6uqDDt X]]l?T(K {q)#e}H#'|(Z,^fZL.k*.I imt2*g)ԣrO>ۻ1T,z\:BVZNpŚFun)x?OܽA$J<3vzqo2I|:mt\ٿWB]gĔyxto~`C%]7NN9xp膯ryv.6 ~XyJeG>ׁ+pFj)Y+@/Yׇ:Yz!(94&XZaq#Jq }Lb G;N}âmlnֶS? ؜FʵOK^OЪd8T33яAB}-8< HSg5B3DGR*ׇ/i9v) xyY~@r Vtfn|,jrbe2-E-q? 6ux*՜"T߰3^*BpriKQ9p&3zzNVkc ajp,7|s@}=;ʹpLu\ 6/A^SŬ$*xͶӖ/@KZ{ Z>rਙl:䧏uV$St FN}ɍxcAWW]m .+=#E-.HYQW\1ç(1} Fs:`XOh$[ߨn[W6Ff̝sub%԰򊿢kd902ϱ@1BqYr{7xePruo[lG'T]+ 6 ,!'#zߡ@GZF32JުD(wpp?Ju߁iJm s#Y/}z9"_4& >Iϓ{zLA5h Va%Vy3gĂQjӺ!ph̀RޠnjtbCq[k_ϓR,ܮ!TKFeTg'zR [ q[8s?V>N!xVU9PJk w=h=۔PԖ^ҕڳ+y$@wzE>4d-7[ g?M,4A/b c:חŠ [:&1<9{^ h8w(U2~Jfi;]_̼R]0+y-QTsJ2tCirc:pRͫHfprx ~tEr FM2}ڽ8k͙{ӕezS bn+@)ۊ `*vkRă/}9D&yIj0rT%8yB_).f؈ZAJ$e*eIZ&/QSYOih荖q|T?AjݾqeMےo/w yy:+$l}EB*͇Hn*=vDY;qj9=G]` G%Q>/*͂$ 49V WCt`QfŎxNU/9WbxlDd[pD5@͠>u:ujAd@nj&*l'ؚNM }:#=fW[l)߈y6}kGHn폽G? -; ;Di$–ʲ̷݉( tvo̍\j 99_iscTDTȯG2. wU'h}`vI8x\FIeK\8ZC&Qukz0q A{/jo: : WOD%gcarњꖿFWD3U=7] W95>Ī nMM hDQ`>fE%Q3>m7l<ÃuJ;T{ނy̕PhN>PԼO{ Nqb; n?3n "qz,m]Ox`6e0/XwK7T_]IA^"{y?L+9 [B)trfmдrt0v*Iȅ"X") M*|rҲDGBعCU^,w7 betÝ=HoͱA8PaAo1l_kIDcwpХ`\KB6([uѸ׈C1 }%<45x!>(VcָrTDn/7I6渓ac]n(oGPrm |5{reo8R"V$k sW0qJEta57A`%SOY.spUEYLh<[ļ̾NQk.C |H> N$o[()) =Aw`6@"%݄=4BۨXnk5Xf[4+4JYs;pZY- bHvD@?}8 yHS &vy#}Bӻ1YPEޔ| qXZKm(C竞>O6l}8 Us6ð/G2e ʦojBv1hKɡ3wy sߕ|e>Y0b9ɐl*A"}s)V[擢+ULV|[ɸ (YmEEAs)\bTlR“v!%p&6܍[cmkFXCX*".WaT<Ƈnt$?֯`Ejxai!9pҙH'tTTAc*?|˧_!zp֌3{6AoY6 -D DlQsw<~ܜʲ^l&v´qC!xv,+[շkkkUqxfTkgӔl@bʿ҉p,詢zXh54R}̞"VL*=3|"JdZDcCKaB^T깔5aRw{D:FyRDYu+ D˫UČ#g*ssYy0`&\{M.BԊonF>YF F^¿\<g",jbߥdd&[!Hӑ'+$ѿhq)i„uU+ 7j]fM$"9L!cൠOvX _`GORlbXLIOWAܝ.ڨ0e ]`å}PeX\aLFlJU rTo;r5u *fޣY!< gfo~B8>{oAъHK. WNI rgؼTR])z;$YEdƩ9W U3M#xpH[N)u'F$+b]$hԯs$.G<.LHp>I҄Mf9J.櫱LEu=,M|Dư5hRU h_t'SV6b#u ɽJ~VH<<0 XKW#V# ;s;BTDd|\o~NACwpY4 5ڎKϷk!%.u>en/6 Ć1I>kY|!ErJNboԼNO i3),%HsN;WY (}_Qe +6)Φ<9v d;9nN ;(|q2O5ʩc޽d| qM@Wi;_N] }J]w}9zqыSq%W 32Uwl$+)3dAcV %CP 㶕Liܡ/nquڄq}T#J&%ZA $΅$vu CcNbuK ]Υ%<0{_y59TlأAswZ1mnp ȯ7>Hꗰ c?mV? ny2~*iDžpqvei sE{^M<@ݽCKSX8 !)w #%6;mb:flivtHӻٷ)Gb@j[:c&[XBʽRAV/gI.1\=:N(Dm cZTLb] sByʠ;L]ţ1EyS:Z#_%XFDdJf%v)Q'z0[O[B=OAvXY4ڱ ۭ$R|lz"P@tQ?n1Y<ìߗ4_]%1}_D/v p%FJT6ls O¥N^ױjL q>|X}B՗!(9ڦD''%UNZ@ }Zg%]نX-}Q>Y!Wle).XA$&Sd|__[˸&36bNt$ed\!;8f fcI#iY6zo^k˾~{G $*}լѬW {tOrfL9-9.s޺N/Ї0hJz?>ߩzF̟}PO5i]r0X4rУ!-oyhGJNF,Zb&~hcnelwIAbV1<1{uq[ K/DJTCU/x!P3D-+9<х6tGc72`i_9mQwmz?S*ޝ/~(8̤5#LzKEy.@Q-7:+'4TRS6u3~Nj.zn7cN]0/٣w+mISυK};aTG.Y$kˢ{fyQ\<}t&FkMO5-4 O X ? xs>mPPw#_ ggsS-jZRоǢhᅢ47⠾ Do frWeWzMc3vɓ\Ұ|go@zN/[DG,Xc ?1Y}>LCAC˄N r(Is<_D+EԴ;%FK0bQe/B7K뿷ҹf`04]$/rzҸ߈7ƙ8Nn ( c qYg0N{8=@ķP^'DngZru u/6w= ?31$ Ǚ8m+ agiTEVM™k^xG9y{u$NRoi-`İ#hGoiEPCpGVFtR9V| G$U;ap+K#t\O~n0hmGl5)l Sqm.!'yuH1N0'~ӎ,mD>scn;\nA> ~2if;PQKKN&~;u ÌH:`+s&`;,ًs:\˧Lזւ*uZܿ XI= 6z ΅-S7"o@xJ+t=vӒMkX/sXc&n6 ؼ:DNDp}Ũl2,GP.(d5 9^_U g+ KOa:X@N<a}ybh% .!p1bJ"C1,~~2gV)hw|3*;C Vύ V0fV:)xCj{ Ea.~"1ng~9*\:dNK)r9[V1"NX^u@`-* M. wՈvtApdA؅U#UnhpBc?l$̸|#IybգF~,C0(-31mj2mܶ3{7`[1*_ 2c&`Mi_J$D :pK'mrq`WxH*`evk69 /Ywx*X I F0 9R=X|ލ &ТȭfXc&gQdATkLhR2l~TQ V&J$JOixrAC^U@3 q=$P>\+fwZ^~`K79]ikāR/4p!z_(pGV sd4z>tCMFRhMoM^شqU$z(D^ C7s58= O8- cWHz2 TƊEI%f0-7)E^_i4޲Qe_,M/^QrGZ%{n9} \wFSsMd,‘1]q܅WhɵbN>?xH@Vt5C&'~g Dr:O:1E~W:f .Lٸ"8bHͦX58YA4NN¾㋠d6sө:Tc3O\Wn͌YH `NP%gv$f$[SD:Q_hYVn+T#P0-#@3O|_|AGzEc;{r'N=!O*MXgZw(_}ZXM X+{X*jMq4%m{ݐә']AVRKdM38 TKP9ƅBGbv4_"0~oD@j%hL$~JOwNc0i*塘fNz6sGY_o gҫ.bZR2s~:y-*`3 ߿ӣqDfА{Rս],2᏶Mlr=uX"w5±}?ܠj9ntW]76B[ \VJW "}y. Pܙ/-1SX]k7Ol. )T׳yMTqt>thDJ ;f5]%wPb Mph$Gzge^+4UcǑu.b H3A.9 ُN%eg缻:$*Y" wfrفz0@X"W7~MғIOh*' Щ#hN,/l ( i\;<>Ql*߻BGj1~*z1E535KPʎx\I.) v Ff`!N^?TG{.p܊5ܻ ?B{i{NZǧ2+T뤐_Go{Wd?T^4Wލ#k% Dĺ$4|#[PrJ 'vl-8bG l>wKܭaO'U5lJщK\rE@]NY%{v/yNIrXL%KsKW`aJGݝ HR$&_`W5\%" 7Y=[7<6 @bIC  VWfR;k1ϛg;jyIs N@@HwL3cD< HGHAVd=.YeQ҈jޟjgWQ9q,e($3r( Ǜ\\{?U<t|jTVUHeKΧ!̋.߬^V-JNY,;ueWJGHrt%D K"FW%hiXSW7=KLN4b̼ Q ZѦC].dy&FbvJ ڨ"[c/<Ś,pXnECKQ(`+""\pVFxҒJ*óYR1ִPW&g1}=CbiCP> jF+bҌe#V Ev&z&_fn@  jG7lEF:y7w}TQ% k;u]W tk`gR}ʕ!@"ᕱ[(+.EX4wHhM fdoH\9y^oV"C܅:}Gl)9y ]2} ]| n\ŀaɆ{&[FI׻`2Q[ጃj"\bt+>@ȒBl7Q^m~'CBtVs'ۚ: bV-af{ 7C Z;eЈK ieVF)Ga4 a^nǣOU-a+A;3LCXh25fO vu<5/J}sf" Ayۨ:7dJ#"<`c^uc̀:$ +%R%bͣʍ|ECpYBiZ*Il-}Rԇ_Z|;u'AgŒ >q`\鉶w &cf[Mˇ{n%].ʿ2LҨh#:P;S\T- 6{@][~+(M B5t-ΰK7"a0(, |մ;+k p`2),tB~!G^[R;G2=4~%gQMy3VRr<,nR( 7h-ҀmyKClA/%jNDh 8i܉դn߾L7eK~#ojdrB֬+£_ ƨFuzIm<JD;Q"7Q ͈ fDJTF٤?)bD Ga}vrxrKC,J PAe؞cBJ(ޱpt>KktdQ:g ("K :ff541!ҩqZIBnlwFH T췚 `kw݌{7,c']_e('ycs.~B. XG@Ny5ӜZJTP|qx΁9NYB~\G"Q^VµƇ<Š&1b kr%?A]'(v$Gr͇ʨA䓯ȫl3/i4f Qq&5nwëBJ{ٴF4WKM7Yc8yQvsIEǾ"^(¢;c(;k-KEz~/>ϔC>=R2aDV-Kg|(Al: + 5`{b=T<=.L˴<5\cݫqν':^H9>LlUkR░E<ulpk׌jXᣖc)RΘ0!jH~kE3 n@ʦ&z-6bK_0m}&1k@tғOeO/|5|OR5yb =: %?K`<+j6$T5S|ňdS EԔW 5g~͔uq'S=01D,v\;5dZ\+U9X8ԛi`}+_*AϢKAzm :7NH_:*R_qMZWD[li)U@ h:z/$ȡ2JҶ0**5DI[1ά~mc@ͺsMo24 I{#b̄XOYo_=B_z ]y֓eX@p28쏡# }[0p!h%7uL*|Z;8@Jp.=RI&YJSMUx3M䭿2z;W[:;!VE8uP-FJR[n/[?7qV\wʵ{_P`H+SCZky9< aLbKz:]Ot(Fjc|ش8U@2SkT~rW}@T|l'}êT\N;9B~ c \bk) HO& )OhLڇ0d-3KҌo>lӽJϽ@8'˄oSK'^ծVE"=hhft?gCHQ1(]h1aI\#ŗ5o*qQ0XU4,I7Sw 9&5 /z>x15sq~rY+ $%(mLkH2h8Ez~-EdpU>H_QeU}YxAKy 뉠.e o,BuAvp(P4uc` VvHI'rۨ]w}'s9U>ADڹ1:i"#q񚡟>) XQCP keY/E~J49T9zyAn/* ]I4={K[ >S+7ʹ_!1;QXn顾H-\fhvef^;%.Ix8>`~A/lB{g`7TB2WՇGZ/vZg5TsFⲩ#,2-5pjuɛ-TN+x&X#WvpC#@['!y!ot{9H!i6ߏ:"cp_!o:x|JxpxJXH[ Y\>/i6(~Bj^Zu=T3%ks$gd@W03{be~ρ-ANu-}s?Jx&++ MͱqXu6M}(S_?0FbyZthԚ/E驠^MN;-JY~! EF+f(6tbϻ aO-u)m^hGKJf\eGOw,~X./(FKS (s.|<iK zUcJN5Nv=ꔗu5q4m"T'PRm2ᝮn "X:ӱ'HhmG'֦7HVj|UZK-+NRч#:a}˷I@I>1LI4P,ϑ8kRϋ9j2kl큾JXL$.D0qм@v۹J\r`aIjUC FhKCht (v*9Lx/+>٬1Hbhx.B\}gP1i&V5ٱa 캸kFh5j),T³ {@L[U"Ú0ETc`l) *{ P 40K f0jzMnH∌ }Bł Sr ><גc=v {Avu&L[1[VmUy|'?~B!LhsRs'ደctX6;Y=?ԟI| L=FG8֗}̑\Ȟ:ϮGnoZz"Z Y/%J-hפ mj]#b;,.;Zj֊?.=;4Nd݂j!jn>^da2V$Paz>H&i"όO6b$ޣAB)7YDIaTc/ѩ zHHvX\n5SzA*TNeOݬ)0 SOҀt(mQQP8FPAeLW sL\-k! '@,GXTbu&*I\4LM۲ec8$6], έFx }UH|+E)):uaSDt uVtt~FTMWׅt֒fJ(<^ޠ’Nt<I<<10VQ-0P(e/Kw|hqÂY[cQDH朔G ;QNC}H>NpL4D7I"Wq0z**-S$(92PdW@$ L8T|j/ѫɒi]6>S" Ug/c??QNj݌p@/r&('*/,sk8 9 EppꢛF{4 wip' m ́418 Bj %Q!W5Ȩ \׈50D'sFT4lJs֧̹)@(N W:_ 4Il]xϠ {Ӥ_ Mڪ0-*2ez}z#V3kq$p= ߝ]G?Z% q`1D͛9o3*#%Ep&NmClF>_UXb#>y(HAw!PC>sO\ ֔bPL΄+k=U:K/S"%#f2.fбQʹ6{c=-=@1sM@/8k*/u0HnRdSi:,B Muvs+&w;b:?7Dbi֏x%,k${9®06ߎmgƈYؾx0$)#Sp2N ԼSM0珁!@XDcCmm_avZRI#hai |֠͢yHI :hLpŐ"D bExZX^WB,LWb`9(l8"A1@A:0GiDm{fn6ȁ¬U6k3peeymU<|4-#ESpzv綗ڗȁa/L1[b.[n>fmKLJMZ* -^DŐgZЋ;Dyxe-^//*ڰi 8ww⃸cla'̕N4ZVr[59/|$T'1rFa{UѫTF[^fݒBcnz10T~حCJfNd*DǾKGP۲/vhxŧ9K{B:H>5M+1;+&m&d;)mAosz=^mDa携(xH\3CpA]KG5,Z3!ZdxKK.wl*%2Fh 2s༐ x31gHhtd5{CGEQ)ys80QP8ؐ]dϜJ9|]!*da bрT^$B_B2j0Quѹh6עbڑg.]O\s=zR ;*SR3u &ݲH**{Po݋G D,Fhl i8/8u>(nMx n J[?pF^]! (lx0H I L)XF|>aR&y𳜸G[ 9fPgG-TK#@֪[T: 0tqqFzrB0 %]JOԦaq]n*i%urmBYYȀ'g,ݒeVFߠ.ci"[?sw <*NӯVqdPG0[EWpA˴\Ar^'`4igΨ2 ')*>Fui~Y. 4Fpуψ*+:OgG6 PzpJ  #^eIPyJ&yԶ9^VtHj'RBjngM9HxS5%TɁMEo瞶y|ƒP8΁d kDi gaPf#01]F#?g{b5$Yf+̬'(t_%/b}IB9G5@ɏN5;}kAi?h dfv-<PyNFW)#˃ƜwɦD,7}s8B;;0 g]TVB-7@f1,}LfR>!G=dZ㊰u{kѷTׄɺEXND:33Č: ٨=AhFФ`e(:l:?6|>AFΛ\oџ.?+4%&籶9tSab,vbcLe#v鮌 wbYsuiZf)x`!@% C`7iNJlQ*kԛv*4>Õzg`(_.Tr|_bKs,HKD΂ࡎG>0{{UذѤT}}Z3'\xQ$+NGXƇ\ 2 L\y"Ql SSwX):5Q(ON_ؤq`0)h_ qEfhΟD*I%bD8DN.fni ^wګ"eUiƭƾUBӮwwΙ1SK)R~uھ^;JKY?*$1vMF'e DGff^gZ ')-|g @P)k 1|!6:_t` s3w&P'9V5MFhRZ -,8"=4}.tVW&LJC0$[EEw/T"@z ĶݣlQ:jZ3IU|`[L[CJO GZZLO?OmrRpjH2ߨGWsIf9: ̨ e\PiX3LvqpNx88^ܦ0Ppk %xj/9&h_'acAf SG' !qHp}K%X\&MhS Z3|8&WI 2z%2\qsw6^įċ^c}T1ν9Q@O2'D͖Ņ?:Er,I"~J [YoּCr$nYs&36>(Sؐt!Ve$Me -pYQ#۠<Ō4Cc-Nk̊,H)R?dDF~aG Be _cĄz"PH"m8;'~/wEl; ڥQ=*@XSrRі*f;!Bp >xJޣ9y 7?P BOpʃ4̀H<#a7T8R1걤9ͪ(6DAoUf '4' a;aSkj<2 ? 1tN}BѢeiŒ߶.gh=F1\U5vFPq{6Kֈ¦}J8ǶM勆*#Vuo&U %GKg'n լ`CCFJA8H uŎ*:{v=0^˴2ӓ4@88pdLرrY2/q9DzogЂ #Xv+B%L`>sm0Boϊ\Mehrc LsanM ig!÷0}'/GJS'`G@}e ~ʼ !6lKvЖG1P}pg3=JB v3C\ҏKkJn ȆYgC5бANQ9Td3 *,B;,`f=n*E "\oGaM8t*]ƭP8Ur\!nb,hsK(IߑU[f fMiYH.)*B֤03r& y}P, GIٚj06㍋DO1Km~|$7) &Jns(EikoNop&8 uiAo!;*"_{&s+C cP!ex 3%Ao*;5F-ʲh ۑy#-q0jckq.M8_W,xnC珿n|jByQ7ɀx|)sm^-[~^rFjtHoh-btwji *Sғ_!Q!IM}} @("J힚pXm-7F%iQӜWe tm!8o%xLԛ1^ynW3b"D7J$t,%{w{,u:8M-TI'Nc?2ThqR";"n' x"]Dtq `1nar2'!3վ@`@$pߕ]L<—i*"GZ6a+a](\dWsd(y. Muz`]*^:__P*FvQ{3y4h#/oOYx cpetw~SBZH'qS8Ya7!S.K ){CQ_d*x9bc#{0eE$@MaYv-9taw(s䌚 b(\.pyn)4 ڐi=GүsTFEN-n>Xi.2妸mZܤY~z6(weX[(\I`vz6xS3"$~NUhcL6[C#TRhnu^ .8 3g:U6<4@(~L&I:+ y (A4]2hW֗\5 !lqW$E 2^dxE4u.S:JEd¸Og^衯jr:D fY_+\% 7xG8AigփRFC>g0.Nm-E\C "whU Fl]E5[xU'u[;~Y%ԃi8H `Iekm5ʃ1jD3MA''lջ.Hp0<1~dvo@"^!Mmʍxa P PJ?'uq]Dl"C z,Ke6S{J~nld1*YR"7`XLRfDuzMcϿS~\.^Gdvtjo1'L=(1vݠ-d:v|>.Q}ybݝYسMU'Ƥ+jviD.\, ͟pZf2\8G&ϸZI2Da$3O7}P4vpHx@huӹB=l "-b 2êɡ(7%/chDۗPCm_[D߇ (`R z f,Tm+j]|mƓOj*gpP.#x6'qFЀo;%Q@PY9'c݃*0hjfTV$<0gՀI8,HKX;gO[N (aXo3sgŗ }HD+n>''@DPG]Gbt) LlhJq =1Ifl<;GU2{[kH؍T4A`9~@3 y ӛ$v%;&#z<9#ȡ;rg˴BwQCJxZ1nӁ% mWJx i})L0 ia9Tz+x{;21ڈ fDV7fyX $JJ1N)P$p^ĊV:?_y߿b i8`*|gz/`xMT"<g(w͐  (Wˣ{[5ؔ}Ь%e%DŽg|KT@Mg;#*ukh Py"+ oRAmb!8ĝ#2[9o3 Hst B4(:ֆ6ewRS^NpŲ#W=L9GbmNڸnXL>$#YXTcc0WRk /Ory܊LqC M0*]7HA[&W]%#;v]]R:\b.n[IBu?dH_0rx;=yn˃RCo*u'M<|5 g<?JXQ-?5dc+Ԇ`Kn 7T=s#^AHVD ")f#bi9x/\M-l_Frh}8wZwKkL2A>ܶ]_"&_1e0L>[Deq⵿U!U)`5:*L"ұ(9wXju_FcY%ybt\Q)wW3mv$4ѽ5(,!~!VZ 8fw쫚ozx4Vl)Pdou(Wh Uv/xGQ1"ۗ'o5^X$mW{[٢69dnzi!/OBXǴ &f$uw/So_r9Yӆ# /9b4$ه*_=8wSdb-oNDJd>4+\~'WcC g}"8)YZ؈u*:M"[ ÁoUw~~.3DӜz+gIf{WIR݆(* $? Wg:fh3(\*63H'Gaey|H)[y[o[t2aDuM8Нe#J~m:TkkB `pqMt”M(bKQYb+s!RU1pRu8O9N+p {KN-85WBUvvJTR LM;!LمXL|4BjQ˳'ܲ^v;(:x_TE#V .0Jk-fI$A88Nn|숝,ҺH(qY~#YV^?Zt_E):>޼Bp;r`(}ժ.A6A.5KIE "b8}/=oҰ)fuO|?"azeL g.kFP*# fW W~#Zr'M/Lׂ4:pONJk@FMz. |k/pe\'n$x":"++`Dib}wf6P{>KDH34y%@}$'b&LagK{OT C |DJCzQd全X.THҀSrNG2o {~R][>շ2l s/v#M.2'>6[nZ=ǯ)d+AҼ!hgD<%mޢU8h З%fMWd:6u ]uakġf\ذ^ &m`Ā!DMy٭(0U7Y&p:E&*ȍ pru#N'JSG%X ,*I1"h:#2*U/r&4VS&w~vzRY(~K;P5uݩC/T-{Z@N/\9>Db>&% k!v8C)ϋ}EK̦#|h󆕻EχY9G`doRMyγr:ARSlT֙QK1~>p+Up=LYhU6/+xc{%0_"\ P4"fP / QHiwPntCf) MN(<A]7^z,<>L{UAܵc'yd*uV"wR\0d(du|nή 9y v) Vl6K+"(6/[gȧv^hϢE7W @%K)HSU7Rm<7sw ~S5r]ayTTXz>5½FUMAMl+`3 ZU#H6A(qvZT-G (Xʏ>r..\V.:-­N8螥>>C6Ѐ]-tdn◺bt1J*ؐç$gYjEAvR8DE~sXdMq"kf"NfnlҹNP FfP#]ԩJȭUz܆xT=73ߦ?h6{l(:S\L@Kc y3;eu'*],Cߊv`bWuMsq=\}9:2M 'v9JɂttŐFah"v @S} j329U"tSAn F‚`? A9JTZi%ԓ W$^q]ZpdP,N{ M՞#rZዘg֙V2xF&n^x{A(ӾX梴фkJLe , MŇ"0q f7 $wQ"GsQ;;8$/]V}:f#n}. R<ۑnB_n:%6.KFUE?I4^<6 Gsќ8@+GNN:QVʊalDD®D7Av8aL.bɊXs2\wf:媱V7"{FNi%>Dp rB gH *h?}&FU\H{M#;קn\y?lt U^nj&nSnJq,Dx {K.*>L L f7$ew1 v=[nlOpHWs,!EtgnEM"a,ӳ^uy -+u'r*: G2J9la=OI845Jşc SqT IuHFd]2Va cT4¤eԶ&qh}0=>CFxC8Bʊjxyf\^3,r8l}#&g#plІPG? ZU/GRS1QBaqeAș)vnd pj/^i9)xq,Ԥ !k~0>7?q$F0hk~r DGQg6I;{2]+WԄgg${U pXݔ8Dacvt'bk*D,͒dkB)^xH^+[P(-_0Pfv>wMc:[0jBFgwB3fn:q'}1.P bYvw9䖎&wehԿCsb0o AmW+p+<]t?~V͇RlUz:C%jUqJG!GE; kP ?Ķ=j.n]~4i>~uا'O7>^w%ogm9N+R8L_i vCv2K6[7d!%,.w kE@Nk{;VB/®E6/ןd'.3)gBA~Bgg` l-ov;rig%?1Z6^kdT^ zrc|ќgqRx ;'Acq~hZ)oCF. i';q+`ޝKb 1" Pzo.q ϼ ˼MN@+`|fq=7GPe"Ahح(J[QTZ2K*(ahMU;tnZkH; C%ƍ;`]|`rWs)bNlՉ@r思X\i&N>+>4~Jfi!ȹt ڱG9et6T@eN$]#$=LMcLpG,[R)ױR1)3PiOp/-eX ;A[, }kcH[ol؂)zbMM'(`q~zNбZ(K(c>m"(5TBAA8. MO=ҼL´3Q^5lTnKCʆn^匥PET֩.זJԸg"D?v %_nE~R}5ZLj83 |싳0i)b]?kMT Ү~[ic{dҺI:BH[_ Mp}$>ŧ hF[!!/OlW"vl 7@*`ĝO-x-?rFjF;jt%ڂ[=^jb,v=q,I3]*zTMaboK3 pf8wq| Ħxltڰt*ԘPR އK݉(SPl.# ja!7-|WYd.M=nLo0Qvp^5?s$b iA"EC[6oc)-EDp A#P!yxJ^p{kE\yȢ$#PrQo]zn'VT[L[C+ cs *Ь;{iρꐔ<5)dN82I])_Zzirp*)g[~”@xH\JO#IJyZ}OG'U2Jiky1CTr%=? _۾1)XN`1=,\p-YBq@[S۶IH +.\,X*Q?M$BSqz9ΜM';9Qs z>x@L+oq8ۧV, 6w1 A$|K(ۃ+uJj;IO>i?pVGVAKIWlf0"ԒGQqS-imC=WP!AR=3-{@Em=*hGt9|b7 {qzv>1";D^/-Px(B<^n GNQ!N dlzX)4njg Dyj[!4 70p^Li@3Aj8L nWRctY|Z^X9spjPT&FCo:9<~| x mvQµqf6]VzsR5=0niBw8΀AEwbrح$`|Sǡ.TM%; ;Bo1lY孍'~>j/Gdjg'$2S>|<)h%FNjĩV #V)H-6K|+=ɦ0p,=zg#XӪeeUض, ZsB)Q1Q|z΁X0>ua3ݟH\hP%5co JgBF%0?tavbG^:_i$JvU|fU[UR 3d0{̈jKIzw7SyGoU:I1'N 1Ejc5|iHG$XR~p>J>'B #oy }Iv\[ߗk9\+-CPt 7{a䲫gц+=_ $k4h|?G)9 Qr=` W92r;^!T" t߮CL,*Q!vs+b¦CI`6Mg!{BYZC~(;fՃiPARh /hFzy`io&&Aߕ!d_3h9k;ma _ۃ 7II-=H+r +[APzGu<G{I~0 y/0ݕ"U15"?w =]1T<"+|؎'* 1ŰkG8031!?_N-1@ZPMUELjm(bVMգ0DҦdsN޺)\S2OB_*/#{% heh0] ]Hr9Xɰ8T^ "B6) GE@/E[{PzUraD:.j#ɺOczBkQW mwoM.E/2ʹpLX*OϜBZ.8,E~jcaz:f8 e L,&L-!ľa(S]T#]"J#M'~`&6g Zz~CdeBb;p0jӔ3΂.@PLeΆBg5I>XqTWLLWe[| 8yFw湫]?}ب&O38+53IڙuQ(PEHFa@U@q("OQ8M" ޝWި!%fВdd_ 5lr_ uI1^?I/yO|DaU7h7)vJ ,3K:bpEk3O^Cjf&|fFӈ?EvxO%K_wve˖= nc @ *D^(js\g‘0K ]iTV )%V@%3eb; +-_ Wh8>ՙ$0;u,CNTZ7 2i{"`PJʃ-'Ś{ )+ɔ,c< Lh䖳iԫrphWys 88zILg݁o]1ۧvcURn|gU0wBB0J~Jo\lPQ;PIp#[^urܕȶb%^p90Tfvg;ErQȖXP&@O9GK<}WRd"pkљ{F X$z^+Vfѥ^@綖3.Bo t9:迗 ve$`"|iJt[ZzImG" x 軙C'+yHGFXӈ6ibsX (FRchU ~unC-AeE7iz#]e]G*̆veuCO f2T.gS(xz?>RW|LMdt#Yzw+.VRzV[^j[$F{/>ĎKՂ$~ŊwڛtǠV28 */g9i'jf6ɟѢC2D^D'ˤڜܠnP yX|`Uk51h*{9`\e[ΝѠE ͘H\ib_"$zo (Hm :)<+TO{ U3A=:%@ۜ\`w K)Jz4ޢ k)8>ӵ:qֺ' sFI D(7X\(Y`0v !fArHQ} OQ,-^HI *t(o"ީ \˜p1e> lruN SoiO^554px}o]ұ(M 9'| _}Gpk@]K8"pgvG&܈tv "KPe e@yq #1rBCTIIhuk hBT(iiAV|`n:j<:c{5FQ]%4QB^q|"_dFefk5~dc.MkD?~0ݒ [>o LX1oF8: 8S}H1⣋!r<)1C l ܢxr\DT<<9 b6cj\_g(C@@j;{ ( `6:4{*JO}n[nk[/< *7W۝̲4d*$1 { ay<<|5_ GȻvVNjHA[l _K9(f#K>Q|N.W"ui;ms(T:C--SH* ]27?uŶ)"g,X l KrkP󢿯>OqV3X\'2p&X>_eӫ_;] "RBu QZwNc3Fsa3p:kcFwwVY"N*x L4 L V8D"/ ~Ǎ>cpyU}r25Q̉HSx*Z.|䎌PɊ c0o@j5LWo,S˓R!R(sr|G `2f[Up[YmXP 3S5+ Vva1|=,ʭ ZI0\ɏ9c-tBaR"Fc0$iҐ͸:ePiV1dTVVrǫ~hLF#wnh `D 1H fD9vI}i}sSqvn2DW"ᱢ183(" O翏ˑ]ƛtqdbWH|VQ ʭPKА]"c,ur09-߈:LCkq(` dxQIv΢Q,pD*Z]{Ydn/W!]f!}:_7"mX${VklIED,qʨ|y%ez0Ԫ&V ZQN\],a`katD<)j NV!*4cQHFM@ ̉,?aŌQ^F~ ގMW@k!l@=Q?sSxu&&RWPmHzY xj(dʞu|E)%Dηfl都r"rg̋H2AЎԒx[ YVsα9l~":|Cb@kbE.ζN)8ӫB-5f~x, &Wg;8l՟U4}"4>E#4oGMBsgsutQY0 ^zZdt=Ų6I:݁<7+{³X{ -#7`<|i%Ms6@47hY~MlL8ƫ/Ӄ3%?x&vF/SgZׯ[kxwp Jo1;+?gl +aǍox v0N=dE PtavDeu9*xfRH 3[Mv1үQj+X>r6]N5O\؄9>Qa e\k^]CO˄n.R +\Lbg=ɰ*Z+>;Q-;]i=$^+ J,J j<В'(s~˅{pGn =ǨYvw1^k@qm>H,߮88`TCVִ` Wf@(}I"=yGqL1 =5-'o,y7hU~I Y8#[+Wv0ŧD㣺W{*9d9+-n]@Og'93M t~Jj@FMOoFZFŧ#޹7esL_މ\Gg –Yoj~hk`,SemY!*r7ddwV,-(U儴 PTߊDJG HO\P.1_5`jM>AuA5HMj !=v]B&b/+*;bm98o.!W{)F'E@PK3`_̊}vz;ܻ'$I>!uH{PÁ}d?]#hbx4\2Ml^/D|-kv&/OG[bL{Dp2-*Aȡ <g(Ǜ{nagGJL\)Ojw_tE˄"rgJC6e%g={F,\#xُek-cḅِ_ӥ1Nep?B0+2_ H.l_p3Zoh}>EʚiX0`%bhHQUq? ƇK.UŦ\"*;J%u~{gݺ8:UKbO@O2TnQa 2VrɽE$oE2ȓoFA^SaE;unC=7S ) Y=KWF~TiKEb/8Ⱦ΄qW}N7d~ S.vSvOj[lG fBkm'(D49"O)ŐT;j@O{fŻ ~$ p'HʖRTZV*Us&î'DER\*ZƤjU903#ʍ,|q2q/qmkdAiǕsIA&i|e8EJxĹ9IXZewҸ=ANB$[B ` lZswdNjն`9wB잼U1eh7%N BҌQ_Dn7)ZC5X$Pֱv֎N\&=_c]f%U^1Z|g}r+CDy7&~M@>Dv%0V߶ǔcp(#tjUq PY^L:ԖH{#ZǕO ĭQa+D5l >92^QN,@z{,աWdg4hS.trG,'Uq>S$ Oֻ❦y<^粦= KP6`Ǔ\0\/4 CQq2JhdULab )k&d&j'oxW* q9=_m]~Ɉ0;ػp[B3 :6Q7i)5N$zژE֣hZ`y$)bi|po|sa0\ OY ,Ft`EȦW:L5& #?ݓq!F_?& t`mH)"]AdwX]l:V46]@8?v^p`3t2NfH) .k`fJMY4|d U% , `GBd_vڐmLgQhsD)LQ˄jn9" sTeJ"p9yV+=!(lj/'4'z *z[FCj Zbu5o({ʓs~2{`9P*hDW Qï֫DM:o]Y9u%bMVy<c<T#TS]nPQRvoӾhLDLV1o=VĘ;tVe *ЦК@MAJ^z c/:tH2g[7>?'CJѢ21~kF M'g S8H톙Ø:f{A044Q%M~@`\.[NGEu y3A(bVJ:10m jr,΍*0:axьkhݕL2BE-YqdħLC*кfȁA,MKa2c )RBhB"ky|ޥd!4aMMʿ?HSI&Lm%5gI&fM SYx$έ^3EMMڻR^;ȤTFHR#Fc\-j^ Q_1eޟi/'T. HݳNOQ7HN'#k6+qδ0{n#>=mf%4戄7N}t9[BAD47K xSPi0J B'Hw9SZq"%اȝi$ԐΕFkp2ttmb'XPoor%k W&jLC]*C>-9wv5hzw3=DM\NK *c'XX#;AQ}XdGMۯ!F.%-emn7^v inzBKRrI.N}J,'WeIm%d9M9{B+Sˑ]P>]U%w{I5ڹ_VSJm::,=`iّ^]K=<ӗw"A>qvH>~D?$J3ȏΘS,}(yVՒ+ `6<'O2&{aP0X槙 ijGw$ <1E6mc/I錦4)+zg+plvzЍIJ73;k.fID6tzV );*~ 83̿L ǙmVcٿC\pzy݌s;Τ( y۷3y_3wѹ C(Vq=5PIP~?ESؐ8hK9l< =dYGmz+#c֙`bQut؞J= yD0bU&+ЪRKGd*C,*l:`6f-IJVSLfQ'R\ 0&LdX.`OpF@qmgA2ŧ q++H}%`7TZٲO&Feho׿_NTZ vF0QNydJ,:#ɠ9q_AG4K'DCڽV)ޤTМv_c@`e@,(`5SN,ubQMN.ASkDrcҵ^5"*I@=LHٕ Kp>s"ч'H.'&&5bԫǗXJ}iiQQ$kΎ=oQXn6M@,>B~\ַ\]O5])\MRQ_9 K >zQH,.z%U_溜E>:1PcYkID6EظlyfX_ oR)ѱ/Aa#`ʄqË!&1dBqǴG|Pk<fx Ds&H[gwBߖ66.9};^ P?R]+OE/F,jQ9 0VH(-=RuQg16@8%Ep\?bWpC\uh%e`K&7:P na1:cGe AgAC#3Ԇf']RM:V?WҬ D/c]BҨ$:aQ=0{dNz9mR:yKϨ\VJ(k^wKé#j%RQP2P>eB"sG'08IHij/`ӋΦpo>|۲5.h3ꫲ% m۶߶3 m-BɁAd F}pBiSl튨D$ΞDl@eQ7Ҷ91NPY%FKlh t_9!X59*n;|E!VPn.ΠN'9~WvȅE/~/SXUD]}}Xz1[wɻϾ;7Rb)bl՗SH琬y<>,<7xdFD4'# _ WMk}ƥں+Q7^XShB8y#we}KU:!p_ 1)ᄏgc =z,IZywo_F_؆6[%4~.n@ƺP#u=cӮ Lr*Tz]ޞ RBfAfbY] yϋFBudG@Ps]ҔRu3PSJtҍ<J^x>p]<"^" sR$m28pةYil3e3.F1yi%OW `bIsvw'L2XɺcAxuS4@#y=2`Q}|7eΒ̿]{4aq 71ƺ$Fn9'4j XɜJ5 KIa}؟4[}h)Q7,הaڭ6=P쮬z%iUJ(^1 .[qj˲c(VKn~ Jo#25s9]bM @ōǔTg9S{i$%hT jrxӝ#%¿m@|>ұD="#{ ?( V#-1 cFIMg YO$]ZxnJc[jo"2U&J.6UUOܚX֊lg]p̶ 9%KBL$!W/Gjg ?rʷL" h*%Hke UMF-!R~!_[֜$XXi_^b+W4ힸ.ޯ$ O%'3'hpfWupIMTvh/짖WW/yOvuV5Z K}X͚K" m#bNBzVfԡQK E(UxbF?^Toƨ\l_v6YGY]qN+35Pca:q=Zѭ2/8˼pB{'5_f2{I8-@ >,;bsWEw\>hz̗D ?/ͷ$D%ы5w˅of\-BgeAʓWhorYuWçˎV|@xJr^8Txo;CY Uۂ%pn}6le4,bX%(̳P5iZuqJ4 ض7p3dh;A7]rɯ||&A$JgNc qT&eMT>&h2+4TD.Gjg/ٽV9 דa窸"5K)o/8rw>%1 \E 4\)ѽiSYҤm#}27 Cdk'2]!ScԶ e5}|s#uҁ:iӌ5aDqQwD/:?06!=²ٙ3>qPx^wW+B`Q> ڱ]#35gՐY6S- 9Tjx%Fwk~KKh^[uVߜߠЦg$+{R=Ԑ< фADS`uHhsP TSBƄvFx="fiVhЧܚhΥFrg /uo@-U2pV[P#)qN`xhh/  Le< a<FQFlC!kW'&C?@C~-'"MٹK:O1VJA[4CB"N2nk:r5Jm Keh- ⑝Hn\FT#TF!M=0i'DyGAWa?0Nfb2zBTc&ojc^bcYR/M]xdS2TenE`bGPsF!jihv(8s `à0_}M ^#Mv ֠O@{ioaT:hpO$ J;GWƴRm=n})vU3Sh'iV ]<[is7N&DUCw3te \0oOQk3#)JQ1/3QthZj]5̉`5˨Y\slo+{o`Kb#ؤjW ͆[9!2/uU!ǿ!V 5 +ybX7 *WN}?u:sB{x=*/ y& &h (RӃ`@S꺔KYN &һve@$6?Y3Xb׭s^ DxdC"ٌ#B=:RjAfWw2pk;Lm,Dz (omĚnbv wɫ1ROj .si!B&Ç_04D2=Q81~,ʽMT,iV+L<?EsL!8b\D1|Z1&JOD+c1io\|]I uH$Uvd[sǦӊ.KGPC>An\D,_k}es/ a*RL`Rt|.\م[vG$/fqbJ~7~Hb e泄, )P?܊~ɜA;klS̨Klļ;vV}Dkɪ|VZ( bO"X [iX9_S+XkvOQC*5Fė51 nmвc]aulu~vJ?-{ X X~m`ը-,έQt\L6ݩȕ|j964 gq=zY{0 wzO}5Wi.ѥ7Ŗ@?*EbpOwffu}v"SystVjTE.vCIxBe49nС̮dZ&+,QR5`/ڱ+(UTv-@+7U#{blȒv}dPP mTp_k?:ME-@ں"`J~ 0!j<2Yr e6ڽu|H--_"?]MߛXAͥB_ϟUځ*D F9/ TcZ1謇]H=^u*_X} ;}5hNÖK3(eZKSJr>Al 30#0XA҅5A6K I%>b$FڦLq8je<5:ZD;юDw=IKIX 'g[kVmVTT3СRp|/ĝ`;:}N?q ˣy'V2#Lo`T$u%qxډsLE+ =_EUE;/TL"P1FvAk_ ;# S%u`Sˎif_rcbKdS̔PfpX>') PK ) ٔ3T/;%957rH? #f(5yn NUz?U` BF/nJYr1Z`85=V6\1dPbI/1оˏ=}\ΛޑHhK)籜sȶ[/r_ݾ[Q"ɝݝ mLaF=)+LƎR|OfHf *(Zǒv᪺"jw/"y/*ZSa:\) des7-cL5Cwl@S㖐PVho59i盰`19Fb'z#q/I}x $s:vqr1TuLq7@Z"*#eϪ[. jWPXi 2Ub"ESPūLAh 8t u#})'s- 4M8P - t+6l=nl7a0 Ӝڎߌ\ṫ\ȳ55]3@%twQR<HZr.ykacre,tCk8DnZ\C 2dB~8Ʉc  T@c wcG`_`A b 1%NGsҼkيzn7fì |~fܠh) [gJD뢸R3eMl+pZSu Ym 'xrhYvt,G;X<ǃߑ#!+ězߖ;_y|Kp Dl<vdoAt w3_'Wphsʻx£S["|5s:r5mWzHrfq(~:*< SB2}Ϝxh_)Z?όdFx[ꄟv7[ӳ?ŵn>[d` *+;W]o̎]<3I祵 ѐR_F*IaD9QH5ވځ l/[EH89Pe AՄ. ^UrtK4 bDž_ݶF/f^ yq aEuIrQQZuu@>R! K@I*?KFS1vHzf5j2 R^}^UMSQmłpUk [ ƶRczk";6-3eeMY pwmeiƺ$VTJQHۻ☔X5HZBfBMn\Zb2GptW-_b#%fNAv\kkŬ{̴X`-xExtIW|73MEZRlU(BmdOӶҋN0_?_ M^ul]+\~ݴ0u(MLbQokY36WށY^r)ARTtLr3AK4,Dw'ӯN#t Nijs(9AQ7&9EO(K [b~~djjO cȾD/CFP*CV腎&9Eg(u{g+k U >{ 4iCBy%Rv}tl`-N 7e,<OMaxrj41L!0[r^JR“p\-گ/w=Hb|'Tkw I9Flږc6)$Ab-E%ƨrV\!Et.WE 4|u\Fǥr.ACQp7]5wp咕z(1n~f7;bׄ?gUa̕654H@䱸b׶b[ [؊9"tn@S-(L `XhI2) :ܝp2hGqo8b.@ZǼWL;.??ޓ+Y//csM#;:z:Y+ƈi)mD1\nV'C",Ϳ"@NX9E 籅^\۪n"f֔`|S\lulBcmHr9`z> KOxX:f wAO1T{;f3Nڣy#%vcO> :hWAhN4C44w #s;v}v3Jz-I˃<^jDKrA0[w)eǛ 'H8ō*GKSat ,+P6lÎ1?&H5¯v=ҋ\]:k KOXoxs[XtNJfㆂd  1DFH&a۠.S7M0uI*Gsv!32Rm2rBZx1%!?RXAC}\Z:$:'y̒o81ڑ+I=HD=u!gl^\P~!coq :Θs[$ MT${nNPLuI /U K\;Fv3Xah#A[HI*qҭfLbs^K+Dϐr1u'B?얻+fKw^Vi}1t@˽>x@mf_pUF/N@N\?&3A2i~qKf4"xfv.*bI ITߜ/x!gqBftsj svHnS?^ ޿7VLjE2[ZCCVtdp(pK99 눉3p; A?dg{ĈIFkMP,Jz/Hd,"G7[$h4#gV&?~v^#nCF8pkO7K=/-\&VuSD?  6|㑦UKe& wp,#SPHĢxP2@/1fmP*^\H2Hs@ƞ=(ҩ5,8QsMl\W':VhCu\ja>f2ł:O5_BY`؆u?-1t[Jn #-ᬪK,V,tb΁j9bB|sOF6' J qע˓q($mesWS.-Bs3=`;҆F>F1aX\xV2Y_TPBb>UpalA|+Sb&O>tav?[,K99F&ӯ3b~חc@mZ0$rUw]Q{( 7FŎg gxAq ]D4boI+]7PyWVLD% YHZҙ ]'%>}{J& H7@` }|+9\LB#3td-"Q1CSW\bBdi@Nk{>vctHO祐pdQk+Mҷ_EDyT~-o[Xwį猅đȘo=hӌuHжTRFd#=oHw&%ֻ(* { /,`0LY% PsU0Oݷ6d|1GU+ IBEiqq(IlbB3L/(4}Vukp ߽` C&+ KD| %g(J7 3t7~Lzqہb7AH:Dz8MD| Y$EAV`֚QqIXVP.klC4(skr+S`qE1 X)U*h =a; t6Fc/f /'P4,\%~ڹyH[$q /]~0C+N-QL?-xQ>du"!G݉v=֯Rn`1 Y^pkiozc=vod>{=C#*|PIł[i?0 a&]pQ6z6z3m<2`hbJop&M)%!J&ZǦ H"8럃bܰ$0mу9 ph{[Co<Oͺ  h])l_@+_?\^h`4VH|WDe #}OB ;d ME*̿RKZL*w3u`)m,5{#\~xJEyHդœuH5rC^-g$﷧sj`傄9;ifd#&tTkC_b6AhoW눮Wval%?E$c4B_/ -Oo !\ΉiWF8 ƁCWp8?лkk A~Ӻ41a2}N6P.c57M\ N;8Q4矣y3krƊDfs}2Rv8tts܍S.w "joLCCZdIAp92Gd#cO2VÉjjǓVyHc'2*D/Zs36P[Хt'K_q@CvDժ4Cq&pL?ܐB7ߣyסhiuؿdY2Kُㄎ53$qqT=,ntц;qnml^8nL"[e ou   OoO*5oCO֧r]h#BOD`#Q#G5_Oju?mA|ύ {ja9Wc!8̒9әCո^_W+^_;\5 lB>F|oF 5 I@$`EdܣRCG("Q֐'n͉ fAۓ~ KxS,k:n|Xea![+!I}iWZOGR!Zo"CRAS=rΈR@{ubߗsjKB3i <Z͹&cl> ܏4 )!JFFN&'Wڗٞe&m@E}TJh,R{(G-c/&YVuTee8ʻ_R>ū@DtdVrZ|Gȿ6 àwDeK`(M^~ƻfscū'w=n>6Sv!ƭt[~@>G}0C~тC03H0|e\, .FמۙmhH-8 %F<t4sn!'?nfzpvÖ\[/)z~߿I8+AS;/ )~oy{t>S*q *qTe_|m Qv하$N@@}v" ʻd6v-wѸᏞpM:Uy 6"P(HH}O.-6! UFK^8,O> I^2DuFu5"3 Wx\[]AM?ȓϡȪWQCNVHpI0XGg;o}GpvL2I"uAs$_ܴe5Iřn3z4ŪAwg (ngb7*d8^rGxJ o;AR-ӷ #𹫺YAM nʼnakuZ.HyQ"f%!  #x[9 vr4.7dv}S,Tٴ_ACf4'lL69r-c;0VXS-TAdQ$QK~r 80ݟ"s`jcf#xfN A^/ A,uУ2/wLкTZ;V cס y#fp$Shu|$82UAՑ$2*/ b=YT1p~dcPRtyMEeLDY^wq(qu9oyJ)- E%m{11ѳ n&q)ٓXp?V9s3E5 k9kpҭ?J`Ub!Cwe;!g[QG~ıp V蹧QK#7Nt;0 wZ#$2zc>4u`UN#5nm%@,k/YMaDcU"n1VMBƂ'XwjѺzP@]?j̳4z[[Œc'3 ĽdoVh>m0hR͗{pXrN\l(U+<.Y' >k\s. \ D XE CbR;0T]nN.!t)uUL&m4NX[ :X!@S$Ҽng詇Cpȭ#c={p׳hq#\^D8 -*gf)$b~`qEk2lKY1f1T,5r*+ /$1M{$|59EZeO!Aery} 1NReV$VΏf_B&Sz`[M~<88zޤi,9 w"FEkU/YD`>vIM$ 2/j0rbBQ`aTZ7wſU@囫Z$nPo/R4,ֻ4w>%;A-vq0 \5 p/\R>hHK\< C&;Ԣc0ƠoWqR-.0u6yR{Hq羝6k!a 'jDM4ʳt2V5ۤ0`͝QfWB+ ptۍR)b(I1G)5'-3d)x MưV}*};N$Hslb=:fƻ\A š) Z\FH G~o+ӸtQ;xf%F0a]lh`SmNasgT3d. 4L&z/6`Q-mg1`څZSj7`sDv&k>X̊@l!0z> }K+iqzb* o_ :n1y(r0oad[YAAMnT)k~U')G7tiؿg[: :re|{lƯuqPOmLrY>jAEwX)#\ ƽ=F7dkaضgTh1䌯\* @֮(r *#gwI3S,2;nX(8't!~?.aWi|.7=B&FNTkoV@5R5hW[lNo oin[J,/& _.]#G#җPÅ+ߥn{[r÷@j32ae6χU9E 2&[葅{q&';hXY29(O95^$(Lcg*c)l ?`!ʜȐ="N6[iv/TFw8Bs`^z,X_;M]w9o;I!70 #ݨ.%5 xF{aPy mC`PUH#?ouq#ݙI|%cmYxCva} Z8Y Vg8uwaӽtR [$k1 KG~sвƅ-),ɿ/GВߣY%| Q~IF{pFx 4;Dwdڧz/LZfEaz[SLGR{Od״Ȧm2C *!4ފwf_ YiZo:P3bWgB}ޒR`EFLmM;-kvv6,"T-ޒ|DR/z +l]#e*1n|ISmE;AOup@]m{d>6/ú4g@GZ"!4L"5@蚷pKh\UJF}h&5bG+w 2\[PB!9]>Y.V S(6Ʈh }jh|`CDnR2ЀI,R.YHb8#Ǻ͞x+:S&90aAOip8]qe1k\L}'uh6D%LX]DPyGzT,"^uӭf11L;rDwjʱiN/Ki*.wX!4AUJ?*yY-gPEo{ .p4ѓQ66;K‹ퟮt>_Yc`@ x8"/h>hTKpYBpzheVcACƆs2Z"(O_[:Gf;Gy*=(h&uԎ{i`{4v/Tu?Ng3\+yb A(acnûՠud}M__lI_K՚q 1UJ w׿t㊕ bҳs"8sUw&ŧ6|٢ȭ#zFl$8l}X@1N'IbQ. iMZyKVGϗˎqJEg߅nnEh_!Z\eXֿyd+Է׿sʚѫPijn|Y_`.cv=L$-1 .aP gi2{qBaP1NA<^$kBg{$;ȷdD/Zyn O:֖Vzk_aa3:\(j 9 )]yկ#o6gA 훤#yt%Pggq*$wa a/ڀ~D'V1UȾQ>5S+';‹sÞe۰ZpĤjo)~BhIj7*j5?i;=0x?AOќejOKsVt[M1;\j6DafM)p:p}#d3V"hCGN«L='o8QS& X/,lj naM![ؠ> 2/"pI˻rցϠW ,,s^`Q`W ^ȼ{npbtlfhE>*I$Βw3t@ޏ06O @wp~;q1phm0Q Y(hZ) Su $f "o^6t1LG|%ijB}CƪA#^1d݊-LYU:eѣΠ}/96OXXu2θ;>(ANoyV٭KzGءp'7ˢFYm4G;Cwa% O+Y#Ξ]ni;Xd\C/0RxG`>v *Y0 o:cM55tPi^o+$N!i"i.9Z̢ у-4q] ¹l 3>x&*2ntUQl穼NuтP⦚y)hSB9Zo)0%+RpqÒ_>'JWgجN웂U&c$vqCaʮD޴؃p՚+=Ȃ?İev%KEE:i>iOx7219@pW>WhҒa ZOL8q+pEHiL !3`D)*<f .Ľ$ˀY|dL7D Q74]5ZnJ U'$2O҆ Gr΃ܘ~5d+LmaJ3C`Ր>*"~$T ׿B2nruaCM|Ϊm;H^4`Hϫ2WO :0ypHZUm|Yu$}'FX:q5t4.bEm&KQi=,`xn힉Q N:}R9߂9Gj32DkiAblIZУrh_}xh-͇"lB̄˜X?S=/|#ݷ53͂6 Zq@y4lр(uEԤ _>H:C~u@' cd6"SN8/3UjKF"ez:b;<(k^?%0bIPA%K4/Pcje*9 ȹ[RQMrބA* n"?AuqG B Ym!g]%aESe񜱦$O濸H`j0 9)ef9F_ߤ3<5*f7C Ixi,m:!HSEN2I'm:גLV" yd<ߺ:jEOϺ$X&VpMS,R) ) XQ^ք rCP :)"vxͶ_ wHc3vg}bTHA,ՎɁH|bNIYFgS/$ 6а < s/ Q#?8d$ICfSN3js 7vt1MY[L|{'5Op7K{Kx=Q̌͢SGb2R~K-9Aj \Z8C :82tOuӲ+L"d1?5+J>h$?wj1)}k3^?v-[Ơwv)|W:eyCGrB3 !o˝0VyBSӍ](1OCrfELZh:5i9}"qz(,3^6 87zVẁDmRcnm!dǩnJpp:o.#nlEX^Oa㔅8;bk"&RxE/|rJS%X*HܴiuNHF^h0kb.YHyz,,Ѻi8:\ _ybЗzpg*e] 2s{&? Wcw.9l24cHnNF'=;b+l0B۴h|WzB8 TZi5ԺT'30tay/ &`ǧUԴb OtB"8i mx%ݞT54sѷY[7=(>8&d`6 m/ŰOi,,Fl=c?u@˛b3ɤ ل Ȏ [%uE!T9+d(ZbyRzYuOW`=l|WL:nZ\H=J_ A٘;tRL#(_7,Y6{{8GmRv ~ZA^V/f|;@nA ũkP:=^ft2oV_T 0Z)7F}mb7pˇf"!6Al X6p}~(QWVn^sy`>Ak Q$B7>C{K8"m=\ \B{*a}r ` l\A|5W73Lm'K &$O$4]~!8Çq5՚Ӹ. |*aǼϬ|z<|'#4|(: QUMR=O7DK*i,ƭabQx [MĖ!j'ysd!"G*JITZoxI1V S30,ʭt%+; +Lp5% J`A\w,X0B60Y>ہ ٛTXu5+w•}X?Y)cΎ)|LGѥ05v/1&yBNa #.TI/pZ܁eyj .aa[)J0 FBbh6N#-07 0[ZZvF/(rq%3r:lV8EF}mYXnq7P1pzKqmabETk!`h/źċJ4ip;lc|7%A%YCv;މ0ߠhȋ̈U]z87d;pThˬrMkr8i`RJq.&έ_d`ZoF4+)P*N =bK]/WΫBa=Υ*`}Ww-9_ BO' cʘ"VQMw[ C+$2RC}DXw߿@s, L7@[[iBd R9;i@"AP6%FiN58k!1Ҟ'gEN8B\*= !ەןc%g3;N#+YΑu'T;aPQ yI}ƲǞD6S?) Xh90Yz*4% Q~nDŽl"˃d WpFJM!b 蠬~x($Y Ct`5ݹƱ!S?JTE>{h3 QwUe)xuZaƹ4KSDQzZ%qK),]>ȥ<#Z8mnƩ<#匂qYFxY(b Ȗ::ɸ7G[x(3ЈړίH44mR4{ GGۺgއڡ/A9Q<`q&hlzzMXj \0d1SȪOU9VMnNz%>,Õznjt N ` m:´4Ur|TGx͆>sMQtXݜ&i_. R/1AЊ5\g)|W87bp1[3 Aϯ{񫗭kΥ䲀ʜ,jzl;/{MazL̼bTna,lKmQ"xS8ꅧ'Wtk4uhN~BY,9]I۪RB7slmP.ubc(aZre7#Nc{IK%"/nOlnߣJqu mz:gS^=1Q[WYU,S@E'd ?ODxlEElKpc8-5* gBGaךp79S=\Γk^NbsM5fԮ0ME|{ӑ5FU[rcٕR%]*dү9AweDA'EGZ8_/dmn{|dr'h[)f#[SQF!4PkHFc4fHt[G-Xc8٠xɚK{ F֙6rU 5Qmn?=ePƚlSTvAlCmr㿣|lłǍ(Tz*Wnj Pq4\J~3y J>&iH! eG3qgIk( Tvq{J^ndOp?ك8x "W{P\`d4j.S,~M>xhI6p](qDW*IdF9):\C;.J+0%:)j"* 4#oyVJ=b5.Փyҁj\lIeRJ5s ;/^! gmbsK ;X%”_\Lil8)nPCU>[낌?]dw!/659nAL9m>x KhAa:\h3 =?NiG?;DfNlJӱ23FsA:_iwG$sؽjϰ-^Wsz}Xj fv{v -?n?;1?Z HƟJDHl-X2D}8)VIб JJZW-eW;N_66z 0aElUnMa)'O8Dt 9x7iJIף~718lHވϑ*Dq W)v  u46$&s`Gkjyw ,U'SRflm8Ah~wF7XKY~c |0J/뻄Ƌ1`B7Eނܮs_3L(d m&pr!ِv/rX] H\soKv*pb'VʤOanK$J[5|1ҟH٭ >`bRW_ڊO+7M@Gk:S(БA擏,eKU0lsAWۆ/9Uyj~ qJRAh'/mI}ԃl<EvI嫄}|6pR YhZ$0DXZ1݃8uaL$6nL$C-#7a0ۢI &< $.h>r/}v[jY4Jd2gGA\vm#uUGAj j'cxn:BiđF)JzP<|G+e!1,Ƨh|@$8V :_ O29W1rCXbpxBhp2 ͌%9Ԯ1.ƶYTq 0k4d誜ȫ"lLKv *2k9e-A֘Jm@ܦ b)|ؗ8qi,7?mlӄ4X^'VK̥qLxD 1ոritz75SF?AP ڜC"q "B M9I{n9dn&@[O nU[^:eˎYzc;Uu*7)fEGGX7. J|*CioͯyX}sE<={a~T4joz71=a+5~N9y |&t)-7Gn|KB|/֖dXx6쓟oPzW5UKm鮢|)A\>^UU$bqTy4P;_~Rg*NL'D#hO%@LfZ~NjZpW8V&"ͦÅtXĈ#?;=/pqޗzI6+* YƂC8h&Ce x\[ORL1{^1щJE6[b=mXͳ  <'WK/s0G.:,g4=- ,i|?)R"J&D3Ytl2D.B ogoF^(^ݢh^fo ρ 7X !=B%fUWK/FVE_xsAׂj7L/OLɃ&. m>ՑjQDރI |JV1*ME]k<]!=4Q8Pgw'yr΃jdq #G!soycFodSw$S\fuQ[h1' ,m;!rȱi:SSBr3b|=Bp}az^lsj'Y+H260%d6-K|my A$@Vل}e.W~k!EpkqjɣҺdL|B02TdAek,Ěȩפ@yz?a$rD͗OuvG ^u|2H[rлdPn@[Bu_s!xRDTfL(G qPDXjs:^ k"bJA`˿`Ws 9Kb-ͺF½05J+& L  H(%liJob" .K-hZҜ2^SP{1З=Xk͌wdȍtҜ]Й$qCZ J]NElӪ^K=:?퟉)FG:qxGSAdoHOgsP$ODu@ٕt4P\I4/B55Ʋ+>Y_)yf &E!m0~/%m 7~v37M}{ɯŬXēknK~ԧ%zY`HcvIG`[:N=|"uTdr^ڷ"%EXlu̎*pT_ڿkHnQ3oMKO$h/] R@zG~\ҡ9L -O5؎tk_FɛXCG~QqmA{~Se"3eZp:eėO?ƥz W8ņg}d1H1ׯZ 7'&Zy}#Rei<Ƽ";PN=^IsW@iԙ ?'qjK1nm3,1 d7E]GYKf Caqjr<cp8\5-p$_/4vm89|O1%w]7-9B̄+JpIs~wL$Y# n)=s8&z*܇TgoeHn)9A^֝,Bˣ*3B}xmpE=qxl2eX\u1ĢpMh\JuVy7cdv~R+Xg*ΝsÇ_uBE@+n,\ye fjB\S`0M)se]1}w[CotinY fC$-r&! _m]/]6ƫl}tPdKSg ž]BaaYoǸ'Y_ϝ {WB z~ dypC♅ 7+p9{i[Cf޾P$aC`? h۾6'B4m+V kx~,!B?J¸,q壜#TBc}[>yvC^M030MI}nHj=)r!>qc"cUIwa:-OY'8ums@l9 ƣE<,S/6A[8$Σ;6#kSq@3P1a (iʤ XEɻ rښ$O^E&lM3m:F{QߵGnZ8(d|. b{D􊉺"$7r:6*h@=8=Y]YH񣣡?s^uubnMvdRj-:ƕ߭\(1ہ+C]~fNB(.m hn YKطGM<I2Wiq7.ap{lnhڔ(Z ,EHȇNKIT(y\3,$—*xfq'> $2bkd%RvaE$6 $ۻ]@O+~hO>=c[ux 㗊l5ȀDvO1O嚆2~"ѡ𔐳<;%V)ºzӲfJ jG9+l察I%(J4u6EMF8 rz0Z-S&58Ã4ZIl\dޚv}0(m[i>KSva:@wam}r#ZXVoYZEwzGs5"`GsfɪVȓ~PmY.8pU*G6.`PEhh{&jv^1xm3t)9o6),yJVq8oh`z? ˫RkZ@LA< #U7nt}Rcp$_iJ+N<9N5^g k"4MB.9`2 <qQ(*d7+]ܷkpiYQa}I -؜Ə Mr2*G{lQ^J1oC~3"3}ˋoMHۃZZ 嵦 xQl47c-RA-JR:cW!=^-ZS]q/vP9j~/+,9| 37>;=(x!:)}QZUC+ۤ. ˒Iy| }`{E3Y:BgZ-7*i< |1|HJ]Aw \OwvQX6nꔾ^y0 ʂKh_z[1e.y `}H$٨2'Z'۴u[aԶ>ڈVVG o3 m2$BC]/U2 MQ\+9mƸ&ʑ~yndNŀ]àͳTnjύ?;-g 4jZrA7%\#Yh؅hmSL 67%N׶:"1&Z: p!Qco}q7;VmKY̭O.If!'a 8mO%ݛ\䊎!AuNs( 0X^È65bq,( ̽}Ҁb+ڌAer2QfBHT.z/!ru]5u|erw=N,ܠY]cf1HjnD6)Y<[ǭ,8_ Gv7"ЁJp>Q\8XK.7T,jt5`,{<PU9Dh%í}!:F \h*CFQ-Y" ^4/KoA͛+1gI0}i;g#27}_>kl[ o,XYҾ v |b:S+~cy}G9X8T z T hw0## B fX-iW(H$@no@x hge05NQfv<,ŞuV fBb@Ѯt%ҧܔҁwjc-e}bUÅ]?}DqW=IUKFqH.kQݽ0zbf yMf},YQN&'Tqdm u"Č0$9iq^՛c-XۉT.L_x ɰp´iuNʖ>x?ퟪJ!͝]ILJ0ܵ%d\lA:#*lR ^+&n)\DX "F??rW, t5Q̵kpZ4Tݬ̫+N>=BCzq }&/յY2IسC)O V|u@/WygZ9qu3Y_7+>Q/b1 ooe]0Ln~@E\|`Z9Y?VWp!( E휖7q]㐌ԧ00X[`Jy>菂'FO`k@d˦7_Y1rUyJ m$^4dK Hmvz ;|ó$&-C+[ ]w>!c}aY_lv6\QuQAk\P6h["uINVQMR$6{|$͜iڭ%@+ 4R"P`#_v\GUB %ZٍKĚ=*06!`鯯 $U}܏HJb w` Ԛ.(z̼(2wzw]T"Psy#\K>4{CU1 Tc{ Q ꖂf2yC9T;o@کǕ \( +> sT8e@KU=8|dZ-ccVUVQpū`sK#hQ;j{ 餢)xݒ=D,C4LK%Xe/ ànüa%PHllTt`O<_/64ҧCBe ot M *TU/$a8+.6l;qh1]ⵒA 2AM߱|sɛ!|dHI*%,=hnIt. =fny͔6Z卑EjSE!oA?sHP>{Ҭ ָ[}~dxU9ǚw0o28 X\u,vs'.єA PEYܡ :XQTR߁ ۬y!KWhNJGy^`d:jK+TO5fx` a5jy_GIA􋻘ѷVLЉyvaI!n3Z!S?m[sRu\^-a2_аovFUNp:04j7Q^ϕMy:m ǨBR7/E+P^~?Ъ1 Fnr,0~J:-YB? ?kR.2P k#n;CU`M!W*D59)j. ߶=!7X ~ })%rKf`KlJ[1)xl5I#тAA}?0;DP|4cԗ:%滓Lv`&^SM)&l rjy֗FAv (d뎶wbaIZЏa^XFI$uzyS>㘱9B K#8SNqުG )撁Vt)'"BKOKV v 5 r/&$$|!'B؞*P+14{A?6(6|L׶7a ڟ4?vOpM $4 0HXіy5 ȿXP/nY⥲( 1_Y\}1b1 :6ǯ6zn\@6yPuq\\xH+xkW!?ʂ ɹ\.e0䃄dnr<$>Q 6ZmSN (QK d&z_f<4t' hRa$ u.4E"~=C **W&C5c<܊6uS9sC%R1:}ďS[N)ɜ8 Hol |(2&`b MQ0DGGF+b2`&P6.6P5_s՞j$ EAex d-"o󢨒,ܚWlhIIr5n[C'd L3GU1ݭ缒T'.Z=n47!ZE A߉qd.A@-ݷN{}`1_-Į{vR+ԻԯeEKG[L$,Ƿq/5 \nN&PR^9hmV )jkZ\:V« !^25?{"Ek3{ZgCԲÙPy`Fr8Qoy85Wxѝ~j6j+Wgo:ITb1 S*pV2;Wx@'n;d=>}TdHpUQR rʅ 4?ܞz<*Ս3C;&c:` "5jpQ:XR鉬#oy2(ljŴ #%%2>B_ğ9\`ξhKM8&*QYEƸ7P`?/E=r]|9 ʎAW\yxA D"Lib[)#Kb7,wpV>e0I2+;η:I@y_lpe1bz[`au jimK5{\Llr y`{85(^j,jtTd1tdnij3aG?6=#&I" ,5e7o$}L(+/mH;lvƽy *2Ji^"0o)89ۤ8cA Mz(7*M&5)AM 0~pl*Q;3Im'3ϢaO5xRJ{j]ca70_E(TOChLtNefh3_nDet$-P\z]-<Ԩ: /o+z %c\`=YӍNjznrIϲqp Iӛ]aFlAqͳM; ?&Y~_Qq8G}+imb 7^] ,ᵠ7``hvJLdc"w$ H`ggש UG9+M˂F"ϩ Lx+!8XкyjK8S筎(/dR4 Hw00Qa!wu@%ȓA(4ю7F@[ 7 lAQ"~ 6>TdVɃ)/x|Nם6UqeD foц7C}~(]׌_h0;L] g'噳oժX\bXhWΟbLaںjF%~Y{+i"°f 1ø|^^ጻȲ[ܘ21nwhx*:$*sк̟(U0Ps>>103ӰFIј[+| Ҿ~P*;v F0K"G+C2QsS8e\e0!Ҹ7hsQ;:,f.74p=0DT}6i@iĬ6+ (,{PHV.zND44ay4=r!e8װ"N+mC(TybZx^D|<8ʩK?MۛJ 4\8*yA4A<D9LH B/(v(F5EkNQ{W 6u-ړt6BO$Q}\Ļi_ҝufYi$˨6M3˄17uF 6.<_LͥY~o8McLi&D06?4$Hտ7YiZ"}yK:Bb@1ƿ<' D$]g;*({T1w@kaWi.C;%1Wm@,q&oJQ%DF'"nϥ͙N Q} zBRrﲖf~܌v[k.Ӽkg,Āhjal%SY_j =!/ܰ _Yvw)bƗ!bѤm+}F'>-gga'Duͪ>Gť L^D$Yb!%FQt[~uOYx"L!BWcGpuUd:wɰ<p@TwsaУ\[jɗ~nKWxS&,)5g%i<}3Ԫ}AA_~ ̮t Rd% cV o׋.MPڶӇ>ڥ+=H8))o'3?QIr#srydCt"?0I`ԙ$\Ox, MIWNKM`TJB?GLì e[C&mɋ$w@;17lW=Ԣe[,*Q&_Nb=esq Mmܽzp\dIedoWCkYb8Ő43Ձ)G"yL tԺ19x\ujGfgSO{q ir4h?B}s AJӍDʄ󥙿*wM` V= igcԭ/i`g-s JyaS\)Q˧XQd;d}& ݒY*B0('"T /HUc9b9Aޒ ͅOӆhuMT*6FN5d %a5zY/cX1ƴ&BYؗ1뎣̞sU  Ʌ!ʾZbj>э;7?fΡ%i4@ T}lYiaTSb#Ĝ/n6F1 0pũlUpzIvsEɄdј&`ϰ&#f&g fٮpmN ?Z۔W{lXsFT7^5AX-v(DH^{DaOfYykTxwIپ4'~of?h>mLhiQppƒ?b~8%mF=ױ4 XU1 쐪 uz g4 (nUepZ&VM ѓ8l0eC! AM7)9g\iP-MQBKO?qލ/U#t˾e[Ms]Q`;J}4;j'" Vi;г0@bhweî;j`*SxUMTߦG Iu 0{0GUm˞#ʾF5W*; HgVu>K!wD jŹ`P=W]ZpINlS8︝k}l۾gDأHKP[ϽTį8#yAim5:Ѕa;yǤf[\2\eN5LD*7cʛMs[8e l1}\2F>nt חJFS\׳|[rHBV30@"#N K3'7Aq0XHRo3KϒxbLACnj?ZTu/Ú(e.) X2,X<1|C;+4c[q1%`8/u\ɮsY9&9̶5HҞbY *; pv5]Xh(޵<bXNaiӜ1>D|)b380O!ML3Ýs*Զ| zbnEiH=_5wS H(&h7a;{`,\%yABP }iJ ݾq X-ŀQ v$ VUXm`}ף:֍iʷ -U7![a@M0B!_>3Gt뛈h3ωT,NhX!20ܜ. <2> C`^5`2(˧`_ UEAx;g%h6%vJ ==18`,xO?K#qo["oHA>KCn`PKIF:úDJIފKET3;5MI\s* oZ{+ڜȊw^X=62c<[>swt GCLUy%g&j?E\F4Ys܈G8_X{s8rk!O8}FOXl &/a_\JTvV%lFr0K u$6pBC[~OLk %΅"o;9#^XƎֺW:F }YX9e4 ǽ݋VY+6mT7>+q3ZP OS7[i:&y<ʱkH"ӯf۟ l1ܻE,zuԂQWu1vBf=V]2F k`} 솺7hT8>FOW63E3&FtqX0𪚎$A^(c&Lr(R@v(9B^[4P_mT $D?jY+,}<+*ތ%%>FZyOHv~LXǁtR8@,`!Nwd*7U!$.ulF4mm#WrR-#jrXoʮ6!YA[3AŒ+(H. &z7{ehL XK:<AЃ$֎Oa#ɃmR HHa YS%[.ĶU:Fʘ# {߼ JDt l3N尃(r̀ZI;"q;PT'4𧉶!k'eF77=x9|T|v){Gp#hipakT7c- 븿@ ϸ ZpSc]g 5Zѭb\5(/ʙ/mU5|>CɁe[e%&=%*bQ+6M-IJ-tT6ۅ] D@ؑa~8`C ?&ETt+gU8ƕ0p]&}>7Yd%k)/a:Z'Dqz# k9D`%ֵM\$VIOq&5|  iS=( m ?@+sV  ^@ҘPbZj OmhMUoWL8|Z Uv5TSkѼTr0B)U!>LtQ5Y.p;6M@oYU_ʬ fbVqU`F#)2y'?K$Y~xǼՎGɎqI+|NΨ8Đ" \ ?IiҊ_Yf Pf4@p#?δy,9}rQs~gMk6 M~xxg:%bJ! ݯ$+bhf>ȖXb:/NpB&؏AJs8-u=f; # KSf:?ژ} DcA!AJ,w{\NIOöEƌO>D6w5Ey`}(Yc)*y^JEB䵾h') [u0a?jӧӘ}r׽ۍ^xqS'n+|TFT T{A{~$,h}Dg-v6&zs:ns:@J ;dRm%X}PrĚ)R}1ǪfH^$9s@*8)ȧj8{ F:o;fqIEs~Dݲj|nNS~-> ϼrN#$(4&Y Uρv!STrAyc$\cm?9zw/`hq Uk*CF1wQL|&Iǔ{}ŽvUl\ȰdsW=FS}ưF&gD6|;̵GV Q"o t@aQIaɳG"p{BǑs>r/'ԑ|o1rB|Fnw oY69D)1QZMH i=O $j-0i6“ih7#Oz[Բ)6 3/C-+kqvu0)~y..|t[ńjk\zjtDBFuՠB([>h;fbHw]kD2?^< 3r3h gR2]1~g%vv"j 9Q8o&|~z*O%LNpِ{H=uVGk c,qɶLAT~Erˬ;w`U%IΣ2HhJl?҉Z~~,"(< IE+n^Ӊ,}Ͻ=vKCmZyЕ oP{o 46zu0c;=OThJZ-q8s27Њ 6u[ɈMSS$đ/ևk3$ Szu¥(HKmz<£ F )Qw . -رB#En:u|ĕ/rMs]W{ޢָ[ A( bN Īj膔o ߛPF3ƘԱ+zawoJGeACkmpl82TavJ Uwb/x+ߩg>N |sEl,OT\-˺^sF_ŐnܫZr 2:b"pn*K$*j|mŵh&t^#ěbp,?tꌾ7G^g<_k> l+|y '9fptW{ WVe$#m%m,%=G| YGiK՝5s(ϲ>W*XkdߤesƗ`D5/Wn>X5 .g&*#:jM,9RG"iFFW2&8haEs* #?!hVGJ>lWBY8l8MYBr]z`N~|$ KVLq}gT )^iS\5Inv_,U_G)MTR$_ԞպdŜ {A3qO$ Px6iUW?)G_lxڸ/'bE@ˀs9G5h&Յ6i7)җjٻ \lâq4* 3U g%$nV.ZF>7;'JV*ej>}UDBfU_<8F8c0,J xe**э߈28SB3j 9DxTepsBm^kjP_M7zC 2ӏfu1p*=;@4_=RCCyYOJƑ;$cUR!>Kl:l_g5Cv$"1-RU1 F9qR4;3Č[x,[ Ds^m r,\ߘnM"(<}e㨽@3Bؖs.=; Lo5JF4LbI~u+{F plP!U"DPf`a',[w)^߿ ?/]S=eCo*&fPKdkO?QU >ł;%9 `*UfJGM$&oj~pH2#Q = |Es}̥8nU9<4)kԊ#;GC'`7J22 D0%OzDXFU` HAS hӒ^M!13$ \CؽHރga=y})ngGIWy%70y}U]#T ҋØ2CL|3Wv>YsPHDLvWxw]_U)5_.U7qgnLL/d5^oY4Z4Q!RifB F lkKeƮd'"9%v8X^cJpCq4'Bh @aZ",B1'D(uY!T=x)ldcU +{05u|l 5d[;CfǕg#*wUy:ߟR1e/pIZ jF[l:[w4s!}ӦcPH`ؚǛA>^ 2K ';{..bs8.oi(i_TR9v @=nM!]yj 6NJuXГ^,BpvUs|c'Ľ&PHt9.gG[`M(;fЫ4*`F..5)#bg+RzӒPQ>l˂m>՘fko K;Xэ*2w7y=;a )jv u&?o-kEFp vV -T(Mcp\?aORlGr$6Gc~rtWQn>}Pl_{L1<2q <{9zuՔ4pd:*JU6A7e}[}8ֹ9 ];7.R/3.;pO>&x\286S%[ B$J*/œȋ,!d`!a;)F1 K5>lHmvKOu** g:W194&33{f*;[$r[~lN`NQt+#]dgF/UQ`J08 Dn5(/ K,a%E|ͯI8Eۢ4h6ҹM)Z]Qӆ]LT?ʮ$o8wPRlyV;`KO}2O+Vg5smݕWDA\fWh9s6/6$Gߵ WJQ=?Mw\67 ^#ؕep[k4ҳ%)!Ĩji+Kdp4 ؁aDXgf;EĂ!SϫOVB!ܷ%h< Ѽ@Zu&?1#W;c32ۼܫ应 8 "_ēaj.nRN͆q/q(Z^Y+c :|k_ol+8,$<ܥĻF$ZB)R`nO(eqtzhT7#͖%`؀4'bwyvϫ`+t.i#^`k17T4;Aڏc2EHRjgdjRYmαQtu%LvUZA` oA}kvOw\z0WsYF #{`a9I3i_nfgcMD .Ȏo~W+xʒ͠Œr*.8u Mn㕼#PXҔ Oχ0뷜!}|pereQ)R1е%:a G2w͞m4Hx oJh S+!)u|cUŰ:Cf`8S##LBH5I3-Iqܔ3Chc Y!5y햱BXRJǒ0u!3sx,5qΎ%3R+ :^8_9HA܉ *r@=hY3ƿ~oԞYM:WRwJ"Gd-t@Q̦F_SW߈6\`!0:0)"th,F?5)6$3Hɩkj$ {zvx@ R3w' [sȫ mrʹ>_SXsc2R[:L Y{—2N@7Xʻ- /M-:Ib{%ID!v\PtryȵMMK!ms["jDͦ7P/P|g;,g_qiLŎ *M^ז zkkڨ\70ER_I߫! ºV̚5DiZU5_aS.ңell.Cƃmƒ .4OVOs'~ t)'(D@095 Np< 6Dqt[5$I68}>l]δ@ Z\FA* .4\1|reU58V t?2k.<8D&PL/Ec)[-dMϱ~qH}J1u~v/wvڈ$:]óL0S"mTx")AORs)T]g6{oޒ3*٤(QilzO xv&McK"7`\Z؈&xK02}H}* aU0 ","n u@():"]>Tg zs9,)K)fRmw~g&r}![GVF_ZqP_5GA8tG@I©hhE4xK!ՅOKt[o6bH5wIOLRbW.b'p\'Vg@C^K=Qi)-SRRޅ>,m*m/ߋ{E3曆)na:p7X?$_3rkMb]Hd! $ ~b~vbJObuM>@/VjhpP^ęVuKJ{$^]ItS3YvVjItJG;Ej0U~[rƵ31 v0hzP* \tdq@QCe>X< یk5(:(jb"M"3 #u"tR"\]ɕKl@pSХy{Q*uYpXCîL[W m,ʗ"~dJh=WLJP#+9R<Š${MFCt6K,1+Mb9'ˠi+_15ζ t0=,и',;^ktWDYaG(>Zv|;wY<IwW=i`·O(Ppeo d(4Y^#Nc\C^ۇDnP8Z2A ڥȄ GvQ.]Nɫ](j&%v;e` Uy1/ñt!5EWǜR1OWP]X~en ˬX,Z.]eIƽ gyei9-1\XCf:Z~\(wKֱ=e IĔQ6d#Rɘ`(n`'D,hE_}>PP.#ݷBLB!XePītHI' ;.ɆI²/V=_6B\ ,P:Ae^譆̲J␨ %}ռ/P;g|G{#hqE^*CKBV9ROSldpL/{H֬X񘺽4h&u0vp4M s`Ho&Cʂ6c!EoAUNrxO.42D o>M}7`KWI6?"g|*R!egٶ1~`*Y`\9Xa81a.Uq26WtF;[q8Z#A(6Y͚1 XM?6b `Z9*qRo#GJwչ{2g{BmFɳu + de:$7eeڌn~:7c>LzHU_wIcƴcכNaҘGhMDORwIˁ̶aު?# Z]7ؾEa:Whj7]sEr3V|4kӏ+X+,֢TgƬJS}&~auiFBcBxkcK`~m{)*J{i|=ùCe;C@1Ruly֜+cgft?ŇOti&䞚]H. !^] / uDGx3Mʷ+5H P8.r'FS7ބ3}ЖD= N6m_dV59z&{}ƼދF(t <2ѷfMfX95縗:,F4>ġk%max|XlO٩ĵK"7_E%X9z'0!<.[326'R¶H e B6W%ʁ;r*bI3^HNW[4bcjEH^&d ^36R8z汷<8hYtX>G.`'?oS,ֿ> V DԸ' 4>_+甕ٖ DӆiBܠ^w#U:UDoōo*I܂\}J6 {ۄ'2bV%`fl.]yyı_o =j &F\8FYo+5^(Z HTWKbj66$oV7z|qH|~fhPd m:@HSaex`Sx5D)V# 3fwIU(x@Bq>&@fuB+^A*pE8$ȢjAe@Ub8qk74ԉd%Ըjv,O>\ztOjVVɐրlxF!ϡ{ۡG2|tk^IV+$NMn瓍pU.$zmawtA0*9.T-οd'cwGM\nZKp@p/F%v\8 d#xFh^{3u2(" 34hUqZ g؁ ݤeG&,셡ܑTe" cOkL(bcە&f.j< s5RU whx 3HO$>| }dzh%u4cB3!)Cln$AƯJ/edR9s`v@T|^r*Pߛ`1y<!"O(-"h(.> z`!كGN;CyJ?š4 _;MRqU!q7e5]4rMkαņ(+Hs2ob%>%f@ߧES)E jC'~,p,vȍ0JIl?_spS]g QĆѪC9<#ljJ  4u ұ$ZExH/Z=IJ].jp0nFxJ{ͼOh0zx׌ "9'Ⱥ@K &FL2YڌEB N{m51UD;V?ʼnӴ"{ |k]bR"-3([n؎i r}҃@%oFi]+f>mDۦ_U*C}Pwѫh=gbK ?ex)He[֍ iezsc{ǻ᝱OX®27`-g xAtQY1B┡R\?JPvV __Q);I]Äsƾp2ړLoLR6ʼnO>ݒ\'i23O9<&V2bq^DJT S&PӪ\L^`Ib %#нf~Jک/^ {ӛË~õ*=V,CxVmncȲsbPF>n8o?<Zf.es.gpLou#Z tA.8``Z'`ѵP.8 %xF bh &kP0-&dގTQB⭊-f*!-C!QFHfkT ]bk)CWսo{K:Pnn3cwE>S8pνP1 e]N=n8i0`Mnc汯+bp*N?&4-92≷g^AЙ\'ص>Ѩuv`P| Z/R{BWٗRA01|! 3?$BE߳4OvmQMl*2i ' 5]_pޡQ9ʻ<|ZЎP VmRT~vi5d,_B[tZ%ІL"i3O& y[dQ9d/&!fqc7'=eN~XSE6τPha% F8tU{ c }܏6[NYPB,SBB~[?9t`P| w\W^N,r $O+y)Djc{2U }l]!C+8JIX>2):f}6b ƣ .v'WH(/C y  p}X(I\ʳ91!u7ye8(%|tEH?n1m.YM(J кxww&|$LhuHt{LL{dG#{ĢJح ]cʁL7Are</ʆk=qlXH*@\Fc ~ K'At 6Prk i?IGIYSaɏ 2fN k{ 1%Z%= jq DoroV:n-̇W(dY8f+574PWQFa"'K ]&e';1 JATq=7p? 'IODgj;vIckWakamЫ~gu 7So7:{"kKdxIB,΄w4iOY ۛGHx2SQHmxCғbZ`+@9ssF7QT@ VQ/!N)bԒҼ*z04A=eUL_v@6h'bѿk84K3yJc(p4p%WiDkl?=2kmB 녟:װ eF9~0T@k[NUVRszsy?mDS~7)y`YGo;la/|<zh,BFe϶ _=[% WiȎt}V!IѺkd&Uf}GN*%`1Ar == V*6AӨ}q!yZSTdE1řDڽUh_سV!%ϩ@Jj/a]?v' k7s_ iK 2F4 0-ӬlKrfiCΈ6kQ3$</,J-ۖ$Ӡ9e+}=Us3$[&SKVɣ[Ino^W /Mщ?4/EAxcu .j_:MFnefmC3H_ȼx22KʪeWH)RqSnԉx7DwaatG~G`]P ̔LB΀9:}2MsWŘe@S(hv* X ;4=ુ=H]EV8>/?en* 3fD?mCsrtTX&Wm&t5~x;ʑ#x)s4a˘W[K_+ap'om!@RIiIv3{O6C ClLbdXTuqDY31rF,2O1z@%[ڔ *fv?O{v4 Fy2Y*>J `/;,)-$l:ShpV2 F!9jZubTŁwKE1O+tpŢu/$׀gtM> )+ Hc(jDl9͌5iz44=K_?ʼn1&+C{,bcR bpSTԷֲc>X;1Y+QͷG@ee墘N8)UWܻbQV2KSvcFvҹAXé(Νayx!I[xaZIK$R2$ %D%x(OaLE}Wg! I\t=[N PebO E&'%FbUQH$@i Di#Opꭣ0eT{tmT1O:Ŝqn$ԫm_)`9:RYL+0UC{{1g8y[rq$tOSWq9BBIz) JS) /f=,NXչd*K&WLRYčO(^`Z~7fw$RSYaN΃W%aJ}I@6Adm k={dJstRK*Q\4޺?}3~\ߣReOW ut6lVX\-83u7eP[s2 5ֹ_VA(04Dh]Ry;xCLE,bj?v/_jvBL/^Qo {o/e $ؒz \hb1\I^x[j$B P63tL/V(kO䓽r-$t5bʡ.-ic c. !߷^ h˳vAVk!OO’3 Ԏ'Oɼ6}/m&Dw2`U&4:ٿpVhUX:Cz^I_oH, 7J [)H!42uK6#?L 譎[+;] xHH t1 'O$YexpBԏ1z?'˜hi_g1*X}M?[i^VCj]WL-uҍED"B$Ӌma N[h֞FZ7?ȩc{:ŋ-DAf >N\ Y]NQ8 ц*~q[xV$p+)^X(j'Էb-B&Bt:"]P*EtXsr4_ zoK̀J03YT_Z @3j2הcR#Z$ L,̴ z(M!!N 29;NV}D)Gõ (כEbla~gK;Iv)^-Yw;IaJ!g.B4kIAl 'SF, -:Sjh 7?|iEmߐ )g!btIE]^`VotOL} U&#SO=lF4#PḦ//Z^Q  fQl5gjjS< RT3C\x(H;U/#vj!W` |t:T^NYX>( /pPu0&T!9c A"6VRay{(vo@H!w: HkQAepJS4IgY4sC35;uξ N&3S& f Q nͺ@B8ejHف@P$AxJErcüxMb`Ögb@=j@-ϬI2DFyfxUkG pH0A_jYX9M3Y-'CC~7{.{a7 @>fIXOe !9HUC{?&)TG@؆H)t 2 xHdțs7-Ij=Efŷ兞Zg0oc{f6/8yaf*x Fi_~9)Z;CAᒿSފ,LQK+= 6*;ġ4ۊ\Xp9\ / !iͬ#ņ&ɞOsAڮs4%N݁LP̛)NJ '#J( B5M24$:帒3H"$K6``Ԏ@W!Dp",h[tUB禩$%M]"fmCA#sKZרI@ھ =L*锲F L= 'ߩwHΔ·"& a$I3Ƀ5cBݥ,#GE֭N*M&Bn&6+ƼeV\ӵ8eL^ &G}"1._7^b \R᣷ 4NDmk<ñ,\~u*ls߇m`ȏi[]28Jݢ8~#]PԿӮaۘϘka_ef}tN6>Uj]~#{IX$l!{V&1@4 Kꆓߔ}"RBSAEqĢhԫo6Y lDcJcH!<-8܂C3gA\ZLOEYBEv Iks@p|;шzW1\bp p3\dY_kz`˵pUrHġ C[kdiVJ`Չlܭ7JO rѐE+B2F% yZ[Vv@ç'%Eن%"M%pb)(54dg^zQ|uX-@&iT&<؏3U|мo˘mp :OϹt`(#l.A+ŕZ^@8K  RB}<Wz&dm^봞M\AOyHS~kMfzWLW{um6b_9/z&JuVvؘ77)icj. @q;S5U'u7fQ2:0x eN! }aM7VcOf.{Ǐ`n+c^QHŹ#Ufn 4I{\ X*]jOy|<68Z]?/Ņ{lwߘ'^"zٺ`)cD%b3oX0<Z /ݔ h'LA}Z~(k5FKc (R?;)NpI,j .<+7Au ݷ(]jfwѭ`ʶⳈS7/ݜ6 *@7VsBݑ"bRDYiJS 4 aPM6HT|EoHPGQ4 # ?zZdQKiZHR75}@HgaDs$b_Z6{#8KyY3{16xCKY| L^d L$k.7 /^P'n,bu E`@'*&4bQ걸rc3pHYF-:*F7R[K 3^Ym_B27~`@K!#sdPHy.a0'!t\ra]DZ<68,)\Xx<nkm@[]@=/? hRwd{#21mPMm[]= G:d櫁@pD; gCJj`hHĶ Q"NzkC>>LqяVWwM2b2Mz7{(!en8c"ReC ۢ>)^PWM{ķY/"0hG¨o&!&/UR!MZn*ѽZ1bAxΖ~J,hcl" _En\F3Z6xDǘÉ0O;~o^^)2{otK[Vn{*S/V3N^^n Uc`νoؤHL8p"OwpB ϷVd8%4^b+hbt30 mSVܣIaAԔto$z4 <fy1.Ry7KD/96:"b4% Kit(?kXbz4^ZosOٰÛA|}: tU SOHQG9뉖*HQu(T&=]jgܗRDBF}W.O~`96hX,SnoT&l#8.ѨB#LȐ>gtL}mik4 S-dP\ VE=VA4,_s]<UuzO H~^:LؿS9 'E #`aUǒX\?˔FBfGDcwFxPa^Gwq&h0Y"DWDC4 B3mņwI"4_(rG@&R^g'j1^9U7{ ,8~<{3[] *' !E9U9 ݞqzF5I ,MkM")s={_wp-+E#+?L"or; đm(iV;*UAT=d?fwçk(^HJ _OkLԌb+4;V3=Ze:+98 wc vd619OǪo_ i4h/v^u{ "SfIEUUBý.R$nS$i8CkAzd?{,Oot\HYEX/o4)AC=$,4asHB2NZ38`; FذɆE(G<@߳&rA"Ne}yEk3z( 4I#:Y|rY<JC\C ʎ>"­ GEgg^jɋ˜gC<:uEX@;fiʓ8%H,ITzzIf\kf5:0~[[EdXڇ+0KQteNH,ݚh XSᩁdDм惫0d& ,M>=P ׳pZL'3{.gQC›K0ApE);e YpBl.O1"iM:,Z4x /M n}&!s8L{KK){AoNSEpNV)-ƔUүB+~$ZXz<UP3VuZFNE}}񔇋,Ք|)c@-}O* ̇W!D{?W߇7|#ңC@)I](}, i'~Na; 1"V ,xKFV][WF0$TnG"b&KąR{Q16coP@58LZu\[㯍 نa.%q ~H JUt_VQ?g.@x)3X]fpF rRR(7F;Ȳnkrwͱ oMhǜ95Ao 5HW󋯯SNߨ@b7 %;ө{;(g6(Z‚xӍ W4x;G/%^$cVDoꝬ>u1v;u41 B PF2|!ўDW=F(fMvpMYcd咽Kl%`A TMOhd.ރDl@iNn%C!D:SĠEl0l]|&+<\ndȉ(:ƖI._ Y8'a%UEd"m1[,H/C9u'/k%|jke7 B[f[&uw8uj6""ٯ(E+byk<H٭ ߝEI&I ߾jPwcP:eOP =.@ %nmV zjTrx`MT;4w-Fj~y&팝(L| 4XeUOԡf0qIwX^k6XEIAw\<^ep k&6 "I?-{. R3z/r*$PwTr[HR+ ke$v&sBIz^dpV°9+ |xR >MN-JF(EϨ[FykfDlr:?Uw8 jWb~ᇛRө^G'Kޛll`]ySG+q]p@26Kzչ]y+#N϶K_J(IU]=/'V $6界P5ku8[0m͞wFdiӉF 'sּ\bXʉ=$kJВkjvE?J,ij g9_o&3CɂNbfgLv#O%L'a'Lь7m,jX;޹[C"n2J-hA>7w#"{qą_fXJx.j$ %ٺ<%ov5n(Qܹ/FD]Sӿե\>;䍬['{- A+(545@?~u9ur'ҮRN^yA-@gRJ>#g땩(VA6k@h6pB[16ˤl@@_QoYNU" ._MDO)<ʋyusR* oAtfl@!989PlI,4q7˖ᅴpD삸ޠw<#2XQI6 `9mЖSy!w;hr)9o88CNpVdPhŬv]縖UI_䵃u 85'ձ}xTw@p6TH1uh/R0_iMR8uҮPdM9ʥnu2:m]\Խ?kd5:X֌Џx SMc.]?㪃u;c' s|]@0}Nqz󲦩3:6їA ? Ǫ%L˜@ΗG#2ߊ ' <۴DuwqC=fw OIc MxˤZzЩZ.8 ߌI!_Ƨs6΋Y-սE[˰E̜b["E4O79V,NA~iMczP*Ic)|knbR!ӴD'=U5KH&sHhJl^iv|0 -)u3O'':b fT^2&zJ {ab-ЂlƽǗGULKsMMkdЛUT|\7 2g Z$8$cecu UYCۢnRTL7 <5٬"UZ= zdl4(*ml3zuF< @Z ooE:[_BlO-*=h[4¼$9[>7i7< ir^gcBc!T񎀫5Fr/~$"ڴQnNZ+2U3)䒩MT68xSfYg.)B亿<0-=XA\Pj 5؞O4kPd¶VrюIB1 Hj=m%-}Iom03\UMD7IĠ!H Po 8 Id$cmAʞ8bB9v."3e @i? qp<`e>AąUIy=n@2e8i:axHWU~nݬThVe/η|1RG0Tw3SfAAxikPz7$cVwYVUv]c 4 {XtPNޭl0LR'89@ =~#cqyq5jYj"23A6't %,#?u@Ao2=־gl^Zӽgv,ÝvzBp5}P@_E7-Trb~ "]:<,M^V$1q5m K/D!킐imj32M'xa( OPȘ nGں0M}.8A/YXr8p`Jsv@z7e9WX+txb[(pD?i1hY TAٰ^u/Ȩ  o#TJ޿9bSs;䢃z_ [JCyN_q;+j"ޣsUhxOV #{Y#zFރwMQ][oSij[|; zx3F.s(XξjAEɶ[SI^W*Z {_UCf"~oـ# zՂUfcIyhr"&і>x$X .cӋ`rP`ͻIr-VG׻ hYطc%kA=5kŢt!]_ "yvTAߔBz!K@ɌHޘSWW~b<gHB#?JVdI?惡i&dh/@GcE`ΝL"CAZc+ &Q7j[D֢P6?;^8J~YZ)FM? $β4m#m(ۍ.D[%."J'!vi<XJ"=1#he#pkz}MOx0IڷH=Ό._ hSp\{%]$3/7\~åP G-hI]?W,'| g`2*ET!~?qV}LLEj(h& 3K'S)%p0Jqe]%{i/*}TSIND -q4:)bJ[;dZhGJBoL"Nji]CsIԭ ߸{vY7BPuZXvFq_^\NVjj(X۔bIoԐ٥ڰ?Οm7Ga|W'⬽e#L/"Ұ0K;!T3#2%~^|BV>WQu ckիu2p^>RYVRFE7P茟1EXe'fd X".0-,t $eVκ5HZB=у: Te7䈄Sݤ.I?IHo@(բt_'sam¡"IK4 ƕ1?sN7vinH#액Fce~C ¨}15HAq Q =(,xu}3uc=sAir-ZkmN X/l~"e"Aa]9@޼Q9!_{瘝[U?Cc݌`!J!vyZM. xGXϵQ |cKq;ཕ?MBh47*sJ7YXAy(\i,Pwh+)Bp{Nv]PSKYA,ZrL>\jib=1n@Y8~هtTX閪 MTp)-GWsݾM.ۊLTuOc2n t5k3׵dH,ƑCN0\ ^+?gȦb KZ{$!@8.(jI%ؽwȀ*cd|9Z/nZW '嗙IS7+'TZ!1c*l x>s"QH.؋e?0Yg;(έd{wעÏ`eY)lp]v"oV#9kFa돻 ,{K2L1>* =||6ۜOR 8,v9"+ho_.d؁JEM wQ p?q7N4XKl,mh1^㊬M޺Fk k,SwG4LjgHt󷖊M]>"YޖKj'hB7H[X~v}BnT9dTkа1~xWKYt$e0A*aBKQ4v*ybowEeF73;HJֱ/tjXBuFml&*dd^J'鮚/>q]ꖯ_؆K/sվ-^[KSbO;%F m ;XAPaUo<{2E~ٞ4CLfMyԒEq`rl#YvVE؏~V~D$>s܍I*EbOl&`cx#Exc0^ݑxJ 4IԃEg֪|5̓S=j`3+E-iaZ6YĞe'm΢DcT%x}lɕ\@( m8~ ؐ=.lA" ʿhAdecI|3wTӷ Z&f|ڔ|_'#EcP`EGb ƕs+DΛ5Bjà?y?\aHoD?ƒ["i6k.zSN^gcP%w40`Z_^m-y+mO |1G00p}!ˑ,Bn_ s0W GY}EF)- B^eX/}+we 7m$tS(X2WSIaExB7&EU)\ٰ`~Ǯ\e`K^e; oNSUj'3 r J.DWD)-RVԷE#J;Y,`Զ]Ȟ+ џ?< ө3#[]x)p7)isw<90No/n5÷ ;SNdlU}|;;T WwI(P_4 }.– ٕnPCcĊw#nJ R}7t&vw`2d,[]. W0՚̒(;8{Gܴxu8[}y\?.#RS"w=G ߝsoQyuZs&U#IAQ5c^ʜ'O=,m$Dt Qlz 9G1ے+v_;JĖ^!"n3-';+sܑsմU:ѽoM󖵋E]3˺0X* ؋|!h~G"?*Daı8-)kPYk[a&GӔсg[䐘-M )i_}`#mͽWNu"^k2ewrG1H)$/0T2`33]%,1`Y2bcxfǡ@BM%#kMi)G q1c _kn<,ٯ.si_ΟD)2}%<-Ĕ8'~F?7a3LMvI;Od ӜtO嘚V/h C cBk/eaC%:f̲L t4yOg(W7ϪftK/(/b(ߥ4lǖRr͂'JGz#5X\B2=D_JˏVnTKItSugA9@Z=~E3d8aT2wwzhշrV*) ["2h<n?9ވEZ I*/vdi"Q \%-Tc4?`=n5vBF GDIB| QhQЬl<9) _e/B`t=J矣AU0Ya$r{T/j 0x;&av?*"b\WU~fk*ӣw5-a ggPjFnBLQ, D^M[8zV$'tuf5,s=& xtRl[+\{[ =h>rOM,H7pUE)^1EUG\S]A^12wC TQ 5TⰣx_`2? ^{p3(QkC&E@}4J}SrK jϭo!o%LSLO8EmɂKpY88 4s3s7d%(rvg0l7Ljڈ' zV68iRߋpOV:%ý7 I9!| aVlFk M]?iEWbsWpPp;ڕ(%?u4I20Lނ2GN 8"{S {Wޙwԁ_'F閦=a9/mFcx|b*+j[V 4G-K#g[%Վ {pG@3OC(W~QB01 j4ک6\ڂN([EMbݲ\N7gRw䲫s X }gC V E(q$9~Ph4;lvPYX;&6'H_AqV`cJi;6@1ѷ~P78Le-uqzx*S~Hxs`x8HPfa5EF9쳑XMfת:/qF݄GJ 5ԻR4CSti^%ړ:ƆVHfp~\J{hCJdPLjR|ʕ޲ĞQY&(~-Q_*‹ |驈 1xrfr)4GrBǐ/ eK .RU&H~n) @i㹮m@d76 :}n:>OZ\eYԜlTOus:$V🔂Յ'+:_16[D`d8]!dtdS~n-u<ր6+ uRTFTOdmʡhuX<]_nh_y2dd;evبI3l&P"wy$V|S?euvܻۍ;fLim'*7׿>ډ ΰ0"YnCzϧ$6πgnkU o frMQt8$_ʁe3 R.V7^ ٔg*3uj~g9M+{GIQ^.WbD. OKTQW3)5$[ڡX\.ȥ/ñF)"59l9ޗ/vVf 4fcAYvsl=~Ql#D E^R>gLΫldB+|;%AxdIA{:-5觬G>c5@0j:^.i `o  a*INafC$~4B勼w>wgaa}iK:{ONtrt2z6̡`;Ձx!/OO/mtJT(@|dзKyh{xXM\/4WyB]cw)[?;ߔ7)u&]qnJܰ a4M$z5*EHMrRk1 )Y觓0xS b']Ec\UWU!rZ >`UB32!(VC|u/o`W9O'V'aeZJZ+=tHJ S^DEH 8nFڠi-_@&;%C 1lkc BWҗ>LÇb>9Iů)|FDs<2QlƼ&,; 46+~>_2R8>t02@M<<4DptH٧{!p2 +*Har`z-K ⿖b0*ܸ fLEL[CDqjK8Bf:áI_3t/5w0Ûf<0Tke} [[vj8qrq4>{/^оѭ,(5̍jRTƧc>gVUzj!"5N;A`/AB"\ T,p_u0%)bfZ$qKof3j^&-,O.Tu?_B 2-](4ۻ~o_I7'ɠ YӨ`& vJ>Lnx$xli)4ʐ96 L3+$q r#@ǣhCrNd?2vIj۩{w1jMPK=#;o /8'*{vr"V,?>JF\eNά"w!cRteGSieyiy*z]U~oZufSX;6NAWR_mB6'YX}j{IBVc!3-[2=DgЊQ& _jɤ&YXS2} iߕe!fN4䪻ZЦŔ#?5蚎-Ze\wf Xa Fo P9Ưy?6hb+OIqu ֨PT娎:,s&Zܦ=[!2 6*+F$RMc w.H.  x,ܑ oĂk/WP*`OS@C˳ M ֲл22vv'b Liq~f <(`"'7ז5˕\ܻoB(CmvO0'-TA>-ƶ$)5u&D$AB-{ט<ȥDZbx03H̬hFBVL4̏SBǚ34y i~3tDޝg]j(R b٩4Fa0iw t:ARѭnKcS 9@i"HUHfHVA"ύ>]ك\37:2F`ӱBY[@/\;=73':Z~;h1FYj~j~ET*'V%Ưx'jo6k KuǺY_y:-\zIԲ|AUA4^ `oIkk:cZ㘘Sɹ-KrTL|=NeO%{KJϲ\Qb$E1,?#߾!bev!Ngj-E`([-K~qƤW 9|_I~[b R3JX}j#YKv_BTz/ďu,3[/}*|9-Iy mƴ8: ¢K u W^gJũ9 +XKCJ<[ V@.JLJY_Ф C&0nq^E*( esO~QMMLa"Y~P!Q R˰8Ix6#8FگC3VX^2ȸC=$p{0vb2."mH^S'H]@x\jEytō)?2L=u 3F7n@x2] s}N$$Necچ9h|s&NQd;B9 dƶ M/_%֟3\ D5VG.|1A Elm8C&HW..0-GVz}؅O*yK]1YEGع:ׄ.庝.,2P@ %TtE $S*#ӠTakDf;i"8?V~31CߒKL|GM|{$#tTe33-̓4e>ǦH+2t^ #^^jpsɤI0} \0x/gp 'X53&g: nR ++Zg Cڬv+EXc!Ox"Lwu5o-?>9/.]![g [xO!^&ڂDbKiҿP͜+h\柹W Q'd1Vb1R:RRa<@61w۬&aBи"}C s _읬3C_LɄ} uVSqѼt@(9 mbe-4ߵ #Ӏ nL+XW)g{mwr24 FnՎR\jZX_YsbA1h* ͛1C^'&CRvz'!f66>VbٿW DM[/JDcӰӘ hv:GFBsz" Tqž!pE~^uee񴒯Q_+ H=h^z)DdKsjtOdb}((,Bkj>ّ9þOU%,~=D[X 㙅džx63Wfٍm)gq\]S 5) 8W^|3\+T=E*-iU&Yq9W?%vf2RXɢ=C0M/8d&~Y|⌁"4Z-WӿGG螢ҊQZ43.}yg7 2yXuܒX{j NU:u|NYݷM3>4 ̶ R08?+JDGJ^0Iliߕ})ffC'R:y\ ʥi񬭡GJ@ :o0k ,m"\a[γP- R0(#4Z83HolY67'/)o[̄lM[>Ebg'@TBR[cˍ?o:Pv9b/\7ẹawo 6@5O[ \t۷{Gf]g0[G(TKՓ1|[N:ƴDprVW&Tڭ!s:v o#(!JZ *xxBa)Ι2$wg~GW ߅QWIs $cc* TSr;q0 ~ZU9^x-qڠHNFb8P.e(03%z߰$O]&+BQy Dʁah`w7ô/ɺ^qR E1~,ZX ^_8V?΄`&ǐrjcQN2$|,|x_:rBMPrnh+DZ- (w&^4H14l/eDdVP/a &4&#_1>JqY .z xwlgE)}Nx#zx_錒b&3]0 f]Y&1qWý nNH9TmɿE߾m&X{ʢS=[Д ,}aktjHiVpΚ?~rCbC6x Qۚ:PW%l1]pW߸B2Mwi9Z(&TOVnXI}cґ=Nep=uّ JHn#%، /0 ?Vw&)glo2INx@![Jiw݅68yxfk Wm6 -J}]kbҶEI2^;QcVatP)Rt@trV; V /o\}(:I#0nn\?:uoʶK]+\|?$2c/M2,Iѥ{`Dh} sO3~Zc#wzzHɈc0 EՌWƄ"G/e&KU"ǕeflJ\! &# `hdmfnR@5ܫ5*c%v7:| 9B٦d 6 n"c")66\eDQ?.ʺ erU[15sb@@ [,>uO0 >7%b:E*ǩ[P߈쨨^nXBus˻ܦ 7ɻyF趌g_WJ_읕T$ir۾1qw ږϵk,{{Xmj"M1X%y AAփO궮nbq_Sˀ׺{s)9@TxMdU/cQ=gZ@GtZhۑb1-h䤈zD(I兡jCJ_kGWz<4 XDuӪ7Ŧu5 ^z Yv.6g$%'&=K4C68.~_ӕ{YվiX 6D9tGiRj[{A~烱)g MVhaHȇ *}:i^b@jU,!'ôN`5>Cf2 |1[Qm)xۥR^VOcCޟb5X=d]:pʼnJn{AV2UC3b?$gp(C1 EufC _u?Jtz3$U0Q}ں ѭJ(a2̛nKZQ^;@QisIОWx1;r0V^FO95{ D aRiL'8xmaUQ4䏗9CY*Ni0i]7O&ubo&Umv>5mʾWH\m _Hb{wVrx/ v|PJ7͵q7+/XZ=IzLdkqbȻv%aDgF]eXdlѠ`ԌAB_͓1ʰ>^d=wXΩOThn]y{K l}BK[5=ͰV#@ȽI S$TVx/]<j g2(S\!3#?h{e@/t lG6:ZЗR{~+ Rs1A"!tĪFgU¾%| w : Eǎf, M6IN#O?7t48yw@.:^L gFKK^ԘtR>kAý]ːb2ԔJMo Wf;`j Psd8xO[U{9ܮҿcُgB+;(9lUC9?<x;bT*OlcZrl4`~Ӕ+cRVAGGuͺᆵ~y2ڧaǪ)Lht&gexO&Cx#hoPZL)Ӫ9>+^ŗ\ܚ$_~oͅ) `OZ Z moP"w`nS,GfE['[FZ4^uUhܟ7ʃ;&Z9AȊFx|ׁb}oGRd7]TzprD JZ;3'ם`%‘MKj_WȥuL=M+f&/5I 0Ná<2ФOJ %[G䶟V6#>|يH2zR^w P:k!3k zrGKBPzn҈磚p$xatiEj2E~N%XUqūp0YIώ7mVjJx<79@"vOc:؆6"\zPR"ݴEx4z}qNօMCS >G%BCDiӤlfA:cfϪݎf0u>(&v`/&2A?\ԑy@.YCz;yfw_ }=kM{F!CΧ(coN1KRnZƋ}<;pqa,n"&rYS(_y"S&(O=AYwXPĬmu,1l(ޙWE$rɤܖ ~gؕ$Ϥ?4ENh C{p*̻o_Ф=LލWv:B&N%gn ;:N;xZ[[U _(opA`ӯhd=gA !E,K4% Hkȕy4-#;:|sc"sk _~GŪE ܯ22ra>$(sj#/vIˋZzR>-_;A(lP1G 1ػuS 5aeXV)Zlwr8|YY/<:0`={Ep -%&Ҹ+ ^7cs4F«^;5^շE]s КIs) b.ab"C0ae!f_!zfe++i ki#@6|5 )ԪRc Pc{@vS_ZdJ˓/M7N&]ȕҁUכzyʬVo z}K$'G8Hw"b5H۫.w kYt`C>iFqr)v\nM3lO}v5KrDޭˈ/(YMM5BAH(b86[@\nȊVyϨaُW>kPk~W1&-rHhϻaP6EqT@e}d89L1(T'ݢE`\@]H jtme˖ѰDB޴LX)g~,\T3+!j=`͊ƽNЊ/m{PR grK5uь2[X-bS/ o!1Z06+DbFQjGv-'CTާ[sRи sȑ.gG{jz|kNmەg-ZY[ Vkw>a]*6BpW1:ʰ]aJDA8';V( A޲`;K.u g(@](GԌE#qPSst4ۆ,iRI&h`b~Ɛu=_9xLScwAYsRr+u( <ɪBa<{d' V˰I&[; ;(V؉g'c.8HkdٰT]V>7| Eae*^"Z}W* /R]{wcoUC^# G()d!TuQnª(AܴT)XKЮuOؕp91=%@/jt\1Yo8yr]cH%74z6`ᰖ=N;PɘhCO%$e|)SF!BOFLw3M4@7LJc(J+l@xas-3ՀJ%|,+R"큑-nĸTbXa  U`|1-JKV2%њű fFw91^\SO ds~RjzuW1GR>ot\Hߕe+z 1T{!/c9;c-ŗTÍtxq;~4D̜p jdKgE^neoUlr:O |k ң(ȣVvD_b9BST uk-G! YWEK:XiC QAqo\[ef,zzlX UJQIJp95In̐ԯ7ӧ1MI Ֆ ǮcRHXf`ڼ%ڋb{"IP!ONZ $t&!Tg[u\M#@:1o{"~,*x|HS5+z=A5hH-u%YDlR"$6IfyIڼU`;Lv*OG馑EexyQf'e/2tJ9PճjiX)+vz})ϔh"ps~+ыAͥXq5[gYċ4WG-d1248 Vj&LP/  YgV5N9hdgBX,-k|BYh*Eu_ YMTPtlVDrC,:,@& P⃕h AR|@[HL! :FUH_\ʓ86x20B pH<@UgSOξQXrmIn(}Z!1g0ŧӵM.=G!F%HJ&ɘZ=~X'w[TR'0av)'ָ#|jxj_ԍ+14.(٩<lmx##F\e@N!8mE'R-&?û-r}#~Ū9 *VYjI9!j\!oh}PjEk}"ЩΨwp_ϾK9*>%IɏTK j PpE 7ŁN-@C<]<9Ŭ5"&璦k=|6ELwIh;x⤸Qed4?cɎih'l[׫I9_2quz!8Zge8fzCKXUqySt_Ct=_,a&/۞0wE7mO N ]_d&pF꾞#)y 0 PhBEG"DX׽Y# pJa-2O+KC&Լc ?@+@*)g~EjK ?>c§s=@oj]EMvMk㻊DaH<)ѕ\xzWgᖖ~PY~͐ELzA?'ޓH.J fy TFZYi۠u96x򔜴XD8L(_MVr4 N-0 -f ,u!_D\)$F=eŸXґKʠVB T/?>kX_6ӏ4+ ViZ$M*/-Z@jh|4)JNk,س]g#/Rnw VqIAJsPę%kg I=2403ܤ .7),ԏ;I0PwK ƥWFϢOdu}Y5 V@?^)I~U ϕƧfQ.%r̅vs,4݇A&1 ^2=5%vzN֊ޤ{Ǘ9۩@G0YpT<)Y+R<9k!rRBGS_#T- +n/Gۥ~5py]ہ$zb.CKYL~tH*})&"}r3qLFN1W&п{޵QPxjycf&9[Vr, (x4bcbH33eHh} iWx4C-iI#jT} TWMזs(;M99En4sk)st"\HNbR{T~;!dZFOϣa]V 1auڇS,MC*g85Cet4^U}Z85^C{RfbI}k}&e\1n6Inj2(0"IbԐ)n3$4 %'Ա@]]ˁzM=($0 I =jbAZwa`9 i~,|~bЈ={K#`N;3{~s\wð/`dPIƃ|%X yWAIFCAZKx_n"]ghY6:c֌b}D 8PG 5" ,zE/HnEn'laDdTnF)T Ӄ[!!I%D-cS4WBf۳ϡ}ida^k^;@FWt"h оJ#a,q=vzf*XfҞ>Eo .J & ̇#Β[}QW27io(V[OGl)j]qbҳʦsܸ%&ZNi>K[+!b˗ZVoq!y2Rl1N2^#U*gM HӼlgdַI4w /䂤hTZ)q#WR۳8TC֯H]dv/5 Es?_y,X}An/4d^A':U07KGgMHOSYTan{ď+u}v u\aJmrb9 q4H#٣D 2(.zA^l1{>8*7m){7)9RL(p]WQ"q?QUE׋ԾO ZX)L$y8 sڹ ;ч}eCVU +S .."{]KBDcuo&8g6$H)5x,K\}4`'mhw!-S LrV8&,5W'P9} "p!ȌofUܹܿ?^/aB9R:rYbխV,G~ <(i;ڞRAwC }v?y"_3<r .BZjzq#OW.yZ C" JtC!l~/ms! z|Sm%CG@@]FNtl@;Jk^wVip!ehn$FoKvƂ "K*Adt2MtP0B d(ZmT@$g64#6@o&NvGZ#)%ߊs>9BPahyW3)e6!H|^7 Ε\Pz%/xD 菀+T5u6 %6 W|`oRC@bY x hȜ1b%Ixk#e2ߌM[Ͷ`/LA?pU-.zYw!D A8_>+JP;%/ (v|DZyΎ5Vέ, .ݖ8Ƌ|]ëgN1x+)!|ާXMc^ڊGgjuh  %ׂcKgv8,8 .z(d[1f}xY6^zGEp~ I[fn2#H?Zdo,uǏ0mF؉r|&WeET.)nWl5MB96tl橪qe漏-#mxApmi oC+ ymF`}%)3k+g1~ +wԻr*{!MT5Db {3u!$En$D<[ApYl7%aY?K)bW. =-ͺIo P( 5}Əg6_֣]^ubl-hQ!!t:jߖJsF(PŮ%lcBGM,U4]buթOe҆[G\{72BOUx8L4!"J;ȅ(O)SiL .4IFu@̒xe =e$+,\C9qӶx&[M.Zu /^`b?Ѳku0WB+ƍyWA Ѳ ɢfEXVѾY{1jT& rrF Ɔ]'BAm'|y~V‶DObz 2(ܥjm־In0{uG*)pb(FhDQ zDUl2b:+*O}H/氋:j!ZTvߖC&_ knИ}M2r5_,n2Vj#!q_ꇏ;dAx=jXcpvNv@`1JcZUD=!g>o>ҫ 3?/KuBRAa:  Ɛ[m*JxK' T)@1\wm,͜u<2x=`̸M9b־@ X&b7XUUAuё 6bˢ𛚺 :lrէUr׆r$ *YLqcw:ēE1?`GRPDauLG؎gzBc"D@sWK^y -"¿TaZG22؃X "*+aElqGr;ecut@K563i`EW<@ #Df멝LڦG|K>POV)^"FU 4nHiy,UZɄxv߮xth!;qwXsϷ)/G0ZK09bUda > b_O_#eRR9MdK UoHw:=@iM" w=q{Kc=,i}B\`5 .yL zT. 7V\-PKzvt pܣQާ5i l6woaYӆ02g)2eۗn8F{]#"zUsjz@yŒ+III*Rxz 3+YvFFdGخV }90Rgi"dt}a GwW{l^S [cW'Y,Ba;t)GJJ*AOÈF鰀 V$k#C1/E!0pjAsCy~9u2̬붦yw[͕w xVm\j76Yeq*YжxVģPb}L {>q@ tKv*^Tn6S) Y>^E.yd} PH,X7w+B=f6E#}l)FҁtBrĻN-s QGj3b(1mnC$:#L V(e60 Z+5'@0?n5EDB{"V* b9 5KGCỼH8ePoeT N=a@M.Q 8;M<Ŗ_0w:r>5SHu@42XT6' s$JItHܥvӤ_լG荫 YyuZ d.Chc_p 讇^S4!6=RIc{$~;dy.5ZI `尻v3W %׽/yEX{ch9}k>4DiWӄAw{bSqCmI-Ѕ0}}Mt喬SPy9WBmMH[Ə6CaSN'L䫱YtZ9GmD]K\Tiqc52bOI{Q-q4d|`9PT{$VWR1[=լ&P>!xWz gY)j֥;,:FY+J!kֈ0K5;Mw-ȕ82hf"C82~'ʅ8o+ ߏ 0Q@o3`:"?X#O  Lɡi"I҂(@CQ̪D*g|\dwK%[P8K%qeisuM9.0EO@ʓ$ҁµ|RK^ωmUR= j|{(z65lͤ]y nC!{c?aL̊eO}NU%=m Mt7­<'4p:f%ԕY9Za}B(}x㞉l@-$ٹؐP"0@5Zػ6` E[ȣ_)e sJo)ޭ1|gګ^LX>7Oʂ"N/_P8hmܑP8"3Oq+*z/m($UL_RWϒr% vWzx8=űsF0HQPb/WSBg=ķ Ѿab5pc2m 7f*\~BDjb?oRQihPd! Tk8HMŷwo<ƀ\؀yc/)<|4ĤOT`"9:v 6 /~|.T(Y/[ RZg/$J[̵2nQsZBdZjW251F+b_& X gY&OЧ@[;^4o_:_\H|29`H[Y>?[ܤ;陌#^)Åxg٘1h {a@iGD钾|nK_ft:Ok5.c:9dt`vvu7fh /C`NN0Ydz{,Dmܙ sl 3^u6SD=^L/gZusMU x߷4%&0"eҕ%:QO"[=akHį.bE*HŘ34'I]=^>vfugSi^ rF[lhC8}D%SdJwBSxa'l_h#ꋕDQc4wgDOs4F6ݷlfL MIȅ =xy`Wx l2o)/rlR1cVCĦRo !g}w?ZP|2J;RLG3?B:|ѯ$‘`6XYo.L&`RGl|njFH"&?>cKKbH0@c.izX\A:-ٻ^ؒ@@"%l c$zjI@l_$IxECz*-Ro(-Z+7ۮ}63°|m *}6N)usOT$H^Q3g su[pRf?.-B^[+ E1J T#cuS sJ龻B;eNhZ .iYbЇ{? Kb{N^q7 _eP=,87Q2'ބjN }-E\VW*XJl`xCNbY:eݴ9yN2W )E EYtnekߥHwv8D4)Csni!}99S%aÝ"fV<]ʖe7&m]*@i3y$8Tݘ3~ĚĂo' ( ^n\g-F$ͮmKb:(ϴdȇVm:S1x 2 [4_PKܿщ;"}Kh ±2 zYv yt!N7-h9{nϲK= ),hje KRߍiWMY+|W鲦yJ՗ڃvT2g[+Ab+IYVUw ͘gl'=ԗMΚQH}D^IzC䫋:B"w-;I_/r$,n"9ǭ\]CUZN|댒5><}xEz#I V6ت0pQF?s >iKCI;e;@jª3T.K9 G;˾̚ 8-!Q^aO0!bRiW, nP|RE@ɯhhAt1}}MnϥfHv3,4FU삵9G8['c$VF ^Kw ; Pyh x$qw a/*Ķ2Zl@(6nMPLy)qUHx! { 0AXUqf}+v<Fz"l3dkv)ɘm =a8P /68=64J?&K"[o[Q|M 1ٸEGpaF}T$!Zuղ-"SVB)N%!7 <>[i2ngьӡd?osBn/u`ipmCY.4%$+=!~_!X<ȣ-23o`F/-/V05#֍SrcmEf=m " ,wo1+[!G_. M?30BOeC}PҜ'dذїB%I(`Ί /٪DKƌф0ڎb_O kTiȣ[*îo?z(倯 _,:5o߰H#M~2s{=Zoaw4-de UvzY&?5D8D6Rsﵝ>lBB&*ZIŒ5LD7ԫcqzU $ISp^WGJ8&"oa _;.ԔnlD!/|ԐDkvg?ܨB473d& _Km'\m)u* Xstwp6<)f'맗78w&EJ!kwZ#J'3oLJUU%fO/pbѰ;i0_ IY.Gf#3}D. 5y7`RF36`ěL`X oH= P vE20b2Xy) 띫yW:7mvnNC Lu :'Ɲk|~%VmmO?v!^Vmut? ,..)(.i~u9FgCC:XޡJIw^^β0aGv UmԳa J{GEKn@2h yAύ\#c |W]Չ+ EǺďdHnJ^?<]AwAC}y‹踄3tEbr¤x\@Z_*94KRctWR(^֟FasjnWTbg~5M/ha(O-CJ-HcF37dH`*3EcFJ%*vOվ:wW}' ?:+OSǤZ&(7eueM|:$BW#7%OȽ%,tdLAr23ⷘ,} 8 6u_nR32Zkƭ=~f%Fxi$LH5؇&yt 򅧯OF"Uzdp;9׏M ^cNyn*$H"X'eo5^YnE|KXCB,WP/om k5gSTa8/u.N9xGcs1ce ,;Y6$omh/Jh_ ^$ lyGuiYわps (vƫs65>~d<̆V J?Vy>!V00_~|ӄב Y6=ںGb*IO,l5P04H8ajHm?3Y-Q=9VTw|@:9d\Q|//K q,G (j.7ux#E7(=*nYR=ZGhPsP$g„6KrݐpVx)3o2~BX g@ppvESd=B ~SoY4:@R`w _sWc>b8,Rm"b4T ֞95_'%m,i[zg/EzFv{h^ȏ ułzad9;QŽ%\eF{%F{CL),Sq4Ӿƹ8Am@gڼ Tohߏe.+#%ˉɴqh!f,z|f]8%\DK 2iP$ } ^G/vcwf!D P;v| A>EjewcIU] $_I(xY\TϣsR@r|;^ϛCT}- xN*IYS'cx. rr0P" ɵ:~1.ZI PW;<#VV 1x;+u=ȣňJ*璋?Gb{NgB!@))S۲%2qr><'A[fqMp„iRLy@H~ }4}e:9zB"b^ (M໫ -1E+`%B+:\,qm`i,K90Q~5N5dl)^<0IhơN".(rD]MqlfU{M:L2@ i u䥖슞Q 9diޤMTR"mӢbX\(eՀ]o]G 3lAx@ * /v;!D`OxHg6Nn8g{d^rpI\щ/ wdܠwBaђC5Wf¶fE& ̓ `O=%GD},ӃZcY*#;:e~L]*k$ƌƽ@)(n6䀸u*:/Xڢ|ӄoY&fS|ئjsT"q!%yE=_6ӿ`mۍ1FLux2-[ԽU+6ڻߐed/m5:k,Y6=h*!!κ6,Vxhsitpj\s!}9NB 3nv%S% {I+a__B^QoۂMecGrpIʄeŽ?gU bԸ@BP{'=fJtEآ!o¯/g#Mb6,{$9ASENE9ɓ |&+3ExB,x8M' kh_z\\dgX VB'kE.]+DD$;䙛8owt\/m(mK V=? 1v83]25 "&s(m6_)-h y6,Зסz׸*OHr)IgC{4$<$;q\T,-L"Ty*UXtf@ረ_F O)'|:Ɠ϶sӊPĄ /KZal7Y2C6uZqOpDI26P^*1 U}s<س'Do %ᙘsU"6:\KTA J})ȴLl>Ɩ-ƈZH{DĻ|?TBJG+:*¹$ʅO|5ކB[QA '?G@\0 )êOS\LLZXoY1}[$ SK2Gh+ 7]86lߺOE,{\[bzY|oqV@DplDڛѮ!ev/Ut쯹Jz[/BP0%Dݏ ;'Qfd-e=~H*Ml,'b ߗmVB,mSpIW^] E,dE+ 븄M+ 'rv |%#ȲR&$oҷ",U|ХYU9*`jgo嘿d0m ;Y, ܻ̀ns%T 鹓ɦ)$*vNNYqTdۺV1XBf|DB{ހ^xȅөG4ڂ,0''k*>|Oqx" %IyJvJbYCt-s!k4$jzd͉(`Lt7K3ySaf܀ڌّ-R:MpOIFJd٤=|yFJ-˹ Ƒ'3\DTUrn=y8h^!ƭrRaEJ X$vwg _>aALU%*LՁ.O#tD'#U߂"'z'acz=!bԐpUlf P9]:mmQI+ f+^G2xr p>o >$}TQTZ]₄C BBPr*A L&Ԃ"^`=Dbwkzeip s ,Ke~ $%TJRcdNѦ%$K%~JNR7< rG(b*Q9M?2bZ L֘겑w^фҧ,Țo*ƁhauS'.WP8M藹PUQE>s: {v y,|DWhiM&YONC''}ƻ':^F,/딠σ䯻޹ƽ54{+SYXFھ! <ͯu";Ɠ@FC zY*tぎtSDn?a),ɂO.gܪFyF1яsBkޑ굅+EBk->wpoen:Www5Omxz[n^ԳM@V ңHXBȶ y #,?SHy\%}]6}5NpDGFh 8t+ ZγRHG NlԈ#9?E5+fPk=WUUd .ҁQCvKBXN MʶN'})juս$rb:\ ͥa%XBiM5o[gVd5 `$tcW2+c?(MqBF;'a}B}O˂bC* $ۇn '|55083X3SPaE(t=nHwZQ¶J李ȹ+"eBl=gT®dOu)Pr`%>?2m"öQbu^B&S/sP`Cy⣶jfr"(.,KW15%!#Ĝnx^2$2kw_ٞ|wm`}K+J 8? Lj9 ]:#ɻxZoE-'}b}'PWHQo]]pD%UD ~tq?.P_$aIʯǦβ(*,J܈^uʬtv$V Bi(aEu@e4.RQsYyO  JN\;bCސP3QmD$TMo= l<{!A/4Ks` DžjCVJ:Ѳބ" g 0/<SNJu$OK ffn.U2 `;NH Vv;˓?19&Փ >篖ԩ9QO釒pܐ*xv ex:[梄Ux,rBGY0{։v3;R)$]1.,bApͫ H+I6:<+8g6w\S%x䵐S:.tAg C=܋-{+u8 7 H+^}"x|9X}𞏣y;)3NI芶W ~eb_tѶ˃rqjgRzOH8:bR \m@}ӄiMQы/Қw?'d)rSG;U P^C&cqТ8Oƻ 3D[’Mj=pX:yQ Z΂^\@[nAdY"mAyY^9j̼bCLg{om6d8Ta 670B0ṧۗ{U9YfYI^ \FR뛲;,Hކ:]obRbSdgqt9a$ՅfztD>wH҄.14,"s22s[]'Լ1'8IR@:1x;\έ# a=-wy1ǞJaWHE%N|N[[.=C&?1]Gk.VWQ=#TSӯ" ۽y{v O7h9˨?|>V٧SJo7O*h_WYQg^>o=ðCĈ!Bt[I~N\"0Kb>RY ` *a/;$GiIzߒv$UT@̬~ùH'7LH0f^;K~Ax9Zh-Ȼぎm/}FSmh+Y~i&x{Ea N? EP01AW|5oPJDֲxoBJP-|ָ]눞:x%bbqbSI>(wZ4s/~XVO9xD "NDtRLv:k"C%s(x>a"LϦCW.'1rӨd-4?f3xH[C@U6ulTidPJ-bH+~ysAh?x-X#7c(]34JWAzZۈ }ŨKeX'| ]egKq-fE~&,1;)ئ?&@@<3)0^s*(!XTSWDg~Wx)7v?uN#ʑ~?a"24/]sA*:ɻ? ^G7XR+@4ވ5Atr㪟I`>LR S*55BblD FA*ֆ@G~SDakҠICGTW$Dis3-*! $x^N0"þHʭs:&MCؑp#%mC2i ޷MxH]G4eZ(u0>28m\~lIsVY^*R:ƒg8/V׎C] \@6Ӊg4s#qX=}n|#[Pw %'2-2*U5/`=Bu(&\iLҍx '9 a^)d1WQ]-fϫNE oW4ؖzA|Buqm| %x/Lä#j༆ .a8WԖ)TئϼK xJ)p3#YiQN8SX'v2Vm{0_oON}҈xGRj2N#E'C.Mχ^EfB~~TOO,^ +4_Oz|O|bbJg_]0,+]E?=yX,){OzA&\BIQׁ}FF=CKPlDA-LϾL+AK Tq(uL`;U*B<`yJV1[bȑj]\*Ό%ۜIL6I-i'ӡ /$tP & )vx'CĐv^=uPX|DDdeۿ7p!fR630*`5`Lf&K,8u[ΧawWN;Ŵ ԛ !_-s*9 :D%\0Pn2w0: $@?3jƌMU<: ]ސi.k¦hXM"ב9&CNWa'\(EV=: @!E%IU)mlپ:\ZMu ZjpIt*ɑIbK_լ腰g/'%oA=WG?"s6K׿P@&S|Dڒz'nɆY,WxIp%mB jAT,:s PϷ7!%*y'Hcw^8: {\s|+b 7<4s);KeVاB q- okr% z⁅` >ߣZYT >D(1 d|kVf`n_c;ϽOxxm@[WiE1:a>.lE"?K{sX*sm B*%hz^\U"Ya؂q\R.ͨ,.>풥 N;3x >Sq4|r5lL{=O ~je#e"\Ձ͢@*,9s$48`O\1A St% F"))B~F^6{ȣ7(Y-Wq"yc9EEKe#; 0~]J\!Hbskx y&h$A5w^4A[~[ lYJORgb!QB^FbɾߋhS fX4R4iKYs-Zcvx@ГKg5>9rY\8!yIiލT`ĄiZD<%#c= .ς}&zը|D?|҆K=c͒[ &ob8Cݞʎ@A]->;%P#?*oA`?*#^N1\=XDA)ۂ;3e0id%!$̫qJ9*d'fu"{*C-joQ(D.K@_0xw]h]F .B?2‘}BXYH#:TWH1!qGw|-1i[ObLF(˃?yA4ӯ&i?`ai2hiA@bѦF2i4d22Ѝh b1MM =Mѡ Ɉd 1 ##")OH4@hG6C2h yJD`dK/0fއ TivK;*'qX|MO d-wKN4|eʱ&y1͸:gC)krb}ы&0|OXEV@1b`0,fu-8ŽޣId㏦7Keejyбx{Q`|(iՌA9+Nq"|d ^/rOj_cF0 Xwm̈Aq$.p! Ebayesplot/R/example-data.R0000644000176200001440000000633114335264324015153 0ustar liggesusers#' Example draws to use in demonstrations and tests #' #' These functions return various objects containing data used in the examples #' throughout the **bayesplot** package documentation. #' #' @name example-data #' @keywords internal #' #' @return See **Details**. #' #' @details #' Each of these functions returns an object containing data, parameter draws, or #' predictions corresponding to a basic linear regression model with data #' `y` (outcome vector) and `X` (predictor matrix), and parameters #' `alpha` (intercept), `beta` (coefficient vector), and `sigma` #' (error sd). #' #' \describe{ #' \item{`example_mcmc_draws()`}{ #' If `chains > 1`, a `250` (iterations) by `chains` by #' `params` array or, if `chains = 1`, a `250` by `params` #' matrix of MCMC draws from the posterior distribution of the parameters in #' the linear regression model described above. If `params = 1` then only #' the draws for `alpha` are included in the returned object. If #' `params >= 2` then draws for `sigma` are also included. And if #' `params` is between `3` and the maximum of `6` then draws #' for regression coefficients `beta[k]` (`k` in `1:(params-2)`) #' are also included. #' } #' \item{`example_y_data()`}{ #' A numeric vector with `434` observations of the outcome variable in the #' linear regression model. #' } #' \item{`example_x_data()`}{ #' A numeric vector with `434` observations of one of the predictor #' variables in the linear regression model. #' } #' \item{`example_group_data()`}{ #' A factor variable with `434` observations of a grouping variable with #' two levels. #' } #' \item{`example_yrep_draws()`}{ #' A `500` (draws) by `434` (data points) matrix of draws from the #' posterior predictive distribution. Each row represents a full dataset drawn #' from the posterior predictive distribution of the outcome `y` after #' fitting the linear regression model mentioned above. #' } #' } #' #' NULL #' @rdname example-data #' @export #' @param chains An integer between 1 and 4 indicating the desired number of #' chains. #' @param params An integer between 1 and 6 indicating the desired number of #' parameters. #' #' @examples #' draws <- example_mcmc_draws() #' dim(draws) #' dimnames(draws) #' #' draws <- example_mcmc_draws(1, 2) #' dim(draws) #' colnames(draws) #' #' draws <- example_mcmc_draws(params = 6) #' dimnames(draws)[[3]] #' example_mcmc_draws <- function(chains = 4, params = 4) { stopifnot( chains >= 1 && chains <= 4, params >= 1 && params <= 6 ) x <- .ex_draws[, seq_len(chains), ] if (chains > 1) { x[, , seq_len(params), drop = FALSE] } else { x[, seq_len(params), drop = FALSE] } } #' @rdname example-data #' @export #' @examples #' y <- example_y_data() #' x <- example_x_data() #' group <- example_group_data() #' length(y) #' length(x) #' length(group) #' tail(data.frame(y, x, group), 5) #' #' yrep <- example_yrep_draws() #' dim(yrep) # ncol(yrep) = length(y) = length(x) = length(group) #' example_yrep_draws <- function() { .ex_yrep } #' @rdname example-data #' @export example_y_data <- function() { .ex_y } #' @rdname example-data #' @export example_x_data <- function() { .ex_x } #' @rdname example-data #' @export example_group_data <- function() { .ex_group } bayesplot/R/zzz.R0000644000176200001440000000123714335264324013446 0ustar liggesusers.onAttach <- function(...) { ver <- utils::packageVersion("bayesplot") packageStartupMessage("This is bayesplot version ", ver) packageStartupMessage("- Online documentation and vignettes at mc-stan.org/bayesplot") packageStartupMessage("- bayesplot theme set to bayesplot::theme_default()") packageStartupMessage(" * Does _not_ affect other ggplot2 plots") packageStartupMessage(" * See ?bayesplot_theme_set for details on theme setting") if (utils::packageVersion("ggplot2") < "3.4.0") { packageStartupMessage("\nbayesplot works best with ggplot2 version >= 3.4.0. ", "\nUse update.packages('ggplot2') to update.") } } bayesplot/R/ppc-loo.R0000644000176200001440000006046614556465326014205 0ustar liggesusers#' LOO predictive checks #' #' Leave-One-Out (LOO) predictive checks. See the **Plot Descriptions** section, #' below, and [Gabry et al. (2019)](https://github.com/jgabry/bayes-vis-paper#readme) #' for details. #' #' @name PPC-loo #' @family PPCs #' @template args-y-yrep #' @param ... Currently unused. #' @param lw A matrix of (smoothed) log weights with the same dimensions as #' `yrep`. See [loo::psis()] and the associated `weights()` method as well as #' the **Examples** section, below. If `lw` is not specified then #' `psis_object` can be provided and log weights will be extracted. #' @param psis_object If using **loo** version `2.0.0` or greater, an #' object returned by the `psis()` function (or by the `loo()` function #' with argument `save_psis` set to `TRUE`). #' @param alpha,size,fatten,linewidth Arguments passed to code geoms to control plot #' aesthetics. For `ppc_loo_pit_qq()` and `ppc_loo_pit_overlay()`, `size` and #' `alpha` are passed to [ggplot2::geom_point()] and #' [ggplot2::geom_density()], respectively. For `ppc_loo_intervals()`, `size` #' `linewidth` and `fatten` are passed to [ggplot2::geom_pointrange()]. For #' `ppc_loo_ribbon()`, `alpha` and `size` are passed to #' [ggplot2::geom_ribbon()]. #' #' @template return-ggplot #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_loo_pit_overlay()`, `ppc_loo_pit_qq()`}{ #' The calibration of marginal predictions can be assessed using probability #' integral transformation (PIT) checks. LOO improves the check by avoiding the #' double use of data. See the section on marginal predictive checks in Gelman #' et al. (2013, p. 152--153) and section 5 of Gabry et al. (2019) for an #' example of using **bayesplot** for these checks. #' #' The LOO PIT values are asymptotically uniform (for continuous data) if the #' model is calibrated. The `ppc_loo_pit_overlay()` function creates a plot #' comparing the density of the LOO PITs (thick line) to the density estimates #' of many simulated data sets from the standard uniform distribution (thin #' lines). See Gabry et al. (2019) for an example of interpreting the shape of #' the miscalibration that can be observed in these plots. #' #' The `ppc_loo_pit_qq()` function provides an alternative visualization of #' the miscalibration with a quantile-quantile (Q-Q) plot comparing the LOO #' PITs to the standard uniform distribution. Comparing to the uniform is not #' good for extreme probabilities close to 0 and 1, so it can sometimes be #' useful to set the `compare` argument to `"normal"`, which will #' produce a Q-Q plot comparing standard normal quantiles calculated from the #' PIT values to the theoretical standard normal quantiles. This can help see #' the (mis)calibration better for the extreme values. However, in most cases #' we have found that the overlaid density plot (`ppc_loo_pit_overlay()`) #' function will provide a clearer picture of calibration problems than the #' Q-Q plot. #' } #' \item{`ppc_loo_intervals()`, `ppc_loo_ribbon()`}{ #' Similar to [ppc_intervals()] and [ppc_ribbon()] but the intervals are for #' the LOO predictive distribution. #' } #' } #' #' @templateVar bdaRef (p. 152--153) #' @template reference-bda #' @template reference-vis-paper #' @template reference-loo #' #' @examples #' #' \dontrun{ #' library(rstanarm) #' library(loo) #' #' head(radon) #' fit <- stan_lmer( #' log_radon ~ floor + log_uranium + floor:log_uranium #' + (1 + floor | county), #' data = radon, #' iter = 100, #' chains = 2, #' cores = 2 #' ) #' y <- radon$log_radon #' yrep <- posterior_predict(fit) #' #' loo1 <- loo(fit, save_psis = TRUE, cores = 4) #' psis1 <- loo1$psis_object #' lw <- weights(psis1) # normalized log weights #' #' # marginal predictive check using LOO probability integral transform #' color_scheme_set("orange") #' ppc_loo_pit_overlay(y, yrep, lw = lw) #' #' ppc_loo_pit_qq(y, yrep, lw = lw) #' ppc_loo_pit_qq(y, yrep, lw = lw, compare = "normal") #' #' # can use the psis object instead of lw #' ppc_loo_pit_qq(y, yrep, psis_object = psis1) #' #' # loo predictive intervals vs observations #' keep_obs <- 1:50 #' ppc_loo_intervals(y, yrep, psis_object = psis1, subset = keep_obs) #' #' color_scheme_set("gray") #' ppc_loo_intervals(y, yrep, psis_object = psis1, subset = keep_obs, #' order = "median") #' } #' NULL #' @rdname PPC-loo #' @export #' @param pit For `ppc_loo_pit_overlay()` and `ppc_loo_pit_qq()`, optionally a #' vector of precomputed PIT values that can be specified instead of `y`, #' `yrep`, and `lw` (these are all ignored if `pit` is specified). If not #' specified the PIT values are computed internally before plotting. #' @param samples For `ppc_loo_pit_overlay()`, the number of data sets (each #' the same size as `y`) to simulate from the standard uniform #' distribution. The default is 100. The density estimate of each dataset is #' plotted as a thin line in the plot, with the density estimate of the LOO #' PITs overlaid as a thicker dark line. #' @param compare For `ppc_loo_pit_qq()`, a string that can be either #' `"uniform"` or `"normal"`. If `"uniform"` (the default) the Q-Q plot #' compares computed PIT values to the standard uniform distribution. If #' `compare="normal"`, the Q-Q plot compares standard normal quantiles #' calculated from the PIT values to the theoretical standard normal #' quantiles. #' @param trim Passed to [ggplot2::stat_density()]. #' @template args-density-controls #' @param boundary_correction For `ppc_loo_pit_overlay()`, when set to `TRUE` #' (the default) the function will compute boundary corrected density values #' via convolution and a Gaussian filter, also known as the reflection method #' (Boneva et al., 1971). As a result, parameters controlling the standard #' kernel density estimation such as `adjust`, `kernel` and `n_dens` are #' ignored. NOTE: The current implementation only works well for continuous #' observations. #' @param grid_len For `ppc_loo_pit_overlay()`, when `boundary_correction` is #' set to `TRUE` this parameter specifies the number of points used to #' generate the estimations. This is set to 512 by default. #' #' @references Boneva, L. I., Kendall, D., & Stefanov, I. (1971). Spline #' transformations: Three new diagnostic aids for the statistical #' data-analyst. *J. R. Stat. Soc. B* (Methodological), 33(1), 1-71. #' https://www.jstor.org/stable/2986005. #' ppc_loo_pit_overlay <- function(y, yrep, lw = NULL, ..., psis_object = NULL, pit = NULL, samples = 100, size = 0.25, alpha = 0.7, boundary_correction = TRUE, grid_len = 512, bw = "nrd0", trim = FALSE, adjust = 1, kernel = "gaussian", n_dens = 1024) { check_ignored_arguments(...) data <- ppc_loo_pit_data( y = y, yrep = yrep, lw = lw, psis_object = psis_object, pit = pit, samples = samples, bw = bw, boundary_correction = boundary_correction, grid_len = grid_len ) if (!missing(y) && all(y %in% 0:1)) { warning( "This plot is not recommended for binary data. ", "For plots that are more suitable see ", "\nhttps://avehtari.github.io/modelselection/diabetes.html#44_calibration_of_predictions", call. = FALSE ) } message(paste("NOTE: The kernel density estimate assumes continuous observations", "and is not optimal for discrete observations.")) if (boundary_correction) { p <- ggplot(data) + aes(x = .data$x, y = .data$value) + geom_line( aes(group = .data$rep_id, color = "yrep"), data = function(x) dplyr::filter(x, !.data$is_y), alpha = alpha, linewidth = size, na.rm = TRUE) + geom_line( aes(color = "y"), data = function(x) dplyr::filter(x, .data$is_y), linewidth = 1, lineend = "round", na.rm = TRUE) + scale_x_continuous( limits = c(0, 1), expand = expansion(0, 0.01), breaks = seq(0, 1, by = 0.25), labels = c("0", "0.25", "0.5", "0.75", "1") ) } else { p <- ggplot(data) + aes(x = .data$value) + stat_density( aes(group = .data$rep_id, color = "yrep"), data = function(x) dplyr::filter(x, !.data$is_y), geom = "line", position = "identity", linewidth = size, alpha = alpha, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n = n_dens, na.rm = TRUE) + stat_density( aes(color = "y"), data = function(x) dplyr::filter(x, .data$is_y), geom = "line", position = "identity", lineend = "round", linewidth = 1, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n = n_dens, na.rm = TRUE) + scale_x_continuous( limits = c(0.05, 0.95), expand = expansion(0, 0), breaks = seq(from = .1, to = .9, by = .2) ) } p + scale_color_ppc(labels = c("PIT", "Unif")) + scale_y_continuous( limits = c(0, NA), expand = expansion(mult = c(0, .25)) ) + bayesplot_theme_get() + yaxis_title(FALSE) + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) } #' @rdname PPC-loo #' @export ppc_loo_pit_data <- function(y, yrep, lw = NULL, ..., psis_object = NULL, pit = NULL, samples = 100, bw = "nrd0", boundary_correction = TRUE, grid_len = 512) { if (!is.null(pit)) { stopifnot(is.numeric(pit), is_vector_or_1Darray(pit)) inform("'pit' specified so ignoring 'y','yrep','lw' if specified.") } else { suggested_package("rstantools") y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) lw <- .get_lw(lw, psis_object) stopifnot(identical(dim(yrep), dim(lw))) pit <- rstantools::loo_pit(object = yrep, y = y, lw = lw) } if (!boundary_correction) { unifs <- matrix(runif(length(pit) * samples), nrow = samples) data <- ppc_data(pit, unifs) } else { unifs <- matrix(runif(grid_len * samples), nrow = samples) ref_list <- .ref_kde_correction(unifs, bw = bw, grid_len = grid_len) pit_list <- .kde_correction(pit, bw = bw, grid_len = grid_len) pit <- pit_list$bc_pvals unifs <- ref_list$unifs xs <- c(pit_list$xs, ref_list$xs) data <- ppc_data(pit, unifs) %>% dplyr::arrange(.data$rep_id) %>% mutate(x = xs) } data } #' @rdname PPC-loo #' @export ppc_loo_pit_qq <- function(y, yrep, lw = NULL, ..., psis_object = NULL, pit = NULL, compare = c("uniform", "normal"), size = 2, alpha = 1) { check_ignored_arguments(...) compare <- match.arg(compare) if (!is.null(pit)) { stopifnot(is.numeric(pit), is_vector_or_1Darray(pit)) inform("'pit' specified so ignoring 'y','yrep','lw' if specified.") } else { suggested_package("rstantools") y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) lw <- .get_lw(lw, psis_object) stopifnot(identical(dim(yrep), dim(lw))) pit <- rstantools::loo_pit(object = yrep, y = y, lw = lw) } if (compare == "uniform") { theoretical <- stats::qunif x_lab <- "Uniform" y_lab <- "LOO-PIT" } else { pit <- as.vector(stats::qnorm(pit)) theoretical <- stats::qnorm x_lab <- "Normal" y_lab <- "LOO-PIT (standard normal quantiles)" } qq <- ggplot(data.frame(p = pit)) + geom_qq( aes(sample = .data$p), distribution = theoretical, color = get_color("m"), size = size, alpha = alpha) + geom_abline( linetype = 2, color = "black") + bayesplot_theme_get() + labs(x = x_lab, y = y_lab) if (compare == "uniform") { qq + lims(x=c(0,1), y=c(0,1)) } else { qq } } #' @rdname PPC-loo #' @export ppc_loo_pit <- function(y, yrep, lw, pit = NULL, compare = c("uniform", "normal"), ..., size = 2, alpha = 1) { .Deprecated("ppc_loo_pit_qq or ppc_loo_pit_overlay") ppc_loo_pit_qq( y = y, yrep = yrep, lw = lw, pit = pit, compare = compare, size = size, alpha = alpha, ... ) } #' @rdname PPC-loo #' @export #' @template args-prob-prob_outer #' @param intervals For `ppc_loo_intervals()` and `ppc_loo_ribbon()`, optionally #' a matrix of pre-computed LOO predictive intervals that can be specified #' instead of `yrep` (ignored if `intervals` is specified). If not specified #' the intervals are computed internally before plotting. If specified, #' `intervals` must be a matrix with number of rows equal to the number of #' data points and five columns in the following order: lower outer interval, #' lower inner interval, median (50%), upper inner interval and upper outer #' interval (column names are ignored). #' @param order For `ppc_loo_intervals()`, a string indicating how to arrange #' the plotted intervals. The default (`"index"`) is to plot them in the #' order of the observations. The alternative (`"median"`) arranges them #' by median value from smallest (left) to largest (right). #' @param subset For `ppc_loo_intervals()` and `ppc_loo_ribbon()`, an optional #' integer vector indicating which observations in `y` (and `yrep`) to #' include. Dropping observations from `y` and `yrep` manually before passing #' them to the plotting function will not work because the dimensions will not #' match up with the dimensions of `psis_object`, but if all of `y` and `yrep` #' are passed along with `subset` then **bayesplot** can do the subsetting #' internally for `y`, `yrep` *and* `psis_object`. See the **Examples** #' section for a demonstration. #' ppc_loo_intervals <- function(y, yrep, psis_object, ..., subset = NULL, intervals = NULL, prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 1, fatten = 2.5, linewidth = 1, order = c("index", "median")) { check_ignored_arguments(...) y <- validate_y(y) order_by_median <- match.arg(order) == "median" if (!is.null(intervals)) { stopifnot(is.matrix(intervals), ncol(intervals) %in% c(3, 5)) inform(paste( "'intervals' specified so ignoring", "'yrep', 'psis_object', 'subset', if specified." )) if (ncol(intervals) == 3) { intervals <- cbind(intervals[, 1], intervals, intervals[, 3]) } } else { suggested_package("loo", min_version = "2.0.0") yrep <- validate_predictions(yrep, length(y)) if (!is.null(subset)) { stopifnot(length(y) >= length(subset)) y <- y[subset] yrep <- yrep[, subset, drop=FALSE] psis_object <- .psis_subset(psis_object, subset) } probs <- sort(c(prob, prob_outer)) a <- (1 - probs) / 2 stopifnot(identical(dim(psis_object), dim(yrep))) intervals <- suppressWarnings(t(loo::E_loo( x = yrep, psis_object = psis_object, type = "quantile", probs = sort(c(a, 0.5, 1 - a)) )$value)) } x <- seq_along(y) if (order_by_median) { x <- reorder(x, intervals[, 2]) } xy_labs <- if (order_by_median) { labs(x = "Ordered by median", y = NULL) } else { intervals_axis_labels(has_x = FALSE) } data <- .loo_intervals_data(y, x, intervals) ggplot(data) + intervals_inner_aes( needs_y = TRUE, color = "yrep", fill = "yrep" ) + geom_linerange( mapping = intervals_outer_aes(color = "yrep"), alpha = alpha, size = size ) + geom_pointrange( shape = 21, stroke = 0.5, linewidth = linewidth, size = size, fatten = fatten ) + geom_point( mapping = aes( y = .data$y_obs, color = "y", fill = "y" ), shape = 21, stroke = 0.5, size = 1 ) + scale_color_ppc() + scale_fill_ppc() + bayesplot_theme_get() + xy_labs + xaxis_text(!order_by_median) + xaxis_ticks(!order_by_median) } #' @rdname PPC-loo #' @export ppc_loo_ribbon <- function(y, yrep, psis_object, ..., subset = NULL, intervals = NULL, prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25) { check_ignored_arguments(...) y <- validate_y(y) if (!is.null(intervals)) { stopifnot(is.matrix(intervals), ncol(intervals) %in% c(3, 5)) inform(paste( "'intervals' specified so ignoring", "'yrep', 'psis_object', 'subset', if specified." )) if (ncol(intervals) == 3) { intervals <- cbind(intervals[, 1], intervals, intervals[, 3]) } } else { suggested_package("loo", min_version = "2.0.0") yrep <- validate_predictions(yrep, length(y)) if (!is.null(subset)) { stopifnot(length(y) >= length(subset)) y <- y[subset] yrep <- yrep[, subset, drop=FALSE] psis_object <- .psis_subset(psis_object, subset) } probs <- sort(c(prob, prob_outer)) a <- (1 - probs) / 2 stopifnot(identical(dim(psis_object), dim(yrep))) intervals <- suppressWarnings(t(loo::E_loo( x = yrep, psis_object = psis_object, type = "quantile", probs = sort(c(a, 0.5, 1 - a)) )$value)) } data <- .loo_intervals_data(y, x = seq_along(y), intervals) ggplot(data) + intervals_inner_aes(fill = "yrep", color = "yrep") + geom_ribbon( mapping = intervals_outer_aes(fill = "yrep", color = "yrep"), alpha = alpha, linewidth = 0.05 ) + geom_ribbon( mapping = intervals_outer_aes(), alpha = 1, linewidth = 0.05, fill = NA, color = get_color("m") ) + geom_ribbon(linewidth = 0.05) + geom_line( mapping = aes(y = .data$m), color = get_color("m"), linewidth = size ) + geom_blank(aes(fill = "y")) + geom_line( aes(y = .data$y_obs, color = "y"), linewidth = 0.5, alpha = 2/3 ) + scale_color_ppc() + scale_fill_ppc(values = c(NA, get_color("l"))) + intervals_axis_labels(has_x = FALSE) + bayesplot_theme_get() } # internal ---------------------------------------------------------------- .loo_intervals_data <- function(y, x, intervals) { stopifnot(length(y) == nrow(intervals), length(x) == length(y)) tibble::tibble( y_id = seq_along(y), y_obs = y, x = x, ll = intervals[, 1], l = intervals[, 2], m = intervals[, 3], h = intervals[, 4], hh = intervals[, 5]) } # subset a psis_object without breaking it # (FIXME: use function from loo package when subset.psis() method becomes available) .psis_subset <- function(psis_object, subset) { stopifnot(all(subset == as.integer(subset))) if (length(subset) > dim(psis_object)[2]) { abort("'subset' has too many elements.") } psis_object$log_weights <- psis_object$log_weights[, subset, drop=FALSE] psis_object$diagnostics$pareto_k <- psis_object$diagnostics$pareto_k[subset] psis_object$diagnostics$n_eff <- psis_object$diagnostics$n_eff[subset] attr(psis_object, "dims") <- c(dim(psis_object)[1], length(subset)) attr(psis_object, "norm_const_log") <- attr(psis_object, "norm_const_log")[subset] attr(psis_object, "tail_len") <- attr(psis_object, "tail_len")[subset] attr(psis_object, "r_eff") <- attr(psis_object, "r_eff")[subset] psis_object } ## Boundary correction based on code by ArViz development team # The main method is a 1-D density estimation for linear data with # convolution with a Gaussian filter. # Based on scipy.signal.gaussian formula .gaussian <- function(N, bw){ n <- seq(0, N -1) - (N - 1)/2 sigma = 2 * bw * bw w = exp(-n^2 / sigma) return(w) } .linear_convolution <- function(x, bw, grid_counts, grid_breaks, grid_len){ # 1-D Gaussian estimation via # convolution of a Gaussian filter and the binned relative freqs bin_width <- grid_breaks[2] - grid_breaks[1] f <- grid_counts / bin_width / length(x) bw <- bw / bin_width # number of data points to generate for gaussian filter gauss_n <- as.integer(bw * 2 *pi) if (gauss_n == 0){ gauss_n = 1 } # Generate Gaussian filter vector kernel <- .gaussian(gauss_n, bw) npad <- as.integer(grid_len / 5) # Reflection method (i.e. get first N and last N points to pad vector) f <- c(rev(f[1:(npad)]), f, rev(f)[(grid_len - npad):(grid_len - 1)]) # Convolution: Gaussian filter + reflection method (pading) works as an # averaging moving window based on a Gaussian density which takes care # of the density boundary values near 0 and 1. bc_pvals <- stats::filter(f, kernel, method = 'convolution', sides = 2)[(npad + 1):(npad + grid_len)] bc_pvals / (bw * (2 * pi)^0.5) } .kde_correction <- function(x, bw, grid_len){ # Generate boundary corrected values via a linear convolution using a # 1-D Gaussian window filter. This method uses the "reflection method" # to estimate these pvalues and helps speed up the code if (any(is.infinite(x))){ warning(paste("Ignored", sum(is.infinite(x)), "Non-finite PIT values are invalid for KDE boundary correction method")) x <- x[is.finite(x)] } if (grid_len < 100){ grid_len <- 100 } # Get relative frequency boundaries and counts for input vector bins <- seq(from= min(x), to = max(x), length.out = grid_len + 1) hist_obj <- graphics::hist(x, breaks = bins, plot = FALSE) grid_breaks <- hist_obj$breaks grid_counts <- hist_obj$counts # Compute bandwidth based on use specification bw <- stats::density(x, bw = bw)$bw # 1-D Convolution bc_pvals <- .linear_convolution(x, bw, grid_counts, grid_breaks, grid_len) # Generate vector of x-axis values for plotting based on binned relative freqs n_breaks <- length(grid_breaks) xs <- (grid_breaks[2:n_breaks] + grid_breaks[1:(n_breaks - 1)]) / 2 first_nonNA <- utils::head(which(!is.na(bc_pvals)),1) last_nonNA <- utils::tail(which(!is.na(bc_pvals)),1) bc_pvals[1:first_nonNA] <- bc_pvals[first_nonNA] bc_pvals[last_nonNA:length(bc_pvals)] <- bc_pvals[last_nonNA] list(xs = xs, bc_pvals = bc_pvals) } # Wrapper function to generate runif reference lines based on # .kde_correction() .ref_kde_correction <- function(unifs, bw, grid_len){ # Allocate memory idx <- seq(from = 1, to = ncol(unifs)*nrow(unifs) + ncol(unifs), by = ncol(unifs)) idx <- c(idx, ncol(unifs)*nrow(unifs)) xs <- rep(0, ncol(unifs)*nrow(unifs)) bc_mat <- matrix(0, nrow(unifs), ncol(unifs)) # Generate boundary corrected reference values for (i in 1:nrow(unifs)){ bc_list <- .kde_correction(unifs[i,], bw = bw, grid_len = grid_len) bc_mat[i,] <- bc_list$bc_pvals xs[idx[i]:(idx[i+1]-1)] <- bc_list$xs } list(xs = xs, unifs = bc_mat) } # Extract log weights from psis_object if provided .get_lw <- function(lw = NULL, psis_object = NULL) { if (is.null(lw) && is.null(psis_object)) { abort("One of 'lw' and 'psis_object' must be specified.") } else if (is.null(lw)) { suggested_package("loo", min_version = "2.0.0") if (!loo::is.psis(psis_object)) { abort("If specified, 'psis_object' must be a PSIS object from the loo package.") } lw <- loo::weights.importance_sampling(psis_object) } lw } bayesplot/R/helpers-mcmc.R0000644000176200001440000003066014556270424015175 0ustar liggesusers#' Prepare 3-D array for MCMC plots #' #' @noRd #' @param x,pars,regex_pars,transformations Users's arguments to one of the #' mcmc_* functions. #' @return A 3-D (Iterations x Chains x Parameters) array. #' prepare_mcmc_array <- function(x, pars = character(), regex_pars = character(), transformations = list()) { if (posterior::is_draws(x)) { x <- posterior::as_draws_array(x) } else if (is_df_with_chain(x)) { x <- df_with_chain2array(x) } else if (is_chain_list(x)) { # this will apply to mcmc.list and similar objects x <- chain_list2array(x) } else if (is.data.frame(x)) { # data frame without Chain column x <- as.matrix(x) } else { # try object's as.array method x <- as.array(x) } stopifnot(is.matrix(x) || is.array(x)) if (is.array(x) && !(length(dim(x)) %in% c(2,3))) { abort("Arrays should have 2 or 3 dimensions. See help('MCMC-overview').") } if (anyNA(x)) { abort("NAs not allowed in 'x'.") } if (rlang::is_quosures(pars)) { pars <- tidyselect_parameters(complete_pars = parameter_names(x), pars_list = pars) } else { pars <- select_parameters(complete_pars = parameter_names(x), explicit = pars, patterns = regex_pars) } # possibly recycle transformations (apply same to all pars) if (is.function(transformations) || (is.character(transformations) && length(transformations) == 1)) { transformations <- rep(list(transformations), length(pars)) transformations <- set_names(transformations, pars) } if (is.matrix(x)) { x <- x[, pars, drop=FALSE] if (length(transformations)) { x <- apply_transformations(x, transformations = transformations) } x <- array(x, dim = c(nrow(x), 1, ncol(x))) } else { x <- x[, , pars, drop = FALSE] if (length(transformations)) { x <- apply_transformations(x, transformations = transformations) } } pars <- rename_transformed_pars(pars, transformations) set_mcmc_dimnames(x, pars) } #' Explicit and/or regex parameter selection #' #' @noRd #' @param explicit Character vector of selected parameter names. #' @param patterns Character vector of regular expressions. #' @param complete_pars Character vector of all possible parameter names. #' @return Character vector of combined explicit and matched (via regex) #' parameter names, unless an error is thrown. #' select_parameters <- function(explicit = character(), patterns = character(), complete_pars = character()) { stopifnot(is.character(explicit), is.character(patterns), is.character(complete_pars)) if (!length(explicit) && !length(patterns)) { return(complete_pars) } if (length(explicit)) { if (!all(explicit %in% complete_pars)) { not_found <- which(!explicit %in% complete_pars) abort(paste( "Some 'pars' don't match parameter names:", paste(explicit[not_found], collapse = ", "), call. = FALSE )) } } if (!length(patterns)) { return(unique(explicit)) } else { regex_pars <- unlist(lapply(seq_along(patterns), function(j) { grep(patterns[j], complete_pars, value = TRUE) })) if (!length(regex_pars)) { abort("No matches for 'regex_pars'.") } } unique(c(explicit, regex_pars)) } #' Melt a 3-D array or matrix of MCMC draws #' #' @noRd #' @param x An mcmc_array (from prepare_mcmc_array). #' @param varnames,value.name,... Passed to reshape2::melt (array method). #' @return A molten data frame. #' melt_mcmc <- function(x, ...) UseMethod("melt_mcmc") #' @export melt_mcmc.mcmc_array <- function(x, varnames = c("Iteration", "Chain", "Parameter"), value.name = "Value", as.is = TRUE, ...) { stopifnot(is_mcmc_array(x)) long <- reshape2::melt( data = x, varnames = varnames, value.name = value.name, as.is = FALSE, ...) long$Parameter <- factor(long$Parameter) long } # If all chains are already merged #' @export melt_mcmc.matrix <- function(x, varnames = c("Draw", "Parameter"), value.name = "Value", ...) { long <- reshape2::melt( data = x, varnames = varnames, value.name = value.name, as.is = FALSE, ...) long$Parameter <- factor(long$Parameter) long } #' Set dimnames of 3-D array #' @noRd #' @param x 3-D array #' @param parnames Character vector of parameter names #' @return x with a modified dimnames. set_mcmc_dimnames <- function(x, parnames) { stopifnot(is_3d_array(x)) dimnames(x) <- list( Iteration = seq_len(nrow(x)), Chain = seq_len(ncol(x)), Parameter = parnames ) structure(x, class = c(class(x), "mcmc_array")) } #' Convert 3-D array to matrix with chains merged #' #' @noRd #' @param x A 3-D array (iter x chain x param) #' @return A matrix with one column per parameter #' merge_chains <- function(x) { xdim <- dim(x) mat <- array(x, dim = c(prod(xdim[1:2]), xdim[3])) colnames(mat) <- parameter_names(x) mat } #' Check if an object is a data.frame with a chain index column #' #' @noRd #' @param x object to check #' @return TRUE or FALSE is_df_with_chain <- function(x) { is.data.frame(x) && any(tolower(colnames(x)) %in% "chain") } validate_df_with_chain <- function(x) { stopifnot(is_df_with_chain(x)) x <- as.data.frame(x) if (!is.null(x$chain)) { if (is.null(x$Chain)) { x$Chain <- x$chain } x$chain <- NULL } x$Chain <- as.integer(x$Chain) x } # Convert data.frame with Chain variable to a 3-D array df_with_chain2array <- function(x) { x <- validate_df_with_chain(x) chain <- x$Chain n_chain <- length(unique(chain)) a <- x[, !colnames(x) %in% "Chain", drop = FALSE] parnames <- colnames(a) a <- as.matrix(a) x <- array(NA, dim = c(ceiling(nrow(a) / n_chain), n_chain, ncol(a))) for (j in seq_len(n_chain)) { x[, j, ] <- a[chain == j,, drop=FALSE] } set_mcmc_dimnames(x, parnames) } #' Check if an object is a list (but not a data.frame) that contains #' all 2-D objects #' @noRd #' @param x object to check #' @return TRUE or FALSE is_chain_list <- function(x) { check1 <- !is.data.frame(x) && is.list(x) dims <- try(sapply(x, function(chain) length(dim(chain))), silent=TRUE) if (inherits(dims, "try-error")) { return(FALSE) } check2 <- isTRUE(all(dims == 2)) # all elements of list should be matrices/2-D arrays check1 && check2 } validate_chain_list <- function(x) { n_chain <- length(x) for (i in seq_len(n_chain)) { nms <- colnames(as.matrix(x[[i]])) if (is.null(nms) || !all(nzchar(nms))) { abort(paste( "Some parameters are missing names.", "Check the column names for the matrices in your list of chains." )) } } if (n_chain > 1) { n_iter <- sapply(x, nrow) same_iters <- length(unique(n_iter)) == 1 if (!same_iters) { abort("Each chain should have the same number of iterations.") } cnames <- sapply(x, colnames) if (is.array(cnames)) { same_params <- identical(cnames[, 1], cnames[, 2]) } else { same_params <- length(unique(cnames)) == 1 } if (!same_params) { abort(paste( "The parameters for each chain should be in the same order", "and have the same names." )) } } x } # Convert list of matrices to 3-D array chain_list2array <- function(x) { x <- validate_chain_list(x) n_chain <- length(x) if (n_chain == 1) { n_iter <- nrow(x[[1]]) param_names <- colnames(x[[1]]) } else { n_iter <- sapply(x, nrow) cnames <- sapply(x, colnames) param_names <- if (is.array(cnames)) cnames[, 1] else cnames n_iter <- n_iter[1] } param_names <- unique(param_names) n_param <- length(param_names) out <- array(NA, dim = c(n_iter, n_chain, n_param)) for (i in seq_len(n_chain)) { out[, i,] <- x[[i]] } set_mcmc_dimnames(out, param_names) } # Get parameter names from a 3-D array parameter_names <- function(x) UseMethod("parameter_names") #' @export parameter_names.array <- function(x) { stopifnot(is_3d_array(x)) dimnames(x)[[3]] %||% abort("No parameter names found.") } #' @export parameter_names.default <- function(x) { colnames(x) %||% abort("No parameter names found.") } #' @export parameter_names.matrix <- function(x) { colnames(x) %||% abort("No parameter names found.") } # Check if an object is a 3-D array is_3d_array <- function(x) { if (!is.array(x)) { return(FALSE) } if (length(dim(x)) != 3) { return(FALSE) } TRUE } # Check if an object is a 3-D array AND has correct dimension names is_mcmc_array <- function(x) { if (!is_3d_array(x)) { return(FALSE) } if (!identical(names(dimnames(x)), c("Iteration", "Chain", "Parameter"))) { return(FALSE) } TRUE } # Check if 3-D array has multiple chains has_multiple_chains <- function(x) { stopifnot(is_3d_array(x)) isTRUE(dim(x)[2] > 1) } # Check if 3-D array has multiple parameters has_multiple_params <- function(x) { stopifnot(is_3d_array(x)) isTRUE(dim(x)[3] > 1) } STOP_need_multiple_chains <- function(call. = FALSE) { abort("This function requires multiple chains.") } # Validate that transformations match parameter names validate_transformations <- function(transformations = list(), pars = character()) { if (is.null(names(transformations))) { abort("'transformations' must be a _named_ list.") } else if (any(!nzchar(names(transformations)))) { abort("Each element of 'transformations' must have a name.") } transformations <- lapply(transformations, match.fun) if (!all(names(transformations) %in% pars)) { not_found <- which(!names(transformations) %in% pars) abort(paste( "Some names(transformations) don't match parameter names:", paste(names(transformations)[not_found], collapse = ", ") )) } transformations } #' Apply transformations to matrix or 3-D array of parameter draws #' #' @noRd #' @param x A matrix or 3-D array of draws #' @param transformation User's 'transformations' argument to one of the mcmc_* #' functions. #' @return x, with tranformations having been applied to some parameters. #' apply_transformations <- function(x, ...) { UseMethod("apply_transformations") } #' @export apply_transformations.matrix <- function(x, ..., transformations = list()) { pars <- colnames(x) x_transforms <- validate_transformations(transformations, pars) for (p in names(x_transforms)) { x[, p] <- x_transforms[[p]](x[, p]) } x } #' @export apply_transformations.array <- function(x, ..., transformations = list()) { stopifnot(length(dim(x)) == 3) pars <- dimnames(x)[[3]] x_transforms <- validate_transformations(transformations, pars) for (p in names(x_transforms)) { x[, , p] <- x_transforms[[p]](x[, , p]) } x } rename_transformed_pars <- function(pars, transformations) { stopifnot(is.character(pars), is.list(transformations)) has_names <- sapply(transformations, is.character) if (any(has_names)) { nms <- names(which(has_names)) for (nm in nms) { pars[which(pars == nm)] <- paste0( transformations[[nm]], "(", pars[which(pars == nm)], ")" ) } } if (any(!has_names)) { nms <- names(which(!has_names)) pars[pars %in% nms] <- paste0("t(", pars[pars %in% nms], ")") } pars } num_chains <- function(x, ...) UseMethod("num_chains") num_iters <- function(x, ...) UseMethod("num_iters") num_params <- function(x, ...) UseMethod("num_params") #' @export num_params.mcmc_array <- function(x, ...) dim(x)[3] #' @export num_chains.mcmc_array <- function(x, ...) dim(x)[2] #' @export num_iters.mcmc_array <- function(x, ...) dim(x)[1] #' @export num_params.data.frame <- function(x, ...) { stopifnot("Parameter" %in% colnames(x)) length(unique(x$Parameter)) } #' @export num_chains.data.frame <- function(x, ...) { stopifnot("Chain" %in% colnames(x)) length(unique(x$Chain)) } #' @export num_iters.data.frame <- function(x, ...) { cols <- colnames(x) stopifnot("Iteration" %in% cols || "Draws" %in% cols) if ("Iteration" %in% cols) { n <- length(unique(x$Iteration)) } else { n <- length(unique(x$Draw)) } n } bayesplot/R/mcmc-overview.R0000644000176200001440000000600414212422623015361 0ustar liggesusers#' Plots for Markov chain Monte Carlo simulations #' #' @name MCMC-overview #' @aliases MCMC #' @family MCMC #' #' @description #' The **bayesplot** MCMC module provides various plotting functions for #' creating graphical displays of Markov chain Monte Carlo (MCMC) simulations. #' The **MCMC plotting functions** section, below, provides links to the #' documentation for various categories of MCMC plots. Currently the MCMC #' plotting functions accept posterior draws provided in one of the following #' formats: #' * __3-D array__: An array with dimensions `Iteration, Chain, Parameter` in #' that order. #' * __list__: A list of matrices, where each matrix corresponds to a Markov #' chain. All of the matrices should have the same number of iterations (rows) #' and parameters (columns), and parameters should have the same names and be in #' the same order. #' * __matrix (2-D array)__: A matrix with one column per parameter. If using #' matrix there should only be a single Markov chain or all chains should #' already be merged (stacked). #' * __data frame__: There are two types of data frames allowed. Either a data #' frame with one column per parameter (if only a single chain or all chains #' have already been merged), or a data frame with one column per parameter plus #' an additional column `"Chain"` that contains the chain number (an integer) #' corresponding to each row in the data frame. #' * __draws__: Any of the `draws` formats supported by the #' \pkg{\link{posterior}} package. #' #' __Note__: typically the user should *not* include warmup iterations #' in the object passed to **bayesplot** plotting functions, although for #' certain plots (e.g. trace plots) it can occasionally be useful to include the #' warmup iterations for diagnostic purposes. #' #' @section MCMC plotting functions: #' #' * [Posterior distributions][MCMC-distributions]: #' Histograms and kernel density plots of parameter draws, optionally #' showing each Markov chain separately. #' * [Uncertainty intervals][MCMC-intervals]: Uncertainty intervals computed #' from parameter draws. #' * [Trace plots][MCMC-traces]: Times series of parameter draws, optionally #' including HMC/NUTS diagnostic information. #' * [Scatterplots][MCMC-scatterplots]: Scatterplots, heatmaps, and pairs #' plots of parameter draws, optionally including HMC/NUTS diagnostic #' information. #' * [Parallel coordinates plots][MCMC-parcoord]: Parallel coordinates plot #' of MCMC draws (one dimension per parameter), optionally including #' HMC/NUTS diagnostic information. #' * [Combos][MCMC-combos]: Combination plots (e.g. trace plot + histogram). #' * [General MCMC diagnostics][MCMC-diagnostics]: MCMC diagnostic plots #' including R-hat, effective sample size, autocorrelation. #' [NUTS diagnostics][MCMC-nuts]: Special diagnostic plots for #' the No-U-Turn Sampler. #' * [Comparisons to "true" values][MCMC-recover]: Plots comparing MCMC #' estimates to "true" parameter values (e.g., values used to simulate data). #' #' @template reference-vis-paper #' NULL bayesplot/R/ppd-distributions.R0000644000176200001440000002070714556270424016302 0ustar liggesusers#' PPD distributions #' #' Plot posterior or prior predictive distributions. Each of these functions #' makes the same plot as the corresponding [`ppc_`][PPC-distributions] function #' but without plotting any observed data `y`. The **Plot Descriptions** section #' at [PPC-distributions] has details on the individual plots. #' #' @name PPD-distributions #' @family PPDs #' #' @template args-ypred #' @inheritParams PPC-distributions #' #' @template details-binomial #' @template return-ggplot-or-data #' #' @examples #' # difference between ppd_dens_overlay() and ppc_dens_overlay() #' color_scheme_set("brightblue") #' preds <- example_yrep_draws() #' ppd_dens_overlay(ypred = preds[1:50, ]) #' ppc_dens_overlay(y = example_y_data(), yrep = preds[1:50, ]) #' NULL #' @rdname PPD-distributions #' @export ppd_data <- function(ypred, group = NULL) { ypred <- validate_predictions(ypred) if (!is.null(group)) { group <- validate_group(group, n_obs = ncol(ypred)) } .ppd_data(predictions = ypred, y = NULL, group = group) } #' @rdname PPD-distributions #' @export ppd_dens_overlay <- function(ypred, ..., size = 0.25, alpha = 0.7, trim = FALSE, bw = "nrd0", adjust = 1, kernel = "gaussian", n_dens = 1024) { check_ignored_arguments(...) data <- ppd_data(ypred) ggplot(data, mapping = aes(x = .data$value)) + overlay_ppd_densities( mapping = aes(group = .data$rep_id, color = "ypred"), linewidth = size, alpha = alpha, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n = n_dens ) + scale_color_ppd( values = get_color("m"), guide = guide_legend( # in case user turns legend back on override.aes = list(size = 2 * size, alpha = 1)) ) + bayesplot_theme_get() + dont_expand_axes() + yaxis_title(FALSE) + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + legend_none() } #' @rdname PPD-distributions #' @export ppd_ecdf_overlay <- function(ypred, ..., discrete = FALSE, pad = TRUE, size = 0.25, alpha = 0.7) { check_ignored_arguments(...) data <- ppd_data(ypred) ggplot(data, mapping = aes(x = .data$value)) + hline_at( c(0, 0.5, 1), linewidth = c(0.2, 0.1, 0.2), linetype = 2, color = get_color("dh") ) + stat_ecdf( mapping = aes(group = .data$rep_id, color = "ypred"), geom = if (discrete) "step" else "line", linewidth = size, alpha = alpha, pad = pad ) + scale_color_ppd( values = get_color("m"), guide = guide_legend( # in case user turns legend back on override.aes = list(linewidth = 2 * size, alpha = 1)) ) + scale_y_continuous(breaks = c(0, 0.5, 1)) + bayesplot_theme_get() + yaxis_title(FALSE) + xaxis_title(FALSE) + legend_none() } #' @rdname PPD-distributions #' @export ppd_dens <- function(ypred, ..., trim = FALSE, size = 0.5, alpha = 1) { check_ignored_arguments(...) data <- ppd_data(ypred) ggplot(data, mapping = aes( x = .data$value, color = "ypred", fill = "ypred" )) + geom_density( linewidth = size, alpha = alpha, trim = trim ) + scale_color_ppd() + scale_fill_ppd() + bayesplot_theme_get() + facet_wrap_parsed("rep_label") + force_axes_in_facets() + dont_expand_y_axis() + legend_none() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(FALSE) + facet_text(FALSE) } #' @rdname PPD-distributions #' @export ppd_hist <- function(ypred, ..., binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE) { check_ignored_arguments(...) data <- ppd_data(ypred) ggplot(data, mapping = set_hist_aes( freq, color = "ypred", fill = "ypred" )) + geom_histogram( size = 0.25, binwidth = binwidth, bins = bins, breaks = breaks ) + scale_color_ppd() + scale_fill_ppd() + bayesplot_theme_get() + facet_wrap_parsed("rep_label") + force_axes_in_facets() + dont_expand_y_axis() + legend_none() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(FALSE) + facet_text(FALSE) } #' @rdname PPD-distributions #' @export ppd_freqpoly <- function(ypred, ..., binwidth = NULL, bins = NULL, freq = TRUE, size = 0.5, alpha = 1) { dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppd_data(ypred, group = dots$group) ggplot(data, mapping = set_hist_aes( freq, color = "ypred", fill = "ypred" )) + geom_area( stat = "bin", binwidth = binwidth, bins = bins, size = size, alpha = alpha ) + facet_wrap_parsed("rep_label") + scale_color_ppd() + scale_fill_ppd() + bayesplot_theme_get() + force_axes_in_facets() + dont_expand_y_axis() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(FALSE) + facet_text(FALSE) + legend_none() } #' @rdname PPD-distributions #' @export ppd_freqpoly_grouped <- function(ypred, group, ..., binwidth = NULL, bins = NULL, freq = TRUE, size = 0.5, alpha = 1) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppd_freqpoly", call), parent.frame()) g + facet_grid( rep_label ~ group, scales = "free", labeller = label_parsed ) + force_axes_in_facets() + facet_text() + theme(strip.text.y = element_blank()) } #' @rdname PPD-distributions #' @export ppd_boxplot <- function(ypred, ..., notch = TRUE, size = 0.5, alpha = 1) { check_ignored_arguments(...) data <- ppd_data(ypred) ggplot(data, mapping = aes( x = .data$rep_label, y = .data$value, color = "ypred", fill = "ypred" )) + geom_boxplot( notch = notch, linewidth = size, alpha = alpha, outlier.color = get_color("lh"), outlier.alpha = 2/3, outlier.size = 1 ) + scale_color_ppd() + scale_fill_ppd() + scale_x_discrete(labels = function(x) parse(text=x)) + bayesplot_theme_get() + yaxis_title(FALSE) + xaxis_ticks(FALSE) + xaxis_text(FALSE) + xaxis_title(FALSE) + legend_none() } # internal ---------------------------------------------------------------- #' Back end for both `ppd_data()` and `ppc_data()` #' #' @noRd #' @param predictions SxN matrix of predictions (`ypred` or `yrep`) already validated. #' @param y User's `y` argument (if applicable), already validated. #' @param group User's `group` argument, already validated. #' @return A molten data frame of predictions, possible including `y`. #' @importFrom dplyr left_join select .ppd_data <- function(predictions, y = NULL, group = NULL) { if (!is.null(y)) { data <- melt_and_stack(y, predictions) } else { data <- melt_predictions(predictions) levels(data$rep_label) <- gsub("rep", "pred", levels(data$rep_label)) } if (!is.null(group)) { group_indices <- tibble::tibble(group, y_id = seq_along(group)) data <- data %>% left_join(group_indices, by = "y_id") %>% select("group", tidyselect::everything()) } data } #' Wrapper for stat_density with some argument defaults changed #' #' This function is called internally by `ppd_dens_overlay()` and #' `ppc_dens_overlay()`. #' #' @param geom,position Arguments passed to [ggplot2::stat_density()] but #' with different defaults. #' @param ... All arguments other than `geom` and `position` to pass to #' `stat_density()`. The defaults will be the same as for `stat_density()`. #' @return Object returned by `stat_density()`. #' @noRd overlay_ppd_densities <- function(..., geom = "line", position = "identity") { stat_density(..., geom = geom, position = position) } bayesplot/R/ppc-discrete.R0000644000176200001440000003143214556270424015176 0ustar liggesusers#' PPCs for discrete outcomes #' #' Many of the [PPC][PPC-overview] functions in **bayesplot** can #' be used with discrete data. The small subset of these functions that can #' *only* be used if `y` and `yrep` are discrete are documented #' on this page. Currently these include rootograms for count outcomes and bar #' plots for ordinal, categorical, and multinomial outcomes. See the #' **Plot Descriptions** section below. #' #' @name PPC-discrete #' @family PPCs #' #' @template args-y-yrep #' @param ... Currently unused. #' @param prob A value between `0` and `1` indicating the desired probability #' mass to include in the `yrep` intervals. Set `prob=0` to remove the #' intervals. (Note: for rootograms these are intervals of the *square roots* #' of the expected counts.) #' @param width For bar plots only, passed to [ggplot2::geom_bar()] to control #' the bar width. #' @param size,fatten,linewidth For bar plots, `size`, `fatten`, and `linewidth` #' are passed to [ggplot2::geom_pointrange()] to control the appearance of the #' `yrep` points and intervals. For rootograms `size` is passed to #' [ggplot2::geom_line()]. #' @param freq For bar plots only, if `TRUE` (the default) the y-axis will #' display counts. Setting `freq=FALSE` will put proportions on the y-axis. #' #' @template return-ggplot-or-data #' #' @details For all of these plots `y` and `yrep` must be integers, although #' they need not be integers in the strict sense of \R's #' [integer][base::integer] type. For rootogram plots `y` and `yrep` must also #' be non-negative. #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_bars()`}{ #' Bar plot of `y` with `yrep` medians and uncertainty intervals #' superimposed on the bars. #' } #' \item{`ppc_bars_grouped()`}{ #' Same as `ppc_bars()` but a separate plot (facet) is generated for each #' level of a grouping variable. #' } #' \item{`ppc_rootogram()`}{ #' Rootograms allow for diagnosing problems in count data models such as #' overdispersion or excess zeros. They consist of a histogram of `y` with the #' expected counts based on `yrep` overlaid as a line along with uncertainty #' intervals. The y-axis represents the square roots of the counts to #' approximately adjust for scale differences and thus ease comparison between #' observed and expected counts. Using the `style` argument, the histogram #' style can be adjusted to focus on different aspects of the data: #' * _Standing_: basic histogram of observed counts with curve #' showing expected counts. #' * _Hanging_: observed counts counts hanging from the curve #' representing expected counts. #' * _Suspended_: histogram of the differences between expected and #' observed counts. #' #' **All of the rootograms are plotted on the square root scale**. See Kleiber #' and Zeileis (2016) for advice on interpreting rootograms and selecting #' among the different styles. #' } #' } #' #' @examples #' set.seed(9222017) #' #' # bar plots #' f <- function(N) { #' sample(1:4, size = N, replace = TRUE, prob = c(0.25, 0.4, 0.1, 0.25)) #' } #' y <- f(100) #' yrep <- t(replicate(500, f(100))) #' dim(yrep) #' group <- gl(2, 50, length = 100, labels = c("GroupA", "GroupB")) #' #' color_scheme_set("mix-pink-blue") #' ppc_bars(y, yrep) #' #' # split by group, change interval width, and display proportion #' # instead of count on y-axis #' color_scheme_set("mix-blue-pink") #' ppc_bars_grouped(y, yrep, group, prob = 0.5, freq = FALSE) #' #' \dontrun{ #' # example for ordinal regression using rstanarm #' library(rstanarm) #' fit <- stan_polr( #' tobgp ~ agegp, #' data = esoph, #' method = "probit", #' prior = R2(0.2, "mean"), #' init_r = 0.1, #' seed = 12345, #' # cores = 4, #' refresh = 0 #' ) #' #' # coded as character, so convert to integer #' yrep_char <- posterior_predict(fit) #' print(yrep_char[1, 1:4]) #' #' yrep_int <- sapply(data.frame(yrep_char, stringsAsFactors = TRUE), as.integer) #' y_int <- as.integer(esoph$tobgp) #' #' ppc_bars(y_int, yrep_int) #' #' ppc_bars_grouped( #' y = y_int, #' yrep = yrep_int, #' group = esoph$agegp, #' freq=FALSE, #' prob = 0.5, #' fatten = 1, #' size = 1.5 #' ) #' } #' NULL #' @rdname PPC-discrete #' @export ppc_bars <- function(y, yrep, ..., prob = 0.9, width = 0.9, size = 1, fatten = 2.5, linewidth = 1, freq = TRUE) { dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppc_bars_data( y = y, yrep = yrep, group = dots$group, prob = prob, freq = freq ) if (!is.null(dots$group)) { limits <- geom_ignore() } else { limits <- expand_limits(y = 1.05 * max(data[["h"]], na.rm = TRUE)) } ggplot(data) + geom_col( data = dplyr::filter(data, !is.na(.data$y_obs)), mapping = aes(x = .data$x, y = .data$y_obs, fill = "y"), color = get_color("lh"), width = width ) + geom_pointrange( mapping = intervals_inner_aes(needs_y = TRUE, color = "yrep"), size = size, fatten = fatten, linewidth = linewidth, na.rm = TRUE ) + scale_color_ppc( values = get_color("d"), labels = yrep_label(), guide = guide_legend(order = 1, override.aes = list(size = .75 * size)) ) + scale_fill_ppc(values = get_color("l"), labels = y_label()) + scale_x_continuous(breaks = pretty) + labs(x = NULL, y = if (freq) "Count" else "Proportion") + dont_expand_y_axis() + bayesplot_theme_get() + limits + reduce_legend_spacing(0.25) } #' @rdname PPC-discrete #' @export #' @template args-group #' @param facet_args An optional list of arguments (other than `facets`) #' passed to [ggplot2::facet_wrap()] to control faceting. ppc_bars_grouped <- function(y, yrep, group, ..., facet_args = list(), prob = 0.9, width = 0.9, size = 1, fatten = 2.5, linewidth = 1, freq = TRUE) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppc_bars", call), parent.frame()) if (fixed_y(facet_args)) { g <- g + expand_limits(y = 1.05 * max(g$data[["h"]], na.rm = TRUE)) } g + bars_group_facets(facet_args) + force_axes_in_facets() } #' @rdname PPC-discrete #' @export #' @param style For `ppc_rootogram`, a string specifying the rootogram #' style. The options are `"standing"`, `"hanging"`, and #' `"suspended"`. See the **Plot Descriptions** section, below, for #' details on the different styles. #' #' @references #' Kleiber, C. and Zeileis, A. (2016). #' Visualizing count data regressions using rootograms. #' *The American Statistician*. 70(3): 296--303. #' . #' #' @examples #' # rootograms for counts #' y <- rpois(100, 20) #' yrep <- matrix(rpois(10000, 20), ncol = 100) #' #' color_scheme_set("brightblue") #' ppc_rootogram(y, yrep) #' ppc_rootogram(y, yrep, prob = 0) #' #' ppc_rootogram(y, yrep, style = "hanging", prob = 0.8) #' ppc_rootogram(y, yrep, style = "suspended") #' ppc_rootogram <- function(y, yrep, style = c("standing", "hanging", "suspended"), ..., prob = 0.9, size = 1) { check_ignored_arguments(...) style <- match.arg(style) y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) if (!all_counts(y)) { abort("ppc_rootogram expects counts as inputs to 'y'.") } if (!all_counts(yrep)) { abort("ppc_rootogram expects counts as inputs to 'yrep'.") } alpha <- (1 - prob) / 2 probs <- c(alpha, 1 - alpha) ymax <- max(y, yrep) xpos <- 0L:ymax # prepare a table for yrep tyrep <- as.list(rep(NA, nrow(yrep))) for (i in seq_along(tyrep)) { tyrep[[i]] <- table(yrep[i,]) matches <- match(xpos, rownames(tyrep[[i]])) tyrep[[i]] <- as.numeric(tyrep[[i]][matches]) } tyrep <- do.call(rbind, tyrep) tyrep[is.na(tyrep)] <- 0 tyexp <- sqrt(colMeans(tyrep)) tyquantile <- sqrt(t(apply(tyrep, 2, quantile, probs = probs))) colnames(tyquantile) <- c("tylower", "tyupper") # prepare a table for y ty <- table(y) ty <- sqrt(as.numeric(ty[match(xpos, rownames(ty))])) if (style == "suspended") { ty <- tyexp - ty } ty[is.na(ty)] <- 0 ypos <- ty / 2 if (style == "hanging") { ypos <- tyexp - ypos } data <- data.frame(xpos, ypos, ty, tyexp, tyquantile) graph <- ggplot(data) + aes( ymin = .data$tylower, ymax = .data$tyupper, height = .data$ty ) + geom_tile( aes( x = .data$xpos, y = .data$ypos, fill = "Observed" ), color = get_color("lh"), linewidth = 0.25, width = 1 ) + bayesplot_theme_get() if (style != "standing") { graph <- graph + hline_0(size = 0.4) } graph <- graph + geom_smooth( aes( x = .data$xpos, y = .data$tyexp, color = "Expected" ), fill = get_color("d"), linewidth = size, stat = "identity" ) + scale_fill_manual("", values = get_color("l")) + scale_color_manual("", values = get_color("dh")) + labs(x = expression(italic(y)), y = expression(sqrt(Count))) if (style == "standing") { graph <- graph + dont_expand_y_axis() } graph + reduce_legend_spacing(0.25) } #' @rdname PPC-discrete #' @export ppc_bars_data <- function(y, yrep, group = NULL, prob = 0.9, freq = TRUE) { stopifnot(0 <= prob && prob <= 1, is.logical(freq)) y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) if (!all_whole_number(y)) { abort("ppc_bars expects 'y' to be discrete.") } if (!all_whole_number(yrep)) { abort("ppc_bars expects 'yrep' to be discrete.") } if (!is.null(group)) { group <- validate_group(group, length(y)) } .ppc_bars_data( y = y, yrep = yrep, group = group, prob = prob, freq = freq ) } # internal ---------------------------------------------------------------- #' Internal function for `ppc_bars_data()` #' #' @noRd #' @param y,yrep,group User's already validated `y`, `yrep`, and (if applicable) #' `group` arguments. #' @param prob,freq User's `prob` and `freq` arguments. #' @importFrom dplyr %>% ungroup count arrange mutate summarise across full_join rename all_of .ppc_bars_data <- function(y, yrep, group = NULL, prob = 0.9, freq = TRUE) { alpha <- (1 - prob) / 2 probs <- sort(c(alpha, 0.5, 1 - alpha)) # Prepare for final summary lo <- function(x) quantile(x, probs[1]) mid <- function(x) quantile(x, probs[2]) hi <- function(x) quantile(x, probs[3]) summary_var <- ifelse(freq, "n", "proportion") summary_funs <- list(l = lo, m = mid, h = hi) # use l,m,h like in our intervals data # Set a dummy group for ungrouped data if (is.null(group)) { was_null_group <- TRUE group <- 1 } else{ was_null_group <- FALSE } tmp_data <- data.frame( group = factor(group), y = y, yrep = t(yrep) ) data <- reshape2::melt(tmp_data, id.vars = "group") %>% count(.data$group, .data$value, .data$variable) %>% group_by(.data$variable, .data$group) %>% mutate(proportion = .data$n / sum(.data$n)) %>% ungroup() %>% group_by(.data$group, .data$value) yrep_summary <- data %>% dplyr::filter(!.data$variable == "y") %>% summarise(across(all_of(summary_var), summary_funs, .names = "{.fn}")) %>% ungroup() %>% arrange(.data$group, .data$value) y_summary <- data %>% dplyr::filter(.data$variable == "y") %>% ungroup() %>% rename(y_obs = all_of(summary_var)) %>% arrange(.data$group, .data$value) cols <- syms(c(if (!was_null_group) "group", "x", "y_obs", "l", "m", "h")) # full join to keep empty cells full_join(yrep_summary, y_summary, by = c("group", "value")) %>% rename(x = "value") %>% arrange(.data$x) %>% select(!!!cols) } #' Create the facet layer for grouped bar plots #' @param facet_args User's `facet_args` argument. #' @param scales_default String to use for `scales` argument to `facet_wrap()` #' if not specified by user. The default is `"fixed"` for bar plots. This is #' the same as `ggplot2::facet_wrap()` but different than #' `bayesplot::intervals_group_facets()`, which has a default of `"free"`. #' @return Object returned by `facet_wrap()`. #' @noRd bars_group_facets <- function(facet_args, scales_default = "fixed") { facet_args[["facets"]] <- "group" facet_args[["scales"]] <- facet_args[["scales"]] %||% scales_default do.call("facet_wrap", facet_args) } fixed_y <- function(facet_args) { !isTRUE(facet_args[["scales"]] %in% c("free", "free_y")) } bayesplot/R/mcmc-traces.R0000644000176200001440000006025214556270424015014 0ustar liggesusers#' Trace and rank plots of MCMC draws #' #' Trace and rank plots of MCMC draws. See the **Plot Descriptions** #' section, below, for details. #' #' @name MCMC-traces #' @family MCMC #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-transformations #' @template args-facet_args #' @template args-pit-ecdf #' @param ... Currently ignored. #' @param size An optional value to override the default line size #' for `mcmc_trace()` or the default point size for `mcmc_trace_highlight()`. #' @param alpha For `mcmc_trace_highlight()`, passed to #' [ggplot2::geom_point()] to control the transparency of the points #' for the chains not highlighted. #' @param n_warmup An integer; the number of warmup iterations included in #' `x`. The default is `n_warmup = 0`, i.e. to assume no warmup #' iterations are included. If `n_warmup > 0` then the background for #' iterations `1:n_warmup` is shaded gray. #' @param iter1 An integer; the iteration number of the first included draw #' (default is `0`). This can be used to make it more obvious that the warmup #' iterations have been discarded from the traceplot. It cannot be specified #' if `n_warmup` is also set to a positive value. #' @param window An integer vector of length two specifying the limits of a #' range of iterations to display. #' @param np For models fit using [NUTS] (more generally, any #' [symplectic integrator](https://en.wikipedia.org/wiki/Symplectic_integrator)), #' an optional data frame providing NUTS diagnostic information. The data #' frame should be the object returned by [nuts_params()] or one with the same #' structure. If `np` is specified then tick marks are added to the bottom of #' the trace plot indicating within which iterations there was a divergence #' (if there were any). See the end of the **Examples** section, below. #' @param np_style A call to the `trace_style_np()` helper function to #' specify arguments controlling the appearance of tick marks representing #' divergences (if the `np` argument is specified). #' @param divergences Deprecated. Use the `np` argument instead. #' #' @template return-ggplot-or-data #' @return `mcmc_trace_data()` returns the data for the trace *and* rank plots #' in the same data frame. #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_trace()`}{ #' Standard trace plots of MCMC draws. For models fit using [NUTS], #' the `np` argument can be used to also show divergences on the trace plot. #' } #' \item{`mcmc_trace_highlight()`}{ #' Traces are plotted using points rather than lines and the opacity of all #' chains but one (specified by the `highlight` argument) is reduced. #' } #' \item{`mcmc_rank_hist()`}{ #' Whereas traditional trace plots visualize how the chains mix over the #' course of sampling, rank histograms visualize how the values #' from the chains mix together in terms of ranking. An ideal plot would #' show the rankings mixing or overlapping in a uniform distribution. #' See Vehtari et al. (2019) for details. #' } #' \item{`mcmc_rank_overlay()`}{ #' Ranks from `mcmc_rank_hist()` are plotted using overlaid lines in a #' single panel. #' } #' \item{`mcmc_rank_ecdf()`}{ #' The ECDFs of the ranks from `mcmc_rank_hist()` are plotted with the #' simultaneous confidence bands with a coverage determined by `prob`, that #' is, bands that completely cover all of the rank ECDFs with the probability #' `prob`. If `plot_diff = TRUE`, the difference between the observed rank #' ECDFs and the theoretical expectation for samples originating from the #' same distribution is drawn. See Säilynoja et al. (2021) for details. #' } #' } #' #' @template reference-improved-rhat #' @template reference-uniformity-test #' @examples #' # some parameter draws to use for demonstration #' x <- example_mcmc_draws(chains = 4, params = 6) #' dim(x) #' dimnames(x) #' #' # trace plots of the betas #' color_scheme_set("viridis") #' mcmc_trace(x, regex_pars = "beta") #' \donttest{ #' color_scheme_set("viridisA") #' mcmc_trace(x, regex_pars = "beta") #' #' color_scheme_set("viridisC") #' mcmc_trace(x, regex_pars = "beta") #' } #' #' # mix color schemes #' color_scheme_set("mix-blue-red") #' mcmc_trace(x, regex_pars = "beta") #' #' # use traditional ggplot discrete color scale #' mcmc_trace(x, pars = c("alpha", "sigma")) + #' ggplot2::scale_color_discrete() #' #' # zoom in on a window of iterations, increase line size, #' # add tick marks, move legend to the top, add gray background #' color_scheme_set("viridisA") #' mcmc_trace(x[,, 1:4], window = c(100, 130), size = 1) + #' panel_bg(fill = "gray90", color = NA) + #' legend_move("top") #' #' # Rank-normalized histogram plots. Instead of showing how chains mix over #' # time, look at how the ranking of MCMC samples mixed between chains. #' color_scheme_set("viridisE") #' mcmc_rank_hist(x, "alpha") #' mcmc_rank_hist(x, pars = c("alpha", "sigma"), ref_line = TRUE) #' mcmc_rank_overlay(x, "alpha") #' #' # ECDF and ECDF difference plots of the ranking of MCMC samples between chains. #' # Provide 99% simultaneous confidence intervals for the chains sampling from #' # the same distribution. #' mcmc_rank_ecdf(x, prob = 0.99) #' mcmc_rank_ecdf(x, prob = 0.99, plot_diff = TRUE) #' #' \dontrun{ #' # parse facet label text #' color_scheme_set("purple") #' p <- mcmc_trace( #' x, #' regex_pars = "beta\\[[1,3]\\]", #' facet_args = list(labeller = ggplot2::label_parsed) #' ) #' p + facet_text(size = 15) #' #' # mark first 100 draws as warmup #' mcmc_trace(x, n_warmup = 100) #' #' # plot as points, highlighting chain 2 #' color_scheme_set("brightblue") #' mcmc_trace_highlight(x, pars = "sigma", highlight = 2, size = 2) #' #' # for models fit using HMC/NUTS divergences can be displayed in the trace plot #' library("rstanarm") #' fit <- stan_glm(mpg ~ ., data = mtcars, refresh = 0, #' # next line to keep example fast and also ensure we get some divergences #' prior = hs(), iter = 400, adapt_delta = 0.8) #' #' # extract draws using as.array (instead of as.matrix) to keep #' # chains separate for trace plot #' posterior <- as.array(fit) #' #' # for stanfit and stanreg objects use nuts_params() to get the divergences #' mcmc_trace(posterior, pars = "sigma", np = nuts_params(fit)) #' #' color_scheme_set("viridis") #' mcmc_trace( #' posterior, #' pars = c("wt", "sigma"), #' size = 0.5, #' facet_args = list(nrow = 2), #' np = nuts_params(fit), #' np_style = trace_style_np(div_color = "black", div_size = 0.5) #' ) #' } #' NULL #' @rdname MCMC-traces #' @export mcmc_trace <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_warmup = 0, iter1 = 0, window = NULL, size = NULL, np = NULL, np_style = trace_style_np(), divergences = NULL) { # deprecate 'divergences' arg in favor of 'np' # (for consistency across functions) if (!is.null(np) && !is.null(divergences)) { abort(paste0( "'np' and 'divergences' can't both be specified. ", "Use only 'np' (the 'divergences' argument is deprecated)." )) } else if (!is.null(divergences)) { warn(paste0( "The 'divergences' argument is deprecated ", "and will be removed in a future release. ", "Use the 'np' argument instead." )) np <- divergences } check_ignored_arguments(...) .mcmc_trace( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, n_warmup = n_warmup, window = window, size = size, style = "line", np = np, np_style = np_style, iter1 = iter1, ... ) } #' @rdname MCMC-traces #' @export #' @param highlight For `mcmc_trace_highlight()`, an integer specifying one #' of the chains that will be more visible than the others in the plot. mcmc_trace_highlight <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_warmup = 0, window = NULL, size = NULL, alpha = 0.2, highlight = 1) { check_ignored_arguments(...) .mcmc_trace( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, n_warmup = n_warmup, window = window, size = size, alpha = alpha, highlight = highlight, style = "point", ... ) } #' @rdname MCMC-traces #' @export #' @param div_color,div_size,div_alpha Optional arguments to the #' `trace_style_np()` helper function that are eventually passed to #' [ggplot2::geom_rug()] if the `np` argument is also specified. They control #' the color, size, and transparency specifications for showing divergences in #' the plot. The default values are displayed in the **Usage** section above. #' trace_style_np <- function(div_color = "red", div_size = 0.25, div_alpha = 1) { stopifnot( is.character(div_color), is.numeric(div_size), is.numeric(div_alpha) && div_alpha >= 0 && div_alpha <= 1 ) style <- list( color = c(div = div_color), size = c(div = div_size), alpha = c(div = div_alpha) ) structure(style, class = c(class(style), "nuts_style")) } #' @rdname MCMC-traces #' @param n_bins For the rank plots, the number of bins to use for the histogram #' of rank-normalized MCMC samples. Defaults to `20`. #' @param ref_line For the rank plots, whether to draw a horizontal line at the #' average number of ranks per bin. Defaults to `FALSE`. #' @export mcmc_rank_overlay <- function(x, pars = character(), regex_pars = character(), transformations = list(), facet_args = list(), ..., n_bins = 20, ref_line = FALSE) { check_ignored_arguments(...) data <- mcmc_trace_data( x, pars = pars, regex_pars = regex_pars, transformations = transformations ) n_chains <- unique(data$n_chains) n_param <- unique(data$n_parameters) # We have to bin and count the data ourselves because # ggplot2::stat_bin(geom = "step") does not draw the final bin. histobins <- data %>% dplyr::distinct(.data$value_rank) %>% mutate(cut = cut(.data$value_rank, n_bins)) %>% group_by(.data$cut) %>% mutate(bin_start = min(.data$value_rank)) %>% ungroup() %>% select(-c("cut")) d_bin_counts <- data %>% left_join(histobins, by = "value_rank") %>% count(.data$parameter, .data$chain, .data$bin_start) # Duplicate the final bin, setting the left edge to the greatest x value, so # that the entire x-axis is used, right_edge <- max(data$value_rank) d_bin_counts <- d_bin_counts %>% dplyr::filter(.data$bin_start == max(.data$bin_start)) %>% mutate(bin_start = right_edge) %>% dplyr::bind_rows(d_bin_counts) scale_color <- scale_color_manual("Chain", values = chain_colors(n_chains)) layer_ref_line <- if (ref_line) { geom_hline( yintercept = (right_edge / n_bins) / n_chains, color = get_color("dark_highlight"), size = 1, linetype = "dashed" ) } else { NULL } facet_call <- NULL if (n_param > 1) { facet_args$facets <- vars(.data$parameter) facet_args$scales <- facet_args$scales %||% "fixed" facet_call <- do.call("facet_wrap", facet_args) } ggplot(d_bin_counts) + aes(x = .data$bin_start, y = .data$n, color = .data$chain) + geom_step() + layer_ref_line + facet_call + scale_color + ylim(c(0, NA)) + bayesplot_theme_get() + force_x_axis_in_facets() + labs(x = "Rank", y = NULL) } #' @rdname MCMC-traces #' @export mcmc_rank_hist <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_bins = 20, ref_line = FALSE) { check_ignored_arguments(...) data <- mcmc_trace_data( x, pars = pars, regex_pars = regex_pars, transformations = transformations ) n_iter <- unique(data$n_iterations) n_chains <- unique(data$n_chains) n_param <- unique(data$n_parameters) # Create a dataframe with chain x parameter x min(rank) x max(rank) to set # x axis range in each facet data_boundaries <- data %>% dplyr::distinct(.data$chain, .data$parameter) data_boundaries <- dplyr::bind_rows( mutate(data_boundaries, value_rank = min(data$value_rank)), mutate(data_boundaries, value_rank = max(data$value_rank)) ) right_edge <- max(data_boundaries$value_rank) facet_args[["scales"]] <- facet_args[["scales"]] %||% "fixed" # If there is one parameter, put the chains in one row. # Otherwise, use a grid. if (n_param > 1) { facet_f <- facet_grid facet_args[["rows"]] <- facet_args[["rows"]] %||% vars(.data$parameter) facet_args[["cols"]] <- facet_args[["cols"]] %||% vars(.data$chain) } else { facet_f <- facet_wrap facet_args[["facets"]] <- vars(.data$parameter, .data$chain) facet_args[["nrow"]] <- facet_args[["nrow"]] %||% 1 labeller <- function(x) label_value(x, multi_line = FALSE) facet_args[["labeller"]] <- facet_args[["labeller"]] %||% labeller } layer_ref_line <- if (ref_line) { geom_hline( yintercept = (right_edge / n_bins) / n_chains, color = get_color("dark_highlight"), size = .5, linetype = "dashed" ) } else { NULL } facet_call <- do.call(facet_f, facet_args) ggplot(data) + aes(x = .data$value_rank) + geom_histogram( color = get_color("mid_highlight"), fill = get_color("mid"), binwidth = right_edge / n_bins, boundary = right_edge, linewidth = 0.25 ) + layer_ref_line + geom_blank(data = data_boundaries) + facet_call + force_x_axis_in_facets() + dont_expand_y_axis(c(0.005, 0)) + bayesplot_theme_get() + theme( axis.line.y = element_blank(), axis.title.y = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank() ) + labs(x = "Rank") } #' @rdname MCMC-traces #' @param prob For `mcmc_rank_ecdf()`, a value between 0 and 1 #' specifying the desired simultaneous confidence of the confidence bands to be #' drawn for the rank ECDF plots. #' @param plot_diff For `mcmc_rank_ecdf()`, a boolean specifying if the #' difference between the observed rank ECDFs and the theoretical expectation #' should be drawn instead of the unmodified rank ECDF plots. #' @export mcmc_rank_ecdf <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., K = NULL, facet_args = list(), prob = 0.99, plot_diff = FALSE, interpolate_adj = NULL) { check_ignored_arguments(..., ok_args = c("K", "pit", "prob", "plot_diff", "interpolate_adj", "M") ) data <- mcmc_trace_data( x, pars = pars, regex_pars = regex_pars, transformations = transformations, highlight = 1 ) n_iter <- unique(data$n_iterations) n_chain <- unique(data$n_chains) n_param <- unique(data$n_parameters) x <- if (is.null(K)) { 0:n_iter / n_iter } else { 0:K / K } gamma <- adjust_gamma( N = n_iter, L = n_chain, K = if (is.null(K)) { n_iter } else { K }, prob = prob, interpolate_adj = interpolate_adj, ... ) lims <- ecdf_intervals( gamma = gamma, N = n_iter, K = if (is.null(K)) { n_iter } else { K }, L <- n_chain ) data_lim <- data.frame( upper = lims$upper / n_iter - (plot_diff == TRUE) * x, lower = lims$lower / n_iter - (plot_diff == TRUE) * x, x = x ) data <- data %>% group_by(.data$parameter, .data$chain) %>% dplyr::group_map(~ data.frame( parameter = .y[1], chain = .y[2], ecdf_value = ecdf(.x$value_rank / (n_iter * n_chain))(x) - (plot_diff == TRUE) * x, x = x )) %>% dplyr::bind_rows() mapping <- aes( x = .data$x, y = .data$ecdf_value, color = .data$chain, group = .data$chain ) scale_color <- scale_color_manual("Chain", values = chain_colors(n_chain)) facet_call <- NULL if (n_param == 1) { facet_call <- ylab(levels(data$parameter)) } else { facet_args$facets <- vars(.data$parameter) facet_args$scales <- facet_args$scales %||% "free" facet_call <- do.call("facet_wrap", facet_args) } ggplot() + geom_step(data = data_lim, aes(x = .data$x, y = .data$upper), show.legend = FALSE) + geom_step(data = data_lim, aes(x = .data$x, y = .data$lower), show.legend = FALSE) + geom_step(mapping, data) + bayesplot_theme_get() + scale_color + facet_call + scale_x_continuous(breaks = pretty) + legend_move(ifelse(n_chain > 1, "right", "none")) + xaxis_title(FALSE) + yaxis_title(on = n_param == 1) } #' @rdname MCMC-traces #' @export mcmc_trace_data <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., highlight = NULL, n_warmup = 0, iter1 = 0) { check_ignored_arguments(...) x <- prepare_mcmc_array(x, pars, regex_pars, transformations) if (iter1 < 0) { abort("'iter1' cannot be negative.") } if (n_warmup > 0 && iter1 > 0) { abort("'n_warmup' and 'iter1' can't both be specified.") } if (!is.null(highlight)) { stopifnot(length(highlight) == 1) if (!has_multiple_chains(x)){ STOP_need_multiple_chains() } if (!highlight %in% seq_len(ncol(x))) { abort(paste0( "'highlight' is ", highlight, ", but 'x' contains ", ncol(x), " chains." )) } } data <- melt_mcmc(x) data$Chain <- factor(data$Chain) data$n_chains <- num_chains(data) data$n_iterations <- num_iters(data) data$n_parameters <- num_params(data) data <- rlang::set_names(data, tolower) first_cols <- syms(c("parameter", "value", "value_rank")) data <- data %>% group_by(.data$parameter) %>% mutate( value_rank = rank(.data$value, ties.method = "average") ) %>% ungroup() %>% select(!!! first_cols, tidyselect::everything()) data$highlight <- if (!is.null(highlight)) { data$chain == highlight } else { FALSE } data$warmup <- data$iteration <= n_warmup data$iteration <- data$iteration + as.integer(iter1) tibble::as_tibble(data) } # internal ----------------------------------------------------------------- .mcmc_trace <- function(x, pars = character(), regex_pars = character(), transformations = list(), n_warmup = 0, window = NULL, size = NULL, facet_args = list(), highlight = NULL, style = c("line", "point"), alpha = 0.2, np = NULL, np_style = trace_style_np(), iter1 = 0, ...) { style <- match.arg(style) data <- mcmc_trace_data( x, pars = pars, regex_pars = regex_pars, transformations = transformations, highlight = highlight, n_warmup = n_warmup, iter1 = iter1 ) n_iter <- unique(data$n_iterations) n_chain <- unique(data$n_chains) n_param <- unique(data$n_parameters) mapping <- aes( x = .data$iteration, y = .data$value, color = .data$chain ) if (!is.null(highlight)) { mapping <- modify_aes( mapping, alpha = .data$highlight, color = .data$highlight ) } layer_warmup <- if (n_warmup > 0) { layer_warmup <- annotate( "rect", xmin = -Inf, xmax = n_warmup, ymin = -Inf, ymax = Inf, linewidth = 1, color = "gray88", fill = "gray88", alpha = 0.5 ) } else { NULL } geom_args <- list() if (style == "line") { geom_args$linewidth = size %||% 1 / 3 } else { geom_args$size = size %||% 1 } layer_draws <- do.call(paste0("geom_", style), geom_args) coord_window <- if (!is.null(window)) { stopifnot(length(window) == 2) coord_cartesian(xlim = window) } else { NULL } scale_alpha <- NULL scale_color <- NULL div_rug <- NULL div_guides <- NULL if (!is.null(highlight)) { ## scale_alpha_discrete() warns on default scale_alpha <- scale_alpha_ordinal(range = c(alpha, 1), guide = "none") scale_color <- scale_color_manual( "", values = get_color(c("lh", "d")), labels = c("Other chains", paste("Chain", highlight))) } else { scale_color <- scale_color_manual("Chain", values = chain_colors(n_chain)) if (!is.null(np)) { div_rug <- divergence_rug(np, np_style, n_iter, n_chain) if (!is.null(div_rug)) { div_guides <- guides( color = guide_legend(order = 1), linetype = guide_legend( order = 2, title = NULL, keywidth = rel(1/2), override.aes = list(size = rel(1/2))) ) } } } facet_call <- NULL if (n_param == 1) { facet_call <- ylab(levels(data$parameter)) } else { facet_args$facets <- vars(.data$parameter) facet_args$scales <- facet_args$scales %||% "free" facet_call <- do.call("facet_wrap", facet_args) } ggplot(data, mapping) + bayesplot_theme_get() + layer_warmup + layer_draws + coord_window + scale_alpha + scale_color + div_rug + div_guides + facet_call + scale_x_continuous(breaks = pretty) + legend_move(ifelse(n_chain > 1, "right", "none")) + xaxis_title(FALSE) + yaxis_title(on = n_param == 1) } chain_colors <- function(n) { all_clrs <- unlist(color_scheme_get()) clrs <- switch( as.character(n), "1" = get_color("m"), "2" = get_color(c("l", "d")), "3" = get_color(c("l", "m", "d")), "4" = all_clrs[-c(2, 4)], "5" = all_clrs[-3], "6" = all_clrs, rep_len(all_clrs, n) ) unname(rev(clrs)) } #' Add divergences to trace plot using geom_rug #' #' @noRd #' @param np User's `np` argument, if specified. #' @param np_style User's `np_style` argument, if specified. #' @param n_iter Number of iterations in the trace plot (to check against number #' of iterations provided in `np`). #' @param n_chain Number of chains in the trace plot (to check against number of #' chains provided in `np`). #' @return Object returned by `ggplot2::geom_rug()`. #' #' @importFrom dplyr summarise group_by select divergence_rug <- function(np, np_style, n_iter, n_chain) { if (is.data.frame(np)) { np <- validate_nuts_data_frame(np) stopifnot(num_iters(np) == n_iter, num_chains(np) == n_chain) iter <- sym("Iteration") val <- sym("Value") param <- sym("Parameter") divg <- sym("Divergent") div_info <- np %>% dplyr::filter(UQ(param) == "divergent__") %>% group_by(!! iter) %>% summarise( Divergent = ifelse(sum(!! val) > 0, !! iter, NA) ) %>% select(!! divg) } else { # not using a data frame is deprecated but maintain backwards # compatibility for now divergences <- np stopifnot( is_vector_or_1Darray(divergences), length(divergences) == n_iter, all(divergences %in% c(0, 1)) ) divergences <- ifelse(divergences == 1, seq_along(divergences), NA) div_info <- data.frame(Divergent = divergences) } if (all(is.na(div_info$Divergent))) { inform("No divergences to plot.") return(NULL) } geom_rug( aes(x = .data$Divergent, linetype = "Divergence"), data = div_info, na.rm = TRUE, inherit.aes = FALSE, sides = "b", color = np_style$color[["div"]], linewidth = np_style$size[["div"]], alpha = np_style$alpha[["div"]] ) } bayesplot/R/mcmc-distributions.R0000644000176200001440000003124114556270424016431 0ustar liggesusers#' Histograms and kernel density plots of MCMC draws #' #' Various types of histograms and kernel density plots of MCMC draws. See the #' **Plot Descriptions** section, below, for details. #' #' @name MCMC-distributions #' @family MCMC #' #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-transformations #' @template args-facet_args #' @template args-density-controls #' @param ... Currently ignored. #' @param alpha Passed to the geom to control the transparency. #' #' @template return-ggplot #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_hist()`}{ #' Histograms of posterior draws with all chains merged. #' } #' \item{`mcmc_dens()`}{ #' Kernel density plots of posterior draws with all chains merged. #' } #' \item{`mcmc_hist_by_chain()`}{ #' Histograms of posterior draws with chains separated via faceting. #' } #' \item{`mcmc_dens_overlay()`}{ #' Kernel density plots of posterior draws with chains separated but #' overlaid on a single plot. #' } #' \item{`mcmc_violin()`}{ #' The density estimate of each chain is plotted as a violin with #' horizontal lines at notable quantiles. #' } #' \item{`mcmc_dens_chains()`}{ #' Ridgeline kernel density plots of posterior draws with chains separated #' but overlaid on a single plot. In `mcmc_dens_overlay()` parameters #' appear in separate facets; in `mcmc_dens_chains()` they appear in the #' same panel and can overlap vertically. #' } #' } #' #' @examples #' set.seed(9262017) #' # some parameter draws to use for demonstration #' x <- example_mcmc_draws() #' dim(x) #' dimnames(x) #' #' ################## #' ### Histograms ### #' ################## #' #' # histograms of all parameters #' color_scheme_set("brightblue") #' mcmc_hist(x) #' #' # histograms of some parameters #' color_scheme_set("pink") #' mcmc_hist(x, pars = c("alpha", "beta[2]")) #' \donttest{ #' mcmc_hist(x, pars = "sigma", regex_pars = "beta") #' } #' # example of using 'transformations' argument to plot log(sigma), #' # and parsing facet labels (e.g. to get greek letters for parameters) #' mcmc_hist(x, transformations = list(sigma = "log"), #' facet_args = list(labeller = ggplot2::label_parsed)) + #' facet_text(size = 15) #' \donttest{ #' # instead of list(sigma = "log"), you could specify the transformation as #' # list(sigma = log) or list(sigma = function(x) log(x)), but then the #' # label for the transformed sigma is 't(sigma)' instead of 'log(sigma)' #' mcmc_hist(x, transformations = list(sigma = log)) #' #' # separate histograms by chain #' color_scheme_set("pink") #' mcmc_hist_by_chain(x, regex_pars = "beta") #' } #' #' ################# #' ### Densities ### #' ################# #' #' mcmc_dens(x, pars = c("sigma", "beta[2]"), #' facet_args = list(nrow = 2)) #' \donttest{ #' # separate and overlay chains #' color_scheme_set("mix-teal-pink") #' mcmc_dens_overlay(x, pars = c("sigma", "beta[2]"), #' facet_args = list(nrow = 2)) + #' facet_text(size = 14) #' x2 <- example_mcmc_draws(params = 6) #' mcmc_dens_chains(x2, pars = c("beta[1]", "beta[2]", "beta[3]")) #' } #' # separate chains as violin plots #' color_scheme_set("green") #' mcmc_violin(x) + panel_bg(color = "gray20", size = 2, fill = "gray30") #' NULL #' @rdname MCMC-distributions #' @export #' @template args-hist #' @template args-hist-freq #' mcmc_hist <- function( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE, alpha = 1 ) { check_ignored_arguments(...) .mcmc_hist( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, binwidth = binwidth, bins = bins, breaks = breaks, by_chain = FALSE, freq = freq, alpha = alpha, ... ) } #' @rdname MCMC-distributions #' @export mcmc_dens <- function( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), trim = FALSE, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL, alpha = 1 ) { check_ignored_arguments(...) .mcmc_dens( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, by_chain = FALSE, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens, alpha = alpha, ... ) } #' @rdname MCMC-distributions #' @export #' mcmc_hist_by_chain <- function( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), binwidth = NULL, bins = NULL, freq = TRUE, alpha = 1 ) { check_ignored_arguments(...) .mcmc_hist( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, binwidth = binwidth, bins = bins, by_chain = TRUE, freq = freq, alpha = alpha, ... ) } #' @rdname MCMC-distributions #' @export mcmc_dens_overlay <- function( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), color_chains = TRUE, trim = FALSE, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) { check_ignored_arguments(...) .mcmc_dens( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, by_chain = TRUE, color_chains = color_chains, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens, ... ) } #' @rdname MCMC-distributions #' @template args-density-controls #' @param color_chains Option for whether to separately color chains. #' @export mcmc_dens_chains <- function( x, pars = character(), regex_pars = character(), transformations = list(), ..., color_chains = TRUE, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) { check_ignored_arguments(...) data <- mcmc_dens_chains_data( x, pars = pars, regex_pars = regex_pars, transformations = transformations, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens ) n_chains <- length(unique(data$chain)) if (n_chains == 1) STOP_need_multiple_chains() # An empty data-frame to train legend colors line_training <- dplyr::slice(data, 0) if (color_chains) { scale_color <- scale_color_manual(values = chain_colors(n_chains)) } else { scale_color <- scale_color_manual( values = rep(get_color("m"), n_chains), guide = "none") } ggplot(data) + aes( x = .data$x, y = .data$parameter, color = .data$chain, group = interaction(.data$chain, .data$parameter) ) + geom_line(data = line_training) + ggridges::geom_density_ridges( aes(height = .data$density), stat = "identity", fill = NA, show.legend = FALSE ) + labs(color = "Chain") + scale_y_discrete( limits = unique(rev(data$parameter)), expand = c(0.05, .6) ) + scale_color + bayesplot_theme_get() + yaxis_title(FALSE) + xaxis_title(FALSE) + grid_lines_y(color = "gray90") + theme(axis.text.y = element_text(hjust = 1, vjust = 0)) } #' @rdname MCMC-distributions #' @export mcmc_dens_chains_data <- function( x, pars = character(), regex_pars = character(), transformations = list(), ..., bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) { check_ignored_arguments(...) x %>% prepare_mcmc_array( pars = pars, regex_pars = regex_pars, transformations = transformations ) %>% melt_mcmc() %>% compute_column_density( group_vars = c("Parameter", "Chain"), value_var = "Value", interval_width = 1, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens ) %>% mutate(Chain = factor(.data$Chain)) %>% rlang::set_names(tolower) %>% dplyr::as_tibble() } #' @rdname MCMC-distributions #' @inheritParams ppc_violin_grouped #' @export mcmc_violin <- function( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), probs = c(0.1, 0.5, 0.9) ) { check_ignored_arguments(...) .mcmc_dens( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, geom = "violin", probs = probs, ... ) } # internal ----------------------------------------------------------------- .mcmc_hist <- function( x, pars = character(), regex_pars = character(), transformations = list(), facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL, by_chain = FALSE, freq = TRUE, alpha = 1, ... ) { x <- prepare_mcmc_array(x, pars, regex_pars, transformations) if (by_chain && !has_multiple_chains(x)) { STOP_need_multiple_chains() } data <- melt_mcmc(x, value.name = "value") n_param <- num_params(data) graph <- ggplot(data, aes(x = ~ value)) + geom_histogram( set_hist_aes(freq), fill = get_color("mid"), color = get_color("mid_highlight"), size = .25, na.rm = TRUE, binwidth = binwidth, bins = bins, breaks = breaks, alpha = alpha ) facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" if (!by_chain) { if (n_param > 1) { facet_args[["facets"]] <- vars(.data$Parameter) graph <- graph + do.call("facet_wrap", facet_args) } } else { facet_args[["rows"]] <- vars(.data$Chain) if (n_param > 1) { facet_args[["cols"]] <- vars(.data$Parameter) } graph <- graph + do.call("facet_grid", facet_args) + force_axes_in_facets() } if (n_param == 1) { graph <- graph + xlab(levels(data$Parameter)) } graph + dont_expand_y_axis(c(0.005, 0)) + bayesplot_theme_get() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(on = n_param == 1) } .mcmc_dens <- function( x, pars = character(), regex_pars = character(), transformations = list(), facet_args = list(), by_chain = FALSE, color_chains = FALSE, geom = c("density", "violin"), probs = c(0.1, 0.5, 0.9), trim = FALSE, alpha = 1, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL, ... ) { bw <- bw %||% "nrd0" adjust <- adjust %||% 1 kernel <- kernel %||% "gaussian" n_dens <- n_dens %||% 1024 x <- prepare_mcmc_array(x, pars, regex_pars, transformations) data <- melt_mcmc.mcmc_array(x) data$Chain <- factor(data$Chain) n_param <- num_params(data) geom <- match.arg(geom) violin <- geom == "violin" geom_fun <- if (!violin) "stat_density" else "geom_violin" if (by_chain || violin) { if (!has_multiple_chains(x)) { STOP_need_multiple_chains() } else { n_chains <- num_chains(data) } } geom_args <- list(size = 0.5, na.rm = TRUE, alpha = alpha) if (violin) { geom_args[["draw_quantiles"]] <- probs } else { geom_args[["trim"]] <- trim geom_args[["bw"]] <- bw geom_args[["adjust"]] <- adjust geom_args[["kernel"]] <- kernel geom_args[["n"]] <- n_dens } if (by_chain) { # aes_mapping[["color"]] <- ~ Chain # aes_mapping[["group"]] <- ~ Chain if (violin) { aes_mapping <- aes(x = .data$Chain, y = .data$Value, color = .data$Chain, group = .data$Chain) } else { aes_mapping <- aes(x = .data$Value, color = .data$Chain, group = .data$Chain) } geom_args[["geom"]] <- "line" geom_args[["position"]] <- "identity" } else { if (violin) { aes_mapping <- aes(x = .data$Chain, y = .data$Value) } else { aes_mapping <- aes(x = .data$Value) } geom_args[["fill"]] <- get_color("mid") geom_args[["color"]] <- get_color("mid_highlight") } graph <- ggplot(data, mapping = aes_mapping) + do.call(geom_fun, geom_args) if (!violin) { graph <- graph + dont_expand_x_axis() } if (by_chain) { if (color_chains) { scale_color <- scale_color_manual(values = chain_colors(n_chains)) } else { scale_color <- scale_color_manual( values = rep(get_color("m"), n_chains), guide = "none") } graph <- graph + scale_color } if (n_param == 1) { graph <- graph + labs(x = if (violin) "Chain" else levels(data$Parameter), y = if (violin) levels(data$Parameter) else NULL) } else { facet_args[["facets"]] <- vars(.data$Parameter) facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" graph <- graph + do.call("facet_wrap", facet_args) } graph + dont_expand_y_axis(c(0.005, 0)) + bayesplot_theme_get() + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(on = n_param == 1 && violin) + xaxis_title(on = n_param == 1) } bayesplot/R/bayesplot-package.R0000644000176200001440000001002414335264324016176 0ustar liggesusers#' **bayesplot**: Plotting for Bayesian Models #' #' @docType package #' @name bayesplot-package #' @aliases bayesplot #' #' @import ggplot2 stats rlang #' @importFrom dplyr %>% summarise group_by select #' #' @description #' \if{html}{ #' \figure{stanlogo.png}{options: width="50" alt="mc-stan.org"} #' } #' *Stan Development Team* #' #' The **bayesplot** package provides a variety of **ggplot2**-based #' plotting functions for use after fitting Bayesian models (typically, though #' not exclusively, via Markov chain Monte Carlo). The package is designed not #' only to provide convenient functionality for users, but also a common set of #' functions that can be easily used by developers working on a variety of #' packages for Bayesian modeling, particularly (but not necessarily) packages #' powered by RStan (the \R interface to Stan). #' Examples of packages that will soon (or already are) using **bayesplot** are #' **rstan** itself, as well as the **rstan**-dependent **rstanarm** and #' **brms** packages for applied regression modeling. #' #' @section Plotting functionality: #' \if{html}{ #' \figure{bayesplot1.png}{options: width="30\%" alt="mcmc_areas"} #' \figure{bayesplot2.png}{options: width="30\%" alt="ppc_hist"} #' \figure{bayesplot3.png}{options: width="30\%" alt="ppc_dens_overlay"} #' } #' #' The plotting functions in **bayesplot** are organized into several modules: #' * [MCMC][MCMC-overview]: Visualizations of Markov chain #' Monte Carlo (MCMC) simulations generated by *any* MCMC algorithm #' as well as diagnostics. There are also additional functions specifically #' for use with models fit using the [No-U-Turn Sampler (NUTS)][NUTS]. #' * [PPC][PPC-overview]: Graphical (posterior or prior) predictive #' checks (PPCs). #' * [PPD][PPD-overview]: Plots of (posterior or prior) predictive #' distributions without comparisons to observed data. #' #' @section Resources: #' * __Online documentation and vignettes__: Visit the __bayesplot__ website at #' #' * __Bug reports and feature requests__: If you would like to request a new #' feature or if you have noticed a bug that needs to be fixed please let us #' know at the **bayesplot** issue tracker at #' #' * __General questions and help__: #' To ask a question about **bayesplot** on the Stan Forums forum please visit #' . #' #' @template seealso-theme #' @template seealso-colors #' @seealso [ggplot2::ggsave()] for saving plots. #' #' @template reference-vis-paper #' #' @examples #' # A few quick examples (all of the functions have many examples #' # on their individual help pages) #' #' # MCMC plots #' x <- example_mcmc_draws(params = 5) #' mcmc_intervals(x, prob = 0.5) #' mcmc_intervals(x, regex_pars = "beta") #' #' color_scheme_set("purple") #' mcmc_areas(x, regex_pars = "beta", prob = 0.8) #' #' color_scheme_set("mix-blue-red") #' mcmc_trace(x, pars = c("alpha", "sigma"), #' facet_args = list(nrow = 2)) #' #' color_scheme_set("brightblue") #' mcmc_scatter(x, pars = c("beta[1]", "sigma"), #' transformations = list(sigma = "log")) #' #' #' # Graphical PPCs #' y <- example_y_data() #' yrep <- example_yrep_draws() #' ppc_dens_overlay(y, yrep[1:50, ]) #' \donttest{ #' color_scheme_set("pink") #' ppc_stat(y, yrep, stat = "median") + grid_lines() #' ppc_hist(y, yrep[1:8, ]) #' #' # Same plots but without y (using ppd_ instead of ppc_) #' bayesplot_theme_set(ggplot2::theme_gray()) #' ypred <- yrep #' ppd_dens_overlay(ypred[1:50, ]) #' ppd_stat(ypred, stat = "median") + grid_lines() #' ppd_hist(ypred[1:8, ]) #' } #' NULL # internal ---------------------------------------------------------------- # nocov start # release reminders (for devtools) release_questions <- function() { c( "Have you reduced the size of the vignettes for CRAN?", "Have you tested with '^tests/testthat/_snaps$' removed from .Rbuildignore?", "Have you put '^tests/testthat/_snaps$' back in .Rbuildignore? before submitting?" ) } # nocov end bayesplot/R/ppc-intervals.R0000644000176200001440000002200114335264324015370 0ustar liggesusers #' PPC intervals #' #' Medians and central interval estimates of `yrep` with `y` overlaid. #' See the **Plot Descriptions** section, below. #' #' @name PPC-intervals #' @family PPCs #' #' @template args-y-yrep #' @template args-group #' @template args-facet_args #' @template args-prob-prob_outer #' @param x A numeric vector to use as the x-axis #' variable. For example, `x` could be a predictor variable from a #' regression model, a time variable for time-series models, etc. If `x` #' is missing or `NULL` then the observation index is used for the x-axis. #' @param alpha,size,fatten,linewidth Arguments passed to geoms. For ribbon #' plots `alpha` is passed to [ggplot2::geom_ribbon()] to control the opacity #' of the outer ribbon and `size` is passed to [ggplot2::geom_line()] to #' control the size of the line representing the median prediction (`size=0` #' will remove the line). For interval plots `alpha`, `size`, `fatten`, and #' `linewidth` are passed to [ggplot2::geom_pointrange()] (`fatten=0` will #' remove the point estimates). #' @param ... Currently unused. #' #' @template return-ggplot-or-data #' #' @template reference-vis-paper #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_intervals(), ppc_ribbon()`}{ #' `100*prob`% central intervals for `yrep` at each `x` #' value. `ppc_intervals()` plots intervals as vertical bars with points #' indicating `yrep` medians and darker points indicating observed #' `y` values. `ppc_ribbon()` plots a ribbon of connected intervals #' with a line through the median of `yrep` and a darker line connecting #' observed `y` values. In both cases an optional `x` variable can #' also be specified for the x-axis variable. #' #' Depending on the number of observations and the variability in the #' predictions at different values of `x`, one of these plots may be easier #' to read than the other. #' } #' \item{`ppc_intervals_grouped(), ppc_ribbon_grouped()`}{ #' Same as `ppc_intervals()` and `ppc_ribbon()`, respectively, but a #' separate plot (facet) is generated for each level of a grouping variable. #' } #' } #' #' @examples #' y <- rnorm(50) #' yrep <- matrix(rnorm(5000, 0, 2), ncol = 50) #' #' color_scheme_set("brightblue") #' ppc_intervals(y, yrep) #' ppc_ribbon(y, yrep) #' ppc_ribbon(y, yrep, y_draw = "points") #' \dontrun{ #' ppc_ribbon(y, yrep, y_draw = "both") #' } #' #' ppc_intervals(y, yrep, size = 1.5, fatten = 0) # remove the yrep point estimates #' #' color_scheme_set("teal") #' year <- 1950:1999 #' ppc_intervals(y, yrep, x = year, fatten = 1) + ggplot2::xlab("Year") #' ppc_ribbon(y, yrep, x = year) + ggplot2::xlab("Year") #' #' color_scheme_set("pink") #' year <- rep(2000:2009, each = 5) #' group <- gl(5, 1, length = 50, labels = LETTERS[1:5]) #' ppc_ribbon_grouped(y, yrep, x = year, group, y_draw = "both") + #' ggplot2::scale_x_continuous(breaks = pretty) #' #' ppc_ribbon_grouped(y, yrep, x = year, group, #' facet_args = list(scales = "fixed")) + #' xaxis_text(FALSE) + #' xaxis_ticks(FALSE) + #' panel_bg(fill = "gray20") #' #' # get the data frames used to make the ggplots #' ppc_dat <- ppc_intervals_data(y, yrep, x = year, prob = 0.5) #' ppc_group_dat <- ppc_intervals_data(y, yrep, x = year, group = group, prob = 0.5) #' #' \dontrun{ #' library("rstanarm") #' fit <- stan_glmer(mpg ~ wt + (1|cyl), data = mtcars, refresh = 0) #' yrep <- posterior_predict(fit) #' #' color_scheme_set("purple") #' ppc_intervals(y = mtcars$mpg, yrep = yrep, x = mtcars$wt, prob = 0.8) + #' panel_bg(fill="gray90", color = NA) + #' grid_lines(color = "white") #' #' ppc_ribbon(y = mtcars$mpg, yrep = yrep, x = mtcars$wt, #' prob = 0.6, prob_outer = 0.8) #' #' ppc_ribbon_grouped(y = mtcars$mpg, yrep = yrep, x = mtcars$wt, #' group = mtcars$cyl) #' #' #' color_scheme_set("gray") #' ppc_intervals(mtcars$mpg, yrep, prob = 0.5) + #' ggplot2::scale_x_continuous( #' labels = rownames(mtcars), #' breaks = 1:nrow(mtcars) #' ) + #' xaxis_text(angle = -70, vjust = 1, hjust = 0) + #' xaxis_title(FALSE) #' #' } #' #' NULL #' @rdname PPC-intervals #' @export ppc_intervals <- function(y, yrep, x = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 1, fatten = 2.5, linewidth = 1) { dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppc_intervals_data( y = y, yrep = yrep, x = x, group = dots$group, prob = prob, prob_outer = prob_outer ) ggplot(data) + intervals_inner_aes( needs_y = TRUE, color = "yrep", fill = "yrep" ) + geom_linerange( mapping = intervals_outer_aes(color = "yrep"), alpha = alpha, size = size, linewidth = linewidth ) + geom_pointrange( shape = 21, stroke = 0.5, size = size, fatten = fatten, linewidth = linewidth ) + geom_point( mapping = aes( y = .data$y_obs, color = "y", fill = "y" ), shape = 21, stroke = 0.5, size = 1 ) + scale_color_ppc() + scale_fill_ppc() + intervals_axis_labels(has_x = !is.null(x)) + bayesplot_theme_get() } #' @rdname PPC-intervals #' @export ppc_intervals_grouped <- function(y, yrep, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 1, fatten = 2.5, linewidth = 1) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppc_intervals", call), parent.frame()) g + intervals_group_facets(facet_args) + force_axes_in_facets() } #' @rdname PPC-intervals #' @export #' @param y_draw For ribbon plots only, a string specifying how to draw `y`. Can #' be `"line"` (the default), `"points"`, or `"both"`. ppc_ribbon <- function(y, yrep, x = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25, y_draw = c("line", "points", "both")) { y_draw <- match.arg(y_draw) dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppc_intervals_data( y = y, yrep = yrep, x = x, group = dots$group, prob = prob, prob_outer = prob_outer ) g <- ggplot(data) + intervals_inner_aes(fill = "yrep", color = "yrep") + geom_ribbon( mapping = intervals_outer_aes(fill = "yrep", color = "yrep"), color = NA, linewidth = 0.2 * size, alpha = alpha ) + geom_ribbon( mapping = intervals_outer_aes(), fill = NA, color = get_color("m"), linewidth = 0.2 * size, alpha = 1 ) + geom_ribbon(linewidth = 0.5 * size) + geom_line( mapping = aes(y = .data$m), color = get_color("m"), linewidth = size ) + geom_blank(aes(fill = "y")) if (y_draw == "line" || y_draw == "both") { g <- g + geom_line( aes(y = .data$y_obs, color = "y"), linewidth = 0.5 ) } if (y_draw == "points" || y_draw == "both") { g <- g + geom_point( mapping = aes(y = .data$y_obs, color = "y", fill = "y"), shape = 21, size = 1.5 ) } g + scale_color_ppc() + scale_fill_ppc(values = c(NA, get_color("l")), na.value = NA) + intervals_axis_labels(has_x = !is.null(x)) + bayesplot_theme_get() } #' @export #' @rdname PPC-intervals ppc_ribbon_grouped <- function(y, yrep, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25, y_draw = c("line", "points", "both")) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppc_ribbon", call), parent.frame()) g + intervals_group_facets(facet_args) + force_axes_in_facets() } #' @rdname PPC-intervals #' @export ppc_intervals_data <- function(y, yrep, x = NULL, group = NULL, ..., prob = 0.5, prob_outer = 0.9) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) x <- validate_x(x, y) if (!is.null(group)) { group <- validate_group(group, length(y)) } .ppd_intervals_data( predictions = yrep, y = y, x = x, group = group, prob = prob, prob_outer = prob_outer ) } #' @rdname PPC-intervals #' @export ppc_ribbon_data <- ppc_intervals_data bayesplot/R/ppc-distributions.R0000644000176200001440000005176614560773547016323 0ustar liggesusers#' PPC distributions #' #' Compare the empirical distribution of the data `y` to the distributions of #' simulated/replicated data `yrep` from the posterior predictive distribution. #' See the **Plot Descriptions** section, below, for details. #' #' @name PPC-distributions #' @family PPCs #' #' @template args-y-yrep #' @template args-group #' @template args-hist #' @template args-hist-freq #' @template args-dens #' @template args-pit-ecdf #' @param size,alpha Passed to the appropriate geom to control the appearance of #' the predictive distributions. #' @param ... Currently unused. #' #' @template details-binomial #' @template return-ggplot-or-data #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_hist(), ppc_freqpoly(), ppc_dens(), ppc_boxplot()`}{ #' A separate histogram, shaded frequency polygon, smoothed kernel density #' estimate, or box and whiskers plot is displayed for `y` and each #' dataset (row) in `yrep`. For these plots `yrep` should therefore #' contain only a small number of rows. See the **Examples** section. #' } #' \item{`ppc_freqpoly_grouped()`}{ #' A separate frequency polygon is plotted for each level of a grouping #' variable for `y` and each dataset (row) in `yrep`. For this plot #' `yrep` should therefore contain only a small number of rows. See the #' **Examples** section. #' } #' \item{`ppc_ecdf_overlay(), ppc_dens_overlay(), #' ppc_ecdf_overlay_grouped(), ppc_dens_overlay_grouped()`}{ #' Kernel density or empirical CDF estimates of each dataset (row) in #' `yrep` are overlaid, with the distribution of `y` itself on top #' (and in a darker shade). When using `ppc_ecdf_overlay()` with discrete #' data, set the `discrete` argument to `TRUE` for better results. #' For an example of `ppc_dens_overlay()` also see Gabry et al. (2019). #' } #' \item{`ppc_violin_grouped()`}{ #' The density estimate of `yrep` within each level of a grouping #' variable is plotted as a violin with horizontal lines at notable #' quantiles. `y` is overlaid on the plot either as a violin, points, or #' both, depending on the `y_draw` argument. #' } #' \item{`ppc_pit_ecdf()`, `ppc_pit_ecdf_grouped()`}{ #' The PIT-ECDF of the empirical PIT values of `y` computed with respect to #' the corresponding `yrep` values. `100 * prob`% central simultaneous #' confidence intervals are provided to asses if `y` and `yrep` originate #' from the same distribution. The PIT values can also be provided directly #' as `pit`. #' See Säilynoja et al. (2021) for more details.} #' } #' #' @template reference-vis-paper #' @template reference-uniformity-test #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' #' @examples #' color_scheme_set("brightblue") #' y <- example_y_data() #' yrep <- example_yrep_draws() #' group <- example_group_data() #' dim(yrep) #' #' ppc_dens_overlay(y, yrep[1:25, ]) #' \donttest{ #' # ppc_ecdf_overlay with continuous data (set discrete=TRUE if discrete data) #' ppc_ecdf_overlay(y, yrep[sample(nrow(yrep), 25), ]) #' #' # PIT-ECDF and PIT-ECDF difference plot of the PIT values of y compared to #' # yrep with 99% simultaneous confidence bands. #' ppc_pit_ecdf(y, yrep, prob = 0.99, plot_diff = FALSE) #' ppc_pit_ecdf(y, yrep, prob = 0.99, plot_diff = TRUE) #' } #' #' # for ppc_hist,dens,freqpoly,boxplot definitely use a subset yrep rows so #' # only a few (instead of nrow(yrep)) histograms are plotted #' ppc_hist(y, yrep[1:8, ]) #' \donttest{ #' color_scheme_set("red") #' ppc_boxplot(y, yrep[1:8, ]) #' #' # wizard hat plot #' color_scheme_set("blue") #' ppc_dens(y, yrep[200:202, ]) #' } #' #' \donttest{ #' # frequency polygons #' ppc_freqpoly(y, yrep[1:3, ], alpha = 0.1, size = 1, binwidth = 5) #' #' ppc_freqpoly_grouped(y, yrep[1:3, ], group) + yaxis_text() #' #' # if groups are different sizes then the 'freq' argument can be useful #' ppc_freqpoly_grouped(y, yrep[1:3, ], group, freq = FALSE) + yaxis_text() #' } #' #' # density and distribution overlays by group #' ppc_dens_overlay_grouped(y, yrep[1:25, ], group = group) #' #' ppc_ecdf_overlay_grouped(y, yrep[1:25, ], group = group) #' #' \donttest{ #' # PIT-ECDF plots of the PIT values by group #' # with 99% simultaneous confidence bands. #' ppc_pit_ecdf_grouped(y, yrep, group=group, prob=0.99) #' } #' #' \donttest{ #' # don't need to only use small number of rows for ppc_violin_grouped #' # (as it pools yrep draws within groups) #' color_scheme_set("gray") #' ppc_violin_grouped(y, yrep, group, size = 1.5) #' ppc_violin_grouped(y, yrep, group, alpha = 0) #' #' # change how y is drawn #' ppc_violin_grouped(y, yrep, group, alpha = 0, y_draw = "points", y_size = 1.5) #' ppc_violin_grouped(y, yrep, group, #' alpha = 0, y_draw = "both", #' y_size = 1.5, y_alpha = 0.5, y_jitter = 0.33 #' ) #' } NULL #' @rdname PPC-distributions #' @export ppc_data <- function(y, yrep, group = NULL) { y <- validate_y(y) N <- length(y) yrep <- validate_predictions(yrep, N) if (!is.null(group)) { group <- validate_group(group, N) } # see R/ppd-distributions.R .ppd_data(predictions = yrep, y = y, group = group) } #' @rdname PPC-distributions #' @export #' @template args-density-controls ppc_dens_overlay <- function(y, yrep, ..., size = 0.25, alpha = 0.7, trim = FALSE, bw = "nrd0", adjust = 1, kernel = "gaussian", n_dens = 1024) { check_ignored_arguments(...) data <- ppc_data(y, yrep) ggplot(data, mapping = aes(x = .data$value)) + overlay_ppd_densities( mapping = aes(group = .data$rep_id, color = "yrep"), data = function(x) dplyr::filter(x, !.data$is_y), linewidth = size, alpha = alpha, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n = n_dens ) + overlay_ppd_densities( mapping = aes(color = "y"), data = function(x) dplyr::filter(x, .data$is_y), lineend = "round", linewidth = 1, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n = n_dens ) + scale_color_ppc() + bayesplot_theme_get() + dont_expand_axes() + yaxis_title(FALSE) + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) } #' @rdname PPC-distributions #' @export #' @template args-density-controls ppc_dens_overlay_grouped <- function(y, yrep, group, ..., size = 0.25, alpha = 0.7, trim = FALSE, bw = "nrd0", adjust = 1, kernel = "gaussian", n_dens = 1024) { check_ignored_arguments(...) p_overlay <- ppc_dens_overlay( y = y, yrep = yrep, ..., size = size, alpha = alpha, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens ) # Use + list(data) trick to replace the data in the plot. The layer-specific # data in the y and yrep layers should be safe because they are # specified using a function on the main plot data. data <- ppc_data(y, yrep, group = group) p_overlay <- p_overlay + list(data) p_overlay + facet_wrap("group") + force_axes_in_facets() } #' @export #' @rdname PPC-distributions #' @param discrete For `ppc_ecdf_overlay()`, should the data be treated as #' discrete? The default is `FALSE`, in which case `geom="line"` is #' passed to [ggplot2::stat_ecdf()]. If `discrete` is set to #' `TRUE` then `geom="step"` is used. #' @param pad A logical scalar passed to [ggplot2::stat_ecdf()]. #' ppc_ecdf_overlay <- function(y, yrep, ..., discrete = FALSE, pad = TRUE, size = 0.25, alpha = 0.7) { check_ignored_arguments(...) data <- ppc_data(y, yrep) ggplot(data) + aes(x = .data$value) + hline_at( 0.5, linewidth = 0.1, linetype = 2, color = get_color("dh") ) + hline_at( c(0, 1), linewidth = 0.2, linetype = 2, color = get_color("dh") ) + stat_ecdf( data = function(x) dplyr::filter(x, !.data$is_y), mapping = aes(group = .data$rep_id, color = "yrep"), geom = if (discrete) "step" else "line", linewidth = size, alpha = alpha, pad = pad ) + stat_ecdf( data = function(x) dplyr::filter(x, .data$is_y), mapping = aes(color = "y"), geom = if (discrete) "step" else "line", linewidth = 1, pad = pad ) + scale_color_ppc() + scale_y_continuous(breaks = c(0, 0.5, 1)) + bayesplot_theme_get() + yaxis_title(FALSE) + xaxis_title(FALSE) } #' @export #' @rdname PPC-distributions ppc_ecdf_overlay_grouped <- function(y, yrep, group, ..., discrete = FALSE, pad = TRUE, size = 0.25, alpha = 0.7) { check_ignored_arguments(...) p_overlay <- ppc_ecdf_overlay( y = y, yrep = yrep, ..., discrete = discrete, pad = pad, size = size, alpha = alpha ) # Use + list(data) trick to replace the data in the plot data <- ppc_data(y, yrep, group = group) p_overlay <- p_overlay + list(data) p_overlay + facet_wrap("group") + force_axes_in_facets() } #' @rdname PPC-distributions #' @export ppc_dens <- function(y, yrep, ..., trim = FALSE, size = 0.5, alpha = 1) { check_ignored_arguments(...) data <- ppc_data(y, yrep) ggplot(data, mapping = aes( x = .data$value, fill = .data$is_y_label, color = .data$is_y_label )) + geom_density( linewidth = size, alpha = alpha, trim = trim ) + scale_fill_ppc() + scale_color_ppc() + bayesplot_theme_get() + facet_wrap_parsed("rep_label") + force_axes_in_facets() + dont_expand_y_axis() + space_legend_keys() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(FALSE) + facet_text(FALSE) + facet_bg(FALSE) } #' @rdname PPC-distributions #' @export ppc_hist <- function(y, yrep, ..., binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE) { check_ignored_arguments(...) data <- ppc_data(y, yrep) ggplot(data, mapping = set_hist_aes( freq = freq, fill = !!quote(is_y_label), color = !!quote(is_y_label) )) + geom_histogram( linewidth = 0.25, binwidth = binwidth, bins = bins, breaks = breaks ) + scale_fill_ppc() + scale_color_ppc() + facet_wrap_parsed("rep_label") + force_axes_in_facets() + dont_expand_y_axis() + bayesplot_theme_get() + space_legend_keys() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(FALSE) + facet_text(FALSE) + facet_bg(FALSE) } #' @rdname PPC-distributions #' @export ppc_freqpoly <- function(y, yrep, ..., binwidth = NULL, bins = NULL, freq = TRUE, size = 0.5, alpha = 1) { dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppc_data(y, yrep, group = dots$group) ggplot(data, mapping = set_hist_aes( freq = freq, fill = !!quote(is_y_label), color = !!quote(is_y_label) )) + geom_area( stat = "bin", binwidth = binwidth, bins = bins, linewidth = size, alpha = alpha ) + scale_fill_ppc() + scale_color_ppc() + facet_wrap_parsed("rep_label") + bayesplot_theme_get() + force_axes_in_facets() + dont_expand_y_axis() + space_legend_keys() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(FALSE) + facet_text(FALSE) } #' @rdname PPC-distributions #' @export ppc_freqpoly_grouped <- function(y, yrep, group, ..., binwidth = NULL, bins = NULL, freq = TRUE, size = 0.5, alpha = 1) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppc_freqpoly", call), parent.frame()) g + facet_grid( rep_label ~ group, scales = "free", labeller = label_parsed ) + force_axes_in_facets() + facet_text() + theme(strip.text.y = element_blank()) } #' @rdname PPC-distributions #' @export #' @param notch For the box plot, a logical scalar passed to #' [ggplot2::geom_boxplot()]. Note: unlike `geom_boxplot()`, the default is #' `notch=TRUE`. #' ppc_boxplot <- function(y, yrep, ..., notch = TRUE, size = 0.5, alpha = 1) { check_ignored_arguments(...) data <- ppc_data(y, yrep) ggplot(data, mapping = aes( x = .data$rep_label, y = .data$value, fill = .data$is_y_label, color = .data$is_y_label )) + geom_boxplot( notch = notch, linewidth = size, alpha = alpha, outlier.alpha = 2 / 3, outlier.size = 1 ) + scale_x_discrete(labels = function(x) parse(text = x)) + scale_fill_ppc() + scale_color_ppc() + bayesplot_theme_get() + yaxis_title(FALSE) + xaxis_ticks(FALSE) + xaxis_text(FALSE) + xaxis_title(FALSE) } #' @rdname PPC-distributions #' @export #' @param probs A numeric vector passed to [ggplot2::geom_violin()]'s #' `draw_quantiles` argument to specify at which quantiles to draw #' horizontal lines. Set to `NULL` to remove the lines. #' @param y_draw For `ppc_violin_grouped()`, a string specifying how to draw #' `y`: `"violin"` (default), `"points"` (jittered points), or `"both"`. #' @param y_jitter,y_size,y_alpha For `ppc_violin_grouped()`, if `y_draw` is #' `"points"` or `"both"` then `y_size`, `y_alpha`, and `y_jitter` are passed #' to to the `size`, `alpha`, and `width` arguments of [ggplot2::geom_jitter()] #' to control the appearance of `y` points. The default of `y_jitter=NULL` #' will let **ggplot2** determine the amount of jitter. #' ppc_violin_grouped <- function(y, yrep, group, ..., probs = c(0.1, 0.5, 0.9), size = 1, alpha = 1, y_draw = c("violin", "points", "both"), y_size = 1, y_alpha = 1, y_jitter = 0.1) { check_ignored_arguments(...) y_draw <- match.arg(y_draw) y_violin <- y_draw %in% c("violin", "both") y_points <- y_draw %in% c("points", "both") args_violin_yrep <- list( data = function(x) dplyr::filter(x, !.data$is_y), aes(fill = "yrep", color = "yrep"), draw_quantiles = probs, alpha = alpha, linewidth = size ) args_violin_y <- list( data = function(x) dplyr::filter(x, .data$is_y), aes(fill = "y", color = "y"), show.legend = FALSE, alpha = 0 ) args_jitter_y <- list( data = function(x) dplyr::filter(x, .data$is_y), aes(fill = "y", color = "y"), shape = 21, alpha = y_alpha, size = y_size, width = y_jitter, height = 0, show.legend = FALSE ) violin_y_func <- if (y_violin) geom_violin else geom_ignore jitter_y_func <- if (y_points) geom_jitter else geom_ignore layer_violin_yrep <- do.call(geom_violin, args_violin_yrep) layer_violin_y <- do.call(violin_y_func, args_violin_y) layer_jitter_y <- do.call(jitter_y_func, args_jitter_y) data <- ppc_data(y, yrep, group) ggplot(data, mapping = aes(x = .data$group, y = .data$value)) + layer_violin_yrep + layer_violin_y + layer_jitter_y + scale_fill_ppc(values = c(NA, get_color("l"))) + scale_color_ppc() + yaxis_title(FALSE) + xaxis_title(FALSE) + bayesplot_theme_get() } #' @export #' @param pit An optional vector of probability integral transformed values for #' which the ECDF is to be drawn. If NULL, PIT values are computed to `y` with #' respect to the corresponding values in `yrep`. #' @rdname PPC-distributions #' ppc_pit_ecdf <- function(y, yrep, ..., pit = NULL, K = NULL, prob = .99, plot_diff = FALSE, interpolate_adj = NULL) { check_ignored_arguments(..., ok_args = c("K", "pit", "prob", "plot_diff", "interpolate_adj") ) if (is.null(pit)) { pit <- ppc_data(y, yrep) %>% group_by(.data$y_id) %>% dplyr::group_map( ~ mean(.x$value[.x$is_y] > .x$value[!.x$is_y]) + runif(1, max = mean(.x$value[.x$is_y] == .x$value[!.x$is_y])) ) %>% unlist() if (is.null(K)) { K <- min(nrow(yrep) + 1, 1000) } } else { inform("'pit' specified so ignoring 'y', and 'yrep' if specified.") pit <- validate_pit(pit) if (is.null(K)) { K <- length(pit) } } N <- length(pit) gamma <- adjust_gamma( N = N, K = K, prob = prob, interpolate_adj = interpolate_adj ) lims <- ecdf_intervals(gamma = gamma, N = N, K = K) ggplot() + aes( x = seq(0,1,length.out = K), y = ecdf(pit)(seq(0, 1, length.out = K)) - (plot_diff == TRUE) * seq(0, 1, length.out = K), color = "y" ) + geom_step(show.legend = FALSE) + geom_step(aes( y = lims$upper[-1] / N - (plot_diff == TRUE) * seq(0, 1, length.out = K), color = "yrep" ), linetype = 2, show.legend = FALSE) + geom_step(aes( y = lims$lower[-1] / N - (plot_diff == TRUE) * seq(0, 1, length.out = K), color = "yrep" ), linetype = 2, show.legend = FALSE) + labs(y = ifelse(plot_diff,"ECDF - difference","ECDF"), x = "PIT") + yaxis_ticks(FALSE) + scale_color_ppc() + bayesplot_theme_get() } #' @export #' @rdname PPC-distributions #' ppc_pit_ecdf_grouped <- function(y, yrep, group, ..., K = NULL, pit = NULL, prob = .99, plot_diff = FALSE, interpolate_adj = NULL) { check_ignored_arguments(..., ok_args = c("K", "pit", "prob", "plot_diff", "interpolate_adj") ) if (is.null(pit)) { pit <- ppc_data(y, yrep, group) %>% group_by(.data$y_id) %>% dplyr::group_map( ~ mean(.x$value[.x$is_y] > .x$value[!.x$is_y]) + runif(1, max = mean(.x$value[.x$is_y] == .x$value[!.x$is_y])) ) %>% unlist() if (is.null(K)) { K <- min(nrow(yrep) + 1, 1000) } } else { inform("'pit' specified so ignoring 'y' and 'yrep' if specified.") pit <- validate_pit(pit) } N <- length(pit) gammas <- lapply(unique(group), function(g) { N_g <- sum(group == g) adjust_gamma( N = N_g, K = ifelse(is.null(K), N_g, K), prob = prob, interpolate_adj = interpolate_adj ) }) names(gammas) <- unique(group) data <- data.frame(pit = pit, group = group) %>% group_by(group) %>% dplyr::group_map( ~ data.frame( ecdf_value = ecdf(.x$pit)(seq(0, 1, length.out = ifelse(is.null(K), nrow(.x), K))), group = .y[1], lims_upper = ecdf_intervals( gamma = gammas[[unlist(.y[1])]], N = nrow(.x), K = ifelse(is.null(K), nrow(.x), K) )$upper[-1] / nrow(.x), lims_lower = ecdf_intervals( gamma = gammas[[unlist(.y[1])]], N = nrow(.x), K = ifelse(is.null(K), nrow(.x), K) )$lower[-1] / nrow(.x), x = seq(0, 1, length.out = ifelse(is.null(K), nrow(.x), K)) ) ) %>% dplyr::bind_rows() ggplot(data) + aes( x = .data$x, y = .data$ecdf_value - (plot_diff == TRUE) * .data$x, group = .data$group, color = "y" ) + geom_step(show.legend = FALSE) + geom_step(aes( y = .data$lims_upper - (plot_diff == TRUE) * .data$x, color = "yrep" ), linetype = 2, show.legend = FALSE) + geom_step(aes( y = .data$lims_lower - (plot_diff == TRUE) * .data$x, color = "yrep" ), linetype = 2, show.legend = FALSE) + labs(y = ifelse(plot_diff,"ECDF - difference","ECDF"), x = "PIT") + yaxis_ticks(FALSE) + bayesplot_theme_get() + facet_wrap("group") + scale_color_ppc() + force_axes_in_facets() } bayesplot/R/ppd-test-statistics.R0000644000176200001440000002000514556270424016536 0ustar liggesusers#' PPD test statistics #' #' The distribution of a (test) statistic `T(ypred)`, or a pair of (test) #' statistics, over the simulations from the posterior or prior predictive #' distribution. Each of these functions makes the same plot as the #' corresponding [`ppc_`][PPC-test-statistics] function but without comparing to #' any observed data `y`. The **Plot Descriptions** section at #' [PPC-test-statistics] has details on the individual plots. #' #' @name PPD-test-statistics #' @aliases PPD-statistics #' @family PPDs #' #' @template args-ypred #' @inheritParams PPC-test-statistics #' #' @template details-binomial #' @template return-ggplot-or-data #' #' @template reference-vis-paper #' @examples #' yrep <- example_yrep_draws() #' ppd_stat(yrep) #' ppd_stat(yrep, stat = "sd") + legend_none() #' #' # use your own function for the 'stat' argument #' color_scheme_set("brightblue") #' q25 <- function(y) quantile(y, 0.25) #' ppd_stat(yrep, stat = "q25") # legend includes function name NULL #' @rdname PPD-test-statistics #' @export ppd_stat <- function(ypred, stat = "mean", ..., binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE) { stopifnot(length(stat) == 1) dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppd_stat_data( ypred = ypred, group = dots$group, stat = match.fun(stat) ) ggplot(data, mapping = set_hist_aes( freq, color = "ypred", fill = "ypred" )) + geom_histogram( linewidth = 0.25, na.rm = TRUE, binwidth = binwidth, bins = bins, breaks = breaks ) + scale_color_ppd(guide = "none") + scale_fill_ppd(labels = Typred_label(), guide = guide_legend( title = stat_legend_title(stat, deparse(substitute(stat))) )) + bayesplot_theme_get() + dont_expand_y_axis() + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(FALSE) } #' @rdname PPD-test-statistics #' @export ppd_stat_grouped <- function(ypred, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppd_stat", call), parent.frame()) g + stat_group_facets(facet_args) + force_axes_in_facets() } #' @rdname PPD-test-statistics #' @export ppd_stat_freqpoly <- function(ypred, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, freq = TRUE) { stopifnot(length(stat) == 1) dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppd_stat_data( ypred = ypred, group = dots$group, stat = match.fun(stat) ) ggplot(data, mapping = set_hist_aes(freq)) + geom_freqpoly( aes(color = "ypred"), linewidth = 0.5, na.rm = TRUE, binwidth = binwidth, bins = bins ) + scale_color_ppd( name = stat_legend_title(stat, deparse(substitute(stat))), labels = Typred_label() ) + dont_expand_y_axis(c(0.005, 0)) + bayesplot_theme_get() + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(FALSE) } #' @rdname PPD-test-statistics #' @export ppd_stat_freqpoly_grouped <- function(ypred, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, freq = TRUE) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppd_stat_freqpoly", call), parent.frame()) g + stat_group_facets(facet_args) + force_axes_in_facets() } #' @rdname PPD-test-statistics #' @export ppd_stat_2d <- function(ypred, stat = c("mean", "sd"), ..., size = 2.5, alpha = 0.7) { check_ignored_arguments(...) if (length(stat) != 2) { abort("For ppd_stat_2d the 'stat' argument must have length 2.") } if (is.character(stat)) { lgnd_title <- bquote(italic(T) == (list(.(stat[1]), .(stat[2])))) stat_labs <- stat } else { lgnd_title <- expression(italic(T) == (list(italic(T)[1], italic(T)[2]))) stat_labs <- expression(italic(T)[1], italic(T)[2]) } data <- ppd_stat_data( ypred = ypred, group = NULL, stat = c(match.fun(stat[[1]]), match.fun(stat[[2]])) ) ggplot(data) + geom_point( mapping = aes( x = .data$value, y = .data$value2, fill = "ypred", color = "ypred" ), shape = 21, size = size, alpha = alpha ) + scale_fill_ppd(lgnd_title, labels = Typred_label()) + scale_color_ppd(lgnd_title, labels = Typred_label()) + labs(x = stat_labs[1], y = stat_labs[2]) + bayesplot_theme_get() } #' @rdname PPD-test-statistics #' @export ppd_stat_data <- function(ypred, group = NULL, stat) { if (!(length(stat) %in% 1:2)) { abort("'stat' must have length 1 or 2.") } ypred <- validate_predictions(ypred) if (!is.null(group)) { group <- validate_group(group, ncol(ypred)) } if (length(stat) == 1) { stat <- match.fun(stat) } else { stat <- list(match.fun(stat[[1]]), match.fun(stat[[2]])) } .ppd_stat_data( predictions = ypred, y = NULL, group = group, stat = stat ) } # internal ---------------------------------------------------------------- #' Back end for both `ppd_stat_data()` and `ppc_stat_data()`. #' #' @noRd #' @param predictions,y,group Already validated `y`, `yrep` or `ypred`, and #' `group` objects. #' @param stat A function already validated and returned by `match.fun()`, or a #' list of two such functions. #' @return A data frame with columns `group` (if not `NULL`), `variable`, #' `value`, and `value2` (if `stat` contains two functions). #' #' @examples #' y <- example_y_data() #' yrep <- example_yrep_draws() #' group <- example_group_data() #' ppd_stat_data(yrep, group, stat = "median") #' ppc_stat_data(y, yrep, group, stat = "median") #' #' @importFrom dplyr group_by ungroup summarise rename .ppd_stat_data <- function(predictions, y = NULL, group = NULL, stat) { stopifnot(length(stat) %in% c(1,2)) if (length(stat) == 1) { stopifnot(is.function(stat)) # sanity check, should already be validated stat1 <- stat stat2 <- NULL } else { # two stats stopifnot(is.function(stat[[1]]), is.function(stat[[2]])) stat1 <- stat[[1]] stat2 <- stat[[2]] } has_group <- !is.null(group) has_y <- !is.null(y) if (!has_group) { group <- 1 } if (!has_y) { y <- 1 } d <- data.frame( y = y, group = factor(group), ypred = t(predictions) ) colnames(d) <- gsub(".", "_", colnames(d), fixed = TRUE) molten_d <- reshape2::melt(d, id.vars = "group") molten_d <- group_by(molten_d, .data$group, .data$variable) data <- molten_d %>% summarise( value1 = stat1(.data$value), value2 = if (!is.null(stat2)) stat2(.data$value) else NA ) %>% rename(value = "value1") %>% ungroup() if (is.null(stat2)) { data$value2 <- NULL } if (!has_group) { data$group <- NULL } if (!has_y) { data <- dplyr::filter(data, .data$variable != "y") data$variable <- droplevels(data$variable) } else { levels(data$variable) <- gsub("ypred", "yrep", levels(data$variable)) } data } # Create the facet layer for grouped stat plots stat_group_facets <- function(facet_args, scales_default = "free") { facet_args[["facets"]] <- "group" facet_args[["scales"]] <- facet_args[["scales"]] %||% scales_default do.call("facet_wrap", facet_args) } Typred_label <- function() expression(italic(T)(italic(y)[pred])) bayesplot/R/mcmc-recover.R0000644000176200001440000002524214556270424015200 0ustar liggesusers#' Compare MCMC estimates to "true" parameter values #' #' Plots comparing MCMC estimates to "true" parameter values. Before fitting a #' model to real data it is useful to simulate data according to the model using #' known (fixed) parameter values and to check that these "true" parameter #' values are (approximately) recovered by fitting the model to the simulated #' data. See the **Plot Descriptions** section, below, for details on the #' available plots. #' #' @name MCMC-recover #' @family MCMC #' #' @template args-mcmc-x #' @template args-facet_args #' @param true A numeric vector of "true" values of the parameters in `x`. #' There should be one value in `true` for each parameter included in #' `x` and the order of the parameters in `true` should be the same #' as the order of the parameters in `x`. #' @param batch Optionally, a vector-like object (numeric, character, integer, #' factor) used to split the parameters into batches. If `batch` is #' specified, it must have the same length as `true` and be in the same #' order as `true`. Parameters in the same batch will be grouped together #' in the same facet in the plot (see the **Examples** section, below). #' The default is to group all parameters together into a single batch. #' Changing the default is most useful when parameters are on very different #' scales, in which case `batch` can be used to group them into batches #' within which it makes sense to use the same y-axis. #' @param ... Currently unused. #' @param prob The probability mass to include in the inner interval. The #' default is `0.5` (50% interval). #' @param prob_outer The probability mass to include in the outer interval. The #' default is `0.9` (90% interval). #' @param point_est The point estimate to show. Either `"median"` (the #' default), `"mean"`, or `"none"`. #' @param size,alpha Passed to [ggplot2::geom_point()] to control the #' appearance of plotted points. #' #' @template return-ggplot #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_recover_intervals()`}{ #' Central intervals and point estimates computed from MCMC draws, with #' "true" values plotted using a different shape. #' } #' \item{`mcmc_recover_scatter()`}{ #' Scatterplot of posterior means (or medians) against "true" values. #' } #' \item{`mcmc_recover_hist()`}{ #' Histograms of the draws for each parameter with the "true" value overlaid #' as a vertical line. #' } #' } #' #' @examples #' \dontrun{ #' library(rstanarm) #' alpha <- 1; beta <- rnorm(10, 0, 3); sigma <- 2 #' X <- matrix(rnorm(1000), 100, 10) #' y <- rnorm(100, mean = c(alpha + X %*% beta), sd = sigma) #' fit <- stan_glm(y ~ ., data = data.frame(y, X), refresh = 0) #' draws <- as.matrix(fit) #' print(colnames(draws)) #' true <- c(alpha, beta, sigma) #' #' mcmc_recover_intervals(draws, true) #' #' # put the coefficients on X into the same batch #' mcmc_recover_intervals(draws, true, batch = c(1, rep(2, 10), 1)) #' # equivalent #' mcmc_recover_intervals(draws, true, batch = grepl("X", colnames(draws))) #' # same but facets stacked vertically #' mcmc_recover_intervals(draws, true, #' batch = grepl("X", colnames(draws)), #' facet_args = list(ncol = 1), #' size = 3) #' #' # each parameter in its own facet #' mcmc_recover_intervals(draws, true, batch = 1:ncol(draws)) #' # same but in a different order #' mcmc_recover_intervals(draws, true, batch = c(1, 3, 4, 2, 5:12)) #' # present as bias by centering with true values #' mcmc_recover_intervals(sweep(draws, 2, true), rep(0, ncol(draws))) + hline_0() #' #' #' # scatterplot of posterior means vs true values #' mcmc_recover_scatter(draws, true, point_est = "mean") #' #' #' # histograms of parameter draws with true value added as vertical line #' color_scheme_set("brightblue") #' mcmc_recover_hist(draws[, 1:4], true[1:4]) #' } #' NULL #' @rdname MCMC-recover #' @export mcmc_recover_intervals <- function(x, true, batch = rep(1, length(true)), ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), size = 4, alpha = 1) { check_ignored_arguments(...) x <- merge_chains(prepare_mcmc_array(x)) stopifnot( is.numeric(true), ncol(x) == length(true), length(batch) == length(true), prob_outer >= prob, prob > 0, prob_outer <= 1 ) all_separate <- length(unique(batch)) == length(true) point_est <- match.arg(point_est) if (point_est == "none") { point_est <- NULL } alpha1 <- (1 - prob) / 2 alpha2 <- (1 - prob_outer) / 2 probs <- sort(c(alpha1, 1 - alpha1, alpha2, 1 - alpha2)) intervals <- t(apply(x, 2, quantile, probs = probs)) colnames(intervals) <- c("ll", "l", "u", "uu") plot_data <- data.frame( Parameter = rownames(intervals), True = true, Point = apply(x, 2, point_est %||% function(x) NA), intervals ) if (!all_separate) { plot_data$Batch <- factor(batch, levels = unique(batch)) } else { plot_data$Batch <- factor(rownames(intervals), levels = rownames(intervals)[as.integer(as.factor(batch))]) } facet_args[["facets"]] <- "Batch" facet_args[["strip.position"]] <- facet_args[["strip.position"]] %||% "top" facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" plot_caption <- paste0("Showing ", round(prob * 100, 1), "% and ", round(prob_outer * 100, 1), "% intervals") graph <- ggplot(plot_data, aes(x = .data$Parameter, xend = .data$Parameter)) + geom_segment( aes(y = .data$ll, yend = .data$uu, color = "Estimated"), lineend = "round", show.legend = FALSE ) + geom_segment( aes(y = .data$l, yend = .data$u, color = "Estimated"), linewidth = 2, lineend = "round", show.legend = FALSE ) + bayesplot_theme_get() if (!is.null(point_est)) { graph <- graph + geom_point( aes(y = .data$Point, shape = "Estimated", color = "Estimated", fill = "Estimated"), size = size ) } graph <- graph + geom_point( aes(y = .data$True, shape = "True", color = "True", fill = "True"), size = size, alpha = alpha ) + scale_color_manual( name = "", values = c(Estimated = get_color("d"), True = get_color("dh")), guide = if (is.null(point_est)) "none" else "legend" ) + scale_fill_manual( name = "", values = c(Estimated = get_color("d"), True = get_color("l")) ) + scale_shape_manual( name = "", values = c(Estimated = 21, True = 24) ) + do.call("facet_wrap", facet_args) + labs(y = "Value", x = "Parameter", subtitle = plot_caption) + theme(plot.caption = element_text(hjust = 0)) + xaxis_title(FALSE) + yaxis_title(FALSE) if (all_separate) { return( graph + theme(axis.line.x = element_blank()) + xaxis_ticks(FALSE) + xaxis_text(FALSE) ) } graph + xaxis_text(face = "bold") + facet_text(FALSE) } #' @rdname MCMC-recover #' @export mcmc_recover_scatter <- function(x, true, batch = rep(1, length(true)), ..., facet_args = list(), point_est = c("median", "mean"), size = 3, alpha = 1) { check_ignored_arguments(...) x <- merge_chains(prepare_mcmc_array(x)) stopifnot( is.numeric(true), ncol(x) == length(true), length(batch) == length(true) ) one_true_per_batch <- length(unique(batch)) == length(true) one_batch <- length(unique(batch)) == 1 point_est <- match.arg(point_est) plot_data <- data.frame( Parameter = colnames(x), Point = apply(x, 2, point_est), True = true ) if (!one_true_per_batch) { plot_data$Batch <- factor(batch, levels = unique(batch)) } else { plot_data$Batch <- factor(colnames(x), levels = colnames(x)[as.integer(as.factor(batch))]) } facet_args[["facets"]] <- "Batch" facet_args[["strip.position"]] <- facet_args[["strip.position"]] %||% "top" facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" # To ensure that the x and y scales have the same range, find the min and max # value on each coordinate. plot them invisibly with geom_blank() later on. corners <- plot_data %>% group_by(.data$Batch) %>% summarise( min = min(pmin(.data$Point, .data$True)), max = max(pmax(.data$Point, .data$True)) ) graph <- ggplot(plot_data, aes(x = .data$True, y = .data$Point)) + geom_abline( slope = 1, intercept = 0, linetype = 2, color = "black" ) + geom_point( shape = 21, color = get_color("mh"), fill = get_color("m"), size = size, alpha = alpha ) + geom_blank(aes(x = min, y = min), data = corners) + geom_blank(aes(x = max, y = max), data = corners) + do.call("facet_wrap", facet_args) + labs(x = "True", y = "Estimated") + bayesplot_theme_get() if (one_batch) { graph <- graph + facet_text(FALSE) } graph } #' @rdname MCMC-recover #' @export #' @template args-hist mcmc_recover_hist <- function(x, true, ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL) { check_ignored_arguments(...) x <- merge_chains(prepare_mcmc_array(x)) stopifnot( is.numeric(true), ncol(x) == length(true) ) vline_data <- data.frame(Parameter = colnames(x), True = true) hist_data <- melt_mcmc(x)[, -1] vline_data$Parameter <- factor(vline_data$Parameter, levels = levels(hist_data$Parameter)) facet_args[["facets"]] <- "Parameter" facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" ggplot() + geom_histogram( aes(x = .data$Value, fill = "Estimated"), data = hist_data, color = get_color("lh"), linewidth = 0.25, binwidth = binwidth, bins = bins, breaks = breaks ) + geom_vline( aes(xintercept = .data$True, color = "True"), data = vline_data, linewidth = 1.5 ) + do.call("facet_wrap", facet_args) + scale_fill_manual("", values = get_color("l")) + scale_color_manual("", values = get_color("dh")) + guides(color = guide_legend(), fill = guide_legend(order = 1)) + dont_expand_y_axis() + bayesplot_theme_get() + reduce_legend_spacing(0.25) + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(FALSE) } bayesplot/R/ppc-scatterplots.R0000644000176200001440000001404514335264324016121 0ustar liggesusers#' PPC scatterplots #' #' Scatterplots of the observed data `y` vs. simulated/replicated data #' `yrep` from the posterior predictive distribution. See the #' **Plot Descriptions** and **Details** sections, below. #' #' @name PPC-scatterplots #' @family PPCs #' #' @template args-y-yrep #' @template args-group #' @template args-facet_args #' @param ... Currently unused. #' @param size,alpha Arguments passed to [ggplot2::geom_point()] to control the #' appearance of the points. #' @param ref_line If `TRUE` (the default) a dashed line with intercept 0 and #' slope 1 is drawn behind the scatter plot. #' #' @template details-binomial #' @template return-ggplot-or-data #' #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_scatter()`}{ #' For each dataset (row) in `yrep` a scatterplot is generated showing `y` #' against that row of `yrep`. For this plot `yrep` should only contain a #' small number of rows. #' } #' \item{`ppc_scatter_avg()`}{ #' A single scatterplot of `y` against the average values of `yrep`, i.e., #' the points `(x,y) = (mean(yrep[, n]), y[n])`, where each `yrep[, n]` is #' a vector of length equal to the number of posterior draws. Unlike #' for `ppc_scatter()`, for `ppc_scatter_avg()` `yrep` should contain many #' draws (rows). #' } #' \item{`ppc_scatter_avg_grouped()`}{ #' The same as `ppc_scatter_avg()`, but a separate plot is generated for #' each level of a grouping variable. #' } #' } #' #' @examples #' y <- example_y_data() #' yrep <- example_yrep_draws() #' p1 <- ppc_scatter_avg(y, yrep) #' p1 #' #' # don't draw line x=y #' ppc_scatter_avg(y, yrep, ref_line = FALSE) #' #' p2 <- ppc_scatter(y, yrep[20:23, ], alpha = 0.5, size = 1.5) #' p2 #' #' # give x and y axes the same limits #' lims <- ggplot2::lims(x = c(0, 160), y = c(0, 160)) #' p1 + lims #' p2 + lims #' #' # for ppc_scatter_avg_grouped the default is to allow the facets #' # to have different x and y axes #' group <- example_group_data() #' ppc_scatter_avg_grouped(y, yrep, group) #' #' # let x-axis vary but force y-axis to be the same #' ppc_scatter_avg_grouped(y, yrep, group, facet_args = list(scales = "free_x")) #' NULL #' @rdname PPC-scatterplots #' @export ppc_scatter <- function(y, yrep, ..., facet_args = list(), size = 2.5, alpha = 0.8, ref_line = TRUE) { check_ignored_arguments(...) data <- ppc_scatter_data(y, yrep) if (nrow(yrep) == 1) { facet_layer <- geom_ignore() } else { facet_args[["facets"]] <- "rep_label" facet_layer <- do.call("facet_wrap_parsed", facet_args) } ggplot(data, scatter_aes(color = "yrep", fill = "yrep")) + scatter_ref_line(ref_line) + geom_point( size = size, alpha = alpha, shape = 21, show.legend = FALSE ) + # use ppd color scale since only need one color # (and legend is off so no label modification needed) scale_color_ppd() + scale_fill_ppd() + bayesplot_theme_get() + facet_layer + labs(x = yrep_label(), y = y_label()) + force_axes_in_facets() + facet_text(FALSE) + legend_none() } #' @rdname PPC-scatterplots #' @export ppc_scatter_avg <- function(y, yrep, ..., size = 2.5, alpha = 0.8, ref_line = TRUE) { dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppc_scatter_avg_data(y, yrep, group = dots$group) if (is.null(dots$group) && nrow(yrep) == 1) { inform( "With only 1 row in 'yrep' ppc_scatter_avg is the same as ppc_scatter." ) } ggplot(data, scatter_aes(color = "yrep", fill = "yrep")) + scatter_ref_line(ref_line) + geom_point( alpha = alpha, size = size, shape = 21, show.legend = FALSE ) + # ppd instead of ppc (see comment in ppc_scatter) scale_color_ppd() + scale_fill_ppd() + labs(x = yrep_avg_label(), y = y_label()) + bayesplot_theme_get() } #' @rdname PPC-scatterplots #' @export ppc_scatter_avg_grouped <- function(y, yrep, group, ..., facet_args = list(), size = 2.5, alpha = 0.8, ref_line = TRUE) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppc_scatter_avg", call), parent.frame()) g + scatter_avg_group_facets(facet_args) + force_axes_in_facets() } #' @rdname PPC-scatterplots #' @export ppc_scatter_data <- function(y, yrep) { y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) melt_predictions(yrep) %>% dplyr::arrange(.data$y_id) %>% tibble::add_column( y_obs = rep(y, each = nrow(yrep)), .before = "rep_id" ) } #' @rdname PPC-scatterplots #' @export ppc_scatter_avg_data <- function(y, yrep, group = NULL) { y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) if (!is.null(group)) { group <- validate_group(group, length(y)) } data <- ppc_scatter_data(y = y, yrep = t(colMeans(yrep))) data$rep_id <- NA_integer_ levels(data$rep_label) <- "mean(italic(y)[rep]))" if (!is.null(group)) { data <- tibble::add_column(data, group = group[data$y_id], .before = "y_id" ) } data } # internal ---------------------------------------------------------------- yrep_avg_label <- function() expression(paste("Average ", italic(y)[rep])) scatter_aes <- function(...) { aes(x = .data$value, y = .data$y_obs, ...) } scatter_avg_group_facets <- function(facet_args) { facet_args[["facets"]] <- "group" facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" do.call("facet_wrap", facet_args) } scatter_ref_line <- function(ref_line, linetype = 2, color = get_color("dh"), ...) { if (!ref_line) { return(geom_ignore()) } abline_01(linetype = 2, color = get_color("dh"), ...) } bayesplot/R/bayesplot_grid.R0000644000176200001440000001105014127610043015602 0ustar liggesusers#' Arrange plots in a grid #' #' The `bayesplot_grid` function makes it simple to juxtapose plots using #' common \eqn{x} and/or \eqn{y} axes. #' #' @export #' @param ... One or more ggplot objects. #' @param plots A list of ggplot objects. Can be used as an alternative to #' specifying plot objects via `...`. #' @param grid_args An optional named list of arguments to pass to #' [gridExtra::arrangeGrob()] (`nrow`, `ncol`, #' `widths`, etc.). #' @param titles,subtitles Optional character vectors of plot titles and #' subtitles. If specified, `titles` and `subtitles` must must have #' length equal to the number of plots specified. #' @param xlim,ylim Optionally, numeric vectors of length 2 specifying lower and #' upper limits for the axes that will be shared across all plots. #' @param legends If any of the plots have legends should they be displayed? #' Defaults to `TRUE`. #' @param save_gg_objects If `TRUE`, the default, then the ggplot objects #' specified in `...` or via the `plots` argument are saved in a #' list in the `"bayesplots"` component of the returned object. #' Setting this to `FALSE` will make the returned object smaller but #' these individual plot objects will not be available. #' #' @return An object of class `"bayesplot_grid"` (essentially a gtable object #' from [gridExtra::arrangeGrob()]), which has a `plot` method. #' #' @examples #' y <- example_y_data() #' yrep <- example_yrep_draws() #' stats <- c("sd", "median", "max", "min") #' #' color_scheme_set("pink") #' bayesplot_grid( #' plots = lapply(stats, function(s) ppc_stat(y, yrep, stat = s)), #' titles = stats, #' legends = FALSE, #' grid_args = list(ncol = 1) #' ) #' #' \dontrun{ #' library(rstanarm) #' mtcars$log_mpg <- log(mtcars$mpg) #' fit1 <- stan_glm(mpg ~ wt, data = mtcars, refresh = 0) #' fit2 <- stan_glm(log_mpg ~ wt, data = mtcars, refresh = 0) #' #' y <- mtcars$mpg #' yrep1 <- posterior_predict(fit1, draws = 50) #' yrep2 <- posterior_predict(fit2, fun = exp, draws = 50) #' #' color_scheme_set("blue") #' ppc1 <- ppc_dens_overlay(y, yrep1) #' ppc1 #' ppc1 + yaxis_text() #' #' color_scheme_set("red") #' ppc2 <- ppc_dens_overlay(y, yrep2) #' bayesplot_grid(ppc1, ppc2) #' #' # make sure the plots use the same limits for the axes #' bayesplot_grid(ppc1, ppc2, xlim = c(-5, 60), ylim = c(0, 0.2)) #' #' # remove the legends and add text #' bayesplot_grid(ppc1, ppc2, xlim = c(-5, 60), ylim = c(0, 0.2), #' legends = FALSE, subtitles = rep("Predicted MPG", 2)) #' } #' bayesplot_grid <- function(..., plots = list(), xlim = NULL, ylim = NULL, grid_args = list(), titles = character(), subtitles = character(), legends = TRUE, save_gg_objects = TRUE) { suggested_package("gridExtra") dots <- list(...) if (length(dots) && length(plots)) { abort("Arguments '...' and 'plots' can't both be specified.") } else if (length(plots)) { if (!is.list(plots) || !all_ggplot(plots)) abort("'plots' must be a list of ggplot objects.") } else if (length(dots)) { if (!all_ggplot(dots)) abort("All objects in '...' must be ggplot objects.") plots <- dots } else { abort("No plots specified.") } if (length(titles)) { stopifnot(is.character(titles), length(titles) == length(plots)) plots <- lapply(seq_along(plots), function(j) plots[[j]] + ggtitle(titles[j])) } if (length(subtitles)) { stopifnot(is.character(subtitles), length(subtitles) == length(plots)) plots <- lapply(seq_along(plots), function(j) plots[[j]] + labs(subtitle = subtitles[j])) } if (!legends) plots <- lapply(plots, function(p) p + legend_none()) if (!is.null(xlim)) plots <- lapply(plots, function(p) p + ggplot2::xlim(xlim)) if (!is.null(ylim)) plots <- lapply(plots, function(p) p + ggplot2::ylim(ylim)) grid_args$grobs <- plots g <- do.call(gridExtra::arrangeGrob, args = grid_args) if (save_gg_objects) { g$bayesplots <- plots } as_bayesplot_grid(g) } # internal ---------------------------------------------------------------- as_bayesplot_grid <- function(x) { structure(x, class = unique(c("bayesplot_grid", class(x)))) } is_bayesplot_grid <- function(x) { inherits(x, "bayesplot_grid") } all_ggplot <- function(x) { all(sapply(x, "inherits", what = "ggplot")) } #' @export print.bayesplot_grid <- function(x, ...) { gridExtra::grid.arrange(x, ...) } #' @export plot.bayesplot_grid <- print.bayesplot_grid bayesplot/R/ppc-censoring.R0000644000176200001440000001321714335264324015361 0ustar liggesusers#' PPC censoring #' #' @description Compare the empirical distribution of censored data `y` to the #' distributions of simulated/replicated data `yrep` from the posterior #' predictive distribution. See the **Plot Descriptions** section, below, for #' details. #' #' Although some of the other \pkg{bayesplot} plots can be used with censored #' data, `ppc_km_overlay()` is currently the only plotting function designed #' *specifically* for censored data. We encourage you to suggest or contribute #' additional plots at #' [github.com/stan-dev/bayesplot](https://github.com/stan-dev/bayesplot). #' #' @name PPC-censoring #' @family PPCs #' #' @template args-y-yrep #' @param size,alpha Passed to the appropriate geom to control the appearance of #' the `yrep` distributions. #' @param ... Currently only used internally. #' #' @template return-ggplot #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_km_overlay()`}{ #' Empirical CCDF estimates of each dataset (row) in `yrep` are overlaid, #' with the Kaplan-Meier estimate (Kaplan and Meier, 1958) for `y` itself on #' top (and in a darker shade). This is a PPC suitable for right-censored #' `y`. Note that the replicated data from `yrep` is assumed to be #' uncensored. #' } #' \item{`ppc_km_overlay_grouped()`}{ #' The same as `ppc_km_overlay()`, but with separate facets by `group`. #' } #' } #' #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' @template reference-km #' #' @examples #' color_scheme_set("brightblue") #' y <- example_y_data() #' # For illustrative purposes, (right-)censor values y > 110: #' status_y <- as.numeric(y <= 110) #' y <- pmin(y, 110) #' # In reality, the replicated data (yrep) would be obtained from a #' # model which takes the censoring of y properly into account. Here, #' # for illustrative purposes, we simply use example_yrep_draws(): #' yrep <- example_yrep_draws() #' dim(yrep) #' \donttest{ #' ppc_km_overlay(y, yrep[1:25, ], status_y = status_y) #' } #' # With separate facets by group: #' group <- example_group_data() #' \donttest{ #' ppc_km_overlay_grouped(y, yrep[1:25, ], group = group, status_y = status_y) #' } NULL #' @export #' @rdname PPC-censoring #' @param status_y The status indicator for the observations from `y`. This must #' be a numeric vector of the same length as `y` with values in \{0, 1\} (0 = #' right censored, 1 = event). ppc_km_overlay <- function( y, yrep, ..., status_y, size = 0.25, alpha = 0.7 ) { check_ignored_arguments(..., ok_args = "add_group") add_group <- list(...)$add_group suggested_package("survival") suggested_package("ggfortify") stopifnot(is.numeric(status_y)) stopifnot(all(status_y %in% c(0, 1))) data <- ppc_data(y, yrep, group = status_y) # Modify the status indicator: # * For the observed data ("y"), convert the status indicator back to # a numeric. # * For the replicated data ("yrep"), set the status indicator # to 1 ("event"). This way, the Kaplan-Meier estimator reduces # to "1 - ECDF" with ECDF denoting the ordinary empirical cumulative # distribution function. data <- data %>% dplyr::mutate(group = ifelse(.data$is_y, as.numeric(as.character(.data$group)), 1)) sf_form <- survival::Surv(value, group) ~ rep_label if (!is.null(add_group)) { data <- dplyr::inner_join(data, tibble::tibble(y_id = seq_along(y), add_group = add_group), by = "y_id") sf_form <- update(sf_form, . ~ . + add_group) } sf <- survival::survfit( sf_form, data = data ) names(sf$strata) <- sub("add_group=", "add_group:", names(sf$strata)) # Needed to split the strata names in ggfortify:::fortify.survfit() properly. fsf <- fortify(sf) if(any(grepl("add_group", levels(fsf$strata)))){ strata_split <- strsplit(as.character(fsf$strata), split = ", add_group:") fsf$strata <- as.factor(sapply(strata_split, "[[", 1)) fsf$group <- as.factor(sapply(strata_split, "[[", 2)) } fsf$is_y_color <- as.factor(sub("\\[rep\\] \\(.*$", "rep", sub("^italic\\(y\\)", "y", fsf$strata))) fsf$is_y_size <- ifelse(fsf$is_y_color == "yrep", size, 1) fsf$is_y_alpha <- ifelse(fsf$is_y_color == "yrep", alpha, 1) # Ensure that the observed data gets plotted last by reordering the # levels of the factor "strata" fsf$strata <- factor(fsf$strata, levels = rev(levels(fsf$strata))) ggplot(data = fsf, mapping = aes(x = .data$time, y = .data$surv, color = .data$is_y_color, group = .data$strata, size = .data$is_y_size, alpha = .data$is_y_alpha)) + geom_step() + hline_at( 0.5, linewidth = 0.1, linetype = 2, color = get_color("dh") ) + hline_at( c(0, 1), linewidth = 0.2, linetype = 2, color = get_color("dh") ) + scale_size_identity() + scale_alpha_identity() + scale_color_ppc() + scale_y_continuous(breaks = c(0, 0.5, 1)) + xlab(y_label()) + yaxis_title(FALSE) + xaxis_title(FALSE) + yaxis_ticks(FALSE) + bayesplot_theme_get() } #' @export #' @rdname PPC-censoring #' @template args-group ppc_km_overlay_grouped <- function( y, yrep, group, ..., status_y, size = 0.25, alpha = 0.7 ) { check_ignored_arguments(...) p_overlay <- ppc_km_overlay( y = y, yrep = yrep, add_group = group, ..., status_y = status_y, size = size, alpha = alpha ) p_overlay + facet_wrap("group") + force_axes_in_facets() } bayesplot/R/tidy-params.R0000644000176200001440000002132614127610043015034 0ustar liggesusers#' Tidy parameter selection #' #' Parameter selection in the style of **dplyr** and other tidyverse packages. #' #' @name tidy-params #' #' @details #' As of version `1.7.0`, **bayesplot** allows the `pars` argument for [MCMC #' plots][bayesplot::MCMC-overview] to use "tidy" variable selection (in the #' style of the **dplyr** package). The [`vars()`][dplyr::vars] function is #' re-exported from **dplyr** for this purpose. #' #' Features of tidy selection includes direct selection (`vars(alpha, sigma)`), #' everything-but selection (`vars(-alpha)`), ranged selection #' (``vars(`beta[1]`:`beta[3]`)``), support for selection functions #' (`vars(starts_with("beta"))`), and combinations of these features. See the #' **Examples** section, below. #' #' When using `pars` for tidy parameter selection, the `regex_pars` argument is #' ignored because **bayesplot** supports using [tidyselect helper #' functions][tidyselect::select_helpers] (`starts_with()`, `contains()`, #' `num_range()`, etc.) for the same purpose. **bayesplot** also exports some #' additional helper functions to help with parameter selection: #' #' * `param_range()`: like [`num_range()`][tidyselect::num_range] but used #' when parameter indexes are in brackets (e.g. `beta[2]`). #' #' * `param_glue()`: for more complicated parameter names with multiple #' indexes (including variable names) inside the brackets #' (e.g., `beta[(Intercept) age_group:3]`). #' #' These functions can be used inside of `vars()`, `dplyr::select()`, #' and similar functions, just like the #' [tidyselect helper functions][tidyselect::select_helpers]. #' #' @section Extra Advice: #' #' Parameter names in `vars()` are not quoted. When the names contain special #' characters like brackets, they should be wrapped in backticks, as in #' ``vars(`beta[1]`)``. #' #' To exclude a range of variables, wrap the sequence in parentheses and then #' negate it. For example, (``vars(-(`beta[1]`:`beta[3]`))``) would exclude #' `beta[1]`, `beta[2]`, and `beta[3]`. #' #' `vars()` is a helper function. It holds onto the names and expressions used #' to select columns. When selecting variables inside a **bayesplot** #' function, use `vars(...)`: `mcmc_hist(data, pars = vars(alpha))`. When #' using `select()` to prepare a dataframe for a **bayesplot** function, do #' not use `vars()`: `data %>% select(alpha) %>% mcmc_hist()`. #' #' Internally, tidy selection works by converting names and expressions #' into position numbers. As a result, integers will select parameters; #' `vars(1, 3)` selects the first and third ones. We do not endorse this #' approach because positions might change as variables are added and #' removed from models. To select a parameter that happens to be called `1`, #' use backticks to escape it ``vars(`1`)``. #' #' @seealso [glue::glue()] #' #' @examples #' x <- example_mcmc_draws(params = 6) #' dimnames(x) #' mcmc_hex(x, pars = vars(alpha, `beta[2]`)) #' mcmc_dens(x, pars = vars(sigma, contains("beta"))) #' mcmc_hist(x, pars = vars(-contains("beta"))) #' #' # using the param_range() helper #' mcmc_hist(x, pars = vars(param_range("beta", c(1, 3, 4)))) #' #' \donttest{ #' ############################# #' ## Examples using rstanarm ## #' ############################# #' if (requireNamespace("rstanarm", quietly = TRUE)) { #' # see ?rstanarm::example_model #' fit <- example("example_model", package = "rstanarm", local=TRUE)$value #' print(fit) #' posterior <- as.data.frame(fit) #' str(posterior) #' #' color_scheme_set("brightblue") #' mcmc_hist(posterior, pars = vars(size, contains("period"))) #' #' # same as previous but using dplyr::select() and piping #' library("dplyr") #' posterior %>% #' select(size, contains("period")) %>% #' mcmc_hist() #' #' mcmc_intervals(posterior, pars = vars(contains("herd"))) #' mcmc_intervals(posterior, pars = vars(contains("herd"), -contains("Sigma"))) #' #' bayesplot_theme_set(ggplot2::theme_dark()) #' color_scheme_set("viridisC") #' mcmc_areas_ridges(posterior, pars = vars(starts_with("b["))) #' #' bayesplot_theme_set() #' color_scheme_set("purple") #' not_789 <- vars(starts_with("b["), -matches("[7-9]")) #' mcmc_intervals(posterior, pars = not_789) #' #' # using the param_glue() helper #' just_149 <- vars(param_glue("b[(Intercept) herd:{level}]", level = c(1,4,9))) #' mcmc_intervals(posterior, pars = just_149) #' #' # same but using param_glue() with dplyr::select() #' # before passing to bayesplot #' posterior %>% #' select(param_glue("b[(Intercept) herd:{level}]", #' level = c(1, 4, 9))) %>% #' mcmc_intervals() #' } #'} NULL # re-export vars for tidy parameter selection #' @importFrom dplyr vars #' @export dplyr::vars #' @rdname tidy-params #' @export #' @param vars `NULL` or a character vector of parameter names to choose from. #' This is only needed for the atypical use case of calling the function as a #' standalone function outside of `vars()`, `select()`, etc. Typically this is #' left as `NULL` and will be set automatically for the user. #' @param prefix,range For `param_range()` only, `prefix` is a string naming a #' parameter and `range` is an integer vector providing the indices of a #' subset of elements to select. For example, using #' #' param_range("beta", c(1,2,8)) #' #' would select parameters named `beta[1]`, `beta[2]`, and `beta[8]`. #' `param_range()` is only designed for the case that the indices are integers #' surrounded by brackets. If there are no brackets use #' [num_range()][tidyselect::select_helpers]. #' param_range <- function(prefix, range, vars = NULL) { if (!is.null(vars) && !is.character(vars)) { abort("'vars' must be NULL or a character vector.") } nms <- paste0(prefix, "[", range, "]") param_matches <- match(nms, vars %||% tidyselect::peek_vars()) param_matches[!is.na(param_matches)] } #' @rdname tidy-params #' @export #' @param pattern,... For `param_glue()` only, `pattern` is a string containing #' expressions enclosed in braces and `...` should be named arguments #' providing one character vector per expression in braces in `pattern`. It is #' easiest to describe how to use these arguments with an example: #' #' param_glue("beta_{var}[{level}]", #' var = c("age", "income"), #' level = c(3,8)) #' #' would select parameters with names #' `"beta_age[3]"`, `"beta_income[3]"`, `"beta_age[8]"`, `"beta_income[8]"`. #' #' @examples #' \dontrun{ #' ################################### #' ## More examples of param_glue() ## #' ################################### #' library(dplyr) #' posterior <- tibble( #' b_Intercept = rnorm(1000), #' sd_condition__Intercept = rexp(1000), #' sigma = rexp(1000), #' `r_condition[A,Intercept]` = rnorm(1000), #' `r_condition[B,Intercept]` = rnorm(1000), #' `r_condition[C,Intercept]` = rnorm(1000), #' `r_condition[A,Slope]` = rnorm(1000), #' `r_condition[B,Slope]` = rnorm(1000) #' ) #' posterior #' #' # using one expression in braces #' posterior %>% #' select( #' param_glue("r_condition[{level},Intercept]", level = c("A", "B")) #' ) %>% #' mcmc_hist() #' #' # using multiple expressions in braces #' posterior %>% #' select( #' param_glue( #' "r_condition[{level},{type}]", #' level = c("A", "B"), #' type = c("Intercept", "Slope")) #' ) %>% #' mcmc_hist() #'} param_glue <- function(pattern, ..., vars = NULL) { if (!is.null(vars) && !is.character(vars)) { abort("'vars' must be NULL or a character vector.") } dots <- as.list(expand.grid(...)) nms <- as.character(glue::glue_data(dots, pattern)) param_matches <- match(nms, vars %||% tidyselect::peek_vars()) param_matches[!is.na(param_matches)] } # internal ---------------------------------------------------------------- #' Internal function for tidy parameter selection #' #' This function is called internally by `prepare_mcmc_array()` if the user's #' `pars` argument is a quosure. #' #' @noRd #' @param complete_pars A character vector of *all* parameter names. #' @param pars_list A list of columns generated by `vars()`. #' @return Character vector of selected parameter names. tidyselect_parameters <- function(complete_pars, pars_list) { # We use the list of helpers so that we don't have to keep track of any # changes to tidyselect. We use `env_bury()`` so that the definitions of # selection helpers are available. This pattern is taken from the example code # in `vars_select_helpers`. helpers <- tidyselect::vars_select_helpers pars_list <- lapply(pars_list, rlang::env_bury, !!! helpers) selected <- tidyselect::vars_select(.vars = complete_pars, !!! pars_list) if (!length(selected)) { abort("No parameters were found matching those names.") } unname(selected) } bayesplot/R/ppd-overview.R0000644000176200001440000000343514212422623015232 0ustar liggesusers#' Plots of posterior or prior predictive distributions #' #' @name PPD-overview #' @aliases PPD #' @family PPDs #' #' @description The **bayesplot** PPD module provides various plotting functions #' for creating graphical displays of simulated data from the posterior or #' prior predictive distribution. These plots are essentially the same as the #' corresponding [PPC] plots but without showing any observed data. Because #' these are not "checks" compared to data we use PPD (for prior/posterior #' predictive distribution) instead of PPC (for prior/posterior predictive #' check). #' #' @section PPD plotting functions: The functions for plotting prior and #' posterior predictive distributions without observed data each have the #' prefix `ppd_` and all have a required argument `ypred` (a matrix of #' predictions). The plots are organized into several categories, each with #' its own documentation: #' * [PPD-distributions]: Histograms, kernel density estimates, boxplots, and #' other plots of multiple simulated datasets (rows) in `ypred`. These are the #' same as the plots in [PPC-distributions] but without including any #' comparison to `y`. #' #' * [PPD-intervals]: Interval estimates for each predicted observations #' (columns) in `ypred`. The x-axis variable can be optionally specified by #' the user (e.g. to plot against against a predictor variable or over #' time).These are the same as the plots in [PPC-intervals] but without #' including any comparison to `y`. #' #' * [PPD-test-statistics]: The distribution of a statistic, or a pair of #' statistics, over the simulated datasets (rows) in `ypred`. These are the #' same as the plots in [PPC-test-statistics] but without including any #' comparison to `y`. #' #' @template reference-vis-paper #' NULL bayesplot/R/ppc-test-statistics.R0000644000176200001440000002634014556270424016545 0ustar liggesusers#' PPC test statistics #' #' The distribution of a (test) statistic `T(yrep)`, or a pair of (test) #' statistics, over the simulated datasets in `yrep`, compared to the #' observed value `T(y)` computed from the data `y`. See the #' **Plot Descriptions** and **Details** sections, below, as #' well as [Gabry et al. (2019)](https://github.com/jgabry/bayes-vis-paper#readme). #' #' @name PPC-test-statistics #' @aliases PPC-statistics #' @family PPCs #' #' @template args-y-yrep #' @template args-group #' @template args-facet_args #' @template args-hist #' @template args-hist-freq #' @param stat A single function or a string naming a function, except for the #' 2D plot which requires a vector of exactly two names or functions. In all #' cases the function(s) should take a vector input and return a scalar #' statistic. If specified as a string (or strings) then the legend will #' display the function name(s). If specified as a function (or functions) #' then generic naming is used in the legend. #' @param ... Currently unused. #' #' @template details-binomial #' @template return-ggplot-or-data #' #' @template reference-vis-paper #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_stat()`, `ppc_stat_freqpoly()`}{ #' A histogram or frequency polygon of the distribution of a statistic #' computed by applying `stat` to each dataset (row) in `yrep`. The value of #' the statistic in the observed data, `stat(y)`, is overlaid as a vertical #' line. More details and example usage of `ppc_stat()` can be found in Gabry #' et al. (2019). #' } #' \item{`ppc_stat_grouped()`,`ppc_stat_freqpoly_grouped()`}{ #' The same as `ppc_stat()` and `ppc_stat_freqpoly()`, but a separate plot is #' generated for each level of a grouping variable. More details and example #' usage of `ppc_stat_grouped()` can be found in Gabry et al. (2019). #' } #' \item{`ppc_stat_2d()`}{ #' A scatterplot showing the joint distribution of two statistics #' computed over the datasets (rows) in `yrep`. The value of the #' statistics in the observed data is overlaid as large point. #' } #' } #' #' @examples #' y <- example_y_data() #' yrep <- example_yrep_draws() #' ppc_stat(y, yrep) #' ppc_stat(y, yrep, stat = "sd") + legend_none() #' #' # use your own function for the 'stat' argument #' color_scheme_set("brightblue") #' q25 <- function(y) quantile(y, 0.25) #' ppc_stat(y, yrep, stat = "q25") # legend includes function name #' #' # can define the function in the 'stat' argument instead of #' # using its name but then the legend doesn't include the function name #' ppc_stat(y, yrep, stat = function(y) quantile(y, 0.25)) #' #' # plots by group #' color_scheme_set("teal") #' group <- example_group_data() #' ppc_stat_grouped(y, yrep, group) #' ppc_stat_grouped(y, yrep, group) + yaxis_text() #' #' # force y-axes to have same scales, allow x axis to vary #' ppc_stat_grouped(y, yrep, group, facet_args = list(scales = "free_x")) + yaxis_text() #' #' # the freqpoly plots use frequency polygons instead of histograms #' ppc_stat_freqpoly(y, yrep, stat = "median") #' ppc_stat_freqpoly_grouped(y, yrep, group, stat = "median", facet_args = list(nrow = 2)) #' #' # ppc_stat_2d allows 2 statistics and makes a scatterplot #' bayesplot_theme_set(ggplot2::theme_linedraw()) #' color_scheme_set("viridisE") #' ppc_stat_2d(y, yrep, stat = c("mean", "sd")) #' #' bayesplot_theme_set(ggplot2::theme_grey()) #' color_scheme_set("brewer-Paired") #' ppc_stat_2d(y, yrep, stat = c("median", "mad")) #' #' # reset aesthetics #' color_scheme_set() #' bayesplot_theme_set() #' NULL #' @rdname PPC-test-statistics #' @export ppc_stat <- function(y, yrep, stat = "mean", ..., binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE) { stopifnot(length(stat) == 1) dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppc_stat_data( y = y, yrep = yrep, group = dots$group, stat = match.fun(stat) ) ggplot( data = dplyr::filter(data, .data$variable != "y"), mapping = set_hist_aes(freq) ) + geom_histogram( aes(fill = "yrep"), color = get_color("lh"), linewidth = 0.25, na.rm = TRUE, binwidth = binwidth, bins = bins, breaks = breaks ) + geom_vline( data = dplyr::filter(data, .data$variable == "y"), mapping = aes(xintercept = .data$value, color = "y"), linewidth = 1.5 ) + scale_color_ppc(values = get_color("dh"), labels = Ty_label()) + scale_fill_ppc(values = get_color("l"), labels = Tyrep_label()) + guides( color = guide_legend(title = NULL), fill = guide_legend( order = 1, title = stat_legend_title(stat, deparse(substitute(stat))) ) ) + dont_expand_y_axis() + bayesplot_theme_get() + no_legend_spacing() + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(FALSE) } #' @rdname PPC-test-statistics #' @export ppc_stat_grouped <- function(y, yrep, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppc_stat", call), parent.frame()) g + stat_group_facets(facet_args) + force_axes_in_facets() } #' @rdname PPC-test-statistics #' @export ppc_stat_freqpoly <- function(y, yrep, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, freq = TRUE) { stopifnot(length(stat) == 1) dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppc_stat_data( y = y, yrep = yrep, group = dots$group, stat = match.fun(stat) ) ggplot( data = dplyr::filter(data, .data$variable != "y"), mapping = set_hist_aes(freq) ) + geom_freqpoly( aes(color = "yrep"), linewidth = 0.5, na.rm = TRUE, binwidth = binwidth, bins = bins ) + geom_vline( data = dplyr::filter(data, .data$variable == "y"), mapping = aes(xintercept = .data$value, color = "y"), show.legend = FALSE, linewidth = 1 ) + scale_color_ppc( name = stat_legend_title(stat, deparse(substitute(stat))), values = set_names(get_color(c("m", "dh")), c("yrep", "y")), labels = c(yrep = Tyrep_label(), y = Ty_label()) ) + dont_expand_y_axis(c(0.005, 0)) + bayesplot_theme_get() + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(FALSE) } #' @rdname PPC-test-statistics #' @export ppc_stat_freqpoly_grouped <- function(y, yrep, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, bins = NULL, freq = TRUE) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppc_stat_freqpoly", call), parent.frame()) g + stat_group_facets(facet_args) + force_axes_in_facets() } #' @rdname PPC-test-statistics #' @export #' @param size,alpha For the 2D plot only, arguments passed to #' [ggplot2::geom_point()] to control the appearance of scatterplot points. ppc_stat_2d <- function(y, yrep, stat = c("mean", "sd"), ..., size = 2.5, alpha = 0.7) { check_ignored_arguments(...) if (length(stat) != 2) { abort("For ppc_stat_2d the 'stat' argument must have length 2.") } if (is.character(stat)) { lgnd_title <- bquote(italic(T) == (list(.(stat[1]), .(stat[2])))) stat_labs <- stat } else { lgnd_title <- expression(italic(T) == (list(italic(T)[1], italic(T)[2]))) stat_labs <- expression(italic(T)[1], italic(T)[2]) } data <- ppc_stat_data( y = y, yrep = yrep, group = NULL, stat = c(match.fun(stat[[1]]), match.fun(stat[[2]])) ) y_segment_data <- stat_2d_segment_data(data) y_point_data <- data.frame( x = y_segment_data[1, "x"], y = y_segment_data[2, "y"] ) ggplot(data) + geom_point( aes( x = .data$value, y = .data$value2, fill = "yrep", color = "yrep" ), shape = 21, size = size, alpha = alpha ) + geom_segment( data = y_segment_data, aes( x = .data$x, y = .data$y, xend = .data$xend, yend = .data$yend, color = "y" ), linetype = 2, linewidth = 0.4, show.legend = FALSE ) + geom_point( data = y_point_data, mapping = aes( x = .data$x, y = .data$y, fill = "y", color = "y" ), size = size * 1.5, shape = 21, stroke = 0.75 ) + scale_fill_ppc(lgnd_title, labels = c(Ty_label(), Tyrep_label())) + scale_color_ppc(lgnd_title, labels = c(Ty_label(), Tyrep_label())) + labs(x = stat_labs[1], y = stat_labs[2]) + bayesplot_theme_get() } #' @rdname PPC-test-statistics #' @export ppc_stat_data <- function(y, yrep, group = NULL, stat) { if (!(length(stat) %in% 1:2)) { abort("'stat' must have length 1 or 2.") } y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) if (!is.null(group)) { group <- validate_group(group, length(y)) } if (length(stat) == 1) { stat <- match.fun(stat) } else { stat <- list(match.fun(stat[[1]]), match.fun(stat[[2]])) } .ppd_stat_data( predictions = yrep, y = y, group = group, stat = stat ) } # internal ---------------------------------------------------------------- #' Make legend title for ppc_stat,ppc_stat_grouped,ppc_stat_freqpoly_grouped #' #' @param stat The user's `stat` argument. #' @param stat_txt `deparse(substitute())` applied to users `stat` argument. #' @return Either throws an error or returns a legend title (possibly `NULL`). #' @noRd stat_legend_title <- function(stat, stat_txt) { stopifnot(is.character(stat) || is.function(stat)) if (is.character(stat)) { lgnd_txt <- stat } else { lgnd_txt <- if (length(stat_txt) == 1 && !grepl("^function", stat_txt)) stat_txt else NA } if (is.na(lgnd_txt)) return(NULL) bquote(italic(T) == .(lgnd_txt)) } #' Make data frame for geom_segment() for ppc_stat_2d() #' @param data Data frame from `ppc_stat_data()`. #' @return Data frame with two rows and four columns (`x`,`xend`,`y`,`yend`). #' @noRd stat_2d_segment_data <- function(data) { y_data <- dplyr::filter(data, .data$variable == "y") stats <- c(y_data$value[1], y_data$value2[1]) data.frame( x = c(stats[1], -Inf), xend = c(stats[1], stats[1]), y = c(-Inf, stats[2]), yend = c(stats[2], stats[2]) ) } Ty_label <- function() expression(italic(T(italic(y)))) Tyrep_label <- function() expression(italic(T)(italic(y)[rep])) bayesplot/R/bayesplot-helpers.R0000644000176200001440000003447314556270424016266 0ustar liggesusers#' Convenience functions for adding or changing plot details #' #' Convenience functions for adding to (and changing details of) ggplot objects #' (many of the objects returned by **bayesplot** functions). See the #' **Examples** section, below. #' #' @name bayesplot-helpers #' #' @param ... For the various `vline_`, `hline_`, and `abline_` #' functions, `...` is passed to [ggplot2::geom_vline()], #' [ggplot2::geom_hline()], and [ggplot2::geom_abline()], #' respectively, to control the appearance of the line(s). #' #' For functions ending in `_bg`, `...` is passed to #' [ggplot2::element_rect()]. #' #' For functions ending in `_text` or `_title`, `...` is passed #' to [ggplot2::element_text()]. #' #' For `xaxis_ticks` and `yaxis_ticks`, `...` is passed to #' [ggplot2::element_line()]. #' #' For `overlay_function`, `...` is passed to #' [ggplot2::stat_function()]. #' #' @return #' A **ggplot2** layer or [ggplot2::theme()] object that can be #' added to existing ggplot objects, like those created by many of the #' **bayesplot** plotting functions. See the **Details** section. #' #' @details #' \subsection{Add vertical, horizontal, and diagonal lines to plots}{ #' * `vline_at()` and `hline_at()` return an object created by either #' [ggplot2::geom_vline()] or [ggplot2::geom_hline()] that can be added to a #' ggplot object to draw a vertical or horizontal line (at one or several #' values). If `fun` is missing then the lines are drawn at the values in `v`. #' If `fun` is specified then the lines are drawn at the values returned by `fun(v)`. #' #' * `vline_0()` and `hline_0()` are wrappers for `vline_at()` and `hline_at()` #' with `v = 0` and `fun` missing. #' #' * `abline_01()` is a wrapper for [ggplot2::geom_abline()] with the intercept #' set to `0` and the slope set to `1`. #' #' * `lbub()` returns a _function_ that takes a single argument `x` and returns #' the lower and upper bounds (`lb`, `ub`) of the `100*p`\% central interval #' of `x`, as well as the median (if `med=TRUE`). #' } #' #' \subsection{Control appearance of facet strips}{ #' * `facet_text()` returns ggplot2 theme objects that can be added to an #' existing plot (ggplot object) to format the text in facet strips. #' #' * `facet_bg()` can be added to a plot to change the background of the facet strips. #' } #' #' \subsection{Move legend, remove legend, or style the legend text}{ #' * `legend_move()` and `legend_none()` return a ggplot2 theme object that can #' be added to an existing plot (ggplot object) in order to change the #' position of the legend or remove it. #' #' * `legend_text()` works much like `facet_text()` but for the legend. #' } #' #' \subsection{Control appearance of \eqn{x}-axis and \eqn{y}-axis features}{ #' * `xaxis_title()` and `yaxis_title()` return a ggplot2 theme object #' that can be added to an existing plot (ggplot object) in order to toggle or #' format the titles displayed on the `x` or `y` axis. (To change #' the titles themselves use [ggplot2::labs()].) #' #' * `xaxis_text()` and `yaxis_text()` return a ggplot2 theme object #' that can be added to an existing plot (ggplot object) in order to toggle or #' format the text displayed on the `x` or `y` axis (e.g. tick #' labels). #' #' * `xaxis_ticks()` and `yaxis_ticks()` return a ggplot2 theme object #' that can be added to an existing plot (ggplot object) to change the #' appearance of the axis tick marks. #' } #' #' \subsection{Customize plot background}{ #' * `plot_bg()` returns a ggplot2 theme object that can be added to an #' existing plot (ggplot object) to format the background of the *entire* plot. #' #' * `panel_bg()` returns a ggplot2 theme object that can be added to an #' existing plot (ggplot object) to format the background of the just the #' plotting area. #' #' * `grid_lines()` returns a ggplot2 theme object that can be added to #' an existing plot (ggplot object) to add grid lines to the plot background. #' } #' #' \subsection{Superimpose a function on an existing plot}{ #' * `overlay_function()` is a simple wrapper for [ggplot2::stat_function()] but #' with the `inherit.aes` argument fixed to `FALSE`. Fixing `inherit.aes=FALSE` #' will avoid potential errors due to the [ggplot2::aes()]thetic mapping used by #' certain **bayesplot** plotting functions. #' } #' #' @seealso [theme_default()] for the default ggplot theme used by #' **bayesplot**. #' #' @examples #' color_scheme_set("gray") #' x <- example_mcmc_draws(chains = 1) #' dim(x) #' colnames(x) #' #' #' ################################### #' ### vertical & horizontal lines ### #' ################################### #' (p <- mcmc_intervals(x, regex_pars = "beta")) #' #' # vertical line at zero (with some optional styling) #' p + vline_0() #' p + vline_0(linewidth = 0.25, color = "darkgray", linetype = 2) #' #' # vertical line(s) at specified values #' v <- c(-0.5, 0, 0.5) #' p + vline_at(v, linetype = 3, linewidth = 0.25) #' #' my_lines <- vline_at(v, alpha = 0.25, linewidth = 0.75 * c(1, 2, 1), #' color = c("maroon", "skyblue", "violet")) #' p + my_lines #' #' \donttest{ #' # add vertical line(s) at computed values #' # (three ways of getting lines at column means) #' color_scheme_set("brightblue") #' p <- mcmc_intervals(x, regex_pars = "beta") #' p + vline_at(x[, 3:4], colMeans) #' p + vline_at(x[, 3:4], "colMeans", color = "darkgray", #' lty = 2, linewidth = 0.25) #' p + vline_at(x[, 3:4], function(a) apply(a, 2, mean), #' color = "orange", #' linewidth = 2, alpha = 0.1) #' } #' #' # using the lbub function to get interval lower and upper bounds (lb, ub) #' color_scheme_set("pink") #' parsed <- ggplot2::label_parsed #' p2 <- mcmc_hist(x, pars = "beta[1]", binwidth = 1/20, #' facet_args = list(labeller = parsed)) #' (p2 <- p2 + facet_text(size = 16)) #' #' b1 <- x[, "beta[1]"] #' p2 + vline_at(b1, fun = lbub(0.8), color = "gray20", #' linewidth = 2 * c(1,.5,1), alpha = 0.75) #' p2 + vline_at(b1, lbub(0.8, med = FALSE), color = "gray20", #' linewidth = 2, alpha = 0.75) #' #' #' ########################## #' ### format axis titles ### #' ########################## #' color_scheme_set("green") #' y <- example_y_data() #' yrep <- example_yrep_draws() #' (p3 <- ppc_stat(y, yrep, stat = "median", binwidth = 1/4)) #' #' # turn off the legend, turn on x-axis title #' p3 + #' legend_none() + #' xaxis_title(size = 13, family = "sans") + #' ggplot2::xlab(expression(italic(T(y)) == median(italic(y)))) #' #' #' ################################ #' ### format axis & facet text ### #' ################################ #' color_scheme_set("gray") #' p4 <- mcmc_trace(example_mcmc_draws(), pars = c("alpha", "sigma")) #' #' myfacets <- #' facet_bg(fill = "gray30", color = NA) + #' facet_text(face = "bold", color = "skyblue", size = 14) #' p4 + myfacets #' #' \donttest{ #' ########################## #' ### control tick marks ### #' ########################## #' p4 + #' myfacets + #' yaxis_text(FALSE) + #' yaxis_ticks(FALSE) + #' xaxis_ticks(linewidth = 1, color = "skyblue") #' } #' #' ############################## #' ### change plot background ### #' ############################## #' color_scheme_set("blue") #' #' # add grid lines #' ppc_stat(y, yrep) + grid_lines() #' #' # panel_bg vs plot_bg #' ppc_scatter_avg(y, yrep) + panel_bg(fill = "gray90") #' ppc_scatter_avg(y, yrep) + plot_bg(fill = "gray90") #' #' color_scheme_set("yellow") #' p5 <- ppc_scatter_avg(y, yrep, alpha = 1) #' p5 + panel_bg(fill = "gray20") + grid_lines(color = "white") #' \donttest{ #' color_scheme_set("purple") #' ppc_dens_overlay(y, yrep[1:30, ]) + #' legend_text(size = 14) + #' legend_move(c(0.75, 0.5)) + #' plot_bg(fill = "gray90") + #' panel_bg(color = "black", fill = "gray99", linewidth = 3) #' } #' #' #' ############################################### #' ### superimpose a function on existing plot ### #' ############################################### #' # compare posterior of beta[1] to Gaussian with same posterior mean #' # and sd as beta[1] #' x <- example_mcmc_draws(chains = 4) #' dim(x) #' purple_gaussian <- #' overlay_function( #' fun = dnorm, #' args = list(mean(x[,, "beta[1]"]), sd(x[,, "beta[1]"])), #' color = "purple", #' linewidth = 2 #' ) #' #' color_scheme_set("gray") #' mcmc_hist(x, pars = "beta[1]", freq = FALSE) + purple_gaussian #' \donttest{ #' mcmc_dens(x, pars = "beta[1]") + purple_gaussian #' } #' NULL # lines ------------------------------------------------------------------- #' @rdname bayesplot-helpers #' @export #' @param v Either a numeric vector specifying the value(s) at which to #' draw the vertical or horizontal line(s), or an object of any type to use as #' the first argument to `fun`. #' @param fun A function, or the name of a function, that returns a numeric #' vector. #' @param na.rm A logical scalar passed to the appropriate geom (e.g. #' [ggplot2::geom_vline()]). The default is `TRUE`. #' vline_at <- function(v, fun, ..., na.rm = TRUE) { geom_vline(xintercept = calc_v(v, fun), na.rm = na.rm, ...) } #' @rdname bayesplot-helpers #' @export hline_at <- function(v, fun, ..., na.rm = TRUE) { geom_hline(yintercept = calc_v(v, fun), na.rm = na.rm, ...) } #' @rdname bayesplot-helpers #' @export vline_0 <- function(..., na.rm = TRUE) { geom_vline(xintercept = 0, na.rm = na.rm, ...) } #' @rdname bayesplot-helpers #' @export #' hline_0 <- function(..., na.rm = TRUE) { geom_hline(yintercept = 0, na.rm = na.rm, ...) } #' @rdname bayesplot-helpers #' @export #' abline_01 <- function(..., na.rm = TRUE) { geom_abline(intercept = 0, slope = 1, na.rm = na.rm, ...) } # intervals --------------------------------------------------------------- #' @rdname bayesplot-helpers #' @export #' @param p The probability mass (in `[0,1]`) to include in the interval. #' @param med Should the median also be included in addition to the lower #' and upper bounds of the interval? #' lbub <- function(p, med = TRUE) { function(x) calc_intervals(x, p, med = med) } # internal calc_v <- function(v, fun, fun_args, ...) { if (missing(v)) { abort("'v' can't be missing.") } if (missing(fun)) { return(v) } f <- match.fun(fun) if (missing(fun_args)) { return(f(v)) } do.call(f, c(list(v), fun_args)) } calc_intervals <- function(x, p, med = TRUE, ...) { a <- (1 - p) / 2 pr <- c(a, if (med) 0.5, 1 - a) quantile(x, pr, ...) } # legend stuff ------------------------------------------------------------ #' @rdname bayesplot-helpers #' @export #' @param position The position of the legend. Either a numeric vector (of #' length 2) giving the relative coordinates (between 0 and 1) for the legend, #' or a string among `"right"`, `"left"`, `"top"`, #' `"bottom"`. Using `position = "none"` is also allowed and is #' equivalent to using `legend_none()`. #' legend_move <- function(position = "right") { if (is.numeric(position) && "legend.position.inside" %in% fn_fmls_names(theme)) { theme(legend.position = "inside", legend.position.inside = position) } else { theme(legend.position = position) } } #' @rdname bayesplot-helpers #' @export legend_none <- function() { theme(legend.position = "none") } #' @rdname bayesplot-helpers #' @export legend_text <- function(...) { theme(legend.text = element_text(...)) } # axis stuff -------------------------------------------------------------- #' @rdname bayesplot-helpers #' @export xaxis_title <- function(on = TRUE, ...) { if (!on) { return(xlab(NULL)) } theme(axis.title.x = element_text(...)) } #' @rdname bayesplot-helpers #' @export xaxis_text <- function(on = TRUE, ...) { theme(axis.text.x = if (on) element_text(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export xaxis_ticks <- function(on = TRUE, ...) { theme(axis.ticks.x = if (on) element_line(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export yaxis_title <- function(on = TRUE, ...) { if (!on) return(ylab(NULL)) theme(axis.title.y = element_text(...)) } #' @rdname bayesplot-helpers #' @export yaxis_text <- function(on = TRUE, ...) { theme(axis.text.y = if (on) element_text(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export yaxis_ticks <- function(on = TRUE, ...) { theme(axis.ticks.y = if (on) element_line(...) else element_blank()) } # facet stuff ------------------------------------------------------------- #' @rdname bayesplot-helpers #' @export #' @param on For functions modifying ggplot [theme][ggplot2::theme] elements, #' set `on=FALSE` to set the element to [ggplot2::element_blank()]. For #' example, facet text can be removed by adding `facet_text(on=FALSE)`, or #' simply `facet_text(FALSE)` to a ggplot object. If `on=TRUE` (the default), #' then `...` can be used to customize the appearance of the theme element. #' facet_text <- function(on = TRUE, ...) { theme(strip.text = if (on) element_text(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export facet_bg <- function(on = TRUE, ...) { theme(strip.background = if (on) element_rect(...) else element_blank()) } # plot background --------------------------------------------------------- #' @rdname bayesplot-helpers #' @export panel_bg <- function(on = TRUE, ...) { theme(panel.background = if (on) element_rect(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export plot_bg <- function(on = TRUE, ...) { theme(plot.background = if (on) element_rect(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export #' @param color,size Passed to [ggplot2::element_line()]. #' grid_lines <- function(color = "gray50", size = 0.2) { theme( panel.grid.major = element_line(color = color, linewidth = size), panel.grid.minor = element_line(color = color, linewidth = size * 0.5) ) } grid_lines_y <- function(color = "gray50", size = 0.2) { theme( panel.grid.major.y = element_line(color = color, linewidth = size), panel.grid.minor.y = element_line(color = color, linewidth = size * 0.5) ) } # overlay functions on an existing plot ----------------------------------- #' @rdname bayesplot-helpers #' @export overlay_function <- function(...) { stat_function(..., inherit.aes = FALSE) } bayesplot/R/helpers-shared.R0000644000176200001440000000272614212422623015513 0ustar liggesusers#' Check for suggested package with `requireNamespace` and throw error if necessary #' #' @noRd #' @param pkg Package name as a string. #' @param min_version Optionally, a minimum version number as a string. #' @return `TRUE`, invisibly, if no error is thrown. #' suggested_package <- function(pkg, min_version = NULL) { stopifnot(length(pkg) == 1, is.character(pkg)) if (!requireNamespace(pkg, quietly = TRUE)) { abort(paste("Please install the", pkg, "package to use this function.")) } if (!is.null(min_version)) { stopifnot(is.character(min_version)) if (utils::packageVersion(pkg) < package_version(min_version)) { abort(paste( "Version >= ", min_version, "of the", pkg, "package is required to use this function." )) } } invisible(TRUE) } # Return x if not NULL, otherwise y `%||%` <- function(x, y) if (!is.null(x)) x else y #' Warn about ignored arguments #' #' @param ... The `...` arguments from the calling function. #' @param ok_args A character vector of argument names to ignore. #' @return Nothing, but a warning may be thrown. #' @noRd check_ignored_arguments <- function(..., ok_args = character()) { dots <- list(...) nms <- names(dots) if (length(dots)) { unrecognized <- if (!length(ok_args)) nms else setdiff(nms, ok_args) if (length(unrecognized)) { warn(paste( "The following arguments were unrecognized and ignored:", paste(unrecognized, collapse = ", ") )) } } } bayesplot/R/bayesplot-colors.R0000644000176200001440000003225714335264324016120 0ustar liggesusers#' Set, get, or view **bayesplot** color schemes #' #' Set, get, or view color schemes. Choose from a preset scheme or create a #' custom scheme. See the **Available color schemes** section below for a list #' of available scheme names. The **Custom color schemes** section describes how #' to specify a custom scheme. #' #' @name bayesplot-colors #' @param scheme For `color_scheme_set()`, either a string naming one of the #' available color schemes or a character vector of _exactly six_ colors #' specifying a custom scheme. #' #' For `color_scheme_get()`, `scheme` can be missing (to get the #' current color scheme) or a string naming one of the preset schemes. #' #' For `color_scheme_view()`, `scheme` can be missing (to use the #' current color scheme) or a character vector containing a subset of the #' available scheme names. #' #' See the **Available color schemes** section below for a list of available #' scheme names. The **Custom color schemes** section describes how to specify #' a custom scheme. #' #' @return `color_scheme_set()` has the side effect of setting the color scheme #' used for plotting. It also returns ([invisibly][base::invisible]) a list of #' the hexadecimal color values used in `scheme`. #' #' `color_scheme_get()` returns a list of the hexadecimal color #' values (without changing the current scheme). If the `scheme` argument #' is not specified the returned values correspond to the current color #' scheme. If the optional argument `i` is specified then the returned #' list only contains `length(i)` elements. #' #' `color_scheme_view()` returns a ggplot object if only a single scheme is #' specified and a gtable object if multiple schemes names are specified. #' #' @section Available color schemes: Currently, the available preset color #' schemes are: #' * `"blue"`, `"brightblue"` #' * `"gray"`, `"darkgray"` #' * `"green"` #' * `"pink"` #' * `"purple"` #' * `"red"` #' * `"teal"` #' * `"yellow"` #' * [`"viridis"`](https://CRAN.R-project.org/package=viridis), `"viridisA"`, #' `"viridisB"`, `"viridisC"`, `"viridisD"`, `"viridisE"` #' * `"mix-x-y"`, replacing `x` and `y` with any two of #' the scheme names listed above (e.g. "mix-teal-pink", "mix-blue-red", #' etc.). The order of `x` and `y` matters, i.e., the color schemes #' `"mix-blue-red"` and `"mix-red-blue"` are not identical. There is no #' guarantee that every possible mixed scheme will look good with every #' possible plot. #' * `"brewer-x"`, replacing `x` with the name of a palette available from #' [RColorBrewer::brewer.pal()] (e.g., `brewer-PuBuGn`). #' #' If you have a suggestion for a new color scheme please let us know via the #' **bayesplot** [issue tracker](https://github.com/stan-dev/bayesplot/issues). #' #' @section Custom color schemes: A **bayesplot** color scheme consists of six #' colors. To specify a custom color scheme simply pass a character vector #' containing either the names of six [colors][grDevices::colors] or six #' hexadecimal color values (or a mix of names and hex values). The colors #' should be in order from lightest to darkest. See the end of the #' **Examples** section for a demonstration. #' #' @template seealso-theme #' #' @examples #' color_scheme_set("blue") #' color_scheme_view() #' #' color_scheme_get() #' color_scheme_get(i = c(3, 5)) # 3rd and 5th colors only #' #' color_scheme_get("brightblue") #' color_scheme_view("brightblue") #' #' # compare multiple schemes #' color_scheme_view(c("pink", "gray", "teal")) #' color_scheme_view(c("viridis", "viridisA", "viridisB", "viridisC")) #' #' color_scheme_set("pink") #' x <- example_mcmc_draws() #' mcmc_intervals(x) #' #' color_scheme_set("teal") #' color_scheme_view() #' mcmc_intervals(x) #' #' color_scheme_set("red") #' mcmc_areas(x, regex_pars = "beta") #' #' color_scheme_set("purple") #' color_scheme_view() #' y <- example_y_data() #' yrep <- example_yrep_draws() #' ppc_stat(y, yrep, stat = "mean") + legend_none() #' #' ############################ #' ### Mixing color schemes ### #' ############################ #' color_scheme_set("mix-teal-pink") #' ppc_stat(y, yrep, stat = "sd") + legend_none() #' mcmc_areas(x, regex_pars = "beta") #' #' ########################## #' ### ColorBrewer scheme ### #' ########################## #' color_scheme_set("brewer-Spectral") #' color_scheme_view() #' mcmc_trace(x, pars = "sigma") #' #' ########################### #' ### Custom color scheme ### #' ########################### #' orange_scheme <- c("#ffebcc", "#ffcc80", #' "#ffad33", "#e68a00", #' "#995c00", "#663d00") #' color_scheme_set(orange_scheme) #' color_scheme_view() #' mcmc_areas(x, regex_pars = "alpha") #' mcmc_dens_overlay(x) #' ppc_stat(y, yrep, stat = "var") + legend_none() #' NULL #' @rdname bayesplot-colors #' @export color_scheme_set <- function(scheme = "blue") { if (!is.character(scheme)) { abort("'scheme' should be a character vector of length 1 or 6.") } if (length(scheme) == 1) { x <- scheme_from_string(scheme) } else if (length(scheme) == 6) { x <- prepare_custom_colors(scheme) } else { abort("'scheme' should be a character vector of length 1 or 6.") } .bayesplot_aesthetics[["scheme"]] <- x invisible(x) } #' @rdname bayesplot-colors #' @export #' @param i For `color_scheme_get()`, an optional subset of the integers from `1` #' (lightest) to `6` (darkest) indicating which of the colors in the #' scheme to return. If `i` is not specified then all six colors in the #' scheme are included. #' color_scheme_get <- function(scheme = NULL, i = NULL) { if (!is.null(scheme)) { scheme <- scheme_from_string(scheme) } else { x <- .bayesplot_aesthetics$scheme scheme <- as.list(x)[scheme_level_names()] attr(scheme, "mixed") <- attr(x, "mixed") attr(scheme, "scheme_name") <- attr(x, "scheme_name") } class(scheme) <- c("bayesplot_scheme", "list") if (is.null(i)) { return(scheme) } else if (is.character(i)) { return(get_color(i)) } stopifnot( all(i %in% seq_along(scheme)), length(unique(i)) == length(i) ) scheme[i] } #' @rdname bayesplot-colors #' @export color_scheme_view <- function(scheme = NULL) { if (is.null(scheme) || length(scheme) == 1){ return(plot_scheme(scheme)) } bayesplot_grid( plots = lapply(scheme, plot_scheme), grid_args = list(ncol = length(scheme)) ) } #' @export print.bayesplot_scheme <- function(x, ...) { tab <- data.frame(unlist(x, use.names = FALSE), stringsAsFactors = FALSE) colnames(tab) <- attr(x, "scheme_name") %||% "hex_color" print(tab, ...) } #' @export plot.bayesplot_scheme <- function(x, ...) { scheme <- attr(x, "scheme_name") %||% abort("Scheme name not found.") plot_scheme(scheme) } # internal ----------------------------------------------------------------- #' Plot color scheme #' @noRd #' @param scheme A string (length 1) naming a scheme. If `NULL` the current #' scheme is used. #' @return A ggplot object. plot_scheme <- function(scheme = NULL) { if (is.null(scheme)) { x <- color_scheme_get() } else { x <- color_scheme_get(scheme) } color_data <- data.frame( name = factor(attr(x, "scheme_name")), group = factor(names(x), levels = rev(names(x))), value = rep(1, length(x)) ) ggplot(color_data, aes(x = .data$name, y = .data$value, fill = .data$group)) + geom_bar( width = .5, stat = "identity", color = "white", linewidth = 0.1 ) + scale_fill_manual("", values = unlist(x)) + theme_void() + legend_none() + xaxis_text( face = "bold", margin = margin(t = -3, b = 10, unit = "pt"), angle = 0, vjust = 1, debug = FALSE ) } # Color scheme level names scheme_level_names <- function() { c("light", "light_highlight", "mid", "mid_highlight", "dark", "dark_highlight") } #' Return a color scheme based on `scheme` argument specified as a string #' @noRd #' @param scheme A string (length 1) naming a scheme. scheme_from_string <- function(scheme) { if (identical(substr(scheme, 1, 4), "mix-")) { # user specified a mixed scheme (e.g., "mix-blue-red") to_mix <- unlist(strsplit(scheme, split = "-"))[2:3] x <- set_names(mixed_scheme(to_mix[1], to_mix[2]), scheme_level_names()) return(structure(x, mixed = TRUE, scheme_name = scheme)) } else if (identical(substr(scheme, 1, 7), "brewer-")) { # user specified a ColorBrewer scheme (e.g., "brewer-Blues") if (!requireNamespace("RColorBrewer", quietly = TRUE)) { abort("Please install the 'RColorBrewer' package to use a ColorBrewer scheme.") } clrs <- RColorBrewer::brewer.pal(n = 6, name = gsub("brewer-", "", scheme)) x <- set_names(as.list(clrs), scheme_level_names()) return(structure(x, mixed = FALSE, scheme_name = scheme)) } else { # check for scheme in master_color_list scheme <- match.arg(scheme, choices = names(master_color_list)) x <- set_names(master_color_list[[scheme]], scheme_level_names()) return(structure(x, mixed = FALSE, scheme_name = scheme)) } } # create mixed scheme from two existing schemes mixed_scheme <- function(scheme1, scheme2) { scheme1 <- color_scheme_get(scheme1) scheme2 <- color_scheme_get(scheme2) scheme <- unname(list( scheme1$light, scheme2$light_highlight, scheme2$mid, scheme1$mid_highlight, scheme1$dark, scheme2$dark_highlight )) attr(scheme, "mixed") <- TRUE scheme } #' Check if object returned by `color_scheme_get()` is a mixed scheme #' @noRd #' @param x object returned by `color_scheme_get()` #' @return T/F is_mixed_scheme <- function(x) { stopifnot(is.list(x)) isTRUE(attr(x, "mixed")) } #' Access a subset of the current scheme colors #' @noRd #' @param levels A character vector of level names in `scheme_level_names()`. #' The abbreviations `"l", "lh", "m", "mh", "d", "dh"` can also be used #' instead of the full names. #' @return A character vector of color values. #' get_color <- function(levels) { levels <- full_level_name(levels) stopifnot(all(levels %in% scheme_level_names())) color_vals <- color_scheme_get()[levels] unlist(color_vals, use.names = FALSE) } full_level_name <- function(x) { map <- c( l = "light", lh = "light_highlight", m = "mid", mh = "mid_highlight", d = "dark", dh = "dark_highlight", light = "light", light_highlight = "light_highlight", mid = "mid", mid_highlight = "mid_highlight", dark = "dark", dark_highlight = "dark_highlight" ) unname(map[x]) } # Custom color scheme if 6 colors specified prepare_custom_colors <- function(scheme) { if (length(scheme) != 6) { abort("Custom color schemes must contain exactly 6 colors.") } not_found <- character(0) for (j in seq_along(scheme)) { clr <- scheme[j] if (!is_hex_color(clr) && !clr %in% grDevices::colors()) { not_found <- c(not_found, clr) } } if (length(not_found)) { abort(paste( "Each color must specified as either a hexadecimal color value ", "(e.g. '#C79999') or the name of a color (e.g. 'blue'). ", "The following provided colors were not found:", paste(unlist(not_found), collapse = ", ") )) } x <- set_names(as.list(scheme), scheme_level_names()) attr(x, "scheme_name") <- "custom" x } is_hex_color <- function(x) { if (!identical(substr(x, 1, 1), "#")) { return(FALSE) } isTRUE(nchar(x) == 7) } # master color list ------------------------------------------------------- master_color_list <- list( blue = list("#d1e1ec", "#b3cde0", "#6497b1", "#005b96", "#03396c", "#011f4b"), brightblue = list("#cce5ff", "#99cbff", "#4ca5ff", "#198bff", "#0065cc", "#004c99"), darkgray = list("#bfbfbf", "#999999", "#737373", "#505050", "#383838", "#0d0d0d"), gray = list("#DFDFDF", "#bfbfbf", "#999999", "#737373", "#505050", "#383838"), green = list("#d9f2e6", "#9fdfbf", "#66cc99", "#40bf80", "#2d8659", "#194d33"), orange = list("#fecba2", "#feb174", "#fe8a2f", "#e47115", "#b15810", "#7f3f0c"), pink = list("#dcbccc", "#c799b0", "#b97c9b", "#a25079", "#8f275b", "#7c003e"), purple = list("#e5cce5", "#bf7fbf", "#a64ca6", "#800080", "#660066", "#400040"), red = list("#DCBCBC", "#C79999", "#B97C7C", "#A25050", "#8F2727", "#7C0000"), teal = list("#bcdcdc", "#99c7c7", "#7cb9b9", "#50a2a2", "#278f8f", "#007C7C"), yellow = list("#fbf3da", "#f8e8b5", "#f5dc90", "#dbc376", "#aa975c", "#7a6c42"), viridis = list("#FDE725FF", "#7AD151FF", "#22A884FF", "#2A788EFF", "#414487FF", "#440154FF"), viridisA = list("#FCFDBFFF", "#FE9F6DFF", "#DE4968FF", "#8C2981FF", "#3B0F70FF", "#000004FF"), viridisB = list("#FCFFA4FF", "#FCA50AFF", "#DD513AFF", "#932667FF", "#420A68FF", "#000004FF"), viridisC = list("#F0F921FF", "#FCA636FF", "#E16462FF", "#B12A90FF", "#6A00A8FF", "#0D0887FF"), # popular form of viridis is viridis option D viridisD = list("#FDE725FF", "#7AD151FF", "#22A884FF", "#2A788EFF", "#414487FF", "#440154FF"), viridisE = list("#FFEA46FF", "#CBBA69FF", "#958F78FF", "#666970FF", "#31446BFF", "#00204DFF") ) # instantiate aesthetics -------------------------------------------------- .bayesplot_aesthetics <- new.env(parent = emptyenv()) .bayesplot_aesthetics$scheme <- list() color_scheme_set() bayesplot/R/mcmc-parcoord.R0000644000176200001440000001646314556270424015351 0ustar liggesusers#' Parallel coordinates plot of MCMC draws #' #' Parallel coordinates plot of MCMC draws (one dimension per parameter). #' See the **Plot Descriptions** section below for details, #' and see [Gabry et al. (2019)](https://github.com/jgabry/bayes-vis-paper#readme) #' for more background and a real example. #' #' @name MCMC-parcoord #' @family MCMC #' #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-transformations #' @param ... Currently ignored. #' @param size,alpha Arguments passed on to [ggplot2::geom_line()]. #' @param np For models fit using [NUTS] (more generally, #' any [symplectic integrator](https://en.wikipedia.org/wiki/Symplectic_integrator)), #' an optional data frame providing NUTS diagnostic information. The data #' frame should be the object returned by [nuts_params()] or one with the same #' structure. #' @param np_style A call to the `parcoord_style_np()` helper function to #' specify arguments controlling the appearance of superimposed lines #' representing NUTS diagnostics (in this case divergences) if the `np` #' argument is specified. #' #' @template return-ggplot-or-data #' #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_parcoord()`}{ #' [Parallel coordinates plot](https://en.wikipedia.org/wiki/Parallel_coordinates) #' of MCMC draws. There is one dimension per parameter along the horizontal #' axis and each set of connected line segments represents a single MCMC draw #' (i.e., a vector of length equal to the number of parameters). #' #' The parallel coordinates plot is most useful if the optional HMC/NUTS #' diagnostic information is provided via the `np` argument. In that #' case divergences are highlighted in the plot. The appearance of the #' divergences can be customized using the `np_style` argument and the #' `parcoord_style_np` helper function. This version of the plot is the #' same as the parallel coordinates plot described in Gabry et al. (2019). #' #' When the plotted model parameters are on very different scales the #' `transformations` argument can be useful. For example, to standardize #' all variables before plotting you could use function `(x - mean(x))/sd(x)` #' when specifying the `transformations` argument to #' `mcmc_parcoord`. See the **Examples** section for how to do this. #' } #' } #' #' @template reference-vis-paper #' @references Hartikainen, A. (2017, Aug 23). Concentration of divergences #' (Msg 21). Message posted to The Stan Forums: #' . #' #' @examples #' color_scheme_set("pink") #' x <- example_mcmc_draws(params = 5) #' mcmc_parcoord(x) #' mcmc_parcoord(x, regex_pars = "beta") #' #' \dontrun{ #' # Example using a Stan demo model #' library(rstan) #' fit <- stan_demo("eight_schools") #' draws <- as.array(fit, pars = c("mu", "tau", "theta", "lp__")) #' np <- nuts_params(fit) #' str(np) #' levels(np$Parameter) #' #' color_scheme_set("brightblue") #' mcmc_parcoord(draws, alpha = 0.05) #' mcmc_parcoord(draws, np = np) #' #' # customize appearance of divergences #' color_scheme_set("darkgray") #' div_style <- parcoord_style_np(div_color = "green", div_size = 0.05, div_alpha = 0.4) #' mcmc_parcoord(draws, size = 0.25, alpha = 0.1, #' np = np, np_style = div_style) #' #' # to use a transformation (e.g., standardizing all the variables can be helpful) #' # specify the 'transformations' argument (though partial argument name #' # matching means we can just use 'trans' or 'transform') #' mcmc_parcoord( #' draws, #' transform = function(x) {(x - mean(x)) / sd(x)}, #' size = 0.25, #' alpha = 0.1, #' np = np, #' np_style = div_style #' ) #' #' # mcmc_parcoord_data returns just the data in a conventient form for plotting #' d <- mcmc_parcoord_data(x, np = np) #' head(d) #' tail(d) #'} #' NULL #' @rdname MCMC-parcoord #' @export mcmc_parcoord <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., size = 0.2, alpha = 0.3, np = NULL, np_style = parcoord_style_np()) { check_ignored_arguments(...) stopifnot(inherits(np_style, "nuts_style")) data <- mcmc_parcoord_data( x = x, pars = pars, regex_pars = regex_pars, transformations = transformations, np = np ) divg <- sym("Divergent") draws <- dplyr::filter(data, UQ(divg) == 0) div_draws <- dplyr::filter(data, UQ(divg) == 1) has_divs <- isTRUE(nrow(div_draws) > 0) graph <- ggplot(draws, aes( x = .data$Parameter, y = .data$Value, group = factor(.data$Draw) )) + geom_line( linewidth = size, alpha = alpha, color = get_color("dh") ) + bayesplot_theme_get() if (has_divs) { graph <- graph + geom_line( data = div_draws, linewidth = np_style$size[["div"]], alpha = np_style$alpha[["div"]], color = np_style$color[["div"]] ) } graph + scale_x_discrete(expand = c(0,0), labels = levels(draws$Parameter)) + expand_limits(x = nlevels(draws$Parameter) + 0.25) + labs(x = NULL, y = NULL) } #' @rdname MCMC-parcoord #' @export #' @importFrom dplyr n left_join mutate group_by ungroup select arrange rename mcmc_parcoord_data <- function(x, pars = character(), regex_pars = character(), transformations = list(), np = NULL ) { x <- prepare_mcmc_array(x, pars, regex_pars, transformations) long_d <- melt_mcmc(x) if (num_params(long_d) < 2) { abort("'mcmc_parcoord' requires at least two parameters in 'x'.") } param <- sym("Parameter") value <- sym("Value") if (is.null(np)) { # still include 'Divergent' so returned object always has same columns long_d$Divergent <- 0 } else { # join with divergence info (both long_d and np have columns # 'Parameter' and 'Value' so need to be a little careful) divs <- np %>% validate_nuts_data_frame() %>% dplyr::filter(UQ(param) == "divergent__") %>% select(- !!param) %>% rename("Divergent" = !!value) long_d <- left_join(long_d, divs, by = c("Iteration", "Chain")) } keep_cols <- syms(c("Draw", "Parameter", "Value", "Divergent")) long_d %>% group_by(!! param) %>% mutate(Draw = 1:n()) %>% ungroup() %>% select(!!! keep_cols) } #' @rdname MCMC-parcoord #' @export #' @param div_color,div_size,div_alpha Optional arguments to the #' `parcoord_style_np()` helper function that are eventually passed to #' [ggplot2::geom_line()] if the `np` argument is also specified. They control #' the color, size, and transparency specifications for showing divergences in #' the plot. The default values are displayed in the **Usage** section above. parcoord_style_np <- function(div_color = "red", div_size = 0.2, div_alpha = 0.2) { stopifnot( is.character(div_color), is.numeric(div_size), is.numeric(div_alpha) && div_alpha >= 0 && div_alpha <= 1 ) style <- list( color = c(div = div_color), size = c(div = div_size), alpha = c(div = div_alpha) ) structure(style, class = c(class(style), "nuts_style")) } bayesplot/R/ppc-errors.R0000644000176200001440000003277114556465326014726 0ustar liggesusers#' PPC errors #' #' Various plots of predictive errors `y - yrep`. See the #' **Details** and **Plot Descriptions** sections, below. #' #' @name PPC-errors #' @family PPCs #' #' @template args-y-yrep #' @template args-group #' @template args-facet_args #' @param ... Currently unused. #' @param size,alpha For scatterplots, arguments passed to #' [ggplot2::geom_point()] to control the appearance of the points. For the #' binned error plot, arguments controlling the size of the outline and #' opacity of the shaded region indicating the 2-SE bounds. #' #' @details #' All of these functions (aside from the `*_scatter_avg` functions) #' compute and plot predictive errors for each row of the matrix `yrep`, so #' it is usually a good idea for `yrep` to contain only a small number of #' draws (rows). See **Examples**, below. #' #' For binomial and Bernoulli data the `ppc_error_binned()` function can be used #' to generate binned error plots. Bernoulli data can be input as a vector of 0s #' and 1s, whereas for binomial data `y` and `yrep` should contain "success" #' proportions (not counts). See the **Examples** section, below. #' #' @section Plot descriptions: #' \describe{ #' \item{`ppc_error_hist()`}{ #' A separate histogram is plotted for the predictive errors computed from #' `y` and each dataset (row) in `yrep`. For this plot `yrep` should have #' only a small number of rows. #' } #' \item{`ppc_error_hist_grouped()`}{ #' Like `ppc_error_hist()`, except errors are computed within levels of a #' grouping variable. The number of histograms is therefore equal to the #' product of the number of rows in `yrep` and the number of groups #' (unique values of `group`). #' } #' \item{`ppc_error_scatter()`}{ #' A separate scatterplot is displayed for `y` vs. the predictive errors #' computed from `y` and each dataset (row) in `yrep`. For this plot `yrep` #' should have only a small number of rows. #' } #' \item{`ppc_error_scatter_avg()`}{ #' A single scatterplot of `y` vs. the average of the errors computed from #' `y` and each dataset (row) in `yrep`. For each individual data point #' `y[n]` the average error is the average of the errors for `y[n]` computed #' over the the draws from the posterior predictive distribution. #' } #' \item{`ppc_error_scatter_avg_vs_x()`}{ #' Same as `ppc_error_scatter_avg()`, except the average is plotted on the #' y-axis and a predictor variable `x` is plotted on the x-axis. #' } #' \item{`ppc_error_binned()`}{ #' Intended for use with binomial data. A separate binned error plot (similar #' to `arm::binnedplot()`) is generated for each dataset (row) in `yrep`. For #' this plot `y` and `yrep` should contain proportions rather than counts, #' and `yrep` should have only a small number of rows. #' } #' } #' #' @template return-ggplot #' #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' #' @examples #' y <- example_y_data() #' yrep <- example_yrep_draws() #' ppc_error_hist(y, yrep[1:3, ]) #' #' # errors within groups #' group <- example_group_data() #' (p1 <- ppc_error_hist_grouped(y, yrep[1:3, ], group)) #' p1 + yaxis_text() # defaults to showing counts on y-axis #' \donttest{ #' table(group) # more obs in GroupB, can set freq=FALSE to show density on y-axis #' (p2 <- ppc_error_hist_grouped(y, yrep[1:3, ], group, freq = FALSE)) #' p2 + yaxis_text() #' } #' #' # scatterplots #' ppc_error_scatter(y, yrep[10:14, ]) #' ppc_error_scatter_avg(y, yrep) #' #' x <- example_x_data() #' ppc_error_scatter_avg_vs_x(y, yrep, x) #' #' \dontrun{ #' # binned error plot with binomial model from rstanarm #' library(rstanarm) #' example("example_model", package = "rstanarm") #' formula(example_model) #' #' # get observed proportion of "successes" #' y <- example_model$y # matrix of "success" and "failure" counts #' trials <- rowSums(y) #' y_prop <- y[, 1] / trials # proportions #' #' # get predicted success proportions #' yrep <- posterior_predict(example_model) #' yrep_prop <- sweep(yrep, 2, trials, "/") #' #' ppc_error_binned(y_prop, yrep_prop[1:6, ]) #' } #' NULL #' @rdname PPC-errors #' @export #' @template args-hist #' @template args-hist-freq ppc_error_hist <- function(y, yrep, ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE) { dots <- list(...) if (!from_grouped(dots)) { check_ignored_arguments(...) dots$group <- NULL } data <- ppc_error_data(y, yrep, group = dots$group) ggplot(data, set_hist_aes(freq)) + geom_histogram( fill = get_color("l"), color = get_color("lh"), size = 0.25, binwidth = binwidth, bins = bins, breaks = breaks ) + xlab(error_label()) + bayesplot_theme_get() + dont_expand_y_axis() + error_hist_facets( facet_args, grouped = FALSE, ignore = nrow(yrep) == 1 ) + force_axes_in_facets() + yaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + facet_text(FALSE) } #' @rdname PPC-errors #' @export ppc_error_hist_grouped <- function(y, yrep, group, ..., facet_args = list(), binwidth = NULL, bins = NULL, breaks = NULL, freq = TRUE) { check_ignored_arguments(...) call <- match.call(expand.dots = FALSE) g <- eval(ungroup_call("ppc_error_hist", call), parent.frame()) g + error_hist_facets(facet_args, grouped = TRUE) + facet_text() + theme(strip.text.y = element_blank()) } #' @rdname PPC-errors #' @export ppc_error_scatter <- function(y, yrep, ..., facet_args = list(), size = 2.5, alpha = 0.8) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) errors <- compute_errors(y, yrep) ppc_scatter( y = y, yrep = errors, facet_args = facet_args, size = size, alpha = alpha, ref_line = FALSE ) + labs(x = error_label(), y = y_label()) } #' @rdname PPC-errors #' @export ppc_error_scatter_avg <- function(y, yrep, ..., size = 2.5, alpha = 0.8) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) errors <- compute_errors(y, yrep) ppc_scatter_avg( y = y, yrep = errors, size = size, alpha = alpha, ref_line = FALSE ) + labs(x = error_avg_label(), y = y_label()) } #' @rdname PPC-errors #' @export ppc_error_scatter_avg_grouped <- function(y, yrep, group, ..., facet_args = list(), size = 2.5, alpha = 0.8) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) errors <- compute_errors(y, yrep) ppc_scatter_avg_grouped( y = y, yrep = errors, group = group, size = size, alpha = alpha, facet_args = facet_args, ref_line = FALSE ) + labs(x = error_avg_label(), y = y_label()) } #' @rdname PPC-errors #' @export #' @param x A numeric vector the same length as `y` to use as the x-axis #' variable. #' ppc_error_scatter_avg_vs_x <- function(y, yrep, x, ..., size = 2.5, alpha = 0.8) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) x <- validate_x(x, y) errors <- compute_errors(y, yrep) ppc_scatter_avg( y = x, yrep = errors, size = size, alpha = alpha, ref_line = FALSE ) + labs(x = error_avg_label(), y = expression(italic(x))) + coord_flip() } #' @rdname PPC-errors #' @export #' @param bins For `ppc_error_binned()`, the number of bins to use (approximately). ppc_error_binned <- function(y, yrep, ..., facet_args = list(), bins = NULL, size = 1, alpha = 0.25) { check_ignored_arguments(...) data <- ppc_error_binnned_data(y, yrep, bins = bins) facet_layer <- if (nrow(yrep) == 1) { geom_ignore() } else { facet_args[["facets"]] <- "rep_id" do.call("facet_wrap", facet_args) } mixed_scheme <- is_mixed_scheme(color_scheme_get()) point_fill <- get_color(ifelse(mixed_scheme, "m", "d")) point_color <- get_color(ifelse(mixed_scheme, "mh", "dh")) ggplot(data, aes(x = .data$ey_bar)) + hline_0(linetype = 2, color = "black") + geom_ribbon( mapping = aes(ymax = .data$se2, ymin = -.data$se2), fill = get_color("l"), color = NA, alpha = alpha ) + geom_path( mapping = aes(y = .data$se2), color = get_color("l"), linewidth = size ) + geom_path( mapping = aes(y = -.data$se2), color = get_color("l"), linewidth = size ) + geom_point( mapping = aes(y = .data$err_bar), shape = 21, fill = point_fill, color = point_color ) + labs( x = "Predicted proportion", y = "Average Errors \n (with 2SE bounds)" ) + bayesplot_theme_get() + facet_layer + force_axes_in_facets() + facet_text(FALSE) } #' @rdname PPC-errors #' @export ppc_error_data <- function(y, yrep, group = NULL) { y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) if (!is.null(group)) { group <- validate_group(group, length(y)) } errors <- compute_errors(y, yrep) %>% melt_predictions() errors <- tibble::add_column(errors, y_obs = y[errors$y_id], .before = "rep_id") if (!is.null(group)) { errors <- tibble::add_column(errors, group = group[errors$y_id], .before = "y_id") } errors } # internal ---------------------------------------------------------------- #' Compute predictive errors `y` - `yrep` #' @noRd #' @param y,yrep User's `y` and `yrep` arguments. #' @return A matrix with the same dimensions as `yrep` compute_errors <- function(y, yrep) { suggested_package("rstantools") rstantools::predictive_error(object = yrep, y = y) } #' Create facet layer for PPC error plots #' #' The default is to use `scales="fixed"` (which I think makes sense for looking #' at errors, right?) if not specified in `facet_args`. #' #' @param User's `facet_args` argument. #' @param grouped If `FALSE` then does faceting by `rep_id`, if `TRUE` then both #' `rep_id` and `group`. #' @param ignore If `TRUE` then `geom_ignore()` is returned. This is intended to #' allow turning off facets if there is only one plot to make. #' @param scales_default What to use for the `scales` argument to `facet_*()` if #' not specified in `facet_args`. #' @return Object returned by `facet_wrap()` or `facet_grid()` (unless `ignore=TRUE`). #' @noRd error_hist_facets <- function(facet_args, grouped = FALSE, ignore = FALSE, scales_default = "fixed") { if (ignore) { return(geom_ignore()) } if (grouped) { facet_fun <- "facet_grid" facet_args[["rows"]] <- vars(.data$rep_id) facet_args[["cols"]] <- vars(.data$group) } else { facet_fun <- "facet_wrap" facet_args[["facets"]] <- vars(.data$rep_id) } facet_args[["scales"]] <- facet_args[["scales"]] %||% scales_default do.call(facet_fun, facet_args) } error_label <- function() { expression(italic(y) - italic(y)[rep]) } error_avg_label <- function() { expression(paste("Average ", italic(y) - italic(y)[rep])) } # Data for binned errors plots ppc_error_binnned_data <- function(y, yrep, bins = NULL) { y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) if (is.null(bins)) { bins <- n_bins(length(y)) } errors <- compute_errors(y, yrep) binned_errs <- list() for (s in 1:nrow(errors)) { binned_errs[[s]] <- bin_errors( ey = yrep[s, ], r = errors[s, ], bins = bins, rep_id = s ) } binned_errs <- dplyr::bind_rows(binned_errs) tibble::as_tibble(binned_errs) } # calculate number of bins binned_error_data() # @parmam N Number of data points, length(y) n_bins <- function(N) { if (N <= 10) { return(floor(N / 2)) } else if (N > 10 && N < 100) { return(10) } else { # N >= 100 return(floor(sqrt(N))) } } bin_errors <- function(ey, r, bins, rep_id = NULL) { N <- length(ey) break_ids <- floor(N * (1:(bins - 1)) / bins) if (any(break_ids == 0)) { bins <- 1 } if (bins == 1) { breaks <- c(-Inf, sum(range(ey)) / 2, Inf) } else { ey_sort <- sort(ey) breaks <- -Inf for (i in 1:(bins - 1)) { break_i <- break_ids[i] ey_range <- ey_sort[c(break_i, break_i + 1)] if (diff(ey_range) == 0) { if (ey_range[1] == min(ey)) { ey_range[1] <- -Inf } else { ey_range[1] <- max(ey[ey < ey_range[1]]) } } breaks <- c(breaks, sum(ey_range) / 2) } breaks <- unique(c(breaks, Inf)) } ey_binned <- as.numeric(cut(ey, breaks)) bins <- length(breaks) - 1 out <- matrix(NA, nrow = bins, ncol = 4) colnames(out) <- c("ey_bar", "err_bar", "se2", "bin") for (i in 1:bins) { mark <- which(ey_binned == i) ey_bar <- mean(ey[mark]) r_bar <- mean(r[mark]) s <- if (length(r[mark]) > 1) sd(r[mark]) else 0 out[i, ] <- c(ey_bar, r_bar, 2 * s / sqrt(length(mark)), i) } out <- as.data.frame(out) if (!is.null(rep_id)) { out$rep_id <- as.integer(rep_id) } return(out) } bayesplot/R/bayesplot-ggplot-themes.R0000644000176200001440000001405514556270424017375 0ustar liggesusers#' Default **bayesplot** plotting theme #' #' The [theme_default()] function returns the default ggplot #' [theme][ggplot2::theme] used by the **bayesplot** plotting functions. See #' [bayesplot_theme_set()] for details on setting and updating the plotting #' theme. #' #' @export #' @param base_size,base_family Base font size and family (passed to #' [ggplot2::theme_bw()]). It is possible to set `"bayesplot.base_size"` and #' `"bayesplot.base_family"` via [options()] to change the defaults, which are #' `12` and `"serif"`, respectively. #' @return A ggplot [theme][ggplot2::theme] object. #' #' @seealso [bayesplot_theme_set()] to change the ggplot theme. #' @template seealso-colors #' @template seealso-helpers #' #' @examples #' class(theme_default()) #' #' bayesplot_theme_set() # defaults to setting theme_default() #' x <- example_mcmc_draws() #' mcmc_hist(x) #' #' # change the default font size and family for bayesplots #' bayesplot_theme_set(theme_default(base_size = 8, base_family = "sans")) #' mcmc_hist(x) #' mcmc_areas(x, regex_pars = "beta") #' #' # change back #' bayesplot_theme_set() #' mcmc_areas(x, regex_pars = "beta") #' theme_default <- function(base_size = getOption("bayesplot.base_size", 12), base_family = getOption("bayesplot.base_family", "serif")) { theme_bw( base_family = base_family, base_size = base_size ) + theme( plot.background = element_blank(), panel.grid = element_blank(), panel.background = element_blank(), panel.border = element_blank(), axis.line = element_line(linewidth = 0.4), axis.ticks = element_line(linewidth = 0.3), strip.background = element_blank(), strip.text = element_text(size = rel(0.9)), strip.placement = "outside", # strip.background = element_rect(fill = "gray95", color = NA), panel.spacing = unit(1.5, "lines"), legend.position = "right", legend.background = element_blank(), legend.text = element_text(size = 13, hjust = 0), legend.key = element_blank() ) } #' Get, set, and modify the active **bayesplot** theme #' #' @description These functions are the **bayesplot** equivalent to #' **ggplot2**'s [ggplot2::theme_set()] and friends. They set, get, and update #' the active theme but only apply them to `bayesplots`. The current/active #' theme is automatically applied to every `bayesplot` you draw. #' #' Use `bayesplot_theme_get()` to get the current **bayesplot** theme and #' `bayesplot_theme_set()` to set a new theme. `bayesplot_theme_update()` and #' `bayesplot_theme_replace()` are shorthands for changing individual elements. #' #' @details `bayesplot_theme_set()` and friends only apply to `bayesplots`. #' However, [ggplot2::theme_set()] can also be used to change the #' **bayesplot** theme. Currently, setting a theme with `ggplot2::theme_set()` #' (other than the **ggplot2** default [ggplot2::theme_grey()]) will override #' the **bayesplot** theme. #' #' @export #' @param new The new theme (list of theme elements) to use. This is analogous #' to the `new` argument to [ggplot2::theme_set()]. #' @param ... A named list of theme settings. #' #' @return `bayesplot_theme_get()` returns the current theme. The other three #' functions (set, update, replace) invisibly return the *previous* theme #' so it can be saved and easily restored later. This is the same behavior as #' the **ggplot2** versions of these functions. #' #' @seealso [theme_default()] for the default **bayesplot** theme. #' @template seealso-helpers #' @template seealso-colors #' #' @examples #' library(ggplot2) #' #' # plot using the current value of bayesplot_theme_get() #' # (the default is bayesplot::theme_default()) #' x <- example_mcmc_draws() #' mcmc_hist(x) #' #' # change the bayesplot theme to theme_minimal and save the old theme #' old <- bayesplot_theme_set(theme_minimal()) #' mcmc_hist(x) #' #' # change back to the previous theme #' bayesplot_theme_set(old) #' mcmc_hist(x) #' #' # change the default font size and family for bayesplots #' bayesplot_theme_update(text = element_text(size = 16, family = "sans")) #' mcmc_hist(x) #' #' # change back to the default #' bayesplot_theme_set() # same as bayesplot_theme_set(theme_default()) #' mcmc_hist(x) #' #' # updating theme elements #' color_scheme_set("brightblue") #' bayesplot_theme_set(theme_dark()) #' mcmc_hist(x) #' #' bayesplot_theme_update(panel.background = element_rect(fill = "black")) #' mcmc_hist(x) #' #' # to get the same plot without updating the theme we could also have #' # used the bayeplot convenience function panel_bg() #' bayesplot_theme_set(theme_dark()) #' mcmc_hist(x) + panel_bg(fill = "black") #' #' # reset #' bayesplot_theme_set() #' bayesplot_theme_get <- function() { if (!identical(.bayesplot_theme_env$gg_current, ggplot2::theme_get())) { .bayesplot_theme_env$current <- ggplot2::theme_get() .bayesplot_theme_env$gg_current <- ggplot2::theme_get() thm <- .bayesplot_theme_env$gg_current } else { thm <- .bayesplot_theme_env$current } thm } #' @rdname bayesplot_theme_get #' @export bayesplot_theme_set <- function(new = theme_default()) { missing <- setdiff(names(ggplot2::theme_gray()), names(new)) if (length(missing)) { warn(paste( "New theme missing the following elements:", paste(missing, collapse = ", ") )) } old <- .bayesplot_theme_env$current .bayesplot_theme_env$current <- new .bayesplot_theme_env$gg_current <- ggplot2::theme_get() invisible(old) } #' @rdname bayesplot_theme_get #' @export bayesplot_theme_update <- function(...) { bayesplot_theme_set(bayesplot_theme_get() + ggplot2::theme(...)) } #' @rdname bayesplot_theme_get #' @export #' @importFrom ggplot2 %+replace% bayesplot_theme_replace <- function(...) { bayesplot_theme_set(bayesplot_theme_get() %+replace% ggplot2::theme(...)) } # internal ---------------------------------------------------------------- .bayesplot_theme_env <- new.env(parent = emptyenv()) .bayesplot_theme_env$current <- theme_default() .bayesplot_theme_env$gg_current <- ggplot2::theme_grey() bayesplot/R/available-module-functions.R0000644000176200001440000000710414212422623020011 0ustar liggesusers#' Get or view the names of available plotting or data functions #' #' @export #' @param pattern,fixed,invert Passed to [base::grep()]. #' @param plots_only If `TRUE` (the default) only plotting functions are #' searched for. If `FALSE` then functions that return data for plotting #' (functions ending in `_data()`) are also included. #' @return A possibly empty character vector of function names with several #' additional attributes (for use by a custom print method). If `pattern` #' is missing then the returned object contains the names of all available #' plotting functions in the [MCMC], [PPC], or [PPD] module, depending on #' which function is called. If `pattern` is specified then a subset of #' function names is returned. #' #' @examples #' available_mcmc() #' available_mcmc("nuts") #' available_mcmc("rhat|neff") #' #' available_ppc() #' available_ppc("grouped") #' available_ppc("grouped", invert = TRUE) #' #' available_ppd() #' available_ppd("grouped") #' #' # can also see which functions that return data are available #' available_ppc(plots_only = FALSE) #' #' # only show the _data functions #' available_ppc("_data", plots_only = FALSE) #' available_ppd("_data", plots_only = FALSE) #' available_mcmc("_data", plots_only = FALSE) #' available_ppc <- function(pattern = NULL, fixed = FALSE, invert = FALSE, plots_only = TRUE) { .list_module_functions( .module = "ppc", .pattern = pattern, fixed = fixed, invert = invert, plots_only = plots_only ) } #' @rdname available_ppc #' @export available_ppd <- function(pattern = NULL, fixed = FALSE, invert = FALSE, plots_only = TRUE) { .list_module_functions( .module = "ppd", .pattern = pattern, fixed = fixed, invert = invert, plots_only = plots_only ) } #' @rdname available_ppc #' @export available_mcmc <- function(pattern = NULL, fixed = FALSE, invert = FALSE, plots_only = TRUE) { .list_module_functions( .module = "mcmc", .pattern = pattern, fixed = fixed, invert = invert, plots_only = plots_only ) } #' @export print.bayesplot_function_list <- function(x, ...) { atts <- attributes(x) cat("bayesplot", toupper(atts[["module"]]), "module:\n") if (!is.null(atts[["pattern"]])) { msg <- paste0("(", ifelse(atts[["inverted"]], "excluding", "matching"), " pattern '", atts[["pattern"]], "')") cat(msg, "\n") } cat(paste0(" ", x), sep = "\n") invisible(x) } # internal ---------------------------------------------------------------- .list_module_functions <- function(.module = c("ppc", "ppd", "mcmc"), .pattern, fixed = FALSE, invert = FALSE, plots_only = TRUE) { .module <- match.arg(.module) all_funs <- grep( pattern = paste0("^", .module, "_"), x = getNamespaceExports("bayesplot"), value = TRUE ) return_funs <- sort(all_funs) if (plots_only) { # drop _data() functions return_funs <- grep( pattern = "_data()", x = return_funs, invert = TRUE, value = TRUE ) } if (!is.null(.pattern)) { return_funs <- grep( pattern = .pattern, x = return_funs, value = TRUE, fixed = fixed, invert = invert ) } structure( return_funs, class = c("bayesplot_function_list", "character"), module = .module, pattern = .pattern, inverted = invert ) } bayesplot/R/mcmc-diagnostics.R0000644000176200001440000004311314556465326016046 0ustar liggesusers#' General MCMC diagnostics #' #' Plots of Rhat statistics, ratios of effective sample size to total sample #' size, and autocorrelation of MCMC draws. See the **Plot Descriptions** #' section, below, for details. For models fit using the No-U-Turn-Sampler, see #' also [MCMC-nuts] for additional MCMC diagnostic plots. #' #' @name MCMC-diagnostics #' @family MCMC #' #' @template args-hist #' @param size Optional values to override [ggplot2::geom_point()]'s #' default size (for `mcmc_rhat()`, `mcmc_neff()`) or #' [ggplot2::geom_line()]'s default line width (for `mcmc_acf()`). #' @param ... Currently ignored. #' #' @template return-ggplot-or-data #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_rhat()`, `mcmc_rhat_hist()`}{ #' Rhat values as either points or a histogram. Values are colored using #' different shades (lighter is better). The chosen thresholds are somewhat #' arbitrary, but can be useful guidelines in practice. #' * _light_: below 1.05 (good) #' * _mid_: between 1.05 and 1.1 (ok) #' * _dark_: above 1.1 (too high) #' } #' #' \item{`mcmc_neff()`, `mcmc_neff_hist()`}{ #' Ratios of effective sample size to total sample size as either points or a #' histogram. Values are colored using different shades (lighter is better). #' The chosen thresholds are somewhat arbitrary, but can be useful guidelines #' in practice. #' * _light_: between 0.5 and 1 (high) #' * _mid_: between 0.1 and 0.5 (good) #' * _dark_: below 0.1 (low) #' } #' #' \item{`mcmc_acf()`, `mcmc_acf_bar()`}{ #' Grid of autocorrelation plots by chain and parameter. The `lags` argument #' gives the maximum number of lags at which to calculate the autocorrelation #' function. `mcmc_acf()` is a line plot whereas `mcmc_acf_bar()` is a #' barplot. #' } #'} #' #' @template reference-stan-manual #' @references #' Gelman, A. and Rubin, D. B. (1992). Inference from iterative #' simulation using multiple sequences. *Statistical Science*. 7(4), #' 457--472. #' #' @seealso #' * The [Visual MCMC Diagnostics](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) #' vignette. #' * [MCMC-nuts] for additional MCMC diagnostic plots for models fit #' using the No-U-Turn-Sampler. #' #' @examples #' # autocorrelation #' x <- example_mcmc_draws() #' dim(x) #' dimnames(x) #' #' color_scheme_set("green") #' mcmc_acf(x, pars = c("alpha", "beta[1]")) #' \donttest{ #' color_scheme_set("pink") #' (p <- mcmc_acf_bar(x, pars = c("alpha", "beta[1]"))) #' #' # add horiztonal dashed line at 0.5 #' p + hline_at(0.5, linetype = 2, size = 0.15, color = "gray") #' } #' #' # fake rhat values to use for demonstration #' rhat <- c(runif(100, 1, 1.15)) #' mcmc_rhat_hist(rhat) #' mcmc_rhat(rhat) #' #' # lollipops #' color_scheme_set("purple") #' mcmc_rhat(rhat[1:10], size = 5) #' #' color_scheme_set("blue") #' mcmc_rhat(runif(1000, 1, 1.07)) #' mcmc_rhat(runif(1000, 1, 1.3)) + legend_move("top") # add legend above plot #' #' # fake neff ratio values to use for demonstration #' ratio <- c(runif(100, 0, 1)) #' mcmc_neff_hist(ratio) #' mcmc_neff(ratio) #' #' \dontrun{ #' # Example using rstanarm model (requires rstanarm package) #' library(rstanarm) #' #' # intentionally use small 'iter' so there are some #' # problems with rhat and neff for demonstration #' fit <- stan_glm(mpg ~ ., data = mtcars, iter = 50, refresh = 0) #' rhats <- rhat(fit) #' ratios <- neff_ratio(fit) #' mcmc_rhat(rhats) #' mcmc_neff(ratios, size = 3) #' #' # there's a small enough number of parameters in the #' # model that we can display their names on the y-axis #' mcmc_neff(ratios) + yaxis_text(hjust = 1) #' #' # can also look at autocorrelation #' draws <- as.array(fit) #' mcmc_acf(draws, pars = c("wt", "cyl"), lags = 10) #' #' # increase number of iterations and plots look much better #' fit2 <- update(fit, iter = 500) #' mcmc_rhat(rhat(fit2)) #' mcmc_neff(neff_ratio(fit2)) #' mcmc_acf(as.array(fit2), pars = c("wt", "cyl"), lags = 10) #' } #' NULL # Rhat -------------------------------------------------------------------- #' @rdname MCMC-diagnostics #' @export #' @param rhat A vector of R-hat estimates. #' mcmc_rhat <- function(rhat, ..., size = NULL) { check_ignored_arguments(...) data <- mcmc_rhat_data(rhat) graph <- ggplot( data = data, mapping = aes( x = .data$value, y = .data$parameter, color = .data$rating, fill = .data$rating)) + geom_segment( mapping = aes( yend = .data$parameter, xend = ifelse(min(.data$value) < 1, 1, -Inf)), na.rm = TRUE) + bayesplot_theme_get() if (min(data$value) < 1) { graph <- graph + vline_at(1, color = "gray", linewidth = 1) } brks <- set_rhat_breaks(data$value) graph + diagnostic_points(size) + vline_at( brks[-1], color = "gray", linetype = 2, linewidth = 0.25) + labs(y = NULL, x = expression(hat(R))) + scale_fill_diagnostic("rhat") + scale_color_diagnostic("rhat") + scale_x_continuous(breaks = brks, expand = c(0, .01)) + scale_y_discrete(expand = c(.025,0)) + yaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) } #' @rdname MCMC-diagnostics #' @export mcmc_rhat_hist <- function(rhat, ..., binwidth = NULL, bins = NULL, breaks = NULL) { check_ignored_arguments(...) data <- mcmc_rhat_data(rhat) ggplot( data = data, mapping = aes( x = .data$value, color = .data$rating, fill = .data$rating)) + geom_histogram( linewidth = 0.25, na.rm = TRUE, binwidth = binwidth, bins = bins, breaks = breaks ) + scale_color_diagnostic("rhat") + scale_fill_diagnostic("rhat") + labs(x = expression(hat(R)), y = NULL) + dont_expand_y_axis(c(0.005, 0)) + bayesplot_theme_get() + yaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) } #' @rdname MCMC-diagnostics #' @export mcmc_rhat_data <- function(rhat, ...) { check_ignored_arguments(...) rhat <- drop_NAs_and_warn(new_rhat(rhat)) diagnostic_data_frame(rhat) } # effective sample size --------------------------------------------------- #' @rdname MCMC-diagnostics #' @export #' @param ratio A vector of *ratios* of effective sample size estimates to #' total sample size. See [neff_ratio()]. #' mcmc_neff <- function(ratio, ..., size = NULL) { check_ignored_arguments(...) data <- mcmc_neff_data(ratio) max_ratio <- max(ratio, na.rm = TRUE) if (max_ratio < 1.25) { additional_breaks <- numeric(0) } else if (max_ratio < 1.5) { additional_breaks <- 1.25 additional_labels <- "1.25" } else { additional_breaks <- seq(1.5, max_ratio, by = 0.5) } breaks <- c(0, 0.1, 0.25, 0.5, 0.75, 1, additional_breaks) ggplot( data, mapping = aes( x = .data$value, y = .data$parameter, color = .data$rating, fill = .data$rating)) + geom_segment( aes(yend = .data$parameter, xend = -Inf), na.rm = TRUE) + diagnostic_points(size) + vline_at( c(0.1, 0.5, 1), color = "gray", linetype = 2, linewidth = 0.25) + labs(y = NULL, x = expression(N[eff]/N)) + scale_fill_diagnostic("neff") + scale_color_diagnostic("neff") + scale_x_continuous( breaks = breaks, # as.character truncates trailing zeroes, while ggplot default does not labels = as.character(breaks), limits = c(0, max(1, max_ratio) + 0.05), expand = c(0, 0)) + bayesplot_theme_get() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) } #' @rdname MCMC-diagnostics #' @export mcmc_neff_hist <- function(ratio, ..., binwidth = NULL, bins = NULL, breaks = NULL) { check_ignored_arguments(...) data <- mcmc_neff_data(ratio) ggplot( data, mapping = aes( x = .data$value, color = .data$rating, fill = .data$rating)) + geom_histogram( linewidth = 0.25, na.rm = TRUE, binwidth = binwidth, bins = bins, breaks = breaks) + scale_color_diagnostic("neff") + scale_fill_diagnostic("neff") + labs(x = expression(N[eff]/N), y = NULL) + dont_expand_y_axis(c(0.005, 0)) + yaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + bayesplot_theme_get() } #' @rdname MCMC-diagnostics #' @export mcmc_neff_data <- function(ratio, ...) { check_ignored_arguments(...) ratio <- drop_NAs_and_warn(new_neff_ratio(ratio)) diagnostic_data_frame(ratio) } # autocorrelation --------------------------------------------------------- #' @rdname MCMC-diagnostics #' @export #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-facet_args #' @param lags The number of lags to show in the autocorrelation plot. mcmc_acf <- function(x, pars = character(), regex_pars = character(), ..., facet_args = list(), lags = 20, size = NULL) { check_ignored_arguments(...) .mcmc_acf( x, pars = pars, regex_pars = regex_pars, facet_args = facet_args, lags = lags, size = size, style = "line" ) } #' @rdname MCMC-diagnostics #' @export mcmc_acf_bar <- function(x, pars = character(), regex_pars = character(), ..., facet_args = list(), lags = 20) { check_ignored_arguments(...) .mcmc_acf( x, pars = pars, regex_pars = regex_pars, facet_args = facet_args, lags = lags, style = "bar" ) } # internal ---------------------------------------------------------------- #' Convert numeric vector of diagnostic values to a factor #' #' @param x A numeric vector. #' @param breaks A numeric vector of length two. The resulting factor variable #' will have three levels ('low', 'ok', and 'high') corresponding to ( #' `x <= breaks[1]`, `breaks[1] < x <= breaks[2]`, `x > breaks[2]`). #' @return A factor the same length as `x` with three levels. #' @noRd diagnostic_factor <- function(x, ...) { UseMethod("diagnostic_factor") } #' @export diagnostic_factor.rhat <- function(x, ..., breaks = c(1.05, 1.1)) { cut(x, breaks = c(-Inf, breaks, Inf), labels = c("low", "ok", "high"), ordered_result = FALSE) } #' @export diagnostic_factor.neff_ratio <- function(x, ..., breaks = c(0.1, 0.5)) { cut(x, breaks = c(-Inf, breaks, Inf), labels = c("low", "ok", "high"), ordered_result = FALSE) } diagnostic_data_frame <- function(x) { x <- auto_name(sort(x)) stopifnot(!anyDuplicated(names(x))) diagnostic <- class(x)[1] d <- tibble::tibble( diagnostic = diagnostic, parameter = factor(seq_along(x), labels = names(x)), value = as.numeric(x), rating = diagnostic_factor(x)) labels <- diagnostic_color_labels[[diagnostic]] d$description <- as.character(labels[d$rating]) d } auto_name <- function(xs) { if (is.null(names(xs))) { names(xs) <- zero_pad_int(seq_along(xs)) } xs } # c(1, 2, 10, 20, 100) => c("001", "002", "010", "020", "100") zero_pad_int <- function(xs) { formatter <- paste0("%0", max(nchar(xs)), "d") sprintf(formatter, xs) } diagnostic_points <- function(size = NULL) { args <- list(shape = 21, na.rm = TRUE) do.call("geom_point", c(args, size = size)) } # Functions wrapping around scale_color_manual() and scale_fill_manual(), used to # color the intervals by rhat value scale_color_diagnostic <- function(diagnostic = c("rhat", "neff")) { d <- match.arg(diagnostic) diagnostic_color_scale(d, aesthetic = "color") } scale_fill_diagnostic <- function(diagnostic = c("rhat", "neff")) { d <- match.arg(diagnostic) diagnostic_color_scale(d, aesthetic = "fill") } diagnostic_color_scale <- function(diagnostic = c("rhat", "neff_ratio"), aesthetic = c("color", "fill")) { diagnostic <- match.arg(diagnostic) aesthetic <- match.arg(aesthetic) dc <- diagnostic_colors(diagnostic, aesthetic) do.call( match.fun(paste0("scale_", aesthetic, "_manual")), list( name = NULL, drop = FALSE, values = dc$values, labels = dc$color_labels ) ) } diagnostic_colors <- function(diagnostic = c("rhat", "neff_ratio"), aesthetic = c("color", "fill")) { diagnostic <- match.arg(diagnostic) aesthetic <- match.arg(aesthetic) color_levels <- c("light", "mid", "dark") if (diagnostic == "neff_ratio") { color_levels <- rev(color_levels) } if (aesthetic == "color") { color_levels <- paste0(color_levels, "_highlight") } color_labels <- diagnostic_color_labels[[diagnostic]] list(diagnostic = diagnostic, aesthetic = aesthetic, color_levels = color_levels, color_labels = color_labels, values = set_names(get_color(color_levels), c("low", "ok", "high"))) } diagnostic_color_labels <- list( rhat = c( low = expression(hat(R) <= 1.05), ok = expression(hat(R) <= 1.10), high = expression(hat(R) > 1.10) ), neff_ratio = c( low = expression(N[eff] / N <= 0.1), ok = expression(N[eff] / N <= 0.5), high = expression(N[eff] / N > 0.5) ) ) # set x-axis breaks based on rhat values set_rhat_breaks <- function(rhat) { br <- c(1, 1.05) if (any(rhat > 1.05)) { br <- c(br, 1.1) } for (k in c(1.5, 2)) { if (any(rhat > k)) { br <- c(br, k) } } if (max(rhat) >= max(br) + .1) { br <- c(br, round(max(rhat), 2)) } br } # drop NAs from a vector and issue warning drop_NAs_and_warn <- function(x) { is_NA <- is.na(x) if (anyNA(x)) { warn(paste0( "Dropped ", sum(is_NA), " NAs from '", deparse(substitute(x)), "'." )) } x[!is_NA] } # Autocorrelation plot (either bar or line) # @param size passed to geom_line() if style="line" .mcmc_acf <- function(x, pars = character(), regex_pars = character(), facet_args = list(), lags = 25, style = c("bar", "line"), size = NULL) { style <- match.arg(style) x <- prepare_mcmc_array(x, pars, regex_pars) plot_data <- acf_data(x = x, lags = lags) if (num_chains(x) > 1) { facet_args$rows <- vars(.data$Chain) facet_args$cols <- vars(.data$Parameter) facet_fun <- "facet_grid" } else { # 1 chain facet_args$facets <- "Parameter" facet_fun <- "facet_wrap" } graph <- ggplot(plot_data, aes(x = .data$Lag, y = .data$AC)) + bayesplot_theme_get() if (style == "bar") { graph <- graph + geom_bar( position = "identity", stat = "identity", linewidth = 0.2, fill = get_color("l"), color = get_color("lh"), width = 1 ) + hline_0(linewidth = 0.25, color = get_color("dh")) } else { graph <- graph + hline_0(linewidth = 0.25, color = get_color("m")) + geom_segment( aes(xend = .data$Lag), yend = 0, color = get_color("l"), linewidth = 0.2 ) + do.call( "geom_line", args = c(list(color = get_color("d")), linewidth = size) ) } graph + do.call(facet_fun, facet_args) + scale_y_continuous( limits = c(min(0, plot_data$AC), 1.05), breaks = c(0, 0.5, 1) ) + scale_x_continuous( limits = c(-0.5, lags + 0.5), breaks = function(x) as.integer(pretty(x, n = 3)), expand = c(0, 0) ) + labs(x = "Lag", y = "Autocorrelation") + force_axes_in_facets() } # Prepare data for autocorr plot # @param x object returned by prepare_mcmc_array # @param lags user's 'lags' argument acf_data <- function(x, lags) { stopifnot(is_mcmc_array(x)) n_iter <- num_iters(x) n_chain <- num_chains(x) n_param <- num_params(x) n_lags <- lags + 1 if (n_lags >= n_iter) { abort(paste0("Too few iterations for lags=", lags, ".")) } data <- melt_mcmc(x) ac_list <- tapply( data[["Value"]], # INDEX = list(data[["Chain"]], data[["Parameter"]]), INDEX = with(data, list(Chain, Parameter)), FUN = function(x, lag.max) { stats::acf(x, lag.max = lag.max, plot = FALSE)$acf[, , 1] }, lag.max = lags, simplify = FALSE ) data.frame( Chain = rep(rep(1:n_chain, each = n_lags), times = n_param), Parameter = factor(rep(1:n_param, each = n_chain * n_lags), labels = levels(data[["Parameter"]])), Lag = rep(seq(0, lags), times = n_chain * n_param), AC = do.call("c", ac_list) ) } ## interal [classes / objects] ------------------------------------------------ new_rhat <- function(x) { # Convert a 1-d arrays to a vectors if (is.array(x) && length(dim(x)) == 1) { x <- as.vector(x) } validate_rhat(as_rhat(x)) } validate_rhat <- function(x) { stopifnot(is.numeric(x), !is.list(x), !is.array(x)) if (any(x < 0, na.rm = TRUE)) { abort("All 'rhat' values must be positive.") } x } as_rhat <- function(x) { structure(x, class = c("rhat", "numeric"), names = names(x)) } #' Indexing method -- needed so that sort, etc. don't strip names. #' @export #' @keywords internal #' @noRd `[.rhat` <- function (x, i, j, drop = TRUE, ...) { as_rhat(NextMethod()) } new_neff_ratio <- function(x) { # Convert a 1-d arrays to a vectors if (is.array(x) && length(dim(x)) == 1) { x <- as.vector(x) } as_neff_ratio(validate_neff_ratio(x)) } validate_neff_ratio <- function(x) { stopifnot(is.numeric(x), !is.list(x), !is.array(x)) if (any(x < 0, na.rm = TRUE)) { abort("All neff ratios must be positive.") } x } as_neff_ratio <- function(x) { structure(x, class = c("neff_ratio", "numeric"), names = names(x)) } #' Indexing method -- needed so that sort, etc. don't strip names. #' @export #' @keywords internal #' @noRd `[.neff_ratio` <- function (x, i, j, drop = TRUE, ...) { as_neff_ratio(NextMethod()) } bayesplot/R/bayesplot-extractors.R0000644000176200001440000002126114127610043016776 0ustar liggesusers#' Extract quantities needed for plotting from model objects #' #' Generics and methods for extracting quantities needed for plotting from #' various types of model objects. Currently methods are provided for stanfit #' (**rstan**), CmdStanMCMC (**cmdstanr**), and stanreg (**rstanarm**) objects, #' but adding new methods should be relatively straightforward. #' #' @name bayesplot-extractors #' @param object The object to use. #' @param ... Arguments passed to individual methods. #' @param pars An optional character vector of parameter names. For #' `nuts_params()` these will be NUTS sampler parameter names rather than #' model parameters. If `pars` is omitted all parameters are included. #' #' @return #' \describe{ #' \item{`log_posterior()`}{ #' `log_posterior()` methods return a molten data frame (see [reshape2::melt()]). #' The data frame should have columns `"Iteration"` (integer), `"Chain"` #' (integer), and `"Value"` (numeric). See **Examples**, below. #' } #' \item{`nuts_params()`}{ #' `nuts_params()` methods return a molten data frame (see [reshape2::melt()]). #' The data frame should have columns `"Parameter"` (factor), `"Iteration"` #' (integer), `"Chain"` (integer), and `"Value"` (numeric). See **Examples**, below. #' } #' \item{`rhat()`, `neff_ratio()`}{ #' Methods return (named) vectors. #' } #' } #' #' @seealso [MCMC-nuts], [MCMC-diagnostics] #' #' @examples #' \dontrun{ #' library(rstanarm) #' fit <- stan_glm(mpg ~ wt, data = mtcars, refresh = 0) #' #' np <- nuts_params(fit) #' head(np) #' tail(np) #' #' lp <- log_posterior(fit) #' head(lp) #' tail(lp) #' } #' NULL # log_posterior ----------------------------------------------------------- #' @rdname bayesplot-extractors #' @export log_posterior <- function(object, ...) { UseMethod("log_posterior") } # nuts_params ------------------------------------------------------------- #' @rdname bayesplot-extractors #' @export nuts_params <- function(object, ...) { UseMethod("nuts_params") } # rhat ------------------------------------------------------------- #' @rdname bayesplot-extractors #' @export rhat <- function(object, ...) { UseMethod("rhat") } # neff_ratio ------------------------------------------------------------- #' @rdname bayesplot-extractors #' @export neff_ratio <- function(object, ...) { UseMethod("neff_ratio") } #' @rdname bayesplot-extractors #' @export #' @method log_posterior stanfit #' @param inc_warmup A logical scalar (defaulting to `FALSE`) indicating #' whether to include warmup draws, if applicable. #' log_posterior.stanfit <- function(object, inc_warmup = FALSE, ...) { lp <- rstan::get_logposterior(object, inc_warmup = inc_warmup, ...) lp <- lapply(lp, as.array) lp <- set_names(reshape2::melt(lp), c("Iteration", "Value", "Chain")) validate_df_classes(lp[, c("Chain", "Iteration", "Value")], c("integer", "integer", "numeric")) } #' @rdname bayesplot-extractors #' @export #' @method log_posterior stanreg #' log_posterior.stanreg <- function(object, inc_warmup = FALSE, ...) { log_posterior.stanfit(object$stanfit, inc_warmup = inc_warmup, ...) } #' @rdname bayesplot-extractors #' @export #' @method log_posterior CmdStanMCMC log_posterior.CmdStanMCMC <- function(object, inc_warmup = FALSE, ...) { lp <- object$draws("lp__", inc_warmup = inc_warmup) lp <- reshape2::melt(lp) lp$variable <- NULL lp <- dplyr::rename_with(lp, capitalize_first) validate_df_classes(lp[, c("Chain", "Iteration", "Value")], c("integer", "integer", "numeric")) } #' @rdname bayesplot-extractors #' @export #' @method nuts_params stanfit nuts_params.stanfit <- function(object, pars = NULL, inc_warmup = FALSE, ...) { suggested_package("rstan") np <- rstan::get_sampler_params(object, inc_warmup = inc_warmup) nuts_params.list(np, pars = pars, ...) } #' @rdname bayesplot-extractors #' @export #' @method nuts_params stanreg #' nuts_params.stanreg <- function(object, pars = NULL, inc_warmup = FALSE, ...) { nuts_params.stanfit(object$stanfit, pars = pars, inc_warmup = inc_warmup, ...) } #' @rdname bayesplot-extractors #' @export #' @method nuts_params list nuts_params.list <- function(object, pars = NULL, ...) { if (!all(sapply(object, is.matrix))) { abort("All list elements should be matrices.") } dd <- lapply(object, dim) if (length(unique(dd)) != 1) { abort("All matrices in the list must have the same dimensions.") } nms <- lapply(object, colnames) if (length(unique(nms)) != 1) { abort("All matrices in the list must have the same column names.") } if (length(pars)) { object <- lapply(object, function(x) x[, pars, drop = FALSE]) } out <- reshape2::melt(object) out <- set_names(out, c("Iteration", "Parameter", "Value", "Chain")) validate_df_classes(out[, c("Chain", "Iteration", "Parameter", "Value")], c("integer", "integer", "factor", "numeric")) } #' @rdname bayesplot-extractors #' @export #' @method nuts_params CmdStanMCMC nuts_params.CmdStanMCMC <- function(object, pars = NULL, ...) { arr <- object$sampler_diagnostics() if (!is.null(pars)) { arr <- arr[,, pars] } out <- reshape2::melt(arr) colnames(out)[colnames(out) == "variable"] <- "parameter" out <- dplyr::rename_with(out, capitalize_first) validate_df_classes(out[, c("Chain", "Iteration", "Parameter", "Value")], c("integer", "integer", "factor", "numeric")) } #' @rdname bayesplot-extractors #' @export #' @method rhat stanfit #' rhat.stanfit <- function(object, pars = NULL, ...) { suggested_package("rstan") s <- if (!is.null(pars)) { rstan::summary(object, pars = pars, ...) } else { rstan::summary(object, ...) } validate_rhat(s$summary[, "Rhat"]) } #' @rdname bayesplot-extractors #' @export #' @method rhat stanreg #' @template args-regex_pars #' rhat.stanreg <- function(object, pars = NULL, regex_pars = NULL, ...) { suggested_package("rstanarm") r <- summary(object, pars = pars, regex_pars = regex_pars, ...)[, "Rhat"] r <- validate_rhat(r) if (!is.null(pars) || !is.null(regex_pars)) { return(r) } r[!names(r) %in% c("mean_PPD", "log-posterior")] } #' @rdname bayesplot-extractors #' @export #' @method rhat CmdStanMCMC rhat.CmdStanMCMC <- function(object, pars = NULL, ...) { .rhat <- utils::getFromNamespace("rhat", "posterior") s <- object$summary(pars, rhat = .rhat)[, c("variable", "rhat")] r <- setNames(s$rhat, s$variable) r <- validate_rhat(r) r[!names(r) %in% "lp__"] } #' @rdname bayesplot-extractors #' @export #' @method neff_ratio stanfit #' neff_ratio.stanfit <- function(object, pars = NULL, ...) { suggested_package("rstan") s <- if (!is.null(pars)) { rstan::summary(object, pars = pars, ...) } else { rstan::summary(object, ...) } tss <- nrow(as.matrix(object, pars = "lp__")) ratio <- s$summary[, "n_eff"] / tss validate_neff_ratio(ratio) } #' @rdname bayesplot-extractors #' @export #' @method neff_ratio stanreg #' neff_ratio.stanreg <- function(object, pars = NULL, regex_pars = NULL, ...) { suggested_package("rstanarm") s <- summary(object, pars = pars, regex_pars = regex_pars, ...) ess <- s[, "n_eff"] tss <- attr(s, "posterior_sample_size") ratio <- ess / tss ratio <- validate_neff_ratio(ratio) if (!is.null(pars) || !is.null(regex_pars)) { return(ratio) } ratio[!names(ratio) %in% c("mean_PPD", "log-posterior")] } #' @rdname bayesplot-extractors #' @export #' @method neff_ratio CmdStanMCMC neff_ratio.CmdStanMCMC <- function(object, pars = NULL, ...) { s <- object$summary(pars, "n_eff" = "ess_basic")[, c("variable", "n_eff")] ess <- setNames(s$n_eff, s$variable) tss <- prod(dim(object$draws())[1:2]) ratio <- ess / tss ratio <- validate_neff_ratio(ratio) ratio[!names(ratio) %in% "lp__"] } # internals --------------------------------------------------------------- # Check that variables in a data.frame have certain classes # @param x data.frame # @param classes character vector of classes (in the order of the column in x) # @return x, unless an error is thrown # validate_df_classes <- function(x, classes = character()) { stopifnot( is.data.frame(x), is.character(classes), ncol(x) >= 1, ncol(x) == length(classes) ) for (j in 1:ncol(x)) { if (!inherits(x[, j], classes[j])) { abort(paste0(colnames(x)[j], " does not have class ", classes[j])) } } x } # capitalize first letter in a string only capitalize_first <- function(name) { name <- tolower(name) # in case whole string is capitalized substr(name, 1, 1) <- toupper(substr(name, 1, 1)) name } bayesplot/R/ppc-overview.R0000644000176200001440000001374214212422623015233 0ustar liggesusers#' Graphical posterior predictive checking #' #' @name PPC-overview #' @aliases PPC #' @family PPCs #' #' @description The **bayesplot** PPC module provides various plotting functions #' for creating graphical displays comparing observed data to simulated data #' from the posterior (or prior) predictive distribution. See the sections #' below for a brief discussion of the ideas behind posterior predictive #' checking, an overview of the available PPC plots, and tips on providing an #' interface to **bayesplot** from another package. #' #' For plots of posterior (or prior) predictive distributions that do _not_ #' include observed data see [PPD-overview] instead. #' #' @details The idea behind posterior predictive checking is simple: if a model #' is a good fit then we should be able to use it to generate data that looks #' a lot like the data we observed. #' #' \subsection{Posterior predictive distribution}{ #' To generate the data used for posterior predictive checks we simulate from #' the *posterior predictive distribution*. The posterior predictive #' distribution is the distribution of the outcome variable implied by a model #' after using the observed data \eqn{y} (a vector of outcome values), and #' typically predictors \eqn{X}, to update our beliefs about the unknown #' parameters \eqn{\theta} in the model. For each draw of the parameters #' \eqn{\theta} from the posterior distribution #' \eqn{p(\theta \,|\, y, X)}{p(\theta | y, X)} #' we generate an entire vector of outcomes. The result is #' an \eqn{S \times N}{S x N} matrix of simulations, where \eqn{S} is the the #' size of the posterior sample (number of draws from the posterior #' distribution) and \eqn{N} is the number of data points in \eqn{y}. That is, #' each row of the matrix is an individual "replicated" dataset of \eqn{N} #' observations. #' } #' \subsection{Notation}{ #' When simulating from the posterior predictive distribution we can use either #' the same values of the predictors \eqn{X} that we used when fitting the model #' or new observations of those predictors. When we use the same values of #' \eqn{X} we denote the resulting simulations by \eqn{y^{rep}}{yrep} as they #' can be thought of as *replications* of the outcome \eqn{y} rather than #' predictions for future observations. This corresponds to the notation from #' Gelman et. al. (2013) and is the notation used throughout the documentation #' for this package. #' } #' \subsection{Graphical posterior predictive checking}{ #' Using the datasets \eqn{y^{rep}}{yrep} drawn from the posterior predictive #' distribution, the functions in the **bayesplot** package produce various #' graphical displays comparing the observed data \eqn{y} to the replications. #' For a more thorough discussion of posterior predictive checking see #' Chapter 6 of Gelman et. al. (2013). #' } #' \subsection{Prior predictive checking}{ #' To use **bayesplot** for *prior* predictive checks you can simply use draws #' from the prior predictive distribution instead of the posterior predictive #' distribution. See Gabry et al. (2019) for more on prior predictive checking #' and when it is reasonable to compare the prior predictive distribution to the #' observed data. If you want to avoid using the observed data for prior #' predictive checks then you can use the **bayesplot** [PPD] plots instead, #' which do not take a `y` argument, or you can use the PPC plots but provide #' plausible or implausible `y` values that you want to compare to the prior #' predictive realizations. #' } #' #' @section PPC plotting functions: The plotting functions for prior and #' posterior predictive checking all have the prefix `ppc_` and all require #' the arguments `y`, a vector of observations, and `yrep`, a matrix of #' replications (in-sample predictions). The plots are organized into several #' categories, each with its own documentation: #' * [PPC-distributions]: Histograms, kernel density estimates, boxplots, and #' other plots comparing the empirical distribution of data `y` to the #' distributions of individual simulated datasets (rows) in `yrep`. #' #' * [PPC-test-statistics]: The distribution of a statistic, or a pair of #' statistics, over the simulated datasets (rows) in `yrep` compared to value of #' the statistic(s) computed from `y`. #' #' * [PPC-intervals]: Interval estimates of `yrep` with `y` #' overlaid. The x-axis variable can be optionally specified by the user #' (e.g. to plot against a predictor variable or over time). #' #' * [PPC-errors]: Plots of predictive errors (`y - yrep`) computed from `y` and #' each of the simulated datasets (rows) in `yrep`. For binomial models binned #' error plots are also available. #' #' * [PPC-scatterplots]: Scatterplots (and similar visualizations) of the data #' `y` vs. individual simulated datasets (rows) in `yrep`, or vs. the average #' value of the distributions of each data point (columns) in `yrep`. #' #' * [PPC-discrete]: PPC functions that can only be used if `y` and `yrep` are #' discrete. For example, rootograms for count outcomes and bar plots for #' ordinal, categorical, and multinomial outcomes. #' #' * [PPC-loo]: PPC functions for predictive checks based on (approximate) #' leave-one-out (LOO) cross-validation. #'' #' * [PPC-censoring]: PPC functions comparing the empirical #' distribution of censored data `y` to the distributions of individual #' simulated datasets (rows) in `yrep`. #' #' @section Providing an interface for predictive checking from another package: #' #' In addition to the various plotting functions, the **bayesplot** package #' provides the S3 generic [pp_check()]. Authors of \R packages for #' Bayesian inference are encouraged to define `pp_check()` methods for the #' fitted model objects created by their packages. See the package vignettes for #' more details and a simple example, and see the **rstanarm** and **brms** #' packages for full examples of `pp_check()` methods. #' #' @template reference-vis-paper #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' NULL bayesplot/R/mcmc-diagnostics-nuts.R0000644000176200001440000004242414556270424017032 0ustar liggesusers#' Diagnostic plots for the No-U-Turn-Sampler (NUTS) #' #' Diagnostic plots for the No-U-Turn-Sampler (NUTS), the default MCMC algorithm #' used by [Stan](https://mc-stan.org). See the **Plot Descriptions** section, #' below. #' #' @name MCMC-nuts #' @aliases NUTS #' @family MCMC #' #' @param x A molten data frame of NUTS sampler parameters, either created by #' [nuts_params()] or in the same form as the object returned by #' [nuts_params()]. #' @param lp A molten data frame of draws of the log-posterior or, more #' commonly, of a quantity equal to the log-posterior up to a constant. #' `lp` should either be created via [log_posterior()] or be an #' object with the same form as the object returned by #' [log_posterior()]. #' @param chain A positive integer for selecting a particular chain. The default #' (`NULL`) is to merge the chains before plotting. If `chain = k` #' then the plot for chain `k` is overlaid (in a darker shade but with #' transparency) on top of the plot for all chains. The `chain` argument #' is not used by `mcmc_nuts_energy()`. #' @param ... Currently ignored. #' #' @return A gtable object (the result of calling #' [gridExtra::arrangeGrob()]) created from several ggplot objects, #' except for `mcmc_nuts_energy()`, which returns a ggplot object. #' #' @section Quick Definitions: #' For more details see Stan Development Team (2016) and Betancourt (2017). #' * `accept_stat__`: the average acceptance probabilities of all #' possible samples in the proposed tree. #' * `divergent__`: the number of leapfrog transitions with diverging #' error. Because NUTS terminates at the first divergence this will be either #' 0 or 1 for each iteration. #' * `stepsize__`: the step size used by NUTS in its Hamiltonian #' simulation. #' * `treedepth__`: the depth of tree used by NUTS, which is the log #' (base 2) of the number of leapfrog steps taken during the Hamiltonian #' simulation. #' * `energy__`: the value of the Hamiltonian (up to an additive #' constant) at each iteration. #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_nuts_acceptance()`}{ #' Three plots: #' * Histogram of `accept_stat__` with vertical lines indicating the #' mean (solid line) and median (dashed line). #' * Histogram of `lp__` with vertical #' lines indicating the mean (solid line) and median (dashed line). #' * Scatterplot of `accept_stat__` vs `lp__`. #' } #' #' \item{`mcmc_nuts_divergence()`}{ #' Two plots: #' * Violin plots of `lp__|divergent__=1` and `lp__|divergent__=0`. #' * Violin plots of `accept_stat__|divergent__=1` and #' `accept_stat__|divergent__=0`. #' } #' #' \item{`mcmc_nuts_stepsize()`}{ #' Two plots: #' * Violin plots of `lp__` by chain ordered by `stepsize__` value. #' * Violin plots of `accept_stat__` by chain ordered by `stepsize__` value. #' } #' #' \item{`mcmc_nuts_treedepth()`}{ #' Three plots: #' * Violin plots of `lp__` by value of `treedepth__`. #' * Violin plots of `accept_stat__` by value of `treedepth__`. #' * Histogram of `treedepth__`. #' } #' #' \item{`mcmc_nuts_energy()`}{ #' Overlaid histograms showing `energy__` vs the change in #' `energy__`. See Betancourt (2016) for details. #' } #' } #' #' @template reference-betancourt #' @template reference-nuts #' @template reference-stan-manual #' #' @seealso #' * The [Visual MCMC Diagnostics](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) #' vignette. #' * Several other plotting functions are not NUTS-specific but take optional #' extra arguments if the model was fit using NUTS: #' * [mcmc_trace()]: show divergences as tick marks below the #' trace plot. #' * [mcmc_parcoord()]: change the color/size/transparency of lines #' corresponding to divergences. #' * [mcmc_scatter()]: change the color/size/shape of points #' corresponding to divergences. #' * [mcmc_pairs()]: change the color/size/shape of points #' corresponding divergences and/or max treedepth saturation. #' #' @examples #' \dontrun{ #' library(ggplot2) #' library(rstanarm) #' fit <- stan_glm(mpg ~ wt + am, data = mtcars, iter = 1000, refresh = 0) #' np <- nuts_params(fit) #' lp <- log_posterior(fit) #' #' color_scheme_set("brightblue") #' mcmc_nuts_acceptance(np, lp) #' mcmc_nuts_acceptance(np, lp, chain = 2) #' #' mcmc_nuts_divergence(np, lp) #' mcmc_nuts_stepsize(np, lp) #' mcmc_nuts_treedepth(np, lp) #' #' color_scheme_set("red") #' mcmc_nuts_energy(np) #' mcmc_nuts_energy(np, merge_chains = TRUE, binwidth = .15) #' mcmc_nuts_energy(np) + #' facet_wrap(vars(Chain), nrow = 1) + #' coord_fixed(ratio = 150) + #' ggtitle("NUTS Energy Diagnostic") #' } #' NULL #' @rdname MCMC-nuts #' @export #' @template args-hist #' mcmc_nuts_acceptance <- function(x, lp, chain = NULL, ..., binwidth = NULL, bins = NULL, breaks = NULL) { suggested_package("gridExtra") check_ignored_arguments(...) x <- validate_nuts_data_frame(x, lp) n_chain <- length(unique(lp$Chain)) chain <- validate_enough_chains(chain, num_chains(x)) overlay_chain <- !is.null(chain) accept_stat <- dplyr::filter(x, .data$Parameter == "accept_stat__") data <- suppressWarnings( dplyr::bind_rows(accept_stat, data.frame(lp, Parameter = "lp__")) ) grp_par <- group_by(data, .data$Parameter) stats_par <- summarise(grp_par, Mean = mean(.data$Value), Median = median(.data$Value)) hists <- ggplot(data, aes(x = .data$Value, y = after_stat(density))) + geom_histogram( fill = get_color("l"), color = get_color("lh"), linewidth = 0.25, na.rm = TRUE, binwidth = binwidth, bins = bins, breaks = breaks ) + bayesplot_theme_get() if (!overlay_chain) { hists <- hists + geom_vline( aes(xintercept = .data$Mean), data = stats_par, color = get_color("dh") ) + geom_vline( aes(xintercept = .data$Median), data = stats_par, color = get_color("d"), linetype = 2 ) } hists <- hists + dont_expand_y_axis(c(0.005, 0)) + facet_wrap(vars(.data$Parameter), scales = "free") + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(FALSE) scatter_data <- data.frame( x = accept_stat$Value, y = lp$Value ) scatter <- ggplot(scatter_data) + geom_point( aes(x = .data$x, y = .data$y), alpha = 0.75, shape = 21, fill = get_color(ifelse(overlay_chain, "l", "m")), color = get_color(ifelse(overlay_chain, "lh", "mh")) ) + labs(x = "accept_stat__", y = "lp__") + bayesplot_theme_get() if (overlay_chain) { hists <- hists + geom_histogram( data = dplyr::filter(data, .data$Chain == chain), fill = get_color("d"), color = NA, alpha = 0.5, na.rm = TRUE, binwidth = binwidth, bins = bins, breaks = breaks ) chain_scatter_data <- data.frame( x = accept_stat$Value[accept_stat$Chain == chain], y = lp$Value[lp$Chain == chain] ) scatter <- scatter + geom_point( aes(x = .data$x, y = .data$y), color = get_color("d"), alpha = 0.5, data = chain_scatter_data ) } nuts_plot <- gridExtra::arrangeGrob(hists, scatter, nrow = 2) as_bayesplot_grid(nuts_plot) } #' @rdname MCMC-nuts #' @export mcmc_nuts_divergence <- function(x, lp, chain = NULL, ...) { suggested_package("gridExtra") check_ignored_arguments(...) x <- validate_nuts_data_frame(x, lp) chain <- validate_enough_chains(chain, num_chains(x)) overlay_chain <- !is.null(chain) accept_stat <- dplyr::filter(x, .data$Parameter == "accept_stat__") divergent <- dplyr::filter(x, .data$Parameter == "divergent__") divergent$Value <- factor(divergent$Value, levels = c(0, 1), labels = c("No divergence", "Divergence")) violin_lp_data <- data.frame(divergent, lp = lp$Value) violin_lp <- ggplot(violin_lp_data, aes(x = .data$Value, y = .data$lp)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + ylab("lp__") + xaxis_title(FALSE) + bayesplot_theme_get() violin_accept_stat_data <- data.frame(divergent, as = accept_stat$Value) violin_accept_stat <- ggplot(violin_accept_stat_data, aes(x = .data$Value, y = .data$as)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + ylab("accept_stat__") + scale_y_continuous(limits = c(NA, 1.05)) + xaxis_title(FALSE) + bayesplot_theme_get() div_count <- table(divergent$Value)[[2]] div_text <- ngettext(div_count, "divergence", "divergences") div_count_label <- paste(div_count, div_text) if (!is.null(chain)) { violin_lp <- violin_lp + chain_violin(violin_lp_data, chain) violin_accept_stat <- violin_accept_stat + chain_violin(violin_accept_stat_data, chain) div_count_by_chain <- table(divergent$Value, divergent$Chain)["Divergence", chain] div_count_label <- paste0(div_count_label, " (", div_count_by_chain, " from chain ", chain, ")") } violin_lp <- violin_lp + labs(subtitle = div_count_label) nuts_plot <- gridExtra::arrangeGrob(violin_lp, violin_accept_stat, nrow = 2) as_bayesplot_grid(nuts_plot) } #' @rdname MCMC-nuts #' @export mcmc_nuts_stepsize <- function(x, lp, chain = NULL, ...) { suggested_package("gridExtra") check_ignored_arguments(...) x <- validate_nuts_data_frame(x, lp) chain <- validate_enough_chains(chain, num_chains(x)) overlay_chain <- !is.null(chain) stepsize <- dplyr::filter(x, .data$Parameter == "stepsize__") accept_stat <- dplyr::filter(x, .data$Parameter == "accept_stat__") stepsize_by_chain <- stepsize %>% group_by(.data$Chain) %>% summarise(ss = dplyr::first(.data$Value)) stepsize_labels_text <- stepsize_by_chain %>% arrange(.data$ss) %>% mutate(value = format(round(.data$ss, 3), digits = 3), label = paste0(.data$value, "\n(chain ", .data$Chain, ")")) %>% pull() stepsize_labels <- scale_x_discrete(labels = stepsize_labels_text) violin_lp_data <- dplyr::left_join(lp, stepsize_by_chain, by = "Chain") violin_lp <- ggplot(violin_lp_data, aes(x = as.factor(.data$ss), y = .data$Value)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + ylab("lp__") + stepsize_labels + xaxis_title(FALSE) + bayesplot_theme_get() violin_accept_stat_data <- dplyr::left_join(accept_stat, stepsize_by_chain, by = "Chain") violin_accept_stat <- ggplot(violin_accept_stat_data, aes(x = as.factor(.data$ss), y = .data$Value)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + ylab("accept_stat__") + scale_y_continuous(limits = c(NA, 1.05)) + stepsize_labels + xaxis_title(FALSE) + bayesplot_theme_get() if (!is.null(chain)) { violin_lp <- violin_lp + chain_violin(violin_lp_data, chain) violin_accept_stat <- violin_accept_stat + chain_violin(violin_accept_stat_data, chain) } nuts_plot <- gridExtra::arrangeGrob(violin_lp, violin_accept_stat, nrow = 2) as_bayesplot_grid(nuts_plot) } #' @rdname MCMC-nuts #' @export mcmc_nuts_treedepth <- function(x, lp, chain = NULL, ...) { suggested_package("gridExtra") check_ignored_arguments(...) x <- validate_nuts_data_frame(x, lp) chain <- validate_enough_chains(chain, num_chains(x)) overlay_chain <- !is.null(chain) treedepth <- dplyr::filter(x, .data$Parameter == "treedepth__") accept_stat <- dplyr::filter(x, .data$Parameter == "accept_stat__") hist_td <- ggplot(treedepth, aes(x = .data$Value, y = after_stat(density))) + geom_histogram( fill = get_color("l"), color = get_color("lh"), linewidth = 0.2, na.rm = TRUE, binwidth = 1 ) + xlab("treedepth__") + bayesplot_theme_get() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) violin_lp_data <- data.frame(treedepth, lp = lp$Value) violin_lp <- ggplot(violin_lp_data, aes(x = factor(.data$Value), y = .data$lp)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + labs(x = "treedepth__", y = "lp__") + bayesplot_theme_get() violin_accept_stat_data <- data.frame(treedepth, as = accept_stat$Value) violin_accept_stat <- ggplot(violin_accept_stat_data, aes(x = factor(.data$Value), y = .data$as)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + labs(x = "treedepth__", y = "accept_stat__") + scale_y_continuous(breaks = c(0, 0.5, 1)) + bayesplot_theme_get() if (overlay_chain) { hist_td <- hist_td + geom_histogram( data = dplyr::filter(treedepth, .data$Chain == chain), fill = get_color("d"), color = NA, alpha = 0.5, na.rm = TRUE, binwidth = 1 ) + dont_expand_y_axis() violin_lp <- violin_lp + chain_violin(violin_lp_data, chain) violin_accept_stat <- violin_accept_stat + chain_violin(violin_accept_stat_data, chain) } nuts_plot <- gridExtra::grid.arrange( gridExtra::arrangeGrob(violin_lp, violin_accept_stat, nrow = 1), hist_td, nrow = 2 ) as_bayesplot_grid(nuts_plot) } #' @rdname MCMC-nuts #' @export #' @param alpha For `mcmc_nuts_energy()` only, the transparency (alpha) level #' in `[0,1]` used for the overlaid histogram. #' @param merge_chains For `mcmc_nuts_energy()` only, should all chains be #' merged or displayed separately? The default is `FALSE`, i.e., to show #' the chains separately. #' mcmc_nuts_energy <- function(x, ..., binwidth = NULL, bins = NULL, breaks = NULL, alpha = 0.5, merge_chains = FALSE) { check_ignored_arguments(...) x <- validate_nuts_data_frame(x) energy <- dplyr::filter(x, .data$Parameter == "energy__") # lag() (stats::lag()) here doesn't work, but dplyr::lag() does data <- energy %>% group_by(.data$Chain) %>% mutate( Ediff = .data$Value - dplyr::lag(.data$Value), E_centered = .data$Value - mean(.data$Value), Ediff_centered = .data$Ediff - mean(.data$Ediff, na.rm = TRUE) ) fills <- set_names(get_color(c("l", "m")), c("E_fill", "Ediff_fill")) clrs <- set_names(get_color(c("lh", "mh")), c("E_fill", "Ediff_fill")) aes_labs <- c(expression(pi[E]), expression(pi[paste(Delta, E)])) graph <- ggplot(data, aes(y = after_stat(density))) + geom_histogram( aes( x = .data$Ediff_centered, fill = "Ediff_fill", color = "Ediff_fill" ), linewidth = 0.25, na.rm = TRUE, binwidth = binwidth, bins = bins, breaks = breaks ) + geom_histogram( aes( x = .data$E_centered, fill = "E_fill", color = "E_fill" ), linewidth = 0.25, na.rm = TRUE, alpha = alpha, binwidth = binwidth, bins = bins, breaks = breaks ) + scale_fill_manual("", values = fills, labels = aes_labs) + scale_color_manual("", values = clrs, labels = aes_labs) + dont_expand_y_axis(c(0.005, 0)) + scale_x_continuous(expand = c(0.2, 0)) + labs(y = NULL, x = expression(E - bar(E))) + bayesplot_theme_get() + space_legend_keys() + theme(legend.text = element_text(size = rel(1.1))) + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) if (merge_chains) { return(graph) } graph + facet_wrap(vars(.data$Chain)) + force_axes_in_facets() } # internal ---------------------------------------------------------------- validate_enough_chains <- function(chain = NULL, n_chain) { if (!is.null(chain)) { stopifnot(chain >= 1) if (!isTRUE(n_chain >= chain)) { abort(paste("'chain' is", chain, "but only", n_chain, "chains found.")) } } chain } #' @param x data frame with nuts params #' @param lp data frame with `lp__` #' @noRd validate_nuts_data_frame <- function(x, lp) { if (!is.data.frame(x)) { abort("NUTS parameters should be in a data frame.") } valid_cols <- sort(c("Iteration", "Parameter", "Value", "Chain")) if (!identical(sort(colnames(x)), valid_cols)) { abort(paste( "NUTS parameter data frame must have columns:", paste(valid_cols, collapse = ", ") )) } if (missing(lp)) { lp <- NULL } if (!is.null(lp)) { if (!is.data.frame(lp)) { abort("lp should be in a data frame.") } valid_lp_cols <- sort(c("Iteration", "Value", "Chain")) if (!identical(sort(colnames(lp)), valid_lp_cols)) { abort(paste( "lp data frame must have columns:", paste(valid_lp_cols, collapse = ", ") )) } n_chain <- num_chains(x) n_lp_chain <- num_chains(lp) if (n_chain != n_lp_chain) { abort(paste( "Number of chains for NUTS parameters is", n_chain, "but number of chains for lp is", n_lp_chain )) } } x } chain_violin <- function(df, chain, fill = "d", color = NA, alpha = 0.5) { geom_violin( data = dplyr::filter(df, .data$Chain == chain), fill = get_color(fill), color = color, alpha = alpha ) } bayesplot/R/pp_check.R0000644000176200001440000000564514127610043014364 0ustar liggesusers#' Posterior (or prior) predictive checks (S3 generic and default method) #' #' S3 generic with simple default method. The intent is to provide a generic so #' authors of other \R packages who wish to provide interfaces to the functions #' in **bayesplot** will be encouraged to include `pp_check()` methods in their #' package, preserving the same naming conventions for posterior (and prior) #' predictive checking across many \R packages for Bayesian inference. This is #' for the convenience of both users and developers. See the **Details** and #' **Examples** sections, below, and the package vignettes for examples of #' defining `pp_check()` methods. #' #' @export #' @param object Typically a fitted model object. The default method, however, #' takes `object` to be a `y` (outcome) vector. #' @param ... For the generic, arguments passed to individual methods. For the #' default method, these are additional arguments to pass to `fun`. #' @return The exact form of the value returned by `pp_check()` may vary by #' the class of `object`, but for consistency we encourage authors of #' methods to return the ggplot object created by one of **bayesplot**'s #' plotting functions. The default method returns the object returned by `fun`. #' #' @details A package that creates fitted model objects of class `"foo"` #' can include a method `pp_check.foo()` that prepares the appropriate #' inputs (`y`, `yrep`, etc.) for the **bayesplot** functions. The #' `pp_check.foo()` method may, for example, let the user choose between #' various plots, calling the functions from **bayesplot** internally as #' needed. See **Examples**, below, and the package vignettes. #' #' @examples #' # default method #' y <- example_y_data() #' yrep <- example_yrep_draws() #' pp_check(y, yrep[1:50,], ppc_dens_overlay) #' #' g <- example_group_data() #' pp_check(y, yrep, fun = "stat_grouped", group = g, stat = "median") #' #' # defining a method #' x <- list(y = rnorm(50), yrep = matrix(rnorm(5000), nrow = 100, ncol = 50)) #' class(x) <- "foo" #' pp_check.foo <- function(object, ..., type = c("multiple", "overlaid")) { #' y <- object[["y"]] #' yrep <- object[["yrep"]] #' switch(match.arg(type), #' multiple = ppc_hist(y, yrep[1:min(8, nrow(yrep)),, drop = FALSE]), #' overlaid = ppc_dens_overlay(y, yrep)) #' } #' pp_check(x) #' pp_check(x, type = "overlaid") #' pp_check <- function(object, ...) { UseMethod("pp_check") } #' @rdname pp_check #' @export #' @param yrep For the default method, a `yrep` matrix passed to `fun`. #' @param fun For the default method, the plotting function to call. Can be any #' of the [PPC] functions. The `"ppc_"` prefix can optionally be dropped if #' `fun` is specified as a string. #' pp_check.default <- function(object, yrep, fun, ...) { if (is.character(fun) && substr(fun, 1, 4) != "ppc_") { fun <- paste0("ppc_", fun) } .ppcfun <- match.fun(fun) .ppcfun(y = object, yrep = yrep, ...) } bayesplot/R/helpers-testthat.R0000644000176200001440000000123514127610043016077 0ustar liggesusersexpect_gg <- function(x) { testthat::expect_s3_class(x, "ggplot") invisible(ggplot_build(x)) } expect_gtable <- function(x) testthat::expect_s3_class(x, "gtable") expect_mcmc_array <- function(x) testthat::expect_true(is_mcmc_array(x)) expect_bayesplot_grid <- function(x) testthat::expect_true(is_bayesplot_grid(x)) #' Insert fake divergences for testing purposes #' #' @noRd #' @param np Data frame returned by `nuts_params()` #' @return `np` with every other iter marked as a divergence ensure_divergences <- function(np) { divs <- rep_len(c(0,1), length.out = sum(np$Parameter=="divergent__")) np$Value[np$Parameter=="divergent__"] <- divs return(np) } bayesplot/R/helpers-gg.R0000644000176200001440000000762314335264324014653 0ustar liggesusers# ggplot2 convenience functions for internal use -------------------------- #' Do nothing plotting geom #' #' Adding `geom_ignore()` to a ggplot will not affect its appearance. This #' function is useful for when plot elements should appear conditionally. #' #' @param ... arguments to a ggplot2 function to be ignored #' @noRd #' @examples #' # Draw a vertical line at zero (or do nothing) #' xs <- -2:2 #' maybe_vertical_line <- if (0 > min(xs) && 0 < max(xs)) { #' vline_0(color = "gray90", linewidth = 0.5) #' } else { #' geom_ignore() #' } geom_ignore <- function(...) { geom_blank( mapping = NULL, data = NULL, show.legend = FALSE, inherit.aes = FALSE) } #' Add new aesthetic mappings to a list of aesthetic mappings #' #' @param mapping a list of `uneval` aesthetic mappings (created by `aes_()`) #' @param ... additional mappings to add, e.g., `color = ~ parameter` #' @return the updated list #' @noRd modify_aes_ <- function(mapping, ...) { utils::modifyList(mapping, aes_(...)) } #' Same as `modify_aes_` but using `aes()` instead of `aes_()` (now deprecated). #' Often `...` will need to contain expression of the form `.data$x` to avoid R cmd check warnings #' @noRd modify_aes <- function(mapping, ...) { utils::modifyList(mapping, aes(...)) } facet_wrap_parsed <- function(...) { facet_wrap(..., labeller = label_parsed) } dont_expand_y_axis <- function(expand = c(0,0)) { scale_y_continuous(expand = expand) } dont_expand_x_axis <- function(expand = c(0,0)) { scale_x_continuous(expand = expand) } dont_expand_axes <- function() { coord_cartesian(expand = FALSE) } force_axes_in_facets <- function() { thm <- bayesplot_theme_get() annotate( "segment", x = c(-Inf, -Inf), xend = c(Inf,-Inf), y = c(-Inf,-Inf), yend = c(-Inf, Inf), color = thm$axis.line$colour %||% thm$line$colour %||% "black", linewidth = thm$axis.line$linewidth %||% thm$line$linewidth %||% 0.5 ) } force_x_axis_in_facets <- function() { thm <- bayesplot_theme_get() annotate( "segment", x = -Inf, xend = Inf, y = -Inf, yend = -Inf, color = thm$axis.line$colour %||% thm$line$colour %||% "black", linewidth = thm$axis.line$linewidth %||% thm$line$linewidth %||% 0.5 ) } no_legend_spacing <- function() { theme(legend.spacing.y = unit(0, "cm")) } reduce_legend_spacing <- function(cm) { theme(legend.spacing.y = unit(-cm, "cm")) } space_legend_keys <- function(relative_size = 2, color = "white") { theme(legend.key = element_rect(linewidth = rel(relative_size), color = color)) } # set aesthetic mapping for histograms depending on freq argument set_hist_aes <- function(freq = TRUE, ...) { if (freq) { # aes_(x = ~ value, ...) aes(x = .data$value, ...) } else { # aes_(x = ~ value, y = ~ after_stat(density), ...) aes(x = .data$value, y = after_stat(density), ...) } } scale_color_ppc <- function(name = NULL, values = NULL, labels = NULL, ...) { scale_color_manual( name = name %||% "", values = values %||% get_color(c("dh", "lh")), labels = labels %||% c(y_label(), yrep_label()), ... ) } scale_fill_ppc <- function(name = NULL, values = NULL, labels = NULL, ...) { scale_fill_manual( name = name %||% "", values = values %||% get_color(c("d", "l")), labels = labels %||% c(y_label(), yrep_label()), ... ) } scale_color_ppd <- function(name = NULL, values = get_color("mh"), labels = ypred_label(), ...) { scale_color_ppc(name = name, values = values, labels = labels, ...) } scale_fill_ppd <- function(name = NULL, values = get_color("m"), labels = ypred_label(), ...) { scale_fill_ppc(name = name, values = values, labels = labels, ...) } bayesplot/R/mcmc-intervals.R0000644000176200001440000007026014556270424015542 0ustar liggesusers#' Plot interval estimates from MCMC draws #' #' Plot central (quantile-based) posterior interval estimates from MCMC draws. #' See the **Plot Descriptions** section, below, for details. #' #' @name MCMC-intervals #' @family MCMC #' #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-transformations #' @param ... Currently unused. #' @param prob The probability mass to include in the inner interval (for #' `mcmc_intervals()`) or in the shaded region (for `mcmc_areas()`). The #' default is `0.5` (50% interval) and `1` for `mcmc_areas_ridges()`. #' @param prob_outer The probability mass to include in the outer interval. The #' default is `0.9` for `mcmc_intervals()` (90% interval) and #' `1` for `mcmc_areas()` and for `mcmc_areas_ridges()`. #' @param area_method How to constrain the areas in `mcmc_areas()`. The #' default is `"equal area"`, setting the density curves to have the same #' area. With `"equal height"`, the curves are scaled so that the highest #' points across the curves are the same height. The method `"scaled #' height"` tries a compromise between to the two: the heights from #' `"equal height"` are scaled using `height*sqrt(height)` #' @param point_est The point estimate to show. Either `"median"` (the #' default), `"mean"`, or `"none"`. #' @param inner_size,outer_size For `mcmc_intervals()`, the size of #' the inner and interval segments, respectively. #' @param point_size For `mcmc_intervals()`, the size of point estimate. #' @param rhat An optional numeric vector of R-hat estimates, with one element #' per parameter included in `x`. If `rhat` is provided, the intervals/areas #' and point estimates in the resulting plot are colored based on R-hat value. #' See [rhat()] for methods for extracting R-hat estimates. #' @template args-density-controls #' #' @template return-ggplot-or-data #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_intervals()`}{ #' Plots of uncertainty intervals computed from posterior draws with all #' chains merged. #' } #' \item{`mcmc_areas()`}{ #' Density plots computed from posterior draws with all chains merged, #' with uncertainty intervals shown as shaded areas under the curves. #' } #' \item{`mcmc_areas_ridges()`}{ #' Density plot, as in `mcmc_areas()`, but drawn with overlapping #' ridgelines. This plot provides a compact display of (hierarchically) #' related distributions. #' } #' } #' #' @examples #' set.seed(9262017) #' #' # load ggplot2 to use its functions to modify our plots #' library(ggplot2) #' #' # some parameter draws to use for demonstration #' x <- example_mcmc_draws(params = 6) #' dim(x) #' dimnames(x) #' #' color_scheme_set("brightblue") #' mcmc_intervals(x) #' mcmc_intervals(x, pars = c("beta[1]", "beta[2]")) #' mcmc_areas(x, regex_pars = "beta\\[[1-3]\\]", prob = 0.8) + #' labs( #' title = "Posterior distributions", #' subtitle = "with medians and 80% intervals" #' ) #' #' color_scheme_set("red") #' p <- mcmc_areas( #' x, #' pars = c("alpha", "beta[4]"), #' prob = 2/3, #' prob_outer = 0.9, #' point_est = "mean", #' border_size = 1.5 # make the ridgelines fatter #' ) #' plot(p) #' #' \donttest{ #' # control spacing at top and bottom of plot #' # see ?ggplot2::expansion #' p + scale_y_discrete( #' limits = c("beta[4]", "alpha"), #' expand = expansion(add = c(1, 2)) #' ) #' p + scale_y_discrete( #' limits = c("beta[4]", "alpha"), #' expand = expansion(add = c(.1, .3)) #' ) #' #' # relabel parameters #' p + scale_y_discrete( #' labels = c("alpha" = "param label 1", #' "beta[4]" = "param label 2") #') #' #' # relabel parameters and define the order #' p + scale_y_discrete( #' labels = c("alpha" = "param label 1", #' "beta[4]" = "param label 2"), #' limits = c("beta[4]", "alpha") #' ) #' #' # color by rhat value #' color_scheme_set("blue") #' fake_rhat_values <- c(1, 1.07, 1.3, 1.01, 1.15, 1.005) #' mcmc_intervals(x, rhat = fake_rhat_values) #' #' # get the dataframe that is used in the plotting functions #' mcmc_intervals_data(x) #' mcmc_intervals_data(x, rhat = fake_rhat_values) #' mcmc_areas_data(x, pars = "alpha") #' #' color_scheme_set("gray") #' p <- mcmc_areas(x, pars = c("alpha", "beta[4]"), rhat = c(1, 1.1)) #' p + legend_move("bottom") #' p + legend_move("none") # or p + legend_none() #' #' } #' #' # Different area calculations #' b3 <- c("beta[1]", "beta[2]", "beta[3]") #' #' mcmc_areas(x, pars = b3, area_method = "equal area") + #' labs( #' title = "Curves have same area", #' subtitle = "A wide, uncertain interval is spread thin when areas are equal" #' ) #' #' mcmc_areas(x, pars = b3, area_method = "equal height") + #' labs( #' title = "Curves have same maximum height", #' subtitle = "Local curvature is clearer but more uncertain curves use more area" #' ) #' #' mcmc_areas(x, pars = b3, area_method = "scaled height") + #' labs( #' title = "Same maximum heights but heights scaled by square-root", #' subtitle = "Compromise: Local curvature is accentuated and less area is used" #' ) #' #' \donttest{ #' # apply transformations #' mcmc_intervals( #' x, #' pars = c("beta[2]", "sigma"), #' transformations = list("sigma" = "log", "beta[2]" = function(x) x + 3) #' ) #' #' # apply same transformation to all selected parameters #' mcmc_intervals(x, regex_pars = "beta", transformations = "exp") #' } #' #' \dontrun{ #' # example using fitted model from rstanarm package #' library(rstanarm) #' fit <- stan_glm( #' mpg ~ 0 + wt + factor(cyl), #' data = mtcars, #' iter = 500, #' refresh = 0 #' ) #' x <- as.matrix(fit) #' #' color_scheme_set("teal") #' mcmc_intervals(x, point_est = "mean", prob = 0.8, prob_outer = 0.95) #' mcmc_areas(x, regex_pars = "cyl", bw = "SJ", #' rhat = rhat(fit, regex_pars = "cyl")) #' } #' #' \dontrun{ #' # Example of hierarchically related parameters #' # plotted with ridgelines #' m <- shinystan::eight_schools@posterior_sample #' mcmc_areas_ridges(m, pars = "mu", regex_pars = "theta", border_size = 0.75) + #' ggtitle("Treatment effect on eight schools (Rubin, 1981)") #' } #' NULL #' @rdname MCMC-intervals #' @export mcmc_intervals <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), outer_size = 0.5, inner_size = 2, point_size = 4, rhat = numeric()) { check_ignored_arguments(...) data <- mcmc_intervals_data(x, pars, regex_pars, transformations, prob = prob, prob_outer = prob_outer, point_est = point_est, rhat = rhat) color_by_rhat <- rlang::has_name(data, "rhat_rating") no_point_est <- all(data$point_est == "none") x_lim <- range(c(data$ll, data$hh)) x_range <- diff(x_lim) x_lim[1] <- x_lim[1] - 0.05 * x_range x_lim[2] <- x_lim[2] + 0.05 * x_range # faint vertical line at zero if zero is within x_lim layer_vertical_line <- if (0 > x_lim[1] && 0 < x_lim[2]) { vline_0(color = "gray90", linewidth = 0.5) } else { geom_ignore() } args_outer <- list( mapping = aes(x = .data$ll, xend = .data$hh, y = .data$parameter, yend = .data$parameter), color = get_color("mid"), linewidth = outer_size ) args_inner <- list( mapping = aes(x = .data$l, xend = .data$h, y = .data$parameter, yend = .data$parameter), linewidth = inner_size, show.legend = FALSE ) args_point <- list( mapping = aes(x = .data$m, y = .data$parameter), data = data, size = point_size, shape = 21 ) if (color_by_rhat) { args_inner$mapping <- args_inner$mapping %>% modify_aes(color = .data$rhat_rating) args_point$mapping <- args_point$mapping %>% modify_aes(color = .data$rhat_rating, fill = .data$rhat_rating) } else { args_inner$color <- get_color("dark") args_point$color <- get_color("dark_highlight") args_point$fill <- get_color("light") } point_func <- if (no_point_est) geom_ignore else geom_point layer_outer <- do.call(geom_segment, args_outer) layer_inner <- do.call(geom_segment, args_inner) layer_point <- do.call(point_func, args_point) # Do something or add an invisible layer if (color_by_rhat) { scale_color <- scale_color_diagnostic("rhat") scale_fill <- scale_fill_diagnostic("rhat") } else { scale_color <- geom_ignore() scale_fill <- geom_ignore() } ggplot(data) + layer_vertical_line + layer_outer + layer_inner + layer_point + scale_color + scale_fill + scale_y_discrete(limits = unique(rev(data$parameter))) + xlim(x_lim) + bayesplot_theme_get() + legend_move(ifelse(color_by_rhat, "top", "none")) + yaxis_text(face = "bold") + yaxis_title(FALSE) + yaxis_ticks(linewidth = 1) + xaxis_title(FALSE) } #' @rdname MCMC-intervals #' @export #' @param border_size For `mcmc_areas()` and `mcmc_areas_ridges()`, the size of #' the ridgelines. mcmc_areas <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., area_method = c("equal area", "equal height", "scaled height"), prob = 0.5, prob_outer = 1, point_est = c("median", "mean", "none"), rhat = numeric(), border_size = NULL, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL) { check_ignored_arguments(...) area_method <- match.arg(area_method) data <- mcmc_areas_data( x, pars, regex_pars, transformations, prob = prob, prob_outer = prob_outer, point_est = point_est, rhat = rhat, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens ) datas <- split(data, data$interval) # Use a dummy empty dataframe if no point estimate no_point_est <- !rlang::has_name(datas, "point") datas$point <- if (no_point_est) { dplyr::filter(datas$inner, FALSE) } else { datas$point } color_by_rhat <- rlang::has_name(data, "rhat_rating") # faint vertical line at zero if zero is within x_lim x_lim <- range(datas$outer$x) x_range <- diff(x_lim) x_lim[1] <- x_lim[1] - 0.05 * x_range x_lim[2] <- x_lim[2] + 0.05 * x_range layer_vertical_line <- if (0 > x_lim[1] && 0 < x_lim[2]) { vline_0(color = "gray90", linewidth = 0.5) } else { geom_ignore() } # Need to include rhat rating as a grouping variable if coloring by rhat so # that datas$bottom has an rhat_rating column that can map to color aesthetic groups <- if (color_by_rhat) { rlang::syms(c("parameter", "rhat_rating")) } else { rlang::syms(c("parameter")) } datas$bottom <- datas$outer %>% group_by(!!! groups) %>% summarise( ll = min(.data$x), hh = max(.data$x), .groups = "drop_last" ) %>% ungroup() args_bottom <- list( mapping = aes(x = .data$ll, xend = .data$hh, yend = .data$parameter), data = datas$bottom ) args_inner <- list( mapping = aes(scale = 0.9), data = datas$inner ) args_point <- list( mapping = aes(scale = 0.9), data = datas$point, color = NA ) args_outer <- list( mapping = aes(scale = 0.9), fill = NA ) if (area_method == "equal height") { args_inner$mapping <- modify_aes(args_inner$mapping, height = .data$scaled_density) args_point$mapping <- modify_aes(args_point$mapping, height = .data$scaled_density) args_outer$mapping <- modify_aes(args_outer$mapping, height = .data$scaled_density) } else if (area_method == "scaled height") { args_inner$mapping <- modify_aes(args_inner$mapping, height = .data$scaled_density * sqrt(.data$scaled_density)) args_point$mapping <- modify_aes(args_point$mapping, height = .data$scaled_density * sqrt(.data$scaled_density)) args_outer$mapping <- modify_aes(args_outer$mapping, height = .data$scaled_density * sqrt(.data$scaled_density)) } else { args_inner$mapping <- modify_aes(args_inner$mapping, height = .data$plotting_density) args_point$mapping <- modify_aes(args_point$mapping, height = .data$plotting_density) args_outer$mapping <- modify_aes(args_outer$mapping, height = .data$plotting_density) } if (!is.null(border_size)) { args_bottom$linewidth <- border_size args_outer$linewidth <- border_size args_inner$linewidth <- border_size } if (color_by_rhat) { args_bottom$mapping <- args_bottom$mapping %>% modify_aes(color = .data$rhat_rating) args_inner$mapping <- args_inner$mapping %>% modify_aes(color = .data$rhat_rating, fill = .data$rhat_rating) args_outer$mapping <- args_outer$mapping %>% modify_aes(color = .data$rhat_rating) # rhat fill color scale uses light/mid/dark colors. The point estimate needs # to be drawn with highlighted color scale, so we manually set the color for # the rhat fills. dc <- diagnostic_colors("rhat", "color")[["values"]] args_point$fill <- dc[datas$point$rhat_rating] } else { args_bottom$color <- get_color("dark") args_inner$color <- get_color("dark") args_inner$fill <- get_color("light") args_point$fill <- get_color("mid_highlight") args_outer$color <- get_color("dark") } # An invisible layer that is 2.5% taller than the plotted one args_outer2 <- args_outer args_outer2$mapping <- args_outer2$mapping %>% modify_aes(scale = .925) args_outer2$color <- NA layer_bottom <- do.call(geom_segment, args_bottom) layer_inner <- do.call(ggridges::geom_ridgeline, args_inner) layer_outer <- do.call(ggridges::geom_ridgeline, args_outer) layer_outer2 <- do.call(ggridges::geom_ridgeline, args_outer2) point_geom <- if (no_point_est) { geom_ignore } else { ggridges::geom_ridgeline } layer_point <- do.call(point_geom, args_point) # Do something or add an invisible layer if (color_by_rhat) { scale_color <- scale_color_diagnostic("rhat") scale_fill <- scale_fill_diagnostic("rhat") } else { scale_color <- geom_ignore() scale_fill <- geom_ignore() } ggplot(datas$outer) + aes(x = .data$x, y = .data$parameter) + layer_vertical_line + layer_inner + layer_point + layer_outer + layer_outer2 + layer_bottom + scale_color + scale_fill + scale_y_discrete( limits = unique(rev(data$parameter)), expand = expansion( add = c(0, 0.5 + 1/(2 * nlevels(data$parameter))), mult = c(0.05, 1/(2 * nlevels(data$parameter))) ) ) + xlim(x_lim) + bayesplot_theme_get() + legend_move(ifelse(color_by_rhat, "top", "none")) + yaxis_text(face = "bold") + yaxis_title(FALSE) + yaxis_ticks(linewidth = 1) + xaxis_title(FALSE) } #' @rdname MCMC-intervals #' @export mcmc_areas_ridges <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., prob_outer = 1, prob = 1, border_size = NULL, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL) { check_ignored_arguments(...) data <- mcmc_areas_ridges_data(x, pars = pars, regex_pars = regex_pars, transformations = transformations, prob = prob, prob_outer = prob_outer, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens) datas <- data %>% split(data$interval) # faint vertical line at zero if zero is within x_lim x_lim <- range(datas$outer$x) x_range <- diff(x_lim) x_lim[1] <- x_lim[1] - 0.05 * x_range x_lim[2] <- x_lim[2] + 0.05 * x_range layer_vertical_line <- if (0 > x_lim[1] && 0 < x_lim[2]) { vline_0(color = "gray90", linewidth = 0.5) } else { geom_ignore() } args_outer <- list( mapping = aes(height = .data$density), color = get_color("dark"), fill = NA, stat = "identity" ) if (!is.null(border_size)) { args_outer$linewidth <- border_size } layer_outer <- do.call(ggridges::geom_density_ridges, args_outer) # Force ggridges to compute the scaling now test_plot <- ggplot(datas$outer) + aes(x = .data$x, y = .data$parameter) + layer_outer soft_build <- ggplot_build(test_plot) scaler1 <- unique(soft_build$data[[1]][["scale"]]) scaler2 <- unique(soft_build$data[[1]][["iscale"]]) scale <- scaler1 * scaler2 # Draw each ridgeline from top the bottom layer_list_inner <- list() par_draw_order <- levels(unique(data$parameter)) bg <- bayesplot_theme_get()[["panel.background"]][["fill"]] %||% "white" for (par_num in seq_along(unique(data$parameter))) { # Basically, draw the current ridgeline normally, but draw all the ones # under it (which would overlap it vertically) with a blank fill this_par <- par_draw_order[par_num] next_pars <- par_draw_order[par_num < seq_along(par_draw_order)] this_par_data <- datas$inner %>% dplyr::filter(.data$parameter == this_par) %>% mutate(color = get_color("dark"), fill = get_color("light")) next_par_data <- datas$outer %>% dplyr::filter(.data$parameter %in% next_pars) %>% mutate(color = get_color("dark"), fill = bg) args_inner <- list( mapping = aes(height = .data$density, color = .data$color, fill = .data$fill), data = dplyr::bind_rows(this_par_data, next_par_data), scale = scale, stat = "identity") if (!is.null(border_size)) { args_inner$linewidth <- border_size } layer_list_inner[[par_num]] <- do.call(ggridges::geom_ridgeline, args_inner) } ggplot(datas$outer) + aes(x = .data$x, y = .data$parameter) + layer_outer + scale_y_discrete(limits = unique(rev(data$parameter)), expand = expansion( add = c(0, 1.4 + 1/(2 * nlevels(data$parameter))), mult = c(0.05, 1/(2 * nlevels(data$parameter))) )) + layer_list_inner + layer_vertical_line + scale_fill_identity() + scale_color_identity() + xlim(x_lim) + yaxis_title(FALSE) + xaxis_title(FALSE) + bayesplot_theme_get() + grid_lines_y(color = "gray90") + theme(axis.text.y = element_text(hjust = 1, vjust = 0)) } #' @rdname MCMC-intervals #' @export mcmc_intervals_data <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), rhat = numeric()) { check_ignored_arguments(...) probs <- check_interval_widths(prob, prob_outer) prob <- probs[1] prob_outer <- probs[2] x <- prepare_mcmc_array(x, pars, regex_pars, transformations) x <- merge_chains(x) data_long <- melt_mcmc(x) %>% dplyr::as_tibble() %>% rlang::set_names(tolower) probs <- c(0.5 - prob_outer / 2, 0.5 - prob / 2, 0.5 + prob / 2, 0.5 + prob_outer / 2) point_est <- match.arg(point_est) m_func <- if (point_est == "mean") mean else median data <- data_long %>% group_by(.data$parameter) %>% summarise( outer_width = prob_outer, inner_width = prob, point_est = point_est, ll = unname(quantile(.data$value, probs[1])), l = unname(quantile(.data$value, probs[2])), m = m_func(.data$value), h = unname(quantile(.data$value, probs[3])), hh = unname(quantile(.data$value, probs[4])) ) if (point_est == "none") { data$m <- NULL } color_by_rhat <- isTRUE(length(rhat) > 0) if (color_by_rhat) { rhat <- drop_NAs_and_warn(new_rhat(rhat)) if (length(rhat) != nrow(data)) { abort(paste( "'rhat' has length", length(rhat), "but 'x' has", nrow(data), "parameters." )) } rhat <- set_names(rhat, data$parameter) rhat_tbl <- rhat %>% mcmc_rhat_data() %>% select(one_of("parameter"), rhat_value = "value", rhat_rating = "rating", rhat_description = "description") %>% mutate(parameter = factor(.data$parameter, levels(data$parameter))) data <- dplyr::inner_join(data, rhat_tbl, by = "parameter") } data } # Don't import `filter`: otherwise, you get a warning when using # `devtools::load_all(".")` because stats also has a `filter` function #' @importFrom dplyr inner_join one_of top_n #' @rdname MCMC-intervals #' @export mcmc_areas_data <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 1, point_est = c("median", "mean", "none"), rhat = numeric(), bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL) { probs <- check_interval_widths(prob, prob_outer) # First compute normal intervals so we know the width of the data, point # estimates, and have prepared rhat values. # Compute intervals with a median (for now) if no point estimate. It will be # cleaner to ignore results later than to have two branching code paths. point_est <- match.arg(point_est) temp_point_est <- if (point_est == "none") "median" else point_est intervals <- mcmc_intervals_data(x, pars, regex_pars, transformations, prob = probs[1], prob_outer = probs[2], point_est = temp_point_est, rhat = rhat) x <- prepare_mcmc_array(x, pars, regex_pars, transformations) x <- merge_chains(x) data_long <- melt_mcmc(x) %>% dplyr::as_tibble() %>% rlang::set_names(tolower) # Compute the density intervals data_inner <- data_long %>% compute_column_density( group_vars = "parameter", value_var = "value", interval_width = probs[1], bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens) %>% mutate(interval = "inner") data_outer <- data_long %>% compute_column_density( group_vars = "parameter", value_var = "value", interval_width = probs[2], bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens) %>% mutate(interval = "outer") # Point estimates will be intervals that take up .8% of the x-axis x_lim <- range(data_outer$x) x_range <- diff(x_lim) x_lim[1] <- x_lim[1] - 0.05 * x_range x_lim[2] <- x_lim[2] + 0.05 * x_range half_point_width <- .004 * diff(x_lim) # Find the density values closest to the point estimate point_ests <- intervals %>% select(one_of("parameter", "m")) point_centers <- data_inner %>% inner_join(point_ests, by = "parameter") %>% group_by(.data$parameter) %>% mutate(diff = abs(.data$m - .data$x)) %>% dplyr::top_n(1, -.data$diff) %>% select(one_of("parameter", "x", "m")) %>% rename(center = "x") %>% ungroup() # Keep density values that are within +/- .4% of x-axis of the point estimate points <- point_centers %>% left_join(data_inner, by = "parameter") %>% group_by(.data$parameter) %>% dplyr::filter(abs(.data$center - .data$x) <= half_point_width) %>% mutate( interval_width = 0, interval = "point" ) %>% select(-c("center"), "m") %>% ungroup() # Ignore points calculcation if no point estimate was requested if (point_est == "none") { points <- dplyr::filter(points, FALSE) } data <- dplyr::bind_rows(data_inner, data_outer, points) %>% select(one_of("parameter", "interval", "interval_width", "x", "density", "scaled_density")) %>% # Density scaled so the highest in entire dataframe has height 1 mutate(plotting_density = .data$density / max(.data$density)) if (rlang::has_name(intervals, "rhat_value")) { rhat_info <- intervals %>% select(one_of("parameter", "rhat_value", "rhat_rating", "rhat_description")) data <- inner_join(data, rhat_info, by = "parameter") } data } #' @rdname MCMC-intervals #' @export mcmc_areas_ridges_data <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., prob_outer = 1, prob = 1, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL) { check_ignored_arguments(...) mcmc_areas_data(x, pars = pars, regex_pars = regex_pars, transformations = transformations, prob = prob, prob_outer = prob_outer, point_est = "none", bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens) } # internal ---------------------------------------------------------------- #' Compute density for a dataframe column. #' #' @param df a dataframe of posterior samples #' @param group_vars columns to group by. e.g., `c(Parameter, Chain)` #' @param value_var column containing posterior samples #' @param ... arguments passed onto density calculation #' @noRd compute_column_density <- function(df, group_vars, value_var, ...) { value_var <- enquo(value_var) group_vars <- enquos(group_vars) # Convert the vector of bare column names to a list of symbols group_cols <- df %>% dplyr::select(!!! group_vars) %>% names() %>% syms() # Tuck away the subgroups to compute densities on into nested dataframes sub_df <- dplyr::select(df, !!! group_cols, !! value_var) group_df <- df %>% dplyr::select(!!! group_cols, !! value_var) %>% group_by(!!! group_cols) by_group <- group_df %>% split(dplyr::group_indices(group_df)) %>% lapply(pull, !! value_var) nested <- df %>% dplyr::distinct(!!! group_cols) %>% mutate(data = by_group) nested$density <- lapply(nested$data, compute_interval_density, ...) nested$data <- NULL # Manually unnest the data reconstructed <- as.list(seq_len(nrow(nested))) for (df_i in seq_along(nested$density)) { row <- nested[df_i, ] parent <- row %>% select(-c("density")) groups <- rep(list(parent), nrow(row$density[[1]])) %>% dplyr::bind_rows() reconstructed[[df_i]] <- dplyr::bind_cols(groups, row$density[[1]]) } dplyr::bind_rows(reconstructed) } # Given a vector of values, compute a density dataframe. compute_interval_density <- function(x, interval_width = 1, n_dens = 1024, bw = NULL, adjust = NULL, kernel = NULL) { n_dens <- n_dens %||% 1024 tail_width <- (1 - interval_width) / 2 qs <- quantile(x, probs = c(tail_width, 1 - tail_width)) args <- c( # can't be null list(x = x, from = min(qs), to = max(qs), n = n_dens), # might be null bw = bw, adjust = adjust, kernel = kernel) dens <- do.call(stats::density, args) data.frame( interval_width = interval_width, x = dens$x, density = dens$y, scaled_density = dens$y / max(dens$y, na.rm = TRUE) ) } check_interval_widths <- function(prob, prob_outer) { if (!(is.numeric(prob) && is.numeric(prob_outer))) abort("`prob` and `prob_outer` must be numeric") if (prob < 0 || prob > 1 || prob_outer < 0 || prob_outer > 1) abort("`prob` and `prob_outer` must be in [0,1].") if (prob_outer < prob) { x <- sprintf( "`prob_outer` (%s) is less than `prob` (%s)\n... %s", prob_outer, prob, "Swapping the values of `prob_outer` and `prob`" ) warn(x) } sort(c(prob, prob_outer)) } bayesplot/R/helpers-ppc.R0000644000176200001440000004613014560773547015050 0ustar liggesusers# input validation and type checking ---------------------------------------- # Check if an object is a vector (but not list) or a 1-D array is_vector_or_1Darray <- function(x) { if (is.vector(x) && !is.list(x)) { return(TRUE) } isTRUE(is.array(x) && length(dim(x)) == 1) } # Check if x consists of whole numbers (very close to integers) # Implementation here follows example ?integer is_whole_number <- function(x, tol = .Machine$double.eps) { if (!is.numeric(x)) { FALSE } else { abs(x - round(x)) < tol } } # Check if all values in x are whole numbers or counts (non-negative whole # numbers) all_whole_number <- function(x, ...) { all(is_whole_number(x, ...)) } all_counts <- function(x, ...) { all_whole_number(x, ...) && min(x) >= 0 } #' Validate y #' #' Checks that `y` is numeric, doesn't have any NAs, and is either a vector, 1-D #' array, or univariate time series object of class `ts`. #' #' @param y The `y` object from the user. #' @return Either throws an error or returns a numeric vector. #' @noRd validate_y <- function(y) { stopifnot(is.numeric(y)) if (!(inherits(y, "ts") && is.null(dim(y)))) { if (!is_vector_or_1Darray(y)) { abort("'y' must be a vector or 1D array.") } y <- as.vector(y) } if (anyNA(y)) { abort("NAs not allowed in 'y'.") } unname(y) } #' Validate predictions (`yrep` or `ypred`) #' #' Checks that `predictions` is a numeric matrix, doesn't have any NAs, and has #' the correct number of columns. #' #' @param predictions The user's `yrep` or `ypred` object (SxN matrix). #' @param `n_obs` The number of observations (columns) that `predictions` should #' have, if applicable. #' @return Either throws an error or returns a numeric matrix. #' @noRd validate_predictions <- function(predictions, n_obs = NULL) { # sanity checks stopifnot(is.matrix(predictions), is.numeric(predictions)) if (!is.null(n_obs)) { stopifnot(length(n_obs) == 1, n_obs == as.integer(n_obs)) } if (is.integer(predictions)) { if (nrow(predictions) == 1) { predictions[1, ] <- as.numeric(predictions[1,, drop = FALSE]) } else { predictions <- apply(predictions, 2, as.numeric) } } if (anyNA(predictions)) { abort("NAs not allowed in predictions.") } if (!is.null(n_obs) && (ncol(predictions) != n_obs)) { abort("ncol(yrep) must be equal to length(y).") } # get rid of names but keep them as an attribute in case we want them obs_names <- colnames(predictions) predictions <- unclass(unname(predictions)) attr(predictions, "obs_names") <- obs_names predictions } #' Validate PIT #' #' Checks that `pit` is numeric, doesn't have any NAs, and is either a vector, #' or a 1-D array with values in [0,1]. #' #' @param pit The 'pit' object from the user. #' @return Either throws an error or returns a numeric vector. #' @noRd validate_pit <- function(pit) { if (anyNA(pit)) { abort("NAs not allowed in 'pit'.") } stopifnot(is.numeric(pit)) if (!is_vector_or_1Darray(pit)) { abort("'pit' must be a vector or 1D array.") } if (any(pit > 1) || any(pit < 0)) { abort("'pit' must only contain values between 0 and 1.") } unname(pit) } #' Validate group #' #' Checks that grouping variable has correct number of observations and is #' either a factor variable or vector (which is coerced to factor). #' #' @param group The user's `group` argument. #' @param n_obs The number of observations that `group` should contain (e.g., #' `length(y)`, `ncol(yrepd)`, etc.). Unlike for `validate_predictions()`, #' this is always required for `validate_group()`. #' @return Either throws an error or returns `group` (coerced to a factor). #' @noRd validate_group <- function(group, n_obs) { # sanity checks stopifnot(is.vector(group) || is.factor(group), length(n_obs) == 1, n_obs == as.integer(n_obs)) if (!is.factor(group)) { group <- as.factor(group) } if (anyNA(group)) { abort("NAs not allowed in 'group'.") } if (length(group) != n_obs) { abort("length(group) must be equal to the number of observations.") } unname(group) } #' Validate x #' #' Checks that x is a numeric vector, doesn't have any NAs, and has the #' same length as y. #' #' @param x,y The user's `x` vector and the `y` object returned by `validate_y()`. #' @param unique_x `TRUE` or `FALSE` indicating whether to require all unique #' values in `x`. #' @return Either throws an error or returns a numeric vector. #' @noRd validate_x <- function(x = NULL, y, unique_x = FALSE) { if (is.null(x)) { if (inherits(y, "ts") && is.null(dim(y))) { x <- stats::time(y) } else { x <- seq_along(y) } } stopifnot(is.numeric(x)) if (!is_vector_or_1Darray(x)) { abort("'x' must be a vector or 1D array.") } x <- as.vector(x) if (length(x) != length(y)) { abort("length(x) must be equal to length(y).") } if (anyNA(x)) { abort("NAs not allowed in 'x'.") } if (unique_x) { stopifnot(identical(length(x), length(unique(x)))) } unname(x) } # Internals for grouped plots --------------------------------------------- #' Modify a call to a `_grouped` function to a call to the ungrouped version #' @param fn The new function to call (a string). #' @param call The original call (from `match.call(expand.dots = FALSE)`). #' @return The new unevaluated call, with additional argument #' `called_from_internal=TRUE` which can be detected by the function to be #' called so it knows not to warn about the `group` and `facet_args` arguments. #' @noRd ungroup_call <- function(fn, call) { args <- rlang::call_args(call) args$called_from_internal <- TRUE args[["..."]] <- NULL rlang::call2(.fn = fn, !!!args, .ns = "bayesplot") } #' Check if the `...` to a plotting function was passed from it's `_grouped` version #' @param dots The `...` arguments already in a list, i.e., `list(...)`. #' @return `TRUE` or `FALSE` #' @noRd from_grouped <- function(dots) { isTRUE(dots[["called_from_internal"]]) && !is.null(dots[["group"]]) } # reshaping --------------------------------------------------- #' Convert matrix of predictions into a molten data frame #' #' @param predictions A matrix (`yrep` or `ypred`), already validated using #' `validate_predictions()`. #' @return A data frame with columns: #' * `y_id`: integer indicating the observation number (`predictions` column). #' * `rep_id`: integer indicating the simulation number (`predictions` row). #' * `rep_label`: factor with S levels, where S is `nrow(predictions)`, i.e. #' the number of simulations included in `predictions`. #' * `value`: the simulation values. #' @noRd melt_predictions <- function(predictions) { obs_names <- attr(predictions, "obs_names") out <- predictions %>% reshape2::melt(varnames = c("rep_id", "y_id")) %>% tibble::as_tibble() rep_labels <- create_rep_ids(out$rep_id) y_names <- obs_names[out$y_id] %||% out$y_id out$rep_label <- factor(rep_labels, levels = unique(rep_labels)) out$y_name <- factor(y_names, levels = unique(y_names)) out[c("y_id", "y_name", "rep_id", "rep_label", "value")] } #' Stack `y` below melted `yrep` data #' #' @param y Validated `y` input. #' @param yrep Validated `yrep` input. #' @return A data frame with the all the columns as the one returned by #' `melt_predictions()`, plus additional columns: #' * `is_y`: logical indicating whether the values are observations (`TRUE`) #' or simulations (`FALSE`). #' * `is_y_label`: factor with levels `italic(y)` for observations and #' `italic(y)[rep]` for simulations. #' @noRd melt_and_stack <- function(y, yrep) { y_text <- as.character(y_label()) yrep_text <- as.character(yrep_label()) molten_preds <- melt_predictions(yrep) # Add a level in the labels for the observed y values levels(molten_preds$rep_label) <- c(levels(molten_preds$rep_label), y_text) y_names <- attr(yrep, "obs_names") %||% seq_along(y) ydat <- tibble::tibble( rep_label = factor(y_text, levels = levels(molten_preds$rep_label)), rep_id = NA_integer_, y_id = seq_along(y), y_name = factor(y_names, levels = unique(y_names)), value = y) data <- dplyr::bind_rows(molten_preds, ydat) %>% mutate( rep_label = relevel(.data$rep_label, y_text), is_y = is.na(.data$rep_id), is_y_label = ifelse(.data$is_y, y_text, yrep_text) %>% factor(levels = c(y_text, yrep_text))) cols <- c("y_id", "y_name", "rep_id", "rep_label", "is_y", "is_y_label", "value") data[cols] } #' Obtain the coverage parameter for simultaneous confidence bands for ECDFs #' #' @param N Length of sample. #' @param L Number of chains. Used for MCMC, defaults to 1 for ppc. #' @param K Number of equally spaced evaluation points (1:K / K). Defaults to N. #' @param prob Desired simultaneous coverage (0,1). #' @param M number of simulations to run, if simulation method is used. #' @param interpolate_adj Boolean defining whether to interpolate the confidence #' bands from precomputed values. Interpolation provides a faster plot with the #' trade-off of possible loss of accuracy. #' @return The adjusted coverage parameter yielding the desired simultaneous #' coverage of the ECDF traces. #' @noRd adjust_gamma <- function(N, L = 1, K = N, prob = 0.99, M = 1000, interpolate_adj = FALSE) { if (! all_counts(c(K, N, L))) { abort("Parameters 'N', 'L' and 'K' must be positive integers.") } if (prob >= 1 || prob <= 0) { abort("Value of 'prob' must be in (0,1).") } if (is.null(interpolate_adj)) { if (K <= 200 || N < 100) { interpolate_adj <- FALSE } else { interpolate_adj <- TRUE } } if (interpolate_adj == TRUE) { gamma <- interpolate_gamma(N = N, K = K, prob = prob, L = L) } else if (L == 1) { gamma <- adjust_gamma_optimize(N = N, K = K, prob = prob) } else { gamma <- adjust_gamma_simulate(N = N, L = L, K = K, prob = prob, M = M) } gamma } #' Adjust coverage parameter for single sample using the optimization method. #' @param N Length of sample. #' @param K Number of equally spaced evaluation points (1:K / K). Defaults to N. #' @param prob Desired simultaneous coverage (0,1). #' @return The adjusted coverage parameter yielding the desired simultaneous #' coverage of the ECDF traces. #' @noRd adjust_gamma_optimize <- function(N, K, prob) { target <- function(gamma, prob, N, K) { z <- 1:(K - 1) / K z1 <- c(0, z) z2 <- c(z, 1) # pre-compute quantiles and use symmetry for increased efficiency. x2_lower <- qbinom(gamma / 2, N, z2) x2_upper <- c(N - rev(x2_lower)[2:K], 1) # Compute the total probability of trajectories inside the confidence # intervals. Initialize the set and corresponding probabilities known # to be 0 and 1 for the starting value z1 = 0. x1 <- 0 p_int <- 1 for (i in seq_along(z1)) { p_int <- p_interior( p_int = p_int, x1 = x1, x2 = x2_lower[i]: x2_upper[i], z1 = z1[i], z2 = z2[i], N = N ) x1 <- x2_lower[i]:x2_upper[i] } return(abs(prob - sum(p_int))) } optimize(target, c(0, 1 - prob), prob = prob, N = N, K = K)$minimum } #' Adjust coverage parameter for multiple chains using the simulation method. #' In short, 'M' simulations of 'L' standard uniform chains are run and the #' confidence bands are set to cover 100 * 'prob' % of these simulations. #' @param N Length of sample. #' @param L Number of chains. Used for MCMC, defaults to 1 for ppc. #' @param K Number of equally spaced evaluation points (1:K / K). Defaults to N. #' @param prob Desired simultaneous coverage (0,1). #' @param M number of simulations to run. #' @return The adjusted coverage parameter yielding the desired simultaneous #' coverage of the ECDF traces. #' @noRd adjust_gamma_simulate <- function(N, L, K, prob, M) { gamma <- numeric(M) z <- (1:(K - 1)) / K # Rank ECDF evaluation points. n <- N * (L - 1) k <- floor(z * N * L) for (m in seq_len(M)) { u <- u_scale(replicate(L, runif(N))) # Fractional ranks of sample chains scaled_ecdfs <- apply(outer(u, z, "<="), c(2, 3), sum) # Find the smalles marginal probability of the simulation run gamma[m] <- 2 * min( apply( scaled_ecdfs, 1, phyper, m = N, n = n, k = k ), apply( scaled_ecdfs - 1, 1, phyper, m = N, n = n, k = k, lower.tail = FALSE ) ) } alpha_quantile(gamma, 1 - prob) } #' Approximate the required adjustement to obtain simultaneous confidence bands #' of an ECDF plot with interpolation with regards to N and K from precomputed #' values for a fixed set of prob and L values. #' @param N Length of sample. #' @param L Number of chains. Used for MCMC, defaults to 1 for ppc. #' @param prob Desired simultaneous coverage (0,1). #' @param K Number of equally spaced evaluation points (1:K / K). Defaults to N. #' @return The approximated adjusted coverage parameter yielding the desired #' simultaneous coverage of the ECDF traces. #' @noRd interpolate_gamma <- function(N, K, prob, L) { # Find the precomputed values useful for the interpolation task. vals <- get_interpolation_values(N, K, L, prob) # Largest lower bound and smalles upper bound for N among precomputed values. N_lb <- max(vals[vals$N <= N, ]$N) N_ub <- min(vals[vals$N >= N, ]$N) # Approximate largest lower bound and smallest upper bound for gamma. log_gamma_lb <- approx( x = log(vals[vals$N == N_lb, ]$K), y = log(vals[vals$N == N_lb, ]$val), xout = log(K) )$y log_gamma_ub <- approx( x = log(vals[vals$N == N_ub, ]$K), y = log(vals[vals$N == N_ub, ]$val), xout = log(K) )$y if (N_ub == N_lb) { log_gamma_approx <- log_gamma_lb } else { # Approximate log_gamma for the desired value of N. log_gamma_approx <- approx( x = log(c(N_lb, N_ub)), y = c(log_gamma_lb, log_gamma_ub), xout = log(N) )$y } exp(log_gamma_approx) } #' Filter the precomputed values useful for the interpolation task given to #' interpolate_gamma. Check, if the task is possible with the availabel data. #' @param N Length of sample. #' @param K Number of equally spaced evaluation points (1:K / K). Defaults to N. #' @param L Number of chains. Used for MCMC, defaults to 1 for ppc. #' @param prob Desired simultaneous coverage (0,1). #' @return A data.frame containing the relevant precomputed values. #' @noRd get_interpolation_values <- function(N, K, L, prob) { for (dim in c("L", "prob")) { if (all(get(dim) != .gamma_adj[, dim])) { stop(paste( "No precomputed values to interpolate from for '", dim, "' = ", get(dim), ".\n", "Values of '", dim, "' available for interpolation: ", paste(unique(.gamma_adj[, dim]), collapse = ", "), ".", sep = "" )) } } vals <- .gamma_adj[.gamma_adj$L == L & .gamma_adj$prob == prob, ] if (N > max(vals$N)) { stop(paste( "No precomputed values to interpolate from for sample length of ", N, ".\n", "Please use a subsample of length ", max(vals$N), " or smaller, or consider setting 'interpolate_adj' = FALSE.", sep = "" )) } if (N < min(vals$N)) { stop(paste( "No precomputed values to interpolate from for sample length of ", N, ".\n", "Please use a subsample of length ", min(vals$N), " or larger, or consider setting 'interpolate_adj' = FALSE.", sep = "" )) } if (K > max(vals[vals$N <= N, ]$K)) { stop(paste( "No precomputed values available for interpolation for 'K' = ", K, ".\n", "Try either setting a value of 'K' <= ", max(vals[vals$N <= N, ]$K), "or 'interpolate_adj' = FALSE.", sep = "" )) } if (K < min(vals[vals$N <= N, ]$K)) { stop(paste( "No precomputed values available for interpolation for 'K' = ", K, ".\n", "Try either setting a value of 'K' >= ", min(vals[vals$N <= N, ]$K), " or 'interpolate_adj' = FALSE.", sep = "" )) } vals } #' A helper function for 'adjust_gamma_optimize' defining the probability that #' a scaled ECDF stays within the supplied bounds between two evaluation points. #' @param p_int For each value in x1, the probability that the ECDF has stayed #' within the bounds until z1 and takes the value in x1 at z1. #' @param x1 Vector of scaled ECDF values at the left end of the interval, z1. #' @param x2 Vector of scaled ECDF values at the right end of the interval, z2. #' @param z1 Left evaluation point in [0,1] #' @param z2 Right evaluation point in [0,1] with z2 > z1. #' @param N Total number of values in the sample. #' @return A vector containing the probability to transitioning from the values #' in x1 to each of the values in x2 weighted by the probabilities in p_int. #' @noRd p_interior <- function(p_int, x1, x2, z1, z2, N) { # Ratio between the length of the evaluation interval and the total length of # the interval left to cover by ECDF. z_tilde <- (z2 - z1) / (1 - z1) # Number of samples left to cover by ECDF. N_tilde <- rep(N - x1, each = length(x2)) p_int <- rep(p_int, each = length(x2)) x_diff <- outer(x2, x1, "-") # Pobability of each transition from a value in x1 to a value in x2. p_x2_int <- p_int * dbinom(x_diff, N_tilde, z_tilde) rowSums(p_x2_int) } #' A helper function for 'adjust_alpha_simulate' #' 100 * `alpha` percent of the trials in 'gamma' are allowed to be rejected. #' In case of ties, return the largest value dominating at most #' 100 * (alpha + tol) percent of the values. #' @noRd alpha_quantile <- function(gamma, alpha, tol = 0.001) { a <- unname(quantile(gamma, probs = alpha)) a_tol <- unname(quantile(gamma, probs = alpha + tol)) if (a == a_tol) { if (min(gamma) < a) { # take the largest value that doesn't exceed the tolerance. a <- max(gamma[gamma < a]) } } a } #' Compute simultaneous confidence intervals with the given adjusted coverage #' parameter gamma. #' @param gamma Adjusted coverage parameter for the marginal distribution #' (binomial for PIT values and hypergeometric for rank transformed chains). #' @param N Sample length. #' @param K Number of uniformly spaced evaluation points. #' @param L Number of MCMC-chains. (1 for ppc) #' @return A list with upper and lower confidence interval values at the #' evaluation points. #' @noRd ecdf_intervals <- function(gamma, N, K, L = 1) { lims <- list() z <- seq(0, 1, length.out = K + 1) if (L == 1) { lims$lower <- qbinom(gamma / 2, N, z) lims$upper <- qbinom(1 - gamma / 2, N, z) } else { n <- N * (L - 1) k <- floor(z * L * N) lims$lower <- qhyper(gamma / 2, N, n, k) lims$upper <- qhyper(1 - gamma / 2, N, n, k) } lims } #' Helper for 'adjust_gamma_simulate` #' Transforms observations in 'x' into their corresponding fractional ranks. #' @noRd u_scale <- function(x) { array(rank(x) / length(x), dim = dim(x), dimnames = dimnames(x)) } # labels ---------------------------------------------------------------- create_rep_ids <- function(ids) paste('italic(y)[rep] (', ids, ")") y_label <- function() expression(italic(y)) yrep_label <- function() expression(italic(y)[rep]) ypred_label <- function() expression(italic(y)[pred]) bayesplot/NEWS.md0000644000176200001440000004342114562715444013372 0ustar liggesusers# bayesplot 1.11.1 * Limit maximum number of evaluation points in `ppc_pit_ecdf` functions by default to 1000. by @TeemuSailynoja in #318 # bayesplot 1.11.0 * Update for new ggplot2 release by @teunbrand in #309 * Add `bins` argument to many histogram plots by @paul-buerkner in #300 * Follow ggplot2 updates on `facet_grid()` and `facet_wrap()` by @heavywatal in #305 * Better `ppc_loo_pit_qq` plots by @avehtari in #307 * Check `prob` is numeric for intervals plots by @tony-stone in #299 * Add `bins` and `breaks` arguments to more histogram and hex plots by @heavywatal in #313 * Replace `size` argument with `linewidth` for `geom_line` and `geom_ridgeline` by @heavywatal in #314 * All LOO plots now accept `psis_object` argument by @jgabry in #311 * `ppc_pit_ecdf()` and `ppc_pit_ecdf_grouped()` now support discrete variables, and their default method for selecting the number of ECDF evaluation points has been updated. by @TeemuSailynoja in #316 # bayesplot 1.10.0 * New function `mcmc_rank_ecdf()` for rank ecdf plots with confidence bands for assessing if two or more chains sample the same distribution (#282, @TeemuSailynoja) * New functions `ppc_pit_ecdf()`, `ppc_pit_ecdf_grouped()`, PIT ecdf plots with confidence bands to assess if `y` and `yrep` contain samples from the same distribution. (#282, @TeemuSailynoja) * Several `ppc` and `ppd` functions now accept the new `linewidth` argument introduced in ggplot2 3.4.0: `ppc_bars()`, `ppc_bars_grouped()`, `ppc_intervals()`, `ppc_intervals_grouped()`, `ppd_intervals()`, `ppd_intervals_grouped()`. * Fix bug in how `mcmc_pairs()` detected hitting `max_treedepth`, thanks to @dmphillippo. (#281) * Fix failing tests due to changes in ggplot2 3.4.0 (#289) # bayesplot 1.9.0 * New module PPD (posterior/prior predictive distribution) with a lot of new plotting functions with `ppd_` prefix. These functions plot draws from the prior or posterior predictive distributions (PPD) without comparing to observed data (i.e., no `y` argument). Because these are not "checks" against the observed data we use PPD instead of PPC. These plots are essentially the same as the corresponding PPC plots but without showing any observed data (e.g., `ppd_intervals()` is like `ppc_intervals()` but without plotting `y`). See `help("PPD-overview")` for details. (#151, #222) * All PPC categories now have one or more `_data()` functions that return the data frame used for plotting (#97, #222). Many of these have already been in previous releases, but the new ones in this release are: - `ppc_bars_data()` - `ppc_error_data()` - `ppc_error_binnned_data()` - `ppc_scatter_data()` - `ppc_scatter_avg_data()` - `ppc_stat_data()` * Many functions gain an argument `facet_args` for controlling ggplot2 faceting (many other functions have had this argument for a long time). The ones that just now got the argument are: - `ppc_scatter()` - `ppc_scatter_avg_grouped()` - `ppc_error_hist()` - `ppc_error_hist_grouped()` - `ppc_error_scatter()` - `ppc_error_binned()` * New plotting function `ppc_km_overlay_grouped()`, the grouped variant of `ppc_km_overlay()`. (#260, @fweber144) * `ppc_scatter()`, `ppc_scatter_avg()`, and `ppc_scatter_avg_grouped()` gain an argument `ref_line`, which can be set to `FALSE` to turn off the `x=y` line drawn behind the scatterplot. * `ppc_ribbon()` and `ppc_ribbon_grouped()` gain argument `y_draw` that specifies whether the observed y should be plotted using a point, line, or both. (#257, @charlesm93) * `mcmc_*()` functions now support all draws formats from the **posterior** package. (#277, @Ozan147) * `mcmc_dens()` and `mcmc_dens_overlay()` gain arguments for controlling the the density calculation. (#258) * `mcmc_hist()` and `mcmc_dens()` gain argument `alpha` for controlling transparency. (#244) * `mcmc_areas()` and `mcmc_areas_ridges()` gain an argument `border_size` for controlling the thickness of the ridgelines. (#224) # bayesplot 1.8.1 * Fix R cmd check error on linux for CRAN # bayesplot 1.8.0 ### Bug fixes * `mcmc_areas()` tries to use less vertical blank space. (#218, #230) * Fix bug in `color_scheme_view()` minimal theme (#213). * Fix error in `mcmc_acf()` for certain input types. (#244, #245, @hhau) ### New features * New plotting functions `ppc_dens_overlay_grouped()` and `ppc_ecdf_overlay_grouped()` for plotting density and cumulative distributions of the posterior predictive distribution (versus observed data) by group. (#212) * New plotting function `ppc_km_overlay()` for outcome variables that are right-censored. Empirical CCDF estimates of `yrep` are compared with the Kaplan-Meier estimate of `y`. (#233, #234, @fweber144) * `ppc_loo_pit_overlay()` now uses a boundary correction for an improved kernel density estimation. The new argument `boundary_correction` defaults to TRUE but can be set to FALSE to recover the old version of the plot. (#171, #235, @ecoronado92) * CmdStanMCMC objects (from CmdStanR) can now be used with extractor functions `nuts_params()`, `log_posterior()`, `rhat()`, and `neff_ratio()`. (#227) * On the y axis, `ppc_loo_pit_qq(..., compare = "normal")` now plots standard normal quantiles calculated from the PIT values (instead of the standardized PIT values). (#240, #243, @fweber144) * `mcmc_rank_overlay()` gains argument `facet_args`. (#221, @hhau) * For `mcmc_intervals()` the size` of the points and interval lines can be set with `mcmc_intervals(..., outer_size, inner_size, point_size)`. (#215, #228, #229) # bayesplot 1.7.2 Compatibility with dplyr 1.0.0 (#219) # bayesplot 1.7.1 Release requested by CRAN to fix errors at https://cran.r-project.org/web/checks/check_results_bayesplot.html due to matrices also inheriting from "array" in R 4.0. # bayesplot 1.7.0 (GitHub issue/PR numbers in parentheses) * The `pars` argument of all MCMC plotting functions now supports tidy variable selection. See `help("tidy-params", package="bayesplot")` for details and examples. (#161, #183, #188) * Two new plots have been added for inspecting the distribution of ranks. Rank histograms were introduced by the Stan team's [new paper on MCMC diagnostics](https://arxiv.org/abs/1903.08008). (#178, #179) `mcmc_rank_hist()`: A traditional traceplot (`mcmc_trace()`) visualizes how sampled values the MCMC chains mix over the course of sampling. A rank histogram (`mcmc_rank_hist()`) visualizes how the *ranks* of values from the chains mix together. An ideal plot would show the ranks mixing or overlapping in a uniform distribution. `mcmc_rank_overlay()`: Instead of drawing each chain's histogram in a separate panel, this plot draws the top edge of the chains' histograms in a single panel. * Added `mcmc_trace_data()`, which returns the data used for plotting the trace plots and rank histograms. (Advances #97) * [ColorBrewer](https://colorbrewer2.org/) palettes are now available as color schemes via [`color_scheme_set()`](https://mc-stan.org/bayesplot/reference/bayesplot-colors.html). For example, `color_scheme_set("brewer-Spectral")` will use the Spectral palette. (#177, #190) * MCMC plots now also accept objects with an `as.array` method as input (e.g., stanfit objects). (#175, #184) * [`mcmc_trace()`](https://mc-stan.org/bayesplot/reference/MCMC-traces.html) gains an argument `iter1` which can be used to label the traceplot starting from the first iteration after warmup. (#14, #155, @mcol) * [`mcmc_areas()`](https://mc-stan.org/bayesplot/reference/MCMC-intervals.html) gains an argument `area_method` which controls how to draw the density curves. The default `"equal area"` constrains the heights so that the curves have the same area. As a result, a narrow interval will appear as a spike of density, while a wide, uncertain interval is spread thin over the _x_ axis. Alternatively `"equal height"` will set the maximum height on each curve to the same value. This works well when the intervals are about the same width. Otherwise, that wide, uncertain interval will dominate the visual space compared to a narrow, less uncertain interval. A compromise between the two is `"scaled height"` which scales the curves from `"equal height"` using `height * sqrt(height)`. (#163, #169) * `mcmc_areas()` correctly plots density curves where the point estimate does not include the highest point of the density curve. (#168, #169, @jtimonen) * `mcmc_areas_ridges()` draws the vertical line at *x* = 0 over the curves so that it is always visible. * `mcmc_intervals()` and `mcmc_areas()` raise a warning if `prob_outer` is ever less than `prob`. It sorts these two values into the correct order. (#138) * MCMC parameter names are now *always* converted to factors prior to plotting. We use factors so that the order of parameters in a plot matches the order of the parameters in the original MCMC data. This change fixes a case where factor-conversion failed. (#162, #165, @wwiecek) * The examples in [`?ppc_loo_pit_overlay()`](https://mc-stan.org/bayesplot/reference/PPC-loo.html) now work as expected. (#166, #167) * Added `"viridisD"` as an alternative name for `"viridis"` to the supported colors. * Added `"viridisE"` (the [cividis](https://github.com/marcosci/cividis) version of viridis) to the supported colors. * `ppc_bars()` and `ppc_bars_grouped()` now allow negative integers as input. (#172, @jeffpollock9) # bayesplot 1.6.0 (GitHub issue/PR numbers in parentheses) * Loading **bayesplot** no longer overrides the ggplot theme! Rather, it sets a theme specific for **bayesplot**. Some packages using **bayesplot** may still override the default **ggplot** theme (e.g., **rstanarm** does but only until next release), but simply loading **bayesplot** itself will not. There are new functions for controlling the ggplot theme for **bayesplot** that work like their **ggplot2** counterparts but only affect plots made using **bayesplot**. Thanks to Malcolm Barrett. (#117, #149). - `bayesplot_theme_set()` - `bayesplot_theme_get()` - `bayesplot_theme_update()` - `bayesplot_theme_replace()` * The [Visual MCMC Diagnostics vignette](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) has been reorganized and has a lot of useful new content thanks to Martin Modrák. (#144, #153) * The [LOO predictive checks](https://mc-stan.org/bayesplot/reference/PPC-loo.html) now require **loo** version `>= 2.0.0`. (#139) * Histogram plots gain a `breaks` argument that can be used as an alternative to `binwidth`. (#148) * [`mcmc_pairs()`](https://mc-stan.org/bayesplot/reference/MCMC-scatterplots.html) now has an argument `grid_args` to provide a way of passing optional arguments to `gridExtra::arrangeGrob()`. This can be used to add a title to the plot, for example. (#143) * [`ppc_ecdf_overlay()`](https://mc-stan.org/bayesplot/reference/PPC-distributions.html) gains an argument `discrete`, which is `FALSE` by default, but can be used to make the Geom more appropriate for discrete data. (#145) * [PPC intervals plots](https://mc-stan.org/bayesplot/reference/PPC-intervals.html) and [LOO predictive checks](https://mc-stan.org/bayesplot/reference/PPC-loo.html) now draw both an outer and an inner probability interval, which can be controlled through the new argument `prob_outer` and the already existing `prob`. This is consistent with what is produced by `mcmc_intervals()`. (#152, #154, @mcol) # bayesplot 1.5.0 (GitHub issue/PR numbers in parentheses) * New package documentation website: * Two new plots that visualize posterior density using [ridgelines][ggridges]. These work well when parameters have similar values and similar densities, as in hierarchical models. (#104) - `mcmc_dens_chains()` draws the kernel density of each sampling chain. - `mcmc_areas_ridges()` draws the kernel density combined across chains. - Both functions have a `_data()` function to return the data plotted by each function. * `mcmc_intervals()` and `mcmc_areas()` have been rewritten. (#103) - They now use a discrete *y*-axis. Previously, they used a continuous scale with numeric breaks relabelled with parameter names; this design caused some unexpected behavior when customizing these plots. - `mcmc_areas()` now uses geoms from the ggridges package to draw density curves. * Added `mcmc_intervals_data()` and `mcmc_areas_data()` that return data plotted by `mcmc_intervals()` and `mcmc_areas()`. (Advances #97) * New `ppc_data()` function returns the data plotted by many of the PPC plotting functions. (Advances #97) * Added `ppc_loo_pit_overlay()` function for a better LOO PIT predictive check. (#123) * Started using **vdiffr** to add visual unit tests to the existing PPC unit tests. (#137) # bayesplot 1.4.0 (GitHub issue/PR numbers in parentheses) * New plotting function `mcmc_parcoord()` for parallel coordinates plots of MCMC draws (optionally including HMC/NUTS diagnostic information). (#108) * `mcmc_scatter` gains an `np` argument for specifying NUTS parameters, which allows highlighting divergences in the plot. (#112) * New functions with names ending with suffix `_data` don't make the plots, they just return the data prepared for plotting (more of these to come in future releases): - `ppc_intervals_data()` (#101) - `ppc_ribbon_data()` (#101) - `mcmc_parcoord_data()` (#108) - `mcmc_rhat_data()` (#110) - `mcmc_neff_data()` (#110) * `ppc_stat_grouped()`, `ppc_stat_freqpoly_grouped()` gain a `facet_args` argument for controlling **ggplot2** faceting (many of the `mcmc_` functions already have this). * The `divergences` argument to `mcmc_trace()` has been deprecated in favor of `np` (NUTS parameters) to match the other functions that have an `np` argument. * Fixed an issue where duplicated rhat values would break `mcmc_rhat()` (#105). # bayesplot 1.3.0 (GitHub issue/PR numbers in parentheses) * `bayesplot::theme_default()` is now set as the default ggplot2 plotting theme when **bayesplot** is loaded, which makes changing the default theme using `ggplot2::theme_set()` possible. Thanks to @gavinsimpson. (#87) * `mcmc_hist()` and `mcmc_hist_by_chain()` now take a `freq` argument that defaults to `TRUE` (behavior is like `freq` argument to R's `hist` function). * Using a `ts` object for `y` in PPC plots no longer results in an error. Thanks to @helske. (#94) * `mcmc_intervals()` doesn't use round lineends anymore as they slightly exaggerate the width of the intervals. Thanks to @tjmahr. (#96) # bayesplot 1.2.0 A lot of new stuff in this release. (GitHub issue/PR numbers in parentheses) ## Fixes * Avoid error in some cases when `divergences` is specified in call to `mcmc_trace()` but there are not actually any divergent transitions. * The `merge_chains` argument to `mcmc_nuts_energy()` now defaults to `FALSE`. ## New features in existing functions * For `mcmc_*()` functions, transformations are recycled if `transformations` argument is specified as a single function rather than a named list. Thanks to @tklebel. (#64) * For `ppc_violin_grouped()` there is now the option of showing `y` as a violin, points, or both. Thanks to @silberzwiebel. (#74) * `color_scheme_get()` now has an optional argument `i` for selecting only a subset of the colors. * New color schemes: darkgray, orange, viridis, viridisA, viridisB, viridisC. The viridis schemes are better than the other schemes for trace plots (the colors are very distinct from each other). ## New functions * `mcmc_pairs()`, which is essentially a ggplot2+grid implementation of rstan's `pairs.stanfit()` method. (#67) * `mcmc_hex()`, which is similar to `mcmc_scatter()` but using `geom_hex()` instead of `geom_point()`. This can be used to avoid overplotting. (#67) * `overlay_function()` convenience function. Example usage: add a Gaussian (or any distribution) density curve to a plot made with `mcmc_hist()`. * `mcmc_recover_scatter()` and `mcmc_recover_hist()`, which are similar to `mcmc_recover_intervals()` and compare estimates to "true" values used to simulate data. (#81, #83) * New PPC category **Discrete** with functions: - `ppc_rootogram()` for use with models for count data. Thanks to @paul-buerkner. (#28) - `ppc_bars()`, `ppc_bars_grouped()` for use with models for ordinal, categorical and multinomial data. Thanks to @silberzwiebel. (#73) * New PPC category **LOO** (thanks to suggestions from @avehtari) with functions: - `ppc_loo_pit()` for assessing the calibration of marginal predictions. (#72) - `ppc_loo_intervals()`, `ppc_loo_ribbon()` for plotting intervals of the LOO predictive distribution. (#72) # bayesplot 1.1.0 (GitHub issue/PR numbers in parentheses) ## Fixes * Images in vignettes should now render properly using `png` device. Thanks to TJ Mahr. (#51) * `xaxis_title(FALSE)` and `yaxis_title(FALSE)` now set axis titles to `NULL` rather than changing theme elements to `element_blank()`. This makes it easier to add axis titles to plots that don’t have them by default. Thanks to Bill Harris. (#53) ## New features in existing functions * Add argument `divergences` to `mcmc_trace()` function. For models fit using HMC/NUTS this can be used to display divergences as a rug at the bottom of the trace plot. (#42) * The `stat` argument for all `ppc_stat_*()` functions now accepts a function instead of only the name of a function. (#31) ## New functions * `ppc_error_hist_grouped()` for plotting predictive errors by level of a grouping variable. (#40) * `mcmc_recover_intervals)(` for comparing MCMC estimates to "true" parameter values used to simulate the data. (#56) * `bayesplot_grid()` for juxtaposing plots and enforcing shared axis limits. (#59) # bayesplot 1.0.0 Initial CRAN release [ggridges]: https://CRAN.R-project.org/package=ggridges "ggridges package" bayesplot/MD50000644000176200001440000001704714563320543012602 0ustar liggesusers2034f869f109067bca590a771e464a19 *DESCRIPTION 6f42fa21ae19ab73ffcd04d6af30a7fa *NAMESPACE 0a121c326c4853ea17d0c3edcccbeb79 *NEWS.md 90da8fc8f7b583b12d57ab6ab49c9ba6 *R/available-module-functions.R 137886fcefa034d4f591ca49049089dc *R/bayesplot-colors.R 6e087c38b6633b69333a9eb469bb322d *R/bayesplot-extractors.R c8d28590d974475e60dfb61b039beb94 *R/bayesplot-ggplot-themes.R 19cdd6cb93c29a6d0b96adfebceda242 *R/bayesplot-helpers.R 3088093a6b57faa13604653cd2e33b9f *R/bayesplot-package.R 6ee02f0ca7bf3457031298b3d8d93331 *R/bayesplot_grid.R 6bcdea221e46f2306ffc2308b436acc8 *R/example-data.R efa383d7f4c8c7fc705bb8c1ce7e62ed *R/helpers-gg.R 8b954d0dce42d53af3cd06e03a2ab278 *R/helpers-mcmc.R 5d321e6c385d0d299e76d9dc821e9187 *R/helpers-ppc.R 23f9e411a79cb2c30900d33007b2c047 *R/helpers-shared.R 499bc1e007b15686d0aaf92f63300dff *R/helpers-testthat.R b2bc8848b8b0ddf52889f0d7aae43c6e *R/mcmc-combo.R 1b783d5ae3ceccabe990e7756f718612 *R/mcmc-diagnostics-nuts.R bbf339c6a3526675fe62511f31521291 *R/mcmc-diagnostics.R 427a6bc60a3b7efdd702b93ddab5bcfb *R/mcmc-distributions.R cb585c9af45b1c0b3f2db803da25375d *R/mcmc-intervals.R 47c529b1d86299346091cc1f9b6eda46 *R/mcmc-overview.R 71b4344b241cffc0fb671ec7a7df998b *R/mcmc-parcoord.R 3c2d25e2bfcc082727a8adff85662172 *R/mcmc-recover.R 729261afc728aec69155b8a5b616a278 *R/mcmc-scatterplots.R 56b4a8578c21f21bc748eda2b64bcca2 *R/mcmc-traces.R b876b4737232996e5e8243e9dc5756a2 *R/pp_check.R 6dddf00096db85d7e95679927cebea72 *R/ppc-censoring.R 17dd9ad47731aa54236bbe84449fa665 *R/ppc-discrete.R 9d25569a33361cf2c6fc5cc62b96c485 *R/ppc-distributions.R 8f9e22325535de0a450ae6d522b65ae1 *R/ppc-errors.R 585486b4ae6d8a3af927d36e163de936 *R/ppc-intervals.R cc15786eac79a8559d9b8069c4888d40 *R/ppc-loo.R a37acb6d34c7a846a2da9034bc243efa *R/ppc-overview.R 1ef3c8e6abfee91d23639edbe69d5895 *R/ppc-scatterplots.R 8327e48b0876289bddd0489c8dde9dea *R/ppc-test-statistics.R f10b04cc47b086316f3f8587af81f3dc *R/ppd-distributions.R 72c65bb48a33c84a88c62c541527c9d6 *R/ppd-intervals.R 472fc3256734663a137e30e6021a0fdf *R/ppd-overview.R 539607297c746a5939cb91ff089d025b *R/ppd-test-statistics.R fc4cda0d31c903aadaeba4d487694496 *R/sysdata.rda 460a30f9f712101cfe93721845b650d7 *R/tidy-params.R 1044651df071e8b9d71568dd3597f7ad *R/zzz.R f849014020d5b2ab4dbf5703b440c05d *build/vignette.rds 9e6d152f3d8a2abccbae64c3895def95 *inst/CITATION 5f0cc4c76428bbc7bd0324c1f3a294a1 *inst/doc/graphical-ppcs.R df950c456c457be19258b064464b6aa5 *inst/doc/graphical-ppcs.Rmd 3742841ce1cdac07b8966c9da628f178 *inst/doc/graphical-ppcs.html 20756615ddcc36c7e384ce729387dbb6 *inst/doc/plotting-mcmc-draws.R db5e3fb13cb998d40045bea97a3bbc17 *inst/doc/plotting-mcmc-draws.Rmd dc4d889dc5743179d827cd7df71dd972 *inst/doc/plotting-mcmc-draws.html cc840186713ca634836b3f5d5ec5c9b3 *inst/doc/visual-mcmc-diagnostics.R 3e539e648fa798009c7cd437f23e487c *inst/doc/visual-mcmc-diagnostics.Rmd 3ad2736e500ff22e1da949165bc22fa7 *inst/doc/visual-mcmc-diagnostics.html 7f22939057bbe3d14f7f80adbff07791 *man/MCMC-combos.Rd 3f17671ece40b1c67432bd35877c9b6e *man/MCMC-diagnostics.Rd 3d368d350fbc98d22d5635839727df01 *man/MCMC-distributions.Rd a665eed088a505fc6bf4266077e9c46a *man/MCMC-intervals.Rd 12b3e16d29af23a95e7537f523ef5d48 *man/MCMC-nuts.Rd 8889c184927cc8f0607aa639723af7fe *man/MCMC-overview.Rd 8db7bd71196761df264cb1c2105e72d0 *man/MCMC-parcoord.Rd 8dd9982293f1587de7b410e3fc749799 *man/MCMC-recover.Rd a52b134735218f36bceff2d773d7fa24 *man/MCMC-scatterplots.Rd 61db53c35c9d28167cc33e74157a2eb4 *man/MCMC-traces.Rd a36523ec3123935a317e13c5b2df668d *man/PPC-censoring.Rd c7c93463e36fab5b59afca9c2ef30d0d *man/PPC-discrete.Rd 888e61584f1a06dc603440263ab2a9b0 *man/PPC-distributions.Rd 778e53da3b0a488bdbd4bade84f2d356 *man/PPC-errors.Rd 890ff889a4c3b9d4dd0ab20d6b16063f *man/PPC-intervals.Rd 3ebb7bc56bb880d8523bab6c29f193bc *man/PPC-loo.Rd ad8c805a2739433b037ea142d57cb2a3 *man/PPC-overview.Rd 6ea9241e570b2fb5968f7508397420c5 *man/PPC-scatterplots.Rd 97d974f37d925fa3531bd1c80d341b2a *man/PPC-test-statistics.Rd 8ab5c7e2b58bc5c31d53b72ef4124066 *man/PPD-distributions.Rd 18a988e93a28a17400caa994204c4fce *man/PPD-intervals.Rd 5db4ec0e52b2716ac7799f834b2ee8c3 *man/PPD-overview.Rd fb83b5b9c7ea7a4564e02fb64c0b004e *man/PPD-test-statistics.Rd 6612819103cf767df157f00b6e59b592 *man/available_ppc.Rd 1b7cadc1126fd56c34270f16c8e7070c *man/bayesplot-colors.Rd 3cc4d84eff97612e071ac39d2982691a *man/bayesplot-extractors.Rd c3e17fcad6f842a1c29b905220b56a46 *man/bayesplot-helpers.Rd 6208f784d6f7d26ae8a53fd7ef78f7ae *man/bayesplot-package.Rd b16d02354d4225e880b0cc38ff88a447 *man/bayesplot_grid.Rd 5b52e9085a7a4da0bf1f6975d5a05d72 *man/bayesplot_theme_get.Rd 4b1caa90a5df53fcf0087d7e581ac868 *man/example-data.Rd 2086b1be7cc00327ba8349fc6feb32e0 *man/figures/bayesplot1.png ede90ece919edcd2d3551ea0f525dcb2 *man/figures/bayesplot2.png 965e05f4a784f6e9574bb8674a69ab41 *man/figures/bayesplot3.png d30b67d89b4ff08c286c624b9dac80ad *man/figures/logo.svg 5fad10a5cc62c59ea429a5ce90191e2e *man/figures/stanlogo.png 661aecf57d83d86a2031bd0978c9ce42 *man/pp_check.Rd 2913309c8af7f6f32aff9bc335865118 *man/reexports.Rd eb656910393b8e04b4e12ff7665daf86 *man/theme_default.Rd 16ffc47a81440c2297754191898ace87 *man/tidy-params.Rd 3b2232242539063d370a8482b4cee74b *tests/testthat.R 2efe9d564d3fec42e93ab7315234c711 *tests/testthat/data-for-binomial.rda 72662fa49bce06136bb0a87725666c7d *tests/testthat/data-for-mcmc-tests.R 559e08d0c13bb91b955cd83dfa12e202 *tests/testthat/data-for-ordinal.rda 71d2df18ba66f0c9d2c8ab4839d1d00b *tests/testthat/data-for-ppc-tests.R a05d33b0324bbb6eae04c8e12bf48098 *tests/testthat/test-aesthetics.R 351eed88343399d41a21b1dec7297c3e *tests/testthat/test-available_ppc.R 539196675d522cf98e8fc949c1775d3d *tests/testthat/test-bayesplot_grid.R a353118cdb074192c8233634af8c14a4 *tests/testthat/test-convenience-functions.R 841de6c0a8463eabcefd3c1507517a39 *tests/testthat/test-example-draws.R 30d571edee660dc71b6277e927a16caa *tests/testthat/test-extractors.R 214d978e102692929c5402091d35b7ae *tests/testthat/test-helpers-mcmc.R 572cc292bcbe11a0239a1d26627bcb15 *tests/testthat/test-helpers-ppc.R bd0f37291bd7486c440262910f7cbd53 *tests/testthat/test-helpers-shared.R f7f89b1fff23fb94b65f1f63b4cbca8e *tests/testthat/test-mcmc-combo.R a688dd192b0a16c0de0a3d8b10310869 *tests/testthat/test-mcmc-diagnostics.R aa4fdee999b167711fc528273a666be3 *tests/testthat/test-mcmc-distributions.R 6ef323cca078679fb7a8dd2c596605de *tests/testthat/test-mcmc-intervals.R 1773d657ad455b4d4cf4007d8d5f9f1b *tests/testthat/test-mcmc-nuts.R 8c32fd5f715554f54b93a390e4283064 *tests/testthat/test-mcmc-recover.R ae286e7956a548b1a10427cc5b6c8ec2 *tests/testthat/test-mcmc-scatter-and-parcoord.R 0d8adfd3e1896fcd11f8e8cb251d9c0d *tests/testthat/test-mcmc-traces.R 748a1d774ee0bf231bc37b074e0fd8d6 *tests/testthat/test-pp_check.R 7488462c3b3fe5d55ff76f73ce38e46e *tests/testthat/test-ppc-censoring.R ad65b31cf849e4661bf1a01c17bf6c10 *tests/testthat/test-ppc-discrete.R 73f7c6e436f3e936d58585e478782d27 *tests/testthat/test-ppc-distributions.R 22f2a0f77cc66d27779c2fd50aa570ed *tests/testthat/test-ppc-errors.R 8eb129bc06d46314949d0251c081c335 *tests/testthat/test-ppc-input-validation.R 67e88880d460df3f4f2fe5bdc534def4 *tests/testthat/test-ppc-intervals.R 8e68c71754d1d9ad4c161a19c7ea71c0 *tests/testthat/test-ppc-loo.R 9415084942eca4cf623bfcda1a64f9b8 *tests/testthat/test-ppc-scatterplots.R 1e3c495a034d325c372d32fbcf0be7c3 *tests/testthat/test-ppc-test-statistics.R 19681167bfe81308e45a534ed9beaf79 *vignettes/children/SETTINGS-knitr.txt df950c456c457be19258b064464b6aa5 *vignettes/graphical-ppcs.Rmd db5e3fb13cb998d40045bea97a3bbc17 *vignettes/plotting-mcmc-draws.Rmd 3e539e648fa798009c7cd437f23e487c *vignettes/visual-mcmc-diagnostics.Rmd bayesplot/inst/0000755000176200001440000000000014563223213013232 5ustar liggesusersbayesplot/inst/doc/0000755000176200001440000000000014563223213013777 5ustar liggesusersbayesplot/inst/doc/plotting-mcmc-draws.Rmd0000644000176200001440000003043414556465326020361 0ustar liggesusers--- title: "Plotting MCMC draws using the bayesplot package" author: "Jonah Gabry" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") vignette: > %\VignetteIndexEntry{Plotting MCMC draws} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("ggplot2") library("rstanarm") ``` ## Introduction This vignette focuses on plotting parameter estimates from MCMC draws. MCMC diagnostic plots are covered in the separate vignette [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html), and graphical posterior predictive model checking is covered in the vignette [_Graphical posterior predictive checks_](https://mc-stan.org/bayesplot/articles/graphical-ppcs.html). ### Setup In addition to __bayesplot__ we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstanarm__, for fitting the example models used throughout the vignette ```{r, eval=FALSE} library("bayesplot") library("ggplot2") library("rstanarm") ``` ### Example model The **bayesplot** package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) draws from the posterior distribution of the parameters of a Bayesian model. In this vignette we demonstrate a few of these functions. Example usage of the functions not demonstrated here can be found in the package documentation. For demonstration we will use draws obtained using the `stan_glm` function in the **rstanarm** package (Gabry and Goodrich, 2017), but MCMC draws from using any package can be used with the functions in the **bayesplot** package. See, for example, **brms**, which, like **rstanarm**, calls the **rstan** package internally to use [Stan](https://mc-stan.org/)'s MCMC sampler. ```{r mtcars} head(mtcars) # see help("mtcars") ``` ```{r, eval=FALSE} # linear regression model using stan_glm # using '~ .' to include all variables fit <- stan_glm(mpg ~ ., data = mtcars, seed = 1111) print(fit) ``` ```{r stan_glm, include=FALSE} fit <- stan_glm(mpg ~ ., data = mtcars, QR = TRUE, seed = 1111) ``` ```{r print-fit, echo=FALSE} print(fit) ``` To use the posterior draws with the functions in the **bayesplot** package we'll extract them from the fitted model object: ```{r get-draws} posterior <- as.array(fit) dim(posterior) dimnames(posterior) ``` We've used `as.array` above (as opposed to `as.matrix`) because it keeps the Markov chains separate (`stan_glm` runs four chains by default). Most of the plots don't actually need the chains to be separate, but for a few of the plots we make in this vignette we'll want to show the chains individually.
    ## Posterior uncertainty intervals For models fit using MCMC we can compute posterior uncertainty intervals (sometimes called "credible intervals") in various ways. **bayesplot** currently provides plots of central intervals based on quantiles, although additional options may be provided in future releases (e.g., HDIs, which can be useful in particular cases). **Documentation:** * `help("MCMC-intervals")` * [mc-stan.org/bayesplot/reference/MCMC-intervals](https://mc-stan.org/bayesplot/reference/MCMC-intervals.html) ------ #### mcmc_intervals, mcmc_areas Central posterior uncertainty intervals can be plotted using the `mcmc_intervals` function. ```{r mcmc_intervals} color_scheme_set("red") mcmc_intervals(posterior, pars = c("cyl", "drat", "am", "sigma")) ``` The default is to show 50% intervals (the thick segments) and 90% intervals (the thinner outer lines). These defaults can be changed using the `prob` and `prob_outer` arguments, respectively. The points in the above plot are posterior medians. The `point_est` argument can be used to select posterior means instead or to omit the point estimates. To show the uncertainty intervals as shaded areas under the estimated posterior density curves we can use the `mcmc_areas` function. ```{r mcmc_areas} mcmc_areas( posterior, pars = c("cyl", "drat", "am", "sigma"), prob = 0.8, # 80% intervals prob_outer = 0.99, # 99% point_est = "mean" ) ```
    ## Univariate marginal posterior distributions **bayesplot** provides functions for looking at histograms or kernel density estimates of marginal posterior distributions, either with all Markov chains combined or with the chains separate. **Documentation:** * `help("MCMC-distributions")` * [mc-stan.org/bayesplot/reference/MCMC-distributions](https://mc-stan.org/bayesplot/reference/MCMC-distributions.html) ------ #### mcmc_hist The `mcmc_hist` function plots marginal posterior distributions (combining all chains): ```{r mcmc_hist, message=FALSE} color_scheme_set("green") mcmc_hist(posterior, pars = c("wt", "sigma")) ``` If we want to plot `log(sigma)` rather than `sigma` we can either transform the draws in advance or use the `transformations` argument. ```{r mcmc_hist-transform, message=FALSE} color_scheme_set("blue") mcmc_hist(posterior, pars = c("wt", "sigma"), transformations = list("sigma" = "log")) ``` Most of the other functions for plotting MCMC draws also have a `transformations` argument. #### mcmc_hist_by_chain To view separate histograms of each of the four Markov chains we can use `mcmc_hist_by_chain`, which plots each chain in a separate facet in the plot. ```{r mcmc_hist_by_chain, message=FALSE} color_scheme_set("brightblue") mcmc_hist_by_chain(posterior, pars = c("wt", "sigma")) ``` #### mcmc_dens The `mcmc_dens` function is similar to `mcmc_hist` but plots kernel density estimates instead of histograms. ```{r mcmc_dens, message=FALSE} color_scheme_set("purple") mcmc_dens(posterior, pars = c("wt", "sigma")) ``` #### mcmc_dens_overlay Like `mcmc_hist_by_chain`, the `mcmc_dens_overlay` function separates the Markov chains. But instead of plotting each chain individually, the density estimates are overlaid. ```{r mcmc_dens_overlay, message=FALSE} mcmc_dens_overlay(posterior, pars = c("wt", "sigma")) ``` #### mcmc_violin The `mcmc_violin` function plots the density estimates of each chain as violins and draws horizontal line segments at user-specified quantiles. ```{r mcmc_violin} color_scheme_set("teal") mcmc_violin(posterior, pars = c("wt", "sigma"), probs = c(0.1, 0.5, 0.9)) ```
    ## Bivariate plots Various functions are available for plotting bivariate marginal posterior distributions. Some of these functions also take optional arguments for adding MCMC diagnostic information to the plots. That additional functionality is discussed in the separate [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette. **Documentation:** * `help("MCMC-scatterplots")` * [mc-stan.org/bayesplot/reference/MCMC-scatterplots](https://mc-stan.org/bayesplot/reference/MCMC-scatterplots.html) ------ #### mcmc_scatter The `mcmc_scatter` function creates a simple scatterplot of two parameters. ```{r mcmc_scatter} color_scheme_set("gray") mcmc_scatter(posterior, pars = c("(Intercept)", "wt"), size = 1.5, alpha = 0.5) ``` #### mcmc_hex The `mcmc_hex` function creates a similar plot but using hexagonal binning, which can be useful to avoid overplotting. ```{r mcmc_hex} # requires hexbin package if (requireNamespace("hexbin", quietly = TRUE)) { mcmc_hex(posterior, pars = c("(Intercept)", "wt")) } ``` #### mcmc_pairs In addition to `mcmc_scatter` and `mcmc_hex`, __bayesplot__ now provides an `mcmc_pairs` function for creating pairs plots with more than two parameters. ```{r mcmc_pairs, message=FALSE} color_scheme_set("pink") mcmc_pairs(posterior, pars = c("(Intercept)", "wt", "sigma"), off_diag_args = list(size = 1.5)) ``` The univariate marginal posteriors are shown along the diagonal as histograms, but this can be changed to densities by setting `diag_fun="dens"`. Bivariate plots are displayed above and below the diagonal as scatterplots, but it is also possible to use hex plots by setting `off_diag_fun="hex"`. By default, `mcmc_pairs` shows some of the Markov chains (half, if an even number of chains) above the diagonal and the others below. There are many more options for controlling how the draws should be split between the plots above and below the diagonal (see the documentation for the `condition` argument), but they are more useful when MCMC diagnostic information is included. This is discussed in the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette.
    ## Trace plots Trace plots are time series plots of Markov chains. In this vignette we show the standard trace plots that **bayesplot** can make. For models fit using any Stan interface (or Hamiltonian Monte Carlo in general), the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette provides an example of also adding information about divergences to trace plots. **Documentation:** * `help("MCMC-traces")` * [mc-stan.org/bayesplot/reference/MCMC-traces](https://mc-stan.org/bayesplot/reference/MCMC-traces.html) ------- #### mcmc_trace The `mcmc_trace` function creates standard trace plots: ```{r mcmc_trace} color_scheme_set("blue") mcmc_trace(posterior, pars = c("wt", "sigma")) ``` If it's hard to see the difference between the chains we can change to a mixed color scheme, for example: ```{r change-scheme} color_scheme_set("mix-blue-red") mcmc_trace(posterior, pars = c("wt", "sigma"), facet_args = list(ncol = 1, strip.position = "left")) ``` The code above also illustrates the use of the `facet_args` argument, which is a list of parameters passed to `facet_wrap` in __ggplot2__. Specifying `ncol=1` means the trace plots will be stacked in a single column rather than placed side by side, and `strip.position="left"` moves the facet labels to the y-axis (instead of above each facet). The [`"viridis"` color scheme](https://CRAN.R-project.org/package=viridis) is also useful for trace plots because it is comprised of very distinct colors: ```{r viridis-scheme, eval=FALSE} color_scheme_set("viridis") mcmc_trace(posterior, pars = "(Intercept)") ``` #### mcmc_trace_highlight The `mcmc_trace_highlight` function uses points instead of lines and reduces the opacity of all but a single chain (which is specified using the `highlight` argument). ```{r mcmc_trace_highlight} mcmc_trace_highlight(posterior, pars = "sigma", highlight = 3) ```
    ## References Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper))
    Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Stan Development Team. (2017). *Stan Modeling Language Users Guide and Reference Manual*. https://mc-stan.org/users/documentation/ bayesplot/inst/doc/graphical-ppcs.Rmd0000644000176200001440000003634314335264530017355 0ustar liggesusers--- title: "Graphical posterior predictive checks using the bayesplot package" author: "Jonah Gabry" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") vignette: > %\VignetteIndexEntry{Graphical posterior predictive checks} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("ggplot2") library("rstanarm") set.seed(840) ``` ## Introduction This vignette focuses on graphical posterior predictive checks (PPC). Plots of parameter estimates from MCMC draws are covered in the separate vignette [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html), and MCMC diagnostics are covered in the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette. ### Graphical posterior predictive checks (PPCs) The **bayesplot** package provides various plotting functions for _graphical posterior predictive checking_, that is, creating graphical displays comparing observed data to simulated data from the posterior predictive distribution ([Gabry et al, 2019](#gabry2019)). The idea behind posterior predictive checking is simple: if a model is a good fit then we should be able to use it to generate data that looks a lot like the data we observed. To generate the data used for posterior predictive checks (PPCs) we simulate from the _posterior predictive distribution_. This is the distribution of the outcome variable implied by a model after using the observed data $y$ (a vector of $N$ outcome values) to update our beliefs about unknown model parameters $\theta$. The posterior predictive distribution for observation $\widetilde{y}$ can be written as $$p(\widetilde{y} \,|\, y) = \int p(\widetilde{y} \,|\, \theta) \, p(\theta \,|\, y) \, d\theta.$$ Typically we will also condition on $X$ (a matrix of predictor variables). For each draw (simulation) $s = 1, \ldots, S$ of the parameters from the posterior distribution, $\theta^{(s)} \sim p(\theta \,|\, y)$, we draw an entire vector of $N$ outcomes $\widetilde{y}^{(s)}$ from the posterior predictive distribution by simulating from the data model conditional on parameters $\theta^{(s)}$. The result is an $S \times N$ matrix of draws $\widetilde{y}$. When simulating from the posterior predictive distribution we can use either the same values of the predictors $X$ that we used when fitting the model or new observations of those predictors. When we use the same values of $X$ we denote the resulting simulations by $y^{rep}$, as they can be thought of as replications of the outcome $y$ rather than predictions for future observations ($\widetilde{y}$ using predictors $\widetilde{X}$). This corresponds to the notation from Gelman et al. (2013) and is the notation used throughout the package documentation. Using the replicated datasets drawn from the posterior predictive distribution, the functions in the **bayesplot** package create various graphical displays comparing the observed data $y$ to the replications. The names of the **bayesplot** plotting functions for posterior predictive checking all have the prefix `ppc_`. ### Setup In addition to **bayesplot** we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstanarm__, for fitting the example models used throughout the vignette ```{r, eval=FALSE} library("bayesplot") library("ggplot2") library("rstanarm") ``` ### Example models To demonstrate some of the various PPCs that can be created with the **bayesplot** package we'll use an example of comparing Poisson and Negative binomial regression models from one of the **rstanarm** [package vignettes](https://mc-stan.org/rstanarm/articles/count.html) (Gabry and Goodrich, 2017). > We want to make inferences about the efficacy of a certain pest management system at reducing the number of roaches in urban apartments. [...] The regression predictors for the model are the pre-treatment number of roaches `roach1`, the treatment indicator `treatment`, and a variable `senior` indicating whether the apartment is in a building restricted to elderly residents. Because the number of days for which the roach traps were used is not the same for all apartments in the sample, we include it as an exposure [...]. First we fit a Poisson regression model with outcome variable `y` representing the roach count in each apartment at the end of the experiment. ```{r roaches-data} head(roaches) # see help("rstanarm-datasets") roaches$roach100 <- roaches$roach1 / 100 # pre-treatment number of roaches (in 100s) ``` ```{r roaches-model-pois, message=FALSE} # using rstanarm's default priors. For details see the section on default # weakly informative priors at https://mc-stan.org/rstanarm/articles/priors.html fit_poisson <- stan_glm( y ~ roach100 + treatment + senior, offset = log(exposure2), family = poisson(link = "log"), data = roaches, seed = 1111, refresh = 0 # suppresses all output as of v2.18.1 of rstan ) ``` ```{r print-pois} print(fit_poisson) ``` We'll also fit the negative binomial model that we'll compare to the Poisson: ```{r roaches-model-nb, message=FALSE} fit_nb <- update(fit_poisson, family = "neg_binomial_2") ``` ```{r print-nb} print(fit_nb) ``` ### Defining `y` and `yrep` In order to use the PPC functions from the **bayesplot** package we need a vector `y` of outcome values, ```{r y} y <- roaches$y ``` and a matrix `yrep` of draws from the posterior predictive distribution, ```{r yrep} yrep_poisson <- posterior_predict(fit_poisson, draws = 500) yrep_nb <- posterior_predict(fit_nb, draws = 500) dim(yrep_poisson) dim(yrep_nb) ``` Each row of the matrix is a draw from the posterior predictive distribution, i.e. a vector with one element for each of the data points in `y`. Since we fit the models using __rstanarm__ we used its special `posterior_predict` function, but if we were using a model fit with the __rstan__ package we could create `yrep` in the `generated quantities` block of the Stan program or by doing simulations in R after fitting the model. Draws from the posterior predictive distribution can be used with **bayesplot** regardless of whether or not the model was fit using an interface to Stan. **bayesplot** just requires a `yrep` matrix that has `number_of_draws` rows and `number_of_observations` columns.
    ## Histograms and density estimates #### ppc_dens_overlay The first PPC we'll look at is a comparison of the distribution of `y` and the distributions of some of the simulated datasets (rows) in the `yrep` matrix. ```{r ppc_dens_overlay} color_scheme_set("brightblue") ppc_dens_overlay(y, yrep_poisson[1:50, ]) ``` In the plot above, the dark line is the distribution of the observed outcomes `y` and each of the 50 lighter lines is the kernel density estimate of one of the replications of `y` from the posterior predictive distribution (i.e., one of the rows in `yrep`). This plot makes it easy to see that this model fails to account for the large proportion of zeros in `y`. That is, the model predicts fewer zeros than were actually observed. To see the discrepancy at the lower values of more clearly we can use the `xlim` function from **ggplot2** to restrict the range of the x-axis: ```{r ppc_dens_overlay-2, message=FALSE, warning=FALSE} ppc_dens_overlay(y, yrep_poisson[1:50, ]) + xlim(0, 150) ``` See Figure 6 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_dens_overlay`. #### ppc_hist We could see the same thing from a different perspective by looking at separate histograms of `y` and some of the `yrep` datasets using the `ppc_hist` function: ```{r ppc_hist, message=FALSE} ppc_hist(y, yrep_poisson[1:5, ]) ``` The same plot for the negative binomial model looks much different: ```{r ppc_hist-nb, message=FALSE} ppc_hist(y, yrep_nb[1:5, ]) ``` The negative binomial model does better handling the number of zeros in the data, but it occasionally predicts values that are way too large, which is why the x-axes extend to such high values in the plot and make it difficult to read. To see the predictions for the smaller values more clearly we can zoom in: ```{r ppc_hist-nb-2, message=FALSE} ppc_hist(y, yrep_nb[1:5, ], binwidth = 20) + coord_cartesian(xlim = c(-1, 300)) ```
    ## Distributions of test statistics Another way to see that the Poisson model predicts too few zeros is to look at the distribution of the proportion of zeros over the replicated datasets from the posterior predictive distribution in `yrep` and compare to the proportion of observed zeros in `y`. #### ppc_stat First we define a function that takes a vector as input and returns the proportion of zeros: ```{r prop_zero} prop_zero <- function(x) mean(x == 0) prop_zero(y) # check proportion of zeros in y ``` The `stat` argument to `ppc_stat` accepts a function or the name of a function for computing a test statistic from a vector of data. In our case we can specify `stat = "prop_zero"` since we've already defined the `prop_zero` function, but we also could have used `stat = function(x) mean(x == 0)`. ```{r ppc_stat, message=FALSE} ppc_stat(y, yrep_poisson, stat = "prop_zero", binwidth = 0.005) ``` The dark line is at the value $T(y)$, i.e. the value of the test statistic computed from the observed $y$, in this case `prop_zero(y)`. The lighter area on the left is actually a histogram of the proportion of zeros in in the `yrep` simulations, but it can be hard to see because almost none of the simulated datasets in `yrep` have any zeros. Here's the same plot for the negative binomial model: ```{r ppc_stat-nb, message=FALSE} ppc_stat(y, yrep_nb, stat = "prop_zero") ``` Again we see that the negative binomial model does a much better job predicting the proportion of observed zeros than the Poisson. However, if we look instead at the distribution of the maximum value in the replications, we can see that the Poisson model makes more realistic predictions than the negative binomial: ```{r ppc_stat-max, message=FALSE} ppc_stat(y, yrep_poisson, stat = "max") ppc_stat(y, yrep_nb, stat = "max") ppc_stat(y, yrep_nb, stat = "max", binwidth = 100) + coord_cartesian(xlim = c(-1, 5000)) ``` See Figure 7 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_stat`.
    ## Other PPCs and PPCs by group There are many additional PPCs available, including plots of predictive intervals, distributions of predictive errors, and more. For links to the documentation for all of the various PPC plots see `help("PPC-overview")` from R or the [online documentation](https://mc-stan.org/bayesplot/reference/index.html#section-ppc) on the Stan website. The `available_ppc` function can also be used to list the names of all PPC plotting functions: ```{r available_ppc} available_ppc() ``` Many of the available PPCs can also be carried out within levels of a grouping variable. Any function for PPCs by group will have a name ending in `_grouped` and will accept an additional argument `group`. The full list of currently available `_grouped` functions is: ```{r available_ppc-grouped} available_ppc(pattern = "_grouped") ``` #### ppc_stat_grouped For example, `ppc_stat_grouped` is the same as `ppc_stat` except that the test statistic is computed within levels of the grouping variable and a separate plot is made for each level: ```{r ppc_stat_grouped, message=FALSE} ppc_stat_grouped(y, yrep_nb, group = roaches$treatment, stat = "prop_zero") ``` See Figure 8 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_stat_grouped`.
    ## Providing an interface to bayesplot PPCs from another package The **bayesplot** package provides the S3 generic function `pp_check`. Authors of R packages for Bayesian inference are encouraged to define methods for the fitted model objects created by their packages. This will hopefully be convenient for both users and developers and contribute to the use of the same naming conventions across many of the R packages for Bayesian data analysis. To provide an interface to **bayesplot** from your package, you can very easily define a `pp_check` method (or multiple `pp_check` methods) for the fitted model objects created by your package. All a `pp_check` method needs to do is provide the `y` vector and `yrep` matrix arguments to the various plotting functions included in **bayesplot**. ### Defining a `pp_check` method Here is an example for how to define a simple `pp_check` method in a package that creates fitted model objects of class `"foo"`. We will define a method `pp_check.foo` that extracts the data `y` and the draws from the posterior predictive distribution `yrep` from an object of class `"foo"` and then calls one of the plotting functions from **bayesplot**. Suppose that objects of class `"foo"` are lists with named components, two of which are `y` and `yrep`. Here's a simple method `pp_check.foo` that offers the user the option of two different plots: ```{r pp_check.foo} # @param object An object of class "foo". # @param type The type of plot. # @param ... Optional arguments passed on to the bayesplot plotting function. pp_check.foo <- function(object, type = c("multiple", "overlaid"), ...) { type <- match.arg(type) y <- object[["y"]] yrep <- object[["yrep"]] stopifnot(nrow(yrep) >= 50) samp <- sample(nrow(yrep), size = ifelse(type == "overlaid", 50, 5)) yrep <- yrep[samp, ] if (type == "overlaid") { ppc_dens_overlay(y, yrep, ...) } else { ppc_hist(y, yrep, ...) } } ``` To try out `pp_check.foo` we can just make a list with `y` and `yrep` components and give it class `foo`: ```{r foo-object} x <- list(y = rnorm(200), yrep = matrix(rnorm(1e5), nrow = 500, ncol = 200)) class(x) <- "foo" ``` ```{r pp_check-1, message=FALSE} color_scheme_set("purple") pp_check(x, type = "multiple", binwidth = 0.3) ``` ```{r pp_check-2} color_scheme_set("darkgray") pp_check(x, type = "overlaid") ``` ### Examples of `pp_check` methods in other packages Several packages currently use this approach to provide an interface to **bayesplot**'s graphical posterior predictive checks. See, for example, the `pp_check` methods in the [**rstanarm**](https://CRAN.R-project.org/package=rstanarm) and [**brms**](https://CRAN.R-project.org/package=brms) packages.
    ## References Buerkner, P. (2017). brms: Bayesian Regression Models using Stan. R package version 1.7.0. https://CRAN.R-project.org/package=brms Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper)) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Stan Development Team. _Stan Modeling Language Users Guide and Reference Manual_. https://mc-stan.org/users/documentation/ bayesplot/inst/doc/graphical-ppcs.R0000644000176200001440000001132214563223017017020 0ustar liggesusersparams <- list(EVAL = TRUE) ## ----SETTINGS-knitr, include=FALSE-------------------------------------------- stopifnot(require("knitr")) library("bayesplot") knitr::opts_chunk$set( dev = "png", dpi = 150, fig.asp = 0.618, fig.width = 5, out.width = "60%", fig.align = "center", comment = NA, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE ) ## ----pkgs, include=FALSE------------------------------------------------------ library("ggplot2") library("rstanarm") set.seed(840) ## ----eval=FALSE--------------------------------------------------------------- # library("bayesplot") # library("ggplot2") # library("rstanarm") ## ----roaches-data------------------------------------------------------------- head(roaches) # see help("rstanarm-datasets") roaches$roach100 <- roaches$roach1 / 100 # pre-treatment number of roaches (in 100s) ## ----roaches-model-pois, message=FALSE---------------------------------------- # using rstanarm's default priors. For details see the section on default # weakly informative priors at https://mc-stan.org/rstanarm/articles/priors.html fit_poisson <- stan_glm( y ~ roach100 + treatment + senior, offset = log(exposure2), family = poisson(link = "log"), data = roaches, seed = 1111, refresh = 0 # suppresses all output as of v2.18.1 of rstan ) ## ----print-pois--------------------------------------------------------------- print(fit_poisson) ## ----roaches-model-nb, message=FALSE------------------------------------------ fit_nb <- update(fit_poisson, family = "neg_binomial_2") ## ----print-nb----------------------------------------------------------------- print(fit_nb) ## ----y------------------------------------------------------------------------ y <- roaches$y ## ----yrep--------------------------------------------------------------------- yrep_poisson <- posterior_predict(fit_poisson, draws = 500) yrep_nb <- posterior_predict(fit_nb, draws = 500) dim(yrep_poisson) dim(yrep_nb) ## ----ppc_dens_overlay--------------------------------------------------------- color_scheme_set("brightblue") ppc_dens_overlay(y, yrep_poisson[1:50, ]) ## ----ppc_dens_overlay-2, message=FALSE, warning=FALSE------------------------- ppc_dens_overlay(y, yrep_poisson[1:50, ]) + xlim(0, 150) ## ----ppc_hist, message=FALSE-------------------------------------------------- ppc_hist(y, yrep_poisson[1:5, ]) ## ----ppc_hist-nb, message=FALSE----------------------------------------------- ppc_hist(y, yrep_nb[1:5, ]) ## ----ppc_hist-nb-2, message=FALSE--------------------------------------------- ppc_hist(y, yrep_nb[1:5, ], binwidth = 20) + coord_cartesian(xlim = c(-1, 300)) ## ----prop_zero---------------------------------------------------------------- prop_zero <- function(x) mean(x == 0) prop_zero(y) # check proportion of zeros in y ## ----ppc_stat, message=FALSE-------------------------------------------------- ppc_stat(y, yrep_poisson, stat = "prop_zero", binwidth = 0.005) ## ----ppc_stat-nb, message=FALSE----------------------------------------------- ppc_stat(y, yrep_nb, stat = "prop_zero") ## ----ppc_stat-max, message=FALSE---------------------------------------------- ppc_stat(y, yrep_poisson, stat = "max") ppc_stat(y, yrep_nb, stat = "max") ppc_stat(y, yrep_nb, stat = "max", binwidth = 100) + coord_cartesian(xlim = c(-1, 5000)) ## ----available_ppc------------------------------------------------------------ available_ppc() ## ----available_ppc-grouped---------------------------------------------------- available_ppc(pattern = "_grouped") ## ----ppc_stat_grouped, message=FALSE------------------------------------------ ppc_stat_grouped(y, yrep_nb, group = roaches$treatment, stat = "prop_zero") ## ----pp_check.foo------------------------------------------------------------- # @param object An object of class "foo". # @param type The type of plot. # @param ... Optional arguments passed on to the bayesplot plotting function. pp_check.foo <- function(object, type = c("multiple", "overlaid"), ...) { type <- match.arg(type) y <- object[["y"]] yrep <- object[["yrep"]] stopifnot(nrow(yrep) >= 50) samp <- sample(nrow(yrep), size = ifelse(type == "overlaid", 50, 5)) yrep <- yrep[samp, ] if (type == "overlaid") { ppc_dens_overlay(y, yrep, ...) } else { ppc_hist(y, yrep, ...) } } ## ----foo-object--------------------------------------------------------------- x <- list(y = rnorm(200), yrep = matrix(rnorm(1e5), nrow = 500, ncol = 200)) class(x) <- "foo" ## ----pp_check-1, message=FALSE------------------------------------------------ color_scheme_set("purple") pp_check(x, type = "multiple", binwidth = 0.3) ## ----pp_check-2--------------------------------------------------------------- color_scheme_set("darkgray") pp_check(x, type = "overlaid") bayesplot/inst/doc/plotting-mcmc-draws.html0000644000176200001440000526040014563223030020564 0ustar liggesusers Plotting MCMC draws using the bayesplot package

    Plotting MCMC draws using the bayesplot package

    Jonah Gabry

    2024-02-14

    Introduction

    This vignette focuses on plotting parameter estimates from MCMC draws. MCMC diagnostic plots are covered in the separate vignette Visual MCMC diagnostics, and graphical posterior predictive model checking is covered in the vignette Graphical posterior predictive checks.

    Setup

    In addition to bayesplot we’ll load the following packages:

    • ggplot2, in case we want to customize the ggplot objects created by bayesplot
    • rstanarm, for fitting the example models used throughout the vignette
    library("bayesplot")
    library("ggplot2")
    library("rstanarm")      

    Example model

    The bayesplot package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) draws from the posterior distribution of the parameters of a Bayesian model. In this vignette we demonstrate a few of these functions. Example usage of the functions not demonstrated here can be found in the package documentation.

    For demonstration we will use draws obtained using the stan_glm function in the rstanarm package (Gabry and Goodrich, 2017), but MCMC draws from using any package can be used with the functions in the bayesplot package. See, for example, brms, which, like rstanarm, calls the rstan package internally to use Stan’s MCMC sampler.

    head(mtcars) # see help("mtcars")
                       mpg cyl disp  hp drat    wt  qsec vs am gear carb
    Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
    # linear regression model using stan_glm
    # using '~ .' to include all variables
    fit <- stan_glm(mpg ~ ., data = mtcars, seed = 1111)
    print(fit)
    stan_glm
     family:       gaussian [identity]
     formula:      mpg ~ .
     observations: 32
     predictors:   11
    ------
                Median MAD_SD
    (Intercept) 12.0   19.3  
    cyl         -0.1    1.1  
    disp         0.0    0.0  
    hp           0.0    0.0  
    drat         0.8    1.6  
    wt          -3.7    1.9  
    qsec         0.8    0.8  
    vs           0.3    2.1  
    am           2.6    2.1  
    gear         0.6    1.5  
    carb        -0.2    0.9  
    
    Auxiliary parameter(s):
          Median MAD_SD
    sigma 2.7    0.4   
    
    ------
    * For help interpreting the printed output see ?print.stanreg
    * For info on the priors used see ?prior_summary.stanreg

    To use the posterior draws with the functions in the bayesplot package we’ll extract them from the fitted model object:

    posterior <- as.array(fit)
    dim(posterior)
    [1] 1000    4   12
    dimnames(posterior)
    $iterations
    NULL
    
    $chains
    [1] "chain:1" "chain:2" "chain:3" "chain:4"
    
    $parameters
     [1] "(Intercept)" "cyl"         "disp"        "hp"          "drat"       
     [6] "wt"          "qsec"        "vs"          "am"          "gear"       
    [11] "carb"        "sigma"      

    We’ve used as.array above (as opposed to as.matrix) because it keeps the Markov chains separate (stan_glm runs four chains by default). Most of the plots don’t actually need the chains to be separate, but for a few of the plots we make in this vignette we’ll want to show the chains individually.


    Posterior uncertainty intervals

    For models fit using MCMC we can compute posterior uncertainty intervals (sometimes called “credible intervals”) in various ways. bayesplot currently provides plots of central intervals based on quantiles, although additional options may be provided in future releases (e.g., HDIs, which can be useful in particular cases).

    Documentation:


    mcmc_intervals, mcmc_areas

    Central posterior uncertainty intervals can be plotted using the mcmc_intervals function.

    color_scheme_set("red")
    mcmc_intervals(posterior, pars = c("cyl", "drat", "am", "sigma"))

    The default is to show 50% intervals (the thick segments) and 90% intervals (the thinner outer lines). These defaults can be changed using the prob and prob_outer arguments, respectively. The points in the above plot are posterior medians. The point_est argument can be used to select posterior means instead or to omit the point estimates.

    To show the uncertainty intervals as shaded areas under the estimated posterior density curves we can use the mcmc_areas function.

    mcmc_areas(
      posterior, 
      pars = c("cyl", "drat", "am", "sigma"),
      prob = 0.8, # 80% intervals
      prob_outer = 0.99, # 99%
      point_est = "mean"
    )


    Univariate marginal posterior distributions

    bayesplot provides functions for looking at histograms or kernel density estimates of marginal posterior distributions, either with all Markov chains combined or with the chains separate.

    Documentation:


    mcmc_hist

    The mcmc_hist function plots marginal posterior distributions (combining all chains):

    color_scheme_set("green")
    mcmc_hist(posterior, pars = c("wt", "sigma"))

    If we want to plot log(sigma) rather than sigma we can either transform the draws in advance or use the transformations argument.

    color_scheme_set("blue")
    mcmc_hist(posterior, pars = c("wt", "sigma"),
              transformations = list("sigma" = "log"))

    Most of the other functions for plotting MCMC draws also have a transformations argument.

    mcmc_hist_by_chain

    To view separate histograms of each of the four Markov chains we can use mcmc_hist_by_chain, which plots each chain in a separate facet in the plot.

    color_scheme_set("brightblue")
    mcmc_hist_by_chain(posterior, pars = c("wt", "sigma"))

    mcmc_dens

    The mcmc_dens function is similar to mcmc_hist but plots kernel density estimates instead of histograms.

    color_scheme_set("purple")
    mcmc_dens(posterior, pars = c("wt", "sigma"))

    mcmc_dens_overlay

    Like mcmc_hist_by_chain, the mcmc_dens_overlay function separates the Markov chains. But instead of plotting each chain individually, the density estimates are overlaid.

    mcmc_dens_overlay(posterior, pars = c("wt", "sigma"))

    mcmc_violin

    The mcmc_violin function plots the density estimates of each chain as violins and draws horizontal line segments at user-specified quantiles.

    color_scheme_set("teal")
    mcmc_violin(posterior, pars = c("wt", "sigma"), probs = c(0.1, 0.5, 0.9))


    Bivariate plots

    Various functions are available for plotting bivariate marginal posterior distributions. Some of these functions also take optional arguments for adding MCMC diagnostic information to the plots. That additional functionality is discussed in the separate Visual MCMC diagnostics vignette.

    Documentation:


    mcmc_scatter

    The mcmc_scatter function creates a simple scatterplot of two parameters.

    color_scheme_set("gray")
    mcmc_scatter(posterior, pars = c("(Intercept)", "wt"), 
                 size = 1.5, alpha = 0.5)

    mcmc_hex

    The mcmc_hex function creates a similar plot but using hexagonal binning, which can be useful to avoid overplotting.

    # requires hexbin package
    if (requireNamespace("hexbin", quietly = TRUE)) {
      mcmc_hex(posterior, pars = c("(Intercept)", "wt"))
    }

    mcmc_pairs

    In addition to mcmc_scatter and mcmc_hex, bayesplot now provides an mcmc_pairs function for creating pairs plots with more than two parameters.

    color_scheme_set("pink")
    mcmc_pairs(posterior, pars = c("(Intercept)", "wt", "sigma"),
               off_diag_args = list(size = 1.5))

    The univariate marginal posteriors are shown along the diagonal as histograms, but this can be changed to densities by setting diag_fun="dens". Bivariate plots are displayed above and below the diagonal as scatterplots, but it is also possible to use hex plots by setting off_diag_fun="hex". By default, mcmc_pairs shows some of the Markov chains (half, if an even number of chains) above the diagonal and the others below. There are many more options for controlling how the draws should be split between the plots above and below the diagonal (see the documentation for the condition argument), but they are more useful when MCMC diagnostic information is included. This is discussed in the Visual MCMC diagnostics vignette.


    Trace plots

    Trace plots are time series plots of Markov chains. In this vignette we show the standard trace plots that bayesplot can make. For models fit using any Stan interface (or Hamiltonian Monte Carlo in general), the Visual MCMC diagnostics vignette provides an example of also adding information about divergences to trace plots.

    Documentation:


    mcmc_trace

    The mcmc_trace function creates standard trace plots:

    color_scheme_set("blue")
    mcmc_trace(posterior, pars = c("wt", "sigma"))

    If it’s hard to see the difference between the chains we can change to a mixed color scheme, for example:

    color_scheme_set("mix-blue-red")
    mcmc_trace(posterior, pars = c("wt", "sigma"), 
               facet_args = list(ncol = 1, strip.position = "left"))

    The code above also illustrates the use of the facet_args argument, which is a list of parameters passed to facet_wrap in ggplot2. Specifying ncol=1 means the trace plots will be stacked in a single column rather than placed side by side, and strip.position="left" moves the facet labels to the y-axis (instead of above each facet).

    The "viridis" color scheme is also useful for trace plots because it is comprised of very distinct colors:

    color_scheme_set("viridis")
    mcmc_trace(posterior, pars = "(Intercept)")

    mcmc_trace_highlight

    The mcmc_trace_highlight function uses points instead of lines and reduces the opacity of all but a single chain (which is specified using the highlight argument).

    mcmc_trace_highlight(posterior, pars = "sigma", highlight = 3)


    References

    Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm

    Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. J. R. Stat. Soc. A, 182: 389-402. :10.1111/rssa.12378. (journal version, arXiv preprint, code on GitHub)

    Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). Bayesian Data Analysis. Chapman & Hall/CRC Press, London, third edition.

    Stan Development Team. (2017). Stan Modeling Language Users Guide and Reference Manual. https://mc-stan.org/users/documentation/

    bayesplot/inst/doc/plotting-mcmc-draws.R0000644000176200001440000001000014563223027020007 0ustar liggesusersparams <- list(EVAL = TRUE) ## ----SETTINGS-knitr, include=FALSE-------------------------------------------- stopifnot(require("knitr")) library("bayesplot") knitr::opts_chunk$set( dev = "png", dpi = 150, fig.asp = 0.618, fig.width = 5, out.width = "60%", fig.align = "center", comment = NA, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE ) ## ----pkgs, include=FALSE------------------------------------------------------ library("ggplot2") library("rstanarm") ## ----eval=FALSE--------------------------------------------------------------- # library("bayesplot") # library("ggplot2") # library("rstanarm") ## ----mtcars------------------------------------------------------------------- head(mtcars) # see help("mtcars") ## ----eval=FALSE--------------------------------------------------------------- # # linear regression model using stan_glm # # using '~ .' to include all variables # fit <- stan_glm(mpg ~ ., data = mtcars, seed = 1111) # print(fit) ## ----stan_glm, include=FALSE-------------------------------------------------- fit <- stan_glm(mpg ~ ., data = mtcars, QR = TRUE, seed = 1111) ## ----print-fit, echo=FALSE---------------------------------------------------- print(fit) ## ----get-draws---------------------------------------------------------------- posterior <- as.array(fit) dim(posterior) dimnames(posterior) ## ----mcmc_intervals----------------------------------------------------------- color_scheme_set("red") mcmc_intervals(posterior, pars = c("cyl", "drat", "am", "sigma")) ## ----mcmc_areas--------------------------------------------------------------- mcmc_areas( posterior, pars = c("cyl", "drat", "am", "sigma"), prob = 0.8, # 80% intervals prob_outer = 0.99, # 99% point_est = "mean" ) ## ----mcmc_hist, message=FALSE------------------------------------------------- color_scheme_set("green") mcmc_hist(posterior, pars = c("wt", "sigma")) ## ----mcmc_hist-transform, message=FALSE--------------------------------------- color_scheme_set("blue") mcmc_hist(posterior, pars = c("wt", "sigma"), transformations = list("sigma" = "log")) ## ----mcmc_hist_by_chain, message=FALSE---------------------------------------- color_scheme_set("brightblue") mcmc_hist_by_chain(posterior, pars = c("wt", "sigma")) ## ----mcmc_dens, message=FALSE------------------------------------------------- color_scheme_set("purple") mcmc_dens(posterior, pars = c("wt", "sigma")) ## ----mcmc_dens_overlay, message=FALSE----------------------------------------- mcmc_dens_overlay(posterior, pars = c("wt", "sigma")) ## ----mcmc_violin-------------------------------------------------------------- color_scheme_set("teal") mcmc_violin(posterior, pars = c("wt", "sigma"), probs = c(0.1, 0.5, 0.9)) ## ----mcmc_scatter------------------------------------------------------------- color_scheme_set("gray") mcmc_scatter(posterior, pars = c("(Intercept)", "wt"), size = 1.5, alpha = 0.5) ## ----mcmc_hex----------------------------------------------------------------- # requires hexbin package if (requireNamespace("hexbin", quietly = TRUE)) { mcmc_hex(posterior, pars = c("(Intercept)", "wt")) } ## ----mcmc_pairs, message=FALSE------------------------------------------------ color_scheme_set("pink") mcmc_pairs(posterior, pars = c("(Intercept)", "wt", "sigma"), off_diag_args = list(size = 1.5)) ## ----mcmc_trace--------------------------------------------------------------- color_scheme_set("blue") mcmc_trace(posterior, pars = c("wt", "sigma")) ## ----change-scheme------------------------------------------------------------ color_scheme_set("mix-blue-red") mcmc_trace(posterior, pars = c("wt", "sigma"), facet_args = list(ncol = 1, strip.position = "left")) ## ----viridis-scheme, eval=FALSE----------------------------------------------- # color_scheme_set("viridis") # mcmc_trace(posterior, pars = "(Intercept)") ## ----mcmc_trace_highlight----------------------------------------------------- mcmc_trace_highlight(posterior, pars = "sigma", highlight = 3) bayesplot/inst/doc/visual-mcmc-diagnostics.html0000644000176200001440000743250314563223213021430 0ustar liggesusers Visual MCMC diagnostics using the bayesplot package

    Visual MCMC diagnostics using the bayesplot package

    Jonah Gabry and Martin Modrák

    2024-02-14

    Introduction

    This vignette focuses on MCMC diagnostic plots, in particular on diagnosing divergent transitions and on the n_eff and Rhat statistics that help you determine that the chains have mixed well. Plots of parameter estimates from MCMC draws are covered in the separate vignette Plotting MCMC draws, and graphical posterior predictive model checking is covered in the Graphical posterior predictive checks vignette.

    Note that most of these plots can also be browsed interactively using the shinystan package.

    Setup

    In addition to bayesplot we’ll load the following packages:

    • ggplot2, in case we want to customize the ggplot objects created by bayesplot
    • rstan, for fitting the example models used throughout the vignette
    library("bayesplot")
    library("ggplot2")
    library("rstan")      

    Example model

    Before we delve into the actual plotting we need to fit a model to have something to work with. In this vignette we’ll use the eight schools example, which is discussed in many places, including Rubin (1981), Gelman et al. (2013), and the RStan Getting Started wiki. This is a simple hierarchical meta-analysis model with data consisting of point estimates y and standard errors sigma from analyses of test prep programs in J=8 schools. Ideally we would have the full data from each of the previous studies, but in this case we only have the these estimates.

    schools_dat <- list(
      J = 8, 
      y = c(28,  8, -3,  7, -1,  1, 18, 12),
      sigma = c(15, 10, 16, 11,  9, 11, 10, 18)
    )

    The model is: \[ \begin{align*} y_j &\sim {\rm Normal}(\theta_j, \sigma_j), \quad j = 1,\dots,J \\ \theta_j &\sim {\rm Normal}(\mu, \tau), \quad j = 1, \dots, J \\ \mu &\sim {\rm Normal}(0, 10) \\ \tau &\sim {\rm half-Cauchy}(0, 10), \end{align*} \] with the normal distribution parameterized by the mean and standard deviation, not the variance or precision. In Stan code:

    // Saved in 'schools_mod_cp.stan'
    data {
      int<lower=0> J;
      vector[J] y;
      vector<lower=0>[J] sigma;
    }
    parameters {
      real mu;
      real<lower=0> tau;
      vector[J] theta;
    }
    model {
      mu ~ normal(0, 10);
      tau ~ cauchy(0, 10);
      theta ~ normal(mu, tau);
      y ~ normal(theta, sigma);
    }

    This parameterization of the model is referred to as the centered parameterization (CP). We’ll also fit the same statistical model but using the so-called non-centered parameterization (NCP), which replaces the vector \(\theta\) with a vector \(\eta\) of a priori i.i.d. standard normal parameters and then constructs \(\theta\) deterministically from \(\eta\) by scaling by \(\tau\) and shifting by \(\mu\): \[ \begin{align*} \theta_j &= \mu + \tau \,\eta_j, \quad j = 1,\dots,J \\ \eta_j &\sim N(0,1), \quad j = 1,\dots,J. \end{align*} \] The Stan code for this model is:

    // Saved in 'schools_mod_ncp.stan'
    data {
      int<lower=0> J;
      vector[J] y;
      vector<lower=0>[J] sigma;
    }
    parameters {
      real mu;
      real<lower=0> tau;
      vector[J] eta;
    }
    transformed parameters {
      vector[J] theta;
      theta = mu + tau * eta;
    }
    model {
      mu ~ normal(0, 10);
      tau ~ cauchy(0, 10);
      eta ~ normal(0, 1); // implies theta ~ normal(mu, tau)
      y ~ normal(theta, sigma);
    }

    The centered and non-centered are two parameterizations of the same statistical model, but they have very different practical implications for MCMC. Using the bayesplot diagnostic plots, we’ll see that, for this data, the NCP is required in order to properly explore the posterior distribution.

    To fit both models we first translate the Stan code to C++ and compile it using the stan_model function.

    schools_mod_cp <- stan_model("schools_mod_cp.stan")
    schools_mod_ncp <- stan_model("schools_mod_ncp.stan")

    We then fit the model by calling Stan’s MCMC algorithm using the sampling function (the increased adapt_delta param is to make the sampler a bit more “careful” and avoid false positive divergences),

    fit_cp <- sampling(schools_mod_cp, data = schools_dat, seed = 803214055, control = list(adapt_delta = 0.9))
    Warning: There were 44 divergent transitions after warmup. See
    https://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup
    to find out why this is a problem and how to eliminate them.
    Warning: There were 1 chains where the estimated Bayesian Fraction of Missing Information was low. See
    https://mc-stan.org/misc/warnings.html#bfmi-low
    Warning: Examine the pairs() plot to diagnose sampling problems
    Warning: Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
    Running the chains for more iterations may help. See
    https://mc-stan.org/misc/warnings.html#bulk-ess
    Warning: Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
    Running the chains for more iterations may help. See
    https://mc-stan.org/misc/warnings.html#tail-ess
    fit_ncp <- sampling(schools_mod_ncp, data = schools_dat, seed = 457721433, control = list(adapt_delta = 0.9))

    and extract a iterations x chains x parameters array of posterior draws with as.array,

    # Extract posterior draws for later use
    posterior_cp <- as.array(fit_cp)
    posterior_ncp <- as.array(fit_ncp)

    You may have noticed the warnings about divergent transitions for the centered parameterization fit. Those are serious business and in most cases indicate that something is wrong with the model and the results should not be trusted. For an explanation of these warnings see Divergent transitions after warmup. We’ll have a look at diagnosing the source of the divergences first and then dive into some diagnostics that should be checked even if there are no warnings from the sampler.


    Diagnostics for the No-U-Turn Sampler

    The No-U-Turn Sampler (NUTS, Hoffman and Gelman, 2014) is the variant of Hamiltonian Monte Carlo (HMC) used by Stan and the various R packages that depend on Stan for fitting Bayesian models. The bayesplot package has special functions for visualizing some of the unique diagnostics permitted by HMC, and NUTS in particular. See Betancourt (2017), Betancourt and Girolami (2013), and Stan Development Team (2017) for more details on the concepts.

    Documentation:


    The special bayesplot functions for NUTS diagnostics are

    available_mcmc(pattern = "_nuts_")
    bayesplot MCMC module:
    (matching pattern '_nuts_') 
      mcmc_nuts_acceptance
      mcmc_nuts_divergence
      mcmc_nuts_energy
      mcmc_nuts_stepsize
      mcmc_nuts_treedepth

    Those functions require more information than simply the posterior draws, in particular the log of the posterior density for each draw and some NUTS-specific diagnostic values may be needed. The bayesplot package provides generic functions log_posterior and nuts_params for extracting this information from fitted model objects. Currently methods are provided for models fit using the rstan, rstanarm and brms packages, although it is not difficult to define additional methods for the objects returned by other R packages. For the Stan models we fit above we can use the log_posterior and nuts_params methods for stanfit objects:

    lp_cp <- log_posterior(fit_cp)
    head(lp_cp)
      Chain Iteration     Value
    1     1         1 -22.24092
    2     1         2 -19.47006
    3     1         3 -20.53399
    4     1         4 -24.14739
    5     1         5 -20.18378
    6     1         6 -16.20084
    np_cp <- nuts_params(fit_cp)
    head(np_cp)
      Chain Iteration     Parameter     Value
    1     1         1 accept_stat__ 0.8270966
    2     1         2 accept_stat__ 0.9643772
    3     1         3 accept_stat__ 0.9787898
    4     1         4 accept_stat__ 0.9956166
    5     1         5 accept_stat__ 0.9668557
    6     1         6 accept_stat__ 0.9912499
    # for the second model
    lp_ncp <- log_posterior(fit_ncp)
    np_ncp <- nuts_params(fit_ncp)

    In addition to the NUTS-specific plotting functions, some of the general MCMC plotting functions demonstrated in the Plotting MCMC draws vignette also take optional arguments that can be used to display important HMC/NUTS diagnostic information. We’ll see examples of this in the next section on divergent transitions.

    Divergent transitions

    When running the Stan models above, there were warnings about divergent transitions. Here we’ll look at diagnosing the source of divergences through visualizations.

    mcmc_parcoord

    The mcmc_parcoord plot shows one line per iteration, connecting the parameter values at this iteration. This lets you see global patterns in the divergences.

    This function works in general without including information about the divergences, but if the optional np argument is used to pass NUTS parameter information, then divergences will be colored in the plot (by default in red).

    color_scheme_set("darkgray")
    mcmc_parcoord(posterior_cp, np = np_cp)

    Here, you may notice that divergences in the centered parameterization happen exclusively when tau, the hierarchical standard deviation, goes near zero and the values of the thetas are essentially fixed. This makes tau immediately suspect. See Gabry et al. (2019) for another example of the parallel coordinates plot.

    mcmc_pairs

    The mcmc_pairs function can also be used to look at multiple parameters at once, but unlike mcmc_parcoord (which works well even when including several dozen parameters) mcmc_pairs is more useful for up to ~8 parameters. It shows univariate histograms and bivariate scatter plots for selected parameters and is especially useful in identifying collinearity between variables (which manifests as narrow bivariate plots) as well as the presence of multiplicative non-identifiabilities (banana-like shapes).

    Let’s look at how tau interacts with other variables, using only one of the thetas to keep the plot readable:

    mcmc_pairs(posterior_cp, np = np_cp, pars = c("mu","tau","theta[1]"),
               off_diag_args = list(size = 0.75))

    Note that each bivariate plot is present twice – by default each of those contain half of the chains, so you also get to see if the chains produced similar results (see the documentation for the condition argument for other options). Here, the interaction of tau and theta[1] seems most interesting, as it concentrates the divergences into a tight region.

    Further examples of pairs plots and instructions for using the various optional arguments to mcmc_pairs are provided via help("mcmc_pairs").

    mcmc_scatter

    Using the mcmc_scatter function (with optional argument np) we can look at a single bivariate plot to investigate it more closely. For hierarchical models, a good place to start is to plot a “local” parameter (theta[j]) against a “global” scale parameter on which it depends (tau).

    We will also use the transformations argument to look at the log of tau, as this is what Stan is doing under the hood for parameters like tau that have a lower bound of zero. That is, even though the draws for tau returned from Stan are all positive, the parameter space that the Markov chains actual explore is unconstrained. Transforming tau is not strictly necessary for the plot (often the plot is still useful without it) but plotting in the unconstrained is often even more informative.

    First the plot for the centered parameterization:

    # assign to an object so we can reuse later
    scatter_theta_cp <- mcmc_scatter(
      posterior_cp, 
      pars = c("theta[1]", "tau"), 
      transform = list(tau = "log"), # can abbrev. 'transformations'
      np = np_cp, 
      size = 1
    )
    scatter_theta_cp

    The shape of this bivariate distribution resembles a funnel (or tornado). This one in particular is essentially the same as an example referred to as Neal’s funnel (details in the Stan manual) and it is a clear indication that the Markov chains are struggling to explore the tip of the funnel, which is narrower than the rest of the space.

    The main problem is that large steps are required to explore the less narrow regions efficiently, but those steps become too large for navigating the narrow region. The required step size is connected to the value of tau. When tau is large it allows for large variation in theta (and requires large steps) while small tau requires small steps in theta.

    The non-centered parameterization avoids this by sampling the eta parameter which, unlike theta, is a priori independent of tau. Then theta is computed deterministically from the parameters eta, mu and tau afterwards. Here’s the same plot as above, but with eta[1] from non-centered parameterization instead of theta[1] from the centered parameterization:

    scatter_eta_ncp <- mcmc_scatter(
      posterior_ncp, 
      pars = c("eta[1]", "tau"), 
      transform = list(tau = "log"), 
      np = np_ncp, 
      size = 1
    )
    scatter_eta_ncp

    We can see that the funnel/tornado shape is replaced by a somewhat Gaussian blob/cloud and the divergences go away. Gabry et al. (2019) has further discussion of this example.

    Ultimately we only care about eta insofar as it enables the Markov chains to better explore the posterior, so let’s directly examine how much more exploration was possible after the reparameterization. For the non-centered parameterization we can make the same scatterplot but use the values of theta[1] = mu + eta[1] * tau instead of eta[1]. Below is a side by side comparison with the scatterplot of theta[1] vs log(tau) from the centered parameterization that we made above. We will also force the plots to have the same \(y\)-axis limits, which will make the most important difference much more apparent:

    # A function we'll use several times to plot comparisons of the centered 
    # parameterization (cp) and the non-centered parameterization (ncp). See
    # help("bayesplot_grid") for details on the bayesplot_grid function used here.
    compare_cp_ncp <- function(cp_plot, ncp_plot, ncol = 2, ...) {
      bayesplot_grid(
        cp_plot, ncp_plot, 
        grid_args = list(ncol = ncol),
        subtitles = c("Centered parameterization", 
                      "Non-centered parameterization"),
        ...
      )
    }
    
    
    scatter_theta_ncp <- mcmc_scatter(
      posterior_ncp, 
      pars = c("theta[1]", "tau"), 
      transform = list(tau = "log"), 
      np = np_ncp, 
      size = 1
    )
    
    compare_cp_ncp(scatter_theta_cp, scatter_theta_ncp, ylim = c(-8, 4))

    Once we transform the eta values into theta values we actually see an even more pronounced funnel/tornado shape than we have with the centered parameterization. But this is precisely what we want! The non-centered parameterization allowed us to obtain draws from the funnel distribution without having to directly navigate the curvature of the funnel. With the centered parameterization the chains never could make it into the neck of funnel and we see a clustering of divergences and no draws in the tail of the distribution.

    mcmc_trace

    Another useful diagnostic plot is the trace plot, which is a time series plot of the Markov chains. That is, a trace plot shows the evolution of parameter vector over the iterations of one or many Markov chains. The np argument to the mcmc_trace function can be used to add a rug plot of the divergences to a trace plot of parameter draws. Typically we can see that at least one of the chains is getting stuck wherever there is a cluster of many red marks.

    Here is the trace plot for the tau parameter from the centered parameterization:

    color_scheme_set("mix-brightblue-gray")
    mcmc_trace(posterior_cp, pars = "tau", np = np_cp) + 
      xlab("Post-warmup iteration")

    The first thing to note is that all chains seem to be exploring the same region of parameter values, which is a good sign. But the plot is too crowded to help us diagnose divergences. We may however zoom in to investigate, using the window argument:

    mcmc_trace(posterior_cp, pars = "tau", np = np_cp, window = c(300,500)) + 
      xlab("Post-warmup iteration")

    What we see here is that chains can get stuck as tau approaches zero and spend substantial time in the same region of the parameter space. This is just another indication that there is problematic geometry at \(\tau \simeq 0\) – healthy chains jump up and down frequently.

    mcmc_nuts_divergence

    To understand how the divergences interact with the model globally, we can use the mcmc_nuts_divergence function:

    color_scheme_set("red")
    mcmc_nuts_divergence(np_cp, lp_cp)

    In the top panel we see the distribution of the log-posterior when there was no divergence vs the distribution when there was a divergence. Divergences often indicate that some part of the posterior isn’t being explored and the plot confirms that lp|Divergence indeed has lighter tails than lp|No divergence.

    The bottom panel shows the same thing but instead of the log-posterior the NUTS acceptance statistic is shown.

    Specifying the optional chain argument will overlay the plot just for a particular Markov chain on the plot for all chains combined:

    mcmc_nuts_divergence(np_cp, lp_cp, chain = 4)

    For the non-centered parameterization we may get a few warnings about divergences but if we do we’ll have far fewer of them to worry about.

    mcmc_nuts_divergence(np_ncp, lp_ncp)

    If there are only a few divergences we can often get rid of them by increasing the target acceptance rate (adapt_delta, the upper limit is 1), which has the effect of lowering the step size used by the sampler and allowing the Markov chains to explore more complicated curvature in the target distribution.

    fit_cp_2 <- sampling(schools_mod_cp, data = schools_dat,
                         control = list(adapt_delta = 0.999), seed = 978245244)
    Warning: There were 18 divergent transitions after warmup. See
    https://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup
    to find out why this is a problem and how to eliminate them.
    Warning: There were 4 chains where the estimated Bayesian Fraction of Missing Information was low. See
    https://mc-stan.org/misc/warnings.html#bfmi-low
    Warning: Examine the pairs() plot to diagnose sampling problems
    Warning: The largest R-hat is 1.06, indicating chains have not mixed.
    Running the chains for more iterations may help. See
    https://mc-stan.org/misc/warnings.html#r-hat
    Warning: Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
    Running the chains for more iterations may help. See
    https://mc-stan.org/misc/warnings.html#bulk-ess
    Warning: Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
    Running the chains for more iterations may help. See
    https://mc-stan.org/misc/warnings.html#tail-ess
    fit_ncp_2 <- sampling(schools_mod_ncp, data = schools_dat,
                          control = list(adapt_delta = 0.999), seed = 843256842)

    For the first model and this particular data, increasing adapt_delta will not solve the problem and a reparameterization is required.

    mcmc_nuts_divergence(nuts_params(fit_cp_2), log_posterior(fit_cp_2))

    mcmc_nuts_divergence(nuts_params(fit_ncp_2), log_posterior(fit_ncp_2))

    Energy and Bayesian fraction of missing information

    The mcmc_nuts_energy function creates plots similar to those presented in Betancourt (2017). While mcmcm_nuts_divergence can identify light tails and incomplete exploration of the target distribution, the mcmc_nuts_energy function can identify overly heavy tails that are also challenging for sampling. Informally, the energy diagnostic for HMC (and the related energy-based Bayesian fraction of missing information) quantifies the heaviness of the tails of the posterior distribution.

    mcmc_nuts_energy

    The plot created by mcmc_nuts_energy shows overlaid histograms of the (centered) marginal energy distribution \(\pi_E\) and the first-differenced distribution \(\pi_{\Delta E}\),

    color_scheme_set("red")
    mcmc_nuts_energy(np_cp)

    The two histograms ideally look the same (Betancourt, 2017), which is only the case for the non-centered parameterization (right):

    compare_cp_ncp(
      mcmc_nuts_energy(np_cp, binwidth = 1/2),
      mcmc_nuts_energy(np_ncp, binwidth = 1/2)
    )

    The difference between the parameterizations is even more apparent if we force the step size to a smaller value and help the chains explore more of the posterior:

    np_cp_2 <- nuts_params(fit_cp_2)
    np_ncp_2 <- nuts_params(fit_ncp_2)
    
    compare_cp_ncp(
      mcmc_nuts_energy(np_cp_2), 
      mcmc_nuts_energy(np_ncp_2)
    )

    See Betancourt (2017) for more on this particular example as well as the general theory behind the energy plots.


    General MCMC diagnostics

    A Markov chain generates draws from the target distribution only after it has converged to an equilibrium. Unfortunately, this is only guaranteed in the limit in theory. In practice, diagnostics must be applied to monitor whether the Markov chain(s) have converged. The bayesplot package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) diagnostics after fitting a Bayesian model. MCMC draws from any package can be used, although there are a few diagnostic plots that we will see later in this vignette that are specifically intended to be used for Stan models (or models fit using the same algorithms as Stan).

    Documentation:


    Rhat: potential scale reduction statistic

    One way to monitor whether a chain has converged to the equilibrium distribution is to compare its behavior to other randomly initialized chains. This is the motivation for the potential scale reduction statistic, split-\(\hat{R}\). The split-\(\hat{R}\) statistic measures the ratio of the average variance of draws within each chain to the variance of the pooled draws across chains; if all chains are at equilibrium, these will be the same and \(\hat{R}\) will be one. If the chains have not converged to a common distribution, the \(\hat{R}\) statistic will be greater than one (see Gelman et al. 2013, Stan Development Team 2018).

    The bayesplot package provides the functions mcmc_rhat and mcmc_rhat_hist for visualizing \(\hat{R}\) estimates.

    First we’ll quickly fit one of the models above again, this time intentionally using too few MCMC iterations and allowing more dispersed initial values. This should lead to some high \(\hat{R}\) values.

    fit_cp_bad_rhat <- sampling(schools_mod_cp, data = schools_dat, 
                                iter = 50, init_r = 10, seed = 671254821)
    Warning: There were 48 transitions after warmup that exceeded the maximum treedepth. Increase max_treedepth above 10. See
    https://mc-stan.org/misc/warnings.html#maximum-treedepth-exceeded
    Warning: Examine the pairs() plot to diagnose sampling problems
    Warning: The largest R-hat is 1.73, indicating chains have not mixed.
    Running the chains for more iterations may help. See
    https://mc-stan.org/misc/warnings.html#r-hat
    Warning: Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
    Running the chains for more iterations may help. See
    https://mc-stan.org/misc/warnings.html#bulk-ess
    Warning: Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
    Running the chains for more iterations may help. See
    https://mc-stan.org/misc/warnings.html#tail-ess

    bayesplot provides a generic rhat extractor function, currently with methods defined for models fit using the rstan, rstanarm and brms packages. But regardless of how you fit your model, all bayesplot needs is a vector of \(\hat{R}\) values.

    rhats <- rhat(fit_cp_bad_rhat)
    print(rhats)
          mu      tau theta[1] theta[2] theta[3] theta[4] theta[5] theta[6] 
    1.195701 1.652152 1.299397 1.396105 1.255962 1.123406 1.154050 1.424646 
    theta[7] theta[8]     lp__ 
    1.133948 1.577158 1.839991 

    mcmc_rhat, mcmc_rhat_hist

    We can visualize the \(\hat{R}\) values with the mcmc_rhat function:

    color_scheme_set("brightblue") # see help("color_scheme_set")
    mcmc_rhat(rhats)

    In the plot, the points representing the \(\hat{R}\) values are colored based on whether they are less than \(1.05\), between \(1.05\) and \(1.1\), or greater than \(1.1\). There is no theoretical reason to trichotomize \(\hat{R}\) values using these cutoffs, so keep in mind that this is just a heuristic.

    The \(y\)-axis text is off by default for this plot because it’s only possible to see the labels clearly for models with very few parameters. We can see the names of the parameters with the concerning \(\hat{R}\) values using the yaxis_text convenience function (which passes arguments like hjust to ggplot2::element_text):

    mcmc_rhat(rhats) + yaxis_text(hjust = 1)

    If we look at the same model fit using longer Markov chains we should see all \(\hat{R} < 1.1\), and all points in the plot the same (light) color:

    mcmc_rhat(rhat = rhat(fit_cp)) + yaxis_text(hjust = 0)

    We can see the same information shown by mcmc_rhat but in histogram form using the mcmc_rhat_hist function. See the Examples section in help("mcmc_rhat_hist") for examples.

    Effective sample size

    The effective sample size is an estimate of the number of independent draws from the posterior distribution of the estimand of interest. The \(n_{eff}\) metric used in Stan is based on the ability of the draws to estimate the true mean value of the parameter, which is related to (but not necessarily equivalent to) estimating other functions of the draws. Because the draws within a Markov chain are not independent if there is autocorrelation, the effective sample size, \(n_{eff}\), is usually smaller than the total sample size, \(N\) (although it may be larger in some cases1). The larger the ratio of \(n_{eff}\) to \(N\) the better (see Gelman et al. 2013, Stan Development Team 2018 for more details) .

    The bayesplot package provides a generic neff_ratio extractor function, currently with methods defined for models fit using the rstan, rstanarm and brms packages. But regardless of how you fit your model, all bayesplot needs is a vector of \(n_{eff}/N\) values. The mcmc_neff and mcmc_neff_hist can then be used to plot the ratios.

    mcmc_neff, mcmc_neff_hist

    ratios_cp <- neff_ratio(fit_cp)
    print(ratios_cp)
            mu        tau   theta[1]   theta[2]   theta[3]   theta[4]   theta[5] 
    0.10870912 0.07431729 0.15594301 0.18650716 0.29205327 0.24055708 0.18942798 
      theta[6]   theta[7]   theta[8]       lp__ 
    0.23979849 0.10096636 0.33114694 0.03549358 
    mcmc_neff(ratios_cp, size = 2)

    In the plot, the points representing the values of \(n_{eff}/N\) are colored based on whether they are less than \(0.1\), between \(0.1\) and \(0.5\), or greater than \(0.5\). These particular values are arbitrary in that they have no particular theoretical meaning, but a useful heuristic is to worry about any \(n_{eff}/N\) less than \(0.1\).

    One important thing to keep in mind is that these ratios will depend not only on the model being fit but also on the particular MCMC algorithm used. One reason why we have such high ratios of \(n_{eff}\) to \(N\) is that the No-U-Turn sampler used by rstan generally produces draws from the posterior distribution with much lower autocorrelations compared to draws obtained using other MCMC algorithms (e.g., Gibbs).

    Even for models fit using rstan the parameterization can make a big difference. Here are the \(n_{eff}/N\) plots for fit_cp and fit_ncp side by side.

    neff_cp <- neff_ratio(fit_cp, pars = c("theta", "mu", "tau"))
    neff_ncp <- neff_ratio(fit_ncp, pars = c("theta", "mu", "tau"))
    compare_cp_ncp(mcmc_neff(neff_cp), mcmc_neff(neff_ncp), ncol = 1)

    Because of the difference in parameterization, the effective sample sizes are much better for the second model, the non-centered parameterization.

    Autocorrelation

    As mentioned above, \(n_{eff}/N\) decreases as autocorrelation becomes more extreme. We can visualize the autocorrelation using the mcmc_acf (line plot) or mcmc_acf_bar (bar plot) functions. For the selected parameters, these functions show the autocorrelation for each Markov chain separately up to a user-specified number of lags. Positive autocorrelation is bad (it means the chain tends to stay in the same area between iterations) and you want it to drop quickly to zero with increasing lag. Negative autocorrelation is possible and it is useful as it indicates fast convergence of sample mean towards true mean.

    mcmc_acf, mcmc_acf_bar

    Here we can again see a difference when comparing the two parameterizations of the same model. For model 1, \(\theta_1\) is the primitive parameter for school 1, whereas for the non-centered parameterization in model 2 the primitive parameter is \(\eta_1\) (and \(\theta_1\) is later constructed from \(\eta_1\), \(\mu\), and \(\tau\)):

    compare_cp_ncp(
      mcmc_acf(posterior_cp, pars = "theta[1]", lags = 10),
      mcmc_acf(posterior_ncp, pars = "eta[1]", lags = 10)
    )


    References

    Betancourt, M. (2017). A conceptual introduction to Hamiltonian Monte Carlo. https://arxiv.org/abs/1701.02434

    Betancourt, M. (2016). Diagnosing suboptimal cotangent disintegrations in Hamiltonian Monte Carlo. https://arxiv.org/abs/1604.00695

    Betancourt, M. and Girolami, M. (2013). Hamiltonian Monte Carlo for hierarchical models. https://arxiv.org/abs/1312.0906

    Gabry, J., and Goodrich, B. (2018). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.17.4. https://mc-stan.org/rstanarm/

    Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. J. R. Stat. Soc. A, 182: 389-402. :10.1111/rssa.12378. (journal version, arXiv preprint, code on GitHub)

    Gelman, A. and Rubin, D. B. (1992). Inference from iterative simulation using multiple sequences. Statistical Science. 7(4): 457–472.

    Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). Bayesian Data Analysis. Chapman & Hall/CRC Press, London, third edition.

    Hoffman, M. D. and Gelman, A. (2014). The No-U-Turn Sampler: adaptively setting path lengths in Hamiltonian Monte Carlo. Journal of Machine Learning Research. 15:1593–1623.

    Rubin, D. B. (1981). Estimation in Parallel Randomized Experiments. Journal of Educational and Behavioral Statistics. 6:377–401.

    Stan Development Team. Stan Modeling Language Users Guide and Reference Manual. https://mc-stan.org/users/documentation/

    Stan Development Team. (2018). RStan: the R interface to Stan. R package version 2.17.3. https://mc-stan.org/rstan/


    1. \(n_{eff} > N\) indicates that the mean estimate of the parameter computed from Stan draws approaches the true mean faster than the mean estimate computed from independent samples from the true posterior (the estimate from Stan has smaller variance). This is possible when the draws are anticorrelated - draws above the mean tend to be well matched with draws below the mean. Other functions computed from draws (quantiles, posterior intervals, tail probabilities) may not necessarily approach the true posterior faster. Google “antithetic sampling” or visit the relevant forum thread for some further explanation.↩︎

    bayesplot/inst/doc/visual-mcmc-diagnostics.Rmd0000644000176200001440000007745514556270424021222 0ustar liggesusers--- title: "Visual MCMC diagnostics using the bayesplot package" author: "Jonah Gabry and Martin Modrák" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") && !(isTRUE(as.logical(Sys.getenv("CI"))) && .Platform$OS.type == "windows") vignette: > %\VignetteIndexEntry{Visual MCMC diagnostics} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("bayesplot") library("ggplot2") library("rstan") library("dplyr") #Used only for consistency checks rstan_options(auto_write = TRUE) #Helpful throughout development bayesplot_theme_set() ``` ## Introduction This vignette focuses on MCMC diagnostic plots, in particular on diagnosing divergent transitions and on the `n_eff` and `Rhat` statistics that help you determine that the chains have mixed well. Plots of parameter estimates from MCMC draws are covered in the separate vignette [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html), and graphical posterior predictive model checking is covered in the [_Graphical posterior predictive checks_](https://mc-stan.org/bayesplot/articles/graphical-ppcs.html) vignette. Note that most of these plots can also be browsed interactively using the [shinystan](https://mc-stan.org/shinystan/) package. ### Setup In addition to __bayesplot__ we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstan__, for fitting the example models used throughout the vignette ```{r setup, eval=FALSE} library("bayesplot") library("ggplot2") library("rstan") ``` ### Example model Before we delve into the actual plotting we need to fit a model to have something to work with. In this vignette we'll use the eight schools example, which is discussed in many places, including Rubin (1981), Gelman et al. (2013), and the [RStan Getting Started](https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started#how-to-use-rstan) wiki. This is a simple hierarchical meta-analysis model with data consisting of point estimates `y` and standard errors `sigma` from analyses of test prep programs in `J=8` schools. Ideally we would have the full data from each of the previous studies, but in this case we only have the these estimates. ```{r schools_dat} schools_dat <- list( J = 8, y = c(28, 8, -3, 7, -1, 1, 18, 12), sigma = c(15, 10, 16, 11, 9, 11, 10, 18) ) ``` The model is: $$ \begin{align*} y_j &\sim {\rm Normal}(\theta_j, \sigma_j), \quad j = 1,\dots,J \\ \theta_j &\sim {\rm Normal}(\mu, \tau), \quad j = 1, \dots, J \\ \mu &\sim {\rm Normal}(0, 10) \\ \tau &\sim {\rm half-Cauchy}(0, 10), \end{align*} $$ with the normal distribution parameterized by the mean and standard deviation, not the variance or precision. In Stan code: ```{stan stancode1, output.var = "schools_mod_cp"} // Saved in 'schools_mod_cp.stan' data { int J; vector[J] y; vector[J] sigma; } parameters { real mu; real tau; vector[J] theta; } model { mu ~ normal(0, 10); tau ~ cauchy(0, 10); theta ~ normal(mu, tau); y ~ normal(theta, sigma); } ``` This parameterization of the model is referred to as the centered parameterization (CP). We'll also fit the same statistical model but using the so-called non-centered parameterization (NCP), which replaces the vector $\theta$ with a vector $\eta$ of a priori _i.i.d._ standard normal parameters and then constructs $\theta$ deterministically from $\eta$ by scaling by $\tau$ and shifting by $\mu$: $$ \begin{align*} \theta_j &= \mu + \tau \,\eta_j, \quad j = 1,\dots,J \\ \eta_j &\sim N(0,1), \quad j = 1,\dots,J. \end{align*} $$ The Stan code for this model is: ```{stan, stancode2, output.var = "schools_mod_ncp"} // Saved in 'schools_mod_ncp.stan' data { int J; vector[J] y; vector[J] sigma; } parameters { real mu; real tau; vector[J] eta; } transformed parameters { vector[J] theta; theta = mu + tau * eta; } model { mu ~ normal(0, 10); tau ~ cauchy(0, 10); eta ~ normal(0, 1); // implies theta ~ normal(mu, tau) y ~ normal(theta, sigma); } ``` The centered and non-centered are two parameterizations of the same statistical model, but they have very different practical implications for MCMC. Using the __bayesplot__ diagnostic plots, we'll see that, for this data, the NCP is required in order to properly explore the posterior distribution. To fit both models we first translate the Stan code to C++ and compile it using the `stan_model` function. ```{r compile-models, eval=FALSE} schools_mod_cp <- stan_model("schools_mod_cp.stan") schools_mod_ncp <- stan_model("schools_mod_ncp.stan") ``` We then fit the model by calling Stan's MCMC algorithm using the `sampling` function (the increased `adapt_delta` param is to make the sampler a bit more "careful" and avoid false positive divergences), ```{r fit-models-hidden, results='hide', message=FALSE} fit_cp <- sampling(schools_mod_cp, data = schools_dat, seed = 803214055, control = list(adapt_delta = 0.9)) fit_ncp <- sampling(schools_mod_ncp, data = schools_dat, seed = 457721433, control = list(adapt_delta = 0.9)) ``` and extract a `iterations x chains x parameters` array of posterior draws with `as.array`, ```{r extract-draws} # Extract posterior draws for later use posterior_cp <- as.array(fit_cp) posterior_ncp <- as.array(fit_ncp) ``` You may have noticed the warnings about divergent transitions for the centered parameterization fit. Those are serious business and in most cases indicate that something is wrong with the model and the results should not be trusted. For an explanation of these warnings see [Divergent transitions after warmup](https://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup). We'll have a look at diagnosing the source of the divergences first and then dive into some diagnostics that should be checked even if there are no warnings from the sampler.
    ## Diagnostics for the No-U-Turn Sampler The No-U-Turn Sampler (NUTS, Hoffman and Gelman, 2014) is the variant of Hamiltonian Monte Carlo (HMC) used by [Stan](https://mc-stan.org/) and the various R packages that depend on Stan for fitting Bayesian models. The **bayesplot** package has special functions for visualizing some of the unique diagnostics permitted by HMC, and NUTS in particular. See Betancourt (2017), Betancourt and Girolami (2013), and Stan Development Team (2017) for more details on the concepts. **Documentation:** * `help("MCMC-nuts")` * [mc-stan.org/bayesplot/reference/MCMC-nuts](https://mc-stan.org/bayesplot/reference/MCMC-nuts.html) ------ The special **bayesplot** functions for NUTS diagnostics are ```{r available_mcmc-nuts} available_mcmc(pattern = "_nuts_") ``` Those functions require more information than simply the posterior draws, in particular the log of the posterior density for each draw and some NUTS-specific diagnostic values may be needed. The **bayesplot** package provides generic functions `log_posterior` and `nuts_params` for extracting this information from fitted model objects. Currently methods are provided for models fit using the **rstan**, **rstanarm** and **brms** packages, although it is not difficult to define additional methods for the objects returned by other R packages. For the Stan models we fit above we can use the `log_posterior` and `nuts_params` methods for stanfit objects: ```{r extract-nuts-info} lp_cp <- log_posterior(fit_cp) head(lp_cp) np_cp <- nuts_params(fit_cp) head(np_cp) # for the second model lp_ncp <- log_posterior(fit_ncp) np_ncp <- nuts_params(fit_ncp) ``` ```{r echo=FALSE, warning=FALSE} # On rare occasions, the fits may not be illustrative. Currently the seed is # fixed, but if something in Stan changes and the fixed seeds produce unexpected # results (which should be rare), we want to know. n_divergent_cp <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp <- np_ncp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp < 10 || n_divergent_cp > 2000) { stop("Unexpected number of divergences in the CP model. Change seed?") } if(n_divergent_ncp > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ``` In addition to the NUTS-specific plotting functions, some of the general MCMC plotting functions demonstrated in the [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html) vignette also take optional arguments that can be used to display important HMC/NUTS diagnostic information. We'll see examples of this in the next section on divergent transitions. ### Divergent transitions When running the Stan models above, there were warnings about divergent transitions. Here we'll look at diagnosing the source of divergences through visualizations. #### mcmc_parcoord The `mcmc_parcoord` plot shows one line per iteration, connecting the parameter values at this iteration. This lets you see global patterns in the divergences. This function works in general without including information about the divergences, but if the optional `np` argument is used to pass NUTS parameter information, then divergences will be colored in the plot (by default in red). ```{r mcmc_parcoord-1} color_scheme_set("darkgray") mcmc_parcoord(posterior_cp, np = np_cp) ``` Here, you may notice that divergences in the centered parameterization happen exclusively when `tau`, the hierarchical standard deviation, goes near zero and the values of the `theta`s are essentially fixed. This makes `tau` immediately suspect. See [Gabry et al. (2019)](#gabry2019) for another example of the parallel coordinates plot. #### mcmc_pairs The `mcmc_pairs` function can also be used to look at multiple parameters at once, but unlike `mcmc_parcoord` (which works well even when including several dozen parameters) `mcmc_pairs` is more useful for up to ~8 parameters. It shows univariate histograms and bivariate scatter plots for selected parameters and is especially useful in identifying collinearity between variables (which manifests as narrow bivariate plots) as well as the presence of multiplicative non-identifiabilities (banana-like shapes). Let's look at how `tau` interacts with other variables, using only one of the `theta`s to keep the plot readable: ```{r mcmc_pairs} mcmc_pairs(posterior_cp, np = np_cp, pars = c("mu","tau","theta[1]"), off_diag_args = list(size = 0.75)) ``` Note that each bivariate plot is present twice -- by default each of those contain half of the chains, so you also get to see if the chains produced similar results (see the documentation for the `condition` argument for other options). Here, the interaction of `tau` and `theta[1]` seems most interesting, as it concentrates the divergences into a tight region. Further examples of pairs plots and instructions for using the various optional arguments to `mcmc_pairs` are provided via `help("mcmc_pairs")`. #### mcmc_scatter Using the `mcmc_scatter` function (with optional argument `np`) we can look at a single bivariate plot to investigate it more closely. For hierarchical models, a good place to start is to plot a "local" parameter (`theta[j]`) against a "global" scale parameter on which it depends (`tau`). We will also use the `transformations` argument to look at the log of `tau`, as this is what Stan is doing under the hood for parameters like `tau` that have a lower bound of zero. That is, even though the draws for `tau` returned from Stan are all positive, the parameter space that the Markov chains actual explore is unconstrained. Transforming `tau` is not strictly necessary for the plot (often the plot is still useful without it) but plotting in the unconstrained is often even more informative. First the plot for the centered parameterization: ```{r mcmc_scatter-1} # assign to an object so we can reuse later scatter_theta_cp <- mcmc_scatter( posterior_cp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), # can abbrev. 'transformations' np = np_cp, size = 1 ) scatter_theta_cp ``` The shape of this bivariate distribution resembles a funnel (or tornado). This one in particular is essentially the same as an example referred to as Neal's funnel (details in the Stan manual) and it is a clear indication that the Markov chains are struggling to explore the tip of the funnel, which is narrower than the rest of the space. The main problem is that large steps are required to explore the less narrow regions efficiently, but those steps become too large for navigating the narrow region. The required step size is connected to the value of `tau`. When `tau` is large it allows for large variation in `theta` (and requires large steps) while small `tau` requires small steps in `theta`. The non-centered parameterization avoids this by sampling the `eta` parameter which, unlike `theta`, is _a priori independent_ of `tau`. Then `theta` is computed deterministically from the parameters `eta`, `mu` and `tau` afterwards. Here's the same plot as above, but with `eta[1]` from non-centered parameterization instead of `theta[1]` from the centered parameterization: ```{r mcmc_scatter-2} scatter_eta_ncp <- mcmc_scatter( posterior_ncp, pars = c("eta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) scatter_eta_ncp ``` We can see that the funnel/tornado shape is replaced by a somewhat Gaussian blob/cloud and the divergences go away. [Gabry et al. (2019)](#gabry2019) has further discussion of this example. Ultimately we only care about `eta` insofar as it enables the Markov chains to better explore the posterior, so let's directly examine how much more exploration was possible after the reparameterization. For the non-centered parameterization we can make the same scatterplot but use the values of `theta[1] = mu + eta[1] * tau` instead of `eta[1]`. Below is a side by side comparison with the scatterplot of `theta[1]` vs `log(tau)` from the centered parameterization that we made above. We will also force the plots to have the same $y$-axis limits, which will make the most important difference much more apparent: ```{r mcmc_scatter-3} # A function we'll use several times to plot comparisons of the centered # parameterization (cp) and the non-centered parameterization (ncp). See # help("bayesplot_grid") for details on the bayesplot_grid function used here. compare_cp_ncp <- function(cp_plot, ncp_plot, ncol = 2, ...) { bayesplot_grid( cp_plot, ncp_plot, grid_args = list(ncol = ncol), subtitles = c("Centered parameterization", "Non-centered parameterization"), ... ) } scatter_theta_ncp <- mcmc_scatter( posterior_ncp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) compare_cp_ncp(scatter_theta_cp, scatter_theta_ncp, ylim = c(-8, 4)) ``` Once we transform the `eta` values into `theta` values we actually see an even more pronounced funnel/tornado shape than we have with the centered parameterization. But this is precisely what we want! The non-centered parameterization allowed us to obtain draws from the funnel distribution without having to directly navigate the curvature of the funnel. With the centered parameterization the chains never could make it into the neck of funnel and we see a clustering of divergences and no draws in the tail of the distribution. #### mcmc_trace Another useful diagnostic plot is the trace plot, which is a time series plot of the Markov chains. That is, a trace plot shows the evolution of parameter vector over the iterations of one or many Markov chains. The `np` argument to the `mcmc_trace` function can be used to add a rug plot of the divergences to a trace plot of parameter draws. Typically we can see that at least one of the chains is getting stuck wherever there is a cluster of many red marks. Here is the trace plot for the `tau` parameter from the centered parameterization: ```{r mcmc_trace} color_scheme_set("mix-brightblue-gray") mcmc_trace(posterior_cp, pars = "tau", np = np_cp) + xlab("Post-warmup iteration") ``` The first thing to note is that all chains seem to be exploring the same region of parameter values, which is a good sign. But the plot is too crowded to help us diagnose divergences. We may however zoom in to investigate, using the `window` argument: ```{r echo=FALSE} #A check that the chosen window still relevant n_divergent_in_window <- np_cp %>% filter(Parameter == "divergent__" & Value == 1 & Iteration >= 300 & Iteration <= 500) %>% nrow() if(n_divergent_in_window < 6) { divergences <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% select(Iteration) %>% get("Iteration", .) %>% sort() %>% paste(collapse = ",") stop(paste("Too few divergences in the selected window for traceplot zoom. Change the window or the random seed.\nDivergences happened at: ", divergences)) } ``` ```{r mcmc_trace_zoom} mcmc_trace(posterior_cp, pars = "tau", np = np_cp, window = c(300,500)) + xlab("Post-warmup iteration") ``` What we see here is that chains can get stuck as `tau` approaches zero and spend substantial time in the same region of the parameter space. This is just another indication that there is problematic geometry at $\tau \simeq 0$ -- healthy chains jump up and down frequently. #### mcmc_nuts_divergence To understand how the divergences interact with the model globally, we can use the `mcmc_nuts_divergence` function: ```{r mcmc_nuts_divergence} color_scheme_set("red") mcmc_nuts_divergence(np_cp, lp_cp) ``` In the top panel we see the distribution of the log-posterior when there was no divergence vs the distribution when there was a divergence. Divergences often indicate that some part of the posterior isn't being explored and the plot confirms that `lp|Divergence` indeed has lighter tails than `lp|No divergence`. The bottom panel shows the same thing but instead of the log-posterior the NUTS acceptance statistic is shown. Specifying the optional `chain` argument will overlay the plot just for a particular Markov chain on the plot for all chains combined: ```{r mcmc_nuts_divergence-chain} mcmc_nuts_divergence(np_cp, lp_cp, chain = 4) ``` For the non-centered parameterization we may get a few warnings about divergences but if we do we'll have far fewer of them to worry about. ```{r mcmc_nuts_divergence-2} mcmc_nuts_divergence(np_ncp, lp_ncp) ``` If there are only a few divergences we can often get rid of them by increasing the target acceptance rate (`adapt_delta`, the upper limit is 1), which has the effect of lowering the step size used by the sampler and allowing the Markov chains to explore more complicated curvature in the target distribution. ```{r fit-adapt-delta, results='hide', message=FALSE} fit_cp_2 <- sampling(schools_mod_cp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 978245244) fit_ncp_2 <- sampling(schools_mod_ncp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 843256842) ``` ```{r echo=FALSE, warning=FALSE} # On rare occasions, the fits may not be illustrative. Currently the seed is fixed, but if something in Stan changes and the fixed seeds produce unexpected results (which should be rare), we want to know. n_divergent_cp_2 <- fit_cp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp_2 <- fit_ncp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp_2 <= 0) { stop("No divergences in CP with increased adapt.delta. Change seed?") } if(n_divergent_ncp_2 > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ``` For the first model and this particular data, increasing `adapt_delta` will not solve the problem and a reparameterization is required. ```{r mcmc_nuts_divergence-3} mcmc_nuts_divergence(nuts_params(fit_cp_2), log_posterior(fit_cp_2)) mcmc_nuts_divergence(nuts_params(fit_ncp_2), log_posterior(fit_ncp_2)) ``` ### Energy and Bayesian fraction of missing information The `mcmc_nuts_energy` function creates plots similar to those presented in Betancourt (2017). While `mcmcm_nuts_divergence` can identify light tails and incomplete exploration of the target distribution, the `mcmc_nuts_energy` function can identify overly heavy tails that are also challenging for sampling. Informally, the energy diagnostic for HMC (and the related energy-based Bayesian fraction of missing information) quantifies the heaviness of the tails of the posterior distribution. #### mcmc_nuts_energy The plot created by `mcmc_nuts_energy` shows overlaid histograms of the (centered) marginal energy distribution $\pi_E$ and the first-differenced distribution $\pi_{\Delta E}$, ```{r mcmc_nuts_energy-1, message=FALSE} color_scheme_set("red") mcmc_nuts_energy(np_cp) ``` The two histograms ideally look the same (Betancourt, 2017), which is only the case for the non-centered parameterization (right): ```{r mcmc_nuts_energy-3, message=FALSE, fig.width=8} compare_cp_ncp( mcmc_nuts_energy(np_cp, binwidth = 1/2), mcmc_nuts_energy(np_ncp, binwidth = 1/2) ) ``` The difference between the parameterizations is even more apparent if we force the step size to a smaller value and help the chains explore more of the posterior: ```{r mcmc_nuts_energy-4, message=FALSE, fig.width=8} np_cp_2 <- nuts_params(fit_cp_2) np_ncp_2 <- nuts_params(fit_ncp_2) compare_cp_ncp( mcmc_nuts_energy(np_cp_2), mcmc_nuts_energy(np_ncp_2) ) ``` See Betancourt (2017) for more on this particular example as well as the general theory behind the energy plots.
    ## General MCMC diagnostics A Markov chain generates draws from the target distribution only after it has converged to an equilibrium. Unfortunately, this is only guaranteed in the limit in theory. In practice, diagnostics must be applied to monitor whether the Markov chain(s) have converged. The __bayesplot__ package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) diagnostics after fitting a Bayesian model. MCMC draws from any package can be used, although there are a few diagnostic plots that we will see later in this vignette that are specifically intended to be used for [Stan](https://mc-stan.org/) models (or models fit using the same algorithms as Stan). **Documentation:** * `help("MCMC-diagnostics")` * [mc-stan.org/bayesplot/reference/MCMC-diagnostics](https://mc-stan.org/bayesplot/reference/MCMC-diagnostics.html) ------ ### Rhat: potential scale reduction statistic One way to monitor whether a chain has converged to the equilibrium distribution is to compare its behavior to other randomly initialized chains. This is the motivation for the potential scale reduction statistic, split-$\hat{R}$. The split-$\hat{R}$ statistic measures the ratio of the average variance of draws within each chain to the variance of the pooled draws across chains; if all chains are at equilibrium, these will be the same and $\hat{R}$ will be one. If the chains have not converged to a common distribution, the $\hat{R}$ statistic will be greater than one (see Gelman et al. 2013, Stan Development Team 2018). The **bayesplot** package provides the functions `mcmc_rhat` and `mcmc_rhat_hist` for visualizing $\hat{R}$ estimates. First we'll quickly fit one of the models above again, this time intentionally using too few MCMC iterations and allowing more dispersed initial values. This should lead to some high $\hat{R}$ values. ```{r fit_cp_bad_rhat, results='hide'} fit_cp_bad_rhat <- sampling(schools_mod_cp, data = schools_dat, iter = 50, init_r = 10, seed = 671254821) ``` **bayesplot** provides a generic `rhat` extractor function, currently with methods defined for models fit using the **rstan**, **rstanarm** and **brms** packages. But regardless of how you fit your model, all **bayesplot** needs is a vector of $\hat{R}$ values. ```{r print-rhats} rhats <- rhat(fit_cp_bad_rhat) print(rhats) ``` #### mcmc_rhat, mcmc_rhat_hist We can visualize the $\hat{R}$ values with the `mcmc_rhat` function: ```{r echo=FALSE} #Check that the fit we got is a sensible example if(all(rhats < 1.3)) { stop("All rhats for the short chain run are low. Change seed?") } ``` ```{r mcmc_rhat-1} color_scheme_set("brightblue") # see help("color_scheme_set") mcmc_rhat(rhats) ``` In the plot, the points representing the $\hat{R}$ values are colored based on whether they are less than $1.05$, between $1.05$ and $1.1$, or greater than $1.1$. There is no theoretical reason to trichotomize $\hat{R}$ values using these cutoffs, so keep in mind that this is just a heuristic. The $y$-axis text is off by default for this plot because it's only possible to see the labels clearly for models with very few parameters. We can see the names of the parameters with the concerning $\hat{R}$ values using the `yaxis_text` convenience function (which passes arguments like `hjust` to `ggplot2::element_text`): ```{r mcmc_rhat-2} mcmc_rhat(rhats) + yaxis_text(hjust = 1) ``` If we look at the same model fit using longer Markov chains we should see all $\hat{R} < 1.1$, and all points in the plot the same (light) color: ```{r mcmc_rhat-3} mcmc_rhat(rhat = rhat(fit_cp)) + yaxis_text(hjust = 0) ``` We can see the same information shown by `mcmc_rhat` but in histogram form using the `mcmc_rhat_hist` function. See the **Examples** section in `help("mcmc_rhat_hist")` for examples. ### Effective sample size The effective sample size is an estimate of the number of independent draws from the posterior distribution of the estimand of interest. The $n_{eff}$ metric used in Stan is based on the ability of the draws to estimate the true mean value of the parameter, which is related to (but not necessarily equivalent to) estimating other functions of the draws. Because the draws within a Markov chain are _not_ independent if there is autocorrelation, the effective sample size, $n_{eff}$, is usually smaller than the total sample size, $N$ (although it may be larger in some cases[^1]). The larger the ratio of $n_{eff}$ to $N$ the better (see Gelman et al. 2013, Stan Development Team 2018 for more details) . [^1]: $n_{eff} > N$ indicates that the mean estimate of the parameter computed from Stan draws approaches the true mean faster than the mean estimate computed from independent samples from the true posterior (the estimate from Stan has smaller variance). This is possible when the draws are anticorrelated - draws above the mean tend to be well matched with draws below the mean. Other functions computed from draws (quantiles, posterior intervals, tail probabilities) may not necessarily approach the true posterior faster. Google "antithetic sampling" or visit [the relevant forum thread](https://discourse.mc-stan.org/t/n-eff-bda3-vs-stan/2608/19) for some further explanation. The **bayesplot** package provides a generic `neff_ratio` extractor function, currently with methods defined for models fit using the **rstan**, **rstanarm** and **brms** packages. But regardless of how you fit your model, all **bayesplot** needs is a vector of $n_{eff}/N$ values. The `mcmc_neff` and `mcmc_neff_hist` can then be used to plot the ratios. #### mcmc_neff, mcmc_neff_hist ```{r print-neff-ratios} ratios_cp <- neff_ratio(fit_cp) print(ratios_cp) mcmc_neff(ratios_cp, size = 2) ``` In the plot, the points representing the values of $n_{eff}/N$ are colored based on whether they are less than $0.1$, between $0.1$ and $0.5$, or greater than $0.5$. These particular values are arbitrary in that they have no particular theoretical meaning, but a useful heuristic is to worry about any $n_{eff}/N$ less than $0.1$. One important thing to keep in mind is that these ratios will depend not only on the model being fit but also on the particular MCMC algorithm used. One reason why we have such high ratios of $n_{eff}$ to $N$ is that the No-U-Turn sampler used by **rstan** generally produces draws from the posterior distribution with much lower autocorrelations compared to draws obtained using other MCMC algorithms (e.g., Gibbs). Even for models fit using **rstan** the parameterization can make a big difference. Here are the $n_{eff}/N$ plots for `fit_cp` and `fit_ncp` side by side. ```{r mcmc_neff-compare} neff_cp <- neff_ratio(fit_cp, pars = c("theta", "mu", "tau")) neff_ncp <- neff_ratio(fit_ncp, pars = c("theta", "mu", "tau")) compare_cp_ncp(mcmc_neff(neff_cp), mcmc_neff(neff_ncp), ncol = 1) ``` Because of the difference in parameterization, the effective sample sizes are much better for the second model, the non-centered parameterization. ### Autocorrelation As mentioned above, $n_{eff}/N$ decreases as autocorrelation becomes more extreme. We can visualize the autocorrelation using the `mcmc_acf` (line plot) or `mcmc_acf_bar` (bar plot) functions. For the selected parameters, these functions show the autocorrelation for each Markov chain separately up to a user-specified number of lags. Positive autocorrelation is bad (it means the chain tends to stay in the same area between iterations) and you want it to drop quickly to zero with increasing lag. Negative autocorrelation is possible and it is useful as it indicates fast convergence of sample mean towards true mean. #### `mcmc_acf`, `mcmc_acf_bar` Here we can again see a difference when comparing the two parameterizations of the same model. For model 1, $\theta_1$ is the primitive parameter for school 1, whereas for the non-centered parameterization in model 2 the primitive parameter is $\eta_1$ (and $\theta_1$ is later constructed from $\eta_1$, $\mu$, and $\tau$): ```{r mcmc_acf, out.width = "70%"} compare_cp_ncp( mcmc_acf(posterior_cp, pars = "theta[1]", lags = 10), mcmc_acf(posterior_ncp, pars = "eta[1]", lags = 10) ) ```
    ## References Betancourt, M. (2017). A conceptual introduction to Hamiltonian Monte Carlo. https://arxiv.org/abs/1701.02434 Betancourt, M. (2016). Diagnosing suboptimal cotangent disintegrations in Hamiltonian Monte Carlo. https://arxiv.org/abs/1604.00695 Betancourt, M. and Girolami, M. (2013). Hamiltonian Monte Carlo for hierarchical models. https://arxiv.org/abs/1312.0906 Gabry, J., and Goodrich, B. (2018). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.17.4. https://mc-stan.org/rstanarm/ Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper)) Gelman, A. and Rubin, D. B. (1992). Inference from iterative simulation using multiple sequences. *Statistical Science*. 7(4): 457--472. Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Hoffman, M. D. and Gelman, A. (2014). The No-U-Turn Sampler: adaptively setting path lengths in Hamiltonian Monte Carlo. *Journal of Machine Learning Research*. 15:1593--1623. Rubin, D. B. (1981). Estimation in Parallel Randomized Experiments. *Journal of Educational and Behavioral Statistics*. 6:377--401. Stan Development Team. _Stan Modeling Language Users Guide and Reference Manual_. https://mc-stan.org/users/documentation/ Stan Development Team. (2018). RStan: the R interface to Stan. R package version 2.17.3. https://mc-stan.org/rstan/ bayesplot/inst/doc/visual-mcmc-diagnostics.R0000644000176200001440000002210614563223212020647 0ustar liggesusersparams <- list(EVAL = TRUE) ## ----SETTINGS-knitr, include=FALSE-------------------------------------------- stopifnot(require("knitr")) library("bayesplot") knitr::opts_chunk$set( dev = "png", dpi = 150, fig.asp = 0.618, fig.width = 5, out.width = "60%", fig.align = "center", comment = NA, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE ) ## ----pkgs, include=FALSE------------------------------------------------------ library("bayesplot") library("ggplot2") library("rstan") library("dplyr") #Used only for consistency checks rstan_options(auto_write = TRUE) #Helpful throughout development bayesplot_theme_set() ## ----setup, eval=FALSE-------------------------------------------------------- # library("bayesplot") # library("ggplot2") # library("rstan") ## ----schools_dat-------------------------------------------------------------- schools_dat <- list( J = 8, y = c(28, 8, -3, 7, -1, 1, 18, 12), sigma = c(15, 10, 16, 11, 9, 11, 10, 18) ) ## ----compile-models, eval=FALSE----------------------------------------------- # schools_mod_cp <- stan_model("schools_mod_cp.stan") # schools_mod_ncp <- stan_model("schools_mod_ncp.stan") ## ----fit-models-hidden, results='hide', message=FALSE------------------------- fit_cp <- sampling(schools_mod_cp, data = schools_dat, seed = 803214055, control = list(adapt_delta = 0.9)) fit_ncp <- sampling(schools_mod_ncp, data = schools_dat, seed = 457721433, control = list(adapt_delta = 0.9)) ## ----extract-draws------------------------------------------------------------ # Extract posterior draws for later use posterior_cp <- as.array(fit_cp) posterior_ncp <- as.array(fit_ncp) ## ----available_mcmc-nuts------------------------------------------------------ available_mcmc(pattern = "_nuts_") ## ----extract-nuts-info-------------------------------------------------------- lp_cp <- log_posterior(fit_cp) head(lp_cp) np_cp <- nuts_params(fit_cp) head(np_cp) # for the second model lp_ncp <- log_posterior(fit_ncp) np_ncp <- nuts_params(fit_ncp) ## ----echo=FALSE, warning=FALSE------------------------------------------------ # On rare occasions, the fits may not be illustrative. Currently the seed is # fixed, but if something in Stan changes and the fixed seeds produce unexpected # results (which should be rare), we want to know. n_divergent_cp <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp <- np_ncp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp < 10 || n_divergent_cp > 2000) { stop("Unexpected number of divergences in the CP model. Change seed?") } if(n_divergent_ncp > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ## ----mcmc_parcoord-1---------------------------------------------------------- color_scheme_set("darkgray") mcmc_parcoord(posterior_cp, np = np_cp) ## ----mcmc_pairs--------------------------------------------------------------- mcmc_pairs(posterior_cp, np = np_cp, pars = c("mu","tau","theta[1]"), off_diag_args = list(size = 0.75)) ## ----mcmc_scatter-1----------------------------------------------------------- # assign to an object so we can reuse later scatter_theta_cp <- mcmc_scatter( posterior_cp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), # can abbrev. 'transformations' np = np_cp, size = 1 ) scatter_theta_cp ## ----mcmc_scatter-2----------------------------------------------------------- scatter_eta_ncp <- mcmc_scatter( posterior_ncp, pars = c("eta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) scatter_eta_ncp ## ----mcmc_scatter-3----------------------------------------------------------- # A function we'll use several times to plot comparisons of the centered # parameterization (cp) and the non-centered parameterization (ncp). See # help("bayesplot_grid") for details on the bayesplot_grid function used here. compare_cp_ncp <- function(cp_plot, ncp_plot, ncol = 2, ...) { bayesplot_grid( cp_plot, ncp_plot, grid_args = list(ncol = ncol), subtitles = c("Centered parameterization", "Non-centered parameterization"), ... ) } scatter_theta_ncp <- mcmc_scatter( posterior_ncp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) compare_cp_ncp(scatter_theta_cp, scatter_theta_ncp, ylim = c(-8, 4)) ## ----mcmc_trace--------------------------------------------------------------- color_scheme_set("mix-brightblue-gray") mcmc_trace(posterior_cp, pars = "tau", np = np_cp) + xlab("Post-warmup iteration") ## ----echo=FALSE--------------------------------------------------------------- #A check that the chosen window still relevant n_divergent_in_window <- np_cp %>% filter(Parameter == "divergent__" & Value == 1 & Iteration >= 300 & Iteration <= 500) %>% nrow() if(n_divergent_in_window < 6) { divergences <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% select(Iteration) %>% get("Iteration", .) %>% sort() %>% paste(collapse = ",") stop(paste("Too few divergences in the selected window for traceplot zoom. Change the window or the random seed.\nDivergences happened at: ", divergences)) } ## ----mcmc_trace_zoom---------------------------------------------------------- mcmc_trace(posterior_cp, pars = "tau", np = np_cp, window = c(300,500)) + xlab("Post-warmup iteration") ## ----mcmc_nuts_divergence----------------------------------------------------- color_scheme_set("red") mcmc_nuts_divergence(np_cp, lp_cp) ## ----mcmc_nuts_divergence-chain----------------------------------------------- mcmc_nuts_divergence(np_cp, lp_cp, chain = 4) ## ----mcmc_nuts_divergence-2--------------------------------------------------- mcmc_nuts_divergence(np_ncp, lp_ncp) ## ----fit-adapt-delta, results='hide', message=FALSE--------------------------- fit_cp_2 <- sampling(schools_mod_cp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 978245244) fit_ncp_2 <- sampling(schools_mod_ncp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 843256842) ## ----echo=FALSE, warning=FALSE------------------------------------------------ # On rare occasions, the fits may not be illustrative. Currently the seed is fixed, but if something in Stan changes and the fixed seeds produce unexpected results (which should be rare), we want to know. n_divergent_cp_2 <- fit_cp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp_2 <- fit_ncp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp_2 <= 0) { stop("No divergences in CP with increased adapt.delta. Change seed?") } if(n_divergent_ncp_2 > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ## ----mcmc_nuts_divergence-3--------------------------------------------------- mcmc_nuts_divergence(nuts_params(fit_cp_2), log_posterior(fit_cp_2)) mcmc_nuts_divergence(nuts_params(fit_ncp_2), log_posterior(fit_ncp_2)) ## ----mcmc_nuts_energy-1, message=FALSE---------------------------------------- color_scheme_set("red") mcmc_nuts_energy(np_cp) ## ----mcmc_nuts_energy-3, message=FALSE, fig.width=8--------------------------- compare_cp_ncp( mcmc_nuts_energy(np_cp, binwidth = 1/2), mcmc_nuts_energy(np_ncp, binwidth = 1/2) ) ## ----mcmc_nuts_energy-4, message=FALSE, fig.width=8-------------------------- np_cp_2 <- nuts_params(fit_cp_2) np_ncp_2 <- nuts_params(fit_ncp_2) compare_cp_ncp( mcmc_nuts_energy(np_cp_2), mcmc_nuts_energy(np_ncp_2) ) ## ----fit_cp_bad_rhat, results='hide'------------------------------------------ fit_cp_bad_rhat <- sampling(schools_mod_cp, data = schools_dat, iter = 50, init_r = 10, seed = 671254821) ## ----print-rhats-------------------------------------------------------------- rhats <- rhat(fit_cp_bad_rhat) print(rhats) ## ----echo=FALSE--------------------------------------------------------------- #Check that the fit we got is a sensible example if(all(rhats < 1.3)) { stop("All rhats for the short chain run are low. Change seed?") } ## ----mcmc_rhat-1-------------------------------------------------------------- color_scheme_set("brightblue") # see help("color_scheme_set") mcmc_rhat(rhats) ## ----mcmc_rhat-2-------------------------------------------------------------- mcmc_rhat(rhats) + yaxis_text(hjust = 1) ## ----mcmc_rhat-3-------------------------------------------------------------- mcmc_rhat(rhat = rhat(fit_cp)) + yaxis_text(hjust = 0) ## ----print-neff-ratios-------------------------------------------------------- ratios_cp <- neff_ratio(fit_cp) print(ratios_cp) mcmc_neff(ratios_cp, size = 2) ## ----mcmc_neff-compare-------------------------------------------------------- neff_cp <- neff_ratio(fit_cp, pars = c("theta", "mu", "tau")) neff_ncp <- neff_ratio(fit_ncp, pars = c("theta", "mu", "tau")) compare_cp_ncp(mcmc_neff(neff_cp), mcmc_neff(neff_ncp), ncol = 1) ## ----mcmc_acf, out.width = "70%"---------------------------------------------- compare_cp_ncp( mcmc_acf(posterior_cp, pars = "theta[1]", lags = 10), mcmc_acf(posterior_ncp, pars = "eta[1]", lags = 10) ) bayesplot/inst/doc/graphical-ppcs.html0000644000176200001440000201176314563223020017570 0ustar liggesusers Graphical posterior predictive checks using the bayesplot package

    Graphical posterior predictive checks using the bayesplot package

    Jonah Gabry

    2024-02-14

    Introduction

    This vignette focuses on graphical posterior predictive checks (PPC). Plots of parameter estimates from MCMC draws are covered in the separate vignette Plotting MCMC draws, and MCMC diagnostics are covered in the Visual MCMC diagnostics vignette.

    Graphical posterior predictive checks (PPCs)

    The bayesplot package provides various plotting functions for graphical posterior predictive checking, that is, creating graphical displays comparing observed data to simulated data from the posterior predictive distribution (Gabry et al, 2019).

    The idea behind posterior predictive checking is simple: if a model is a good fit then we should be able to use it to generate data that looks a lot like the data we observed. To generate the data used for posterior predictive checks (PPCs) we simulate from the posterior predictive distribution. This is the distribution of the outcome variable implied by a model after using the observed data \(y\) (a vector of \(N\) outcome values) to update our beliefs about unknown model parameters \(\theta\). The posterior predictive distribution for observation \(\widetilde{y}\) can be written as \[p(\widetilde{y} \,|\, y) = \int p(\widetilde{y} \,|\, \theta) \, p(\theta \,|\, y) \, d\theta.\] Typically we will also condition on \(X\) (a matrix of predictor variables).

    For each draw (simulation) \(s = 1, \ldots, S\) of the parameters from the posterior distribution, \(\theta^{(s)} \sim p(\theta \,|\, y)\), we draw an entire vector of \(N\) outcomes \(\widetilde{y}^{(s)}\) from the posterior predictive distribution by simulating from the data model conditional on parameters \(\theta^{(s)}\). The result is an \(S \times N\) matrix of draws \(\widetilde{y}\).

    When simulating from the posterior predictive distribution we can use either the same values of the predictors \(X\) that we used when fitting the model or new observations of those predictors. When we use the same values of \(X\) we denote the resulting simulations by \(y^{rep}\), as they can be thought of as replications of the outcome \(y\) rather than predictions for future observations (\(\widetilde{y}\) using predictors \(\widetilde{X}\)). This corresponds to the notation from Gelman et al. (2013) and is the notation used throughout the package documentation.

    Using the replicated datasets drawn from the posterior predictive distribution, the functions in the bayesplot package create various graphical displays comparing the observed data \(y\) to the replications. The names of the bayesplot plotting functions for posterior predictive checking all have the prefix ppc_.

    Setup

    In addition to bayesplot we’ll load the following packages:

    • ggplot2, in case we want to customize the ggplot objects created by bayesplot
    • rstanarm, for fitting the example models used throughout the vignette
    library("bayesplot")
    library("ggplot2")
    library("rstanarm")

    Example models

    To demonstrate some of the various PPCs that can be created with the bayesplot package we’ll use an example of comparing Poisson and Negative binomial regression models from one of the rstanarm package vignettes (Gabry and Goodrich, 2017).

    We want to make inferences about the efficacy of a certain pest management system at reducing the number of roaches in urban apartments. […] The regression predictors for the model are the pre-treatment number of roaches roach1, the treatment indicator treatment, and a variable senior indicating whether the apartment is in a building restricted to elderly residents. Because the number of days for which the roach traps were used is not the same for all apartments in the sample, we include it as an exposure […].

    First we fit a Poisson regression model with outcome variable y representing the roach count in each apartment at the end of the experiment.

    head(roaches) # see help("rstanarm-datasets")
        y roach1 treatment senior exposure2
    1 153 308.00         1      0  0.800000
    2 127 331.25         1      0  0.600000
    3   7   1.67         1      0  1.000000
    4   7   3.00         1      0  1.000000
    5   0   2.00         1      0  1.142857
    6   0   0.00         1      0  1.000000
    roaches$roach100 <- roaches$roach1 / 100 # pre-treatment number of roaches (in 100s)
    # using rstanarm's default priors. For details see the section on default
    # weakly informative priors at https://mc-stan.org/rstanarm/articles/priors.html
    fit_poisson <- stan_glm(
      y ~ roach100 + treatment + senior,
      offset = log(exposure2),
      family = poisson(link = "log"),
      data = roaches,
      seed = 1111, 
      refresh = 0 # suppresses all output as of v2.18.1 of rstan
    )
    print(fit_poisson)
    stan_glm
     family:       poisson [log]
     formula:      y ~ roach100 + treatment + senior
     observations: 262
     predictors:   4
    ------
                Median MAD_SD
    (Intercept)  3.1    0.0  
    roach100     0.7    0.0  
    treatment   -0.5    0.0  
    senior      -0.4    0.0  
    
    ------
    * For help interpreting the printed output see ?print.stanreg
    * For info on the priors used see ?prior_summary.stanreg

    We’ll also fit the negative binomial model that we’ll compare to the Poisson:

    fit_nb <- update(fit_poisson, family = "neg_binomial_2")
    print(fit_nb)
    stan_glm
     family:       neg_binomial_2 [log]
     formula:      y ~ roach100 + treatment + senior
     observations: 262
     predictors:   4
    ------
                Median MAD_SD
    (Intercept)  2.8    0.2  
    roach100     1.3    0.3  
    treatment   -0.8    0.2  
    senior      -0.3    0.3  
    
    Auxiliary parameter(s):
                          Median MAD_SD
    reciprocal_dispersion 0.3    0.0   
    
    ------
    * For help interpreting the printed output see ?print.stanreg
    * For info on the priors used see ?prior_summary.stanreg

    Defining y and yrep

    In order to use the PPC functions from the bayesplot package we need a vector y of outcome values,

    y <- roaches$y

    and a matrix yrep of draws from the posterior predictive distribution,

    yrep_poisson <- posterior_predict(fit_poisson, draws = 500)
    yrep_nb <- posterior_predict(fit_nb, draws = 500)
    dim(yrep_poisson)
    [1] 500 262
    dim(yrep_nb)
    [1] 500 262

    Each row of the matrix is a draw from the posterior predictive distribution, i.e. a vector with one element for each of the data points in y.

    Since we fit the models using rstanarm we used its special posterior_predict function, but if we were using a model fit with the rstan package we could create yrep in the generated quantities block of the Stan program or by doing simulations in R after fitting the model. Draws from the posterior predictive distribution can be used with bayesplot regardless of whether or not the model was fit using an interface to Stan. bayesplot just requires a yrep matrix that has number_of_draws rows and number_of_observations columns.


    Histograms and density estimates

    ppc_dens_overlay

    The first PPC we’ll look at is a comparison of the distribution of y and the distributions of some of the simulated datasets (rows) in the yrep matrix.

    color_scheme_set("brightblue")
    ppc_dens_overlay(y, yrep_poisson[1:50, ])

    In the plot above, the dark line is the distribution of the observed outcomes y and each of the 50 lighter lines is the kernel density estimate of one of the replications of y from the posterior predictive distribution (i.e., one of the rows in yrep). This plot makes it easy to see that this model fails to account for the large proportion of zeros in y. That is, the model predicts fewer zeros than were actually observed.

    To see the discrepancy at the lower values of more clearly we can use the xlim function from ggplot2 to restrict the range of the x-axis:

    ppc_dens_overlay(y, yrep_poisson[1:50, ]) + xlim(0, 150)

    See Figure 6 in Gabry et al. (2019) for another example of using ppc_dens_overlay.

    ppc_hist

    We could see the same thing from a different perspective by looking at separate histograms of y and some of the yrep datasets using the ppc_hist function:

    ppc_hist(y, yrep_poisson[1:5, ])

    The same plot for the negative binomial model looks much different:

    ppc_hist(y, yrep_nb[1:5, ])

    The negative binomial model does better handling the number of zeros in the data, but it occasionally predicts values that are way too large, which is why the x-axes extend to such high values in the plot and make it difficult to read. To see the predictions for the smaller values more clearly we can zoom in:

    ppc_hist(y, yrep_nb[1:5, ], binwidth = 20) + 
      coord_cartesian(xlim = c(-1, 300))


    Distributions of test statistics

    Another way to see that the Poisson model predicts too few zeros is to look at the distribution of the proportion of zeros over the replicated datasets from the posterior predictive distribution in yrep and compare to the proportion of observed zeros in y.

    ppc_stat

    First we define a function that takes a vector as input and returns the proportion of zeros:

    prop_zero <- function(x) mean(x == 0)
    prop_zero(y) # check proportion of zeros in y
    [1] 0.3587786

    The stat argument to ppc_stat accepts a function or the name of a function for computing a test statistic from a vector of data. In our case we can specify stat = "prop_zero" since we’ve already defined the prop_zero function, but we also could have used stat = function(x) mean(x == 0).

    ppc_stat(y, yrep_poisson, stat = "prop_zero", binwidth = 0.005)

    The dark line is at the value \(T(y)\), i.e. the value of the test statistic computed from the observed \(y\), in this case prop_zero(y). The lighter area on the left is actually a histogram of the proportion of zeros in in the yrep simulations, but it can be hard to see because almost none of the simulated datasets in yrep have any zeros.

    Here’s the same plot for the negative binomial model:

    ppc_stat(y, yrep_nb, stat = "prop_zero")

    Again we see that the negative binomial model does a much better job predicting the proportion of observed zeros than the Poisson.

    However, if we look instead at the distribution of the maximum value in the replications, we can see that the Poisson model makes more realistic predictions than the negative binomial:

    ppc_stat(y, yrep_poisson, stat = "max")

    ppc_stat(y, yrep_nb, stat = "max")

    ppc_stat(y, yrep_nb, stat = "max", binwidth = 100) + 
      coord_cartesian(xlim = c(-1, 5000))

    See Figure 7 in Gabry et al. (2019) for another example of using ppc_stat.


    Other PPCs and PPCs by group

    There are many additional PPCs available, including plots of predictive intervals, distributions of predictive errors, and more. For links to the documentation for all of the various PPC plots see help("PPC-overview") from R or the online documentation on the Stan website.

    The available_ppc function can also be used to list the names of all PPC plotting functions:

    available_ppc()
    bayesplot PPC module:
      ppc_bars
      ppc_bars_grouped
      ppc_boxplot
      ppc_dens
      ppc_dens_overlay
      ppc_dens_overlay_grouped
      ppc_ecdf_overlay
      ppc_ecdf_overlay_grouped
      ppc_error_binned
      ppc_error_hist
      ppc_error_hist_grouped
      ppc_error_scatter
      ppc_error_scatter_avg
      ppc_error_scatter_avg_grouped
      ppc_error_scatter_avg_vs_x
      ppc_freqpoly
      ppc_freqpoly_grouped
      ppc_hist
      ppc_intervals
      ppc_intervals_grouped
      ppc_km_overlay
      ppc_km_overlay_grouped
      ppc_loo_intervals
      ppc_loo_pit
      ppc_loo_pit_overlay
      ppc_loo_pit_qq
      ppc_loo_ribbon
      ppc_pit_ecdf
      ppc_pit_ecdf_grouped
      ppc_ribbon
      ppc_ribbon_grouped
      ppc_rootogram
      ppc_scatter
      ppc_scatter_avg
      ppc_scatter_avg_grouped
      ppc_stat
      ppc_stat_2d
      ppc_stat_freqpoly
      ppc_stat_freqpoly_grouped
      ppc_stat_grouped
      ppc_violin_grouped

    Many of the available PPCs can also be carried out within levels of a grouping variable. Any function for PPCs by group will have a name ending in _grouped and will accept an additional argument group. The full list of currently available _grouped functions is:

    available_ppc(pattern = "_grouped")
    bayesplot PPC module:
    (matching pattern '_grouped') 
      ppc_bars_grouped
      ppc_dens_overlay_grouped
      ppc_ecdf_overlay_grouped
      ppc_error_hist_grouped
      ppc_error_scatter_avg_grouped
      ppc_freqpoly_grouped
      ppc_intervals_grouped
      ppc_km_overlay_grouped
      ppc_pit_ecdf_grouped
      ppc_ribbon_grouped
      ppc_scatter_avg_grouped
      ppc_stat_freqpoly_grouped
      ppc_stat_grouped
      ppc_violin_grouped

    ppc_stat_grouped

    For example, ppc_stat_grouped is the same as ppc_stat except that the test statistic is computed within levels of the grouping variable and a separate plot is made for each level:

    ppc_stat_grouped(y, yrep_nb, group = roaches$treatment, stat = "prop_zero")

    See Figure 8 in Gabry et al. (2019) for another example of using ppc_stat_grouped.


    Providing an interface to bayesplot PPCs from another package

    The bayesplot package provides the S3 generic function pp_check. Authors of R packages for Bayesian inference are encouraged to define methods for the fitted model objects created by their packages. This will hopefully be convenient for both users and developers and contribute to the use of the same naming conventions across many of the R packages for Bayesian data analysis.

    To provide an interface to bayesplot from your package, you can very easily define a pp_check method (or multiple pp_check methods) for the fitted model objects created by your package. All a pp_check method needs to do is provide the y vector and yrep matrix arguments to the various plotting functions included in bayesplot.

    Defining a pp_check method

    Here is an example for how to define a simple pp_check method in a package that creates fitted model objects of class "foo". We will define a method pp_check.foo that extracts the data y and the draws from the posterior predictive distribution yrep from an object of class "foo" and then calls one of the plotting functions from bayesplot.

    Suppose that objects of class "foo" are lists with named components, two of which are y and yrep. Here’s a simple method pp_check.foo that offers the user the option of two different plots:

    # @param object An object of class "foo".
    # @param type The type of plot.
    # @param ... Optional arguments passed on to the bayesplot plotting function.
    pp_check.foo <- function(object, type = c("multiple", "overlaid"), ...) {
      type <- match.arg(type)
      y <- object[["y"]]
      yrep <- object[["yrep"]]
      stopifnot(nrow(yrep) >= 50)
      samp <- sample(nrow(yrep), size = ifelse(type == "overlaid", 50, 5))
      yrep <- yrep[samp, ]
      
      if (type == "overlaid") {
        ppc_dens_overlay(y, yrep, ...) 
      } else {
        ppc_hist(y, yrep, ...)
      }
    }

    To try out pp_check.foo we can just make a list with y and yrep components and give it class foo:

    x <- list(y = rnorm(200), yrep = matrix(rnorm(1e5), nrow = 500, ncol = 200))
    class(x) <- "foo"
    color_scheme_set("purple")
    pp_check(x, type = "multiple", binwidth = 0.3)

    color_scheme_set("darkgray")
    pp_check(x, type = "overlaid")

    Examples of pp_check methods in other packages

    Several packages currently use this approach to provide an interface to bayesplot’s graphical posterior predictive checks. See, for example, the pp_check methods in the rstanarm and brms packages.


    References

    Buerkner, P. (2017). brms: Bayesian Regression Models using Stan. R package version 1.7.0. https://CRAN.R-project.org/package=brms

    Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm

    Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. J. R. Stat. Soc. A, 182: 389-402. :10.1111/rssa.12378. (journal version, arXiv preprint, code on GitHub)

    Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). Bayesian Data Analysis. Chapman & Hall/CRC Press, London, third edition.

    Stan Development Team. Stan Modeling Language Users Guide and Reference Manual. https://mc-stan.org/users/documentation/

    bayesplot/inst/CITATION0000644000176200001440000000201014127610043014355 0ustar liggesusersyear <- sub("-.*", "", meta$Date) note <- sprintf("R package version %s", meta$Version) bibentry(bibtype = "Misc", title = "bayesplot: Plotting for Bayesian Models", author = c(person("Jonah", "Gabry"), person("Tristan", "Mahr") ), year = year, note = note, url = c("https://mc-stan.org/bayesplot/"), header = "To cite the bayesplot R package:" ) bibentry(bibtype = "Article", title = "Visualization in Bayesian workflow", author = c(person("Jonah", "Gabry"), person("Daniel", "Simpson"), person("Aki", "Vehtari"), person("Michael", "Betancourt"), person("Andrew", "Gelman")), year = "2019", journal = "J. R. Stat. Soc. A", volume = 182, issue = 2, pages = "389-402", doi = "10.1111/rssa.12378", header = "To cite the bayesplot paper 'Visualization in Bayesian workflow':" )

    ؝yeԏ$D,BVaL,PHLOX^69ֿ0T6m ϺtCy|[#(<xA9a1WVR}Ffzb|&)"Pޠ-hF%8 &ƈ]tlHJhzv ) n tX* á)1C T- z59| eD[] #*$#|eQ{=zftgTQ!vհx́]pH_VVq!/D6UFU8'/@ i?SC2H  )=۷ DW `6,DXDPAiZOnAPk=^5A7Ph#Y@o>j;D"8>pxPGt7MQB"biqN/ݦ%Z&ʭF̈́nRYkrMdK0/L#ף@Z'%`}HY8DpQHwwTQGa5NBz*B11}7}ãaB0I$ fȀ)z"ԪXUa$LHϣ@?@7z jNP,(4cH]I EaX;q!#])cQe "5  ğjUR9{0gU *REmv?K,x}ׁN~#$iVe '\ ,ѐ6@сPc<QPؘr9uDVwVx&]jnB+#M`by\6DzڈI0LF._k=| d bHFP3MֈBVD9lh gh4Iʠ=k\D?hO5@e5UnSx!@~YTWCi*I,@rd<&=f;RZ"6 HxhK9DtvH"iO'@]m @Ͼ#  ꮺyE!xuF0/c0426DM'iI^Ԁ0@z rTF "tk(LܙlB(2 萻.(Y"."f1+ Qw@b8$8m?R%SV`fWD"-55n4/ ͇I $@`!EC(+6 ʐl }W$1hu4r@!ZU r@1"=`LwfA֢cZ%ǂ{s\7@>@Ur}qt)(Bx_P;5}AT0#̉4߰ D]$Uֱ7z^Orq:p!@ңQTk8GfpF - EC}k$ʤ aFdaW@F3c@L(niU%wu l,@V\ljuȶ9DA"|"1V9O 4i7/1lFE"ͬ sBIl LdYu9 Ԅ=mDሡ!T@ (< Ly홄a{G352Rwlq ,TaW[:1),#ci EtBX# Y;#BbB>>( "bydmVB򲪴R$I!&HIZRPJRC豨UQ(Z[G҄-4ЀU@QNg&-h5ȍvk"ZV.#*:GbGI[{gۦpl$zȇ"Nq*duJ $MM rE+l5,}R"+ "T-%WSF&yi,f?"6cD9ߐ4M1Su"qn 3'Ev:DFi #{mnEa$QlJoGɀ"3$RonehNҮ G zPx(!Gu͗8_MeT"!@umW$c-KZvebR$vHnr9m*"pF^W"EUAĠVP7%]@Dz:/~I$E QQڷC+$+#B΀"'H a'WkX=3*",hYѕ#*U 1f^m}v!UJ]~0ArX|4@'Si}@ !;]8rh*G=:b. DoKb)HwDuV@ yS "y~)/> $BWѧ!@P:ZDXncC8R$&(t{?HCjVpYECDgTՔuqQl=U1:qjKߣ# aYن2M\b2Y5`Hd= ^;Ȗgꇔ:"l7OW粈pXIFT#@ B3/chHi!f8=O8|:hk!Pܨ DrJ;=hōB2:M&1#p) uuc08%U"  4?ȓ DH"~rMTd~U N)lm{Bvr4u@EPP UXI PbMXdT8 ݭJU#>=3hDZD /*Z @ |AVb1hiDDgb@-Oℑ "&ιGYUޙ搘 GB-r:T#؈t4y(L?E һ]O%&4TDEfi-uE "vfPHWx#>;_QIDĎpL)RdaW][-_C>aZG⾖4c (ٶ5F)[X i9*w~'F4 d?&P!buh R"ii*h No8#trMLDĸ #P#@E-4|5HFXƓ wP/B7Y[uV86@ƀQ%^FueqjԅЫq^P OU8 Q[EbNDG$W4FUcY@ 滨E8 D ~\$kȓf49%n@ l[h%ANF聍؃@"6M3wW*"y` :['F-"tz(TЀCRۅ\Is"PDJ0 ~Hl>x"K0-Nuȇx@"#$ JZZpPb]!Bl<96C0D4~^8Ï1x@'e5'j`(qeGGʈ1?JDm _ *4pC* ܺ~N!wޱ!`XeFiS8R@j>RwhLkOQ=pn ]3t*ꆈ@kA\LL c;TFJEzS@_9h(J#rl{ثtu&V ?m7<(/(5gwc0_O|nUUz=Ds2@(,G8ՠ9<~Ԏr%UpG}$طo"z Z5DD#(퐚w:GI&q!LGmFiZ(#h`il>꼀ܢ#Fek@i@>$EH MEsBHb/ BE@Бt-(I M?m[DoxD 3Dp| ~m\6Ob&6 0( "R_pB,9g1H #r v@pY{E2"%``S(Dڠ)NdžDSB1L"_"@`(4*9H2'&B#CDˣT.%}5Mnʒ ]"ƇԈ9D`|DWY?DWT< Ö }ʕ(֡V|!N^DE 2zƮuGFH@ c& қ)Y5I1I 6iOCG[$c@ Pd w7xbPxP2K# B蘋B^@yZBV?c|{ZA9#GV`elH<( LHihhĠ-;"(Z"z(B\Z:EM@\Xivz(%]ۓijHJlF!qK#]@Qn/@2=ISޡ-0B¦"2ۋ@5@IBfcG_a2# [R 'ζ({z5 GK :D<56q3g_Ll ĆSTUcy98"ESI{p 'FHCCAd*ǔ 015^@ t;Snx]4s z4D M!s+x뺁/RC.0<"f8R@!R2"oШ Kj)H@ț/"1$/0P>3Zǡ@Cj-(xI"gu$פ0`@bf qH[PX/!Ri *'Hr!bg00E tu</kQgApڸ iU]qF2.j#n &!OZC7qsMXaR&"+NZ43KdqUlX*g?rG*bwlOJ遳|aH!Lo +,ĽJ<}D =.w, e ŝͧ^ふ! -Tc-ptUZXcdK * %9mENp&oEx!a#FU=:F J;sF>IѷLp*{+_Mm*PrN.GMnf[ksjTbvbv= P܉c8P!QL:,wGg{}7 %8 0LLQ!G5мep{nelo;L 7"l8tcIJ)4v]H+ Vuw)}")w%RYgd!ӛ=I Ʊfs>w}2 ̨$w>Eb풼0plQ֯ 6}3|׸z&E:^fξgaie/9mHya%ФыxVi+ҡDl}ޗa-Ho1gtL:[?Du?ã}@Jl&Knu 7xoW˓aWgJ z'!Y88 <¤Tpo,Ǻ b( "΍=C6 L5,CͶP/ 4kǾܨGo*OuT IT[揽v'(nXdKwQzaS.C^:(=&"~ؐ@#YHw3_TD ; ݵB@լIy@HT7a$@4G_P_3 $9;'*\2} +D [؁y⒱ʚ,j SѶw۝bלʢyM-f qo1J[;%ƮcQ3WtU*1k$y5Hʰ\/KZu4@/JDY!D]d m5@{uL=/XDA#&+r&] $HU^@P\=^5: ubq!CBD]&ļj^UZ\ Z?S_djXX j@EêDG%!BVq b Jp[`P,mdCĶqZ.ҵDž!P.-cu@QnLBַ]p]KFb6:0ՌFZ]Ug7MЊ/ⶡ@zVHï9*n#PB(^pw9r".(YU7q7T&ӽHJXrb{{GD0#e#C \`0(囙8 z"ʌϲ aҘ!h JX&*(Tj6xGZd " cF؉,"/7nQ#|NCH,聱Mfibj^\bQCK5G8% 򈌫8$QOX@nЃ}ӁHHԭm8UBVqю.:Ae'K![U01ؕ;^9Dz#`1H:v&ʎY7+r. &έ :!ZS#@FШ!~B 2E1~b}:G5YeNT18;pڣ@aW b'L!@lFXb8T΢DM-2#U1v?tr$> )+Z*'W{܈찂@SDcgP>c5qW"qbu~Dr/cDRdNt+ !F쌡Uoy"\D"50@ȐJeϸGvibA i)5yHry#AI[$R:wZT <=6&' DQEQ#ȱ, ^:?Q@̨6HzF V #xE@1?]AvAPblshuB)޴k)<iE:ۂ3`brU4ec/ 'cV+1ڈǘV?OQUl#:׈H6dz멮Iz5'"[]:,5-#@jZĉnN"_GmDG͂\$(f"):F e +,"_Z`G$4wHb; qW`0$ t ܑPL&xN&ü-h0hK"cHKQ8JQ٣߰·Ț/>dr 4M7qVG-gv{m +f,N J#ime<+)BKK *'22pHD<_Pi8n! 6(x-:7^Fxl𹸋(rOc"eHQ[@npDv'쵊.NǪsZ6̈$(`Q!Ǭ/^8D %_@ё‰y>}[DCE $ ֺ 󀥩2G[Lz/U^!D+x("jslE 5\ ( #bR 32hIDd3&mLJao5&+dq?{Tt<ȋr%0> HGz7~ RĎ(xw hj,|ȗ.R4#h 6iBfLxĉFXD=pWGeTШ)B'6^*]`F{|zDqbij8WV"(\2ӹǖ[4ll [c@X." V&8H6 @RiO6{;.MWe-֒,ל23 ##ӜqL@ǣ1Y[w{" U&AU0FV >Yˋ?R4wS[~$ꆼ z(LQ,~݀˻.lZ"`m#\h>zuXt }{{gNюӚ+m!4](G؟龁&.X(3 ~4Ctָh'h-7Kq.d .XbUWg_tj=uP|B.oFɍȪ%B MJnQ0PW^ Ú4wJU2Zωh yՑ k7YIeV $r}͡'*H3QfdXLT2{`J0>z2=FGl /߯-?gc7"D5 XD:5Z$ɲ,s77i)&6IUz6<+h0S@-[X̻mTDktR *PVhҔaiYsPl0kV4@nop0LJ܌0]0[f9 oTǯL~ךuvz v:eޔ#"W b!Tq:}5767{hB6:0H OL2ȶ;}C$<4 U%@IHJ;b=}M臹@iFL\ 02 aEUhDL!&@F'.N9DyMU_qt:.#rHq#β:oTY '_qΘLzr#8\LET9d*OMW~N0@d('xF逷j{ԪMa_@B!\݈lO3{Ю( Z:rhFcp7H PaUʚー|W:s@Mj. Ժ J\Zk[( LBbю!DfYt 3 "p@ SXQѢ# /!!@ MAmbjh{[z 3Fȏ #WD"~.n:#?H~it|"jq &.b XvynX*v7 2mq ݍW"\Lg9P8[J!Pe@FQR4G?*\cB-pBX+cQBX@0Yg r0€}a#Z{_"yO 1D->F8߫AW_ VM 4QPPhy_y4C?Q&hO!/C <{H nˇjqʡKF]{`wئS` Q"aԇa9G?`s&HiWA MqFa(x 6Q-C-ab>R§"xtca F2#.طAD]U o`-LDݱ?;!Dk5{]Vzin 3U|@La[Ly/r^sIWJaB K *[]Ijr]DE^'*FTbh'(6٦ r LM_P6 6)kG ۰o.;;=q6g6rrrW ƞT/Y2Axbɠzȑs?YБB?BltK>t{lot51m,\)v'f v_D*GfCȉ5S6r&ȵq9DVΈ qsT4j(cma/~HIUy82 Ez,G2\kٸje5q@0ʂBu!A6-Z(r Z (*LŘzBCΣp'g:xᗹ\.jZסB;Bj!-0!@WQ$bp {HT*}U6gф.x&vHV1xoQ=Q㿚'$]GxHsbڳH6(({WTp!B }`({L$[5;JabFqte(DU1 D+Zm }4N R t_}||,bJȄA .h b/|·; "tߘve6N9S1OXF @Ibq8uW Z/ 6j+iJ/^t9 1bfɯy!@QQTpHjГ]JGo ' T?Ԁ.D 37DQD~-f)G2"O`(1ʠn(t/6@PD#M%K!1Qw]ǡU[%TX|eq»8%CEk%jS;.^!6Y3rh!/ ״Ij lyYQ[̆>΄@c3>}c rZMZLՀ=.|FZʥ<2w$"sMM75 Go+'hTrViЫq',rj#9Ԩ!HF%o+`R.G'$*Oz9o"0 :aJ=ά0adaJ[ &>Pu@|P[YO"o^EF@(WTEyӔ4R6&k;j_ :Rѭ5n12J>=墶փ#HDP9^Tm YJ$R/FxR2u d|3'-4|캔}s 麙ZŸ?h@J96ysޟ\CLYNyVZ"* Ml"0OOP*=jk-v/QB`*ԝ6~&J+.*𔫷9 '`Hus12~xuQiNzQ0P3爮!U5qFstkLeZS8qp hБ >#8oz#*!YPT4g~Yj 6`_-fL]1T;K2%V@"9h 1LY SO?|svfm7֥&4DN1'oU24g*Hfa9ZlŨk+ Y[MYb.ޜD,݅o%WX6Tv~}6Tuz7UQ-7ic:uX.:{H֑<{<X~7T5t*1. 4}P·g?(Yh) 1  c]3@E)-=PB'fPIR\ 2[ރ}<DW"5kahJ , ƈ쭚Ecnj2$mFDm38&j~i`Ѐ]_d'? -]T0<%k"ba#όu(ްġS7( #1@J#b⇏P^HKfQݯAߩ Rk/zKnj;FM5%DіXTTUT6>{IT)32k[aU/ $mQn׀ 5цTHP7`1lz,v6)[:S)xIC^rSZDgByF4iމwLݩF1ppN>t웛&[w9}}{@}_RwG2h/x5>UUrxp{aY_jχ85>vB#4_bA189Vw~]?*R.!n(F9\L^2(j #5C Vxb݉Y1zrfu1Z:q V&rV$PrG/xMd*4<54R YG}?԰_aB #nxJuLN&;r&c v#Ϭh.(7G7}i-g3~(ʈ_/aHը b~!u>,-t  ʚ=#2j8So7flkV+cH44Yل#4-%:, +R }z"7(#V̈7(Bd;,`Ttď }}xԗS!?BTPe[T*ڶbԦىCg/ @Pou;*Sb(OU!+GScA9#t `aKy oB`;*X]+ d~3z$VC0Z4~c  exz lH R$׽@p!14<DHW4 ?c=XEQ&BU<=qB)2 $W4-!]D/l\3>3T )rؠ`8ޤ- :CBV{TEZMW$.FB8&3=#+D>D+1-3{RjANXɦOo&ypUQ#T(H?]< m-WX6eښg1="?P޴81U;(jŝ\jcB[tׄQ"*g7"ɤ!$ T; ᭔KMlu?vHVV|ipF9'K)cwl,T: Tsj?펗?4xh\Q4!`۱(q|~,*͛a;B߻tN1tϼc( /FMWd,/z6ݤ$1{=;uCJVh X};hgXt&2 +jį00r!G2N¯m^"?C Dz%PpP莞IX[Э-"ET$lf d~ط~L r2z6tdQr^zFjEbcS D֨Jrn&{(ǚl蒘_ bѼǽ0(e4>V>㥱0H~ 5T# uzU.Iv50SG1r)Klo%Tޢ)2ki{4M4G @x4%HAɘПxGq ejƳ~?>! <.+&H`0v~J-+|yhO#R3[؃c,V3/ƪӬVi*_} pcll?OLh޷j w:-ho˭B(4!C@R-cV?@yT<,VZ4j!Guh֣XohAZF =w@3H9R$()xl$D4eM~Op0j 5ydM|фŝYqTtj] cOVd)CmbbscwLwȝjڣɰ|(W<*Qp"u4N]CZ15梡IXT zeLT9tXR=@MPiWo s f 濢tRhuЀYN Ճ |E+^x{4B'cDNUJǥi- :FQ\68fj/.L9zi>u6Dza /`GV]nk8wE@>\?[|Eyi$-^ߝ@cJ(*N<)Ԧp7[|a6Zu{܎O|3b?m/H q!qtmKRZLc[ݎV͈7CڄɻR}q #x2wޓG~ޒb3S ,SP"$KN'̯#aBLSzmN_# ""/8Lr$hɾmO.b<[ k M\ݣ;X s>lHQG@Zun" ÿ?@7TOœg%C؟**6O|Wt4)j41;'gTs`{A,&pأwnUZ]y7G]-x*lo5 5D[~2|c!/D n{&x]ðA>fo%48e.544]"%m|^Ɉ=x\C@s7|Ytk*qZnMrUߜKs)V#[{ .]mxZ*߻3>>*ە}"T<:F1dj"N0Kcz=-K^|>€;*k8x('^ڨ!hBV bdjwޫ1Ӕ7_ܔ+d]$Z+gEu̧urQs W-, 4MH6xDz*,IՅx_Jo?Ys]|y;5=UN2dY$+<ֶ絎pB/{|yTGcEa]-꺝cBty_ckzk8$Gwa4tǻڲD7QlSL qwYQs~.Ȣ(7خV<om'9Jp fF+>FQM>"h~{43JqJ~o2)Ʌ闊Zqj~>B;@B@o%uvJv\j#\4k"+pe~fR,[?Yjc;fǕoX ?Rq}hjwS @Jْ*~Y*ZyCoޞG]^p46j|d^a=WsH$:2-OԢF_cFcR5U)vQ1)QDg޺{5UQ93p@\9X$H? n/XW~"8GK8bt g<;xMUotbUa'Ѡ&;*21DywrWpX"ֳ `s\ܰFOo,KK410hh|4nBO>"ӊa^CMáVG?/F!~W'qh/Nu1mU˹oV6 F /B^|9HޕށpB5c5]Qgob%]ex FڠN[ ê#DqaSaG{jAS,S ӪeU7H+ 7q<~)zx^#ۧ8Xѥk)Jʯ"==vn2adq^_5|%fNJ< J}b!򣣑RŗBtͻ'p3qV IE#C(N(D8W%0+tsz{ lU  Xr¤ <^?twW!tp.8\o9>\c$a~ɡ{ʌ2h0)ʜ,440wZ 5]]W1yT&|)A!$ເxfc%DBјFKn5Cl`-T M9[ުl!@O(q?>KV>gKwG.q;؃;Hy3@C+Jaa`G@Te8xKЍ,wsẰ`^ufa)F(ߋvF!p=~:Uΰ?=Gon"V59f0NABNXکMQШV'HRM4Y?FVB9Ef\,V- g[^j'z5P49:;1&.nC*\Qo"[+Gm]rHҧ&bqRcQa}:hnVDŽwND[0`{)=;i :d@Ah.ݔ}ԾhޔytVT-J*n\$3Y+Di[~bTj`-gLL*;ˀVDo-k٪Z&Mb_e@lme BW&zݍ᭼DI7j孕XMDxg|<#Tsi7p7Tx\6 qFx_诒(vc#\DsKn؄ׅJ6 |l _ 7R{KymCXX5w8{2 ABËiDQ(F#qmc21ׇ1Y϶pŽehUWٔ3/@!6Ȱ1z~U4R"y㔊50J35<uRp5uP! i{ľJ3Js~g+ b]KP׏ @{[YFsY+G+cZf7|U3 _TNITWBNu, 0}!8vͩykVe۷% !CmiT0Ys\D[Fbc4O[ބW;\,Dԩ?tE^zmcb8À ?{c:=yeb1m_pi>f)bǫx?j5Є{QL!*p\=Eȟ/)@vܷQ vOu,f}q{rO6~\!МkbowI1^{RaYkq/Ch-cS?u2}6`B:GvƱp + z*=Ӝ?Ȫz։*p7 Z-.X]Wl β\t]/ΫEX6~˃}4b@Q"^cF8t|+Ulot]Uv:8cӱ{2*"֘"/"foo:(f)Kڀ1ѯ-k_KIG}1#̜;| 3~\;jNҧ(LgMZ\N\dP}pIH1vƓ{*3h 'xWx_' jF.:sW%]QkO\g=:]TBެ+23;3ߨu~pU˥e%O606:Z(Kfs(מ ?ޘ ߨ_n+ +^2YX'um"@>d4J٠k!miuRMn (P!IkWkƓ(hvIBEGΤb"oRBR*]\F_6߽UgcJ-JlRX/e. 8xRӿa)D+؁ .Ӆ}]4ɼuvJEO{bs[_8Ec)@AEd9cg\3.mK9Hc l"Ye'"њQ,×'2Dm%mTō# T7DL[5ZoIssl3qmC4TxQLN-9aA퉕?2i~UN58f̫dO/.|#fhx lt#lAjpipi>Q--H8`6~+] a+#ώs7 "i)uzƉT UT]hO;:$/K}'᳀B:u& {IPo?^i*oQˈ!8Wҍܦ㽼];v4/{X8d1W];uea^7T`:-[ɣyf#6>njuhyR8- e,m*4QSab>ф"*NnFYN)% 8Sfgmku퀜 \hPSOC](1¥AnzGId6T&z?Gc͸2YL REb6#DXwM,jpz^]{ h`"ftÁ hz٤n1eZƗ[w`mU, Up},[侷UsS>#g߻H|#xDl1I=08Xdm:6vSegS}=#]j YFС~82)T`FB0[ ٱU-e mZ1};Ii(9F@Kw3 4fNC-U#@(6_Is𾽨esǟ0v|z0`~42o!i@D 3'w*Nڪ0 ~eQ+_Qa_MXQI<mB+tPkO/w2U$&80}1nFa؛ H.&*s"c9R%$ ӨS\GMnM ?L[zQbϡDq:Yfy[[!edzU@{Lye3Kk V=z IDP-/Ku*. ʷ?K솪 ßJfҘMۧnlN@nPeup2ʐ+ 0,b;yˎwU6c!>5ڞ9JUu h$z㌎Gi3K-0nPڦ81,eV^lwH,dZc #:\7R4m0>kp|| >5UJu=䈺5 %NCGjYNڱ 7v4/ }q xtr?uNmŭlh[TH ʖs O~j"7={4/M5*r]7v6} aUej(-CRELBug]3Hˁ;>>$Re?9Bh?шf[(f܆HԔ6Z]?t?"TwQ8zU_URM=/}Qł5?Űqns^4UcܦjpRtѧ!]C$9bR$ GBYyV> }?.bxg󖴛qa1h}9^F!0mu,#mv]1%FZVi$3uDe[}ZmkBRm (%/hpTǜ|?CXkEZ67qIlk]7LsH!]od~!bDf"9>#.%zWRwQ^ڄD %vߵoP*[ɨGz=vbq{sA/z#z""WF[3exlm'NՑ0و7Gwjy |i|Y[ Ս ڶĥ[']$j@ }39wzcXt4pV99$/_nu}|)Jt`2`8O@b60WSWnVqEݞR+g)#6%{˵u-GcZ`(#iFLn}t?צwfOG/X(7do XN1>6*hОh;B )JnZ'9 ٮIm=ٺ s7pk ˳UYpׅBvukmkC!&i yi8T ̙؍̫gpx`^Wd=uV*݇ 7?НQUs}{b2߆cQ+Ka2; iqŶ~RFe cTYWys߃ӟsʧ'ވPmɯfñ!hC%xq,"KCcd #ٗ{Yuݰ.U _N$U 8b-z^G=?Ic nƱ9X_Q!5BO*ia꿸[wzFkza:6bq&"FfcU9;9,w6 >k9oGm/t3OyU9bu44vD=8XRk$t&*.QWj B:|]{ÑrD7ia%CSڸH}7Zb7 ۭ3&M-jP >Fkyf/5*n;H9?Z& }*iUA>׶rN<B>nVgMՌO){m|UYS+kB6e"]Un-AW=9*fauUyk*BeLiŤ׬oj]E:W{oШ]k:1]׋`>~2Hn/LswVy*;szK J#OI[=D ]P&Mmd؃Y)M0lt1Z<5DsQl{KNH gyÆKT7C_]S3-šneVe)MӣK0nO wSP"W?BBiK0ڍn!08WK(tFĜ(IGJamNp "NeH’?TtclA-)$ +n{D;l*NRcAD4'drN+L6j%m[$Y=ĺׂ\V_e%c3v* -_RҝF^9́t|K":{W\Q֩Gaʻb,:P`RGWYx BUOm10/pܤL e,ߏ͞/^x}>*X v#AYo}v.}*v^4dC+v"Ǥhl'v+=qS嵵-EoʾU'i3iv}YnHqú9lnZuE>=)FRxNZs5i{҂RY,xب9UEsC"*7aVی u>Qg&WVb,wk´UZU᯶Z9s$R6ɦ'S/ }rCeAP|ϹV˯_:}]ɞSŘ]Ӵ+A!sƭ&vWUpߏd]7pOZS+JBKh ϖzL.cu-a5˲Xm6; $VMj'xr~]c~%qjOQJXRX oTz_<^g[oŰ ֩(A {cDAd IEM:l24€IǪN (.r^mK7^?jWΌ}1]FG}ml$i)w]jM|uӿ>'^6=nS;=uBai|ʺQ߹MO^!(;\  ggtyv!mTlD Xm-S2 RqҺ7a<9ҶgNcy(JtHdYX ńuSl$[N۾cH>+EU@SVBS]TgBձlNt_V G&hf?lu`1_>m{ lJgHg9zĖ:wltpOFU5K8K1xMW"Žki8q3p?F rB|tK~g J1Wĩ7f)%o8/a =8m=QmXn{( ѤujӒڞԞk)Ԗs`Ai`hx^56hK1 bUuﺶ|½Ѝ~3epx}1g&wWZ̾  $IsTgm'ښ{ᬉI ԄC7;@ss @ @8yEd=ulj]?M6Zkʣ{N1y:Ǧ U1*\jy~0VsZL'ox+hksO.e +KF~u+NkfOޚԶ8#e0!!?D7O?Uplmz?јLjy'#~>xzUṙ0y8׍BΩ%aPF0n;į*#b8\SI"#!6W$HMXgɡ=c`) teģ]J"g,AlxX%U| u1nE({#ٛ&Ӹ V[cV?yVerC3jXՇ}.֒DJ|Q]tzhHjh/V"O!iJyrj)wNRl9 ȨҎ_bm.' yr_dߋ `ȣ0Vgq3c )FGzg.mҋ*w6d]3s@qUz6sL?[SAq|JqU %\h@J7U Q瓡zOWD)?q]9w6;k#ߗC>Ẋԧ m[OG0n 1*a".#/~%|9U&lw]ŰFR9tSB(#^^vVޕz\ &Zw?'^"3*z luqy@౑LӏxȨ yDi^?| Gެ/Gxh2@@*G؟_:&٣*@ M.  +)(D1s 1|H_']OW^m8EfNn/tџsh}޳4޿?| chѪ Ľ<68qfثT͐(ƭP)PM Ƅ TbFqmnWu{=ڴcv 5*>Y~&h&RҋI,-V3lAx-[`.3\gє$8eYxa&iя+w}*4%ujVml0HT/@!B)hFdZ=F"6A=_Z`O X\3`*Z3iWUJV:}P jF"#SCC#6 MKJl+UѺ7.w63;35T%/X`3dY*ﯷ~naүg麏O,tuUJ,Ọz&DZߪa<)UtPѰߡJF*A ڋn=w2Z!…vUM:*qr;98=`Ÿ)n'DzqҖ#On ;9zx f.Fo OBcU/)BP`{Lx {t*_5=!4)zO ^/$yg˄O28)kr5$磊V϶e]ˡ -TO6 %4Y2 G12ƚV߬ (+j{< +hmNf~wbؖfDƹ|'Wo{yn.ecl@T x8ICyp֙1jwQZ߭[oqѻyj*MCĮ/Y zEO/f'$}ޥBFr[o &*I0 ^-@«VYE5Aˤ T>Ͼɪ*?]NH]KU<낥V宒iCcT\q6#0CuPtP"c[acTCsc ^?CqD([礱/ˣȻ5cZ 57E=Fc8vU|]l۷2R:N\*^Z6O\|v2}׬ ՒgfNGr6.on\yڭL"U]UkcߖYlZ fZNq 3n`vF>\U MRzn+}eEGb&+zѿ{WoZAk- '|cdkCӕ_~|A*QW`[ȄRt<((s~orj``XaZ_)ieV-|;<ߏĖexvЉ[nBPr*ԕMB5Y m^K,ǦN~\i{W!2/ ʇ/6 MM˨ F >7"aQ1吹\S0ӟsKmlH}~1Ѫ@lb[v բ7yBZU 7}끖N垖VJ==K_/l} Uܯɜv{=ϦhqUe&D_ЬC_zO6MdQW?'U_O=6\UX%J_ӽ OP[7ٛda^V֚w\( u\}꾟/-*ay T5Pc&2vi*^];qyD ?o <ʴT s1 }moKP+!Ev_xT}D;,}c _)GXy$|="~gW7n0$UZuzUPܥZbK yVzi'3}ݴsn~ NU_.q4hau22OBSCY,mz&f[!* 㐼#b9E *='*3QDn,`N4@du2'A,[L2puiw%ʕOnq![Ӫ(Qr.9պGVz)?%/amqeLBZƞb-lg]+; {~_s~ ^UX\ łR-R}a $3#K: ӝu}FM玬h~]Yoaݷ@R %&ꯢ)}Z:mc\K]Վ)w/M=W̺kW/zUF+jS뢽AS)Jбnt|0yKTiU,'ǦeS0/&k; aƾ' NBopAcF ҲCnm&yQ6[hൊ]Կ^1vè:of{a >cgmy:; ])Xe "W.9kVbyPiyx_aW:i;Gcm?ip|hk%:,9S/%Yth}7C?J_ NWbP^%+6Y[w*;*]5~owG>zE2jQlIWס'FZ=mfA־˲RB*@,rOf@%h[%++S_Yw3ct㜑bNIJiBꅑ_mF? QhqaycP{UvwvL1u'zhd%AwZրTO~7[-h;J+mU(#kHdknz @*rjv  FCCѬqQbUXLpܐ@S58vs-NSӜa?u!qI. Ap.`p_N ;{&(Ү5јsT@@^ly h'g8ۮPEX6\Pt>4 rS6AQ FWbhE".C2]2HzrĆ\ٹWTG @^Z$H>a D ߚk*T$$@Pc-65p@iR0Lbr}gJ<m-V\'-i0@_}òt#JsCg(wo BV[b8 $ sJQCW(1Bv-b&:{T$P -x.dtCsZu?xP 82t K%3T'@2BÿQr[tUFWI"S;: 5W쪡Ked:t )+ښ5ߍق~F4~^v7XS)Mj&ιDǠnw Tǃf}JmXߒb/SsIA`LpP0 #IwtTm ؔk2K(CZ:,Z.!]ՆU WAl -ł0ҶtL`TIto8aPa@,J_JZp+1(sa'i10ЦOj4ЏZȜ{q2|H18P6`!@;lN/JlL HE"++1 A#:w᜖d떭x(A?ÝF[![2cy f<=Kw,݁ Lz3:?w̔  G \!^I-v`:h<1]5@~ ?фp$]^Y7dSZƚ7z  x,A?z3 ^F}K`IISsFc}Vq`gvPV9aHw? 3aM||&)4 ޸i.w+l jfgP%DB5ca1^edE&e;Uђ&Њ E8ZL+d,8CHp 15  `uH[5޾ u@bQw<j7A|ZJ_m҂/u3. `:ʬ%}'Ap^=D'* ,pEXE`U@jPEǛA>X&/(˃MISkBA^A4*OdPRؑt1jio,cv(Q9O)n븼sѤ,r>Df@LhXoS; ; ػ)i7Nḕ ?2rʿhO3"_z9A3f· tat0fWB{Fa )PN$A7eI銈26[<)<K=W OUْP 쾆_:O$.Lb{(xp(mK/ń<ԇN\* y%•J eJP}:- L*ؽ&IJ/#68g=m_j & AR*bH]}%$ H ˔x@!D:mؽ`=zpo4i@ZUn1(Ę[K؇%p$ JGd"$F xz;8]6M1|ʸS*])f!W.Ea@z`lBs8Ђ(,(~Lc}#4ڇGLF(\}gen ~L=>_DDcM@/MC3bE_5e;hl 9!2,%UŀLjo~6['oЏ=}DnZ;zϖ}_f/#"i]܆Lg]Hҿ(M*acxQSM]j97 Z#X^r`iZIbf>`*]lXxٓ)043ToU38}w,UЁ'O|NivbWpMi; I=[q׋'H2X#p'?T'i#{f9ZG Ue갥]뉱/Y * yJ+Mά4/> O U~## 2&&e<'SJ qzSC a;RSn[<~tq+x3Dq˃&>ORu#T+Ξ ة9Hs}j`@2[]l22B(H-0q^"ֿ}{ȡvT5X9مAP+sܒik#yǨR$'nq7JD'] `0 )eĀ&Jbr(\_TT ܓX^XD."~O!KCqzkmaOO\ښBFte$b”:(kAWYc(㍒Q9Q|%9 O/ϟkGQ! E/C+t֧]U~H,®l'\i 8m`e;3<-']<%cI[,z<ql ܓզ-+>ZK TLc#g =WFc_H[~Zo)Lz<[S/= A҂j^Hz~KJs}=ZV*(. fe!FȶF!O=R( #AMv$U~}oHw4jZH7T9ejE{8Okg/'ҔOIS H9fι?yrv^cmi,Beq.wqB$IfDK!n9<~R`I^:* ,%d*X"0Xŷ_[F[/%hgE k{QUAlwWnrmSizDXUVAsx>2ݴwTNmFDb2pʠ?nj(yzȄ9_O)R2 ?&Ɇ%d4HBȽ-i@%!lᴧ.r/ku؈Ĺ WشKM֣rޘz9Y2\$>E+W 5ͫuzAnM9q _'dnk}%yҘ BnEeRH^욦zT=8#frQRqMkwwS}Cl"N#~T ^}f5~\7Cq-A06})@y$ϯ| 1UVXC:#$m%y >x!~?R2xUJݵrL6&VjKq!In[7^[.48-p;&*m Kk$Վ /zOZp\!ܳ[^7B~z=^]o|o5}m6P]$мW %Έv c%Y#gIk ^)vT\FT-G >/D}9Jr|>@՚mN^\wgqp2vLb%c4Zs6*?;dn ,t?U>*if$U@Dqҍ"eJGUt)x.4 (RiH:Ңa0 4vel ^o^INSQW>aԬ}L4< ]`qoC?f…KTSA<+ټTTM"sgSQD&?o1EwPg uhxVN< "k͢we]R۰Gbf`fTCjXr~SE"ā;Ԁ>cK]S$1SR'ugz"t|Ba;" *'#_2 ek WUG}g\|""gtڭIvU_PΜlk,)$1xT-J'<ӥ<6L7X@-vyS"4a;0XX*JEܸ #8_/kOLL`+7_O FWy&3Y*z^:u29FN!8RN4tZaSE4dNN@yo̪;*Ib Đv x j䈇$^/h*{*v2 *w*/#*Ѥm8߿*z'J-@5D^HhL0+sfi<~1; 7q]J gJAA L/,?j }C ;-T^:2>5(nj碬pyš>*^c4l %%=5Xt%HH3gzgn\D}I)\Wr$Ydp+4)/}YSQ+lC*IglfT\BVd Mp@vls(ҷ:jsr-k*CAFI!IQf`#=:9>N*۞uDP) ]ۑKMtylD '+XrPYZb3%dkZV\A'{[.51A۰y Sd*sEBT(Jx:oR+\4{ˎ#Hh'=]RIY֍=`🩏*x._>1ohҘBU"G$pPG7-c#G#Ѧ5̧/v:!A~1Md mb2>:Ӥ V4L;I:Q(B`|S>]}Iآ~4>gM- $\FB(wMCzUôQ۞tpfp9;DH 3/1~4T~B;eJ@ݘܮ;2ig؀}@ ] /ʆq1,YP6 ?j 0b^ώi^_=Tj=:o2 cvBۢ3ieuu <>7} +CDf_}z찮|_,[]⁸=;BSC\gM78}OЫm0J4'CH݄JBB?KBxT**tFsf)T`-g&]Li#[UDs.nOۣ`ZMI9$?c)4Cq$k!)&$bZ]#X[2GC wqryCE"WdbTC=5R86P^)z8ESBM`a`cpʩR,^8_Idؑ2z0)8/BڈbE2JsjH7_uuZ,/]-ƯC7ޜ,R!S x>xөO* uE+"y &d#R.bH:iok{5pyrpX ;*<LD8QҊ)v X?# ;CW2-"J<0-c|;"VŐfb0cBrEhr<=ݺ/zLpqn nRϨܱ=`kLO)2KX?H͘+6) QmRꓕhnT.=qs^HoVh 眆pO^ѰOP1BB|xs֓'dnnfxɫ;dlj?&E}n RBB %M:gk{$}eC=iK;L}dž/ W`dH]8*z6AnK*ʂ>2G6c=$˧)zs {;v$q4c/@.x[R& = Q7t}EwPV~nԌI{$bY#Yi'kMyrD6Z[ e_;;A(븭Y#&|:O2>z9.TU&4 FL\\GBϴ( poWe/\?4޼SIi9ˊS[~XCKZ4Ld)*mj[ B %'":. Op6m;VMfHU8]܆*)aK~l_h5*;D]aZT xp2  /`OϿM+8Hyw.}R&~^1l]~ jFnbb䑫8|=FbqhSqIý7A\$a8fYp; lѢ t$'2wţD$+J\!;եIUEC6 LQ6]d#죪\,QB ^25,!aml^S7G|oL9:Cu6֡Vcmimai!=dCqcP/i"?d?j8d #,q2i1!3ݽX60A#<89+fKLJQ< xRS :}#oR"NHœ2yjp*Yu%h2N'FB_]u؋on ,o V]=hMv$eI`*d'Tmꪶ6Wǜ /**  !VswO ⟏`H{jx -EQ5;7*$WHBPRaICeqlx!Kf2D8gxa|u.H,%{)i&cn~ɼA/%oz4.>4YC# _}'ƶ꬙&-0_T}Rfhsm!+f',J&V!ړYX*\D wO[dtqh]~ά/8|A] j89T "vߺO{P>`aZ .,C (*y$uYЎd!:$dcW5M59z֐ʼn,)+{żz,/ĝ=xNBU|􏑵1xCJmVI(7EZVb`ٱ;p$?tTBY7(Ž)7&N`S|*J 2FK?ˮ̑EK9> XRKpN'9̞$@$ww"Y,sG7c cidId|QIC;|9ҕ9/cmMr5O:aՁ80=5%quvTǯ3N|yD4źqj˫.w~6_˯1,wgD]W[\fDZEQ-F' h7abe*)z|'02nǤ;R !&hDL1P LOnP5U0-o᫇J(Ih}+it؄^W#Y8quLJ1,{=~wJX'gԣÓBX:LCDw8_)!a!27sěm 3c!:ձJyq?(T"\'x#.eX26܌-U XW!@j87?K-|R;Wˑ}+"'^ZRN:LO6Di" U[|PJF$jɶLPNfE2vNg@ŚJht|B_;)#ᮈbc'wqoW(IxGEYdCoL+ kT8yzz~*pKo fmdJl+*HAfDpl;GpDO0;\ˈa &]IY= HXDLB<@*Y6'`=ȄV=r&T}CTG(l'HpNeܸ3%rKTEa̴T[N|P( [fɼQ_ K H ﷁފӸ\}և "w{n1<>eA/aD4QQ`-_uTi\b6sq$aƿ tj:û7&'+k_Vc8^GݨtMQĶlWhxX ~ !,b`iҨe_nsV3XXǎOWl 0?!m%. 6G]׎\~>bıο(/IZA)Lb xdk`]X"I֢fgwv(;F"b ,O_O5j-PQtY5;L+Q #8lDB 7QILW$ZUc& Tb+p7^juy]ȝG)~e'ea=EnE盃k݌vǩu?z@v>(,/ u.ơlr{~$RC:{U4gȕ8mG*[̥ߪu1)FT (d244U>#kxA]l8iXH]A5߂vtd!}Qx+ؽU6QNxWCņ~i+;tfhy(EgI]}^ mlO"E9T(s*Q⤌~|uz2"͊s'dyo{cnd}+ CKq+=fZJ*~1[DpmPܾa[ʙp_@ho {ט2BU;pwbePPpx+ _ߴ'Ν|7ەaϳ_-0A{DzD* iY W7gll[r}A+j$selJՌ"l-{߹:j! wK'BC,߽aL⣰$c:5YF+܉S2srTŕ mXn97|Ŗf9I[u} P~w{뒍سKzL2a5J.5kIc`ǽk'Gp~Џwvu"~#ԙVr#*#4nBDC{H 4R7(,Y {"U@jLϖ<<|j_K큔uS3IMӁ3GoIW*yF4DT5R:!VbAj`eIM“ ݗNYͨx@K` RTtuV "WJ33 bI/UN^I(ڧd6R+V&tUݤ1^]ԲeD!Z}l%הݲ(m^DVp1"Vmf{U%[fRdׇ _4bva1 “ϺC:ԑ.+ jA7Buf⛴X{WA:9`K {skg/Yc6_s1@8=Tx]c$ꏶ' ~UrØ6mͦyb>e,h1(s鏸,Aʟu1 ]%$o=0YTͼS?A|tT&C:|v ̧gm>7+]Ag aʣ9҉k τL.ܤYT-lZ/‰lfߝ5##WYI\;eк6#i:y/FpW5! o!7T]|*hep20ME k3-\G{BFRS.\[Os¾Ipslj6z?= nay6`gJAY:ʮU3~qNrk/R'ɑ5LUfg簴V 󏟢B+Uۻs6.:,49Ƌr&P3Vk&=Jl:1׽z<2!NQp$]xz:MJrk"ͩ >,\0e~9~pEFd١)sF #y*n I: vUYko]!RK{׉a51(!tm؎9R'f{nNZ'D X"P^3c)()TKR\>թIb -ZP+~Y۰#7<[bclvn,R&fP/:Njʘ$kKZ^Dr_8Vp2ׂh|!$P٘U8y#DKg 4,sYr7%xp#G:R”[ޯ{﨩vs\ 0]G5ƅHc\E웼eSod\a&&S`?v\bNb͜h !@: 2 G) ⁧DP.e!bRGƠ/פ-٤ke\g52͊S\+L T~ѳ"SyIG|jEMw6+sB9ӿ.vzQgڍkhZXw!b@'3#Ԁs,I&p@9=8z1B }85&F/hݵ|M2'? 9aV5:3G&~Z3 iV@TaQqc;b3@JL~1$9hWj߱[atMzGr3\ŰقT"RE Nl$){0zP\_I (OѤ3]ۑ241ϋ0Zi43}SI;@| wލOύ8:ۀ;lZw`38qi6T|丁ROT7R!U2'4CVKVn7' ,u40|En1ҝs01?}˞`-Et#'l}Kfa4XzdգxOJohkЁ-03Vʔ,59Y8/bG@'h9]rJ-|)C_dmM@ZG(jW(Z/CO DI_=SDrj.)fmV>6th)hҿ4o+2-Ų/7 !,Aז̳Vv H;&!\K@sߤ hK)yu+ 6Ӭn;5 C|~Fz fp74(d m| P\/̿ w"?BqdNtc- ըQ zhh+@M!FgՊ9e  i_4c)aҵE5a_eҌI4]Y}]FORpdk@\r{B9%nCH] _. b޸OBЂS4)[8:?YCK!6@ȃ YdD-:SbjQAvE']a K+hGд'!lCJT>[#릵o# TMT{q?,rMA t__\^HQ- F1[G`U }^V1ʠవsV2,%!4='R %EJ-lkFdT^shomJ`]~JJ5zS*%705 }T`΅%az4}K'![XX|xn'ӌJEXqEv]VljC0iD53(L _VQlezV~1wG/KŜ#!CM)* u$A.*+w/KDRF[lrmVcDaH %UfҡGhT)Ud't| 1fC [l ,W9(e&3<#FY}7"!I]\Q-8} UB1%1CVUXƚx|;kGzCv(r+$R`+o r?ٱub.!kKJe”\EQNL9m+_܎?PIS WTv̭C?ﶠă$^^HFMKW{aiCŪGE6w],K j.t5RM~G)<%,.CmާaXp9PBAT 0VcCdHԚ4n^h]?IySqoLB(;L\o '[r x^ "HғF؋@%Ld!M;{Mr!#łyuC/#R:~> WƞazsTX$V 1Qn•@Y ˂IPT;ú ]C1dYȭ /RʪdG!^ 5B{ׇk$&0Nx ܧәEL϶Q3 㞹8o |?`vsP懵cQE,R6ǫ%{^Zsi[+;g4(*œGAl齮@EdʍB;# So~Yc}r6cKl7w>+s-,DD'iLrY{|Z-D#WG\ﳼ_H~51uLR00#3"S6 ,%لܡr.$8mPG?t~Q 伭㔚sՄm7VS(QpBQ1 VJd6^$gz]ApP6 o cw}Lsb?(f“j0BS:L*ESQe[ jH>"ü't >:%J)!uroO\i6kPGMNFT}cБ?z$  zWG2UEJS rQVS|-^ǹ9;Gj%R]MO{(Uol{>{)ӤA\.T|͝Nt@b~rTى0|'L4D(I`W3TDͶSƄt`ȲNp*>Y'qL}HuaK*U >J)r9Fނv9dEHRyIs}E H8Yh(}T0#]ԢlgKo4IJPR{N{ي<˻*y+]:mXuL6hϛ"tm[8~9qIH(ƾ 7:!a\GgRV/Oʁ~tGJoPRuX w9Ky {NOawPSƸ8:M|,0-'R޸e2^¿I|j\iL+x^ņo#vPvO^QVZ#\HX7.EjQ :#7NX8<%mkK47D)ZӋ\ooAD!'ѐ Z(([tS1`<{=9GCE0"4T=P1;F8h :@rWPT`LV68iԫDV ,BƠfSl4SW1d=,9\C0 rp+v q,13u(@Nne>|ud-=>X._4%E nqTWp󂀍S [YKMGe2xcCx|O-YPz{tR%/ڃn {{8J^+Z%d¶D,>B{X"NeB~G=i d['G3`{Z똨Fdfb${q`#9<~Z&q*&F [Ct3t $:yqa5!SBCL0ba AUqI~IK*b JqQޞ9-n1m(mj`Ta:S23 5XK\Ɖ, H]\jzU8jCџpfXrSD@6#q$6z.HK sqKktx2NB!{![(Z! qTʭEmC|D"0S.r1/7@&7c\B;t7S1F$[=+/KR/̓'Ϡ,_c=% @o9ѥI3B%=3,_I5o^>T4w9rܐI8=a`Q0(<,K0P9 9o`#TzE_V0ޙ,>oGG!7$j}MϮK26CEW#N$Z;qA" zXzoݍo&^{TW򜐾yZ9 M_C SG/ܘ.cKk'ml13/!\7+cxE KqxVl?AO^KB(E`\&%Σ[-Γ>mw=[uH2wei]*\*O]{b3QmI 4A"a^nTbGS>uKquਵ JFyoprx~4uN6ܬ2|ۨ8Myχ%v4,`2h6\$dHP9y>8 备)uҤoo=5Q$Iڗ祥0k"n]j԰}M-Pol~ZhYO>ӾIJ^O*]cU¬'<љW0hWfh)Y;mN]U>`~0Q2P-sQniR  rl;<HЊ) K$0藉fInƹ5uiε0ˍA t;¹@?^a{G7ɨ*=>X)' ܒ9ğfN:٭^l(`| k0.F&q:e5۵Kf&dqQ\,]4t·v85Esj?P#|ٞoȨrkn|OWRg&FZA>zϫ_ދ!HhM-6ח%5>-@9yل2op ᕟ]ЅEh 3MZ6ޟ:7k? 0 f_6!Jm9^x>{-"<@!J_Y&jmҒ*B5piT̩ %P*3G\0ka[3)T<ܫGpZ7R3P OϥeSm=U}[^=ȦfT*b/NHoGDj1PfV}ٲp#4^%r>&G= 7f[-]qf @:WVrD+)J?σ"-)eb53fE':O 4423t^qh22}HuѳJz"LF'Fqec3KJݰeB\ m`O g1;8"n2V88G?C˜N/C :ИL<3I߅jX>prwh$RZXIv<FD,S8̊RIEIŦp)*VxEV2o f+N^Qxuȩ!>k&`Ybz蒺f i(d}c=fE>a xY.4m>zl\F_ZYhFML~ KQo7H>Q{V95%P33KƃukWu% Z(`dB|ȉwLK'Mttiz@qXZ\eI v@pޥJˠȈzux:zwH3f{ko&yHHW|_F6: FH9q>N(>=!-qY{)#$Dt}htR٣%ý,a .84mNn{@JRzYF]-B_DȲZsuһgJVAߧJ-u̬*B1oQ+F);J}PHh<{7Td3dd(I֑>VI8Xј&6E)OjŠc"}w$,0_TSݰGu4O!MPE7[wcm y:Dc!_{Tz nIi݅2$_1 84$%h+jpB"M̳C{0j_Qo_D8І`#DYH6Ihs Ծ%No-4lHt~4.;n]Ut>|r-܇${~p{w T{dYcf[4@HK2lh#rL(b4T< &I״&S\sb5t. 9]dNP0II8tMElPU-S㐺[Mh]-%"_atL#.,t@XLL:&AU/*Rd}K"!&w|QrblF V~8a&'/H i[Rȗޥ`/LQ*im#8wlq#M$0əF! QRjcr% 槠B0\HD׊''[jVKgblv0tAgŦELA tW)[ )BҒs{-oTe%*VT+ :e_B7ŸW"\l$!z˴z3Ǫ mnGiPgFM\Ro{>S$WJ_\죞l&m QHU}M< ziC+h9? _w[cÉdŹ(}dno#ړ~WFTX29%**Q1 ?dLf0ۗ#4%bkV r;ϗ@rnS ߚVseg+&,[8,*c7]ڤjC3.3hU<3 DVDS qՕnB>@6DC(&Tc<; tON$ZVPP"b! ̺2a Ϭ.7H<(_+,i0N6Z5>=\_2sEtu]w Mvϥ䧜hq'1#kb`ܠRi1zI<Ry[2)<}}UG޵ uOx<9K"ҘTЈ/O8ŇY_ؗ fÈPܷVBKThJ@Aک6TZ+|0n@[/4;gQ;"_}C3^v4V7޶.cZwD.8A偵UMU?kn3T!!_h;ͳ, Z^¡Y DB-ظc  rKuahpJ̶tmH"2Bh9&Y6ajm,ZHT0 fE`H LI :b;}Ei# u{H[F"긦Ć>Q|2R؝ "?')ʠ6$'a`uC "ors` <ҠfUj#)AP0T1H"Ry b˄ydVNFym-NܫccZqMqOQi8H86cVwϪ0;_+Ʉ{ItYT/)ۧAN]a S3 u~SWWoo((TK2H&y% Lzܚ ]vvt+uwcȕAw7AHU_+zNz[؍*G 7-lP~'-hkَ+ޚmة%XNRb:׉Q\KM_CsNܽ+N EQf]}^uJ#qu,D!A5lu75}lPKY>'!BsMCXKzr&BҨҜe'vtAUπEn2H. =gGn C߇>g̝KW _3sA`#G(Y}JYLIvy^ii+4I/މ_=VY]ΊF]acRBb^TՠpJA5 ):Mm_ϙ(+1`}h 93y~,7bŸ=?0m|E=+'vʉ<`/D:ks=ç;'y`TBϾF֝@}`#nB{}xY}MTo )y L7!;I4LuH دZz!PqnўAqD[w`cq|HH/agh#| ֠_lvcIK,̉gp԰@(wz"~~_w#t1s诱Ħѩv*j)5n࣎IC `2 MQUfWǀξ2d9u(Jƃ@xK[G \ t2TTkciN#$+3z lal]cg>e:-E\II zd;gQPC[OX=`MEe ~惎 kr+g(ޠ4Δ).u|^o&|H:V~p k{#ش[lxAWbℷG(Bc\ŵ`LiݐǬ U2Jm0ؽV(_/"4+sQK7=νǻwjQ/<3kj@|q2 _-LuDȯASq)("'x5)2MM Tٖ+D5pZ\;:ߧ fU8 u'6Ѯ G1 FW4r{R5}4>\tRرOJ <se$@\frYϒdaTǽ$.b35$t|Uԕİe#IJcXE vB{"dVlD,.{ZU^FgD4EHf4bHn:5Kx63m(W".tdO?VO4)'qKso?ozΤᔁXx0Hj|d' %*r= ,=VXݠqP"[Q}G<HAM_RL 7 sA~YcWuk+4WEa:@aY}O"]r=`GW#eC:2q(d6+0}*J ]5K PO̼Nxj*&&!1?(D>y׼]wU֗lV2 ` rNev{fl#$9mhg[ xSeg1F7 nayaʨ"y3)]:X.>f eh s(XOij_`(1̖WJ\[ \nC#k+ Igl;a8&X"HbtIIe"C0]F9ά&֤U8|u<0yz* I,ÿ W5S/+F:_d]YՆ7- CsILрk;wż1+OQ\S=jV NߒPOkoJ"7pR6#" ^7ҐAIA]¬57r.FOE*=ٌתx+>kߗf D#u&Y%uOп4SwtqZha!|7s4~f:SF4qYa,5VHS4hv21g$I@5\~vׂX,}ɑv#w֏q胋[bQ >SޗǦ̶A66}ߐ?pzB_5L|]eX1nK<"/gSӓN P%U / Do;=qN`vAM4 | h7iVV4T8P(6q3|Zl17v1-mȐ<Y|K*>|}7Muѩjr+-Fkb{~`CVVkVj(swӘ@=ָ 1)^P&co泓6}7s]# pmkVLϟWP8"kHggafhxE׍`4Vι9Fh˦ !㆞#}@~dLEe[c=4ԃ<\ap ۮ<-fFIfIi/K@ %zpW! ZbewQZxűxƍ|'S\s`‹=Dߑ-q4Sox\6m.nC3T̾4 3\ۻ̇QSsy_ 'yDguO:#=0Hqz7U?if]jWa?kQn^%x@PAokaMHvR!-֜FR-BƢfqİy-{ˆY :Lg}u,ތrlx:Yg*fB7UCWLMOpeNu& ['xq[ ,ޭ7,Y&!Hvr 9b o}kH/mݤwΣ؝~@cSWWtGMq$:畹˔g&-e}э*ޫ HN%uBKmx4nKG~ފ?3Ҏ]DNh1$Aswmv/YrBЊkg3FfԯJ~"jX&ȔÕOSCF0jXKpF4կϬ䞥ڍ)ێ ҤrdnIJi2{5n0|e V'Ep9̹FnckȪTV(Y&4+7Q N n4@86$GS:kgp=)Qh*Ӭ1lA[UQCvSd 0DohOEEksaO2(8בN! c'D0qަ\r*NW缅yڊs/Nc}h0Ԍ8@]Že*-.OH( Vz=ڷ"%7)4˳cI#!j;\C۔)+ct*w [N\!5NO]̳?dpٔ-hc]Cuf h<]`KK˧N:~DL2vZCk,]'Zkc9kC j?ʯ0!uem'+RV*)P'-f?󝻎%aP^qwvpTE7J“p4MsZ'azvE3Hغh˛lO~o%$0:=4>5ϙhPfڻi9d:x"~.gUwi٬cxWܕroş5P3 N= G2xo%C)RُZ`1 0ef~b ꈓ[9С1cȿ b$݆axkz%_(e-?.~!ya=h,IQy4޹<,$sOUhAЏ*P'ba ?x@ ukRqh*6X׻&^eO.Y7eȵ ?`lj{PI <8Xv`'<~WE&0})  Þ~]FT"\佄9psn@Cc2wt*&%6o/EI)z%ﰒFv..3鯁FuB /G zA > Χsf `qΓ{R"$/_&(Z^ %]KQiOul@ߵ qLpAZ H`ۥ-eaC+̆)TNz.CTSKm_ӊG`Z"rYFM3W$6Kp%X\7܎i3CMM2=:ҐCg0J-  #lh /\ɘˇNNuq@5$n ba5YĘ^} H)lYRk]95s|d[LB$UOi#~+RDQ?Y( +h/uC-TԵϣ{6& [lYE4oSbF$~t[ݥz0kHHzj 7ͣ3AeaA,jbAUHBq2S"@,T6sL%ԥ|&nV''r+gB1- U>Hh ];CK`FoFSvsZ&\/u 8Cc.a3W&99'HާU#[sd2! naE[Y\vрF" Ts\zOC$IFoBj+ j0g1 ?|EtNğӲb1>B޾Ҧ|Fa4~n¸xIP4buW">VntԳMF~8ɉ1*Uy쒾QzxEk-@Mq ^CA+JTq8K}tcPoa6=^9 pux%ՎV et7j0gomfZWi. Bys3B_EԝwX-2~arpk9XJB?EJ~'H¤o@|st?M`q2_q4&mŏ5)FY߇wv¦ %ܠP:u-4 nFPPe8IeteB+DD]{BB}cbd^Vw88q_Bk;UOw*u}Y͏%<p>C $YS'me!}^ vVIsr6O[~%.a!l:_:+eYu5`50vFʁ랎LnO_$Ԯ|uI]iPLµc4 mNՍ!FDݽ-l\;aWkdE3КLildPW`$1() qm;fqf_;b-+/+4^8 bʕJs,S eтşs ~0:}Z|7;D=%ƖhEQAP-.DC C97.A-a, &ĝHTSA81lg2d"~G)Tl6Qm赢Vm{lj˛xc.Kab'˃C/(HZ֍q=t2`v5@Hȅqݩo5(=q7!}xD17HԔ4{2  /0*6`gn/o}5=Fa-t=TMA i\Nȳk&$āʼƥcyk1ӂ:=`P˫ A:b.(|/Z6#ϦWi";?wL! 4j "5MHlu:d 8`) XeSa뗅ќc+^nF_eK1Z3eYeSvT"wkO8)žE~`7$[x> me!:X~R/z((iMRJ}\j{/nt{`_ x"ԓQxq/ 2c-f,Ų]80}"%vV6rd0`1hnFߪaFSNQZE962B#%s$ bYB6ii`.-Ug{*P0<ѿcr(H葙ȗz8W28CS>9#?I! $9xFKuHw= 8cׁ-, D* J]i%q<VLe{HM9pعM[l-zEeH:^Vq3pD[`)ƞz )N#^iED42_& *& u&e )y&ht:JnsN}u39GF1rx`FY^ ځj2 E^C4Pq 7"'%>|&Nռ&hA889EJϵÜP 0q`.qp⧵|NQڍ3r-(tRKΩ)V=Ⱥ_V f9vNW-bTO<ȉR"^)c#!~8}O,KC{b-Q& ^Laڊ?b2w2{{aХ"û i=ІtP(ĻOB?zh":N rWNLayS{(Sv@VS4^sKtr,](MMgUc~QG修6fR/Xl+"B K Q)[LRxe)'=F[Tw=h]gZ9k'6ӄU&l6`\sפrfޣR5=xȌCqz-U}-gZ9ٗDP];@CĬ F= BeH\`|rHڟ%_> ܂K\5LbIa0*z,oFzknE1jIC6wc Q KHx"ky6Ҩ@c|wCp5UÜ8P.[BLDd-#Tm #Oi%-YkT۝Ols:7T`\1T^+0(&$ ߕUisB~J-$/WYખn螛$MS4^Ybpp3?L/ĩ}]2 #@oB Hc3=CX Y6dy~8.,NF? p=nB+y퇱݃aޒvIG{qz*܋ƌҽG;07l>ߥrϸf3s,`vɶ@63ۊCGY Tj}1)%X zho1sZGaTL M45^AB2.`VH9;z] dZ{oӉR% ay'E/j +wz'u?(u豍ʎiPAa l|jGQG5f"4&=왼 zC w'8]m**;k%KF+SKpLpMhIŽ,Dc 웲)hA#KC1,ʕ_*SeSlr*kQt ]X5Th ^ 1X^e7\b*zh0y0? n=Bш`Qud,݀Zɗŗb}ƺ!e>Uq T˦)A:O:{ۃRDIv[s/VBQ #CWn!?}C20fzc c /afA݈AKԥs%0vUH̰;GO3Y㓚>T13=:vz$E[i>^H@C|iEWmcNsC6z,PڽG&*wVDu1膞jb[ ҰZLGk}I4mk52OӋFXhV'VT7jP.?L#X=Ͱ~L~T_/N$)XV{A^l!*R/^_VgA c3[8/i:Ck8FFI\_P^RHQk~EWX8p<"iyʒbj ~ܴɀ.'Zq%1y}´-@!m~ &#AM|瀏kbʔ/s'Db̥~ 4PUcn?Kq/\LX'*W4ρiBDH=eFIYd5G>2_:eʁTek6DŽSYJg=5C[.h { <M)\l#Bxu{NGo܅+@?xUcCQ5( E&e.+J $nR/lB){Wio$#!\o>*w* e`[?xC5 5GqÈN7PKEp,!Q#qPUA|9-"kHp_JEn匣؎G0sߣXTǷn!VI_G4*9F_ ^NB!A  z'tH+G$yìKiJS*+*nH 6[K1Abw2:\0 F !%:>^G) [?- *nr1,qеicd6 ^0:#M+c0=\4 /#WSԯnYnDhR\@>~" QRs1aST F Yd*}HXL fFK)zFni TZu}5s`~XKՄ F@F"]O n C' EMJxvJhˤ-MG.3"#<~ǎbq݅ԥG?}{^2 .ڷC,XnfH}&KM^kD; ]c8d6fAn,JC? S>N{j,钾ϨBGlP4L&^>1gS9[x@7cT JQ*Hw6vDFLPfPux<1cYlI0 /¸Qf_/GuVJ^#na[ B݅@"XJ*@K>gz҈a\LuVѦSq@I5uY6l˴vi [88zznXQ /#<%J^O%QTS*|ؘXV4"%bHEY~WB;msS4xۤ~5ʥrH!DDo@ǭA:5?C!iu AiKQ}|QAeV钅MԵ%&JT kV'zb;N{e˗|C Tdx5Y>$$퀲5 QZV`)xt5_aQN=Hg$.z^h O^e9ps;;R[iC3C2zf0DX '/^AW'. 2V^}8e73U^3`b4yk;IZ ҺzOy{`>֑2+k0σyYfQqhМdl=O(,+!ØztQu8(5\a.xݍf-,hڃv)jQukmp_EuvO1kuIZ~wp[]z# 'o o^= %rẚ]+ϲ@>駵r\6x*, dp.ҿG`ѻVnejBs ۇ[M\x3PEPr:G~ǡ;ci$+:39j>kcd ~27ӇEO;Ґ7RP28M1-MT;mZF-kR0o%OfIv[H*&IDco2l|tX6L_ O^sG\b̝G2GIij{#T. 4TRj*(k/mƛ: Uԥ!o4=pUic-)\Ldy^6Y 9̫9sD5nk>)Y7ʫWseV`2Rw\S"\*RL~1NE&^bqrKhM'6-sMͼ& q;~ B?XxCfW6%Rfy WwYkV/ņucXyfTS -N&ğ3hS5S"̗ө g w@21贰p L_7gGż%nK*V!wz34(ES*!hr -WYPfpgϞV`8eED7aUT#m F5=! HbVu (Tmarv'$tˇBh=RLv-UiݳR] Љp3pb6XsҾ.{ {3`wb6`c#H}p*(=P+<78nؚdbȟI%N!ޢMS;;&s;W5 MdM#dU̗$d.bb̢W+.I囹\Tf BN(6"WyXhn[ xѴ=ٲ$xl?&a=-7D];..Czѻ0(J2*3<%W4UKXKgetͩh=!{$rt gPX_ n:3!}7 1TCƒEWPmW&s.&Ij6aA$Ioo9Q̏"!"=ɕ$ZsFO 2( ~J%1Qت85Xʾ&|J*Ph\0suN$aC F1kYÌւe-S4ߺ!(ӀVB/)xTKtBxq V M-ctb-BTTм*^gL n;!O{) "{d,*m UqNVv}Y،L2~'ygdQ #<Ɂ O;l7tzv}"ɻԊ#j3\0' }e`Ǘ-Jgt5Oԅ] l;/ I=fR$ 迮%UA/GHFBkq3ux Lj`74`K \A PT"V(Ւ2Q-hkXʸsBޞ:YYgqsW|l ƒA%_"% &֬Zuza l`t,p72wNن:e8nHt .pd3#bbQSb>Gdn(Y,{ 9Ϙid¹~(;Ө?a}U{H¯ kCot)_VcqjLy1 SI^Y' jHo cL(c[.7^ mUXPfyL hj>gnWYaZd^q};$Y [:Sk$bĆXZ0!>^Vܱ7V> Ӛ5¢59YBaWN;l Uu\E<_pRjU?uT ݼCjπ)ÕdsI47=RBʕ7UlCH[7Skf.ѡB$V]Y<$g4~MmH>W{^ěf᪬e,= 5=0Mtze^Q+kNCHjJe2< ?N ^{_]'ZȾ W-%w$YGC'easN ٱ7 b c@6= + Q\(ǟ0]X=4[{~3n%4r $r۷Z,ۺPyR+\ psv+Da:v'?V0.䄘\㤉-QφMQ[DSMhn|S{YK*<'ien=4(NUacQo,li_uCnq_;O,d-Ȱ ˀF!_ _)ACzg4BTPvJ &Nw#av^|wqYJq mc}Z IB!Rw߫T{aBj/.8uD,S f_!kE"“-/2K/ ^£e*&w0F:%oҚΣfq)8Pִ~ufOML.L(9"U-~T9CH,oo- G5x:U Ǹ _2as`2mLçևyq=%~Q^ ,V{@ BnT4oPph(']xRGKӁ"FtD*S(T~62To?غ E q)H74 E?(i@V4bPe0ʏyZ n$Z"eD `n_r4WȟB"F]R0Q1Uq*15{6fRU9l @"H8uDw|F$_tj:SH ?/3b]iCx~\b>W-@gTg|8돐} cfŁhϱi_I#^=G+1gyA0Tr/i6wtFFseRwEi/[sGu"i4%Ṣ۬Q!S{0(aó:-s~ >֔ݥk~* So4*ARU"4Zkz0\_+tx5{^#AA+D-_bݦp]5~HP =^ \xݭg\POz IZIxr\ 6e' Rű<<!3D)pv@ OhM4xA5eP"3nz?1QL'_E hl6piUnqKoV)T݌Jիi@tޯ6A& ΎL]dyaeȠaje2?hYť.1gz lc}⺐_~AQ&aPϵ J4J=ZѨ `nQ$Prcŀ<`)aWM*bt~:ZV_HᒈsM=٭EӚƊ~jOS_qefembBIOk&չMC)(!A B&54 J"d8H&Q*=]|&S>^g{Cx\uX yf>_DY05@h)36c3:#4( ׍u[SXaqb鰚%#i >zڔ\ :云{*ٍ'po1o1.ߒ LQsuMȤqCͅSdW. 2dD&3/d9?WAn6&~6eGtVމg/%YmOF0/ʼ׿dH{R`D9Q AtO:NHRT=4n3N#V(m_a" .r):)4:y#1f߅JJnruNwgϼulΛ'V¸[؞u>^fD~(Ju?L-emE5u;CÐ!WDP$٪qQI: c4|ybD3:0m %sujrݓ\_CWO69|ayʁDNf{pX_v%;̞%o /E[ ,-"b|Vbxsc$~-56яXY\L[0 r.|tWWE@7jl~Iha"T-BTLp"θ2ȷ00+\s 5:P1"-nKȺηZ,[" wV HdƐwv ۻL`ed?/Fdsq~/T]םGp Eq ၇QA=:AJUsA:8-4Ua$Kw$15 Ӵ`Zo,VYc T 2F1\򔷴ijp- "e䭿ZI3/- n>";"3IFf3(9/,y4>bkS:D7b=WaT'|&N|aE=^*`]G$,%JQVRn QJ;y[d N*Q2q!sPfNf|Tf]7XCx'D#aYxי hFq_U#Rh x /| ARן<`>4k2B1jrFoeQ{1̦a#؄Dqdv'd}w9g!6RU<'`ۢ(lM+jwVL7, n|ahh_?@S̚:8LG/ޯ>NiPubi/4tURF)l8 U$"I,ja| zA;^ 7\F?R.)^4y8iɾ*Z;}}  i=u ݝ-ш7ЖZxMzWfx)R4xSƯBQ7ɼ_\KhÝQ4# w!k#q4@?AS=>?6yǗllIbZ"tqts3`btsM>;P% yiDp4? ,RfPChBJ&*!LAkUG śPѨה* {r1$OpJ0+n"!i>>~ӛj/'va90,2ƚڥJQJ`tS]@.F҅2Fw94Rl7zkt 땽*>#t#T9}ւ^Zb)HTu/CL%@.SM[x)ViQ3t #J񼠅rgQߛM]f~Ʈ1% F3" &8 ;:Z#p2\Vx&x8qGEċ^MMMHE|W1܀@L7X=hh- GjxFA.dCtNJv!< P/tE׊429H`0 o!uDG!K+l9C4y_0JQw`7@`,9-6'mI[HLE$NwcjprGg}Z |=O0$V!o45k$ ٜOd&|kRA?v`mdɬ6?˕,J1ca 6.B #Ҭd' j.j)LRh:uqD1vI'X3m/NNYh$PZʒ5nxuJ_,!;~ix=qz[aAyk];[bQ xp@8c֚"ԞlښN)?%f.[o}( v|6t4 >(m̋)8{ZzW=R"V70gy cP=ms03ؾI#7 s2j<\9(ɿ-/fhI4^BxՐWsg!v)kD2)bH{HCpyBw7@3 @ԊJ @f~: ;6RAo@ޛ1ۿ{prUӠΧ|&ef4z߾SX{b ۸?hMjiػfr)_Ob`=͜W y(g4E~(RXk]'nX<weڄ>f=rĿڅ_{v/b|hi)*6v!dGOǑvXT`'~ [4 [b~[6xو 1 0C ^uXvPMxwM@B`u@dιF ,D_:7LlK@7 䗣 J@"ߘt꼖/$uA wIr D0Ҍ 9n#zUGgW _ʸd W` m;70nTMZKt:E FEyI}S:3J%d4T e i?]C`z<9`67%U8w!kCx[JW"N>(]+y Ǚ%{#㬳fzCNߩ߮^*`3!h<)MއnC9_= 3Qǀ+'4k0XI;ԉlͦ<ӿ@./NaFT2q1憴D7խ*[u-kq_R,}ur}8P(Bz^ #|ۙXn>z8)sQ$Gă,-2gvٯZ5Fƌe6Tkև"ԦaD {6w{4pde6dw0 e@VOG ~OsEQatcMoWҹZ@s'f$i&H69.C^K9IoWZt+;ذ QC@,P!}QVuKmĸ;*/IƯ&(N8ߋ ;$śb @# ~ 4C +C_ %v ih>E<!9SxWێo|t'# f`g'I }Ɨ]CoV#2T~U֑.tMXeHP*>2P1P7KfؽZ-['rP2K!θ265"0gMlNJ9i=.&Kذj믯JJr d߆iU Ύ1 ǞpY By%.IY74ңg5=>\젹ߔDOmE,ފֳOGM7i&*dboնEϖd'  ÒGFutn87#u~Ÿ.s hc˜gE2uծ2VNi Ol iVXkpg)h}Op3+=!>~5*yt̲Ϻ-SrnzXG@2}P(iBaH%jE#A ӑdԁulH@|v0!ǿX X]Rl0(A =B5VzBP=ú[ ?jUs8F0 >?lR\|ꬷ" k\)'A D1R3VXkQL6OKDp=r;P3v@&wbC1(EJ |m|N1>&]bBS}cke +ZhQC*4:rp+@"ʈ',zwKɴz8`YIfN廎H@ 0|DwG>o|- !|o.?(-Īh YF;}cO~HQv\ *:Cd>wBu4ⓙaΗ6NH5S`]CACC ,;K P ~7|A]6goC4ȣgP%^sM8 aj@;%ݝ4j㖙Öe?0p4q.'c42tj*Lk  PwI>LrJ[6~\vyG`pcc+bQkkPr;U7 )F~sD8^0e<SQAL)hei%.n-t8b"BI7?CPׅ|Im1 .@_xVXޞo"תv5X% $(`YAtM<qws2L]]7`o{ W4x zkbz"M*A6DB'܄J}tԘ{$(8!{7&A~/8q S*a;/5uwJH0Sl}]c&o Z-kE~1߮&oWU廱Fxm;EI_mcwU;Zou2 /v?ua(j5dhə >u'Łi"ݠPaT\OoN^rgbmA_I6Ā}fN^v][,kDE~7k8|rm> =6NԧV ;snwW}.F'Z1v$u6PL 塚mc߆5|nv,͉£Þ'޳>&.š'ùyOWC+n;g(W uxR S$]%<^ `Wmw"L동6"jܑT(^ u ml jfA3ؒmc==8^6F ̱|Jtj8s%L1Jnu&m ~2gr )|!c;9F]iv~.|+ .BNXw1"Hw̱uO5F?h76$izز;{__pځc hKoy oW> cA/qb>]@{&; ǸzuULh>D 1f];k7B~Ӄ t4&sT@t/`+El 'O_W%{ Ϙ*/]?&};C{J3FUV9O:QƧ)V<[_L Cor h\8MZni:tjI Cd Ŧ.IӍERce5Yq:B !uKɩ>Y@Enu ;0.+\,p@*ƚ.5^^F0Secx[cp|I z(˄5pmqhb !sr:֠Nu=` BT{5<|%S"qAܾBW`?jMx Q\ UubyK3 ln&`܁ EqdŲ&Nqўgf~8$2(6^Zg56| 9O 5Bo1U?2g6OlTf0v$LAی֑ p,P&!zdi>t"a+*M[%+C' =vGq-!Rs Aس@,jO8S+Jf #AԲ޾FSJT{r}gI<40YS]}Դb+b1 o:ߢNMц*N8TRRFfun-I1$bNƟ{z9n;Ī{[7J2nW~ORg.76Q+dR{Liiu_RKRWn1n)w2v~yb  "ӇxK2}Β%[80{D]KMS`|x71IUr%1(qFX.U1QNNw?R /{ž>^K m(CYDtBg^e?yCc ;K ִZ ;&x2GR;tƊfgS-KL&{QnO͢1:\6G}-r 53P3Dsa|RIHQGT%}M:)x|>H)A(H2g~e.bi.Ѫ%;]첣 CE&:j519. #j?@3]H@ B5ٙu Ŕ*g" ^;ZVZ_jf.k3ʒ|ׁl(}=Ywl@x>(x9?zڝ0#b܏dNm[ Yb5#zV4NJyy(YƝ +܊|SvsYض!;JkGws 2>G\dq)^Ũ<(L@8cg3 a'#&k/ހ-m Q }4`gȈ5]lfwٳ,GEA$}CnOq@biO\2W7)qtI`>BET C0U~?)"k[˧,bzUxs'X/5?q{s𘦨K;UWO*/H٤Uٹs8͇Ψx~XWehUa+7NxO&e-8x2?O}S2%0(C"J"eTxWҭ9'dkη|.NDF?c>P{%#ߟpР.ȕ$&:Ԅ7艷M]DjX>ZdhIRa]7Ux9ByDX3ٓ)?M>%38mqqJ{~)\cgGEH㔺}&!*й>!sBwv\!LَEI4ɃTՅEe_bgJ%0Ѳ~PA6xe pLCgڔXJ'[/T[Vzq?JWp3Y^sK4{li+wxǽvC'UcfHAըX̗4b5uL}V(o>N>WNxKýS-]#:w~;FOVۖ jFE?mL+8@n9@F_S(7Kv ICZِj/NR\*Hȭ[gk\KVM8ߗqy[ǥMwpFĿ&0vB{Lؿ&Ց6ԉ)ٚС("=ӒDpȞ: &K`;0B~naA |K.oy [{Տl1++` 9~\8 ~j?}&W:ŴX܄Rg*7@\FDVG{alPBD_uQVio2`dT&ӷf^׵ CA:H#E%b=]j^5LFKd~:^1^go_Jp`*EcqO^nKcXN4fI)B\J)EњY\s]I>]e=,|2z^_ k59&!-~F;B z35)@ZBd+*+ W~Qc랐I;jsJWS].AKpb*׬ 6|w Ԧi%/j;*:%i,c?1azr (Q.k1W09G-S[(eQbEnB 7S5e)^^1 5>5EiWZAҼ0c9=́.h77XaOSu45G"]YBP>pR"#y/'EW]R^QX3Wl5Xk&J`.zC [TVL9FjaӨˈ2NgvP v" Yʏڙ~a9 s|btptf[ӥܾ&ʕI[FpFkNkz+@{a 6%AYVt<u3tkǷ1dP=zzUo{ |tkrL;6siۓ: znh@8.-_;~zEXL9NCxlFc`݆9ꃯܑuas{-ZGX"K܁\h)_Q: VzlZ(:+/!t&x H' ž3bS $ QI'Dp#1 ?=7sSc^AKßHo-8]C2 c24} y퍄hd jԄ z`gcl!-|qMA \Y^bFpi-Zu+<:jAZRUt4pկҷ6f^. ь3 WSXinHɌ_Ƞ>v\>nmT2n=_[-8Jg>6Qd#pBT]t)64v"r]&p=;6m@;ժE5E Ûig.sPEXb*\Uz<S-/Rt{C4{UfH@>Yyfr1U*3k0`ԹCSv"}li.v6tgМ8t*Iw X hFchyf ʜ&n⪾޻X$8ڍkj8(,[d …/q f.O/^\љ? [s_'UT87%,iOq=ws ز, *9w2et# rH^K't!.P"ΡzU.vSJ]刺T[l/jOJ 偔܋J+YivBs5Z9$cƬ wUBm)L 0 eu$v޴}Ƿ4kB<}bv#h*UГb3 ~)^JooN؀[V.[yQ{%neIdG[eo;Q,r:=?eCPL1bOdP[ep  P!d%ul&=,Vኢ6aI'T̅km);VꙜ x_3Up!mq[t뿇VNT2^: d!ֵ<_󵰥75<1=}7u/1*(u^}}BMmvyfWҫ}ŷ9*pLAg/908t0d(@^I6)k]Db)}qGb !+ kJOoFY^J Y%ŭKtF0Kv/6V / LYk0acâxV)vKYHB+~ PrGmB"|rX3I7uwtooJ;˗QQ v;ۄ %ɾD i8ƨ(QvyeHEP?fH 㫲*%N" XG#B HMRi 1LP[z&KER> |:z[}q:[V>VT.=*yA[(fb\bE,!S 0`'*) &M+=@rճ6EŪI f}Q80`3j^Yn'|B)ǿuEB B!U{~BS+1E~Ya6+ ڰnD,N}V^e$stQj_F8gdnn?7s5jTA7 ޡ^XEf$L: JG*vd#eƜY&Jb[Ə2;fݎ-ݽ!"'HUKkҍDSm^Tr"fr ;q߹\Trxx}jCBU('텞{~NBW198D[,-H%'!JMeigl, }Enz]dLFmq'߳4c)5\QԥE_h=+:HuA*VW(ޟ$󇑞B+ [[1) Ϩ?Sɠ7U;|e2rbWZXzd~hjhtQ_ U J~oVC-^wJ1~OiBҜ$(Lu2ɺc \N}ib+v h$\hwr]DvXTMf\'d>62c6 ahs* L!8qr- h|^d#Cp3!垲S6A.pNҶ>@Ik{>NzIVX,:p k,PBJMv@N[)Z7Kc0qص:I,pJ0cMp~ 'jRI\2Ade=Ч+䩺ʱ$1a5t.)x4>1B!%+6goNY?j/!ހ _1(4w{ʞcbfA2$$ ӭ[8XvP,V)V*m{? $<̭ͤ%]gvsj/FA(@*3AMa܎-, Wh3Ѹ{aW Ɖ ,edL3eIV5Qf.)t΅Q,^g njh:qֲm":E~_`T7(HN P \*Vdy_U|?&29|9z8wHmMSP XI"k)je{l$ JilY^:C)(1E3eD:MQY5OqWE/ ],f-z*c>;b=jZBPVq,a8Z摨Ʈ &vavxdGC̎*\;r,_qz9 `>-_V›YW}WZz}S+/o_Cm;;Ř\S V⟯m!XML'x|rRٜCaʒLp%Y ?A1g$C0hJlr=l|;$E ּ0Xc{#ml@H<9q#:*RjHJ!J{j" "XDTւYĊv::REtb";;OTBgB,we/`cK:1?]c9k"8Dk5Ǻnظ PԨ=t{ɚܧ$i;h#>JV8uv=F *8iZoӽ_֓]YЬ3oMl4=54NOcm}-㎖ƭxv~@V7ԧjB]5l*% y]cCGsy=H@_G.^&Kk-Ye3﹋WI&5]Q K*z3Y3w~. 8݁ 7zcDkvq u*0bO`zĠUE4 x~Ƶm\ 8"'nƶȉ(9Uf#UJ2sHKs5Y;!~fjspWfn/g$tQ+[Fazxof"͍ ~"cJ? 5NwaE"47Hm,S.8> %CV1GJ W=Z{[gVbR( X#5g[v IΒ.PO}5,t8Aevř~xCz q1䩛C@BкǨWRpM{y  ˿x,X R[ے7\{!,"+H#ZuDxqdmc WPM fR#+.aRi>J$RA5#V9p7߄npHsp'QVPmuMi.?(WvIPacw:+Ex=d2;!,}KO fJTeP'+$w8vEbr2@~xP+"|q^Įj/ %wE `l}M(B'M) O\T/I83rOtN,!* ,4:!)/- -m0V1*,!| 1џ*:L~z(4 '4a%Z˨q>"VX8ýi**U1VeϚNi7ɒ8wȠOkg(f;t( Yk , O[ bb @)lee zJb".d"d=Tbo">F٘$@%9=i|8d\V.aI#{MN?jv"M^ȷC]Y]t5B.wt64<^w~ѵReWl7Fq;"^Q=`<- S:$#DȘUȯ(ѹ{7UIj>˨ ޹rnp֘<]d}Bv\f0 rGw:) UĸSDؗ錄PIޤ(C|.@ 1#O*]:hqs1u =,כspڰLO߈S%i`W#НSOj3ǖsrpbIGCrk>7Gֱ|Jc=E[B13'3}ʏkG!ќPmLRBD0-.[O$Dݧbw p }2581NyD)Š6:<~ZSGJLޓ~^ ,DRyn2O}<zpahl9ٰ뚴l1E]\_/ٌC!PXw|kP]p];W F|dN&\=:\IrS'sAK 9Pqt?p8>T1VV!.4z,=T߲Qͷȕ;]v1m4+Z2Aբl?̲|Rv.8RO` muFfK,w)qtFZ_WI_bsp-4i꧅hq_ &34dzG,FPAE>(lрr(Ң* v):J Ց`HW_#HQ3կ["Zy,pCk@fj{+ͱvvic]7 + XwKڝ7Cג\%8bh`~-çi=*UX#0ƚB=Z1&6e+.0=9S&Il^Mo(jmuGwdYANIx4xL*֜P%x  RXމYl S #)Z"Xqɷ NZe?ye7`2;ab´6|S/w92E :4hr=F̗jgΆ|&v(51!&wؑ;zaQƞs765 :7Dh:+ʳ`;N<}X֓\̷y)bQ3_sA *{mft mjY+2 aZ孶 ']Ni Qkls;=8 mTu6 ʭju 1ʹ"Nؗe)e%4-`sDL`]tɰ^DaXQ Ng lc\ʔѽ61˲ oN[00\j}]M[f"'lyʀlr5L$)a樿C8ڷ$%+ǻ`ZW&ŠՃ}NmJnSb#XB L"S$1f3}U;gy py%OXDz Q TI-f"f0Kl&c߀Vn )EQ!QXCOmV{;~#ݎ3FuSp@wR9$IJf4 Q!D/p"IM[,wp -.o [h3 ІrR[9C{  {RkE ɏ@Ri++/Q|[$)Q8˾ +y;Ƒs\o-՘lÁ}8NѺbg`fm. ȷk|4ud>U "\5xbgG):g HwXV`S&#Rd\*ȠX$O8+ں@P {5{quL-+k'7$MHCʑ|7EX( 'hp{ 8j*bb|˖w?ӂ_ڋfd#gZeDm.EK׽go~8c;feavX@`)M[',~ޯ\E&.g]ZU6-AF5VGX]ި[ .s|Uzֶpfa3GK;_@:uk!V_yr$ͻM-̬ Jd gH)& J|xJnϴYß7 ?9@75aX[V;&q33;1)U)O&e$Ùt~JW6svQ@ȩa <ٸa Mk؅~8scOg t  :oO(eK0ǔeȪc_~AMx!&qk$wg]OjIթxxvua8nvx_RdQ)KwiIYq Ս$$ٔ~ 6@M˨}X-4a?%Si; 1`.葠2X~#EJ !Tx l;/R“^@ceS L;O/f8|?`J,?Vc5eeG_>wQs?ej Ujrc,>~ا׭[tœtjNP*[X`F4Lge$ $U1{hpO!bu̫ܶ)IT -*49`jȽǂ&j/7ť٧bC g̃59v% %<$Jp<؜=P޲`<#JZj]<eByݬ~0q^:0b-iA71j\Y%,{@ XJ?""'=U7Ҭ{T[* #}ZUmf<]1ip<..Xaʲ$o=łWa&TQ׻2f.ܷ%!G!ӣAXZxzzϖXȯȩH{Vd1\6 p:*q޻r0"Z6x~pEF+4ecS:sPb\,SڞjHH |4ʛ]8i׵T~akLw4Ez.YXspKGB%{Is1d:ݞ.̒ CJ)S(D\KTZ>Ol{ L- $vAˈ~]fAgUfKz8T߾f5>F2Aː&%w¬/!:b"׭e:G#5 *0%RoOw1dl%|B]1Lm WA 먤>Z#bHYؘ{G7gf827zH]#z3.{_H8ھթnA_F&7I^%bӭ3Բq#bo6_)uڛLPR:߫K˵Qz fh1if*FU0T%_GOYnV9FlՕ6T R'O[OG9,Ir7]ū.ti7ڦU}o8AiT~D*PqB]+T`|C-g|olrY9^ms0n^)wCHHY!mGsQޮbSaWK Vo#($yKbvLaP»W590Fs`4'244f6w?)jak2 ^wx#IQwhGl^bNk2NdYNwEu =kӠyE "{]"*y#r ݲoy$:. tҪ(@AA,9V/8$M{֙"A%v>R#G`kR3cj:Y 4I;,Qz'Y?|X9EY~W,_ȤEw}ݕ\-$Bq#d_!ha2S (Fv<2RhP)"q)0ƞE{L= ”iM#VR)8Iq-@+vfcNwӳ fJbAf.PyOf@R{ˉow1CHZkFEDIWü`nc4V5biF#I(r 5҉ vr*jEVQ05N]1hɲjfû]X f?D FƣmAkQ r_Z-x R ؼ,CEkmO" p\R°kl \lR`3 c.2ي6,nޱtbۨ Bcr^J#@H bO=h%v& zlLTӳ2 +̺- ;&8%'}ǣ x~͵maun531[XoȊ~&|imI[q`#-' 9=.#~TdmN(2Pՠx 9ǸS((HO|X]`1D/&.cԩY6f֑Z`{2ӨRY[{&};QG=E9A{7ͨ _aniZ}#/VL HHG* K[t%o1f^>ļ㼯:V۪ ``:w"~j~E c_=B@doŰhB+='IaA-VyL37G-8n DW-w&sʚL NF; lOݘ핪r:X\O # " r}oh.CWq.r;A8JCUؔl}e\(MA ^ W%.7"S9[7ʥM4"7}?V^dtQTO3䐉Ai; WYB.ſSnIb*?qSh`XheO0jŒLܣ`g 1,CX U k4g(+JU 8޴PuF6W:  1JtAp&JRqr*pP%64>k S (}O^j p3& 쨳Nq^=@$N/VhvE؂1-n$EsK}$dΎPY* ko;o4aw{U/!HhVCtȾ G)g{R3+} K'Mo,jaiFXDЉJtA ڋTV]6&f$ ɥw-_ٮ()dqfh!qG)5ľKᷛw=RPޖBURQ49ʲ@x.NKMF|si%HSf)a2 윎iɕXs^|M!#]d< œ\]BjiSW)4 01 rwH-2ge>jb ,xf( >kvRN-F &AK8fHKd`j,ԅ( j9rNaB!v)Nm@:US~Z]? Ojp_ѪfǍؘKvn4L=m6~tچ@x*j;d]H،th8Fzw9b$<ώg9 G(!iB Z4'lL}c/sZy  WŲ%cH`@#5 oCH[= YF=I]V|}G*<lH_wjeA3K[{].U@ BW4}@(;Tl߫Œ,ARʤC(G[D#mӄ$Qh0>3i-VpT3U#{>HBc$P͒^'>Ʉi0Cvt5\d(bCeE̹u̘"K.}P,-xhL˜%j? Q_h_Ǡ)~`/iz(B2yehVok@s=EV/qC\|J(z:L0>٪Lx,kbV=J3ŤS@ a8#CP9Pe EP{wU+sdZH ѱ,ٷ*d+F#R2w*'r*ةe"tG0zBE~mٓz} ^[Pỵ=YM}|iMSE+hi]LT`[JJbPYPӍhL $ڲ޷!Z2?/ GΙA $<_N zǃlk>XجBR}nT)i QǗ\bh:HюCFM@@rrw%oӅ4@`>:5s.i+&ySmT.e;~IAw)L2n],7Ii5^DhXp]$ɩQⵒi Ԇ[Zq(+]AdsB)\)lL %sU߼YG^r RI9tMKWvvD{}fBw LPy(;lU?, `& $#Ad[U B6UW_ (G>!w.厝É_mdH s뇖U⃜Ykf߿' B?ԈZOXò'k_-.W1 ZeJ׷o|tbnj*[2y"k&. wIiTo,w'%ܑ>%u }}Ę2vc9 ̢,DVl۔ܩdj<沍0Ґ[`[5o@ꗊ{rA G<% ]fXbRW'_ZNbb?VGZIo$> Tt7_ʥ߃^^Pȶ( MMjî_M+*gYuںRm&2= :u2\nfNWvJ1wBc)xg5]#*iy6=)jw=#=_K]lv{2@y66ܤL: Qk2%:T@{^[Bo\D$\ţ=߱_\} qNE^L0|}LħKC(lPNk)8ǐy(Lxf^"BQ"]GU wNu-yφ HF<,+p;ScZ+i=0:0.w*@"druHzKHja58R]|0LxfQrġs'mHwjcH)|\43ߤ>cB3!3pgg``7kp܃ B#GNecEW=I0yw <"@4b4ɟ]wlN 4d3px=R\VfƯe~slc.x%іlѿB%ɝa/.8ݻ'!2шfk&)VL5T5S:thkbOtɴeax `T'} .?v,Ho\ouMH(*:PxP|(RBmKS^} lim iMR~Tqy"4rHYZܼKp5zi9wx gZ $(i]ջψv>fx:)·n-q{܂:>X>$0Ta}+),_*Yoc 3޶|'hRn7zE+f$2ͩr G`FV0(1Xּ}m;2hH3e(26ρeXBA5IIiedPE 9-x_` “l-OugiVL5U1;lCbh>sT̉uyW@!,rXP~-s^fI+N`mޡ@\~oqU{}0 % ld0Hy7JAY q{qzzC&1ܳ5*YjE%[a t}M9 F1:T]P4иsM`#1_Ͷ"ADGfh%AdРXD;>+>'Q[Pe&wwʥkd1ʵ-ڿ޽J:5ԙ:jwR RJS^ rZk1h1lᬑxb5Py3/K0by- ^pNn @r\e!/3:0,9g\RaVUu_3,cQ*j%5qȈ1P`3$f`4@W9 Uc mj 7/CީuSĐlwlh7Pɠchfub[xu١=C̕2ghDs) , v" Cd/ _.r_o=σ4W;"3BSAQ%Z|saY,hI웠eoNCHϷ(O]@=xM dq }"f=l#/1H 4p; (*TlV5L {[sxO>xUq;B4Y?6˜ Timc7vyf៼U!!V 7Ga2dryg{sp&]yoSs~PQc`9Kaiv{ھ<ر5rA$Y0(x$mPr]HxO6qyZ9rġicqe[54I;WPɚ̲4=q.=@>B6N2 ~{ V K|e&5[ͪy<$ƪ&􄖰&X02y̡Jmu -Y9?9:{଼U$~|Kh,9Y.N^0n#A-{2=IJ(!%e?Q1 B`JDQ/X2EHZ-[Z`=W*b}?!r]o &.$ڥ9-HSyk (T!|Q0h cĒTR*c?fqRhTSBs&0i0/ _CB0eXZT65b^\ҫR܏cj0٧Ӆ0F8 Ü=<[**P^jyZ|QRY, 3AOnHK&W|I**맧!CԡxwM>582d$3z!BNL*,_L&e[HG(]Ʀ/~82xb~k|{}-lu1%pO߳7>TpY87"f|,pHM Py+}V!f{ )ƏkDZE6z|TYvz~Rݰ9wVݿk3.' ;2lqj ~VoqkCUOaOB k[F}͙奇6p2 V~_[.:zԲLpou1 Φ﹁N(ۈYXǿ0ِdf~Ѩƕ<ύg>LRzOqJn2I0y\u1AX(ؙ#x)#VO|Kb*/ajLL/ Jj}QYƚAY#[ChVCiXQUeq簪´i$'3w{L}gMxy'!TcwPKB~M~1L⇗BBal؝DlVnǸ᥌#o:w"X^8la&*V&E NՅ 6;sPG =xX*PjMEHՆ)DnrP{.+cN٧ch@PB$).qF;'\ą`>2t}Xig-72JW彨vEG)"aO e9~|d^ѯğ$I6(sNUH)A(N;Hn,'ӫ@pܚHI*&M:Ø5;We(͝$'K~")^L&HYӶVm9"6϶u nkJ. $'BcLڮC|<:/}H)o]ұnT=D[] 밣F2-ѽt(>Id #kpk2.aǚ`% U"계}6/̸+ae+Fߵؑ2#(vhU&W :Md"e|!QTMB&0j(AU I6@@m(+7Dq5F[7Zer z'2G4LN$hR \;Aeê?ŔƧ(v|qlH'ǐv2v9&SWs i*.E2]źiYWkt)ːQz-m\ұ4t/}2=b;)2fO.(Xfc\*;PjW\ 0:.c(UIVfI(1 Ca\HН;U/5"Bd?7uRz uq@x-bȹ.N↤*ĵ:O=}~CoJՍ 1jtŤ>8̱LS)$"W_2(%M| 9qtdʗ :{/UPvF'"FG^;kU/sG,$Zf0BAᠤ{|WV["tKt,.ii\IQa+. ν-@4qklnѥ8_HNJ.lnz ժX] QMޠ.b&#viƂy`n~XخҲ|VKvetJ-(~DX/NFO*+PMSN8n(Cl&oRº*eT*}Iev{;>$-:I~ W3c(la<γЦ;(۩FQ9~}|^Mpz>0$KEg(Ocbz{,C5 ˀD[\DNR_"ܫ>%s.f~R9][5Fh5&S8Yb馘wIohLY%C̫eG+XQ+Dy= Lo)Efv,Z[UN*dIn(VqAƒ:eKb*z1 [pl9e]tK~D|<-+ p(cFfP%C>9$Ǯpo;Ǟ&[s ڨ˚8"j&EwYT|v%|`H..xMm^| 䬡SE#k|ٽwx'O!d4$Sj]NE=kr!g #E~  B:o&?aO[4Gy!Fw@hloPB';ySz_( ܪV^קV"ݹѫ=Qqmg.b) 1&C|< 0c%0A\9q_En:͞Gz8R//0< Vֹ͖3Ց e2ig Z>IB)QO-23LڦL1Ar{.bJ5MKB=BrL oS u⾉ØdS424l`ZP I jbDel\9`(o?d: F@8'-jgƞbq-wRfGp &"oւm&#QX `eJ6l}QR Td8*UYk'Ghhv 0{NfD[Ss*+ČKD@=toQhnyZb,rv9=gWd=)=ropў+JHֆurtG G7B gp?*PZ_(knG,&q"Hɑ9SҲd ' ն'ҟ4u;o"ΐzAgi}Ow2 zbvmx{:"?  z-[)S$Qlu<$LAVVk}]RCϩƑi#'J]J)'Fa _X5U NĠCA,|-ȟRxZjhVe }b8]PV:o8,,xv[" ";JRݍ%1GX5eCT{ImtE74m8epl;.(vo&A<KE2B Q_Dz٨[ $6Pـ q=:OҶIr kH;sR&0L,fx ^+8%NwiJVNRӫn7S;*]s .[&92Ңk={/{~$Yjg02yx90d&hr=J`&Tg!@ޮ NV2M/$k;1}L%7vŮ\G(A<.;9e`+,c}\t ?\_W?;!V28 Mb:8o)qq=|a?ܠ# <n!z&C,7KW~wAu&R}'éSujK9Ym"FÜb&̐Q2\ m6mqug]@!Ǎ N'3@kgg6Vc=W 1 h ցSL>Kȶg`VUgqa]J,cbK,n/L_uE;[v :v 0; MS$mBwFψ)\`Upw,ԙ .6P;R?Cχ@q"5ςsHԉL*c@JJ5Il9oa`= :k>xPD~dIWXn ~EO79붹HB $" ]bO U&RO|XuQHFۗ@!}bpUC68zh+~ x7eWqB9nۿGI0r[l=J; N#៧J)'j1T-~w&> 3 "&/)Butv(95H bԗN;3Xm.:?'`k^p6S,)Tb'<28=_Xyl"kXmB y3$ay=7Muj * 81݅Y 5J`s--ZquB/'}x<`3|,9a7 9X ܒ {VFXg?Ƿ!h"+gTi>>s Yhޡ 0vqcAZn"َ -q.KTa雳ŚI_&G0n VcI=N"Kooȥ~bhqEDJ8elE / ц d0~y %(@`>9RpF  7wO$t Wl9`[g}8BcwVV]qtf[S7cN EIy"̵Ёȸnor46S\O^f٥vn$ ~&A2`2!䢤o Nt"سH*_IDECV<&9K:5e jZN8dY43Er<[DNSu/c:ONAm,;zatSv_9$а'8A!e7θG|NF!nʄ#k~#>i(ӓgNo02%'\t`zs.;ͱk*o&sR aϗY.@*G:82CKEEJEq I IҚ5ᱢ,ȘkY׵%@t?*@`k%#Xք/MP7HKbc vgĴN Az!2("HFSȬcsk 84(b~POcUfFkFF.3X_y?JHˡT%1< 5?2(P^~*f+||U:~ rbಚtVUJeiuP.)&誄z9-ZV&gyXǎ@M) !Ψ!EGBc*X#?*?]h笃>_?a#oB7ߚVnۻ"Qگ] ?G. uIBq*m_u=[)L[]og7[ hR,SaZx &HN1RМ2(u|tlg9(u Zx|b۪j1iY}Ch~/a^5&3אWJ N'{HôI\n(J@[&abAJt4$Y1ێv&4[ȃ7 6j$ B!*̨|48$t@BZbvk/58{{@ B_om'ܞf~sK0~?H97)@M3&VW1?l?VN`Z{Hq#QH0cS~KV[}#chk it xt/9-8BMi)x StO_FS.]J?sdG>;Ai=1W %3Ѱ0 I E76&PMs TUW;S#8ymopA>|?P0:AzI%.!("]yI0DfqCinvJ}EE G`N!4'1Isw#T, :r/ 돼sי$|'HAm_qp"DF9iTܩh|}&N eWais+zz%]_ܵ<ÛыMaaA'"io I$AdC̃CrzuvWnz.v)D.Za8- Sv TÉl ǀ87*7$5Wf+oVgzC$*tZq >`Z޻#{CUxn4% 2y-Tpb4:c 3q'6eJ ޏd/(yǔI鏏MC#ę׌2$3lXdݦ1s ۺYRRo4_RT:)`?3d@)NU2ʷJ9A Xx$ۘ 熖X%;H )f$oHXja9xPsy-hPhFayB-/CSeztcq/a}>6Y>W@(.h)I;~1'JZN@p4ǿĭrYDlsK1i1RkK51zXy'K#d<ѡw͈NqT,Žnj )0MsbmeKDCBiˆ$*ɾDV3NV+; @2'Kڛ+>3XsEYh"\A+Jd(VOegeXVuDX荫g,xɿmȽ4qM`puuMfS+DY,"ji}srer.ґ[u1?Zʷϖ=b' ?ikG _VщI}.o0}BZ8arvGpt^k| UC(ډlͿ-7s4t+4}f`)U#kG!9) 3vn ;L?Kş8 $Y:A~K7W7lJa <̝XGÿ!D \693q1ܟu[e_c>).]; 4M-%sPD\G̢B0ZbKļEˎ&|:ݔe~wcjAX =&)$7JycFتi]9~1v |ֵN&~o{[YC<~gajL5U4:6ԆO+-m4ؑs'ξRJ\9-'-$\ Zޠub/k:6[e x7>包ѝn=s2u'qRTrWt=MK&VP j?`;)/rGBA@sC]4$Kܨ7sK[jf-6z `= U)+K jba'Ұӧ.{r=EēJf2At8M jfA7[~j<PC#D.% +6N>FQ)W=fJ𶳮N0BtM}0=Zc:WԚIchr4^e@Cڱ,Mqxna8I&xͺ{ڿ2tN @o]N; !uP\ؑ,U`BZ֌D,'9II)m&M W S~;Y>vT@77yQ.HCULaO~eM[cNڣ9l8:)(l(cC["rR$īD$xCsY4dj̓΄5sÔ(D-+385k:ݦaM͗@eng: :)Ƙـty~rG! 1̔ i{k92i7(%0=ָUNQĖ r$Td(Y<@<s]Ar!R=~uOI!ȑD pIq=J?X6@- ՃoA~h/lUlҙ^>XfM4&?UPen)wkHP 7<{%arjR}`ߵ Vryڭd{7$IV`Q6$h}@|m,l+ _w6l_!X{OWzh:YD`!-O4!>/-`7ᛊesAKOc‹\|v0o"ȭHmĮ=Q}ڻ14We͆U51 oY ᶫE5C:6 =PGT$t0u3GC`g;4>.!K{],r:]UQӳIck,ڄii`\*ԟjܲlΦ݌iNטЕ Cc=ʝYX^; ;hqynn-}b 8n~8<:]K%;c=mּd#unjʅ>&V,ŋ7+G&%1d:mW2ZI?%le =7&L&;D(-|< 0ܤ zZm^B 8Vc, >qK[4"BK~1xz^П;6ŒM׎k{+ocCRl%I27j9%Todlcqg #Wu$Njrt}q2AE<>- .*2x4"i5Iuo}a LOGRhՔѡ awqbw{YLXA=Z&n7E׵WO_c.Z3 H RcZ37\ DuH<:_۶ʔB 3LGWPC8l_A-ؒc>G_sZ76*=ۗ4怲hN,oa;ܖq ؊ ?#Xn88KaGPYc:DXGLx".w)9?]Wxb ]Ҭ"crm?q|yLzδjnu77j=y<ҙڕ[钱;YLD[[wT_-|*ZF 39l%t^^@ 9* I]RQ#tep5qVXŎWD0d]Xсe7d S9I,~|`V\eF' sa{ _,Fw7e !S^'^'*W(}(7pڛBkTJs+K? !!Z#b,rHhddyS,jfXK%fx - Cؑahǭ9 FƗ6?ykM/tB +Riy]Dtu%+-ѭ[n Q?۪p5ȫҐ^H|2p4<@o^E"qvA!1=ښ7D9Nyȣq |$ƍ_x6d;"T~ xI^L wZĔTbe\L9\o34Z)KהSO&U:S0ڨmw ߻%EXt; ˋj'\zh^Y@^anRcLSl@4NB%褄\~ `Z;ɼvtV GU+1{6$$u@;`};Z!f`r49wc]봲CNs딽c9Ȱ'&j"R!od$nKϹU_t@srQ0ʹWe'?mim$Xq3={zni9ـU4}ber:#ԣU8V6r"^hO?-(M9# q?26I#!HU:Qqv|ٿVX,xX~ YztKkY2-Ewz@YtVM)dX9T Aٶ.#^m= yy٥2ϊ00#K(1PM'.L~i gy˽5_}ˑc\KxʭKF6jrqHcUy WcVΪ֋&2gKЪ::&i{a[T\}F= ta0n?Y^FkzK;3%*14fϢ 0ڐ!Ch|DE܇3&Uqnn]_,)}fi КB_=Ә8;)uKi1 :MĹ./:Ot7נ#p[¶Rw.İS'̈ GH9Zվi嶦_>=3dM1mot|=p#i2? (λKFIG*n%{?Șh01rs2+<'~ Ei ^ KeCȸrj[1;p9[BPq]_( GD,L||?'Iq^Vۡ Wgnp0hIzS_AvZaZA63I; HH~D>wfG+"(Mb`:^SJٙ ~|0) gH q4?nfhaJQSPp "$OTٓh"oεPҁYk"Ǐ*y Փh8JjK)<~|å+#bd}z.>s2kK`$::#8VG^aH]E Ŗ\Bo(6jrulҞ1T _D/I^JT)6&-qi~g ʶ= ~RO^J$\z&vIC5`1~S5ǁ-1Dwq|Jmy?kM8ML hnsNiC({ˊf>S&,΂9P`g%Y=3{^*ţ܁dh/glDm%rOKˍQJP# ́+}np4<}eGߋR^},iܩ7g!8 Ou΁l`t@aY}B }ܻk/=#>TxV'Լ,V"p(Q0M+ )i'Y(1K)okZ[c!<`WD'n?ɑ,>>eIw[?xlF땞*8|;{1 E1raF1Y76V -K*K(pاnmr$$O2;GX79e racO @(ytua&&fB,D܁h ] K F`leɟDL72q!ʨRZ)oZ|7p:f(_q/#d䃣%IBA2M`rH?)2EX*c/IR99ԥ6DGoA0![|Ԩ?OX(d@-A(DL;\>F(.̇p+tg!Qt8vZ >:?4I0e-WDcgĒ@Ŗah0oll g]4NCX1\|Qok6):JP]%כǖ*UO?0/_=];); ph}|WXw8[$;B9MI>uE3%V0 >:2y &%m|E”uҺ0Xsw`UsP(xxDVUf]sf|+^x)Cƒk; ?WCC#EEt'Ot#-d-BX /|T6+I:e$(ƳhPY!?p\ V}" LKs:OVwKY.7dd _=98qj=Z!D孱ua)75 l|:>X "xo`, ]A_"5W=eʘj{a@kCujic-)`3IN2,Z7\T1-e+]3ų찱#6aVEOԠJ]zlJX[zƩ_ |w;ÞskaT"$C廉Ѩ}>ye&Z"0X0TפOR/H|r]F-Ti5p@ %k]r2RAdī[)Jb0%Za]l]Hwb6tI Vԛz?%$HȎ^MiF@ng$T,kû/*oG>u~Nwp,& $F{E+XߓxUFȄ 3{'%,ؽ|QhRB"/&=¤5XCȅuf6cX49LjUr}hgۻjQQTj$5IisO77/$Ev00c~ZfEg{^qQY2.zRF}>l72J*<6J7J\c?tsPo[ZGzZ{m$M^|uwh 0ryq#i$f cF5tZd7&|󉧕( (srTIB6M '@qB>!( Kω!)S?APĚ9߳cŠ[pݛU)+;C {p}t-Xljol^j /e9=75j8}PrmQ:nۏ'TD~^d:2|8HzwBTSϟI4њ#_!ʽ/;&ᐅ 8nj2ӳɠx `gN7c!{/+:L}"!@*sX'fSuZվ4j a>jdVPHڅEFJ9P{|!Fu(=79.rAG>RPW* vsbeJRGQOOc7&c-cʋT7,M]N2 w@Lf&8XWi1@s;ϔ>tiet.dФ-j'(ѳ z:&-l x8m(q"{ b﹤(=fVH ?ʆ2CPlE_3ermct$"f4>ط #}ǽZ,K] zcf_ A[^b|\XI]?/ڄ .rP|0ފ`%< U ՗yw`]1H2 RI0K~! EINc};4I l;;NvĴm ڷ[HߠF@c!AdTr I%R~vb|5نcJ--2NME=6,qu~g!L[Jqf#C1oT}<хPQDŽ:0 ]Ԁd$F}eQ'u{iBb%۹,cZmV&[f0馲1O}nc8Cqú0_3c, }Ӭ0}U{bL(]RAoéf9\k.),jgӜtLz!?3P=a:Q2!n.Fa8ULc #_.|oQs>hGXXdC/ [QY˰IYBbq/mMځ<͑w© s\y*W7ws*e\7a8EQVN * H\ƇiSƿ~څ @@лf~!\A0!/_6M׎tQu唆 S#Xm]Bb]͵1IU{I?x@\!99_tZruR3\C\9 }{쩠'u']5'XX m_ĉdj"LcUV=Q> Id-?8wweS #yȠ}<{-0,wkeh_+G V*jdBՅ$@`X_RNKu.~[AVDbvጂ#˙NJ71GQ83νSDfy3o .; <5ĄO+ x֓7lgz#17#vMcq?.WiU_#7"+tY׵%xwO!Y9N ; 禮HlY@{U{xYG=됚u l /;,m A󩳓h&ܯ~a/C`amг ,ZA>Y%IP"9p:imN`& xDƥtPM=S ?횒y^F_236D%[OaH4(h]UFh'_?<$9T@c E3Xhj'mYfaI#,vzf{d!-7j :>96ʢk6c  n)3yDR H4_ܯCu)$FDHMeK  >\T#>"1%հz| ~O&"b*o)1eڼTY,`M> \j~(.N0?xR*spm,XLo r:ۿSo_ sش{\?*?Ew 8(҆ ]cG!O&F01Ppxeɽ],6y>iΛUsDTaM\$tKwpzJ €x$T#mh%-sdc6ؙy  '>$|8/F@)0*if[Hpu>=Ayԓ=-~3,78 L+%'(:dXo"vcb]˟L/7CE:ń56p.¸hCCbZ؀cZ7DT`CJYڠqj~zϵ- 4!] (r(&۪>v:'w1VEA:smr,[ٗHɯnkR,3/bB[۽o/~CAQ<(hIFvYX}T5kZGXqBH:L m*n˿)C"8=*H3u {C`RjsQM|v dfbXT V^7 Z(jRd\Z/> D}vaKV!XpClߨ _4 ,HBq`^IpSvNM8+JdECeI?c_tNM[aN܄@/=۔$^ &1Ȟ-eRz$>&»#jp)08V$V;I1Y4瀒$:3Gӹz}[˫ѯj7u{EY@M<_vG,-})WR oOJ/BeϴSeȓlwM*VͿPj Y]x>JFfsȉ?D"W65HbSSW@Ê3164 .Hv.CVPe(ᩘ>SyxÆIz0Cg8c( Ht^ =)ΖR=/W켣813GD$.%]}JcGmzEja)w꽼mju.@DO${+Nz/ɭ#Q8B\Y(@/*S5h]ADI+ٞNP }xRէA[6׸:"'):h,f^B_YLmIy;V^T9~qQva$51 *2(]]rCW <wXM82Z@c|UTFFE54'<0ϿJ10Lr\7`sVe #1SS);XW 2~ X>J|XRˎ뼠 ^_ʱ^ch\&{ʵH-C(Cjix\7\ ;e OH=>PPq'}.C|Cw8~ҽAd$>lI|k\CkIz(TL1W TS jqzx\ T2`xll¯Hzw _)gׁUh(LoVM¼e3%z7q?ї׬~813Txc32 R4#:xXKTٝP`g{\E;ܥhUA0Ýc=|3˥-gH5PK-nfۦg% [N;߇"PS+=9b)|%ODT);3?^D#AWqWp6XmĆE]!.иiXAX=h"k.vn&UXJ#Y #C<OJGGI4:|ՕpzоdسFdRu }5DJslH+Y`پZZyJfLT<]wATgRp1f˝Ta9WP"1*ĜA) 1bNUV,%/Z' F+ٻ֛#mU3:j~5*8 /IZcSaс HH/#k+2O^ eZ:+(\*0 i%@2M,˽/aFS2=-\9 4ъ9ljma Ɛ!,NiWZJ4B;YX,NZ5۬eY1l>+0 ]0 y:, q-LP LrEp`WEkAㄼJ$j#ӄnFC ~S %" 9ɳ?pCRBEnGO<њQtԦ&/A9_V=Ho]4m*}ÿgcr}r"ʮ&JsgcKؤn*+'F7@TJ!X eRe*rŞ(áIzYȰjʎy8"-Pq΀o;0aT'S)1DDŽ@$HM #&qߟ! ۘ0QF1N鎃u%((:g芔%^<nq"neOսqD Ɖ bOXR|Xv=mV~фTؐ'$KɛfStqf9 |.@828s}}:26Q $벒bU)9^{:{I9a%|ڗiZL3wIT׸f&EUvĹ#!wtH6kě;7@zlBR^E҂p7 ޙV=۾A=S 熑s$9GRszڳ|=F74pLt _sVo%F$^1-eQ#XU/=it-rOmeM!ǫ>15aiMXBfN Ӻjqn~&DPxYJ4֩4c'*0z/5OK [M8.K`,ܦ),D0n\ȇ9=G8;|,cWCc GSaHO=khoga#M5pH 7^oV%w Rٚj^պ8_1Ē@Wu? gqiY+{`zf7';,QڀeX)W.Ȱj$;|`P$[l͟c=sM#a~vq˰N $8prQ讏5P`dLYYT%fYQc6$Me&V w9ݣKfxJ "@qenO AJD$y7"- 0'- .\xT+ SF2v ѵGSIy/^dGUb)šd[:Ai2R7mhjSS6H1)ތ qQ8H%!|ٻ|I0?a o^zY6vsZCUSC`2wweވ%rX4{1uN]*=p߾@ "4Ͷ0 F-W/_!;L}"1`@5\I\F!#%Ǯ">0C/L5YOQ5 GPj+:?'4%EUiʐ>BWjw^-c,:yғlrFQp.] n hFySMtS-G6~]ţ]^QYCggq+_ Nd!8/$ha6Oܹю @32%A7"@8&Ph3}YF. $;T,ŀgnlPy'iir ҝPh%AdӻQV(~òR:¿ZZoaSD)+HkdPd6W7kG361A'=$L=KMKNuP~.ky3#NeM%$VhtNc.MX -ˑ/ b`/lKbZKL6&Wa#HA"\U?!+~K\\2`hi;w{4B@kr`UNSkp,"|{`^%R;0$-9Q4WVƴR:  =dhD') /,7(=sUiZM6H,7_)Q'ƃ`,\/RU+F80o]Ӂ;RBzJlXMyæ8,A^6d1oO x % VYLߧ>AF}TA+ gESy~pIt>BT"fH2uhǞJ7w3DO#S+L;1W{L# UK _W`:IY[KT蟾D  ʰ١As4%+m~j5d 4qb%LXW%l-ŵ) Jr7{tph5vAR4#Xz;_sy+ -42C&* yhHϐ=ogDAucyc{"{=1?ѣwAykftڋB}= .p$ dg4?@W{~"OoYAeO辠V "?u4H֡`-A9[bt@͔ړu8p Hyukyk0tk2Y=XV?rF`A W^%.EܣG`CM.(nͯVGzO':}WN b\LJu#  ;r'ªIE<4lBhlu;{(P$ iP$3x%&B Xׁ@ 9s7ŢjBGZ-~0څ qzd.b㸺A%r^,܆ӉT5`z8P墕O[/W̙=tme/bq$!CшBŽʸ_YHIe+a4l3+ ëy^nbiAڮ6B7VOEdhZw0z#d"l:A^fY9^y+'J([*:BiLu ?֟4z%Ǻi[0YᔫAz39P̴ٮ"] piG= vJIJAvu׺Bxv26m͏izjmp?8fe@ɮb2s9r@5, >A!)8Jf_mW :mؼF3[H_A ߻ vnNWEx !c&/;YY7eFx9&^hNo_vДA#\)~MʷƲ27JMX4Oԅ&_ǀ>Bꍩnpz{U]CN;W{7F?Չ=Vuj)\VoRu_T&澎f~lɞ5 =.7F 3DbCޛ0ptz4F}9Ҝ .hzҺ:*0П ֯V!7(&1 'X٦8 2۱_ϑMϛ:r~>ހ()?-a?I]i:niУ@T)N"+/Py Y`7?zQ9 ۂ\ iO=b?qGPSk"Zj{g`d_P5, 3W:\^XBg5znq U5^%gQ/!uC--4X[sh\ ON1,C*6QX0|Y .[m;:Q8+ cI"p D0qň:#~g;*6+H}76[Toɗj ,RtJSk[an6 6Z5Μ2]3BfiE abn=iO 8Iޅ#|&Bo 4&;5珼[bZ0ͲF݋萴Wa@MRiX*6ː)u$`YU,(0UQkd뚲*]Xh+!2mJ;8 ylJb%7eVYOn/~gaƬW WWl)2fJ;Sr*Wm( 8DwGrߴ#ZڋϺ,V< wil,1  vWSxqF,U֗w 0|+EKO *//#|g+'eF3 ?{|D7vE$ȱNs 5\N8[1!3L'.wj-I5S tTv~'Ӥ'٪o~M1S3t) Nf{9 (LMcE\L{ƨ);Ήu!.Hī1 L=.26!bvqhX5PU2'|$֊G|CX|{ N:h\r!ű/[fK|²żBGW|Q˼[;D.st90kR47ARٜK eJVP׵\{5 7Ք+L u=/°|3yh(={r]Q\FpaD?!Х~ԁV8H<Z1sRw|l(K$QbQo Ӕu> M4N-C}/H٘Ĝt$ffp tCցoB]gW2%~"D iPys2]A5^vWūYu1US r\7Rh,5{? #R6h}.+5Z2ɀ0g[ }C rJȬv5OnƜftK U-Am8ƹ6:23a3c2av/}(%KB%,'Sœ=jy$”3)6XJʋt< 5CկrcTAGNP>aViP7$%Ƙy !gle1U}NS +sg /Fl:;LQFLh(*c}W)t2$9Glf>h2 +EcdލОrv=cDAW`n+[о E0"WQs?CcN >ϡرtS|cGi{eb7 Hc29!?s+@+)ݕ8.uvtVE5@me G;Ş{]e,l\s>ԨFq:7$iښZ eܣkGOKSKD]g2C` L(hgn#uGO軜Y?$&.t& 5i7~xwKYN %$G@S}O/,Z=Oe\%+lssg} lhux =L22YO[gtzD_ 7dS~~ U*hKGHPVS9_:,>5`<}.R(?PЏ=*h6#\*Ss4kCr!] ]1J%vၘ3=,i&Ly/D@k=#&:mCRZr=%6yB(xuA'A !Foh@T )X|:U3afblVr C7f~dkBۑqxooo*=lj+5R`[ӹ"+9J{} e )@Xqj\)7픢a:b5y$19]~ֲyh|VsB: |#4ʔz] "ʃ9*ZEĻMnT d '*XG6?1:S>^7kqW46n̵ò'6aWĎPD\81ԙ 1 f"׮PFg/T6_|_"דy4< |F6pchn~ 3}~yRV߰>wr=ɩ &K/oa Tp]"'ekkNoG}xl X;FJĴx>ñf`1_ :&g8js`[хu"B1լD0ľUQ ꎂ%꫇5 4f4)C=2f5#l i݃Y Y=1L! ([dmDDJ ue7YpVFk ~Jn'_HfoeVy lm+ݖP5*NtC19ݪk<wOhTfc)Z(DLbHX'AW(Xc<%B|Z.g˒ Yl5B[ ZWMPd{տB r_$a"FURp7 {mvCN/1b'8[X|Z>C >V9'hS0|Ӵ_6:,Y=;fÖ:pPnѿ1d*S  J6$gˈÙ)*ZڌC%o7Ͷ⮅uě8*׮z?99%~&ݬ60(@֢WZ&ZkL2XιI<9֊:\ aUޗLouXM3CS8+&MOZESNђw' M˛r/`QC}"$̿=52Bļ:#ʆg|ķ0z^TÛzM90i64v7dvhVTfC]%>~ѶB nZ Jv ]˟nU5q<[cdmƸ!:.S+9ԖI 'L8 3QsidA~x䰅V Or J9gB(׉eiyP-2^t.nRZ9w} ؀Hv76Lsy[R+NАo Y"u~]yRSi;+)G#88E$c5v*!*O7ROC0U+2jc7M0(`k`G,eʋ'R@霛o.ӑOHj 9kwe ͢AQ9A=*1;ېzn8'@K1B3ϖta|×])kcЦ5Gg= ^<^q:08MI12¬rO]Bqq Zž$ %jWPȷpdIqϚhV$t P^wc-j`ɲAú3!d7[B @mxO,#]l<' X#tNHԟ,TFEoNnʆI,& .#LE0$eBymF=|G1IZu z)jX'"'nآb$ tX~-F6=8Og-਑WwP%A+R%8P\R| *59VHH))@9# ?oUU$U+^qוK^{:',K(ٽQ(I{.y,9 [ggp@,@J sn#4uς퓯5?MUk`+f/LJcƱ;F"@`i8]4\[ܪGǹ9kLȩv\Ӡ3_K#gD"~4לU5}wi<1gB*Ǩث yud1"NLO{ "jA^aLwFax& yP!W̉7t#vehxjGͲc6ums2Wŗ;٧N4KgS2\#df-x&FjkŸIb ߿ =Pj DV=>xO)pDJK?ow@.Mw'y*o?~]/ikp `2QT#6_D<\kJ hs,H7DVz@ƅwuA'>ax+ӹk. |WtKLh&eBD@z$qg&G/R23P_c PE>铘 B1ϯGȳNx@xY"bwhD2ON DpXXA"chQz :!L% a"o/M 6Rݧ\ÉgO_1DCl1zUt>[8qV)[$ݤC7| AlNϞwaBzwPpk،?6<o,6_&I t}3=hi88`؁i}ﮆa? ' 4п\_J}!Y$ߚ2}]N)g~os="&KwY0=;]!Gl ɇt({_\]V$@6<"]FVWBaiTF%Q\>HMeNҿZy鮁[%\ re@1`#I_{";SUऽ\crM%+M5Y3fdhR.g~%^Rpgd!w̟;f9NKfSAYg"`frIIEdk/u<-U%6 >N w˚,pnT5tRK1f{v -/!Jt)<lrBÇ. + 0IYP*T#*C`b0sŌeμⶺLWE$)beG ϏP$ch>(If!^uFPR)XD;&{[daEzF!qKS57A|$B q3ZPER^ a6B< h>nA ʂRCAzMgcimbʦp%13w~ S Sr_F'jZoo*FC/yW]߸F6̈! @N0 T`\u{A^ewK6aJ/nVD`(3pa+kŮpsۄ(ig/T{$eJS0ΞcҷfX?cB[!wWf8P<)!˘]^p5]]S s!c.-q E"P]amUSf ~P8%W `Wnv:',LV-, [e/3B+Dadgn ~UVջ:, լPJt HxkN񧬬:"ܹ5C 'vG UU*L4í]koDi5$`k9Jg6TUuY2'<3w[@'XZ< 9,N?'dʤZxyy|{brX` ,V*QaU]V1ceS lmWMf1kڲTjN"΅'fяnkh`-"{\+z'0ޠ+7 >%XjJs-sď=8|^ 23c(e eE"T R3ЖaV)N[1|S):m!O:P/O'hIs{Sx/&DK~Mrk[C[̵Gk 滢j4ж~bEȕPO`mBW|I-U+Yܕ 9o9c+ v +IW0εHtM 9\+ z0eWY/]ͨNb E$O~9MOx^my1' Wلћ Z s`٣rnځ;o4Jq?>efGZ4{]vm 4;㬓4o B.qUIћ^YL0IY>C!܂)جgW4 PIijǥ`UzM@/\8K0]Yŕ^_Y5yhV&6ʳMr@*R]jOb " <֟#_4{mwKD欜 H,\x‰Soi%v 2VaFAb'}.npeV_s~,#j\Jml2?@D*^f-NaF5qPAIRԘ>'*=y%ceh8ȰwR? |Y-p{BZraȒ|x/[dN~e ̂]r"`ԐE@VQ薐e AH`Ak]Z NQUrTQ I*%?ȗ=߄w]}4\Yȋiyז=#Y>@Zܛ Nzg=)ӉU e6CIHPJe?cc,m]]jۄ|%2ʔH4n*{}2?p[ Naᴋ!P<'[SCEE\f/)Ro;ԓl)}6[BSef 6Ǜ{>$n%o6[{ȍ sf>J,r2k7g3 !ƧL  “vcV:r:}>X:QQܵu5Ao KDbO^SOU_ z+HV r'ͣaN "n08mĘƧJeki8,+:ʔoY(64QWvqyz/SMz1dky+<,pPJ};8Mc bwU]Otw[˂aU0;9LD΁ \.Me ?(SSz,w(7M*9֥.]na崩ʽ##pA:gno@:B)9ܮhҰC7 #QlltmbRܬ8F:]Qa)[>dkòwu6NFψx jt=*CB5KeO6*,NŜ晻6V Ȧxxwީ*2 _ ]vw$d'|+*#t] }'זżMEe$捅ܯ*4W ?]i|LsNVۆ'lRQ!}ڴQI1l3l_}HŦzÄCK0֮SCQk -痳u G?cM!e@(+/H|F- :t\H?P| l,ghSО9I>Q͉f(j#z%999[ZfW~]˺_lH<X@(oIq)f ^QVUAsa?0toRfE63]c!~CESU1v4a|Z6؏lx,b$W/X2$,U]HJq6PMd]Ót7R7DlM%G?T j(%ͼ;9vFz7*<b˦aoO 7VLw ru86?&+T%ؗt|/xC6潾x`h 9C98B~K{{eyxn`8u& Ρ鐜[O nx<9Grp{@êѮG[YAB>=9GgΊis zPm?MrY=%Glz*BEnC5 @'}4=(dW FhC۬T[ 2r@.ǫR'p/:WS?\Ea+규(Mmuy9&oQ|/սwfP5V,j*NhxL:  |ЧIع.ov NȨݐ=>=~|^P]hRJeu闼kBceܩe+(;/p`Ψ-Z;-.Ի%g_˗^|}Y۔Ĥǧ6|峘x{˗:]>a}Ahs4R`$kSP uX}}41.sx Сy/!#]Ln%m֕|Y]sV1F{Oazo3K-}W/NR GE=5cڪn i6tZ*3#J& cD.NV-wUT"CfrX O]0Fǭ5Ѣw*Șh^*~9k=xRd [ޘA_3B4`&'::?$3ʆb>Pn\!A[(wv0`5 \yS_*4Y0)Wܾvzp7zqH2 {xrTfw_7V>nͨϻ5r/,RfG 5 $ePH;q*) C8 e<, Iʕ-򗾦ׄL'@LA >^1&hXJ uB ߔ41:F'&ս.^{Ovd.Kd6-7gHk< T?*Q:O3^gށ/Y͕l(2(cAU?Eto7/c v1!$GUM(І`K;*m̂T9#**d'F]Abt"1;XibJ^"N 0OIKyJ@'3E($}վcͽ% ,kkئcJ"(TU`6{Py|( !А+i2D 3WűQuQ/(lPoT8Eݨ1DnZC6%vw2K@nġ/d.h?)ad6;AܙY5u[X˿fc%kch5NJc*m;qKLoN<Bt&t {Tu9s>^]`?ϯb@R@3%~t;PcjÂ&v'#ݰ&GjM;n ,8KA FN+^ApU\< ?m)pn}EuJe;ݢ1`'v.b[ Lffs+N$ը펗)%!#N%jʺ~q2udLm-NuIj5ǴI_ "g$#TU!A|^` 7B2fU2wVQχ\W'{{z(X(gj"!=T:Ȯ*fK25ؿ ω8fhE52Ɲ-kV2_JlɟrA}潗 Nj(P⁀2s 6G*r94^j!2n1jaN ]WHkk)i!n( V;*MH?{564mndTO4оA}ǥWz"v&1!Q{-Q "xnLwWU-Df+42c8x<#`D?W1ǃN@ڻGP~:%9pZGODXK#`03n23y*/ꦥbŵS1nytXmCEw0GB= (O:vckj"8-n{iPz*/uaee=Z|G^F xUeF=mgOidX6z46r#2Z 7\L>RrhExw 1C< ; h?*zDхuf\s)V%iNPJnAěb ;zP̒$L.&3 C!f +B90#B6 QlP k[؅(mT"K) ř,ڽR8I WQ+~B69v=tq/J(7b \Z4N靄I`s%{ iF_|~t)1^K)b-L CZlo<(mAŷv~7v?i#7nE.,8>Ah%)dSvhX6S<ǥΉMvO~&dK]}pq}8F/6cȬ{p,fn|9=q;5~T,pwV9^oj= X5 ˅Yt1$=A^xYY :w ĭPJ4Qjb|rHࠨ$|W*/BrϰՐrzC78.CS@Oو-ŹJIiw-3<ɧi"X' p_57+.SOJ#m>H0.BfExisQ|%Wl<@F'V|W$ Hf 3mPaa(!J(\xB } izVjF К -.7! esthuP㛚Wᯧ[jy'l҂7Z Z>%y(ؽE6Dޓ記,Zނn:btd/=Hc6!*AK;_9w"U#@y p?/=wreHCN3+qvv' 6;8H"X&OTQB>i"' !c) (؃= 3 | - %A\zFy(8^saf-x^8qTIkPnAIK5VT5Cxʞ%юX؋L(\|F@bu*ЙF)h?0UL5ec@زe8qKIPR퍶Ɛ"vIGᐷv9@ڸ|Mٜ.塆=JⰒA3al%/hquB(J7 `eZSpF.aWo8eQk ɈD[tKBqڻӪ3iZpri~c5Z1m}\P l/ 7⟅QOD1asҊPMA߉ ωz$v ."Cd",u_b*%˫@nIrt2W~39U߅@%,El4 <bRZ VP<GT׬I\B1tA}SnG3c[8?9^iz+jH̅LQPFK5T8T4$K.mYX@_hJFc%>P2KRHOtߠb ~9pxQ6Zb]Qlgq㕎gCBN碟#/7&fSJ/LQ&FiHR(CLA]0gYUψ鸄s "FJeH8$qw w^NMxU4I>,r<" -*UI+x-l."Hx9"nļ~o tr9g);hۃGD@ L"zq'`2PYGךVɜbK'1?D`Oͥ夜`>g7EXjôa!ɓ%dNU1}M MPsiÀ kkDkegxP>%8_.-.h! V`?o@Vdyo_V,rجJ6)[PTXlĀoxJ?B(\ iU {vΪ`Hz%9BÛI{:Pѝ}C\r b-f-6ܣB>,(#Z͟< Gh" q6uZhKi7Z4:LHucF/3Y磜EYY _.*Bh|6+P$".yAy jDd1rdc'ltZh&qgs 6?A32߄{ `7#F*i6tYhRe luKQz2 ivy#p*IMj.BQ6Ws^k.\1xaTL?@a<8cFQ;u(њs @ޫg$ֆUn2-ZgZm>+ڗLԵk ij%K9{dž0 A /sRO6i0i憦!" =@X(tn`PjgIf ,36EA;۫ جJyt5 3dA,/H+ya0}HXgb5S?nVZmy{ij ]RSjd & 0H%O=puћ،PׯD913W)eܫ60׶ G)K.%`_[v=mOxZ|47UGf=R#>ZC)/d@n~_B"#+i|&7,[8߹fL.OA@liI3a˽&Bo2YZ ͋ʳizgwyl_qcùlƔ|Eu>(nohyjEא=xOzqTqo[Ǫ|\״α4 Z|Td R qnHBllLk-)Ux}'?3Fx{_P焧@$ 2Qzȸ*p/zwY dFOJ7#iǬЯ=n Jpr2r+ W‘KdHl}l4s5vCP~I]̂<<;crpVy?iV[#ٯ$=)v_S 3N1r/'a!kThAAQȍI3:&X^OVװlmcGA #O2BJ0^Cfaiq$T}&%G=xvH8]?xֱtmne>Psujr \s0׫꼄3t+>4oWw (k* 0 @ʷtQ6aQ@@gX.A8T" ՚kE}Bb(/De`J-~ T"/,}u T 0>'r]5xd,X| U)uM\j+N؅a|> p٣Ŷ7 ~ _ָe(A$ȓ ԁbY5Ya;tJj?2Rk`c(U0"go=QJXyARx˺pSTO3Tp鏐V="bAn`(ܻUGC+aq ),aȄ ,YQ2?egzma"kַ;%]ċ1Z;T e>tPeHyfqvT CThu|ZP4|BF݇ÂpZ%Zu'}'pKܾ-6xnA6E,.C-,]N &xGn𛕧]x8hC.c[A6\uVFRO'+0~3ۛ=81tHH?h) e"dJx'Tfl*D4kSh/C=#Ffӑj (L?h4hؖtkqlAJG>%V$]-:H9"~=CI'Eg\]a=7Ilc3&RjVOf{ =%Rdˢ<} k] d0aɼIxbxozV@Փ_en`zbi/7=ڤbA$Є -V#Ã<94HeYr@Rtx_)1; j`$ 6)Y nM:;0 Ę%ż*?zU61%Qq刔ZHÝ=^'_@"84eQY##ׅ?0xޥSq^r}@q*QioG~FZ`{Bp|7;\RVD!LF/6 g5K~T R6s%v"qEyԿ,H5_ ޾/&!q~`1+3Jnz!#\Rÿd>!4]Z=,ՠ™+[A( ,"˔38D"ݷtlG6w{0܄_Z*v|qäfR@DP}#DRn%jF04xsqS 'hb~wP=Jsv.Uؐ:7E,)ruVI/Â{'-ނ7H{`cLW*QI~F}8G.nw0Y(D Z&:l쨌ul 47bPɷ!kn^TQp٠pK 1O=hɣOqmڙe_"? lASVu BuT (okrDmV, n&HSv\l[4eA]W tyK6t97mC\m(X1QvqI95);"`lXB-mw+EfkjU`Ztݻ޼j73hy\Cz>sj| @kalI aKSCDg`D)\ [epH--Hzy5BpՌqY5r Pä=t573"!kK/sAh޵^>" ڣE?Lj^"`>=xgd:piK梀z좄PKD@^/#f&ʁĄ`,#1e ǽ0TڤOrrniZ73i`*9a0z󟑾͎Z8&xmЁ&8)6@(e-itp3>HuTY>7\GR*vcBiӶ\cy?~Z)=$nؔ:R9xЄ޸ t7V6HFkEb͇ETuvٹ a!nl63~.O6$tQl .;!`Sym 0"̿á,jh //!TNbBѯ2R&!lAI, va 껉QE}@CSwv*98fslxjӪS(pHze*"wˁ:VN #;ElFs* JφZӨ+VTզCCZy.cbNS!; Od.` C3Z}j(IKӚc;)awWȿtC,lY -,Nzswo@nSĮ6އZށֺƻo G4:+ 7zU6f帋/JqR`UQ@7ᶴ]7R#igCт0Z4&q 3l6{\X$~-(vXڳk54Y>wGeEu}%|JM"yěAe57~:Pr"(|wҾ4\L3[xB\14A#'~/4/|$ 2hnN 'XS)}]z ޽Yʮ Bu.eGO 9X*ae5cBWFԃ'nu GN'9nBC7.c)P(VJDu%η Ў\W1_տbci:cƹR<`$oevl@ϝNEnOa5gj~W߱KK=qULssoY]7F;hj!(h]+Ч/0[gIE-y"haGMI䛭nb{4Vb͙Vv]$|HƍqVNvl"=>jW9UN4%/.Z7g^oP%ydU~L#);7%5g{gtؐ!#\:I4up48ڣc*Μ"8!T21?F H Ju5Hn "Xw#$29>]'\&z}/uKb]78 aң%zwݑQM<%¢>|!#0|m‡>@4 4UM@rQXQ@(`nv0!w8!] 񑸔V(ZOjdP5A 4N= <}W#vx!s{%7R9k`IZ , G¨PX\:MmAcKo}-ĘMg$T$cI;t>'Nb)M~gbBָ~j px\gQ뙶H ΡZh|X`b_[tpݕk;%7(O6Rx} kt4W F G#Pn;bh+F۟K; S:RlECM4qwXԯrDMֺzcഄ|aj똓)>ď[oԽTӨs6Tz ' r򃸛ݞ]\;y̤=f`E ЀOާm  o &)F0F}F8 {H;{ॄL ͞/:-CDu4 U0%V꾒::c@+mkl &޿k߀@+زTPS^Ip JrUGMX&C$H4X xV#*DgpTZK3x%)bN;rn* >I KXp'/-]saca;Q%vnMw.ь-oO,K,?Gˈ}vʕI#BRqO EH{8S$D0(ex;>|F :&8Р tW?r!F!.0^*o>6,+?x>xVpOLk* vT':#FH7 -"UЇsM[_?EÐ_hB곔7Zti(yGqvqNJt%0]/KwZTu |#i)Rψ ׉5(*1ȄyY?:@bIԼ?oF#I(b+` k5<ŗ㲀+_~zx~̾ +'O3o嗉{\TĊ'wff)n(,o^LRM݂xӎ2 PE5\J'.ĉ&x^p.Mt%{1#*ÜIf1"-&4HUB%Pس-]z}6+Uu@S>Wna32cJ#zֻ2_:6,y B虩Y3SzOjܚ4uH3tp 0?#XJ̓ufRnP^D|)՘xVIy,%!QdѵC R#`!RAj nЊ9v0Y{ k-3J\ZMZBF"y~^*cM97۝"H0-dXRuƛ)CTUvZ&Z~cwmFYm]^ Qnz7rWwRgMQBЗ POZAq,Q`8AD͈8[,u80Jo&;>@\(['sγ8ۄS7ϱ$,qYp. 0g]g͠o (Z˂ lu =i+1K\Q-S/gIocC<[)Ovj;iL mac3( ˊ߰'blF_`2pCB & l|.Ei΍gs13%+2uAU<.8"?nު}G#1b@E.yx}I鰭gXhqͪg/`Bc'Wxdq'AIvG 'o{{ma20̆y>H)J@b92p /V zcSF^qQ:r#U9;Hr|b N g]d8v 1C25Ol8*Ş0-^Y!H-tiZ:"V L%_ǂW;I0+RYaGS nQ!A{OWP%=~F:F˸B !`j7/uT5H==Ӑ1;MBmbЋ|h`lJԁTmej c. 7̒@-_zS J:g:Y4"Nh"HgRY{$H_fmOœ#H45#mTw ԲKN G] 4tgyd}xBtQB ضD S!~*4iF 234JePNsB9AZA0#.LWtᇑ@v2M z$fOd͚g>G D n9[)yZZʝMUX[}E1Wx`K#Z׼;`aO߆ՎP0Lfd9ڄڣP~bӪQXLvs+tEc7FŅL Zo;SGH*>WyguC׏Ds;Љx!Uq\=_ʯ\6󹬬#-^DE.MW8yVk^rۊBCj^?fy oEi-߀F43~pUy57كWrH G39v(j$Yal~iLV  0O_BY&Z#tv"Ooo9ccbK7 &4E'Jő>d(֏#7 -W]x,,pt}ޚ|ܞr +e`*e6PX 62K M.p'rSIgoU>ycj b~bX [RWIK*Zq ? usgbFC7Bn3tQfBMVȢ tJ8zC̞:0,|jG14z l럐|X!n?%. Xޞ6Ɨ~OhoFl-ʃqu ߋL̑WzЃLi$)͹ {G9lA p ! LΫA`dϛ"d{,{ܜBB(R(S]0΀kBc?iHؑR>,{DŽipWvv%syj%YѬ TܳGݳ!)\^jx[C91f}R;:@IgGYJvfEN[\m leg<V%b*=l9U)Ʋ|Rа-hd(&CHƪ6KO9R}Duy|Cq@$ 1b]A_1#l=\A`4Q6wk BX],5~X6MPx7ߥ~+dG@4.F ʜ !=jbatn}Z1dP SI8/ET y}%w~X!mЖergMpacdʭu3 fKz`7新 GmDgMY 8Tj4`6Æ w!R1!d_^]%15Z=mbC\zh6SrG@+hlWG87Wpe +\4N{;ߓDEPZqBA^!ȭO%yBvI?qf*h܈O;}仺]:-Q:.DmB(ut}@E X;i3 r-J3&JJ>eo%F.8Z?Xe4{OFx* +'`!0Fo9zۧG6YO=@?n;3xnY75Xhhd"0x+w4""v$ nb|{@4XdpI2m;Hn莳sUn^=psnjƗ4H%\#ܚh4BbOF`!l/]=Vx񇪙LwyEW9 i#Th\BkF?gXbiBn @ThQw gn ݃mLCfss~T2Ύ_(@)tF@vE0 x=;+s)9ִ;&q!"QP$^).w{ Gno6Y5O͐5>dæM!f&;C) m.f"6ɾqJH7 kMx}d&ANSC'uy9HvD~'p3(G'נ|/AʼqB\d챠FsmhV-r% (efWXW%v,ʳ;hAզ17qԼ,1ej,%e֭xY/m)=iF[ݎŦ:AuQGIγN"bS_Q$V,^aޞz}æw {@BYX dS~U7 R2zJC|VA0e>z{uOcgHn(iC6*xV,@f>O&0mҮs23hX"_na(9 *}k2˺WQ>Z;nחWH]UܶHHyI'u)gz 'ucYpݶ @>=,w J%1Wh o?Jez7chqxϠB \C#@,Z bJx7LϜ?u6ndLItzee\68)ZA^g-OEj{pgFm-pWVf7NK+ +(mB/hS5GNSzD W ګd{ZX&'?mեVݙQOYPg'Y2FyKOȥ=i_EΡ,c*^E~Ï!63X=KzKC NԐh}Ӗ_!ߕH@O:)g U>8ן1K)M̌'C+-I E #F9܃ߘژt9V3 ؍3 *Hq gTf@%5ʵ"K푠VU|ge!-  y[5ˌj~E< Ld'mƒ:~*V(mu fI8IÉI=ann2aA<$~T]1{sinGkZLgVa6JBlP@]b4I[|ˉsc[{R-e̫[D8g,wvCd)z&!.c0B:Ҿ>*YU/EPxhI57|@{SP$GkMh)#N|FݕQëM=fIy/`wR9 #H~=J K*,ٙx꘏(?\lqr ] aAy^;5A秴2o( R>Q0[DYۉc6DS|?E!s[ w֠sQ7S: )]t,JMUB3qPkV ;/侽Ȉ p4\Dfc鷋ۦ[+Cpq#[Xɇbn#@ итnb}N[p5=\0 WŘv`_:`UvP;tVd5J[[G:Lʈ2;?D|t$b=?x4I .a"Mq^(hEsn v4,6Hm@,D]/YC8?*l56n۱'ZɚUdb1'd߬(3ҭx5E,h*ͯBwLsV{tssTS9MS0ZleV[uXow=/fYp!o!=D[w{ ɞeq+ *$ : X|Wa2xz˜Rtz 7A6yIBeB| w?p?#s:1j& $[#dW%$J@Dz=ò5o6 EiX20j fV5^Vnu!}; Z+wb!OWm9R:ʹ!֋Vb(AZӦ6Yd8cP?ɘ7m 0>a_!ř!GlǴG2(i^R aR₫ e|>hVX/^s Q$~9fkNGC^%ƹ`GRc01\¥pVֵTG+j\+qqQ6󤥙3Z$*-ѓ/ {/&ڇN_rSq5y N*l/glzb1mGgHHx`.a! > g'p'"fDj*yb;/s@WLKꥯ"a-S0@֋Rz -I}ͺ9${\$e3pDd'z+4QY[/^gư])"6sU`ɧ! Mo 24Ȃp -E-'Q,szYqVY2 r9DDJcS0쳡 %dfz6vG|VR!?:ʔ[73E$!gL[Ec*L,ZOO݁]I4ǭ{@\{4ɽ10H}}XUp=/rtjH(-oXTVZYt[&kc&w' `JFdf+2Μ֡T_^\nk;FWV+kn`Oy*QDD˕Pz0)Kb:!1Xh 'i`dc~  Հi3|"+ጷ0Ӽww׀o]Cj\b+ ̔VܛuFF)yPƘ^5K)w#ݖ0@aLT <l`26 .2 [x j ٽuGDs}),@e6W^PR,,>Vpoǡn $1d9Fa j+I7;.A˂!*wFpe"NDm$Ͱjƪ f m`a.=?.WI}4OVOP8ҿc"ݹyy+̸#Je"<HBuSG0]TʦB-_p`(H!j}7c~=g/IDJ?PmG5֘U=0[GTᶒ(g0fd,%wXxSe-kr7ć3w\BÞ )'+OaԶY:%م`.uN9jDń(kѓ5}dp/ёD-oKif-0VPzA2$s%μmpyB=qSAaۓ @*hhFgܾ̲F &LNm@H(ƕQ3("sgk@*н^[l,q.,BM8K b0|S8gX~<1M+!9B!T/Qrj+R󿻌H{WPUA]jVz*?)މz]-Lɗ\*BO )oV/6`QS6,fzЌu욑gze*?JgN#]z=6%:14%^Ȏ,ιϏ$gECi1+uvbe{׆;M'>We$*Fc4N^z&' D HtϬ*1Qmo#PCAY~Ožށq䣷QqN$'K'M)oQ4EZ5z|;V ?hb̦@[~z…EO\/uIՈ ByR\kDjMeSs\)ZkW-j4q Ivq^ }9@6ډEf\Wsؾ6]YG[$ŸHPXf/T˾( /LX-&ƹ~??E] tE& ,DjnE@ }okV.+RcǔW4'YO jn'nRCU0u'0Ē ]m7E:hB>c?%jؒ7F'\dYâI i>B5& >f9-nJI&vv2Cړ /  BLۧPh5-}Q&@#,usKN)k iGv$H*(YJv#> ]Ƿ+ _A,^l楄ܳ p,".G7ot^n5dYv$MkY@SuTZ)RmϿ$[ƿѮmZM2lIM  Eӄ$swh(}[i! JUC D, ES?lJ*!iik9lGÑ֌z _ %IuddUG#%^$ 0ෛo:ҼLH]_x.<Z\t?^eAp["MIk r.Wb_P5tPq̂fm&]-@iR F 5:\9u/Bcg8XED)b?.S$;xf`EsFrVBbeqܷd ¤aF[V_{5'"3'4Tgs15?8\~^~J#h!L bse;Kµw15I^R!by3`  [D5lIEq};o~/^# J, KT8]Oo^ᝐ}ͱL+ Ɇ޺Zl EHAxg nb%R<Ι= #__3ryP'z 3/f# juEbP*TR Tl ׊춚AHg3?qc%>n̿We>>$RgUy%2˷.6 |wp<OGc5Bh_TT`5|).BbTܫrɑsY3ּؕ%3}kZ33za\֡.Ƶc;o>F׊$5!<-P٠ X!(!haNNiٓEV7)dz~+ti7tqqQ̈f\=.n0!$hs`qhPu8CG֞ۇ=Rk* *a|FaL̿~UÎo3(.qTC/Xy#ڂ@%X2Pg~ʪ-:%'Hivk:)|6+bC пHIyس!VQ$h̭N:2w2鋪 3at[':OSq W $>-l~ &"yӿS;ŸP6ِ}8.cFҕ@Ty;͊ v^pM}qR1 Q'<.).d(TcЧٴ)#Qұl)De6|iwb1.4ik 4]Ɉ^j1f(LxJ0@n6볪.'&d>U?V.9e|q*:s2 uNCwЇ1 n%ָo"UZ2m}]O0wo+W^oi5p}-xFV ?9;'.5ko;$3)5&"!fc2سB-qe(804oIp!.~Ld{(BoEFʪdrA\6 㮋F. HcQ[<ʃ {}q#qqsG@p^Q ^rѸ^)5fwT&>EDdm HT,[8/S; ʵ1Ŋ, 1:lˁ*&|Q~(~(L^nvCtYY5)8|X"¬"85aʘ8gp~: ,B|km`@[F=PHbUw=&UgqeT :$)MyN%20j J]{c@,z 3@V:h ړث=\&萩欂k'<迶yl.tQIA ->g D "vGFv bŊ7k~y)W*үw!caZ1xD'#Y-'2SVXWQLњ:v[G ?!?:WطFզk}R2[Z߹\ 4ӭS_w&(s-t'g DO\ rE@e<>䠐֑l-",ǮB!# L/-E:3E>iܫ}4SE5*?fJ.9-u0cEC)v):"p˄FE%F|-݄L7S?ł=XڃAE%9=( KSPIZ"̝ZK$"*s-2Q (tB.)L\q8."#ˮ4yGƌGa!<ڱ{y|ImMQB+c;N=Dڌ0&/N6Bh{.\/;hV}~? RiDkF xR746!r:m^3K>5!gJ7ðS&2QȪ[{`kTB#ؖiRŰY4X!Oq+dIҿ`_BcdVoEl4HCܷL F(-(:g C%}xzs8lvө|t5U s̽MS%gP5&HРo .[̟vf&waף@zNeV泅: J|l08 (odH͙jnA.4~)BөJK^cfc] ><0?0 CY"r:=>N%pa ӝM`Rl;WR83m6r:C)<,lI+^B>cÒvA޴E^Fq?(Űnʇ-as+09bE-Ӝ9Tڵ51?n)?R Pe4ߘjg,܏}NcU] EZN#+WK.3RuMo5M!:˂dNGԚbYѮ*b! JWI"A?xhkD;?awDžYݦ7fz*KKE,NƠY)?Fd*zP  Qc^.UongS+4 L؊*EZJw>AahYPܡ.fg-$ŬqeA_">>=bU@i,k;Q)-̶ .E~^ܐg64P&`cUTG.H?GٙbtꂍB\Kۈ8 4ሌQuP7郫~,LatnWZ44ºd挅5rEm?F QbR&J6R>hLVĦY(uA FQv*Of*NiupRLI;(֑Ⱦ.8{/J|Uճy(ҥ1xJRJo>KDQirP="ˈԂJ! GVªe㌟Ы):&CBP m]E:-NHX9( `|kl[:mxnQ#(/VAgCU+3)KF=#WN ࠔ< kD@9n1 M/wWmy??0](vk K]sJ>*Z* ۸Xb1cDUjtu3Ϲ-2Lx`j pG'a<׿=dUY@Ee(] D yζ&S!:"> *N7'L'RLkc>R˟mh(ZAˮMu//¨q}1߽L/3n堬I/ICRGAsg%)D lϧDs@+S*9Ջ\uxa!bK`X3LJ9M1olER11#{ }01(6C>tE(&p̔XQHevAΙ 6m< Dо_!wGوt!s&b{fF}@ ^ńjŚ t0AS6^ l4םPRT}"e)F#.eS.]G~o@y "}w~]R6.v.Pfʚ2[q8 &Lt 8aM\oIXYMMQ<ڋh#G֯ɥkM=F25^¹jsƂj7< ے]C?  o ߀Nd"=s:֟J&Rx׏5"=dpr{C ,#'pE>1KXMN7 Q@mFY>o]Ftz X֗1 *&#oF9pTƭ)W 5|9Wjň9SP<\5s+3aaEjCΩv˛:>N2IM$YpЧ{L q@[!_:)lHO998H39:H>!I q5hR_BcPd(A*p\:~qܻ-QQT2x{̭W <ܝR(p6~ocV^YSYV7emRlx0OiW֫iCe HiD.mn Tnucaׁx Ly9Z\ ܊#tEȮio%t-BVQ]6D`e* '<ÆNlx1O5&NP\ogbJT!oבW 0)}pr$9zLD(Iɿҭ%ݤWTn5JRXDy `Z,עBAOek fVcDRϵ@AW-A+ĖBk,nE(Twx)+= x-o,}砶]E,OG3]?ވ4Ռ#,j@hǗOKƨɳjmOxCeNԺI)S*;"j9-IV s2? 0@ɸKݞ믫ᰬvz=hͬ㥉/6ٍ2Ν.#̦p D{pNfTp`X[f) ^-$^ אZI:drԊ.xcn)XfRӕ=s.̀Ͽؔ»W4nabDk)ŷy JCW\H.cND{ +!ͧ4 /!U0M}Z)d4p }FA{QDy96X:om$ziK#e?zԻXLk^}D:zĘB'ԋ^ EO 2O3Icefډ iqum݉aX/X$6/cT6%3T"^A!Y-}3%Z#8*pZֲ 'uWe E;sj(+rv̈a7ubV3'G/FDuXƢrhza#d2یsbaԬʢ{= ͎w-kCWn 1GB{8x Q߄|J,\D{3 QҊZ^ ͅT op>(wXVnG'g9%Pw\Q{|cB6:$YGb-!e7`fKhDjAmI0-muYavV9Ntj@S/ '3#,ɑ|`&5G2'm i tȫn1aAqg46dQAV;ڐD0LyfQiD)+϶w&6jюI Ļ_t4I+wK9x`iW&.O̸ U8'=*Ԍ2#|d𾩫ΥQgZAjH-FnZisyOAբģ Pe4R :0am,!+BZ#"ĔɱI̼廞*JZL.JsgmHZ2#td?{18R·*!=Ö`pE2ڹs(KDrHZS# hGJX[úO@n J1Kya/xb.ng5gpݣy)A"hI?P78'L ^ˁ=̆id|Fn{#ԇ+f5~b[RAInrɜbqȎ4x%fW.8Cjw). ۗ$9IBe8ݶwAi<"*Y}`l.@Г K:gµWct4vEаEh!;:yFEU#HsKf;cYzu@]ex]|\Ku*5=[֩TNa|c\i=1@GSa*A(0\z\fѝme4莬e|"TuOW1N| ӕ>VVP*<4/8żۏ@2(韅kJ]i&Rvyrf%Q8`GX< ¶?4P{Xߺen}1oYSL**"8 oewDUh95(1}DVs.ES (YBDe k}1^JPbsjM] X"Ԙ4Si +c>P/Bi}/Un/W˰+rU\e>v {R \.R>%𬴀pKmם/G"N 5gBbtB"ٳe9H!PttJ9mjT65'j0qaFE2wYZ1D젃sooS6tU'׳T q6jJXA'8\2 L7bʧ6LGz:_٢=U+DW&OA']bR#v2<{FtRL;5df;ܟO2~FY ܲ_ɍ}w&&tM$b A!hYhcub7Ds:=GajAUDCc4 c(!fd,:/W{F>, 6MdE*D` /,4rb;aT!ڬp8́\5Zt]m2/m?R'= +:"6 p2~V_Yj^thϺۍjm5Z W|I7C! vZ|c%glfWm 5F_-Qأ1 Q.Qwݳwh.Bn@$2޶eG5.6jtc))8}0׀KJa#(;|SUM̴<r+t#:V0[fC\[X|W ΤJ3劍F1Kߑ:vbȉI x/:~x[R, K|V+/j v!z K]=% zgpv(i{V,g90D,DߐCh۩pOpջ\!\ oiomK 2¦"С:CXE9lk4"gɽ5PHbVZЖKBڰp٫[y2T߳1tgH"LS G`>Jp#ŰLn.GwɆ m6?*w~?ZU\Gf 2xhA|B4i?_HMB>7ƜvDZB|(uM[2yCp಄mɠӾXdŒpUi{7Qµ[ 00w]({@჆ ^bZ4"}JXGLibE,eLrGT *1ɡ{M\)*&2V^ZpߩRwvǴ4.֧W=/nHI$2!},6UEe fX4)Tm gKr;"UuN垙sR~o$[sخȝI졆Uȫ+2vA@S$G(Y/K~CֆzۄmYeJ_5w2mJVݧՔx!<52~eD-JMsFHBP5}K]$8b6.(W g}Ĕ'bOdp8@]Ku_-ۨ=wPPw9+ C >p\a` ݯﳱ/pu`=ߎ="ŒOڳQtR8+)ZEj b)\d]ӕgJ WսV.jS 4Ag`l3 0iTKL+C ^Ilf r}/;uoY"q,3EdWl+Oa;u/2+YnՈ_@?^g&k%& ;*p7TFOZmYFp7&=GyNpzb(Tә˙ˤ`!޽S!BrH<j|S'\po<+[o7tMmnUĠ:^Q(>jgѸzhalϡ [l$2 gSi]Soe``g)NϠYgiZ1kJ<RTsļqא@ϡAƠSSƗ'W5b^khJZ;+ xwYD] k$4BIeQrW=5S3FM4l!vP\6e2\!sӡÁ(\CSC<aǺQT!rmt#Y_W; kc*{ ,A .v3?$@@oKK s򋖿trn-%𚐂%.M|.Ҙu%8ShEWFU vfEH+q_.z(~2Fkv+'Rё9'55#Zk3@Y/׉ fߔTl/2%I $Y '(FP~O>PooW0G`h-nc؉ڱp},k scS/,Mܘsy|>:byZ3<6Vná3-ZCʏ!?ԏ|69"NckUY7Si]/,! IkT4𶿋T=@9˓(* a3ZR}fR'zq2#7KŠr!8F Gn%2H"g)%v| !!;V2sAR߸j5nj(ySh>Q[]Z«.*k7QP4ɛ<*nImJCY !^=ݾP_9@Tki `W,E?Ko2)VoW,?+ ;N0#E\ L"H'xvi4骄I` ZwXއ\^ !R\=A|k\E>RXr +) yo<~b}8dV;hRʉRL4ZQ'֐z:Zw΅>!2=rq;v}!+Qcl$;ä_#f$)[ЁƽʹMfK p=:6~=&ÂCCg?R0s~4 5^"g5l)LPe#Q}F@!;wM뚎7NՊ jϴVl/s$S0P3>3#{+<Ir q6 uՈTgKÂw#N^ktf j}[${+ ltRsAYzBW5E[RͶ%5%&9ASb7|L8!C_+zcUjVekR6>OuZ8"FJFt:EI.+KyGET+Y^aˋnObҷE,R$0OZHQ' c9+@r^42Bk ArJ"|꾥7wD94M֓9x9<3qMEʐ+71FUvq>BFW)4}x(f{rYŨ1xP'3 &&eˍHQD_h5eaoK\) * LX;,}te| m8Iކh.V' D|Q{>s*ħ6+9xkKYKQtd('*O Jli@lykhK iz{X |8 *F̈́]}˖+͘2H+æK!;A;EI]N|xf7 Ri^QR`ojUȊYd"%S4`"QZw9*|3D(LBszms)`}"s3#VMWJiQUl$ q47 x8Uq?ZsfFĂEC:4z+x4SPKCE5a]t4t49!uiGOxz.K&ːFD[S\~I4bDvP(j7UR 5To-$Y\zhA 6G4% IwX+ MI1j?uexFvW+Y!@EA>G@7*[ai 7qG># r!*(2*^@:@i7.?\2Kd}j_x;201**!E ρv-ckC|$*3.V͆c[7[@VG &qO8/ ji ~# . z<ŗB•;I}`QT,Ø6 dQdPLK!:fRxN'.`%A" 6FDtk32wfu p^}`fB geA"}3ES3`6b JS?K y7sR%9'a돔ÝGoJM '*e/ARURw]尗Q=~y_JJW>Լ-4]`C$͛Ѓ ȊցjXuk޼5^0M1ǿcfE(i{;SczѝAKjZS=i +-(]˂ڗ4T8 r<\.w7iNHW>۠G[eW;)Si= yHɉ"'>Ś풙QxMIX?LWtv.)% IrC/8sKc){ a%d=.$L`]_B$W5ayʕҒgljDZ޷#S`t[`A**Qnj!Ԇ_!A6?5l/QE,Up@!m ?UdU<@0OȲcZ=Ƕj˽!,qЀal3a`hn= ܖQS1|oau*D{"׭L7<6TÌ1CV+WcnnKL7 |Vio cc^ KMc7w:G#q͸3/<ṍy!ݨz|~{d:׸o;&N{]ZV TnS)xC;clDH/,zTW䷮xisq$D} "eZ^,Swf5.EHG586ݷ U!պiocIL?ac^Ѫ_jHkoi1(@zL4_:]@Hl x IߍN6]?M9Tn/B$@f/Z~mhdmnhTFJ 6uf{cl[? C h6wV[g&Mш@?ѩۯq\~)4%)b~A%9 3,ϊ,$ߤ؄ݾ<2D{&f_z]`3O !\2G#l'`H}&AgT{_Y9hl&Y6f gKFAu=Xy*HjGf& Qw'ϖF'Z˕+XvN`ؔj~7XbC 1]嵍on n#S2ڪaUYK_Y&nޏԿ|z+p>yU %3[tF.͞%\R8$8Ӟ\CRj6 IqD/oiQW) EZh!djϏhCJꁤ[.1gpwk$mV.4҃^-BSEm. lׅ-+:L.v}bM% m9ZWjogF \#H@g3mIwO4kEƣ(o7r}եaRFlY*K 08\+ʗxmkه&|]SQM0b9R)c,p|޸EEٹ1Kq#Wʡn'6Y ,HX"X_,T;TӴ/W9ߵUXpE_ oiw MDDiJҧ&5r# ^=넿,:M"U<%EkQUSN۹MF>}yYhYmnڡGˡ햄j{DmzY{B{J`_66}5OL9;K&3 `YHHcM D$ ەQ5 ( iWj1; KyPjmQDBbUGPd /Z?s@Zߎ1Gĸ22֑psػn74yE%2 ѦQ 5ۡ5RILLljxZk.)(rs{Q܁ AƂ0&0Ir hDK.GΖHa 턅t`k&tLR5s@%*p {y&VmM/?'E2pWHvnZu9wR$4W$T+we5H װ޿6]'HcpAgRXHS "xűE8˛XD{I}154CW~޵GH #즦+a@Q$?Rh\9d uko[ ۡo=3V۴C2>&>I^ څ w)\yޅckASyuQCӎXsIn.SB:?,zRO ^ ĒU%}p׋VKa+s5TBi1ȣ-GVH{"LhϺ'TA92/,y{뮣 [b 6)Å \0bz(> 0zE=P_mU >Re/Y`$Iܭg$XYs;+h$H :v /M͵^p+e?=:K^o@*?/첩 ouGbqW%cSނ5ĢDu#vCfD,3VqY ?~[U]oRt$(s>j-Dt$Q XPƵ'ڦOw uLڬ}1vȳ^]͔XaNqdV$H:VYlg Pǽ[JE:Xzj:m]ց 5<#E<Հ@0 k&_CJIH8_?Ɛ9dҭ !nFf@RB[ 5(cU? 2N vkɣt" C]/mzI ˅D`\~ XH¤ε\HjR\?ʿ]p;ZJ@!ocB9*ؖwraޠ+8^?;ʄ1ƮUzpTQ3~0i%JŽ`5Y38{'C4%仌!E}^-YRf"Ib+_t1> i'--+|*2 180Gz`JCqrO⹷һh9”Tphnv~0D=C.m~n J[iY!bzi[Xq1mO&lCw)C39l'|K:ARr YLXZov#YjՖj"ḩթD2htT[p +e*$|D:%o?H6zR=jy+bքP1/@nj~09VCrբ{/ݡS,E:u'b*5fо u~X`\L3DKFUPë5)ت6 (Яrעmt) λ_/ږ"EHEsw"&%2wfilӏk$ \񀗷>>OUz#F{8g#i7sl;VTDڑC. "qݐmXK;>i+TwIO35S3d7wfQcj$IYX[KFa# F`iC^g`L-THG 4S.WbN}F +˒ ~]sxge``3{CzqEy]wORpÐg>.v{,6g \4sr]PCޥZk$_! *jg׍"Eo&zX{Q o [5c T Oіk|\k鈢I(ך}\D #e,&$ v08ÓIo:TL\UA6VQV|wk$wdIЫ fi6o<1Ԥ\'R=SM7Dy#TiOn?0UyeIUThcwOߙ(*Λ| V)IFp[H% 2Nv_)~?axLn|е3PkO׵h%-=).y!G :j,|K}yZk+Z+=)B!{9tX1E;eMipFԙϡDP ~@~T$(nq>Az[w g x>rD7_G*h)Z`;IkROdVacjl 0r.Z9np}37/Gay9C[MTftE\M7$*Qet/%Ga/L wM~#@VQk/9S֗ЩP&pϾP4_vs%|hN¬[q}[={@/4ʉg[n8Qw 3b^ K6q%$Y=zx7:t|z37u F-H>pچSoesϰGQRGF&3K+Ǡj kߪ~ "ĕoּs 5"|U~00-G'vt +}9RU;["`wJt쓏b@a}NUh x[A4IMhA0ЗC_ƱnfJ7sO:+ۮiAT9v̄nbYmJaU|b"h<?'ǭ 4|^Df?b$VHjsMGy"/'ܶuv!F /e1+Y02?~hб>҅!SCC9Iy.F#=f2)ލ.~P3"*V ͷ3_+%=@_ϿLjzF ON3U\yDpLσ ;盫TQoa!/N Gvs9Ԗ.. ZmuD byoV" ="Ǝ~PQ>$Zh:]7Ȇ76B}ί;W~˸.V<2Wh3J3X9*, ?%c H}I~g)?7wXu Y \A-5G(<'&9JoqvcZۅWWJDx& 46ha`\]~swp 0jY'cm (TQ#TD??sJPX:|\:1lU4!hiP=59b?aK^Z4kVŎy,V4{qNp{<\6K*ܾGyff(:y︑k?,d*?_+ ViX {taX~xd5ⷬh᎔ҤDIPuzڜ7/<;/B־q 2j'ޝmTWFb2bWH@V] l.xN褮ɡ&&,b~E-?EĆ++[ĦHaDł*˷Q3xx++]-DNRdɅPqWdcՃxZڟN܍[_Fx@ ߂ǘn:>(l܋cUjNmmEr^K%n4?]p \T|Y?S}3i!)Y(e;ށDިCCHV 5"hN\.L 0~Pst@GҢ QA% tmPcG@;j l{I~>^pK{tZFd:^u0_tzkR0gxYn5/Y_q* ""exuj̾&2_$M- HhNH?]t=3")eC2h3&׀ EcPӿOVw;0|])DexJjS CA5#/e:a1|Y-Ӑǫܟr!ʵP掠ҽFp~9~~dsk4DlU-[d:"N1WJ[L"Vw|x 1'IyҙBR">l95U qg Re&_s P58`0tD&r:sH}|Ǵ*M  QXY*Ւܵeq1犘tݤ7tŗ9QskȂAuf`DL1pMx(p=ڎ%Ma@m<{-չV- {ECép F1Xf;- ;R$ᩘ$ "!ijD ;gKJJ]OX#ʑ]8۵ƀ:q kA(L~KLj9? (AĖX9PJyt@=ٖyi6/<J=Y%_6:FrWUC寧ZL=TҕO yp[e0Ko$y6U+hP+o[jmqω?99[3LO_qlَ_cfKv%hhJ30cq }_̃H&pV ʕ?F. @W1 {N0k`3N63H;INh}pǔÔ,9g%0X3Ƥ Md aдpuLC?DF ɏc[k9LI&8,ULάRԒBGR')'[--ZpO/*@W=W"l2eig+vU$| Z;q`߶=S 'l~LWBe~ÌA!J)b+i4Fڈs# j9US {m7}2NcV1ehhx[ vn'z5ÌjSs:A #Rhy&5QM\sDN`W$ ́UiރUiQ)N^ӷ@*qWKxt̤ɲ&16B1Q,@^CVb/6|0+.uvqM >WO 5nI*2RLv%\~BWڸ:!He5f˦xF6yNABp/"$(7Je ؤvŎP-D53i"Hq%Q(mt:!$Ҁc9uݫjV}&⹥g)>T]Gn6 ;YQ 7ϒ֡ӴwTg w"FH$'N.B莲"-X{Nǒ@ (gNPi}T+ RɈYMq$CRTJKpbӚdbc*b@fAb|`:&Џ8O YeCX"&5LdQo~yG.d`^佡m^.FP):/Kfeq4?{׵UxIoy4}oSe-Ia_> Uvcȝ] RfU bf$=W^xX+._W&&WhT lb1nZB8ʭO p#2xZBۄB9ň/&׫!35F uK+} '\"|.2t0qFAh${^ acÑ(2`5"^CǓ|)LUOfP \-։KEL)鴈g dRߋGBtR`RnH%DRd 8 fj\/^wG%3՗O2VðR\7y.ۂ)Hr}n#?SSH"p4>4H @&Nd'm<zZťܦa:%T_(: m{2-o~R#-j=_p*g1] #*U7>mL_N8O]'-Zx* R Bۉ^8fE%#S?mB N`"Y`SUz7+"u3=tB0{ d0R24%'"C=bJJA[LyV,i ՟׽ 1koLJJ39zGI W_\Z.Abt")X$D)p8؉ʈe1פ!i/B5P^0R<0JSwcYETs?PQ]<K\C,ENbﮂI-fSh!5.^GiBӈ⣬ɠb6uO-}L(v̡ ).qb[/` U_YbX<)CDsozrŨ/zM$B{يVAFyM5,|9-VW[]CDZa@+S00)7Lx_W,#c c16F{εC ̪д\ dq H9rKOX[*+ocs] m,i0*)y ZscǮN>Y,R(uTaϗ:T:}g`v1}'6]Pk;M?=55} Τ yiyBvdf4%%y$y(T2X4<YI94yHa@C^ŽƑHwrA@[m/ֵj~ΎM`XO`by{Ӟj+5ҋQ$?108)I-zF`li)q_.EèYpk1A>iNN= l3J<։!w/k)I6J:nG4Jq|=~e8$.RLۓipķᩴuxU * _D#5)7:S #_+T 9X'×%qTWCt#.JL{tS(Yg15MeW`i8ִd>=,Aa E1MK73He9dQS+ˮ\R/Ox mEd>Dx[k EsF,fV aW %fOE7 ܑE})LFkUz}8χsU-mPQL\{B*d(ev[s&ɐ`ގՠϩx ;WEoEΘ^O颠 zXJ5PW(G~18tۖ`<ؤ[Ys5(-MU 5sېİ ä$΂K tW۞qW , sẀ4M <_z#Wu+qlL-˜6s`b%G> \˺r@Y0!c_BU6qÞb=R̝ŻPg-i@DCk\$6" ] xbN;<`|əa'_arJĪOn8>yB(:Ӑ%)[/PZ$JdߋvxD^ 70OB`Vk.T tFlJ֘JEv @ W0>竰xJ*h^P&#-!AT AxΦ=zT,Y߫od/!V2{,Uj-(BdG]GPCBdR;YM4w`0"~d0bTӜN uIJcK]'P1PJb 7jq51P͹7'IuC*9]uX BwBof/&`c_$"# f;u/L. nqsy-5*?S 0d_?dEOp2\[=]7]rfV֔": ni5}4b=[zIuUY!;;{"E54wy2ӆxy8z]@0-e}HYql]$#.kkJAvRҝvqm$X%&LO,v:QuS;n"IJ񁻽!3Ҩi2QN~^K%\-\aS%U FiXςey43o[ohoQ} |%EH{9 0| P0TSeP0`F.Ruz6_f&Lo_FqoDbode}eKt&us0sݭ&%]]`Y~r&>d<{8{5T"k|<^ K,Sn B-DQ *U;-o0t-4f0._q!|#tI^1;2=et@1p@%J }9d%{qYuI ;G[cppb(QVK?'~h_j 0)(!TVLc ysWg+:kNc1zrގ}Of:hXbCZ&8%5nFC ^#G!7PڶCr0e]nB]^ ~]Q#kI2޳De ջhL-n<EWNฅJ 2;Hƃ;O%M2ƽv-`{( I]Jm_D# qʩ[tf*0+O:ꚜZ}>|X]_P #gӝ+ƃO K#Cs 4V'y= DwO6 ?h.+6.N "Q99Ƃy?hLY|%\{|2cmsV2ۀ(ڦrۻo9k1)WWPYyfK{O fdٵ=!|4(|".,Ѯ)Qǖ]bM_4X'0TB̓a /ӾoJpz>MƗJ L,r}}=J>t:Q %k; GodC-nyYH*[ۤZw /e#Xd/3SaLBN4hCp@Bs22ѹk:iB.^zי >3`&Um$Zo8F2*R} ml_KU.VieZEN <8/rYΐ 0gCѷtt֥)_+SrrY‹hY1ej0ZxgdG%”v]/#wWٹzivmYfDeC(Η~4\c4Ki,Xew|>$|q4Q»B:z'VnБ[Z$VD+ܡ)n#u_]N8~ CԾvґʔd'Q R rR8@Kg~kWu;Ě--_SS6KQn!*.5śp2VYGNu, J6/A=Pl.)ף֪Uk^ RB YxbCBP=XʞńTAl=bif.k\LM4nLi~x=HmK,"PSn]q5T,)}LCڝRqŀBk6]˳ ?cT@pvE`,| Q{6ݡGJdE2Q8$\]0'B#~^ޭ*DluHqAx:e1:aF:X'(i[kT%)$n0ldAdc]'t&stap19 [^ϫL|9Rxڛ{GuK gUFQzɏkýBw 0,o@8Y0$'{?2;lb2&@ə®N po'7E0.A`u Hy^JΆ I}&({[Yg2I%c<;^\T"4xH@CFqrdf(I}eѵxGsV'%2kă)/ [Jxay2.|&%? YZ E`:~/ɨTd[|އn(?+;5xD;)?*"UζVVNY3!!@tMqR$l:8|<Tz7#N_@@mC)H|^b%} B }9cdd+*^!|m$%~g~WG)1SsXT_[nQhG7XEeJuٲBx[1==Z]ZB,pejj_B8 $@4ߌlɊ=#;V t$W85QOpk2L8# _)~gͼAk;$yOBzHFơ.}Inx1AiA~iTS+DMe^aFePMk_`Bt̝\R4:7OEx.m"9pByht=ey X FDtO;i[a jlj!&gsGpt F.I6ӧT{^65[@B}|YŌ?NcB3@\33٦KQ}qirs&։7o{JY)j !)F`U݉DSka])ng$;ƴ#PD33ZqfNڇ[|PZNG(Ea戳l)u!uUX2*\197+/OI%UBy&:8D.{`P5ǭ!QSy$P{s뽰xC#6Z%vyz Ip66L(Uئhi#IƏh1\[S_pئ9'R P1okL%J 'L{pLx-~PtF5cgtSm1ln=\z'u,MI_g8ӀȝhDY֓*0V]w3X Vh`YY?lɱz(ٞU{ƪn9R7/L ]%n0nKͤ2h9@yZ4B7T{Ĺ̜tɢBvR֎fupξzyAޚ^zf>M`QYK)ެp>3ypۓ/8{ύD7^#gfYi5]\E^ߴG[m3ʃl9i9s/jơ۽7暯]"sRsɂ`z@"ԽmD»|Lk!֓/B!'h&Q`69~ehA̢qpN$`(2yn}ҟ54ė+`G_LS8Y%1~^EAvA.b4FxzL׻ ~-d4&)T:D.>zH7736j{PyOD)%;=FPV`,&0)&jYj εqlF}_Co1;XT9xQ2HÁBF_ z("7ٌ+!\.I:LR#6Z>œ-dhFLT(hᙿu'JBI+ց.`&V?<hD0Dt]PXAcLF¬Fcs@ XK48Q7[@F(Ӄ+/fHգ y*fY,B^jCfA #RNaI9"\#F00/*(c\6Yr9H$`:fVV {} $Fx/X}Gh!P`*\g@׳_z@x̉a/A>bh3"%h~@X޳py¡#y*$ S)a6hʇl'Q\k0lrHi5j&%9^2c%e\:[A~ͽ CHfd };O.MIqpIЬ fAH+{5x42||;jq *JLw.ۂmj j>q]m_LQl9‡,)j Tuz@e80TvQ?,4D-\hl[tBNh0-bH&Bli,tu<,[s=1}7=u2H-y\'W=)0ٷGa΄gոٍ8ebu>2Ö~oO/N[~|l6WiYX@s]Gg}gi뽔bLjwrZy1~uSԊPfrWJeeɓ^{':@>A?.7ͱ Ge 2iwF6"0;x<=57*?;>hAd^;$SHamcSA@9 &%!qcL\ۣ ]$8j!Pc j_J[y621 v>{%L 0+C+⥓[S1 2zWMlv~ r.6̵_*(aFkQ KCՏJ rC.iȗnF+CebXnΐ-i_ иؐ5< *H괋OZ;ػIn%09~G3,ƨ("*(կk==B ]- ϽF ΞzM=XUtʉ~YOR sc>NJP,IwDE)Q[Y|]PAէ:kB}+o?vTV! \'w26V`WjP\ζI1u_[2k3 }8N+n{ ~by31 DSlK~{VE=գU,Y&9imiasSr/DMArSUg9$NٌL t!#Pÿ6(t.bw)N]?憥.sޙj zJ2Ifs+W|"7*q%4Mn5wJ]!1%K%pm* İM"Qk ؋~ϽMx&ce*w2hTNU,.J4E(?VKN6snZ({1wl潍.!~@|O)U^ėbH{xΑu+1XJsT:$S_ q5M~XEI/6qw/҈c @5kSaKbqb|0OϸiU,Zk7<܃8 -lI 44kN]>sZFɗGH-@0mSaJ ϷV.j`Rڨ~QrvvQPA:5hBe_EэG&pa 9n-eq2;uri03jM51 2%弁5oG!ڀ`k=,K*$2ID8Wޤp=HL,n㜁OQٗhFW,~!|j!=-$31Iw(pꓣ{ɫgTc1f٬GQEW7rGӳ0GmZ/-.S)֝ pL ʼeJ{'79^`E (7\lbޠb]cQ&W4v Q(Z w[!SBR^hABZ?KeY %<Ҝ;3+Uu'JE~@nc4Pw(p &'us_vgq|ig ~DLH˩s"WkDwoT(H8KtǾBک!aҗR> 39bqu`%a*b 7Qe~Qujf^bTYڿAl6F<9sB>-~,% H[D1/An!Ku-=ٯ_jidmAhɊ)& o\FJ邩*Wf~jMESJOuH?#w@7[/:zp?2vDŽ_7o\Khk7 R3/g븑 JlQ9rȬ) b/zD=w瓄[%%<}IG*YX[:kQ@ǽ!V!͟f]5 K7hLOZW"l^\@2#ⓑVzdb"$Q~G -{X1ݔ^Z&m5"3ŷqoC- CHAe 60ȉ+7cr cH"ȇ Uxun[VT[oͫM 5Nf1jq"WSz !Gf<U(/iuk.- 5!JƎZ#8EN,;"!H[EvMz]Vwe`6ݥY膏ZM9_o1䮼@GPqLB bzjDIy.4Ile%ҮsgdĠ/5E2EL`~$!},I +  ڪ*0=d߮_`'mxߒ$+#VdjJ._DDZNYl+`Rdܱ3E=] ֱu@PDC2BQi2 WTh ?mAB6UD9O .4-g<@TzwxOͮ@II F~??oCv*iuBG#k+5yz['O$ p b>14' a1SF;tVaU\yTI,0vu򾵿W}`4E0/`%C˔mG:[xֆLyzIDˆD)> 5g 6"r~`: 4 \J)Q~aI^ Ԩ`Wc9FM/Y; uĭg("8T Ðb"ľ ~o﯏Ʀ\L6DK(h.dj%`q)Փ0@m# KRk9&&,n9y88VebюLײ6=GKM̑szO |6M (!'BiW}Yg:.?L={Fodak(FQLW wZk0ĂT姼=.8yka19\9?6օ ƶfB$Q1QkJo-I'2`1Q4`h|SWA(bLӴ!N a"o dK'$p=bf⬹9q [ OHά[t@ Mjg NjIʯdgĎ džPt۵ 'ڗ.U`q,bj8>z>>aVQ뺥P=ݶ݂yx TQ/x} }ص]( [>9zclq?w54@C q ݛPJtL m3tt!`06˞k)Wb ٺhjqꍟxKc5b~](o9t!Z9'qʵj$A&ytVyDzL_O4'bi5㜠͟N箧+6zθ6Tqog;[@sJm4wk%T V1Xjz" څgz IX,; !&6JЧ &c Hi&㹿1\/b:ASӠsU[B@wA1֢̽gbo&At\SE> jcχW\Z|}@D[`fg5n W,(,.r|fڰ㡡PͽBv Oį+f,k.=t$[(? \⺡PhH&cU˱"Iw-n5׻hL1S2A? /s:izu!Ian*)Յ2vW_6M%\`aayP7Ш9PwV2F1\4/1\!rldzF ~;#WoA274%̯Ξ;MDpdPߓ ݒ:L-N5eg-Ֆ 2zx/ ]A8ƥH3*Zf:oI8rFʋ5S21.}\ݾ 9˥(dn ([L^9qWZvJ-›ۦz=wn(]}w'MFnG-i>㭰B j)FE: >1 &wNLq9c"T|' y"%Դ<$2 AG7`0?n~oohBx6."]&/;e`8A+nN`'\Y*La~:"-1+ w+`J+۱_ !^Vݫ"Ӌn|9[*g] *zb9~Ñij<o.@-X61, T_ ~ebocA`uRcu/bk)ꯚXATaZhj ~{J"ˌ(&Sp'y\Iŭ,ݓwFn,:N~/\oˉxO7)FJkWrJ=R0Ɣ #~{Z'hЖ2/b#DYZ=~-4}j |V sdr/ Wjg< h!K3S. ̷lGf&&`JP̜mRДYrߎ̈́ƫ1_^_;Sq+kLCrYDL]5r9"K߀W|/iWhM lpzgy77/>L+@񽟅L+Fh':>DjXE($S].!Z0(Idp2N QA Y?î'oB(-y&Zz˦2_-"8.Uכ!e𿟱5R4td[%3'ک cٜfiDܖgN & aES=IV",3G΁LꛭAe Ҧ3=-dvBB7{I]ƍ|Xl?Y7b(=ed㯉n=PF<!0ytȩ$jl#|#IϋC 9VMoу#?ƴ.7&=D24I&==I˘f/-AiZR':w_%'u 'A&ܰ'+39w!K*.>aw'u,1s΍³#8/YD!ԄH)f \A .o9mi*cK#nGB&9Ś砠__2z'wP JPar#swk3&JfKqJ.BܸDM?e;J,Ʃ'J{'v+ _65a@E qRf(^U`E脅iLOhlꓑ_ZW/{VUZ6;yh>ޘ#ZNU< ymZAf L*gCکwL-m̛!OhgNj$|ۨ4vMqm?0acs~kt12G)=.q9=n|M@PtBs ˔I`B"'@>߻Y#+>c?+.К)[nh\pc pN{GmA0ʢ(?{zsH;mnWڲ3 O1@YiC-nYVΧ~WhpJ,F߫`Œy`d@-źC&#>#K, ] Ha; ~2&bTL ޛQmFYR ()vء0fd0b&ld(%T{Dä8TQ-3р3<8# ڑfTן dttKpTΦ'AD:*n~K~`}DRVM'("DhݴJKp MP sufLGyˑ/y=`Rs6Blkce~_݆/'c+BAh#aqA!xq&8:zy a,'m$ش1f:D}*jن9Z-\!W9 c$2ˑMz06ڼQ6?'+.G*]zX.+٢8%4Uqr{BW* ҊܽpUX̮SV3bE*KK#Mk'Dc}4bkށ Z~1dŦ HQ⊂䈎ƱшxPk6@v>%W_X| I2ݶ.3sp`SQg@Q-#ϋj#!a.Od[mVS oTƨQ# }M a=hVQ'3_se|nAd<,T1[і}Պ:v 9b; #i9xbFK](/G,Qάtz n_OYY5@?CKLUP.SBX"Eկ\l{:@Ӻo(G .Qڊ&+iB( 6c*瘮)P<3.gq̜tźN IcJʽVkNe)خqB4<49{Ivv;yi@15PGn D2KBqx&>UB6]lN>,%QOTd_ͤR&QSwqe4}7.%yLz:ؠ H' twmRk>ۃָƮZ]I:MEE:+bAa"DWa-WsrtN@(L 6Ϲ0|ެ *pxrK!t*ئ׶[##! TC#5m_e %4EZzM[LԳ/.J=`z?XG TOmL,xoSAvNN<=DNT((1 `3 n4z G|"9 xRa_t'5(hfUuo5W$sۂw*T?̲^ϼ# >rUs ȃ\݉ /)6u 'gDRu)9H7  Q ̡P1mᓇqHEFD}\L%C46C0I3Ds+,uHi'}cY1qH: ʸ` %,]!IJei.˘S)3zq52mwe *Β'bӽ&2=t 1"'~fƼ%gMuaɵ>d6Gk*|XxS$="W~MvA51/gX oO(TYAC#KMmuTc}c T%1_pB"?[Qmq9ZUXTD09X3a_#ilEnW [?Mbzps#_0(8PEUĦma^j=JxhV~'WdUȳŞoąԩ=rTv[,ɧx+pU}Br;^+xshI"Ȳ ƺU$ə p-F oPV^rvB0].\lFO="^qw#BJvLw}u4MB#)iV4:1]K\+7 WS r_!xE1*{Oq3ܠkS4/UYdQb+mRLb mZEj1G0,BP2ww#yLjk'63{8>uEqQ$U.k0%p#%h[}@t-"/QHT_Ρvo4w':  yf\ˬ`'ѡH尴 $&qj o Uun `*cnf,lX) [o2IA%ԥ*0G֣$%Iqo"#C$"CIlKS0m4&ugdYkcPp3# 8ɵt%zAEM?Sw)ո~d@$@~ Z tE9ˁf3 A{s`x StP&+ZoxLExK'OQY[uOVc{<#w#`d8Q%/h` ?*_n$iH"v׀aM,-D0˴ٯ4AZw=SJ\ @kek xpGV4ou=@Lbߚʫx[CRGR5μCrM),)F8Ij *iBv-n ~B' ] Pk#=dvAH^(`D|W%pd޵(X<mvNz [P&^{AФ[+*fnF6}t kZ;(݂q׭ WeTXDGHD5=?KBBgwU`JE>+pNr@ 4AފlUбOXc u~K]䶓zbRV\r` bՠ.gB<ӑo`N#ԏ1ð3=՛JjǏ=uFR0ա wѶ1GOtؖzЂfY0giWI*ާ4^;er*bK`]{x\)1XBjA)?-QGѩF}Iuv*"33f#m~[$cIHVrͳzVZhM@WD!={ ==x?i lN+%T;te: fġxD5D5kV*jTD9 Iic78P^%nLW6F-ÿ%\5nV1o9@{)XEi/KV#Sԛ${k_\ ^J3FގLVa+. ]o%݀sd#oJl^4b F8va*N~A>a߾ $*wŚM,63،!jV_J40D,#4L}kGA௨ƽ P50lΚcJ͆P֭p+ZW:[l{)`F '_|i mR1$)d0TNf2 icA.L߄QcV@΃xylH@4.s|uBD&_1wFa ׈(tFK4\=k $3x"!V5k_ S1 %sIgN[TȅNm`}K/Cs'M!G7x |AYFLMPZW$)Tbx1P{ p6Gv@iX@(9n{:(=$bNdI[)q>2A=En}VNCkC/^x.}*K]2%px&T,B[cNV!?R`QĖ HM5] ݧ;g@ ݔQv *#h}$h3f|'}'_K!]sE繇M%pvO2*,@on4=.=uH],T:6^`C*ϜcxcB)D;r2vXN1="gUXV[ah\8beOPS'}bKU>IT.$l>(^>ğ. f2F[y>2(rJb׫~7{}I?e<ͺӫ@Qjz셫cBN@1#"K`e96.(R@(( XF C.y|~YB]9فy)}zKPdqő<Պ\g'hY4&)$LkiH݄o;Ikg[GM ޕC[ C(?/׬+:X{_~:-G?1MyJN-4yEI!!No`,#2ovV1B-VAS~`0S =|Ղ3)D3&x9 yAcoա /h@D_+wµhCrM !g/?zgjhbfz;ƽiij7]ja(3MJ'F$Tu3{!?{S]H_4G2d2WEj>u V!]\j=zWpyXl.#W&E2n{7 vqZo??eGopKOgcP8Qh۷uAuf)p{XjQDeߔG W]Pv1j6#g 3 EWd4D@owc{74^@xj/ 5{iV).Mo9Y}54KoE&/Q.z*)@(3WT4D(R2c)Ȉ O o {JYnsSF=93Giʁ\9TNïE&uf퓂7l(_\ߏh K;{lEC; FYHG?\PB/]MmRl~<^;Ƀך0j1,./?@h o^굲A4$KGJ-=*Ju]I:H\Oj' K(ƷfF9.{klc"u.I}!]˺Is7[%J!v)D%?[PI`PGly6 ՙ㻀Dm7c8jrYvRBk,lLtO/)[cu&sI Zah8vz81\?cwMKF) )%lM5:gR}ښ׹g6.{Jǜ*4~D`Jؚ \ZW[c_\p{?!KQ2ɗQGBwAFO$2^$]_`FIP9khk%O| mc&q 2-qFT$36QE0}5aԊSy`a QPi^YIaSw优^k\ %oasV,nu}UP3)1YcaYr4"dcEbwI=W,=Z u%!7 ؿr4Exx9Nĝi /Ҙ`,S}92y=4n$l1|]G#H (BPwx6>q*Qwqfm3Qm2X%x\&~eyeӢ^ĹjHܖp e}yB0 lFH9+=ih$3!࠶np`knTU: 7KhNjM @`jEՍCp¾P=LKKUoRca뉉 (# }\օ?D.H]} .4:E N]D#}z#!uw@8Sۮ5Df?ػO59֐r/rXh[NTQ.'@!3[|z,Y>MD)V,.r89rr%@}+4L[zz]S$F,N LBj2jHj+y.ϥ=u}!mZ}V؝;v+^,}3i&w>V&kN4!gA[D׆]Dc`մxf>MºNW߬bdsDT05% U3Iwm %α+)DxE]<(tŕpJX) %af + e(&(^19ƻ 񊸤ku߬q*Z~YM쨰Id0ηcj8*!Fȃa3*h=U|?wMf0ӎEά!ݱ7.Csܓy)CUbypAW &CCgWA@~rlBjEI.iR2 l=6.rw' E1J/l[v*2 {'Tc^ڬkc;VkK<X5߃cieEE.!A#l೯4iFd>P.ebIhCcZ [@ <.0F'Q+AND9V =o ORJ\;t^;5nQZksaɣOE1=^7c(kGb|\ڜƼm[-/<ׅиq݊֩v􈼺 v^!!s(kV0gNIMEP6b@׮2J31f*Q)PT!؀R[dt/=@VPš$p1hfoܴj@\uJ1Nk'ږeԭxuk4'~z_~BE) b ѥǂh0K97ԡXܐO#~'U#tXѹA5yo %6h^69A0Вs!0dXc\B0UnOxFFqNhz>."r 8acCaH%5yI#+s],WuhRDY*eF}bÒ`y#= ,p2[2e,{Ў{)9F c![b rpq#G҄'yK`EZcwoM5BPWǁ6)32C:hOUs4R*'Roa5"wqxH#xIp!2dukl>܎ţYQbӀ_" W/v Xv3j?͹QYlĒ)Rb.lDK5̈>2͵m̶dghAmUl؆VD!b>\4`ict_$p<X9虸0v'Qgn<Ce B :8w*} r1nM' ćOqlS}e<|_{6ibQkhq՜P{ s$ k 7I֜#*`Pv`.':\RuC:Z (XL~}Abp ؙg#V񘚔3t8hMD  $$/$#Fdܻ }/DRsLUSJ0"=l~5=%rT>t@#}dp9K_HZ }![dZsk&T3.Mqm]16ˏN=EDkRMn7nܲYqēoKbL:HkqO2E }_D\a;T&&7bFlw'Mޖo^P\C߄<] qt<4]?=&g;iY֙2xD8M`rc+G & :'(ƙTնf39!]BqBM]zs 禖V/esBk%CY/_yEޫSˏɳ$+Ηlm⼒DI~!!1OI-^٠ID$t 6 `!@#jo6,2( x&$$IJw L='L^RmL(x#WGtıpզd mΖΛAf&e_1;fn pWx_:/,"L5tzPcl{4dmp,*ۑ*@;gDX7`R$ Zn$3@sOSy_e EI6Ye JvœtqgSG·VI䳢fv,Zgeb"f<\L]uES1Oi^ju3`/byq=wܺ)RY]%GSd]bk1sjL#Ӏ-<8S)&LKƉU"t8DX wr0#l;B3F0͕2a$ Ki'e[0C-GaLC&r! @)8P)< kdB!fO1L9Oj(!n<=z6AY}b\u-TD0)2qv@gw,Jt8ʌQZv&xV8*ї|/<}f« TE|$R-U)*1bQC4}CP .jmY: aXOBQE[ER-As0Ŧ/-0/6Z1ɱk̾ _֔ѝ뎢K-NS $;"\oDKKrFqT]W2m]1 Bn7z\O6Kv|^aʲ,Jey D T9e#s"E1ݠI2C1Ԙ옙N<@ݶp8&ЬvTHՐ(763b|'6o.̢Vm@ob#cC'o}#Yr8šQL[Y,Cg }RRxg-B:n|1GS0 58 o ~`my=Zн%by(,(<`Ϗ爈/ V4)վYe]w3o"džXi&&KƆ*`C" ʂh'MލX'6+F߫_uNt['le(8UPy𡍁6JwT("))䍞p/Ӧݴ;](fЦX0^ UDLduXV ՜hɨA?$C8XP_Mj9kbn s}ox"U&,>6]@S: )#mGEƻi6 ֌˯sNuW!Bx?wz[,ibDX>[^(wKlViKXh7&mHsPkvji;׸~j~jVg5:^c۬,%q9z9l4(?T<^V)p6]|e /p؝f3. M]x˶{]#u ET d167P)^5رO?6  @Կ/T{z*8D06Cj S?K3/L,ofx+i׏HqL `d/1yO$!Vjyry8R 8sgރ];m` fOlƚKEo>u;xѳ[hi֜?PEtM-YH;. ք-#R3N̸},, |rpwΐ۰2@hbǸ_?lgq]yȓHǤa~y{A@%"9.&?@S OޭԂHwx`$݄~BtEے99]E1  ڈL`'WFBʋ'%\o -~ d:Ṋ'f@aSMH'<Ʊ>#~._PQTp{/$pӆZ0o(Qඓ|_W;1kx& KKU4ݺ!/_-Xؓ\ %KGm! GXX(s_鯧XPrm7LG#dCyF=WsAHbϓm<-.5Ԧ(野pW+'7 + ɑj|ɢwx]b'm sMHF}X p؆b5r?X1}|ҨiJxV<6-JHYC׌V~p[5¸_GHcgKBYDGqHxp7R7m6xQKܜrCzwЯ2n[Ŵ{`Cs%tSV'R>no4CUn8hbݬ׼ }QZ?Ƅ櫛@i?kq!C g"`oF5 ˸Xo Uy 6@@a}MF S.'T*ng憲9XB5 IYshN.5 eAw i4"xMqhٓ1MxE~ˀ#|Y>P'PUrs1Vbiꀽkb`Z#:Qzn@3xu#ǐobOW 8|×ί;Ps\7`wt.Ĥ8a:J ,I2e{:pGS^$q#+Uqg0la|ilJguL+ Uqq񆃰= k׏5س bУ*o^b?*pKG6X yaTީ9вqGa_JG\\ bLJ]A-Y~~4>1\&P PK?ӿ*'Д##ǂRdT F ~|V,KG.S"VH [ÚmB6}Zs1vQ><>U9h49haA)1UCnӴ*HH@q^#R2^\ {ۼ4mWg 83r!REUNm |1]Z[jc?:uxx_.l!AGq}µ7#[xxďμE;<Ռb}QD;0a1pvMfhxd&Oe1JR—Qs󱼔]R"2y@FBO ơA;o~[cJ U*å$p fW3#DF5&S{ i*NIj=-s Si#6ا]0MK%]0^ mG ~>ۉ K|V=4V kp+;!,W ]q^5S9< iu-3}gyQ1CxYko[揷x>\-v] ,1M-d U1+Vv}W,F[FG1~,?5`bed@{os(pu7 7 .c 6xǦ ;%Xl,)>.sj=]KEHުȞ)Yu(0tXq(LT ]3k@,h5lj|x򙘛QV U-@^=&@(F4'@;mqq[ILG2j%sSk31Nǔ QSCGՅu|?hmHbO,+93KXB93пyU`1DD SR876'cad@!uB+G858As,i|^EԇM++Ng UkKG"O dP;a)%g _i7&BB@Lq*G J2\#DU8]Y]p~S0Oũ*bX-ٴV .t@x.Q]&TX^ղdDQs˜lQCk xfMI ?,845 6~~V˹ A)O16Є]RuA\ʢS<.u.ାE,WE%BA [ֺ6?h'zgLݶ/5MRATiɎ0Ӛ.jj_\sPvbGL FpЊ|mYPT?LU(QiU6-ϴdH;Z{DVtUFRv̷X4vʨ)He˨ggfTX3%*N ۆx*@H\Mf8h쬼gaA :0qO'Q6&0h7vsgG³;W\#uVWvedxhWV>Wߍ /6J Hl~ /*Pԕy΅O WXyv>IPYgt#%Ab3? ))6Fz1JUe؏ #VfڮM nT1/#hKNRMTE&aͣ=t&,ȠaWȍ,%{~OZk34Fͯ$֯׃qӟ[+R@hF&"U5u( M4ҁpxJKv@y[;@ $jsۏe[[/0-r~LS-͇ǘx]{OxEZ7ka"Sw՛h_C-+`ʔ0'T J{9}:Gpbj*yl&Ӿ\ l˝QIHwzOvgZNÎLB'yUDH΀xMh(Ye+Jc "lU^&W giďҎFyDZǹe-.v/5Ey'-ݰ27#"q*{o !&v{gYi`L *D:[⑹P'/fF> 5Cc(ݦ!#V]r[gdUN;!۹&!;-#A8cb_Bo,_<Κ&p[)KPn:=֩kҚo(W5IZ(\yjqk$5+jPAZ&Qɍk,d]EIDIfomFeEiX&:K/oոMǁ"(7,̧,mZɷZ9'D1e>@ơ-eQ>fu8k3IJɥPv̵40\/4߶y?G3!SY}{W,e/5owj/'{тA+lV5$%1T4Pt*FZblm \Cj+K_Ֆ@:\r'UTw}ۚM`|=5DXe|?SG-.밵ecݹ 7TSVnf} #BfX ꖹ+)tnNh~0!ow_*. 9 &ݱ=lq&GEP,? B h9tz.0bŒ? Rx욠lҒ cO$˞ə2Wn#;8X!:Y `iH}^YPH<5} b+wPEngSZO5 sd_6/bR&vԕ ne~ԣBVhh15v{6}{I}T)+iҌ ViQI}toavsBB-YV?-XRM:2A>CT3VO9^M˼ca#x'9o/udd x xN*AB± s@ ?B35Yxy(@& [C'Řзؕj@+ž/XHS_xrq/@Q5%=+ۀl)5<.2b*AiR[*aGl:NEIJ^Y%oŽD<.U`R?WP\uoݦMy~Yd`"m$ۀH;^@rB2IΥY?' 8pLGD/ o8fk#qB<}p wRrW21.칇}ANvK_14$i()$v ^򥇚J;ad I 7c !\ww,2!;Oҩ6.؈B_@:q3"d9 i0ZnKx6 Jb ilkaYr7u'KQd$ ؟ö̈́X;_SC`MEӤNtILyoTkEwYxpseyGj ٙ~ai_G't:I,mJk_#c$}3uCo;mr #t."^'lDiI@2:&.nQyTӪgoyɔʚ C(^] B,^?ƒ=z莭O>*U&8oYZ‘Wx'?A;E鈸\zb =V0-QzW+n_]ϰJg2.D<ljK"48A D+tEP U'1H/[g!Pe#ϵ?'i\g>I|D'$Qڄ<|ZZ-n^{T{9/U e6*#®@. [u١֖+V])˗ V&WvP,l$p5Oޣbs% "| J^{>% ԰!/x2j8i<UD˕aO,Z% GߨM^~;CheC y9a}PnWpNk gk 6HF r_E”fko֟b+Oԛrqj&3b/{ /NoRmɮoPیqP\Uū .~@ FCȁ+Vb7L 7аA7]#nW@/Db?NH=D=.|]`dʻͫ Mk1;-.IYJl~ PΉucUl (D])N+D=|TCFۚ:4lI"DnhoIY"ͰO25}u0\zK&ۖCVڴh nflyUV0% ´z–QxÿU Jw&.n,K&A {䙝%B^"?@i_۲9܂G4p.>I#m0nddaj_aG1nƿ0"J6Fe[A`![ȹҘI^ n=brW4 l6sfNIɼEh7ӎʍpҺ=eYV?c25!1a}aK>ԘUܦJK eWfQgD9Z. SE'N!8Q`2> zѪ֬ JpK{.9eW:ǩkho VJpS+D@+EH ̷yC%NGP[;X3^%I) U=5VT3OtbuJ\`G_ )ظ[nCjriJ|akD,sI2ƀvGyc=Rc! JAٙG1>_Vg13f} xmPJ0E]zJ3}<gigʮ$Yh ! 86WZ" :o[;0MxWWEHceڠݨhW 7QgN]qAyU-DDھJYl;ӫh#5HofNY6>wؿ& x\ȜsЯf#|/W:8& AnPt:|nB"N6,7"2~}o> gldz8&*X),hgeK%BNO"`-'\VSExt{yYܞ8 h;DϾU} "={1{pwwVb>iB*34(@tdF|rKE Xl椔 AQkN)~Dp*[UQlwM?T 'T%M'~L:D Uۏx-pMb"-I@b#4|.;b:~/jH53HGH@*? _n'Pb}1h & 4Ƨfߟp @6e!cIΦj_N1ht·8<6{ !kvq6ÓNDh¨8P 0(0Lf&NZ䉌Aj#S'O4eנ*N4qP~P,R.K8KUx9"7h2=F.No7m&Ge).xmzke¶va(O!ZiB=;nwxr96ہ|X4#4[<#c#*___7x@H-Ex h 0D^P(bK* > ;$|<v]$:3sزX4le[&QEA?0i}jR{d8{L'Ə;q4)˚ʯ!\K=[,DF,gG ߮U+H.D!PC-_4hҜ'YV*.*"WVFv*G  Ha$ؠ°VֻP 5 YFfY Oc2MQ5fƌ#gVec `sl?V6T2*Λ3t]Ve' N㑠t%1Y͚XpOujVi[ؠʺ0%4|ʺ>xl8Zr"Goc?u]5q5Yc?'dTSSe;mZ(i}Ր86˙@WVJєZ2`Y@*n4-|x ZJZS2sDE! Cs[*,幋YJٻANUČqulbZ] ŏZ>pq&m'^[Cf d%%Dꅅ> TztLX'+6 `P{sp$> 4 x-_a^!JqEցx~O?5dޮˉ"tt*ь- 0`(Խl2NohpjjC_rՑR,$*fdsB$t#XVu]OJ4ϸU~_Sc '΂t;=+):u]9!tX;W<7 Dq!("Y4ѳGC70387z'} CuU{xPEݗ,--F\%<[o9 b2rEI dkl/gT,kFIiudwZ zP9mzQ*D 7317-!{}vPc݇*iD5!{!$7ocE%İ(%~QΎZHrܐ\#αADˏڠF$X9*ByE t]!(JLt@:ϗT JUp[)pNx TYf$'KWǓ31o#%#v?ue H\Lm%=43{AO.병 d[g[0m}f6.b gh~D8, h4R]5)Lx0?BV}=1;h¢+ʮ;oZ"JaD 5idSz9FR`˶i*zuNl]耦_5Y)pe_w/؇aJzTp%;]a ]z6%BPp"73BI@g)2_CØoq 椖s|nUp!?@3҃M'n4pD3oQ~>'\Nkt6a{l'hY̟Ͼ?yzP @d,3[ZB*1M~T:Iln r> H$N'"7 l^+1+#NO#4wo71$;m (¼_ xZ8/YVΪ9mڵjWqWL%oDԊɻ;+!J xڔtF *_ >֭r\c9+9=zr[!' [ :πu `CήNP\Ƕߔ+1%ZxOuu L:?ߕErVR {";0l7/Q%TX#LN<m:A h oq.+j)4F^ LbfA' >TC`VgLQS[{MVcA9B=xnZIDZ*xRg5se%k Cs)RD9JcVA=O`%aW4(&捳jhI,K !:=P)-U85U~YU! lMHFf"Wt&Bo1 "Ask@x޺Q'~ݛ(w,{{6HgVVc<;]Ր#뾇 +QMkK+c#1 Rs]"#^"  ЮeKώ82!EBF'*"q2^1ƾa(Pbf yK Q%l'ٞiYŠUSq*9`}ERw4@nJx29Tȇ weh7_iThBП~vڐP,/Luq/ w_^벥(M&)"`#Ā~wa+ԓ[T99( ?t9k!%6L#-'GB-wZ:-QvI뚣ZA اk { wYI}Oؽ&NHl_Q7xM&?$uKxD >Ή$n.?གྷ$!zS`m6dl g{[UI=nj|?%}QG R¤^!`a[q#d|=@z\.ꙸ'׳՞$ޒ}_1c.HX Cu'5Y}f[Q]Xmw~M/i輠`ns?A%F|@!K#FmuϸB1k|7E^h6$xfl78Q>-U Q>cpj,֫WU2uyGdylm)W9*;Ą!JYvƼF ,htD1AeJͽG up) gM/ޞ \.y6K̘'4=O6)Eߑ%{47&^,WJhӇq:G^e8DppЯWs)LùBpN{ԭǧJy35m~t',K.=_W4~>m@4%y_(-Hqz 1k77B_!Wو .g섩)@5yJΆ 2'@$2{O HG0X9PQ3IdpDRU7>ygǯߌ>\A*Fgq8r%q&_0 MHM#nƔpF6~zTZyiJ`KRS35m\a$^QqLNsuq,R_iNm"kYStAܫD^@`VGIe5(i?uWStxVuHM1T$-Oo8y@a\Ohq K뇴س:mL3oosS,עm"gy72S`ȲK4<$nuFh!8Rd;Vxq@0f(đ6Bhja 8ڕ*/!++TH O2u1AiJAl*hЖNxl /fC~ -%g#RhlF,S'~_Q eICM"zxD 큞Z/׿sLF9gov)_jJ_bhue[I}kH@ n޺So[