performance/0000755000176200001440000000000014517665742012574 5ustar liggesusersperformance/NAMESPACE0000644000176200001440000004440414517441234014005 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(bayesplot::pp_check, lm) S3method(bayesplot::pp_check, glm) S3method(bayesplot::pp_check, glmmTMB) S3method(bayesplot::pp_check, glm.nb) S3method(bayesplot::pp_check, merMod) S3method(bayesplot::pp_check, MixMod) S3method(bayesplot::pp_check, mle2) S3method(bayesplot::pp_check, negbin) S3method(bayesplot::pp_check, polr) S3method(bayesplot::pp_check, rma) S3method(bayesplot::pp_check, vlm) S3method(bayesplot::pp_check, wbm) S3method(bayesplot::pp_check, BFBayesFactor) S3method(AIC,bife) S3method(as.data.frame,check_outliers) S3method(as.data.frame,icc) S3method(as.data.frame,looic) S3method(as.data.frame,performance_accuracy) S3method(as.data.frame,performance_cv) S3method(as.data.frame,performance_pcp) S3method(as.data.frame,performance_score) S3method(as.data.frame,r2_bayes) S3method(as.data.frame,r2_loo) S3method(as.data.frame,r2_nakagawa) S3method(as.numeric,check_outliers) S3method(check_autocorrelation,default) S3method(check_collinearity,BFBayesFactor) S3method(check_collinearity,MixMod) S3method(check_collinearity,afex_aov) S3method(check_collinearity,betamfx) S3method(check_collinearity,betaor) S3method(check_collinearity,default) S3method(check_collinearity,glmmTMB) S3method(check_collinearity,hurdle) S3method(check_collinearity,logitmfx) S3method(check_collinearity,logitor) S3method(check_collinearity,negbinirr) S3method(check_collinearity,negbinmfx) S3method(check_collinearity,poissonirr) S3method(check_collinearity,poissonmfx) S3method(check_collinearity,probitmfx) S3method(check_collinearity,zerocount) S3method(check_collinearity,zeroinfl) S3method(check_concurvity,gam) S3method(check_convergence,"_glm") S3method(check_convergence,default) S3method(check_convergence,glmmTMB) S3method(check_convergence,merMod) S3method(check_distribution,default) S3method(check_distribution,numeric) S3method(check_heteroscedasticity,default) S3method(check_homogeneity,afex_aov) S3method(check_homogeneity,default) S3method(check_homogeneity,htest) S3method(check_model,brmsfit) S3method(check_model,default) S3method(check_model,model_fit) S3method(check_model,stanreg) S3method(check_multimodal,data.frame) S3method(check_multimodal,numeric) S3method(check_normality,BFBayesFactor) S3method(check_normality,afex_aov) S3method(check_normality,default) S3method(check_normality,glm) S3method(check_normality,glmmTMB) S3method(check_normality,htest) S3method(check_normality,lmerModLmerTest) S3method(check_normality,merMod) S3method(check_normality,numeric) S3method(check_outliers,BFBayesFactor) S3method(check_outliers,character) S3method(check_outliers,data.frame) S3method(check_outliers,default) S3method(check_outliers,fixest) S3method(check_outliers,fixest_multi) S3method(check_outliers,geeglm) S3method(check_outliers,glmmTMB) S3method(check_outliers,glmrob) S3method(check_outliers,gls) S3method(check_outliers,grouped_df) S3method(check_outliers,lme) S3method(check_outliers,lmrob) S3method(check_outliers,meta) S3method(check_outliers,metabin) S3method(check_outliers,metagen) S3method(check_outliers,numeric) S3method(check_outliers,rma) S3method(check_outliers,rma.uni) S3method(check_overdispersion,default) S3method(check_overdispersion,fixest) S3method(check_overdispersion,fixest_multi) S3method(check_overdispersion,glm) S3method(check_overdispersion,glmmTMB) S3method(check_overdispersion,glmx) S3method(check_overdispersion,merMod) S3method(check_overdispersion,model_fit) S3method(check_overdispersion,negbin) S3method(check_overdispersion,negbinirr) S3method(check_overdispersion,negbinmfx) S3method(check_overdispersion,poissonirr) S3method(check_overdispersion,poissonmfx) S3method(check_predictions,BFBayesFactor) S3method(check_predictions,default) S3method(check_predictions,lme) S3method(check_singularity,MixMod) S3method(check_singularity,clmm) S3method(check_singularity,cpglmm) S3method(check_singularity,default) S3method(check_singularity,glmmTMB) S3method(check_singularity,glmmadmb) S3method(check_singularity,lme) S3method(check_singularity,merMod) S3method(check_singularity,rlmerMod) S3method(check_sphericity,Anova.mlm) S3method(check_sphericity,afex_aov) S3method(check_sphericity,default) S3method(check_sphericity,mlm) S3method(check_symmetry,htest) S3method(check_symmetry,numeric) S3method(cronbachs_alpha,data.frame) S3method(cronbachs_alpha,matrix) S3method(cronbachs_alpha,parameters_pca) S3method(display,check_itemscale) S3method(display,compare_performance) S3method(display,performance_model) S3method(display,test_performance) S3method(fitted,BFBayesFactor) S3method(format,compare_performance) S3method(format,performance_model) S3method(format,test_performance) S3method(logLik,cpglm) S3method(logLik,iv_robust) S3method(logLik,ivreg) S3method(logLik,plm) S3method(logLik,svycoxph) S3method(model_performance,Arima) S3method(model_performance,BFBayesFactor) S3method(model_performance,DirichletRegModel) S3method(model_performance,MixMod) S3method(model_performance,bayesx) S3method(model_performance,betamfx) S3method(model_performance,betaor) S3method(model_performance,betareg) S3method(model_performance,bife) S3method(model_performance,blavaan) S3method(model_performance,brmsfit) S3method(model_performance,censReg) S3method(model_performance,clm) S3method(model_performance,clm2) S3method(model_performance,coxph) S3method(model_performance,default) S3method(model_performance,felm) S3method(model_performance,fixest) S3method(model_performance,fixest_multi) S3method(model_performance,flexsurvreg) S3method(model_performance,glm) S3method(model_performance,glmmTMB) S3method(model_performance,glmmadmb) S3method(model_performance,glmx) S3method(model_performance,hurdle) S3method(model_performance,iv_robust) S3method(model_performance,ivreg) S3method(model_performance,kmeans) S3method(model_performance,lavaan) S3method(model_performance,lm) S3method(model_performance,lm_robust) S3method(model_performance,lme) S3method(model_performance,lmrob) S3method(model_performance,logitmfx) S3method(model_performance,logitor) S3method(model_performance,margins) S3method(model_performance,merMod) S3method(model_performance,mixed) S3method(model_performance,mixor) S3method(model_performance,mlogit) S3method(model_performance,model_fit) S3method(model_performance,multinom) S3method(model_performance,negbinirr) S3method(model_performance,negbinmfx) S3method(model_performance,nestedLogit) S3method(model_performance,plm) S3method(model_performance,poissonirr) S3method(model_performance,poissonmfx) S3method(model_performance,polr) S3method(model_performance,probitmfx) S3method(model_performance,rlmerMod) S3method(model_performance,rma) S3method(model_performance,sem) S3method(model_performance,stanmvreg) S3method(model_performance,stanreg) S3method(model_performance,survreg) S3method(model_performance,svyglm) S3method(model_performance,truncreg) S3method(model_performance,vglm) S3method(model_performance,zeroinfl) S3method(model_performance,zerotrunc) S3method(performance_aic,bayesx) S3method(performance_aic,betamfx) S3method(performance_aic,betaor) S3method(performance_aic,default) S3method(performance_aic,lmerMod) S3method(performance_aic,logitmfx) S3method(performance_aic,logitor) S3method(performance_aic,negbinirr) S3method(performance_aic,negbinmfx) S3method(performance_aic,poissonirr) S3method(performance_aic,poissonmfx) S3method(performance_aic,probitmfx) S3method(performance_aic,svycoxph) S3method(performance_aic,svyglm) S3method(performance_aic,vgam) S3method(performance_aic,vglm) S3method(performance_aicc,Arima) S3method(performance_aicc,bife) S3method(performance_aicc,default) S3method(performance_aicc,lmerMod) S3method(performance_aicc,rma) S3method(performance_aicc,vglm) S3method(performance_logloss,brmsfit) S3method(performance_logloss,default) S3method(performance_logloss,logitmfx) S3method(performance_logloss,logitor) S3method(performance_logloss,probitmfx) S3method(performance_mae,betamfx) S3method(performance_mae,betaor) S3method(performance_mae,default) S3method(performance_mae,logitmfx) S3method(performance_mae,logitor) S3method(performance_mae,model_fit) S3method(performance_mae,negbinirr) S3method(performance_mae,negbinmfx) S3method(performance_mae,poissonirr) S3method(performance_mae,poissonmfx) S3method(performance_mae,probitmfx) S3method(performance_mse,betamfx) S3method(performance_mse,betaor) S3method(performance_mse,default) S3method(performance_mse,logitmfx) S3method(performance_mse,logitor) S3method(performance_mse,model_fit) S3method(performance_mse,negbinirr) S3method(performance_mse,negbinmfx) S3method(performance_mse,poissonirr) S3method(performance_mse,poissonmfx) S3method(performance_mse,probitmfx) S3method(plot,binned_residuals) S3method(plot,check_autocorrelation) S3method(plot,check_clusterstructure) S3method(plot,check_collinearity) S3method(plot,check_distribution) S3method(plot,check_distribution_numeric) S3method(plot,check_heteroscedasticity) S3method(plot,check_homogeneity) S3method(plot,check_model) S3method(plot,check_normality) S3method(plot,check_outliers) S3method(plot,check_overdisp) S3method(plot,check_sphericity) S3method(plot,compare_performance) S3method(plot,performance_pp_check) S3method(plot,performance_roc) S3method(plot,test_likelihoodratio) S3method(plot,test_performance) S3method(print,binned_residuals) S3method(print,check_autocorrelation) S3method(print,check_collinearity) S3method(print,check_concurvity) S3method(print,check_distribution) S3method(print,check_distribution_numeric) S3method(print,check_heterogeneity_bias) S3method(print,check_heteroscedasticity) S3method(print,check_homogeneity) S3method(print,check_itemscale) S3method(print,check_model) S3method(print,check_normality) S3method(print,check_normality_binom) S3method(print,check_outliers) S3method(print,check_outliers_metafor) S3method(print,check_outliers_metagen) S3method(print,check_overdisp) S3method(print,check_sphericity) S3method(print,check_symmetry) S3method(print,check_zi) S3method(print,compare_performance) S3method(print,icc) S3method(print,icc_by_group) S3method(print,icc_decomposed) S3method(print,item_difficulty) S3method(print,item_discrimination) S3method(print,looic) S3method(print,performance_accuracy) S3method(print,performance_cv) S3method(print,performance_hosmer) S3method(print,performance_model) S3method(print,performance_pcp) S3method(print,performance_pp_check) S3method(print,performance_roc) S3method(print,performance_score) S3method(print,r2_bayes) S3method(print,r2_generic) S3method(print,r2_loo) S3method(print,r2_mlm) S3method(print,r2_nakagawa) S3method(print,r2_nakagawa_by_group) S3method(print,r2_pseudo) S3method(print,test_likelihoodratio) S3method(print,test_performance) S3method(print_html,compare_performance) S3method(print_html,test_performance) S3method(print_md,check_itemscale) S3method(print_md,compare_performance) S3method(print_md,performance_model) S3method(print_md,test_performance) S3method(r2,Arima) S3method(r2,BBreg) S3method(r2,BFBayesFactor) S3method(r2,DirichletRegModel) S3method(r2,MixMod) S3method(r2,aov) S3method(r2,bayesx) S3method(r2,betamfx) S3method(r2,betaor) S3method(r2,betareg) S3method(r2,bife) S3method(r2,bigglm) S3method(r2,biglm) S3method(r2,bracl) S3method(r2,brmsfit) S3method(r2,brmultinom) S3method(r2,censReg) S3method(r2,clm) S3method(r2,clm2) S3method(r2,clmm) S3method(r2,complmrob) S3method(r2,coxph) S3method(r2,cpglm) S3method(r2,cpglmm) S3method(r2,cph) S3method(r2,crch) S3method(r2,default) S3method(r2,feis) S3method(r2,felm) S3method(r2,fixest) S3method(r2,fixest_multi) S3method(r2,gam) S3method(r2,glm) S3method(r2,glmmTMB) S3method(r2,glmmadmb) S3method(r2,glmx) S3method(r2,hurdle) S3method(r2,iv_robust) S3method(r2,ivreg) S3method(r2,lm) S3method(r2,lm_robust) S3method(r2,lme) S3method(r2,lmrob) S3method(r2,logitmfx) S3method(r2,logitor) S3method(r2,lrm) S3method(r2,mblogit) S3method(r2,mclogit) S3method(r2,merMod) S3method(r2,mhurdle) S3method(r2,mixed) S3method(r2,mlm) S3method(r2,mlogit) S3method(r2,mmclogit) S3method(r2,model_fit) S3method(r2,multinom) S3method(r2,negbinirr) S3method(r2,negbinmfx) S3method(r2,nestedLogit) S3method(r2,ols) S3method(r2,phylolm) S3method(r2,plm) S3method(r2,poissonirr) S3method(r2,poissonmfx) S3method(r2,polr) S3method(r2,probitmfx) S3method(r2,rlmerMod) S3method(r2,rma) S3method(r2,scam) S3method(r2,selection) S3method(r2,sem) S3method(r2,stanreg) S3method(r2,summary.lm) S3method(r2,survreg) S3method(r2,svyglm) S3method(r2,systemfit) S3method(r2,truncreg) S3method(r2,vgam) S3method(r2,vglm) S3method(r2,wbm) S3method(r2,zeroinfl) S3method(r2,zerotrunc) S3method(r2_coxsnell,BBreg) S3method(r2_coxsnell,DirichletRegModel) S3method(r2_coxsnell,bayesx) S3method(r2_coxsnell,bife) S3method(r2_coxsnell,censReg) S3method(r2_coxsnell,clm) S3method(r2_coxsnell,clm2) S3method(r2_coxsnell,coxph) S3method(r2_coxsnell,cpglm) S3method(r2_coxsnell,crch) S3method(r2_coxsnell,glm) S3method(r2_coxsnell,glmx) S3method(r2_coxsnell,logitmfx) S3method(r2_coxsnell,logitor) S3method(r2_coxsnell,mblogit) S3method(r2_coxsnell,mclogit) S3method(r2_coxsnell,multinom) S3method(r2_coxsnell,negbinirr) S3method(r2_coxsnell,negbinmfx) S3method(r2_coxsnell,nestedLogit) S3method(r2_coxsnell,poissonirr) S3method(r2_coxsnell,poissonmfx) S3method(r2_coxsnell,polr) S3method(r2_coxsnell,probit) S3method(r2_coxsnell,survreg) S3method(r2_coxsnell,svycoxph) S3method(r2_coxsnell,truncreg) S3method(r2_efron,default) S3method(r2_loo_posterior,BFBayesFactor) S3method(r2_loo_posterior,brmsfit) S3method(r2_loo_posterior,stanmvreg) S3method(r2_loo_posterior,stanreg) S3method(r2_mcfadden,bracl) S3method(r2_mcfadden,brmultinom) S3method(r2_mcfadden,censReg) S3method(r2_mcfadden,clm) S3method(r2_mcfadden,clm2) S3method(r2_mcfadden,cpglm) S3method(r2_mcfadden,glm) S3method(r2_mcfadden,glmx) S3method(r2_mcfadden,logitmfx) S3method(r2_mcfadden,logitor) S3method(r2_mcfadden,mblogit) S3method(r2_mcfadden,mclogit) S3method(r2_mcfadden,mlogit) S3method(r2_mcfadden,multinom) S3method(r2_mcfadden,negbinirr) S3method(r2_mcfadden,negbinmfx) S3method(r2_mcfadden,poissonirr) S3method(r2_mcfadden,poissonmfx) S3method(r2_mcfadden,polr) S3method(r2_mcfadden,probitmfx) S3method(r2_mcfadden,truncreg) S3method(r2_mcfadden,vglm) S3method(r2_mckelvey,default) S3method(r2_nagelkerke,BBreg) S3method(r2_nagelkerke,DirichletRegModel) S3method(r2_nagelkerke,bife) S3method(r2_nagelkerke,bracl) S3method(r2_nagelkerke,brmultinom) S3method(r2_nagelkerke,censReg) S3method(r2_nagelkerke,clm) S3method(r2_nagelkerke,clm2) S3method(r2_nagelkerke,coxph) S3method(r2_nagelkerke,cpglm) S3method(r2_nagelkerke,crch) S3method(r2_nagelkerke,glm) S3method(r2_nagelkerke,glmx) S3method(r2_nagelkerke,logitmfx) S3method(r2_nagelkerke,logitor) S3method(r2_nagelkerke,mblogit) S3method(r2_nagelkerke,mclogit) S3method(r2_nagelkerke,multinom) S3method(r2_nagelkerke,negbinirr) S3method(r2_nagelkerke,negbinmfx) S3method(r2_nagelkerke,nestedLogit) S3method(r2_nagelkerke,poissonirr) S3method(r2_nagelkerke,poissonmfx) S3method(r2_nagelkerke,polr) S3method(r2_nagelkerke,probitmfx) S3method(r2_nagelkerke,survreg) S3method(r2_nagelkerke,svycoxph) S3method(r2_nagelkerke,truncreg) S3method(r2_posterior,BFBayesFactor) S3method(r2_posterior,brmsfit) S3method(r2_posterior,stanmvreg) S3method(r2_posterior,stanreg) S3method(r2_tjur,default) S3method(r2_tjur,nestedLogit) S3method(residuals,BFBayesFactor) S3method(residuals,check_normality_numeric) S3method(residuals,iv_robust) S3method(rstudent,check_normality_numeric) S3method(test_bf,ListModels) S3method(test_bf,default) S3method(test_likelihoodratio,ListNestedRegressions) S3method(test_likelihoodratio,default) S3method(test_performance,ListNestedRegressions) S3method(test_performance,ListNonNestedRegressions) S3method(test_performance,default) S3method(test_vuong,ListNestedRegressions) S3method(test_vuong,ListNonNestedRegressions) S3method(test_vuong,default) S3method(test_wald,ListNestedRegressions) S3method(test_wald,ListNonNestedRegressions) S3method(test_wald,default) export(binned_residuals) export(check_autocorrelation) export(check_clusterstructure) export(check_collinearity) export(check_concurvity) export(check_convergence) export(check_distribution) export(check_factorstructure) export(check_heterogeneity_bias) export(check_heteroscedasticity) export(check_heteroskedasticity) export(check_homogeneity) export(check_itemscale) export(check_kmo) export(check_model) export(check_multimodal) export(check_normality) export(check_outliers) export(check_overdispersion) export(check_posterior_predictions) export(check_predictions) export(check_singularity) export(check_sphericity) export(check_sphericity_bartlett) export(check_symmetry) export(check_zeroinflation) export(compare_performance) export(cronbachs_alpha) export(display) export(icc) export(item_difficulty) export(item_discrimination) export(item_intercor) export(item_reliability) export(item_split_half) export(looic) export(mae) export(model_performance) export(mse) export(multicollinearity) export(performance) export(performance_accuracy) export(performance_aic) export(performance_aicc) export(performance_cv) export(performance_hosmer) export(performance_logloss) export(performance_mae) export(performance_mse) export(performance_pcp) export(performance_rmse) export(performance_roc) export(performance_rse) export(performance_score) export(posterior_predictive_check) export(print_html) export(print_md) export(r2) export(r2_bayes) export(r2_coxsnell) export(r2_efron) export(r2_kullback) export(r2_loo) export(r2_loo_posterior) export(r2_mcfadden) export(r2_mckelvey) export(r2_nagelkerke) export(r2_nakagawa) export(r2_posterior) export(r2_somers) export(r2_tjur) export(r2_xu) export(r2_zeroinflated) export(rmse) export(test_bf) export(test_likelihoodratio) export(test_lrt) export(test_performance) export(test_vuong) export(test_wald) export(variance_decomposition) importFrom(insight,display) importFrom(insight,print_html) importFrom(insight,print_md) importFrom(stats,residuals) importFrom(stats,rstudent) performance/README.md0000644000176200001440000004325714436307766014065 0ustar liggesusers # performance [![DOI](https://joss.theoj.org/papers/10.21105/joss.03139/status.svg)](https://doi.org/10.21105/joss.03139) [![downloads](http://cranlogs.r-pkg.org/badges/performance)](https://cran.r-project.org/package=performance) [![total](https://cranlogs.r-pkg.org/badges/grand-total/performance)](https://cranlogs.r-pkg.org/) [![status](https://tinyverse.netlify.com/badge/performance)](https://CRAN.R-project.org/package=performance) ***Test if your model is a good model!*** A crucial aspect when building regression models is to evaluate the quality of modelfit. It is important to investigate how well models fit to the data and which fit indices to report. Functions to create diagnostic plots or to compute fit measures do exist, however, mostly spread over different packages. There is no unique and consistent approach to assess the model quality for different kind of models. The primary goal of the **performance** package is to fill this gap and to provide utilities for computing **indices of model quality** and **goodness of fit**. These include measures like r-squared (R2), root mean squared error (RMSE) or intraclass correlation coefficient (ICC) , but also functions to check (mixed) models for overdispersion, zero-inflation, convergence or singularity. ## Installation [![CRAN](http://www.r-pkg.org/badges/version/performance)](https://cran.r-project.org/package=performance) [![performance status badge](https://easystats.r-universe.dev/badges/performance)](https://easystats.r-universe.dev) [![R check](https://github.com/easystats/performance/workflows/R-CMD-check/badge.svg?branch=main)](https://github.com/easystats/performance/actions) The *performance* package is available on CRAN, while its latest development version is available on R-universe (from *rOpenSci*). | Type | Source | Command | |-------------|------------|-------------------------------------------------------------------------------| | Release | CRAN | `install.packages("performance")` | | Development | R-universe | `install.packages("performance", repos = "https://easystats.r-universe.dev")` | Once you have downloaded the package, you can then load it using: ``` r library("performance") ``` > **Tip** > > Instead of `library(performance)`, use `library(easystats)`. This will > make all features of the easystats-ecosystem available. > > To stay updated, use `easystats::install_latest()`. ## Citation To cite performance in publications use: ``` r citation("performance") #> To cite package 'performance' in publications use: #> #> Lüdecke et al., (2021). performance: An R Package for Assessment, Comparison and #> Testing of Statistical Models. Journal of Open Source Software, 6(60), 3139. #> https://doi.org/10.21105/joss.03139 #> #> A BibTeX entry for LaTeX users is #> #> @Article{, #> title = {{performance}: An {R} Package for Assessment, Comparison and Testing of Statistical Models}, #> author = {Daniel Lüdecke and Mattan S. Ben-Shachar and Indrajeet Patil and Philip Waggoner and Dominique Makowski}, #> year = {2021}, #> journal = {Journal of Open Source Software}, #> volume = {6}, #> number = {60}, #> pages = {3139}, #> doi = {10.21105/joss.03139}, #> } ``` ## Documentation There is a nice introduction into the package on [youtube](https://www.youtube.com/watch?v=EPIxQ5i5oxs). ## The *performance* workflow ### Assessing model quality #### R-squared **performance** has a generic `r2()` function, which computes the r-squared for many different models, including mixed effects and Bayesian regression models. `r2()` returns a list containing values related to the “most appropriate” r-squared for the given model. ``` r model <- lm(mpg ~ wt + cyl, data = mtcars) r2(model) #> # R2 for Linear Regression #> R2: 0.830 #> adj. R2: 0.819 model <- glm(am ~ wt + cyl, data = mtcars, family = binomial) r2(model) #> # R2 for Logistic Regression #> Tjur's R2: 0.705 library(MASS) data(housing) model <- polr(Sat ~ Infl + Type + Cont, weights = Freq, data = housing) r2(model) #> Nagelkerke's R2: 0.108 ``` The different R-squared measures can also be accessed directly via functions like `r2_bayes()`, `r2_coxsnell()` or `r2_nagelkerke()` (see a full list of functions [here](https://easystats.github.io/performance/reference/index.html#section-r-functions)). For mixed models, the *conditional* and *marginal* R-squared are returned. The *marginal R-squared* considers only the variance of the fixed effects and indicates how much of the model’s variance is explained by the fixed effects part only. The *conditional R-squared* takes both the fixed and random effects into account and indicates how much of the model’s variance is explained by the “complete” model. For frequentist mixed models, `r2()` (resp. `r2_nakagawa()`) computes the *mean* random effect variances, thus `r2()` is also appropriate for mixed models with more complex random effects structures, like random slopes or nested random effects (Johnson 2014; Nakagawa, Johnson, and Schielzeth 2017). ``` r set.seed(123) library(rstanarm) model <- stan_glmer( Petal.Length ~ Petal.Width + (1 | Species), data = iris, cores = 4 ) r2(model) #> # Bayesian R2 with Compatibility Interval #> #> Conditional R2: 0.953 (95% CI [0.942, 0.963]) #> Marginal R2: 0.824 (95% CI [0.721, 0.899]) library(lme4) model <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy) r2(model) #> # R2 for Mixed Models #> #> Conditional R2: 0.799 #> Marginal R2: 0.279 ``` #### Intraclass Correlation Coefficient (ICC) Similar to R-squared, the ICC provides information on the explained variance and can be interpreted as “the proportion of the variance explained by the grouping structure in the population” (Hox 2010). `icc()` calculates the ICC for various mixed model objects, including `stanreg` models. ``` r library(lme4) model <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy) icc(model) #> # Intraclass Correlation Coefficient #> #> Adjusted ICC: 0.722 #> Unadjusted ICC: 0.521 ``` …and models of class `brmsfit`. ``` r library(brms) set.seed(123) model <- brm(mpg ~ wt + (1 | cyl) + (1 + wt | gear), data = mtcars) ``` ``` r icc(model) #> # Intraclass Correlation Coefficient #> #> Adjusted ICC: 0.930 #> Unadjusted ICC: 0.771 ``` ### Model diagnostics #### Check for overdispersion Overdispersion occurs when the observed variance in the data is higher than the expected variance from the model assumption (for Poisson, variance roughly equals the mean of an outcome). `check_overdispersion()` checks if a count model (including mixed models) is overdispersed or not. ``` r library(glmmTMB) data(Salamanders) model <- glm(count ~ spp + mined, family = poisson, data = Salamanders) check_overdispersion(model) #> # Overdispersion test #> #> dispersion ratio = 2.946 #> Pearson's Chi-Squared = 1873.710 #> p-value = < 0.001 ``` Overdispersion can be fixed by either modelling the dispersion parameter (not possible with all packages), or by choosing a different distributional family (like Quasi-Poisson, or negative binomial, see (Gelman and Hill 2007)). #### Check for zero-inflation Zero-inflation (in (Quasi-)Poisson models) is indicated when the amount of observed zeros is larger than the amount of predicted zeros, so the model is *underfitting* zeros. In such cases, it is recommended to use negative binomial or zero-inflated models. Use `check_zeroinflation()` to check if zero-inflation is present in the fitted model. ``` r model <- glm(count ~ spp + mined, family = poisson, data = Salamanders) check_zeroinflation(model) #> # Check for zero-inflation #> #> Observed zeros: 387 #> Predicted zeros: 298 #> Ratio: 0.77 ``` #### Check for singular model fits A “singular” model fit means that some dimensions of the variance-covariance matrix have been estimated as exactly zero. This often occurs for mixed models with overly complex random effects structures. `check_singularity()` checks mixed models (of class `lme`, `merMod`, `glmmTMB` or `MixMod`) for singularity, and returns `TRUE` if the model fit is singular. ``` r library(lme4) data(sleepstudy) # prepare data set.seed(123) sleepstudy$mygrp <- sample(1:5, size = 180, replace = TRUE) sleepstudy$mysubgrp <- NA for (i in 1:5) { filter_group <- sleepstudy$mygrp == i sleepstudy$mysubgrp[filter_group] <- sample(1:30, size = sum(filter_group), replace = TRUE) } # fit strange model model <- lmer( Reaction ~ Days + (1 | mygrp / mysubgrp) + (1 | Subject), data = sleepstudy ) check_singularity(model) #> [1] TRUE ``` Remedies to cure issues with singular fits can be found [here](https://easystats.github.io/performance/reference/check_singularity.html). #### Check for heteroskedasticity Linear models assume constant error variance (homoskedasticity). The `check_heteroscedasticity()` functions assess if this assumption has been violated: ``` r data(cars) model <- lm(dist ~ speed, data = cars) check_heteroscedasticity(model) #> Warning: Heteroscedasticity (non-constant error variance) detected (p = 0.031). ``` #### Comprehensive visualization of model checks **performance** provides many functions to check model assumptions, like `check_collinearity()`, `check_normality()` or `check_heteroscedasticity()`. To get a comprehensive check, use `check_model()`. ``` r # defining a model model <- lm(mpg ~ wt + am + gear + vs * cyl, data = mtcars) # checking model assumptions check_model(model) ``` ### Model performance summaries `model_performance()` computes indices of model performance for regression models. Depending on the model object, typical indices might be r-squared, AIC, BIC, RMSE, ICC or LOOIC. #### Linear model ``` r m1 <- lm(mpg ~ wt + cyl, data = mtcars) model_performance(m1) #> # Indices of model performance #> #> AIC | AICc | BIC | R2 | R2 (adj.) | RMSE | Sigma #> --------------------------------------------------------------- #> 156.010 | 157.492 | 161.873 | 0.830 | 0.819 | 2.444 | 2.568 ``` #### Logistic regression ``` r m2 <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") model_performance(m2) #> # Indices of model performance #> #> AIC | AICc | BIC | Tjur's R2 | RMSE | Sigma | Log_loss | Score_log | Score_spherical | PCP #> ----------------------------------------------------------------------------------------------------- #> 31.298 | 32.155 | 35.695 | 0.478 | 0.359 | 1.000 | 0.395 | -14.903 | 0.095 | 0.743 ``` #### Linear mixed model ``` r library(lme4) m3 <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy) model_performance(m3) #> # Indices of model performance #> #> AIC | AICc | BIC | R2 (cond.) | R2 (marg.) | ICC | RMSE | Sigma #> ---------------------------------------------------------------------------------- #> 1755.628 | 1756.114 | 1774.786 | 0.799 | 0.279 | 0.722 | 23.438 | 25.592 ``` ### Models comparison The `compare_performance()` function can be used to compare the performance and quality of several models (including models of different types). ``` r counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) outcome <- gl(3, 1, 9) treatment <- gl(3, 3) m4 <- glm(counts ~ outcome + treatment, family = poisson()) compare_performance(m1, m2, m3, m4, verbose = FALSE) #> # Comparison of Model Performance Indices #> #> Name | Model | AIC (weights) | AICc (weights) | BIC (weights) | RMSE | Sigma | Score_log | Score_spherical | R2 | R2 (adj.) | Tjur's R2 | Log_loss | PCP | R2 (cond.) | R2 (marg.) | ICC | Nagelkerke's R2 #> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ #> m1 | lm | 156.0 (<.001) | 157.5 (<.001) | 161.9 (<.001) | 2.444 | 2.568 | | | 0.830 | 0.819 | | | | | | | #> m2 | glm | 31.3 (>.999) | 32.2 (>.999) | 35.7 (>.999) | 0.359 | 1.000 | -14.903 | 0.095 | | | 0.478 | 0.395 | 0.743 | | | | #> m3 | lmerMod | 1764.0 (<.001) | 1764.5 (<.001) | 1783.1 (<.001) | 23.438 | 25.592 | | | | | | | | 0.799 | 0.279 | 0.722 | #> m4 | glm | 56.8 (<.001) | 76.8 (<.001) | 57.7 (<.001) | 3.043 | 1.000 | -2.598 | 0.324 | | | | | | | | | 0.657 ``` #### General index of model performance One can also easily compute and a [**composite index**](https://easystats.github.io/performance/reference/compare_performance.html#details) of model performance and sort the models from the best one to the worse. ``` r compare_performance(m1, m2, m3, m4, rank = TRUE, verbose = FALSE) #> # Comparison of Model Performance Indices #> #> Name | Model | RMSE | Sigma | AIC weights | AICc weights | BIC weights | Performance-Score #> ----------------------------------------------------------------------------------------------- #> m2 | glm | 0.359 | 1.000 | 1.000 | 1.000 | 1.000 | 100.00% #> m4 | glm | 3.043 | 1.000 | 2.96e-06 | 2.06e-10 | 1.63e-05 | 37.67% #> m1 | lm | 2.444 | 2.568 | 8.30e-28 | 6.07e-28 | 3.99e-28 | 36.92% #> m3 | lmerMod | 23.438 | 25.592 | 0.00e+00 | 0.00e+00 | 0.00e+00 | 0.00% ``` #### Visualisation of indices of models’ performance Finally, we provide convenient visualisation (the `see` package must be installed). ``` r plot(compare_performance(m1, m2, m4, rank = TRUE, verbose = FALSE)) ``` ### Testing models `test_performance()` (and `test_bf`, its Bayesian sister) carries out the most relevant and appropriate tests based on the input (for instance, whether the models are nested or not). ``` r set.seed(123) data(iris) lm1 <- lm(Sepal.Length ~ Species, data = iris) lm2 <- lm(Sepal.Length ~ Species + Petal.Length, data = iris) lm3 <- lm(Sepal.Length ~ Species * Sepal.Width, data = iris) lm4 <- lm(Sepal.Length ~ Species * Sepal.Width + Petal.Length + Petal.Width, data = iris) test_performance(lm1, lm2, lm3, lm4) #> Name | Model | BF | Omega2 | p (Omega2) | LR | p (LR) #> -------------------------------------------------------------- #> lm1 | lm | | | | | #> lm2 | lm | 3.45e+26 | 0.69 | < .001 | -6.25 | < .001 #> lm3 | lm | 4.69e+07 | 0.36 | < .001 | -3.44 | < .001 #> lm4 | lm | 7.58e+29 | 0.73 | < .001 | -7.77 | < .001 #> Each model is compared to lm1. test_bf(lm1, lm2, lm3, lm4) #> Bayes Factors for Model Comparison #> #> Model BF #> [lm2] Species + Petal.Length 3.45e+26 #> [lm3] Species * Sepal.Width 4.69e+07 #> [lm4] Species * Sepal.Width + Petal.Length + Petal.Width 7.58e+29 #> #> * Against Denominator: [lm1] Species #> * Bayes Factor Type: BIC approximation ``` ### Plotting Functions Plotting functions are available through the [**see** package](https://easystats.github.io/see/articles/performance.html). # Code of Conduct Please note that the performance project is released with a [Contributor Code of Conduct](https://easystats.github.io/performance/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms. # Contributing We are happy to receive bug reports, suggestions, questions, and (most of all) contributions to fix problems and add features. Please follow contributing guidelines mentioned here: ## References
Gelman, Andrew, and Jennifer Hill. 2007. *Data Analysis Using Regression and Multilevel/Hierarchical Models*. Analytical Methods for Social Research. Cambridge ; New York: Cambridge University Press.
Hox, J. J. 2010. *Multilevel Analysis: Techniques and Applications*. 2nd ed. Quantitative Methodology Series. New York: Routledge.
Johnson, Paul C. D. 2014. “Extension of Nakagawa & Schielzeth’s R2 GLMM to Random Slopes Models.” Edited by Robert B. O’Hara. *Methods in Ecology and Evolution* 5 (9): 944–46.
Nakagawa, Shinichi, Paul C. D. Johnson, and Holger Schielzeth. 2017. “The Coefficient of Determination R2 and Intra-Class Correlation Coefficient from Generalized Linear Mixed-Effects Models Revisited and Expanded.” *Journal of The Royal Society Interface* 14 (134): 20170213.
performance/man/0000755000176200001440000000000014517502246013334 5ustar liggesusersperformance/man/model_performance.kmeans.Rd0000644000176200001440000000134514257247716020575 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.kmeans.R \name{model_performance.kmeans} \alias{model_performance.kmeans} \title{Model summary for k-means clustering} \usage{ \method{model_performance}{kmeans}(model, verbose = TRUE, ...) } \arguments{ \item{model}{Object of type \code{kmeans}.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments passed to or from other methods.} } \description{ Model summary for k-means clustering } \examples{ # a 2-dimensional example x <- rbind( matrix(rnorm(100, sd = 0.3), ncol = 2), matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2) ) colnames(x) <- c("x", "y") model <- kmeans(x, 2) model_performance(model) } performance/man/item_reliability.Rd0000644000176200001440000000333614362032043017146 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/item_reliability.R \name{item_reliability} \alias{item_reliability} \title{Reliability Test for Items or Scales} \usage{ item_reliability(x, standardize = FALSE, digits = 3) } \arguments{ \item{x}{A matrix or a data frame.} \item{standardize}{Logical, if \code{TRUE}, the data frame's vectors will be standardized. Recommended when the variables have different measures / scales.} \item{digits}{Amount of digits for returned values.} } \value{ A data frame with the corrected item-total correlations (\emph{item discrimination}, column \code{item_discrimination}) and Cronbach's Alpha (if item deleted, column \code{alpha_if_deleted}) for each item of the scale, or \code{NULL} if data frame had too less columns. } \description{ Compute various measures of internal consistencies for tests or item-scales of questionnaires. } \details{ This function calculates the item discriminations (corrected item-total correlations for each item of \code{x} with the remaining items) and the Cronbach's alpha for each item, if it was deleted from the scale. The absolute value of the item discrimination indices should be above 0.2. An index between 0.2 and 0.4 is considered as "fair", while an index above 0.4 (or below -0.4) is "good". The range of satisfactory values is from 0.4 to 0.7. Items with low discrimination indices are often ambiguously worded and should be examined. Items with negative indices should be examined to determine why a negative value was obtained (e.g. reversed answer categories regarding positive and negative poles). } \examples{ data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] item_reliability(x) } performance/man/model_performance.lavaan.Rd0000644000176200001440000001154514501062052020540 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.lavaan.R \name{model_performance.lavaan} \alias{model_performance.lavaan} \title{Performance of lavaan SEM / CFA Models} \usage{ \method{model_performance}{lavaan}(model, metrics = "all", verbose = TRUE, ...) } \arguments{ \item{model}{A \strong{lavaan} model.} \item{metrics}{Can be \code{"all"} or a character vector of metrics to be computed (some of \code{"Chi2"}, \code{"Chi2_df"}, \code{"p_Chi2"}, \code{"Baseline"}, \code{"Baseline_df"}, \code{"p_Baseline"}, \code{"GFI"}, \code{"AGFI"}, \code{"NFI"}, \code{"NNFI"}, \code{"CFI"}, \code{"RMSEA"}, \code{"RMSEA_CI_low"}, \code{"RMSEA_CI_high"}, \code{"p_RMSEA"}, \code{"RMR"}, \code{"SRMR"}, \code{"RFI"}, \code{"PNFI"}, \code{"IFI"}, \code{"RNI"}, \code{"Loglikelihood"}, \code{"AIC"}, \code{"BIC"}, and \code{"BIC_adjusted"}.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments passed to or from other methods.} } \value{ A data frame (with one row) and one column per "index" (see \code{metrics}). } \description{ Compute indices of model performance for SEM or CFA models from the \strong{lavaan} package. } \details{ \subsection{Indices of fit}{ \itemize{ \item \strong{Chisq}: The model Chi-squared assesses overall fit and the discrepancy between the sample and fitted covariance matrices. Its p-value should be > .05 (i.e., the hypothesis of a perfect fit cannot be rejected). However, it is quite sensitive to sample size. \item \strong{GFI/AGFI}: The (Adjusted) Goodness of Fit is the proportion of variance accounted for by the estimated population covariance. Analogous to R2. The GFI and the AGFI should be > .95 and > .90, respectively. \item \strong{NFI/NNFI/TLI}: The (Non) Normed Fit Index. An NFI of 0.95, indicates the model of interest improves the fit by 95\\% relative to the null model. The NNFI (also called the Tucker Lewis index; TLI) is preferable for smaller samples. They should be > .90 (Byrne, 1994) or > .95 (Schumacker and Lomax, 2004). \item \strong{CFI}: The Comparative Fit Index is a revised form of NFI. Not very sensitive to sample size (Fan, Thompson, and Wang, 1999). Compares the fit of a target model to the fit of an independent, or null, model. It should be > .90. \item \strong{RMSEA}: The Root Mean Square Error of Approximation is a parsimony-adjusted index. Values closer to 0 represent a good fit. It should be < .08 or < .05. The p-value printed with it tests the hypothesis that RMSEA is less than or equal to .05 (a cutoff sometimes used for good fit), and thus should be not significant. \item \strong{RMR/SRMR}: the (Standardized) Root Mean Square Residual represents the square-root of the difference between the residuals of the sample covariance matrix and the hypothesized model. As the RMR can be sometimes hard to interpret, better to use SRMR. Should be < .08. \item \strong{RFI}: the Relative Fit Index, also known as RHO1, is not guaranteed to vary from 0 to 1. However, RFI close to 1 indicates a good fit. \item \strong{IFI}: the Incremental Fit Index (IFI) adjusts the Normed Fit Index (NFI) for sample size and degrees of freedom (Bollen's, 1989). Over 0.90 is a good fit, but the index can exceed 1. \item \strong{PNFI}: the Parsimony-Adjusted Measures Index. There is no commonly agreed-upon cutoff value for an acceptable model for this index. Should be > 0.50. } } See the documentation for \code{?lavaan::fitmeasures}. \subsection{What to report}{ Kline (2015) suggests that at a minimum the following indices should be reported: The model \strong{chi-square}, the \strong{RMSEA}, the \strong{CFI} and the \strong{SRMR}. } } \examples{ \dontshow{if (require("lavaan")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Confirmatory Factor Analysis (CFA) --------- data(HolzingerSwineford1939, package = "lavaan") structure <- " visual =~ x1 + x2 + x3 textual =~ x4 + x5 + x6 speed =~ x7 + x8 + x9 " model <- lavaan::cfa(structure, data = HolzingerSwineford1939) model_performance(model) \dontshow{\}) # examplesIf} } \references{ \itemize{ \item Byrne, B. M. (1994). Structural equation modeling with EQS and EQS/Windows. Thousand Oaks, CA: Sage Publications. \item Tucker, L. R., and Lewis, C. (1973). The reliability coefficient for maximum likelihood factor analysis. Psychometrika, 38, 1-10. \item Schumacker, R. E., and Lomax, R. G. (2004). A beginner's guide to structural equation modeling, Second edition. Mahwah, NJ: Lawrence Erlbaum Associates. \item Fan, X., B. Thompson, and L. Wang (1999). Effects of sample size, estimation method, and model specification on structural equation modeling fit indexes. Structural Equation Modeling, 6, 56-83. \item Kline, R. B. (2015). Principles and practice of structural equation modeling. Guilford publications. } } performance/man/r2_tjur.Rd0000644000176200001440000000201714327475467015227 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_tjur.R \name{r2_tjur} \alias{r2_tjur} \title{Tjur's R2 - coefficient of determination (D)} \usage{ r2_tjur(model, ...) } \arguments{ \item{model}{Binomial Model.} \item{...}{Arguments from other functions, usually only used internally.} } \value{ A named vector with the R2 value. } \description{ This method calculates the Coefficient of Discrimination \code{D} (also known as Tjur's R2; \cite{Tjur, 2009}) for generalized linear (mixed) models for binary outcomes. It is an alternative to other pseudo-R2 values like Nagelkerke's R2 or Cox-Snell R2. The Coefficient of Discrimination \code{D} can be read like any other (pseudo-)R2 value. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") r2_tjur(model) } \references{ Tjur, T. (2009). Coefficients of determination in logistic regression models - A new proposal: The coefficient of discrimination. The American Statistician, 63(4), 366-372. } performance/man/r2_bayes.Rd0000644000176200001440000000766314517461276015354 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_bayes.R \name{r2_bayes} \alias{r2_bayes} \alias{r2_posterior} \alias{r2_posterior.brmsfit} \alias{r2_posterior.stanreg} \alias{r2_posterior.BFBayesFactor} \title{Bayesian R2} \usage{ r2_bayes(model, robust = TRUE, ci = 0.95, verbose = TRUE, ...) r2_posterior(model, ...) \method{r2_posterior}{brmsfit}(model, verbose = TRUE, ...) \method{r2_posterior}{stanreg}(model, verbose = TRUE, ...) \method{r2_posterior}{BFBayesFactor}(model, average = FALSE, prior_odds = NULL, verbose = TRUE, ...) } \arguments{ \item{model}{A Bayesian regression model (from \strong{brms}, \strong{rstanarm}, \strong{BayesFactor}, etc).} \item{robust}{Logical, if \code{TRUE}, the median instead of mean is used to calculate the central tendency of the variances.} \item{ci}{Value or vector of probability of the CI (between 0 and 1) to be estimated.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments passed to \code{r2_posterior()}.} \item{average}{Compute model-averaged index? See \code{\link[bayestestR:weighted_posteriors]{bayestestR::weighted_posteriors()}}.} \item{prior_odds}{Optional vector of prior odds for the models compared to the first model (or the denominator, for \code{BFBayesFactor} objects). For \code{data.frame}s, this will be used as the basis of weighting.} } \value{ A list with the Bayesian R2 value. For mixed models, a list with the Bayesian R2 value and the marginal Bayesian R2 value. The standard errors and credible intervals for the R2 values are saved as attributes. } \description{ Compute R2 for Bayesian models. For mixed models (including a random part), it additionally computes the R2 related to the fixed effects only (marginal R2). While \code{r2_bayes()} returns a single R2 value, \code{r2_posterior()} returns a posterior sample of Bayesian R2 values. } \details{ \code{r2_bayes()} returns an "unadjusted" R2 value. See \code{\link[=r2_loo]{r2_loo()}} to calculate a LOO-adjusted R2, which comes conceptually closer to an adjusted R2 measure. For mixed models, the conditional and marginal R2 are returned. The marginal R2 considers only the variance of the fixed effects, while the conditional R2 takes both the fixed and random effects into account. \code{r2_posterior()} is the actual workhorse for \code{r2_bayes()} and returns a posterior sample of Bayesian R2 values. } \examples{ \dontshow{if (require("rstanarm") && require("rstantools") && require("BayesFactor") && require("brms")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(performance) \donttest{ model <- suppressWarnings(rstanarm::stan_glm( mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0, show_messages = FALSE )) r2_bayes(model) model <- suppressWarnings(rstanarm::stan_lmer( Petal.Length ~ Petal.Width + (1 | Species), data = iris, chains = 1, iter = 500, refresh = 0 )) r2_bayes(model) } BFM <- BayesFactor::generalTestBF(mpg ~ qsec + gear, data = mtcars, progress = FALSE) FM <- BayesFactor::lmBF(mpg ~ qsec + gear, data = mtcars) r2_bayes(FM) r2_bayes(BFM[3]) r2_bayes(BFM, average = TRUE) # across all models # with random effects: mtcars$gear <- factor(mtcars$gear) model <- BayesFactor::lmBF( mpg ~ hp + cyl + gear + gear:wt, mtcars, progress = FALSE, whichRandom = c("gear", "gear:wt") ) r2_bayes(model) \donttest{ model <- suppressWarnings(brms::brm( mpg ~ wt + cyl, data = mtcars, silent = 2, refresh = 0 )) r2_bayes(model) model <- suppressWarnings(brms::brm( Petal.Length ~ Petal.Width + (1 | Species), data = iris, silent = 2, refresh = 0 )) r2_bayes(model) } \dontshow{\}) # examplesIf} } \references{ Gelman, A., Goodrich, B., Gabry, J., and Vehtari, A. (2018). R-squared for Bayesian regression models. The American Statistician, 1–6. \doi{10.1080/00031305.2018.1549100} } performance/man/check_singularity.Rd0000644000176200001440000001022114413052536017323 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_singularity.R \name{check_singularity} \alias{check_singularity} \title{Check mixed models for boundary fits} \usage{ check_singularity(x, tolerance = 1e-05, ...) } \arguments{ \item{x}{A mixed model.} \item{tolerance}{Indicates up to which value the convergence result is accepted. The larger \code{tolerance} is, the stricter the test will be.} \item{...}{Currently not used.} } \value{ \code{TRUE} if the model fit is singular. } \description{ Check mixed models for boundary fits. } \details{ If a model is "singular", this means that some dimensions of the variance-covariance matrix have been estimated as exactly zero. This often occurs for mixed models with complex random effects structures. "While singular models are statistically well defined (it is theoretically sensible for the true maximum likelihood estimate to correspond to a singular fit), there are real concerns that (1) singular fits correspond to overfitted models that may have poor power; (2) chances of numerical problems and mis-convergence are higher for singular models (e.g. it may be computationally difficult to compute profile confidence intervals for such models); (3) standard inferential procedures such as Wald statistics and likelihood ratio tests may be inappropriate." (\emph{lme4 Reference Manual}) There is no gold-standard about how to deal with singularity and which random-effects specification to choose. Beside using fully Bayesian methods (with informative priors), proposals in a frequentist framework are: \itemize{ \item avoid fitting overly complex models, such that the variance-covariance matrices can be estimated precisely enough (\emph{Matuschek et al. 2017}) \item use some form of model selection to choose a model that balances predictive accuracy and overfitting/type I error (\emph{Bates et al. 2015}, \emph{Matuschek et al. 2017}) \item "keep it maximal", i.e. fit the most complex model consistent with the experimental design, removing only terms required to allow a non-singular fit (\emph{Barr et al. 2013}) } Note the different meaning between singularity and convergence: singularity indicates an issue with the "true" best estimate, i.e. whether the maximum likelihood estimation for the variance-covariance matrix of the random effects is positive definite or only semi-definite. Convergence is a question of whether we can assume that the numerical optimization has worked correctly or not. } \examples{ \dontshow{if (require("lme4")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(lme4) data(sleepstudy) set.seed(123) sleepstudy$mygrp <- sample(1:5, size = 180, replace = TRUE) sleepstudy$mysubgrp <- NA for (i in 1:5) { filter_group <- sleepstudy$mygrp == i sleepstudy$mysubgrp[filter_group] <- sample(1:30, size = sum(filter_group), replace = TRUE) } model <- lmer( Reaction ~ Days + (1 | mygrp / mysubgrp) + (1 | Subject), data = sleepstudy ) check_singularity(model) \dontshow{\}) # examplesIf} } \references{ \itemize{ \item Bates D, Kliegl R, Vasishth S, Baayen H. Parsimonious Mixed Models. arXiv:1506.04967, June 2015. \item Barr DJ, Levy R, Scheepers C, Tily HJ. Random effects structure for confirmatory hypothesis testing: Keep it maximal. Journal of Memory and Language, 68(3):255-278, April 2013. \item Matuschek H, Kliegl R, Vasishth S, Baayen H, Bates D. Balancing type I error and power in linear mixed models. Journal of Memory and Language, 94:305-315, 2017. \item lme4 Reference Manual, \url{https://cran.r-project.org/package=lme4} } } \seealso{ Other functions to check model assumptions and and assess model quality: \code{\link{check_autocorrelation}()}, \code{\link{check_collinearity}()}, \code{\link{check_convergence}()}, \code{\link{check_heteroscedasticity}()}, \code{\link{check_homogeneity}()}, \code{\link{check_model}()}, \code{\link{check_outliers}()}, \code{\link{check_overdispersion}()}, \code{\link{check_predictions}()}, \code{\link{check_zeroinflation}()} } \concept{functions to check model assumptions and and assess model quality} performance/man/performance_pcp.Rd0000644000176200001440000000471614327475467017013 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_pcp.R \name{performance_pcp} \alias{performance_pcp} \title{Percentage of Correct Predictions} \usage{ performance_pcp(model, ci = 0.95, method = "Herron", verbose = TRUE) } \arguments{ \item{model}{Model with binary outcome.} \item{ci}{The level of the confidence interval.} \item{method}{Name of the method to calculate the PCP (see 'Details'). Default is \code{"Herron"}. May be abbreviated.} \item{verbose}{Toggle off warnings.} } \value{ A list with several elements: the percentage of correct predictions of the full and the null model, their confidence intervals, as well as the chi-squared and p-value from the Likelihood-Ratio-Test between the full and null model. } \description{ Percentage of correct predictions (PCP) for models with binary outcome. } \details{ \code{method = "Gelman-Hill"} (or \code{"gelman_hill"}) computes the PCP based on the proposal from \emph{Gelman and Hill 2017, 99}, which is defined as the proportion of cases for which the deterministic prediction is wrong, i.e. the proportion where the predicted probability is above 0.5, although y=0 (and vice versa) (see also \emph{Herron 1999, 90}). \code{method = "Herron"} (or \code{"herron"}) computes a modified version of the PCP (\emph{Herron 1999, 90-92}), which is the sum of predicted probabilities, where y=1, plus the sum of 1 - predicted probabilities, where y=0, divided by the number of observations. This approach is said to be more accurate. The PCP ranges from 0 to 1, where values closer to 1 mean that the model predicts the outcome better than models with an PCP closer to 0. In general, the PCP should be above 0.5 (i.e. 50\\%), the closer to one, the better. Furthermore, the PCP of the full model should be considerably above the null model's PCP. The likelihood-ratio test indicates whether the model has a significantly better fit than the null-model (in such cases, p < 0.05). } \examples{ data(mtcars) m <- glm(formula = vs ~ hp + wt, family = binomial, data = mtcars) performance_pcp(m) performance_pcp(m, method = "Gelman-Hill") } \references{ \itemize{ \item Herron, M. (1999). Postestimation Uncertainty in Limited Dependent Variable Models. Political Analysis, 8, 83–98. \item Gelman, A., and Hill, J. (2007). Data analysis using regression and multilevel/hierarchical models. Cambridge; New York: Cambridge University Press, 99. } } performance/man/check_homogeneity.Rd0000644000176200001440000000427514501142162017305 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_homogeneity.R \name{check_homogeneity} \alias{check_homogeneity} \alias{check_homogeneity.afex_aov} \title{Check model for homogeneity of variances} \usage{ check_homogeneity(x, method = c("bartlett", "fligner", "levene", "auto"), ...) \method{check_homogeneity}{afex_aov}(x, method = "levene", ...) } \arguments{ \item{x}{A linear model or an ANOVA object.} \item{method}{Name of the method (underlying test) that should be performed to check the homogeneity of variances. May either be \code{"levene"} for Levene's Test for Homogeneity of Variance, \code{"bartlett"} for the Bartlett test (assuming normal distributed samples or groups), \code{"fligner"} for the Fligner-Killeen test (rank-based, non-parametric test), or \code{"auto"}. In the latter case, Bartlett test is used if the model response is normal distributed, else Fligner-Killeen test is used.} \item{...}{Arguments passed down to \code{car::leveneTest()}.} } \value{ Invisibly returns the p-value of the test statistics. A p-value < 0.05 indicates a significant difference in the variance between the groups. } \description{ Check model for homogeneity of variances between groups described by independent variables in a model. } \note{ There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \examples{ model <<- lm(len ~ supp + dose, data = ToothGrowth) check_homogeneity(model) # plot results if (require("see")) { result <- check_homogeneity(model) plot(result) } } \seealso{ Other functions to check model assumptions and and assess model quality: \code{\link{check_autocorrelation}()}, \code{\link{check_collinearity}()}, \code{\link{check_convergence}()}, \code{\link{check_heteroscedasticity}()}, \code{\link{check_model}()}, \code{\link{check_outliers}()}, \code{\link{check_overdispersion}()}, \code{\link{check_predictions}()}, \code{\link{check_singularity}()}, \code{\link{check_zeroinflation}()} } \concept{functions to check model assumptions and and assess model quality} performance/man/check_factorstructure.Rd0000644000176200001440000001057714406527371020234 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_factorstructure.R \name{check_factorstructure} \alias{check_factorstructure} \alias{check_kmo} \alias{check_sphericity_bartlett} \title{Check suitability of data for Factor Analysis (FA) with Bartlett's Test of Sphericity and KMO} \usage{ check_factorstructure(x, n = NULL, ...) check_kmo(x, n = NULL, ...) check_sphericity_bartlett(x, n = NULL, ...) } \arguments{ \item{x}{A dataframe or a correlation matrix. If the latter is passed, \code{n} must be provided.} \item{n}{If a correlation matrix was passed, the number of observations must be specified.} \item{...}{Arguments passed to or from other methods.} } \value{ A list of lists of indices related to sphericity and KMO. } \description{ This checks whether the data is appropriate for Factor Analysis (FA) by running the Bartlett's Test of Sphericity and the Kaiser, Meyer, Olkin (KMO) Measure of Sampling Adequacy (MSA). See \strong{details} below for more information about the interpretation and meaning of each test. } \details{ \subsection{Bartlett's Test of Sphericity}{ Bartlett's (1951) test of sphericity tests whether a matrix (of correlations) is significantly different from an identity matrix (filled with 0). It tests whether the correlation coefficients are all 0. The test computes the probability that the correlation matrix has significant correlations among at least some of the variables in a dataset, a prerequisite for factor analysis to work. While it is often suggested to check whether Bartlett’s test of sphericity is significant before starting with factor analysis, one needs to remember that the test is testing a pretty extreme scenario (that all correlations are non-significant). As the sample size increases, this test tends to be always significant, which makes it not particularly useful or informative in well-powered studies. } \subsection{Kaiser, Meyer, Olkin (KMO)}{ \emph{(Measure of Sampling Adequacy (MSA) for Factor Analysis.)} Kaiser (1970) introduced a Measure of Sampling Adequacy (MSA), later modified by Kaiser and Rice (1974). The Kaiser-Meyer-Olkin (KMO) statistic, which can vary from 0 to 1, indicates the degree to which each variable in a set is predicted without error by the other variables. A value of 0 indicates that the sum of partial correlations is large relative to the sum correlations, indicating factor analysis is likely to be inappropriate. A KMO value close to 1 indicates that the sum of partial correlations is not large relative to the sum of correlations and so factor analysis should yield distinct and reliable factors. It means that patterns of correlations are relatively compact, and so factor analysis should yield distinct and reliable factors. Values smaller than 0.5 suggest that you should either collect more data or rethink which variables to include. Kaiser (1974) suggested that KMO > .9 were marvelous, in the .80s, meritorious, in the .70s, middling, in the .60s, mediocre, in the .50s, miserable, and less than .5, unacceptable. Hair et al. (2006) suggest accepting a value > 0.5. Values between 0.5 and 0.7 are mediocre, and values between 0.7 and 0.8 are good. Variables with individual KMO values below 0.5 could be considered for exclusion them from the analysis (note that you would need to re-compute the KMO indices as they are dependent on the whole dataset). } } \examples{ library(performance) check_factorstructure(mtcars) # One can also pass a correlation matrix r <- cor(mtcars) check_factorstructure(r, n = nrow(mtcars)) } \references{ This function is a wrapper around the \code{KMO} and the \code{cortest.bartlett()} functions in the \strong{psych} package (Revelle, 2016). \itemize{ \item Revelle, W. (2016). How To: Use the psych package for Factor Analysis and data reduction. \item Bartlett, M. S. (1951). The effect of standardization on a Chi-square approximation in factor analysis. Biometrika, 38(3/4), 337-344. \item Kaiser, H. F. (1970). A second generation little jiffy. Psychometrika, 35(4), 401-415. \item Kaiser, H. F., & Rice, J. (1974). Little jiffy, mark IV. Educational and psychological measurement, 34(1), 111-117. \item Kaiser, H. F. (1974). An index of factorial simplicity. Psychometrika, 39(1), 31-36. } } \seealso{ \code{\link[=check_clusterstructure]{check_clusterstructure()}}. } performance/man/check_normality.Rd0000644000176200001440000000412414503335324016773 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_normality.R \name{check_normality} \alias{check_normality} \alias{check_normality.merMod} \title{Check model for (non-)normality of residuals.} \usage{ check_normality(x, ...) \method{check_normality}{merMod}(x, effects = c("fixed", "random"), ...) } \arguments{ \item{x}{A model object.} \item{...}{Currently not used.} \item{effects}{Should normality for residuals (\code{"fixed"}) or random effects (\code{"random"}) be tested? Only applies to mixed-effects models. May be abbreviated.} } \value{ The p-value of the test statistics. A p-value < 0.05 indicates a significant deviation from normal distribution. } \description{ Check model for (non-)normality of residuals. } \details{ \code{check_normality()} calls \code{stats::shapiro.test} and checks the standardized residuals (or studentized residuals for mixed models) for normal distribution. Note that this formal test almost always yields significant results for the distribution of residuals and visual inspection (e.g. Q-Q plots) are preferable. For generalized linear models, no formal statistical test is carried out. Rather, there's only a \code{plot()} method for GLMs. This plot shows a half-normal Q-Q plot of the absolute value of the standardized deviance residuals is shown (in line with changes in \code{plot.lm()} for R 4.3+). } \note{ For mixed-effects models, studentized residuals, and \emph{not} standardized residuals, are used for the test. There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\strong{see}-package}. } \examples{ \dontshow{if (require("see")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} m <<- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) check_normality(m) # plot results x <- check_normality(m) plot(x) \donttest{ # QQ-plot plot(check_normality(m), type = "qq") # PP-plot plot(check_normality(m), type = "pp") } \dontshow{\}) # examplesIf} } performance/man/check_collinearity.Rd0000644000176200001440000001764514477405322017475 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_collinearity.R, R/check_concurvity.R \name{check_collinearity} \alias{check_collinearity} \alias{multicollinearity} \alias{check_collinearity.default} \alias{check_collinearity.glmmTMB} \alias{check_concurvity} \title{Check for multicollinearity of model terms} \usage{ check_collinearity(x, ...) multicollinearity(x, ...) \method{check_collinearity}{default}(x, ci = 0.95, verbose = TRUE, ...) \method{check_collinearity}{glmmTMB}( x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ci = 0.95, verbose = TRUE, ... ) check_concurvity(x, ...) } \arguments{ \item{x}{A model object (that should at least respond to \code{vcov()}, and if possible, also to \code{model.matrix()} - however, it also should work without \code{model.matrix()}).} \item{...}{Currently not used.} \item{ci}{Confidence Interval (CI) level for VIF and tolerance values.} \item{verbose}{Toggle off warnings or messages.} \item{component}{For models with zero-inflation component, multicollinearity can be checked for the conditional model (count component, \code{component = "conditional"} or \code{component = "count"}), zero-inflation component (\code{component = "zero_inflated"} or \code{component = "zi"}) or both components (\code{component = "all"}). Following model-classes are currently supported: \code{hurdle}, \code{zeroinfl}, \code{zerocount}, \code{MixMod} and \code{glmmTMB}.} } \value{ A data frame with information about name of the model term, the variance inflation factor and associated confidence intervals, the factor by which the standard error is increased due to possible correlation with other terms, and tolerance values (including confidence intervals), where \code{tolerance = 1/vif}. } \description{ \code{check_collinearity()} checks regression models for multicollinearity by calculating the variance inflation factor (VIF). \code{multicollinearity()} is an alias for \code{check_collinearity()}. \code{check_concurvity()} is a wrapper around \code{mgcv::concurvity()}, and can be considered as a collinearity check for smooth terms in GAMs. Confidence intervals for VIF and tolerance are based on Marcoulides et al. (2019, Appendix B). } \note{ The code to compute the confidence intervals for the VIF and tolerance values was adapted from the Appendix B from the Marcoulides et al. paper. Thus, credits go to these authors the original algorithm. There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \section{Multicollinearity}{ Multicollinearity should not be confused with a raw strong correlation between predictors. What matters is the association between one or more predictor variables, \emph{conditional on the other variables in the model}. In a nutshell, multicollinearity means that once you know the effect of one predictor, the value of knowing the other predictor is rather low. Thus, one of the predictors doesn't help much in terms of better understanding the model or predicting the outcome. As a consequence, if multicollinearity is a problem, the model seems to suggest that the predictors in question don't seems to be reliably associated with the outcome (low estimates, high standard errors), although these predictors actually are strongly associated with the outcome, i.e. indeed might have strong effect (\emph{McElreath 2020, chapter 6.1}). Multicollinearity might arise when a third, unobserved variable has a causal effect on each of the two predictors that are associated with the outcome. In such cases, the actual relationship that matters would be the association between the unobserved variable and the outcome. Remember: "Pairwise correlations are not the problem. It is the conditional associations - not correlations - that matter." (\emph{McElreath 2020, p. 169}) } \section{Interpretation of the Variance Inflation Factor}{ The variance inflation factor is a measure to analyze the magnitude of multicollinearity of model terms. A VIF less than 5 indicates a low correlation of that predictor with other predictors. A value between 5 and 10 indicates a moderate correlation, while VIF values larger than 10 are a sign for high, not tolerable correlation of model predictors (\emph{James et al. 2013}). The \emph{Increased SE} column in the output indicates how much larger the standard error is due to the association with other predictors conditional on the remaining variables in the model. Note that these thresholds, although commonly used, are also criticized for being too high. \emph{Zuur et al. (2010)} suggest using lower values, e.g. a VIF of 3 or larger may already no longer be considered as "low". } \section{Multicollinearity and Interaction Terms}{ If interaction terms are included in a model, high VIF values are expected. This portion of multicollinearity among the component terms of an interaction is also called "inessential ill-conditioning", which leads to inflated VIF values that are typically seen for models with interaction terms \emph{(Francoeur 2013)}. } \section{Concurvity for Smooth Terms in Generalized Additive Models}{ \code{check_concurvity()} is a wrapper around \code{mgcv::concurvity()}, and can be considered as a collinearity check for smooth terms in GAMs."Concurvity occurs when some smooth term in a model could be approximated by one or more of the other smooth terms in the model." (see \code{?mgcv::concurvity}). \code{check_concurvity()} returns a column named \emph{VIF}, which is the "worst" measure. While \code{mgcv::concurvity()} range between 0 and 1, the \emph{VIF} value is \code{1 / (1 - worst)}, to make interpretation comparable to classical VIF values, i.e. \code{1} indicates no problems, while higher values indicate increasing lack of identifiability. The \emph{VIF proportion} column equals the "estimate" column from \code{mgcv::concurvity()}, ranging from 0 (no problem) to 1 (total lack of identifiability). } \examples{ m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) check_collinearity(m) \dontshow{if (require("see")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # plot results x <- check_collinearity(m) plot(x) \dontshow{\}) # examplesIf} } \references{ \itemize{ \item Francoeur, R. B. (2013). Could Sequential Residual Centering Resolve Low Sensitivity in Moderated Regression? Simulations and Cancer Symptom Clusters. Open Journal of Statistics, 03(06), 24-44. \item James, G., Witten, D., Hastie, T., and Tibshirani, R. (eds.). (2013). An introduction to statistical learning: with applications in R. New York: Springer. \item Marcoulides, K. M., and Raykov, T. (2019). Evaluation of Variance Inflation Factors in Regression Models Using Latent Variable Modeling Methods. Educational and Psychological Measurement, 79(5), 874–882. \item McElreath, R. (2020). Statistical rethinking: A Bayesian course with examples in R and Stan. 2nd edition. Chapman and Hall/CRC. \item Vanhove, J. (2019). Collinearity isn't a disease that needs curing. \href{https://janhove.github.io/posts/2019-09-11-collinearity/}{webpage} \item Zuur AF, Ieno EN, Elphick CS. A protocol for data exploration to avoid common statistical problems: Data exploration. Methods in Ecology and Evolution (2010) 1:3–14. } } \seealso{ Other functions to check model assumptions and and assess model quality: \code{\link{check_autocorrelation}()}, \code{\link{check_convergence}()}, \code{\link{check_heteroscedasticity}()}, \code{\link{check_homogeneity}()}, \code{\link{check_model}()}, \code{\link{check_outliers}()}, \code{\link{check_overdispersion}()}, \code{\link{check_predictions}()}, \code{\link{check_singularity}()}, \code{\link{check_zeroinflation}()} } \concept{functions to check model assumptions and and assess model quality} performance/man/performance_mae.Rd0000644000176200001440000000107014257247716016755 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_mae.R \name{performance_mae} \alias{performance_mae} \alias{mae} \title{Mean Absolute Error of Models} \usage{ performance_mae(model, ...) mae(model, ...) } \arguments{ \item{model}{A model.} \item{...}{Arguments passed to or from other methods.} } \value{ Numeric, the mean absolute error of \code{model}. } \description{ Compute mean absolute error of models. } \examples{ data(mtcars) m <- lm(mpg ~ hp + gear, data = mtcars) performance_mae(m) } performance/man/performance_mse.Rd0000644000176200001440000000164614257247716017010 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_mse.R \name{performance_mse} \alias{performance_mse} \alias{mse} \title{Mean Square Error of Linear Models} \usage{ performance_mse(model, ...) mse(model, ...) } \arguments{ \item{model}{A model.} \item{...}{Arguments passed to or from other methods.} } \value{ Numeric, the mean square error of \code{model}. } \description{ Compute mean square error of linear models. } \details{ The mean square error is the mean of the sum of squared residuals, i.e. it measures the average of the squares of the errors. Less technically speaking, the mean square error can be considered as the variance of the residuals, i.e. the variation in the outcome the model doesn't explain. Lower values (closer to zero) indicate better fit. } \examples{ data(mtcars) m <- lm(mpg ~ hp + gear, data = mtcars) performance_mse(m) } performance/man/compare_performance.Rd0000644000176200001440000001200114501062052017611 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/compare_performance.R \name{compare_performance} \alias{compare_performance} \title{Compare performance of different models} \usage{ compare_performance( ..., metrics = "all", rank = FALSE, estimator = "ML", verbose = TRUE ) } \arguments{ \item{...}{Multiple model objects (also of different classes).} \item{metrics}{Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed. See related \code{\link[=model_performance]{documentation()}} of object's class for details.} \item{rank}{Logical, if \code{TRUE}, models are ranked according to 'best' overall model performance. See 'Details'.} \item{estimator}{Only for linear models. Corresponds to the different estimators for the standard deviation of the errors. If \code{estimator = "ML"} (default), the scaling is done by n (the biased ML estimator), which is then equivalent to using \code{AIC(logLik())}. Setting it to \code{"REML"} will give the same results as \code{AIC(logLik(..., REML = TRUE))}.} \item{verbose}{Toggle warnings.} } \value{ A data frame with one row per model and one column per "index" (see \code{metrics}). } \description{ \code{compare_performance()} computes indices of model performance for different models at once and hence allows comparison of indices across models. } \details{ \subsection{Model Weights}{ When information criteria (IC) are requested in \code{metrics} (i.e., any of \code{"all"}, \code{"common"}, \code{"AIC"}, \code{"AICc"}, \code{"BIC"}, \code{"WAIC"}, or \code{"LOOIC"}), model weights based on these criteria are also computed. For all IC except LOOIC, weights are computed as \code{w = exp(-0.5 * delta_ic) / sum(exp(-0.5 * delta_ic))}, where \code{delta_ic} is the difference between the model's IC value and the smallest IC value in the model set (Burnham and Anderson, 2002). For LOOIC, weights are computed as "stacking weights" using \code{\link[loo:loo_model_weights]{loo::stacking_weights()}}. } \subsection{Ranking Models}{ When \code{rank = TRUE}, a new column \code{Performance_Score} is returned. This score ranges from 0\\% to 100\\%, higher values indicating better model performance. Note that all score value do not necessarily sum up to 100\\%. Rather, calculation is based on normalizing all indices (i.e. rescaling them to a range from 0 to 1), and taking the mean value of all indices for each model. This is a rather quick heuristic, but might be helpful as exploratory index. \cr \cr In particular when models are of different types (e.g. mixed models, classical linear models, logistic regression, ...), not all indices will be computed for each model. In case where an index can't be calculated for a specific model type, this model gets an \code{NA} value. All indices that have any \code{NA}s are excluded from calculating the performance score. \cr \cr There is a \code{plot()}-method for \code{compare_performance()}, which creates a "spiderweb" plot, where the different indices are normalized and larger values indicate better model performance. Hence, points closer to the center indicate worse fit indices (see \href{https://easystats.github.io/see/articles/performance.html}{online-documentation} for more details). } \subsection{REML versus ML estimator}{ By default, \code{estimator = "ML"}, which means that values from information criteria (AIC, AICc, BIC) for specific model classes (like models from \emph{lme4}) are based on the ML-estimator, while the default behaviour of \code{AIC()} for such classes is setting \code{REML = TRUE}. This default is intentional, because comparing information criteria based on REML fits is usually not valid (it might be useful, though, if all models share the same fixed effects - however, this is usually not the case for nested models, which is a prerequisite for the LRT). Set \code{estimator = "REML"} explicitly return the same (AIC/...) values as from the defaults in \code{AIC.merMod()}. } } \note{ There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \examples{ \dontshow{if (require("lme4")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} data(iris) lm1 <- lm(Sepal.Length ~ Species, data = iris) lm2 <- lm(Sepal.Length ~ Species + Petal.Length, data = iris) lm3 <- lm(Sepal.Length ~ Species * Petal.Length, data = iris) compare_performance(lm1, lm2, lm3) compare_performance(lm1, lm2, lm3, rank = TRUE) m1 <- lm(mpg ~ wt + cyl, data = mtcars) m2 <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") m3 <- lme4::lmer(Petal.Length ~ Sepal.Length + (1 | Species), data = iris) compare_performance(m1, m2, m3) \dontshow{\}) # examplesIf} } \references{ Burnham, K. P., and Anderson, D. R. (2002). \emph{Model selection and multimodel inference: A practical information-theoretic approach} (2nd ed.). Springer-Verlag. \doi{10.1007/b97636} } performance/man/performance_score.Rd0000644000176200001440000000445014503335324017316 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_score.R \name{performance_score} \alias{performance_score} \title{Proper Scoring Rules} \usage{ performance_score(model, verbose = TRUE, ...) } \arguments{ \item{model}{Model with binary or count outcome.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments from other functions, usually only used internally.} } \value{ A list with three elements, the logarithmic, quadratic/Brier and spherical score. } \description{ Calculates the logarithmic, quadratic/Brier and spherical score from a model with binary or count outcome. } \details{ Proper scoring rules can be used to evaluate the quality of model predictions and model fit. \code{performance_score()} calculates the logarithmic, quadratic/Brier and spherical scoring rules. The spherical rule takes values in the interval \verb{[0, 1]}, with values closer to 1 indicating a more accurate model, and the logarithmic rule in the interval \verb{[-Inf, 0]}, with values closer to 0 indicating a more accurate model. For \code{stan_lmer()} and \code{stan_glmer()} models, the predicted values are based on \code{posterior_predict()}, instead of \code{predict()}. Thus, results may differ more than expected from their non-Bayesian counterparts in \strong{lme4}. } \note{ Code is partially based on \href{https://drizopoulos.github.io/GLMMadaptive/reference/scoring_rules.html}{GLMMadaptive::scoring_rules()}. } \examples{ \dontshow{if (require("glmmTMB")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} ## Dobson (1990) Page 93: Randomized Controlled Trial : counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) outcome <- gl(3, 1, 9) treatment <- gl(3, 3) model <- glm(counts ~ outcome + treatment, family = poisson()) performance_score(model) \donttest{ data(Salamanders, package = "glmmTMB") model <- glmmTMB::glmmTMB( count ~ spp + mined + (1 | site), zi = ~ spp + mined, family = nbinom2(), data = Salamanders ) performance_score(model) } \dontshow{\}) # examplesIf} } \references{ Carvalho, A. (2016). An overview of applications of proper scoring rules. Decision Analysis 13, 223–242. \doi{10.1287/deca.2016.0337} } \seealso{ \code{\link[=performance_logloss]{performance_logloss()}} } performance/man/test_performance.Rd0000644000176200001440000002726114473560135017175 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/test_bf.R, R/test_likelihoodratio.R, % R/test_performance.R, R/test_vuong.R, R/test_wald.R \name{test_bf} \alias{test_bf} \alias{test_bf.default} \alias{test_likelihoodratio} \alias{test_lrt} \alias{test_performance} \alias{test_vuong} \alias{test_wald} \title{Test if models are different} \usage{ test_bf(...) \method{test_bf}{default}(..., reference = 1, text_length = NULL) test_likelihoodratio(..., estimator = "ML", verbose = TRUE) test_lrt(..., estimator = "ML", verbose = TRUE) test_performance(..., reference = 1, verbose = TRUE) test_vuong(..., verbose = TRUE) test_wald(..., verbose = TRUE) } \arguments{ \item{...}{Multiple model objects.} \item{reference}{This only applies when models are non-nested, and determines which model should be taken as a reference, against which all the other models are tested.} \item{text_length}{Numeric, length (number of chars) of output lines. \code{test_bf()} describes models by their formulas, which can lead to overly long lines in the output. \code{text_length} fixes the length of lines to a specified limit.} \item{estimator}{Applied when comparing regression models using \code{test_likelihoodratio()}. Corresponds to the different estimators for the standard deviation of the errors. Defaults to \code{"OLS"} for linear models, \code{"ML"} for all other models (including mixed models), or \code{"REML"} for linear mixed models when these have the same fixed effects. See 'Details'.} \item{verbose}{Toggle warning and messages.} } \value{ A data frame containing the relevant indices. } \description{ Testing whether models are "different" in terms of accuracy or explanatory power is a delicate and often complex procedure, with many limitations and prerequisites. Moreover, many tests exist, each coming with its own interpretation, and set of strengths and weaknesses. The \code{test_performance()} function runs the most relevant and appropriate tests based on the type of input (for instance, whether the models are \emph{nested} or not). However, it still requires the user to understand what the tests are and what they do in order to prevent their misinterpretation. See the \emph{Details} section for more information regarding the different tests and their interpretation. } \details{ \subsection{Nested vs. Non-nested Models}{ Model's "nesting" is an important concept of models comparison. Indeed, many tests only make sense when the models are \emph{"nested",} i.e., when their predictors are nested. This means that all the \emph{fixed effects} predictors of a model are contained within the \emph{fixed effects} predictors of a larger model (sometimes referred to as the encompassing model). For instance, \code{model1 (y ~ x1 + x2)} is "nested" within \code{model2 (y ~ x1 + x2 + x3)}. Usually, people have a list of nested models, for instance \code{m1 (y ~ 1)}, \code{m2 (y ~ x1)}, \code{m3 (y ~ x1 + x2)}, \code{m4 (y ~ x1 + x2 + x3)}, and it is conventional that they are "ordered" from the smallest to largest, but it is up to the user to reverse the order from largest to smallest. The test then shows whether a more parsimonious model, or whether adding a predictor, results in a significant difference in the model's performance. In this case, models are usually compared \emph{sequentially}: m2 is tested against m1, m3 against m2, m4 against m3, etc. Two models are considered as \emph{"non-nested"} if their predictors are different. For instance, \code{model1 (y ~ x1 + x2)} and \code{model2 (y ~ x3 + x4)}. In the case of non-nested models, all models are usually compared against the same \emph{reference} model (by default, the first of the list). Nesting is detected via the \code{insight::is_nested_models()} function. Note that, apart from the nesting, in order for the tests to be valid, other requirements have often to be the fulfilled. For instance, outcome variables (the response) must be the same. You cannot meaningfully test whether apples are significantly different from oranges! } \subsection{Estimator of the standard deviation}{ The estimator is relevant when comparing regression models using \code{test_likelihoodratio()}. If \code{estimator = "OLS"}, then it uses the same method as \code{anova(..., test = "LRT")} implemented in base R, i.e., scaling by n-k (the unbiased OLS estimator) and using this estimator under the alternative hypothesis. If \code{estimator = "ML"}, which is for instance used by \code{lrtest(...)} in package \strong{lmtest}, the scaling is done by n (the biased ML estimator) and the estimator under the null hypothesis. In moderately large samples, the differences should be negligible, but it is possible that OLS would perform slightly better in small samples with Gaussian errors. For \code{estimator = "REML"}, the LRT is based on the REML-fit log-likelihoods of the models. Note that not all types of estimators are available for all model classes. } \subsection{REML versus ML estimator}{ When \code{estimator = "ML"}, which is the default for linear mixed models (unless they share the same fixed effects), values from information criteria (AIC, AICc) are based on the ML-estimator, while the default behaviour of \code{AIC()} may be different (in particular for linear mixed models from \strong{lme4}, which sets \code{REML = TRUE}). This default in \code{test_likelihoodratio()} intentional, because comparing information criteria based on REML fits requires the same fixed effects for all models, which is often not the case. Thus, while \code{anova.merMod()} automatically refits all models to REML when performing a LRT, \code{test_likelihoodratio()} checks if a comparison based on REML fits is indeed valid, and if so, uses REML as default (else, ML is the default). Set the \code{estimator} argument explicitely to override the default behaviour. } \subsection{Tests Description}{ \itemize{ \item \strong{Bayes factor for Model Comparison} - \code{test_bf()}: If all models were fit from the same data, the returned \code{BF} shows the Bayes Factor (see \code{bayestestR::bayesfactor_models()}) for each model against the reference model (which depends on whether the models are nested or not). Check out \href{https://easystats.github.io/bayestestR/articles/bayes_factors.html#bayesfactor_models}{this vignette} for more details. \item \strong{Wald's F-Test} - \code{test_wald()}: The Wald test is a rough approximation of the Likelihood Ratio Test. However, it is more applicable than the LRT: you can often run a Wald test in situations where no other test can be run. Importantly, this test only makes statistical sense if the models are nested. Note: this test is also available in base R through the \code{\link[=anova]{anova()}} function. It returns an \code{F-value} column as a statistic and its associated p-value. \item \strong{Likelihood Ratio Test (LRT)} - \code{test_likelihoodratio()}: The LRT tests which model is a better (more likely) explanation of the data. Likelihood-Ratio-Test (LRT) gives usually somewhat close results (if not equivalent) to the Wald test and, similarly, only makes sense for nested models. However, maximum likelihood tests make stronger assumptions than method of moments tests like the F-test, and in turn are more efficient. Agresti (1990) suggests that you should use the LRT instead of the Wald test for small sample sizes (under or about 30) or if the parameters are large. Note: for regression models, this is similar to \code{anova(..., test="LRT")} (on models) or \code{lmtest::lrtest(...)}, depending on the \code{estimator} argument. For \strong{lavaan} models (SEM, CFA), the function calls \code{lavaan::lavTestLRT()}. For models with transformed response variables (like \code{log(x)} or \code{sqrt(x)}), \code{logLik()} returns a wrong log-likelihood. However, \code{test_likelihoodratio()} calls \code{insight::get_loglikelihood()} with \code{check_response=TRUE}, which returns a corrected log-likelihood value for models with transformed response variables. Furthermore, since the LRT only accepts nested models (i.e. models that differ in their fixed effects), the computed log-likelihood is always based on the ML estimator, not on the REML fits. \item \strong{Vuong's Test} - \code{test_vuong()}: Vuong's (1989) test can be used both for nested and non-nested models, and actually consists of two tests. \itemize{ \item The \strong{Test of Distinguishability} (the \code{Omega2} column and its associated p-value) indicates whether or not the models can possibly be distinguished on the basis of the observed data. If its p-value is significant, it means the models are distinguishable. \item The \strong{Robust Likelihood Test} (the \code{LR} column and its associated p-value) indicates whether each model fits better than the reference model. If the models are nested, then the test works as a robust LRT. The code for this function is adapted from the \strong{nonnest2} package, and all credit go to their authors. } } } } \examples{ # Nested Models # ------------- m1 <- lm(Sepal.Length ~ Petal.Width, data = iris) m2 <- lm(Sepal.Length ~ Petal.Width + Species, data = iris) m3 <- lm(Sepal.Length ~ Petal.Width * Species, data = iris) test_performance(m1, m2, m3) test_bf(m1, m2, m3) test_wald(m1, m2, m3) # Equivalent to anova(m1, m2, m3) # Equivalent to lmtest::lrtest(m1, m2, m3) test_likelihoodratio(m1, m2, m3, estimator = "ML") # Equivalent to anova(m1, m2, m3, test='LRT') test_likelihoodratio(m1, m2, m3, estimator = "OLS") if (require("CompQuadForm")) { test_vuong(m1, m2, m3) # nonnest2::vuongtest(m1, m2, nested=TRUE) # Non-nested Models # ----------------- m1 <- lm(Sepal.Length ~ Petal.Width, data = iris) m2 <- lm(Sepal.Length ~ Petal.Length, data = iris) m3 <- lm(Sepal.Length ~ Species, data = iris) test_performance(m1, m2, m3) test_bf(m1, m2, m3) test_vuong(m1, m2, m3) # nonnest2::vuongtest(m1, m2) } # Tweak the output # ---------------- test_performance(m1, m2, m3, include_formula = TRUE) # SEM / CFA (lavaan objects) # -------------------------- # Lavaan Models if (require("lavaan")) { structure <- " visual =~ x1 + x2 + x3 textual =~ x4 + x5 + x6 speed =~ x7 + x8 + x9 visual ~~ textual + speed " m1 <- lavaan::cfa(structure, data = HolzingerSwineford1939) structure <- " visual =~ x1 + x2 + x3 textual =~ x4 + x5 + x6 speed =~ x7 + x8 + x9 visual ~~ 0 * textual + speed " m2 <- lavaan::cfa(structure, data = HolzingerSwineford1939) structure <- " visual =~ x1 + x2 + x3 textual =~ x4 + x5 + x6 speed =~ x7 + x8 + x9 visual ~~ 0 * textual + 0 * speed " m3 <- lavaan::cfa(structure, data = HolzingerSwineford1939) test_likelihoodratio(m1, m2, m3) # Different Model Types # --------------------- if (require("lme4") && require("mgcv")) { m1 <- lm(Sepal.Length ~ Petal.Length + Species, data = iris) m2 <- lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) m3 <- gam(Sepal.Length ~ s(Petal.Length, by = Species) + Species, data = iris) test_performance(m1, m2, m3) } } } \references{ \itemize{ \item Vuong, Q. H. (1989). Likelihood ratio tests for model selection and non-nested hypotheses. Econometrica, 57, 307-333. \item Merkle, E. C., You, D., & Preacher, K. (2016). Testing non-nested structural equation models. Psychological Methods, 21, 151-163. } } \seealso{ \code{\link[=compare_performance]{compare_performance()}} to compare the performance indices of many different models. } performance/man/r2_somers.Rd0000644000176200001440000000133614503335324015535 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_somers.R \name{r2_somers} \alias{r2_somers} \title{Somers' Dxy rank correlation for binary outcomes} \usage{ r2_somers(model) } \arguments{ \item{model}{A logistic regression model.} } \value{ A named vector with the R2 value. } \description{ Calculates the Somers' Dxy rank correlation for logistic regression models. } \examples{ \donttest{ if (require("correlation") && require("Hmisc")) { model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") r2_somers(model) } } } \references{ Somers, R. H. (1962). A new asymmetric measure of association for ordinal variables. American Sociological Review. 27 (6). } performance/man/model_performance.ivreg.Rd0000644000176200001440000000207614407025063020417 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.ivreg.R \name{model_performance.ivreg} \alias{model_performance.ivreg} \title{Performance of instrumental variable regression models} \usage{ \method{model_performance}{ivreg}(model, metrics = "all", verbose = TRUE, ...) } \arguments{ \item{model}{A model.} \item{metrics}{Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed (some of \code{c("AIC", "AICc", "BIC", "R2", "RMSE", "SIGMA", "Sargan", "Wu_Hausman", "weak_instruments")}). \code{"common"} will compute AIC, BIC, R2 and RMSE.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments passed to or from other methods.} } \description{ Performance of instrumental variable regression models } \details{ \code{model_performance()} correctly detects transformed response and returns the "corrected" AIC and BIC value on the original scale. To get back to the original scale, the likelihood of the model is multiplied by the Jacobian/derivative of the transformation. } performance/man/item_split_half.Rd0000644000176200001440000000245514257247716017005 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/item_split_half.R \name{item_split_half} \alias{item_split_half} \title{Split-Half Reliability} \usage{ item_split_half(x, digits = 3) } \arguments{ \item{x}{A matrix or a data frame.} \item{digits}{Amount of digits for returned values.} } \value{ A list with two elements: the split-half reliability \code{splithalf} and the Spearman-Brown corrected split-half reliability \code{spearmanbrown}. } \description{ Compute various measures of internal consistencies for tests or item-scales of questionnaires. } \details{ This function calculates the split-half reliability for items in \code{x}, including the Spearman-Brown adjustment. Splitting is done by selecting odd versus even columns in \code{x}. A value closer to 1 indicates greater internal consistency. } \examples{ data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] item_split_half(x) } \references{ \itemize{ \item Spearman C. 1910. Correlation calculated from faulty data. British Journal of Psychology (3): 271-295. \doi{10.1111/j.2044-8295.1910.tb00206.x} \item Brown W. 1910. Some experimental results in the correlation of mental abilities. British Journal of Psychology (3): 296-322. \doi{10.1111/j.2044-8295.1910.tb00207.x} } } performance/man/r2_xu.Rd0000644000176200001440000000146614257247716014702 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_xu.R \name{r2_xu} \alias{r2_xu} \title{Xu' R2 (Omega-squared)} \usage{ r2_xu(model) } \arguments{ \item{model}{A linear (mixed) model.} } \value{ The R2 value. } \description{ Calculates Xu' Omega-squared value, a simple R2 equivalent for linear mixed models. } \details{ \code{r2_xu()} is a crude measure for the explained variance from linear (mixed) effects models, which is originally denoted as \ifelse{html}{\out{Ω2}}{\eqn{\Omega^2}}. } \examples{ model <- lm(Sepal.Length ~ Petal.Length + Species, data = iris) r2_xu(model) } \references{ Xu, R. (2003). Measuring explained variation in linear mixed effects models. Statistics in Medicine, 22(22), 3527–3541. \doi{10.1002/sim.1572} } performance/man/classify_distribution.Rd0000644000176200001440000000073414260766142020245 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_distribution.R \docType{data} \name{classify_distribution} \alias{classify_distribution} \title{Classify the distribution of a model-family using machine learning} \description{ Classify the distribution of a model-family using machine learning } \details{ The trained model to classify distributions, which is used by the \code{check_distribution()} function. } \keyword{data} performance/man/item_intercor.Rd0000644000176200001440000000352114477405776016506 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/item_intercor.R \name{item_intercor} \alias{item_intercor} \title{Mean Inter-Item-Correlation} \usage{ item_intercor(x, method = c("pearson", "spearman", "kendall")) } \arguments{ \item{x}{A matrix as returned by the \code{cor()}-function, or a data frame with items (e.g. from a test or questionnaire).} \item{method}{Correlation computation method. May be one of \code{"pearson"} (default), \code{"spearman"} or \code{"kendall"}. You may use initial letter only.} } \value{ The mean inter-item-correlation value for \code{x}. } \description{ Compute various measures of internal consistencies for tests or item-scales of questionnaires. } \details{ This function calculates a mean inter-item-correlation, i.e. a correlation matrix of \code{x} will be computed (unless \code{x} is already a matrix as returned by the \code{cor()} function) and the mean of the sum of all items' correlation values is returned. Requires either a data frame or a computed \code{cor()} object. "Ideally, the average inter-item correlation for a set of items should be between 0.20 and 0.40, suggesting that while the items are reasonably homogeneous, they do contain sufficiently unique variance so as to not be isomorphic with each other. When values are lower than 0.20, then the items may not be representative of the same content domain. If values are higher than 0.40, the items may be only capturing a small bandwidth of the construct." \emph{(Piedmont 2014)} } \examples{ data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] item_intercor(x) } \references{ Piedmont RL. 2014. Inter-item Correlations. In: Michalos AC (eds) Encyclopedia of Quality of Life and Well-Being Research. Dordrecht: Springer, 3303-3304. \doi{10.1007/978-94-007-0753-5_1493} } performance/man/r2_mcfadden.Rd0000644000176200001440000000177414327475467016015 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_mcfadden.R \name{r2_mcfadden} \alias{r2_mcfadden} \title{McFadden's R2} \usage{ r2_mcfadden(model, ...) } \arguments{ \item{model}{Generalized linear or multinomial logit (\code{mlogit}) model.} \item{...}{Currently not used.} } \value{ For most models, a list with McFadden's R2 and adjusted McFadden's R2 value. For some models, only McFadden's R2 is available. } \description{ Calculates McFadden's pseudo R2. } \examples{ if (require("mlogit")) { data("Fishing", package = "mlogit") Fish <- mlogit.data(Fishing, varying = c(2:9), shape = "wide", choice = "mode") model <- mlogit(mode ~ price + catch, data = Fish) r2_mcfadden(model) } } \references{ \itemize{ \item McFadden, D. (1987). Regression-based specification tests for the multinomial logit model. Journal of econometrics, 34(1-2), 63-82. \item McFadden, D. (1973). Conditional logit analysis of qualitative choice behavior. } } performance/man/model_performance.merMod.Rd0000644000176200001440000000505114501062052020514 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.mixed.R \name{model_performance.merMod} \alias{model_performance.merMod} \title{Performance of Mixed Models} \usage{ \method{model_performance}{merMod}( model, metrics = "all", estimator = "REML", verbose = TRUE, ... ) } \arguments{ \item{model}{A mixed effects model.} \item{metrics}{Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed (some of \code{c("AIC", "AICc", "BIC", "R2", "ICC", "RMSE", "SIGMA", "LOGLOSS", "SCORE")}). \code{"common"} will compute AIC, BIC, R2, ICC and RMSE.} \item{estimator}{Only for linear models. Corresponds to the different estimators for the standard deviation of the errors. If \code{estimator = "ML"} (default), the scaling is done by n (the biased ML estimator), which is then equivalent to using \code{AIC(logLik())}. Setting it to \code{"REML"} will give the same results as \code{AIC(logLik(..., REML = TRUE))}.} \item{verbose}{Toggle warnings and messages.} \item{...}{Arguments passed to or from other methods.} } \value{ A data frame (with one row) and one column per "index" (see \code{metrics}). } \description{ Compute indices of model performance for mixed models. } \details{ \subsection{Intraclass Correlation Coefficient (ICC)}{ This method returns the \emph{adjusted ICC} only, as this is typically of interest when judging the variance attributed to the random effects part of the model (see also \code{\link[=icc]{icc()}}). } \subsection{REML versus ML estimator}{ The default behaviour of \code{model_performance()} when computing AIC or BIC of linear mixed model from package \strong{lme4} is the same as for \code{AIC()} or \code{BIC()} (i.e. \code{estimator = "REML"}). However, for model comparison using \code{compare_performance()} sets \code{estimator = "ML"} by default, because \emph{comparing} information criteria based on REML fits is usually not valid (unless all models have the same fixed effects). Thus, make sure to set the correct estimator-value when looking at fit-indices or comparing model fits. } \subsection{Other performance indices}{ Furthermore, see 'Details' in \code{\link[=model_performance.lm]{model_performance.lm()}} for more details on returned indices. } } \examples{ \dontshow{if (require("lme4")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} model <- lme4::lmer(Petal.Length ~ Sepal.Length + (1 | Species), data = iris) model_performance(model) \dontshow{\}) # examplesIf} } performance/man/check_convergence.Rd0000644000176200001440000000751114503335324017256 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_convergence.R \name{check_convergence} \alias{check_convergence} \title{Convergence test for mixed effects models} \usage{ check_convergence(x, tolerance = 0.001, ...) } \arguments{ \item{x}{A \code{merMod} or \code{glmmTMB}-object.} \item{tolerance}{Indicates up to which value the convergence result is accepted. The smaller \code{tolerance} is, the stricter the test will be.} \item{...}{Currently not used.} } \value{ \code{TRUE} if convergence is fine and \code{FALSE} if convergence is suspicious. Additionally, the convergence value is returned as attribute. } \description{ \code{check_convergence()} provides an alternative convergence test for \code{merMod}-objects. } \section{Convergence and log-likelihood}{ Convergence problems typically arise when the model hasn't converged to a solution where the log-likelihood has a true maximum. This may result in unreliable and overly complex (or non-estimable) estimates and standard errors. } \section{Inspect model convergence}{ \strong{lme4} performs a convergence-check (see \code{?lme4::convergence}), however, as as discussed \href{https://github.com/lme4/lme4/issues/120}{here} and suggested by one of the lme4-authors in \href{https://github.com/lme4/lme4/issues/120#issuecomment-39920269}{this comment}, this check can be too strict. \code{check_convergence()} thus provides an alternative convergence test for \code{merMod}-objects. } \section{Resolving convergence issues}{ Convergence issues are not easy to diagnose. The help page on \code{?lme4::convergence} provides most of the current advice about how to resolve convergence issues. Another clue might be large parameter values, e.g. estimates (on the scale of the linear predictor) larger than 10 in (non-identity link) generalized linear model \emph{might} indicate \href{https://stats.oarc.ucla.edu/other/mult-pkg/faq/general/faqwhat-is-complete-or-quasi-complete-separation-in-logisticprobit-regression-and-how-do-we-deal-with-them/}{complete separation}. Complete separation can be addressed by regularization, e.g. penalized regression or Bayesian regression with appropriate priors on the fixed effects. } \section{Convergence versus Singularity}{ Note the different meaning between singularity and convergence: singularity indicates an issue with the "true" best estimate, i.e. whether the maximum likelihood estimation for the variance-covariance matrix of the random effects is positive definite or only semi-definite. Convergence is a question of whether we can assume that the numerical optimization has worked correctly or not. } \examples{ \dontshow{if (require("lme4") && require("glmmTMB")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} data(cbpp, package = "lme4") set.seed(1) cbpp$x <- rnorm(nrow(cbpp)) cbpp$x2 <- runif(nrow(cbpp)) model <- lme4::glmer( cbind(incidence, size - incidence) ~ period + x + x2 + (1 + x | herd), data = cbpp, family = binomial() ) check_convergence(model) \donttest{ model <- suppressWarnings(glmmTMB::glmmTMB( Sepal.Length ~ poly(Petal.Width, 4) * poly(Petal.Length, 4) + (1 + poly(Petal.Width, 4) | Species), data = iris )) check_convergence(model) } \dontshow{\}) # examplesIf} } \seealso{ Other functions to check model assumptions and and assess model quality: \code{\link{check_autocorrelation}()}, \code{\link{check_collinearity}()}, \code{\link{check_heteroscedasticity}()}, \code{\link{check_homogeneity}()}, \code{\link{check_model}()}, \code{\link{check_outliers}()}, \code{\link{check_overdispersion}()}, \code{\link{check_predictions}()}, \code{\link{check_singularity}()}, \code{\link{check_zeroinflation}()} } \concept{functions to check model assumptions and and assess model quality} performance/man/performance_accuracy.Rd0000644000176200001440000000357614436307766020023 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_accuracy.R \name{performance_accuracy} \alias{performance_accuracy} \title{Accuracy of predictions from model fit} \usage{ performance_accuracy( model, method = c("cv", "boot"), k = 5, n = 1000, ci = 0.95, verbose = TRUE ) } \arguments{ \item{model}{A linear or logistic regression model. A mixed-effects model is also accepted.} \item{method}{Character string, indicating whether cross-validation (\code{method = "cv"}) or bootstrapping (\code{method = "boot"}) is used to compute the accuracy values.} \item{k}{The number of folds for the k-fold cross-validation.} \item{n}{Number of bootstrap-samples.} \item{ci}{The level of the confidence interval.} \item{verbose}{Toggle warnings.} } \value{ A list with three values: The \code{Accuracy} of the model predictions, i.e. the proportion of accurately predicted values from the model, its standard error, \code{SE}, and the \code{Method} used to compute the accuracy. } \description{ This function calculates the predictive accuracy of linear or logistic regression models. } \details{ For linear models, the accuracy is the correlation coefficient between the actual and the predicted value of the outcome. For logistic regression models, the accuracy corresponds to the AUC-value, calculated with the \code{bayestestR::auc()}-function. \cr \cr The accuracy is the mean value of multiple correlation resp. AUC-values, which are either computed with cross-validation or non-parametric bootstrapping (see argument \code{method}). The standard error is the standard deviation of the computed correlation resp. AUC-values. } \examples{ model <- lm(mpg ~ wt + cyl, data = mtcars) performance_accuracy(model) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") performance_accuracy(model) } performance/man/check_model.Rd0000644000176200001440000002437514516134067016074 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_model.R \name{check_model} \alias{check_model} \alias{check_model.default} \title{Visual check of model assumptions} \usage{ check_model(x, ...) \method{check_model}{default}( x, dot_size = 2, line_size = 0.8, panel = TRUE, check = "all", alpha = 0.2, dot_alpha = 0.8, colors = c("#3aaf85", "#1b6ca8", "#cd201f"), theme = "see::theme_lucid", detrend = TRUE, show_dots = NULL, bandwidth = "nrd", type = "density", verbose = FALSE, ... ) } \arguments{ \item{x}{A model object.} \item{...}{Arguments passed down to the individual check functions, especially to \code{check_predictions()} and \code{binned_residuals()}.} \item{dot_size, line_size}{Size of line and dot-geoms.} \item{panel}{Logical, if \code{TRUE}, plots are arranged as panels; else, single plots for each diagnostic are returned.} \item{check}{Character vector, indicating which checks for should be performed and plotted. May be one or more of \code{"all"}, \code{"vif"}, \code{"qq"}, \code{"normality"}, \code{"linearity"}, \code{"ncv"}, \code{"homogeneity"}, \code{"outliers"}, \code{"reqq"}, \code{"pp_check"}, \code{"binned_residuals"} or \code{"overdispersion"}, Not that not all check apply to all type of models (see 'Details'). \code{"reqq"} is a QQ-plot for random effects and only available for mixed models. \code{"ncv"} is an alias for \code{"linearity"}, and checks for non-constant variance, i.e. for heteroscedasticity, as well as the linear relationship. By default, all possible checks are performed and plotted.} \item{alpha, dot_alpha}{The alpha level of the confidence bands and dot-geoms. Scalar from 0 to 1.} \item{colors}{Character vector with color codes (hex-format). Must be of length 3. First color is usually used for reference lines, second color for dots, and third color for outliers or extreme values.} \item{theme}{String, indicating the name of the plot-theme. Must be in the format \code{"package::theme_name"} (e.g. \code{"ggplot2::theme_minimal"}).} \item{detrend}{Logical. Should Q-Q/P-P plots be detrended? Defaults to \code{TRUE}.} \item{show_dots}{Logical, if \code{TRUE}, will show data points in the plot. Set to \code{FALSE} for models with many observations, if generating the plot is too time-consuming. By default, \code{show_dots = NULL}. In this case \code{check_model()} tries to guess whether performance will be poor due to a very large model and thus automatically shows or hides dots.} \item{bandwidth}{A character string indicating the smoothing bandwidth to be used. Unlike \code{stats::density()}, which used \code{"nrd0"} as default, the default used here is \code{"nrd"} (which seems to give more plausible results for non-Gaussian models). When problems with plotting occur, try to change to a different value.} \item{type}{Plot type for the posterior predictive checks plot. Can be \code{"density"}, \code{"discrete_dots"}, \code{"discrete_interval"} or \code{"discrete_both"} (the \verb{discrete_*} options are appropriate for models with discrete - binary, integer or ordinal etc. - outcomes).} \item{verbose}{If \code{FALSE} (default), suppress most warning messages.} } \value{ The data frame that is used for plotting. } \description{ Visual check of various model assumptions (normality of residuals, normality of random effects, linear relationship, homogeneity of variance, multicollinearity). } \details{ For Bayesian models from packages \strong{rstanarm} or \strong{brms}, models will be "converted" to their frequentist counterpart, using \href{https://easystats.github.io/bayestestR/reference/convert_bayesian_as_frequentist.html}{\code{bayestestR::bayesian_as_frequentist}}. A more advanced model-check for Bayesian models will be implemented at a later stage. See also the related \href{https://easystats.github.io/performance/articles/check_model.html}{vignette}. } \note{ This function just prepares the data for plotting. To create the plots, \strong{see} needs to be installed. Furthermore, this function suppresses all possible warnings. In case you observe suspicious plots, please refer to the dedicated functions (like \code{check_collinearity()}, \code{check_normality()} etc.) to get informative messages and warnings. } \section{Posterior Predictive Checks}{ Posterior predictive checks can be used to look for systematic discrepancies between real and simulated data. It helps to see whether the type of model (distributional family) fits well to the data. See \code{\link[=check_predictions]{check_predictions()}} for further details. } \section{Linearity Assumption}{ The plot \strong{Linearity} checks the assumption of linear relationship. However, the spread of dots also indicate possible heteroscedasticity (i.e. non-constant variance, hence, the alias \code{"ncv"} for this plot), thus it shows if residuals have non-linear patterns. This plot helps to see whether predictors may have a non-linear relationship with the outcome, in which case the reference line may roughly indicate that relationship. A straight and horizontal line indicates that the model specification seems to be ok. But for instance, if the line would be U-shaped, some of the predictors probably should better be modeled as quadratic term. See \code{\link[=check_heteroscedasticity]{check_heteroscedasticity()}} for further details. \strong{Some caution is needed} when interpreting these plots. Although these plots are helpful to check model assumptions, they do not necessarily indicate so-called "lack of fit", e.g. missed non-linear relationships or interactions. Thus, it is always recommended to also look at \href{https://strengejacke.github.io/ggeffects/articles/introduction_partial_residuals.html}{effect plots, including partial residuals}. } \section{Homogeneity of Variance}{ This plot checks the assumption of equal variance (homoscedasticity). The desired pattern would be that dots spread equally above and below a straight, horizontal line and show no apparent deviation. } \section{Influential Observations}{ This plot is used to identify influential observations. If any points in this plot fall outside of Cook’s distance (the dashed lines) then it is considered an influential observation. See \code{\link[=check_outliers]{check_outliers()}} for further details. } \section{Multicollinearity}{ This plot checks for potential collinearity among predictors. In a nutshell, multicollinearity means that once you know the effect of one predictor, the value of knowing the other predictor is rather low. Multicollinearity might arise when a third, unobserved variable has a causal effect on each of the two predictors that are associated with the outcome. In such cases, the actual relationship that matters would be the association between the unobserved variable and the outcome. See \code{\link[=check_collinearity]{check_collinearity()}} for further details. } \section{Normality of Residuals}{ This plot is used to determine if the residuals of the regression model are normally distributed. Usually, dots should fall along the line. If there is some deviation (mostly at the tails), this indicates that the model doesn't predict the outcome well for that range that shows larger deviations from the line. For generalized linear models, a half-normal Q-Q plot of the absolute value of the standardized deviance residuals is shown, however, the interpretation of the plot remains the same. See \code{\link[=check_normality]{check_normality()}} for further details. } \section{Overdispersion}{ For count models, an \emph{overdispersion plot} is shown. Overdispersion occurs when the observed variance is higher than the variance of a theoretical model. For Poisson models, variance increases with the mean and, therefore, variance usually (roughly) equals the mean value. If the variance is much higher, the data are "overdispersed". See \code{\link[=check_overdispersion]{check_overdispersion()}} for further details. } \section{Binned Residuals}{ For models from binomial families, a \emph{binned residuals plot} is shown. Binned residual plots are achieved by cutting the the data into bins and then plotting the average residual versus the average fitted value for each bin. If the model were true, one would expect about 95\% of the residuals to fall inside the error bounds. See \code{\link[=binned_residuals]{binned_residuals()}} for further details. } \section{Residuals for (Generalized) Linear Models}{ Plots that check the normality of residuals (QQ-plot) or the homogeneity of variance use standardized Pearson's residuals for generalized linear models, and standardized residuals for linear models. The plots for the normality of residuals (with overlayed normal curve) and for the linearity assumption use the default residuals for \code{lm} and \code{glm} (which are deviance residuals for \code{glm}). } \section{Troubleshooting}{ For models with many observations, or for more complex models in general, generating the plot might become very slow. One reason might be that the underlying graphic engine becomes slow for plotting many data points. In such cases, setting the argument \code{show_dots = FALSE} might help. Furthermore, look at the \code{check} argument and see if some of the model checks could be skipped, which also increases performance. } \examples{ \dontshow{if (require("lme4")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \donttest{ m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) check_model(m) data(sleepstudy, package = "lme4") m <- lme4::lmer(Reaction ~ Days + (Days | Subject), sleepstudy) check_model(m, panel = FALSE) } \dontshow{\}) # examplesIf} } \seealso{ Other functions to check model assumptions and and assess model quality: \code{\link{check_autocorrelation}()}, \code{\link{check_collinearity}()}, \code{\link{check_convergence}()}, \code{\link{check_heteroscedasticity}()}, \code{\link{check_homogeneity}()}, \code{\link{check_outliers}()}, \code{\link{check_overdispersion}()}, \code{\link{check_predictions}()}, \code{\link{check_singularity}()}, \code{\link{check_zeroinflation}()} } \concept{functions to check model assumptions and and assess model quality} performance/man/performance_cv.Rd0000644000176200001440000000420214257247716016623 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_cv.R \name{performance_cv} \alias{performance_cv} \title{Cross-validated model performance} \usage{ performance_cv( model, data = NULL, method = c("holdout", "k_fold", "loo"), metrics = "all", prop = 0.3, k = 5, stack = TRUE, verbose = TRUE, ... ) } \arguments{ \item{model}{A regression model.} \item{data}{Optional. A data frame containing the same variables as \code{model} that will be used as the cross-validation sample.} \item{method}{Character string, indicating the cross-validation method to use: whether holdout (\code{"holdout"}, aka train-test), k-fold (\code{"k_fold"}), or leave-one-out (\code{"loo"}). If \code{data} is supplied, this argument is ignored.} \item{metrics}{Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed (some of \code{c("ELPD", "Deviance", "MSE", "RMSE", "R2")}). "common" will compute R2 and RMSE.} \item{prop}{If \code{method = "holdout"}, what proportion of the sample to hold out as the test sample?} \item{k}{If \code{method = "k_fold"}, the number of folds to use.} \item{stack}{Logical. If \code{method = "k_fold"}, should performance be computed by stacking residuals from each holdout fold and calculating each metric on the stacked data (\code{TRUE}, default) or should performance be computed by calculating metrics within each holdout fold and averaging performance across each fold (\code{FALSE})?} \item{verbose}{Toggle warnings.} \item{...}{Not used.} } \value{ A data frame with columns for each metric requested, as well as \code{k} if \code{method = "holdout"} and the \code{Method} used for cross-validation. If \code{method = "holdout"} and \code{stack = TRUE}, the standard error (standard deviation across holdout folds) for each metric is also included. } \description{ This function cross-validates regression models in a user-supplied new sample or by using holdout (train-test), k-fold, or leave-one-out cross-validation. } \examples{ model <- lm(mpg ~ wt + cyl, data = mtcars) performance_cv(model) } performance/man/model_performance.stanreg.Rd0000644000176200001440000000723314503335324020747 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.bayesian.R \name{model_performance.stanreg} \alias{model_performance.stanreg} \alias{model_performance.BFBayesFactor} \title{Performance of Bayesian Models} \usage{ \method{model_performance}{stanreg}(model, metrics = "all", verbose = TRUE, ...) \method{model_performance}{BFBayesFactor}( model, metrics = "all", verbose = TRUE, average = FALSE, prior_odds = NULL, ... ) } \arguments{ \item{model}{Object of class \code{stanreg} or \code{brmsfit}.} \item{metrics}{Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed (some of \code{c("LOOIC", "WAIC", "R2", "R2_adj", "RMSE", "SIGMA", "LOGLOSS", "SCORE")}). \code{"common"} will compute LOOIC, WAIC, R2 and RMSE.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments passed to or from other methods.} \item{average}{Compute model-averaged index? See \code{\link[bayestestR:weighted_posteriors]{bayestestR::weighted_posteriors()}}.} \item{prior_odds}{Optional vector of prior odds for the models compared to the first model (or the denominator, for \code{BFBayesFactor} objects). For \code{data.frame}s, this will be used as the basis of weighting.} } \value{ A data frame (with one row) and one column per "index" (see \code{metrics}). } \description{ Compute indices of model performance for (general) linear models. } \details{ Depending on \code{model}, the following indices are computed: \itemize{ \item \strong{ELPD}: expected log predictive density. Larger ELPD values mean better fit. See \code{\link[=looic]{looic()}}. \item \strong{LOOIC}: leave-one-out cross-validation (LOO) information criterion. Lower LOOIC values mean better fit. See \code{\link[=looic]{looic()}}. \item \strong{WAIC}: widely applicable information criterion. Lower WAIC values mean better fit. See \code{?loo::waic}. \item \strong{R2}: r-squared value, see \code{\link[=r2_bayes]{r2_bayes()}}. \item \strong{R2_adjusted}: LOO-adjusted r-squared, see \code{\link[=r2_loo]{r2_loo()}}. \item \strong{RMSE}: root mean squared error, see \code{\link[=performance_rmse]{performance_rmse()}}. \item \strong{SIGMA}: residual standard deviation, see \code{\link[insight:get_sigma]{insight::get_sigma()}}. \item \strong{LOGLOSS}: Log-loss, see \code{\link[=performance_logloss]{performance_logloss()}}. \item \strong{SCORE_LOG}: score of logarithmic proper scoring rule, see \code{\link[=performance_score]{performance_score()}}. \item \strong{SCORE_SPHERICAL}: score of spherical proper scoring rule, see \code{\link[=performance_score]{performance_score()}}. \item \strong{PCP}: percentage of correct predictions, see \code{\link[=performance_pcp]{performance_pcp()}}. } } \examples{ \dontshow{if (require("rstanarm") && require("rstantools") && require("BayesFactor")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \donttest{ model <- suppressWarnings(rstanarm::stan_glm( mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0 )) model_performance(model) model <- suppressWarnings(rstanarm::stan_glmer( mpg ~ wt + cyl + (1 | gear), data = mtcars, chains = 1, iter = 500, refresh = 0 )) model_performance(model) model <- BayesFactor::generalTestBF(carb ~ am + mpg, mtcars) model_performance(model) model_performance(model[3]) model_performance(model, average = TRUE) } \dontshow{\}) # examplesIf} } \references{ Gelman, A., Goodrich, B., Gabry, J., and Vehtari, A. (2018). R-squared for Bayesian regression models. The American Statistician, The American Statistician, 1-6. } \seealso{ \link{r2_bayes} } performance/man/model_performance.rma.Rd0000644000176200001440000000603014512471542020060 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.rma.R \name{model_performance.rma} \alias{model_performance.rma} \title{Performance of Meta-Analysis Models} \usage{ \method{model_performance}{rma}( model, metrics = "all", estimator = "ML", verbose = TRUE, ... ) } \arguments{ \item{model}{A \code{rma} object as returned by \code{metafor::rma()}.} \item{metrics}{Can be \code{"all"} or a character vector of metrics to be computed (some of \code{c("AIC", "BIC", "I2", "H2", "TAU2", "R2", "CochransQ", "QE", "Omnibus", "QM")}).} \item{estimator}{Only for linear models. Corresponds to the different estimators for the standard deviation of the errors. If \code{estimator = "ML"} (default), the scaling is done by n (the biased ML estimator), which is then equivalent to using \code{AIC(logLik())}. Setting it to \code{"REML"} will give the same results as \code{AIC(logLik(..., REML = TRUE))}.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments passed to or from other methods.} } \value{ A data frame (with one row) and one column per "index" (see \code{metrics}). } \description{ Compute indices of model performance for meta-analysis model from the \strong{metafor} package. } \details{ \subsection{Indices of fit}{ \itemize{ \item \strong{AIC} Akaike's Information Criterion, see \code{?stats::AIC} \item \strong{BIC} Bayesian Information Criterion, see \code{?stats::BIC} \item \strong{I2}: For a random effects model, \code{I2} estimates (in percent) how much of the total variability in the effect size estimates can be attributed to heterogeneity among the true effects. For a mixed-effects model, \code{I2} estimates how much of the unaccounted variability can be attributed to residual heterogeneity. \item \strong{H2}: For a random-effects model, \code{H2} estimates the ratio of the total amount of variability in the effect size estimates to the amount of sampling variability. For a mixed-effects model, \code{H2} estimates the ratio of the unaccounted variability in the effect size estimates to the amount of sampling variability. \item \strong{TAU2}: The amount of (residual) heterogeneity in the random or mixed effects model. \item \strong{CochransQ (QE)}: Test for (residual) Heterogeneity. Without moderators in the model, this is simply Cochran's Q-test. \item \strong{Omnibus (QM)}: Omnibus test of parameters. \item \strong{R2}: Pseudo-R2-statistic, which indicates the amount of heterogeneity accounted for by the moderators included in a fixed-effects model. } See the documentation for \code{?metafor::fitstats}. } } \examples{ \dontshow{if (require("metafor") && require("metadat")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} data(dat.bcg, package = "metadat") dat <- metafor::escalc( measure = "RR", ai = tpos, bi = tneg, ci = cpos, di = cneg, data = dat.bcg ) model <- metafor::rma(yi, vi, data = dat, method = "REML") model_performance(model) \dontshow{\}) # examplesIf} } performance/man/check_predictions.Rd0000644000176200001440000001241614501062052017274 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_predictions.R \name{check_predictions} \alias{check_predictions} \alias{check_predictions.default} \alias{posterior_predictive_check} \alias{check_posterior_predictions} \title{Posterior predictive checks} \usage{ check_predictions(object, ...) \method{check_predictions}{default}( object, iterations = 50, check_range = FALSE, re_formula = NULL, bandwidth = "nrd", type = "density", verbose = TRUE, ... ) posterior_predictive_check(object, ...) check_posterior_predictions(object, ...) } \arguments{ \item{object}{A statistical model.} \item{...}{Passed down to \code{simulate()}.} \item{iterations}{The number of draws to simulate/bootstrap.} \item{check_range}{Logical, if \code{TRUE}, includes a plot with the minimum value of the original response against the minimum values of the replicated responses, and the same for the maximum value. This plot helps judging whether the variation in the original data is captured by the model or not (\emph{Gelman et al. 2020, pp.163}). The minimum and maximum values of \code{y} should be inside the range of the related minimum and maximum values of \code{yrep}.} \item{re_formula}{Formula containing group-level effects (random effects) to be considered in the simulated data. If \code{NULL} (default), condition on all random effects. If \code{NA} or \code{~0}, condition on no random effects. See \code{simulate()} in \strong{lme4}.} \item{bandwidth}{A character string indicating the smoothing bandwidth to be used. Unlike \code{stats::density()}, which used \code{"nrd0"} as default, the default used here is \code{"nrd"} (which seems to give more plausible results for non-Gaussian models). When problems with plotting occur, try to change to a different value.} \item{type}{Plot type for the posterior predictive checks plot. Can be \code{"density"}, \code{"discrete_dots"}, \code{"discrete_interval"} or \code{"discrete_both"} (the \verb{discrete_*} options are appropriate for models with discrete - binary, integer or ordinal etc. - outcomes).} \item{verbose}{Toggle warnings.} } \value{ A data frame of simulated responses and the original response vector. } \description{ Posterior predictive checks mean "simulating replicated data under the fitted model and then comparing these to the observed data" (\emph{Gelman and Hill, 2007, p. 158}). Posterior predictive checks can be used to "look for systematic discrepancies between real and simulated data" (\emph{Gelman et al. 2014, p. 169}). \strong{performance} provides posterior predictive check methods for a variety of frequentist models (e.g., \code{lm}, \code{merMod}, \code{glmmTMB}, ...). For Bayesian models, the model is passed to \code{\link[bayesplot:pp_check]{bayesplot::pp_check()}}. } \details{ An example how posterior predictive checks can also be used for model comparison is Figure 6 from \emph{Gabry et al. 2019, Figure 6}. \if{html}{\cr \figure{pp_check.png}{options: width="90\%" alt="Posterior Predictive Check"} \cr} The model shown in the right panel (b) can simulate new data that are more similar to the observed outcome than the model in the left panel (a). Thus, model (b) is likely to be preferred over model (a). } \note{ Every model object that has a \code{simulate()}-method should work with \code{check_predictions()}. On R 3.6.0 and higher, if \strong{bayesplot} (or a package that imports \strong{bayesplot} such as \strong{rstanarm} or \strong{brms}) is loaded, \code{pp_check()} is also available as an alias for \code{check_predictions()}. } \examples{ \dontshow{if (require("see")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # linear model model <- lm(mpg ~ disp, data = mtcars) check_predictions(model) # discrete/integer outcome set.seed(99) d <- iris d$skewed <- rpois(150, 1) model <- glm( skewed ~ Species + Petal.Length + Petal.Width, family = poisson(), data = d ) check_predictions(model, type = "discrete_both") \dontshow{\}) # examplesIf} } \references{ \itemize{ \item Gabry, J., Simpson, D., Vehtari, A., Betancourt, M., and Gelman, A. (2019). Visualization in Bayesian workflow. Journal of the Royal Statistical Society: Series A (Statistics in Society), 182(2), 389–402. https://doi.org/10.1111/rssa.12378 \item Gelman, A., and Hill, J. (2007). Data analysis using regression and multilevel/hierarchical models. Cambridge; New York: Cambridge University Press. \item Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2014). Bayesian data analysis. (Third edition). CRC Press. \item Gelman, A., Hill, J., and Vehtari, A. (2020). Regression and Other Stories. Cambridge University Press. } } \seealso{ Other functions to check model assumptions and and assess model quality: \code{\link{check_autocorrelation}()}, \code{\link{check_collinearity}()}, \code{\link{check_convergence}()}, \code{\link{check_heteroscedasticity}()}, \code{\link{check_homogeneity}()}, \code{\link{check_model}()}, \code{\link{check_outliers}()}, \code{\link{check_overdispersion}()}, \code{\link{check_singularity}()}, \code{\link{check_zeroinflation}()} } \concept{functions to check model assumptions and and assess model quality} performance/man/r2_loo.Rd0000644000176200001440000000415514501062052015011 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_loo.R \name{r2_loo} \alias{r2_loo} \alias{r2_loo_posterior} \alias{r2_loo_posterior.brmsfit} \alias{r2_loo_posterior.stanreg} \title{LOO-adjusted R2} \usage{ r2_loo(model, robust = TRUE, ci = 0.95, verbose = TRUE, ...) r2_loo_posterior(model, ...) \method{r2_loo_posterior}{brmsfit}(model, verbose = TRUE, ...) \method{r2_loo_posterior}{stanreg}(model, verbose = TRUE, ...) } \arguments{ \item{model}{A Bayesian regression model (from \strong{brms}, \strong{rstanarm}, \strong{BayesFactor}, etc).} \item{robust}{Logical, if \code{TRUE}, the median instead of mean is used to calculate the central tendency of the variances.} \item{ci}{Value or vector of probability of the CI (between 0 and 1) to be estimated.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments passed to \code{r2_posterior()}.} } \value{ A list with the Bayesian R2 value. For mixed models, a list with the Bayesian R2 value and the marginal Bayesian R2 value. The standard errors and credible intervals for the R2 values are saved as attributes. A list with the LOO-adjusted R2 value. The standard errors and credible intervals for the R2 values are saved as attributes. } \description{ Compute LOO-adjusted R2. } \details{ \code{r2_loo()} returns an "adjusted" R2 value computed using a leave-one-out-adjusted posterior distribution. This is conceptually similar to an adjusted/unbiased R2 estimate in classical regression modeling. See \code{\link[=r2_bayes]{r2_bayes()}} for an "unadjusted" R2. Mixed models are not currently fully supported. \code{r2_loo_posterior()} is the actual workhorse for \code{r2_loo()} and returns a posterior sample of LOO-adjusted Bayesian R2 values. } \examples{ \dontshow{if (require("rstanarm") && require("rstantools")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} model <- suppressWarnings(rstanarm::stan_glm( mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0, show_messages = FALSE )) r2_loo(model) \dontshow{\}) # examplesIf} } performance/man/check_overdispersion.Rd0000644000176200001440000000657614512471542020050 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_overdispersion.R \name{check_overdispersion} \alias{check_overdispersion} \title{Check overdispersion of GL(M)M's} \usage{ check_overdispersion(x, ...) } \arguments{ \item{x}{Fitted model of class \code{merMod}, \code{glmmTMB}, \code{glm}, or \code{glm.nb} (package \strong{MASS}).} \item{...}{Currently not used.} } \value{ A list with results from the overdispersion test, like chi-squared statistics, p-value or dispersion ratio. } \description{ \code{check_overdispersion()} checks generalized linear (mixed) models for overdispersion. } \details{ Overdispersion occurs when the observed variance is higher than the variance of a theoretical model. For Poisson models, variance increases with the mean and, therefore, variance usually (roughly) equals the mean value. If the variance is much higher, the data are "overdispersed". } \section{Interpretation of the Dispersion Ratio}{ If the dispersion ratio is close to one, a Poisson model fits well to the data. Dispersion ratios larger than one indicate overdispersion, thus a negative binomial model or similar might fit better to the data. A p-value < .05 indicates overdispersion. } \section{Overdispersion in Poisson Models}{ For Poisson models, the overdispersion test is based on the code from \emph{Gelman and Hill (2007), page 115}. } \section{Overdispersion in Mixed Models}{ For \code{merMod}- and \code{glmmTMB}-objects, \code{check_overdispersion()} is based on the code in the \href{http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html}{GLMM FAQ}, section \emph{How can I deal with overdispersion in GLMMs?}. Note that this function only returns an \emph{approximate} estimate of an overdispersion parameter, and is probably inaccurate for zero-inflated mixed models (fitted with \code{glmmTMB}). } \section{How to fix Overdispersion}{ Overdispersion can be fixed by either modeling the dispersion parameter, or by choosing a different distributional family (like Quasi-Poisson, or negative binomial, see \emph{Gelman and Hill (2007), pages 115-116}). } \examples{ \dontshow{if (getRversion() >= "4.0.0" && require("glmmTMB", quietly = TRUE)) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(glmmTMB) data(Salamanders) m <- glm(count ~ spp + mined, family = poisson, data = Salamanders) check_overdispersion(m) m <- glmmTMB( count ~ mined + spp + (1 | site), family = poisson, data = Salamanders ) check_overdispersion(m) \dontshow{\}) # examplesIf} } \references{ \itemize{ \item Bolker B et al. (2017): \href{http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html}{GLMM FAQ.} \item Gelman, A., and Hill, J. (2007). Data analysis using regression and multilevel/hierarchical models. Cambridge; New York: Cambridge University Press. } } \seealso{ Other functions to check model assumptions and and assess model quality: \code{\link{check_autocorrelation}()}, \code{\link{check_collinearity}()}, \code{\link{check_convergence}()}, \code{\link{check_heteroscedasticity}()}, \code{\link{check_homogeneity}()}, \code{\link{check_model}()}, \code{\link{check_outliers}()}, \code{\link{check_predictions}()}, \code{\link{check_singularity}()}, \code{\link{check_zeroinflation}()} } \concept{functions to check model assumptions and and assess model quality} performance/man/check_multimodal.Rd0000644000176200001440000000272414503335324017130 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_multimodal.R \name{check_multimodal} \alias{check_multimodal} \title{Check if a distribution is unimodal or multimodal} \usage{ check_multimodal(x, ...) } \arguments{ \item{x}{A numeric vector or a data frame.} \item{...}{Arguments passed to or from other methods.} } \description{ For univariate distributions (one-dimensional vectors), this functions performs a Ameijeiras-Alonso et al. (2018) excess mass test. For multivariate distributions (data frames), it uses mixture modelling. However, it seems that it always returns a significant result (suggesting that the distribution is multimodal). A better method might be needed here. } \examples{ \dontshow{if (require("multimode") && require("mclust")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \donttest{ # Univariate x <- rnorm(1000) check_multimodal(x) x <- c(rnorm(1000), rnorm(1000, 2)) check_multimodal(x) # Multivariate m <- data.frame( x = rnorm(200), y = rbeta(200, 2, 1) ) plot(m$x, m$y) check_multimodal(m) m <- data.frame( x = c(rnorm(100), rnorm(100, 4)), y = c(rbeta(100, 2, 1), rbeta(100, 1, 4)) ) plot(m$x, m$y) check_multimodal(m) } \dontshow{\}) # examplesIf} } \references{ \itemize{ \item Ameijeiras-Alonso, J., Crujeiras, R. M., and Rodríguez-Casal, A. (2019). Mode testing, critical bandwidth and excess mass. Test, 28(3), 900-919. } } performance/man/model_performance.Rd0000644000176200001440000000310214257247716017311 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.R \name{model_performance} \alias{model_performance} \alias{performance} \title{Model Performance} \usage{ model_performance(model, ...) performance(model, ...) } \arguments{ \item{model}{Statistical model.} \item{...}{Arguments passed to or from other methods, resp. for \code{compare_performance()}, one or multiple model objects (also of different classes).} } \value{ A data frame (with one row) and one column per "index" (see \code{metrics}). } \description{ See the documentation for your object's class: \itemize{ \item \link[=model_performance.lm]{Frequentist Regressions} \item \link[=model_performance.ivreg]{Instrumental Variables Regressions} \item \link[=model_performance.merMod]{Mixed models} \item \link[=model_performance.stanreg]{Bayesian models} \item \link[=model_performance.lavaan]{CFA / SEM lavaan models} \item \link[=model_performance.rma]{Meta-analysis models} } } \details{ \code{model_performance()} correctly detects transformed response and returns the "corrected" AIC and BIC value on the original scale. To get back to the original scale, the likelihood of the model is multiplied by the Jacobian/derivative of the transformation. } \examples{ model <- lm(mpg ~ wt + cyl, data = mtcars) model_performance(model) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") model_performance(model) } \seealso{ \code{\link[=compare_performance]{compare_performance()}} to compare performance of many different models. } performance/man/performance_hosmer.Rd0000644000176200001440000000214414257247716017513 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_hosmer.R \name{performance_hosmer} \alias{performance_hosmer} \title{Hosmer-Lemeshow goodness-of-fit test} \usage{ performance_hosmer(model, n_bins = 10) } \arguments{ \item{model}{A \code{glm}-object with binomial-family.} \item{n_bins}{Numeric, the number of bins to divide the data.} } \value{ An object of class \code{hoslem_test} with following values: \code{chisq}, the Hosmer-Lemeshow chi-squared statistic; \code{df}, degrees of freedom and \code{p.value} the p-value for the goodness-of-fit test. } \description{ Check model quality of logistic regression models. } \details{ A well-fitting model shows \emph{no} significant difference between the model and the observed data, i.e. the reported p-value should be greater than 0.05. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") performance_hosmer(model) } \references{ Hosmer, D. W., and Lemeshow, S. (2000). Applied Logistic Regression. Hoboken, NJ, USA: John Wiley and Sons, Inc. \doi{10.1002/0471722146} } performance/man/looic.Rd0000644000176200001440000000171014517461276014736 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/looic.R \name{looic} \alias{looic} \title{LOO-related Indices for Bayesian regressions.} \usage{ looic(model, verbose = TRUE) } \arguments{ \item{model}{A Bayesian regression model.} \item{verbose}{Toggle off warnings.} } \value{ A list with four elements, the ELPD, LOOIC and their standard errors. } \description{ Compute LOOIC (leave-one-out cross-validation (LOO) information criterion) and ELPD (expected log predictive density) for Bayesian regressions. For LOOIC and ELPD, smaller and larger values are respectively indicative of a better fit. } \examples{ \dontshow{if (require("rstanarm")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \donttest{ model <- suppressWarnings(rstanarm::stan_glm( mpg ~ wt + cyl, data = mtcars, chains = 1, iter = 500, refresh = 0 )) looic(model) } \dontshow{\}) # examplesIf} } performance/man/check_itemscale.Rd0000644000176200001440000000505214507335630016730 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_itemscale.R \name{check_itemscale} \alias{check_itemscale} \title{Describe Properties of Item Scales} \usage{ check_itemscale(x) } \arguments{ \item{x}{An object of class \code{parameters_pca}, as returned by \code{\link[parameters:principal_components]{parameters::principal_components()}}.} } \value{ A list of data frames, with related measures of internal consistencies of each subscale. } \description{ Compute various measures of internal consistencies applied to (sub)scales, which items were extracted using \code{parameters::principal_components()}. } \details{ \code{check_itemscale()} calculates various measures of internal consistencies, such as Cronbach's alpha, item difficulty or discrimination etc. on subscales which were built from several items. Subscales are retrieved from the results of \code{\link[parameters:principal_components]{parameters::principal_components()}}, i.e. based on how many components were extracted from the PCA, \code{check_itemscale()} retrieves those variables that belong to a component and calculates the above mentioned measures. } \note{ \itemize{ \item \emph{Item difficulty} should range between 0.2 and 0.8. Ideal value is \code{p+(1-p)/2} (which mostly is between 0.5 and 0.8). See \code{\link[=item_difficulty]{item_difficulty()}} for details. \item For \emph{item discrimination}, acceptable values are 0.20 or higher; the closer to 1.00 the better. See \code{\link[=item_reliability]{item_reliability()}} for more details. \item In case the total \emph{Cronbach's alpha} value is below the acceptable cut-off of 0.7 (mostly if an index has few items), the \emph{mean inter-item-correlation} is an alternative measure to indicate acceptability. Satisfactory range lies between 0.2 and 0.4. See also \code{\link[=item_intercor]{item_intercor()}}. } } \examples{ \dontshow{if (require("parameters") && require("psych")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # data generation from '?prcomp', slightly modified C <- chol(S <- toeplitz(0.9^(0:15))) set.seed(17) X <- matrix(rnorm(1600), 100, 16) Z <- X \%*\% C pca <- principal_components(as.data.frame(Z), rotation = "varimax", n = 3) pca check_itemscale(pca) \dontshow{\}) # examplesIf} } \references{ \itemize{ \item Briggs SR, Cheek JM (1986) The role of factor analysis in the development and evaluation of personality scales. Journal of Personality, 54(1), 106-148. doi: 10.1111/j.1467-6494.1986.tb00391.x } } performance/man/item_difficulty.Rd0000644000176200001440000000421314362032043016772 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/item_difficulty.R \name{item_difficulty} \alias{item_difficulty} \title{Difficulty of Questionnaire Items} \usage{ item_difficulty(x, maximum_value = NULL) } \arguments{ \item{x}{Depending on the function, \code{x} may be a \code{matrix} as returned by the \code{cor()}-function, or a data frame with items (e.g. from a test or questionnaire).} \item{maximum_value}{Numeric value, indicating the maximum value of an item. If \code{NULL} (default), the maximum is taken from the maximum value of all columns in \code{x} (assuming that the maximum value at least appears once in the data). If \code{NA}, each item's maximum value is taken as maximum. If the required maximum value is not present in the data, specify the theoreritcal maximum using \code{maximum_value}.} } \value{ A data frame with three columns: The name(s) of the item(s), the item difficulties for each item, and the ideal item difficulty. } \description{ Compute various measures of internal consistencies for tests or item-scales of questionnaires. } \details{ \emph{Item difficutly} of an item is defined as the quotient of the sum actually achieved for this item of all and the maximum achievable score. This function calculates the item difficulty, which should range between 0.2 and 0.8. Lower values are a signal for more difficult items, while higher values close to one are a sign for easier items. The ideal value for item difficulty is \code{p + (1 - p) / 2}, where \code{p = 1 / max(x)}. In most cases, the ideal item difficulty lies between 0.5 and 0.8. } \examples{ data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] item_difficulty(x) } \references{ \itemize{ \item Bortz, J., and Döring, N. (2006). Quantitative Methoden der Datenerhebung. In J. Bortz and N. Döring, Forschungsmethoden und Evaluation. Springer: Berlin, Heidelberg: 137–293 \item Kelava A, Moosbrugger H (2020). Deskriptivstatistische Itemanalyse und Testwertbestimmung. In: Moosbrugger H, Kelava A, editors. Testtheorie und Fragebogenkonstruktion. Berlin, Heidelberg: Springer, 143–158 } } performance/man/performance_rse.Rd0000644000176200001440000000117614257247716017013 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_rse.R \name{performance_rse} \alias{performance_rse} \title{Residual Standard Error for Linear Models} \usage{ performance_rse(model) } \arguments{ \item{model}{A model.} } \value{ Numeric, the residual standard error of \code{model}. } \description{ Compute residual standard error of linear models. } \details{ The residual standard error is the square root of the residual sum of squares divided by the residual degrees of freedom. } \examples{ data(mtcars) m <- lm(mpg ~ hp + gear, data = mtcars) performance_rse(m) } performance/man/display.performance_model.Rd0000644000176200001440000000376414327547352020770 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/display.R, R/print_md.R \name{display.performance_model} \alias{display.performance_model} \alias{print_md.performance_model} \alias{print_md.compare_performance} \title{Print tables in different output formats} \usage{ \method{display}{performance_model}(object, format = "markdown", digits = 2, caption = NULL, ...) \method{print_md}{performance_model}( x, digits = 2, caption = "Indices of model performance", layout = "horizontal", ... ) \method{print_md}{compare_performance}( x, digits = 2, caption = "Comparison of Model Performance Indices", layout = "horizontal", ... ) } \arguments{ \item{object, x}{An object returned by \code{\link[=model_performance]{model_performance()}} or or \code{\link[=compare_performance]{compare_performance()}}. or its summary.} \item{format}{String, indicating the output format. Currently, only \code{"markdown"} is supported.} \item{digits}{Number of decimal places.} \item{caption}{Table caption as string. If \code{NULL}, no table caption is printed.} \item{...}{Currently not used.} \item{layout}{Table layout (can be either \code{"horizontal"} or \code{"vertical"}).} } \value{ A character vector. If \code{format = "markdown"}, the return value will be a character vector in markdown-table format. } \description{ Prints tables (i.e. data frame) in different output formats. \code{print_md()} is a alias for \code{display(format = "markdown")}. } \details{ \code{display()} is useful when the table-output from functions, which is usually printed as formatted text-table to console, should be formatted for pretty table-rendering in markdown documents, or if knitted from rmarkdown to PDF or Word files. See \href{https://easystats.github.io/parameters/articles/model_parameters_formatting.html}{vignette} for examples. } \examples{ model <- lm(mpg ~ wt + cyl, data = mtcars) mp <- model_performance(model) display(mp) } performance/man/check_zeroinflation.Rd0000644000176200001440000000374314501062052017637 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_zeroinflation.R \name{check_zeroinflation} \alias{check_zeroinflation} \title{Check for zero-inflation in count models} \usage{ check_zeroinflation(x, tolerance = 0.05) } \arguments{ \item{x}{Fitted model of class \code{merMod}, \code{glmmTMB}, \code{glm}, or \code{glm.nb} (package \strong{MASS}).} \item{tolerance}{The tolerance for the ratio of observed and predicted zeros to considered as over- or underfitting zeros. A ratio between 1 +/- \code{tolerance} is considered as OK, while a ratio beyond or below this threshold would indicate over- or underfitting.} } \value{ A list with information about the amount of predicted and observed zeros in the outcome, as well as the ratio between these two values. } \description{ \code{check_zeroinflation()} checks whether count models are over- or underfitting zeros in the outcome. } \details{ If the amount of observed zeros is larger than the amount of predicted zeros, the model is underfitting zeros, which indicates a zero-inflation in the data. In such cases, it is recommended to use negative binomial or zero-inflated models. } \examples{ \dontshow{if (require("glmmTMB")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} data(Salamanders, package = "glmmTMB") m <- glm(count ~ spp + mined, family = poisson, data = Salamanders) check_zeroinflation(m) \dontshow{\}) # examplesIf} } \seealso{ Other functions to check model assumptions and and assess model quality: \code{\link{check_autocorrelation}()}, \code{\link{check_collinearity}()}, \code{\link{check_convergence}()}, \code{\link{check_heteroscedasticity}()}, \code{\link{check_homogeneity}()}, \code{\link{check_model}()}, \code{\link{check_outliers}()}, \code{\link{check_overdispersion}()}, \code{\link{check_predictions}()}, \code{\link{check_singularity}()} } \concept{functions to check model assumptions and and assess model quality} performance/man/performance_aicc.Rd0000644000176200001440000000506714257247716017124 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_aicc.R \name{performance_aicc} \alias{performance_aicc} \alias{performance_aic} \alias{performance_aic.default} \title{Compute the AIC or second-order AIC} \usage{ performance_aicc(x, ...) performance_aic(x, ...) \method{performance_aic}{default}(x, estimator = "ML", verbose = TRUE, ...) } \arguments{ \item{x}{A model object.} \item{...}{Currently not used.} \item{estimator}{Only for linear models. Corresponds to the different estimators for the standard deviation of the errors. If \code{estimator = "ML"} (default), the scaling is done by n (the biased ML estimator), which is then equivalent to using \code{AIC(logLik())}. Setting it to \code{"REML"} will give the same results as \code{AIC(logLik(..., REML = TRUE))}.} \item{verbose}{Toggle warnings.} } \value{ Numeric, the AIC or AICc value. } \description{ Compute the AIC or the second-order Akaike's information criterion (AICc). \code{performance_aic()} is a small wrapper that returns the AIC, however, for models with a transformed response variable, \code{performance_aic()} returns the corrected AIC value (see 'Examples'). It is a generic function that also works for some models that don't have a AIC method (like Tweedie models). \code{performance_aicc()} returns the second-order (or "small sample") AIC that incorporates a correction for small sample sizes. } \details{ \code{performance_aic()} correctly detects transformed response and, unlike \code{stats::AIC()}, returns the "corrected" AIC value on the original scale. To get back to the original scale, the likelihood of the model is multiplied by the Jacobian/derivative of the transformation. } \examples{ m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) AIC(m) performance_aicc(m) # correct AIC for models with transformed response variable data("mtcars") mtcars$mpg <- floor(mtcars$mpg) model <- lm(log(mpg) ~ factor(cyl), mtcars) # wrong AIC, not corrected for log-transformation AIC(model) # performance_aic() correctly detects transformed response and # returns corrected AIC performance_aic(model) } \references{ \itemize{ \item Akaike, H. (1973) Information theory as an extension of the maximum likelihood principle. In: Second International Symposium on Information Theory, pp. 267-281. Petrov, B.N., Csaki, F., Eds, Akademiai Kiado, Budapest. \item Hurvich, C. M., Tsai, C.-L. (1991) Bias of the corrected AIC criterion for underfitted regression and time series models. Biometrika 78, 499–509. } } performance/man/figures/0000755000176200001440000000000014414213045014770 5ustar liggesusersperformance/man/figures/card.png0000644000176200001440000012052114257247716016431 0ustar liggesusersPNG  IHDR2gttEXtSoftwareAdobe ImageReadyqe<IDATx՝0[v3`&fـr2JD eHUl[Qh,CV axA2<أ6#vk LPO=9v]]=?Z&&=z`'?߻<96@8&@# F( P0@`@# F( P0@`@# F( P0@`@# FX?;u/ 9OꜤS VV꥟=uo?C @B:oz;"pkwW `0@D­]3fLƢs޺_]}]u:Ќ0~o74L4W_ >ƥM@C]sz"NI='!*`4@qr ;`@Qwݹd^!T˯*Rw@;Ek \4h`܋z7}swu]O|{Q !ޢS~ޖU_  c[oO4\@8Bk\ջ|eU8 tv5W}_dٟ5Y!> -Q׺O~ -QQג@_f4@ sO>iگ*!bJӟeTH tߧ~TH t-180@s/2Y?x:fżef?G)Vf@cBPH t }!/  Yte  f?k* !sO>g(d:2d @ t-1YT@_ t#,7( P0@`@!(-vԟN9ܓT;9[xԅ'|g7?}K,qwp |E՟+]TϮΑ:/swgDuoЎk'aeܽgSIh]?_|~jvrz͙mc~Ʒ\}Ƣk,J:2h0 FFwtȚa]黛9gBp7_ֻbʑQ+gn)T%7ΣQ#{F[~홫m;~9kou9'tdqsm>8HRo:ѶO4Ujj]@eh6c<{K ߠ^NwL^+-ǢU_C_ʥzIkθ ~nw9 u̥ӝ"\鷟=E47V]7-\=Ѡ7mRJon}o{_4im.=|ҵ>|O&~f.Fw/y`c C}~}_: fJn-c#Vc|އ5w=^,\RzBcc뮛= WH6~w{?-D !zn9)gΒΥߙ;g0}_nkgӓiKn٫|VmӴiMiu{P0W~)rǵ.\D{{[|"z;Ϯc 0qe}7{X5c#}"_Mu,A׭ Tyq몗{p놂8(,ҿ4Mu*co~ju)Nɴa>n9o]>xGi|'hxm ,[>R |YUOuoӵItN>^u JSyp.>w91ŮѵŴ ~sf)ԏ]E lI%6-j f:5tJtHWU,tZ3u|NB}U_]`Yyއc[K\XnZꞦ{[s>`X}ݧ'+mia|7.r 4R{uGQ?,Ӵ=T~PPEH`Bݳ^:jlSki Ytk~Tu-aMa,ʍ{q߿vhy }{\}!ϯUMJh9>RNAcFLr.CRkK㺜BVO՚a&( ]ScqŅwTnt\t={V]ץL5>UX҂@s)u}ZWj>?il jJ Y !-cB<{+)бֹ+p $/$ua ^>e3e 9KZM"ҧ{jG@bͱbvniѺFteM#q·E|>H]3ƕ RRۯs(W98CFQҀCaR;otj:w76 k|¿ֽ^L_]}\w*ێ^9s[@t~.8\iUk/AbM6797rvĹA@e֥ u[/j޶Μ2{(V5@vx Ĝ>CwhkF}E]Ԕ>6뷪RzY{;..SREYa7h|_na{tk:9}u2sXLōI6-)遘,W{qI)y\ZES!-;kjb.k' <𤳄tQ[j<|j;~u~4\z?/=y^b5IoluնqQi s5ͲI5µCh\EZ@Ôf%k LJ?&?9""Nw}cQJ3lkO_g?Fߩ[WW?l9w]jlD`]EuNG" OE:Hccr5өZoOtL޴pX?Ww_q9'X|1¿`Goב=?]gjżeյr`TzXcەE'LҰJ|DmaXj VxSŊy} }iM|3KZReOn៮z[Q;16oXT}V=\UޮFlY^z &H>4Ul~@>\}O[X}0MOn|:W40ɽd*h7:ݡ?] >O]Ӯs:V>CcGn. .Z>tY}A{-8hC UU"TT?7-. B${b]8]8)$&\40QU߿sBsj)]s1p7vW^g8zMm_߽q[)ucQMM4>KWmir:'%v~6Ť^j]CeV*A]kGuSguOK[ΡISˁnꛮ u;V>C:]"O%nsIOQT[<&_{~?hi, v C7DSt םu0CIsMV[k)X]oq|łյjS+{uo[+籨>9dԗHeiQi.Z`~wu UmM?Qi꺉1 Y(yk]Z?]-鉴 SJqhγɞ>BL0oRj!Tƒǵ*7X`ljA4sQf^w{yJWUMs ]oz7|2jQӀ,1}8XR@?7P*^- a:v^sOjz_*tkY״UeZ^릱㡿' IjtMy |Nہuz/X&~nvw֕Ӎsk߭JK'Җ3݌xRC?4iA&\_*@=uϾ|\=Oy jwRGus!w[fjb-߫2HNy ԝ!OO)+d~j1Fg𹎣:;mX/scv"M!S5k]9T,4iwo[7U^#Qߩ^)=(]qL(^}ϖד*uCcP&=1ΘS; tM˪!q_*kY7%V*B` OS*3>BRv˝f}}P]58 Z_T']w?٧@*Ek.\Xk0aX1їs.ɪ ZVݍESYoXG(7L1äzX`5M-) F/nx3jMs8ρEC22`KhwAk tu~$}ϾL>tU{a]uɺȍCbMݧWؓڽU2P.b}@+屨:oQ8b|_x-+Rlp}tJSn'L=\2>/偒G}UT'y+1¿z_$1? C|5v-G 7, )O}O}ͻ?*@~"҃ǢV귤zg7{GxT\]sWOʭu|RYvJS6L9$cЬh؃5؟Sw}Z՟*AۡKoJA[K8$>]1 NB7 rX]?TG؅_zC.`@uf5xHuPi^c맕e.O. MT` .VIJW+>6$R%k! >sG:Mlq08ՍRD_kUk@2M'ƪS% xюe@=퉵B.T<}&VҠB'n!OV[nEjSٸn'p2)TN̪_XT~vl5ݣY^VU]Z"a-:>izaS)|Rj{roԅEZBUBeנ=^ߏu?ОeXtb\^>ڞXᮏ5s scKwy TCVBuo|~ f5mUA9z_W) vY+/>*&ש!U0cYRT(z;gM^S̾yZj@[!ֵjk'f5s%>}Y])}Rdܰퟂ Ī/DoVSSXJ)foF<к$bQW%LqaPs :o-Ta`)9JUɺBAn΁T(VcƢV<  Q<{[|r<_]N0߉4:'{bqw\+ [=%'ltb w 5 *,({yz-s]k[C+aNWin&X<^}Arh*'l㻝Y+Ki:6)i$kAo;:Yn.7slv:el:zB'R ԎYCF*:.:<2qtE\wzbӟ2:_/Xv8 leѱءF5d݁ڵk9P;ӵd4+S!X}w5G~oo,wUR.xX3`@{;Йj]QeZ4ktNd^:ֻjS?JOsDן+t~b0"/bx3 7,>Ug]"7 qv'Ϭirܓ+=sUql)ZW_<Et![ԒŚrkS.7_OuV~mܗnu9k8 .SJ)'6 PӁncN6fz>x}W`Ʋbj^u-(~pz7{F}q$n LEf`vu-H `:bޤR7J5{,rU |xucf@^'؇~os G9okiS\Cus au96 k}/deޤVU/LnPe?mq@bXG :.ᰶBMKlNUZa9cUv;A )לquoݹD ffZ3~.u@¹`=$C6M3ijcu;@tpI)Lᇪ콟asGpϾفy`]ndo\*cE`R?ķ )A!2E1@xs6Y/g꟡NƳ0F%ʏ,=yIZfW*-Nнw5?Wߚi{Kg`9bnZ&z[{,K ęYD%Ao, Y4V@]NT;Sh挫M¿ ~1N@rclt !X -`6-v:6@wXOUutm󺼑Z,>wJGuH2vu`[攖j>?Hf#:@xt]d5зjt 4X>%}(ߵgNUKv}) ĤvKAerw >k)NqL۟~ ;]>2j~ &EЊy ,%u, )tv.Z?ZOP~?rFŖsPk'gRyIpucX,';,sg=K׵uI V5@s홫8KFäӑ+ؖ[,it:hKWvVbJӟ7sh''$,<1(ilOh{*jt`@] /o7 r]Gl]쀸6M|J(#{cIШ^2Y< ^ ׵uBXv0N_Ѳ b  JXy 0*ٵg^mPYTn#t]ƺΛaRO3(kθ)ۭ.Ya0Wj9#U׺ȿu|;]uË>ˉ`vT<6O;9戆0~ ᫪rz՜@DzmVxv׵uOq,:ղ0 8cimƢv޺#`5 ,[5~JtóXD9;RmEս>>7/"%Zzs-[-Ii` ҩ\Wgs KoZx"($ 5> "]hXIUX,+t izvї9F<7cN 6oߴsYm0S_Uν;eZZ~FX)k$IVFWZU'?f3M)׵θc%LdhHP} Y?DeEEX؀,4 ?o}sqy8)vZiw5hP60SUtqי=Jc (",lPZ?mز@'wS{ ӰR ԯg/r>7Rew16@0F1 `B2է#>5z'/: @9C@Oٵ>k5ZN[Ҧt)LE|E icQXuUF`btX"oGn4kx5r:>:ixNӟ @&j#U=AzSH}(69܍9"#E W"tU2%N'rS{X >;w:lSU~{yY!e_jCuڕg_K_c%e,:Di&߫ MJU%gpj!z tgr >׳Q'*vgU\kJǐ\>ּUC69@)ʏcL[ |27![}޺lܵg:x(1eS端3'72 N:g>l}s 7wiuPn(t-0[={QUyۂy!7-\]+]z鳯kš>^EX5upz2pOGANvwx*|\>:lԛ]wV6&jt K'VUƾ+3m(|U= 5޺X8_]Uyf,tpnj ]{wF%1j N^]ޡ߿snss߳ D{5ȉ:4d P/]z:IGJp)hh|pgP_vŵœMC~dsІonXu8M羂}1fY1ВQ!?l! RAcQwhpXU|cQ}0C;>ƣ@` nj8SŷmuvDI ^]`e6SoNB?t 3W%y=uA=3a j`CA`̇}a~UHH1mu]/A.ϥz鸻hNmF;`,j0 >C6GjH/5갪֟)=QYk?Y|] J\wz]1mBJIA8OmfɄкE{c0oy}e>bR‡A]{UMLgcїɣbW.۟oMmZ墨n G9:Y\zqu M0Lײk}>qSIu1Z!ho?o=j3VԱ^:GcQ+]/̔.7%5u_pիun{p"DpIAV;ܓO@PS8@7)۴?{wwudw;?@V̻?Ppwoב=G N[55XUz a@G{m]pڒu>xЎ3pձ #@YnQB|9ksS?L!FnZwU`[ASy#@&i` BD! Sژj9%OLoO^ =sU^V[w@>:" 5Yz; @DJ1Uh]} ЏIŭ+8l #3v-_* S ۣ;?Sd0GBA)Ҁ-^_ꚦ+ûI[0韜{'OͯA3 qOU5mЮ=ޖq XϧA SZ ˩ `({3}^_^\zVyբ¼^=לX|4X쎭S]H5q t; 5@@?/iۑ_ @ nS;  vX;7ybB<`i{@Uta 5 λ*Ԛm/W/ 5}@m1) Oְ)ijBI2~@wnA M~ŷ{@M#Vs~"07m1ف0TMr`>x69ws@ ah?ܗ)H[4=XU@YcpOpb`[n q}W-)ZJ2;n[Hu s@[ʻz/|~N=`6&!]`%snrޓO>{Gz?|wUW/^ܻ+{_}o?0)kv ,P鿓zu`}gaKuhOm䄝' Z[.a  >Tܴb1ٳq?\M=[vmo}߯B]QTUJ϶~gD @$`\W/+ZWPS4 ew6-Aω{KrmƶX F[dIo)Jq$׻ֳŅwUmh6@|T&2ͦ (|ɽZn >M[hRU΃務P @֭Zj4IyUu-[z˗/~< ʓqP0 `SA\5g~9S|o1\/Y:gqߥOuŞ۶mRXPUժ5.Z1RUv Б0)Ui=x*PTm9@ЛzL38$BZM~hm?y l߾q,ܽ{w Bn(OZ S׉ZjVܜ@9Gf]h<̫UjG_knB@XzLJS}4Gn`W 7)~v¦ >^knذ0e 5W!w?z ]_?C:Ν,H(|՟T"Szo:z*+]S0ޠ>vMk)ػZ,dX5T* C{NNvFՁ:z:Paqa ce />tjAU~0/ XpL+-;j錃hq:.ƒhg!+Q Gז cVb-%@u 8 Z[/04ݴջ$3)Fz' 6MvUR!HyBM9;MU[\u??~T_r*#=K[0ӽzVx߯즅%Ǥ~7ni|U')DJnءD 0eff&رǯTYw-UeŎٺ; $GՁWH6~w`v蚀Sw[WUd|Κ"?Tf?'|۴i5 "\1*T e 1VUƿ[UJi]Eڵk@MU0UՁTi ^7xɽ^vN> 都aWEPJbU2 ~zߣ5φ p eI=Qo*|衇qP PSU f!@PZ/O;ϵջ~[Uд5?J U5)4~#_Yɦ'kϼM0 M;ZNCԆhe( o[UՁ>PP;h7]j]kL.1|=RYa韜_U-ϝ}h^U_\?jZNYPC GMt LMIn{'7oZJSPMz65kxj?#՟NV?6N. 1MokR0]L1T``YUP׫sU.S7WkYOUSߝw9_ >V 輎-d.[M4K~ޠP9ʼFrZNU O_=2o_ -Omsӯ^^Vu*S(8n ^orW`{T Fz˪ L38Uc]? 5עzJӁn۶-hJHBBlMrWԦ}תE 6[0H  d"tj縟IBUoz or~*4}o7rES|wp b2#1QTԧۮ7]Z!i!Xu}f4Uz_VMֱ$^RiӔ_DuM4LS\B)4T%jt4@R̝2w}v]; @!|G=F#ݦ*tSjiC?KLTD|l1aDMSp~x ~?f0h |ł(nh#q7"TjC'鿎iP  6 *4q>Ǹ4mc4]9Mi_}@{5=MӌCT2,OU*afM  4@bΨ0·aU/&XT16ѭ8LTSچPxhma<[U6@¿\5OX`'~LDJ! MyhCG!eW ?<*?L%Vuv)i+_J 5$ *lhZqqߦ Q;VĔ򮏜jͿ,1H $Ddͽ^qZOJi*UW p/=:)|=sXprUWM==LW :ǬwQߧÌZlM;cNN,l 6m4U刦jӚl1סROE fff6l0Ru6Q8ȰiĖXܦiMך¿11H Rg}Cp5m>+s[ @ ϼjQU12h*5]7 ԲOTʭA1ס5(u ֟Q^Aa|W%(GNUݴ{v*៻H д}9n>O/=w/_Qտl( Z0|]hzٸI Jo^[i93Dܖ0 _ˮHC)_U7RaWUFji)T`0%8O|6hPsQ!ƍAgN/B!,cZ:'?Zr964MHA?UG7 |@K?wVAg Q R5]+h>jMjTٟ_N8Tν%tUURi#c4ǵg^ݍ6():? MGR禮-= d 0im8O~C0SUDU\*%>4Tt N)Ss<߻]iZ5g*5sSoOέPl*Gu S @^ AAaB?UNMZ7T8A#!`80M{mZu4U*ll҂;0}>ޗ,Y2rS{!v9 \MmJT1 xGBSsJm"L7VTh@:(6FF-`H|iϝ7R֙Tş?k֜7x6\WԦ9r'L& `L!K4W(,ȭ)H=X\oe&7|ΚhX 3mPͰnʱ@}vbϝSXgj}:FP;N~N'6Ԧ ǿW1  Q^:PتS-5HTڬZU3|Qʣa™Arh@jM6UѰ3לquri41R.]g4 +CjiX)a 0LA~_UTl)u5qHO s_w4W_}gb"ϙXl߾g*p?a24WFm߱1 L@߫w~R\_$MŖk4Wh6sRM!kMBSB.5QVֱCʐ_M5O P'k/'Mhs E'F_ a6oӱki@?K| EQ j?gBy^[naIF{W^yeUbe5_RaGNJwLE#hcU1M[ܚ K簍D^S}/?A*-BU~;J5UJKDSe=pJWm UIuc&L`%U}Q-v_5:(x,>7gPiOjX_s9b7Zd7._~?M}׺9a/7@ Afג /ocWߎҔ(ljWڳ]Na]*5uT!!G}uD~ZJUT%T`Sիv*ׯ_^`e-{OC ^7S@D GB@TK3DRkʃI`ZBM8i ƍ; CNu4 X9[1Ү#{8Ka}O=P ?T缹(\z/|f A&} ‡vv`2&ҡ!^Lѹ1OZ ش1+os|iH Qi/r_ `UMɟߜM_}z 'x&MaUxZRk[rpŊC׵t.vY?zusowoO0Eo {om S8) $g8PQ =bzGz_|qc_jݴI(T3:!UtUçi_3ȣi=Iwnڴg)]y\Z\ڀ\K,>ZvVh 'pq<݃G3Ztz~4nF}O᮪Ɲ|@!*J mpWa /`ZScP@66$7wZ}sX/w޺sW璂0˩츭*ͯ]o; Q 6Wj:Tia̡44۲Som&96 #=K[ATѢ@Nzք1-S/a W6@?U0iQPyσWȢW[ ^Q)R׬ukθ`k ($o<uo }Um =m>ٝp]'=l{Q{kŜ؏T$~QD L @ 0@zOO]4C!C[N B*t\ [O-NUi@_I(n={wYש+_9NeSG~/nx. b4Wy D.n?u av!V2F7ZT>hګTUvP߳a:bq^3f?:z}TjeJ' C"OĮ i.? 㘴h\փ_;6UDHe0WΪ݈ 6x`cI TSxY(QPdMFTȠW}z-?1jTs*̜ޱM^4>l{~ָys$!DQ _ZPpGq5^_kc-p2b?B? cn1Hkк5m:w}6qN8(W¦9Ӄ`AT*v4WמygPBXe!D1RzVOuCIڠ QwE*?5͔xMUuSϧW CTn lM汿5 Pg$y]UbjW}y[󻾧1@e:C)Sc7I:^sx#äBL ң.rb![Z#!>mJx*@K *~qlWoGSJLzgߧ;@=-N\zVVOU>Hܝ8wӆѴi cri\T(!s4c"~~<yy;5\M>%l/LJDi*֓Ѵw~yw S<@k?톨sEA4 JOp_b݃o*IPԔ<+?]9sCє7vr}:*-4pq;u[P|U*\|衇R;쩃&B`cJe)Sgr9G?-MS଄cs(T;K4kYS%*Uh]_l(+?M:P-Z1YSXWo˖- ݦJ܄"eF&>@U҇JTX9hu !A`ݠ@UOzO`/P6@G7QoZ`7S|U7j:ۥ?wZU*Hܶm[*k iKjCOU/woj%%U*ѴDI( Rƭ,ӹTZj?yBUeWn[<89U֥{aC]7W_`…9/{1+ꪫ_}off|r}JӗJՆ@SU)Z0"DHQäXU*%>ҖP!yȾa l/]=^ PJ*C(!|}^Ʃ@ Y?,xӣ P0Xpt>-I_ڜ?U޽ U7r `A5F"Sz &5TUѐdõ^ Y۶VjczYy߶OOȠw?:@Qwc=UGv4$0Z~۪zcPi9PM {4hTy4QC@AA7f=ΥrO'>v:UUFyᇓx. ԟ Y]Lu j6DSWryU6rȝuj/EtViCOV>Uh(YN$=? {E۴Ǥs{JRWN0?]4mY)Q/*t ν? 닍粮K(yצM:[O$?v;jSI)Dҽ:] $t`}/ϧB$ N wM)A.ZX_fF*=S]T@$OwWk#Mg]I~s*F[qvuRHJ (.=W HWs? @+z]~̍f4&/\xwmbފ{nSU448FU/n>1k8R!< 9 Fb|b7.MacIi) nT8sp"oDAM=, D94OoXbg4H똄zD]_郁{7ngۇ{xX:C|ݦTE74!F mb=0RBTEorJAt.*aaHӞGU=Ra}NOƨFk% P%;y.U) 57@Gvp:L֮]ۉϩsÆ *B7T=Nӱ_0iA]O6=2W|%倳 Y!L $@GԹS,'Uv 7+vZG-im3cw%{+鸗|G7?4FW:Bm$@QM>HqW` Yp ¿UVi߶qvAEKlD ^UF :b9+C.w 蔿w!DQ!n8f UJ!)0+eS}@Ӆ r*a6Z_USxq={9 YS qR!IS7mV h?^ǃMU_Z~s'Ҧ }\(1AmuepZU8<dN!.WOtZH^ZiS HRZg됄}L.n d}V9P?Æ* &(?O@8كGv~j/wRh6[B.;6} sp<lPJt[֍EnX tߔ#U`U{=?K Falu~{kЇ>4o^Z'Ӷ 9Uٺ1Qmu[hblAZ|:seX jL昤㒮C$6cF:18[v_r\=Om[i2yi_>{)MMە v 2( K0-.χ~C[&ca>8ykݺꢡJXž#ZMTogc1ߋng.?%>,? _>V)LL%LUBwU{^{3̻?_y/҉.g/%(P:Y=] M5bgW *\{OuKu~S|OB[U?roBH}PHDT_ՠT*TWX$KW}M_?V3]Mu~Xd-]w;?T!ځs<8ʿEϭ=ە ;X.UZazR;*(+U4}m j߹u&J ۳(i[~aGc*¶+-<`ׯ#߽kAg5!z{:4 $+9bP Ӧ]HGȐ ֕ʯ"}V%|HeV"],zs$ yؗs;cjWn]^r hŢ+9RD*tu:~j}TUIcTuQ}_!]=uS.$.*Һ L'xc^_2zunWR^} /XDK\Wo&]Q.$h髲&馃&إ.:TmY] G:h¸ cC1U:^67czOŅ=u"V5BmwxCUUpBUaKe]m/ [!kg;[{=k|nCS}C#%rƫ俗K['N@9;bn~_Aä"y8aU0o$ L8Q~$Jʪ Cl7QW`Ul)YɺG;]"SuW}y+7 6k+C$hW\,hos}UkNl@Nvw'pmnuןZ=XAr3]~! u;nuW.(zz|9BVUEgD?L]DYu>L(/ukOЇt`HuR},ߟco.سuyl?ulr}L*XG ^\=%O*onӃ6`r׿Pv!AS{EU==Κ16yMUS: ۪M*]}n\]*k4<㫇j]Z*od;IRe$9|H/w­&[i d^~GZ;@ :L[*Z"`ǀyz}ugy-v ߵ\_X3`>YZ.}z/o p;xtYGuXPe?`T؜_`?Utv8U!UW}+m@BK v۳}K~n$_[) lve0ӅT Kߘ[sK.=I5NUP/u~#G-밯6<%Wdf>sfHu1 Ԑ*Ou*>dbʝ_볚}sl\z CZ XjM A{*-ڟ%諢+%Qq4 4+1܅ b`PP+9HʤxY'Z\Ur3ЗTK+}u-^8]h aCZs:IoMd:~R;uu??iO C :I]xھL[ suǜz~Ҫ$ ᣦy.]kےDjU`lK\uLR4(C9N|>IU%𥳐mP~!3_ urM}e{h(]ݽS>oȓc!l 1[r=; Wk>5ՑoQd$k28s|~{wA)rlZNrP=ս >I 3.JE {両!~eɃjBӼֹ7H-Z? W2 J?Bee6ULZT=TbtK c]_BS f!^[XS!Ot8odd?,Хz()yR!nSr"0@h|L&OMuU+J)y/!r]}a/KHKOLvpPlNҦ`ILC^]WSr+%0SV_CJ(V҅!UNupݪc|*ׁIBXMMÓ?z6_9 ]C J Nxu\*q P dj-91Zwr9큇ZWFT/H;dIւ:M 0-@/_/D"`.kJIJV`mTLA){SX}.q҂~,@ $LעV:QXڗzG3P +@j`u>pE }*%@9.ǎ, ҿ?W'KpQ/Bqkq>-|Ν?a?eA^&10c )R;*ao}CoRq׺: ›}9˞znva ֹr+} K@)RTZ)LT9`j]N wۣwoG49WU\ ^r% yة| ~ui U{'ZUh}EWzA T d`a'%i]j]δHӡo0S qMUh}O~,X* tPBk\\EveZoVI w›+s0ĺBzkJ=)!,=KZ[][ަ;S+pk_z50U@hY}S>pX:II|+ o~a6/_g`ГMOD ٯ?2LXwu&/R ʤz%JQ?AIjOj6TR*c!0P}r" %L;pN'/.ٻ/<~QEzuo`ТW o *`8x}''N~l"G_{ʃ /~iBj%T N{bcﳏ_%\½SI0aBU~>B'ul?:;s{A|RT&,`Qj8f:IB+j?wGt]f &kߓRwݝsE¾EGOJ|{r" a[>#Kز( @hI9eB߷껬ү*\%Յv%.xZV| UCBpI@aBn<@h @`'/wVע .l:(mgЂu' +^}7~e0?eЃ̿щ5{L @h&d~cWS\h 纶am0 @hS+ 3c])0 ZaKpY1~%\xQ[;#Jvg`ziq–NWL 0la~CuJ *4#a>g"Ф Z¿,:Za O% 3_t -df]%퉗W;  5 ^Ny@aC"Z`X&O/P)m9 6I[)/;e/𮒶>!2䢮R˚4i! ?Q??`&%g Wk!BCt>wyp둵8s L}L52K4i ,]{:-BCM&NP { 4)Wֹp@ 5*S 2)Wֱ h<?XiC`L R$r?` EءLf^4n|ڑY{<F5F?ՓT7=! a>|EءZ|oZ{CjjVǮA55o 6iM?> g2$kuuwF@54moic^rؕ{o{#[9q0Э,o {NXoܴ{U{Põk4U7 0N@ኃW6h*aU.{LqB ijm2MMsa`PS6Lk=0qޢ 8|숅 BM0mog`xP&@~*aֵ&΃ &B50-qM xe諾 BTļQGa{m`wm 篾遆V3M8 @`Z@*V$Sk ?C &H ;k1UjiZU}?o~EBCT$;sQ?0Mny}`?vUcdU{& |K7ls[LϢɿ@9TҤ/wr뗯Ir*r aCV\xN >iɾ~ l(5 ?;p,ze -d榭uC  "0-@¶u S{({6ؐ&@ml'{O.>sbS]u@ퟹs *I-H+՟:ϧG_{jvzL K_)ݟЂ>vdvW;='>~u/l{A $'ܷs~oXȢ!ۇt'(ݪIϿg$^yCyxR`P0?tB𼄄W e -''9O Pi(*z qao‡;U{U%|W6 O?%=,K|}_e`|/ACN8xju} MoN @E`S0aLJh`` l| Eηz˅:Շ}KT>yߥ0 mޱ2 NTNvӄ*w%Ի呣{ՀZqk}֨T>-B|(a0TE27B¿j0P-R4VU*K _Gl,IfR̮¿j_ϺfRoW_ e@`c*e6f?u@`c WߴF*UUWe[I;twm/OyJ,yom3Kϐ` `mUoZ[1`V_VgPZ O'ﻴ/~NqߙV߄:R$뇟k5I [Kqu M}Kld{?`S@vPA V?'&@+T9Խ'@@kEo^z_ hDF0^tv?*@5*?u`vwMǮm̞yΓ #Z ̇qխ^s{{B&߼ܾcЃB*l0Lh6`^mˠeUӄ^|' Lh.(âO66¿yՠU]Zf~)A L؉]TkQ!`𯒀  {A` L00n@`'ڮ֢B6]`۠O`Z'0^@`g a]A!c T;hsa٦m]"6UP#v0JH.(ۤ _ .j;_UH}uZesD%{[tb,;=<>I(vwޮ$l+o}%{{.e;Eдnʺ6?PlaUB*=R혀G>{=۾0N@`TNOBLm {[~m I+^FyR*6h^cf %P8UeY^³0*V®m I`s00OܽU Ei aE`sKt?P'N = -@۵KZWKP8zᾓ{g¼>Y_ {]qJ{ |[g=QP$xoRŹ?hKWPֱIL(s<62\U9L`3 6JJۢ}emܻ:[$DN%D; -ޛnU-coON%ۦg&\UTY֕L^;!::mL. .=Vujng01X ЋyMv=*h`NHzmy'6 Ћjouge(P+ǥFҪlcT$4ZWaA %kZ=wʪpnҎ]ŲM|L+0 zi[oדiM*۔;ghAp@wz/<}~`S=Ɛ1hz?UN| 3(MKZׁ\BǮw-]XZ!*@(vr)uwmG{dvǶ ʶl"kU(|Т} 8v@uݴ<۞ F'YL(e~#W &; idMkd}nyЖ:.$ S5l~ 2NZnk™|M%g疅f;gP2k$)aZ&UO ڜ lER I&/*<v'7X(^[CiZ/]\uxs>,C@ϳ]LmTZm$}UZ}ݤy~۷3=UȚZL&ILNB'ߦUkiG[5ঁe5]66h`B9[@`p[u, Jz]ڴskÿSM)$lI J0Hu۶mU82MN/__on*asڂW=*LY`2"U|=~vߑ"N}Me?Nu۽l Ig|}+ܞ?0DC#ݶmgO$ nx߿OxֹKA`uyRXlG@Uu\ /U v6խPLɾyPSȬ\&@ 0aKb)U[m_)mPwjC 0P+*ۧCFCto \`;@Ts`K@(MUg 6'4|%La!,vLX!(F۟_wA ?ї-B^㦽/< @(M'釞kEe;~lGe}NUM[`BX6<%zOn{􎍃2a8mp27~{N]ڰ^z!cvd2?uk=U+ 3_{['|\40Rs.p6Kp*~뒀4kTvV6_|Ϟ] ߛ_|tN%{jBZكp*)Iȗz jˆ8E0W^|s Es+m۲a5b>pT~y2 F$! okr_8h([h]WǼ_@U⌽ -t/*@`LzWxWjvav~!7=?㣺/>fgf/x1AϮ_-0*΃a=& P3ߙُl\׽ڧ _ߛ/(uy0-@q>1qnwGf5_Nz1 3ߌvavt糓goxA'sɄPc < P {U/2{ (R7C уT`Ne`ו>1WY`T[}gjo-D잽ٱcXQI p TJxJ@gbSdM-Ugl;hCUߣ+2ٲk[vZOm\+~q]ABEk-@oȇT}ϊrvgeGWΡj=R6,(^O񅺱\=[KuG1VTyz袋"Uj(|b]Aꑼu(/VC ݍ ?jztU/،\e|PCwU^f3J'?^qڇo'M1^wleu@#WNٸoe/?wsq*ϷV TLFjk=5zVPjP*shx&M\kC6$缶Yr\7ER ɍ* #gCL1FP-KQqz^r^Q.{({Ð >Y辢k91TZtotsK2XP<=ŭj5t6C=իΡi<5Pj@ i@5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @50Į!P$Qn@ S6!`0c@ ScjH ?>PCʄWR%RBjH_#L PCRÒ!@LV?PC) xjBo u@ NM!*U5c6J HL{>ݚ(L<&^}Y,5f615$PCPfN3;j #i `5z\KjĜhǶ\̾=\ P78E5f9!#]P_.:ڙ5dy#-P7g{ 2+9 ~"r>P<W\{0uv|40mn|X60e^أ!!^ 5p\aw*& qLz \e@ l@$+0I&b)3x*Z(-R:*KO %RhIzjah {!rX P+ >u1pTr jU7%^]9}woV׿|_~&V<.mg[<-t^NW54 u`$XOf:b1n/W]4Āhհ:~WwN,N40-/ȡ:GOb&_vWe#!-? 5no]_'Au+8_Wn̷[=PCb@ 4f{RNx^ΊlU!L ^d Ь|;^u6m}M7 >`R%%D?XQa^(9:JĬo;޹CgA"@ 4Xޘs5ԗ),u+da0PLР>0<|0SC選>ʟ8[{RA F ߿&Ћ#S>8Y!_kD 3@u(9|/ttDa!^(=>}C1x+y:>~Lp"A6z!kxB|)/S 9_{b0j٬a~^~a^nEĕ'DeNB s@z\9YBN$򉽝zzRja"} 9ѳ PV;\p1%&i\9K A:{˗K4 O΅^@ *tlgPFh:h sw"qRjGk ZCD%0vK-փgDD 0A;[ $I?8i5`J.)ڝó51k/i$ܐPogja>N@ab@ Z^1Ұ{Pj0<`j1å]bw0=f,~0I"NI1(qanaR@ vftn O%ar@ Cf:+f'P|Q!*P 34jpC|jǦ^jnhR% "5jɨ7L]mnhhF p4:܅5åV@D4iK]7ؙim%UhnPCSCX7:bVu@ -pbO+c Kpô[kẃw<{l@@ 59T_7w= `nPd1aX%aR@ %͔2D}5tľJoGTyC5PfB n>0!dtPCn %֓ 7rMJ !rWKa!<%IJ7 p4L n1 :AOe&nZ 05M8^`ٵ|[R NxjplcjN)"zh5 I58l+R"Vjjywj0wC^(`V @ nf0uCB^(05`(2AKg*5 7$n25 t50AͨJS 9&US'(X\(͠dP[=ZR5 t5%mjqCbhUQ\ WV,[ _T|"K zTE53C+|f A0̎GM7e j(bHHq Bՠ jؽ8'3\TtV,R ,Vc3$LK1>$ 5 Nبa^]CRnHEAg3XL(},ܠ(tݠdjitin96Vmcy AY Dr|NpGu`8viCS_5H#u:ũjkubT| H)b<5h®v{Vnhdio,M [l7Habذ85hLq~iQ@ X4ښא3nLO l0gij`YNODJUel0gYji3𙨁x ?1`̢J'ǿeې6Qߗ1a7hՀnC fPA'6&(ܠU0`1jk^\fnAܠ׀YkADݠ{p ԀnCxu21B Ӆ'TgA?`.Qff4,D :J5<`n0:uMԀnCh5 Sݰۃx +oQe!`4bO0<:@EY)`Qp"ol5 Y(QAϤ3(Rf ji0 {7X݆tY֨W]YśCok؞LԀnCXN\ j:p0l`\|3݆,A : jc98d>efG]P15'BG|!Ұ@cR偂٫:վaW fz9>C5 S>`R3l@!$sWז: D5_b,qn08kFkpq,Š IԀnC8ND K|{Ac?ގ4@!3WF>aPX1rdà3*u^1{5c.#FvRI!j`Dy@iҠ԰^h:xd]Ì݆P] +4(b wUtĬi-tv{8\olw>U3W m_ 74C2(mœtϓm*6Lyu50T Jx8j`5>d5Tcj0W*4``͌ՠ'4\uŒ˝{6ȬՠZΠ/7I3iW : C5̹ n``jp]6Y$䆼65$rOFM}MP'DM 6}(3[5'!nC]ʌՠZi` &qC{ 6ǂ`TNC'QCOn0U6gjP}Xtj`/74Ы߰(X?_0djp[wm oVEtjЂPO3$F>ocj`'!p4:Ey(LJCf@\n]%n07fbw50F8#}5z-ԀnW҈|N"A^%6(?cgjOj.d1W5(IuF(cj0*'ch]vݗ(cjO=]~Hj_W)QLՠXPEYnCJ!He4:Ȣ{DFsT$AHbAc\)n2 '|u",trCm ԠbO46TdI<58A +EV|F3Ts{R!t\-R . D۠jH!(eqjH$0)%X!xEFS$ B!BQಸ|´@j0\Dt AFP8^: z m0$tX\8nS) 6$V|=m}(Η%Nt߸rzSjP .'mFj:-w!Y',mHY oWQs605'ɫ+pBگ/8XpgWNUiC |>a_G7ĬT2Ս.3wgiƷQt?X}hu=bG;y_9bRztvŊSaij0* N51u(!˗Eo#Y$pY'VrzJN(FHh|`*9;v̭JK(򁄣"35d8S/_Xlim 5K<{1 \KmdkQ'RVC9np@EǠ<հ(싿oLMEq!v>!^sHZر4.bm'*537!9,L F%i`0H|C wXՐ'B˓<  ǃ\ abc:R 喻8}fVOQޞ5d/N9弆ȧG5חNiӼԐv>41q*-Ó|dQC&b6~k6d`u{o6 j>]G1TēO~I30挂iPC/+=xwj7N'pO;G Y2 .5ט@ai@ 24J2|+mء; |$Ufd.iF5`VjXD>!*b_X# O!nF5jh>Qv,K;5Ó\25$OɄUq-1fV1ۯQ$@7NC.nɪ5jaj`4PCi86Iu^B Y"NSy0C5C\77(I s'7doCiz9nmlHO /gb[B65P g5l]1|ޖ}1; $espK֌jj! 5X+3C݆l @PYFf҉έUjh9?TIuC1t]N IDAT: THZlyiQQßUGED6C~jg1jPѢ 14f_%NmR%!]<nfK.C30*/)5pu ! v, ' 4E!e櫆teJ uR6ŝO~C S!>)؁ yA`hY {2)ɩA P;PCn3dZE*N:!{*d Íl&Kj?Zi NC3jp˧:SWGGjZǾWrCM 9$nÄkvXnKN kVo)BоB1XW(OLI C7P!=5]|jk诌y '&sͥˁu]7f']:!+_H%LZ t/4\'9@ kxԷ ~! q R9 7LI 4&5070kE΅3TC~%A;=@sh :@ {Z4'<i!|>+H; (9@ pCb@ 5pJ "A55p5H0 5t~y:AuHL zfNj0TCGP0U 'W ( Sb>*mVF7jP!3$003>bNj `ÌpIj(>¨!_jP P"5B=9Z I6655JjZ*з>A0ז!'WCOt%йYj`WxS"A>QjH^ P:tz 5~jP0i5Ӟ&j:@ sj'&(+`!j=!g )ߔq )u}J5 @ 9IAnE ]v,55Ğ\/ڭ;jh' ;S 5p5̐^n諡?0f}M9x%MW Oy=p Aj 6{A0t1 ?)LZ3>歜C{φ$1PZODT`] 9}9t 2Aa$Pܐz[8~TtҤ?\jX+: ɨAA katR%îUCCuZ݆i5I aRC(FuCK =;(.nWCɭW7=TO߲?dBnԠ'aOm9jОTA=!/_)2bh_]e& Ʒ6jo/e!֚^йJmfs55l?í:%xT3T-:OB "h6Y _mP -; pHfB3Ш{4.Ԡ' 9, aj!5xRZ#&k(0!2C5_QA ՘ry;D ºW?D p!j>5h!%v;AOƁN@ :1nҪ(a;CO AF!VW u#OOf C q&/JU >Asw0wd;S/{K[ ND  N `f?Ue܆6XPv0CjW>n+mU//e5ǸbuLGiK5zOv~ڨ~FbODyxaJ=!G'h!D݌"15l?w.ŗG _n~~)35GE/$qήܗZGǙm54PDT ?k}DSy_hݮQx]7X~v'+R6ƎJ}=:N[jz.D<7x]PCwfXK *p+(MZ=`|B۰(RS&/lUW!$jn׬|zL;=}t$"MjԠwqm%9 )uΟż{\S^T!ɨa]klN R|SivʂUxڱ!zh]pDYLQ(͐:W(NՀ+}hU7UC]~8'Ի4D}ف*C_ < Q y [r5`^+j =μGjHrZ!^ QeA# M 5#yEQ$9mh$E[ ]gydzA١؆X"|-=ٍ8X<C Av2\z C`?˩q{<2O8FDm(5Aur;r(3I!OVSTJ!"l'7A끲C5õDXh5h^c85*@qj:B&m3]FX!CMxf dbK oQ;h]A H ybnjS4êaq,N vmH֬\nșƛCi x o[>MηfqayO o R >.R71JaKN I ^׻y@ FDy=n㟂R 6` apM)>wq*R9aO.娡iDrSK1^CzLQ GgWg|廷WX ZD/R<Ư_D4T]_N>uompLQ ۫>*AZɓ l_<Ѭ蝆:X꛲WC NLQ o;R we?~gMDjO*ϟ|Jm7܏}K*ȏ>W8k&_7_VF+u Pa[7gr*3)~G/qՐ5+7ԡPNݏ[-E%;5عO '˂j1T}<,Ր֛>{vw ^Zu re ?[mf-^;\ /A8q; -3A_Eju[VYyϋ|`ޅ @2=5Yӹ)5ND>t pW/W>}DqSdQ[ ܖ_IPv92}BLTnA@P yRCQcy'D ګm|'63 _}8YSC!pdLN eoAK4Dћ'Ek97xPg%Kꊡ44rj\ ;_$ZLM C5Qk(˒4ڡ_l%r;7pF|C8]hE wVw/!XP TJ᠚#}}l7!E+cR>feˋ{KVr>n7xppK氺h¶[W(W7j8H(vg>V=r{EsR6?skظ5 a#?C3YCq3aE!k<%% ZW#W市7#K̀NChvCXI0: Y P/ Q}9 7Du]`hWŨ[g\ !~ ΂iRW 4D`9j` ?r&3QCʓvCl5`ѡ}fb4~z" Q6&n-&mĀNC-,Y7DiÂॉ$G[(,J ^~F qo ߷O (Yt\,Yn)%V3xЀehn$r~f@ɢԠ dF%H#Avb8`/,L qC,!0ePbIEJtnP05xlki!c訷]̀t"SC$7j`O&Neijܤr."w !.SVԶTWw',P >Swڄ`mt<5}Y7DrĠ X"!ەd,P [XsvjOr%A3`?f?~ ͳ3dj  POr?b@:T"'NxfjXr/;: YBa9tAv bajr̠a,W npK49U?1fbՐůO5Hk`@ P\5nP=o[{ao-ĂdaI 2N$ĢՐ'5 PCnq%bbj옺AӘqC 3djH ܑ̯Z5l5tC`9p5ajw.^5Վ !?  a`5L!u0Z+.1WC0d j&5(* 4jPr)#` e70] j0!=7(ek= 3jXSڦZvpQξ3$ H Æ:` 4j4ON7`K5m2fH!':tw('h5$K;A/02J_#ՖCn9`p.a@ I0~ `ha1@ &4ZqdX/&@ 5QZxhR -0fHan6;m`jh r ]NfX 5^` 0C@ ZlbgCw`ԁ7DN7ˁW ]!yM1e7!Z2 zda@ }bW|j`C ̀4;lj73j ,r`RdaB@ Fm2ͤG 1 !2Pa@ $8990` 5L j m&y>P 㶜3 enpSCdf 'W5pOf*Y` 088@ L j@0aKMFj,!u`P50mi܌hX !!%Q`+5x0]5-6bw`4Cj``%!%"7t 7!.̐P Q H&j `~1 jŢr &j`51 5hc~`5p*IDATxam1:j`2xj0G8誁j+8詁s2QB 5aגbj0>x@ :j3`TLmaVC|1 I5c۠`TC@ Xi&9hF*6pD0C@ 68Ր`ph3LD䠡5CtP f !WV Gwzjp1`5bpaz@ <05}Hɡk1pyf"P\2 nh {ՐQ [$5qiT\gC v{WSkXDh m50]V0V7j7+!)50!LCM1b6P;~B7~K75hԁ<-(H)a 1TK P|ޞ7fAO=)=@  #nVjH q{2\-P"'0DH;(#D!Y5'Ɨi fr%fС6N!5"ؼro@(p` 1!($ 0g `M1",0w(x,Q /,!23|. 5/ /, !:^?ᅅ5y9 xaY@ }ܿ?/,!8c+%58݅E5$KD:G4t$qKǍ5ޞ"Bή]9}woV׿J eWk1\z*PCWѝqL!yd1*հ:~Wwf0QøB&^/3<:/+p@Rd:j @0%ڡ7wl>(.԰Sb>xŻۡ~t6]쯄ozH: R@ $ w>su_zgߔA>gߴʌrGj(yO`uSzg%?HCj("}r:OrMW093ZPP5LJ1Px '~IK:@ pT*j(s~Ȅpt<I@ @a# ~}p[\9}pzg˜PP5Lr"Yk(˒w6?-ؚ b6`m*WF,(&NugU~UrVdL '@E_@aFg^_| ՝=cgUd^!@ @5̓U3k&0O Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 Pj@ @5 _!IENDB`performance/man/figures/figure_workflow.png0000644000176200001440000024256114257247716020744 0ustar liggesusersPNG  IHDRn+`vIsRGBgAMA a pHYsodIDATx^UĎ( v(/Ew&jbĿѠFc jb0F1156bB&"eƲt*("Ҕۙs={Ͻ3s̙gvB!BIJ)B!BIJ)B!BHY LwRB!Iݧ8of*V"B!d-7,hfyzL'T7zEKjRB!t֕/2otϽ;ۛXxwRB!_l!fzc,%]7z7IkbRB!">fAEbo%yz{ZE%޸|u* !B!$i_i{T7qKSw 19fΛEXfyf1j/gnAkPJB!B`;V? I3QR#FAGѓ|fs_h8+t2oRﯼosJ)B!BHTy{UYOJ kQ3cy{nnSثyZC;"uLolo?9rJ)B!BHb6|t(o`od'9{/p`]Zl;rz5^Хg:bNs^*ywz(!B!al]?kQ *F{=oEi#k9$VQ>iu_Bʥބ},ob( cݺu'O?!Bv3vlݱE'y򝗝QPDoomtnW<5xD' 13Wf_*لU}6Rlr뭷zA2&2dH^Et!JriY7k ޻؉GdA()B\kT {~ TRoBiֽJ&"s=K9Can/\Q(/e+ǷqBH׏1:wp2@Hְyw~Y_k,oy7fJ]/nK+ZTt׺'Á> TfzcXY6KRuщ lɁeѡM9r$,c %u[o]nG_#$O $ٶn늡sf7~|'رcy-1 S8SR j3"ui:$O&IDRXZ<:,sH2lذ45 jxகI$/l)UIE[jaoQ)Yy@||]}hR^ZjK]} yUS7|V"م2%0:u:,N,D RW! (۬YyqvC>U0Ղ:叜 ?BdKXBwVDE`\@HVuX2X0 46HRՉrlIa,E `F?RH'ұAaq_SKe2nIVl^2dcf{-MMq5{.}0-gMu%z}6V-Ro̽G/M6V>R$pQF1trĭ8UrpÍAҥ,rA]:wĹ;~$" O%E?*$' ²B`!'@ :jfRqJt ΢34y.$8|[oIDPٚ1@IjA6LP3"{:Fi 4Ɓ0TcDHXK(PʈG;T'BnfJ]JRdISJx Canbk 7doҒۿ>&c?eX & *'*l Py] p#2|$)=ڹd8U(] F1i :Dk [[AG5,'ƃ d[ x@H:@_ *WNAc"H"/Ac)t$w1:A2\jY-8?5.+|V]..jKN{WpYW0`'2 o+S\[ )PRB pۤoM'?4XwykT)EC¥$TCPp|W-Zc:rBNpRV׸I\}iJ2 }D _p ˍlgu(Ǘ ΫΨc8@8Ab>S-+Q@It.T2c(5l0qCU4Z{Rc)r{v0|xl9M іZ@㊨: >ߨh O@e2nIU0ܱloL1o5Eifs-UJfs5/g?]荁>t;*aq|lю:R$ȸj;"`|׿I)77VSN.i=׀v[ IGJw%uhb%@ֳp4{B6)}QڷBYFDmi6׾8!Ḷ{]`˪w@#u@9D,irжUNrp!+9.t<(kZ J R _X=}YM` %A =/y[BauÝmK,~-*kSثm{[{eDIzcgyZ|nj]SRdqUr'p&n w;{ +B|C Q޷Jqsa$B}tݪXזj÷ƀkȢ갊H\[-JS>-lU5l^Ɠ+OUSm:8 QDGyT !{.TQH w, t"\)ڡI^5 '!e'Z|\yo"-݊- 6.h^cJ kQEޘz^*ɍעVű ӻ|p~qgu*ƺ55ͥZKJ)]d\JpgB!7l ʪkY1ݥA-uߊBR*n4$K½߹sgǪv2t`$ΨgAUH\kF862}kFa=W_.FXVa2)o[rȷPVu JACaq>h(d Dwj'qϕNܧcR!c4}`];wm$W ?u E2\jw}u3{̛䷣h?W5ߵIEi& ^+k|o ntYqל_k0U(Hv }{hupEpBAuwoA7<׸ 0ʳj[QHYJ\RN'wB>rh=7 v=5,%W[6+]$5рv'sV߹.rɆ-R6}dݺu+<ݦLŷz{M#6+{͇qG8 ]P4E=WdYD aR֥Z;>6&n-٠H)rwyseYÏb+xc,YU}‹ˍ{6׵M.n:[ s5[`Q}Q KXc5 qm.QdkLߒ7 5 3Bol7Β btNoK뢚/ܵ.dASu TE%WNRd+.0tCD)`{r7JhXGUU&2 5S,~l#6΄ -17,kz=4J7~64eCr \)OR Z^:5qa[ dvRt7Za*\BAʌ>XI¯Nji&M"⵫"W-)ay#_ae+gt7qZE0{0{{DTYy\ T?uNcJ xoɯ_Qod23")\[!  ̺K,ӧzT;Juߊ*,[L`MeѾYBi X6: ,k>ʚ=j-rIp"5,4@X`( oqh]zKp2p;)ArUws?+ EQc[!(tXɺ(j2ly--ojФk;lJ-{7O]5tk6&5/t^˞K-7Ǭz7ۛXtĄU,ؾaPJ]Kbsj2]`zZRʵŷlV7cZBQ) T,.T H5/\PWm|Ɩ[QA~tZ2urtnL\qմ,4@u Cj۾ DiKAl!]6NLA "Z Z!|u}Xꦉ+"WВ8!*D2ʥ}AjA"2\k;w}Ғ>Mw^Fyc:٫yifsY.5+sBMt^Y OTrW\(pBd9$b}+!nƪ@J7r5vÁAD8VkVJ+!MB,"ܞeNּ/d}@9m J4%E/Z^|^M|晋ۛ9QTVLceHp5oR ;-0p)+_ z(UJ`Ev~տ/yMwm>gҵ(xAׁ]tGQӽwq]f4vsբ" F̠u`ȶn >Pº+Wk]pnH)MnƪFJ^Ȱ }BNPQtE,իz GD )14˅lȺ RVLo2cV/Ȱ\q' *|ROv1iݽ⮅+ b E-PѓGz~C1(ֳgZ໼2 2~K?w?lL/UI)@]Z+vk1[=W䍁|JqjQJl&A6ȶ%Te+aKJX!wVG{41#fʤqSH1Yް "+Ae/{Y|-`.@CZDRdxEѾt|4 đ)=(tI#>~ E5a Q :`F 7~aÆ(}\wh"ߒf] 'hN7Ã_?v_lʕ7Mgti23D\q+ T Mso'E)E!Ot=}@F[p:āʬAoHj"Bf aJ-ɓM^.c'OA Ѥhx A(TЛ*1]{NXhDfEj_dxm0d˄NBKSh?j' BЊ b-0꒸%ȼu.eУJs*' ݰFRjIBm#z3DW iݒTd$[ReKq?J)Sjwχz"J /)/޲tɖeϬ|E~nn*Z^6/}߲ԔZR$'} 5L1G*` " :,p edrmֿ0q` & #U,J^R@Va(`/DA-YV] E)`ˢPPAe9U/j?Z{`lˠGSTŽ#"*߀&Kn+T R%UH)U~'[WY~e&3:_^[cw7~u[kƨ*+㚗uksmR*e(\Q#I,!\JꂷŒR4ަWe/k=g]?v: }u\^v{?(^ńsξv? {}* .b0!P#/{bˎؽ`sL[_a5<[_[^;۾CWBm">_q\th8;vxu8#N 1؂!*0Ky5' 7/ٺsز\74ndi7Dپs??#YG/^m6e7/ X⿏:0{㼾%WI'(|\x1ħ.hl 2*ܴ}2fv}ZN)EH0|pkp֭t5 2+{*ڞ[ȗHnA)T-Ri-~厝;F97_Q'W_8/K%[A)u-dߌˌMi><ں߬agkw/ԯgC-oev W|q5f`jV=:yݧ;w휷y>jCKRsl(A7l4ksnxTkmT_8;wUٍMcipȯыK.nGd?(& ƚQf:hj?w̃XпpC)g|WTy3oV֍R B9k u@.[SG{Q$研~xKz|=R~i%Mm~_靺]Ͷosv wlbhz'HHf]}<5tƴv-_R?o ,~<`6aLͽ9ƭ~̩yz@MY?PA ==[*iy$P/ uD~5'w”f8)"ۼ%B8Jںs๷ W`jJ@ h,UK mNK_rO1o߰iǖ~٨BJ)Br2Ǘ_~9L P'>x#Fp%zBPE85`3%j춠WY oIU+`_n۷=Je~lZG=y-^7|q 8*;mjVDm)xB%uչ !OYjhM/X7ּ\|;ACOE੦}xf4dJ]44Ɯ6 yC\)uδJ!/TF9(+6o ԓ+_RsJpJJM66+uΝ H'ϪʗXT;޳86ɷT!i%|~v~ӧzakH:il7s7/=֪Po]|y$Exgm3y'>>jZ?JRJB!H{H)uδϯzApvjgu_||+[JcӐ.R_ĥso@2IRN] ()n,m:RXS&).+Y 8۩8u]|ٸcJ=;ݺwRJu)pMעBJvm/EĚra"Fem^x⿜5!B!N*8;6c#[ j5sԶ~ߟM u++]~d๷Ksu|:YW 9+gRRw/~Rj񞒅~; 6MúmJ9boJʊE Vw]h<Ycp !B BTsVv m^?/y[_‹k߳Ɍ Քы_qxW*#R BV~zMj TPwܱn۷ѥԙzByu;*ӦAe.I)E!BH"??{vpgLm/oUKHڴ}h9P&HARRR /,?JA55]O΅ܵs<3+M{eLy՜ΘC1^KgvЬ)V$JϒR$)^X[7RJm'JXz}>keO;w\}#!elۗVaI] s1\bx\̹y?B1_߻_Ŵw7,*ٿvmɡh!!B!9@*PDa--z@@n-vM:F9 6+ V|>%~]v#WR%%*a P<{ k'_+Դ"z1s+Խq)85NzE((Ýv>cI\>&3:#+_iIEBJahPG(Ɍ s>~wg\Jjy4Ϳ%B!$ RJs3+_y}{XKQAMg?_]kF=j ҧ䊘Ҙ+ov˂?u-BHλ=B& ,şΎ}#˞B(*/ܴE])B!Br)Uq6F3.8wz:[芣'-P쵟PȆ/0zfO#THϛ~J)7^,B%d>9l)K}4ryg9?iJ4?mjbi/prefN~SU]x@x GJCd;B!K)FSu-w/ݯǿ{?w-9$D:*YpP_4XP}r~O9J)B!Br_)ue圔8iBOOxKi_kp5s*wǺҝmCHCbEgϯ|k}^5]*G)E!BHnJF/ylo搔9wz'|^=֌V`63{%Pŷ"Lbmo2'CfA~Txy[Ͽ¢QZM;7-B!d=X2_,Щ.,t۵X,Ύ];W9uH ?}̮]K,iӦMV6mz饗~{C!{D:aܛn`U|7Goz#~ߵq]ٿ9o[?T5: N(!B \)eQ30RU~4Ό /.晕|k/Ky}{(r-c#|ђ+vگ_?|ٲeg]oVti 5sN/)Xv뮻I&sΥ\߾!Yo>&t: PJB!JEzkumf̛wjKhѢcǎ?~*X΅|]ؾo//9#M~p zR!"T_}o0c7o^VkUVi]VXQp:RB!,!L碋 x3f}_q :w/u׮7s1<ٳgϟ;x~ի wRHϸ9}qAM0A-07z#aRB!d (Z+8[a׮~d۶xwWog/y;X:㎻n馽駟vݾ/!,5?bu>w}}Žn>݃FG0J)B!B]pZa_<˰k7|Ӳeˎ;xp@vƌvڸ}SYVkz}foSVV+yGuԊ+[ q-c;o"a޼yu3=>G!BHVRy~^ſvz]]6lЯ_c=2d>3rHk#˞.0-;~ܣo۶m?Î;>v8> V\l9ܵS裏7[_>wz'+N/|N"O?ݻ߂f6}yPJB!䨔 yv_nݺٮ];C};wh2?jWҷf]:R9EEESLټy]΃_=޸s>& 8!%/huq|I(="_%B!d;+ZwT0`$v 2do{m.SݮOyZ~حsmy/׺F;hckvw%_,ۈgʌtPPm 4zcg4ӱ+?߇vmͻCAԹ:Gy:GrRNcCڵksS/۲.[O)<`CZq `eF9訳h}p^G7ߡ+~?6Nxի#nUֳK/}kyMlb~:p-{}O8NMJ@&rgt;弟]rއ^}xcCmycQs)<"^CZnA)E!BHnPR8fIs>Sj7JBy-C81уOj߻}Yf:˓]v]:.x/OG=ٳoOm~8칿>/83[}F?ٶ/;o!:-t> )ibU_J)B!BrR* J׮$6i-+G_v~XYzG{vܡskזV?sfG p)ZURB! DJn-&viVG|1]aotIr!L|kE^yeD8Vk],5`?gys{q ӆ5vgsrgÎ=}!B!Aj=%-ޱ:GϞ<ʹa ˏmG~nhׁ{k {o:vmٲe~||^͘:y.o{ʿ'UY|b =Sz׫YJG1ا޾>1GYRB!_J8gA{ԃ/󃎊p⧇t:v]䰾}6nxɒ%U8k;?Sِ.?&O;Bz۠<~H~M1aGC 8:,מ7QJB!R]AŽN=qP:?,OIyZm{i#xm(Ivsk׷= ܸaIO:Z;u?{ Ͼ':.:̏ :!&k!ՠ0ç(!B |f =ojP9x)\ }cG{zݳl Pkԥe]sk׶m8?7n<帓sfT9"s_ʋcU<~Džǿu9Cc卿^AMIQJB!H>mf>oZ{ٻs~M9?d5]ެxm?w@kNӇJ-vܩ3kׂ !ڶm*|ux#N{YA6,l @f O/ݾOw|gi=!u\4ثNIPNSkc{A: FػU^)#j+QJB!n;)>ϝ͎  Q,岁lY?G)E!BHn+ڔnZ#ׂCZvFlti5|6K_cǏϫX]"^羔'73:?ϟ{s^J+h~r_gpmtּlousy]{k3td;3ўkuay15U1ÔRB!ARm~ 5<FTomvQnirjS>_6S-gxDӡ;[?oHķB]KΣnL8DrںRB!%PJaû}xc  oiR:-'wu^>-f0{wymi?G}j;sl{טvk|dPJB!IyNٵ jo?>y-kS>W5+x =W0 |ō:vzn;=i =ٜ;(!B BT>quc:.dV*_:T㔔.tMgH=?!¿zh9IV R_/ǻy7eK)E!BHn"Λݯg=muv} 쁘ǀ0PSJJ:ȧK+g_;uûSJB!R#RpPSeuگT?ÍlA>O9ғjY=sS{YG)E!B0 Tu\4ZC&7Ah?5jvK dk^yHL!B!$DRo-T*]~NK/:\jڧ޾{G=jڦ^=kpg?g|;J)B!BH(}T1W+JǾNR։7um:|glqE>n8J)B!BH":,pC͠bN }d@~^mUKR{o?ZO|BVwϛշ}QJB!B2L$)5qOi\[Et?뱖JTjpZݣ.:a:F'v1 !B!$$R}=Cv˛e[bl`P:Uq!B!$$Rgk*u4/ 2}V6D0!B!$$R'I >EYZL*IS](!B!UD)U{^U~H MM!gRJB!Bp)tPj597.oVߖv))pS;p B!BH.:hڇrrWwω &ZT)=lG)E!B0 Tif/s:p8ROw>Z *^{/un>8J)B!BHI >G֟J+*Z8MN8țNM:J)B!BHIĜ?xtKkO"w7}PS:g>7h`;-ڍ"B!dR zi^3i4yS%aT _aހv}Ln}!B!$XRRmaY}rϠ^=sn7_Dž!c.Sx6UF~{iv(HG喔j6SA)E!BHVcIzeII'iv3u_`Xo>SVUןQ: ki CRYYF <_RB!d5RJMޙǻ=/rVmn?_iu6G-9罜wԥȘ!!R{sL@ 8Dxwk-n.C]DW>CxW;uOw~?s|Tc/yykQpjQJB!%*~tӧa~ە0@Dn8~O鬣ϭ8u*s_lk[OYglfm*hޭ6^pqqnt spuK^nrcPtϱ]>8MѢۭ#fK3 RF~znffjӹZ_ycU.]WRB!,՛0ۛ$禔.Fbe_5ռ%Ti?y/yo:{pÙ|Ag=mW7|_Wg{w܋9O=4۳n^BU[?{o74W_-J)B!B- 7.hz:Kˊ1Sx1viUӒ+y%sTQoc=ek7٩bR(Zɋ\%={^ѝ'_K}bo[3Q ~;}PJB!]WΟZ+ޗf=t]]7~j& .&vK/.:oDtXgN`ŇwѯZv Η߻}Y}|;Q*]^Mum]{osKQPP҆}cDPJB!aǗ-ueޤ|{1Kz=W ashzJt->zX[ӢV=֡ӲAGt?fc kaAjd=£fk[`jq˺7^J K"zuU-ܱiPJB!Kl[òϞi7tn4><`\z~IڻnVwo?םA1 $Lu꽍zE=k5s)aހ^i){lW]ReI u?{m+SM/)ͺ~#C)E!BHqƺy=xcKq {c?XǛ#)wqEHM>g(jTZg%|NaDž8q][}ڽ{XbE-aJ-wNy3>\r])A)E!BH}U,({W񝡎ڕU{7?;.qEH RjCi=G!BTEUMw_fz -jfݱˇٶ]B)E!BH⍋)Y; w7SzO~!9 i6:^j2@nfZfc.뱖}wC>׶{Zuz-OV|soLo7uQ PJB!Rv9m?/&Ac@VW+N<|mnF )EK\Mb._lωQm z5ߵuAc^}-(k74(!Bܱ'(91UEx7\˺70s]d7fZ ob&~dW&RB!/n. մ9Sc9>߸-K{Xb\Y=/!d:|N)$>_[ti+J)B!Bv#6|h`LoL7$O{_邏^*/PUk] yY{o_W{ O8}.aUA)E!Bn7*mQ7c޻-cz7.Ԧrm z7׭eI/ycgxY,bk%O^;b.UB)E!BȎW=gg{f8FAeѓ?=n˺[j\ݛzɋ~ Q]ӽbuo_Mʡ"B!d囗^7+ѥwc=ޥvi9r_jUzy- ?gyf1jɕE/ܨPMPJB!gk\8{' U7_?vN̯$\5oZ;~wsdWo'V(!B!1־윏K3}^zI/\ -Kz4׵M`wZ>׽uޘ|Նg{g2ܹSg"B!hߺy?ۛ4gި~d^W[%Zh2Wx6Q((?{ 1n/:!B!mXteagyܷ1#mcazkQw:o7:w_?♛JeRB!ܼϊqERM@5MxA6Q_BLw2W|_*BG51unJ)B!B?;X'yf:^3W?r]ݛ6 Ttk^kT7fZT7 *:z.ܾ6:!B!$m_9u&3Hhg:>zkW4YеE T-ghK߷1ߑttpn7`Ko(a},RB!ͳ[0pLot7}>o=?_|uQ/t߈e޸BoS7LF/롔"B!DVi,oCpqG|]@A5"nUCr_D ]&nWsRB!$عm-.>fb7i@*ƼvSW|Z}}eXIޤ'}];wsJ^zi޼:nre*((;PJB!QزewS~}dl};LV 2}2d>jݶ/:blot=2n9q() 'gp\R 6;PJB!Q}.9euWDy yDT-7.M=GzQF-dtT53vXk} g:ZɉaA)E!DaĈ)_gS*#m؇rԩs<~ګj[?9>+ƕxJnt |R5Nb8JNH)D]8 !&}sW),albtCx6l ;L?T5;YE* 'Riš"Bлwo}H,u7T׋=YnàVaqիܑdqXfּ ^7C?D7ƘΆ¬UFcz#C*?HI!WÇG :,t!_(! Ȃ]lxbFe$WCR{[e}!85|NR6LAA3h $ ͪtlkΥV'A)U͘Z4l%}ڱc >"GhahرAeSNRBHq:C|}ǖ-[` z?!a1bDD&R@':=+}F@* Jdź>h:E&~ B%D)0a?1ORBH@8p'g۷ERPPn{(֭;vX}CQ&| לȸ cqkŷBLLA)U9R78Xal ۢ~AQx 1q7 gt E)E!T;Ç78pYBŊJ/ h/A \#Y[UdJĚñ^qlON^^V Vn(ԠAqsV!RXFuWo@8\G-ֈ% 0<`%>ƩtА{`ȏ{Rā ӚmT);Pg2N !t{3rHti#\^}XϸO ЯpJVj!Huzp\j6kD ?l)k qtXJ)B!ڱfp|Du@XR }R;8uqQ]N7Y 1%mʓRKmA2 Tub=@D\g"°q7:tt[G!ߣk4Rм3A&NJ)B!ڱlX ZʚQ ?Xc5hn=3`RBHbIeS6fCz*,a`c0\\c퍁cI i`X`eaHT*MJAˑ'% TauK|gqieІBRڰ^sVϗs|bI 9P0KETk.Vd9FX % RB^?JѾq\_"!Y`.CHRY6eV~gBȔ 㫣RIJI85[u@5AT?t]Z)BZ1ʏy7,Y(!jzaÆ: O"ט(dLiX* тv!uG4o HòȈ cCE#RyPJUOb&1.hv 5M(`rr RA3[kl!3ԔRBH526ɥM,&?-c rzpl $tpJc# Wh jСA/,oà- tF(k91!YgqLhb vl73V:be +)k ɪaë@)E!T#}֝ M%`d3_>e~@%o66(xRt pjРA^^qJ 7r1 )c+179 )k#!RX}*oXj-}dEq w \85f A:6 ǷIf,㻞]$t%NB@u)Uq3t ,H)E!T#SѲ2 pB0dc00wp};@:8(ef(@)UPJUVv皀],K1.H,(Ξp$N;F,Ao,RBFMڷ"*.k[׆仾" ( T~ԭ[Zk`ﮃ)0N)(JjY8:"?}:FP z#A  BH~䮽VPJB!Յ%~Vܾ` 2ud4 XCpR+zrEa@ehgӔR5Jj ]b?:Сr[΋sz 3`Y0`A C AJYEsOKB4$\u"Q@ :8- !R@6 sw+!0cp, $ֈH,"$5x`|K֦"!B!$ !B!$ !B!$ !B!$ !B!$ !B!$ !B!$ !B!$ !B!$ !B!$ !B!$ !B!$ !B!$ !B!$n!~رaML6l8GB֯YK ߄8k<W9.|=wt=1*訛vf~C5Ejk3 ߵouue q" u0uJ: :TSuѤY]jҥԳ+GrQ+^dJC^0mE[#cԿ]jB +Rts:LufM6n-:DQW΢oiեjgCT-TBv:o^M4W|s!|t7ܵT8P?Bw~^[߉M(ܰ/ !"PSwQJ}3G=hcy t@EM#)i*??xr aXj*aSR &yg *RcdN7xhϑM4gWо1qNI"TT'toTiGe3qcҍsUANE?qK!cU[/!:fCoE LWoo}" H1\i$Ryw*z c]UZuz`׻y0ߩ}+җo8f) 邤;թp_R瘯'#9Z»* -WB2Kᦥ0TGA "JLmA6oPc4R'B2ҁ}5HF%*>Zq]Ȭ$_:"j`w,زBĄ{m*/jM9„"1_J[UѬv:%"DIY OTt\ps\ 'zSυD^"Qfk%g+ИQ '\HR˕{]YvoH!{ t"hD]s|qݧ/yw˅HsTZR0V%R:9XȰDՎH<|i"$NHaFl ϫ7Gdd 3ܢ)fz1_@E9$bBD:*cpJQ.u.燄ON4AʎWC)S"\*ʅUd%H!d7 EտQJ/g,< D3]L )REPk\87q­R`b¦fr0. ~P:ظA EfcZNj T)`t0U}S֞tًr.Ԫ-HDj/kU&}ˑP2Qh &%Е@ dKgV|PzڗBrؾy z8ARʼOјė+SV zfhưĀrA/U[ҡXx˜HU a~#FY}/D1D9*USIHBe-m4i8vpu6RR"(h3[$!`n\F`+$cLL7)$Rqr^[M:dL=)|;3܆_)dϚx.KU&["C ͠2M{\}ˑ)'P]ER7/ @pE;Nj BJl!(0 ϒ:eDJ!6p'1cBaj8wu KQ@c@Xq Np9%< Ep:Yj*⹬ydKdHU󦘜-) 5P &Zt)& \@8AfKf՝!&iMVne1(?1)GGj!3ʈCP-ߺXABK%`{$["EjHkQ}HYJQڷIBJF#M% LM_lYn|h{9| '7,)\+񷞾+Xrbg̓^Qq卬^y"91dO>6 'r.v%RV{)9Ac Y\EV؊cqV  jn7L?{ Tr,/](XcҒsWYQZY'|3c3qu8-䓱Y^fIPd)|5%o`1d d ^1\F Il^ xz{ dSVYecګIBJ{Hb֕٪}01H)\Z^7Ah`B-eFe*d~YRKX3lR2ʔF;) qSdKRdfl4(Yd0*fdjPP'}gϞB}AiD !$0v +32&7u/{ϚWAL} rz ʹ _d#Cd,Feot)?̹-H P9dX74IȜCjߊ7\#:^LRLX^q`*毉PJ6&1\#а2W0RJ

Nڬf(íVYp&N{C8wjHbY?K洛l@ʵ,RRJ"N ^?@Sb ױgkVTqH9 ^˘ ɷ4d)e"H+ߘU>!RJI0"ڵk'#!c"'UVrr*oK= ;!QpɤH8i'["r%Q4٨6!#L-l ԚHGJ% #$q#Q`I]&X7zN'g]a"&|`Ac@9*Ċ]CVS ppL<ʘ Rɖ\{It(aS-piP]&RQ [cRFqrlH3{)0))ۏir5暙U*MZabV2-2"&R2KZ֕t01trd}8S3'2$-HBqee]!o >|ZBfVvT dMJBOP }M}+R^"fEļ0f*?h *N Ye$ʔ IH)z\3+OJ RRr6"Rr0U1(}hfL:YpeZш/K԰QR ~.i ^%^l>^0.SAU4U =ʖR)g/M;uAmBrUHdUbK)c1þ^9+5sfMr>2U H\H$oP&T\#|^1 5esIK=ʏR"Krj jJ.S`2RǪ+"'r`H)s|kRIBJK`IU(e̹/^ s_oIsa=b 89.od<(I8;3+2dB@&8K!_*nm%e~ʪH!{(`ߋ2QL!ُ(0!`)5R<)%YYH >cm'gd]y#װɷ܋k4+2dsaJADBL`$ .Q6֓&d h3v𓏴>_$d/ HAJnkIg5Lr~Iܕ7rzGfC*IdS&:Wt)*xZgf|(rS~TJ6{Q$hB!94ܓ$&ʓRr낄r RJnݒz*["Ɖ]rCR D 㵗U}8 LR uJVkZDR&򯊒$RyRJ_ Rꇊe iVԧI-T?u@EVnfY: IdKRM:y)T2I3;H!ՂL[SM"'M9{ R ș ߹/OhM7Ter_^W>A= 8czȹ@JDj/'@mI[K(Zʨt7{DMdUJ2>8wLTL Ҥ1җRr_2P,ERdR9TK_"*&|ܵL3CKPٔ?uGU86pHPWCUܼ^$OyR*)R/rB{9R&zpݘ.ad ބCHS80Oʙc*㌌!e)`V%|u$5)%T=@Պ*@oW9: \f93eWͶR,3YձsERɖHZ )׹LO%|#+S$4|]+I+N3ah*i;ޘǼ}yMLߤou&3\r& Uj6R5GY{gsƱdKdHrcLX{ʹ#"f֊³f".%Lj;ؚ"9*~R |`sH&ft)䁾5ΖlI)_g)"iW;IY))d@ +9e\P*pM*[R$r/U rRr9b(iȓ{W 7/RR ZŖ=aBڷiGRn$^ ۞rAkמqZ%Y"f/SR*E!YQ-Y2+En1e)V͛"7TWN錠#kåNfq"CeY=uU= 2.|K$Ir!']sڊ0 I,3:ʲ.j}[*C:*>N|^+2渉fLs w RA.r p^x/kC8M9Xq2t\DgLd(AGǑ>l QiAeB*Q%HrY6%bphA.${f]r+ !$ceRuBK!MLߩLi*ЙFgP @?5?!*tpEy@\ D!8_*cWR%rIޣSDRF6rdI{3f0R BnIg%&|eɂ<a*ЛſU/NjRSR$Gy7ME̹|'/5a` zɾZO(HrF|׾UHT)SF]YvzEE1poj)Ԉ\y[kC)Erz }E3UPJ_0Jvl;:Ȫvnl9R"!$"0GC"dJMe RbVUc*0X"$ٲ_Y( 62sVl-۸Rh#XR0Vm6AY*%ke^Yfy%$6缾I''!B!J)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!BIJ)B!zB!,sDͅd=t!BH  $l.$G!Bmt!`s!@=@!hE zB!,F.@H\Hc@B!d1pB"B2{:B!$ц@6#B!Y6\:  Bb"Dͅd=t!BH  $l.$G!Bmt!`s!@=@!hE zB!,F.@H\Hc@B!d1pB"B2{:B!$ц@6#B!Y6\:  Bb"Dͅd=t!BH  $l.$G!Bmt!`s!@=@!hE zB!,F.@H\Hc@B!d1pB"B2{:B!$ц@6#B!Y6\:  Bb"Dͅd=t!BH  $l.$G!Bmt!`s!@=@!hE zB!,F.@H\Hc@B!d1pB"B2{:B!$ц@6#B!Y6\:  Bb"Dͅd=t!BH  $l.$G!Bmt!`s!@=@!hE zB!,F.@H\Hc@B!d1pB"B2{:B!$ц@6#B!Y6\:  Bb"Dͅd=t!BH  $l.$G!Bmt!`s!@=@!hE zB!,F.@H\Hc@B!d1pB"B2{:BIĺ`!$"Dͅd=t!T ֯6й}7kF \|oԒˋo?89"Dͅd=t!T9QvA RJ+n0!)  $l.$G!jaºm9d7m5EI5E26\:  eNO M97EG"Y)RǮ6\:  *d]\o~eزԕ QM "$Y"Dͅd=t!T!ǮQ6ܲ!ڗdK+j|훈Ūm*6\:  $I~X_U# #Vl*X}+bTs[6~xl[vk/Y7r5Ldm B6C=dRM8#2cNs!5 ҬEYȏ1_F JCf/'Q)$lH! Jτ$ 2Eo{c.SYÏop"TĶGH8pB"B2{:h4\ʘr;O>DjH6{)׃BV~B)lCf/mH/U"CiBo2І@6#$"5ε('( [09}w|2٧|~(^ڦ*>:Eߕo:v9F7Bֹ`,NglMV %[X?(E $=QȈultJH!M7( P0mt!`s!@=@H(Sm|R*eJ[6NjTHx–/V۾n+1JT9XJ-l*X/s.3,*FCMpD40˱_BqEV %[)KH6{)=lC LȤIU|C d*hd@3) ڗTц@6#"_̀Q̾p!˜-2*]TF,2jP䌄*DzG0Fg$[ytRԲl=,RhH mHI%GVEnNC DFG.@H\Hc@\zܗF{oL恽1gxitD1ge45r2Ҿ#N{#mtjKaT[{10moJVe/zHNHRhH mHI"Spa:mϬ Q0yFjڋTц@6#SOCEy.5dۘit*`|9+V ʁ S4aʑ6z0eΝ7H!PR*^m!_ )%K : tڞ 8,"$U"Dͅd=t!">Z̉o'bӀSO+OJ!A0Fa> "Rr]V|tRԲB=H"JH6{HdRe R)tCréM1)^6\:  $i}Coh2/QTT\YÏԔ|_E.GQB,==` .^e/zDR5$lґR6˄Lh A:mO)DIBRF.@H\Hc@z>iJeVJIsܜK\Zpګ$AnqRZRID)L $^ )2CJPtTyW*=FB.@H\Hc@V8/"T^քC$V?Ȅs{τjrRra$,Z(RU~W?ߍ\)5T5w<öAnD&hP4e@nr*!5 !NJF-j|_NABR O!drK!ɔ^BT E$}ALwFdц@6#$|kICDV欌`D݀e[N }@9Ivlh;URE K ѥH!drK!ɔ^"@ 0g2&56BRF.@H\Hc@krr [Z$]iYoIV[{|c@a3)[dr=(R6$lRn{ ن$Sv{MvCrۓՎbjhͱɾE/pB"B2{:hU|0=}հ[6Hq{0葈D8V)`|-mSX,;q.}D 1"cf9i@IMPHA8\OutH ѳ~=${x^mOSXxCȧ-gِR*R -g%$q =qABц@6#2wX$@Fݥ}yfZ3|%$="Dͅd=t! %@*8НFsY/5w8!$e"Dͅd=t! %@*kkC=2MZHH hE zBr$!`DwK)E* )^?TD×h6\:  $"QS!ɴ^(RhE zBrJ)J)R@ЀH%  $l.$G!DD֜GJB.@H\Hc@B!d1pB"B2{:B!$ц@6#B!Y6\:  Bb"Dͅd=t!BH  $l.$G!Bmt!`s!@=@!hE zB!,F.@H\Hc@B!d1pB"B2{:B!$ц@6#B!Y6\:  Bb"Dͅd=t!BH  $l.$G#GJmxt'ц@6#dɓ'k 0rH d"Dͅd=t!BH  $l.$G!Bmt!`s!I3A= B!T(hE`B(H[6!`B!j"aÆ`B(H%28DL!RM`pIpJB!YBR6 H8R$z))B!d I0"PJPSRB*"0" ")HgA{>6mڤ!$;hpJ$RN‡:4%I]#o9-:CTCjd~)m۶=zċSF,M4 /Tޮ(6̥7kn֬Y:F]MrYgIb[5CLBSR$ R$u>2M ~)%bP ,vm*$5Yr@M:UF} 5k$a8%E@)E"Nۑd7Gٔ 4f4زe˱ F2_Jr-n +K1~*U+WB`䮜0WE3e}ʾtR4u)տ^xAᓖ`P…SR$"R$-BpJT%\fToФI ?~ef.{GEJEc|AU6F.~be%cUGTY*) YO}} f%$!SR$"R$]`GPF$!jb2#I wl U-jf6${ՠ;&d Z͔WJyݧfVʷ}t/$"ѡ"PSR1沙P2&0CԼ2Pc+33ݜ?剪uF%Tn2K85äVEjUb*;T4iPBv[|mNIPJ E?q҂$D!e]qސ S=0剪ssvċ[vP$eGuw0MB6iB> NI"z))R2?Pj 7̕R24rAfF.rlP>5hV3j$$X6 HRPJ̀|$D"e#Ȗq2%qVJZUPv1oHɲXh)jV4̓: 0>n)),R$3:"Ղ4) #|T +edes\8|:uR?T*r2M{ O1M"vm*R=(BB06 HPJRX? XKwYX-LuJEDET< E.va+|%4ye7 foZ!8%ERRd8!UK,c+x 4۾!뮻N]ve%%%)m_/j8{#\*5FCT•ڵkpUd4$) NI"B!"B!"B!"B!"B!"B!"B!"$+af-!BHB)EH~욂:cV}2B!T>&}V@)kE(MѾYnh\AS-7CMK( QS2!u0OӾYi[vY-7Cl) QuF WSʌ)kQ SSRR5RR a iG5E!ykоYlwKk<ҴӾBӑf tJ$DMIk)J)JEnIM륎B!Bac"íB,^x2!dLw~ TM"礔88H#Y &)J)JEJ/B'U -gǖR!;vСC[Bv;? R&!M;8!2.pլjsZ3vRJQJ(*UJYsrV:]!Zq j鳖۠=ITMRtdVP`հ8W2RR5 ٱYJYw/X;b-1* V:'J+s4S[kZ@)j|ieRJQ:!㑵S:N &lK)( Θh@L((%?G@0:%ܘơ*P!:yՂ\Jz:47In2--,Bn%i /RJ)*UޞpKM8uUQpHpŭs"Ie`Y88;}pT ˆ-!͘eCJa8A6#08XQ*ͷ-JYJȉHye=.5JJXƅH)\= MVΫԲ",l'RRCrǗvĊpݨN@j]JAրoV}eOyCs>:-,Bn:c묇}RJb .\q?)LG lK)w؈ !RJRo!aCsd8y)K)id$jAu()k2ʑ%DJI~b=V^$#@6}D* )n*㯂AJ)0G~PCy-O8iS aʗ)JAfߵo"dptn2!!Nvn+"pOf|-lߛp [m˒uFz `3d|kwjV V8J~T$eHYJɪ}05GJ-Xv?*䅽gXUh%FA ZueSF 2wz:lJ)tZE+"%~'5Xj٥ ϲ!2?TkC+ҿ^y.S Lh ;Հw"wu\bfM ν-Z_;Ue;HJYF4A2}X8UKT6TD+>bbQ^zRaHǮ<ҵB12o" )mT4r"ܖ}e[)K`fii_Eڷt-2lgș’RFprD0C!x¹ ԔYDx=#e!υ7.M ԌI N\UM<裞}˗/^"wU&$ 7; Ab-rҌƽu=TN(oKcY]+m[|P-)H ㉓5)ʒX,KE0dL ˌ 7_/IjRJ"37%6 mnQC: $RJYH3ۦP5cdےR`2pUYt]ȌM@3.J)k$jI1zúaVxJzY&x%u m @[X(j׮SOirfΜYn][nѾɐA)oj*$B^sαoΝ\裏֏I ~p@EjͣIxq-^kzn`;+?,};2$t@9n E϶+`Ksb}!Oar+e'LLT2f}e'R(".oҿ^Ԥ|$4<:&)84 k)eI]م| \(i9kƅtmI)l W'(ch)%;!jOyԹ|gҔȓR*e&&kP0C84k @+xdhjbFTqqQL8ʰrBHADRK䢔 />) 2g"ʵF"k>s( @ǝHDRm%bwUѢ}㤓mu,H,Һ0RDځFJ)K&Z,Zcf˛4EjRJ*sGԖuxQC4| d5emך<⬆N> ]PKi˺.]kB1ÐRp"b<4lZ%xma'  t@yCĩF)DN?{R+S2#-QX/oTHkZ2|jw[C·\$ҾYŢ8O'ۖ\RI%Rګua_)eG ( `q[֕e˛4EjRJA 7UzS.j:;ll:(ΚH'۲@ecuu4I_Jn[ yQ\SH"XR*e!RuIIVk! ma`ԋ+c 2k?*2d 8pߏ/Ha*{?pO$TRK(ؚfĆJ)CSX*d"ZBȗ,YB)UXzRґR uWM'!wd2"M)eUfHѬH@i^/s!gLL͖C)e-JaBqЕb];Ed14X|_7LT2|a^!߆n璵53lVjfDQ/L4-0-$ U-Rg0Fu"JR*c&'j"2}-:/-Zuf3/EP$xCwVU7Ȥn H)!)}dtm-r\+ǂ0 JFJYf[\cr e~ O? ҎJ?ꢆHtBqun0E:ٖ}@ikW}R/aHyȾr)Ok=X e!4_iXqۉ{%h +^ԣzc)J[Y* ?`;y'D U৒RF _ݜ?XJRH=sKB􃺸 SWjH:Qըj@~.t=_I25+;&Mt[6ȅpLR e4pAO0JV֕JsV*e~ s"+" AbZI'ۮ%mDdS })e Cq}-0'C b4,oE.qL3Țh +^w%{\]Yr)`nRiJ[bWRD}=s+޲3|r+}FGwkф-!H)i3$uRE:Z #tyKI+)emAe۠z&}IzY&!}S$Wj!RJEg1)%{ I'ۮHPnY/3,*FO_hBeٖqJ4,oEr̍E[Xʤ{On˕R24WPQF}=sY|oqRqrEMEnUifBRQqsW8t<;٥ dەRR\oBi43/ HcLX RLrҼ^I)>(MzI{9G RZ9}45/3ӑR3 Uŷm_)G&}#YWfl9&3/gͼօhւi9:J(y 2Q9WJ$6‰< \VRQ02fH01PWJPR*}Ukf> k8nWNvrݪP>TW~ZT#5`6BHaDR@dpH?M`!+)r{pPA HȢVp:$5)AF6]ԌAjBu[f=HGJ#(9\vECٖ}@ `SLi}$+ʌM2'd%Y*k 0hn9b~"H:9 VhP_8H@\.q6-,ؚ2N  U3Q&K.n:p>خ];zquEtDu)Z$*Jj~3N9n=0`FV{oGi_5pEw g]r$2F%[yHA{%),=2AqPo"e5meg;OEkG5a$! #N P| }s#YDv!+hU5R˶ot6AOȃLS&);: jFPJ!AaDc*DμaXԾI"k* R/FH؊~ZXRLh}/R,VF,:)WTQ)ndlWB$EUԽ 5T`'{~P+-Iy8(oA&l[w-_Vai#KRZ\P KU4!TFЇ R^8)Ra9:!j6 tƕ] Q i"%8ׅ""[ 4@&AYWʜz2֏]"iQȀŔ9 S^R"L?$.Ǡj R/>U8ÇW |)\uU*h| b_K.1AU);)!#X2hNIi" hifk* ~)[vDyhݛSj_AnAԲ"U(2ejgDJm5;:X8okC1aPʠ^\ߔzHYe 5MJ)mX5l>6yXظH ج 3R9ߦO!fEAhipG ^arFFP.abRu (OYo8P .4TՅq?C:7D(16+nJ's.0^n};"+9 ^L#AP!d7@wܛu%60(pǔpI RdmY# Rp@Fm7d:L PJ(@ +R e01aDQrw\Nj"$i Bu@MG[XwWm5vzBLm X } ]3| N4T`qِR\7rUgJC} .#R 1 jxɉǝ8wdqaEk(6, VQQWnC_!*<  #dH UlRze= |uE ݞi@BrJ)BE:,ʩ>ɫh =!$+RqwF1H~XY15c,J +<ɺ$6 *_օȾ&j0"nOVe~ ̘4_N(v/~ܥ2RH,5AzUNGªyh =!Q[Uvf$z QSs9(v/(G!Bh5maBvt'"ryXH5$hfPJ^PJe'PS&$YkQ@[X TT@ڱeԼRdQj"nOHE/;Y:$aY{Fͻ R@[X !$""nO! !$7!d7@w{Bn(!B!$i(!B!$i(!B!$irUJM4kݴiM!B!UHIm۶vmw^:g]ԩSoGYW.okO!ꄏ 1䘔Zti^^^: @ZKEr! :T{V*#F!p8$HȔH-UloٲcݻM!$)YuK%rk<%Bj |>&9GnH)5epnWu 㔌 ҥK:k.d>QF*2.,$x ^xfp1Y~mݦbhVS7| RV9:B! l&2k'|SF}=߯S#F?묳 *g84iR^^*F!Yd;0W0QXEE"a*!q08T]J"ϤBt:Duc|ςn:AoJ07 7sep'jP a)L &*pŠnnOTFID &:tPiL"9*@j[5`!T3a5`>&5R*;^ӭnGC7A?(8%j;VI3fNKkƓ$ylәs"dlQ?FFV?Hx1 q40f-V~Vj$nʨ6 յ1!ȉo`BR#G}] qet ro-n6#W#FKJ\;JQX$$@#GmРڰTZ4T")&VOmuj+o77(w-3GbU]{qZAY\Ud|%jZff[ 'ӘrZwd[৺ӟ~RI]?j8)deYA7WDwW !Y Z/3ʛoZ|O/ץE]vz#<T=-)%j A֯__,; ߚf|N?0tX$Ml( yA Q B*Rņ8%niލ‡Τ*B& olj0K_*_ CрўUK8eXPŒH,X'ŤnѦRGՆ5!Bz0n,*5YcWU:$(qjcF>XcKP WǺqKF[] q 3UR5&,+B}E) ʍJ0͞_G ! z(:ڹy:&M4]@=QV U৺f&J-1=H~Ɵ4&nTYXW%lGbfrT*7(wq|[ڊJjQ lCBl*I#-J/if?h\R4*lF)ep%u(LkJx?2 YN5$3&Y_ !Y?ڰ摒j-5JӌQ&<OdLRvy"%5L\(W_V5yR8ADDu7r+C_60]͌:d=ђj$X"[TF!n|'(a.( 1NWXsKH+>Cpw8֫,n2T7IGJPRRTESQE6CǷ.f w9g>  q"V# Œ|lV6!1ɪ9RIdT=a*TWuY . sosBV(%oDMGPn膺R*ar;#PA w}1wCLyUL_r(hKa]7$~[WAX>oy*|K)_L]a <a` ''fK2}TWșw8J5+]LF_Y^ڕT F/xڤ˴"ݛir00 RK;vk \FJ/Xk`>q9-A*5N:or0ZTjx1(.=H \FJ@eRPTF*J@e]M^R?~\[[> ӯlmmDGOKZ$/XAr~mmMsrRDg4/;ʧ׮]HqF8mu@V)/⧁ nrp?p9RL3g:O?L73qcyr9Xq9ծT*u* ^Gw1`d&9A3eiWu:E煿(dtŕL\Dlg:DW6|3ϧME蜹l)tQ?-J8 Bۮ!hy^ia@yfXDrGN d^^Q3c}4CYsx\NUsț>]Nyj0tUAW}Һ;wHӜP+,N!/pDGW "Kt4V]nhX֫8WI׫`DiAyd@K Ru#O;-# zT^DSE3T5׏>u*ՄZadNyZ "`{T]nDhAD)[Q5*ieBΪ -m4 \㩨 fVt Hj${霋)& 5pJܩxvyY,ȯr厜>keK1+8n4ߊh==ɹUq9rGIo:\įW^ETtM xZP*N#mL1V8JFf8(L!l|\ U]WvV-]%v+& zu<GL|]<Y>,ȯr厜^< Qf`F.O7No6Rۓ@`P42lEӏ ǏoG.^+Ϭ{f,yFdVrhpB{8#)3\Ly9ΟshSD,f\()GZMUkkkR~xN߶+^0_FFTq ̘͔HrΟM+d^PcHe/B\n _|sν|xdz?AvV-sM3s@kX0sNy)Xf4|*HZBb9`nH`Լ("3Q83Jy`T<}tii)~}¸.HCo.Cd))ɓ'[Ex1(R%Kf[qx1s(R)8vvv.{Lq9C*ӧ߿otoJ#T&IO;lwօ dE_nPåp~ec;`aaAWdwwPׯk!Ο?oc;7+ R)@_wrTG{kwTj{{իL~666lN>ݏw{ǏRÇO8cpBܸqWdM=џ ^Qe΁=~ٱYXXh x4G'[$Dq9荎RrBm]=j۠5O^ԓ{9{~3c /Fi}`t)Ҟk#54˪JM:IF6umT4R:8ѣGp$$o5XAC8&x1:&3~^rp{t&j0#˳gϤymnnci$^#4{=&;zICw6L+hׯmYlR! vc6hdS H6xqdsɻu.-occ̙3zƕi.^]qNs+3+my߿S>~؊7oD3|rfO6dA4/B2˗/mJn`ڵk+++K22}1Vx/Hi)vs\__"h]ֺy 4L3odYe$xJJTU6uWMe`an]$s J 3ݼy>Vαzlv%4ZBY슯f$ob-̋2UUR/3} ū2ӯuAʛϋk>?uWJwܑ7]UDǒYM_f2 G#S̬͢ylV"fEު̽ [u;t-K"MWpyM6; a+$9p9XOeΕ ݰUCIgFق՜7Kai0Um.jaU(_f~QuVRgW|ee%efUf*zU?sT^D3uUZkuuu0yDaXA {{{6rdϟ?/a>"m<\gӣ~>2٘2*ڰUHwM޲I)j]*%t D-,mpehˎ:Ug%"M$/Wʧ:Ƨ Ej*s/hV]/ei{Ӊirxe!\"G#wrl#ޥKxq5&.'Йpr9؋O -,yœkc*v6֧je2?UuV.zI^^ZƧ8NyCUKgI*?~۞:ueswQV܇$ݲ2`,eSD'JQf&\VyݹhV]/ei{ӉL۷'Tq!82lelٕf7șDt5;t_5Ur/4^LkyyYW~)@ JL$mRp*NF d~ꬸ)'4\nR5ͥ-LQ+&(!3;gh3\Ob[D_'k'Ywӏ\5VYr;!]V@<\Z7 Q6w %}ݻV"o3r]z/4^R\.6TqY.xkf*U JJn^=LLd>#3L&ӤǹL/Ȣoa&ɃZvBoy:^jӟ4L_fdV^ vC2hˋ@WHKzJ6rXDtTC֎PJefB[Xf-^zBt94#ǂ2.e&dF'i0Ȝ͛7kkkgΜDUbooO%V.9U vȜCך++ʕ+V(cL~5kB!.p9Xq9x&H?9)zhBl4jj+@Gq90Y70λt˕+W2?iyS6w hrHRmt/FoHcchkkeswQ޽-..Z=.D*L ϭQ6w ` o\.sSNY1^,cM@p9$R)@YScswiSR)@)f-M_!2+hIR)@)&[cM/eT PeC.]+hڣGlCW\2 u5޾z*Ss}6_neM8Vд-[oԽTǏkkkf׮];s挝K'N|W|X_IDŽNzFXfmoܸK3yǡwZYl4綀gZ0\zc`0h6zd5?''ɕV%z˳gd>1\N]$gHHB9Fi2{xLSW]/_%Tl`0pႏZ+T֭[itˏIqV0 &`.bq9XV_`OS)M* xj xf"d4g=]tLtgYîi%&>ieD޺Mfڪt j`Ҧz[c0i`p9vRpN6eiQ#dxiF1,:eIT\y- [Fgn*MbLYP4嗆2+isEOҢv],I?yr=jA\FТTJHkfE%Iâ0f#hJWC?qf|eFV^LJE1HdZd.N?[Г'OEKe8V0OKree@i\?D9r0z]wQqiēhY^9@ ke㩯L^\4@-S"{"#s?#9K.Y2+)zI΃\?WC?1KH8E?D{(KrTJE"}8LF+@i KT L70 q @ɑ{QdDz-ñ ٱe +Ip98oQW&3HZOKa.!MJ;2hQTcG>^2 *HEv O:㲳ae`p`lCKKKVTgCkF\"\F?1 G2ȋ"iK1yWG0Dt6,(i j)km Ξ=+772+ [#ʀ*d' ҉ҳpIe:?#sHqǫFNjS.6Rɍ4!12ICLDcy_pL̜Cf9 B%*_Um(7 &#]+rpq$L`CKS)x1 VVV ~͛7kkkёU!ӨHcJ#h .ZVFr."E/^H^,:Hp(J(9wQ-,,Xdb+b iAGV&Rf\o*%_˗׮]"9,/)MH._k~.j#4CeB%2^a߶?iͺiD|= RGtHROɰ8V0ׯ_ Rh39s98:p92שXˡ,//1\pURy4/9F#KhIe _|Axۓubq9YS/!et%]َq @{ O(Ͳ8V0OK>t^,"diˋ:͛r {[[cٳg h1.s9E* ?<^ tݔ߄.l1LCr0F"yWtӧ?Ѕ-Ʊ8޽2(T y) ]b+eއr0 Dx15ijLM–XĤC -.$R)@ ]ؒ+އ@q9JlllXn14+$ &&}ꪕT PdoB$ &"pC~%9V01 ,R"П?necKr`laCPիWy?LZ`LM–X$CBR?~\[[kd}'OO~rܹrƍm0MC1^Q0#Ч؛-̱IJe}.ѱTj04GI޲!ʊ$N_%ɲN8cY&Hi͟={5>9)d oB0 &)}:q͒>R*GlyD٨ӧO%$?~%lŋVHMyE-̱IbNp9ΤRQH3H1MC&57 [c19\zfvƍ%̋1)PYdAzJhdLjgΜ sxbt[G`2V8阰 ]n^UѢu$]c:&dyy&̖X]rŖ7tu+*ʼY@ (c?EQRFt= +ʌM#ҨD&gM4@UOBLv< &,}`02.7ub.suWJh$ܹ#ǏC(3(d,,"/6wUf |2 /+ݻw`VP&QŻM-ϱ ݵ M'urrp4K9E?*N$ƓHA2Y$EQƧF:+BŢ|߿vLB<PҩS4;;;V6a< &LN'4}\Yq9׺TJHԔaKdXɏ Q^X?I=(Իw"12Ҋ'̖X>}9T={k7\r0@SpURIINVz|ّQjz`nW{)+<[cw%[t~ m6%Uq9``ژJ۷oO"%/H$/5 iv$JDR,9qAA҅lLlW]Yi6\TGhRS /_;n*/o t>:NhПHBV#5ݻV6yH &ȡ%+JrpgM`yyYrb9׸=g mi ȼ̓(/<4S)li%峺v2F3ޓ'OllLS[spp`@ Hz܃tu* z{FIAMɬ}]+J B]7 :{CV6-` Z1۱ "${{{V<-` hiiɖ=ě'۱ "$IsBز+Sq-S`c@ ]m.W^!D;$)e;V0E߷e% v({Ǐkkk}yTKJ}"قC3y -۱)J_ ץP[o :\4O*R@od~QJ2 +"[cӵhR-dǶc@ ]j.~ɓ' @mC*FK(%lL_BNvl;VЙBZR@oRXtu)4nLkٱXPB7O>۷6 A*FK(%lL_B#ȣ̎m :\48qŋ6 mB*C{(%lL_BM\n9;+Jh{sS~*͚[T ̬(%L]uYݩCq9v(]ӧqVVVǏKiӳzXeJ~/hjXԵj[ z\{VТ"ӃÇb5p`Zumڳ5Mĝ;w$$677 D*CY}QJX +VmKg@ k.nu7G*@X%+VݯCq9tyV"_R)oB{~n -.XPBF2_R)/V fagg*1ץ˳6۷oT @$cЪ_Bq9s(a~AxNPuǎd h.T 註wA;ti+5cvu @ّXPuJ5 jKBZ:f3\fGc@ 4E*tѻwuvwwx֬BihkktƎ%\PE=#vHe+kc-2]cc@ 4E*tх r劕ɱܴ: -..Zر ":paaء+nc-ݻo=1XPuJ;\[cpy͛7 @1XPuJ~guuXA;lllXZM31XPuJdУGZD9g` h.T ϟ۱:;+ncqYݻw @wXPuJݒ>7 5flg.ر ":0ٍ +n cg5s?n:Ž^ h.T 75rӧrCm.eXPuJ[XYX+hwZNy#XPuJ]qpp`GimbsM:=Cױ "CwQ~LWcc@ 4E*tEcse3yu(悺HNݵCi~L߿oZώ[ h.T ׯ!:$UѱIVu(悺HNXZZCth}}ǪXAX=+nv:V@sA]R@=yĎO͇UѱVJ͛7 @AXPuJj`0VZ:VJVˡ%+nv:V@sA]R@˽{naaϡGYq+Y-+h% zVKɓ'V u(悺HذsH2+ɯٳgCVu(悺H vpou2v1ώX h.T h>{fu%ac@ 4E*YG߈`uu:nW h.T h{X8@رXPuJek-fuuA~h%;V+J.R)Ο?oӧݬ$NV!Ixfv:V@sA]R@;1tEV] MUذbcc@ 4E*SX+h .Xr'Ov:V@sA]R@ Iʔ/PVc Z/;;;V e(u(悺HCYXqY+ӧO[.\`eZƎR h.T hҎtAX`QXPuJmn=cfv 2@;!XPuJmwVo :"}"oEZQ h.T h];νXAGdV 5t(悺HVI__;V@XPuJyK7CtGoovp:V@sA]R@{_tJE~h;8+J.R)%$e͋tJeh;2+J.R)%zsKJ 8V5ܘZΎL h.T h[RV5tƆÍ)=t(悺H6HoI]+[ piiaS@{aXPuJ3yK… VAtmnL-aǤc@ 4E*\nI [ :S@1XPuJտ[RVñnZv@:V@sA]Rlp1%\P0C%%lM+,nLdGc@ 4E*Е+Ws~KJؚ8VYy7dM`ht(悺HYɎ:G++2[ lssVƹ;+J.R)`VΟ?oGwcwi[wY1Cѱ "fbkk9Vq>t\Ev:V@sA5r~ٳVvduu> 9~ܒJtDH[K/qX B5TMqӱfXAe~í/]:n E*kx?Ьw:uOǚcjkཋ@'ЍAHPY+:\r`Zq/Z9V &;+0Itc R)|<p[1 "3L4T (yEnиφي9VOi!@эASH0Wt4ncc0ousGgo-D7 ˜F^ZЬE;zVϱ~ɼ+01tcR)r]t0'{[= %oO` Ơ>R)rfH?{б|1T d^Z,9N:e_"5twdJ̴ZXXg)HPK|VGQf 1?` Ơ&R)]ZЬ'Oȁ;l=+z:7o޴bC7uJrI>%677mt^~`<ܦ0tcPp-h\ޥKlU+G٪:N"F7c#B #}ֱ^|ʕ+V `2`lRhӧ4 Ѿlm+9 эxHЌ-  ֏vc}w+R,ЍxHMY__N3WoǶuv`d^Rk+0tc0R)h>; s27[m @k%)@*-my{V۱N 4B*- .Xܰ5w`nd>ɗUH-\b]fԩS󈭼c$3>}4 VuyT`X<{sR@;J=yĺym+3y_yMR)E#;|6cݻ {MR)SNY9}~E*X\^E*3#ɒL5v^~m%̥WP,..D#&<+ɺ3^9Ϻ`H`$:uڲm 昤Lߩ@prX]]qw޵)m ‚mgοY --ʕ+6ܳ-X{m? S */Z]])@*U(ל7 '/N0<.mxLdJ.\qgϞ%ئqCyidS6`89l8V'/9 0`$S(A6cp R%~&Ltg3YUGmXl*IM0`R#+@LXeS6iL7_uE;yH+@v"`EUIDATp#_89af~k?6 }݅f9JN mtM|+@ljyyyooϦ}tQ~|sE^.9O٠azLZrom(W= 4dɓ%&kӡm/ PR]GiL6䗗y4Dg6 m"&H Ҥ)RH_F[/ m:OdU^< +L&CG+WX5!٭-Vs$_R|1،=$^.޿ZqmLlT,R$flCHz(6`e RuXYG<|yyٺSNfJl9V$Y:}mGlRL ToC،}u3"+fe(xrT,PegRe^ǰdzgO& lRt,aw2I Il8̵t[WWWٳʶc(pd$Rr}`l~ſyK ]>_|awK%=O+%yWxI4e~T^veۉV޽h,7oe}cXꔺ~:/RɦHFwcA㰻eD F>k'Rc"䇃Kw[\(f mVV>[[[O􉥥 cX*;{m,'oT E^r&WU_{+pZqr9KoƻцTJvw_]V՗'oaT;TF|}_沣Yk'ѝ%@ѣ$J\tuvtcymP<]<^*5ޢېJ9zp]iZkc+jTy}ңYs׍{U-?&#֎^Aj''6 #Lgt MdJ RI /.s(o\?B&E6iٿ^GML?kc'72t K%ae/ӼXk>,]Ӷ-.K!{S3Ź5oy4^f>iqMz}-$/:d2^*i%jQ\eFdˇUAjk- IԩSC˶cWQzP/X^lC|!E- q; }SY %Xkf*e%L-*m.cl"K+g2Ϟ,ɚN?=Ɏ\} ,TSyx5oyKC&~NB\Tْ(*<:da# dj''d|ȐAV,ZiQT%, %$`F> %a(^wj++[/#Ai(yt5Z], = aY Q괓1jTm#oidnz˖lWCBM8a Qޕ+W ^0͓u5vXXXtR'O Z2HȒ0+=H?Rt}J eyװd#t}W/Pp+qg:\*׼tڟ%e钰eDF^\"RWFw62YCuz&"+UН!o?:ZF*a&2D}S A#R2A'3?YMqقՎ_r沚7iA7W٪}cNt>sDj"@!:1Fi·Af*%$$鉶CD+HC LFK` }fu|dp)IܰC^la ;%=Q },) >s\qA"M/.O'[V^kC[I |6Nx5߼ETJikYRd32SF߱؊d#J {7% ߄?eV ISt|tX$' LGZ 2{ؒ7 dTHH.g.)MPj( FKZ$ )i߯Wǂ@ۧ Uk'joJ]&f)Y gT(-Ry2IeVh9:Ld(.W:vG> Hwmm\ АϟL _tissmB)QGx$xJP"}L;i! DQWO$X$B9g9 &u%GY>Mk?HUO;$g:kwg | >e}Hv"ƫy-t\e֖Ave4h 9>v,O|V6vtHSFh&y2vTJE#e\֣FҿQWB.'D+8Ie5(= ߚe}>#jut -8>3$Sr#>\1j^y+ y1Y)x_KEQS4%ZِTONͶ'r;d; ّDh}}}uuEg)_Sbر4JJϟCF>}SEPbT)^'$2H8&DleD4Fu|=Ӝ}RiqlaUgG<>eNx5ټT(ci^F<] |xH92dۨbc|'/!'0MSLMJgJ\;~ʐv|bv = n|ai'x5ӼK{Dgc 6v(J FjJocǕ?v X7l_,NX良0ᗘnzG]agJSmv Ţ^s3'w­Tt@uI0Fk6> _t?}N $—-dݭ`,~wP[wZel۾(c+{nccîKlFSC:KC|NJבQ_`/](#s^^ ygʜN5ٟYq=Ppֈ//Nj^y$K#Ef[/"}]쾏ZlUl M'q\6!kI7KU~nqwD֪T25YFJ# ;SUь:y( Rfc&oAJl(ZVRy@zuI0Fk6o%" RO9.}N=+{ FiaJNW~noٱ`0yݻw߆j =`^~-%e'gաT*Lxa :2l散?qK<6s(2A !e~GkUӽ i'x5ӼI9H?MH֐^z~nZܩmo L0F^vQ[Hwǿ`T6 &i(/{{+_>\*%6_OT_U > j*}%CNtY=ʔ^Rt3hWw$_tY L bԚkQͫN1j^y ?T*kN-]O7ut2 3' LJzU{āD2v2}$%cBV6 ' ljUsg䪢eTTvƫy-tr}hhgXgQ i2EsHVlE]S"SM2H:m2]rItַ6ҾW-vD@^#Sg"Tнoː^~JMllu#Hvƨy-U@ʢCT}B3' d1{W&я(l< =6lO6J_3zÇ> QD(gaJk>VAK Q7OB%TMT͵{֟{B{Sj^y WJs "CT}-FN ? ~}eT2:7utDwe?ZAumGxکsI&AODMYOה](;R>"xEFa}oP^kcnN5߼Eؘ:/Y*,=+fN xR/]$}4 EΕ$tOx6x4 ٟBˋ#}7TdMh9җJoȠ5:Y= hW,>&}Z=+ӽ #OvƫҼE}ٿM:#Ѿ D] ioN;d0؊%v*%rp]=Y %_ Cz!:c<)d{`qc-VxN5oyGOߡQ|Qf ͜@oeti'rZA>bXXe*5%hkxHz/(#dўT*oMZZ3rUt/CSj^y]oοDuFN =?9q|!m'^Tc}As4c3TJH,ص_.BK Mzyde<|Ch!Z:F$Yo:Z 7beDQw^ku_Ȍ*uf kBahLAn'^t~lO_O6b_SPBi4|'2D0nY3ɢ?__gg5Z g*Nƫy#[6ut0 { K*k댜 )ꠃ=lk'QG૝&kU[ґ$6vHFoJcO,hJVI"2^Rr<42+ˬ҃ؤG$l9[tI% ǀl_Zgeӣ!G絟1T/lg_i:_JT13e6`.dw˦gA Iҹ$?({m95Ul,O6x, ٟ2LKl"uunGYx2$Tْ''p^ά^J*td4hl ]$rJ k-gXJgv2^͛j޲%3 99mQvcc r$ƅʐy ' NJX$x@Nߟ NNmG*.⌼$f[7tOR)t^ɸ>v7NNmG*>FQ?wυ OR)tT~?W&' ƭ:#Rý_30TMIkoG~fc{SuǭIQH~8[Zeo/y&?"$Bw}})^ H{IO_u~'+h+CɊ.NND*l8A*9OϦ )NNH*upɠt["IioG&H%'Üɱ㪟JI}t@h42A*9`J@L ɱjhO :?9V@kprOcc''@XX :?9V@kprO<9moo_zÇ7S,r$@ǵ>l1K漹idy왜k׮9sF{ĉ_}֖M B/'zW'`0ߞ///߻w6ۓ@6Q+:> 0srҰ2/Rˋ/llBV:^*Jpu/_D[$F$i1K襝?\-W~ƍO>۷0;%S޾}{d0$Fh=$IcV/txx駟*F5!@+ڍ> 0W:rҘ5p 9eiAMVpI' ƠnڌĔɅ =ᛝrctmEC]:9 gVVVn^q R:t>hlʼh$DgNN]y{6ְCEch $:vrXp~4[<' mwBc@k'нSyG)z9'/hOMv3{WGa+ڄ> 0wr{5MogDۜ* Ru@I<#V }`u4_ <a1k:&?22<g@''^st?]BN?%ʫWlT͛7kkk\(({: yBh9NNL783o?JTwŗ/_&㷷]&E[nJ?&OY0O-ovF yfcc?G0,lkk&(X07 :ֹsh˟+589Z' h NNֱɱZu,rh˟+589Z' h NNֱɱZu,rh˟+589Z' h~^)?9Vt }vrg}V3f=|CΝڲ)={&wBbkΜ9'NꫯYK O^NN~$x߼yӓ'O^pFi;:Ļ{~{{{4~=~xXIyПӷ~+1%nܸ'}=>HN腨$A/]|:@oHlXI9ѓS1K̹~yi,Kɔo9̛+Z> 0?prҘyf<2Ö.+-PѢ3 ʳɱs''#͆ ["c|` ?9V}`tEN͆4yf{{{0Ȳiw=c@['PNN򙕕sW_$jjq$E_*^®c@;' :sr &Ǒ8 ˗mpp(.< +Z> ձ*qΝ'O2<7n a c? ֠Oc'' ?ƭ#m" LQ#l@#,;V};9@yijgV!Py 6O̹[}CNH > wzmBs<9M׸o#ueOX2Iy)K4Z +++^Q7oެq2iY0O-)a+Sǽk׮I EN$_x˗!mω'nݺ< `'ZSL,N-//k r͛?fqD糵e1+ }89Z:zcc''@XX :?9V@kprOcc''@XX :?9V@kprOcc''@XXϓիW?|`:' OXNN?~\[[jƬgϞə{}}NHdvڙ3g/N8W_mmm|G O^NN~>hi;O>=y{^~mcǽ= F?~lcY?v莳#?'oV"B#1KHؒ ^^*,:K @/_5Y7 #Vt}`Nl7nO޾}k)i,Kɔo,̡+Z> 0?prҘE:4D3̼&TRɱs''Y [z.|O-F7>9~rm6(l/\`sK' O̡.U3+++z[Hz&6 T^:ʞ99=j@yxnGpH/W01V}c'' UΝ;'OdBMœ [0eG+Z> 4 M&u$1a ̢c@k'нS4M޸q#y,'mBs;9/%lMUinWR0~g@'\'ON.,̧h$<''e`0XYYyꕍJyfmm-S0,r'I~D9_x˗!k׮Iщ'nݺs 4ģ-(GX0O- :֭sh˟+589Z' h NNֱɱZu,rh˟+589fluuupO G`߿o Si03B*å%KJ#afT 0{nLqK R+c[Rg*}>+yc[R$@-g}V3f}'Osܹ-߿vZL++P!IU*%c0ԏYB}DbӧOe˗mXFr5t8qbssS'1IyПTJcG#1K<{LٙqÇ^x~.\?7n|'o߾ߘ> 0'zJ5ĦE'}tQpc[R$C*1-7n :QBSܒB''JS)Y[?~/G^jɚ0'2oLqK G7N`9FŬ)3` G G+FJoLqK GC]JM5+++M4L":hݻ7Iݘچ> љTJԃ4|hoaN":hK)I?Ppc[Rh$T "ܹs2_hS^Padp &Q++NIt, r~F=}8\)7ctDc6O{&wZh<*&Ӕn2?O̹Rz[.H؊b^y*ऑnBW`>I>I9׽TJܾ}{_ Lӧ,}`u2(fS% P}Hb2/}|䱎5qI##y@I#H2R)P|e#f鋷ӯ}?,R*Ȕ7`$-=t)G y=7a)F*oe/7aJ)=F*W$K }v&*4}sE ?~򟟟6Zp_e鞒LK) 翵R)B*!?{κep_ʤF ;zT @Jum_Ek$t/l(]zO@J蕚GNJ#a(LP ۨQ{`raS-',erՓm%;0hLJסAHUoЅ*J;7e͒nCS[4S2h;M2Cf_S2m Qi~7OG$@-g}V3f}'OIܹs[[[6qϞ=+??˜ӧ'N\|9ÇZL60gj&*ÖєaMw )ВTJjҙW>W2m Yz^f+JWV/_ߚ lIEXMRA*c9ssX\Z];Z@^R~#5H@Q΍7$ּx''p?W^eAd^lҾtU}Y27Vi//CL)jҡ.cKR>W ˒^TIEȖ 3_$C,4`Zte0}'v6   clһ_R/H΅OA 5s> 0Jii$fgϞ]SɌѾKHRy~Z?C޾|0W|U66fmW?K:.s_GO5?,E;W)|o֐\-d8YȑL@~)HnVOFJ$Sw/ƐGW!`BI}r$? Kccwl^CR E!N 0?Jihx.34ynL䅭 H~iJP*E#dL(.7HW:ezR 篷Vӗq7U|Bc$+E2H:I l쐿%V/ROuT#Lvq#:XFdQv¿g"Sn"<[KUa&_m?$\|*18X!ﶵ^IcȒz4d><W'p LT]! ,NG}T?D(>W|J -$`a̾ dAjB}R1"R5$5IZ({Vp7& 6ݨ$ Q*ݰ3v;ì*N[[@7NH.p22r{{["oaZ DҐH'P5@b`XvvsV E U.-6E\%R2>LnG.JU^TJ>9ؤR{Ɨ3v;AOw#$R*oYYYhEƏ #{ҘKɼHUy r25~ JNO2}ppۼNjX*p }tnk[mJdT?e~jREwR~SHi6Pun?$?V" }̕ΤRr?x@RSz}-+L:>i5TiUÖ,sK'а= R)Qνwkc+~T\iT1})J= WzJɤWCG|*TO:<ìZ> }@u? Ν;&tУ! 8|\D\dpɿ`dTQ_ wR PGoSL'/.CJnlS)K~ TJM%"Sv.M4|WR\[> }cTtFp'3rAJD ["obCɐZے W#^. W=ަZ* Uم_Rs2>H[#bw῕4U~J/+Gغ> }{YL ј qǩPɰ .D| ?!w>ȣ΢9^uCwKNjX7K=Ý^zClMQ5WOwdՔ*IZp'j+%;WwTO@N/6v ?GI% 3AVA6N ˷s-,lޠOcսTJ(R4KV2OfI/AǻaK'zhBo;tFSdzH7Ԧ E2HN"#2.Tê|=oEycSh*%KҒt2;2=Fknpv.$ȊlLxBIt 0J۷oOڏH^kBQ̋&:__GE;w.Zʰ=kԧTa%#S)@yU74S)h~q NR)r|ɴ^*%$Z43csKb~ʯ{k0{> 0:JM4leny2U||ݩ왿 -2?AVO/Ved H~w׿NoְTJY/*)s,#u(3ܪ~\&}J lrVz>a/|}cDCw?ӭ9?21U2^)^./UΕ&S'%?> rR4iȌ8B/d1?~c>}?@IbS Hl$V@&hV>UŊowTRuSLtˤ'kpoNNT>zsm(> rRw=3o+)ʌ}aQFnllH`sE?^7g0L%6`+Opg^`> rR+RIBWdv?HuAUgI0!~]hZ =7[ﳖ$ϒJar|{VGHuHZ8s$}۷w*+++[[[VPH4*]It'AR)=/!Ԓ׳>|8ࠝ:7)g˗/6{=d6u떮ӧO#W>^6QyI9ѓT} N|#}\䔲]c{\RKJ@ߥin54ݕ^]B9 AR)YS>]-=W_ 95Ow˜ݻ77,mjߒ֭[6G9ZJ[x]D+O4f? KwϋLu߼y#3gd2TR $yG_x1K#%$MW*uԶ.x֖,[˜Xwn$qܹM$*o}字63"y4Au}`t; zl+,y\y_~{|Sy=! Jׯuf)2&6 |R*SFiaۨ姌ȢCݯBs=T$6oϲ!32_֮|$5][[}:^% FA4 YW_}%u.s z}JsKT8Mj ָ,17W]I.O=gv;9D=ʜ9s&&j&٩JL4E*&Jvyk{z+DZ/܌yJ,4/M!,ܭ;* }3H qJO%/i+nA-JZÑvO:U1y\1]D3T2sCl$L[;soU(SAZkQR)$TP%ܹ#W32 zgvŴ ݚ;Apߥ9vwZ$:JiD%zw?]s$Ž7GEο8@E}ВWE) +5[[O/zQMR#WRU*6E1#^#yVk'-FJ/a!ƴ&ΜŽ7߿ۋQ*1md_Xz IE5dMs]kRP/tȭW=Ϝn0RY7{#kw κˑG2Po|&Y0JŹGi ~5RtʏLl=.}-IOK۷-{E`ߡO{i/ꋧ[1#:rT]ORUwp(|2EMgc_mߕK,52/ϭYD.T&:gY59_lmmxhzCB&?2G2V#3xq>IO.){=׹ΥX^^.~ noo/A;wNz3R*?e#pkL4KT2C(NtђFkKlrtIX&PHWӭ10 R4)/{"n>m%R) @̼B*@>H,?$ Iy_*\ I*D/T(xaƼ[RT *#H2R)T *#H2R)T *#H2R)T *#H2R)T *#H2R)T *#H2R)T *#H2R)T *#H2R)T *#H2R)T *#H2R)T *#H2R)T *#H2R)T *#H2R)T *#H2R)T *#H2R)>ԿIENDB`performance/man/figures/logo.png0000644000176200001440000004222714257247716016466 0ustar liggesusersPNG  IHDR4~sRGBgAMA a pHYsodD,IDATx^`U׆lKOH{OR(Y`QbCŎQQAzQAPB wH $lϹ33I`Svʝ{mb#UC-hmr7ypV,~ޟaewd!{u;r]=#@7،% ZaDѻ FWyP#@`^8jȫ\BV1Fm0ʃ4K{V|a8%UీN؆EP|IkM ֯!b"@[BY3yK EK7^hΈ/o@x(T"{.E}L* #U$0о"z[.YZMXNl{@`E 1NH5J,d~s1*]r{r[ pE](B3ޤēm6c]ƹ]B5@#L°շ`Am td׿.Egq偕==OZ*kk4־˫nn+1$ZG$;&[2.n/oTx߆\ {_O U\i1gʫnynn7u`h/lD㢶hqI 53})QQ[l[[^;nR$P! aXMR@*9u9Z%hYj֧;cwb--+XPR=͹ZEj:HYtoZQ| F TBtux s877RrǽU`kǧ'@ {w^PJpdC R% KѲqI6c{b6c:?1gwS+i.߈~A/Bg\-uJtyU` t AJh}E%VoӽrC-?ѫ5r-@aHSoz |Z3 Z^a^VzЄyk8i r)3=HN:݄`+Z ~{cIO b]U#}`0sl 9j\r#v 0 {z0d8RM#bsaӪ{z-1`V{Qn3[`ҖAf,O}=U9ѕ"T̞!9XJZ۳jlMc+$C{f!+H33wȫ4e`/&`n"r A3-y 퉰KJYzQmm1:Q^]&)ӏf̠\Dgi3:ʫ BlL0Mg {H^U(Oh+&{ 4~[ 9_"KVd`(tXVB.1?ÿWԓچyMm^!%16?XeZzw݀ {A7)wtLI]Bӿkj+anyz[ ΂*' IY)Kml'D'ɫo7U1_[ >衝e$oEoÍkßFXQ #HhU4P T~`z# qk.KbI'J $:oN5;.|^6ve ^R䥹KtDp=f^:u#yKSC31H)ѝs? H#!4Wv?@!M ܊ŋݖ58tyh"ك:X[*&=Gu3Yw$W:cx2mi>n2X`,:<6Xp;~l3#E~FV^aJkJR}۱;w"x%t$]76#=$V)m>G/wE8Vl?QS^]┊ca hls(ĪM8)^uMaZPX(NjgBH<,񆞣'M%F |O==Ge׌܃[=H fD.h3"ݾ\B4П9"~!oaJDt^۰MV Gk{3R@+ѬAzhFo3F4*.aqK^kIc?U`<My"I02yn&$B?gi0y2,[wB1yUGIx=Uu6&Ӊ?7)V!l&3 X`W#{gZSX!Iҏ *4>ntƲ+vEPcCb IJh?.°IXh++U&su,{f2BUn.\mcԡ!^hviH7fsP%X@:hP+sM۴MRw&e FӺ*=xMꂡ{Nq)m)09BJdec3:}cnmqER5 (fP޶;FW r_-?HEY3 F2-*S 4#/wE,xe k@kVPƊ+~6= mǃKG䎠X85)Ul6rlF АeɆ{*o-7V #*gn_p*@Y?a?V<޲X0,hSj=~`͊@Xp .;ߵpDls ߌ+>|݂;3LVR̩b[ĺy( 6{KlWũNGF o?Lt=A݃c5n. W=˵#8 ^rÏ[ zPԿ7t,^x%dl5 gX2jNr WXL'ߌiv8kJ"Yiq)\\$-]^=|^}zg1olއS8Mw=͜A^E|\][;ݓgWyX>ok+J87ݏeƢokS*~5ar͇"_޴H4'9>F + @o]h5Z\7`W~sdڲ n|h \WpwX_i{ h G-7ߟ~88~ěa፥ }jCGs p ̽[Sw[S0B[=e7f'އQ^t~8 D|y]( kSUC፳bYn Z>Z/ >)Wrܿ8_cb$܉$LÛgf bZgP?x#h:akg>ONvXM`B{Ŀ!b=.2ObOj~|OV]*tD5bXwm \!W5鸸FU,FQwwƛG1t&f6x]lKNɫ|؟q@OEb`<h]d61A%!R̻Z/-F@WnZIy ._;Z k0ѻkWW j֤sKk:=_m^ߋQp!&U#ofb1_u؇)) ߏ,VȀS$U,ޘv4-ɦHȹL拺:8塒6BOOM? ƢajZPJs;l^tb9r@ `Qi|p=i0ܰ#bF4a $3Yԉi8}AH ]F(w|)5Etx\7bIHb#ٍ?"Ks0$:tU۝mZsΎ M8q\֤\A\ȾD@sts&&x,!R%af]1}'5G|e|O(Ysx}$_\A*f!^ȎV焅עRvYXX,L݋'{,k?o ~A}?^+?VYXO%c^<( =[󿔉H\w}[N5&+m_ݧR2Xsm0,[͇m'@_c"7-t++ո 9C 2큺Ħ#OK;Q$n.6R2Ç+f6KȹdV_GN1iT1t?Ĝi{ V[ _}c6VloZd;F$|_l/ RO UGS IT Ù fxϠJ}ųdX\o\ʈN{= P!>SN*yP )|S䦩y3ǔ M:'@s.ЃegTJR$;4ۙyս~{9OV0>N&Yi;U "ƞ|,z2Z|Kf9Я]~,{:1mL.3tA7>D޹qMGX %.uL7@:_\kj7ɿaFuI?*f) ОlI C¯ Ee{FSaq[yӘ&p;/;vÖ8W9OpJ޽=ИXcWr%^b[œ#Np>11S M>ƺ Y8tp 0;A,O/;'j #)P*LGѱ[*z+ U\PnP']V>A>Q an-Ru#|s1>7LyEG\.r3y3=b}x-A_Cp4#U.ޙG:3tԎj$r SDBɫ_]-Z*\}8q8 S:'o++3Lq(lm8Gm;Wc8otVuk3G~W>Gg'zXR%pa8w5h,/q[(#Dɞ('xE[pŴݱjzda9ſ7tOSDpd9nI!G+id݁͒)K(==K6~J i݂#|?\m(/<)hf`cv/TI5I:+Z҆'eu Շ:t 'K=U8-).DkV`@EQܺ(%4Zև'D\<}_./+ }%q#a;kIDhϰHm: )2H wWo{Qdյuؖ"EЏ՘(6>'G X^j. (xkft\5QRGԳUh[28+ R12} ~kpGVч]`K|h`_B[RԠJ'kwohU|e-&l*~*¨9>;\G|Xd 6qs~-_3ۧ ⒀+g^&,]Og5}G$vRKh qs\bMgbt!h\O Ŧ6>i`]w ~7 W4AM?.Dβ|;bom!y!FDKy܂Rǧ0SbM;O T3T&g7RVx`BБ^=P}+H9ǹ_}ҀF}:a}I;,v-蛗T<22BU%aO==*tFӲUXtO:"a|[ j'Jd3\֌Md~l0݅~!=*ߕ⪃ 8(t n _/_ L`QŽo-8*vDpsJAqO3.YqcH́7t=k*Ώ)|n!v@?n&?D;gu+ُ;@(׎*q[}5*M(\9 -9\۝f߿p`!|5K{uQ h6Yu|} C,,:-Ub9()}#DtSc+߭ᣈ׋X 6 :Ap{aj'Em^N:c󵔆(t^!뿈v)|CuCU9Cd( s3As>S/՞CNJĂp~Aqqq_!¯_5zOtTXzެ5SpY7 *h2fzi\4mr}L(Y'q0ȓNWۣ?Z&3s{B燇^#W-ԩSѦM,[ O=]+ewRU*yl6GXr%$ j*4*t.BQXrՋ톈:VTPU賵HMMu\g2Lg[^|6oތ~& K,ÇQR%|y Kx5!ӥKL8ժUdz>gϊfMZ/}! ;.ι<?233 wU+Q-,do/o`Ge˖j`ܹR˯VAm<|}}1}t$$$bp]w{!uu|]:g_]r Eu 0mD4+-" . [;0r>P¾Īy K/AcϞUEXc"EnNN"##ER ԩθv1Q<< ;v,ۇW_ޜvZ!~e;\-"@+D_v~y)/_ m?݀s痤N(}v w}b9?4lPD۶mCݺuk.Q >\C"ݚ!og8p%x(y1}{=IBBٖ[4:#@'PG% ooo|"dzHߟ|28e{VZAgmQ|#p ZpP ?iSihEa_8pԿ:yI6i$?~\vQ8||'رcĐ~NU7x"]&_..\ݻwk|JV"/dΝ6l>s揤5c<t?+2:uc9rŲTO 0|f͚cǎ"apQAOQ1#:8 LGyD^[dRh!%6Q`811Ǐ?b1B\`jBiiiXƱ5)GJc8TW@2D~+i$g wS ?ӦMٳE~~~ӧu&GV7'n47Ø?rX"yw %Pu B!;&1%ˮ4Qꍘ+Q`?쭷Bxxh*Qx }./y>w=퓓7t56 o |Oa`5ZzľrWƘ1cA𻪣Km  /gùo’-Yj5&4@۬G%CELr/zvE׉rG!6m/?:z:Acե))m۶ŹsD qf7[2Os8HWgw P$Aw ŷcK bAŽHڢxw_#DDN0y Z[:/՘W޷o_ZJ^c`gztO%!q:_ډeg%+D6_ԗ,4xRz\zLiFcʅHo>Ut♯Y֩lEcv*>&T^Z/1?hJ1Ubq~d#!{u6[ rf{<)Y^O_`_!1`<,L>е|\%FH({8kNߒ / ]^qN- vwN݃Cͥ:i[B06"J';ƕ?SBp ><$UN=ry:%]ɸӉf.u$,9 gCC1GN"tF~PjiȾ S4mՆxܩ)a^=Á\(䢕, -p?^NiYBj)7xh=i3}S!+!|`vNbai&4~uI~,K0?uk sf-cʟI0؄ -cGZoYעB0yGCKcR(֒\&A+'C5wzW8m-Rl2&_SY6֣bB]HOg<",J%#muW CRuhori[|_ Nش=l?;H`D?Df&#c[U"uE+ *O\S5#\&+&ojԿ&+Nn&7GWyq~BI; F{0u2i!jNl@ƻm.(q3q#AĔBz8Ǖ|IcA 54h74^M^q~Lޠ";WVGث*A5]Wݿ^CUT[ 6#U++g&uęKyTQr'5eV%oVcse87(&# 8v^3l&ի_ 3vݳD,2lX !Oͱ}oOk Y]T>~r_ϮBM{g{=xWs\ĶzUo[OyMA^h7RvP$]j|yM):A{DFo-bt}lGbq4";# 6=U˧f֋qan1HF!OZNx9=qE_֖枮U $ϵ\Y$*"4l.tkۯ rUkS&o! !O@`t;/ jf[t3*Y5x %TK?b.Suj7%4W^+LSD ~zm>8 Xn&s~5AWKyd.MsZd槾5q6";< L-:R[p7 A2gI,'o*](YOÉ7ťaI/w! ۴x)WM5in–'iSNO Mwj֨))<>HZv.>W8yPWnW tX҇|@jWBk<6$S-h36&2AJ|n_p9YHڐ>bJE| ,v%>>ă?coNKe; &wBcg29Y8>~}(l7.|-qiА"g)ȉb&ǝ-߅_Nbϸ Í\d?cU>_zN~z2*|}'a^Zq z+tn7mpc)ŝ $Ⱦ<z{Q>%˂n+RHmLst#M"-ҁ;3y) k>BCBqHXW^{Eԃq%pZ3 % 1lD3 .n' wie_Qޕ;l wJ۷"rڄ0gP~J K6r. .]X@XSKh߂[sS*9j}::>ԧ@^(ߘJg+؁-ivFMفk)()vٍ6[mلz?΋~[MySl4_3+K$W v%qDZ?s\6{/)Bw]WV]đǍ&ƏÜ$ pd31Fa8jn؀4b-neaH҇kS2MqtU.Wmfvr[|E57jc4cKO2@iQC(܃QŰ'oMѝ0?aq_CxQ] X } M+{qS"Rs~)cN|DdKȩ\\s]"6w |XB_vZ1_7œ^|!Xmk/1gqI`v SO )huS)n a6y#B"+Ս]Bah[/$Sqe_ ByOpdՑRs,|Ȗb׽sޕ9(oud?)ȤQQBx?JsI]r[=nn 4OUl0|vPRFiJt<=va(:fLJJ(0񿟖&_߃)h~G n[~E!ԧ:ݫG%FEB|BӜU~uq6K"7g_‚sE1XG۶R?@R,ǥ_O^̻Y\UP_9weORK^/Q2=Oh_V 㗷x( &ѯ}k)T_3zJX&CC<Raqg`YKS SrK9WT*> |NVElpc+5 ~L^+-t :hyYO,/dk(XrʧPp*@B̹sP9ݥWn?:-Wbpnq콊Ź'i=FA\Xa Ϋ Y[ 븼/xX$ &n%.ryZAAgDaػQʢh$BoB  "vWCߚ"v .6I\0`bʨ1|kC-y P2Co6v!X!Nrqb^qgG),Å&8'xJw!1\VC{y~xKCI&DlG' @UtΣT3#a'D{}#K-0[BajAQma %Y#Uhvz U`vxn[7{[}1}NbeBkqndJ :}zŽ:H%2L++1(\F`-L4{͸8U G?䥲E%kPWIC E~!\ߩfK!WRI}.X%!֨A_bǑ0oXVRD m/fMU] $o_=)9eWƵ-Rv`Ix n٪"fd$bYw$#ZD"zD_+}+TIrjARu.CbJB<$ޤ )UAEM(R LJҳj~ʜu>S^ό TQB 67ꉞCATތ48NQP76 ߗ~hdP3;غ"%Ê>&N[:7Caun {| ԉ W4:vH'&%Z༷N `X`Ue޻N;<0#w[" qoF)yj FSۙN-L0Fcoye)`4(茨q'o3PG¨"Ρ2+F,@v ~sƦA?#vq8BqsrxR:L :t k nYݶ_DWPpɾ6lӏ܊Pl^qLQ|_P|N#1N-`~a^]/|N#Y -|ë&iC6ϥ"mcMnH;%Zx͍S&^-F s0V Jx="&3:Bۊ>^vJ n|F {џX+r&uj-X:Hۗ$8d~Lَ, ?A\sS[ _KZ6WR4-(:wɯۈR~r̓ ELs;tv _+/)*5\ϿmD6.5]F?ʫq+L!+0w(HqWÛwޏnsR%ןACa!n/!pZ}ILrGޜbN3֝Ұ¿^ b︍B|<&v kG}}:9T)~é=+ BSz"tQ$X }?w*b4o=S#@LI@w~Ѕ=/eZnC)15BKmyzxx7=1~GߺĐɫݢXC'GN21&=&?/ x-zUU{WC1yoLXrN!s7u;ÿ~(mt:k|.V PpNo13 -*Sw_?Qf㙑C1ex4b2jewidhrw@I+^1Xԁjró~?]I s 1]WJ骺,_#=B &r!lZ&^}0)(V.v)YL3y:,oʞZdFb蟔a(މF?Eǻ-+ǂuXĶ^ ҋ{ @iV])_KaM7ܺVKS=|2E+Iz$NkKlR1W] HCȍu%D9Z% Z"+LPc\=ݜ̭6Ǣz)=6Rv'M%:&1b' ̮-!gpXF+&%;X̢?\G+',=+aq|⥋IĿ.IuT/<;&TiJ|0E~<-X(; \$X梵ݵD'V˞y6O?WN>hUjLxe?@` t[W"C?b같)]^턡o+J5aѯ${Bx]|pj]Bs{S5WD+f\6Z Eݖa#@JxUNΈD0Wg%Lkayyrtg}9l!s;)"$oLk߻TzXCM17¶h7WQ,ۋ_aH>un@K*sWG f ~BlWfC`#iL^7m%op=)0iaDuSJ421_[ i}/ZvfG1zaXNW;`!F"{SH\wKѭq?6ǠUw Ӌ=oZ{HX=T8|љ9͞~aȑnșB`:h)sZ`oemŢ&T=g$DEt'6'W{X:*EcE_J)gåw!1|S&,AZxs}\mQ,##{+iGfbY rӃ0ʭ*eڌEDTu,ߟ߂cJV֞atXc^Bv3}IyU?oH/t=94QC | ^q9CJ謨~8 )î ұfuàk2I1۰%v t8l5MķFFX64,rt{V*j} ;tk ŭD3}axLSʨ,E+2^,DW,?2.9_""sYpmT*w6XʹSLT.(O ^galRe@fOPR6o\1^0u ..4~FKوy0,CߝmM W_Lˊ+~x| ^ Y)trGMXm)YpQ$K[_wANU8 Y OD-uD~`N7rKN >~?X5p~>,:[mÑ:{3 = ϐW{n)ډLTSm c0c뛰hKMl}t.eޗ# Uy FO6;9 /2'}Eo!3:/[ўґ `z3F hgVha Cn_Vj]-)uUV} F6Ya#ʫok<,6,FVlEutuW-Xv>MBlǐM'QC><T`+ϣF%ti,ֶ6 }U cqZPl&ѼƖnRV,mIsh`bUpX݉}qG;9 1?gh  #1 =T?P|(XY} @T @T @T @T @T @T @T @T @T @T @%8!ZOOOaeޑZي\C=۳aÆ +:xˊ]8{ǽW7xVkXﲯ ~W,,&PW :YFl#I5z\Fٰ詾[sWNԫ3Y9C!FFv7*)^e`ŊuÇ^9UkUٞ}E{,];Ji 꼜/xzVJ{O%.}EʹG.3{+#gEDV4{/{ED~ \=>>3rH4u6T"Vv/kBV ٰA hzO^g8]QW#t„ wDXHo{^gN|,5~³~a肹:vwmkE?.[g2Id^$oc˼usw"_Y9oI|;}/;dof"^+eċ4( eroȮ=W eJH g> 0)owRc\[װ,gd$,>(ȃ,5~vNyغ`潣 }\%ԽeT8[KC~\]6wŝXeMgE yuOed2#a!)zwo/B#'15y6C} ũɈZ5jY$ e mE3r rp=yðy *^5.q 7=?R?ʁ? o`}i]T|8b?e'-(FGu̒P7lذaC ޗ^閾O2e?R>5(iP"$ %_8zD+gϝ;wȑJ: +*L#|>ٰ!vaK{ȫ%YGK `};XW.ʜpe7}F"F,kII!#Gv/{E!`eTgR}oўgcHnZ8~vY]0^8GsڄzP#g힋s*ŒvbJ[$E.ʜ:5B#Yw8{g_C*k躹 5# Gn_zKE-Nث{E~!!`%ČfNL }f$rނnJµueoQw$|Xc@8h_D/S{SbJ'.` Nd2G}K3:u5#XTwɷE{dX14*eP eP eP e ٞ ==ǏZb==,OJ+Tw87ls6ꪅnaeMw Y +rN5t[=K2g[0V\i .Vo`os _@ Wѳos-Qagoב"2_bŏcB9+'k٪8H+XOό<􍌜<7h#_ HovTk .{ֽTY%x2ݽaŏ\Xy{<3"_v/A+g嫔yWBRd^~9lс==KCY;KD 8{<~#qlXҸ[og{6l8> vҽw!VKsܹklφ}E嘆r#^A]eOH3Їn" *KG~`qO$vnv9ϥ$zkIUcc'ѥC)%,=Y9EZUh'y>zgÆ}"2xj߆Wb/%|H~#IR.{wW".N̳bѯ#EnG>S]##>$y{^Fܢ3##gߑ3"{EDzܵtv'JzB ʎC`'wO]'83٤u{)qM?)A/xH}XxU0"6Z)? ȿ2E_ҟKIXŸf_/zO=1g,'족kG=I*`fZчR@- y1P#٧tޓ8y7%槣䗌?q7T*X ̕pqžuodA_(ȆwCO\낟n> eR\&2_8gs`tݽ%FszC OHم_s}q#MGIw]xei{6e9k)A.WyƬu`*)W.lϥW,3#N!wIFθ.iF$b/HчQd]qUrܿtEi ?6jR)$}/2:U_FKXŗ){c{war;b1?%@aT̏e_D2&\e㋶с?$]<*bgpi:cUǵ նRGi#o'BEީ#Nܸ2"/jBx9d1s&z LcO;^si,q=ͳofiMu] _a_ b HtHZL]x\?\L:r$ FY.No gҐXxz9DkJ(zNܐm=CXd/ſ yxWfE]_J8I:!NGʲGH:_,a`Ue>4HVUi Tޓ>-"NߒҞ%tǪjǵ նGi#%nSMʻkUÇ>*=۳`^2(P e`*eP eP eP eP ej_|_Tkt:NWkUwΝ;wT(GGGQ5"P)PTԐj}ORnxYǧϣ/ye:s~__THʋP(coL4%*Rp3nT#22Q,C(]3V#B5*4ƽW&S@-r3M] xT&5Fim]*e/).ckLe(*!&2º: fhQu]352P@X~M2ڳƲCO綃Yfb_@R@ )Ky 2V nm?[Ϸƭ^JbW5P@kBk4fޜ߹,JOJY޿䬘t~h`j jZ~"5Ls[˔+ LI񥔈xc]"ԥ?{XUP@,Kpu/sqLV/C4ViL{[1IJ! r+v{pKϓ*O'E]j˪D_UVZDM6LP&S)tJ69t^vW2!yolj}Wo2c9E+EMd2B`5k!v v(Iܳ7P\.J&E׽sNQ1495c=&}[icǎenJUbLpIPtRjl"#ڳ>.x.4mm:LQ7S-zow4(HƤ?T%{[j\:ֵsg=d~G}Tܙ*PXiLet6%ٔNT.(CTYױӧ[o`McUT"se:e{&nkwF@P!Eݎ(T!=q”[,#":vi!.2VdZg'5P &S-LhK|4Nu ɁWO˛{K|U/7O @iQMz@B(`EYVRl۲Txz49 CCC?W_9k{C"r e̥//Lr4ц5+Nl`D(`X\|}B'vFW YBKcv7]7 ]=~_}CuCMf~mxF jW_+t`U 4x}]VRpB%[2*qf,T>`.S8 *ynokTױ~ǿuuǎ[o}o/ X BqB0Q~k%3fU30/"-; ֮couY 8q`U2*+ŝDD&t;^dۚ2.R/1eBۭ?FhgC}ֲ`"swBMI%{>yݵmBWG0@(z9qf(`! IDATP)mT_FxqO,:r!Z#5rj|7ѸKLLYw_a|nӢ>v4RD:/tuxPr`"P~^"L 1ɢ/ !;~/V8D.72Md>>LT"SƤ۵>εz{ P j(//)!^)vC<<1~oo%3vlo;F[2 M+2A(lH2Cc7~oNq$4)j:$5޽2B(`"[$dHFm~vލel2n߄n [ڊd]Beo 7EcgwYՌyW2;[&`.E&2޺s܊V B˕<"ۣNh.Ds%\D(`Y&)؟َ{QK\&U\d 2@reXD>{Zս7Wmp^;-9xt12JTB"zx012f jG+" 6["e9e/k *8j)QN7۵7j1YےFss@¡E: GJe(ZEcP@i2x1&'$7\ A|ƺz k$ev7igq:e GJw(BE+aЁKwg)NqIkiMf mCҾeBXX{eKd㉢F]:\"ct.vuUغ乌B-jrk0$2?p`"ֹ7j㚕ذ>8&xGÔre5P@b.% l3u[DE!2z n ru)a;t֒G}V,~1H%Kh%vWVzƯ>>-˾-$<XcV%R@r.y4wHEKQBc k}d$K0(v(7Sv7)-)c&R$`X2>8j-Z>PM5؁KV;cqr[@ZU-ZRT*£U>>{zMn}2+eҟ}\""KeNI-S䦁W0˫גŸs-W7l.:1vɵ91J+/`V%Y2>}UD??gO|TMK˴x]tc]+qr@%$2Qdݙ [$3Mhބ$;[Dd!WBWǕ߱}}wyyx+,Nds{ P]LHl""]>.*2WKR"^}˖֮c/+wFI(mcLEN?۲ܥ=Mloo ʕr`U[oL6]9t^ILbS$k 9$~E"ӧOS'U+oT7ciqwy%4pD'c{ܵ,%;*b\fw{辖JK}Z×DDۼaJm"TjR$)oZTvg>.ܹs(8C2Xjj^Dv4ܹv{ԃ^0WÏvojjuX l.; ̢~}o.vlO-p=zoD.ܛJP=2LͧR- пW.{OEΝC7o?̉פܣז;vT tIHd2H{{{[{H*lkepK燆ݬeL$zǖz5m{w47ڛ"Tfwii|,2nϊȳOnѻFn.cKمoyd/ 1; ]@Ez e*+uRJf}|R@%z7OuՄ~T7G3"#tvmS7S&Y/lm-"rwfm^K`[Fr~Ʀ^仍om-Z&~Z|$l8/- !7SvuC n݅+njG 9~֒;vI_OJk?[/5~=ZMF0Dh616| {he4ۛ77zsk[S}[S=ۛLi}]-1|35ō^|/Ps ).jӪ~ Yo2:(;f29v)Z X_T[ PBdDF'#׽E;3dk*۝v/R۬/Z2cYDuvg~Ưfbv)\ JL#$@mbPF&Ӓ}7ۦ75fkR2e -\dcY1c0[r}|ھtF؀&7iLetSޜS r j\o×'򺨵\t8B7XH~.xsQߛ;3o*up(ZϢiݍޫ' NP ]z憶^7n*8»Ŏ yԬ* jJ:>W>jz e,/ο]-_q iku{@xXWe2 _v7]0E-ʆ,InSƫc_ۛf)8uen2ɥBGoi 8h/O!bLhU nJ\64jBzO{iH8*P˒dco̅;m~+e$tID4 wg浶%ȸdqIVϢ^ښꭃ,S}s\OK>yu,;?h6QսDh5)(4xfj[f~}~QPFDZ?>ẔVI,ݰbޜ,5 h]RC[F[>ܐ"0$d{QTwg3Md6S-]BYI +1eA+y.n.@YKnC2/y-yY.O\f.ۛ,\hŊX[ߘt[DM~8:`ʂD۹O7Xws t-BX&sѣM86#$^v9qgff?&aǖ2è_]/]NEQirk 04[[;2P@x?{3U3_QEikqO#:<;M-io۱~Fl4% ͽwn=,7s[cL4@'5wG'U9İ8vuE3z ' v[%2wgݑ5ɰ'3 ;j%2"rhO)>C{ 7h -йKEi.r;i/eoka@YwΝK#!3˵пp‘TNQ壏#o=ݑmӀ-y}w<ʱuMv7Dm:^KVyi +cc@{L&jf1Wr(XڸZ8mn+xу s[&;nHN2[qhO6e^6.׭֩۽ s7o[CWRXOmd_{e2{oB:ժTDd{sv5ٲ[$0 ؎g7F-ߍUv:zh{) iUqFAo&we9@ `9RO x̟羂IӾ!\FphOwǧ&f[t(቏>Y&2Q*. Yl!ɵ" }RFK`iэ˸ᅮמۥ'{?sW`mNVBgz) jc`eP)#.鴕tqOR,x{jnn۷h7F#} ~vmsl{?yNǝ- Pö-2aI)Jf(ZP,(Z*B` &kb qm-ykx#[(ZYc\K{dfa2pskv Gf*c3V5KzE+Qȋ9lVo Y6޷GVq7cVt_\ݯVYbe,qfVYPݦZjk?عUo &2gZ/i+ȫKzu,&DDٸSDKՋWF0]@7ձVۛvn=ع^7RB.c5hY'3F9)$ٻ^po`A]s+2 0a&jKxe2V&2zBrK[kg_Gd-X moYh2":ݑ$f֩l׷8ОV 8IENt<Dęe_1=_0UjZ e5(y탖X,>{}v/Oܘ߱EDnL̊HKcuw$KjZhέvH}~Kꪃ[^*hh撰"XW>>>a1h.su,6.QP] Om$"̮B.h.XoY ?c>6dfA ڠ`;ܮ3߱b-XbK՘`ֻ3.ޱvn}'%"i~j,oVqs3&]LOYr%B hАHKRv׆,::IYSv6P-k"֚dܱK_{E-cqVw+8llon[7&fw5Ӻ:i*'7 կFnP_iMLTtnkL*jVik{sdf WXWq]E[{YL0aqs$s/uP V _NxaKwx+Z ktx"Xq{l۷G7bMm3mwn;ݦy@s mvqwnlwu֨^1]+oN$lWY,V-rX'ek{=if?hඉ6yMOi/^m_tnF6=fY,hͤ!>dm_nW,tm(s}|lKc$cܣrO-ؕ&~;^ۙ~meܽD?@U2afXuC2no{1O7s.OgwRn䎍J=`w=:-Wqw]Iq,Qڶ{b\@ "%4V%uT"a PJ\K[!";ae%dfdfjnqjn--#(׺^"cK^"cj-m-Z)Qy]kuM,lgKΖm:nounklkwOJ{ [ K#*`HЪ" SM%D ]g k/o$j)O<2jxσ?h"cE%7S-11XҳOPݞik%Crwv;Le43rs\Q̼~ Ryioo@b)oIE,I)lkwg2ⴼb7sq^yW8u2vʭsyjۦ?F-tB C `mRX}#&<<^75L70:ݒդ\vܓ-:K>yhOM{dل{x$G.dtUv7i-\iK>Tu_B I덺TFmbo͒%uh^C{Z\dۭ:Seܣ.uioBe/#b XeU-H>5χ'--6m qHn%k“--uL逵uG*)miٱ1D ]K{_:^ILmonZhb &2;[l/:LI= 4zݝEQNv^޷n'"ݶYv?VԈ`4cga]HxϷ[`ڳ~Igաe2?zvnetĐb>2"cL-4iLׂ /*}Y[w"o.'M(JNlhr>>m, fj*VsޥKxG5)zǧmO{g;df [vG&X.<4)dT.յ޻z8*q2/Pōol>wi40C۴"FĈ&2^bf,O[EDߛ=*JVГu'~yMd;ٽFR/a1sѽh eLful FKdXZaqn6J}w7iS.鵃 +ģ 0jRX518:26xgfルOZ!"Ssmݻ3Ss;jɉ REJvnlE[4A#64I6ɖs;Z"3mk;3&al:5jS=˂Ww$/lIW6)tިWpSieBw &5b TI!%":xKcwow%aH~[+`Wz q ])CBYn2X>&@͢^VS)I;[ai s[s{ZDD[Dd2plfz]Mh0$DƲc|e^"c*ciMtE>>]i,N1m#,ULJw:~ooYơ-mM-uښ"&d^͍@h[<#okvyu'.cU32 |}A˵iԂnQ)nr{H~+|lj,5WşvhŭLcݣ;[i[:dFXw 5BCݙyݠi>:uɺ,Vk] u*,6o٪{h5+\.;FEVvQZ{x[ n#61eVՒ*zXmN x=\C?]SܱK6>Bu'Ӽ'/s[df켈zu,=Y5=5ecm(k$fPr'9\5Y1V"rn[ҳOj]F9^;^/EnNAokkc :K`͋8ɔ6q]i{gGZp>8eG.F۷ՈJ%7~}"j]ay}df˦:4ݦ谦_[Wa[Vc=PS3ZydY6l]׺Tf',>ڻ^ًVx3X[F-'o-Eu~I܊;+h =('l+zv)겞tB`-٬DlJr}|ɖFmb5-u-u=˝'ΩދK4Rq9݂ j$cĉB#]@?v{yFqXryxF$م䞻ȷo{>yTY.pe{uY/CVZ.#$/v(oc] nm?[ϯP\*0| Xb>K?5.`/^:wM?F:˒Հ@5u/lP9u] wpɝ[{ZU rwڛ77\K{#mkz0MƦv7sf{s];qxTS &jW@٨+y *%t+EH_xȈH*5t 7_`=[wUdRTj5%"M~}Yy/o\ow[ww4?mܙYɹ=;W;[6}=1􎦑ۓ k<2==-"of\=꒺ƍ?l-Ӻb鍋EX#jg_ßi?+/vI/||~(5t3uE8JQz@Riq >쮯=3 "/l~]&tůdRs͛~[Ddz̃�|{1tmof;w᧶m~gfAS7h+j$"M9?v3cSb@?ޚ=>NrGsm9N"n.o/~u'TD&xE{AsJ{;w{{pz{ab#;cC"_9eBkױWЗ12Z(Fm텏[JR;ҝ;wOɉgvm ukL_Nm޼y֥4vEؖ<Ѳ01Tǖ?޿-M ";6=xF;t4Jk||ߓّ>[6zw3ټyoٵ]Dmޜz빶 7'd[ngveGָuuu"lHngvm応ᅮV[nGD6oOq.޴5t_?tyx–K3#Sx]v1PW^~wߛq~d:KI[w!G[usk~xBD:5΍~䢓[Qt׭Kǐ|jJ[kOױӧnm}@KÓ&S)DW@'<K;wNܠXŸ,,rhOTf,5'"-uSsSs/=.swf^ΆH^wÝڵ|ғ)fq&Xo떢Pf%&t[w4,<4;;&~mJ ]}~k2練{>:(H{:Ci=rX*KwqB'`͉ihqB۸=˗j(%V؈ _ !៿|"h2I^J&''lb.4W qX9 ŞJj|wJ=;v,sk _j͍˲nB4Qȡ=׍tkm+GJ?c_DF 4 Md4Cchkʎ;3 }v¡mz-ܮמۥɎvԵ&3 ǧ-s޴A'$r'''r/ʼܮ̂{3q*}m%2֮ؽC:+wrjE=NWBbDG/D<[^J w:.{-xZΌ2@ q)X^pG?kyέhᕱ lv5Y%An8IwiV@wqwf^#-` ^`Gg~ Fw'WZs}|^cLjj^D{w{^FH,@ء=W6BQ{w6OU\Kk^ˈ, b ^Yƽ\}bsg%bt>xRJ1M~uR^mLz_J.}{[{챒]ak{4ڷNFP ng˦m?ec3~dža9^9ݙz-Cg֒-l!t&io݂.ݑGZ'9k'LUn2v;8$Dѕ[#NVm |򮖮ܡ-xVM#Ym\@[ߝƻ(\̐ ,=|!ȼh+ӧ:4Z>.b(333>XkeZ(~\h&pqrmRs-u8h6pqC,pmw{fFL)ބ2O A,X>×v4Vsx P&7[R]%":ʭq1bZ7ne1,3`v712/|xDaZ>.JMr@ j%E^5~QzHn@;J33n~34rǺ?ۂ5ֱKn˸[v te4޵:`+\/ڶIF-(7 @.2@&QӧO06a  E(Ԑ`yq?W$N)ݙ6Yyܺ2x Nĝڶ6On CX_H+Y ]zz5[#s gb2 xh۝ Viomʪ%S-NȈt=s@Dpa8,/|p~H'mB>rXI0PC,KmO.ys6|,v䮶-_|fW;HӞ=פ؊Nxdּ6r+hٷmj7 F{monyۖl蒖N^Iu>޻ߴ(8m*ɯv*IQ ^:Da˔0RI]zN4|!cHJ [OEIk{$2ATzF%2":HX?'3 M[DN-ОiiY DFKN$WZtc*v/2KFk ﮟv47[ޱJ{´ōT;{^F-6Xu}|Z3-xQ55澾@rS2+8oˡ :ۯho~킓a# R! Ҁ>-kX[ݝ-HB-w[6=T/r17lon~m{u,)O\Ky:G>,@IFk|cSD;oDdlZ[Sdf 뵲-Z G3z^ d%U}}OxCt]M&3 ˄v =RmI]ee$uc.u쭮$keCQ)"d;ALfvn}|Kc-o/lik?խ:0qZ^2k<מ%N]I0JoS޸`BW,\xͻtmqYۈ׭[q1i"C;HtMW/ ߙYbƅP,`uaJ&~F!jEMLƦ7 6yikoݘ[qLͬo'/]I& I~ AОC{Zx%ݾČjk/vnv]ew{ӡ=Z_#"ݶ#5k.z<.7֨>^7&f^X:آXdw{ӎ;3 V8 "ZڇPε-VaK_-3)FaN??un5[ĉ͵qYu$G ־N1:Vh/ N"`^wH ܂{77Xwk23Y11PX&1\ OhMQӕ\ʥQ5]oA(Ԅ֭H)oJXI ]:ND%?I;ǧvn N_{ -Q bh#G55o-)[cձZ['3 zǧwl5>>܅7xN|jn՝㰎fZNŭ_n9x^LP2]v&K4ГL6eb-F{w545dnzsR7ep&4\o;r'.N<\Q,`U#娅2ZF(Ԋ99Ks+Dlk_bSV޳G`ɯe=q+q?lAz<6uiv~qgNB F*i0qzqbzmM7&f3 _۾\K L4y'SDlzL68swԶMM7ΛD0X(MdjLF.Dj ɸ+~}b3[&"zϞ&tԒnM'i7>"( , ~𶩩6"N ܍Hf*cf77=f ѓ<5#ІXeGD=k)"펵XJ? 6[C$8[XrQ&8/tug8-otzܚi^;7~d4a =~l5YN3ZbcO`dWC\,e9k@jbRT?{o}{>q2C땊,iMWv&V&rZ8{..?\n jo[_8Θvؑm<'БzaDMS?GsHQ|`8yC/)駦xCm[5j&.hwP=i<{L2q&;!U(Xw^*!I ]u^DSǧvQնSQJ\~I}}N&GߡXb$0 'uLz1~jGut4JkG(R҄a(l!em#5 sQDD#gL(hԌf))@ ;PSlV-3t2aޱM~-oR2Ɔ}X#%6d1ҔHs#s8c!"Q묈K(7_yisbXpQ])P,(#'hO ݝK(VSs \E_#;OXn(Rlh5{\ؑ( &!*(Ja"cdxk&3<Q O h3qh_܉>V$Z&WIVuC󩠴)܉,Q$ٶQ2@c Uxa1`lϳ\(>Fkj)e"eahpXx Z +`9|vmjf(«:'%k꺛d.J#o)"*(H${Ҡ_E)R&nF wY L(uV=% I":wy^Z0x՚辴&^s]X."%&2K8.OeID #ُS98_ .cΪ'W <5l/hvVeP[Ρjኳ.cThQFq*.+GRTE)otZk;/K_T.ٺ6Vj-QQFQʞ=luFP*2ﶽr <c.2mUD_H529G7D=vMm灕 VTfʐ]{5I3{\;+Q&@J3а]H X=?k}/kQ]%X 1 7pbUQvaResZ crG7[o/?cyi)2 cid}*2cݶ7#YL׉r@۵ PLA(\VO K_jJ&Zbf.i[r& F.VkyXh-eP1`\MRѪI>22l>tNXZ6V$y -'D 2p\`٬@l.Z(6cNɄWK7luU-}M RY 2id$Rj{K&Vo%>mA|ے+ۤaF&ۈj'GѱŰ\0D45UivsD4ZWlT襛Ak](&]FeEٴh1 |G=P%gMTQB&۰ɜ:sޚSt3XmkKB %"E4v샐GDh]ȤrXFJ3ư$(CeQRP=jAh#f4E EF{ܜe# ⤉:utx_53[aG_0;6j? ,(fFJV(f&ZUHǐ]+ea+IX&"΋ԀYtkt@|L(@ f+bJ%<[+h5DçEVUWƚ;H}{ YW/Znq#jͯ_yݶ7Gl rCAuND--ͅR.`bS__Ϳ'x-"D6x+L)dHEE),iny:5iAr[CkL2(XZ8(XS ̢ӎJ\\ם c!\0x<|+df\ןkpmz7՗ww$Or(]{;|p_;sG%ku[cӿOgw`JqR$r$.y(;pX;}ЃXZ(9Gz^(M&8u;hgWE$85V^ƙՕVqȖ+^c s X@Ž%mϦ2 lDD힚vOM[c׽b\=5Xek X84z-ݝ]Q{F%0KЀ䛒)´8K|?7Pd^/xPF7aAǢ#E{cMI(UciK e%pn\(\a~ra1<dojA֘:0PddA#}lsIQd2ImS))pk;UFͰpT͘r@#uGk=/:ZF2䩦UC79.<,J釈mc7&++J#"#9y{n"}88Q*Taa/2.0Q#T6B]]cQQFQrK٩UXkd4kxɘu {$/ J"E\}eHh@+Xj3 FXT=56}%}Jx$kZTQ&lLf6ԙLv>Vɐ"R,uETQ\E:)(@R-BM0 I0Gܚl2蝜f`sjxx}`[5e2B1M|.CaA Fzd.%[)]*숡d/\383<~q_#^뻋oYH`-DD ^x:|drT|$LX4s+4R@Fh4+;4fL/ea)]62@EE-֜W`킄Lj ":m{Sn$:XGk=*Y2ۆ@ c]uef$26C]* ITP2~xգP -vTWbP,Z %@Hh]s/*=jjnV!!͸]Zgp{eLʒ%y{j {xX8~P)R`TgJv6sʩp ((šk4?QZ {v5t3HI'tj̖o,RM+YLɄ uZy<뭡!)+&֠ %E ZK+A.V<ÚW|ec;@|#y)nreXx Ǹ֝EhG~Te{^}fGMMt2<09= C[.h0 W0[6iӶg#;}h=}ײRE)~xrU___ؑ(VS(= LI7px}w!<a)v"SfK@2<&.`{2OeēءXb<]?׊%!cv9P`jfk`Ѿ;gV1y'`tDvkZSp  AX._W'"$ xF+%yA{ƪo"ᣁkGt6Ht TdH.qP+OjZgʎxcVH"M厭 ZQD)FD$lw֧PL/c;kpOm&"d{~ge0ȞS\s68g-l^Vl(>td[n2 l=2L+J|mKF)LrGu Vd-Z~LD ^ yE %闺oֺՍzKof3aiSrv9I5Dnۛrk:?!=n, %J^#Gȏ}ɧŬ[%U Lg|m5;j`M6H ~~.@ !x+QRa\HDNt޷2!`2uI"jjjޤ"c~*AdoVSWOR#Pc'ޗnt0V`9BqvvvWݶ*,E1+eB*cqo%bF!ELs[pz6J:2.b H(tV]ѕb[ck:R݃" #XQĄHic0-/96 xڵXDD[n]Rp߿OD?x.v^]]ݖ7hu"Ȋ}hIaԑd7ǿ|:p^f+mn^ʍ*K͝==DC>};ܙ]&VϾz" Wק/SՓnucЪ( ۞;B$skUdաa" X|{[&ۭ3a.SfB3sj2pcRfdhdCD\6>b)MImDe8Bp +2Ss eQEQ:*E;-f*E{nP9_˧J+ Q!-5xOӛ i&uWzGzzi׿ ¿_]Uܰb4 Spmy.F{jV9mN3]uHa^P%KJ3ӑIkl A FpP4H&r0 8FU!Q-_s. ]6;^I]nM^( "2B]X8(Ąq \Nt}Hdeoģg}P vO~lۈx O# G~r$NuM5pGEDŽkKY$D2^~hM㷏9O8O=p1*`y?>枔MyBPrRMbBXLbDv9Ht֧Tѥ^/择'xo*[ ٥ 4s'xld4cg^ʄ>xUJbBDFxgNPRM=%XĖ1ip!fG.Z?<waA$'鑡ql##OTJ~Sʀd k̠QrfF4,UIC.Q3O<>F IDAT6q)U UPQY2#d{z;{zzKTh׻CDבV7?8[=(Z㰠d߉,LFMU7&'cD4pIg8ERŷ['''D纷&CDtыr`ӑ"&ooM>x}OwncέD4y@D[İ|`t'ͷ>%MNxH@Y[wWȦۜ&pK;k+D|rNS}j m81l;==Qŷ ߩZ>d4WD4O_ǟO b,t㫇n&2;Uv&2'ˢ^Ewh&2Ttl1_ [f g+tl{]7RmwVV|0M|~=-v=hv>q/I={w"|bBtOӜ獠zY&!A)2c)ETˆЖEk*.KB2CDr};i)m MO54Fn6#O6U9x3L,2ǵh$%ƣY(/3"їܐW0s蚎-68 r/َ\;wB!ߑC3 C.<,48mSdWKnc`loTkQg ] -ߓD~+K|/V8ֵPu#A:w,clX/{|ߛN l&ߕeYYe`)kySB s?񏧊@IϛDB/eci<ݞn9pߧسo;(TM.?gKdN)uF/ݚ->r.מ>] GDofvOmCCCCfU[oI59: mHր1fǜrョ{zS\|t4Plߣ[f'+.r&ӅSOUKϘ񀟈h&{ON45w>y@_x|ZY7En)DϕJM~ƳLSDe:9ߛK͝٩[/nIF) lYap{`Rv9KTgюP,Rƚ5)X\p|J+Sc%f=[CUhb2Hg|7`[ .,D4̽{KokKh2Kz꜡X"_$GD|_xAg(0҈mOQs(eٳ-i>wpHFCSŖϔLusRBbn Fɔ[ tܡs>?zWX(8ӵIZ}+D~ʠ)6 "E ^9+`v9x![At~Y4p@`mT䄖'N$< xU4: eU&j Gc#~[fLN^׸RFJb E"Ί`/ktH+LSX]&K +p5V X ̦d(%ہ}=/Ԑ[?T')AKk%Ke(`o1+-\ʨyl2TLnpӡ0k84M1Jpa^CTΙ[gdH`6ODslcBV1$49KoD+nAd'~IJhf,r?|#h4Q]mjnYhSWZgE$v9hb=50Q2D 7 1@9OI]FoH% we2&וR_m%(LiNTe&Jn,~ƳE{S|i{lطoy^O_0 oщIs7lK$Fk)ȩ,\bEZq%ev*r,k}r{:f"cXTr]qݍ^єyvX )ĭĖGᱰ F FMf]5J0@rl-DvvOUD3(aY{Nv6й?J9ߤUQMR*.#'~ynwX7&U|~-O=@4}wji4nlNl)LaW.b:MމqPiS\̐I( mv"A싗H-WE`&n++{Wa1pm\W\X%E_܉N%>K:+X+XYVNQY?ʗoQofJkFѩ42J=MD~_߹!jy瘗|}>|8IJ9l_ղ&%CWjIeO1_bRhFlK/u?sdh>u:sǥ2tu#rcM\2J٤*nc1QK"d8kLxeʠF>ŮiҪ2XW#K}A.ĺC=D2 žnG:Z덴]ñ%3qO*"H|1:/H+?Ra]]á%?ܺ<~@4'X^+{Lo{wzA;eM`977W(Ef*i-ʦA3er<-9T_RRru6JQ?9^=ҳ8(>R#YADK7eHx0"ww"ħ A0Ѐ. \k3{ӲFUϊ&={z 9GEQr&fIٴB6LzГ}=?ն2WəQ9K95,ѿPpvTW+&%mڶrȆpʠS#,70ȯfoAI:tR-R3.nۛfꬡVݚ5U;PoJQG#ڥC")>֎J(,#Q'u)KA"vOH`6_<ϵ7ߪ(J٠)X)'-l%ߠsi^~*XYQ#⣫Yֲ0-3Aw{ruV`ramse+l82t!&uW{^ ր#5 #pQavQS"qrAH RD%tJdu}&C]fS(Ycbbb -#4XQQfƙbͬP~E^j^~*XYQ#M+P •M,x\Q"%iB|ᑝ"UdAt=cE‹mqIFe]_Jj`1:0w>5JӎJ"GF#yy¹<0s(n bgl_}?ǟ 95FF3E+]DOזꌒO~QAh4ZAZbM 0u:7Xy9bE.p%H!܌H n1uV ];Ԑ0W ep(hhGI)ׯ٫'/BmͿg߮ ̭YHD?⣸]>@/m!Oa,IÔY/`H[)qҾ&ʦM-_?{ G7YMhvwX)3oϡx^"NQm[L,y9aM(Kbz.10#``쟈Pm=5K8Ƒ:U0AC.uC]L2g44]2&irYte=5+Jq21KP@xg8(Rh`N+>";);=D]|t[F).X`ˉ א%E_Dnf4]fjk"1}>`1G rdx^=oc22 n'Юm+`yP[ #7힚K7{ܸ7j k:xf嫶oYֻZ%ϗv ow"_7lG:&EQTPxOD=)4E)~d XEn, "/@f*:ݐAb9V6fB]sm![w.u |q':9 -3 `)36^uVD痢Kcz6Im볼r~w8noU{[-GNJr6.^҇μquMEQ%"cKqt_j2N-VT%P ^٫'?ꇛJH=5l?hgȬpaM5 U:#w_]QH]ɞWGk}[cU$x8]. kH|jVJ6̦MZZ:g2մZ6-0pzd%[迫V &PgS^b{.%,PÍh'zIrH[Z~;^SG`EQUQE& tL 7lNAr&~F$9ۣ1#e.bAgɰܹ< l2PdR9JȅeFf 2XM2`kBGWp~J%:q:+~6s<œfn-%,\Q Cvw.+CuI!(ء6fHD$[q(J"Z=5𼀎ׯo´R H%r֊]Hl kQ4n䨔hEdm|}h~7(F42¢㓈Y^LIS tL.kLf֠تgCQDvI(ufNDO0Z -SM(] FJ_*'q*JȵwcM 25%2#KdiaACUpmr bB vO <2h4<>z˲ɕMNdpH]nй?s(\>(b (TxODcGTQJv *OhG|WOfXL[ccXX$D"OJai։bRd?]~(qs7k"Q]v9}$0+f=5Ÿ]PgBɃڶi2(Yn"paPۇ|/3RpGϐ(PEfnJ2JqtI!S1_C[v h&_]"1H|Zb0Ң"%$s,s[c(&5v0kCB%]Pµ/MSs:+FΊP,!EOCYdL)pN_)3>7KJ(H )SnRjZK>n^RQF?t1K64CDoGUGxW$ɣ`fFX.k%Sۢ/A- AO1ꏸqRGk=>2Ss Tb %sg<誟ׇGP&Pr*P*kdb\`g!<^ IYg4&SQBeZ:Օj-YaUirt3HDBKhLd Za`(D: -fҘYx8G FSlwK+]3\.e +/P[x)cܴn"C[.\ca#YCcfe]w#,7oH>cDQPEfJinl֯/JcLq3cRKrwavСw5  nÚJp MD0,!!ip`JbU)R(H|HGR% 2ipV1d8\jn2b R(0Ln1mTLUQbI~n_S22Éuԋ #^vʰj힚kn^aڨUHUvFy )/ m9 4:(OT e&^Dӽ44іLJ1.! ^%Xնp6Z\mUbξ,HEF:tT)-1 "2RhSe G fefr͎vOͥtb F e814#W#sճ7?~Tje}[)%UgI#ȗ(jinn)io>70~ ~{pcS6%4'xըH 8vY/Ba X " dEVJ#%Gi27{#ƺb nZgH`8\YF_¼ q{&1b S8&?^QD>MҲBDzzhn:ޏT_gbQEY+#E ( }ԩctxPlB㩌hAY1qk:6|+r<m? *<`O U/Y0e[MI'%Ku]'үJI5BkxH3:uͭ:ZՕ삁"ec}2; MR&U-u314J2񾾾Y iY]yRʍUH3'cS,QE&|iGDݧNv ]yJsg3PoggFlf V"#~#f.\%{jao1G9\Mƈ maBm2V<2"1:1 TҒ FK, W8z&2hU V)Fw`&ٙEaxݻo={mmQRmED#XNLLLNNZ7HיXFxSOٮ_.7WJ~ׯߵƿCPQ'Gmxt}]~wm?0nP(T*HwwMMMgNDm";b-2J0Bs 20 ޚE-vO o.kP#o˲8mkM!15tɛ.gNX#YrՕhVcuI˭YDv 44ᗉL=YaLvߔi#}{ޞf}>߇G:{6&jhp Dv[+E1. ^\- %ʌDۓ+Lg7?ŋ lt,?wOnD:m'.MZgTdvT9Jy̏ŏ xXL?BiBLQ]uFQ\BTL˔.GªЃSs @&h⯲Cz&\M>?0NT ?Kӟ~֕mٺu+J>Geuuu'c"٥ uuabx:xr>^2.n{}Ӑj}8cwՏd ]T^g}맯ZX㯯(?rwY· E w" ɩ,\Kplch.׈=]j\A"8vF ƣ2e(Ǘ5MmR= ءB0v>"B%"B/T[#,#[qYFY;oH&(1ʰS͕%wAڂ}s92POK^1N Qw.)A.B&x 3#953CG` ph )尵I)"SNH oW?ubxr4%cb.Ay3#qlvOB("Bv̭>8i29{cV{̲Ӳ]ȚNWeCd:J?7^yZaI6ru2Va*2pKc|}}ɗݧNo04OQVӳs? Hb[}QYa;N:LMsO/grEJ3^덷bBl qףh[cAyq_#•BD$Xbt\6~h J~Rd4qk4*ށ$5}RSO7\8} /kY{fK?8}W\^:"L07[?^^V}":SJ:YW ޺ɮqp\fUdFEE)${\1d}?-_B?&~#&([3esyj7՞jL&Gd>>(Aڶuqfᎁ \tΆZ8ʠ\<1PKmAq|;ZySPru66~to' <4QEFYUY.ðYP5kpCd/kDlkPtS3Z`&veSW?PȩMS21ހڲ |cg1dH4Z7JH1PiDя^AȻ(31oǒ۽yOCD@'oiӽ!v8^}2=z>jf[Y"KQS-4;49ɹāp8<;;uڽ{swQ8ݻw{xݻh#o F)-#_NƞjrnYU-^10pݦjfgmźBߜx)7zt2&>-=M=H'?ز49Y:ܿϷY޲8;;Yغ|ijQ7^3|J@OdK1o89龲(Xw_3K̳7`ڠM~fVdd HE">N 3Lgg'&m4=ۓu0גS;/M" j\bޒotnvD46_?|}w&6XdVFelDGQp-++?,򖖃jf]uvmVO5\yfg>_emr2噝UMՎ8߿?6r{=RVg0l"NqwVމ,`02e h+_i9}>>]Ԫl[$%s2,t nubvRRLaɫ(31;};{O}|?pngS2yכ 555νjkʁ[=uNlrAȷt۷n~v9oD|'x?ɠviVօ??%ރox+kjc۷oG.\x#fS]}+To@ }@|CDwT1Ly?EL|[ӱzS /DTSSADU|lzk:[w},n7_zko>5}{?=ߝl,A4q۶ƪ?Eh`t~QNܿ5P c5"ઙm{@w> -QMMMϑdUC"/2cGuH`4J6ZﶽIDh,qv!߷iΐe+vb Α 1@ZP]BC^.3q4 m F÷B|w'n.C1(ww)[hpdKcVJ2nO/.͞D֐ML"WVH$73)QlP(ϑÛJYQ1E–< l mxv`"cR6fSbB[ 򄓗L-`ѤXǏDH[uVڿ@eB% {\ɭ*):k>wк8PXRv^ 2t KouVTmzfp$0ZgEmGU0@D<K|מ:'xWtRʈ_GQ|?{Y)9QI+9yHvii`}k,)D!ݗR$OO8(Y:’haEHVdlgN oZj  &wxsۃڬWQ2ǰdr ::.I3mUD:+hDD\6]=5#ٶƪƪ_/'wTW{j. {j\c%K_kF-3ήn^豱N Qwz%oo |Yf1kj.I~ 2%9USc2Ld\^53 P,v9xK_ÍU۶1hy,%ȣd$e2cTrL1R:}[8KD %tWx*wEuVQZىiUX=h&iA?&V6yd>-,}36z8qNw" ;k+i&n]dRR4wvzʠ.ɏ:eJ`Lr[Ud2þToNίX5/\΂K-3"}(V 5VTd1h%e#,c=Uظ.sFurh Rv=vw(V(&cad2Y[)L]kFQx0Xyݨ/&+{?2+u%:e2'Uӥ= .nrEC)t6%e83{$0 BD翸3m/'}WޏϏTf8lDOQ] |ة<w$$cߜ2c6IQ;akK`&P1@EYuFW*2`x,_Q!e~okVMrMdG#|_%l,V]VJ!8Z#.ÛPjvTGBcUet~. qGu\tv2udT)q&~'"3{~ߕb1JٳT@Erf>!ǐfɊ*2(ǀ-dTB7%rfg& +X2/kds ouɿ!ZgST20lGk[(YD %ꈀ[^iƃᅁ4uٽ$>Pgc:4S)K$KS*)Iݠ2Ԯj*qc'U]e 8N0X q- 4vl..L`R酃E%g;qr]8UƦJI"s}!''/?DIďP^t}sS%6N Q1S'|a/v×aKe-TžX&{ +OЌ=/o͟"[o=Aʰ;%K+@v2BoROaTvHU ±yXUL*Rt\+Mb%~SE!2b,+Y~|HwqpǴ,C$O3cAjݡߤ~W9(# ,j.Xboc;o@Q5(8iC$`.m`&GukvcjxX]u1ehz"Ⱥ S{&XN[D]) 6˴JYɘБ1ƂCJ5SbXBziv1  <Um2@i'[ĭv6c=/1\qv4>kf>u$<@KJ(/Fp=[+0ҏIAZK͞+<җ"Cz*xH*α&3ґ7,f: %e*w,#VoMF{V3!9PXPDDk"   )eG|RA:~:L]OkLuWWr Nh`quGɬ] ^"S yzv CU[&דcD5< i͜ "ŅYpQU5jKU:u$ZX|`=8hy~?OHDOK، "tՖuFcbOSDzz* TgxHORoYH4'R4=DEK\Klda> v^cCOD#hm{frrG\5\8Mݍ+zv1s1"BL6<łcߛ?$UjZ{%.#k] .K_A1jblpw(# V8͒+6U /fE ?^vQYGbx~њQMB؍F* )UWA7h.Q"&T0]<=<}|J. |P%0|7-WODxg7/lH!ZL ǟMH3 hPcՁm?VdgcD{2B/Ќ.B %x2/lbye0ƈsONpl6c =Ս[QDU}@Xp Z@T0CD鉠VtXM[y]0u7¹S,嫾MС|EDAؚf>[7L1b1AQFp2O]l2ce/pz^u\:q܊x/=j",ӎ"j00ckП~9mer.?xvܜ]J?I\S,ZL0ޠ$_R_oCݾ_!fgbjҟr KB8M8 FmxXqGXq Lĺdf3DVw:u͓xx\{vt՞ڥFE*ErI;/ld홅$J .Y,M[%Q.PzkoL;/4XHUu,M*" C(#t;&amE-,>AUNjlR:a}qא1FX;Ss %Ԫf8bz#)rj%['O hAlSwIs}YwY쏪B.U]FnABXi@_n~HCϷn)_^AXQ.-έ!"T: ljU.]_ˇ T?ұl"j*2b:ж)\F1$*k!S褀/`dH:%6 |Q2u7Y·Bok J 9>^S6AjJ0QLLiKTE=>AD멷z!A@ 膩ё7mv݈MO}xQ}K, Ϙ:ܷ|Ee iW21CvAW&SwCUU0 }#|q%k4W.]iz"f~ɗ'y#4VgO5#4c93È(#t+Ṷs{)OEK)kv1 j}zy4]s}>ݠ쨯vMmHn B2Z} >mN]̰.D\_]!ݵ7̯dX";вv98}|rE~ ]O}5~A:Yo~]ZJ +l?g4ݜg%"]IcEf)e+4-r> ]b SwG4&sr.y*n+2TYFMFX:Mqd$mGa6īs+xH$۲ i\zMtm\Єav1ӎ"&{@-dT߽f-NT=(2Ո(# uUi&ko GD+ VcR{V 9[YS=%F'2r _"f_ܸ+S*ME͵TiCMtؘNDiamMv 1]w74STs&"CDh&CJ.UEwcd>`!%~C' ^!Kv(oG}eXaAZXoTVbrȐƉ0ht}h.Q2A%63 I@9TeA/ڴfdژK_R1 TGuڲ{Di2BW@A݁N|2[!)4Yb Bv Q&ouJPEޘaoPڎt3]ZX-g! =13Ao$Id^Z8{v)mxIieN[u1{C=`7 B.^'{Yu:=~٧;myAzLVGvy 1ʹz [CZz\1?97Td99fXPQ]T6Ih ^%SsH!:evᤘ|at1Oc /l"h&̧eG{'[ڊ~䋑AZl Nh^=UF]dl?[暊UC Z)jʂݸg&#t5Fʝ͟Y5D .fD4f?{O ҘY"2u7jRTҊEjo8pv۬7dFhopCc?kI*U{ivAv rWCgVS@b&m'g{HD4fz4s_:t-%EUj&e/޵^>55ˠu*?=yLݭv7έLO9ݣ-B!x2pf0*" fA1ZZ@/Az2B`!K 睏nlt" l>\@>b? B"3v%kh&F6}"ѹ_ݮ"z5o5f8 5[*2xi=C^t<񷸄RG8xHGUBzl|<`>JrA/DTįp8Zh;FmzrA d@ʇci=1B_!M4mQ- >g㣉u{p/`6J>1&#$kT.8ijH/OAIYHbc*Nİ˟Q*ql"%6N $32jE-B 4FL"5gba vhN4t! A,axO c< FiҪ8x|"рƺ̥2aMKͅ0uēy[.|Ah-3GA:Μ=e.`˖X 7K"B( +ZEK9\Y<6d햶\2&#uz0YBaCwQ,E"rq3l<E v]̜>> ڄ <5AhLDD;ک "CZuLdH΂鮅~!wXka#6iz6Y 2]]W}5 tB[?|aSwOB56z1nOEY|unšˈYFZ~ 4L1bAf#[8oG |1}b ZG:|48e(ɿi˼fR(2@Uݲf{7؍NE½6+";8l]%6 瞜 x2ੈio<5WVuL.9i:B$W{%(#t4J[_5Uu~ۚ7ĭ"2u;o1S7Ȓhݒ:[.ejRq\h<>XJ?PvbȐ''&V6lqDdCRbPÈ->L7{Ќi,t;.tAdn"˖Q2Ù>ڌ J|q*89fL*tc~%'g?r =ܛިԻbT7`j^asJT]1qS'Y K,#w*Iw0maԑ^}6G2-ȌZ3?v3EDDc<}ɭ>*Oo BǞ~&,TӠpuR"cጉa5z{v?91AD瓬LOݟZ Pj >Y~$u 6Ah2!_kvC+1ʱ/*EF<6p8x2\x "NIJQnZ >B2Nm<mj ?f915y}䰔gEœyʠv.ǓyXXn؁bz"8QRk-bZϼ>WآT;hAKdn}||3Ez* N>3!͏M5˛Dg^x~\ϿLnR2`%NaPdp7T$-X5`濸́DtKD& NJ K04?Z#aͅK 1,s&mh7la xHoSpE ;@:s >"^[7Q恺rCU25kVe>B Z%Z$~r*: .X&"Swcݚh.dHa#r  s^e'3X"K_gJ]fԗ^.kѧ ^0ڱdQ-wY1W${\qʗBS;1CDT*MT/n'G=sBf3Z]]mf6`t8Y]u.S ͒~۸}~ʃ DOU+-J>ko&HOD9\$<tgp*?7GڛD_p-G#9|@C~59.CDoJpQz]. 6(ֳc~~b*jrͿt IDATݜeddd E bS.kpAL{@2Tm RQDsY5B j.-Xι-rHwш= ~'bt׈[/qS;>jx0=w\HZm094-ߑ ۥ:翾Rsx)s;[<R]J:{m0->+KY嬽d#a/& =3Q ά%鴂B;&|>_͆M ~e?xZ؋͆=. #|ɡH%c=3'u0ΐX}#wo!"yD>o~"z#^"\~gKY~U]uçm$PHǐ#lu`[ۯ?[UWWW<###r).}7_{,-zu{ЧK׮έ,oScT)ШRꂦOc/tg&eg(]zЭiGU4ŏPIRR{'jva AHy@<5x p{L]o ‰%KBEL8 Q9:bn{v)D41urښ]JOEW&L$Bۑ+͘D {DV!^o S`ҩUH;б'L4^`q}>;cs1"Jۑ! Su\K!-nS vqVo ҉$6Ѩ%NjZpb>u$<4_"Bd8U+A7gҪ"JWVNMvbƫI@]F(ۼ/eFZ{Lu_cΤSeo3GeWn(tWD6 l20`CBvyV a6vEw7à6W4^UT[ -qK'_:qAٿٿSlTjgn<@74m3fYJObl<<\Q-Hga??A%r= =v-uSJn>AL؋/S}~^~QI F]+ {rDDtb!!̫]T\24z tMoW`:YۗAAj̘CA]^̺ OVjL;d.#_ų;]]C0zsm:HKBGulW7†,3.B_UQO!V;aQ4l f5 ˤXLEo٥4AQE|ՔUڛ]ka-C]cg bA%6"HJ>~҉c/~K^.mx1ɨ㨇RCǴ/HX^)5kz09i,vw2"{͖)x+uO! )ac,`AY>9N]URZJr. BWz٥8 M.cCDd?:rһuXT@[EeAh@gLj7FO?~!u#4Xa͐X[8S/X\Kld2G4㣨r&qsv1Xt|by {O=bgxHW%9N :p)z MJ3&+bAgU_Ncu}# p#4ɨF45+,xN%ĺOv96'kb,a if3d=q˅%P"#mhkbgAuD[GG.-4#^zcˌ$2-t/KV#T|>Q&g(#F#1+2X:.fAFR,j1S| їQGSaRZ69ؖ.e0\L=/Ɠy`Ϭ]vϾxWo13]FaKDz'rD: Uv!Cx2Hd?|*t^<$6Un438rcjcEK){8AMcݪAȐcg3c(kg}Xbc9m:=k?GD}]ly^T R5펰8cCޖPh̏~z3б_x~rovf3|)Z.ۇLUv>" F)#wey"6 fA&;b}pSw#&3=\JYu{p KASHU7ʖab2=4u7ė h$ME,րP!M iTskЦ3 ;!3_aERW^-K []-IRkI^)#zK*xm2h`1u7B:bnh5<2X{d}s^ךYHFy(2 JvIl1Q&wIZ;Kd(_3uro@s-Xb]L&w޼{f3(դlӌg[ol4~=c~Mб_85/ՙ~tf敷uLRZ1n' 2+j)#zwYaˉ'@ʗSpRÅK͆=9dr@sME UV>سG/Bȫjr&NNw#Bq3Ǔ:u$Iw @CF-h-W4u7V 7*""í2+"UcxI\H+2R$vkcBˤhL= Pه|nCc3l ")ov妺؋J.{F hhKpB?xZǙ# =$nfvI}/ fR"CDu;ns ne=baaEuIhw]]Q^KMbb̖Gq'ƈmng6|A.v ~2UbZDD>j&U"%3^r3Ec/|S0U 8jet BjE?ǾE2BQ[;0ܚ* XD4f3i@A5lAUE $rXz~Rsϥ=6a%6LK2+Yfh؈'Y<oeN *5Kc/CAF?mˌ(28e"Ҫ}}$/`)]c66 _QW2NVjpa7(BW]l-3eTį`4W@sNA f at|uli {E&tWפ"3k[3׶h$Лx {M DZO3 l2؎ &l'󧎄I)5%6=X`rE|_$_` pylGeYu# ;Lfr10˘{-Wrfz N]%"0.fX9}|P Xijﴵ'B4-M~ݼ+3oMjܴIw% ދ)_Z|=E*}9S$:+Y{4ME*`~.3 h.(2d>X$sON6} ;Щʼ+^O so&fL<7u$dG_?LDi+mPs"$+~WDnQ(EL{-kת =ʃFJH _D1}ih.l9eqAz]^J`0`r'H'瞜rz B3ҧ'cM|Wo`m_M'1˛[TʋB!:̋l [Ÿ.)# )6"P4m"FMb>:r?\Sp VcYJYjNU2TQd,CD@瞜x'+6wk=_؜7lħ^`C~KCm0[(woA.r͈ӷSFh EH,#Q%XbJ[GG>1vr2̊bff! ^M՗;=E? ^ƈ"#qvsu><=\y;4eL\(buS.r|*瞜0_܇N+~ApC1}2nqd7xD;ib+fέ #b"U-'piz"8U @m]CqT8ɾ/ Ea6U&S:v(2gg6L5m2T'5Fl2,20˰0Q4l7?[dHD昩CVO~q3_t2IU|( %tHEDaW8 ,)2\jnJi4P}U0d fh؀^==cni\mYQF TwFN2x>͵b SwG 2i qκ gt<_hGCki- .BDaT[ Sb,;s(R%tfz"x}>96aC=?~6D'UKz AyZ%7T,/=/XQ4L-(:lX{DdAuG+kέ.# ;c_dcjDvX]2b5ТafQxHUZO汛c b=HARZe''Øs p UtNc Xf8򜽄 ~t}'ь O][9=c:&PAaKR"1 C&";}8JVn)2\N[w06jß*2QE|2_6K|r&cn`KMqFl2зIELЙrũ3$淀 _FD;dO /:-A2 BҌa[$+"rLEav¦ h.&QřO|tND4.?z biȨ-[{\.r0<z]rEHҦ'D4=n4"6uL8-NYܓDO/D_bb"&AAh6I3R$l2N6W(4aEݨZGf*{>OX|V}$TPռQ2ꏢ` IDAT@m0Yqv1s}>y4AF U]*Ob,:e.Xb.rEtAi"r$"a9!f$ d=k9ĆD9 hKJ%>cTuްA+T]kOOnD+\e)k!@A"R5PR ivZieF&LAO*JUnfo#I򱴀!UK>A/|h{ȳ(2aSw;^҉JZ6P#W@xH#TTm2jEFz*3yPtX#'(dsǺHtUG܄{z" ~":JN.# BD#Jkb,f<7Y XZ#c''&pߘ"aUAeY0# 5i.x ![ل԰ϓJ<lYf4Y{`Om-Wd]?^hԎpfAAv2PS FK BpXԠ+"pcOQ*Ah.paSFwQELYH^xW~ݻ_?lBv?<\!Ǵ_.JZ=wN7aB|ӻw~pl7o?8=tpg QO>. n%?:8x4~YG-[lJW+w?"{LD\w7pË='͟ol9! Bw!N)Z/Z/@X-Aׁ~}!/Jnu/nqM"yѝOPd>jTߟzŬ:dž l,A0iȎqE#>j?6a뇍;w>)v8:QpL~* 8=SZDtύ9I_j[SAAI)A=)K)O}t~ZZDTBqt | >0ox5}CDw}d@fr@s=;l4L:E~^y~7EO0B5"Z ~~~0HK)ʢPe:u}>n4g3~")n#o٦B7w?D_6D 0?'Sw*6H:w?CeZ$]~\  }8e G!Պ "{9D4x@==Z#5'mp*GBbv(2TiAB hy ¹xzăσy¬xH*2HO'd EwF0է"~>󨡿ߟwo[Zu*AABD673"9f%k'ũHԑ0"'WVnѵ\@c1S7uwdH%6u =G]93x)eAQdAh!-FxtNj8L4l;kgT 9=nQeǬ].3=t4cr;% AA&"Q[VdHQd٥]4:lLEEfv1sun_.f}a'mФԑ0Vs+Pd}ndpr%QdAhm>]h5P34uw@s4R:mLtO._[ȡu[tAABD| ""#ܘJ(lxlyxii4C!\q9mA8b .fw4pǎ% rMFA 2.C"\Qe1M^֘c^M=@D&L4\[!ȐfnUB]NAAƈ(#8Q9)zuQZr]AATDߞ976ۏt(2K|aј>>ʉ`* (mz%Q߄vv(2j VIr9FvyYeP]* B!Ǔx2?f 9tab t\Qe X]YKG̰Oviz" M-/]j]s2:Ѱ6V6jKߕMݍU„9>u$X"L}*GlM*AaEϟ鉠(2 t(lbeRlt=crV3崕/lexݾ?Y_-\n:EDY˅q'|҉󻜐k  '"ncDt}>+$}ƆvUaFȊLdH>J);hnXlC''m^BetȴA-e-T5eȨ27U`T= bMw>)n̩#aLac%kkDV8k~˜uՂJA$x2?tp  2ŭRGq6؈%6A~Moέ,$V܃-.BW:͘Ǫ^c>}|vbFHTď$4- h$.!,6аi*KX{Dy>(G  -K~AD-?3X!Dݻw=P%O ycf'T,1S:0ph)C"UdVWWhddұd2" =A~$6ٽ: fH/sσi%홅$ `@sSY>ó7œ|at@2_5:Xf}_<{1M"܇1 -E~=*{= տL/*239/rUK.EݣamԀIU%|q9m"S,$iͭ*Ȝ?v\<2 t/ɲSYVd)ee&2:_&_\4,ģ ibѰaxGh@3cO9Iq  ɔqb VU&*@]2H2Pdpkgxd=UDȐ+F;oS=|sXA"aipH 2¨2آ2E4$CJNuHb:qOhؘ]JA1rz"XV L=_ɏv!H=8z@>~UW+ghǯR2=c UUJk(2M=mD0V.f^ l qszt=:>$.f"SMV l21+Aj/!dze Ze'{w7v9mMghz"9~v1K{4]?Fѫ7no  B!L/KlGXKO[Xb#v_g;_؄Gfv1& u" xڨUsH/X Q2$ CwReZQ7c(2rEX#(n OEYr{+Y<2ev aVGLX{T$`U2~7+  BcDeBGv ^w _D;ck"nR,ݰˆgp4{z"%6ȨݯTdAzK v2=6!a{k'`D6Yjh@.|w0D9Y3=7GǫD4 /3?EAAp L/ÉD4.\x<Ǔ\އf2l5|U2j*%ŌU ha,qaDXQSS/+B?ФeZq̍. 2"#ܝsWsdž4h@eD"=_،%6fl>рO<=n>sy2TizMDͅ|wvY 1ܓ첡-\.v9,# p` 1#7kO j%rAbFܭ瞜tnl]4P}EEF~c<܇-~a+C^a2DKlLEuqX*A4 OW DVw5s6^ggAlG+  ]8ezΑʝRȠR)kaߒ=yNNbff!/lZGR4lp/55Ƞ wD)2?{wƝyt:Ow2iӉpƚasB(Yp{q<& 24h ̴XCJf| Ӷ@h0d=mIS$ۉ+@ɢzUϿ @3NeLmaT cl/#tFQo׿WfeF=#BubRqO>mg/6x{aOsw-"o?jw}lx.( >>TMz۾k߯'{wH$?anΝ{_os2zg^D*j})Qqӗ "E8sww\FY/ߋ\E}CiwR|X)?֣?j})7^n~pg_U^{mQ?8~:E( GjlFkx{w7mU<[ۥLFo#wh2 "cD".;4k.c)DW'U4=o_o,s"rGy@qD/ o{U~Cھo%<'"Gg'BSʴcDg_uGD~Q dÏ>'i2~:cm#Ad:c)`LSc`̨W>cUo&}l} 2"7>g>~]LhT4c^Nj׾3UW&!D(do[} jf/ w]{'}X 0Ȩ.Kvԛռ :F4vo)EVLR)ɘX=Q#/o|ՃչU= IDATQ }56do=?#\F cͨqbC_?sQ3OxP^?ϼAe'xZ5'}C̦DF} dncDKP-L))1F0?[_DT=UW=~!dFDYGy ־}XM` [ͨ"bf@zcqRF# 2:FTQ\T|䁯}GT%S}8I.Ku2$2Pk'PS4hܤ)6~׷y͛݅U%Ɍzc۾sOo2ஈܹŝ{_s}x)m5j5+ӡ_C_WD5I*x2A}RT&<{|ГoѧDF|cTf֞JߚFQ?K*Rr=ѽ|5M!cMf?TJ5a>$z] svE߾5ВLub! 2=kT0DFUO>cӇRѤ‾Wَեo˴S"DwqRMf~~C|p3;4g4> vnNnjFW^}w[5MTh{}:a}]>7>vί>}o=\u9|8|H 1-"Z:}[zo&|盏H$Qs3̈ ?T1T]b߿W˫Uc4#ő1eeMosxq5o>Z^5#*Q @z5{mf]-1eT d}F1EfDViȣ<;`IBf(zc'g^mB+! 2=U}Zc/@8g>>лCÚgjJ#"?|߃}_nj&c4#@!32,q옷\1@FoC2f(RVlh8cm=Q6c?j)"~~y;VI$MJHx2#o)EDQֻӺɕ=K7&vCcʘ.O7|=ׇQьj814myU7=Ϙz |bHLZ>>q 3{~o ?/|"JF5 #e|E{UbX}`錊uq|<s Q̧o B/YED$}4‘'kնF(?[k&1$_3/ zb$XLyʁoSk=&0/ԏz۟|#DYC¥ݟlȩ#7kնY9)jQen}tOD~y6}^uYG5|bԨck@c$bԏiZTB¥弈tIvED.rOܬUۖIM36F Bnq1S@cGS#"?JaU44 >'Bc?ʹЅ2kټHH+9r4?^+qNܬUۖ>E{$BO-wR~~Ce>i ` [(%'݇J"ȡrZmLP%C[ɘ(m߹g*[D>(NnO%dj&c|2-!lm7$H>qNܬUۖ5nrsYQuΞp~8}O~ k.|!fy૯Kvz|p󇾼ST'| 4TB|^$m7pVm[ 8e~IB{BAD"G8_RBS 0ϼhۃK> RFu&/ZmکF1z{ȴ2J~ ]줰a]-P;KCQ|ZtխUۖ@H-)f'u-=)+$'n֪m })rhvz9^?'=:rJ{Z PF$rH72Y5oh#]7kնe+!3WD =hUa eD$u$u$Ąr .^6.gB4|MK y>9슈n>_^tX~j(m&I&y<%2"J4'Bm"vUɘ&yԦ$} oogE"l>/z^KH{T$o_֭[U0a8M10pc04|:FKKȈw%/jhhA [OZƂ1LF .ypyҵ@ﺒFNvG '+g+#FNWsh-e|@(BP2>ZɉdW,g"">xHWd+Xd`%N'-%KTi>EZ9ulUM9'zh-̉D_8nե1[n>ku;QC VͿ}oJ?,kS>‹gb`+7Z4rOu2//-,EJA l~y!r|V$}HDD^g'RAr^`/-/>eRd;K&G]%\#-a+)p(\J_K;jkYKt%GFEk==TxiHhR{:H+4*"ٷ+~@.eWD:-"bR#Q(E yyQW Wȟd+I(PXc9v=9r2C%oC𰭁J0ˑ?ɖ $ B!)wzwFͯG"ݴњ.*K秵GOѿF<RQj,#Z47*`.G$[^U eIhT}w__OR|~W͌J0ؕ#gO*2B_&^9uꈈ_ nAוH:rjDO/ GtS9'b@[ͯ8PXO%}r"YoHWd!PAEi-bJ0)GIV i))y&vDk)vwz8RaKV]{J0)GV i)eshOhɑSOGJ?u%!P6Ʋ u`XI*2<^ i-I԰ѣGnΟ V 7XZRAa6>?Ԯu`pQI*m;;;=T}2Faʳ]Qkm/ KmjE.D#x&SQg-oe3 .ˑ?ɖȯMLLT}@ jnC&|ݿs'۹]vVwPe.XFtZ/D#Dx&SQno)&C]%ܖ#-a+cP2>  e|@(BP2>  e|p˕["1~q`l`&Pk^O۲R㓙gvfRk s\Wnlt$S{t4 h) DvU?: gƒ"Zl3ɞkԯ/Z:;5gƞz;4)Ø2;MfxF$10p}C˛«39X,ҙ˓\K({0aBh#^sX,񼵊Rnm=껎bO۞9eύ>_.37|]f^1<).MSEȼd憱R:`.39|=hiYΩ:xp* LKZBOsŋ31 OfbLkbE1LNJˉq\h=ŋ ŋ/%-amjx.'RCՈ 65R3 d26{"Y-2LnoZD2j>}7'U|*Pu#B(6yK 7J+TؙGd]/3yZUm_͈Hb6I.39%?002h) t, @w2lݸ^Uk7M&X,H TUHf1}_SkBK[DuR8Z\~s+K&Sc 1>S2 ֍ZeRzDo^֦e&p2"Z+ao>Q*Mh㪸RRpрfwv2P/}TuRa$cڸ3\!WL5ڑVi2M k3ǏՈW{]~dkHDӑ;UZpP IoMiMQ3տdkmjtLf6 bM#UKZ5KunnPK8n>s1g2 {N/[Lj5e&W'e!b>)$Lq%60OБ<3pyx.g HH3"Ss(b'Ofrيbٞj D"Mq#HHiDb_˕Lerƕ2Y9S2-Sz* Ohrcĸi;mXb|&g>lZTG@"VK͌!31Sb(  e|@(BP2>  e|@(BP2> 궵=Z2/=~hz+S4UDdk-r氕=>::5^s*h՗nOU]JaL6U_'7 4 PɹL.Z. T㟭 f\&37ynJ˔=Ek$uh>mGr"KPn-2se& rJ7/xq2@gr"b"#"=c31ܜ} J,I.mo^I"2@T+03 $֦Nfr"%^:3QW,Ks늵«se[ṧ/WGNs\lfgmdz-/?2UZek-9 qz[$Lі]?̙oɼLƲFɝPkYT.rԵO_;z {rs^Xb̘~:$hz2^ifWNl Y[Ke&J6WTܬ۵D \dEz؜)2Y5-lrrYU*>[L5/f{N^2mU0hu2@mnި̍"ťr\l`LCdkmjx2[XK-hg'KڬM JQn2SڙLi#s~L򖋝?*RWlQu'2X[>Cv$SuUۖcԸ4mԩ'L~T;KŴZE:z \|ob\;zb2u-qդa̩n&S:1rbdjFFp..[a?6wfkd]o`Coi:B`/%%iwnnrxNDb/?g?Xn\9놯ؒݏO(>~29v@NZ*[[[7oޔ7_w=Atmk"bɘ82|aUD\/pEݥ%(=FK6פXqK5y@Lk*| IDATmEglf\!rLn23'P?ctOÜɸrSWi%նTc&S*{aU*t7^4Z PҘN塀m:zRdkkͅ>8l6U=Ĕɸr ˯65<X"䩧zM똧?ʬv~[Hfv~<+3f@I'&r7n]I0ۚt$Sw* ,Uv=uҀ{#YX,QaIsXΎh6[Ṝ@#R2> c2>  e|@(BP2>  e|@(BP2KCmmmmME6SmmmmCK^|sL)4RMӛV.nmɲwS5\ܜꮱX$2U9\J ^ޡԒyZPo[_o:NiY""U.UࠗpLoTo[ggYU}mC!-eZԱ ;;;;+Oc>(lmK_m& @z&̶°G˥N uvvvv66qӝ!kWgq <}XѿY]c*dNC!Y\=vp`Wծv4X+]jڋhƦs΋/>dpEM=gfGr_NK'8hQm^s!m_Z,ܑ-RvKaw2x"q㢋[Jô9n/r-_O5wgId[)] A\TXTuTt}Umk(Ups**nj/+1jj7ms瞵2=Ɗ.$v״/Ò[4;RbqκU6m%Oe\e2-{z쾨_:>ǫ_ jmVQp*.߇ c(q`L'i`etu<.]Uzq6-{T T ۊTE+ڪ X2n;~:}Dc؇ mXq/%7,IOo|Rw:N7tئ2n2*JPBF/7C/fg_?98:iDee P㲊Pop̡eeseSUu]4e WMqSmS59SLcx3gfε+/fÊ.|}Ɏ) ̾`Je\e2}ŴtTF8e:;;N]UmVhq^>.C+׾pENrBP:ڼ㦆f,تbg PNS2{!}{m2d2:b*Sn̥ӳ""x|ppp[.yjCgσǥwQX/0wcS'9xs D}?*_ΫRko#*0Nꪘ\+)Iߐx2KxU|qʸd]:Tǩr]&4;;+++.\0zرu4n6˵465|A=bu>>8\jeVOR6S?:m[/TNr ++;;;<ȣzq}m.5| W(S0^qnGfگMb5hچv2 /bllJ O3K[ئVW\P9ڹ5|[bF<.ݗ;l. uvj>;c$N6]Gʤ~jΐxnqc ѕ7.6?:y삡c¥1~]:74e9v/pO)F7vw şg/\P#"G/XH_p>\0^x|z nzpq@檪]j=zoח Hm;;;~CKXj\l rfx$rJlNcE阭F TL`Ll}cM52? MK&vH \HK>AFK+1cɵH|p'w-e|@KP2>  e-mֲͥVjDL -zS>EW{d]*[H[.jKvoݪ/rFޡjjxl$ԏ{Oz Qs_UƶY]]n3ݟzzT]w v1 7} Nxy;gLƎƹUl\[Amyu؅Q'}<-[@j6EdX7fyP-R ?9YQC?{`ѕA}+ W5?0\JQ:foVDVOw-Vqš%ч}I7wJDZ\5ڦOTPڣ!ղGioT-o~8^ϒ͕Mm\5WmwS┹L[4\nz:Ol_#.KƋVWa pw؟EtI#ʿU|wzsv<*[bZ/3\ǨT5NTz4+YQcj55K-C%Wdp9KF$^\[*.088N;+.Zo:!mη^\peJCabp06)<%Zziw<B.]W8M5vvܔ~͛3wCwy8.a+_Ңk5U~[n.WmT]|+3b|-ĚOJocrN5fgL%BjZTsNby_Xb->L`- 'exH5Q[![f8_ӧ[[Y.brQVrauq^rk{Z:QfSkhޔl?1ۚiow"2Q|ꝳxܗ?pq̊>nA߬dѡeku~mw-3qm+;CvR9xĠz6mRAќՀCe6V)ԩTRjhhWunvKMɖfoV$~nC;.g]zT4 j8nĶgr+Av*B͛t>CnvQչ\\Rf_Prjn roUHo[}({}]E!Os/nfhl` Y!Ж2"rp'"bGyb+nmzV,9mニmKuj ;Ih/وڭqGW6Xs+v6 K/[a9Ӊ{^j̶[Pi1џĩ?TTEJ% \do.)Ԣ6rU?y{Xb8ZEk>+ y{5Lū piB-e`P2>  e|@(BP2>  e[o[oY_u֭[xRP( ~Ec 10(JT‚mQa &!F&F=e|@(>.^HvU\t==1=:rHİKodytE,k uKzzz9vK./&2".ODo@`ږ2K bJ7yia9/"'G]Q|6pZ BRp)}~z~9/u"mwV ײ*I+E#G"5;|Ç> ZIC7hѓ#^pɨ2:=e2݇JbȡnR`K/$#QYz|&ϋ8kiJimf_ a8M1p4O>T+-e"HKȈe_5Lݼj{ukal)S|^Jh{:=_+ "R}PJPBQ%@#q+91,y%uԈ^g0N/yF7-uSmbm2o֦Ҷ5BPƍDz˻O~m?Q6@\rʕ+~PƍgE$;>^\ YNhhPa==L&>@Y&VJgqёdWȑeBѣ  S~\|~e~@uT}_ VNLhBP5 PZB(T2E(ŀ2UP ~2+W\Q'e|pwu/_re^z/yѯ@y24c౾~lNz# ^ \" FaDÇ>|ٗm{*A }~/4zz_{E? IDATc (*) ~Rz"M.(PZ0 **ѣr@24Y fsxWfտeNe¨A}:32sxi&\# ĨiF1 FhR "rB@x0/n}]c̋ Y9Ǩx#4-ez"c|CR4 gz_{CTPf׊sr `ϨD\Zݗb\)U| /+'^66!VA(@h,F!eehZL4C4 @ ! =1H4q ЄrhB̾Jrʕ+W> hVNlLaHd9ʄLpB S4h6t_n\ 8st_ }P4 Gi&RF1Ⱦ8!F%2A{P&tbNb 조2K秗'']-h;џ슔,Z֌9u$by@O>|C@VNl꾤H:P^΋D-ZlwIS{~4A XG 4NhCeYh"~za>ΧݍeyA D32P2Kl^$-ldfHR+4?ϾRj(m'4 5:1@C1Yc9vMpy0V]ɉȡ貱v>/lihcGx$é a e_IjNZ6/k?4"Ṷ[z=H8irs}ӯH{cQ>䓞l dAD"^/*\ZX΋t'ǨKB|6 3 b*xpr^K//\:&~ ~7IY C9 Ecc5䘼PmrE @eͻ$}r03#Fr>{p2*0@/\YOO[g.+WH^A;PBL䩤}р"2bP-{hB*!e+Yv4N @}bP|ޯv1ʉ4@y2.is Zw(m@rMLDA_L }}~@kPS-Erl"ldϧ׋z|VS4BP(#HnzT{i˶) -elf/zc`E˖eKu%Ovt{W [;+YOdyy +PWyAmQ!{ZD_WÄ bԴWY e\X:䩑g ZQU"@0ŠqT|v~~|vy>e4Hi:PBD8bzɮ7ؕpPX/r-G D"c[nknwj0 P`Y6t95"秗k#{X{CSk00 ^1h"C|~[XrH <eq 4 #Q?ϼE&&>9Q:ͣ42m븀:xvlAE(4=1H444g%Ο@t'} J]ʤ3D3PWcl'|v~:k|=zt ВAB(4S34B&֕<5lz! (vZ Hd"]S]@s@3* $2@U\rЬ@K DϼhۃK^"Vle@ 1T0E(4(Fo/C`o@xL%<efD$c2 b ?yB1j1 F#Y g>! aD@[2"xh@VN\&y} P'ZDf82!4 oD7܏)coP1ht2 "=!‰PHdfp@H4Z F=" r2F"hiUZR  PfmjumRc= Bq iH(s/"յZ $2n/[]8 T4 Zϝw~,"gOg~{Ř2M3F>{pG}ZBNxF"s9;wo?l|o'~揯?*8.B(h1apF_f5>;Vg;93ߴ,_]}[$}_/O~SD~yk??X3{V2[[k7oSOtt}0{ޭ[l_}:@PBQEcPxԹ槢f>o0IÇ}@Ր8$5{ח3|[D?/.l/}Ĵ/D:DFDd_v?\34iu~2[kWo ֦OffR3g߯ Ƕ}ɽ8;uD5ӥl&]0e-Ad(̸s=3؉^!Dꊜ- eDHIO)M]ڬt,Q)BVO8;KQ??>@_}IK;jӘ"YyJ;EEz})u>eٿ<7vdt2)%2P(d&Y:pK?y?]Z.M{~fWYG׾ mKLLi( gHw"? cѰOd؁dl<d @a2j.BRyj^[Ļ3auS;B U\V3 !I&3 "2(%8.y uS7Dڟn`U(0m=52Hd`!J@-Le|wz>+>^ɉ̝"=v=o^ΰ95V_d #iz-k@ $2ؑѤHhwv޶7䑱\2Li-q4({Vk_l|_m|g(ͪB!IgELv.6n$ FO^4(E-;EV׮6">οn=qQkM|-3lƲ21GLf2ak0Xx͙H$buC|RDԴJ4?~W>.X?vM|qgؙuӗщa99-V]ZU\S9 nX~VDDdοc{kZV翸a2`eM_0zj:Z96 Z('աs~(""][_ʮG³{)("r_g~ TExUKn(+ ǰ @ӽDFDo>y}gO`'.mv)曻KO9L"|MOzM"+o'Zxp\?%&rߣ{u]|d&[T"P#3Cd2]BTa TA <8حEQ-Mu?8r]nY9ew|_ݥ};@ Si`3C&$mp(xp-;νMwtQM%˦yuBЋe㱺!PO,Jdȭf*"+?%> a5՗`60<6|陼(׺>]rﷺ)z,e}(fl]XXwSahHd6x kJP.O,]x`ѠPfnBἚBM֠< H)LcJmVXs*my.l.).~*"q6Bl|D:tE&ǐjbLttt=ݗP.Ť#Ԯ/[z$n-tm/,FV23"?4q*,gLf&N}";9ȶ B4jԺ{ |oǿt/ZK4nYyrߣ݄2@t_tƾ e3"߻'"'3O[zr#c 1 E0LF,-ROTmѵь#Ktq9RgN'"'NLX-/~Ox7/~v/xAJj) ?uDql7mmm=>_6Lf~AVvOfg B3_Ys(X|·?tx{{N[[^@ #ov>s^?7ZRǷΔS/tE27泲:a2="0qL ujgkSG<p'o8?"lZ{3Wg}zӣYKêP&;$dh0X`V'0HvE-s9&s02ZP9"Dn`lq붼=ZeHB*3 2ܮh'ٹdFD=1i{&p["c,L3ΝD <W^0VWnJ׽6 0@ɺKp(9$Gcc.$G$v ňf}u{4pJ

k[l{`eٺ֮Rt_JGvOYoÇB_ġw~ wRD>w۷L7fSgtËZOγܘ_[׳MD2 V5 Ȕ u?}5o]}=v2q @%  Gla $h R9M-U0Og~)}ˇը`C\rrNf3Qvѭ{PD &k3Uq'Bl6N>S Ma2e#8-tGVe|L$򻄷@\5ƪPfnhrB,h0&4hUf F'vcgED+'c''< %2lT,2]rSdnb"'8֍6g2;@5D3 14dx 볺 ((eHd,E,򵺭 eS5WONʶǢAEW4jq0wVi^.t><4€ βrK"&iqq}vkw4Ғ'|bmKLq7%Tn^kWW.(SJ0SYd!`0B:8KY5jmۼy-R`%lfvvVD" _:w:][_ʮGȭO|A{t?B/*Ӿk{;6oyyYD:::6ӾsYV[Ms)&ǿW23 BH& #mDJCm"LҮEf#ba21@ <'%"xuDiB3C_8-97v )?4|,\=ST$dƶS .$.xP#"t|<.oid" (\x~%bY߹ѤHhT8X;_hML;0t0H'rT~ށڰF0ppG5L2`xV볺 &,ʷrߣxjc"5KbgoxW W>pwzm;$5"HdP}KTd1`O ~RL:"Oz*/7EdBH&y6 V3H4}# eS^kk7cP%@}5Ԥ-tm6zѥ"B_`hr4<]>m2v6]MfD(B&#" v < mM%Y>qbĺ_l}]~^U6uӗщa99$'G .CQaPq`+jtk'"vMF/=5;{03[D=Y7Dp/.T&CT}_Zذ ؖ^aFkVY] pt=+vzIgUc^-=QP@ը9LV%+;0L6>G+Z IDATH4+!mgu~柵^:Pwa bDJh%1;;+"H`f2 dRB+!mgEqLƣY!JxP۰:@if2ݑݽw6QC !(gr:HP |U~PP6Lt{SeX "&2-$U^(R9/QD:Wv/0bL6; " B:](8LDm֡[ i'տۿF+ş96{^aDD6jWLv.;;T؁ѵO>CgyCUg06wiC3hjLq q F N dFD*|崪bEyrRwQ&C"Q"V= VSYMnxK45e|h`tVzCUg0CfFD% D*'""@^ޟr CBlh%Ld&Sؠ^~x"v;JLRCG-xsH$b?#z8tDcC\;/mOE2 ڦ )iL%DP^~&ȉH`p(|:>>%b3;,e`{Pt,W:y`ai(Ԋʈ6)z0") RȒ2j_MDDFD<ᡁx"'Ik_Z(l#bc*se;WFe2scG&"Сda{Cd&3ydg:KM,//k?0j1HdQ^! X&HerOFUY Su؎ehRDBçAw~ OM3G&3wARf $2Mx;n=^\.$R8Un뫺V/K߿w|;e[N{6y|Gyߌx|oS^3 j՝[,۲-.H{noULaZӰ}'32it;C4}Ȕzq)9%r9|{+v8lةh0A[FGDF4QZw+ѠSwԻ?jj8L5^F_׺? 'ݬ~ZrfOڜb%جP: i7 &%Y_~3Qݵ.xڇB_KK#S)oJKڊLpo{&m /ir _`jj&]fl7+ U6^F#VSӣP;񧇵/ݘJ4W*J-//ГgRQkv=RA Q+ ;f]R@앩̛<+x;o>F!7*),1yr6\\l2#"ݮSss˟WgL8ogG(64kBgwqz&1=J=ZSx-(}gjӦ)U֎YY4wɝCK vN:S cczOn=ER F#[fb'kVHU{vIjANTbę_|LulQ/T&fD(EN~ st/j!b+rH( >/_0) NX,аus-R6}s=SSFYMp(-$a%/IϮ:,ҫ|FD@&KU_Bpv[ؗ2Z ̛Jk{D:>}X5e|Sӻⱳod2iރ]A/~HB&*,k\J[h-WHeΡpGDxLZ) Hr:SAJ;rI sɯ^VδQ5 2/ak /VN d*ץ| /au)F&5OY~v, ij5$2h3hPv`JF;A}tw_ĵٲɸ2)=y*TrX8u(8U689:{"ZvhqJ%2Z.SV,\hx H$ឨlrΔtcҺİ|'߳eS閃yW=mR-}ki ,dU(Bg'GmVmHAhfC&2&9<&rd++FTu/~`buhmVyxh=[6}tk[+zdHULwdxxwuMTTR-q%;~lvr"j΍i+0H:d1TTڤ\%PUGi<faLj=m3'.oP)xescGJ&'0FpwNeR01%htm8^F{mQ1 ݵvOf2ɳd1nH]:Ѕ+A( u*,//ߞָj*q8} lZ c21fSzd$Ɉ?4|,JS]__M4ZL_R|^BG?A%2yƩϫiS$2G2J/i;-Sɘ:?u?o[8 6 4\\K$Ŏay6g^/ou[4KZa #g38ΟZܽN6F2vb4ck?xnG_ދ77On[R6Y&%4<%q ^e2 j78cȌʉꥥ%'L,[/vs#_Z$GDFD6=ouբ e9iu6{7.ahF#'.B`C/-"rkN}yk /K׽3 eKnTc>^y~+ᇪ`rܥ۷7oluCDLj!)\@t={se 3{dm@}f2ڂJMa%;5S=3B_o߾;,۫R2$2'>= 5ǿ,7MY%SRW=.`oN_;gTZSND)2>#,4D"ds Q*&2 2dF̪P>Mf&<3`dWO4fb'G(~cΘm8|WTזI~Ce/ rBlt4)( T(}N d&99?K ط>ƸB-PzmCfR?3YYS]dV#V_>=s!HDD=[x:>2HގށOTu71pi,dHd2tFЯ GaS?gN'rksT*Gp_m 4\ZZEM(LU/~ƨٽ2^ܗJ;wl_hơR,[{@av1ЪL,P#"t||*KfvԊez##:=I`puR.q1bNlQ5ppܱ!۝$14Q-133RErVŰ%WSZp^  |ix"@o?ޓŠrˇhϵl"1h *5՗:cs2# .=-P&dtKr@==:v&IeV#Ⱥݗr9ޚwSYN2")CSƦcPRSX}`vvVD" PNpbc/f2e:hKY<^\.$ @h}㧓\N¥ھ۷o7S^W?`tUU]i^JojUNLXO*~xq('l޼V{in7O>*}]]]m?^wO(ZF2}mqD?&wHQ6b̝NOD"" #I OD~5 X,4X7}!<~H6y)Zۦ_ a4yk-.WDY7o yP/-]`n@Rhغ!ۆO.״#g-^Sf5n BmXbL2%d yϺ1Ll*[CT{ڷ-wwT^k%E4؁Ί0y_?U.ۿ:sԼѹn6'﫶8mNP*hKڔ6ZBb,Z4̈́C976 W; ?0ۭtTbU~˾ZQ:Y-pE%oT,t8%Ϯ/2S"tE2ɳHgdFꍤ *Ǽ4*dr(37/СI3D4΍Mf&OwT_E\ut|d*%M=F! *2q9]ɐȠ=#3G?t0k^6]MfD(B&pP&?euZ$Nqd23 ]9$C^DcLJJ,-"";JN`$Z7^e&Πh`BH!q:%Qrr4IN&'+~R>͘ʬ/UYZѷk21Kx#D.55*'ڰoZ'9Tw`(\Q|*wE2g5sզ}9:RlS˱\k?`$lH<洣6|ׅLӽn__6Lf~ŘPFD7|thg8{"tTAūQƒD٣liu(SXKr[3Aҿd1zQV"Xp_pK?D#ý%򫙋'Ly}w+ (~n\P;sIU ʬmjTesLK$2`lmȢd{;$/E#֦Wǭsrߣ{b&1x``tz"YMJhx"Ru,G8O,Jd VNRYb/(erM`tbXNg IDAT&3@FSjyTWugm"e4ڷGUO\"{2qKO(nҗΊH$!ey`ϋ[ SlvnaA8~HO?MeؓDF՗ΊAp\~ewE4¢՗|jK0:=]G`Ȍӟf5w;RfuͥVmӧ()C`e1q n^W-fmkF߮L|V(-? ]ӎڼW}7]|K?~~^zo*W^~'u\w/K_ܮ{`23Cj)v,Hd`e5_׳M$_`1&FGu-jGd?}VnHo&?}Ͽ/[HdDdkמ{/ng}}_-?6XHDjQRgR ZR߻쥞>[Ϭ) sgYă,}KQB2éXg^X&;CDd[33HM>|fWKRzvYү}'tNk^aBjeDhHd`4mPLzcd{";s eֶWd5ִ9H]zJ& P 3@WDyb {g㑠\lj&Sk;9V7Au[?|^HD{ifAF2~6leCf$Q*/h⋗YJD&&G#.KGEֲlv.vr4)(hsQcox%'3w*ث?VyG; eJb:SkrȌƎgqLMN dȈ?4|*:GinhR*{j#ExOnn߳ZRd3 څl;CiO_TMjj ™@&a FOMGٹ+s?tX$#fze1{Il)o^<}V6"~~H|_|77+;{/}GKV{h؋55ej/ PK1|Ӥ~.S6Lt e3U|UId5>_%Z00h{_~KJw~pϿs}މ++kwUwa54@i79SYDvǴ#KmoȦص=q;dAP_Ӥ)D3z)+%lac bTqo <K7c(ʐhDTf^:PLbΙREc V!j̤V(Cښ&ZfT*$2Z0/T e8,@kԟͤ_J vD$@2ӵTlO>)W>_tbhƴΜR2>6WE*P%dDcXR*U ͨ;@DW?a `G 2`f0*|?xkCf\>T3l"evP(#Ԕl ,mv5MVͨ64ǚDqn 1&pX߯R5nbʔfr ysYp⌤FyeRS\6c*ѡ`K]5Ϻ3TxS&"=qC@slK4~қ^8'"gm[s$2 D('+1U ]-G3RXؒJ\#P B*[\\I@^R/"5 :\IK+˳$?JMZ28Zr](rIM[{O|B8R\r(83#|C vʅ5##\)F0DPָ6qI4C"qIIB];0ͨ_FD;wl_qݥ7Bu"4Jf(p4;;+"Zā0 Wۅь2Ƞ}ڠxpq P6Cwf>dD:"21E(۠/g9D3(nTE"bP_?/~ږT#\F*̈+۟M)+W`"0 қD31jdȌaِykj2Hdh|)k0 ENq 072ԵB-rX(Pʺ-,C.0Ijf<!)f/F:n"f">[45s(2P7rxY-ԵJ7b1(eUq`%x 5.q dza%F(kas0ŔhڟD"\:>2:υP,l=1UUkN. K9lլMk P"q2$ƾ) 9`\Nq1"DnlV"Ce`jnC.Sƾ9Ksie\yp(G(U0R.'ku;\z9JpBk1X 㧓\ND=E#eFF^={^7:4z  B"b A Mi6(8^12* A`PKC|zB2ʉ70zwVMw`Q<=C -KUqc(9=ȭΥSc}K:mD-c1&5@ e3DNDC^T.Q/&*%hCaT=*:f0j8"AhrKe#[Lvgu+2՗t|ddd$.|!VܷGP"8Umjv I>OONzwD$5ux'ɧ㧧R" ʴȶA M{^DTB@jk[b2$d "qi(H1)h\L`; q P5+ReLau)Kdc.\D"a2nw6NKPխpK?G"6B(*BYFc ؑʠ^(S8`_$2`G2X.jju[2s` \ ьx1 )KS12S;`>BX00} C0en=`u` Q2,襯&8 8PeB?1{^Eye8Cfc,[cJo@Ȑ#ʸdl2jD"NE_?7o-,ed6r 8 #SmRtPB.TK0Rƍ8xj/D܃Pun'Vƴ,D\K\ʅ MdA1ʾʸ _e͘sc8B`S2.B ϩь#2nA h.=Iec8YNE( t̀±{c%cta&.|볺 J ¢)q* %2? qȈH.?={t|||ȈH.'@)%r"ƹT.Qs222Oo^ZBT&1Or|:^S;іZdDDzwD$5uOOOt&_VlӐ[:JmnְvtT6nx IJDfѡ?2p+7GXP2 : HW Dau'o` paDZB^Х|>}!L kyP$\qqI%i믶W$Z{94.ʁn.t|d*hgjKj]~sdd6 CFxxGgٯfNC*ۿe{S/~ߛJlqL_x7{A2%sZ;NUʻ[J'<\6PqU9\fhEиD+7j8@7+@;R{\ׅ2ȧgbS\_9 iT.AZQd)Kxť/LDýH>MrձO\k8rIBB"իm&6X$$Mڋ̡qto԰ڟaomqYpPۅt=)LT"'@[WSZ8RW6ultEK9v1T]+)@$\("pd+"+im :\vIt0 "իKh@7F k} ?sz*U5쭵C&0xtm7<۾{X/}!yCGv7xvPazᑑ\^VqI(\v?Zy,4m&Z{94.ځnv6""0X5lӣ>\7<22bQvL_^CC°{U|r%UQ{IOִwI*(Nq璴%iKt<ȉB;s\&hEи>\8@G:>y½_2P@L<22x:Z:=<6no ̓,Y t׮k~9^㘎JU̐8$~uJ<\Pj+݉C^d[C͟Q183ӣg8ۖb=x Aޓl7|th0-FrWj~@\KRiG.I[( jKh@7h( v2` />73EtทGڍ{H \ E/X?dҾ8죽pZcb榵DG0=a.\qGA 0mCyhŹyCEOIJznKUJ󧾿xP2  e<@(BxP2  e<@(`bTr=zxݎ =J~rZJԫ䲪DbEE}&Rj"9H*|cP|:s0):z. 8'[uTPlp{}"%MGl6B+] I]2yRX6N.R=zݪvk`P8PD++7R,h$tF^jyVrY N{WTr*e2@?L gj|$JdD'Xv,=J.J0| +T%9HFDeD/0oO$%P)BxP2  e<@(BxP2  e<@(BxP2  e<@(Bʜחo4-/·:7n,OV~e<{{/LS,/DD"C;٧si: 2A|ʥPh}q,"óR+[KWR^DDsw~2LqʳIrW|˕P<ŞDvΞN NRX3 Zjӝ_3F[n2G?׫d~֣pvg;;g?]CxYf5kMVоٍuؙhޚw<|^c${7XMЦCѳCDZ^U0 Q~p1:n7 x'}Ώ~VDDʛ7eױɴ8/mZ30c4<Ğ:Sd1ƞ:w7ڸѬct61VM$;IZ?R[;9k}B}e[nfƪ8ag+Gbm|dժꭧdF24x/7.T/B,}<4N}&ggY7*)i=@sҷQܚ>Aq{KM>4|5EE^gQz2u[wɟtX]-WcC,gYno80s;cglnQ~}Y/iWzzidW_Ý9yw' !)4B{ˋS)cUuY tr'cqi勶-ͮEQ'u~S|w}u;X--ulgLggfI~Dzyjz3jFw+8ؾטn0DǮS}9 r@WLoej,{Vg] [A ?iz9_L$_<[z} kgrO ; Lw}>|gy}ͽ{stgf'+^DD{f+E9}N7,_\=@;Bo/.r9ҶQz~cqS-$CjcjKqzX GǏwv={{tqcT1{}tߝ 3>"/I>~|gϞVVJc]b1C,󫎻Ы[/eO ܾJ={R%ҫ!lO٭+s7- Ϗ!AR|ͨZWi'+ ~)>#{Xf{RO8?汌^_O-Y>Fҭ32̋;K<Ӈ../v???ʯ//֬YV[חۚ͋?,.=;?Z_^4Nߘܙ@O"{_|q*d2x~jFKqi2_ ۽fx=o&HO\oߴ>[Dc2Ԃzk$l>G;x[5\númM1IdP߿qwh;jG{ \bvw^-g]vvKճrbpam95nqŵpmIlz0H$9~uսߚ77+e:}N8[e|\S> '^7&[Gv~Ae0\GW>$?TxP2  eo2 vXFj~Q˽ox/7t~ץ\{e'Ԟ@o)=r_^GF4JE:l׺W6h^>wbTLk<|"򓤈}a~=OWx۩_DV}Aսr+;ǎO,巩;wMo xCg?~| W?| ZT\Y'Td?نGsQϒXi?{]Ι4 HSp')oˠ;qk:po+*e<Ş$^N"زӝu=u,ǁόShg.0g-x[ץ`<;L/>{t*>vq޹K.SOߏm=dGwNz~Ͷ΃}Q'0<%DjaR5?{DIی[u4&od|BOI3h1,t5(LchL1";g:U+`u6e~%ܸ~w';O_wW&"'&$;gFEztεoE9|f̟B$ΕϢAZ{hmvüuH@N釕>=bԷWXG/SHZ7ĤWf4Y9pاX\ ezeEDvwtsFkxvؼɸPya}Hn&NDߙ۴[h[XDim7Y2Lл|_ֻqvƓdzNi~_Y@kuhcG/8Й1mb;|~ ڮ'>[ו 2&)ENEoaOK&=weT'I/Io47P쟓{&,>{xa' BˮCu_z ڿ3,<~i5Ja IGeAyd e,^{|׌z\7שO#ͻnNW3Eg9tfl>KhڋB:uu#$Nu(s.|(u ыlf`o{29>l.7XS)ce霑D]&w{&@&z5ۼ٣6MhN9r`uODN1(5]t8Qei/~v.J_9WŲdL& .Rcۦgu|L[-:@#;7vڱož;{rdKhuF~SdNE}]<>3uهZӗQjx2˕?''no~~Dox_9ݹ"aP~}&r[DW| 8fvЗ9ٳgCCR?KP C5M&ʺuv\5ثo}eob(Ã=aΌ4 IDATOgLj/Dv~Tܾzl6F æfot;~|9=}‘fG](SxH&;?Z<(bothlo!Gy}1C}"Fkvjnp~>`O"{_<.[H+7UXWGQ'c1{6OS>~U2}Ǎwy~yuO{Xstt"Ab_Ϣ[K`( zcgu*Mz>k9?{VS|}b燜s~|98}¡zffq η˼,щ^SwLnM](=qRߥjMs s+t>i1W~k4{e,N`$ҹ oE;:~l=ǁΌݥ;>'"ɤ~ ڮ'nG @~C빙^S}wCɺ;>ڏsyt-mr>Kb>s͘%RZ<;Wx:3~$yx8,6$46hBc6Yy֚ƃ<L^t4/vc~E"ejP#OuwG')rF}WVhE;]{wsttzycn~4n~YD9>EZayt!uЯf]9//n.u5 ~J k~_&zay8LDŽ Tu]FN|zy[Ǜ'B@'zalNKӊP2  e<@(B|@DEd;k~>Ε#}cۖo-GzE wOdP˘MOdPL@1:B0!Ȉ7n訔DFe@4B\Md9e@:Q)fR`:/F@E=@ջ߿[Kz2 |ǸP` qo޾}+odඟﭠ%7opLߞ ~YeMd"# _5qPƾ7/ROk""2;tJkha7Lv"#2]qsvҧ'= |ít."W5٥O1o^N׌e_k"FOkweÇ'2q~cqug qB=}4sg.H]#~}Z}İQY />| C(c̃>jwLfnF3wHeId:dz``ߔ5h{R3{c̭YZN~n+ m>ΕS18W\x0C|g~М]&2;{s["[n:!^R;~^=\;qH_> V=鲏sH3~،(O~t&%qhg=JOV۲1f>]߾i S]Ku"~We2Bp狩;LM&s0Y ̌[󎸌J;ޔ>Ko:n._/ !KF2vޒ>ι~S_S͍ߔ7`zaR0|ɖ;'kOkϟݱĩf][ `"F(c̃Ϟzz|ZCfvv)ӵ!L5S2y FL +2hUieX1Ҍc?ډfHdb%3&2V]$2v&UB.`GGLۅu L c!L&; Hd"&DfG30B`I/iQ#C"3 B~UQ=gg؝oHHdĜ2cՕm~Szy3ZKo?>/}\1nR0ɬߛߞ>ꉌ܉Ίo) e;!D?{1ݥYo| Yr×8DiMdvV-߾}; ){{.Ow჻ݻw.믿vhM|ɐG /5hg s3Ue fE;!|ŗOk"Kښw{#_y#{gfq/^s___ߺտEzw# @]Y .\1c@(h@fvHd BjY]4l@nj @@[HdƌP f>C# @&"㧟wITpD+2淧^70cE(@wb#?`Hd|JqP)T B&&2?M%&qo03b100*g"#2?9K?߿9ްc1B٣x4yD($70Vct2L$_EcБJe)8FPZ*//.. 7.,ܟܻj^" ns(SU3S4Q Q8 `j\__um7wMإ 82mqDG[\]]]^ONTM*J4f&ܤt_(S䶳&cP(c4#BV=f3'/"zߏa.',-6:VBX:KW+lvC2(ѳ 0%1F~ eP8?Wn7 /Mxɞ82pU.!/&t1gu֭7f czTzݘ!2j.ss L1=-*f]4 `L2sh UDDDQ ""(X[-,oL(N~"J"3Rb!Q&Ld(oLJ.D3XLX>s(fsp+6iPRVE$\‘ZÓ tǹr˾IQnBo@4-﹠?Qm7Q8l_Ob).NZU~e^^xY艌$,'8Fb`ϡܼ"xlޘJIJu}6{eN}ot[k qo޾}+odඟﭠ%o޼֑ؗ{Nnoߍ~eBh!jeb-~o. TիvVDDI'&LkLos{1s(#Nfd;jj!VϰӁ8-eDBt~7^yU?Q5qDVwcЃCP(Kci݉~#?v݉c B(@LR q#VJ''"OR]3~ 3}(Y/F*Cj)]PȂϥZ(%L?pT,FcL%QPEhb-"lA>I(jA 4b~ 41cסL%UE$ɧ"rP8ߕFAS˕tTɎcbFϡLBDDz(cs$;K&WVRMIc!VrYUkC,T+W哓 YX˧R).tC0qTq=qqz+M;yUBz)|jEҔrCϥZ("14f: 諾dh~AD˫{ud6 0*Md2hHBx8@%2?Uu sjrѺeZu4sf\k;4 iWz**"L>[±6 Zþڽ~O?%e1Bu FTKB U b76:1ID@j( EBj2oJOk"^7DcE(S鉌DէzU?Q5M+lSOe)lzV(V!Vۘ3)}zHj165 A } bBt8/6 jwzp:Uftl+qQFkm1v~(ڽ~Q*Dfd4 VH%r}FiVm%ѻ7DT&J>EIdvYz OO!‘h'L-hțOkK?}`zk6_EW+u2;o(k%/X:KJF2o\VYU3Όǭ>yq۷oohhF>|1{n#Ϳg{G.O>#Z}߅vk,5GOGqJ4csQcgY `z(OΫ" }ժ]\P,pR*\hZcVj@wF7Rv7}`EpS3ο~@?ڭ[\9z蓉c޿/"7o烺h߃o?ܯٔ$j_'_[ BmfFVu6BX:0}5qF0|)\ngUM-dBJ4c> j)- fwkd!ɜ2p:)Of4*}cs͘u2) 嵭I8W-劗vBP#q Y D:ߡIN5ZUr%&nTUfFH+1N# e\c6L.si L1T\ eB_vfѯB߹yEDW.  q F -r% }]Ev }㓲.-㪓k !Xq% }]E }L"jZ!ѽe_̃>u#1d17WBcEt ^~!'FT R77njZ3|eҳ&'eUfJXnŅY/L@$2T) \Kˋq?$M#D3_riFA3ޢffɤjru%"sst茠I㘿uV~g?}74/sgN}$+LVJH;?%v~YL!E͛^7{8G3/siR8}\7D3qZJn#D#͟DFF..TM+l82_8aS1#ޜ2e>\?JB"ܣae+FX m☎2Q,C36OZ'I V߫wuLp$*]^ P&1ͨ%W?1Kj֫+,K$7RyLC/|z<;wyz|Z٥>;@A/L1ݥ1/3ϟ7Ha`$L%ʪZM?hW&S@75Y^|vz^ p\,Fl1O~t.L/QyI1ݙLR,UҌإ㚈,}$vgFi. f^[G! )8j7_Ub1LՉ&Ū(huvVd! ')l<*oid2͕[R&2$]Ӛz"#"3wbO֞N__?  vh L:g13yM3[|sM@p=''+M;yUB"p:;(ds{pz7#%Z_u놑ziM$/Og2Kw3wfIeeg}0&)E IDAT"D1E͸>R}_:Ns&ԭ>y=>fou"ܚjD [18Qp\9.&_fv|`7qZ b,&Fܼ"]\Vѕi{]&2;5=YYh:O=UWFO]>^7'0]^z1,fbg-Wp3i `ƒIҧؑ۳&+:VV8c}reNXoyؙwiK1_6~L=ɦ$2ZXK&}kN&֨ށKGر8fHG|[tYp:Uftl+qQ$6yF=w̻Ko ۥ-KG@-1h>d/dY4ɜ2nTP,+$%G""wrsNfZ*^.(iFA%`|||A|2wP#ztnM%ߨ& cy_Bt>6Œ|k@\]jWTM3,Ilp=IHLLqRL4Mҭ';3"rLg21S]cw;U?HZ;FWBj)Wt`n\B>5 qSͳE xB_{OF*K73}\ eڋ{m7̃Ϟzz|O;0we1V+ɿ{w^_ F2sDb^bзZċfg?΃؝yJ.O1bu=5b`ŝJrJ4sKZ9}+EbJ.UMmژw8f;I~kJJfqL,}>U1EQD3.t(fچz9Hs Z(Z<_B=~oMg߿bc|t_ƿ۱N}ǧE8Kqq=7op:lPF-s?ydgQ8+64%J {T+lAk^䶳fsbMDn>&FASXH]Y%oԳb\ e‘ ߢf7z<کi 4?p,+Bv{~7 |FeUu3 Rܻ4U5 |j B>/=x~οݷVqQqt q"Is4TwމSwڴ ;2nBO.DEbAYd,ZU J,F4]^@:XD4cG#tRи C=ϋii>qdJR[×Bt>&"R=ʪzܼ"]\V1`;qOjYcb?rsh4:ok뾇RDD-W,UQU00p$*Hh~ADWixEz,~_Y VDf`R(Nu(}MIb-6^Z*nTiVJM%FٔdaTF++T\0~.`Nc) FPKvV_P,LeUM-dBs֢J4D**"$*%p:Uftl+qQ3\atLkd5RiUַE1I(S- k[/H8ߍU31"JzF&tH/""X~WZEImŸ`4Sc:^1>_=믽nL(4KY_IBX:KJolM±֥P,0R>|[nys:/u1LՉ&"σqSce"'!\e.5vq/AV+'[ iDy Cl`X1GD6IӲjAnIdg݉LvrJٝ)<ȑJ1C}ȋ˪Q*S鉌DWzU?Q5M+l2wVta<WqLJǐܯ Z(lbC2\V. X(hj6!Ndېy>FRdamIL<1be@ hZ!QE.,m6zuBDĖ閡VdU`[(g.e`nqL@!A@`_Um4UFD$IK>g4Mp>hU5F*12Icb,2sL&bc9+i=~??=},FܼyDk4L.ZKPP Jb7#>47Te~n2wx\Ö秵⋻2@d1"77%c'hǬ6 &J4$" EDF KB "ݴ>%pNt&2Ȉ̝ؓ"@$2?^w? DfA~(SeUfX8|^kfA}iyUfUE-+.Zlj޺oQ-]i fou4skVV۷oG.=~}ݻw^?ӑJ"W"o}K*~ Z ' yC~kD4;]˧Õ\|U N(\>ʪZaI477jUqD4Q/Dfgou~kvVf0>|ulވV_OqG8}pn7u*01vABV-lD[`qo >odxoQuE͛ȒJaJz̭[]|W+-ʄ#QQUU5fQz>P,+Wza(JȽXzy2؅ef+޼Z^&~~ _(c0S;]K16F~N%Fj×B6 P#qwוܣ*Aڻkc]ML&GPScN4Ch *Ʌ֬Ux\R Kǵv2_(AcF S Ӂ8M+"p,rKUU%I ?-zMl#i~=ڋ6SɈc-3qG'//~a4⾩ڧ\_!HqLcaF[L(ͳKP˗-Qs ~0} )@ zZɘϾ\~} &8f!o""[~|Aet$+%yI|G$2@|k-7 &SΚaΚ !l3R7+tVp jd1FXӏ>HD~rs@Be,Qs'CaX3ʖ^̐sʙaݟ4-ð feOF5:oyWn666G?dA~s}?ʇVED\+*ޟFݖh+yQ+"{92lW|fCկa sD=L"0Hf;WRDD+3"w(*1Kbd)cƍyE8C$HLg~R>W:vڥavWsI|BM[&MV["_114q \ ))_gfֲ: I{qG,Fcƍq 1. TWDŌ^ǙqO  IJ3ک [D=.$f11cհP|wX} ,D&S-6fWqYٲeB`}$480'VCC^bO鮱T{wa-^f1Q3n ҄+i!cV kbݻq[2'yXE?ޭ{[+-׿$6V/ Pǩ)Lq e7z_YqDb-u+H%:e1?\& V^行JYzj'$|3O#^~u)&YĠJgϞ P)zH&n'.i?ncVj$-RXo|;Q7d.eyHJ?Ix]. 3Z.Ӷ[-dM˚u!ȽK  Y~ PLfO˺o:ԡ2;o(Nݬ]Zm[F2pFc΂eR/, 6ތKYLc&/~diBGd9233}2g~ goLÙVKdJQ06d18qs JA2qb_׬5Tm7DU-f}=:t gVrˆHJ|c5Z-KӃ퀟V"K$QfBwG_*Y=?Ǩ$*e12&<|4#qcP&m[ٓf_ yKu13GN^j5z7WF"3ոEJhokt$C^Dq{}`ko7v!)"{dj!+f.6#0$P&Lf_+JF/n9(T i߽]ݴZ7eRԢ m 諙]WOCIR([_7l۶ Cr',X,Fq|>C+*p8CENa~VtLm맧#^˛VCHUvn*=LK:#vQ+H8&cL%C7ňj;dM(‡1Rhjq+3z^ɗ-\#A^sOU8f8 aNPB`2< wwҭ}$)a '?ǿ'ѶګDDe}w(^̐ rH7xqwM%W qRKeh!Aĺ3YL|3OstH*"vl}P["n5Ytg*17'#]SǹԨYxC-"jzY늈8Yٲeko|VMHӵEBOdKUʅeSD4r5,vٿ1[}/"/_/а7eWϟbդ@Ȇʸj{G%S< ycbEп>6HǬM6򇷪i65o-w\լU*βL6¶,f|737y,Я7ڝjm7D/'j֥~_])oc[OCӲmvΣȤmm(eb>⫯7r%^{O?WJ^1E|L2rc̤ۢ[ BI?,xIʹ*b7CiJ3YKN^Au\߬XEiMf+J`^?qK\U5J42%3I:%ڔr9;{=^9l[Uxҟt!E/n:d1YSIu|0`X"8"?RKe)3PۨwEzͰe:~^Mgel8uvykٶZZLPiDMdjM Ҹ%,Fc,/e%*[U]mްrov<ϯwfҰe5ĈHjJqL2Uڻ[l]g}t8#h ))^Wڥc_rfxeT5w|2苒ы=kgNUl"jJɉLwrW JöubA\%"*d=#E/O(y(8i{IM,,c^Z|tH8,RX%(06,C5wR0]y$wY%!PBǬԚuT1+ 뎈YD&<#e1138@TB eeWT.)yt0jOM1?,ɭ+1J(-ĝi{ZTwIIL#v%c8@ʸ_FU39!LZr9o[[[>0){[34Lk8&scG~¥du4.! , oIl۶moyl&eu b&\1&PβmzeHd1DFr{͘bF1c IDATK\ |1)Kb3&s,]=gz: uTu!o2lN \٫笈Ǡ9^)$/Z~|͸.?N BeIK*(%eN^~}33 z(P+c+*ueS,oӛ8,@lfK(Ǡ!ǬM"n\)qLHCEɄU7A7<&Lc8[P߭""Dl "}հK3>ƥ^)["bѳf!oV`ab\֎9z4KF`M,xIʹ*b7|air"N|E?捁'Mc<k~̞&"ֻxطܤ%7Ƈ͇'6`;}Uĺ4{h"7?,A++ uz(IeʅJʈmꎈS5bқA9 $H5;R$foߜwQ7ӸUc e$S,i"b[Z]$U˖vd$7ޱZ^1dM\2 qµ̋Vԭ]~}w q 2"uԴWsJՀS3Y/)T̺ӻ/8uR!e"#i߽}sqՈXG7! Я828EEыz O'Yٲ-l#V`4??GjL2Œf-*"V9o6 6waoM%ّF2+-HD PBZ>ov|(~/Q2YljY֠ |Z'2"3k"ʙa_JT5w|G:fF+RŇ7 YMNޒضw(pF̓F+ׯu2=~Wo }%}/ Bųgd1gK]~IKJD ԔՒW8ƶr>x8T Ê@/>k`ScU7_7IgϞ `TX#ep5ԁQ܂&iZY{w;䘽KjbRsow󝰞ŋpɾky1aݎsr,M4h %O7qk5c8㘅a?bq[aZzG=]UK{g.sto/|XU*#I% =:3SJ(f'0Ԉ<^qUg;~̰ED+UEĩWe6e2Xa+ baLD+]+YGD䡖/[Y߱0ëp1/-/GߺLA%Sm/5OOQ ,>P^LW4Mқ/x,]'}r{Aew_5lHK 1)"x2)LjB0^ϊ?>B.`K'Dl B(c g1~(K19K_X7R;ZVS@LqrQsu7= 7SIc ec8uҰkиfxX훋VVqu`}`qL24EDҊ,cʌf1Aݵ'~m'%9FǴ֮nZ+b`ɉLwrKVEl]-({|$Ӄ~Q}8J(N: c< 耘L:kA VC$7_icQzl Hzuif3H&3q` q ,F(;Z$0Sg; ǚQneET-+ moUUl6m8NvVDZVr"4}Ir"JeLwf%Y'͎}5zo:'8jVZO)VKrVl/U++eKFZ#x#iW]oQz2$)_ !dr; 3.[gϞEX ]{NI\NhDZCJDZVzIR o$Kj|wdj_é}4kc◺dZؙ\8믿^nsB㎎ꫯn82"bI/[m\5E~lz喗iߙW yKs@d_aD!ޡHx~[[IU* /ƶ~Ӹj4ӷIe 2$2X1Bщ{(#"dbFO@H$eHdq@X$2pg^5dhhRC%J] g r1JF(8ϣ|w){z l#Fe MK$1HU-#1'qeBٲ'n--Sl_.nZ/v_@VxhDb%֡cNKdT-w0/~a42Ԏ6#,_C-"jzY늈8Yٲek/f+0mlz@P19yh"*"}uEDϫB(W*Y1]$2gqe\[iEDDIovAm]ٌ29@?L"}ӑ΄ќog*c )~9LDzW/}wulyI4C"JCN*S.T7TFlVwDDzͰEDMoFHZ1$2,񞾔)4lVw]OryöyvLAX1.Hx2"uuϬ]WrfXjDg% Z8FHd ʈ{^+z\/FԚ"K@(LFH2at]dZZ8FHd`-嘕ZS"5}Y1.X1eeWB5Cc8VT"BT("T*`v_/ m_dդϟ/xMNCD#@ϟ &1+Q7@2(aE -㎑'R}Wa ?/ B(8l1[ Vֳo BqLM,[|!̂PYD80+B`^AHBfc$O|%~9<&3q` 0B(uwO\~[BD(Սcfw}g*Q@M` 2XSCd %qt0F";@,0P|%PSkjZK.%HG|=,HvhS-o3f`1}, @2̋F#VꢱstoGըb 2tUC$st-J۾3kWVXfDBIteC$2ow#m=2%"/lZ"H$OOG7>Iܴ"hO"G(:-T-7߄>a׳gCJz%/G+730$9BtWpL諙$ҿkQ7!jȎvI={u!Xo.nZ";Gsow󝰞#!?3Yڔv݅νAd9qE'L|ߍ 3hZ6G }5+^G׼]9zͺK$eȤv^ȌC"!Bx_gՙ9cP D&&\~C3BDrZJ|*굖~x?SG4C"9B$%"ӛ_! ~9`vw_6o Cd2 $#ehRߵFHF`EPO}|~Id%$q e0wLȐP!%Dh2H /De$$2A( j c2;J"@VӗS1HѳgϢnE(!B k2 Za bDne=bDX[@dHdP 9BDDj`cp1RC"@#eQ9<|.DE#@P @eN#z¾ꫧaL7x~?ZIDOj`[5O@(E!`/ |1LHD e&bAL)BDP 2  @e"@(BDP 2~Լ e}g^ܴnni߽]eB~kn-Ύ4$3` /F+OSQ7/}Qaumi}sq9:շ??.iߎ B1wFʄiKdfƗH4| &)|=K‑2  @e"@(BDۨv)ni}sq9:շn i ۾{Au#5j?R;ZVވQMj?о{upKNpG`-?)h}squӊX;\DZũyaSμ,m߭ś(۴8#@}qIe?iߙFqe~mi߽.Om%";Gݡ;Ѻh'?#e+w_6DR/\D6˔4\[q~kR;;-)Ve3?2HѾ{h'uK*|*f+}[֬tY)=;;22whzz&ǝyzH|`]/C>0Zcp߬)bw'_qս"Ɲ>}w3jAߙW zް>}Hߤ)ݸ:M l>;n^/7ÛFY^&w7>]'?#e3o>;oxNUgkqe޵߾{.`oOl5n:kn)w_ܴDR/#wJ Fqu!G7ּiIM r-&oh;7Wh";ڊHgP?|ѾY{;}n;1r/"Sڇou_"Lued6_~N!jclc~^ǖTJd g~'?#ec[?===}՟olgVΑ7Odc';&~g pwNAvh';ݿYϣ]M6hohS12Ÿ۫2w ;ac*T xa;2{l$N6]SH or zXO~F`v(_~jtUwSU9{gc`ZӁ۟L5n7WǧKf["Һ8c[GN=G=?ّFusuq#"Ύ+r'kEJ3$+7e q}3:[l1_˷V2+;ъ_k`^/ZhEMNŕ>O6FϟmxEj\5nzŷ.׾&oX7j|hȣ_зDjH!vްT˻O%oHgRӗoSC@kkմƇNCeLw^˸OvDV1rUtY<Wo̻^5ջoNOOOWT֬)%oNOO;Rjݮ+xvP1K=]4X/WiG/>΁ۨ[k4mQw{P2W1]1L+uJ )g;O^7a3=۩)gқ՛dtQyn z2(yZik@۶ *S.t79Sf-H1dpl{ٹR.'(,Iz`ΛX2!\ /% ]ao٘M's;Y%P7djpOgOӌGp҉=δ23ޏ3;}wuFwn ( ,dbF/8N;\my9:¹M0rD:i2Œf*J'7D22`Ι-U{+>vë4,>yfZَ`{TagbC7nw-B1RX8Edyz$^NUU5-+Ug]jfn=.KmM蚠C!m;:SMՒvwꎺ:<,TGGjA :$,sF]fCFkb]z;E+UVu6$xv!1x}c!"c1uOQqe"N|["ٶg)т7`dڳζly瀟Iewʹ)k:"!Sh-n.f0~^.C7"" 8kJFr+μCl9,zVF >+B܊W:wLfy'|,B܎+Z^|L+.]m9v1 ;^Y9WqÂѢ""★áөzT(a'%Kf= >ZkYmBRFnV 3h{"'uO0+oq?^p FSyspBJ̜OӼTEh 3g.#mYF1ʆe\{X6,F3g $=_7;mm| 4̙sIcǁ@e_e5VsiWNݬT&ݪh"jz=\W(&s__eDľ}? Ɋc U!_<3lJޙT-i"bgWaHe2{cAܽecXˁ" &'/exա;%!_6IOԼL6uy2-y'Q5MKeh'NNǬevold՜:}"MN^VdSjISUۋfŃ d. ezЫPo+L mVĤ^3lƌpwmVL,h2}Ul[A22}Tdb&e8wީBoꘅCwU:K&Wx'keZT=Ϧ̽xew~)H\fH=ą{:fVӎρSLZimA8,GQ7, Vom\\WDW n>xAi6MG:wD%w֘_;٥e";)-,U^)\zWm^̄U$,aܾw^f2y7㳉mdxضUk-*eTT|vӾA$"j(""VJzKdd4c[F34Y+JؖQI{%3zѩKDJ' Ǐe jt^:ulضqfM݋&\u7w\7keuw={rmev$%pPFRn&3L=:MWNrVfN^9+[VwݗX@㎀۷9~~k򆭕zOtw;IDDQ&o&ڙlU*'U>SveSůtmYjT3XLAn6WV9/g:85%_DùޫѠip7;M[\NCS.+ ^_l?4mQ\uSeΧtJFΝZk7wiJ5ld'jɝ3+^%S5tfOˍyNTlzg2S21zS.r\.FϏ}yvvⱙMG?8yčmƘiY93k݈On0ژoS}.cq5Dy-`qeSs(鍜FNuS=(y&kge([jǡ]ar.3g"#wbf󉙌{tDduꕼai[^:-y?Z7ݍdd܎;gr}MeV3<3e22q"1e݋̞[iww;=%CQ2UΏWvv mޏoS㒗^'#lU%%˹^E]d2E|nO]x'I~k([oyi\Dlz8>rETZ" F.r|{9N[7"'_^Z3iU2iw>mѽqd4ʅJ[#^)-юu O>HR"#Ie.g2A[6.qފM;5qf7f߾qdzGi $ ۳^VFzW'hk>*I=ρS 3/ tL_Bc 'v;DOryör~2JaKX˖m/I͍dU1ȈtŞ4w)dsewiW f\V4kEdt”e-[Oi $ ӳC:EB;1E4kikρsISڶp1RՒvUUT>qPLrL @cχ/ j.wz4v::~^-4o U+gC2kVN6G(W(wF(IgI,O]'I ݖ)0E?_r4m8p/}Q"2q!9koQ#e0d'Ia)2~òV DǚOE { m'It"9>}~*?Ňehd96j˘֔z)%$A։@COl* Á@@2@DY1 dZIʝH^E+ ~n `k$5e8֔P L_ @e"@(BDP 2  @e"@(BDP ?MCIENDB`performance/man/figures/unnamed-chunk-15-1.png0000644000176200001440000206504414257247716020650 0ustar liggesusersPNG  IHDR4 -R4iCCPkCGColorSpaceGenericRGB8U]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|U\ @IDATx5iJPQPԳS(]v**,gٽ.{(aA, ?a2;;;3;OgM2'ɔ7$2) @ @ @ @H)Q @ @ @ @E: @ @ @ @#AC @ @ @ @>@ @ @ @@`А&A @ @ @ @0h@ @ @ @ :4I @ @ @   @ @ @  k @ @ @ @ @ @ @ @#AC @ @ @ @>@ @ @ @@`А&A @ @ @ @0h@ @ @ @ :4I @ @ @   @ @ @  k @ @ @ @ @ @ @ @#AC @ @ @ @@ @ @ P VXK5sL5o<բE վ}{ծ];ղeKUVj&u 4Ԙފ .0*(8*pyQF9KtMNOz vm$ @ P lv*8fum9R<]tz׌,$ܬY3#  tPp ˒%KUW]^5w\=\5tPc"/r5rH';8#.vm7rJ'7X=CN=Jl5d 4-H ,Pcǎ5j$*2U/2vVRse=dȐʨ,RB @@E݆۠I&?eC!OFI#>䓼u=qoKCbpAs=ƌcu衇J ;&* @}@zKPϞ=X]ϟ?z*FM @ @RCTiMqꩧ4f6tɊ ;v47n8qE0W4hG P`PZB uYjmUqsH@ @ 0A/PO>dցVZ};ơG[nY EԮ][{Yy䑬R"f̘|M#_I=p LK'P @ @q@Uٷ~;+#4=%W(Y Whl7 @ @DT/!@˖-(w҃;/v" vm.B *(BT@)$`B  @ @ Xlݶm[#UPz~ibŊxR_&L~kh/t1Z}ɒ%N￷]tt]vL?W_};'vYDKR䖿ufDR$NV7|Qģ>db݋/~g!C᠁j&]?{R#kiӬ7`[z|uM/Un·j8m@Ex'u]iРAmt9䐜evaN:9gN_={fC!]2F W^y9~ 7Sn]r&Md"s⋌G.ӱcǜuYvq̳>/2w} }uVDdA2W\qEfѢEN4J#_m atMC`F=P0Kfڷoo i!@ @ xAwuj! ד&@!ӠA<7n9蠃2cǎ W?p˹gzLmԐ2cۣ2'pBFetN3h#qrq 12~zf5G: °aYǩSyA+qr饗}[Btno UBhm1ʓ… q}1e6l]r_ /d+{.袢Z|1@QPQdB('  `<`{{mF 2zjƫpP{|pF/= VF|a1˗.K](%̙Svɨ2|͛E&m]$B~1zuG}b tUWeԩ.裏XtI9CNզ3Cgk{Fwm2*wwdYƷ/&_}_9G|MF>iчtM~|㒸L$  H =v}nV1& \SO=hzZ|$ejvS[!7}t;(/L}6{챇;*ʕKrlweWpG?cE>mlc Pk]>"P'(L@/}]'Tz K9 77NJo'xq[nF7:C^XnP0Emfփ^Qe ^Q)Ńzw6N^'Nh륯, 0(%pvw* qW_XkM6U_~^kp}-;Zke{-#ٿSo[ɋ' yfΜx #YCD @  >\->`Xwu-^r]m־_/M>8d,N'+NɯjҙW:ljAN>0aTn+8aI 8P?L=L*$j׮]QYj˺+Y%q=~g}`讻jjrLX_}^{p弦;B }sA TҖzZGҋιՂ싨9)m+YZQ,d'3g.2mQy~S2w_VzYrTؐ!C-w 7YRԫJd.h"fYh?oem˛kECV[#M60o׮]F;c @ P%[N'O?EMy$7~wOz9GW^y%Ӳeˬ<*d}5 WA:W8ʲϕ&TO0f+sYgߴvd\1HFtGVm'2zJHR$jjЙIj*q"ykNN0d5q#<4vlKz$4aVۋ{ƌ9_2˖-:'kzD@X+ P*Ѡ+,\Ys5B$;#yw?Јw'׫&dV${l9^œOC/kx!{r N<\d2){y_veYr2?+) @ Pe ˨ 5QzLݳޏy;Iɤx +;BРA!xr^;iIr_!#ܼy|u.R| IꔤڼtfR?o|.G5iA%9Nl0hJ8I0No`krڛWXmz٤H ӼtQt_u:x]to!DMp  ls)X,xyd vkmذave o6#.W@O뮻I"^x}]^z_a8z$DtY]wu>G%m+>v#n"9@ @@>Sk;w|W\;/˭m'p|犔# B+=6RYD矫^{C)ۖrM7T(q:KiAWk!$@%DD^83r(+,Tz y"@7\bvbXWFPzE%!ԠAI ,YMA٧d?Os'in;koBq @ %ًĘN:aƎd>;3%NIsҥKYiL'Ir1b!|rqO b`瑤N.tf~+.:$I\\+PG ^qE͙3Hi_\#1z[CM{PPNt6mBJoc䙖k#@!d0z8yNYq1jԨxՊ-*:$Il`Cd,^Çm8RLjj[la]/u=^ kqC QoEw{喙u:rMw@ 4D, f_\k׮J d =._ qӧOWb)u28ʊ.>fBdIDV{JN< @ ={>"K> |vm͚7lYg9R뭷jժ#kg$8vQDd\-Z|ԨC8y>IvV]8ӦJrU^wzwdYCn'uծխ[WK.u|? =O`? 8 `']@B^d78 ƏeQv)y@-(p ,UMc5 |MkY-[Z|'l޽{5!. @ PA ^0ckݺ;X1$J*ӠnqꔜJ%Ӡc]+=Ӕ/~ic;_]͜9n6U^=k '"^?18ӠoV5=!  PrJj,uO> СC/)HVxwATИAܗ48մiSx#x9#L @ $[>Q%GVttOyBC\ N:`sQ˗/Fg)e sDƗTĮw5j?pCÇa be~2NܮX2O ={Mj jF;S@ڤIzш_V_~Zd>kċޫׯo |YJTA 6Tv!?o2>r ;Ks @ @ ڢlv2YROU$=zUIK׮]:+W4 TJNq 4蠒'qRn!͟?rŊƇNyLJ*N>flOgϞF˖˖-3 ~g5duZhBi5T Pc`PcV;v&?1}Q{M7ZiAGp[^ =Z1HvW^y:"s\Z qYABs;YZNRGil7~)% @ MO>Fdq.:c$ 4$d [v @ @&E]dLq̘1tiΝQOxܓꪫ J=ܣMoR:EW-:$I$켫4+*ˊgul'ovlO[7k:[!X0n 6PUAxگy:  I !0tP%R<@ԫWl;]vrc"a-P'x%uSl P| p%zZ\wp/3İD;Kdj7f͚eYnd -X@I<(ʋ!+Zx9 +k! @ HkwH9 т+;V}G;k+4F) $Et)Z{"TVjm,onwDթ/3_$S2J0U*q`7 \L0?Nz7aծI[ r?6w}u/ﱢϗ|`'LxWf]dKMfu_&@!z&3/Yl `JcGFZm]o |r|~.xцYt7-GO_+)2m۶I4!+SOe O2wi'# g\´3eӊ\#@ @d뮻FBOyܹs Ws:8W\.]2z`9O^|,˴ZÆ O E2G/^Xϲι馛r>NI*4D>tPL{s=V}B*sʕ%Vz٤W0WC'~vob`?J^P@([NF@8 td5K~yϽ[~9M#3gδV0&}ݕ~VT3AZ~T^xa^q&N}p}Dt;  @ TKÕ,ɞޟ~EsӞ>I.nA~gѵk׬Rf!N qOkQ8Hs:h ckZD"]/[W²0Ў /J~xi<0h!j!ЧO5yduw=zֺ뮫nFk!CLkW^ym&y ^{{=kΝ;[&Y|VܕW^EyNW_}H\ٺDt; >? @ @ IlY);v[tÆ G`͠&E&~i5a%Ľ{V:uR 4P͛7ǔ}e#F:(xƍgEĭS+3ɸ֯uPI$PdoR˭vlnG-d+諯ZU=܇zE!kmقB*uޏE ,2 #?^ީTˏ?e[gaN),qO[YqGJ:jV{EȘ1c{y󔬦ܭ[7' SBv ]Nj$ jdSi@ ib;&F#?Spk'@ @ !_庝|ѽ{ww*$ *Aj8>ǮШ> z-ØAVwׯ_lH@ @@>|zǬU/e-Bmvje{ WAUSC@@M#ACMkq wa{g$"@ @@#ТE 5rHލ7VWsydnH[ը@&B@@B2=!@ $QFg}9K'p@ @l=z%Ks=g :TM2Hr!aITu+ t4@!,[L\OL^{uQm۶v@ @ XwuUVxÈ{ψD'q5ר .8Թsg5x`#@e@U #P+]SH @~Ft֭&Md29 6T&LP믿_A @ kG1xU첋:#TNTŋ_|NƷkwyG D|@B*5!@ ';]}9\y3@ @E] l) N[1fҠC\@J" %d@ ̟?_lru'[M<vmv!@ @ Gr-jҥzOIr 7w >S r?|׿ )رcL.bu!8 7eswaÆ91Bu  'ze8jنrDž'Ǹi?r]\CMFu/@{5b˩=1 7 ;m={mr2)75]1Yi$<((GY |J&[pb gy[nYǧ~vuWh"<6dx"!%XYxqVe˖iϟ ,]`33b;w\oVlVyg5ن?P|jԨQbH"Ǹi?[1YHt$* o@O@{5b6GM{J3H 7]h6VSq҂^LtcԴxpgS45N`ɒ%֊S+W,+ N.馛:D< @ t/7o:U^f"@&@bÉ @@Q*B@`6"! P"t%s:+4á$pI';>ɨYfiӦɓ'Ho[_wʲDpSNU}Stյ^o?k+.lذs @ jv/Kս5"N4@CF4B@ Hq ؒs 4HmJ=/5qD{G~GN\RR!CiߤIǏQp c)JY (/EOMieCHtihdT]Xˆ XtiФծ]PRd2dXd`$REE;YJGi%2\|__~:'csժUGz!k z/ e˖)[ e㚚qSi׿R^G_W\%@ ~6㾊n#\ DNZB)4i|GCTHܲqMMA~܄=FXb-'* A^{m%6MV ~[?Wƍ!\5Jխ[WmSNQzSL_}n6U^=%[<rCkРlԖ[nvqGu!5X97GmG>c?(mܸZUngn  MߪC:~j]wu)G2 L:Ur-꣏>RSLQg϶Fmwnvi'%b\k}Q0vX%cO rZhf%8oaԋ/&Md,XZje z-'|'I'd+'"_V=sK.Q۷w¥x͛nV5bMdk׮#PzjҤI)E>Wu]>P~3gu>"O}{;0/}[ƌcy[T"7xcugK D!]~4_}*t?}gw9dM7{~T8jTc81&!TtfC{?7s3ճyU?y8t6/@a_G'X"QeK?& -YFpcUrqh%V]u j@}=pJYQ mE_-u 1&\ϲ@w0ύbmDs<[^ۏnO}! t2&}mېHE"OvImuAt> 0y_*u 1&c:M ʗ~aB߾}_kg6`_t6iW_ʷI$;(e|MߺS%nLއ܏@IDAT?WL)}c;vED>Od\sMEO? sSN9_Ϣrqw]꾖qWJy`g 0k*Fi~8~mU_apc2,Lۑ@P6{,~.m׳yUtm~)ξbCaHǖizGn)cFz|huS8ki7~DI*t&8d560h0 $}m"\>8^{Y kΘ͚5ˌ7.' +ͽLL}ଳ2{IpI8e{m9 8e{hLn{2{9#[laMzӹÓ&M2&)=PL,ĂLi% ن&x!wW;+}Zƀ^wyFny?N wZƍ_=+WP_?;1 ϯ3fK R0c81z H@%@yqWmoճM}'̥݆Ih"h"Y3<.m&ː{1cl#ajB/ƽ-q%_\ )qAZxIr_;>}t).9/;<19c]FVq!AK_~zuA G߽{wlyk2-0nA\gΜ.駟:uճgϬti"X{Q>"+.Ym۶!JEx%:˅ya:@D{ Q4n_BAuXF)[k6J}Œ8d J/L=K8㼯(Π!g8Nk Vy6L6me⼯0Ǡ7D[մ/IjtE_pZk-~)me2vXz뭧N8G)Di$)l"IʤWQP~\N$֓J؝8ntAA  ND~yTUt7eTmtF%Rpm.Q]S>nm76q{L˪Tψ+ o]m?zyuM7nM?/EY~ȗnK/)^ظ䧷)pG'-ˆnXPe pTn]CvWѳg6wHE12FqNTm6^_|˜W^y$O==z['5L{7omcokd,F9nW_)z:-;> ;LZyaax{-zAgU0 M+F}2ξ[%,'OzbM伸dꚚqS׿ Bv@[{O>Yqyykd^U_[!D ) H gX=KyQWP] f*:QoTm6^6mHat6,kF&WatI&t`А G(jofT$޻ZBsϵ[ b"/ޗ炙H~Q4-ߛ4VZ 2ֽꆜxCvYdKLLTm6^ /`m5q]w”X]s5 vZld 9~aYe¼y~X0/$ޗ8WH@$OY}gU_K{N\FoGuMM_gR<tAVBv>{6l B$1&A@@U%$!{TԴtc ݆?\I\eWR~%I({#Y;0^@4a70&-K L/ #ofiԨ.&4bd✨ ԩNo+KI&9͚5ZFg~itqN暡WKK03(Lpk^:r;4GÜ 2dK_ꤓNҲIJi7곓﫥 ;ԛo +=䓁VJET}թlHORc2X$ (t Yϓ~6꾊nÿO ;An#Ӥ-ȵѦn݆rGuMMUIχa"mn#8+VhΊUF`РAjvjv+ٛ}wvW_}u-Z(Ԭ)]4e ۽}xLCə4id1cƨW_}UUƍ˚6m'Fv}Dz}(ݮu`Gȶ>Q6mkA]!ef|7o^U]dO[s]ǀ[bؓ/Ϳ;# ʾǛm޽ mj/GeOcH~\vep:jȑySM,Wq n#b)z;J}6ʍnnm&] 0y0y UH%ʎn#WO4vͳ γdE虒c'}]kn[8pU.]|kҵkW#~2,0H,v5(-[$@ \V*\;xխ[2l%|9.b[F˰LL̠V5XbEeϯ(ܺkd8 I95ppܹzq_{*a O?0f5ev]vQk^4l…Fn83"cTi7Q5Y׿K/ԉ/dۣ0DW BO%< (aVl~Jj#*0 GP%T6rD3ޫo,5ώ.n#Jjmh!7(e2="}Y_]C5X&SI[4d˖iӦe˖Nӧ;Bَ`M7U:3S*Euy|/7xCm'ĺ= Ě:ujb_̷m8_n_ p1<nm\[O o_ݦIľn#@ޅnFv.6`T5=Ƃnc54X-Mnlr!k ^uYF}e+;ӈzg-3g:Bo fܛwdeKLl_2|G*hd_~i- =l0e#W, xx=#T[oj֬Z`A*j}1CIE:uFbҥKdc9i(Cw뻃FD\Kp26 R?~饗!oO=TAWȊ󾬤i 2F{?NƊۘ9ywXw>Ɓ*{MT/*9s_:Z%N#+I\XW,ַRd@mDgW9 󟦾nFQn0J~TmAts)-*uLitg`Kr`_~y\|.C1J,-gO<&Md-O+(Iy39&Yl(-[>9,__s5N8G)1bsxM6QIJeT(aOZxã>>%&J' >_V9C,e+ Yv6#{G~zjLϚ5P@k8iE[o r,^Vi2eJd˗;N?to{2lyo䫥 N^Vq"yJ\w$dw?&z}JN|Kۺe;dRѠcRd$1 " xUEgW9 n m86dE$.(KI^@(-np.ŧ@a :+uLM6AC)-z 2y)J|:8Ǟ|I%_Ds1cle!w~ciŖ12ٲ? c{G}gNQ\r믝4IWTN{l^tEJĈ^sk׮d%'1id^=SK:;A˿+Yvb#3fO>9+SO=UWo.'\|ŹGj*{|PJ)b-1`տlvFr}_CB?'\]p+OBB2{<:ϯ( 1fpo#[W~%e_, Õ<&@ .6q˕ºRmќnlOt&o݆Hv8wEIBFnvAus(l~Ap%Z'AC2)njРA?zg8 4jH]FX_o]]&gDF$-ee/KU&zެӖ-[?|5tPX׮]9S,J$H -[*XL61ϭ&͛ne#… U޽mĹ=2i֧O%lw]>h;hWbvbl_V[)ٯ,*EFYBvyIϞ=ճ>kG9cǎdp9cUGꫬ`NoαnAծ1g-Tuqr{7,/ -%du 9(A kmDQȖ@2FuI^lK)$q^&qYU\(2l#5T'~^Jct Wt? (]bM>۰[|i;6>nBGeu\"AߋVK̗$ F nßQ1\cҿ qh>'#3Zr|b8?yai%~8+3ڸ!3xVPgHF:BN)^OLkC#Gr5퓳<{HM K+/m۶ ɦ]w5TN̿{F3[&/_.uzX^zC+cCR D8Np{˷zy Kj.7׿(x=܋\_vF$oh,$ݻwwҥ/ߝa=qqa[r_}w?3ha?q mCu.0c81zBz@AXM)b%d)-;??*Qm0iנF&] wi0Ef.S$k6V,ncBE|k둀@M&'ʬ! ds6~I;Z"]KJ9&YzQ&[|}UH&M|ɓB7;RY됤? d)SX6d+(rS6 v%{r6:Pz6?e;l'w?09YP2?Ck @O}s= 9^W]uz饗m|G)曭-h:uꔕc ;lnݑ1dpz嗕~PƓ{.r5uT5p@\wʗjLNȹ==oڪ-H-k48/y̳YÕ>&l{ `@aRmD䒆nlAt&;$6l~ ^[J#q_jt6LvB񧾽X]i[8Ē")3ge {v$\tiŮwee/IX?~/zY{#(iYbD|yi+f?XiӦٳg[ mڴQnZgu 0ao,+%ѣ&UV)e8pB PlMΉ0yI+EǼZ@a,53`VElf%]+ly=l9_rfn铛lcRݢE>-)`5PZ-{$B$㦀EW0e>X0&=(/4={IVeen#dwmnp._ܱq˞莠(M]K$X$ *@ @ @ @rw@ @ @ @H# *@ @ @ @0hC @ @ @H4 2A @ @ @j8 jx @ @ @ 4!L @ @ @ N> @ @ @ @ 0hHc  @ @ @ @w@ @ @ @H# *@ @ @ @0hC @ @ @H4 2A @ @ @j8 jx @ @ @ 4!L @ @ @ N> @ @ @ @ 0hHc  @ @ @ @w@ @ @ @H# *@ @ @ @0hC @ @ @H4 2A @ @ @j8 jx @ @ @ 4!L @ @ @ N> @ @ @ @ 0hHc  @ @ @ @w@ @ @ @H# *@ @ @ @S #rJ8RשSGe2ZjeQ>6}~%{GF~G}Вm J.tRid-FOPrɤ󶏔J%>h)QPR@JmpMJ^[i?J&RMJrMc[lδI;6m9&ŒrLp|$gD`ڴij̙N;wV:tpnϼyҥK^[ZNOy Eo֬Y묳/7,YϟѨQ#պuk'}Dj͛ AL@fƌkF{O:'?ۭ<+0R?}tØ]vnݺ)1VX,XiٲS~w-Z&M_0$v7Z}*qŋ*cW+x{=%s窅 ƍ+yѣr-<鼺N:;)iNծ͂n&IgϞ܊VZ&ijjy;_wuU0 xMowsQr\eO`ѢEFm*؟xm֬|;hڴid/ n=%nAC܄ @ TUVG}T-[̒=YWU|IKAVLoy^;C^}UNv9(I&^ 8P>? @  eO @ @ ĸOL4YA=쳖ACe{LOjs @b&AC̀ @ T~Z,[@|MØN:jvRlnLp6h#'~UC@ @!y@ @N`ĉ_ YtN:$#.oΝѡC_端R+WtwprUjW^AB2M 0P\^xcoo N-HlB1Uӄ.K-{3ݹ;;}g4{9ߣsV,OpYgyvѣG=,   DW)'@@@@[4e]&^xzGzN< W@'|)SȬ#9%\u22   4LmD@@@@ n3ϔK.DʢNtzpM9qaO[rssij>Beehp;[}}dه   A"K    ]GիW_,19AdddDv%:DCCTUUGK(//:⃹Iw&%%Iaa4777`a@@ l    -֬Y#}9𠺺Zn*='ݻEYb_^= a(C 6wEJJg@@@( %hN   I ba߾}w)m&믿^,Y2.4D<嬬, uWV:::ѣ~v7*tsO 1Xޮ#>1$bl}h^kkk*ę:iiiObBĜ3ZWWyQN3ygggkIoo2:NkD@C85) @@@@okhhȓL/-^X***$--=N?ax@nv9s ]4{jEiN hЋ6/[/ $6>L'6ظOvV{ߞa_x2\%: dʡOg'4(@@@@  RM7$](6m$}}}}zmƍrwyJk@5@a\ "  DC =DƜ@@@@ .tsZt|_̠V\)w}!_xs1^>sW VCrPlF@@", x@@@@_~]Vt趶64SUW]%=_]֭[YN1a“ia^\gW`1}GlXItd#Kj*X X+{?.'PFk=w Ѣ]D9uBľI_7Ŕfu@@@@l/?TWW{S0R FQ粖   @D!   kuqMtKRreʲer*)ɏܝױn;G ˽W__/-roa<,yD: 4zgg@@H\!ykOl }?8,EyH>:k9 ᳤$@@@ .,;jdt|F]'?{n|f\⥒=tgu:W{IIt>@9iii @@@੷/_#]'Fws7^\-{̅rgIUwuL9VN C@@@]Kŏ_g`qxdT|տoqgl,000 +uĆ ~ lO']]],f,  -08<"3Xhsܠ&>8Œ)h   л#~ m;o6)C#~CFMY__.>`@NPUU)O&jkk=-:tk9sYA@@ѯ˛nJ:zD; !87B@@%Qpq CCCpaGijjj<'͕|Ϻ.,[k}Ϟ=^޽k ^   8"[><p p t 4@@wOwˮ =$L=!@RR,ZsN uVd oDG]0ڵkE̙3E&ky'm瞞yw<͛'ӦM󬳀  )066&^~DHch+9W%!z    ,GBjȨCGt2F NhhhQ4PA,}GzyY7/s9NٸqZF>/6yF@@sU L#<H @@@@j bZg @ Q{4?==kݳõper5\gΫ7oW^yżYJIKKfYF~mil{GGv馛$##&:2Ã>(l={|ɞu@@@ q><rw4\F"@@C":mF@@T3"QF,""puɱcu$zH***ZrssV=*^uЩ&VXͼ*7x???|rwʜ9sJ>9rk>Qϡ:-Yg@@[  Gg@ rNW''?'r!  8@`tt,Z~ , @t[oUx ٽĜ:UDU$''˺uK/pw~3#4ht?SPP`:  $X.\$R7АHM[@@@8(ϒFi(όs%JJJAv'|3Z:NqWGphToɦMdΝ=.NqE(ed  $@zC)] 30   U٥hkH[2$9x(++/̞=;c,Y"q54:E^^ʼy$` XmjkksO3(:W젠8@@#u!ԤB-&'!ẜ#  +pީozaSf}<"@xrrrdܹGxJ.EAB@@8eveJkW?}k?#@@@ª"Y}+3fJeINs    ğNqÅ'ݰlt젏OcToժU(;o!ǎ&ioo\ rqwP@@@X ˾cm518GXVs#   M.;sN?P SϔT hF- <ԙ-[րQy䷿zթ[dϞ=SO5\#W    M҂,~J[~5zL~vãv΅   Hv&'g7|\I4kV)KO7Π"Q_עk0\cZ  DS`k~Z<Լ3G @@@&&g_$)~~eeͩ3&ar)^~e F}RSSϗ˴iӤF+El"rg{  D[@Gjkԅ}G[嵝Dh엤$,Y6}QahW!   CRS9.@IDATKʕ+qOA+#R!z'WY~dPVrw2k@]w%)߉*7oʒ|+`c5\R,X ?w=iiiFV@@@,Q, !   )=o2)g MbS\GsAGgϼ<;\ Wv$7nto>`2       $<00sgӀ~snaѢEu_ VjϮ7xó       0BC ZQ;00 MMM3͘1óͅ}А+V,OpYgQSS#GXaz@@hꗷv6iu-$䦍)dba<ɍ    0 SE5G]]y`O>S]jt#`N۷o' 2   /nӔt:=ȈZ)ːΛ/_SQ]@@@@; `1F70)'>lTArssij>Bee;[}}dه  68!}-il]gwˡϐf7    ~ S24}Ӯ]V_4p=AyyyX+#DQ\\wIIIRXX(ch𛎌  JOzww^zqD!_ߔu~LF@@@@ fn$[s= 0{ncQVX!ׯl϶P4`aAwta42RRR<#  P0Ѥ]A fxF@@@iꗱAN)#C| `9h#۷O;e m&믿^,Y2e2h@9(e>\ź+C+=9i^sy˱#`} D7:j200 Hu${Fk뼆7F-} }v!P6:Pl?q:>k?S%9Yk J@?+SOO 7GKNf/V@@@*pMx}A0Ȉ꼊1H2oY$Y~bK GZ l:T-@ |}')I   B`uؿ?l~ ]v6tTN)@@UirM7IAAu{:M6I__{PqF;Bsz!0" ֻ,YE@@ >r Bf@@@|  c$5BbiA,*Tg§ n[[//ʹ4بwusZt|Qۍ+W… wfM;.7)7{$=5%289ΘD91^:N=l 5|Z^8@@!0r%lRCB@@@ Xg;|);~hdwԇT ッkWH hY;˽*\_kN:o ӓ]bq',   @ %eȊ7j0y$i A@@@O<®ΥGl_:zB9~Ƞp8148&uZP9~]RRYgԟCȃ  6R^t>B`Cdtq    KGw0h 栏f:p/@@CMC.Q/xTNc**̕T---^KOVV__|f͚,;@@@iW[.)Ɂe7P=o [*wΊ  ċ@3;{>܎ia)27+<儥2Qn(777˽+244$͓nPUU%vaW[[+3f̘>3guV@@@ϛ&]}_.͕}qdUSȈ_vdB@@@._v;\)*B<87դl ~*OU)b>4>|Q}+`-[u؞={'Zٽ{.8XA@@Q/%$gzrJYaSULye`tuE@@l(tFs:(#\:!e*Q !,))I-Z0j֭~x˺vɲo̙AFz<6sOO;:Ĵi<,   Ns.o_BV4]2%99}7,* 囟Y*9a6yJk{[@@@S ?;Ϝg+Nxg |欹!S$fm A<Nݝ:*='@ r>}guᣏ>w}׳H;<ϺuappPZZZ<5³n^8sD렩S6n(_%%%Ŝͽ>âF⋍E@@@)ɲY6cllٿl5H}xx8't@@@.˕9,/}V..:5M^q\FhQߝ~|rO/|g>~+%--kyN'n5kx?ϽFtdDzo>gϖO>ٳ  ďF&`t}؋   _ "g o;֟zĝ_X)ELwiveFhY_wur19~f:2C=EZrssV=* d:Ċ+֢T?;9sHUU|'rѻDr-*   @ X% F@@E͔G_-'FIlnY D%N񣯮msd 3R\ږQK0B:?##Cnq444ȶmW_x3$''_.g \;SqAyפ+!??]O~@@@DЀot|vڊ   ^4XHNN], ciErWΗ2 ɲfiW!!N*l[%%%]v0FkVUi Z/--o}[i&ٹstww+:==]."C2H   @ ̐=O@@@;sk= v٩rҀv׍W58P&:OF$HKl~v|4إ'|cɒ%ؠSPIaa̛7O ={w}>6& XݙL466N/QVV.   3n™F@@@; (yؤUo^}tNJ D|dPLj#su?"z"? }@@@F@@@ $g/_WRs\SwJWZ嵏*@@S{z#  N@NU !  8F`vygI{֮~IIN,WY()Ɏi EQ"   ~0:HdA@@Y 3=U.  @ؽ   chpLWQQ@@@p $   `!    }hoP3@@@ ;T@@@ #j   p@'QE@@@p .*   `Gjbxx؎UN    cR[s*   Mn&A5ptttUNIJJ+/"#066UpWW$'sϘJWFGG-]"zSOO}b5𶷷`UODbq/hѯmbqhhȫsׁM:>I~~~ؿ. @@@D~OTڍ E@aɟhG*zy9}<`6H3Z_ֿ1-kY)JXhX; É"  Y@ aSP    4$dh@@@p pa$)@@@` o@@@HȌt͵lêE1Om:Wvv6xDkHpT.{G'NQI1z'1 UiАgWVV)vù5>]5?ihF#+5.a͑ 9X?IL'|2yF@@@ @`oa+Ɏ    0 @@@_N}     G    0I     @xh'!  $`:AM3@@@@ 5jN   Oڂ   Nu B@@pM8#   8Y ɕ   B`hhHFFFbqjΉ   @1_& m=70,Ey2@ @h5gB@@Fg   @z?_+/lD:]ִH`|J.@%@@ @@@PȎ  $3Q˷erVJv?6<#0    L79@@@D~& f0ۼ^20f     `@@H@^+#^Gk:Ļ ô@@@ 4@@@n ]/}pDk XB h^M   `R(   7]ʎ#!gC:'7i    @D!  8^ett,v!9x !z   DTR8   xc]!AGy @ h^    `s@@@rQ@ <9F@@@)   @sr򂜌BFr]ں%;3Mf˙ +(;U\q$@@Cu&MA@@ d@@@ ^fܔBW0C~vx#B '<(+>%KeAUl @`ttTz{{%7775G@@MD   X\Rddt,薬:2c}`mKoѦIOkozUvũrye!iiig=q@ƂS@@) >Y؈   `qMp9&%%Ur-i%kS3q,;=dl9ikk! ۴5*BPCT9   Q !jԜ@@p$:mD03g͕9cwEM?wv|x"!^{vL`xxX4  !tя@@@q^|U)-^~j@*[dgMsPב~ΠMFFFEF =퍊288sq@@@"_4,#  +dV5RVW#מ1K~pْ⌟oVW&Fijh7],z3u"'g"hc:;;z±G@@8!@@ @@@XPY(?򥋗q$' r|؈ aABM=^GokkFWm/0b,`L=pz@@V&8@@@LO?Y8-zo`X s3dNEd9{@GBwC#4XG]"o!"Щ'233%-ymAy  8Qk@@@ui70b bC4tB)'NX@Dz""  @Th 3'A@@p@q^fXj[r^ؘ: {&lA :D@B@@g 0݄"  DG@ɨ( d\ k---% ɰ0 tww!@@@9   8{IeH'H故T[[[ex8.  fР'~Y/?@ @zuq$IQq;(r]< @@@ NMB q1l|e{ɾAp5AGuΥLB@Hk](u-=C~7 KgKfzbL :E}ooVd@bOs3詓$3yXzG'e/:y<@@@ Y_JGؖ;|VWu3dzw}ag>6" ħޤ[U+^5ϟ&5%{"%ɨ Av: AqS Եt"˖!-iDR36],9&@@@ JL7%hNѯj<6)wJ9wi_ǐ @@ >>Yl<kvHi)|akr9Ȉ;A /@@CvϺFg׈ RFҐ %˘$:lL}i퍫}g#  DN/rS2 :w0${,˗YyI  #P);>vMIh1=SKtuu3@rpqL&00<"״LE&ܯ; y)'=    # :zdF`Ҁ~̡  ':*CeInB3訏fR!% 0Nhc &K:DzҰ ~ cmlndŰ ǥGz5WBY2D}ZFRa@p9::Sq@ ϹFu}w 6w#2s4kq  AGf W/=!pz'?ItQ=XJk8" K^Y+#>~$(p6\{"y5/@+ jxgo}'{{O= !+R  tJ f q( twwKccϳUo$Ѹ8)=:Bð.ʈ9a|ࠍѾLJ}t&zMUw5O#:D}H~y<~S4?slȈgGG{+!`k-ZXHY!$#"kF!-r⁕lQ^p]~prwH X# !=G4E-RfsvZ_GnE8NHAˌDX_/Y!G{ z:U`+C=#  m `5yno1gH@EْwӓF$%{[wdD7વt } 8@!`G6!q/ );cM6h /➪䢋.uE555gijjF:*//iӦٳeɒ%eǎ!a:菙WZpW4]֝>I1  F@H^3Mcm\eqZLxQ[82󅺬ruș\ /_t״#ɣͫϔPb}],(jn׌9i#҇]? HH}IJN4^z@_CIs!X#䢓lgt~%s2Xߍw,}oܸQz{{ݕ6FyfyǝBl_p_^***<&[x'wTMg}˖-KKϖ'^qϿ4v', ru@@?֛K^"{3UYAQ\?p89(rYKgP  0N5t /4@GJVڹs?3`h0[֟0Dv @@b)Q1D,;ǹ 7W/]ʣ#',P?}{.Smٲ=VNGVկ~垂b̙رcc_$9P&[5LǞ[?LBE @@ uh𛊌/𿿰R׶Κ&9+{3Ӥu934Fu~kD_(7΂`@@/ "~ULDI`iܹrUWɏ~#, F 8>}h~c[ heSSg׌3<,.P%:9< ~v@@@aw~R 옓; uB$o钙ɰ&"py ՏѦk|͹ dFY^q  ீ30ZG̐*]v\x&O떗KGGL9:Q)";;}n}:9 ؆  ~ч6k@)>h~q.SO')) ]wt ;?k!ImN/]C@`t8(483ϔK.DʢB:k_|###|bnB3;؈  Р#AiV6J B r:mR\\P2*ɕ~cޣ啜$׸%7I  @3ޱAB tDիW_,1$߾}^={׺bh͕"]vPR4(BGp#H   `?.y}mP#hW|X@#˺$/!c>҂,[/>:&n=$;kZdHr1̈́3 DT"KXf#.~Ky֬Y^Ɗ9Zn*=477YϻwXB֯_³@@,h~ׁ^5@oIOO !#v8jGЈ4JfHi~k\FdS_Q@]7ޛHR+^ pqջ=uT{z'Zضm߿_zY$SY4NB2eֵI0ւcƙ'}>1$blI ##Ů{faۖY-5kB=J_zu_&Rd9Z_'':o'̽2Щ'JJJ逾 d0 k?tMRPP`垎bӦMalbƍ;ংqZl@@@lm^ɂ/ u˴1t"[i  @b}Ci+CɃ>5pWNN.]*_}3h+Ww-ٞ^𬳀  S ͹[($:2`I0!9N0 p48E@@ :׹kIBرC6l̰h"< _~]Vt64S^XX(W]u፤1gG#/XZп%NNoϡ}8+K׉I4>;HiDU@()) < @@ޣ(ey'~`|+~gddHeeߪU_c@&󷈀KUUcjjjk[E#CmYYYT.F:cǼOO@ss,:u.}bhY]>ɉMe8[@V7~Ob=Q  v%CzÀ  f׳|֞IffQR|[8mC_+FW |"(P76@@^p!!b@Xn, dxW]|xY24ht !   ZGa0y& 펎 q,DL@#4J͈S0  @E.IgҌЋ>|^#ʨ [^^^uzDXA@w( }<%GK{A (RIOOxB@@ C&B{i#Nx1O#&_^=ܨ5:Tn4慍Z8  hЂ/CIA;u@ :VII4@@@ t8L.WҚhkk{Wtu#i7,K,16#ꔍ:+u   ` bpp'y hy#QsP\\7G" ă3C/҆x+PկJuuuMנ 4i޼yrm] ~S@@`ĠIY;uC @Ox$@@__Z| MMM7ȳ-P#g>,~Ҡ߫S^=;|" R@olˊR),ɖuV@zF$@@^ѠS'O4f ZPRR,ZS^ݺug}7!w00jSG| 0O6"l?P:fr2qKMj  ^WI7]/,]TN=Tg6$j]WW's`^7v <~ p9Ɋ~˽r~|rپ}{r5׈3'Cx+7˕W^)iii^XA@@ZG֠~|KB ^hX5[  @0:ZE5~!ŗ޽{Ը4%%e\@quɱc".zH***ZrssV=|^jbŊM,#  `;}Av]C$@@C ); h:D8c   e4L&>b+SD:eddȭ*O<޽s:c0tuɥ^  v20zDBHR&6qiZQ@@"//@B{ Gb:5ڵK|Ih ֓'|\qYG@@ z#1wc?Z4DK CU/0g ;S# D]@/@ 82:x~/}Idч)(tTB7o$@@$`>qT5@Th 3'A va@IDATFPIB@@ D$@*#su?XGTpXm>q ]%%/; @&SIJ$UDyڝpC4@@  @DG}iNFMNNY@@p A $x7\ve3Y`gNAa:  Xwkh7_TnbIm@ ! .2#Q"K8_```w#-@@R@pud1 ׿vOa?lܸQ~~E5e˖Ivvvi#=̝;דW_Fp8NܥgWϓœqש%.֞j# ē3SoF-:9ѣGkYgnJiiֳ  V@MMMgmWQ1 @@zWNAAB@@ Vz wyu=s0z3h3gz[ <=,   =SFj>U  ]"~!!W\!{ݻw}Wl͜.RgYE0m  1БtlFa'pj$@@C Q:>l%##$%%%2|Yj{ZW_}ս8; 4րK=uj9S ~i  `wFg{ٿ~t{F"|饗DPpzz婧?¨NMq{e@@b#/^#Ŧ&!P SCyJӑZ`NBZZ|sEy6766T[[)*77W*++E}萞0~"1V" лk}ZgYYYoۯo>SD~G^ Jt 7Hyyyi@@'381 k4ql.miAXA{K!>)'Ę<'1F,IEQv-l}|e{ν{kN9s{fgΜ9߯Ywq'4hjA3gZ[hp+',|Ұ`$@$@$@$h/T.yUoPl2;wnÆ 3ۇw0      8jɳ37  #6,4h Tk *AVUUiE!CֹBhCl$@$@$@$@$@&CHUL"+V-[Ȟ={ȑ#(&LnMrssf  d6ms=HHHHHGߌuuuy$̙H(hpU'҄r,**J5Q >ZgвUy}8$ iPי$   OuO|"[nc#G?.W `|V x "o/\G<===VD 999bN0j1P jQ9aa|gIHHHM9ԙ, 8F ))InFNbl     mt0 2uS 4=j5//l !..NBCIiiTTTf_" Xp     p@[[8Gg|      $(p@$(h :Y-4f; ?tHuuYjӧwܡ0JP=a&SdddP`IHHH#$,1 \ҚI p PO?5dffѣ\+ (//7+G1mZٹs;vL.]*Ǐe!谥C^\}wvv sYMԀikk + A7(qVsG]]]=RkT[(vihc鯙=Oz3{r.BBB\jY2`A$@$@$@$@$CC%bQHIwusc[nqIGٹscZ: 7fp.v'V`/|{ߓCjI/,^&(w :e'1116-5~b]L0滵  ,|dhx|tUUU] / @pe/@&u%Gjhh,o@?RTT׮]u1XjW^yEq %fXm    # 12k@Xj+!)S!    p|#ՙ"]A$Css455I||>%''jzs-@pm/U9/:!Yظ8up"33X i!::ZӵMj%''ӝ\6zNDg 9 D[Aˏ8sـyFFW/ip@c4m_C1P[ЖtMo3OZ~˗/7Y}$@$@$@$@$@GQK𿒳$@ @A+(9 tAȰ~zM&sO͘ƌ\ /H5:G$@$@$@Gd#;K4     "oDkڐ(hpc_} wK,94pjhhPgӥAO\t):h^<9 z[yM^_cy|L*7<ђ?=Q +cP>쳪XhW"ǏvM 4 bI@O=p?a): @@[DHHHHHHH<1PJ$@OFP-_L̐$_%77%<)0; |F!>|)h0 'pA@$@$@$@$@J7n kXn    lk*g ǂ x Gn?CyiWRSSd (#:uJckJ<]dqPڍ*F @Cs|Y7   F$qT'X,i43pbB‘#Gdj+ m@llϬpYiii.Gk7%@xh!%%EBCCMz@EE9ӝ.E&t1kӛxvaA Hf__@;R?`Z-YsOO1.\G-+22'hx2ޔeTT=ӣAO|MA#\ 3|ߖxmqȮ]Լ`grW?OW_9@AWSSʼnIHHH Մ~p>|kYF^u9s% h!!!bw@`N$&޿&&'{%|;ڸD \K,]&}yz56]Xx G/^wݻWva*GDD|_uS 2m~'Md4`' 9deeX߿_>snϟo 8Cjn̖j3    "7Y0U; V!f     +t)KB$ (hV}dgg ـ:fVc~;1&ځ)SȴiL *o]pLK>SnYd 8C0UQn9C @ x--[f&wUޣGvURLHHHH&0.;+LP`#r,..VGs /[GҺ뮻O>rss>09>l&OUpZ`45L @ |'V!Ǥ?n/F*Y妛nRS!B$@$@$@$@~N.f  k(hF N>\g =RXXh ᅥB;- jK.%DԎE&HHHH6u#l`      K[lmS`Y鞷]oȱ20^Jˎҙ3gZ1ZEcpWtRu#+WHHHHHE G{txH/h.(h/. I$@$@$Ο?/lQuf*=-_OͯJEKi?W(o Ǐ |r⇕+WN/ MWI >GyD'V No|zjYPr[>cr' h`9/ 8KW76_òviih8g<  "7lRSVlaH m%;;۔)+,]T-[&r嗛KJJ8:"W^y'$$D(h0 u3 p@q]W~_ڵkMZY[rI'}7,Xl6;HHHHH @@X WZէf03ۗ%e͚5F2̟^zɴ G@7@FTַAVkwtȓoIqHHH ``з1`c"L{l#o6MҢ⭝}^&p뭷s='X p?jyJ\\'?+GHHHH kO$~mդVБ#G~'~im{n߽~k4iɓns|0ppH j@ "Gn{Q{zN)mII$@$@~L&E1'Pj%Gy<'0~xy!a]!;;O?|ߐcǚ3fϝKK}qhkk۲$@$@$@E`HB l ';{Mg 6m2f_?VWWW˱cfY  AU5/֞I6N "rlS5>>$<HH@0 +m^G\&1a61b`NoCIBB:Ҥ4x@CC   p&ò: 4tJe{T5ȹ6WY?[G嶑 "!2ȴ)a<"4\YdpTdF'JD%C g!|:uʄ9pm6S<̛7l[LfVSР/ C47LLLv8/#x@uxTySFXP<HH|@wZ=-;O$,r&<K"afRvvv \zuY?   7wa [sJSUD֝:Ukm@@:Ƥؤl)!M{ pa-9sF]zuspLKKJ5~]sg2 @P Ь]n ^̈́9rYhyH@ww*ь]BHHJBI #qAv 7ȳ>ֲP~׿u}ʕ}pBiXx - m*5%W6 C`chYڠrwm9s>!`xfAA@‚YA $?4,HƩm}/ۑGQD dz&DDVay])ޚ\S@$c䭒rgl5mZlwnݫ."nu1Z#G?.WFc< & X@g({ <8MSԥA]!1프( 3Cl#%`F7fvc ;걜$ ̛Ɓ&NEb?1CWx4&v5G]ͪ0o pBD=*>P2|-[ׇ!  g oW'8[@</ m NU 1KɾDgDumV WɆ#8ꔢE|d,8fuA3EoљSy xT@cѡK koמ%pmAsx&2 >4j3?5gExǹmLIN/p,Yĉ45g'X!>>m?QL   L kL KhC:9Pp!Cyc yJ^`qUKykwf|\vPZ닭log7?/+J ZuKAd| EAGUYucK{=Q)u-)Q22;IF$"2H@!9?<Ce$04PG+ mqPF#>bBUUUW5$@{m?g!j0 =$P(+6*;\0ew͔ 8;T*=}%e$͗Cʌ3  @6Aj9H˾qϱ$'Q96˹:]+$k+RITh<,*++Mb`3I"!Pmm@؏_x8btHHHGbww3FݝmNNq!a0w:lE;tnDF?"g_a[qU&k g[k\1Wɸ\u< $@F&1Xt@*k?K{mVbOGK\;lA,>az9 @l?n@_hLH&$#beؠ !zjmsHhbVA$@$@@֖h2flxZLX8d4t$F8Q@!RޤKNpN6Uw&Wf\#c ].hxȫ,׮]9   kv3o2\# ;&( ç1" `QuQ~fM6pƞ\:4 3h nO-]MeE\,lWGؿfǍg  (l0Ί1IHH0 AJH49T nv8tĄyCȰfqߨr[ yxn5Cܣ$4$k\a  p Ȇ 5@S ?8\-b ->' 8G)%ږ555"o`#XO@'U}}@`!!~'M]Zڮk\cDvJB,h~FmYY`"Żk1dw4Y' 6bD $@$@$@nn_@IDATA}հ}=]ɭVv\Ir2N ѪaS{PcUN H"ͪ ? amjYt87p۱j9^(5 '0LhWۉJL!62b$*"T;:"[)fUHrUz|` >ol\Zz].#Z Qq34fH:Uj`kJE]:~n@0-9F( L$`@WW*V/uL{ԋ됸\H*)ai}EԤdI5.9iq2XF0'taUrpBR1FFFX.d   <IyϱEzSxC B9t#;O %2Np{LՒڲcPذ|^uB~TQxG$002ۛɮJQ 5'HGm7?aX{Rբt)`=tUW}] c4 4@܊^   uϱ ao6#bޑsK&#,4l7H@ĀLX[X&N S+%KHZZZּB~ Dn,Z#ujӦMrYzdKdԩL}g δ)qfbh b y 8@w rR|?Zc"1*e1 #4qE77KWSbPy%fk{ %5}RZ$DȘ!)2w|\5e( U`!\(08OB pDGGn(BA3-1<))ISW3<O ]1s}3yv J7wێ;HҪʼ 9rl`No'1oXo*h/9W\nݙ0 Z`V.ݖ1&  !w,޷ #pV9Z641 @vJ)PE:W"qCp>*݊<,7ضސ#/ie$ZM巵R^"O}|) $k00P U;QI~M&ɄhR]r^G&o6_2um),< $j* vMO>L̀/\F)骸ȑ#cS֭ 3giwm-?K*0ws% Fu]O|Nyhtpm%WH|x ˜L 5*NFY3Y|dT&ux|l,LIuI' 8w Hf)͛7(hFH4 i>("u hWw*c״5c-?yy!1V?BzfBt#akl0mv#h&pfW?GN4UڬrftKDO|6,'+ |믿.teQ/S<׾5̜9SF%I${mqgZ{4o3Qm  c.e :pCbSɄ\0$e,%yOXh췐G&ߘX^홁i5k֨gΜ0 s#dx)A=8.EЮXr!LY8usquGLUICw ߽V)7B; ':Qd{Q>( Q:Ȟ)ㆦʬY24=ey2 T5DuV7lXckGG1"1OI6 P"/d_/bx0lٲEyioox`AAo73 4{lW^Qw={TQ>δ<01 W, $@$@$@`V쟊c3e2뾣P˂;gn BCBadNhewMqTgvS{K7?G𚠡Tyg~,; g˾SUO-ET(Z5%*[O;%n)r:xw,t<%S|PowJ^_W(->Do-謯nhSF(Ȕ;//5˜OA8常8?4*䯫nEb-}A<||mDd- h'Aum{ì#ëIZxp1bJb;@uVS6PPP`ڶ2k,=ٳۛ6m*hpg}M;,WڄHHH:&'YO{mh?P=1yj!'6VҢS]ط$\56Vtёl2FmE$@AF N'vŝ01/I0 1fh;L~\:VMK)hFЃ{v>?om 9[,ߺy:m ҄1`f?#ϼK:?oyڵi w-mm$@$@@[bpVypl*2\yt"Rf3Dմ/gߏ%hbfVpLa͚5fw۰aɓ/ N>~a9A-@aYbi@ w}$@$@6d&wT}o-,sf1c4;6]"bY$Fww`h8mjK%+-WIu;-ЬwxԩLN7Ȧ`BI}hpAҡ>씱CS%%>v0 YxwcxdipHl2`:.g̘!]w <أ=u)?JMM5m[0YyyyLOf4LQ|R  p vdp='Uu'j9G(9_ 6%~aTXk@՗2cǺ 0~ټ$#|)Slb&hU W\q4t-7h@x  ':rE:NeΓs Z=- hqU,'GC3Q\h}Qiufmʧ7M: fo0ʶFyVUx5B1]H<P ={\{A@)))ˀ>9wmp}4>~~eYh  P{њtŭ 63퍦461[3zɉM6z 0dyj]ӻdefbGtXDؼj4ZOFK1M:$hغzSNNWx@MޒnMu[_  b$&*~$'bf ?ݢYp@穭c QJ #}Y2h=Y:)Ee R< f~"dHX5qM KuE[2 $@$@Fn:+Vc.#*gHҧ@*yUxIvů$7Ufa̙M#L4y }]ҥK^P;V\)?LrHH7!DL2 Ιj;ud_ ANq{t=RQk\WP`sZHqz0*^q919Kg$?| @` ;N֪6j6/~aO>@^8?^}UywԶ-2'W"ګ'ʈ>H6ă&m;vFb\s_|܃n #z@>ma{,8GM+Upu5o}@?^ I}}x9g%Y?fdWW^yt7=>"v<8|D'Ix<-I CCA]E2 ~yUwE:=ѵvyUv3Ax饗djhg?S F ,'p @ct A*ԫ ): " *Բ^"a1~Lx̵Nqe]p5tYb0}h=xx|\?dK[G:~N,k eզXtuI}<~5,f0/Ku1Ne)P/%w;\<|}hWb85& $Q\s՟XmX̐//Q\Lx|5f*$fР)nP|Y + ;{ߖ'OĪ돦 J`T?v|~\+<{c (UQ廷M{{H|9bZR1YSwR\ьv'foBXkTݜt܌ \s-ÉsV}+~FB]iT.vB3TL-k1are# FKLM{}LY^yr7]|;D=b v`0Fr&&-'͛3mcc`%0X SrnbIH|]~hWwbÉOV 3IdLJk Ix?P]]-]uJ`opU8 Mps:yeq4G*[)FSkCv)ʐ4[evd}w .wo>SfϞmZwveڴBZOڵKg ,@X޳|Åܙ~ѧe,kLrU%|w韥~oX}XN}LWv?5@ҿ7cbbgwKܹOJ\z gcccO kKUK{=T.?I#M ۹sMANNCN:޴ڪ)m,[& -Bk@Ѭ1xfą]p]&&Xl@'ag8varlzye2G0$-V_,k0nكƸCdZMAh\|9A*K+D39/In=T՚ȀpIQlýdqIAZ}jYH5c|^VW} yEXa.j+i'Vl5Eғ.6 #DqGgEvi~d4a„\nn={VM n0|:-m_?ŝiQQQ .g1eͅ6xw>6<Qi4@g 0c g4+, $G^hb6<ui2O?xc<@rQ~hiS~q\'IU0b)Pp '\UNC$@$x,ȁWCը^~{=9Pn(j>wD$p zΜ9&AC]]<_ǫǚf Kʕ+`v @` Y _AZ'~= hA)AƢ/}pD:v,Kwq &0EhZ|\VR{ANM17ٚC;).[5ηg:-ز׷_Lzq$㧥δ2 xc&n/ߵ_ -IqHH@#@  ]?: =>]*#a!eC1 9Р~GG?#a}L2$h@Q.Y޻w;!_ 7p$&,79[>йk)hו00וiRZ K] ]tXSBg`@_:  8$K0H0Q\,B=UMe|0++5NnlLLp[f)h9 mMg-Ͼ4OpT^ݙڑrtyX#gjeˑsş8 BëNo(*7ņ3X|P,+KjE{ߨeX!*VϾx}桃BwΫMr>4Rb\+777a9pZ45r뭷:UO?T^uӹ2j(6W4  l@,U1 ɝic]os xWkba|u  Vx3㢅6{N)V.I'##9qϟ/>7K<#5,X@֭[gOQ߉μ_$$1"FBJ) Mth ZLF@Int +RKfʂ rIշKoHDEJJ|WD aO B v˶#erI31 /ɒgKZkf)xp*)ilE ,d7L~t_fYٲxڮn4lbZ\.hp,|C?4UgU{_v W^-8W0! @?СCԓ+--5dIwJ~~~ݙv̸|= X4~X/.F$@NuI)ݽ=fyx(s yJ\*#0 @5=zTEi)hΟ{Oc5>Y k,̙(#2<[F$44ё3qaD2teDGg&`~ z2mx)Y O@sɫ rUc;{$"\`H~& `{ hRyLT~P6(D5: nt\RNdΜ92b9qZKo_~Yu9o<_Rղc5BSC-6I&G}d:Æ sbMδ2 1<߰ز_ ׶5)|E'*Xg?Cδo''*$\%d_b(># #UA8~xy΄M6 L4Z4H^^|'r1ӌ$4328hlɎ۞'PZ'{kKԌW+XFguqZ3!s$"K iH褁Au .hRY$y4`p l.3m_^b+,rEj?^k7;gи4q9}J8(wzt$d/Y,Y1'$@A+->> wy`immU&$${ xɮX?^.(nH:r4 (=:bيLMr?p4~po CY[ڻltq KEųf@` K]NK'ŝ@CtDd&4o@VV*@w#}³J]؁O= 9 8=FsΕj"x+rZuၴ_|EZmϯ;w@Da3BM?mI'  5vɋ`s9 wϒH~c p=48R5+1c#0. x|)9f^]QuɋBqKO?J6 :|3UPE' 7`p"`퀁R0q` @&+.%:::tc\3=9.g㙉N6yӉkO˚6Υo_(a!q2T4$EJ}Hΐ0v|ټn80rHyWՁ~a%|wq|[>ptcV ٺuj vڥ#>3M׿UN!3Pfvt˳kFqTqukɛ-w^^`0Dhַ[nO?TP/,,;cmԨQrUW]%tե,{G?\T݋KNNӧ͞կ~n1ܙ݌yH`bZ&m'MFH,a1X'%/oO*[`ec1Hlm7VN. 'P4BsO[q,w)V6TV$Ep\=AR",rH SXo_Y7r, Zb  \6.[oh Yy1Y0󸿙ReU㕓Iy[_Z-M-)sw.5BFǪ. "_җb.P[[H355URRR$==]]7$8A…\IXTT.IB#  gHD`Jp9QW.孶;UMT(/mEezpj ~.Cǂ+Yz7@Z|ӈ3_Fd=BADuG2LnlH:z*yԹxVuwbY}LvJTkܝ]?Q~.n0*&xy`3<ݔ]ZZ/?&*~|U7"WWZl&ɉ-='?0,k@HXk,M{'p8Lyx&d;mBp5񻃫W進'mvH3IaI1pre#EPlzeN!//s!XXto]]f^etHȠ;u $66@7  ns}(KE$/ yKU&riCY {G̕fJ=@$Y^5yꩧTi&w%tI_蜜. *n(k\k:[şFqI1/#3ͬH\O@P 6`7;QP&M@stL1S ,7Z5#B7ϴ7\('"BYd SVmk4!N ^:RbB,d@{U 3w-E+gXB!D Q#,YkxLRxjˈp3a7˦Ćя7̣=;{{ ǽ;)ttӈJ(&o۩i #g0&`L@C`ddkۨ(ߗbHqzF,E +[EK`W.ÿksИ}ya)tKJNpȕ`L)=bJJJoJ3Z[[i׮]cQhheLD&iWC7SQgU-eRDG.fKɣpdP> ]~MdL?1/ee7+!*Dnp!h`$ eJ=b oB%F`L '082JۏVѶcU408b0T!j9wR*e2& n` 1N&L1]faKҚ\s&&G)[kӦM鱗2:t$hx'l)eN! Vjö%SXpGUG8),A6@྾0&pEgC__dm++ov51`tg P<,qbNl4 :C{]n~y?/`L a85*8UJikVNyij+"e["fx'`v!+2ZIKEX(/Uͪİx )lY9`%vm 32kmêS}ͥR\RM.)1&/t`L 0C^rl1|]JYIQ:'ӍM"!h,f6F3&`.|B@apt8l)7 Z+Y47vɼ 0p{A]zAÙ3grsǍsZ|v5 wHKch%̰8Z' b6L 0&k-`,62Z5v@L Dsg`=WU͡yYy8 0&`TPiMd0yi9 al J8 0%xxkG';jM"XM?qEp>4I>e:eee,hpok`'yix0$n(ꬳlgzZ$wyqi7,ϡ_x ( f@&foa&F:nX;饒ݘG)D&`dó!**`:zhǎj*)5U,L 0&`]}4Ll\\6o0o!I &I{xn(-rCiW:LkR a!2 2@&`L@]Xm@6q8h bu]/mL\ǧ >QR3CĬeѣٳ|M:y$~8Apw%HX 颋.?`L  37R9Z-aYl3&o_t-T u-pP|3.Ub&&ܓ N8A?uO% h}\)V%E!T4_,!DYՆcML DH<^Lu?H~LyhΤx P\0ND)s:mvN^OthC(!N0EϏG}nݪZ[;7˃>8N̠9H#HK/T;י`L D*\r,A!/K s`L@lmu~s=b@1vߒ&z#n/$n7z(Pa7otkma6[[$o>MCc#V=zvi.b_-Oȕԍ3 V"80&d biaUMN7A~$Z9͆x"wg-ʄA6"wͅCy6@3CA{ |b㮝teG$*D&D3 !AëJǏW*JҒ%Kd&p)A6H sZ hlD???K s`L &o pRFma~W W"N 3w$AÏc*((^0;JoTJ4&0MvI; 07!008BZhAn543+eʻx: :IeqD^Y`8dT\ۆwN]Ki1Px{8p (!88XO^ٵk*-Ν3 [vHrsY)3%`LDIn79guǒ:'ńy8KW;22F'Z)_Lha 0\x']Ro^XX sp8{ۛ›e{iKĠHk)FXp[A5k誫8Ϲ*&$.N]':˄ՆtF*{QrQg-!PLn)ҒC8 07&D5,hD*襒0Yy8 "76l_g\CkeZ[D+Vٖ7/_.鑟Ă/`C` j'kͮtdX y, 5s39H9M:S/ԴՔN׬B@'Drc :hy LBr:ZmBFbyWA'2$AG|[tO\k&I_t#vѮSKz+=&^ @i$f͎Hq>L xC%65EGR|[t $pd4B000 bni90& u͚^nz?:X-/5&<  ؉= od~{=jT>m7z6lp0~Zr5/m4ffP}ZsTa 0u ѡn/)1VKcL 0!z.*WO.!h$#T^~nK֭g0ꫯrO^{MޤbA0&N׶1]H.e~ Pek 8x'`#5&ޮO[+NHu%NQljL x =:ή]z~>9`DI; E&5 tgJeShpMq3Eә ̟HTfzBj0o- 0&,!pT){!3҂Iy8 XK+g}V:y;}K/ԬWVVү~+ 9lf`LR-WYRV{πK.ev 7p7 !(ۣĠH܍brb>NdLs.h4&$Id-bUO6ҎBj47|pÅ!nF&|0D5 ք+%k1L 0W',~b5s"y8 BW^y0 a֭R4Tf\\X{ܲe m޼ f]wK&`yu5: 5`@ྉ`#CggN3#6&Sr`L{-R&22bWosKgPlkh-ߤw^,N'khLB[3o!G7NBUdqX`L H]g5y%vcvnM 88x3=g?7??N8#f@믿u`L 0s D18|TV゘  R<=v!j0&Cs6PZ(5ƈ3O%` –^n W]]=.+S# >>^ZB&jhh9V\ɝH&Bԅ7@iOc⋋9j1Z5$в)4+:|\L ؗ̉^Ko,UڵX0%6י`LC{iƍ:y 0&%#-n0oxH %F>a`Z;ek `?)y x-a5>I`*K۪tgL }QI=:\ :7ߤ>a~;5kL 3(/:]KBpJ7(3PuajI7sc3GǠ9U?, aM?яk_TXXH_BHHH01R+whNަ9'b=#@0k0.[7̏͢`?V[˕cD/":yNTPmK7uQpFSXHpS 0&<@Ig=:R UiL.`rÆ R4999\꿀5IL 0&"pI*ϗ.^0Ѫcm904R.I`COHɾkwK= 0N=سgKj?5[̠9Hc=FvjCww7=3kgu&ܘC̍(MRo:- 6tV 914ad!2&l<܈, `L{tH#g{ _6{~R+ݻ\{&pIzN8lrP忳r E +R|PP$l`k θ |NO#+(\yZ;Gώ?h,W"|;r`L{ 8E[oiYƦ΀xO~B=T&0w&|."y/@7̏˒cmj1^OvJ񥒯hbX7ɔhS|0`L 0&k$R[(e4&`L x tӺI~SN}Í+Ь,ױNT>,6rcU"KpK]_%ip"`Aႆ]ui^^ͤ+--jjjl. `L}-ż,)=uNWў[^RLop-uϊɐ\U|. 0&`D`ޙ-/ݮ^3tuuQuuԿ> r-}Βқ);;s2&pf-DK;op‚)9&T1N ?_DZ:(8")#>^axx`! u. x;jeXKeEH c5^`z rC`I↹éQWŋf?9&`_ID'Q?ʗgL 0&ܛ@UO+=}ߊH f';v+Vz.,3\s5Aӧs/[gM&P@p-K5%,n/TR}>!lz2IAB`>A)J.}}}q*. xՄG4F’ *YY_(IL x(LHuSPP@ GN:sN>#`L4`B^^Kƍ}v?96%%&O&! ;%a pQq 6Wb07pK0nEZ<`L 0"a1:^XisimJbNd 4ST|ɢ"$iСCO##Zb_\Dx 0S#ۙ 9Gh_s)iQSLM%RD)IBpzCvxɂ8`L 0&\rzbͦEp"p j:6l@6m"LnINYu]4|z嗩Pc*++l>^aL 0&HEUTPj)ϹM˧Xua Y ́ x  jTkO- uy;}3Ȣs%[*}Fc5期&,[L>~$;Xbbb miiJyMCfffe]暤VL Ȁ(upK%Ↄ-=*o 0&C |uڦ-o-&?_ʱ` VnI A`@5c ~Ng*6k)]Xh𜖟X͆1bYK? A~ؘ YOK?XJHH~Hkjj2A?ҏۃ7 0'"%N17ͧ .%"ĶR , h8e. 0&OhD' >ؠ0cYx?p(>H|>Eb`oK諐-5&aldfDs3Oba ,c98>\oOn#NU)r7uGL Mψ1dϡ~<݋A,E6[n2A"?ܿ=>;O<0:L+\M(\(&J'zM4?:V 8 {DO U牢atcbrx\}v}m `pG|Qqy ػN{o۫iɡ7|^yz-kn6Ic3&d0ixVс2:ZIBuFz"BvxpKq5ŴTQSzsL 0&gO|H ,u6}+cbNd$lOw| .RN |.&~a]A7N9jTPAA>QNw$3&`LmmUƒsc&]S)D&h"5@KIIs `L 8@H:*k (64X,`A2(^l&<}Cr-ʢYy8ErB3b7W32XvNo"̓fဗXi`!.7vI8O0@EEEyfڴi-]nwح\0P&=❹kMpPXp8QK >-0l)"K94'\dL 0&ީW̞!XjUD&?['**Jj;Tp!OX3_HG>t*32]}3~&5TA \odž/ 5n/#1:Dv Wwzd,pps֚kc1#z.>8`(}b槼Yuچ{LL\3I,Lп&DYHH$dpֻD9J\^6,OX}Oג#[n\ڐk {v :Kඣ6nh*UT1'H7N\HÃt [+CP+4 tїRDYaVu*. 0&R{_+>JXzx3ҡv(++sjx25ǩ%+^A7 !..u 9)osXwkfNJV7;HXg75|m} +wk a&2񬾐F}t9>qg޾o x###%x.ǞiiZؔ]FɊy) 3/o Ȁ焒x\p`pM{Hާ7i\):ڻ `gPc2r5.)hPa\ƶmt PFNNdN:E4sǎH˖-ScŕF{ &L"1WxC¡ *1:Z*z 3oML)I',Ip`L 0&J:)fK@ :3s"p kb EJ:;x 0&aa4U jN>;ق0xfg٭\`P Ⱃ:Db}xRhQ|bNt̶>Oe ?<9/4ص壏> ;C3;vcѢE4ydz뭷47'|"ͩFp. s"IK{xVa!n!Y8}D(訑?P?͈N14+:E=|`L 0& hG}@Cc#5JQjv p12i$*//jk_~4Țbs=9gl `L 0GISPyA?:<.inv3簔0a05m!Óܩ5mۆH]I³]}'ڢM|R?N PܸkEm0vA]K.L^n(F=*YJu |pA2i, l8"DEQZaplX*e# wpK! >YL 0&}ϤrS`!77Wmheɒ%{)m[+ֶLz& ~'k Q~{FP׮jGp}&|^EӔD G-8ʜ cL 0&; gzu}}EL]ijkشi;r[n%/~azg _L 0&N ߏ0^Rh1rY  cxkDz뭷t,%XfN111}L 0&N ,HXLrz=<x"0dk |l~ zC¿mQl4w `3иsk朳C\\fIe`h^Eb1& ?VW~i ^/=`3D6%(W 0 R,)Ρ>!nX8ϯa%qsa0!6=RSi9r32&p" 5ldakK1/'2W%8~;_?Ӯ],*& G?.Ȣ83`L 0w&02:FbiQuwҐ0@ 4kRf{Hº-ꢆ4Y8u@ Z8L j?NX4ր|SPx'}E?a&((BC(?">{Gޯ= jKgҠ _>պqq׀-xpm< {\R?mYl*t5}pL5,6f(}j,6v.SǶq[R;gli:D_~4ѠzQ<ː7==MFwج/ 0&J`zdu?_TO* '{p|?uxUšOf\cmS%x0\! nN{K_98: il y5s3 c,jܻljTaU* ֕8ৈ.mw\[o $D}JTz"Lg,}4|cfȰ%eƌo}Nca2'4lwl%0+б>b$nܹS19_5{dUGok1{n|(OR.n PQO=-:Fo|:MqtAK AєO9!-bByAc=Fr,oSnntѢE:_Pc^yӟϚz֮]k͡:`Vbss>K7`Yۇ1϶tM7Z |tqtu\)s}s.PjPH5y_駟g*Ç~HMGW^m4 \p=sf7^x&.aŊ6ZYSxN7c~_I:;wKNjNq9BzPe) wf`jllD'$g?m۶-\s%\r-EHǮYr _.G>wޡ%KțFGdBcҤIҵvQ,X@XG5E!99J`L Xexs):  J j[Eq'()ij5@\Y Əpѳcl4F'A\:fF\CۺH"bw ίV K/D^z)-[̨u+XUsʻV7: nl\0o@;&T7wӇ3 ~bZO~}Y>c%wWn,Y(YU:wGx FJUu[ 0D-Ԯr SovWvs:`C{tNJJ r`Lr=#]5t :@m9*vC:+CB{02rClj)0&|%/Q_ݻWpwӆ l,gL 0& ߘ`*uS %{>Q.uܬWq&XT݆zl1wN]Ka 5p$t]>Qw[Vv1a/ܰ\YFu5ˆJQW*e CB]]kcQt>ZzJMM5tljJCWr:`L 0o'0EǻkxEH yyVk(b2/":G*aL6&̡1| ;} r\IۼdL 0&*Sv~k TZES",?>~5ujQg6R]LaӦMF}Ü'ޅ@IDAT<,^Md7M<,~88&&FtQER|ШM?nj\KSO=T=ܣﴴ4ҷbiX ~bWcwC_ (p)4'p _J HQ,CČp3fct1}6F3+$7+$G:+ T?;Q@`4 lV\ʵ5k*LgΜѴn#BliHJJr77-ToB@\e~?(%f>KvK,_4uҕ@S"(%$SZ f}Q<߃-I1f a\w'xB}\pesn?AԦ]ͳ>zl򭈲 Jv]ϟo󯤻˧1q!(5V^,XH7NZ^ BɝwIׯjzvvwK sWx߲Z ޣn=vqs-g0+ /l=uY]]y.XSbL 0&`uc,hw3G =0n1Do OѶJMF_3脪.zowŧ~}~i:;⹢?挺x9 WXÏ @DVJ,p!4A:&yuVMujkk5 1 ,ďG~\uǠt@\?%L\.pBJOO7  G4ŢВ@VMF*U)CllA;t[322뮳Վ_vjeZC RݍT^Kb )hn(27S|P$M47&`?ḽ=APѡ?p{A̍7jo:u=++]%[% XB9F5L+fXt=3J׋멟&%yx~͞u@>- 9kD'jsΜ9*QW x='.rWTqǕ*em>YXKѓ+eisUF}NR!U !B\dG-,)B3U)tL 0&klha<y_8&x?S0֛BP?3Cm9g蛵82Q%tL Ȍro "mmmfO`dΤ8U0~ܪe$DP\Dٽ*z{914tq.ʳ>+us[aV!Nʤ?/P0U-mKi3uvάvx 0'KS#SJk:*ꨣS"V4ӘM7t➦KS"Xfˁ :zaȮlծw%NAbB478LCb W< giwTw ʃ6em\Hi*U+1/"aazxINw 'nQQK =7 0&ܛ@{m3Lab_x`EK_j(*`5U{"[ž)XBLVq**[X҂!fg:|;-D Viߩߺd=cmt~wf}'#E]È9P`?S@( w,U9;J_Ԟl:s͈N?=o3&`%eL4~2xe6}S< g`N Gk֬m۶iξe4hh `L 0FF O5 ߷E41~8&Z:~u &;%cySѵ2ms*KJnxȢ jXՁS!:<6.ϡ}Ul*ES(ok[Wip׹999ܘ-92$O>1' sҡ_}{nw(L&4W-pt{"}(5.fdQpSn3G6,"c2HVNuS1bWUt7iV >r)GbJd%A^~) :zcҀ~`*K%943:]1$EMv6z~Q덤 ,ݺ*\)j-֛^sjaai(6 xkz3k֕;d^ܑ<@ twyGM>:3&D\v/A&v.(BCQVjYc,Fe('?mQl&d'(qt",4L! ޝu0t<\A 0_Fї*ͮLD|븒7蔑h $v;wF 煯c|]P3rCnnm- ċ9fb}5efffW͍cB K9 Sj^.Ȣ nrx\´<"L# P:4tڽ 张FBA“(;"AXuH$ %/ )[ROCc#6ChjT -",uݰNQ`r]N?8_L²vh@ρO|$6d.RfR/M5vx?'{Ieѯg}%86sg^z fwG}D| ]pJiiiNgzo[vYIFq<8o BXvAa 5y7g@qr̙*G FO aMhlc=082|oQ# :h[W:UK)%&szpg1ĉ&'),2WLTTThJɐ߯ɇ+Vl˗/PYY閂tȳD`jVDil)[ӳlJujwwKB̠322FۏUfYj0$iQR+9' ஢J}ٺm>Q>4)<^DfyH&Ks T4ӻhgcAGk̋(MȀ‡އʬ:vl,ߴ@:X}|TYK{->Gp~ViM9+hut~ѷ"m`/4ڿLXA+ȏ J8ҷ62e:uԪFln `L 8XN6eF[{qLvĀ%,)sp 3xeЯ.|?8sPB3b|4<"v5Lhb4fS9[HHdis‚)I4sR<avmZOϿbL XN⳥( e0 DtZ9sD94wfhF%ӴT.!Qr2/ŽZz:bxMq/\:M_4H/:`;hRoQiR#w ՆNQpg j覧 >ӇɫhN햩,gfnB`dlXd%T&Ϡf\n&Lt gp#`L ؓ@PN[`2[>Qbp]n&i%6)o&0;gՌɲO?WF\KӸvƅ\`pK111% {S5ۥŠ;"mqo222 eG$ zz9mdvJ@bcc5n'vIWVT[X[+ֶ}|Im3X¢,TJ\ZIœʤDibɊ9K6|7.]$3S$qDu[q0g;R. ڀũ3a%GZ[N O f23eAӤx۔ i{}mfr~}_4?6nL 7y g`B?!Sa}\kZxb 3&`L \$`Ųv_ aIx!5  渦V\L1dY˯D͉VkL]eGS/ [oif$lk-̀>5%g1qp, T,!h"mf.5}Ƈ~(U(ao42W^jUKUrИun˗f gFh| `&JD 1؋08:Leb೤S ,a}6J烘arD$pX;GlXG\'>Gh6c29$>n&,2Ԙa>W/N)Yx Y*8ZAGUESlw2?L]C`LM-/4ә`L 0&ܔ&X)kVj1  pOSӔ-(ѝgӟ?,0\r/RyYW'NӧY .㩧Ҥ${E\c3{_Q= 0+ KCp?JiAr-o 0![yb^MKrh^DB]9xtUGMT;x=ŒѺ<,uh%3gr/([,Bt?6A.v6цtǾF ^ j}TIKMet&q}Yk7 0&>|~y m9RIC3ίI.̥t!p0>g)m4M׮Ja>42bɼ(B18,,L^t5SwrZ\?0YXE K3G˚x[z~\X>{&Xz<[kpAC||Bax\gӧ)++K >aϟ/o[~:Y~~~t 7?YPP@_%q ̙3TUUf*W C&^)FF98( 3rh]eEig#u7@.eVl/b,E.nޖGl=o• fNM!,{8u-4ȏ:zt;,7VdoQg=*{%Y-Ƚa:HBBI0 cwEU,Y%\zݪ-3]ޙwE(\lD1ya_mM:_*Al>22>t brϛ~8j‹DgM%j_+{Fƹl#0RGĵA֊Tvhl[>&Bb;FdJ~\%C7d覴8-DRq[q&?7/xaoQPTo-p;8*IS%Ή9oU 2W+}/4Bi/_䢳Ws%S'_ >a_к,9INǏ+ |XjxQ_^s̑;TN~@?%RgBu< z-BJGy"L-[jz'⸱Q7`0@ PJoT@Dpx [qmy+ԱC K"^.?,1r~LV=DFKw*e^D0Y,[*gFTI#+jaf4dƈ7mԞƫ[0o>]?ɼW]d]F`F`"gzXGR&TޒBDbK$O\&XE  1a B/=/': ewHRָP (ykyQhM7t;F{{;θNu_^ \xp}$\ 1?u.oGinECwfbEV$ԂWۂjrƧgE.lG5\cAA^x<SJp|)+NRݎCz D8}XMDXrQ(0֖b>[1aj 樓`#J #&W!&|u] 7}Or"<^XyWK❘(I-/K!Ee>Ad 2Gd íI1;,z p0)65)Ԕ◔ d\wKbOc%y8#»л1q$?a]H}%vV (JК6# Y_G c/?z5GgF`FMQȩz:m`D` lNEnPi1AmXˤ}Obq:mw0}ggA 'K 9`+H ߹ UY[S3v\KR4ZTc3 r(uv\'ՆC?HY͞O8y-8pb] hJ@ĄTR`bgXs-!E[oݷo %mJӗ,Yri֭/A50;v%‚? 0MMM % C IIIxW m16P w`&0v@謼LDPYZQ'&TC[+Dd"W\=3BGGh<O5_e&2 Dd Hr2H%1V6.&cf7(_pC.w*OTBQ ؆:iEd,dkVY.Tl\\\?wQ ${}VUWX!=` A?Fj DzXx%$&zR7x%y#`N 枿9)œMF Fm_sORn C%)MoY/d2 /!Ui/Vˎb |\~Xt5 " q孕xT6wXqA~a Ga@RGcDx+e1V)bT:%OEB]r-HUnjE_-BFZM k _gF`UzBP+n$FIh6 R4-U\/sAoDMZ4oPs(5=f EҜXa/H`nxxX"s_ -uvU(_z/op೙R) > #4P~z8p'N@QQ&++ 7t4[) >{lu]R]ĉf$\]p۲tv]PyF-Rz4sJ:pe^%yCݓDU 1Bopu4\5^fj9M.o16X\ӎ$-LjH!B\Y>a=0#0GBiy1*T[}.nwHu󄧋;<]D[q]ڊcʫ8"HXH2O>wan3r^$ڊ#ܘtL׆odH8m zEshۊHRX4,RrAf`,2cp #`iHy Y<4cYA;_WZrD{Щ9.y#ޝ FgE(尙 '4%En:crFd\vWv}˅2òUGdW'C`ddL}spsR{EHR/@2ڇzY)FK ˢ2#&t#!X}T@p$QSqs\vHCV?_;=èңBOąDrd|RqX֍#!JdƙF`Em8Z-~a!Qޓ2D\%B܉n=CB5nH"!zȚopI~RRLJT: U=mM-AR޹BEB!Yl$ 6:&=rj2\iPQɑ]:/{эؓBpN1wdFH `J4M\ruwC闫c#= IPtvv:vG;%Buu5jjjD?OHII2\|;FR֔F":R #*sZ+_8RT/_;d!EIq\LjáRk!}') ">x1BHX)yR^:;HDc/]\qetܒ44fPڗ݃r~=_<9%½KAxC4Q0,TgL1`s>ڄlN|w[d3o@gcF` -Bj $Fe-se0A^+m4q6sm@[҈mlQ!ў0&Z%<$H EȈGF%JAnh"9PjJ4 Ac}JDO!9a#9"\3ozƨfcAfQe @j&@dBdMDRfp&k`onCc24G'giHE۔\Ǥ==ܤ-7 udE[{֦ӂԐ 7WwX9)Rmiľm+A<5֪ yP )Rh %u4+j& 2 wM^kD|J9BU'(גtp+m E%!S0=$AoE^LA^~UE-Ngo{u\c~q挋Y1#X1.:\*Ž:Y!eHGj@xMPS?Sق t͊Dpx [\㺹qcWw% c72rVe]U- sxAJ@? B!>%8VkQ+o`bnrN7bF Z[[&{'|{]cQO%[r~Wv{ꆓ4'͈Lw}mͳSf%5e3NhΏ?$y$[R'N;P`{Fo`-6 e"ӵX13ިP+3T#bF*$w~D*I@9ȋfW}!v5BJX^WgĹ m,\b*&H-y.߸F<-ְ4+$Bpȉ Xbea~YK'ޮ$2݊[1#0 $s .KK4q-9ۥ^ _*NC.Lg|<0U8PRn9Ar >_洖nl*"{KN*x UB-nQH]S@!+؜  9">+MH Ui@D__/hccWl2A k1O~bffj`&l+v)Vl#02y_&w] mk,X_V0#0j1uejZݽ0%(V$."|*i꒓ydEa aV:B9$JGضo1Kwԝ犐Dn $+EAfq۲ Ć 6|YC7:P؃B>HBvjfDB6Rj[+o''YJ 䯚n?msNZ![Iŕxh Dbs^(HSǘOO?4hn$BJݎ;^z /%>fFQNk2e$;YRׁ8y` (LȠ!&Lv`[}i|H IU'+łp 񴍉/ŹP(&)M!q4"%Ty:*#DȠގ _H\ܓDUYçG,bY61,X6Fg_Uҽ}r슘ix$cϞ8#0#, Ia4XkF-(q}Cln P{ΊýȦ5ΐ. ͽ ?+94wBH焒=Vƞ")yrŜd,HT^1; Ƃ^ *[=Qp̘$Cb${)wB,wwQa =-iR|?|Dp!RJ$#ySvX RP&08Swp'~nhW%"E'/SCq^C> r:=y"((V 7܀o111(//=ܣGygwYmΝ8wRRأM oFUGPcrР A<1iH og攔BƟ Sb+ɨ 9UK[}_t\H"LF$bg&٘%ldL{Շp\oic8\eEz`22gMQѠDڬ$+im=_$3'O19\efq݌#0 0 yIA"1L!bx̉J̰$!z[K 5͆{+R>6HRm PZ)k[+Z.!I@SH ƶ"'c~z* bs"Pԅ׿>nng5@d 2=ZQP$(2αiF[8zUyQC켠RFV,rW"MӉD b2n*!MNBÑ#GpS _rrr0k,I [~=~(y0#`t er#;$?)T[Dn1ӟC@$%$/'DpHpo @w=H$AIv' !>a. s @ %/ǒ{^Y5}mx))w6Ops+.ԍbMڜdGR><hncIn߿q>!ׁbl1#0vh@ z)acuzH<<Ðh@2-ZТy+TКOoFhPCDn #u7IJ3L* )j.p8Mt,$}y̡ѷ4g<©\#7 *bD6DsdDf@J b-Ҿzy'҂@c& @~ + ÞK(H úYC}CBB@ܜ!;E&hi1MAp yްaJ 20HWBccRî]-Ix(`Fps3y=,"RN J$; p,rjkr/!BBTA%'>iK1A⼹'#Wgcm z(NI 1ixhv6\Tǘ0,GZᩩk1+Y'jmV+iĒ+4w/JqtYT&r Yng[И1<=yyZc޽*+*|0Ej|k,uDEB.;4QZ Ndmzhs!ӕ[G~JE_KPm|1zr[J=}QNKFΏP*65&aQ/?{iihG"AΟ(}KIof`V.TtuaC[ qHul#@a\p!幄c#@sk_(TNh )4(lڵXh-1~>>[,j,; HAx2k &G+םv^ ' \ S 'Hng#P,aRcċ6PP ;ACC _oƂ d+'?UV(R EOc-s.!Ia[}>ktg6j?rR!UHJ̀*9 iz\SzFHXzJϢäoX`09>9'5ܑLh0EU#\D$Ю8d-}N^~y>zGS|B Aq6]{ꗦ9E* "41#>3L"4$F *;jg-$urš%˃BR{(E@IDAT,*A"#`bP/kVP(}Vӄ'/KA_]|~;gG@r .e.1CcQRc {DrT7x]u%3UGڪP?+ֆkk$/\~J )Æi+-@X7jD6S,A1#0FJO^fܰg] WWNúY4:.g#7^Sh@+IALng"\fkdN<H 3_"32/OhAsCc+6:appP\2)s u0#`yL¶UFOV\ t;x&(QZP:wۜz-NŒD!7ɟ w,LGVp^-*+SOy&? ^m-\qW"ܘ4PWkkkÆ ƛOJ#=DfP$RCNNG }7ySIo꥗^RNBU[BQaDGG+Uꄆ{4(׈f:m)i,y 0PJ N'.&!03%_(EQpӓÌ*kυ1T'H@J/Ιߘ"TQH˅@ܢφps5}|*Ų61A ::0݊da.)f ^`}:!,LdBCAAJi; ؒ[͗,ƆaAf g/߾ƛ٫zjV"gu~F甮dm=p}Tcun8ra[d?v 0L䅩@^Vk\`VDORG['e~&mT[-U('&ϗRCDn&b?D~,s5½  "JL ;ヨy:hGyϻ-]/ߙTf$cחꀈ/@$qE>HaҤI(+0L׮]k4KkbΘ1cw{DeAyrI-=tYʫƃk!._23v@bDu.E8?y;27,JEV/Cü4lҊδfH"7D} \G"D$"bKI0>/C;@~}Ԟ[gwOL3i0OxM-ϲ>: pdf/5A7z~OΆ<8mR`HOO?ִ3|)>n êr5F`ٴ80ׁcg S4VP~Qss<ܔ#ɶJ,zRlz## *#1cuhW]TjAO`&{˵^ "@ u).|p(\7^IKX@8k^Ahhooǟg4uQSN1{Emţ^V[D(?}Ǯ bc@_Ouy&˛Q#;]Bq4S9.=<}'essxV>q3׈#`\; BrfYa.5)WJj#Gnf;뱾d7ګ5gr630ݖϊrZ ӤCThpDH-sx9sdus޼yP***P]]xYe͑ׯd"=mfhnnlߔwT8Z/*zR)v@K]letDS,̰9w/@K96'%kfi;#)ٚ NOnhR%Fj* 'fƤp|U{u71gr)޷a(T=bIVBAe j"tWoaB M?ȡC9 @T("E2ᠸ|x|m۶>,䆋hii/;w;T9FzB6AѯQi<a6F1|/G^dӋ6t H#1 _u3 7e5T oğkfο߶mû{)┬mPX%\8L,&,Dg"Ä=TէΠh)9([nnU UW]Ц:IB&4#d/U@XoDbXH@e8'uqrQxG2W!şeZ▼lh1mlp,I*/򇄄Ⱦ̐9Y@ lv0}wY 5bcc%ʼnHVژ*@j $i?  ώr?=gnksNIrAn\xYvJm ]nS^tcfb̫Cf+.+$pF^+O4^$"qnˇN`B0KG?jػw+Ac=իW+]F;/XK/*z\'l#L$Y l=#@}םj #CaPĖGnɓ'"-)[0 Xg@{R9!wtl }CbAk[ф8>?QgC5qOC BG!}hhT2x@o޼y"]yǺvHUYEEEEH׎;&<;z ղj! sڢpOi<,$ KS&?4l%[k3GY#ڷ2Pac|~G̲Jgn'M\-iAm*umux,qoԀ()ZDq?[kUsZA;} , ~bTaI ̤@wR0ow$brlPepE[NwiC֪wBSz'0FE8WJYiE ԁ.3!E"3=nu< LwlkHj6KW~cR# sڄ!Y_|4`ܲe$}HPEO7>>[-v@ߠx7YGL1#0 BC:U' mSRMVLEr|CrO8~Pl0lI=8*ZP 7f&BaE9%Cu8V҄s*1;5b4zѤy>Xz!.qvF .kiBI2Pfc*5\@TT4iM~Bya&Jx J_LL6 ggrI,HHUSmd0JwHY@~]?],z&*71/l‘V _OĆyiXd]CHuN 4bsMjUԔ[!*yFrexkYUy13 B<0b Dd=T6F0Ѡ0"03%N0Խ@oąkD MGmh$'㦚%"oK^f< v 6؃/+IX0(' 3B,eh5EC'o=~]딶ݫ #.DG<ԈtF }d۱cJ3P!")(ŧ~ 349HaNYr"ZjljG@ 칊9!+؀fC6MhFx㩤U~7GP4et媝X>ׄs6e>j ;qw,NT}F@9OesAa4#@e>ky@?cT,:۸Mϊ*==6V0DqLl#L4?#ziۚduYL*G &Ic EWkРlYYY%UL</Ҹ*D]]&fE6ݎ "J|| C sIJ4@wЄ%$M1W,` |[E)&TQ{Poh"go e-x0n!|߽[cG?,Ș,(ںѪ4sHNY9yOXjvӓ0g00h-im R8 W,#`d%b_#xjR!9/#0ANܰ('܈I,eLx_NnsC "`21cR8gN^QSrfv.h{ x)oɗ#-Na|in,-jBmNdULȳ:4`ydE³a`2mK)R㐙 fyR7A ʄrA]aI/B //o1}tȌ!& ڦNUc:꫱j*BώL#p믗{% "CʤFa2I%ͱ Cͥ zH Ƶq<2=IJR0z~0S\ 2d݊F?}\  &*8+4-?NZfKMm0Ð 侶  !Dt |vy_N0Q .K+['3!cjz#/Ww<2u5H=Mz 1({!קLA$BCCrG(Ip⚮1[A(z-Il!8+Έ A!}HAc8/#X3oB:Kv~Ψn4v*}E8`_^;zž\_N(mYbv"\E#""BN5G}PBz~!U!WR,0 tww[lBڣ|YР|LCicҶ+gǜd. ZIZ>9<_u֍'|?Tmmmк_]UY.TN;hGaDfPT\3uNh={UT>22R%}}S+ܯV5*)2Ld""lAckVl?{P׆g^7Uv;uQ[MXeݟ.=l>Htv ɓ$P-W c)VTdQB6yߪ"N>-G_z%ëw |?.1 +[Aqn_"Z9!= PW7ڿjN7;_؛{l?QSexxtDFPRمB-jz+Nv׊>S^c 1>锫?̠@x]ZZH-) }uuBAYYY*H ei!,*"ٗ k(%&&*vͺSp{n 1g`H]wy|<]*zD|sxf5`2: ˧Ǚ3'$;@a}^|>yt iw(#p{OS'/W9LfpO}b ?JXF~򓟨W kBHhcG}u_?K|;țRC[*gɓCxfc"6q*@sPYYX@D{3f4PXAAA%c*h9 \FeE y}[ QADɤ\JCww7***oRpg x42[x?Zdg@pu"@`)|%U4]%Hg&"3, ]cw `s` 4Q|Vq:I1i]jݗ 6HA2PvUU3244$P?0nVоˆ?Ieoꫯ1OH' <5Yzz:}YjF`/addԨ.2! qaBC7)vN cJ\0Ri7J~ BShBV><%_Y͵yg~t&}RQRtq iX=3CARѶlmý8^0eRSIrsuLPX`C`JbmĈs 9"T#@DGGK@o>\yҾlܸQtZ9ݻwcŊ:'z{wC-&uEvMD(PXXXv)oAsF% q,_\=%>UjժUq^~"J燧HW9#䃟2ol:VJ Bu5`.}[M{(y"I`m? D'-Жnχy#* 2>:9)*Р ;OZQx4c5\]l{fK3RrBe nfV+**wnv2]9s&^{5IOс=F2ւLfP[F`07DyQ1ɣ|ddi4la\Q[Z`~ɤ7&PkfӖ!p/al('>={^Ǜ;PҩS~r.|YyLY q>!x$c%_[&3mӓ1 67P6B ۵k>sš;v8tP̴4뙨/uWW>j& \;C2sWWߡZT(+#PDADj.Çdzcҥΰsc\yJ]%U-3> m9uy:"5DžSč̠5QX ]vQ?oI;N4K+L*υ ׊bhlDk. YZTkc-|  9vs36Un)ۼy@I?),ǎq;VQu1#0}!_br()2N;A؎ q6@!XI㎎]7 {恛rpm,lgGip;UUhdpW5H ϊT:oM>sR$f$J&WXUWN_@z77-NC(> C;sύ_&֮]+{hdd6mU6Mmm <&id@whLaoLq III2eN]]ȩ8Or)Ǩٳg4г{Wq7)96l"(۵^kBrG3W#SyQw oYqR"<"X}cm'!TzUן ksw1ݼ(8SzlSB1c+h|9= E8Z۾xrםi;~_)Ag! *u]*ǚhIDh/@jǠ$#0s"l.fbPtsаy9uz3 -t'B[潋ybٚiJtrKMk kgʸ頉O8WM_+7?AAz`4½ 騐oDZ2$N޲ro1Sq%9>r|I$] +ZtAN]+3 *ÙEI*Ν:K{K,AHH% ҂GJyf<}h_G|Ɂ$99DUU  |csZBhzhRSS#1CrɸJsRe(98-Og|g @ aFFP* *'F ƥ BaP p|uS|YPի[q3OξށU1v:1)ND|@Ƞw.Ef]rhmB)ɜl4cӦM'4 .կy`F37y>f0L1\8B`*)zsjh Ah%VNxQ"V9lɲS#L"4xRVb-umP+rp>8dA+ ;kh|IHIBGDx؊}WաŘ4)KVmG8Oa. Ӑ#T.a>p`= @EYGl=^Y)1xֹ;V >|^z%<#hmB!/?KABCC!y5R1TQ5ig[oIYZZ*%~&ahE&shR`KC[( A媫;#Fl8xNbz|, /"H"AO9wSpBg{7Jj䢿PxZϾ92BN /O1ti֗EڛmqU SNd|NiRi R3 ^^^͠l===ㇷr }Qy`F0!^xCjA~NTY@ywIS};W̎U/o[1dO. Q!hh>jkҧ3$>Mƽ_>3>^fM\E?{&GqmNڜVڕvsBaI.6`1\u6`,1( $vVaAڜ뷹MI;3o=OLwWUWwsJmG1bBoQ p HeECO :Q:O%SeYIN43Ø,6DFɽW͑eԻ{xe eE$S?˺iI+!@ XR__ng9%<]b=#/ڵK,cey睧n(g4o D {Q-Bb/: \r%nS{u1 '+2Nʫ压JQDc#Os?y=Y] ;Z˽SV vbPBL|򙲣^>Y%k0")}ډi K7o00I>C9PʭuSi|8Ȍ|>k)h &o|r;c$@$@!H G6'*"05dW:mi,lTyR\^C[W,i 0L?EZ?oFaYYshw)r'IƝZ(Nt{ n%t*f0+D+0*U1L)/aԴȎC֥ R4Ԣte7ʲx. ȳ>+O>/8{/8Jg,BssfV)l,Po[{}yNOɓ' 6]AԀ ѣ榸حz& .W>=K̠jW{}*N~CHq)āJq帇w*_p\1f&;3] %ڻ!-)Fb"}>]c2:,-Aeo2nthMj. !g `${Vσ'u!aʕ3B> 8dŨQ&VtZp_pżQ'NWj*֡^GXi0Y5\),=͎HHT rdj L/J{|r#')cN` 20{-+HԣB"il_UFeMr9v pZ<)WV..jGlNں3蹅4LeNO#beFB$(i Er` @(((P0555ԤZ* + iff=eIHA<.vټNL0$+m/ \L8 o.'zZn9p̡Vk'&*GZ=68Jz<.9\%Oί^4EbŌ8[*7˶'bOCJB">IS*K2bߝfUo(b aSC+~9Gܹ'qQ.ɀKEetdY$_1&K!66֘dB6Uѣ   &P!5M`4OiR<:JUsy6='?ydPŴ .@XQ" s)aU H TP`? p^dTÆԾc, }[3׃O qj0 1ʪWKr(ɔ1<1){{e{Q ֖#K쬬;*L7prlR낢(;I*쬒,t)b#圜I[B6T֨m5xLoISdt:0D1Mx%w1pEyk˒C=$|jnŋ3SO #@IDATIW^- F6C$@$0ʏ;Sؕtf,{<_i*;N]OLpL),45d}*<3r@2222!HٴJN]/٩2W+q` CxñN$)t?4тHt lpALmL@qN|]*(ϲrb+]2]Y ޤ}QR Yjii din jT}"34[vJbmVL`!+%NF"C $EɼbuQ<ת:UC"r8ҡX>uEw:;ߒ"$7.E 6iUH{LⓁA:^% hbu $@$`r=^nە\b\h=$Df]-YS)?ҥrILqyHn!XӢX8-$%%Itth>:x2VIW*cv&C}uwEɍK'* %Aưmug|JG?N9'̍bcpNphA.hYY_५\Azjqu9=e (X9٠LcR|-DnZ`elg' 6nE7 "DID=p,l> mݽԪUWek G{maxr>>:\3WԵ=)oҘw.Pl,,͚hyx{;zTCt+j ʿ /~!`9 zW_ LlOwksZ{b"`ez |Nb_A(H.LXr>ĪO^zԐ:{YvD*iH X<{9:c2 XC`oeϖ{k6Jo?,I(u{\K@}Ygi}  NihoV耸==+]|gtbM}k]V0}|w# NR%p՝1&Af)n!eUz'HD\ xUv:ᬎzw.CV| 7$xE~'81VPs'؟=lcWHIQ6o%:Eemmmmî<Δ F~^OMMޛ`[0c>QGGtw[OfeeQaCn:i@$@$zĂ/^$qI?{ޖE,[Ku4_.֢~gxJH{rla.Q]9' d{ lXV)=G>ľS<UjӼt3J&&U_hA%` Є& ^DEĀ!t *G;ȃHHwN0>>w2'p@>:!&ok::rC?~=##Q2' EYI^״ stPtҜɒ(xE:/xk>"jX)eI^I0`y7{ߖ!QX?#ds %էG^d%f@Dp7,{QY81GOs4(h0MSf!`",G91Ixd[ @,iBXs;s/c/Ҽ$rоF $@$@!45C{ud%FUU銬#\M($@$@L$7Y%ݎWNq_mEu6:oSoܷyN$ @[D-%K_HNN*n$`[+dKs}C6`vwPР' V;(DŽek`9 &mH=qW KmްyЪ%O$ {t8_befqOL۶!Gsm\i=l\MkLھDݖm3}"rYg%-O?t$/+r}5y1  cK{T@!ΞQ`K"λQ~MPiN &+{ @]O<3Ž\ =迤ӛ';mP0x]նHqA~PYY)^xCؖ'lZ??nEwyGw\F47 ffW,ß?ѣGL1&C6Q_ TÔ;V-C}2֗&rdlQvv=GX/ !?ON}6W]&Oǣdxϱ\q7Cɓ'aC8 s,/FC4p!`9a1@__ m6>XD{뮻dgG*))2vX\y YSdۡr_wn؈(y@q'lwzVPP3es'7y?+Gafj==-9gM̊9!70(UNbZ0.cU9rB\KO039pm|[՘Q)fIH `r7%%k,acI{{W~G/n&7oq\,Jzz:-$@$`Swn g>"Q&:kLat( ŋeLb{)omxZnD.+Kx2k':O/-OLx|kCb?))I]Pe%I@S{")ql%]<(z%X08 a]K V@XK&vAOzIFEۛ¢yr͒ 2 }%wvωGI{ƍI||>}> / uW͖>/Պ2+0{N2R0O,lREЀbl8yP\2c G]^\sb Ɠxo\ *' n!U>n])hTfIBxi*`iT;'r@4Xv IkvPuCl;k>J )2k|'% )AiCr}\cdbaZpU! &LR0y9   CN dCy=$Mm;0$qQR fe͹lCWt W&VD o"OeKܩ#XR^\x'099OVtt:hBt( d|B uo=iA2sA7ls'LHFD ƀ%.+ lIKKvWYs ]H>yKGٮlC]c3I,#+FEIrYߥ-@lR|&Qb ΐ(2 ӣ3;;eHH@NZ\xI\+KG6,M`f۪O:mebF ?x^ۡXoq"ICnDp5@N :2\J,֟|.h82d< 4D :5{/LCܠ OŁO?CZ;{?]-j[/IBL<93HH41-9,Be|IHHF@V?Ɵ-ţ-=.Z9YE.14ߏmpŋ%/>i`;~ejj*ְLJА"<.r E!@ 4' &01 %Xqj7S0= g{q;zt,sm쐧>L% @1C $@$@$@$@ $L~ H[W呝Im}2b$+(LH̖c8:0h\%yze qbos7Iɸ$0zzzL /˲zj"@3uTOW<  /͕9c嗻ߔC']^xԐu|W[.+%W͗ё1.1kEъ&9LmW&DRUR(;uAS\iH$;l'H$0$Sj<-20yXG*rAqF ⓀD \p5b3p_Bk…+ 3Сw`PvG[zet|'.;i x̟U>LL$@$@zRdFÇ瞓;vVկ7ҟ~?3⵴ȺumΜ9PFvFD   Be",T^8At,lwȕccfIL8xҀl[JrTzf/-,Bo,I@].886!CQ54ءTg֕%pbi!/-A~69X0ybKgʵEM 6;O @)d0{b ͒H >S-o~vXڻlV6;(V:or񒝚` V;~')hÅHH|K !!A1#<"}Uq[[[mw}~kڞ߼y|__Wg{$@$@$@"7%ҋWߒ]MJ9+;N^"׍[(M.,t] #wcoZc]';x;e< $B |9~5 Qr7\Mx`Za?9 *< seo'+e^[+1d+B<# b328s@]lEMUݡ6_flR^\MlpL):\\KUvηuWۉC$@$@$Xe P1Q444=#g\ݙرc3hWWW˷-ɵ$  < I9 nWm].cr넳嬬RiC5",NY9\С'!IӘ5"\Ma{N2'f9l'HW-B-Pj-5o +"M9 HA cĪK3h%Y9˥ - ?IHH(9Qk`9\oRUUe7n[[8FuufPbԩ)UV 3h^{1뮻C$  0Ht,/X#'uDO<5R w(y;mE|n4>_2gWπ= ҩHx)+L޳ZZ-':I.|0`vZ0֓u"  |Ñ@ RV`J˰a6hV4m\: + rw<nX`eJ&:|ބ3M~LK$@$@{& s=weܹ2sLUY~lڴ\II̙3G??XBHHHx J7:3[.n,kJorQt"1ǖ|:d"L4.RDs{YlBYP gMΕ掕sCͪmJXnЬ8h.,znywCc[|FΞ?$/Y7{(O1 sɪ/xC&yC=$EEEVmw^}UC?3XF7!m60~m7iIHH/NiveDltRſ63'Kdqw.ySi"aHN[ǷGurIL WD6+.Y='ص(>\jqh<.txUI}4hH{CuC13HW`X۫a$Azs] *+Vs$/=A78 ? r,rg2h emb$7 -3&sBB`pa\Iw RQ2(*Bz{(R:}0Z>P *q5{ڤ_BQvaKv_)t966&  p@b`x62x-,Xƃ~Cr饗Zۙ2eK:9x𠽨;{[ZܰNzvl?tR;O#ʢyY˵cJL}Wu6[!?Ժ^^f?֨e64ye5o-fcw "Z9'B0z:9q (hp'IXB0@$0Zu]bSB.EСl<@ЧT"_{N$G2RvJ,kyIHHcxLII0`Asr`QB`wԩ~;vչj} /tȯ_" =EQXJhrY׳n+07]7;?)/$CN,v,))G|D\c>.U&s溂2&EN5Hu^ècHMcKG*OKKS,'AH`d x1ܪ0-1YiIr3$ QCNZܲtDEQ>wF$@IbT VAOz[Z3g͎*<%  xgvv73&{=K;'.-Ef]u5Wɱ%'tlg~l(-[="4VLs'NjH3Zu!%Yͫ[d'2@@$Xi>)@ϭ1@X ;{rirGbd3␲ i\  B9BF"0y@$` Sҽ.HInDdRNZ<%rU>Y%kCFIba|"|%I +z.'3   xׄeXc 3Tаs3=s39:Y  'x'%=wA./s+G7 7H`,N 3>ONLH,]flezJ8}lW}MYGkK6GߞtF'H{_xr0@$@[7@ʰ2K@i~dK]s9-2$&2EEggtuuɩ# xD+d fJ1 zwyV5Daa1g;`-wHH"? [?kph蔔W5̒Xwarr^yvdRqRh\7n ` g͕`ni@3jUX?] [^' c\ ϐ F 唔>,HΛQ('}osl w;-h†L <"D$@$@IKKe ?,+X=L&sεwc벂WxHHݽDwכU3 eIFtDl{7'|(C[02TRQu36&Bn_>Uu;#'zt0mĨ0ϩHt{aF&:b64Q$`pkY<*V_cHw\dROWZ9SNЧw'̀+ gxHH0wO+, }B(8rݙK?#h b߾}Vy7j;$@$΁ شw|mZq !1.'||R $Lw//-3#;tdli8,N]!E .Ә-%'D˳kʥi 3 &Kfrx#}2#9Vwv&H{JӢ2~/KmO I71: :qP)FEC+̇F,cN;6 'ɩ0_#c)ԘI 8c C&!pL%L& P'%`B%Yf&߻f,0.O gI`& G琁HF,5`p#Y^HH 0bbbL* <OvEEE1d*\p_~ &b{6NUO{n$FO}zPr~b\NzTIVD #pND/yKv4,]co<ryldDsƒO& S1Ҥ).&k:b"g1%!;֤P6O͗%Sua$ =C@v ` + j`  @@G"==]uAwc k %&&>cH&!G}TVZ%/i8<<\;<X'h{/K)..vH%^ikksp?{{/͙15`þ;xGl̃+!Bh288(pUk/#ӊ]5Kt**ZWDŊa~i'MpW,7kGu X#"OXު)LOYc[dkae2&^iK{mb{ ,Zoʀ6.ߝpD)zΟ߶ 2c`.cYg}rhu ض }}p~g&ngl x_mX7gNgJ 4 VA\{.O$@$[3's3/LzruɺuѣRSS}ϖ,]LMMU+WkVlYE $Y oA rrNcIp`+(J*I0,0B XhrL\>7_.'mh_#%)>rؽm' RK,6KtC9zp^sfEM8y{f`hP~ymisE(V.~ 7@ų@Owۛ(A w{VNq?S>;&X4>  &iXtc`4.KE$)uxey1 1 j1KR@|pxu &O,cƌ袋"v 0m?D]2Zx^Mq&4 J??9_)G@^lRyvub3jO 5dG[>fFqHuv|R3;h|91 i)~B1U $@$@$ Gvl|-`uK`[OO2hqc#C9477[oCWt~[^s2&0=H~+OX֞,?}>ÑeWG|e$.½dLZ#?s)+:Q)H#[mas=a|M-  6-WB!iQ\7y{7u :|LxcX ݲC`om~ ,c'd߱&ijȈpH^L◖&|I7SBxFJZFDh/m) R6.I|C 99Y]ܘ @ `P֑F"aP{:[>:('h (CȈ  fi0V_Mvr 48~d?2Xxʢ}H{u;{KbeZjN@hN/*V \8 1YWJVB(r\#fioWMOhoo?Cݒ4* 9|wLf_ƈ}&OA3:u\^o?3>KnpI:|0D  <C݂D' /䀩;<񿣕r /bM8@;g\0Az3J$@$@@1YC &H_qD9agMɹ=ek:&\V0KnD0[G偭/J@ӌrIHw'NR4l-IWnK9 81 @Q>[Fo_'[^4U R&C`K/\!p9@H4S,#Mf")2SYV   ܇ 1pR6{@؀g đ̫䵪{GA͍eRrh<&F-/qE(s;:Gb%)f!&iRU 3G{.7X$@$@!J``pHxcbK4CC/o>p2#w |A;D&1Y i'ꛞvp@(hgIHB&d2\PJ~B0}O.ΖKԕqMW|oӳkoOs] 5]/Hk,,(B-$%%yj]81׫w{~YWy0>Рc '-4]G SefΤpxa/Z pB`ӟ'* @7j땦PC߁AqY,F 97o{5kp (+ I$#@g~`Uqa56hkkN>(T\<:Fy:y&qoS!baB'~Lh;/!ѡ3DWri-“#E?Vzq=kъ#,%cetIN0ĨXe\X[KRw? 9r}\Ɍm/ZHkil{Yv48w^Jn" \-u"?qqd|x!S,1@[$e^HH@%084$m=&kwVFM6.CΝ^l>76J㢤ϫ0jg֫JH r)))0ÊTwr!p4 꿎jCJ+ZcJ  QY//׶VD }t #w]!E@HnV?6>PWo+b,\\qBO=G.]PE86В2RPPW6{:jGߐSڤv6Gv.]w$Eŧl0&BD o-r @(j&nit CʂwW ƲbdsUnJt3kȟ+ޗז3N ɫ;ec1ƤefZSvD@}a@IDAT q8 #c15R,ZОmZVLK 4ԙXp 0'OT˽}hW`[#Okeۡ_8{? u~ Ī)=m LpFFn $`T0o Fm!HH7.Vo:iXeHOOA&@A2;  kj[e!NVm%pթ gQNXtcgѤ\ q?Yp&X]L8b〤ymED)=K p $@$@$`F-RY\jb[ k= {,ĹF<2:(h2Ա̫侩JbAoD}vLY*Ywec#姳,q5ƾ1X["0yٲ$@$@ ye*.% X׷aHi;;!-,JȜÊwL3:s 4NLLT-6P`v 7%b֦_7  JuÙ- 4hbpZ^r.`|3q#/~,xviJe’2关%LY)TPu||䱊5i*g;&G;\ƏRE!eI[yuy1F& $@$`45a4, 9NHfky _,R<2mu-;.\@rC:%$m%q[[tww[ LHH9G5M4_߯n6QK#B^0XU# =^@dR?455 YF 4zXQ'rb.兊Z]M?4(:EV)Β+]iiHq1'V&L_)yk$O,N V k4f$@$@xO)O'xw 8yl.SBFR*f(+Ό=FThoo:d@dY| z__po01%e pNbʊ uM k':X=''t[X'׷%| '&Ŋ@oBYq'ɜ 30 |N/2+-KMR\(jyyg6%9_ϛ*ji-`Ovskjv \M qdzjA2ffI(h0haUk&[n=ĩ>>a%;;{/⋪9qO>}:l=4$$b"n f1xNB uvvzꞥ&aBc* |޹2CNlBY__I&eE{]] 9pׅew;!+AC~hNM0J.aH#XjHޕC)?,X?oŪ;awqdID@PN>[&/ VS'/DὖB^3 NA]'~yG_,Yħ5K'HH)qRI4 0`n%M2TDG 2%}m0. 襃[cbJ&`mΜ9VWXtaa;$sd*9Q>/*(]i+)n T f ~Z[[^ܱIa_W%` aJ|!T+&*?8=/TT4Uذ(kdSCOj-2@.qg2 ԘpW 02juRg3`0sϕO)>@]*?O)R\P\Lw2 ϖmOz\M7GY`. ?d1V ( % T[OC"1f$j'c p1YrDD?ؙ-W.,,VX~7~0W\DžїH[U;gFL,Ls+M #CĀIZ  Y/SǦˋ)cWۖyfI! S'͙X9)+nzUu6_U8bC&檟s$.q@5VR+:DcM1*\2\?A~S@$@F'@AZ+Y~iu%VŋW\kৼD,XXvzJK}̓: 'l\ynL˗-J\t59_姉`!h w|b;1j&9h`E܂*Ld12}X)!)lg.,,Ew=.,`Em@_lcǎ˗T-$Fqty3.gMɓ/.+"A芕 $@ h16-KۏyT(>A#2,\V̔o߮X? mWk|VHݐ?ƧK"r(SD!+a=xgTZVz9nt|{2>?.=*an , .4428 kơ9 5ɓ'e˖-p|R]]=7 e  ғb%‡FMŻ2IJXaO aK7&1N1Gcbb5r0BaB>`K ٳg[U.,jjj-;XZx5EgQm߾]χzY#(O'/r@vV;,rB\D斚gr "E!l X!L @_ W *;Vmt5NdD\,PFGcrŊkǶ+G7{,l K G ޭޥ1E(s!g $@$`4JefqL12cF˵ʗ ˻5;4&uJə$c'Pw3HDĿ Xh)bǛ/&^\iI@X(la\sREDE q;F*Zk2XEHNҤ\)KQ\)I̒H_dRy@L@$@f$@A[͢7oX3fվ;.JիW VX{Ι3Gj @(t|3/X(of$_Z} 09i$x$&NHq]R㈋dmf%!;#^k][` maCh]|]>aႂ4\WK|E Xw{)`oyHc+hF`uA0~ H&y`yӦ `8\㗜%C&䫛?Z?W`$@$_4_s߱c tN8a5Х &WVV&Np?aiM?˽+~e:\OOڗ_=Go[}et.Fƾ0I`\xȸ탒ar xwB"1c0nm6ƥ6r%d]WC^(99YOҐsȇ~ed' @LR-kdlm%fHg9ێ& &8 O=ՋҥKUD Dn%QK 2tժU}f7maqHHH dh 0 3o/LpȼmȒ/^,iiiبH\Ag|p+kctT,)Vl^P'EKahH?тHLOf^ee/2 ]vj aʔ)r뭷:pu;w}W/_n @VÒ ͩ1 s5KK>! \r;>+`.^*HKK%=R;auqt"5+( a0_; Sc@X0 );h0`֠O@,Z9#:zh:w'`Vw@싂,hx%@f4Qܹ7$c>y13Q矫118ƌIDM@hvhhz_hۿJSꜪs}8Uuzԩ_1amoA|Z<'^FId{&]-"/cǎ| s"K@ fH&).xuXcxTy[_óo镝ƿsmWN&i@)&φ  w=<X~9r$\5H@{64[N^z饐ṵr~"sĮ7z.\(k׮a7sT> zqIhԓ8<eϮ&2αVHc=Ao Fۘ%귂GccхY^ 8?41Q[߫.J{ Lp^:'׹YpjmIF)zi4xKLn"Mz Лz)nzgqYވsail43mX3Ai ʁnhp+:<7# h ȠO} k`zw̘1V@COh @@z㷪JC_@xM)D*|r+ !mC4| ?:-Kόz[6@O "@`  ^j!/YtIpzk H=Z =XSi@@ Y)ACPh0+)[/:&$*A $Hnsh$VMv/ۼk'cίG}Bn;!<D ga~@ Q4x,}-zK=crYz{3fX=]|i4l4c-ՅcCț  =TTTH[[ @]똽$@HM}Fk̐KRO@{NTC^c5Ý4Ċv (**3H +QI~C"׿u3fnAL=Dh^'Ox v 4"  5455IwwwtvTzCC/9 @RW@(*//'!u>an>l綊Fnhs[ G z*S^ vx$Q>d@gg̠csI{8`geeȠ :q4>Qh"C/ka$@@F{d^Oib  \̠|zbJv C~^_vWymbJKK#$X?/NV`o}[F$0cqԩ^z{{eP9kxbsW@@>]#s>BWӀ[A $@H]==3[*uۘ{yTW\ܶW@<7 pϾߞo.<''G>O~vuuI}}9kDVWW[ٳe֭h95Zرc{b=iꫭy&@@߃UUU`y5~lt%Hb$@qF9vhwŘ*4kpy}KmLۚ͜PiN@'=%!*@@C@Zv޽!CMhjkkQ h&;x2fO?-ڣØ1c ǏGQuy1  B@/P LP"P3 V+/ իWɓ';z-`HvzFRVq'7>e (F_oڋ%2iT<Sr251mF[@:9[@on?ȑ#)ɧ w8uT Mbɒ%rM7xE@H@k MMM1?Qq:i uD "vڐ`at5Ȕ)SdĈC}xuȑ#媫:ER:g~D ȏ^*pg'JQRA GG/"@ 4u &} Pv%/58˪cN>]nf# x'75TPұI M A $@Ν;g iߟ+W4e0|K瞳^}Uc^ *9~a#8-F@)h,F@1Ĕ7@P4hٳ(rN.?f%8yd&Z @@I RYo .ĞY livC$@kAoo`7h"c\UV[[[e۶mFP}=7:ƛVOz+5-Cg1#1Zs#]=an3NnrJX?@  $ާ 'MdKjPt@@ ezPMf Ar!'[#@xi&kԩS&.\h OaqFO|uƍQ/ b=:FMؕY^@{c^b)#eR_o o-OK 6\0Q3I@{,H @:АL@@R^@oŽLjw }%Ң$x(3o޼r_`rQ;vlD~k/̂VOLx&7rP~ xFJF$%=={YBeEy'NW_*GZS{.JIa^"y}89 eH@/82{I^  (O(E}>Ѯsrrq+4".VB >|8dY̕'{ںu' 'NaȫnǴ7G{"!@z h=q9WgB_o !k\AqB4O{g !$N  𯪪}r) z㢢BfHd8t萕tCEjjjBO<fa1{}0WjȉӬ\o2#H:=H[S_Pzh@@@BǗmkk_ZRS4% @ v/ZFh.$ic ,;{I<"}yyЮ]r)c8% =z+ȑ#,v9dy3*}sH ؤ:DzQd~y(3 #  `@/E j.Eg޴z< @@gg8V&`nf@CCCqIAfeٗE3"{Oݻ7l[l}]w%3f~ٯ`OGt==3i5i>7=Iᦆ?\pWK@?sxfVkLp~Nv_ pm#`ӑ 8Fl$ZA6'm"4  ).'Ԡ7'~h|zâ~6Fpv(}:ޞf3~ӧO|4oMiӦIuu>u ~Bmnn'|RʸqBvz1x;dVΝ;]Ĕ'SaMYu `HEAA Λ,-mWc#G`6c hRdOwW$R[C= v@@@ &{`yl@*F  8o;e\4Nk3M2EVX1`O=: /`]4UVɃ>hÙyfxMvxV A f`\22"/ǻHz ΏO@@X@oC}ĈƓovEÍr­&#k~:/ۻ k89s|0A?|{3]fn'N7xÜ5^Vϐ1@^^DۛH;aHj= TпDA`ȉhGj  kI>٤݈듷ϋa)4xB5 1ו @!77ܸMgwn//]T/^,yCC1D 2eVq~mYd5zZ`B\>YYYwj|})5 ho~|NmrY=%$sz~:9[Jgb5?'z,q.c`Ўꖬwi5YʭaoL&sm`@@ '$zʼQ5A/Eg^\ ^0_3 x{ܳF|Wr-SMM/ҍ.\(k׮X-..6b=ި=zoֆ,W'͎< Eb"2:u*44mfqر`+mw@V>;{؏ m s;$R@ic.MJKKŋcxbCwMtgA Kf;w1tYO@Z^I?EO@wϊMW &@@R@ \@=A5( ,M> HJ ~33fР֡'Nj#UH K/X)!F  wlqM \STTR2@  B@@Ћ-$@ 8/755EUH}"L4ȑ#͢'OSVlBfTb}cTEg3, ޽2Y;c o    x%ctorGWUUE:ewJ. 2s$A)"H@ t(Q q;' XH1RA    0@uuk5al3~xs!U>uuu!;{lb=C ̀:7!a!D)G#ீ,3@>t)@@@@T=zڵ˨?~\Ǝ Ygĉ!Μ={V{1imm .ɓ8p AgbEC.[@ cLgggy((({Sy#"@ R@@@@`!ٳ'd~ݻw6Ҹɤ :q/ ---R[[klΧROL'm ीJegg{%y!!BK 4$yR|@@@@ qƉiÆ F`9?k[[[ڛˆ#X&KSZ7o懚xWD{0ŋI5( Đ5>IMB [ۏ?+fۻȾ P,ot(}%!d 4-D@/K"   > |s ,V~O:SWW?}5Ӎ7hN{zaښOh/ [ni4aԨQ2Ď;޳W_m'YO~v'w5 :$ONyixb(+\?MnbB)<ѠO|lv=@^^hp @ MX   ^+6m:T=X"bSO- &ӭyĉ'Gy덾9sܹsny'dٲe{u{zzd͚5[o˭:hWgH!q%732H"]`ͦOz&3XklY1;HqC frYOk  h'CME( MA@@@,%w}'?co;wzH&N(GÇˑ#GD0p}yr19}hz駍^ƌc\?~=zT:;;CCM̛7/d}&HO Ht-WW/O :˧7ʣ+.G  ވe#E`пK}(@@@@G@|A* 8p@6l ! TĬԩSeY~߿?$A//]Tn6M/kL@ݓ@`>N4?c qraw@_p$@܆w@@@@|; /G}$7o_vK԰k.y饗6nf/kPJiii:V:'SQO~<,j՛zўR0i(H5EA@@@- wuۆc:%nD0aycƌ3DA : Aɓ% u=y3l@jGϹkɟ6Ul 03 "0̠5$@ڇw@@@@ wҧ'MdGYRx-8t -E{5}\A+t$%5AZ #KO@@@@@ iWyHB N5jCzz{i]ƂLB EEE2lذD} I/9雐      h+J)y5ŋu>dpO{bB+@ !-J#    X}ZoH\E̐¼lAb jfsbq/+=cSgp#@@=E@@@@:>}qqqX L.u] 1h/2MgH0~N8CB\ȭX@@@@bС&1*`(WNCMHfʒ|݋D{[&ve!3Dcu5@K2 -6D \4$W{QZ@@@@B@iԤh* Fq߸N/HNV͛g]O6\22|-OKJJ1{ERD 4@@@@@ sx#Ko-׷o>8,{ )Eeq\5s,2 =fRO 77WY:;;S3jB{h3oMO&ij;/9RSY$V%,F" !"&VB@@@@Hj"%IF̾'Οdk g:|wh0MAJ/hhjj/ +]/^+;*iw7w@/6^\ @h@#P@@@@RE@FLP(˖}HJCo -8JKKEH=)/|fE\7@/y    @ h~>bTDA{lvPM1XP՞6 f0W߶[xE%@@C     %%%[xJ.JJ_jB{+#utu^F?ʏ_@NԷQl )@@Ð<    4j$c@ ֐`CΘ{zoi[6B)@@CK@{hߝ(,,u @B$@@CZ     D%%%>DT0rssJwRjh/E~5a*V癓^U! ``@@@@6+@IDAT". @ :aÆ[CtnA\[۲,E;X rݏ4?mlE C!@SSW@@@@H@Nכq$@tRr 0(Cdefȕk\A^:\F{+D6Fh @@@@HmZ[H  N ̍qw5JE)ɵ$. Ru(  `p    D,8@ dggKUU[C@Q,!=_~^7{,6*Y H fW    $9{2ׁ#A0{kr WWLn7!͙2BQm @8"&J     dK6 | Ghkk8JXTT$FAN2T~ni0hQ23䎫.7Nw5TŠ; @<@$ \]]݀8| Yƌ/^smˠF+l,~LzzzB$!˘O7d^|BH|qQ{{;|o8ۨC|spsHtNvkbݐ̘A CB^'\k>ku/{H@XxەSھa$^R+>!Gꚥ|fgJMe̟Z-_?Q *@ En =3Vl]s^p޴4|7l8K<im9 ^8?Gr. ^ӻD|ΟUrJAбy!C@ U! }:D2\k{%;蓩 )+_     )O o"GA{?ؗ=+ A $Tr3@@@@K@o%%Li@B " 21*(( ;NrB`ȉX9hMRJΝnm5P}Rmv`See%]WA|nkkF:^0#c?Q)R0mN>mF%eDB{[!??B m;;y؇)//il [Kղ2k Dz>M%@ &N? ΔD@7כB E=D/b9 @qg `]l#{j]zL'F9Uے d/΋U6}"ɏup~^ yM^97^u=Ds{ν9pN(!]"-FXkkh>)>z@" $zw5X    i)=q'-J#@:/jO(  )T@@@@XtHX6e@ sCОth= 4@@@@@BHM@n»o3"77}F Zׄd    @j rC, @ho ࢽE$@`v    B@ /** DY( @fo Wz(܋5@DАe    @h7z3 zsJ" *r L7A" !R)C@@@@ rn|x#S=H+ P^w4X-#[B5h &r@?^ٳg@@@@%@7ہj x&m 6 IVVV7X  7@@@@@  F;P @ @aa1@3=@)@Y0ۅR!   @[[ET3g0wDR[ŋ!&!" iCC]Ƈ$~&|N !{<||gg9ioo}rhGKK/U ٝA ٹsY ]90cv0 B\b43    @B`{t,tRpڃS-~Nl[IZED'0 z6cQj{4A{fB{+]3t;O9񿝜D CN@@@@@H@vv1E^^^5Hҩ~Y_@ P$@@@@@@ VPZZjؐUZb͍xVDW!'g    i,PPP :@!+++=6d̄Π\233n 8}tww[;(++30pƐ6)))M ;.LzC_?%B9ldY!9E%:?&imm "'.LګBO@?#Y1UTTƫyF   qVesS">6AQ@okwߑ$]OoƐ#7łpc,8"D#ϔM8od&smAzӰY%mP:y4< hP|^lo8y&4@@|߯;ޣD5g˜#䏮 UT:v  '(ԭ" ==?_D٬h9% @"hH6B@@@lZ~V9ѯ|v5OAbkNN3c3@h]"  H{e[߅a p?%9 BOg~[^ qLqT/?m|fpm^@@Lcn ql__ ||B|nh,a<43 @X j1/^ >68'Ʊ-λ"{@8 G\F@@` l;Pq0Yg7z)+5'ū_#<o,?) o_wPzA~GE~SS}$7/$+n!9\FL { z+.. nhiiN!ZB˩$@H*P@@@ @wO">\3^+eW@8.:Y w?E$@T 33SʤJtH$ (,,4 !(B9@47$@@Hub.掘O+=&hױO@RO/~+G#ܡSM?yG @VVTTT4@ J:Xh ~ï_@ hH֥n   ` hn^c'Kzv7ƿI۳! @p EjO7 ! ^JKKeĈRRR"U6֠ 1B{ ! צ@@wa-w}1='ڝa17- @׷8kk]_b7!_@{F(((JNgd6A a/JH>Iρ#  @ 0 ]װu`gY׻dt^q G`Î=Śzz{v @: h/ [Í :pܠ:ą-a$@J*RC@@Hw!]ޠNSs-^kt @|uI,!@s1 <0zzzzxO{4A4(B_ @ j\ 5F@@F4f#[W CMރMF}@<` dhp< @ 0D=5G@@ ^2u}]R:DdPUU}}>/@L@p\Xvl fCW!D)@@C`  )GWwU]周g{P*LT @*4TA\.@@@ EhH   023c^iw?͔80T&VQo]7;v 3&Tp]2@@@HqiT@@)_o#cG玗>3.XӨBYىnv f%zhy    J  $@A^KFE\ۯx8jܺpra&IEd@ &*͌= A{7$:  $ZD?@@U$_]yӥ 7kвT_ݹ@I{s7_.ڻDI>2uLy @ |Heq^ԥ^V __zy۱   F`wnre[@@@ ٙ//}@9rNεt.d|3eLW)Æ p--3#Cy2kp;sЍ]:RtvLCr )o N@׊w}Ǿ WRʋ4    ъ>  @^N\92"K5?>%;-εJGWqcJjhR0E I$0yT<__&z͑zu2cD@@" !$VA@@]@{q݌@S~J91q7džfMkgKG3 ѧjL!  @hH8C@@@@ SV#!  A !B@@@ Eu]葊<SU,YI]'   %~[m.)ϖQRZWq/ @hH 6B@@ ^xw7cg[C*Z%.?vQ3    lNu> YI{e$Y >\/?XԷ~qg1iۏȺGWo\y@@@?tvuˏ^*vDWɈA @m;J  ز}{`{{{/?#j}1   `q`;ur><:L#$ v@@| fwu}Xol=,/@x@@H;xh*)vtuD"$ IH@@)):D,ƶl6   @J |T{V}x4k!p<&<6B,@@C!  @pN5ow}ݨ1oφ   @ >WUzŋ`c@` 4   $9麤p    :WUѡ'mp#K`A@@$8םtml  .\A  !8mAI@@@ [ϻ. =CO@@@tK ۻҝ#)%@@CJ5'A@@D UVfd· @@@dK 󲓝#ha0  D*0(U]oTE   N兒1u8Ws]2@L(@@I`j]0} A   @g\ 7KfMt1 4xNJ   Keʘ!_?)@@H5[;GiDѡH #z%5A@@ | &Ēn[4Y 59A@@Tz9! s릥* BV +oiE@@@Oo2N]>q{f5@@@ }2 gge^$%9Qm  ~ӳ۷o*pB!7ncǎə3gQ\f͚%W\qTf6B@@ Yn^0Ir3/ {V3Gwͣ԰R  (PQ'kϾ#N4%(/3.Wv]V@H>f?Tٳg{+6l_]C*N={/,˖-E   .GW+o:>``Ô2ɕkR!  J_'  )%PSY$󥣫[>:tVۍ}hr.7jp*  q̐[M6iO 2,433Y=@ @h@#8C:%]6$!++K2e1Bjkke޽[E^n9R*k  @~N̟Z.ե   @;GBH?΀~XJJJ".iAAAsd͚5*rJ#\A ϗK.D{9x֫j,Φ'ӊW@@@@@@@h*ak?~WQQ3Ʈk{ fXh 6LVZe,nmmm۶A F@@@ tttƍE8s466^(//YfW\!:G{ܳgQ:.A R0a̘1#*۷KZpIJ)    %`<60nܸx"li&k=aԩ@za⇾B   S@ds_]C N:e˲l2う<7z"@.RY|TWG6?/G,i46   A ?xrرdB_?cpႵyYCM,Xz[8z5   K_ fpKV^m|ϋ>H~@ o>(o@o,Ӟb fɈ@@@ CCɇ'ŋJ~4>|*N\Y{r[_ui@@@С&w3eee5\c 7C; {\E֭[g pUWYN>tww[YUTTu]'F*ihh'O!14ȯ~+czi @@@ !`<icUK[l}]w%3fz5 n*KﻙI]aùqp#`lRi{ y Nӫ$0f]pxr.[[gH{@36ƞ1x=CK|%ڣ= =;RL I$-X h5Ǝɦ=4I{_4`ԨQЀ~/9szmy@@@H al'ONu >0m46Nu .Amnn'|RF|  z+C3 ---!A CS)2}K Qۿ>LM?>C#"VvoHY: uttg哤MMMIo8|pH`=9ؓ&@@{Cdz7m'N275@@@ q4$:c:+O2EVX!"Uxz!@dz|] hp(Xd¹>Oi b@@@|8t萵ע,kJLo|*W&t {ѣXK%7#\W@@@h?dC=͜9SWrszr饗#<"b}7ސ%KEjvhniNF| mD   E@8v옕wEE5nBʬ#486Þ&L`ur]v_j/`khP=F@@@!@@C0(ҥKeŢ]744L; ~^ڪo*9Ą3 1sssYb ЧCJzCumDz 8 '`${@^ w]FlY)uzDo` 8Wq഑~~dVNhI8' V{4z* "!o(g?ӽ566! lnnNxՐL7w]h]z.PۃLiCe0JωV|,T=ڐc~h?0цDVo =1uTǚͺ h1kٜEV B@@@j4۟3L$2A8{g83Nbc̤!3PN5yB ۓO>)weܸqX\m$i@&)X`,}Kc)}Us$X$8maDN15 I0,oϹt4xhZԧ;4蘒d ;m? `x>9y}:a?jȭ[tO5#/gH/ y Nӫ$=gP8 ߀s!pg(8%q^,Ш{~+OCDwk,`FOXtX'Xm49V{l`H`[Kc}r(ۿsD^Pܿ2믗ӧXl{oY SL+VL: /`sUVɃ>7\:Y6@@@dhՋpBIi7L4}xw9OQ8-{bS@F1 ]@ vHY-Hm~ϥvR Dkbp>=m P{YedSO=Ы,z뭃nnRW9ss=qh/:t#1g f^)lȞ.]*/6o.CGeoi@ymCDo @@@ 蹟cɓts:aѲk.c`OΏ;6ly {8q}K}'F\gH   3!=FzMn:y饗B`+WFԏַi.\(k׮Vo-^$mxH   .4u(`^8tѽa$4IummU"kA g6T47ݳgOD w671^h03B'   @ 0ݬRn%7rҞ"5a!YΝ;Wn߮k̘1V@@@ /6$/@@@<hBAOx֭F}r׆-+"ڋ;EiܸqA6l뮻nq&u:kZ{1b54y   .ASSS}6tss3ģ;Q /)~/zk\P'OXYS  6HmmmH0CIIQRk}&@@@@ 8!/QvW 39s_{DS0fRYYi2h0CI{{1?BwI.$@@@ Аx{ԓn j7!CuiCKE~Xn馰ƺ|G-Zd1P>%KoodԨQ2@@@qfQƿMb`Ĉּ^A3鵐o}[=@ƚ &SN6a56ol5+Cnh$@@@]K욽F* N>m.E]ԋڣCiLhzqaƐ~%ug   o)zLsΕ~i.^䩧?Z6P曺~}}9+\Cio.?Ϭ􁉿t}k&mf iCkj/C=cOjnb\kчJH    !@@@U[ya 3gΔ+V<<Yh0d„ FODŽ裏ZK5H>o&h3hޗ^zJįp ~_֭[:tIJedΜ925׬Y#oV}k2o޼e   $N +qbO    A nO~"Fv)=L8QF-6zh3iOw9u޽! Ch,t~yr1K}S{|駍 ƌc yq9ztvvlCMB    pN@@@@4pA`!N8aH{*8pYB@(--uӼgcjyٽ{;3F߄d馛싙F@@A%    *c^xA>#immW,2n0iWɓ^e5d>FPî]䥗^zkpn-ӧOo>   v/%~@@@@ h 0uuuK >ܸe unkk3N>m AQ\\,eee2ydIz@@@/hB<@@@@@@@@S Os#3@@@@@@@@<@$ @@@@@@@Vo= @@@@@@@< D@@@@@@@@o͎HS不GnYdIL;萍7ʱc̙3(EEER^^.f͒+B cʛۥ9*.\PrrrbږCVc'ܹsRRR"#G#FȄ dƌ1PLlld q,J?JGӧ]]]RVVf.̘(&66Bs2{5N5~3_r<+U9x*H .%" F04xr-ӑylذA^uioot3l2YhѠ&g{TRZZӶl@"e͚5^*˗/ "bb$gHi8%ŏH@_~eٱcǐkp]we6 ME6 &HdZd> n8vp/>+fLx8 Il. Ǔ7';@^g})N&d@\_x:|2uTs6_WF0Å \_{':;;88dn?C3ks-zˋy{6D X?wޑ?~|m8%b$gcQP9"w''O z\rIuE1qp{Nfϱ)k 1U2ү^>x~SXx~N8_Lz)30Dz&m_x~k׮5zg03ʒkFLbt=?ݻ׺ [273CHeRgnruɨQJLz|ШVMtqY:'89EO5xԋcQPӟTz Zx3@[hЩ4okLsG‚gűȮt 8,Yb UO=oO>>kMs,(@ !8'sc' gEo7$\ WOqk22I ^~3ԠSx_qKU3ΐO>Yϟ/˗/LZ[b;Zj|y0@z&:hVXBeyI^X DI Eh˩Fv*={&Mk73f̰ׯ]C=!ŀY7n47o^@q #s6㙾˒(v}γi&{8݀6 bhѢE*܇HPbA_C"KRZ=+Z f͚p/ea" 8bw&΋@WORLlA_'zxO \>oQg !oʧңGiܸq7zOÆ 3ަׯ/ڟ&2c yi`P DaDy 9" qР7|u,M<yEG X ɸ-3^ =3} Yyr~kٲL0Aׇi=C=X9~k_~m!n5}.L! ܋ ]@9r,ZȦg}d뭷ǭE#3q8e^Z#;cފG +'S^0\'VθX|EXhVK3i?$oׯϨ/lS אmͮJ9mK_夓Nۧ]1c\A=;: C.Fp dr Y+p/$V,hXl=uT2esf kF0 x&:rVXdυIˉV DsJ= /iWL6J* hpq0 Ȇ 4i?ڵWd'VMt+VСC+0i$JA`ҤI 3yu<>CN "5dȒ3ڵ#N8Av횔{QRf - \`>_q?)X":Ѭr?)# DOvP /ity.nݺt0 o~OzygQ˲fs@)Vp(KpJ a^C"Kϸ ,]5R ^KD"%u";cu(=;@6׉.YY * s>BVD Bη5o;65DB nL:t3rݺu뮻N]̝;׬lwna(0}t6lh{VҖJ;0k}5dq/$@ڵVzi~n6ꫯeժUtk{%':nّp7{+@WO _f |l!ˉ=/zZh`Җ.Ktjժ[@>}%KȲen&կ__81bK޽q~+O=+av' >R&A r Y^dIW.,9r漙3gʠAZ^@"'u"#;cmAry~Rb:r?)`R~<4v@lרQ#`o^K͛7'֛սKj+{6rJ{$0vXy'9潭c>dIw\!"hYW_}[VV&L`܋\ IH. nCI ,ube%g81>~I>iTBZh0D fZlZR+IDI@zW̦wE;4 0! */ ~ ԩSG;8W6}8"#DR8F#$wV̳Z+'1?brNǜ뤼bO+"P, _),1@95k&K,1PŊcz֬Y#+W޺uk{(omڴ`: Ff2@h0۠Adv3ϔ2>˕@! "å&]irzѷimqFת܋\ IH. n@X ׉u8O, >*P 4D#Y hɓ4giժUL>ݵL6m\ Pv5uÆ Ҷm[K3>t2b"Юeg0Csϕ-[KC9RDEd Y ,]Tn6:u$xnE͛^`H pGt|g ]&Њ$IHn(zNGsήOd#?k .Fb"]h i1c^:NfΜi/o֭[gbXvl[[rfc>Tl%M~^Tbhذ{>h$A֝,L܋ #MhOYpz~NpNSv%xRg !s=6l#zG}d8kM~ZJ {޴iS{"oNj-&LS XD(^|E?7 fKA\:Q^ų<"Ю];{5 &u>3||M[=kw{Wq'u2# 1\o@PWO/;@ ʏ=/P 4"w}hD=lڴɞ7z#GEF Vm Tp6kwYo3@ |2qD;[fg-uԱgPyX7 A_C܋p nM`4v'ؓW.{ǝ܋ #MhOY`~~lpNS%xRg<{@xw.W_}e9~Kjj Æ ӧӶv[e]qt"zhҾ~a9c{C@!}Kp̘1.;LT"-5ʕ{bbŊҧO%%0¸ á$7'4?6Vy9Ct;#GvM?c]9gr/rj0@4Yn:<3g͞Ipǖ:~N9JBbO@4[ j z=n`ƌ裏ʚ5kE+U$mڴ-ZȬY~s5תo_~R^={@y!:{IxKPhnٲԮ][̙#heΤ]M~I #PT?yGn/ K@ k{Q ,BZ >8>_͚5eܹ2{lYzsڵ5;½+8 )ױ%g) Z;c)8|*գ :~RgO+ n1R#V}G!mVvi'{<݀'hdݔ)Sdʕ׳tRp[\pҸqtf>(5Trei߾ʉV,X?4+gΜi^Kzs~!H߾}I|"Pի隸0º!ưl2?>h~Zdh VQr~^S%Et@y&rulIYVXgF<-+'8J(øNz= ;g#y^hs=̀ `X~5~ӵ38CׯoOg Gkݺv◴k;Yg%"LCy%Ot܇FL k{Qd'%bk ~Isw;Ova 6Y|"@yɬs[|@y/J̈q|E]y<ΫR;ʰ'vx\@=o9r .JmҤhzq@ 4,X[bԩS wvE>dI@n܋rsch h Z~xye뭷Fҕ7q/* #Px—9(n3w~Rd|Fe!@@@@. kd@ # xgaÆ|Ŋ}oӦ8LHrʌrY7LD@@@(:l'/u  @V4d _VZRNog Æ $@@@@ Q:D  @q Y\y$7        3bV.       Qˉ(yD@-[&/V4h@7o.+Ɇ d޼y`f͚IKPs!… eŊ͛vRn]z뭥RJ[. '5\h̙3G*T`Z6nXիWB    _ )U 'UEE|@~1"ǎ @uٹ{Dôo&4GWZeM6?M& hBN=Ԭ_qQtM;03a &~1B~qgܹx≲>8'm~` -l\Z3 _.m۶F]7n>heܹb\sl6x ϧ5komf7/mڴ]Gmx3  Y UEZߐ:|R?n"s: -]Y8>ǎ Prڵkڴi=:wMF9Odz]ږȑ#'}KtG}d~&M-0][cu48#Y4ig-vZr; */exZa%5,<+(o9Ǐ7~i3XEWʓs7M_eƌ*{!c iرfʕ+L|+"s%F3@@H#"\I )uO$ 't˅\"\@_ˋG 9 hպ'ʹے_VNj*c=&wyh%=z6Ӎxիok p 3x9sL \-zx)ϧoFnVI ^x<ϝF@@(.)hȮ̩HEEr @h!^"\Yfbu [Vjժ:uH+;.4h 'tNf7 ښ?,_5^{ѢEf <ٕ=3?>kSVtݻ˾+۷7зC>s3f9;O>/ڛOfk֬iOK6j=5wޮq-X@:W.bۛMV>{9YpM~|ugb@@@ 7䲎)gJ~]Qx^@ 4Ĺ9v@ &vP~}{&Ν;Wy$_ >мXIfeOn6Yj9[rx§ve fT\|rQGmٲyڵ`9Gn;3X_~1n:Ѯ!,T׀ g;v 6&o0ön+C Zj]n㏗/\f͚e/M#׷{"|?Vn&P=Mڶmkiɀ̷oFA@'   D \q>gJ"O䧾: 0]? @\sh$Y~aW]vo9egyG3ϴ4BoҖ&^{5.,ezԫWnµrF9t~F ,o++!V[me4hO[7]=}>iSΤ]xkԨ!?O'kWLZWb@@(u~Br]Q$dO _S# 7n[nٮRKѮ-hEI&M6rGK/d.f:tovi&{K￿tg;o<#~zsU.5jtS+VRFq:^{I]ӒfVtK}@Cv{LeeeQamYd=4wZh!4r1@@L:iO;2=t;Qd>IbcE@{=z!M6uMK5r1Ǹf駮qkDhpN:)0N=TyShVڼy=ʏ7w'hvrwʅ^(I7-x6lؐn|V;gq89^y衇䪫2[k[H   #3%OdrgZEE&,q !.%q" ٳ]{l߾k<݈cZiʕ-8N\A>#JTv@D&U&տ/첋wS)ǫT0Χ:\z-0`hE B   @ϔOP?EI}n:LEY @q(e@. 4)O5jiB}G:SڵeƌIi~gn1gqv PbEiذaZ hkEӭIyҥ*… jSf֭͒['G~vQޤ~6m4E`.&8>hy\2hA$ZڽvѪU_@@@ A:RQP?͞AMavWKbC   ,7j(但?S/_5\eDߨp4,[̵uTkZ&MРz24?3zpiZdL< ъ п?#MraO-[+R`n:?~7h  lnEv}wѲ&!  Q"sQP?ő-9%k(, >@8 @@ zD iӦYV[h2iO?_>`o@C޽uR h ?|G*RyaO݄h?w,^8)ܹsW_54o߾rK|N @@@aYǿȑ#[n1Hꇾ}SOɥ^*J,k|"  F gJ'(rn:  W^!ks (мysk׮-Æ sMeDLޮ;,XѰtV[{7JCNqo |tرcZжm[~?[СC|eI!] |rZjrAVnb„ 2|I䬳Β~ž   @x~'wE߅B @ N4ĩ9V@BzEjV4RF iܸq^sаaC.\(7o3oJ :u]xYf1c%\bvOaq+ժUK׿Z/ۮy[.Hv}wIR3e\;}+;;͋wu>[i柎ofp'|"|NӢEZ{   㙒-[,|Qq.m߅ PG y\rkM5mԵM XxkZdoۧ[/qګXnaĉrJ{ ѣ]K mua=L̠+< 4D2IZ^A.mF=X4hUKyW$ԦM]jKzn@@@C gJ'[΅QGA*@-t9ł!@b%QΔGly>wK/G!M40a1µȓO>)uuMLbO7{iv`OL2϶$J;cǎ4\x2n8{]o߾=7!βP>(aheAժUevΝPNLǀq)IL6MA5l6ݞ6@@@RȶA=]'gJ2"s: -M EX0 @]6gq'[)?{̵n&m۶uM;$,睰tRy׼wdgk2R^=,.BI3ghP7mذ;)qCҙ>v X]>WӔ?̘1#UyTԩ#rf@@@%m}:A?Sj(|CuaKQhI@-4l`@X ԨQurE\Ӝ#._fM ^vZnV駟\=X׸5ҲeK4h3Z$Sku% rB^\>; Ж%%'~.͚5K* \`<е믿.}ksd޼yrW$t}\;]twv% 8g:S7g޽sa@@@7覲]'gJ"r"s: -I E- ! +ƍ~. `8SO].+k;wvm^eʕ<Yf=g$Yg%[m=MnfyGd̙hZbm]k@ ufnӦMN6{eȐ!j*t mA:A]ʓ;0׹O mB["sꩧhx>suuy|   ȥ!u~á~ZaQq.QGIB+Po ?"  wI&Ʌ^ڮvs׮2*Fu&]ϖ_~w0]8vyݰ(|饗… }Tv?{{!w}ws|ԩ~/X]̞=۹ԯ__:u$=]^JM7ݔmH7ar'o lҬY3x]N:4XJ;~[f1o{\4Q$n6y\۰F N-[<`-jv5N;ށϧW_}Օ|iҤ]f8]l:$!  &Pu7NϔZO~BM"s: -} B  X@O?@ϙ3ǥrV_WBK ֆGwm9/A;3趶~{֭[[?̠A?]-;+8&kLhYx\zv5@EyԖ?p׮ƍU7rW(%-[o0jo]ﴠϧ:J盯˗1hp7A'-%8   ^ \ R 1eBOhQGƹD&  s@X iFޤ-̚5 6~X(;vSTjRZڦߧL-\~ҼysE}k}m!]Fõ[\g4 `ȑfS<6m*}#FE]dA-5XIpRaMzru]g$[WN;VZK9=IЮQjժ)󢭭s1o^R.L@@@\rYG3 Up'taQq.QG>Cx D<˝F@ A`޼yh"3^Vj׮5!S[LЦ.Mwm_kѢMĔ)S./ ݇>2       @i PQ!       i"]|d@@@@@@@ 4˕B@@@@@@@ 4D<       )@@Ci+G       @hty@@@@@@@JS,W @@@@@@@H #        Y        !G@@@@@@@(MJ\9*@@@@@@@"-@@C#       P4frT       DZHG@@@@@@@4h(r@@@@@@@ .>2       @i PQ!       i"]|d@@@@@@@ 4˕B@@@@@@@ 4D<       )@@Ci+G       @hty@@@@@@@JS,W @@@@@@@H #        Y        !G@@@@@@@(MJ\9*@@@@@@@"-@@C#       P4frT       DZHG@@@@@@@4h(r@@@@@@@ .>2       @i PQ!       i"]|d@@@@@@@ 4˕B@@@@@@@ 4D<       )@@Ci+G       @hty@@@@@@@JS,W @@@@@@@H #        Y       ܓXb̚5K~7Ytl6KͥB %w   D[`2yd;w,^X5j$-[-ZHƍψv >},\P,X ˖-f͚ɶnkխ[7  405$}y7/B=W^]n;{ꫯvwbد_?,uQr5ށlWcڛ_">=@ Pv[6 @@ +u]ʄqi2?ONcѢEٺꪫ䮻l}7PٽX% \:QFѣeժUI˨AҵkW9CJ*%]6݌.HƏo/vwa3@E @hZ ̜9S,O?Bk׮{'SNnlXQ _.]~,?uT8q} \nco?K.@@@,F糮o|c޽{W_}2{첋9?gdfID*UOK.D)ƪU&,< :4!\ɫW," /@0Cː#  @i | ]c2Djժ0 ๺|eeergmGrg~6h aUV[oeRfƍf}7|#׿reWF͎@ZoYB.ڔ_0>|͢J:_j~۵Noڴ~: QF0-@w;@@@ $LիW7,fpD{g-ww3hk$>Cz]p s9?|'eo5]+ @P*%Y1zh3 ۛE d/}٤f͚K/dF}{$z9餓|[xfQXcǎQ&y|P  DH`ʕnҸqc4F-O޴͛M[TYwVO>39ꨣm&z)LI+4  @) T, /tR9Ds&}H6Z_|x7]v$sܹ2b4F@@@@| ^ڵ͛A֮]+'xlڴu8s=u0wߕ>ښd~nذA'm- @@ N .p}ɜ9s\޽p iَԯ__nt$@@@@ (KUV jWl h7:.]#;T, ay率Ç3=p iÍ7(Z/k:ɓ'˼y̺-Zn&o}tb 6myngQ뛢Z^W3Rz Z2 PjƏ$7n3ٳg^5xZjtAeFe|Aٟ>e+μ׮]h lĉo{wwmKn6MAqtƃb(3 \ybŊeFPC'[fURw?:uqA9h);묳ʶfMeCCF4rtY~7z_~evmO)?+ݵص]#@5C涍J2#5㏷UZlֳ>&X@@Z^p=СCSn'g^op>oϗ:ܻwoWy?\ۻ]J7bڻsk6),jOgw&9yt^sz-j[k¾>䓤Zc5պ~M6V=~eFIjnԨQe~uCq:w\v]wiJ)k0 /.ˣ>;ֵ??O B_Tn;ku~)k/LC(=)C∊E` Q_LrIkY߾}|CH|3:(W%ǵ>4郈r:qݺuM6"ˌ.F\wnoX(92ƴ۷0Za(es<}>e .6ЪB&M2skf͚eo3] kAŹV-^ؚ^hO&|;`A@@@G 0y*3y)ٰ>g:S6,܇5l4۟/š3ˬ<Ngwk9gXu=?yN6|&Cz5]\t~ Z/xlO/[zu}xg̟? HdӍ.5|MRq ZN;ISK4ӗluU+%ziG>)kŻo@J[偄@ /bvgBʕEMFĶooժbT]PhrQLz rg^z%92]\M?0utAF &|,]4gϖO4s zsRFF0ilٲoֈbDqg65OV]    Pa=C. 9ޛR(BMx=16c|"F i9:M6e ѣ-f.d {キL:5:F+ b%~me hsFp+Yㅺ32Zu[2ekZ#$CV-:BKm׊e' @|%8>6i9aˆvmA> y~zhrMv*F1s-1ys-?r_}4jԨЇ2`j4'Ffm>=ZG)7t)3xh_dt+!Ff:u2Sc+y.^\D<>裤A+E D4t" 0E.FubD k=?kF[7_R,!Y4p[oy=7kuZfHVh2Ϟf Fk)xsuklY\+2  ,3XϙV[ς;찃zlS͢z3w/n"]'?kۻr4k|!rޒъ/.Ӓ x0QDG_dy\uAFvPC8N(s̱߸q-^8p7Pk0-X1Z 5i2Zpsi _SUWQ!úVe@ &Ɨy~͌KwI'}?n+u4~/3ؒnN3kܸx5m,MӇŬrѮ<̤]-̜9H8T)vn%M6%tkMJO<m3]\]50Kgx,Ө*?~|ѪD6MAmfSv N#_}qoxK:n<ĺ7ʌ". @@@ _rzN Wݟ)KWkyvn_u`ud}/Z.䒄}{v9aQ?VXỞ [t7.˹}뮻.3znQqI ,Oъ،7Ct--zf"+¬ ڰ=. @<*_ H]@Mz'> _޵kFy1\ӝ#ڂFt{#^{͹hdo6y 2ݺukeZjfkwڄX4x`9_#tQm&Kꃶ֠]M8F_A#SEr 6G}l)Bǭ4fMi.Fhz,o8/mga*-iv7oiӒ$@@@ JA=F Ӽ*OQ-bHes|F̊n"m'V_~´|N(o@=-'`/]Y7Zt/yСb jԨ!kG7o*k0-}KpL띴糒j TUKm׊T&iOXl޼y t[o%ހlwug >35B#ǵUZfR76y~ Zv̙],u]'DIz۵?lmT[j5yvlCƎ+^Z| ̴~KQ5Og2 s.ǧlTˬX&Rf;O[d8xu\_RL3tW:3gE N8C3T޽j*eWr fS}F)ywEPי۱uU,A_Ƶb|"Sx{GMyŋBʵnݺmεF=>chQkI6?ko޴~z$sO?uM 5j䚖ɈvuMm{{;;>{lE t8ǽ_؝ 5-FhP392e{z ʄN8 @@@> z|[JeV 2~]z߾~Xls{ %a!co4]ǛuKoiԨQ;fWe/kPM^{:g}5Ю]2XQ^:køVO@x TasA xR2ApѦky@KڴFW;#g͚n6dQf̈́{-({ךg*UdÆ :SLS>/?˸qiloY}Ef2Mܟ|I{х Y۞v7qK}d:0    ybF1<ǡ̂9ղe˄MuCP9&'A!61VP}r!MuQ9y]5?ַֻ_keH1\oy_GoyfVAr]Kt׆q'  !A4,Y$'ك߾s h]Ò3!$֭[^4CtI6ֻa0qD駟̠m0Ywldz^v]~mʴiMi_@r:piA@@ 3o=<s,캉l=7 i%Ă MР3n֭xKVԖ>Vkyf`zynX\K.DniW^-Ϣ?[9s©jg2Xꥃ6k%se@J[.'J| vtݛB 8:%۝rVZ>蠎Tƿ\qf@4h 53f̠A?Mo6K/ڵkzg@@@PϼQ9lYxg>K U7ǰ_@|ǹ;GLȵn{ӧOOȃNn=?3E[Mm{L>`'HJ\jG}ؒu;ngϞfk$#p]Kty$9= #bTa6ïMM9|v+ /`xɒ6mM+~kfלs~׭[azͭCvm'wٴ5=٧ա*Æ ?0bM϶6Dž4*y[]x8S؏{ #  d'Pr Y7o!maÆ~WZ(Ǒ2]kW^ݬqML2| V 8lew=Inܓ5ᬳΒ??US]X\뀴 g3f̛79I.W^qMnR3Ir]L,xH^:ky #S.'Ynv9`LP>9䓭IfouMw.7x踕4h` ڟeľkg30k,\S MBN(_ocn_&m@\ԩjw!:O?]Ƶo: Li+ƍft7`@@(֧d&meoݵw}7 oVF6ln͵_/ iF/b^ܓѮ]@hAco0Þ{)H]&P^bEB*yz=Zaq4my]v]v^@@@ h=G6i [a?;]*åZ7/#9e PoҖ#3M4hϢE\J3]bh?¿;2qĄ5ۊ\."{^ԯA[n>{nOtf(ʯT/kqz0 S܏){x:mڴ7fI=܄/8oS^ޠLе8go78:|]wɪU\Ԗ>#t _}#:rGvc%뭷Qy7a8]   +mۼx4s_>T&ESmљۀ|wy饗1ݻkZo`Bey~?&w9^?k`äI3Ҁg*kP둜S_}Xu^Lt7Qj[΀\-[`@ 4ĵC8n2QΤW\qsR]LT 'd3\_-3u9}u?]5- шɓ'UW_}5?5Y U暞j_Mׯ]BPFk_7@,H+   \{&9Ks|BJ`B)MhYg*%=^Rk,FEmOs7~s4a:dO\RKy3ڶ.u2I]L:5#Q:aZ'~ևsMdDӧht~y{Um!(ѳgObdwœ|='l8 (wDJTFkW~۵=&ƯTf   @~gjcǎx3P /[^7qW'tI]p ~YO;e̘15j$7xkZ})B5BLMmYUVRn]95B_4uu[Τ-zJ<3)V@ȑ#]5%]*uz̥\/ֵa> @i P[G㎄|uQ9C"]MVu7aK>eFw-8vѦM]]ǯ͙35-ՈѾ {eWf矋M6]?5ktmrݺuLFsOyES[7v7]v@@@ +Q[/\lYF7y7s| b|*,]wNꫯ&,]tQt[4"ؙJT7 &8W5$z\ lDJgnFO)S8'oY>t}K\t}jKZoŔ g{9?ٰ^~eqor) o]X   >ծ]۵CmPӓ%}&izVXs_P7Gp/]Θ1#as.ڲoo۷z;9q㎓QF%]/4Miw-[]O[Op&}AF.M朜0uں3oRNxP/8]ÅBúV  V|#-@ΝEٳh+ ΤiP5\#:u[</}rJs\z饮y<p 'v!?x/]T&N(ǏÇ xgE6H[iL4mԌl  dhuj.ړFz{Z&u[}VZ\\[f{1y7]6,l.gD[:M+AK}o?֧omMr}z[pd@@@ 4u5 2ާ͵6l۶֗hڥj>mVfR " s_&P7u+r"? x?u4=L:I&ɷ~gNBēt ͟v/vaZ iv'pءїonFuϻZ^۵k'jvCZ_uZŋln~nݺ?c!9ѻw& =RZIv0@  fϞ]f|9,3.)eW:FKڿtQfprF}wyy[rmx(H>}=Ó.7cڵ~iE]t2alވwm;btCkYˌ}W^6A3OÅw7_WײFe=/ӁlN+̫5z=μwwnL JH^ o=#+ko=#~Zkf|ΩtPtK29CipZ9\`2Dt/8Ǖ&vYeu].kyx|"ԏ;g Z+Zk?kRvɭk?mI95;utQi?"uvq믻m$ͶMoh$oYGAS-D8n3 =34[[287QD?,4~ FpEb\p!  TH@|饗سgOyܖ'iI>q$=iM:.Mpo˷v z79ѧv]XhKgyfewjGqczn&bD[JtcǎEc0ݩ$MxT⸲]Vxy@G 3:6O>Fi&2xw_~F KL0AZRG+Ms1Ŗ6'h vqGm&s-(SmOI'T4|۶m_tBv-`hW^ymPnᡇ ~W^.ǎkF=   @Ǹq/BV\?sfۨLؾoTpZqI{^޵g?s+ =t.^;7|S Pt1y_ӡA}yMf=`xoRǕͲ˛~}r+AO@j_6FQ$Y~BHn) ooF뭷4kZVƌ#ÇNfΜ)giTbh/    P~֗;F-zmzMثW/VV1ؼbqq]]hpo"Ҿk{1-fmレM4./h:f̘ᶌ:lj'a2i$r7|#SLSAڵkƪֽTXH*q\.+lz_JԔ %@ڞ+7&^l{p/       TB.'*:@  {YJ@@@@@@ P!@B8iS~B(|A@@@@@Ȍ]NdfS@o)ᄏϪEW$^{m{+%f@@@@@@!cQ@ k/e˖Zp<#2p@2<ꨣ+1      EZhV!M @CA/-Z1cƄ*2h[ѣGlPZX @@@@@@5 KG|r/+2C^f      dE%H ٳsycҮ&>iڔ"1@@@@@@ };G>#9I]tQhY}z_r%ra}dr' _~|wF#rJ۷[gϞ2fiժUyV'|RM3;Nڴi 8{lի̝;W8yCR鲦1yo:tw2R:4mJURU/cW^s=߶_z110 Y+R +5^J*V֋MkI&ҲeKCҽ{wJtn$ kaxLgL{cp_&^&~SM1Q/XfDo6dc_Kҗ(VS~n[+KGj%6a;g/D B{5ɓ'˧~ǿ`<Ȓ%KBqyXxq(>,hѢ̙Sg~]>ip ~ ^{mE+3g!ӧO/Z+D+4tI2>Ӈ=()| Uɗ.3g K.mX5Afb&1BN?ty7eV żX>pl͛7/T̟??͝L Lda{f;&5/vLKVBTW_}}Jo=;夓Nm&i1] `*H/'5L^eH̓}-.6ǔ_6'N}zrS,ʟkֈ@JblkrzP렭zxiER+3JgҠa:,)wBic^f͚%'xmr)5׋y~\rZվI? lذwQZ$5`lHU/@y\zGZhH@SeHVҚ:6]Z?JUW]v2c 9.".LIp ^%5K: M6kZ`]we~}0~xіAk>Sdu֑zr67E Pgxd$i#$2-@LoWnzXէORajR@j:^ҷoߊ3ZO>Z8]zް 7mvȐ!>y'QeM/ɶ&,i plY؞h^y*kQl&FY&Ewn%oN;M iݺ7'ǴubV@M bQy PQuBCn:Ok׮rtV@`_zxtkʭФIT+4[/GWj# ^zRɈ[ 2Y T浘ڶm+s[b}mAoF_Écʬ2T;{9A(Siu&T#$xouh Π8 w 7EkkVhfmR_A$:tp5j[@@@{キz衡<|A@@.*4T"eX`5i_Mm?\.g#8m=@_xM;/ZbElmL_Gψh_SnSOuniW57n -[::T|衇_9RF>ԩlvrGˠAEE ~׷_{5#OSov<`:Ss7NwGyD}MvCpg/~ i<"dΜ9nÇ#FȌ3dUVM7T>`QΝ;3EyT7U&OVfh֬暲;6I]O믿nI{=ꫯ}ؾԼ3_0[B(VA탃~3t|Λӹ?><6J.쒛8qb޴2c<.ŏ?{GsNM⊜S1h|r- '6jSs=ꪫ:.lZDrHΩԔs*zߝ9bQZ?Zn]0NO?1L-TNmfx|D?e]񫯾j.򛗝i VP`Btr*|ǧS9`tcI>,{۞y}cmxG8Kgc+cXNۡmTfvy~̜Iic %8nm쇥[2OzL9k;: i๸w:7 7P8L;N qL Aq&q}GxZА1m!i9蹤]x&L3 Q_[e4i?^9sEJw Ɲ5fPG[OEϮd%"O4ɓnUbZIpӾ~Ը.ۥRn6wKoP:L>MoRFqyq,]ǥiTB@Tf@@+485[sg}vFw4i缉s%Рw[Oܧ>X/v#U+x8oƙA^ʻ'Z#.}:MR2BAƯq7s*m6oڝ7k۶mnj^:[jt=rNkiI:i$O^8-24N7<ȜӲFx5pA@׮]-[{s_~yi $>.?sZHo;j%^|&'6z;Xs,sZ/879fi4]=XN<+6pÜqCq7(sM>ZJVwݮZ+n\ve&os߸8\ǒIcn;ƱXJ>[i ކ2'LBLC}͋+G}l]cql?u:Oi,34yi&yp*K-Q~UDytHQQ6GK'loP<7MIecGoXLLTJ FFRi]g-4~0N?ܖ-4ۉ+>󾛴Ͻ;Oƍ羁 Ni<7;vJ>l!w9}(45ӷז(=VNB˛ O+78]#oulz(iJ1j5lϞ=Jj4}.o7kkN7  {_n(N wѠtIcJVk:zP|2MINo *b7֡ib$P+LN~5 kYpsƵ4ݜ7Z3>i=wk ߘ Z^+yq駶ԠNn -OӲ*N[ ,!Ͻ;_Lěyz }CN/_\[w2:NG~0t}V$,ѤNJ5uLX,%enoۛ^{M?./010 c=m{c~XU!RI,, ?ܻԡP8mSڈs'IҪ=Ֆ[3&Ǵ߆RAeAwii!,Ӹ/yx娗JThuYhgV2CӔqI*K)vUI_pHQU6GK'x~i7?/&7)ll`l6`GTh~;^;y7hРЍVhVw瞼[D߆0^xӴB - ]w](n}oЇWS\.^86>+C8ذѓ o7tb>JZ9!T[7?mmzy6LoRF涎Ee?-@uBw1gc+4DFp]z nVh(^ס6dPq``o~PÆ f;.H;b6wK6橧S0y>L.6\uU$}hpJizr-z-u=ctjW޸^h7ZmиG(;Nm1ɯwdA'?Ӫ6_}UE.PbjZɳ>nO1/O cƌ UnEXדF27bqV((6D[]cfp壸ܶwccX|l !~ib`d{l;6Rέt41pǤŒ԰:hh=_s93J_,O6)mĩ)XSAB}"v7)vLkzl6:LA[et8be}͗+GߘrWhyiOxl?yeOm'ZIy/6˯,}~6R i7?04MIes:m&ATh(r#w߀ԚM8u]TI}ߤy[߀v~mdЇڵkJ7zRoΧ:@4} R]ԩS|k F뮻-3& R|͛w Non/6:ٳCi> oD+f<5-In$,s\MC7 O0aB聛v o&h`*{7:y,jMiZv<L/gii/M L˜lOc~Xʹ&԰V[m7pVR98;n+Р-hedFeߙbǴoäUMiy_㕣~\ 61M /G6ϟ~V̰qiMd{_66)f%4v.`;6J OQ6cVnbO!9Af@,MBqގ.m۶^&OwNj=߈8Mp盝wn&\y{3[o=o3gN~qF4/4dssQq޸D٩MwN`e*Ӝ8p΍cבoӵMu9~%?oGwO5? q.b"ğ֭uQ*N0 ew&߆3! eA9Ґ},?y6oɕ,4<*4Ufo9jƞ[WVLҾ~Triv6,w>MUJJ^4cRez),@)Th(EeJ?)N-!uZÈ#BQ%yom"чN"dƌ4}dݻ\^(4IE9=00yqN }דgr׋R@hMZ#1WhKnvы蠕f~ͿTGMKW8tYm'z368DB0p&6xt3rLuJKBi3݇t=zn$eF]U I:TԱر4 _c$A4J&y/%L^%[aN[}mĉ,}+9/6GlSڈӦqןVfV Ҷ|׷zl%/L ^>M?PNCZe4..$׍IKGI G8ʗRYf>h{_m칥U~e$ǫ$86<$iKIӛ6},VLOjIxJBCr,WӧOHJz2ˤmCN+(D+)LP 64FKb=<=8ӷm/3mk=ʯ,D$.<$iKIӛ6},VLOjIxJ(&{6헾PM"(|cEB5&.]6zX~O֭[VӪUw'*ڽH ͛7ꫯv7Ȅ$ui+oh۷V&.PdFa…nj+iGiPAok% &ȅ^h2hڇҥKMK5LMR#0oiG풬X:uJGBi3}CCo21m۶޲eR'+ e$#_p,P]de4{)aqk?LrnU2z> vL×sqNi#r.JL)%O]& eA`$&a*}Y,I ?*S4v~eF?Z-l#des`t{^|KGӓiqq,Lo-#`*Pړ- @}Mh༸1cƸ1<-MmjYPr ڬlpGUg)]-LbL≖I<& 8,jmFrrT˞$}j`K07eo/ʱ`kly$O0mo~.o=r7wCޠ}-맍sJq!@ߙXY( B"-:5ftyӺdKo5~}Y2׏r 3,oPy+5|0*ӃdThKܙ}S(7¦=/Zcڴi N{/IQIG̠#w}}"G[mܹ *fEN(}X}Qw7$4+4 As5׸Ją׮Z8 9dW b*joeY2IQs[py; *`Rcv^yURP/t9Q/[|?ܟWlDV԰KfէYGkjsw9"ӷG) (XAGV*xqԚG} kI-чIH4kleSOW_}%~ɕ[ } R).88$ْcdžchYAt\!V[-o~T_|e_' d8rPH;_hx:MpGr6.߸a~5ϲq&R c$[iY/M^06jrH{0=A,X௦M+.0b2iz ;| %- YH-GM&K/y ^K;kbHr dXu~ǟ}mpO˒I׏>,j4ֽ1;v>+Tvc±v]mRVkTh-J~ h-P}s ~Zދ-r+vo{>:u觾ag9$Ǣ7"?5j7DO &M`oϷ~;49OhF/LG)nh s)n ؘmUj)"Gv>CkaMǵy-mksm)#_\Zg:X]v:lv|xS f4?X^龪w>3yo,Y.su[ ʳ>ղ[nwъE Vm)d?eu~XGA+ciR,{.c4/iY/M^p6jz_Jѕ+W3+TX2^P[ݼysK|}psutM t sԷ{1&^z%y%`gnA`gu?#Ǐ}ڎ&ZDoDC=$Frԇ&5Y꠵o:y>ҁnsߨ W4}S|w]|B# G .Pм޽{h^}QÃ>OV~ zH+1z~4zOElqlEQxjx 0_ҁ7FOm'Noo( {W55Ϫb,/DZ`$a,ʱ_&[:vq? n7h9;Tcf981ed%8;cR* hYHC娶XlЗ?O^,XY,ȴ:l?JU+ǾmlRcȒI׏jgl}Lom,oXT%[RThKsy}7yr]$}Р(jn8Fa_hIo{キjwޑˏV߈HÛo;}p y4p>lMoEߘ.4W^yoS7IvQ?s=W:vMN3pU+*[}xZ_ZS`r{G03  >ӼI-4R8裏 .}饗ʗ_~ V(q͍BeO[5ъT .:uN:)u\`'=?~܈p!-^c!4.li9+q:vq? n`ߦu_We}98B d]~gLA[eAퟅ4$IDQ0dȐI2e~y'QkBMSgq^%?ZIy\#K&i_?ͲIgl;g%~[b%ؒBCmo_rG@oDÿop7Ҵ-0pa'j_#qFߩD>X7fBĉ'ǎ -~;oҥ믿^6 _{ݮW_6M>K }K]{@:w,￿V.?%3?nwntlLr: [lEb$?hР[6d׌wh%`m#ZtD [&7xcFN۷o_y'IVffmB %hW2I+CᄏA/.HZ>, 8W_}uouӛZF2W+l ϝv)Ԓ^j7h?Ka?-8r뭷ʎ;Po3;Lͳq|[>8Bp}i]/sVuT~&=&4+8Pv\q6TJrVYdd! Iҫam?qg-:ApkdM~e`㕾,4:l?KWei7d,mo$|V7ȶsVu,VLϊ-qV9K^؏Gt~yh 47k(l0qMG 6۹ }rN农Eysp s~rN:}ه:džkD)zءn9fqhi]"o᝷ sӜrkɝviuY'y.i):JqZd9…|87r #<2[es% GlSTt03)losSkxe?-o2 `E*4hAv/xN9V`{gؕcYW:tJO0mq}鼡 ބrT躢ΛhzjKnBĩsZp:_7GO^{m?~o=>wm N.HJrNk(9 ?}^:}:s%頕H8|j`r(L0uLb#4,6͟_}84Gӵy4 M\hQ$Ev<i&cdheo˗/9-VOV3$洮EY cLizl<L/c7Ĵ]$7Iǎs+s51=&~><iyqNi#δ}~]AemΘmHRf,H3 &/ccxJ *oٲ{-6}9|c*4hl\czy3y(ϟqgH<ɳ)ǾVm<.WUiog׏bzo/>yF>s.g7?/M&&Ie{{q,]{iJ lw΄7 vm6⼽/ۯMk wyEMJ!~zҥK`B=zPY>-м,|Ѯ#Яz b]vm.X //46s]h"{\k>|#W_}6ߞ/]a8iC JcW/׸%iݺh_`-_7\܌o&J#.|MӦ WSOBl?s{%LԮonnJb16Ԯ {@cp_( IY.9T檣6/Hĕ)Z>\ɕW^-:-ԈvgێT q[vRyp5\J>D`X*ѴM2Lg$´j8&N&}AӢ-A E/ zo~|@Uh\I P#NUtOw2jԨ@@@@G.'g[9-7m^$j}(3A X*3T£Rjk0~eΝ;lG@H.-FڲU    P]ThEjSЮ/_~7… Ƭ}k3ް{z|"Pݺu`_wuWU(e6mA@:Yt;K./p@d|ԡv4rH?nt @Ǝ+=|GnWUI'XY@@@HE 0        )@ij       "@T@@@@@@@BCą       P!F"A@@@@@@@4А&q!       @*ThHH@@@@@@@@ M*4I\        Ra$@@@@@@@HS ij       "@T@@@@@@@BCą       4O%")Y`̙rwʕ+8N?tСC,Y"Æ oV4ιsJvcǎ[H޽m۶e@@@@@@@*!@J:< SLS|rdDx套^ŋYpL>]ƌ#O? 4H @@@@@@@(@ n0qF't+4~XM&|pG@@@@@@@Th_Иտ ͛7K^k׮ne/BF7ߔ5XCva#       dM "K.ur%}Μ93˷nZN>d27Q+5l#<"{9wz-|"       )JM$̚5QV\q '*33}I .>       YBC>|f͚ɦn8Z!C6xGYg?̰aqF@@@@@@@ȚʸE͛vr}^j9vXYl~m g?gO8Q&OOc~_q{MH=ȿ@p1[P,~S[ߔnWK/=7۱$YXbE?djZ1ԗ@}}y\A\ն@tw\ToZt??yeW_?k}Ȑ!h"7l 0@}&M -Su/F%ݻwN*y\xCNҤI4$2e,__h֒VZA N hũ-[e~ް&tMZh}X&oƽ9MVĚ73^ uxǀ)0g3f;[lŋ{8t߿hWEoh߾kg[}S'K@]rZ_}\G˪Zg ݥK#N:=zHӦPty/ܵQGU_ )ӂSjoO6͏@@@@@@@$WK}oܹxq}OெA+<~R d\ _F6E `:hk :tpk2Th0#       @*ZAm?`ߥKׯ㎲[g)~. r-O> M 0mC+@̚5F?HjtD@@@@@@Ȋ@E*4h%GyD{PIQfΜ)CuVYen  L{N?{?+O1@IDATO3aƍ7xÏrnB #вeע-ZYXH_̙HfϞ]wy&Í`ia=Uy'ϥ ߔnWKjvtzu[:RC{ޭ[!YA@@Gz}KO[Qxdڴie^ vUڶmk]f2o<;w%[q䡇C=T q)4Mx{H| -b4/Z!ZAX$ |@@@@@@@l X_W_-ǏCdwvzwMO0AF-|7cƌz,X sPJlٲТI?4}(r        P!+{^"oꫯ.]wUj zrk g'p7~:ϳ12rHݨՉ:ʸFDVp(|_VZ[7}.ǒʇN6REh+7Mct~a7.7ץou˓o@@@w+4hk \sL<ٷ[lak!vgs=',YMp)vCa9s}.ji I+4DkZo%X E[\נ@tҥD+C`R#w;X QvSUx |7lI)giҤI Z4oeIʩ&J DKZ]@@@@ zpĈrXeUD[O8#cǎrlfկ^BeڴirYg?ƫ-AhE4hb7A+tD       @%R0w\7/\tIҩSJOڴiƠys+|ߗʏWzq#&LM~뭷4{wygi׮54͛3?L+3h_#       (jM6l#gyի$YL+6xrʽ+>XXk7jԨѾۡezĠk%ٳgV @@@@@@@Ȣ@/{wIkK,UȚkWhЊ EӦMfC`?ܺ3       @Rкu,`ZlU[HEB+:v(͚5޼yMԭ[70Ĕ)S{2F[3_P#       PQO+^;(d:tk"guVJ[m+2cƌ1B|A@@@@@@Ȑ@~ 2X_=zHN|~[-[і F` k׮wF@@@@@@@Ȓ5%塇+V?ʽ+ {7'       Hˉs=W&LgtȐ!Ҷm[;#.2|p1cQdҥrJVh wqGhz馛aA@@@@@@@ kWhe֬Y~>W\3@#[oU,YF駟o[ٳtM&M$|AǎOL/!Ą       +4{om@8åM6FWiŅ .@N:ugvb_aUWN;MV[m,#       )LUh|8 FΝ;vOѣe… lR h        dD 32Qdh k̠F]~h73f^K.k #̲    P/̙3tIO@@Ȓ5RHVb?@@@@K.> `3$@@@<M˳ւ        P܊     Sf$%$@@l P,"    @ ~\"ė?"  @vАmAJ@@@@@虓d˫>vC]PjK0 @@Yy5'g[`oI&NdSp4YbʅɲV '`Y\Zli N+WҢE ;#v>gv"P+޴V'X8er9?VJ\ 4oYfaL] 4 P!=7֏_~*:M.|yp9Jsa|F@@Zh I6@@@@E7?z!Ty_>x'  Ԑjhc@@@@jM@[ݺO a&  Tob@@@@JwU0Wx\-`f"  @u PE@@@@6i*W0X:j7 ~\"6DV\7 3@@@P]ۋ"    P]ڬ&;`3s0@@G ճH)    u-:Tѯ L@@涓9gYti,_<ᅲ\.fsΦA     U$pVdwdSbS\+EELD@@L XpG;taÆ, "    @vZ4k.W| ~c:s|G]OD@@D*@@@@@]\=}</>Db&  BC7C@@@@o g0YrF@@@PM["    />dvёe+WE%˖Fg@@@yi eɒ%iGK|    XhѢKV\鯫cǎ8#hbj#nm`*'Ο!׎|J.wxp2   PWhh $@@@@Za 7+V3Sdrd=ʍ>7}~5R6w ڨ_0@@@ D )B@@@@GoYV~)W b%(  TZ @@@@%ФIeUGe9y0@@%@lmR    %tj^.ሂK]HyYlipD@@lP!ہT     @#9i= 2~4ߏH.+   Py*4T~@@@@HI]o^07';>y`f"  @{GME](<@@@@@64i"W0X{F?wzLi^֒n7 3@@@Wh׿%ƍhPQ~V    @Eڴh%r 2űiܺtmZ<&"  @6r"ہT     @w??F5ix tNesd.릸FB@@ͧC@@@@* 횽 y宽ΐ.r   YHˉ6L:tż&@@@@36A}?UjrՙE@@zRpV)G@@@@`eH5֯!@@jY.'jy7@@@@MQ@@*BCn4       @ Pַ0C@@@@@@@ RаhѢ*d         %i'׿tIӧ4o*N2!       @RmrJyw?ذ>~'ݺuXI    aKȑ#%36m*=z3   P+4={l2d׻wobCe˖`#    +VȬYBiYdI;_@@@#`BC0 ~_er+7l #       @ӴN8۷4k,6 Or4ԶeBZYJ_ rPuӦ7|Z_%- 5w\4iRr޾}mUhc6;3dĈ /%Z2_xr뭷Je޽{`G@@@+dѢEYyZT,]4SiI6, C-˫$ D+,UUz[:x9Vxs~}0zN@۵kMY*4xYh޼߼yD[l.)Ǝ?Ak- 8P:wa@@@@@@@jSbm#jr!]w%<qҩSXSʝw醿 75b       @m|d={O?]N99rK2l0U͸hebvI-80    T͒feh֬Yj*Sil@&.݌hٲCDѲ!KeUlt…iF6{<o79*}ۑ`d{кu:9Y n[yFWm-ovI駟zAٳg˃>m6nņw|eo:iMi{PYޝg;N=Yο(QQEQ@:x;n&&kܙgy&!+    @A-\>:m U ͐},O^C)QbϷ~VYcYt*VMNX X9 L |ms@5@d>S?/n"ͻޢ쇪__|:tڠ;f\_nҾ}{ ֆ @@@@@9eK_SrɷIlh i1sN@@3      )rxq͙͟?'+@@'ظ<1lڴI 3!'?<.pE@@@@Pl#!twtj_} ]$@@@nаo>Yx,YDjM``7NMVkv     E|²ӵ2(jxj]F%ڎ   P]E4?~\.]j2޽zjt"ӧO .@    4@fK_E^xqɷIϘZ۱@@ZL@éS믿6֯_/:Dm%44T&Olfc۷omͨ@iiyeee##"ZV=@:  Mee/[IЪR;R-} :uYAYସTy; w[ۺVc猬z @@j@Cyy^Z>so7=\?.)-[ '7ƚUV9?YX M<+@E噛n:ּ|n|Mwޜ?׍\9E](/w+uw4ar&~oqy{m u%#%/fch[Δi]F-fb'     P@ZxsfjV%UE~~T)G@@M 4k@NN,]ưszL SNzӠe sڒ>iQ1} 0 f {֫ QyR7;n0Xm J. n[ -H 9" jL rg77HBXTmى  @[p{@CQQ,_ưn:588X&L`fc4hשպv&~6-;ld3)(%!!!6+$P׍ P#GjmlU,嬜 2;S̑[!} @ t 1j؟ l9$-zJ6FߩζD@@ =W1pyIddd[sg      aL \l>^w8sQWnC|X!  04ԕA&OlfcЀ      1">^NjN+ܖ;    qΞ(ݢ:C+^²uj|{t\13exR:۲@@_p{޲QFɟg7o̞=[f/Ɔ     N#P!Nj /^mK@@|U ĠA jƸ@@@@@F t MGF&z;ێ  [-ުPV^I@@@@@"Csgˌ>j\gEg  mA _?:    mC _v~U640X F  @-n hk;#\s}{ԹX-[&ڵ˺vxxL8f@@@@@Tysگ$_u꭮p]@@Z[__]^{53[Cvv%K5ؗaÆɃ>(:tf@@@@@XP<:vWVx\@@& T O-˗/wxzP   @ 4[@v] j9>*,, 6}m]3+IQQʥW 뮓        f h 1&&FnF9s|;Çm|$Reڴir(m@@@@@@@@x$6֐K/+Wʗ_~)ׯ'Nؚ4U&F-cƌCfu        @h@I?~h޽{eݺufp[sUx=zA gu9-Ր@@@@@@@h^ hp֭rWZ***ɓ'+ѢA @@@@@@@mPq@@Ġ @@@@@@@h[;h[7E@@@@@@@U*&:    W QrI9  n @@@@h G sg=#?/Ok ]  mP63d@@@@h~ʆc{6~&%em# 8Z[B@@@@@XF;˺@yeټD/*cU    G@@@@<$p8_nAW;\#?%W5@@O Im    xQKAiq=f'MN)v" 4 -@@@@@ p0?[qqJr ,ˌ    \@@@@@ Eʠ\\1ŝK_}'\>  Cw(r@@@@@tnA^:QWKTp=._~('N| @@h@`SX@@@@|I 00PVDD  '.3Gk\VyUc|gOseY]`K@@5A@@@I`8pTTTXС $.725\c}Z\.iб4F@@&4l)(($&     ^,s.K{$47Kl<)/lA@@g4:tH*++~СCmV@@@@@Z]K_Hܩ q= @@I @:6@@@@@Z@p@\wDYp2$ ~nǰhؖ1z  j<ЩS'N<)۷oYA@@@@hyF{O.}Pw*~ϹPBjM=  . x>^=\-Ya @@@@@)1)VG68yֳV@@|CΚaC̙#PYY) ,իWѣ%%%ERSS%--M$0aݴҢ)@@@@@+0hUVXsp@@@@@! 6׎   x%o͛7;Z        @`"63h@@@@@@@Z -w       IL93ϴIl        x%!0+uMV     FཝHlHOIJj8:  @d H4A@@@huV"III6+ rNnDNHX m9'   t    krAau֍6h9 ך ڣS'>\.> n>t  4Xq    к6n(ȑ#%88Qr МU.Q\^*\i.RϖgMa{TkG  @hQ iFk$.c޳h1HOL@@@@ RPPШN 8Fq4paNYaѥGt0^t,-xg'  Zon7\ySd„ 2c ILLt    mN@3346a1`hUon_r#߾#lD5Z0H!  wА#>,]Azeɒ%rĉt<@@@@ p0LƈmLHal8>qPߦʖ/dJA2;6@@x5aݺuF=Z}w̞=[f͚p      =o塆ܖ #bKv{ȩ]B\$v7Ƨ-~ :@@Wk 4j fի$''KRR(AffKii̜9sϖC:Է ͛%++\t:KbYbMl˓^#<<@@@@hV^s  'v~0}c7dZe]R kKz H{@@yOTqĈrmI=~`ꫯ'|"f۪*yG7hSu^ ;~lڴtK Xv0c 3Z:**++믿>ZB3df 5jTgc   }N: Ad1uĵ}Wʛۗ7j: ɿ~Lu"{Hb(@@(@oV`f&_"_ fc7|O?Q4XOS Ծ?h"]unϟ?_t)ӅB-@@@چ@II6ڴ4* tv/s.SޘKm7<+N_Urmȶg2B@ZW248hwȑ#L)?.eee\} >(((^zꗞ_ИtJi;^`+sAm;jرx{W56DJm^yd̙/7yyyZo?"[06 8s%`Bٳq֭#A @@@|G@3Xc_GFfgtN z__ҩSfEћ49nI}W ׀2W@raYQvdZ4@9`ݕhms{6wQ^h/64~_\\ltMhHOOw"66ֳ5\-88?Bme߾}.2..ڮk%99YQhF]DZ@@@Z)8=z~3reNG1o<랍ެ}7j@|M Z\ 9䂤~6Tƃ oseuƢ"k1+Ƕ}߿f_D ,pQmz36m5$xCSDGGNvҪd@@@|B@34ؗ~wQc0>|700fa6+ @[(sqDV8@@" :Zs6TeGҥKct"o-Vnj#IIIֶh˰fgC l)$u?MS6^@@@iӦɓ%''GN3Q=}K/7|ӂX|\xֶWtͺ2UzOMlSthT@/p)p>L+kkkiggh`9b[#u &&ܲtZqtsϖ{z^:fB)ۙՀiKn]wwJ@_/-~|77Ѯ5ngəZ@Fcuyi3ZH'qvT4gΤA.Рө'z3cd  @K((-/lIKT]! @ x%A ?cٳg5ʢ"yEtM9Gˣ>*Ւh`IO=*848(tn:y:   -<  mk",]y2qN|U_9U_Z7l"o^x A篛 NcgH8dcaQRO<(b;yF Ei~ʺP1OZ"ubLMluW;gk >pqa Rt]~_4XA@@@w@ۃ 퓢"4f>}M^@Q`ps )gyƴcSΒ`WOC;@@ {S4T r?~|Cm1m dX ZEB?7m 5HV@A@@@п{-֭3VYYif8qb裏'O Ќ'NF_Mfg5o7N>K5 xS+ =<`gϖ1c4W_]t>H-~8ߤ x`DajPCjjՃ`ѧ,rrr̺'NX\YooL_@A@@@8pР#@ rЩ+W\q>U,X _~}\|S(l $*3Ϟ`.GO%7 r5FpòC߸>0O+J ˔ܤp0  44uX:$OvN51tP:6@<##N2# n(;r3ԁJa XcZϽI`@@9Z}@/X(,,aۓҾ}{-۷oRѩ"+zرcV3Pq2rV;+ ۶m8@@@!"Gu-˖-h%22R&N(3g}JHH~}Lѥ^xL2!xX 9"V~\s9Tp,>Av8p\c-*r  4t >gpm ̔mi>e%!!~}UV-++Υ&5V:ud[ux8kډZ&MTg SNH3Xt@:1   !7țoif6Ԍ\4#]w%}i?cYhxO@13aɁWsZ}=oL;AA@ZtpriܚPw>))]kytJ[@?޽{KbbѮzS>Dv̧!jرc壏>2wk7xCz v|̝;!ϯ֎ @@@Z> S@.]N\twՂUTTW_Rзo_Ez2)4Sь@!й}yydAtݕ.Ҕ6  aѣuSzxl㉝a֥4Ks='[ll+O^|E[zWY*64}uɜ9sĮ7);wtb>qaU   @+xt854?4gyF\jۚKndԨQrp43 ] @Wc[^ ._޽>yxM9K#.>@@An`=#CV>wjV=z v7|]v8p\RtN]D)3t^O2l0>|}U@^Ԁ P^X7\|T    ZyUN`_4… ,:DϞ=e׮]A w6EqP@h-ݣ;L1C[eC~4 L7a@Z@4$''K/$ǿs.{5g͚U~OJ|||{@w-7T6l` A mcK\n 7oh:ts1+,t̨(ZV@@@h7BzxGSN*uPOh9#[o[|WrwNIi;T}hh :-ŬLSvYWF%n C  -A]5}aMESJZZ 8жS@p7="5O߿\~4h0ǽkNl޼Y ,?O̅x@@@hk֬F3jP>4\VXP5h +]vr 7~;f޽f믚I?w 6@ DCͥ gV6e@ڜ@49ZjJVA YYY4;v4S[ʼn~yԀ3fWש-tcǎN/ zjysF@@h'O}Yc9sf ᄈʸqmcǎ5N=~>̶ fYޱ)2cCO3@hW|A9}QHElA P@@@h AԖСCb~ĈUWFR3"Z  4M`{aٞajd'P#a]B#vF@J@7j+zBдux@@@@wSۃ]]'wt(  PGvVks ?[ty澮Qf rMbET; @h[GxAXdq|.m۶͜!""BF-SN!Cx\ @@@Z@UUCWlD8Tk֬q>|öFvvUSER@@iNf.l#7%*$s@|K z_7xR=x^ӊ-=>xbs5ktM5C   @JJ4Nh_JKKeÆ URtڨX:+  pb|@L]ޱ*_} k}vyGݴo:   @BBIYY9tڵ ׭['zVۚMcЈ @U`RUuug;Vz:tvu.@hs=W-ASgz-9[v9)    v%--y~ yW2tP wmhF߶M ,V@hݍ:Jvf-XLzrʪRTv&@ZW=* ,p0`<O8;oL6M̙c%8^hܹӡ @@@mӧ[ܶmLD˔)S7-":m˜+ oe2wr9SeDR/iԘyfؖsH^ۺL~KEug' L91w\'$l/K]Ntt׿aÆo[TO?-?Լ"   hЁk(((0GtRѥ/ƍsصde˖-RYYiө)f̘am 02* Hl.7UVȖd]>+]6eƝSQP@@ AƱ^:Nq=TBjPʄ Do\,\lyfFddd=G@@@|A 44T>33Cyy{0li&:ݘ9s$&&V@& :t3<)56gkCSʐM9c@ l> Nfɡ GbE4ۈʌa{k49Tp\CK ?>P@i.*..\׳fjt0$?Ϭ۷o@@@h&MF Z-hرcܹC?C=  <~˭/05˺,#%研7 WLD0eT[)?/^l5q.~^C/2׷u iEʌ˵g3+?N R x- ,%*8L~?*+~ޡc:E5<F=ט!.4Rw2㓿Yd4=GJBXu<+ PBCC%99Y9bnS'8891F      n̠;]^*5EJIq@D1( xW[_c=u>bY]JrDu+iLea+ `1ɢ#(/3( ຀Mrڴiɲ'ȢEtˀk@@@@\ѩHlKvwC]-;ա-ErɄw+Yo2o*ٞsJ_hfaȐNGS%Upu5u߁־pc N12ʚݶU^@Egh~M:U^y0rJy衇oW(((yr-l     ઀/9ҺoiQ   PӱNf.Yk o|'o,!%2CC d<ˡ=S_eF`]5q!;ƹSdU.s &x5k̝;52i$7n$&&<9vdgg˖-[>"x]+eȐ!ul    @$==ݫXtW@@e 46yT%C~s 7ki>$̶Wڬ?NmQauN7aCJ ^#1:]@^Jm+R>) Wk7pرC[.[Lt f)$lU5vEnQ   STJJJZg5 2I;l+9%+3""?L+$pCchkw1Sęl E(vTai"0 Z?4 f:tO:N@@@@@@]Urנ2@ha_y*``kS[ r`!rZoJ3hnLg J@A!=,_\z)9~xݽuڛ*wu3i      @ Y}'Y).-AsٖsHilw~qy:΅@ruꇐǏE5J@צ!%FKEyfc߽'L eW8@^z7OҠA 6m+Ww}'GC"лwo:u5M󌀳"   @s476ǹ9'  nH\UUU?ܰADwyUe//s@|E@l%ИޕhYe}Ψ~\󒛍&RC-ouӍ`j @\]0~ 4\~/,,'NHEE$%%1g   o zCt@h~5*\.>ZWj6°>Kz$ɒ"ٚsPf=FAN.4#.p]4eB       A쀄.b~й՘bK1]A:v[FZ>)ֶ'V**+hOI}@K rrڵ']Pӹ} T@7    $++Krss\j2vTivŒ/;v쐕+WJII  5Q 2Rw‡PӀ\sYZIt}RLF% )]6%-*o1%J}!4LkkV=uK3"NfYtj n4f @@@j?\~m9tP ك  ಀ-C5,,;m`dwHN-RNid1k&cz ln>`[ƬTIBq%¢Kӡ &Հn4& @@@Ȑ;Srrrn^@@]'ܾ! +s=u\Juh$y_[۬ PԾ2wU; h(228l8:Uc3%E<&l/y@:`yE3lgV ù  P=mh/ OM42'F@@@tʈ|Yz9m2B@@@̩$4˂'NQAA:c5 ;9adLc$t1ɵ5,7fMzM+/o^jUIYA 9B@@@ ٿ,AAA{9v*RXX(RTTT؛nI. @@S?ĸS'("tt -0V5/ |/3~Z+om_ad_1[&2.,Yr`Yʖ/NkTC;ĚfNrڰ x% 9B@@@>sF;w{W9'hpBnn~wȑ#uÇ믿W_}UN +V̙36  mQ`xROYqcr01D=bNAP/of9o]']vp$E^;]D]MׂwGTgB S.9B$좓0}:q)g[+@Mj h`xZYnϧO$:tOgJc yd Ω) ?Q+ h@@@(PQQ!6IIbR }B˪URSS'/]vɿ/@-?\2\Da#C4{FAkQJ+˭ Ye/TOk XI52EI\@$2Ր}bS~ ѯg7,ʃ:t?a=ȅJxlu2dHAG~Y hcCN   @hȔpW9 4po3D@@@74}9~ú}@N9QW v`Q @(<2xcډ]#" @3 6 57lb7 PT    o tA%///HIIo>)++o\gffZmm*XA@{^b1%NAQ+aOvu䖞5e%5)Қr YyxDJq8UC#ϯS #   szsΑۇ~(W_}Wk׮]RY~1ª:uJo۔$k@@ ٢j)?ɓ3A~ ~1% *tّ!C%Y x0X v>m@hFG_.   3 h8qvmOsFȾ}OUUU&?_~Ղ^u)**RSSuV@@ڦ@$l>..N&L`?8p@|A,999{ɼy,P!`@@Xc]$t֢8rv(5Tk\ؒs@tٔ)5Nca,FÏY{tGI֞ @1^ hFCc*A@@@;b˾PQQ!| 4 hcZ+A7nh.dXӧKTTmW@@,dLй}siM{?2[2L 4ASe%ݙR4uYײ[u8m݁->e8!80âD[-[nMQ&u.q*C!M"CAg x x -A`rzq\P@mnY@gMHQ_& foMmEB-t 3Bk0 FQs+زCRhEu)%,C#A0IA03A           >DlGWGU| Z%*[҇z`V nZ&-ȡK' Z!b Έx4 Yvۡ>YuUE6N?, B +jA4c &@@@e]!1:^pj};=tN7&<~{9.oh#P&D#XۛȠvGh@@p/ WW(**"*0a1@PPbQnzd)gRBTذt]MnRo;lm)  @qKsq"M@C傆z}pZ~e{RPvPo3o@g\*d#xVtPp߸)pWb;ﶧzrssHq͛7;>3   ^A@/N? J3dX3!]2q8C HۦŠpn\Р۩'|BUUUJk rc$o] kl'/G.umˮ3 8KVYS_C٧TdhC   H %.~ްw=qΓ7/)" ϝ԰E, lk*n(JkV:]c-#ǷCB.CdAE +/+UE K RzveAР@@@@@@@@[y{lt|{3SiWmϴkxfEG>bmvr߾qC) ءg_ZOcwP^ЇJ8AO @bH|/t o8,?{q@@@@@@@HKKVxIË?;\עB{ݫNjeK1>gCj&U?%\kʁfWV3Gio~}!=Css31D!4El2b&067dnֹoV& 5֕Jm@ (J X!{zXwe嘽F-cu6Orr;AU@~C!?u<&Oԫpq^; 3; g><ݛ[=iΝfumm-m޼|I t(   _^ې hD*3 @^=IL6FTS:p&v4Y~tQ7U7Jz۳D`!p9qVD~P_bHǍM̦8vO::"JII!X=Hkq;%]# $"i,(СG.i"  +@/Wp *E Q x!}ؿaW~|c5CP8PQ2 }WI+'/"ٱf-Pclvclma|lma?~h ,8!Sf/$uɲ z;ȂH{E h LHYi+ 8yf =ޮ~ [&?޾PNFf++&3!hQ7 ~J;$LQ  솃U} ;фtzbu}#; zg+p?on[4i@eThTbtQX(NPw [ kBf1@@N@rb9]Xwo3$t S---TVVF_}}ѡ4IYYY1"  ?QIfoiv3iA@ Zۗ_Mi10|"PVצO (Cr WD NFVOW }Gt3Ăʕ+;s  )faEMmNkz-:i$vDXgPX  "iYTRK5&WUo=p/ /;t:VWWgQ3Ae:]K-PB=8;ٳgӲe˜->Nh4ƍK͟?}|d>t?!*i̤H I *@msp7 ihzeO1tXLTRG%͵T*슢DKqgpJ}qEI4 һbX~[ǰ [nT9.yAEAM@O> l#plw5.#X,#?8H! j1b[n0RzB/'I&S𠞻c2$% ,mj56KE?T5Q% 5T;ZBXdA2; !!,j.vA+        %)55;e;-fɺ[sDD Qt_8:!XhP=Mzabx#!          ^O`x_Pm(C0i( G0i[h    0D%-uCxz^rAK*p) gw9N>uě:Ľ1$A@@@$pόh٘3D`lEUm ݭxy)# t513%%%7n'E  rit ff+ ?!@cS7`PEKЁunU$#+ 8OxG(//ϣؼyGG  J7]0: 9rb JPAEw)1:fO3%i@@@/ u m& JEpVJl~ ~1@%?YRMGHQOPrbtI[1naB GoSbU{Xz4*)@@@zDI#  #c         #܉[s['U7IH)~$]OwvѦ+>^ZO?&z4.@  h7      L ==f.r'ᔜL>::jkk***Ͷ Jy55L  " :Ҥ?1V[xs; !`   `E+8&O$vmVgZ@>B+F:YDA4.5c}udUR^i=l2"6BbB顔ն8]@@@FFu(A@@@@@@o [;ۧdӭ5c=+i2ԯN`Au>s{Σ@~w~+uq% (. p/ZWHp_ ΗqI4eCA@@@@@@@EE)SX **222D*^Uw`E Flb(NOOWx'Z!6oJL n<qP龿nT ҹci|Fuhq=^#\GpX5&/aK]/ʹyeShVN2ԴߓI>yng×n@ ĽPmn A@@`v1\'-->]1+M&?!X@/ ] :ISMiþ")NX\xחҪΥs$lBtYch?/;;%O\V׷l2d~UV8.[:աvvW_!>UpJ^$8H'&r(.( "fckL`i5'PLxaoW5Yx+~4np2uv.Y<e<A@@@ + AzLBR7mDk׮+V j4_5Jٴ4Q>%֮gF{SUJՍFbwZ&_y *z]}ۓ+X,0B 1oR}&,=8|5'[kpB{ 4;'& A D<WVsQPP]|^9Ol6˪õ^K:|xw6tB3bhVPxx8շtQFo+]Nq?!'TԵRYm|H3]('T3%IN:Tk-BQZ@@@@`0FP__OJDe0,YdeQ@@@@@@@̟?ƍGRŸ'Zz5sϥ>„.]vIyʬ>zh袋p }#ho~S2Ά E<[W1.QsD-H݄\0#KdA@@@@ xT-lر>ڶm0]ߕټysq@@@@@@@$Uޕ˕3H[XQOIIIn*\UU駟~ C#ppYS4w66e J1:4+ B%N$57_    # Б#GF k@@@@@@@`J￟z'CuuiSOQJMx:j =>&]1\~NEoHCzzJΥ3G .BLaD~B{_;JyD@@@@@ moK .H ;;֬YCW^yeZpx @|Wϡx e%ML׵еZ;ٝĪ[Vs[SEB5 @@@@@׍cڸq#߿O:ƌCd0MF"VN{/kÇusC-?2226| ^D )@sݴ7OⳲKQk!f(m6 (#!O_AB>O'4Y(,#vu     0,< ;VA7-8K 33n&iceeeTWWGd6)>>())I;[?x0zshqm;RNBQ`r:G KuOf~3 hTPdh !D@@@@G ǏWUG},Y!       "V&LPG#l‰[{Hkݻ kZi-TpT]%hm Gm#@@@@:T B}yHŌQbAI/2!WPNm&26+[\ݬ$OJT∀p!1 wCC3@@@@@@@I(//O)EWV9RnnU+6oP+iW\<'^5k|T% CUCTJZ85C^dO^<3'Y#    N\F˂^rAAZE         00RQQAV@@vYn`2 3k9J)q{VaarԜ )Jwn4t:ZtuÆ d2cD@@@@@@@@@S:::h޽~ecq&W@^'ѪΥ%͙y6c˟R[YJ=>&͂c[n40+$;-` @@@@@@@`BBB(44j^2C9m #oEfK43艛Sww͖i4|r451㻻^6S#emn }$>^I&4     ;wsUVI+d4iʕ 6@@@@@@@|/8`y  g{Jh^+{OTј\]btx&s_%J)<] :GZ%Wk6U]:w-9J9:zi:\XkdM-!#,}⋩}Y2ʹzji唚J))) eP@@@@@@@@@l |[nY o/UַQaev;1B?=)HoV}Q}K;}@X +!BEgybS ^G v\eq ?|>EFF`,jAc=t'tz=U#DcSY. -Ql:PLejɎ<~LpQRbwݴnG 'O4{--Da%́zf2v{ijaai `k=z< 立 Ḣ %Pd#Eu_ǒg{utƨxjcixbF#/v {{:U!ak ɫ6W'!Zϊ =wˤ/  #aݑYlh6Hb&!r :xC Fc2ziƍd4<{tSzzrHp?d;SyR &Sz|;Yl/hYf?{ Za7s&rJjo!k3DSF驔Gכк}_&ҝO4ߏlm sib };{+aeS):{4vL}R%}tWRJJ6PKo?'^}---TQQ! )>C+h޼y,_O<}WxԿDLoX,Ke˖O! F/ϵ+fPw]TݚQNzԀvz᣽)v!:jZ8&sl;qbe|@E}-D&stao8ϫ(R,R99yonw(fc㻻)MX'\  'fb!P(⭩Z$CK ݠEXki_~5-b5]u?O%Z驧+V… kJ2M^R^^.?P~_"׿J}'hxhsܹsT 2 ɊFx[lOHMD&6KE BCGLܱx,mBf,Eh܇Y\e!دsD bC  ӍxA6W̠߅ji}֐jS5:sҪ[8̃  0Y̒SU=Y 5^Wi.&k!hk.%x +1C\\-YRSb,0`슂-5jT۰a!((-ZDْ vsqQڵkRn.ϟ!      L>C'؊'|b{,b˓e_~ӟZb)С*n ͡A]]ŔIKg \pub~갦fAbEyb<:VRT碳hqBpf_X䊖'`xZb6k\Ew`2BbW;b+~V_jA@ 8PC)Llm TZˉ﫮`۷u﴿W_,"e+..@%=&&bccmڴi4uT)u8ثa_N!!K%`6m"衇(88nX0eFwyTDs̑^ʼ[ʏ@~y/vr؃/`논@@,vdא?3f[z뮻@J{/8U i4|ΖB]VZ8vfƏ/AI1*QXd[;h籊>UO>q|J+>+a rTs|m&לW36P L#VxB46C,p+mbSMUR/[Kd!4޽? 5뮻N8J/P*  p1UUUg7onu>n3:˛o)%޽{%Q:       vܩt,J`mؼyUҙgt-o~)F0a9 n ֡ͅ+Z]0l-Q0^`F1`^we`y]hfC:iіLÐwv3*<V/PO'pj:m 8}GwQ֫V 1MN3Yno$a1Qac54VX""&sc .-G%EXw] z\+#^x>~.xƗ_~I?iq'MT]y rXpz)9Iw4 a۶mJ>69Ћ7PII6~V@@@@@@@ 466ɓ'!\v aJ>{V Bv8n, !"pMً3ϕֶ Aݖ)jzO?%G {1z7)*yUeFJZĐn7ڔfDD$&E"lQk3fS A@@@@@@kuD8sN09bCg7rxHc t۲)'QlD(uΞJ ztGHyb$v4ngۄ{YD"Hg_ۼ(`Iq)Bt#4*OJl,ֺSLlUssx]hW$ =z YʈW|, Ihf0ȲSUc(+%?RG [n\N#8̝;WI/H> _ꫯ[شv%cƌQJq~QSRR;bbbH6)sS*C@@@@@@|bi5 w^4G&8h$~ /Ƕyf6xX"66NJ3gΤbueAرcE4ߧ 6n4k_&[6sZsljh 5JbycAb"Xp9@O#2*8,^o շXѡjE;psN4yڼL<78LliBA5H56 k =/E 7d¨D% ^Y{́-LOhd="hX~_s= lq'ロL{ݺu^%hP8[MO= |*@Ȃ$]p       -xO@MeVVUbGX|:Yfɇ}_|U#7V |7矓Oɮ>9B~!]q4o#+.坫,^;c"&<&B>.GV<"Â-34(TF%F%3sصmGssm'hji2!$b肙c3վ{.o ?o2I򄀡էIQI4& b;-` @n4ݻ+R9v6&ovzOƍs*w_ `pNfWئJ_12 QVZ6y $ `gp#+<+p /_G3wpDg*TPP ߧK* _n+a믿d~+ >Yv$h`͚55+V A-ؤCW͑j7YĤcOJ?ݾ.*2-^0#nX,V;8|YYN L׌]D"KyE W*NeY40oF/K>0HVkh<4A@-Z\#X Y_Z?\$qBrpRzX bq(#*A|6WWEvs^ 0|Uw]`"hJKK}Jа>.r2V/V jESPT^JThVQ}W3/Lh8 NE#!,V3ؔ@!SL_h@p\N`O^W7;WHl#؂  CENHʄJ|1h-="^XZHdʒ.87:d3 oߤ́:qAy%\aTCP(//OZ)^Q}yѤIf+h(-Jͯ6ʆ( 39W_oBBB{VKk뮻*t4y睒ANdQÜ9s(''z-I5&۾Ka l2Ү.iLbPr"JwAMGQor@H{ӣ>:$\#1b{k ~uěioc<ydxQ8E`_?7@A@DtBXZ`Ci񂯺F cY 1)x]E/ްn4Eu`PWp]C-wb7r8q"-_\>쳗}'3L:CyA@@@@@O?eol{}}($$Tnn.8p*zJA>Կo6+1z(͓&N|M)oݻW5!$tL HԶ7K3 >H"!pBHExD}GxZ߲>s>lRkeЊ)T{MD@`[:kդ%Bv!Y_\Hu+_ ,&ek Sh b/ Ģ"_lMA}W%b(%}I>9/Z&L@wq'Ru1a+ph8K<x#%KPLL2'mf GJ{/X*öm۔n~_;w䞢Dʶyfsn'/GR`-Ҧe,H$C4%PAl^ AΎ[-k@%mmA,t Zvˬ!Czha< K[pB~c%{-.8!\*3"/>]xcȑ#C48q,7W|pN 6h+XYAm~Ƥgz\>\csW%dZHML]}&-)yg]w2HNc{*LONiaN ɰ޺}}&LaiԴ~?֊3ϔ:~weGRtt4M2~QFF!ʂ2̚5n|=;v.(9I4X^Db@٠K` R,lkܚBY(D)᱔+1RSD73hݎ(2.R-0{\ !VHlM t%W _*pϤ A:USZ{xd!æM$, r UРvl@@@@@@@B/\ڴv=;;~… %rޞz2s xؒ:ٳ5=JW]NxM,zU9s& hay KA`@ZLiĶR@B=;['S E8gs{Fʭ奈 E(<(…'D缵,.^\#\PY^(n.J[R Ņ+%˘1cҿ% V^MWʑK5[2*hu!>>^S҈]n+˅@zaIa im'X~s$äLB2#mAmt:O1yq+uɼD)[-C D@, [lh8="D~Y@)$5F]D (ho_&YYAJ>`2[?{^=Y)[В~sn_+9mWф (y0^#+W멹ǤɆ z?^x UW]eu ^"6(\ytI쒂_@J53'$$؃nKvr='`GMM#/bgEҙ Nar()JA  KXoeTT-D 5*,0x*œ&a7%5!pݪOizʃ<"h`v= kN^{-]tEhTOرjvee)p{9%E ,ޘB؃vHuy, nb+e<{@/]Yx""Γi”j. -Wq{ptgrk M7Oڞ! G̤4=q Jk[h<}(DY(ph҉A;I'+N }5[@ɫ/6{CtA{d+66J׋s E ,Xhً8[\g .HgU}UώQ3NK玥R8Z\G}UJͭݚGGӏϰj>,82-:aюWʡU.cp. On:WFd{ɓz*++%CG}exx8=䓒IDBGؽ? 222ݻt:tTyjeYPP`fVV1@@@@@@@ svy xcr J4n8> `0YyeWiV1CCCm۶McCjwTle◢rw/ZpSj+ow1dYiߔ3O]]3E0az%~3꿈ͼM8a7:44S[:fb&:&aҙ73}u}-U5R.m&js:(ƮN鼆M%8KLFRNX"e%X/oC yyy߶zXȥ~3-;euX$!}fUkfSbts1ܟ C 'N$vslhhɡb:X[DkGߋ?_ o(ANQI8͙a~5bK5s% /şY{yJc۴iӬ@; zKJJh:n5iҤI|Sߑ#G4wN3ieee =>벳) xJltRO6UJks*Gє-S^l#,wP/u5a_|MMEwHJsBz]WGI&& = 9qNN<}y*9JoJնA.H#+EypG給Ak{L2d;?\>_1A yz@?Hx(_W.yx Ԗ|X/D7=ܣ0ӝ?J1#J@`      ~D ǭ[}n eAÉ'?)y晒{yB(m_賵Hg/.Q~y8\~6 H)LT8ObҞ'j͂:;>y{LoEC ,")u^WuP"a/=T fnVL m]Ay; x>O7tS7uPu,L!:jMfaeUMŒZxmSOuIۗ (@wP@]J `j(Q T=zT|p,9_VM֋l/ =rTXX犿QF yr⊊ ۮ;} X0tJ8\ѳ5UM;?-CUimdHw %vJ[}8]YO߁lN9uȟ K d [рMM[rn>OEMګm릗v/!2PnGha%aP %m:['=oY26'{/ }Nhsʕt5 !dZ} +Ҁ E7В%Kھ}R=+@@@@@@O|oիWK=f٥޽{ŋ#H:dSAo$9) /P { ljdQ=`U6mV6#n ڵ]) @@M ^}iMKΠQVuwjDI[&ۼ"di 0Q7IJ96#xY`C]ھZ  <[֤-,eo)1ZÖ#Ut1d85&5 /cpD]j` um k5ИnMrXxIXTj@ "(Vu=_m4/ FW9z.n֪=Fx PBzyr؟L57t01,bx6 z6?DU`KpǞ೵ u౩s%\b7 aϖ={曭UeO"6Sľ@@@@@@@_ǟgvO~_// wUV?n{'m]L WVe ʡ$徱?J1~sZ_lW2l_C'{'-bS tâqlf|Q@6tF]yIp{ae;|j'35%؋8 }@cO(V7u{S>Ǎh!TCiot},9Z┙hH%[q>7NOz0*H}'`}ޅ.`hw}2 141:GJǁ3YkpϓX9o9NUl\+g{] OsG!m,\萎Cr{40ʊH1 4&"B z}7Mf,CWq% ^KcS^^t}W_}gZ%yQg`'獏d.rΙBeDT뒤K/%xs%yD (4Y9~ iKhS8%+Ֆåμ, 3gJXٻ8k U{ ƀӛ44BIx䅒jH gB3ƽWMһgJ+iWZVw sg̝VΙsrJwͼ Y+$BntT ))), \pk&v f?ڍ!"VA#UxYvS@)/:$jۮsJޱ-$83U`4L0^B_Vi]ނ[xR2B H$'e~$[O,I3LxPkyxQnEĴެ[qm%Jd5kY.@^u) K ؞Mz" 29)>(n$ )+ YQtfRJN"$`A Z8A>]:{ e=6ިSa l~.׃6Ճ ]srr\zQQQoc޽m; F,XM \(@ P(@)X]o~-{J;$#<=gj+әtv*m$)2 ^w^J`p*Uz|7gѮNc ӬQF kʵp@=ſ_:]Q9V8^;虦$aj0Dv>J<_r [d-ؓQ2H,y$; Ս?w,&q Ip5yjh,LA *>]캄F3+jQ < Oқ'B]$ArT݀y*[uu Wm/7I?g xy-d.zYz{)L j9)gFsK~,y޾8 Sq ?cõ 8>ksU#wFNM4mU^]nlZ{MH2Y48nL,tRdχ /Ia +_(@ P\% ctJ,^Geƞy ֒aZʼ:Dc;/mS\UuZÃ|sΌb8,+9?wO 2 {"Smm5j"g#A 2P(@ P@vv6dsL/f̘ R4ֹ~]e[=A2|OUOJ9@ٙ/tYu܎ӶrSuӁl產IX287v'}u|dB8V\? AwgE)#figߒ~G~ tHמq3cstv4F 1.*cUx5Tꦹ-7e,n/}J]co'~t$c*~]FoF3>>߼9PT` 2!:ngGŅ"#S딠*mzghhl B^dRrtYޛ|KB?ul({OaW 4{(-=V,OZ nH AZ7V# ñTknej^eUd]>zU 0-pA~&Z/ A\`x?zո^3dUjhċ(2uٹ0պ7 wu=jUƫ\j,_j֯oI+CP(@ P(@ e&3||Q) $$$`ZLIII]^JFFtXa@ u!zqQ5 7jzrcnga :&2Q{:6? A^HGO6p; ^54fM_o)*$\;] G: fh2գ64ayh&~h/($ؾ_B)|ucK/Q*HPliʚ#m3VW3yzOi Yg8YVJ4/s]϶!idښzHoI :>#T6MF ᭲Y@bu@љ[2-T7IUoJ TmAa&cdm=&$:ԡtoky P(@ PzA@n[0n-[__厓&Mnt''+`ٙvƥNoYفOlo{\2n`䘐Z^žN܂޵ןMr~I/ ߩrVuUؔ}X,O僄 G@S. zr>hm҆-}T4aѠ<015Xi&uI_Z[7lF]P1M hj fhP! #;dRFǫZɄa)l6 'q6Nzۀ!Π:D::^]`ldf^^jXhdK0wzej@{-#7eU`0/H6*A&UV!d"yXDU H|UB*D-Yu-] `@}uPcg뿭>dLޛ,#`n}U|z{Żm+Ǹ0 83.Xfwл<:(@ P(@ P(vtL2Ggc8+H8*Ɉ41|x{OwI ݼ%KKKCLL܈9zK` hL:*2dI_ nh r` rGʮCe9oAԙPU_=IXd^^W ɨPV_ՍZ_֕y_uz?5,Jp$ඡ*¤v<T__`; u kQ>]+SS5v쬴9b\T ???,ʶmS(@ P(@G<|pf(7>liyy9^u,[ ^^oH&W_})-Zp+y:˦W6h7܏. ޿*)W}y% cS`Pc#mGsP,'G%k !7$A,3͖yë^)eΔ3sf*xaCvO&DŽgWNýWLEqE64˟{oː!j C{_e$=^< tzdl<[Ȱ1qjw#7¾S/s5IX$G .M>hu:P7ղZhEW!yl,* o/xP#>*@I&OP#g,}.R!OhR2MZVe24s6\8$j r!sjUQW˲F>I֖JШ\Xp$G#9$ )*Аhm.AZr;3Gۧ`'}cчDƊн?UDAsf׿^?S]a P(@ P(Еdh6l222o/^g/qZOuCCnsŦM]۵/eoV'z  GY?tP;Vo9aXq <65m^*hZ^yt k:Yh)jޓvg{ݝvrS{q#I5DNUt`5&dy!E/$j _G R‚[Ȕ岪:h7eY/u4ڻ"I?տ?\|9m@VQq ÒYi6fylFk8X l*`QuKPd!F 2$D,IV *ә0ī 20$p*u \ܺ[Ėq)".pz@ SP(@ P(@C@ =%#8 f00\T٫NsFdeei7o= (@ P(@ P@ꫯի_~%ʰb ;\Daa!y[JoZ _/K04ǎӦ$-~#44&.S GkfhCOROk[>쪋S:\G52rJQUۈ? O r|I1++Z0u6T`G~p4aC_.IhCG gjUXi0R>bdw}H CGW"n AC'aU`CU[ L>*hҳn)`C@bT37T C3Pl\>W!V ?v6iy:2cհX2vf[}cѣZ̙3[wZr%dKO79(@ P(@ P` H6o?q[n7ߌEA,@9[D&z~GEEo{57xd9s AӃt0 GKJQ/+}Yh4fZ *峇#dd8O\w`,LM25D“Rt3QRs]h;̊+Gqe?NƏ.ArB[NbH(O|djl#C84yעѷF phBTᡪj.P#Ob!Zf 3{; e sTC e=9XO$Bzz֫ S҃d[^^/*e P(@ P_eό »ᆱM36o$b. K.ծEa&!!2d0 ^j^ MDxJ*k6S7&TT׷.Xw[9CZ!LOCօ!*$Lzɩ,t@9TAko5 Kn&i>U%觺^ AQ u!2~-Qv &"Z3U&Ry%nS&/O-H*x^c ?n@;Fdy2+ TJ5W69ht~) !ZU'VM]g RЂT Fc@w|e)91eyz(+fh$ݵ,HKK\:(@ P(@ P\@śow@ 2DCDDj%A& PcOv֋!ၸ`vM$3CG 0>^7>ߨ,@~fgMq4YE GZ\ML窮mp]5:=iݶ9*Kh7ynsr}YIwv}v@ܺh<~~4uǟF:$TG{$['͓ dr2KzPӌw\4y5^1[M^? jvqM>0"!> B} S*+ѠR{i  ," 2K hчl1 gv/Ow^^-m/ HP~mnI&{i\T򳗯92TX S+93=J v U|ϔ0}Y.ReTV?,kO.H^Ap 裏"''+чV|aێ6455iTfff^IB P(@ P?m۶?|wpiZxymRRƌk|HŠ @/ n@n -kf %6&- ᛽g[hӗ;OߟKT0Ŗù8_ , 3F nJݧ7pcQ)O,AD_GMQcŷUֆO|+wɔaoESP5RgUA [ ųI n BhzBݣ 1Xp Lhl2AM2IK /uѤ5A^n^TA  A ~3?&,@ $0h}{{}Z f^da;>o* Uז)ٺhFjV[mFժ@P>ULM-V7k5 u5wѫs6 ό@Y!SO˼eA*!'!j(}.AQIP Hv,K/ h%\;wz@c?>|ADPYE?,Y(@ P(@ PӧOLz҂$AB P7F Pn~KJ SO?N 0X!j[LjꨜPǓ`Gʑ_8ЎmWF0< K&i Lc3SŸϱח @}a ߲p.5 ##0 8tϼۏi]~gQKOL%`18wb>v{2 pHҟu[nGMݫ^n; 3F)ʻ:ьQ]50յD@RrXnljjFie6DHlu5A\`69r&T7ԣNդU]CԩRTV#5 3^ԈHaV?rG?z(WK ܗ% fe=!x{z[]L-{`'|dR$GТU}'?ˀ'Gl;`z-|`1N8ѫ;}٘={6!!!x|T(@ P(@ QF K5dXh$;^*[`gz>H@e%f !|p&]֫kQmtyB'5pK>ؔn\sT`^F%E@9q#h g.hP1_X딶,OW}?cBp<[m }TPhu [.A 2E  ,-lXl9n؜_.A-(~2TT[ko"B:1}4Aʎ f|8\{Hc[_6ꖕ63xb`cTonQs>T* \/?:It T2d5NH,i{GƽWLֱ(Й@dhJƗ^z ?o3glצW(>N P(@ PѾx7س P}, W~qo?Fuڲ|$^|?4,r뒙춙d2omϵ\mW]ƫCqE]є1v퍆ڝ-Wid8=Xvp;HƉU7-A7B<>3ƾƾ ^ % ON -یl_Z&<Gju2̄qm|!\`͝4-HFppX ]R1_^ɢ[C*E*7exWŲMF@ڗ ?S2l RoV~$FuyyԚȞ}<(P:Հ(@ P(@ Pp1dggl6#55iii2eVKKK3/܇CF +UOk Vw!.'l3yd84\uHl:C;;#0*)vSH&{#7"-ReZHIe jlۤ3dlW 2 ?msss{l0h0H{ 6e; P}аb ֶC2c;P(@ P( /O>A}{ծSкk|r?~{eeeމ@(ϵʚ)] Q`-f[,Wn[7@\3w$_8n^<˲cj<).otUMMerZ=s G[ow]] ǥjF(@I@Crrrw}(@ P(@ P999xpN z _5~iu>W:=.7R+p\  8R6چFGw|$e⛽,3QUۈ`_LNjazs˰ /Wa&7 9c٭O J@2U,?o;iMg۫vH P@4ܗ(@ P(@% Y.}kCHӻmEmxmWsp3J{S\>oO36ѡVYҽK  *0K QË'gfo-|<-C\D^t/ʪ]h5}WMCrLHm\A Pp hԓ| .BgX(@ P(@ kf3#F@HHN:L^ڵ WֆPYY?Xnj믿v,{ ϬEnF _r]kwہ0l :$R"!LJG(=sC6<O> (бi)71ѬRT5hCL1-(@' E@CssDqq15J;$}dcc֮8t6l؀:4: P(@ P@?׆? `ӟ'N _|1uEEE~FŠ+0|pP-p='9|MXyw;|$D9LP} f:9Qg>9wϵf PZO$>Ӿ8}~!x(@ P(@ $Y'O / O}%aΜ9s;W]u,$5 P#R֛3,[0Ve(nwա s%`Ʒ:W}z%A[0K1$ fxV@\(@ PHU$G P(@ P@ a@IDAT}⦛n'SLARR4p;?),Ybu P LŪ/t` eg:\M;ts#X2rPWoFt?2`QqX: ^_{PkٕӺ { wMZ۰@_B|ot\(@ P I@Ú5kƳY|||ooo=:\jjDee%Q]]b̗/_. :V(@ P(@ PUUUV S&L`48qncǎ#<8ಂA\D$qEm+<,\1A֊#@& U,􀆬J7_ef!:<nMMͨGʜUIm I)-+& `Y`c(@ P xf_J6?Otz0IUm/H@Crrȑ#xq(@ P(@-`m~;w`%ِO@8kL6/`0n=e/G޷G+v&$t]c?[3,w +(@ P S(@ P(0x 6x.WJ PM~|$l:/wzӭ'p,#yxorVWΆtu1tKVm:[Ǟ1sOgFF PA `Y$u_G2rX-AK`ĉѾmr(@ P(@%7.WK P <<ܒl`09-Oo+(@ Pˇ rѪn9DgCNNƾB P(@ Pt#Sk‚|oŻ"."!zZ;zhb}Ùzs P(@, 111 Ciiƺm۶)$$$ǏGCCS rssqlc+(@ P(@ P(62̄LE8YH ¨p$ ͟͡l3Q(@ gh?D'Ol{2-+b}}=va,[Vd'N:+(@ P(@ P(*A0r8,.J+ P(@py@\Ĝ9sk)))~#dgflPqY ~xP]]m욘hY(@ P(@ P(@ P(@ P I@… ohIvKbŊ8p>22s|I͖-[PWWACW"""lm: P(@ P(@ Pp@ kwT6 <Ӣqdy{9p$6(@ P@4Ąm@VթaGQ[߈ u۾c(@ 4 6^%(@ P(@ P(@%IâH&yWxPʀ_.?>݋Vj"pͼQ4HY(@ P<]}B(@ P(@ PSEq-7/==/{GFćv=]/~Za(@iGM=A}Y4559<(@ P(@ P(@ Ix]K2 <|Ynq;a'LN>څ3Rn몆N㏫)%/n7R(=fԔ#YjRLWk ?r\?znNЏrz@Czz:~®;C '?-#qm::깰XE3y͍V]/(.J ~}c BGqT{%ְA=mX"RKf!&,/gJ]愡Q)Hxl<²vFmWJRڮ>e0ɵNalJs PVˀ-A-u m =9 Ԁjy睚cdd$nv,Yd0)@ P(@ P(@ [Y0}D,dpf j~{]xh/ea#;joNtA wd@#`lK PPOl7֜ڃydl 85!??0,**B]q{F P hUj*< !<;vkTVb̝#[{j/W=ms'ovyY}'7}T߸(@ , Cॾ7275}aSbnˆ(@hjnB^UX!e.C6dV%@_˺ >a~u)zEG[?նa<3Xd bccxgO})@ P(@ P(@ Ph/Sٶ7X텋f (@ PՂ -xA+dШ:*֕ Au o?$!da|+!)) 8~zj$Ej2Uc=h7|(@ P(@ P(@+؝^ܒ.'N蒉 (@ PIA(Oe# p&ӂZWV_3eG%w{GwPCD|PX/O "T C} S7x#}Ѷі-,t޲ (@ P(@ P(@ 8O 4<j3C]/@Z7,\]&F|Nh;f҆8x JKKQ[[;`x!(@ P(@ L.gZ(@ P` ȓHզvm PpoH57j .d`? ?am)dX ٬-u]طoVh"(@ P(@ PN>]vyb P(@ PM !8饹.b'@4횇LI]/*S_(@ P(@ P(@ Pz_2 4bv?z'!',!ORzHYuw4;G P(@ P(@zٳmT/>>>9(@ P@hh2#2B ZT -uĠU63s4$@ÑZ"x&A|sXf}pbĈEJJ;(@ P(@ VH\wcc#ﱬVr(@ Pn$PZWePe\в.R4Yvm vpu`JoUBbpK'6 DOˠ(@ P(@ P` z뭐(@ P; 4,fWP uU uNn^U)UF~2"<G \h X3-x< I@Z[(@ P(@ P(@ PFCT24zZpAoK?4B[nPRmQ***lv?]؈(@ P(@ Podkjj,Znv [SMMMV0;jnU}cۤgLm{w䶟ep e\5d+Ѽiv)չG곫:t> h?lقw}6mB? ~(@ P(@ P\( TUU֍:cW! 7#6E}z֓FVTA%NV䉔 )9:&OތNՎٓ z -o=y =J/~Dxw-o?QсN?@9MۯfPPm,A"W>>>efD>鳪2fo8g.qVCP.ŋǮB2?ٞCqDžc͇rydЋïaeuЅܷ0z8 z E@*P!%-szQ)nqcٳ^RPu֟I4!.0-sz\@L{Ɩ[W,?mo Uڢq X(@ P(@ PdffZ}*iii}qAsNI(K 7.ܩb5!c[40e ڶFw2:*~_z2.W`θ;,KC˟նX?Gp`OǎF`ʅO:/(@ P(@ P(@ Pe":2Ԅ)!]ѲMF yUV ѡP9؀*k+ ]B Nڎ'2qD]-D P(@ P@HHH@cc]}vOn600桡1P󑛛Mm1o05i9|||ڽu܇\充 b՚5kp7ۛ(@ P(@ PpX`ƍx嗍~`*xG|rKˊ /?nٌu PzYhV ~wYNM4 PjTp™` Xl\d0puUjEwיXueh0 `3 - o:y >)FK 7tӠAR(@ P(<7|8y睇K/Xv"Ceg?C=*Zb{ P) Ҫaƒ|s?PP]n]:BqmU,HĈpYUzr܎MV@LMȮgZ@_PGq=(O$!>>{/dlK)?u[5b7)@ P(@ P@@ؽ{zrzڴi۷ooce` wSs΅zILLԫS@/ Vz̐Urc9QxV[Cxr{Z&K.V:2!Z E?ѮmoI/קWe_ ѽ`nD:,(DC1MY0Ks<蓀!]x1ԍXj>S,Yqqq2d6990_5^(@ P(@ P@nn㭖힟ߝp~* >ln_Jf(@a&cdTh'`=&0wy.i^fVeK''۞N;W< 5rxY9 j6/K c v۹OO^}U:uJ.deeiurK.}׷_5(@ P(@ 8JԸ=fihh0P(|sp듟冠^{!.dA.,5+gw)pwx# k7 YJo|UJQmgSoG/Ȋ)Й@4lݺ{_F P(@ Pjo>$$$Xstɓhy:T=?S/E}cP?aXyk@ A2M,*8& @ݛ: <:s1!*9U%ؤ^ٷjus ~B?m`1ôL yj;^ $aWqX^fj0^)V(`@4=(@ P(@ P ȰedUa\p`ǖ>ȪURR2(@ Ppģol17V,ƈpc+VY 2 2BVEQKXl?שUS3 GCOK"d&5z:ӫpx?o{_ VL£sB01:⾯^Es Ø0s;|sz?֝n}p{sqה-Ejh,&=k_L+}kI=)0$ 2P(@ P(@x{{cF&ȯ nvڵx뭷}1bc Pz. |eV~8aXƔ +n+`njB~u R(ւ$hA ^PA2Bi]U}?Y^ 4xp&p!͆L κf? M my[[-O$k~ g%63>DaGFܓ+GBt@?+@}v3(@ P(@ Pv,]>gdŋJcc#>cȾnC S ƑLs?]>ea X TXy.N! y5(6W#Ws+K=?H^}-+XgZ"SAo?֚32HtT.U۟!렖A#^ h)P\5^q`}x-s'vQ;*_oŖ(@ P(@ 9stwfj*Hܹs.0I=YWXX[jm.%%]t:.P(3'W߻ ?v6<==zv`Mn )8  Bhwo{2%87=r=QeZR4.E0tVUƴ45T>4>؆L\.6,4zbldӍH4H.ZaR ](@ P(@ P,'x?QT[^^z)mDdd$bbb Tȶ|H"m|Iu(@ tCpf1~oc2+ w-9G\vl5$ "ú$DT.;OAʚd|j# Rguخ -RBb:kjlK2s[P] xvق (@ P(@ P iaaa6{* ~ڵ 9993j2dcq%(@ Px h47i;O:G+7w홺wVE1@G| ; LHIkvPNWQg^jzsfo P~fhߊ-)@ P(@ PpcÇ7wyÀ.A8\s5X|9N*ގ)@ PxgQl:zr| ]]Ǟbw{6A6uZ;v"& i*6.{EF%&59ٻ8?uZ]V-7 c 0`C B桅B}M1.r ޭnɒެsI:ɧ;egfgwg>wHXfxhOqjg"T.UP+C u@ya   t2Ho~#3gΔ~A֬Y#;wln(I&E]$iii5@@`Cgp4veFI $Z[cH였@-*`"Ͳ@e&OI])uت,A2qC^Ϸ%&JYf)3쯨! Bhhه    妛n'%%%RZZ*';2 J`ONI/u^, 9%ZT66H¢\ہΖju  d Ђ$K0+;sA]!$hmct tn뵒BKLeZՓ?~"oMzmӱõ h !r?ٖooݙfO?p9   tU5kCfffrssȑ#2q6Kc@8]`3מ^5qC_[, fYL ZdЂc۪А A~-REY%#OgZ0``Ml ע F&m h֮̔<]ydբ\l5Vi`P]+\R3NҾ3(oǑ   t6'|R,n &yQɤgѢEqF`@@+U\4rH["BʹPhY2I4 Kpũ:Gdp_bEif^jj-"Vχ1H)FHVEGYKϷ'SgjJk>Qİ>z 8'@@sNB@@@ wyrիڃ(y衇zM. x@%aѡY V, \1XQNF"01m|G-4T[fpt~Δf':WZQ/Xg_[} +?3=8+6M^yp;R\S.9k]G0g'ϻAf[ J!^|j?8z2s}5epR'h   )0o<:ףG$B@(j[p3f9%i8.#pNB/`o5̚O,&T\"W/Aڝ,kwv,v.=j) u1)" @@@@S ٳS# @ml%9# ;*4@( ^Wb2Bm9`oy$HH@fJoOװ8mo!4(D6Un|-/#Ǵx -a!@hh#@@@@@@%fbbj2 DO4M;q.-3"$k7\N ȌM&Ah]PP =L&袋K/mwojjj$++KrrrH$""BbbbdȐ!2b o9@@@$(ǎHѕX@@}]5zQ5etSkqr@I=f˔7ϗjꃔ$u˗ŋsYSYY)*hb׮]_UW]%Ǐf   @PS6448PQQ!,ZHEV)::ZӶ  [X fow5;[Ϋ*AMaOB@hгÇZ>@+l9@@@ZCɇ~([l<կ~%7tS]zO5á}RYcԨQ裏j3ڷ 8Pg;*Q\PbR$$QS 4xIOeժUg|%KeҤIү_?ILL&v-ׯׯtRIJJ &ud@@@ jb CwO8a(/ڒ6lKyIMMM@8M`p͸08>KZ =T  IJP|G}O=URR" .{*~`TA cƌkw455i+>((ڔ-   ^-P\\,sΕϖ=*OLO vl@@3E'dCP_{T:=23B[;5@^! 4t೼sNy7EIb#3f̐g}ֶ={Ao>tq&;V > JOwu6   Xԍm O>Po_/ U;$qC0m{G{n5Jjŋ˯kf仸@@@kϿu* yr dp@V9 rpw@  *@8c hPSE;/ԗ¼[$&Rjo߾g Б'Pkn3ʴi /v_ȑ#c[X`6n(4؊G@@6e˖I]]-EZ ",,LsuvM2~u]q˗/'ALHH6d ORa%A1.?Ռ 74B@uk&VԮj=ajJIU?aQwYxkR}SS`g?3CsDDDH\\^n)"*ºvh~~~Kه   l\TZ fPRjb(5,8XWS@\ >9u%\MU.F:}Z???<@@@7 ?vݩV4ئH2dmU QHZ[@\'P^W-?YԌ  ˾R܄WP'KrdP|Ou3! G<pAy%//MWwG&5deesQ@@ T׈=aC-aoi4YuDRA4t,D@ hPJ<)**JRSSe׮]>mذA~iywy`5`Z[3Զʫi3mO@@@O @|۔d[l6_RR"ن#G4[*D@y@.Ձ ,S+f,BeXbEwe87 Ic *6A-0sLꪫ$%%E:$gvp]w 74LtR9pq]>;Sc_#功&"L " ؿnqEAuw׍A/L'NBn*־j=۔S)[3ȟ'Mxm4lݺ4ÇV\Zڂ (]% :"u QIdT20.]#9' H@úu kY+"w@2f1b6# dwyGX]nk`ڀ۫H;*/hp `smO97 gMy{\wfԕxxg=qULb{͛ {t~ m5Ãm-G@6 r44 *ܠX4N%}PKg`/ +ԼIb܌/0 vt^7-{jQWD@z:ƻޛAmp Ϫ=֥'>,*l+Wgʹ%ADڵzӧL@.p/- 24!Cva@@k = 5KCJJ=z]Uә44+;]QA& S+ uӒZg ?oNy ^,6lɤQ믿^"## u 곉o.VG@ T5ʚ=,{%5.9XΊMt  [nhP34G~GWdT ٳmj۷ Xn a+wy}5e@: VYCF1O B#S}Цl {/-u*pArj`&IB~a䮻ݻ   ]T@`.J°@n wGRontY_ώMӂ& T! )рRRR䩧 6ȷ~+999-eee&6 @Tt9嗿5 }9ܹsO?m۶9\CEqEi(|ٍ#   +s T_:kO%f%%1ݼU@@@^+5j5UUUi *A2$''ա+y]20k,\2ǎN=@Ps@@@:}@?,jGgL@3H(ɭ,9S M-&Sz 0ޟE9@ z< bP    rssu  W ۱}S.=0ڬ  ^, r!>|x!   gϞ,AhZـAq 31$s[;9@:W4dggw}=n9۹s<#(8seڴi2rf۳@@@U:)**҇ xYiȩ8sg[YT CJD6T" ]I MMMkuӣGyGm@O ?np}@@+<А/ .4s9r˘1c ӧzo!_~믿3gjz%@@@@Gldݺuh")..6ܹS/5Jj    4_|wѣGTjM^xA^~e"   >)`6ETbM{ݻw[n7lؠ͌9k,4hP\C-KӝyԌĉ^GQvD7dMR^^n-_ >Pf63Q *++ u}.&sAJm>_=z;Y|A;/谵kjOI.J;mۤB"##kA@@@|MPlQ7>\:묳D}-;A}qki7ٳCԇBoIf>~uz ~+s%O (ȭ}&X|6ڎ~GxG腻}.ing>p=FJJJQΞ= ֓|z@;t萨%,H    ԯ_?Qt~ŧ~*ԇϗwpZ{*@(`j2ˏ߹d_E6seL\8\Ƅ xk{pbo Q-7IJJ2pȑ`/     irw; fPƌ#%,,L?L-e2 @Wl/r6]OݽXfP*wsW6B@^34ld&qǏoG@@@eʔ)$Dk3-DGGˌ3>-VX!^z^vu&$$D[m3T6UKt|GJjkk0CCC2#pH>ٷFIjM Ddזg;OePM[lRq]Wk **5F(ZPK)00ak]O0D~DNN\s{@C||퓑#GZhlll^Q@@@@-[&Gu *`AͲ`T@JJo)?n8YdXgx>U_wDnݺuĩuΠ *٬U};F Rׅ7N;l>t{]+de.FMrYÝjK#~G4߫v3%`|/}{ x X%|{~ؾ.|[Gh={q@Tl߾};^+    ,~ٲeSWQw48u]#uGMZZРv'233Zv͢Bqe2jQd@#u>Q d8x¸,OkZ^[TH\hwv}# *p*M͵3>sT-l?3ypp[     &$C|C Й͋dg'~D̠dnLæ  @p JMkj§zJ~v?Z?_~M$8!0hEw }w]    )IMKB:2߲w7[N-#Ӗq#33F˔m9  .ȻiӦ[oOݷrJyW8\DEE|/ovp @@@@7t} uuug0mY6رc`I"gڲjwC¤eZPI%!!!>" _# 2{ly>F˵#OO  @ꀆAH/@@@@ӂv! ,gkZsrei38琉xlR"b~c%"7v>! A6`@@@ ҂2j H}gg}r7>,?&EF[h,;6X,3͐@@ ]yd    SҧO4B\s$40{I@@#5 + &=ю#dʔS.YD|"    ,4_e63L3R>1Os a7@@N UW]%_}Hvv_npE@@@@@k Tȫ['{VܦAOΔߌLĦ8#  ВGRRR~Zۛo7xҭ[>@@@@@ 455ɗɋ#euUm:sfLe6dl6Gc@@H@شiӤ^yillw}W/^,_~$''K=GDD30 3)     .xug;[I]*f??Z @@ x$ߖGOrss;vLxGfee98     U*k͋䓽l*sL_f'xٮ@@ x/˶mۺC@@@@@:wGBkʝx%a1gi j !  4c`\@@@@@@imeDz-1gǡ    б hPKF̛7C бbi<4S MfHYBr?oo=/?n<^3\@@@pG,Y">m"AAAo>}FFHeeKuuϚ3g\qcbizD4x"wYLc %M +gڵuZf{*ҐiQ   t4|7^zܹseذa*8Dkww˸qcrrrd;HmmV%_ކ        t^4L&ٺu.fcxg$))ISÇAիWҴ .@~ѣGe޽ꫯʽޫy^ .!AP|o:g Ѥwe5 _P?KH/P/fɣcc:ʾ}*׍u]/.&?'pPL\6BX&]l   np{@C~~Û1ci j#5km3SOmݦ>_ڲ{F 00ӫW+ _5g;*#k{^7y&ؔۘt4!g@@@@S;>syyaǘ1c eko߾֬q֝jYfiE5{g@@@@@@@:*++ TɆnjʶӧɡ[vy@@@@@@@nhX,k:JQQQҽ{w}}&z޽cǎ}Є}{     l9vHVn@@<& 5斒Plgih)AMJJR-SPPWy2    8+(?***=vI`_i`-E-(    6L-[]/kFOJFF^W__/?;Vf֢$''y2-0s] `S΂t{@@@./>ںuaqqqk ptqRXTooAF'c8O%    tR;wA _|QT}zZNKKd@@@@@ox}w fP}mB鹣/  H@Ô)S$%%E]a֬Y2o<ٹs^'M9YviA/̟?_o/4d@@@@@Kj,1[r$O%Zt@@5(s&y0Lj*>| 8Pn:}y Uyffn7d.2޽my@@@@@U2w۲$~oG].WgՃh  @ qĉrFjS 'O6ԩ`P3gim@@@@@<%N3w. z.  W x,A)\yꫯJffbРvOnɷJϨV@@_ Wyƍ  >#0s]k:p|s#807?/s߶rBY7JDp7j   `'򀆪*1Le%""B/}N\pN    .`2ʢC?ڳΓ?V@@_py@ý+]322w*ʶm u,deet @@@@p(h6VΗlq߶Aʽ#VG@@\µ؅    tSzOeoouLs1g   9@@@@@):S<Y>Mn|Qh  F4Hn歕ml@@@@@ *wS y\?pRg}D@@\+:{64@@@@@UžC?7.>4Jef@@Zpy@C˗c/    +,٬w2..NϓAVƁHQ^޼ȶZ,0j  My@3<鰾Vn=:`#{@@cҫW/1Lzw `/0gi5;mkezQM)#  @%'=,]T]rNN    xBaSe/Ow x&  @ ϗիWkHd̙]A!   ,`C-=W{զ&Tæ^äLJm 'y x@K?,,$pt͑;郞kQ5'k9ϧ:mf0+**$99Zd    C곢BrcW δ(PYY)Z{=g;1Oժ$P&VuumyP3{߮>xp;F[3DRR;>D[ 2jY}"       ew#.!n(         ]nhٳa 'NȮ]K        G>5B||\xᅲd}}}z     oHrrW V-j2>%&&JPP^&MXkGFFi;5555҃g<iAA455P2$(***}QQQ$R}A\\^&6 Gy }G|A4h'7Û}'@@@@@@@9Р矗7xCT0l ڵksϕTIKKt-50m'#       Е)࢑ϟ?_rss 0@vޭ eg|3>'@@@@@@@@ x$aժUm6ύ+#       W {u        >3h@@@@@@@[#KNnz       H@C`G.Qh.        VD@@@@@@@7 0U     ʪU ;vddd(t>&|  @Z/^O'CG@@@8,G}}c@`]>% zC@@@YAEGJII444z2@IDAThGPClllho0w-+W::uéC@@@@Ȯ(V yN6f.  S *o>H; F@@@@j.}K fP,{E 83B@@S h͕{G?~7@@@@@^9xp&<'4O掺B )   {+jɈyuH0À<1$    ^$E"gG=x*?4   yаd9|i }322$ @*++\}̜9s+k[@@@@Aom/iqbRdٓZlN@@Gè{%sΕaÆO'h[ƍ;]NN,_\ydee_o8/@@@@-]sk>jq![%40vD@@ } $[nGfcxgdz0کִzjkVۦi *gϞZ޽{W_5    #pZXԙt7Kr836@@D RSSƌ#FXf=oIMMzJBCC>LlG@@@@ꏤ>42@kk2    M D=Gi۰@@W ~~~2l0]DPUUm3zQ}!O?eی:zUrrʙ%Kh3X(]tq?QnF=zu]tZPG@@@@$h6ޗʆf-Br,QG@@@s =A1M0A*--;S:kfРA7/{0CAZZ]v[RR" .ǧܸ{dƌ2x`Q3a3FfϞ-f߸}W-v     ^(ŲH={$>Ըm@@N# SLCͮt7oܹSI&#Ghm֮]+uuuZ / /4f>9sH~mf񚯵R6md-ٻ) D:" V`#(%+1I4%1hX6) (*XQQRMfg==}m/     jԨa>hsQG{>1x{ɧ桏^KEC8tki  I@FPmnuo۶mB5kV@N 淿۷9S̨Q dԩVh= Hx7g}~Gut%1eʔ    @lVmZg810< h#  @ $A>={4]vY f͚i;0L=;v|hQ ӼyMFt!]ܹ?jXhO    qnۍknf*U͍=0;WpF   @,AD'x{ 4ݵ^kTBTfMs5טz% Ʃ 7N4c n@@@@b+捯&ݾ?tl׮tF"  @&*|oԨQy q… R '됭nMdɒd3@@@@X|+snˀV{Wi1@@b#+ѺukdSN1۰a={]k;l6+2RJnݺo'g@@@@ zvԑfp@B@@iQرTE13kӦM~ OvM@Zʯc@@@@x Οf rêTcs D@@z ׯ7k|&wdW|˖-&<,0Az|' +s@718o8J#yS5(@Λ=kv)/:y@ yl~Ƽٻ=7 @@ C  ^zWk1ctbT* C{hZjFK hQ [F@CFG'9AB SΛLŘ^7)ppF4j̃s}͍ӟ6n6ݚo~v   @ d=`fڴiޟC8͠ALf bw+PH57oޜjRoVnRo?37/ޝgK-t=7{ pޔέwOv(0{jl͵New@@@+b 裏SO=ըq@*rʁT=DBB@@@@ תonsml+  d(̙Fj2jmhݺu@ D8!l[VZ?=M4!B˗/7۶LCM2 PjҲeˌ֠A|_MlҥK͎;7ldLG,Y$52`-PReB@@@@p޼ہXck׮5Fڴi6qFv>2 hO_z$k+(m+/fS0C(PSfZsZySGlJ?m;vrat!   Yݻ\Ҍ;ּ+>9sqO>c1m۶gfR9M~`xyg<       !3z'x Ǐ7W7n4/תU+/ARԮ]۟ Ԭlˈf͚5ԠSЁ       3*b{w_s饗g}x㍦G ]poz3cƌ@բq^V}M\jߝN;}әi@@@@@@@pr!jO6afؠ&)͛Wbr5kڴ8p0`!ޘƍ+Vxfܾ}iԱ) cڵu-n:@@@@@@@@\r:uÇ#FN;-Pŋߛ+4SN5۶ms')f͚yf_:>h5AB@@@Q@GTåM6mq@@@*LBkhHWX oy3f3ee˖,zT0jl4hWC`i߾;vs5͛7u̙3'0=    Q[o^oA@@(X4ݬ\ҥn:3qDI>NGy;C={UjǞ{tf'&Mdzmvy焻~x֭MÆ N@@@@@@@r)&'Rt͚5ͱkn㏛ 3g̘azs 'o=բ baǚ5kc=tj8ꨣ@@@@@@@@ n hpԜСCͨQ̰aI'd4hNu+c*1+ࡠÇ͛7vW53l޼y-[6mt        7X59 RJ]v%\bfϞm^u3zhqT*U!Cx5X}WW\qiժi֬/̗_~ionf;<@@@@@@@(54va̙c&OlLRt C MӦM ىI&?<Pvms:uӁ       @1|f„ ^ Ê+YT~}s{q̚5ˬ[6TZq_jJg       q}@… رc͸q̲e =z&PG(`OvoժU^3˗/7j^AqƆ@B=       P ho@O?4|˖-͠AL~LݺuN[ #Ġ?       ,כI&yA 3g4jb"Q^9#ڶmh2#       @ 4a֭fW_5SN5[lIxzA }1 j !       @a $?4ƍ3'N4k֬I*2h"鴌D@@@@@@@/kNB K,IN;Ν;Anݺ*U*l3n#@@@@@@@@b5R`Ŋf^m KGM6jb0`_~@@@@@@@ S  6l0'Ojc1cپ}{RU?ܫ6*UJ:=#@@@@@@@@p%tjcw}kjժU!    @ M6E[l1 ~S.:/u.ؤsZj"ͺu=\ٺuOGq]رY]d6xt&uw"1߸q=PnRq Y&_}"?4l0YhHV#c9ΡpnRf鎣G@M,[s~ \ v pCzZ!0mڴxlHm"Hd*yK47Qc΁pޔF-zvڙuFd($PzuӬY3ʕ+i-,@@@-~f^M6-+!JRLh@@@(B5k+ Ex   @Yhڵ:tԩQ;2P5=zLR;^"   @veC!R1#   ;l77CS6(ot:А G@@"h߾SN5   "@@C)@@@@@@@"ة]E@@@@@@@< !O       @1 PLG}E@@@@@@@ Ohȓf"       PL4f_@@@@@@@@        tW@@@@@@@D<9Pl&       $@@C1m@@@@@@@< !O       @1 PLG}E@@@@@@@ Ohȓf"       PL4f_@@@@@@@@        tW@@@@@@@DJl'    @ƍ͔)SW_}ezjSfMn<r!f]w7'@矛szף˗+WڵkF -[m -ۉ@^ ZN*۽I.BSnD3J!k;̂ o f{/hѢܹ\r)xf]@ S=?l'x~:@(~(ۗ;DE4~w{ҤIf̘1fÆ ?uUZ՜tIk׮1vdgoX %ߊ+ѣ̙3S"O67N9- @j8] m[o5 |k5׷|"@t-Xxy'g}tؠ|6m$GVT; @rpRIuyڵa;9c@ P> .4Сy{gz<^0J9%K۶m3f26m2p@IK5..Qg&\ .?]c:-Q?L6ԨQ+LL r-H+w}70Y^kA` = P*\ fϞmNTiuN:f=L5yQɉ<4   P T)7|w=D&L`wJ*7{キWJ>~wޱ^{ͫ{ve;ʺ̏@> &%yuV^zwަI&^UV%Kx!U7`+e 20|::X .ׂT@k*EB˵`f˻/h֬܌ L<9P{èQ͛P/<>xl:   @b_~`(&|T?lVM :Lj {ר.]xׯ_g+!!@fq͛7#F#g<d&kj{ 3 쐚8K/dƎS`W]uU`ZzP@@@@P+etp}v՜~ {eve|O? TM ?O N~^|1cO/kA-Vm,~m˵@akbҮp0ŝvs1瘥K4=C@@@ܦdT1*{Lw#.Qg>Y N?U+O>("YTW;͢E^@ 8] m|߻T\ٴi&C r-PQn݄ .*Msq{A D    H`޼yFUԡCۙs?ܔ50.@&վIM41n7e&NAt-HdwyM_4M6|"@r-P5k==sC9( !AYزeٴiSaÆ@6^aR~}WjU{}뚧kYn s.5l񛘍2@/;v;jrpSYwvD7"SwevٰaÔ3cZjԨa{2=I @\Z׈G}Ԭ_ޛu#H49@q̜9Ծ}{?Y.BsgRPJ>(ʕ+ٳͲeUVyӅvF7,m۶5zQRvvl:S!en[֡)zmݼ \=n;>04uT+VxI5kڵkgz\G@QӦM3uV/A1jժUc7nlꫯɓɺufZlQ~z4i5k\QXz{0rH?c_tMItN}믿V^0Qu͚5l^/^l^u}c]O>^E.5_*Mx_7ng}5FKh}^vwO%t{M8c!+M7?z8;餓T&xݛ6buϪSU gR Zwny ,*<=R z@D*Y˫f ӪGTҋo=ЖNtv.pzkbhǹzi|w{`}}fpW^=W?붥h7Iwu_QUmVwu:IӾ{ P1tOѣGfFۭA#Ֆ)n f:׿̝;7+ꚧ:n0Q@Wb 0(rxi-P;%|I/O繛umnˀt;(P,Ǎq>SɖLrQ|,MN7hSMv6e1@Vgydqَd8 U)M >Ѝ? Z?߳dx@ qZlR6pj=?+qƭagP :58 } @@U.Z){JשSǫRUl+ A'6RfcOԡ -G:t0* `/*=vTMwVU{+նؤ}A|VJV{6)2裏6͛7~2_)n%}>\|~fܪuӹQ`; 6]*A͎FGQO=TZ@T ]kT͕S*5o?hƮyO<]wv+#]Mܟ6AO:pz;-٬ak)9 ]ǎ:(Y (s?4cƌ߲gvU|Fq71 &Tp4(Qc 0PU^z7j"5&U Jnv< =)rWcOH} G Zlm1:VzڣH @ XRJ*&I P>q ʯsu;|ޗ׏w.M@A'(wg7v0uEz{ ]JСP6dU^0_"жQza&Uܧ2U;̠Lm@tڷoJWMtYtmIDF)EU)&YR6)ӡM6rY6Ժg Y Qz`r9U[)0J3guVEW5ϾQU|Nmy)qhJ5~l354Z5c }8lҤ߯7PAPvB&v; 1OoӘ|;n9C^71,R @k۶H57**P@e;2 ^MROJzi`vTnRoiFx _XF]A;[ ڎd8 U .ׁ~%jg8(-(@\zFqSӪzBB˵@n{aÆMvu}-z'f~U. |䄃A'_*0^2o?Wt2;`w-3Z:E~dvT*&h,UR65k+E29;h)?(smf C21C|?)Zg#Fq 7ŗ,V@ Zގ^xfPgazs-x]v_0p|: P:e>^{cҴi ݒԁNJ)S2YR5nRi8N) th7 0ywUٖ8\jq_Щuke.DsV>jV@Cd&ɍ2d$I(4*sO oY$^M(C l2w5q* %׿6_ܩ)zM,3[ aSTW{Ϝ(mnBAZc:D-ڽsQ&Inr᩺@~6݀L+% ->!-8^ |IyM~+[G X .ׂpm>\8kJ^+Z"oсBefEԟ^_$ZA!&AR6cR%&)n܄.q\ΎmXz]U zaƌfp PP09NyfG jCUےϪCD\բڤ ELc?@]>̻֭N.PǍ^:t&nƋ&I'.*մ!Zk)?ݦ4erǘ !b~ieo:&jBɽ^E/ߢRA`2*{=OfڴiU*@. -ԮuESn´"5f,X>5]v4DB( K{#- //]|@TvZ(D|)g5z0>56HK .}G7éBCjZ#kjY'M'vնlk`^lWKWH 32 Ep򊚊lK%y9}WTWe:omH TfV:k4A tcQPVT@CE\T bfjl¬YQ3)~A:uJXC THMML6͟P0?~D^IARB;n&&?ޅ0V-ZгgO>c[H+)A 6`ONn@j 8'3|w{O{Ҿ$vdL@OAKtGi=R_{ dE .SQMW_O;ROnӞz^ O +z>Lv-> PN&^ wL٣ Pwmۤk VKX]x㍤ӇG&8!,롿5vDUGTq/ p˲^M.~YJ>1 $HɦMg|yR#l@Jy I ]?w\7Nj}>}<t]/vlͣ&cX@!7~#pRЁ}0WԶm݀4e܀;\j&|"PzvRQ3v&ɝ,qَLi(<} >}'lN6 #k,=1cF;8iҤ<1 PdqkVLRo  ?ZЅ@FQ뮻(vfER*CYf^1lܸ_ܸq|@\ -_ T2(laZnӭ(VԨ仪K'/^SjfD?MᶽV2F/mpq\[M|5H nP֟ڽ'߷zW-@!.>4(i…F~ .] ׋~7AL2_eE*٤+WL{Tӆ8 o׼H+QKNpYj&7K nPժZfΜi̙Ϯ!yC@O[obC#Wl hM sYյC纽_}l&i6rDPܤ )=SSzVZ +.Q`fT ?=q`/<.̐F gq&wpt T2}?K9;Xq Z :mޭ*)ھcPi'˴;_~PG*Wl̟?_Jw2 : &ap=%7ZOMz)]z?: o:[ջtW'<ɠ ™vDj:sV炛U >DM5/J)_2 q; :{REe.GZy=[[NgbB9n&&>ƅ6F4C33J hPmB6RT#bp=n47э@oތ;a]S hp)5sY>@ܾ6m̈F.Ȅ.Į"Pq2I*1~xK.$f:@Zà ΤI5n2$G`Sl`/}  b^VBh^UI*N7s?OWDR>վZRGf6k,\6yDGtU:æӧßUn~mj-ZȄF}>ny'#׼(lnFtmUf{K|jڇ~|^^ĄSn$˝ XglL4{mKKoٲ[jEkӦ]$ PD vr,sj{Jto[onڄGHss OO܂ fK f(@ܮq4b(\ T[ K 5UұcDpгee[2RvY|Li۶m\;<"6Tpn **V݀N:WA9 kPĉDzA*&}moOUѫOA@IDAT-[敘U5Juk^Rμ^/iLFػvrÆ w5 Q$[ tԴ0JE U;qob] y9T̴iӌmRIy{W=uT Sn%fa@8{(%!nIHUc=/E%w+Di:*jRoS )fRg*~ /oyT˵|#@*8\ T+Nͪ>SI 6#P2=.49Q,G̪@&MSB~=zY㏇,ERbz77~U6PdI*jQ"KW>tC*lFnVۧON:ռ+uzc3fHzG}4={"Ix Gն+QjsQM6ںOTړO>`/mDIn qi|xŊƪYE%~T ot]P[Ū}pp%ؒn`f:MSaeO^z=C-_f:+Pjfn-[LZŋ?;w}r?tvJ /뀞MM6 8u=M8õ b,koT[?(f;餓5,kaohyh '`=)(@@CЃ>P2ls hPGyd P 4[ChJS@/㤗kJ?iN>dӭ[2ƌx@D@AnΪTtW5gJ+Rc)/4*Vj is'xs-\J+Z~ۤ&1nvm!R$J&F0]'l@[[:UdǻMXapP>製)魰䏀jv2dY+0 Rz_|w_mݵwjI%@> {p-.jVT& bõ؏@r-/=o轨S fwjJ1^z~zѽ{w˧#@@A' j[u#apזJVP%|eٗw3O*.@r!^usU)hA?jz69C6'SS*)V}tP3nT]+veR}&J=4jyмz?ey L.D\Lݣ[vV6 hH'~F%͸sTQA1]TkL2,{j&$P(ǍЁ-^+7,\-|1h\8AIʔL j~kذal}K#@=6Uח{M] ^#T\##P 陇 lH .m%\b7 szQGKE5a?i@)ަ^dm_pRz ׷oߌ_РT)={4twWj XdWS3z*7)'YRze=3^Q/v5J*XAHsk^2sAV6?xV֪$.O~u&PHǍIJ 0݀=w&QR- rI7AƩmp--\C`8W@ )JI*1uuoLtLS#3=,_ꏄյ ӽWA'@|r-v 0]pd6(GTL+~׮]Uëa`+[qJ\yQ* PUjj~I y>UܢE 3j>V NǍܞ 7z6l? $<@@@@ (Gm2U#QU60Vfe8g+M" ْ|9 RQ(3M$ժU˫!Lie*V+XFײl^ϊW|WSjGh߾}Z˩{ UH  𛘙S#    k zX? @V&L`n-K*w!+e!Ps4 PP35'O67oN հlm' "    bp@ [nډ~W͸qwk@G 4k_-[?l6m w{fȑ`5ХK@h~]    @> D>-H!p=KzA Mj7#pѝL>kvBWS\sШQ#SNaj*`: 2偄 \>E@@@@ hȇ6"i ԫW̟?߬['t]v X51tPs-x ZjxגnHJL JIH@G~ @@@@| !_ۍDn%*#|SN%1 77W^y8q:unHV~t:F"(ot!    vun@e̙3W_}eon7nluf4h6>ȬX¬\Ҭ^k2DMOtqv8~9ZltV@@@@hva(       P`U#       4D0@@@@@@@r)@@C.Y7       D @@@@@@@@ȥ g        )@@C$ @@@@@@@@ 4Ru#       @ , D@@@@@@@\ АK}֍       4D0@@@@@@@r)@@C.Y7       D @@@@@@@@ȥ g        )@@C$ @@@@@@@@ 4Ru#       @ , D@@@@@@@\ АK}֍       U"2@@@@@@,Z̞=[{m/iƍfҤI֭[t%_6Db)@@C,      owy뭷n߾K~:@ ֭[W_m>3SJ#iСf۶m.~.;Wnƌcf̘mưaLvrIk#    E`ҥO?/^Mc;0(Aif=(L۷o/1M.\|ŦRJ&tMf͹֍ y}x@@@@@@0.\hFLڵ͙g;&2 mx衇r?h@ 4(       @ f&':,SVQ#GO>$o Gr)P%+gݹ8syְ)dOɩdoay%O2MG&z&e[@kÒv@@(lz̙3 ;.wxw7'pQ0ömۼ`TB\^X6*\*"     XUV!CUqijժy駟>_wFr&@@CY1      >k6oAAnf ˓O>@  )@@@@@@<3ѣGA`w#fɒ%fҤI~? h'S      {U}{oڴR%*bd_ڵk͛Mswa/_n֬Yc;}vSfMoYM41+WNg1Iٺue~م F%#+;ն+w޶ԟ:N/6+V0[l1kԨQev<ԫWϬ\[ȑ#M>}J8CN bа     $PQoa>W^t{g s5wq?DArKԗ_~iݺpG6AV@%\⯦{g?Y~?'N4Vi25~}q;ǛS߬^w˺]v_~Ftgڴi7}(λ{>ڜ|^뮻I~ӟ^z:l]) D0ؤ&:t`{3Tã>j^u/]@Je WDyp5{ATg @ А@@@@@(F'x<fƍ w_TŽ:vhlРA镡hѢ@kt9}@e+&UVg`֬YӴllڴ(bpu(C}„ 8L< 6+_bdhO1tMYfJ& !Q{5/ڵkn ÈNdt|W$jn5Ko76lv(hwƎk*SNwrVЌ hJTK ͂@,gw@@@@@Gp 7xɂ??&M䣎:*0۫O5>$ھÇfpv3h9~5fT̙3J7x<#jժv9p@2eZF XޫfRyCx}~i_nٶmQ3jM[ou^7k6j@5,32ItGTR- ^ziF MZ ׶m[;{)GͧLREzg]:?mYfP6Vc9kBDV5@6>D~i;oy}ى={ѣG{yKuV^d @P0A@@@@(tŋ{ջyG_^=ӫqAZ b'?k//(b޼y00fj0g_J+ݦ<4oסN>dӷo_sZ@$; j{1]L-Zxrr)^_|?x4hPd- rWf̘@[6+1]x25Vږ0 gOֿ{' *xEM;v0_-O` (c @9 P,@@@@@l;6:4l00,YI'=u@UQ36m߾L0F~N8kիQ?+jk׮NvQ 7x"):ߗ64qy2K 8; Iܙ+[i UMiηvJZ9&wxUf5kXj !$H}uO>?c@@@@@@ZڶmOգڵk)#W5+Dps<&V+r:{I;̜r)M6I d_)s~5m6;>hի5h ПIOӞI&i}e'a, %PA@@@@@@¥k֬i.\ުeFFz^˗/?o<-Z(>UG8REpxw\Ye}RjBދlb]Gؠ~i׸`Z>ۛ3o޼ۛq+ٳp(P@}]Zre`p zZDMKqEE5QΓ[ͤd; 2,Yk^,>ٸp0ŪUBSЋ  !,B?     1P&zyp:lĈ#Aƍ3w^`p@Gvb >̙cFi&Mdvؑj+8M 6t{VR.Sm[fիʕ+-x5]%jhH8@ Zh"@9 ,]̝;[6ˤ:rܬ _{?coovm` @"Չd7߁YTxǔ=B@ 3˾.!]i{YfvIŋj"QaUd&zkE$>wtu]IZj`Yׯӳy攓;m߾=0IT 'Pn!eLbf C6wy3կLǎ~: k裏&!FcNw;.&Wj7|QovA G6F7n2TqP$aTscku2?\xf֭N3g}vu3|QIoԭ[רtLGaj׮p~;+O]guӧO6R 7/30}˻/_נl$[Fܮqɶq  P:Jzw}[3Wĸ3{-Р hΠ\CI6{d0ZjeZnm{oOsޛl&Ųe˒N5rQ.ay=g窫2 zl\XfM`@ %M@RE.\П4ѳEǯ .0h84ޞ={hS93Ͱaoa&LeLC w^P{?nR |V'RT2׮]M'4p-C=? wCӧOJ\vef $M6sc] /?Yi+jQtX!^25t8^2G@*UsUMS\)zenVqFo)'N4^zQƳoӮj?p[3WPbCR x'͋/EF9;ƅ{tln"АNpT‰Rq3  ɴW ? r@ /fým?M޽f?T3CiSJ&q /=tƊ_O?e5|N 2QeIwq_ `e\д_lz *k\y7G@@.q;)h­LDƆwyvƺjժ%ܤ\C J0Bܤf7TBΝS3hsc8A-Bs6]on5*[n7ٟjqWn@ Zh"@tͫKV+sRGY&!@~ <楗^ύV:/RʒFhnE5 .<ꫯ6GuT`*ej)rBa5# P%0tw3̙3KdG-/\ɓ^{ɚjS}y&2dQ$5Meɭ@h{|~t'?~Aq5=?k6Wwqi>ЍD D C@ کS'$k(!M=fmC]UmS5cǎҥKx2@rkuo5jtԩQOS5%@zI ׯW7Wy'mb߁GOs+M6~ww5g\ہ# Plp6mO=9M a:~m/(۝F﹒ҴmU-fU@_5j mބڇ 7RJF54&MTbҭ[v駛pҟx^3"*TnwzZrt& R>i&tzt^ZbL 0@O8@t9/JFz654}֭[}V!^`=W:־#Fu܇)1N:aL7]M)@$Q?Iuo)SW?O`Ν/>̯X@p 2@ ڜoi]^3(U7Lgy&Mt#StoSg>gϞF%~T"%1 P:BVk/^l.2:HAjSZlgF HPqCz羔yg#s;j]\T-~;5D/t|qa@H5j.(J5lٟ'0>ɒv9Σ>O᪵.}Hgt\r #UR+ߴiSIxNZǹ1T17>0s8{w=~azf͚إnݺAɉh"PjGM7Őx 7{wgClRѲe˲X9zPw6G@P FiFڵkd[N=f{_^ei[ݿd5N+Uחyfjx48iJ3K6}y$[g_o*?#Uz . A3f^ 7r>`9sxj~? ƿ_jժUƖ׵ݑ޿\T;0jElk/w7 ;qu @2xwM&A7nܸD z.y|OOwy{Qf6[Ϲ& l&5PvLJׯoԔKܚ4\MڇtOgrf5jwgxp} K/5i֬YIJNǽ^nv팎S|棏>'N#jC5fo.މXvX@b 2 ݈kE~F5_Z e?#^S팢wߤh6lͫLI\PJw`+t#jS}Ӥ T Mv~k62%,X-Y]wi>ecTu… PFl|^v)oJzt̘1X]lԨU 6yjz9z^ {edz-I.BI(H6ժb3ZG@zbןUB=UQ/l^~eYv{スv'ySuY˗//6uy䑑ĺ륑^,n3z ԢE sꩧ ,4{l,xֶpKTZ՜s9SN)u[_,SpPJw )iGEرcJԨT u]m %JRLIטT~(x駟%{3!&Mx[XkY:)[κdz wMVjXMu,eCw_mD@<`ҥ^tzVtYV+=c(}ou&I6\sMT# hpǥ܄;O݆Dڶ:t-[݉/݀mw}v8zwyM7yRA 6=ɓ?;<ӼwzaS8zkUK޹)k&go4.h˗v"@l|_@ҷ~ݘTnԮJ#<^\U^!A/%L%4^'{_[]?04`2FX^u量nn(/O5̖)У/B׉d)w=y]M{P MQD@^ QTbرXZ" R /Ԝs&{&f2s1F*@S-(8zF:NsA/"@:B 6irxJVݻy'61's l)qMcUXW9d γ>IOpB4=#fFzavrn( Xc\Qq+@@UBv dbLK뀾aeN"r3&uZN}Ն1 h3C2{.*3 )) oNY$pN8\ZX?}/q5G:E^p7=zJɅK(΋s@NroaW4ZfKvjvjCbja\%1vZLKvJ!0aB\4iI BW,]2-?Q'KR~jr+ OkmGZ+\;% ji"B?q 4/h5JϞ%\bV%jWi:iذ-XZ,q%W}_NPDZ\B>2He㤩a̘1IMz,q-uѮKCdSヴWA$E6lj"&1PJ#?퀐W1H'[ZUr }aOdS%0g[*$NīgϞHN,28&8P|<7MrQ.c'Z͕⨣aAy:=@>DcS:Jpqxwf͚m)s5I%%f.}<ֻ>j {+'y睡oY9v y.sigJ]Kϝ1[;$ a+5 iLЯNd\$yEN/.u=GϴF}ϐ8/^lռ@?߹[Cv`~霾w&o'Ҵo1rpM 龉J!SHA6#etҦ8}׼@  & E6%t>l?jqO?-^HA0`6Ynis>:N/RIw-¤B488Nvu2ApÇ'*#K$2OOn5Ң:\냺xd[ݽXS^9=-i׫vw:N4ZP8liҤ}^KT]o%hXSykqKAHiBqGO4 ׎Nna Jc{D[hCZt hzM,bloF ܚR$q=ԩxG I'2[}&$sԦM;rђ}(wyX- qHjT8BK'|?QW_m Krp[ێ1hpu=FBơ#.gB]L w:, w^*n+ \G~]snbxk• @@r֡VZF\'&o`!v;] »k׮gC雨(n͍F݈@ Pi-N} B@;ݶ4˓[ώ^,ӂvb9N @^8ipISr.d6ȴPޅ 4Nەz^کv( 펗 v-X!٭- CӢ^>B*n jO-> Gu-:*ݺu 8y$nad\ %vw 3$4;^ConX/9e9c4G= Һ8l PPy@NBS*39NZR1o½{Z$\fp;G Z9(iƳl\+k9i_!E "7k ;H259/V'p?iI6F+A;T&s11ȝ>ѹ>2'-K#G68p/>d:t-XwM7y4$zNtRs1եc\3 @ nv#Π_ΝkC蓮?ҹvJ2< PyטxE+߶mf,$Ƞ6 eS'iptNXA&!>/&\ܚlq^O2XU+ƹQKtDTw m L4m%(X.Bϩy&:ׇ:h@IDAT .6(N%kD $"^/{.$J#QFy4cO JI!8rc%x͏ۤ@ !a q-ZDwk9PN8N.\\G͘1#槏ԲYfyT_*ran-ԡ{x~EK/Ȏ??g}-=x`#5pĐN]xᅞ|HP^V?ˠ/7Dm4h(o 6\/9|5ns?FjϺq]W>4"$3(oϑwGո(o'XaٸBIWVw[)ni9//DFy †537c㘏 [ZpIAúB]\A<$>:f\kˤ @H@: jc_T}F[nŃCݛ<%v!Mw6} b4UԼPwYg0 Ƀ2!W/߭.O|iPjҥA;'k >Pׯ_D8n6̶9jlxWm[]{R~衇; dZ-@I_|rȐ! +V0)mw:sCArPK:N `>AGcJ*Fܿvaِ4aR񨟞YYpB>d%9a;C=q&3I2ս6OWL wkW^yţ‰/KQU4v,Wn @ȔŵyK.1@I;0z0~tRφ4 k˒?n営~uyma K-EμG~ҙ3,:Rf@ @C!(s"O?y꫗0YwsI:*%ЩS''L81v˯X''$ћnr)N5'q/Ƞt0}X_~82 x`Z tE 4w;m/?Ti =}}gywX|%ZqtB a:㌓F ~!',QhAB]M/ ~MAʓmBIW^X__@!]zr/0~"Žn*_LqA=2HB]L wiӦ^zɌ;6&뎣yzرDN;Ə((#?ŻAF7OXc\"@*o^}F 9Js~{a9,{mtQa;ŋO>9Ŏ+6|w* T~$K&Ro.GA vv 45;h!YH4iR v ranBy9RNa?>T/4/bb/ 8} )[~$ggobγ84or?\%HٙZvTŴ52пOA*A IK; d2W/Lm?ǟtaNUGG!T0N{-w;G;"'1;Ume^o~кHpnN &rX&m zNwUV%(R+W(; @#8tkףiINNpƍӔGBe |%>wRAL׿arS;>}LS^=[՟Rڥvj߈_(V:#Р?8=KZl= -')A2OS&t$1c$ICXӦM&K?Ș4q1Jd@JLA;.Θ" m9  H.vbҜK6*@vAKHqvZ~c*$<>X\PřM388͙36G!5n8h [5:}wqG^)- %_o"Yb?+?d//KHX&-8SUPle𓄣&ȳN#EغE [?wB{\Z$,'2ܴikqFNe\L?PT0˦ K-vI͸T9Rm߭^ZU|i ;%+r#ϱdwGsƂT-(T[_|a-[*'LE!oVDB ^ҿ`}KAS1Kϱ:ranFnrw.C"㸑#Gz}8qǼ?,׹$*\{=.պG\Rw@ @@i@4ډR kaѤ2^СCli phqĈm5C f ;@… =ϟ.M6h1q_> w 6|Ͷ lWZ5fLh½@|iIfqk鐽8\eX-}Ӹ3|p2q̘1f޼yIÝtI㊄k?8A[OpPyT&'/dGO91y:a(իM߾}=Ag:[緃6ϓ,%K[o5.XZ[9,_f "s,nq-;Nc̶{W8sLsgo&d 60_|' 7`Yu"lW\aKرc:3SO=1C/M,z:묄 qI)'BP>Ḩq3:V;lu<餓LFbK@g\^rvw"l#'; @9&cѣ4_Iw5_=:&bJ$1Hxի3UrU @ !DM!> j0;5-&.X^w #F Ksw5ww3Qĉ=R5M Bv^&1Mf%ԜkU%ݹZ6\&=JHwdBqAo-Dّ=W3fpZj  򑐙[C=d/ jr]Z>CʣWK%ѢE '}/(9瞳'J|eÉHXꫯ6l ڶnk$#mDZxv%A ?Vy3w\# :S/x㍍T5:.[MUN><2n 9+ @ @hg)}@xb%rKׇmz'd.C>MmqcpGE_7 0Ǐ󫯾2%rR38#QpR?7#G`%id*@>-`oԃ{"8'vjzxU]ͳmkqo-կm`yي+LΝcY;v;&~V/u2A݅Z`hӦMRt%&܎Æ UK(|S%8&I_ 9|vo,ai6\8 A@Z˶s2%^ͬ?qDwyHX*?CK:,@nyzn2_s!=Ӻ$?0Vui@8ƠRi) @ @ KnHaxQGk9vSN9l PPw3!hf͚?6g/5k֤1j(ԍCiIJ($ @ @(8 B2 tͬzvev~L j-" :uJ /@'XƉDT*om_M7ݔRa̘1o#<2v]*'AR @  c͝ Pj+s9 ֮]kᮼTIKMe]f6xcw0 F`=7c=4o<>0;w6{yWG}d'0=z0_IгgOOz?GƠ @ @'@CsGT,SO=մjʮN,XbY8:u(8|NG@E!X]X(,Rۆnhkj֬+Us=ggs7Gy̙3'ZjC.]b~vTj-Fy!@ @@~ А_T^\{f׷w><}׮]\~ ZC"X]@ay4h`k:餓L5]Bwy9묳J1jQn@ @ '[r 6lczmI^bYxzJtf2묳iݺN6۬1Pg@  (( RKM^LmNzoZdmUu5[nw}MÆ K3ypp@ @*@*U4 |К{=^ P&:uP$j,~2 5 &0v7k @ @J&'J(& @ @ @ @ PIM]!@ @ @ @%Bi( @ @ @ @$4TRkSW@ @ @ @@@DbB @ @ @*  @ @ @ P"h( @ @ @ J"@C%6u @ @ @ jU+RL@ @ @ @**& @ @ @ @ PJEY!@ @ @ @B ih @ @ @ @(%4RkQV@ @ @ @@@BjB @ @ @J Z @ @ @ P!h @ @ @ R"@C)e @ @ @ T*& @ @ @ @ PJEY!@ @ @ @B ih @ @ @ @(%4RkQV@ @ @ @@@BjB @ @ @J Z @ @ @ P!h @ @ @ R"@C)e @ @ @ T*& @ @ @ @ PJEY!@ @ @ @B ih @ @ @ @(%4RkQV@ @ @ @@@BjB @ @ @J Z @ @ @ P!֭zRM@1~|gfѢEfٲeN:aÆf뭷6u5ժU @ s`@ @!-͞=tSzÇ5jx38py'=IǏH]t̚5+VN:k5\cƌk]w$V^mnf裏>፮jsm% rJs!4Fmdjժej֬in;6mژuY'iJ (34w\ӥKڧzlJ3U@'[yy+;wH|͙3)EB>?Y=$8M @õs]f8qb\=cn8 .L|_ZɱBo>v?3gH#@_Gyٳg$qÑGi&M?mٲeg?Ӿ!馛3O2%''JE/}F;]p1cy;lt\lYtqEC;wN:$mFx @ O ,fMykvfǏ @*2%\3g믿vm%\ ^n 0C:vظuf d6x㸰\{~; ?h,X`k3m4>xc5ӧOh(\@ ȼ5FcΚ?RC @ hj˔x `N8{xM(~T \xᅱթS'vI~̝;דl` BA7Yfh21n_2Cu… #,XoQFiӦfw3]zW_}e/_n5kfEf6G}-ӦMVk׮5k׶*ʘ. L|)"o׮y'=E7o:ԚY[hYtmb-076{WƘ+W ]8?e2L[z9gTws1r!a==FE(\AB2"r5oU5\F 1oMݨYS ZsVq8Ǽ5h% @ X8&0em,U?svmW/<=暸czӒ5gym㋁k1bD 66A!uanufVX4X ˤ%azꩤqci[u-LQMj4[pZ^P& :?Ufi0Fbn:a}ljcR^k |衇!b,aq2y:ujڸ2{a}85/?(kաW^̟(/Cmvc̘1+RTǹ(b DS[:gUM>rn|csaΚYUD:1oͬ  p Fk |嗱:Be*!˓CڋmEX&"nfdPByc5="YBL4Xo7֎8㌔W]uL_XL׮];`Ri^~e#nk j2n;-6_|;9sy:\(?$vX;^RhTˤ3ˤm}*>h,4(3j(sGxu!7xc,~Ntܡj j85ktNEFKgҶ`.uEw vQ[;NB-~n1F'>[ԝ5PA͍ƊTNcAGo0)Ӷm[=ϖcwe{g]7`\i<-Z-Noi".Ƣ wQ?wX N{7.>zKPc=4)3n8#!^z胒F#\ADb@rBykJm%V_}\Zka4a\y>cqeR ٳg\Zk18F|:՝Yr-(kK_̙㉓rz뭫] +tW8|%dSԄVcA*'SM$M1`Kw&MϴotIq4]g07DoTYhmIӆ eDTǹBD  ^{A步0gU_[񙷊B=?[ sVq\z&:1oU @(Ix @C/[vm,ud)V!"?TB N]U-[+݉wL&`툎#ǡ'KbK@c 6+&mʉYZ+&wxcH) !pXv0zH# aH oT٩?ϫqhڵ GKJe.2PxIzim  !m:E ^V,s ?{Wx~5kTY]\/ݻwkLXrQqsε8mnDv c $ ƾsQh0 @FiΪRG}.8c2o͜]>R2gMM9kj>B<1oMjC k4(yh -Z'^kwfHe_s'O?O>fM6I']`޽E-ql3f`cil0iPcal-qa,3&#\A@BykpQQ~ N5[Nx2gMGrQ瘷9 @ h/_rXhIܲu'vɜ| ;?}f,PkӦM_"M74NsҥK*AѣGۻ^$[K[oq~Q&7StZ~Ȑ!46ɥJe eb|'iI$ wv+ݏ?hO@NL>Dϩ?qv5j(N7ЮjoFmd. 1\A!ۅ{AAyk0QQ~ F4X[gorF9+) @Ȍ q#UHR)n'٪""Iٚ:-{"$"qo}7nxovq2;_I:g.… +M7Ҹ7Ϧ[oYxf ˎgΊ>J9my睶ŋۦCZn~'n-L:u<~A.ڵk͟"D߽fw<˶) |]°sʴ>8>FiZ?tQ8@@0oM 2sV>Jsi.ykX+'ّ9HEicޚ]%5 @ <*1!9-XF4'xc~aN-Zd*ۛ4i&X\Ю毾*_SHzZREIHH!m"W &իNI̙cd/0f2|ܯ$2xX;[kőGsMwqv(YGgU s1r)aÆ'x£EdᨣHɯEFb^o_Ν tټ }\byG+"T?O;6tϵkz85l0lH/8~Ơ0 <`ޚnYUbϥP歹inYfwr\y@  A(''sOs{ଳβwNe*Р-?#[ 3[5k&*ZN~'[ĉ̙3m-Jrz"g͛iqO?m/";Q|^y>ql/糭G&e8'MϞ=͋/7|ӴoS6i[ qkh94^zo5wui׮;8鹄>lsiH(I@.[:uܥQB PX[U\beޚ{̑9+sְ+ְI|@DXbϚ{a srdoP'vɈ}믿ċbOap1j($T&2Ű;~mڴv(Ln֬Yd%y6 G_f'qV81&)}ރ8źk bϥK]֜r)fԩ&"{ڵc\ ơ޽{? 7[FomRi4hmGv6ʨ[ne\:8!-2uaMU.Y2Yr @[KK}.DpgʜݫYT9 \@!4+0nkf̙4Z/$nm!ܮ~ˊ:6mܹ 3F}@IDAT 2Nʕ+㘥Eyl2Sn]Æ 3ne˖9}>R=p{g…P+2D%72nֶ) GiO0aa70'N4Q`م4Ie#Qa 4$W\!A"vA*r92\,\^Ym01oM„A  A('/+n~_j?مe&M |>ydEjkݺbajFkԨOu1{`*/ESO=S_~پ֎ĨK.\3)7M4K|W 2#/i_<~A.$4%M }Yzu$?sϥX(7;̙3s$/ ?Τ|~/8~@@`݆.BcZh⹻sYUDJacޚy%% @ 1@@*`֢^X݉'ki/Jet:#G7a!O~}hN 5k֘#FxK=XT;m66d d/N W=~A.ysGVZZddСoiԨYْSN9c9>`n'M+?Θ1#{'\p; ƌ6zǹ(@@(c[ٸQ~˔xr9kMNo)9qy9B P42HJ@pPf-j}7μvNݮj6mDZ.Џ7hªگ6_ vgp֮]k|M77!ttA/^z%,W Hݰ÷~Jygo߾8?Gqǯ}F?.–[nW~wΏ;8#n#K`ر~~3jbŊi@iEyb?HǓp@@9`֍\ĘzUڷzUsV?֠=x  HYСꪫ2C/~rӦM3wqGonqki}{{mK\f0`P޽=~΅4BN83w\wܹƺ.]o>Hi.'rh|^{eƏ(8#\u;Q21JZT$lEyb?ʕx r%5z-Lh1oJVÜ5'ǘrF9歙WRA  ᙑ" z+z){q]Fa/^l/b̅9|O2M~iSze?{.O6SN5n9][{xmnɒ%˂js~oZtItN'sL|r3qD3h Dɍ7Sy<%Z?^FZgvasycqQB{ghҤI gdB;/瞸=ˮ_HDM+TgY\f.5kqp; NtըN?ywm6:i̚5NT\ǹ(t<  ;k(eBy+jozu*Q瘷﫤 @ C^9k!Z@-rSZYWZ0龇e7.mNy%;o֬Y }<}Ei>hO?ׯ'c k$ =魅JZss>4hPe IVZU?| K O\M:u{G&j⋞8֎y8p(;ϫBGC˴FqixI'~_uow߾_~Iz'|j׏K14'@,N;Uc2R>uY'tn馪mƓnɊf[ IǗT-5U@Iw?8<$' @L0onZ sVu(υ}N6t2oM>@1gbZ~s֨s[I@ ;قfcYsNosac=s1[]o'·H5qaСF:taӖkk:a,rժUqzs3뎠gv{d/>NYҜ(;3Cm-?q⋄NDyw%x>Jk@+mK -28~hJ.vԆD{\r%iD-3j(S^D 6mj{]wM3\TA"A*hv’bOR0g A|qΪzGycg l ]?4]t- 5Չ_|Ŷ*kƢh!کn=zt̟%}LT͛7϶[ `*38è>%7kmJB$ _*z-E:g&<>>&xbvgзw\uUs|f%X ~wm3fc쳏m@ZnOvV[;z,Z|`ƌc>pAk-`2ȇ@+\F&z-[^z6U7Ց,2_~ꪫ>J#.6q{Iyq. %T!@eNyk8sai1o5o55Y>=_nsV** @N=mwR:v\}Υ}?̥^j>S N3OoQFF/gExӷoߘQX&6b<eż{1-У 494i$N'.YX2̂ 쟴Y&_l_N( 6[@cel֦CFk.5ӧO7b1Ink NI([W \AI@1\К2oeIо.s򙳪Kacޚ$ & UYÆ ]vƲ-{GO' @ %Eї~1|o4K,1/6 0s#8};ꫯ̹kf+Fm  @ @ @ @GZ ]kךO<ѬZ*֭k}YSFXѣG_~̘1H dbذaf-p8B @ @ @ Pa 74W]uYw/ 0O>L6# ]" 8@ @ @ @@H/Q xFv:z긻Hۂgƍ{W^SN. @ @ @ @(MEhmۚ>L2̚5ԪU˴j6IѰaÄT 2ot+adh>CjժjtI19s޽{mަzuMAE`ҥfᄈц  5j @ @ @%Pt)~|x&+zT (z%J~yr F<泭 YRW>uHWn(eKGq0!!PyAw^{YhQ(K,;vYz۷p =a\ܹsK3u]vi׮+laLG?\xf̘1VZE$=m?D.L޸Lt;_5WYɓ':ȨN;;~ABeY7F"y1RƯ o͚5qehG @(b[8S&nҺX"5M:AY%|JyDAatD9BօKnj4G` B8,EР+20C͚5͎;%>s-0-vtV_9ck/82 /kժU ! ɑh @xQjޟR `@ x_.B!@AjpܺkN8ӹsg[=w /Ӿ}{裏?<ځѼy'!pM74fR}%.ѯ*.Έ#n{=#ab>}}XǏeWF ӯ_?sǚ7{fID 0&Ga( @ ü5~ޟR `@ x_.B!@"0a#Nx<`6mx=v6Yp7ڦ67tsɱ@ヤZ5bHwޱMhqSN59r+Ȝ[K\r%  9Jvmc=J> Kr[~Ĉ@ @ sEhxW=%׿JI,J\tiLSرcmm,9u[9S29r ( ~QAXr'1 \@ ԯ_ߜuYe]G*@7lO",1C @Ȝ@̓f?0ร:ec>!Aa HMN<70`YbǏ @ _Փ@p @@8["6 @ @  .аh"vX]ڷo;dv38}ժU3OLʼCiƻ||>Qi}/Ö!K֞} =Z߮Qb lsSN'n}'Ǩ=﹨yDR*;XנA`;/FZ 6dӫW/s9dӷou/y̙3?`իgvyg^{Ν;'B;>S_}O+;7{?~;wmE~{ӲeK}<3>0'N4ӧOJԩc$LԽ{wzzٶf&M2 y]p]vd'oy饗bMÆ cי,[@+}B/#ᝮ]=fq$6={>lOQ<صs1_7f͊c:crK>>ڜzvQ>F^_|߿ @k駟SN' l=Yo'lԎA~ϛ7h"U&LsOӥKӤI;;/6I:33ּ1]|_2ooO?Ԉ… onve?]ϙ3vm:صN ُt(Rp t[/v/\&Os=b<СCAjҦMsEf#$lb7'?Cfܸq?6};͚R>R|2a RjX}ڟ:_G%} y1O+c.ƂDҼCeyGl-&!M_Ҽys;޽{sD/W]|>ӅnL{7 <sUn'|nO>Ƒ}__}> ~̓O>ib5jd;ŋw3۟6G۟B{gGU6~flz/$4D Dk4"UHNʶlgfݝ{̝wٽSΜ9=sN9scU6p/~s7?}䓟|~S{P{Wy'E]df9|q}}`t ZG o<sL մ7P'7ô쉟7x=ψg}]{s^yh2dlٲ>{뭷Rvgw~/J< 2̏z4>V\+\'~sʳS7oN~n[{TlHw6Hӟw힝q+,gNm\sM4MIv?M(?v} C4.Ra<y2y ǟn(+kT4J TwU >@־k{u 0RTl<蕺+(n^@'ukb-r9z= K/3}cnnjTm{5dv\'T*cLuŋS;c:g6emYkiM*\|GN?p.Ա4=?1vttL)SAcرcs9TH4Ӽ$2/ًdL=،0#uj;+}q3}T@vSdvyggɓ':;;.=m8`ror YLh77nt3f3@V}LA$7E\(Ge…P>^Tk֚%mN0rz׿i\}X}]_yuհj^pnu4=MVs$vw k9} V pdtTαs{ŋkZ姵 iܾ\xV46l}Fkj+I QL}177~X^+@2 Pl[Ts='+=VKx.z}|赻:I[kfmB1^d[QQ\u #~RODq,Huyefhz*t׌^Su>!8t,Cq8&wm9][xe^k^}U93=IPg-S;ߊ=-jkv8S%s$~<9@ ]uÜ9-)h 9ôYȦT'EM .sj^ꬳJYQ-4zLy0_ZG>b! 6lHiv}ƽ~mB[d #- {?JW椁 Pq\-z.'^ls'pÇ[xAM[s#u]<ԴR_Ӆ CM\ Zh^ ciaӺ{ ^UDj~5M;m]G;i9>-5y)EuRޚ^KiEm7auTqi{r9kޣr]5QK.OͿa㈪s=o|jSO?:skՒL~)mD[ucV{~zL)_yz祯RwlӕE 7=˽曽KWƘ0o}(fw;7u;B>psgjLAߦ°o 7|=MGS/R=h9sMt9㉿[M[#剫iQ‰(NLSN|=7(?ҋ+v4S^;ۥaxuEy$mv`ZHGa]ɄbS?rћo̙)wZ4v;;.Hgܮ rO=c+S>)gmB,]JXGvL.oZ]Thp+cr:_'fۨZZZubySSNq3d rs=WXn_RfY@5oqsZbAϟz~e~kEvd4^ Z1Zog =H{WڨA·-qPàzmΰiaW<\GQ tLui5tA!NkLA:amKJi~<^.|ͷ4)n;úez>n{]M6):=tS:d")wOpThз !hv_,B|jT-S0M{hAso AO/HM=HYGG֍KRi~r<[ӎXLa+s=K?'cV_Mm:]l<5-ucu=/eϧ˂3M+0~_9$}<90Z|F}ijG'hfL8w#"8#!`dT^r֙}gӉS@4ك9}bZq55L[,_UM/Xhֶ'n;$ sy]LxobZi4 MM~?F.x5x#qnWNjT'G;[=j e4ӽx'Livl:~wqELMg<Ӏ.7bg 'm h x% @n B]ɋG'?GC`*z\}՞b)kl Oy~_r2I? Ins-C~y@L+VV>żt b] 8t,(tAf0I.ϰqs=3f}*g6/zGL2/;8t8uмd1-yI5,1/a:@vy[%֘g/Cߟbj=uD+1Ebӄh8=)=Ap{TL=yfgcSLlx_;찃h%;֦ݿ}5J7Lk bjNJi~<[mzꩲ{͸@3 C9$Cٳg{rs+UViYIN5_#/Z/y'Ea͚5[3߾HmqnWwcB=mmm,kY=QMK4hOp1]d׌_=?ìYo/*>g8iaG]+iG~@ 'ukz.H^8l"==/| b79EUڎhVEѢ,kl Oy~_r3I? )A1o:ŦSR3׀V_lu?Q'Hy;(㨾I)30gAv0I.ϰqs=G?*2S_AMiq=vX١NLk=X':^^hAmԴ"tZʹZt/ZA}B~O~]ӷ7M(yCчئMwØI&sѳ ##{Μ9̿ qёMwYWO?3MkAN2EN:$1}K= 9R_1Y,ie\#/'e4AF݊II>Jgz'uόz  __ _$3oM>=p h,]z|jCǪi~g~6_= 4KߖqzHѓ~wk/D  D@E֠*\мh|#D:n6O3f$Ind2H^d؜>'GOu~Qr.m滓M\ֱ I~s1,W7Ow:Ie֟{~ub8ci3{.\ǂ߿id/=L4_:^gO.Ӄ#׿u5h麚.ġj:I;e`@ZA:묳䨣뮻N-Z6MvaY-G  555LqI0X~KCakUm) ~ʹ`b.@i&O 'I9qFotv-8ĉC) 6x z e{<(_&௤&hzI~4P)s"tk q=4/oܹD:n6k$5e3zm AtXm.\JO0OǍŸփW_}?;4I,yjA6qu$Iv/p'v;//{9{UWɗe{rb?._Ǫ\kK =ԝ^͛)Z>hxN: 'uk6[빡Cffa<''rF W$}mC˥=/':$麣S,H!0I*l M~7=B6Ho=/Ӱ2 2={Aڝ|GG}{dzzRZ+Ao I3JW ֢Emeڵ:jSLJK@r?ЪU$4;L4=,-5 G}_pXO2N/ zRCL۩Ú5kܣ}pSOH8Yb'{!첋;]1ꫯOHEݏ; A+\/\~J9Uʥ˶!nE)sl7[sK?B^߸?I_}R}4':$ß}qiS\[ҹMX(v)1mB{Ad¶|rkV`pWZXp>L[YZoÄۭ&o V\iGśZ>׷;ê`C.( 6@fc}z;5p/ tm#5O;4yon'fz!VӋ*wz' &U6ͧycgq&k%/|2.oY"I.P *-S~m(;c$\]!.JR+Q@zj3)salK6tu82?vo[㸏$_I>uĹ-i'I=zL0ZhKAvaN;ɧ>)׿./hkxWD8dNRSq8yIggbq߃;wFq7nzF[ ?ɉ't3(wv3L*4$\L y72V8v$- Vx衇 h"v֫f373ŝgF #qoW!(Xam#3W+Ofe֬Yvi; hMu_ՍV|; @_A[JÞWlsv뮻-Yʡtz~v~A>uĹ&DXǂ]w.uz-yE QQ|VfIp$+2YyIbb: ?c 9Cw5=g>##Fpݿ݌'S ,ϕ>Փ}{m dL}COv_x_O~2r^[PЙ ?O. $HЃ;hM\B6υ(;_e6l/Z5N8u]g%Kd߳m$<#be]3*gEE~_Zw&s4`2=秾]sw`裏~wM@īH l#5m"Q^%ɷɢo!!qt\mkksf3lD}a^A?ܧ!xQKh_ۚa tq':ŢGg<@ggq{iY~w:IeAQ:kr AK.6A'Pqv}7?n']vLd ^sαjh͟ELn?Vsjԍo? ^zAஈp++{xCᵞK/{4V_J>؊{Fd1umvFA+4G{}[N=^sկ~n*e^ƵYCwxꩧܣi?t}țz3ΐs:kw@.fU)=?|Ek4AeV Z _cWkbW1yGp zN#psI9o^q[kwx7pn&L?D}a^rk̋\G$ߟX뎯}kz,{,/\.]Q!8tLrζAmǏ3iv&\M=l: qرcZNA_p<蠃ьBDmoo/1(#Z%\Ov:eܸq֧6G%j^M+|;q8@ϙ-xh<;h>otA[k^bhx4!6'ʥ 6_]]7 g;ͯƏ쪪z:ꏶv?{讘⎗yDu;hmvݧ^{/[w_:3 8{o'xB*qW2iڢ.&>MJHvEGe}'yc7Z{WڷgyY0V1='?ךz{q-o`i/~4JuR-Y ( B\'\RΟ蹤{֚ӟמQ_mXnܧ[w,9'<$:MPwE_oU\---rW_vmwƃDGNڵb}TA/h˅= {Vv{:}7?k.2_(`<0NȱA$V`}I7?sjhhHDSaڷ6RHDOva)kRMMM$qFHe4̙"C+yPg?2S ,H)},e.nOxjAOqq}Ӧ?tMŜI?ڵ)s!2f~/O3~EM?]8icb4Q~OM%2{2 rɧ!Wl$xq@'uk(t?= 7|s#ȶiB{?Oz>5kutǧ&M䙧LV}'k?]iPàf1_h\W9\+}4?)'>&#]^L::1[2/RxBвj?;޸tN=kܨ5lC6.ı4 vUz>B=[ہ~w=>SH=Xos=^Gۑ>70/XzR˵,rJ>ӹq3,im9@P9X7>Nc׆wuư!C:dPW)z !MGP7q=մiA9CRuuutr { i޳aUن͞^=\YY 6l_>4/&WS~BWh}^[qS QЋ4W+.~2NO>>SV`p_b'g6\]9~1cx׽aФ a _ze; @׭A~U49M3S7Gn!iz?W ћnI7ŵ4aP {Cކ>ܧs=_>rG\OB t{tݡK@׌zhMYGl\B,{TvA?wqslqDQ岽QUh1{~:^kQk#?Ξ&}13=þ0Yv k|5{ݦ0m>zOXۜo!n7e┻-k]68{$Y㽝_3 g;A]civr#|,퍪BI;d xmo>biskkY4fV@wasD ,[LC&1MXy&~łnyp+-1)Ȕ)S< \MmDYzj*ٸqxebnYid\8q?M켘)1ŜLH}}ndҎk|r1,t]"F 3Q:;;;EiBwȼ/b;@+=No|ɂiDvegYxi*tTLy~w:2xs24=|gJ+qgے)$5=I`5xl?ˆ+@p=I @ЊaZ'ۛZA+5AOdb@@@@@W,X@_ӟǼy䢋. AZpNTfp4@@@@@@|А # PMOWW뮓~[n#~       @wRa͢j١LFaZ8!5*TH@#뮻: , ȑ#K>lgRee| _p@@@@@@2!D˟ql2gҜ9sDts=W,YEBM@(uİŋM;vUIaiӦImm^Znyםx:p53@@@@@@ [h'3,  >\~{・D]]g?3Ce]&~     d+PG@V;OHm~2hР~@@@@@F  "Cu'D@xOnp%ȃ>(|ZJ֮]+G5kwq6ěY֎     %-0(eBIo!       E'@EWdd@@@@@@@BC1[       @ L.gy #       W;Z+R-[f쬳Β8 tMV:<1"4Y@@@@@@@BúudV766 r*3hb7nBCު$       @|%Ė-[<7o3       %P¢E       @Ez&?|pg3d]wu@@@@@@@@"rZ@@@@@@@@ WHȔիWK[[5{ʔ)2jԨLQ       P ЙMF@@@@@@@,r" ,"       @a* RWW'֭Fc0@@@@@@@A TJ^z%^#,Z(dHZD+ءL*++Q>3۟ !6{ch^{ch^{ch^;_{ogWJ= Xoԁ}9RWcʱ8͝kg87P #Zf̘aY$ze'z %~ѣQ>D@ٹ_L~' %j*OGu#%}CEE5wQb["؎_|!y&0#       0bаtRZ[ee4@@@@@@@@`` z󛛛eݺujwuW*38        #{xA@@@hmmT*6nv8#!.㖖)++{;Ł\vuuyr/BK@jgg'X\EhV:::(G7H q}!H6lgРA) &]]rR?-t-W-y*V+4/.we[@@@@ KZhf;e)f@@@(KUUUٰaѣGebrmS*$Lo[Ι7ydghii-[82d7g8jjjȑ#E %P]]yENK`ʕ O4)h"=A+*ɴV0a3@a n޴iso믿sC        8XZhP#OnU^ 3gδ-]T~x1   @!}MM/@1-1pK 7շ'  @+4|wq2ydgc=AyaV[m%?eذa{G֯_0   hllz7H   j%@ jW+76{HH  @ ^>x푹sڃa/g*>Y… Y|"   @OODsssb  45WfmZ;d]u='  @ BCSDrԩif̘ᙾ|rϸ{䨣m?,@@@LKjkk=u0 UUrm4@   -P vmsԨQ2zhg &N(g϶&oڴI&G@@@ _6󠤦FR@h5ޗ].@@Wܕ-SW:JC_4ɓ +VD@@@ tFeI@ 5]MRi@@x ^A[^pjg].'taÆ9R`@@@ DS%)@p 5Is[{RÚv?A@@(NWh4i3zWaV[mL3I  @@@0kZioϭ/0BZ @OOJ6Ԇ[qPt   'P  v͑32g'^GGθ{@ߌYr3iԩ0   +&555  @uCtvټ54I @@0Рu8[Mus9~zg=;V/˴.\(---v4>}3   466ʷ#|2  nӵh*l"Z  P\Th8Ceڴi}N."yǏ>_j祗^J/[ou┕Q`@@@ WPE+k@^MRCA(dI@V"ӧ^QQ!_WK/up{Nv}waO9y駝_]O[nHvG-Gv3   @V zJ@@!i75֘,& zH@@ |M_@+4lذs! md˖-!C8;M6yގ3f9!|Ohkkk=ǒ#Grhur}bb"} @aKű)]*M?D@\%   MܕrC4 %&t7a  @rbz:m4ijjJEtP9hMD9h5+Q"#  -Jy*-f@(dT$ojiG9E@@,.Ҝ2ҥKvmMȢE+m   0Z[[W?vQ FBC楩SF $y@@EDyylr˭*sεW^*47q@@@%l[eymE}9˗re@@@H---۶޹Ѯ& ?UYl#> E/АЊ턞[@@%PEyf{O@@@-T*sMN=8eY@bIIcBvۉbݫ7 @IThشih@@@씚8?n`&d\g9@N5٭ lii/:S2 @IThx=4a8#   !*:<ކ @E#Ym0N@@%PdŋwYpv3   Pڧucc$fC6.' 몛M@(Wh.6o>AF@@'uM~ioOS`3f̐9sG@@( 7>ȧ ;?ر'  uVHzNC@%K;O|ͬm.Y}SO=C@@("ٲeK"p雛ˤ33cq'0 %+P,Zeʸ%[l  PlThRVBk#+9A@@Q@n&{qd漲6sȼga@E1M؎m-$>@@b(qݡ\?pꪫdРAKB    _R+3ʞs'䍳vSN@Hv5ѕl:+N@@JX 𬬬S!"sL0E    twwK}}tvvHĮWZoqw&Si::A(2bnf5@@ FX*4?ιSma_n@@@ dPWW'===!MrF %w>" 39X@bhj(l7v.Ĵ\T&  @I R$1(@@@ZZZ<<0O(LYQ^|os\Ʌ'#' @(fbAGȪbf'  @IV   E) l" EWQ;ȑ{N /q>D~Gj/' %-%=UaQ غ(靈C@-K ZG@@  L{ >dUZv1a09lYrǶC`@h,&(n2| JD@@@:;;Nzz 8gH;I{gn.!eB&LPB@Gt5b(.G +o@@$bР7y&N7N;${キg_rR_z _e}Uz3mi8@@@@9#cG AD[E  hl( m22   BV^;ȻFo}KvygKeڴi[o%>yqljVj   ]@ߌ|5+6 L1VyGty$TzMzzz"ID@@ ͭ]!2TjKdB@W \qA,Y"g}vIq:WVVI'3   T՛;!+>ҋT0xkUwע=>2W|&h $  P=)i*œ{LPk  PHH+4|}M2:qD9e뭷qرceV|ey^M?d˗;K M   d7WVeg@@[{|!PeGUٽ)γ'ؓԮ%ꤳzY@P T sA9l  PteQXo^}{ߓkzvmw|ߔۮ G)~}Ve<{xȐ!V% 4A@@@o^, -YhпU} :::  %$J%ҶJ  0p"y#K/Q?UA[e'TUU_,_җz%}LOk:@@@$fs<溜7ZonnZS'u  @Wwut{ JrF  F 5;r%Hyy{r^s / mmm3@@HP[2R)ٲe{ %/P*MՔCW|" 'zzK.]JꪫD+[?^{mtO>k:@@@$t]}ޛl]]4FZ[[' @ujZn  Bu;NƎW͛7MH;   @kʿ iKuutuNea;@R#cI)HV d)zN***NpfL~a'}Wf̘k uu$rb@@(!yoMih yzM@@[G:ђ,V'J`@(yrڤ?Mn2aW׿z9餓W^!I@IDAToI|Æ $^+W;cHi&QFɓeҤI2{lq +V  I<*M=,mZ.&0@Jsk'  @";L>=C=䤣{o7Aۻ'ݰAg꫽(֭sor'ʔ)Si   #呗? `y/Vb"/ZF@JBCkGtlPI $M .'M@ ,:H*++ {ֳqFx,YD⊴mҥKG?<3f3 @@^Nq#eefyjOy  FT+4h" Im9F{X+/z_KKTT+UUTlْJ@Xp&qd2uT ?zBoJs=V̜93^@@H 9n-Hok6~U[_93@@-cZ0hm.YUUYdž! IBÄ <ew%zz'N/=}prː!C)fon)~ik^h`,   8{,`<}#vV-4 SC+3n ͭ`j@@ FP2Ǫ6GZ_?CXlXIJ[Z8餓<f`r 'ȼyɛ6m8   0p=]G/(V+pڂc JK֎.V(  BPfZCף]3cx=>=n8wX&72  #PQ^&ZSƏȸa/\uƁV3RSS#  K״RP6J@(~Pmaeƍ2yȤ_t///bР-4A[_^olBC5   0py߻kjdV6o5Tv9^v1-3h 8ppR@MThsCK7I iUIyA@JZ *uM7-\P?|g<쁿/R__${AСCbоi5ZC?~|3ۦbTUUY4]  1N/]kt:LC@:ǜOzh2  BG-rKڊ|P>O˜9sBߪIgfGs9aww3@SSV[m"G@@m "0PmB+\  @jS4h 袋<(83hooV}H59jA{:{l8#   @&2C& # @ RA+3 m TDB@"BSNP]~\pyP6gÆ o[,YIo0oPi+0k,(   @ZmM[f[K  @V@ t;1PD@nn&_w6wޑ38C.B9 ȭ*wqtttx=cL#O>TWW;:evm&2!;5-;/7ss T:[F(Yoxtk&e`ߎn?֜]ZAkkknN⾝< #*#]=2,x+ Q! @@@`DRAN=TyweѢEe}}\|Ų[ˉ'(￿7Ιn@ظqoj ow;?x^3RVIgkkZg ME$V(죡0JD?BaV^]ѷPmыP^XZx)%*V WTQQߒ3gF~ ( E.0ZgТji*#  @DVAKk_,]#b ꫭiSNNƌ##G*kk׊?Ԑ)L6M~3E)˖-nv!";CIn/   hKVj!  a ݦ"ebchh"}@@l"Р ovmi7hr}裏*LzR !狼? Z)D   ~Rm# @<OO ֖N*45" Bzj _җ+R֬Y7vSqwZŖ믿.7|2üy䬳Βrj[y_@@U(uI;VI{*dx '[@P!E͵~7.O9cV Zg}SVcO~sow1Srcqws*?;sU[O~S{r3 2_$|^xAqSǃ=C;0?CeK%SO=%w pgKeeedyfywǎ+;3@z 6x4i 6,}d%?"NZG xc¨QYOUXSL d@nhh:`Ĉ2~xgp6mVl„  pE3*m!CKzkDmlyS՛ }[oM<cZ?%ad#Y/1̚5+us ћ- i8iB hw65_2fZi{ksF]G^E>)skFr{)zA 轙+bD|,孷޲DCs}7'Nh͝;W9kZLCO&"O?ٸ=S,X%?4f:?u,Yqe;k¼ {طC'uޝUzO:B@51 ΟTfTa^e?uE?⋢ 9@tҡwwڷ~SPN/UkU;|9tWs Рۊmbh@ 1:C5=K46*>Xi@N +2JݮrZ~-#{iU.W]uUE]L`@@N Ǔ)@ȡP)H;#V+F@RАZeNjx^'===c򶷽ml    P 'lZ_zmai$)': sj?2"{-~_dnsf%PIwuprTdwcRXZimg q2ղqFTU9nj1Z8d*Yto~8);nF93xG@@ 222r g.0{lq*Mɢ455"I*- ťՇpJ ԶuJC`hxDsRRM6|s' )+.Ǐ577*fU\Sp(V#dNcrЩOHKK6@@@rtT fH}:r5h9 K_ ],h;Q2{>@_oZg&&3|ӟ&@@@BtT#:% @(@Р`b9?  ޗ^zI{9N馛fa@@r?@+ w@8j*.P8omQI@@J "GIMgggZC)Vl6=v!  @ :D(**SO@jiQ@@ 47wڕ6ՄI2/#v; ٢q<  `T v UB@#$K  @h"8`&y@@@ hbTp8\I  PN@RaT@@ 4LG5<   Pf>O^13c8Y@Jbd I @@ А[Oӥ}}@@@2b I$ӎ  @,P$V:sM" -@@CEw?G@@+0*z:  @FgH " @@ 4@@@lѨx<FeDcRmGB@n"WQѠZ'eXC@f.7R   att4da ]dN?nE 3`St Nua   0Sf*H~@@@ H$AGg ΡÉ@}#F٫l:i5#! PnPܚ4ñA   p [@@@ H :"@*V⅁任pZbqE6Y`IvV@(uH4&hԛ $@@ X&appP>,###cc1֭˽%"  @E òuwzdZtΪ VK)mtT:SΒGCK(hp:?v%T*it'= @&@8*lUg#  94J[n_lM6    0N`mxU{Gb F|e9YŕYѠmTǃ#tNQ31Fg.cyk|wLw(@(F"41A@Zh zQﳟܹ3J@@('_)|Nj{~R>~\|zkjhTt$:^r< D1}M?|hess#[;G޴'M,4LlV@@@>`ȇ  y8?,p&2h3cJ   JWWXuTu֍mc@@(Г5A_ȐL/H -+dsյQF"ASvڹ+ITdB@Ra^ ӕ5   <Ç*w0  [`݇FrT ft(G2gV][D` 蕍ʏ7K8nnxVW\q|hZq E$ @% 0BEh#@@ ~e޽i{ӛޔ    PL~'oh+m`V5ht5Ƌ @% 0B7Fh ! N 6[asNZCI   /B X,mzN:rdDz=}=O6=KyO3]@(UP$fLurRmGSN@@r'P9s~hh(m@@@j'<2L4Ąkb{v  {GLuUD Ò6e@RЩH Dcq Gc⬶O0G  L+P|}N}ɺu릭(   FS!~ ['H=DH `^O

@@(V%ǟ{-1"C62$kU $ds GZW풵m+ITdB@hȼWu4:W8@@`R4hMy%}CV   @!ZP֝⼹,Y`(ȯ^yYqsV䲎3CK׊V?D L 6;vfg-܁P4+N@@ *Mgg|3|+ +pKM OXsB@@H$"R_^P~'v託,u>2d/oh9r5riHUURȆ @y `xo򶙨uf1 @@sE hЪ^yDQ{J:::=񪯯Ϻen7CfF@@*X@zhmnaZy"qc|:?;y~wϒ[O_/^d 2" P)ΐ]OnjHL\{v9@@4s=rDe4pÉ~;Od6mڔmG@@ ЩFFF&^+NYnų%zg̕iL}\2ٻwvo};ieiӂF$# @ 0@]f4dF@@`@Q{9پ}  L@G%t丩UkūxX{\Mo\ϖvx<1#N@p|a5'71UpuMV.[V^.mM  ,E*ڮZ4T^2! (J@ӳ  V`tt41ij]rۖ$^X\FQq;jŪYN:B @@`Esw̼攀  d(KH(0Z C=یֱ)=C1 Ջէ] UUUfx@@dI@BTd.e!  E h6@@@r(Ke廻^3]s_&e@&i`b鷪 ;q  0 S@@JV@GcX9؉ww?!{{MWoiˎղvl6@& arCiwMw@@ a v!  @ D C0,ʗycFH L&[ȍK/1H&@`ʉ,J08V@@4@#   XO@z^b㏆eKյQ#SsW;em ؊ˤQ+hTGME&@L I<δ]iz @VR $Uoo8p`uСҒxs9rg3h  @8Nʠ7I8ӽ;G{P\veCK׊n?aMM@ȓ# VA4(Ϭ r# ,`A?~ ٳg˥^*)s$   @ hPȈ/34 C=یV1LgFYt\}RUUeQ@*ITRsV !!/ "P􀆁ַ%6lȊ\w.,  rXuJ isɒ&yN9}^C"A YCP yk+4"^4{2Ȉ `;yA T@Q^x?֬>OOr7 7`!  ޺Ox|Z:_nEmeYGc1^`|o5kg4K2,kd>ӈdD@ p,%V^q~#(  `^h H"Sjb 씎K5zw^9rSӝw)VիWnf@@JH fL!q_ /8:N1/Mȿ=3O9 оza5'h`U6YݺX>rim6U@@ ?h\=if̏  @կ&M /PnVYlYS;&?GX(a/~Q>il Sr!NAZ@RF#I-tMVg4P(IY'??ke8f|Kg%Rg͖\=h44]g`Zu%5!u9_*xX\P{kw0Lr/bay~G~rp G͵5-/\( 5"׋PvAO,R햖~ZCC]@ 0@n:CB48Y;@44l޼Yo>fmE򖷌mjaΜ9rmu]'gѣc=&ξ 7}fXdYfU/n^ H#߄&gd x$e$K?~?w?_HAS3^#fsד>p8wu]AQ+4E}/J8(i-e|q^s߷ulY?N.V@"?czb=48Y*ŪSg@@E }GO|"`Ԍ:-ſfl@@(7U60]0C27'wKC1"ÃG^s.@jȵ. fa5) @r, `q5ʢ8Cʢi I#43?Xsuc.\Rn&wȺ~Kf[#  @oD4A_fF5xaߐ\y~{ZP~ }ÇL7(8tdD@ïO[Y )5  PX4:l2]6h/ hB>L@i3:*ij:uhzqZnj5s{5Pjddd,4Bn<BnՍ;7~.fŝ;–~l~gI FiHB2888Vpuu%=HӤϳM}ai=9[ex:AMMMڈr3-{eHӭl쐛^*KL1]Fٮt)n$@ Dq7nRpdC@ 4^p83f , 3mƕ^%M-0"mj2{5p$5A/59mFכv^;$g+ɛz57REr7}S\糝*d4bi;Y@jdrpbd7s>cRjw=!GCimt^eխK9lK Bsc5k~b2"Q f\⣢A"vsYB@JQ TJ;wnʚEp&===?  X[ 9) DòKzZ<#eZS]!7.Tlr, XTr1$v`JD@\ :BjիWnzY  htt5 fHF47:5'ՉW)?ڻYBqcX iNֵ떮=7gdA@<B*eS4 h(!  P04 cܹs {M{k֬YD   NɠSEaՂ Yni$<;HHڿUzmp5k}1Z @O)'rߧޔ@@2 Рvڵ+!cW_-nIz衴:YA@@ DQS%kR+$)No:Od8~J6NwܲrYݺtdD@ DcqD֯hՐ 0 &{iu}kc.lذa,ۢEDG !  @x"3$k'~בY+ =GoXn|`3:k`r>@ { `  @vE믗G}41ԬV'&4A-ַ>   ^`tt41͜N/˙ϒ't$ǎ2=]U?oaDǁ~דrLWͳǍ:f  # 4X (@(C\}co|c<w[̙#6۩H ֭[GB@@@x`0ŲG._x*۪˛r>( ˖=r2jj)k箐_*MN:9@@Аn`K  PE hPFO宻Jv{bvq8ח`BD]]|K_5iz@@JQtDɾgPm'l,l?#C/h߾BVkʤ=f0䓍;H01Y:Y׾JrZ;LA&@(@h}~[4H   ,|_nMv}Ji#G$^S/ȢEa@@-78|Wuś%g֮cIsS4aV9ol1f䋄[塞mpZX5r͢5rU2x@P*WhlFȿ1g@@(Z@R7M-S;dܕrK6U@@He5%h@JZ %-J@@(#QzEI dcNq3⬓u亥kj ! W`8ɡ3fGV@H*i4   h qa{zᏆ䡞m`V k-@t   N@ʿ@0K WUUd@(4| 6MӨ3+9("@@LP(^"v?GCrgSc{M,_^.tdD@90Lj94_p@@9O~R3֌ŋ˽; vl߾=m[.W6mڔ( @@рR~70$avaٿ\r%  T@<'P(nr]ONӅl[V}'! MuB! %'P/˲gϞ7,k׮CWr{LgT&@@(eYƂJ=V{l4./v?%'LUVU%o81"üSe @ȅ@-TX @@tР#)tww'FFFfWe\L3ha}}}4X@@JU@z@ʝ@0-{e03Up!kVGW\":Se @ȕ@(x̴r  0@QVvGx< ǎKs6 @@@[!#xaѝg$37tpYkm) @0)t&f-K4jm%@(ohM6N[g@@rÉ@}'V {ʃ=D0]r5 f Ƀ `NWr0ZN~@l4萶_җѣ&^=鱓C:tH_3gd؎  @k:@ʭ@o`HܽQ=tmزKyg.  @L}oI"F@c@@y@CUU[N>e{AWN5ё(@@ h ozxz{æ=G,#!#  P(H  S RiqՉH Ӧ0Ʉ zN#4{@tcC~G$fLiٍ2c: d,N~w|mnvٷo_b 7 k֬ȴrVZ[[f@@JL $t Rn*ɒf!!; @ noo/^93  Б4!="*jWnʦNe@@̸i2BC&  xa<1zdqVf@ %a…mdWΣ~zy]nM=  @D <ÆT/ȝ]oTɶ*yru2n2Ȅ X] `Lu@*#4ʹ_H{AOFdigT#@(@Qr8^$y9ˡWi Ta#2:]&L ȳ{=O@kCֶ,DfMA&@@Tn="1q9x =R>DroF OCQ9dF@`&4DyIOOO)@@r! Ġ 2\ƣ;GH 6U`--]+NSe @(5@8ZjU. lh ө&b񙟾o'MuNqr;i暔 `F(8 a2iʕ+39y衇d%Wo*i@IDAT  2|aLP6!l1̈́TWkO[#vLA@JVu:ZFS:&%/0p8.NgnSO4 @(M4|_۷MlӦMy+{<eǎ8=D@@0Lta34< GdfierQre@(e@G YCF?K-t$@&Ɲi|x|!oCB;@(J@C[l_I  %  H*nWy:9y2Ȉ 7ЭՋLa( ƥ& =SO0HY)@ 2@*!ǏՕvڼNבv2V@@L aLeO8#wv=%|c۳YUUɛg/6FdX'fec@+O1fzl&qLaLcRt'w7ѶiQi gs!cjH4fLV,%fgj9\-1O ч@(.LJ21סh5hюZoO_ɔryϯ@j̽myֵ( '2o>ݦ {S={p b۳)ҲǾr]w^OMK,rnf@@":2wWy`,"{<-!jyk Kd+wC @GÑyR :tQ-br W(\ӯ=sQTŕy!N$`,i0>Ua_c"SRQ4… %A E h[;ǍZm6O~7m$_җni rW_.'N(PS@@B4Ao&lf ecNq3⏚te亥k]Yȍ @(+ӖneJWk;*S1Ű?"G3-@J( SUh}: gx=ny _W+dk\ z׻dΜ9%So* Tjt6OͬǏdÑPVf6D3j](W6~7  oa$Z}b) D)'F4@J.! 7xc≸gyFy@RN:"E]$|;EHB@^֩%&VJ6}İM=J6M+.ږ.  @% h0C1B>q|@]qc ~ݲrʩ5-7CCC,,RԤ܅BM=o%,qIu>yBd5'G gx<9P$ C/t[VMzD7OZz9+S>sH~ 0sVIۼ@?"WےZLUglFr/3DKV<+}Y9M' jO۔M9L}ȓ{}mF>m˶\^@Gȕ{ק G$4\:dQ,w1+>0LN~"k\ )g?Z>^.nD?j~ߎrfRrwwwI4$EYndOOs #-EoT>ۅqֳh@ΤQVLR?snS+7:i; y7ʋ}/` g]ܸP7|ivԊqlC&drݪ /3+QܳzgBr# B@C8 R) 9Ч| (P :$OB;v&# R@GV*@\dRH4(<=@ŵKҼXsؙ5wA@}7\\ J gYa%h`A1Ҡ1}MǬ:c9@ (` ?  c dйuR#yh<~U om^"j]%U֝${r  AH'Id#ʠ7M3񅥹ޕ2)@"GMk[kkk:+9`uXR:DmsnuxJ&2WIЧSw\/RtlߟV~:$g+z[_p8ڞl' $F2,T?oNS.iI͖Ј<|e]\:Εmg.uNbOZ; ;)@M+L> 8!!/dLX(% !X@3%?IZ*m Yf2,Mo^nhh̓2˺Izsct >c9_PԀ:rzzFo&lА*eǓР:,ɝtߓ͢1wHߖL+Az)g3+wv=%;.sEcܼrjo dԟ%'5dП# $]ߏlk3M%3U$? @.tJuDqqT3Ju{Z5iFa>΍T@4qzrٰaWJ`YxqtD@0+ 2ٲ*-_zDܹ{ *&UEdalr,  IL0vTBWaN3# PE hg>#;vȊUR'p4atO}  . :"P*%byܳrܘbLrvrȲKevM"ȃ  `R)'L0Q쩆',f#t (4c}".irWXC@( d= xlp8 O*uo_&[u!-]+jהc'  @ix|4SbNt{dh N(@7nmƼeai   d| wnQ3u/vl8C|mDGcQ,<[^tT   nb憅(AoNoL5Z糢E*Mѳ@%tJGG\~rUWIkkk8%  Ut2@{?z#^>9k 5rLAF@@ ‘FIyٗv .AL7U\@ %??%3=18+  P=sdd@wOzJ4,+̖ #  @!*Qj]Et&Qn<>sSch3  9(ʷ"۝&P  ":"N-B n<҉#a"CmR%^d2\& 9 K Pe<>6-^]]XwNB@*4X'?L{7h,nA4X[ PE h( 9  ` A !"lgxh$o9dezSe  hB2XA |Y @}z:71 @0lnthq(i'J *@@@@@dUio4([ uoo0Zc\t]j E 'ɀrr" A@PD|)'HL&0 NNt)Nn;#89 PǥO&،_9eP&F涸 u:΃ P!Eh8ps=Od|aZ/b?Si&444THL@@t2d{䮮O34rӊurVq{XE&: σp8,M755b @`騔j4p?li "]D@(j@?/gE/RIhTxy _\tEf)KH `#jJ@JE( $??Pի#ȴA v풻K?סF̟'RWW7@@H2bL-Y U{xRmtʺUrݒRpMxhc}ƌOM<=v[<%$m^UUU4@ 0݄U{fz $R>D@xu&#L( :M+2Vs-!sضN?Z?y9qDp}{>@@ h ȈD"2엾G6!lHܓ[γEka W 7~)k7l<-t.yhHgH5*=Ot=uRQ PI4fo)\}Z"1 ,5[T7q2ɇ PE hذaØ^ґ2 fh,y/Y>O%.GyDnŵcYF@2h `0Ƞ7GIS 塞mȡ>pzMqtW;$h\<4=_vzf8 $RX@P@r I(qR2:CMK@CRw@ wޱzk׎gpYg%DV+/\p  @ϗxteq>kFyYT3K&9eN[ȷݙU0C߿+-%oYٖĻE4pJ'a"D5@ȱ@$h,R)P Emx|,Vt? (x@CZsxp%H2A ?x  iʬ  H2 ůk7" ^>_(ye\QzuOe'yT".kL12 E N @8tGJ+VRbP@02aگTY[Pr2 (oǓVsaa=E($@@k2c)±l#KpxcSw%_'zG4?iULkY\l4$ daY8bkB@G]H  6D)dA@rh(~dR}_Z ɖ4$5xG@ZZZ;44$㷥J,v2Z!\  /~1@G"xt{x3qD,X-ûfKkܸIVfn,k ^ٴ_3羑s귝> eА рB"9  3%; e$@@Ciwf(rwiD`_ZM$۪ m* (x@CggvI l߾]/^l[[f@@=% ab1 (}^tV+RUy 9dhGc#VZuN'gP .u⊽uxH840]{fzJɯSFhB2AGd !  0D*- jp92itZGM3  :M~mLq L(P+_rʖ-[z+\{WSS#W[g@@05nAFd\/D^2'9bsƤvވvx6M;^/M?ۗd9rəRDhE2]r  SH2 @N I$uӝQ6hȟK ؼXA ngNy@D(^wuc|:B7ͱl4=3XF@@L h cǎ1*gﱔ`3v,/ϕXp򧰖5ΕKbȼ6irf?|Mu9x5Ѐﺺ|mmm2k֬: S@R!UthVX`DH6\ ! 0S4s9r׎|ߖm, y -ܒIVA@@4M daqe}O<'땃 D5SIjn*y>"~S2{mƈ;'ݟ鎕2= nnnsJkk444tG@bSggiciT~jYM$5#za;oĐ?p:} n?4-_ذaԲek_$@@ $;IE剃U WGk5G7 om[!^6Sz_5|/tȟ_xڤ#{&?t&elt: >>ff  ?u  'UөF0z)P$&acgzJ]@9h?.{1 s;Lޜ9s=qqohh(g bH=^򗿜o|#u  9R sPZy1 ƣ;ݛZ#>۪l6˧:eY?MG?$#}-{06+2FпYA :" @ȧ@`)y^έ@$O3:P7P IcmǬ#d/`٫h_oooI^}L@@,4Ȑ[#;C&1rYJiKF3d\<\3iD S *:qE@2>{҉f; ˈGHH45Nxl6[\Rm:A{ۙ\+wo蒃}^%:|ȠI *:MJfɉ'*> ?XC՗kd.TYHLXY4ZG c Y L5",sp8  t$Z".@TT:AmjwʊΦIYtK`@FQ[XƎ8g'')N0vl#e+hGj:wq|}P񋭯H$ !40aF9bRqrԄysj(ZcZ s7u: 3$127Is\r;Vf"ՑA :", `zKwcGy3}"2]@GXYPR, - P(N  @ dŬ7\^҃q_FM/מ':j;2fH=o_<$Km&68zLdd6y%(nfrypA̦uI:RtZ߹T$>6 1@@r@aR  (3 !; @6\Fc@@ЛĊ I+`d!_a4(hM^{FP)es[o}ۅc]q|j0Xc,pYN q՚rfݲpɲ\vy٭r鳥Ƒ\ՉjkkEI  @ 0BC "0Zu OQ6[ěN@f(+x/ЭiL462p)@JX@~U@㩋<2 9%oZ.IW  ȣ/2ƹ$4$Q\:1?b.!%j4j1=? 20u&+2Fkϗ~Oe`8(hXf9b(Υ9  pߧFh(^ :^3{$! `F  'eϞ=cuYx{cpmӶreӦM,@@뼔oL-lXĸg{?pP=Wy<&q1;ͨ!9봖P01ި@rg=㺮sߏ(3fA$ ]H)QV[͖Ď__9.)/y/qDXIQ -YPDP$ щL/P 1-]`}Vд *KqZfa``{WFzC^^DdM#   L `w1&bZp /Dgxtx 7ɰ"zHH }D]А>h   H"d +yT#SBs؆uW6.0#AXz>;Ӧ &9W`8KP ʔG4P+Q=xm_fsSV֗3A<.#0C"15 @zw8z!D |=JI@2U(hH3̾ @lM,HHHH $G"*B1kI T__nm­feO88t6m 0bЮd6暺9 CQn>Jucxܼddw#VXᘥbJx ZD dt:/ʔ$@$@$@$,t鞼'' -4DdaR98{Ⱦ Ă@ 2J=Ƴ$@$@$@$@p\7 '=?Mְ ڻlqgsZB^f ;BO 7;?DP+$ Yj >kʐC^aв@R3SZX 3;߉BS$(m>;BҼ@ѨEBPa$!777LJ$@$@$@C@lwv=SeKO#yD$@$']#  HNS2GwS HDj=Sp.߅ *4APBQ!\ӗ[}uչ8;P -Cү_de/"bO  @6;4D@^pEBҏ@1 CA?IHB!A_\s 6oPӐ d$á 3i5+K r%BVW!!,ejw%-p@s(}93p˦@?$HHHH tVKC GK?&kr>Gx(+[Y @Hȝc=]viKaa!tMG="    HH o]PUH 5F)ƚye(*p00:#!ώap}U"fBŰٲfd(7?BlZ0\|[ᱷO\'᝗63|A "dO6 Ӑ ,?; 5@AC)ǿ|XƄɄX# 7 Mo9Nuttg:x<+$@$@$@$V&dp?jL)^>@_M]UYS7΅>722]+AB%(ט#N+fлP:_˧+P?ɒde+!C>Ju|q 1ç9_WQ9,I _o܀+WW0.b!E "HHHH`(h>T(jWjR1raĴ$@$@K 6wb;;;֭3 d<2A~N LY :ikqܠG[y<rkg=CրE00c!i(^ҋ գj{ -e$(E ""]9ٸdyդu~AyihUyjMFvG;5bixN7R"+kzFȔHHHH`YH(Z) #0٤DDQh$@$@$ FFF|e4f.;6pGj"E,f^g]-M(zr-Lf*ȵk[!b|FGVAT!&BSgL'?Q/˱jHy>#8{hw0겏wxi/r ͛eF`i+gYgLoDAFb |n}Jc4`e|2-݃VKa~.fk!84!';+!AƁL2T}掇 )4'wb&bů&Ex&  C@ >HZm6[̾K6[ &IHHH %1$7aF]2H! 7hЬI?؂u觡%f :l*XNӄ #⬃HHH&'`w/>y)ܛ*lؐ*e;02+܄*#HHH`0_"fנ?c/\G{zznw12X@`2p=s xD#3j)-a__x8kXFEEEQB{!&Mm Do}xxx\x ABeEbAN%9eIV3NM[aŊ9WⓓSvwR\;MMxU"ʼ"RլFzNx8'·tS{@ ~%o$~>^|pWHH2Md⡁롄DPxg v܉he @o f-U,3\s2߿y%w`ב386AC,cQWw''OFh~a%^p ֔G\3F@t:VS DBb KZ$e3Orpp+~FVYG2 M[E6XT? K-n *OLYЩg\/WMSst0ՒB]>(,yFϙ(Pih/Bϙ))Js @$Dα   5xX,a2籮`Vb ;`Nd0?x:6>֧ .WB_4+L.^DȐxcj   ??DR3At[M4-=!%Rp$iPن21gi벝 `l,u|M5qEpHH`2 @"^Ry6łExoN}Xʘd{gh564Yr`צʅRR}h! !$z&b ),HHHbAbXpMd)b6sNϠҧ^m_!<ԭ-:/Ոz51C]aTi9XXVf[xxk? 2IH $DpEHHH cAJ! v B0a쥸m&)w A<3HHHHRr6NvE-'M8e͝xo ѢPbw102ܣ-7^X\^eX^QZi"c r"M_Vw  $D xi$@$@$@$JN&bZmUTbǡBAHheZ=}Qل'O},Yb3 q՜B Ak04o / @w$:!6E^bDž#ql2 1wj&qL=`w1mXUXS9kgG]ޓ.?v\=~2g Y d* 2,$@$@$@p8GqɞKqm1_{Z2<ݺb T qkz\WY*-$"f(,,n,HHHH !,Ȅ ilW*#S8<| &/ Ue8.![>VªFZ,BeA$4vne&;a0 d4\.tttԩSغukBvHHH D̐VT{o^}22/7^>~ rќn- b3A 4    $@ y^*Ă@P DАVI( ӵ>^:HYgasmY]ـܬV4C.a' q IHR@B Ǐkl޼yZyvr^z%i$@$@$@G@\fi3KJJ2B]uZО xQj  H5cccKazZQe%a38xz&brņ\q*N{Id (Tw5n:Ѭ}p^^&bGhey$@$@$@${>e>jH"DUe[\Uc,lC)fJ4!<c9͙/--Eqqx!Y_#6e5VBS%G :.Ta).*Cu$.-B2-mwY> H= 4D|^̟?{IHHH<"4ͰZg&,),b20V!}vV1_yĪYY,(֖3Wi3h.с%v q^vΎὮ򷻟VF\]V$J@;GeHHHyAvOԥ @ .k\(MS3k^l“'>L9+nL>@'DNN$@$@$@$@YM7*Į3pp$b!/[s0_k0F )nG6e1:hP.Wiwʓá6TKS)V6;Vi~ [jyY4N%Lk$@$@F #{p׿5i2]un̙ޛ\'   nBKgA0bu AUI>V5ؔfLഩ/u?,>2ښՐ7 $q3Ma8aGr X\\EujAf t!7'u$\,W]Qǔ=-ZzNDŋS&m)pM|n,,ٛ~ | |pHH`@ v۶m8Qkmmm%Z&&fϞX @l0L n&5m`˿raay;9zOQ%{v9w/؊  D A<3HHHHH@Y^fӢO`TةD oCwCuXVҀshR]4J2r焥rK (E[yZu\N޳݌yW[pM0@D(;.uJ%"*+Tav LA⋱i&ڵk8?Ajb$@$@$@N@=,ݙ1PzfA^m7Y }G~'؁es4 C  !/mv } |hQYܵl38ڰ0vB Y1;<Ўû^kpMXR^3"CHHA*w?p22s?яaɼ$@$@$$,G bf|#xCD 3o#Q7eְ1Y p-]Pv~f8 41 HHHHH  D&r|W1-e$/(X]yV 8ISSv>;,֖{/ -CxZp?rO6kޭ-+*G.ƕ* Fnv_Pp':gp @?e:gSm:ha%,E,h\ ]G NҙnURܶdOɏql3"4Q<<|u\۰w.DODTاW^'`Qp>! 141 Ċxb N'g&5)fۅa )kA:?nmXkkV#{&N zc LJ3'2N'^؍c#! N{Xh/gg.q '1E|Ő5o("nk6m9RCz#BZwIϟأ-U// ̚R^D'2}.N "h 'HHHB" QE[B$Tp '8z27)a=t +ƭX[0+o "bO Ln_B=wKߤ}XXT:%xPRkK ;AW|;܀owsJV7pmgȲw/[kaƌ!cf   &AC]]]#gIHH% 2XV)W ˁ~(Vmn Wŗlł"N'(ܽ!??♁F$@$@$@$@"S;4>4ubutP=CMfJlF +d]9}/KyTX[m&lW^9>Nz' i4FK|ub*H 9]c%7'8 @:Ha !-IHH mI \6%d0&Bc5rV.(90LBFń$@$@$@$@᝞}J&kg3#7f_s&K$-<yFܹRܱ|}}tn?12kV,~^ƟWׯAzw sOq  Ă@e@I蝝xGoj3Faa!.R~I$@$@$vfY7H@)Qe[]m)XGdHanFܾh) 8.1$@$@$@$@Q#`u׺^F$-H ;zc{ 1溭jzF*>r]HpBDHa~Bm1c1d7U^ܷqUܳ*%lX}G  %x/HH .hعs'qJt5r.Jc;5ia%t:]'   H[Ros -qϵTͮo0s.ĺ!\@D),/ƩfZsdx#lz \u .[1.4opV;$@$y&h?kS_ <1|J\g5\}$@$@$@IN@ S,NiS?^uR+}gDo@3(xEyIA8)VCAAABHHHHH ,6E aQ&>9V";bIY&8g$eȐA1 d$ G '4<#طo_H'E]0lEH0 @\h#dK)ZIhưov ؃) :5SJġs @d CCַpI g.õ0"ɞjWbdoejOQl^-ȁ7&UBbݬ̜-+ 5kF:6m$OWWɝ& d'_NAD :HHHHIÕO{2:)Y4!C(ABNbG`iy-/u 9­žjA s/Ae~iY3.Uy!N;;L$@SHgCxZ؈>?c;444hV^ ---ھz wRd @BKPͦ 3mr17v6+!tZ'O`an[.02TV]nwoX,56A@0HX zc`5    D Q}[ll\|ŐAhyi"  @d>;22Ҫ*mφwIWWW9|gqqd O{^aA$@$@$2Afӄ ♁@h/j݃7NY߳gϮlo*/l8 @ ojՄ ~cX}J4mށ#4겹R,,ApA 4    HE(h;;{wT-.݆B>y_U_5:y48 *^܃U? +%G !/ε:  d%wACuu AQX LUݻ']pH^ 5k:WHHHK@0fؔWbtkJ\cn5ь_+!C%pXvce#RB9 $έP"!&h$@$@$@$@$Mpb> N{:-sG۰1|حB8]c3Po/*^=-~@vv'sը.4-F$@$@q4̜9SstAjnnFCC=G}XvO_~{X$ @XD`X CZ`o؅A9p)[KQ3L z-|HH2@?FGG'/3<< UR֊NJSv^nrBt\| [1_d^5|H$7dꊵd1fMYǤdSYvQ~Ce ]XU1/>xzNGA8  'FJG[K m`¿rWW-"/[xc(((ai$@$@$ /J_z0JT<[rInN/{YTJ qлfw/ʳK5)P'؜0{.g*{Ι;p΍mepaB!>> ݓ9R9{GNYX7yII$.iB.k9);3F^u$;SD O6/I.h>p :t?]{o~m\szkk+e0;]L^"رZh4+V\P.   xc!pOͿ܏a{^HHPkkV5fxU yyy|25&$   H5"hHes 鞝htՍ%Z|"/ tZ:?Ɯ|ZJ3544C.~ Vq6{ΘU}Q0# #0A?<^,YEElsW_ų>dyvOTݐGo6?h/!^)qa?ylܸ; IHH "l6ӵdZMxubu<$@$2 ,{?MMMؿR~5kySq3< ]=7,9 y] "hMM`iy7ȻUeuRV,*SClSTC$@$@)JL͘n*..v<Wxv+眡4M yC,xov>3,E ҢG&Ycr.eOHhze9"'n"AiY9rH{hppP+"&?A`>)z[Zl^Bhs*'bw5\2mwP[Lz]](*޺M&rěH=x[ܣʽ*-r(byC;Atw۶m())BFEo./ΝO~;IAn:.466jȑ#9曚cB$@$@So@2$ JLE pY UrS'p4gF6V.ڐy-V '/p HH2\@i3bu^ΡwZHo?=C44d5LcΪe qۼQgxPMNNCY:T/Y5یw o`k*>[Xiӣn 6J{bMYY3|i7i R㬼I3xwgaաLښ5k#`׮]ػw^fF,_r jjj&#hk;600~+2 k_&fQ`<3o߮$' GVBf&"8wX\}؅A9"9:lZ/ۈR!22-< YfD}HHHHLn<ٳY w̻ 懜 :\(,O1%`sNA~6w ~:FP5VDOz 'ڱl%fg&\ˆ<tH2@B YBDtM*tT[n ;z_7n=[<]0D4  ' a%f3Jd{i+G{?F\\F2w=򕨁2=a%g$@$@$@$@$~̶]'Cc.v 'C`w͜lf2Q<{Oꍕ4ϓJV'? y8jnþ| .+_0m*Q tV  "閄g>I֤#{oaѢEۓ\tEZx O\;vP0(# % D`ZG1Cqv}oǛBY9Yr\W ׬Av݉ܧPZZydHd;X7 $-2ul#/9r Eafy0<4+V#h6K+ȉa Ԫ2Ԏ1Nᫍa:`T8 h$@$@$t=mG5nݺax hkkCmmmHyHH = HX q= ;O Eq&>_^ w{z^ -!"j L؝ʓىIT^>lA^uKqYlu'p>g6Z/Uw㥎xm'$Ą33xw7j/V..B򊒊I؎T'L$@$05 ףN/wObm} @N$@D@ "dp8{O6<ڼ;"nҪ:ոD\F&ewLb @(,Ine ցPY]ڈ;_2}QypzK1QidpQ'm# 8AZ{wFѧ;i|Fa(5oO<9{aV^ Ɯ9srB$@$䥰!op<یߜxmkQ36V.Pr[Pm(>I̘1C B4NHHHHH<Lva,D 9}ޕ0<5^4ċ*쇈bx{/: *<:$.徇GCצ^˓_cK$@D ꂆ??644׿{hjj͍;vD%=a#²땗%%%;C1! 4Y\}O€^OS谭j)8oJȤL"l,N#    9<4tYj+yW0 b    STshaƯ->XS܈,\߱ʩXl؝n5~pVy˛ Xj@N˶Ze% x8jnZmÿ{q򢒟' (I$}M$@A ^HtO?L4".~)OU @@ˆx[OOgz?o^QU?끁gZlHX 2MEiTjm;NFܫ} XJieQ H( o{>VCFK:;;'{M'NNky9s&`Z">Z s @ b>SnE:-$GA̺kR$TZ Xy3r}Q;μmx ?E5QhElq[s)Ή `J$@)@ ꂆx h_Mi  `<@u,0uSIc-5wty O2ow8"Qs=͖ީNqtan\Z*^ہaIh+1AwMtn%"@ށD?YGT%TtxHH $hxq-3C !CSBNAC`{U_iE%~'^|>mz ݤȚ5yk٘OqNO' !a=IŕKpLfGzݑ{: OX {??v.ĽtMM {,JdkX֙e6M amL,..Faaal*KR\Vw|Nf>KKK}3mcaƫaqG&)p帩n rtD\y;|ڶəeSQ {OmEt>rbGR0hק'8ix")++4gv/"!meegQ&044sXTT;>Ug\qr=FW̙qhO=O$@${ mq/⣁c!w7mŵk8?Lv[gƄt*+0?^%<}ܱ[bڬn;賸dh5nk@AGIH L{O4x8̢U|+'0"* ޼e0cZJk;#tuu̢6l_+W/U_cd᝞q ۭyb ccyOK6yuDܸub,)H3Ii! xzW+>Ѝݸ6||}@<{,²Clr ??P}O$@$@$@$@$BښQێrpA3QG'_"z&Fӳac.< ]F^Dxxg}$@$<&hȑʿȋ_|Q[k7 lݺu)j\ _X壣/LΝ p HA%n=-tn~o3~s]#{n\;_b"6hO| 5b}#6(.ޠs{N%h1 4     `Nrq:<6҆>!)b= n@0L%0->N7\Ԙ"w)sOP@IST5TMĂ*$ sAJO~{/jD֭}݇ļZ>-Z !2C _EuCCC,h7&<ٺ%jJu\]ԯGAN_TD9\cK CQjԇ]K/XT]|^~$!%D \4     #`A ˦BL}'BpX94?t_H dX"~ύ(/3N&+de ciq=~y|;L.]pj~GǗArkc'LyxHґ@ ###ַo3õkkEccadɓ'Ԥ-gΜ㡇¬Yz]]Nضmrs;*+i\! 4' 074#aċ`{^κiꚂ2\W׮<|'IGDM1؈r/[ wD9&ﳼqHHHHH F,h89څ=ʂ`aX_ mEh!L'+M8* X!X?vi)S7&x1?Z_C$@$p@ ybxmo I| h7ߌ!7#;G"jGl n@h*/ם'$DȠG!HHHHH`zL"Zf^<~D3pŜuѪ$@-y9"ۖ^z_E<׶/ԋ-G밮bqQ<"a'(h"PE$@)B &ݻw_A`46lΆҗ+w?>].۷!K/{z!tvvj]k߷"Eqq!n I@1HH C ݇x.~*G~v ) _e>8!%RCQŨ0u?̎ OI6ucX,ɟԻðr1Svv6D@!u6L] $-QM?oYVBL\I{=Ģa\Ƣh)„{}Ϟ~/>4v'O߈C,Lt$l5F$@$9.h1|ؼyp7{6yWBA_-:I҅x`X,7,]~ 9x O|m6 zn_f'K#-864iK p P-7; f*µb6'L A,)=$    H1 N2]^6+wQ" cϪi ]h[{&un;OT4esațAE#'S lA 71GzciSs^")ioUK ,ڂ%?(d9f9Eb: Y!ohsjg/'f !ĠǏ D\!    H*\v܃9 A$ƺ-Lͦ={m$?Óٗ3#wο "h?=柇SȤpWc>V`^xOz[=}Gew܌_@\޳鍄 $ ҥ(*b"\^QEE)!$@H!mٝ'>o9;3|1Rų  11H@ yƇ! rAJywZ㟻ߓdK%g8\NiP3 e)Րh:aS+KjI1  X<4&V?NjS/*Ĺ\0byr <ǮudtA}yqأ0A$#!&bg ~_98|B4qІ;q& d GIH1,m7W?,ٷ7+o KF̊Izq=YL ICJf20oRUDR: %%%(** F @ c BuCU5 kzx|MM>oBb$Q徕ƃvI Aq@<2߅_ox|2Nn8,V֨i'jTО|+wIH / =mqP$@$@N@1HH ˥nT>a↓xm2.!dGNՄ KSbˌ)ۛ[SjG\%VP7ĺR|vxxb!"HHHHH w؜muwc amp@/N]fH`0N%x2DBH3+?הl! 7?@9V8i)3A0  tr0$@$ĵxc!ǛtUYᳲq޾m4fFuQv?8})LB4vlTYsfz=fg}     $ԄM]p'{o8K$|2aYO#dp>Z:n"&,Ƹ:ܽϵ |ڽ?/0~l; HC$@yKOr`$@${D "3vNCxy[# ݀5U4     Eךk=} {dž c :ꦕק'07F<q/\xzCy&0b"~ N;]     &j#_uQGQoTdzuoljI$k>j<8b h^1l򩁼gLoڢ ܥ<|nqcb楠!&& @^_---]AHH %A Oj^Rjtmo׼1h'B0&d̴Oҋ௯mŎa/|{)Kbr}oڀ}Ψ{aU{1מ~(*-̙ Ϝ_yz U `@qq1BN$@$@$@$@$@  nN[M=Ov,bj];KDHLSАàzAKIgTe3{V=o-UlSπQ@frF1 ?C.h?d @~&b!xf^ĈxhyPj:L L_z!ŤB#Cee%JKS{ V7 L n{)5XY/bk s| HHO{ @xRdOSWO7^mۄWZ7Hi-o7Կ~g7kXI>P;s~ږR>fIeWYR4|CSx&^#hF$@$@$@$@$@K?X7ocܪ:\}ș*4̸yx/!5ΐh:|q2Msp[k%Rno@{vD̘B$@@ |=@$@$2 +Tn%?-8ЮUXݱ5mO(yci̘+{ALO?< 5b'? *7^Jj]yyUiA2fXA1HHHHH%⛯އqqÌ0ttܼ@K*<'݂^^s54\ Vn@ z.J fճ WJ# _sˑ @ H ÁNM L-H{{muwQ\zl&}J0PЃB/wc^\6X̮ G{B+>oS!!J̞PTȈ{ho$.ftXv/T+AEhb3d@4{VŠhvCFzI+s &m7n|hwG^z|q= U&!# hԸ+5r2n{9~q9Zݝ1o? 5BRIH 85HH# n7\.+1Zz4wC=Hi«i[ r톰(֫I9kaA؆]V&wT[Zסc+eڡ k,M1B Yxxȇ>iCrsEO "d#/}     H+>-'xa4|yg`%wϔjXxCtEEjx *-s-IJ%zsbee @?> 5 -EU',^Z+>܏NU<]fP7&`k=`VRj%W6㇭881q[ش7?ם9vu +a] v1YAAAzb60UhԔ""QDȠ%b` j""4+S3H=;;[e2:%szR+_NYRC\p$t\)D5AؚRtc'&sHHHHH yvaF< 3$% DUҟob(2 /[;qc%n^f   4yb/IH e"Zlhiij<3\ &D@b){|G~U@ܐ.@CQ9>I2W$M?4ؙo:.;5ǔGoH:JI E ;88;M$krVJa~Ըﵷkue  'C HIG@ UI7: H۱y_:^5TSǔfiUh TL&KfT/?RA}yQ5 ң=d+y3) jBHՎV˗LR㭝1Eqp1MU|q1v7^vD<2-E'L GHHHHHEOV=_n[;]+H0ʂæ V\dW^<7LU5zIHHHHH 6OWΨRzc4Ʃ`@Aˍ}fP=qRАP=dɨ7WCد<6\=甬?;A$@$<$@$@D@ !Ch%0u%mv7Om>W>uSujU9B8vTiFV{cPʕ`U@WXpP}a!TD K"u SP!YiбXl6X=WCUiXF$@$@$@$@$@${U{?[mwے1;g.2QRp?hEआPcݛ'/`?8|#jv! G`x%N$@$0Dp8сVްڱbӊJs)fC8LpUP E*K&d(3p/S^ Â>jDږm&?^`JH $]’)+;w8㸙8~֨2j:^1/4b"dO EEEg     /Xy0f)v!w?P&33;Zv0cm?>};fgC/މ_p%h3/IH  1)}ܐɏa5n^ށM8ύ'vUa%ܰwW׿r]A!ʌf{w; &V`ZÁX5;79xڲ7O} -p\uJT 2& @vˆWqvFnV^>3eQD^r0Tdd5ZDQf!I,'Z=<6 ~xSR;|;|ܰOQ?ÇlHH i4\{غuk2}H{W^y%u>>Vk#sG [[uq;i! F\F^/%!-`s7l}n*$B"  7ņInXГ}ez) *<P:(qIq۳[Ԫk6VFWqz4f}KyE]Oň/4 2fiugNŋ7VYp1X< N{w,)3ZhB\.rei,?\YF\rMO@~FN$y;L/^< oTTTŌ$@#@@=SO-k⎶D+8^h$+\4r,,~T+g/Jܲ:O?Y(V\3Ԥbf  H!49!L2IMVyD8]S% ~u \vN}xks[x~ؔΉk_)LNJ<)aB3Q7XoVM]ϯ&|sdܳb'l Ff)K&(,\C&azx #QEX<KgBMN[gT}6lovC9T N/FaAAԲJt_ fbB>3,Y(\:͵1dkn\fϔ|nˋ~Keo<5 7 ˔ .ߋqA[* קV6Di糳`x0k D0m $!'hAvNrڟabF%jC_⦘2HH m.hH[X  8YM1t|+Rй 3PhPMT,(^PnKTWw(^koVq:>r1:;b{@:.iP g!G7Cəu N㛯݇ mV2r&fh&512o5!C\\ۙ, ??erm PF̍WFymo 47б,d7Ѝ5 d=- IϮw{jlg!+ 8G@<Ƿ9F_|vܶj̯3/IH@~Ϻ =?@$0! F#B]^͐O 'qʢ#2ǃ?N R.9ar2Er.ohb4 9&    8hd֯Cc3(6!N L$0je;åw}9gD_nne 0#CCq%n_`ٴ6 _}qb12HH`h $3{hIH + M:;; %"n)fӅmέϡSyeHE`PB:s9&i `1,#PQlwϙrK~!vU4Jr+Ct     #pw+fMZD B&zI#{ Bܮ #K^ }ag}ޠ[W;CϙP6!,vH<2dc| /z mwJkec5V5:nP n7wI w.=ȝ `+>i!ۯog`T&g'nXp&Υ 4 fttt@Wa-%/UIz͆M67&!)h; @xb˛D UN~V}ľ쌯-/.; ~ڊwaNt:(,(@eWCsa6y'    H+ۍ[ry=n?%ya! 7s3T 9DVP5dxᣦϧ_W Jk0[9GW @ 맮LxGgϞ̍- " "0k0!Ae{[p׿63Co*闷Lv0iDҠ7`F2+Sa":|Jsd!H02HH 2HHHHHH  laŽl &KB1{ }qf.o@[T%n8ak <4'9uJ(<M԰qeQ{M[q7'\cѠy@$@$^&hطo= 1.1Zvذۊck ¦TVC9 &۷Uj%d@v6/,(D2T(!NmG3]an8k&̦a֭7gIHHHHF`שqw>PV#-V¸݆/t KeZ  >v"j7tӐMwHF6-8X6vb,,ĥ~2@ 1N݊vOw!4U L.%j\bRI-`bQϞFm***PSSBWIHHHHrHHppq$f6nzgk}NNn28z-} r"0 w,MZ8`ibP§F\:w  !$0pg Ub ܹ3n41zh |i nҤI2 it:{˄6j}٨ ; $ a$ Cgg'$i! Qw8ȨGMI_{{ay:ѭK(68vLydq8brDe Oؖ?ɻ(GwWBKLa$@$@$@$@$@#=Uƥ3?(2vAga&#}2ّM}$ _)2%AyS<6״h]V\m՘_7i@: ^|ňL01|hi"N8 k_<2{ʕ+hn%aժUK{pH`d/>"uA -3v8pUQouL'ihMZQWNr[<:+)Gc^Մ|yh:n[;:]+Dـ1,R$ yp9     n][o(i!&N8?|;2+g4.o@[$zV/Jt.oY/ ^t³0RWvuC~?]% $@$@G l{{-)c`'5kDƎN·| .kJb`|A  2TUUi/N$@$@$@$@yF <83)W>J"<8E@<[T8N_KcQr{?pGA$@YF -r2kQLҧnjjBrBK.vÃ>J; @ "XZhiiHH 9NϮk'Iu l@Ӌn wŕ>ym.GRuI‚BT1u2PqHN@ ՚!Y3Q     ${q[Qx ."j@+ #\^ 6KpCC:lAdܯDp"y+ɚG2 Q"FA+-{ 4w:y M W…r呡hQ~TLW툐F$@$@$@$@$@F㛯݇ mm0Vƭ(,pp38A:^hQbW qhA@zФz<\On{n_ِzȋ0HF{h(,lRVF2&mݺwFmm-&NEsH`x v K1$Z^}"%Z\]eo{py# zBΠ<1k%*M r{=utF"cٕp]/hM''yEuX%HgD㊫Qf0@f(1C%=4H -A!CHHHHH w`wwk!}pqKZk;n@LH4NODd%.1ΓS'ΏOn^%  BFl $D,3ͽ4 0H"fXV8N|9,g#:_,8Mİѡ> 8?OPb}&b[\g; #@2ԠF @xq y;,:GyKcPrH@"hu?BU8^Kg:4軈D  $@$@ |6ɖP{/9}̘1vs"7 dD Fe@IDAT ѡ (`yֺc>ץhtZ!a&o`:Ňv Ä啡f";~(̝XHּ#BB>D$@$@$@$@$߱7N%ez%`1YKbeK9M&>%[-l<Ĉ1D A)((:3q9u׼tڿ9n^f  N ?SO=w&M=.׭[׻!w{w$@CC@BEAD"`O RBBKP<4̳@APŐzaoE `||ȇ>J₉G] MpaSBO6Xr!oO-F$@$@$@$@$0?y7='X-']3&6HM&"k #i?B8Y$1P.y"~qy{Wſ;ڙHH D`Xrs1x׵>jkկ0zPYfiJw܁ٳg8"߃>M;6w {`"^Hi#ŤGI6 ;A )ѣ%czC}Q9g+ %Xf']!\4=Q-H+BRCNFvHHHHH |~o|#nR%f2A'c܎2 zTYR#Mq foIcIpI QUT|ރDe2AHH Oߏk|Ļ%\#<_0sLxuu5N8^î]pM7.Ӽ<Ȋ˗/\XX zqp*ȶ1ĭF ܨBj BW9KfA% xFi+.M`20ҌdNj:d2l6kaHHHHHF_[lFC< S^\1k}ݳhuvۇ-荙$@$@a4Ȫү{Dի`^A|A}%9n:,KV "_H Q;aεXۭ W38mTKjpM䇄 :]a81     5v[x6m5%WRj밹 OYCB&aJFJO!6j ?\ek#Vi‡ytIH AIy&n3&b_5,YZhbYzWG ; !^ B>~oh Պw۶k֬5f(LuNxZ, 6^bT2.[-L\d&fC,E /VM[zk;f/7ʖ4 (4I$D> d!_L~f.ŸO|^|Զ;&җw{U(1/10H!0lϹ瞋ӧk͛7k]/h?Ig}V%%%hFőwAգJ(LXZu)_x}TᒾZKY̼L$ L`X ~֬Y{m6Z Gp>'NĊ+em5d  S!@ @ &T`WTxq^]-xm8fF=>dTs}≝H[н^k3ǻNmYL*Ԑ3,T(=uܵԷ?_^#1+^$(L*{Qb!Fohλ!c8o7L4?x'~!jժtT:r("\#.W?l#>r[[{=,;l,.C8B+ۉ}s',BNO_9 cII oGIHHHHbR!}W|n2n[rJW- V[=k4lN/Ԣ|.G䢠|ˣ&'Kezܿ\W>㿀"!f^& @>6Aömp뭷b̗c0n2<#A fnh;VPRBU.>gĊ*Pz|53q PDI> ż$@$@$@$@$@#@êLik;࿎a/m < Syz]rϫ4h#=pӮÍZb{*zc'WĐ>q& _[na?{@$"PHDޕvu7ފwZa V!$FzwU8obR q |jݏ+.~ ~VA&pʳ"H|+{&y} =,OyPL<uWpyqmz4;e Gݻ4L=! :N_#aԂcfc7u;ۭ[aH<}錨T b egpLa}%%;F$@$@$@$@$@$M[玞!/sN;2|ޱevo{p8y"a'I wŤ5/݅ߜp%7L$@$O2.hp:hooeX]] ǸA$@@@ mm;hFZ R[v`9nc,@J E#C EdGLP/]ii)(dc-     Co`ɽMz+q̘dž{}~1Cˋ21hBcH4?ǟrRZ5!׿z/~rX6i@$@D ゆ]vE;c)f  vN:$,[,~! 8& H޺ߦB/OZNsб<^D[f0k%dK4kha.c"dF$@$@$@$@$@$ݿm\;J-S9' {ad費sZ ^&Qudxhf;sv9O;8x_n~!:YKyH @ .+~x>wbx衇 .,"SIR%`M:qGlx-cᵚ>+/  ʍlp z]rt H!Cqq&d(o8IHHHHH _[;v6ƭ,#7_@ĸ22 $N{U8N'>eӓ; ʍfkqCZײWpָyHr~8:|_駟g=]6EOY$!&p ,_3j+=]/X=H](ԋ! uX2j&.t,Q3&WP RB YxX@$@$@$@$@$@QSڟa~ug`ݜry"ߊ(1"g}glk}s吠AؚFvU̶1qojąweR3/IH dC^Nwq~ᬽh7 \y1wɦH8q(\q j"63@]LBMXw-1A Q F $d 3      \M'f(P77->W3LƊ@0 2\@F6? >jQۏ_sJܓ격Ow&{ Hrxh:s ~<n<3Xt)WUUUJ.'M3' ZG?w}zɓ'O9眃ǹC$$ g/]^':}΄nJX7Gzn-*Y|ek=}=qt}E$@$@$@$@$@$6{=_,3űa9eEZ͙`'H @`LMv" ǃ'Th^W:t[q'!u+}1N0ýds$@$~&hxشiAۇ|P6VZuP击p3zqأcI$`a\'VBO 3CNG{3O,9҆Ys޾FQQ&dU @jdm'ڸ2ne*\yuٿM=FPq ۟ӎB _ ܁i0]b)J# %0l3:馛e˖7X-iڡn Xc-jTbv ڒċI09| ΟGM 0ZX !w:s @ x~`6>wt &͛ ں\ rx=AN 9ua qg]HC\ګ?~,ᔯ⛯݇N#f{͎N|g(,BH$E`q7bΝY f8;&+:(z꩐4 ! TmێGw]3[wꕨ @c R* Q;O: ;0@r#cn     <lj_[cJ(>x'UKA,MEޥH#!QEVMd9[ǜ ={?M8;.I_qͱM #0,˗*fUUUU#:((wٱ4 zi6;11pٸhґhTH 0L bF$@$@$@$@$@$pV\OլU =Q툆i Wؐ;d6?&D N̜hkd2>\&.{kj|{coـk_n[r*L12H@ `O=T\|Xt)***"FN8HvgM߲O: +FJL-̾暲XgI3Pn@e0#WxެNCqqA^lr-_2\eDƒ'[rqxD>C&{7LK?7\N$;twgz[s k;wmdْ-o;' Vٴa^m)tB{ (lze0 ea$@ dO;voٲ-UXòƑ{'{eI9#@bn\&P_~4ZZ=zL= 8vd~47gXGΓ0Jhc@+>ix?m_,C;f5WT>2ޡ(d4477D0<(((}7- { 4[ d%M~|.uYa7>3KzMMgR˱Hgwr#ْj!'E2\'w _[hooϋ`mj]slk52;'x6Am j`@!ZdFqP|]k?Ͽ˦˅ 񀆁)onj΁O|Բ;k}pgOљeqY2xA2Ȭ d](@ P(@ Q7/{BDJO'Dc干|J =KIIZ?'2/xYfRH;[xHKkIxfR5uIku-D)=ezB%(0rpIY>'v }(;5rpfg{فDY%WHaRDcv#; Y.Em?;, :޺- Xmi9quǹ9ȝ?#FxND|T[[3f X555{|ĉ;wnb<12!.K---Neddx+brq6 youy&'''轔_|ѰU}:K[P㤈_ &QǠD\xWw+|~lGU%Jn~~>?\ u;-- қ-< Y߿ٹRl}˾Ig% @dG4 H<";ؚ|xޝ PA 6ܺr16~>Oc=l@ &aUT@;n W:Ogjy_'.Fӆ>ƅ@_N; |G8hݻ7ohɹX hh؉1(`Co0TQ: TAW8`%yն^hS] P(@ Pq/hn/?{{UG |=r>CX+SчP# v2.Jf~,v7~N+~>}3\ ͖A|A:ʑD(@1pW׫^ƠPEF>n|&;'rïkq2x!;;yyy(@ P(@ P |˞@FM8=jcTXwفݒd,F竿9b̸~+;pGa[K`B =s>}:>w}_: HOOZCi=N^}pah9r $N!QVb-V7 jRV .c yLJ( _322QbW{uW8djV9|Yp(IRT?lB-e-;ɦ"?UF9e3-(55WePVeQ"޿p͸ӧQs._܆=GNL}@ ㏇z?8(lXִ _J"=?S@-LN@fb l(@ P(YMϟˏ½'\4uJd'nl7A H!/Su@fg.X(; ҫ$#ϟy~yl|zx06WW.(R4t8(x|ݼ7hIY%r.-\qp'##Zv|(@ P*aܽUt]~spˬsFv[J\6 P 2׭͌}7 36r3vXf??pׯAo,nql_]@2JD DJ[|ZRD c]PMkEDZ$O NF P(@ DV%N:.tV!YϖXce~w:Y|na,7GsUC͓AS\Wb9y[N%L#sHQ=dƆg|s..;n>\8X}@(.كgygy&?xh4ay5 ;z75bQ'x.<9A t;q (@ P!`_G'a6d*eNQ#W=_ K4> /o,w0^>q-W6w P{ lZ( %ώ> eyQY}hqݩ7(@ D%_ի=?7ވ F"V6^PP:]e< Q(@ P!e Ckuȣlh7P, 8ф_;[Nplv1;',@?n@,'eP5-e@(6@-ϼgɑ7Wnō˞'_](@a CR0{A P܊wC[|%52=?S@T]&_u:,"ף(@ P@6q@cd`[w7pՄN# P1ZXo]^vbt:[2S1pOE\F DW[ѩmؒl3iؓA}5ؘc"pb[k0U>GDPÄ~xp"oP#>~s P@xz-V7zBct8xN5IIpDxEYRB2%_q|(k(@ P1*`v(. IN{18%(b957(9 &EDo71F6+ t _]9>"qbQػ<2N!X2>{M#_? /2`)R^ #Gd쉜4رc&M^pM P fk*V 2lazf9+"; AI^IOOO`6}wR P(@ P ,Fݓ!ԃLctq6RS.Ծbɶ˻zVpˬsq޺$Kq) Ę@ɎS(ة׵ Q 2ه65Ba+M_6~=W<9‚A)@@_q)O?=˗/g@CoP 1.|ѰWZ!V'h.9fc 1Z-z'XfQ(@ P'jg ]N'aHΠPʆg,k_ dj-M}'\Su2argB*BP>d!`u1 b>^&\"[F7^M}ޅHaIhoT|P  r^z+m64_uv?1pF ĠiDz-xhڃtu*(ӉvG{Pcq%Ȑ#R(@ Pae!3yވP{ h4zaWLLO=Iye ۋO]\-l-22K\ c@d@C~6\Ÿ Ҍ\ܺ| -Jbv']T]\?w@TdGy< d0ƻヒ5kCii)P^^bC&kEĭRA/_nE gЉK' Jdff"555|(@ P@@VQs@33 5L ̆7'ԈTϡw*sJ)7Po -g7 L/k܇>|Tg P -R`y_F]cΝao3du~yAQNapvHyzL驂2 tdddd0[N`G P(@0 ȫ˫bQ9MQ+aGfFpܔ?7կreSp(3MI@uy|Q9\rG:А.5S%.ڝhA]V1[2SVne_Fe g݌߬x}nCfi !(@ U * V–-[:WbH`oTŪAzbV .c z. qE̞#O P(@ (CՍF/ףdZoƂlm?qotnu.lH=?8(`AHq 4rr2{~ VmJÊ_|4n#\9"yQ:h'2 9iAxiTj+2BUr#n7X?d6fZ\H `@C_ ަp]XٰWA51I*,(GCYznPcp h4O CJ {S(@ P ^R0iĸlD: 4Ya 5Zk0h߾ޡ(@0 0SHp7L;YW׮U66/Ef*3'ε(XQ hxK{K88;u[MANӱb6rS3+ M@R!33YGuhZM P(@ 8]nl3V8f+v?bFy>sL/[[jD]bG )cdf&-4$nSf gWLGiF.~~߿m؃>||=*E (@_Q hPY_\F A ޯ݈j7@5D¹3LȠ $=?@ P(@ + dPZɆt tz_rdN8<+{|Ql(@`d/Y79/+OPNԵ-Z5y8db0:@0 A4w3v:, g+!plR2)ɪJCtIIIC_kP(@ P0t M(յՈ+"\-jK?q)^y@pܱmB֠R-}ě(cf[q uYx_Dje͟=g+&/ٗ )@`@C{9mki7^ YŸr) To{S^q©̱)@ P(.ZSjb^ɬZ:Éx?& w~wd?¢'H:-ػ#([@4 O@+2?8jO|1"hT~yX;L-|[p-ڗ (@z@Ckk+x |3\ﭷqma>(0Ӂ[E=:FibrS3uv VdeYm(@ P(@YdvXiqъl]LY|q <}T1̠huM-9F P,;PiٷW?G k1Bp켁xd(@ J ?N:xf>DIF.;vȓ*+&J j <dvm޼yOc}Xx1>\OʚFw}7^~eϕG(@N!U-V7F'dʹ8`kFyN f(@ P(@hW4b+ЦF류cи}lK=e'] G~Fz­"(J(g;>'}ƺS16HVQW[۰W.}[pe@ DUe˖^Ry p8czuz+.rr-toooLJ~EZ(p˱Uxz-k z%ҠHKK^|d(@ P(mVƖdG{1v~ֽ#$//21T|i-sbbߢ9I3̓ќ7M PY4l 2`g ՙ cG˅@ DҥKI?8,ş~u{セ]x -tY67 fP'%)xp׌ gZFnn.cR(@ PG X2wˉV};`3*g3nb0w~KZ~y(*wPm']ϺeLE<}; ;P1# N֭e&.C1ap Ϫ}0f̘-xZlǵ* ,# Od@rr,1F P(@ P@ 3S8ϩ܆[W%&! 78WO=% XNy-Γ@ oLdYfr'P+ntɶϱP?x%ĺl@ DE :mېm)@ P qL.f។WξLWܺV--DbMZ\Hx@̦з۷gАov~_033scp Ēxz-ky?KF첡!H=?!Q(@ P@O,W,&|e3pQ 2A9a(@ [,24E^ WS[k > uQ9B`@x@ [?tرc {}; . 8E)/E&׫ P'%㤢IrFf ҃EZ@ ,eP N>)-b jW* ( * /-#1RhRRR< 6 P(@ P"niӐ(Y\n7ܴ/lr!(;ј{7+KE#\ve8묳PPP0I6Y={ח7d) .bQ`ow;Y +qH_)C@V{2h4eL(@ P(FYkU(h7_޾nx?-;5>J-+ t+-b P@eu8DZ$Rou]_,h>;g+Q ګ~#{طo_/b>QTEEE썍ۿt{p'(K[FZ|Vŕ0%,1bdPIFF(@ P(@DhWgi*y8vK@rHדD)g_=(@ P fQv V=YkLv~b1;wKl.a+شY}q!(Z[oŮ]q\8t爅())wމKx7ݐ%?F)sN}Kiު̭}|[<%FySʾ!(m4Oy Z }\۔{w^p{'|b݁m% @dG%|nWo܎=ҏ:cWmO_oؘ`贉ؘY2/^>_8X/X)6 P@4L"Ak)G`T,9fܽ5[{ZE(>o.!999xO>`'%}1+ĥ^ y-2͑"K ~C/SM&]Xٺ6mԶҒ8)o,\ hoojx]I>e"t`Kbo}|nlRI8os{j$%`7-<q @tGa \s{#F`@ٸFָh_~up_ܑ*w13;@%v Td a(@ DCd] s64-& ]vܷ |X!+[SPv@(cF P hM!p/S \O<uRU>F" P@ QhAe#~_y655ah⹴y dǭ;}~"OQj0'VoHQ~<%%HNNLy P(@ Ph'c1ao[=nbߚ='O\0uI(7HV &Ǣ(@ 01a 1kN5lhwnߵ'^\فbB)S@^}r^SFCq7lzt91=(ʮ@0g.01DVfSkgMl,o?(yܷts;|m`>g=s;|Gh-=P)}8 aq S;g -]Oqs d a(@ D[S)E{ܾ|m&:?䦥xa>z^.,A׋(-E4D L@(QQzok][MЃ*HeݖσFT{2$喖L^o^:y߀sݏ#wdV1e ZoI^^d X,H&k [x v{YYYTF{ {@>Cˁ(RvKL4Xdo^GČgdµ(@ P؝#?GJ|6sqt(;0R.(Aq(AqX/ES;: 287E^ۍ/wuPmj}|(7'MEsQgCt_AWi{n(@ PMYoZ HWp靆˵-!+N9igZ;l5)@ P!c(Tw?憚_>kܶgZy^\NH \$XVoͶΠMJӰbA"# m6 P(@ P@sEίwv)Q7N;,.N` ‹)@ P`H&ɀ!EsIF.?&<$k*swλg᷿t=%dC[(%EPo*4:;Z(15E1_M.㫗a7nZfmѷCjA9n wc(Ut 2\w_xJȧz {1!qzKưm j?Kt9@dc8d RCԜwYc\ֽfy F\B P(@ P PeNqe4YM@635CB P\*4jWSF+cbN)nb v;{bsS5%(eG[͐υ4YDk]%ef0~/"!3P6bZ`oXUFwP2J +)"S ddff&KDМ(@ P_M|y;"G'R甆jnn񥲿·S\+zQ&)Nhd0ҎK )~)7H &\2<\@ZF3M25gOƄe0CВ[%"g-Q(@ P% Jk(JiMOVk+0hl@)ZOF Pe':HG=wBۅ~o,߷׍=]ȦlAȔd"Cl !@q'򀆲2\B9 WM9"[tZl[(@  taeb `J\- 9h=N/UK %PsG)@ P(@ 8DZ]َ԰NyJ<(fh1"51a(Kvy1}(@ PJe' 4#eǕLī԰~jM{b\Ry2N+d}18)j ԍ[@gae{ʠY&O;3Y9ҽр7bUn܇ Ÿr-d ``H`s(@ P4hlzv3T|eNSkp8\0r-,79mn0ۺ<x,Qf?˚x >%.}yrl6 A&g@ڻ\JQEg D0E&%J\Ym@>TФ$Ckފ hرc'+Cuuu ;2+_ʠO6 Z7D fC^+r}@)))iԊ}S.gF P(@ P  ?yb/T=oށ 9p466:R,ڇ "+ 3wt l(@ ȓ&~&SQT9!4aᬲc01]4 ,{&g?᠆1%<XNeBv MdkAl;Sc$z2EMfe;PQzmxL1e.OF '8h0nJHY4dV#oQ(@ P2,dfCl/>Y 2,^/+rdVI&y2TVV.Ll6 K|j֣5:W>π>%m.|,d& O LS(@ PB, ]`%b[/\utXa2 ~2>\TҸULsoA|W09 qbDzFz\~o#-w[1QOy\M&'xv{_WV+ebcbsMmLjJJwtt0pIie/Œk>2);Mxv)N̙goj1PQG2rv<|~4SZ6ےǶ6y"\rȷơΘ]vG4WU_wu˘!϶޾\a] t7JtXX1O&eSd?Z,3(pR(@ Pi &~/O <YފjCϗeܮRU#={H_nj=GW _;q۔s0x 68O%NfR92V ȯi^a`AĞw?yx)tM$×2^߆`>G/uՍulϴP3 G^=p/۶b .-: 5sy~~FC(/aMLNN{`4(Glz}_ $dee|M8ѓaԨQaxrx5yolҮ,…sq\x$b[@y"X&#gO P(@ $hq 'ڱ6Y7 41 B6 SΌ Dp4x2BP0C϶yc|z^ME^}y'N3J ||kIo t -&t#H~6klw([4޽ۓa߾}Gp?12 ūVKgE"aZ~Nl ׍lf)@ P(@W> hV` TQQq[|q.3QbQ"N<ʓ*'4-TKW[n~j؄O~dF0f vn^7X .#|( Eˍ2QB4 2+Ò%KCMU#t>#3bBN.|\6s"HbK@~p|"fF553[Ҿqߵy;Ys&VkR!wl*~ZIM$Yo G'm(1aj{2NŌxrwr x;8h-oU~+ T94ϻ5[&RD$;jO#^ҍ%=SQ&'b {Žދ2'AOVy$r6yT)8tVFAZ233!_3X 7(@ P(@! hedBjfesњFԷkq&8#<64ݫ_ASk}ݹlŌs>28z\yY^4r=mr<Yp(2#y GSVy eQO X_Fƀ1nu{}|me @ww73u01/_҆5YƝ#EōQ M\PDPӕS5MoKeln; *d-~=HV;GuK_gWiGV珜sg@29 20D%RPnA؜YGՄep{(@ POl|Fv]]]^/`NW'P!) Ŏ@C33։,?f ~o۩57/cq^qPvdٮ#ƕPuܨVQ>Ma='2سgk_~ #: !S1C-V2UXA̐ G@Fgee )UcXm4v|35cL!.]0S*- P(@ P@@?jmo⩸KLO :w(@ P1"Wr4fR!ǩY W?tEx~Rl3݌ۍwkWa}.\7]o*Ɣd}GE;5-Za9+2KXx1d=mYƌ3pS`珜518 ~kԵ^KZsJt 6 P(@ Pip&7MA33즔*8 S<(@ P`F 4 2AmSg7̔t\S3;M_YZpwKpF,yX7QbBi~m޶ pUFȋbٔ/}y2޽WT W\q2(@d7aujmO ˑe`0kOZŠ(@ P(yEڋ> &?&"JLqfT̊,'B P#av$O'.@?fg8] h ;M~Zl0ƵcĬ thBF{L|oA U UbC  wߠ%&$Gee%qU箻  `jI1fٛyS(@ P@&'nM.$M]& 3&+Y(@ P" O.iTKq&kIH,'#G ^ V?Mve?1t,<:u`A 2KV6Dz?ci{2E(!3vŎ@| naO Ȭ Y]io}-A^*3o4FeiC P(@ P~d Z}3ܙ3p CCCC?]2(@ ĉl q7%&faK~_]{˛ {q1'bnՍF+aj/H2]F{+=4O@fe%rrrfw溠7\(@ P [Z֗xG3kxh+< GX' X*H P,;tmV`K_G'"r2Xn oS(@ PD~^q $<wM7AnKtx5 G.VU9Rd_ ԉR~,rF%s$Ҍ]f<]u뫨|/]h9#vd#b\`@C|GB&"j+-]0Wt]JdeeAfhW^ jx7B17 K P(@ P N+$L O}Bf99:_~<ɪ~/[Dhj$C{A PhAl^4 vF^~m,ި^Yn݉HJԶ'w? &7{fq)@ |]øf_C5tbLiAeV^@(]zш=}(@ P( d=%Lid1ݧck:TRByLF PH7e'sEZMx:J_?No|(W}S0;bdGy_`ް:D0C=33r(0 XxdVL{̡ |j;qjjO P(@ P wK C b53Ew=RdC^o_vP@33m(pf(ن,u²7%˒qf< /[Mm{:GoLnOC =_ФCp[ //{yp( mOfNC~~~ăL| TC,mQ9" pV?@ P(@ P@Ì,% )Hۧ^ǟP0CXvG"6+fގͣYS@fGr  x|ߘ'__L\\129Z)j; 3g[9\oGa-y;v@ss3`0y &3@"/;Vذa3D]]]Ǐ_xu-^An/YdD?H%;AKP,ĥ &ԣGCu(@ P(@ $f>Z)C+S8=gHu{: Ҳ$K0aXQYY7tڢmn(mɁl͊q71@4m'/ z˂~pJL: cJVvP!338?{w/GU&~ᆵKBBa',FA¨GDAQ+8#8~|yuX@a% -!!Mrs}SMw.ݷOuN>﩮[9c㖛Gޒ_22M={ȏc+s1DdMJseΰx`qvy0g ^_l\ɲph?QzbS%dVY^Kdr@@@ yZV3ow4Ea7w\Jh>7P#n- ,YB@ $Blѱ1dKqܳr;']-[ߖ?l X*eˎrNYUv\3Y=ou_'eY^ǘL}ӈ]Jw} %%%rKUUI{{ƍ(t]P̞͓UBϼbAYX VRR>)ox.  W}egp+9e }'jay"y \kV'wCQ]*uߢë-k3W_,YNVQԗf d/jP݌YQdsڵk/,-- ʚ5kn)6md;7,I༓+W=Cp9?A_R   F[t0ZP>c0#%&ZiWߐ X7)0QX݄Qy%3 8%3(%܊sWFZ>zL^nNZ97buCqVf_?ּ(׽.KdUVWwA?$5]26Ɖ.-3j2{~_* 7v@IDAT5nw3dMMM}v8+g5wg͛t6ma`4ծH   xyke7[N0CEV|ī'\X0WSoЦ[D@b!Nkqn.[q3'_-7.^/݂MvCP+gl{Rk@0Hhpuz ݻwo6lxm?>|l #0GN)U;}YV:øj|  +/<&-!g4˓!W=_e!ɄEᑱH1.4U /-=ӍlEzHON^.uhwp p_SDlWSvg~症h!5M|]MJ[k~M@C(jL3uKi~<0Ƞ)˒~z,_>b@@@y&TK&8k)9JaFTG{'?U044Dcr@h.c ^k֗i빺vC] 9\<4*8yGw-┭[K@!5geeIEEtvvJii锭3x8g:? h|blY\V^?~LcUI[>G8kd;9@@@hG(/4i5=N fg歓yNgsY73P @jb>  /9g%Zu+#5gyV\9sRysrwt7.9CZr\wR@f͇Sj }C:JJb@R7ox 3gN5 #9'-5`l,,3!   @@Ȁ)Ct7fm'F4|_vۿv I5޽;`ҹs3t4ȦH23?8yRenE@@@ >CL6y+?:V&=quէKz9{y<Vm:?6L ;@ h S4DjbZ=s+O'AOm 9ȹgx@sǟw(_:#rŢ5qo=zIs[[|:$% x_`ddDx9s3@iiiR\\,քG@@pV@[a԰Cb=S"W.O>Ks4M kPCiO:NϑYu&ZgpĖ"_o`Xe oa@$ɐO9Wγ>Y^j~'ŵ ȿm}D۹In8"tIM y&ZcЖbb*=矗_)*++ežq'։EG̎ W8yVLO"C^^כU_4J[MF}v񀿵C.k:r(Q wWGrF@%Q 8N:RAozs@I[>DW:sWWW[OGT9`'Fɋo&mCaⴒŲayR]A']v,YⶮZg=+FpP]K o10gRifܰrQJCFy0?{e95k*C}[=2\I4! .7x.r/Fl0-f)GNNdee[ylmt|;ݶݰ}78ߦKb[c/5vuMl۱fm Y ['?7i; gUsϗEž73X;?2ezṙR]@ NV@CUIn7~:'IW)7y}9,9kɒήGFFǬRFW`j Eei  +5`.E@C|'pgRoe's[w$.yɷ6,))7,HΝb;0,V =ÆV%L .v!sO@0Ò%K믏 i@Y51eddD{{{@=HfY`j]jޯ6-ޤ%%fͫ;::ϗu݆R4RU^OeeeǤឞ0X)**2) cvqq1-9TޤK/!9#)CCC]z>` jz[:VYYg 4-Z)oQEޖ?YZ"7-K.uZ!4j5߬Τ4wq|Y+ C#sXwX7{?;;VMJέX&OyE*c07B6?G/metcNWn6m$UUV~8ƍG #]n ӱJz+ \2MHЖ4$ 7!6ænomogjV/{57n}3ޥ=Ft32\?n}[kԦw X{%xOTQyMڗe3bfy2UfV}؅ARn.tqˏ%&BFK? $@J2 BP&eo+#O'o jyA.w*;޵-9"/0Bt޽o2dgg0f5ݧ ,VX!x)¯>q)@@0B`ptX67 >auairɬ5'e98Pצn56q+9hfLscr['5!)d7<"  &>W]RMzF >-#V*(HGFz ;6we# R)jᨼ(1MU-z3sh+PY .(eK;rj{S5KL9S 0P׾NBްa}پϒq@~t>y`.yqW{r)UrŦ-h74Uʌ  nh얧~j7YMWT92+A/:&Kj蓒,Q7t!ղ@B@l"am|"2(4 #A}[~{9yd]k uJ?o5Z3+N{{g?Gv]w,]Y2hTޭ}E^Zf,ZMeGY.򓥺$y5!''y?vw   )GZG^'i՛ d8+L)M@o9VOB.zMzk3=N-" zޢҢ̄/t j|LgV扡@ev|yzY?k<^E: x1c+ !,`t@'?I9??7l6io= A ,f͊t_[f%VW=sKE2% m'#&{)+  K΃EW}ʸv-qp"C22y[iHOj׷~x. g $@պ Vv%VoEr@UN/O[eņл{5YYv\YlEwڟ4) @#-4Hv&FHKwt`Y|TV*^5oE>W9b\h-TUhDDCz5Y;'|2`/'IMMK/t)";:"^ znI    KfˉųegI3[Q [=ǺoI>{@ʋr$#VB e@֡P1  a 4Jn6XXvLŒMhIϗD+A@@^`MRU$^;p\bҰhf9sWZ{ݕar VG\dGFF0*[hU Cv ;]kIljVXRi5\)țV,7vۿWw-L ӀhJ /n ]ÜyrQYh+3tl)((n   S IcGTN=1S蓢GB@4w Hnn&[+y&ڒҳYgV|Zv_VuM:rӲS\?=- D@K+.Y}ͺe{r94pײi2h@ @@@h엒,LP崻֮P'g:@tIanFf"ںD"!0'%UV`jzٺmJ[[#ٯyvOW w֞YkJeqOUdWJ1#34   G#-tN]Ԇ0I8fZ@XkPƬsDMVF]+eZNK2W~M> o3.f>wGdN_$˦H7.ե򳯞/?C^xv<̝/_ص v0Cj*GV4_"   0K3 ڥ%ir&'[@pD`xtj%iP EL5vXl8Qb|kv~V-=lm}~V -E`u@qDGXYv],Ͻ~Pvof~ YX/ENgűH~~hw$@@@\W r2œiX }}  A%=k*s1&ckkKZ~ tȦA7kxz]ýtVUU"'gϕeys(-/]Q6\QMdr"%E_,߄w `((( *<   $crwvK8lu5OO@@ ~z$nEB3h<@T,H{|rz{ nxf8mg_93de974KϞ2qF4tuuÇ~uvv}-~7,X03' x<)**j   h"ۉlֵ`@@uLnx>ږ.!0@ZGVoV^h|ncgC`o?ֿ(K䴒ŒL1 ---rw7>va_@޽{,_\kJjjj,8 ddd lqV   V+SzW3]M8@@)˔4N&FǎNIRj9X6%ovX7V6䨼ձ~YN.oNZi>S{ZS3v _uy'r O^Li@NN̈́a";   $ȨnMt5a@C4GW *)waGZz(9D`L9krj ˗|Hww466fVo Λ?&E0)   QWӴvѵ;2=?~]>l7[}v+N!]Yg hhooL3p]w-]2mTh2* ,@@@ jv3A0Cl@{)=w)˴H8ēPKg4u[-?*R|@y)Fɾ#ళF  :G\Jyf}gSHE~3ٸqc@\} ऀ fHOOwr5,@@@$ j[QӎNKѦ 'dY& ZQ,)-ȒojpdkW{ wT;t'%Ug>5\F@I|uu]'?} ٺu\s5rE٭,hÞ={w ~]M];; ddd @@@Wp/uģI[d'4I  G%;3Mrnҭh%=.&3@ q hR~ӟ{O?+too<#7pז~@I\6qe#   `.ʱp60{Ocn ! ^[FZYQhX6Z1 z'0J n ]LTTTo[f`mᦛnID*Q题@@@\('Ӌ!6mVwBV 1Zr p@\OKK믿^~gWiir-rwٳÞGA33ƴ   $6^m LN,JOS !ج@@b.[oUm&<Ç;7u;NN8ꪫ$'''`FpB 33n!Ր'/(#D@@@F$(/(Ι/ЗVk t1>s   KhZ~/o4A>}ʲ7'@^^苄    hPAgπTKANF׎I]k}];B@@@rsseɒ%`HII[ewJ   @uMCfKZC^3 V} $@@@ hH f hK EEEbf+@@@Ѐ&R))ultJkWD,fF@@&@@j:.i̐X   $6wˑnLɷ2=!vpxnXѐfc"@@@ hH*@h7',y@@@@[@:c֐&iITKMV+ cc]W @B@@! l {X#a*ź cŃhMSoo ǥIS4 /[O q͉c}cBz u$g6vITG8 ޏqmCP 8.YREaY,@@H4x㍲w޸=q]\/YX 9U>=rcppP/pO7^6u^̚+8XGoof8r93۶/qz7 MO xs*ydp0`ْq8=o &Xrzv̅    D=A/[nȰP7yD@@@@@@dz@C2QVw Hvv A@@@@@@@ !A+b]48.[[f'Kڜjaah No\'^1yMgk噜eW筻;%,Qm:'`m,tIF;^t;ݶ@C}=?VU@?dzz:8wz|H p^S#   @lpӗzl0kӋћQq4ŢAN'@ΨM~ SQgbT޿kL`zhc qM_ ho`YZwuu1\ΗI\ev{{o(@@@@F wusss$t-**ĪVJ       *uX.'lyH@@@@@@@ hHNj*@B@@@@@@pq 7k&G6HiiTWW%##=4.yqqCB@@@@@@p Gg}V~iyehhhRlYf|#>{i29EmA[h !  $@OO[р% >גx:I5/Kr]t_U:t_!ȱ 9TZ`3_@qHT*8?on9NFGe =???]a׮]sΐt"=oܸ~\Ro̙3C [ //OEB@@HNN o/JHGנuj cs&7M@/wuu-^" h 0 .MhB-D ԛ$w hƺR-;0 z65ar-HpDv8uVk?]6Y6U,EB@@HD e&b(   4Ri'm۶??̠UUU2c _9ps=KoY~A@@@H&R𦬬,IKox֣.Qotb0Va!'hȤGg!Y&zk/kz.ICccnwrC=zԿ9HFKfWq'_52{lg ̛7nknI[[[|3w    ŢA 㥆|negZ %%%ܴ1΂7ObYYYd.u˥@#]z]?AoVZZZQg(.sJKKE$pݯzǫ.ikkeXGG|} ?q sʭ`       W  $`mmOnEXp|k_,w3       y@C]]]իƧ3rg0#        4TΞ=;b3f)8h9        4dDF-&;;7       O  bK[oZccS]]f@@@@@@@'fbŊ>~X=͛}i +W3       y@Oj˖-_7;0 .'Udz@@@@@@@K@Ú5k+I<rwHggPo.dxx؞|/~1Y@@@@@@@ HW޾q?R^^>W|       qK@Ûoкxccc 3@@@@@@@H\-%C@@@@@@@ ĥ#"!        %o//|       t9        `\!@@@@@@@ m@@@@@@@ *!C        fAwwPD:餓"@@@@@@@@ q hzJy hFz       q[@þ}nݻwǩ@@@@@@@LK@v)q-ȡCLu!_ K{{$S ZySWW xGy]djj*ۨÁހmY[: 9#?p픔x<|fѣG}d#oyԝNu_w^ c2]z^z^sWi7wȈ@ipoQs8WQw\بD[D}:=r8v:C߇կ~%w}1̔rΎ@{wl>@ssڵk `N@@@#N9)**22od_&(!0E@@@'31?O4SO盕1r   %p'jˏ$@@@Hp:K>cLG=!!  $@嚗QQ@@@8q! ]~da Þ@@@@B@@@yz999        q h(((=6P@IDATݻ7        1h~3.b-[|        *]UW]%:(o[UU% .A@@@@@@@y@Css5?>c@@@@@@@[ 5ojj X@0C #       $@,X0        3fgff3       Eo9r$IЖ-[$''G̙>00˛>NBD Hx饗|Y[h,Y7>ހ3k,W``WY [ɒbpMIQ L7_XcIy 0 ӎQ̒P&86fK@'_c-L,ޤ/zJ2'Ȼi;wnMWAmgxxؗO?7<ի}_l`D& yDHsAinn rXj.L7_0Ot1)/SÔM&9i!ND̸t9OHTk=++K***D.--uEjjh:&{0E@re'--M. D"!`5U މ%>F`<[8vk9ﺺ:mÛuL['fS ɶ-P t1)/ք9e&)#]Gx㍾ЦifΜ9,|@\4gʕя~TVTMmkY(I֠{Pfc*9 47NջpZ, WGVf͒W_}Uz)qڻ;wzO 6>`5i7_Hڊ t1)/ó(1_+ERm:4Κ5!0?pR/^<<|@f<띮\)&`8 <5Jj#w}wul۶M#geҥSN?WL%+Ծٔ±%#`1ǤDG 'bSw\S~cnUίO?;"ր@xcZgE&!D.|rB׀ yWW'Qcc {jҿN?-{wmoތ8 GB@epTk ^7H f p^mV}8#G؅ ʵ^+|QN:$$8;ͪUnn653<#_|w9T fS IZ;&sLK Y 8} Q0s)n =}MZ[[cWZքA;v{' aɒ%rGAE$+ 1]LlNQm?eff2 GΫU_z饲n::B{{h0TAEEEO~Rx_n׿Fy&վٔ„|@&sLK̎8rs Y L pl};# /kJhM6ܿ^HӧBM7nGy$ f$x2PܶC!kpΎuX 8WbG1~Z5ks=gwuHww燺8`ĥ'+v&&;"0cR^"1e^1㟓5ɲ `occ추4腄cJ7r„6 yӼy.CWWH/~Q>OHqq #0m{ozc+ @pVX!$--.?I0NlIF].АO %%E@p^fGVsQ=vϚ5РӮ'4|:)< 8qer^1Bߢ/ĢXGr t1)/ɹ5Pjr gVDb!Xӧ~:s̑o}[rꩧnL48W*D7͛^xAj$#`^{ &Sׯ_8B@ ///Sh@7鉪| :v։O;JFܸo~L:昔Y.p1tjyI 2Rc4::*ooO~Y|y-[xw}B4ag{_1)ں̠7î*;xc@DVJKK}~Iӗ3+"DQ(b&٢u<+l㡸S u”HL4L:昔ir2Qp1_72h86ƮcB>+'?I /O;4K~饗4sL[믷˧>~wzޢl{,EBձ7wb8}X"''',655L;u b 6^ E-)f W:tI % #`1_lNd&86Nœ- M6k^WZ5n,XAtg~V~_4>曽_Hn20CQQ|_pt̏tmOg̃@4wޱ'G;nl߿?`y3 j =տ4P\f!g; WLτ L_xM/0@4L:昔h,1_&`occl+whz?UUUo0۷]^{W_ q"000`3477֯O}$' ;e˖l׮]ܹ3+8AqbW@@}i:pwmi7s: B"$&Ihͦ)\\L:昔V +Ojx9%G-~cY :c 8  p^֐"K,eU {Lu&oZnwpWLD}iZaIb`U$1_lhsB~'~ -63Qoa߿ড'Z>#;d֭gddȗ%} @:,Jﷻ}7044$-M]tww@p^d" To+i4s1_}O+{ bB-5WcN7ywLp㟩[ӿPrlJ8ܢ_rpIuuk@om7Y:Avvop)@ ГO>JdD[4.UH 8䥗^o?۷oؼk%33ӷmᮻ Im OM W;ƥ/_\VX!z422"wq\y啢QyX֯_/yG'?wT40W0 7{tz uJ!1'ߛWɼx;& 㟉[yӿP2slJ8mH:::Rm۶m3gJcj_]xr»l Cw}7 ]תp!!\4G&HKK}s_B)5xoy扞{#hg[[\-2k,˓#GÇE7O駟QDÜWD.0ql~J] `1Ǥb v @EIӪ°fyڷɩ䣏>*xIo,x6kyGu~UUU3@,& @\=馛Zҧ8{͛7 ںW 63@ 18Nzv)E%=.96m{/ '>hg",`ͦ >r5)/.V"ӎ\UGL plt} y kt]nF׀ ҥKE =rI'$OST}8;@`2ַ%=[sT^h [ΫcA <#ˠ-HI_f\s5OZ|?ں6ﭭ7#'/L S hF755v/Q^^n a*9G@ jvA/"??rc9&9׽TT.!I-Jk\C.벴XY)$Z$Rb%*KJ&\=ߙ3sΜ9{}8s9ϙ3g|?GK~si[f徇ؾ;ocxIӦM3Ke_p?ҥ^jN?t̝;\xᅩ~ '`c@@@@@@@*L`RmoǎW\ z)=dN<Xf͚}ڴ @@@@@@@@(Y@N>d3bӢE?A# y(vڦ~c       $P&'HyM׮]C۸8q2e7oEl喦uk1 4/~@@@@@@@@ hnƍ7miڴjri@@@@@@@@*2M<@@@@@@@(P`gv@@@@@@@@ߛ˗"       @y llڴ|wN:YW{<>3?3OݺuMVL׮] b@@@@@@@(S{-Zd&L`̙dY8L3^37p3N׶m[ӿS^1@@@@@@@*G ʰ0d3m4ȗ_~L2x~J5kٳLÆ 3@@@@@@@*O`6y͚5K/M f24,Y 4(R0˖-3z27nt       ,Ko\vefҥ4֭ wq=7nlLEVV[meϟoƏo-W6sA#       @ lJ3G,f͚c1ڵ3[6jWW_ެY33|pzGz6̌3h        T@ћPSwViӦ~z@@@@@@@@PfMsl/:~i͛v3,SϓO>^{v3@@@@@@@,4|qƙo3={;w{챞L=jbI@@@@@@@*B`TڵSmժO?4.ȴo>OG(W^ V #Rv~|%$Q (Xt„  [J{9ռys1c6߼-٫(w#kD@//ԃ~X]%)c+neO %Ajzk1N϶{o9c/Y$pY|4h~30Uic]hST>zhu]5,_y^s^A )yqƙ=z$Jփ@ B9V>\veygl(xc\y09`0_4|`[4d't2~V@(~ޡE\:B@@, ]ׯO~ݻ3}րz4(ZpJtkUtV#(&(AǕmvi'%HKYmK+ 6,Mv=~ P)JءCӬYJdΝknt-Q ߊk 7nt_~I6m8 L*ٳ70\pQ=3(#KA@!fMF0j*O?{FS}He{vmQt# d-AU*jtTPIv6lh9ӠA,LWfMsI'9)<҃@mDtc[nSNF7AEO<5kR馛R !B BIGFʘI?Wy;S;vl+0M_p;u>dvHv6HooE9|f{%ѝqut*d_膮`)]t}եK'nz̤I駟 /עE {tAFY T4*HWC)ۥr_UW]erwr @b hp?.:(7w@l4iyJsk%TmT#x>oVwadJrӎ-ML6Ӣ w UI`Ns9*},>K i:un=N;vt*:U Gnr-wWJucrS3fLZ0nFNR,ecokk}ܽޛ͝ng˒@@yp^3f0W_}Qnyg\=WU ׇUu@([unk֓XJuךN;-cGnKf(!~jr@`[)_ecP]&L`ҍ@PAMTʨpꩧѣG5g5}tJW@>g%쳏9rdMEԭ[yN,{|=э  @9 o I4"@@ @4DHL@v5beg \{dj3gK7+&X|DxmWdë@ƍ `{,[?k, ZK Q3v 0͛7O-S=y2ɷkiٝ_޴iQ;(fժUfݺuFvF)vuW6UTzj4k(Eʕ++Kޕa۔VS$5JI8;hv:uyV~s0#K.uR׫W9bl@]*~*;lvi'E4ϊ+/:/)L%cm-t93Ke^3/AE{Qe˖RJ9ZR1uۿ+/:ׯuj3]1aÔ Ei\s5ykkWP:M8~..W_5o׿W3￿9"W^ڶmGyY4E۪'%UWEJI+ok׮W=8.,-FUj:Լ ϣJlhKuү6mt4t!I\uZh}QfnU=c#+?glOksv0't9SҚLR?l~i'@|7guVNuV)r?~|;VCa {6J}3pi_?K:˞{iRoEtٿ~7H(#0~z Ǎ7ʝ9TA9At}5֡R)>%ۭf+=geoF1J-̉'h籔Zy@G\8w|t W^y,\0m]* '༧Ma@V(@@gh3(5jZHP>?VD=fطyG@ ig}e!x̚5̝;HݪRWXQw}7p.q+T>|&lZ]bI/U+y  8z)J$-+ d^|Eo96h> S6k(#;<ӽ{B饕M Jv)S8Q8xVGxUҨX~?(^ "1 O͚i^7ocNgjS1L5>ehb ʊ^Ν=Xk{'ݰȲv2f̘Q-@S:/Sbó  P@jMڽq^ iq])U?A0"}*! @׉l+A yC9S 믿̞=;{/R0q>q%x8OWE 4v*sUϲ`OvbKyi>zhg[t{\Xw^vW$`nUó?UQ{'&[E~U\tE&Se=ݭ,g믛 fQAϥ|FwRșJ)LS.9ϦfI)>BQ;~kCY.QMAoXbjݥ8uRYv ˆbOK~je)uI[;Ns]\ףڞ3g /00~n@leXO="[@CBژrcГMp˾ ># QcГmjgM}}W3Ҡ/GV煖]v%Ռґ+c[5jJWauqGU ?)կ4J1mTz[t3fplӞk?O'gA=|S6J֭뭷 sSF+S9SzݲeKgVEr O5ݠlQK^ڮ{d05=ej7EMO >(qƙ_F)UO>i/:g},j^ǜ2slQB~s Wwn%B+^5[UǼ 9r>]`>`QRk٫Y;y/űـ2+~:ГZ=57b \Q1nQ嫚a V{!Ǵljj-wV*5o~y Qe3`H>ehE߇:ɒ-VQ:}6,2 " <}Jq\Aw0mל%w>:nf ]nz)/v^p'x= V{!Ǵ* nFNztAN& 9}Ous.36DƙWXݙ>ܚ5k`ԣ !Cx \SGX= 3Վgz fp'Г:EFA~60eL._~ݛSnLE 5kFܿ#gֱs`O,C)SEyURNJ۝~ѓvQf%(HLzYowG1 6ؙڵk\ \sw{E ":.*# @zCd{wu54}[s=7ZH+/J?߁Oߖrطm@b,bT?j('k`kNEH(]T95EJIE3]>y$:IDAT(p;:+dNESO+#4N{;:@z^r%aCje1tOi<6UN8s(!}w}nIp ePJDAq;ҚiذD;M{6m,jBE7OSc?hm Tj7QH@AmR!S:FUI}ϙu2-/۸Blv+0v{CߕHw #y{fРATRu?\6}u*^#-7:+<:O+ԪU{27iB5&:|pl0=  P2gg'wctNM֨Q#tI\ ip=TX6om@b PLMUzTzg5O=EJW_}yɱ+mw(RQ*tcnR~-rTo?XJ4yvĹ*[7EaOө[N/6DA-Q*&pH)3U ({<)P妛nr*(2zDل3fx&ԓQE] hPъ+"UpEAۢB3=yT0RC6/ePi -KMW+ Kyk*hpӒ:.&DN@ ?IBۨ c1l^ewq4`㏑–YKy;cOS.Q~sY;moCX(wKu-SvQs ވZN=T)*wz]K%L? T(;fwĵ$zGdvþuw@)@@C15YVE RSNq^9sR2d*{NiҜ)`@OOWٖxQ2+h r;wgj8jzB/[d9v}')R:U9&nQxeП|C+c9&E5k4odɒH Q_D 4RtX%Lκ/nCT~'Zx 'GFY5têԥc:}Q'5Ҡ[+W4QWT K}2owʆ_}UjVƆԈ;使/+RKs1eZ@˖-sW֭sӵ**Ӈfb@(;=,uz)3iE)I\ i;J}=TUT ޷Ѝ @1h(&˪2;찃ܹ҇R {7'Lu/jWo4|/{nteKx뭷QQpW J(]A_&*.\w1JCm6=aS[ >g}f ߷nfBF(+ɼyRcUsJOޏQ؏ROgWj[ToQ?i"EA[W_}DnXy {5w5W1e|G]qfR)eJ9Mcrw4o̠yt̔{)w:/EjMRt-sx.i@@ >+(;٦MTjSݢeo~93;oBZW1wE}/uzm@( PdU^@mu':X?2Pe 7`}iy+{ѫ&ytyZ? Fm+?MP^ZoJR:2LOm?MO'r}Bݮxv)E/(/l9QB: Ƥ%݅4(A>}̐!C>7|4}oyZX Jsu\$€BwB<;H]۷bv烮j+]QycQw\Qy"U`P @@H\@nLe͚5fرfdA51h FqI] i}JO?/ &! P 2*p^J/޿`*{1 "t &Szai(/ma? QD,UpRv+҃AQajzs5#GL-RYjz" Dʩ\*j{Z?=.[w Q;h|~6۰{ ?vGo6Xaeo~եKC7,Q+Q?iJ}+ow>F hg}b/#۾x} $Ͽ尿`5~/Ԓ@@ 9e)ꪫÇV_~0VҶzm ݥܷvЍ @1rkgYT*DO۽u+냂&.BK/e fP% :Ԩ¹zOۓO O^+JdI]51˥+9F>iGeiyA%:-R q-KYu%QСy衇 ?eQ?иW\埶B(YߦV!7I<d˳JV\V5f|9+ϟ;6>r>; TgAA {4vz*+ڷa7@(T  :G =M?k׮u*Zm֜wyNЁ =s;>[oռi(TyЬY3.5|j` :Tn"0J)g$XcU;25DmzB]%cD竄6]Hw9|bhwџ- l6w^6l0oČ3̊+;g;3l0I|`>7}G)McS*?E.|t;Ìk{;nEY[~裏<ӵkcoSx\%ο~ljF¬2OUsC' Q/vP[n 80Jq- *PUطrF" P 1ke 詾?*$A jժUjyͪU ?qDOzݤIӫW/-lO#=zn[Hw=FF<ٮyrJ!S+F #FH-z{5={L O4=?_9 /r?QiӦy&U68ر,Y7Dիl s⯨r'h{ww71cnt{\o(GيS5ǣ[]4u,qDaj*Gf͚qUؒ]D @rЃM׽{w&iݢx sǻK}- JzTǪmځ@$@Ed1#)BKP`A:u ]2egpQU3O=֭ *U@Ihݨg_Q4M{%d0Vw}=Q*~;x3ӠAOFM6啒Tr?};ɓ'oֳN'DQsDv뮻ot.Awܭ@\o{G7۠7(KF y䑞] KǏ ѹGo ٸqQ]ԄLR_{o֭ +l]0+ dK/4m*/TFװRnBθ?-}F  P 1w y̚5+-u=>J=)=t iOܭ[7'ZڳO?hvZ)dSn{=9s?S_|ݝpp=~ןD=in71miAۦoFФ <OU쩄cTj^h„ )B UwG5~y<Q&뮻3ZOVE ?CO 8 ֋uAݥ0<N:W p#|NI'd R;2$%οA g:ivD0o's-E7 %p 'mz7TY]CIn af: @!4Ǽ)йsg'}('MPP]2=^)!j:ujڤ>Mr!ryN[)^q;xc='*徂k-[z&3fLn0vXO }*R,p{*C ]tQA#zm㏛I&E^?K35oE0?yjv./Tn8فQ|Ld\˘q=JYRt7x= xStݜuYffܸq橧JW۷ s{87_m([tݨk!C/3t  PSF χԵ3<f}-uPǪrٷ1M7  X,b9AOEi=|pi]{wvo{mIuCaeRsJd?(~mWܩ_11k׮u* *+nۤݧ~zZQ3wDUxғvџcUJ92׹g5: ;)N[{EEZ?u~O [*z7̺zUժ0X%pB3j˘~+ӥK[r'FU>+8.Vܲ;u},~&i;'do[D(8ۛ]A0GLӺuk^{%qO@첋6l%?\q_ ir=\3   آ,"8 ;zwu*lEX]vQelb.K. PzrL)le΍ 0.UQ[jK.j?^yUf 2=P)^q;z1?! (ۣ$]Gn$N5TJ9d־WPzinƴTƆB*0۴iZ2)l"蜬s]=P7՝oEjt(Ho߾FaE:'SO5=}ayw {tUW5dO˘{ꕶuyN?K0v9蠃0_~k |d&c*nMXnk.hOz@>Š4|ggpЃ Z@}Zh1/}-PRǪrٷ; /Ye,nnnذ!pRZlMkZCf+(8aÆ;Dnūn^|׿B7c9g6?=m?#ΓsUgzB5h4qSأv_z%rJg- T0`s3M41jZC۩~?En_tqE^B_yw®]:nyUoh֬S zW1G4*Cc?2e C>(˞^z[nq|u朣sEwn>hOF}WPYpaj-PnP"h$^zaڵkg6mWXaMfFan}7QjoxhQVerqJdwlFqsػɢ`]oNiԭ[>kR:X4_X=}RU<ݰM#< f3gNj':ĺnw}UtF=9ꨣLPS|q_ ir=\3   ,~ovnUf)Lpvr(TYXQ_Urͼ?:s/V{{$r+j4'YO>Ĺ.yNn~.ɻS{ƪ+B/7*Jr,S2%5NMOL:(|.e뭷vvW@lz;ҨQ#jժaO-4mꆏΑU|b(2(- Sz霥i*EYTrZF䪀 8U5@5~aۨ UU!no_WH l2$)@/x;Ncsr$'&ؠLmV iٲ=ӝıTοq~7<;'K\ ޝTAaT9]۪@AAMO})  + <迣4MBZ~\%q'(}㌂ @16/X&}ԯ[a _bO<Բԡ5o)i_yn)Red%y`[6=cDǪDSٞ.I뭤c?Nw:vIQ>rHwި'|si];qٝF4MoE5NKzѸqc*֮]̠@}?>`a=VdPQ?CNA#h1+ESM|RqN;41k.xx=QNy,Y̠2hae8 TOec7ѣG}-PǪrٷ7@S<ᘭ("\i!JQv=.rQn+~z/^Y*i@)҂2s'V nf(@CV&E(S[;[w8eW^ye:wzvرNvwxJ!SUy*e ѾTs饗:O;UfcX檼ֹOOhSjq)sQVb_ǷҠfTTOΝ;goE0P\UF5Ԯ]ehy P`n}UM1ۘ+whؠ ('n_{fҤINU]hժUj lQe4hPjݑıTοq7[PÆ s{igr;cD0pz<a  P}YJaaҶPǪrٷc~@|.BWv(]^zVEms4 .|gFS~ +5Ǡj\L-{=ɬ6蕝BTVH$8 1,y$`j"FHT.^c>qSM"輬cU/5T2eɧ[: Gcfr mGo"(یR!XhmBhѢŦM˜Xشis^Oz=놦^Ax)4=qi4aqKUw#l_2g'uͨ'@l˳<@W k!mS\%q'(}| H@@(=N 68O2e"    @J   PI f1cӌE%m7ۊ    hT        U!       hD         Ij.@@@@@@@$@@C$&&B@@@@@@@$hHRu!       @$"11       $)@@Cڬ @@@@@@@" @@@@@@@@ If]        IHLL       I А6B@@@@@@@H4Dbb"@@@@@@@HR$Y       D !!       @4$ͺ@@@@@@@@  @@@@@@@ !Imօ       hD         Ij.@@@@@@@$@@C$&&B@@@@@@@$hHRu!       @$"11       $)@@Cڬ @@@@@@@" @@@@@@@@ If]        IHLL       I ӛQEIENDB`performance/man/figures/pp_check.png0000644000176200001440000005274514257247716017310 0ustar liggesusersPNG  IHDRAsRGBgAMA a pHYsodUzIDATx^`՝V]$nـmt! =$K%\rRR/B %qܫ,mwl߼"l㪶3of%}{,˕0 =1i$m1$=ttttH[ F#;`0 & Q0qg0";`!L a`0Ew(B3 Fĝ`0& Q0qg0";`!L a`0ΑØ`0qg0qP8H0}0qg0g<3٤R*fc Qi( d ^H$O4"L&LR)i(|2l45 D&yNPh:gq>`~<~#n6rQ,bqFT*r:L&tn3 ̰,hT‘Aٿ- }nڴu[ۤ sP9?g>O|6p:@OrFS)FƂPoo߽{OË-[z=|LT=_YO;Vk_5L/۹swȗfJvɶ8YE镌9/˗S.6p p--<41 X,i$v!$vh5S6=UVUȷhw HtSԗʤrW%;L iHTz R8i(R)z N Q$4y=zWE9t_R)iӺziqp{ҋ8ce/?x58A >2V` )H !hP3$YD"̢}s\:nw8/gLϚl6qL:}KE"iS*ΝjY(,T i(b;()\dVZ!F@WVC׭@OfL?nk .pIEǰX,c'qJͲgBxN|4aѶ5jb88w:۶mc fk둟|$5I/*d6wvuľ4߇ kG : 4Bݭkj!"N+rQbCC~S# KUUUf.:AE"QG¡qS =3AHk!&@Ѝ㽽ftd5jfÍO:xk8t& a#Lς`0aKW\0.vJRbP$9s\[#y}G@m DAP&Hs"o8*;aq  q|xTs)吏|z>B(|JB|T!-Rd,2C;A3i2 5Yؗ=ӳ`ʊx"x?sܹh4Kī;~0[4 86p,f39;ں:ԇ=0;D2#݄[Q@!c";;WL&ӲŠ4UݦR)j5/RD<ӻm;?r$/Z8naْ\ Bq+`ϡPsikm#6$P*cCd3di0޵sK/gQkn&vlYk|2^)b0zCG{'7^0q?9?_@_r䦛oJ;K)7d`0tuu\b0 3X03JGG>קnK͛ i\Zat Y6ПP(pPR10q? xr׭̙iHE؅^SN82Sx$gD}3Z!k&yg>O3W^u<;4]R`0Y2.WY޸S}wӍhgn LO={׭[wWg}5kt|$EKE"BJHg2FcF#|9%,:;;Vle+NBI()-MF J jRAao@ EG:DL܏G?.sOͦ|I%lQ+v!|;|RBB*RP8CI#- Ƅ/ϙ;;ĵZ :䐶7h;SQMf3B}3gx6߄Ⱦ֛R0xHbEYeaB?c\4yp@cb|g;(U*ZX̴ 0M~v ^YY2qcwS;JA ]vEB p(zߨUjLV]]$ff!pTb Ƅ"ֱ "`:Rr pBϛʊh$<?A1v0qAEy<dvCQIs;|n4J3< c8? p=bbL&N%`LmG555TJdt;= /;l+޹+ca.޳{7pHE@F %+t*d4ǤVmv[ ,=10q#@pJ}X+Jk~$B|STT}Zp=nw<.T*OZH:3 5"дRVCϤ=j^^tPcabzd]""i3_ d=ɑaGK%#C N aؑ|Ndb N.sIq6c" CPum ݅#g]VB%ah HQY'1'gLR|ZqěG{.22011C\:KK."rN (tēdGJRl뱄}O6@2tgۡrDb1:]+݃)APVtx;BL%S&Ġ ,dr}Vh<ѐbw`0ƐfP;!;[U5cϑqqKΝc)D&б[ES`v1 ێTa&%$S(wԔx<-?f0q'‘M'rZ\AnCEh{4Jۣ& FA!$fN8qN'wtQ8G*jupju2b\@^1F&8'{<̈m2whS&\.1GӮbAb]"c|Sj榧U ?0UN$Rh y&-a4L9NSL&󲋃8AVIO N^hDov͉+(J "^V8 ?r-f3FMgJM&!@ͪyx2ɌbCs¸s@՚F݆4OɥRQ{I4ŗh0a^#H3YdJJNdgfٵ!Fh5NJw\ؐ{"cIH8BI?HҋQ12`2j5jn<'vч{ E{YK\quIrΨ55~4%.'N;d<|!# iJb$EFGq}` `^ a̟+틈Ks'?m:|?+G;BEE9̿CrR@CND "Fg }B:q9v͊P"8cTa^?T(g|oVhqJ@ 4uó:p*S]] ]v$TJ%OopR*HcAZpQ?gl6XwD{rXN%&C;;3l&=l;yzOJUu*L___y)!`(-IrAcd]] 6 [g///h4vUW(1=}×!FYD8ZqVm2áh|+K[kr1'Lx^WE9z=OTډ<Hdw>rME82SFEhYj=o*% Íl2Au~Uj3d2y f-n@-PHg_ȡѨkjj pp0XuU&wuu2iuϞWР|2<"~QBߐ J":6F"3n.GЈ*c쀫@ӱK$3k,wPGI/f`2]s,Gi>4AHcQcRv]u=OLNUPj4y*T[*:A'+ś ~ivs0ƊX,F]e.BMS$$33JLjqz|HDb/2 L9@3rpWWTt w$J40~y2d3bX<w:γTWUH qsOӜ J2FI-746l6(GQ1CٵgޙPWWV{Ɂ``H܁e Njk8χRzMH(1ŽZ `S)(o. 'ҪT4dȑd}``?a`iǾR}GJȲEDo@&63Y|m.+pIT< U1LjqGX&΄$6t/v{}QH?l.KF.Q>h4e:F S&I1E&ƉӻL#ϤNaW#m2dT*Yyxkщݏtmwg0Fd^jr~t)MӦ¸b1,D8ȰF+O6]!4+v͈-FCYRѸg>i䱪:`8P;4dsgd)6IxR;u0H4H3yŽj>u4H$3Zt& MwG2cƌxS?jǫDaIĝ1@^ɄnW*q^l2N1='5y83l3F+ҺZl#¢X6GD L&;ƦÇ!hD2dBa0F{oo/ j+cqG3g "u%M|y#G/T @T2H:aJ:>tE*ygN6E3 cIg2]]FN's}=ئ A@E3Ia-///++n2`Ͱåvhhl;qb#ʍFBNpOXw1c4H$!Jez=1f9Z@1RLRqO$*35ij2 jxHRUYi6::O:٩^˻'-<ϳpgH$5 tZ-N/ъƧx62I= %9(4YawGN;gh$* CTi=Y3] \kh5:Ύw 'R_F=ni_油*㜙>J&MMNA *t_qIګ=nw6h BkXI H`KNF3JRP .^GRvqzwldyېrN 3d3wάʪGyrt96*">H2:8Ng:Q;e&WhdI+dw&=TUWb,~D rtMR7ik8'%HW^e0F >=RWNcqh4K/^6үN D"I޾~lYP j}T?|Ѣp׭9p45ΠpL0F}!ZcZ R`\Z}|x1&g;f͚%!±2bGӭ6۾={#'WY5]c Z 7?mp$3M&xjh4u@)0]8O;8&w@D#`^tc&C]U+#B YI0 a"}Qxnp`@%cSG{iSsKf/Ѫ(IgHwfΟI'l RN;8PW_qNt3AB?j!?b\p:s|mGP h9&>ݖf@&(;AOǸQb'|MZyyd2I͙H>?L&漇P.bZ>XkL"`}fΟI'=pr|*?Y,Cs˗]t͵nڰaӦ7"%YI?0Zqq${Ѝr*78J^"[::Yx<:`kg#M3}M!Rdz zۭ־7=|I *m(H.!ົtzbV(a҉^{ݵHdu\щb082scr;ıLV!ɣT8f<; @MS~ӟڵ-TT Xh.qq8GhFc}}}.WNU  = W]>k춶ݻvL&9wE㙾K#1cfOBw</}70,t!3D{ޕbM7 ˩4G'B =_]U]sǎ?'bѠг?[&wu3L6S"]BTi4jpάYo-/yw;S\eyK [ț8[!=? iЏP|Jp8\{ tT*O$I2WTƙ1pUPObӶ0vG%w~ۢEs==}(Q>4@|G*S{pPTlVDs6Ϛ=q{2f:g];wZ6݆maJMZ-'CƍSN+ȣU1?dMW`9Hzӑ\?A#5yovF,& g~6L"q8BsS'BLy̜5{ú t&H@@lw'M3H72 Vqx|Dt:iKAjN6h[[OO/\Ґxq3ΌI$]MMZQT(e)殏}q?̳c\qW[Kh q×8n1 LL.3*yI3wgp$Gšΐ)Cc{ww7£Dtw͸ΚtRf͚ظ5}dyIJI3YLs!LF"nE>uM ztAшRgdw㺻{MNaͦ @):~@ {>GL2C$@gjqfD"` XUSmZ ;DUu==[Dsbuy8΀"}}SM> ^XmƦS׾J6ŭHӊNCgxME8 ܔ)8vPVVZWWL&8C5ΜI![߁.VVUЇ1:n>JolFPJJxX A780JK fA745x^PD2l2Y= BܓI_:4ONo5x2~aMǪ3Topp`48vtbc2zR({vc(DcwJqR& z<*nN5 N͢ŋ2ف* NR¼f,Y L@j-PR^?00L&i*ɅC$(~qWXiRWYԩS8H0* ڎx&¼ٔgB( hUU8]a骫 p$%SaS5'X;'2NB;nGgbL.q 嗮\qQϏ]N"X)*8-$N8nhSS[3A8C˴9CZL&G1֭(~qǽS!WerĘ rϽ@ l}i2JqliHg 0a NxIAo8|"d2$l‘3Do߯jIZ5>-e~|v4_1%q28@_dJ RYUUqKoyCߜ"w\@(]r`2 ̶h5 \2y-;)#ӂ:2N$K@ l^7A=&9 EˡZ,'̑Jy\ܑ .a2R @=o<;L(ӣ.!0'ˑ8P8 0bvuvf͇ Ag!xqbGѶ#Zft9X0gټıŒFBN(MB"d8x"N;T*մMRiaYkkj`R\rOt{pg#!|---ee.DH ͺ<2H^ERԶ`# GAښIgzz{Gu5AzUWDtZ@SMFcO ]փQk GdwwwyE9GLRx⎿S57IWPhun*D'`q@UUebvj[QQNƬJbwTD2 PLrH܃nlBdn[|+/c]DcUi-8 N`xSԌU~S~mٚJfDE!JI)Nqm{KORoX&LxK.F֮]4R"}!-D 5x|>Y3˒ 3}jFbw$}W_WwNј`#0KQOK/l-$ɒŦϜn,dNd={.=kfee9ڻ%MMwy{ww_̧'{pPTASVv[$C trJWa / T~Ax,>00t: misawb޳Y2tN5MOa=L6;<@}"{tR z}T*Lf޼yG/MGa41thqHw]/@Vzk !6dnWg7nCōJ*+uVWUƦ{ΠVˮXUQYg6y{\u\h,*^GuNUGTZ>$']__B\h{mQ$I:sVCϛ;OPrW^٭as"]l޼ )q#Yq4M޹kV ,+ɤ3cknbnX(JE]8hhl;Jӑe.TVU(])qx>Jrb&i%>YV #cSM^)a#t:!Ι580RK,.ܙFcXeμ Ypaww;?+b ^!U>qL%hݵG͚=kɀhPk4l{MOf%xBH{{]|9Auf36kdAׯ}@ (-,V ^cq@ aܜcjkkdBPTbr;-IrԪ#֗.[ӣv+ltTVTVVVH&%Nt:c>yFQ/\gdqg-)A8? ׷o9sM_ǁ5LHñq̼X_x%bSG#QsѲI9aV|DBN{dJcVݹcW,gHzѓ*P8BnE..u6pɆZr8l S!xn ̫޹cw(.p~m\~EKF]rA,M QYUpk4u*+> Uq0wlVmڰ~p&seO8x8oze lՁԋ@iSVtlrc0v^ R.[N -h+TqyI| Y̫d&qhK+ߓj>|% \J||b%6_$E3 bԩ0h0\ejuMuUUuèB0=(Hq0Sٜtj5*rÆ񒋗O!yZv:e9ͅ 8ѻ>ѱ{>\F ER"yqt1UЇ͋~Ѷv|bD(g OPp$!NKZ-!ߑe˖Μ5C9l(^< {ZUYQn[Q ǎ;P+!MFA]L{"DBZjUrGۇ_7.}&eNݱupĽ9s֡C-`e:hު ,ds0A֛x⩌8@Az=d|[i278S5G҄HrTTnܴeŊ,=|>N=?;Խlk~tQDȝܻ{Y})@}۬ ̟6mzWWА"J !_ՃwtZH`7͘( t(r?s-|3,Al6r?lnn޾colL'2 AΦ7o.u~mBUeV Dߑ'(WܡC>޳T*;;"?}u%Sc6V\F.:uxS~S~<3 x({,捛xkjm?7J,Z}+k(' ( *PL:>3Rf#oO̝;kb1}waQ}4=?{0R,Ot&O$PATj;ؿɒK]8S:OFç>nHk_zCgdID }<;Ң,b(81 6Yӣ>a219NNWŋׯ[ܷaæ@0H%Ƅ"Bqe|@_O[v8 8WP/n}cTjk|/mmC>_wO_ '$HxC$ ێmή}ϥ'0BQ^V^Zw/$?/"'0&xBP=^緼EPreeȠ-OܻpB{ݳ]O?-D D84d22 j:Jm۶W\q]wT*񥌳$>\6'ƇJ>kRQr]~N{7n+6r@_[<ē($K${޽ukk x5 ԦqJcT$I{vj2\$ZhžO>?Ңqyh Vh5rWVvrůK6|u8>"c$tZdmG [ZkkU,>]}+xQڙHp\InM`g/\/|b$9ACn޺t&ݼxm\^*3|bIɡ!_ J .W5ӌFc??_ʗb G<\5Vɇ 'rb̧O~!Cc,gL&Q؈Ec^[֨ozڲRg}mܵyw}t[{3{"32Cz! \$L E^t K3y͛6_w[nI&m JV 5Ic[&S6ϼ /Yv;h 1c6dʨ`(4;>ܼ=jFNcSh߶m0 O B  iO#DuRN1k_[/\r׿U1Dsy{#zIRu_{K.뮏TxOϐ ,)>@0WֶYu{xѷM V0~ %DrM[C+.tIN0Z"h81/ ^oY zpKH$azE͋xfI:iR)!Ic[o5Jb֜ٷ~E-*8NeNr+*ammW]}wj`}?EcޡDpNsy;SU '+""^#(YT ߡPP] *hZAqhu]LGH4 GRnd-ǵfs-AD/[jΜYȴêD %m/8F[ܡ}HҨrѮR AFJEq_ +.j Gxw;..>od%vxTK"=Ν;#0Mmm6:l6Zč#/$@))!q! p(ZmtZZ*rZo,=8p^y7xa~c^4%9!MH:=|ޞ܃-VZ,&n9WyyeeE kx*6aqqEoC7 Nj7fjH[ܧTL<_1"?kK.%a _t+\` }^7ِ6b6QD٬d14w:x0Dz-}i!M h$tBENNVe yRAT`g ^&gw8+XI,dLMe< 9pOOK&\E vaJl^GWTwaWVcwz BQil4[x0:Pp}|hl@_ET¡-n`IsiƸk;7q26y|wqlTHJ`2ZtqM-u]{<#ȩH ߡ]t%Λmg-m[ZAXmں 敻XOp9HTqN"dQ9ÇٹoKdzO|ndǟPHEB;**mv8Τ3bl/1e56 TT D>$֏r?a&VQ_? ΧiCY@CN\l%75~2RNq v cCb,^\bSA)q㶷xG&F5IWX;%]IsS(ZVR*;_6I&y_ q{ r ˖/s,@( F*10`0Ew(B3 Fĝ`0& QHeV_wWKDr'8xS^d2Il1a6#s2 FeKoI;'`0qiXP>x Bht:[ 91^\Uؐ}߾b C---H/n^TVVHu]V $|_h5ӧMvΞfO9;bI;ߜ%O<ԝwގ2l9d ~Zp_xEiضݣGۥ"H^d/K[俥"kӦץ"W H;Eď~:wiam QH2Q(`k`l.֙;`0 ,`0Ew(B3 Fĝ`0?Pb]]reZcl6{{p+*ʋiy\Ӟ>ZKV<А_PTWU-#&٩I&D*+-uGSD"==RYU<<}q000|]]m\/v{P!Yvig)K'#77Jrt9tW-P6עJ ؘ>cZqoGܹ}Ǯ/Zz)F8TϏ<ĺuuuE_{C]]xUXxae}p-[\ԣOsC۱cw̙u;E0n;1wޜ~_//y˖Q(.pie.Y<[/} _>ұ1a>%,-hT:Vؾj}/|+ؾ}G> 6AixW̝ɺw8GZH>ӈ7TtG|1h%* 﫴ұg}~3?JP)ұ1wM6sEpT 𳋗4k4jZ4;.i s̗ P(-_wLJo1st8#14SX<-/oƩS,نu5/8wٻgߕW]Qy(&_x???=9^#{ЭjGjYy*hV_wQ|k^xqJe1MG{:N'>h _GyLNfFare%R\`؋k^ͯ~;{׭.F^.W1<ɓ3go}w?D:6& o+&iT*$>_=oB:V?V]~YSSTT@ƿ|{N$k֜f1ӈϛX,nbx/:wnZLwW;|o=|d[[~c T.W\pfNl2IQ/.hHCF e}**ʥi?ڱq&Ԃwm8H  T+W@gΚ%N[&tΛ?7tͅ⚗PW.WYѴ` YgΛ? n_svM:\d{VTUVV2mTyRm Cl}{ЊB˺6|ڢΘ9}R :=}B{Z,uuX7@.\ >v+*8J L&ZRQI~bʸ_}em2t E7J?vwBӻJ>oL&Lfce+n"Pр_Znl{w;>wg)N?_wp\_M!>w|73,͋@,𦐵I;Xue$j555Ǜ==P˯|x<𹰁MS.xYq\Ԃ?2b400q{!\qPlqVVUUJ>6/`!o q"L a`0Ew(B3 Fĝ`0&cK&|?|k9{>`OH\e0NF._`?g _K3o},o;f c*dں7zv!2MQdbы?^oSg҂8%\w~٣^*`Lǐs/Z$]/3m~籁vn~mOl1#6p:z*Mz?b #oE9cAn{t`ˁse%%|x:ϿC~ߛzY[z nliFQvRxw~o}o;JT ;} SؑM\&v~}_F4rUpo1`P@}eS_sus5ZC;LJno/ɒKgƝmIbp,Jf'L8E&S'\)d] ӈ}쐩N.H׭ ?}Ջsʒ\&˕SޤejMf`%vWi$:}{Zcdsw|s)d[>s]ti`ءP-n!Noz_lӪZ_|⨟ ͵2` "[:HT\'ɻ+y YF8whٵv&K#w,[I*gcP,) f2 Vo?{>BY s3Ǔ}g>+`FJ%ibTr!z`iAz<`ȱDVdWFoV0Zv^7:і_ELŊL/}ь0NWyy^Rc,sscrD(M4iR0qg3h zR*Y[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|U\ @IDATx\U0BE$$) ((HUN "ʥ+U*W0^"*pBN(*% C 7g3ɼys^}o)e%) @ @ @ @ @ @`] @ @ @ @ @ @ @ @ @ @ @ 1 A @ @ @ @ @ @ @ @ @ @ P @ @ @ @ @ @ @ @ @ @ @(B F @ @ @ @ @ @w @ @ @ @ @B@{!A# @ @ @ @ @ @@{ @ @ @ @ @ ! à @ @ @ @ @ =@ @ @ @ @ @^a @ @ @ @ @ @ @ @ @ @ @Bp/0h @ @ @ @ @pw @ @ @ @ @ @@!b4 @ @ @ @ @ @ @ @ @ @ @ 1 A @ @ @ @ @ @ @ @ @ @ P @ @ @ @ @ @ @4xWӣ>f͚^|Ŵ+UW]53& 2! 0sIw_z'?FƍƎF5# @ @ @ @k]Jh 򑏤>:j SI~+xӤI*[_Oϰ{!QGN<Ćۚ:uj:#")S?okzeϋ3fH'N5sI}{su>ӧW.N;Z{cɝ.?啞\@ @ @ @`P] @`P.ҴzSN9Ν;7׿Nkƀdu48C n^{F[E]o @ @ @T@f @R 2uQiҤI^fСiرiiJ>h1cFz뎉@O<1 6,}{߫ۮ%pF,LZwuS~3<\śjF]vY:}O .`@ @ @ @ @}݋3"@h(0gΜ[?uX`{?]&'O9L @ @ @Ui7 @sL?}[J+bg~G<0]y啹~i[!W?>|ӌ9l}e*?Zܾ &\|}pkV-J󾭆[g  @ @ @ p#QAnt)u0#'eK=}a\þYgU+r5jTt~t%TweN;- ܾ *狅5X#M>=Wg,y?? @ @ @^`h؃ @`~xӾJR;wzqȔ|W/;O>2D`ٹ3&>+;SZ`*yRL&mrnV[mʺ @ @ @ 0 pGX @+p''x"曧;.WӕZ*}߭;, @`j'1b/;ȑ#Ӗ[n[L<9曕'NXY@ @ @ @ALo}$@'(zdo; &Gyr{7]{im5/ 2$=:p|0OfJsI+B?~|Ї>z^믿n4sٛb5HzZdEvK\##CK,VYeϪ©Js=D"6&2OI+;i%,mFi.ꫯ3fT~lԨQ+2>~gwQsϥ^:E6M7ݴ_[0m[{za]vY:=O .rGܷrK/ D~8=gV%}Gg59{6lXZveJ+6x{t֞"Է0cݬm< x=x;3ޟq_=Ҫﰾ8 @ @ @@`' @`>[K?s?[ou'?IiE-m?4eʔR5Rd\Zhrnb-VyKӦMk{Qʂ}+?YpK.&tz,Ƚt) 1 Y\_b)UΎ,p|)6fʗyKYرc^#:=RےMH(pW\tk(eA,`K~ӟX}򗿔 ûK+R9>;nVB磌*mfuOK뭷^O,k(7pC)HROR^ FoxT=g^rz{,o:w0J/r=p6oOG]M)z补lLg|^OM,﮻u~ߕ=v⋗♑Mީ;_?׾/}K]m^xa:38 sa Ǻ7x__qO}S>7Wl@wh;~ @ @ @l4 p} @8" ?KW&:˜^BBlw#gYJ~s:uj)˸Z{s]]{v*_Eȑ#:>>_\9Bm#p/eY뛺F=_ʲ%7:}uP뮻gbr>;6G`{Ne~8E)Ơ-?ӥcl9\\koe/r!=z}29ꨣzGoj :.bPՆR_#z7ϙU_rLIEp@uOcC^{4iR)݊.wX @ @ @ _ @`>袋zb)~zR~ӟ,-]y=9,&i,mʂӌ3ztl}zb-ҝwޙlMw#LӦM?nܸ{5X# 60^])&|󟯴c%LYݴVX!eӔ)S4f̘2˔q38|_}wߝڴ6TWw eܧ/'NLX]~27,}Zn2 )':O~2-څ??Ҝ,q?&L0ܧo1G7ʹkVυ6jRܧ%V[-e_g\]⹵B ,3xR<cEL֎{oԨQj@Am;,@|#iN~{I1]vY@_~=_wYO|"e_⋧8 }(?8K믿^?1f{<9r-n89B>&aٗ+lP7Elg]~WWUVY%mvՕVwzU:g @ @ @@ @`>Ȃ#ssܠ{)1"צhcZʂ;m5\S>Kvz\^wL\oС,rݱYd鳟l:< , zݱQU77*;kc\++ mxlD[ʂ뮵>4ܿe1lI) 8إ,k};6 6mGe_wLc\\d,F`Ԏ˿se9Z ,N8OB+!Cҳ>[ۼzXdoo ke+M:ں{ϑ*W_}uZqo]wueFrcl-Yܱo*fعm$ʶڅVA[<& N:ڦU1S ~u]}ko5 `;6Pϖu}r}61&w̗.$C< *~.r}އOóIfu~&.uJM)ŽZ}-RٳgUﰺN @ @ @ P  @O>d]F]Wʊ=gΜ%,ˌő 92RZc#{xdiɂ׾{#Ctdl̍J^nog#n;4G➔#8"wyilxXdg޹sNʂsu+rJjZqSd]^>2$Wn)EꞖȒ,=E_"xdY/==]y\]6xtQGUW-rW]uUjnwtYg3++R/Zo>O[ 7:[%37c{_j͏UǗzZ@qOqwVY#|uIdU@=Z='ݳ%/(ėH:+{.+˭Z  @ @ @^ @@4 p_feRM3[yVKen]OCG@]W%|nGy~m>_ctNFfKA|\`ꪫRD8~W{}"1q'"htBBE0n`.o)&t=eʔպ=P_b* >_Yg6;mMS;agWO#GlZ[j]}^XBǺY[o5kLjTofi喫?@wkI @ @ @ &0` @~h5XO>d;wn2Kvd%F3gVxG+]-4\&Lt,m ٳgW}ꩧ*=]~8=HӧOOLu}-,LZr%zG..4>묳?qDFf p=hDb+E0alNaҹ[E]T*U ^xaZJ'Ṋ71گ3eܸqMRe=O:餦12tەh0z. X7;O?tn܃4Xi}7]TE @ @ @p 7$D_F/B^ɳ5no㒑I:_l%} n `#1;Jm_G}W^y}ڴi/Ϛ5nBBq]9ӌ3wQ#|HcƌIm]c=?Ą"ǽ?rR~NO'O\rTbǖ[nYYBgk^O;n<>#;Nէ=z.z{2(cߑE98 _vl]xEk`Vd0_{*-Rx6Um{}W/zSZ=- p,]ivSwl{Ύ/B@=Z=ZƤ/w`wk~ @ @ @S@`6 @|u])f=˕ /9{gxwʔ]sMŜ9sr5嚹 Jok#xr9 &O>9kVO3LrK7 Æ a=:fJO<&M_`8 }_'(}TgZ<#Ҏ;袋rr&N[JǠ?7rn[ouO_v}\۱fKS]kYwX8 @ @ @]jj @ ;"D)S=ܳϿ|t#s6JoyQ]g̙iM7oGL^)-r Osצ߿.80vUVY%[/?->}z'J~x'ݯ~{)OXdE*}uW(* L*w=}ٕɓ'xƆQ}9Z=-䎾u;&tW3w{Gc}ƭsd7x,B~s @ @ @h- @|3Iws-5+d [o;N庍0{'2zyzy֬Y=nܹsSm/_we]?jRw_}պĉcǦJ|wݯ4mڴO:5uYClsW(* L*-"Ef^x\/'Kl/iƌ# /٧[=ϒW^yBŗHXcQO4;2h]zk_ @ @ @%0t. @p Ә1crX9s:蠃ru+R:4O ];uS?SuAƍS<sþ~ߧw޹ؿQy!=Q^??rAɵ%ܫZԛ >TK.Vgoʉ'VfcK/D{jvSxFpouW-@Ǻ'݈~Ťz[W˿/S}y睹[޾úr @ @ @@QEEiv @@d ,_:ӧOODV=أ8"7宻J:իr4l%~VWPA .`|nsdD/JyRdȾ袋nRܛ1?pn=ۻs$^]&O\E]|ŕMzZ+Yr75knzl&}+WJL6w}_o搶ߧc,G>ܮ?x={v^z)xi]wM1!0pgWn aY @ @ @ P`M#@F;_\]OW^y啴;T6;g} /ܱZ馛Vc!2FPqO˷C"Rt7;V ~'Bz4lذܱݭ\s5uD`)SVX!-`m=v79 z6,-첕 H{7?ϩ:syd=\h>s?4ˏ~}__fV;k]?CvVuoqnטp[wmȌvUk}תwXs @ @ @T@{AF @-YO8ᄺN=H8IEflvAu~cPS1urȺ:~y~oA?fˎ;XZ^FOߞnᆺC]6`3 /r[.-B:q¤$&. K/4WWz brs-ַJR[:\WVj9OYE<k߅offm:;D}&n}m-g\NTv9&Pl]eɹi5֨ޥ˭/GjU38>A,L Ϻf qQGM{랋ݵݶzn|_SOO>9Wʹ瞛k6եvrX+Vêk @ @ @@qT 0@YJK/t |a}NKY`c9&MDZ[[~X`\ݑGYwygZwܑ;6j>\?;ߟ6hAvZa*˵SIw%#nkGP~,Θ1Ž{~~xnc}!E&lƌӱ~܄qVAr*Z9͚ǿ;K%|뭷sW^yeDUW]5dU>Z'@ @ @ P$ċ2m!@[/vmi뭷.gaHKG׿ &"?$Yܝw9tIէl~(wG䶟s9=#m`_|1M6ygE~d`Dhd馛g>rPhdӟN<KL*`3|%2)G{L^#F(o~{/~/"+뮫4'YO:?>7._#G矯 1y"Vq zx6.~m2dH]VAd>Sxv.pϘT% "naر)m]1)tAGL`zC\7k'ĵ㽲k6uvߩcݬw㞈g[9?y#w_:2/"{K.d Z @ @ @( M @@fmҽ[w}뭷6vR`ly`Gf4^]x}\?LMoQ{d1_qcM ϫ U=&OW??R"DfK~_/| iΜ9fϞ]RfaҤI)Z=Ͷl-,&&pUOML:鮭Z봳6 @ @ @d3 < @`^?Ӳ.&-0^r%iy?r#GywLwuWlcYeUʙ7d{)Sf<ӟ'84:yd}'Lw}w9+V[m;<2?Z +97miʖ>b7'N߱Z=X|嗧[^zcmz{$xbaC zEoW_ƌ!V]uVw| @ @ @Z$ E.C(RK-"{nd=si#FmT" qo{yo}ahy#~}-GfKL<馛A,HîFƾc 6ܯrEM\sM'2wUm]yB_Ə_D>4so~3-ҝvgJ]vY:SS+O^DW;ο˗3;f~t 'VZÖXbt'r窍ZE @ @ @RJ!Z @x饗c=Vy˿_{YrW_}+\`gy&=s)"H-~6`6= ;PΆQci#0OƍKZz_^د7#c3A;Tc2ѣY; 똧~:= 1'H/x9=kof=>U?>fҕok}o;3=CgKǗCbrT<~G@ .X%> @ @ @`> @ @h@ul둑<2O `dﯟs& Vg. ^V~w: @ @ 0ש  @?{w6&,CIgtw aw1C@6f R.]28W @ԓ@T^kJ:[ed߁Z_.D%y|pF @ @Ԏ{ #!@ @ PZ?d\>Y%E`9OV.=VvN'BI݊QiyoEd=G.&2ܶ'@ @ @p @ @@ B۹A[SSSnHV/G]*@)^>$NW{/M{ @ @ @]pK{۶ @ @9W}kk+E&[T[/W]X/ ({ uh G5x @ @ @ @@MGhH/U.OG7B_)P*|*@]r @ @N@:' @ @ԄΙ{#~-Bú񼭭Mx&/'X~-(; pI @ @p/3x @ @z8::JQy=/{ppp# {KKˍ|7%PQ=&A{, @ @ @( ~m&@ @)Ϯ666Rܯ544dOiySSu#P7ikkL=źhwy޽[oX#@ @ @. ^{ @ @Ԕ@a׏lݽ1F2{3D~jٚ|11: @ @Ԍ{ !@ @Gξvm[ZZ~ G=mmm*=6J 777ܮsBKwwOB, @ @pS @ @%O|p(@TvϫˮZ[[ G> @ @ @" io+ @ @@M DPtuK1]]]ǡK P {L=U~SROOOk @ @ @ky @ @@M lnnhWi-_Ek Կ@\JU! dk @ @ @VkeO @ @@M DRR~޻wASiMNE˶rߥx|ٷ: @ @ pe+z @ @zȥ {ܯ_i" z24ӓ^Lnkggt =C L @ @Wp @ @R `?hݽҶ j Jv%;::PLع4 @ @ @%/% @ @888HY3BkkkW {F%~B{@5Ԣ@Գwvwwg1/\ @ @K  @ @J`{{;-..,~?ٻRCCC]yU,">007R#@ @ @p @ @Ԕ@أ:{#~ٰfccc*U&.Uhommm5\~vu-ݢeZ[[[|^h @ @ @Zj#@ @9,]&R=#!wwY & DR=Ǖ1.︺{\C#@ @ @+XG @ Psǡ^^.lyQA 1xtxxx!{L*jhhu&@ @ @p}l  @ @iaa! ^h{ZZZR/z  @ _ 'wvv;Y'Z#@ @ @ @ @5'u\=“GGGcT@@Q!Bz: @rowLH6{nwk @ @ p7~ @ @q02iYFƭ"/חY`xbi;^MKMMMy @ @ P`3b @ @@M Dd_Eݨaĸ^ @@ t miOJǖ8F#@ @ @p}d @ @X__Oinn.]4tq:M5E!ֲ)Ain~zA㎫\DO_ @ @Z_ @ @lܬz["H,w\V GtR:<<ڲpu: @ @ @p5> @ PXUk_^^z;Z[[ @pJvvݝ"㸥 @ @ @ >0 @ @@ eq|Օq{zzCqRu1600ޤj!@ @ @ߌw%@ @R`}}=+ >x@۪t"@_%W!GZݫinq\5Y4} @ @ p׈ @ @Eɂ)VZ[[pFj]`{{xUpڎwUF' @ @ @ PH4??Uk_^^jPVOE۪t"@ZX[[ˎQݽ+twwg4 @ @q @ @8::JKKKYV5zmۛzN @ql\\\ )W` ` @ @\Yz' @ @@M gvuueR[{ՠ @STtJUo{/{{{]ݤ*5 @ @ PY@ @ @B dٴY6fwUVU mmmΪ^ @ @p?kb  @ @i~~>־\6466Z{__ʳUDwI`uu5 Gu6;;Fu@ @ @ @@[I @9"~xxX*nojj5: @,l"Bմ,>88bbF @ @+XK @I,`dwwwcWWq5ٶ^ pV`?1xnn.퐳$&EE^WM1 @ @! {@ @(NMU5 k @ loog"쾵U՛D񹳳D @ @" ~W$@ @ )pxxUPrUؘ\__ UD.MF{Tyuwwg777W} @ @ Pu{m @ PT433^UaED\@LP[ZZ*/,,s?$###ill,utt_ @ @ԫ{YE @R`}}=}-ZM+=x r Գ@TrGv մ4 @ @5m/ @ Psd_\\̂环8}n @΂sssikkADds@ @ @zph @ @B DE,J!ݿ? g\FW G=nqNP4::bF @ @zpk @ @#aEM#@K JΫܢ{Tuw @ @' ?  @ @7*¹Es@[(---e nLooov088\\. @ @({v @ @8<??cui`6q @ @ @EKH @Դ@cÇ@jhh8 @JvZWWWvx^w  @ @ P5  @(~Bf7!Y,f @*q1==✤RkiiIcccitt4Vj @ @n]@w @ @E:T~"Li @s҄8Gb]Ts+twwWj @ @nM@}0 @ P4455z"6Z|fll,uttTj @ @nT@Fy9 @ P4ڣQ*F=Ba @|4ĽZc"@ @ @|< @ @|/..fs_apn @"DՕ~3Ջ@DZ'O @ @ Pp/I'@ @jR GR85*F@** P4(ȫ0х[8xǧ֫ {'N,达^mmll,=~82DَV @ @ pg̮ @ @XnNY# XԈ@OVU?YmJZjdSmuoޏ#^ P|Z5FnT`~~> onn|azQ6lG+ @ @{6 @K B߿O_~Mv-"QrH`omm1n^ŀvT>0U/zʼnӁR:Ow\=W܏,J?b?jԆ@# oooTLp{ݛ @ @p}k @ @@"4;;|vvvʎ=N?Nccc)P#ADz{`J瓏KJ;rѐmom~~drQ_9{f^Y~pg @ @p?kb  @ J<#rM5r2Y+*4Fո#^)^ ^}㷽t//-Tq[[ۯ#pgoU{ @ @* W䱒 @I411g}NZ>|=zZ D9 'RմKJn*|w1&S'I/A499Y<O>M)5 @ @W@~-#@ @5+ˎ1cccYlG+Z q㛪 GezTcTz鎕—&hloow-I'+ ^1۷oijj*eJ_w+sOڮ[m)~&&dR=LoԺnv.933bJ666UtwrB @ @({q @ @B ,..?^ fAi888Ȫ _g۞s’''q\TccOL4 Ĥ/_ٲWre @ @({Qq @ @DӧOiaa`{4'?'[yG GV#@bn ǕKb*+{UU'\͊sW^} @ @ @vkw @(@&''[_TOQ]#p$'Wb`lNVe;+z1"K~cc#;J{755U5&Գ@?jA&f*]  @ @q& @ QTk}qzIR1:OȲ atk\#aR5%YޕUKqY4wQ 333ibb"Dixx؄\!  @ @Ԟ{#"@ @@OB1 dU;::@ D.*7 RGhͪ^~jK`kk߇Jkmm=}߉PvQ-@Ls{١DŽ/_fv @ @p` @ @XQvrr2a4882u%UcO٣Z1 fP^X5S ~CNWyoHL~9yu Y >|^qhzY @ @) ^Ũ @ @@ D^u~\MϞ=Kq @ @}F@ @jV UG1666Ǐgx(@),U Uά:{Bh%-N&JVswT=&D^#Pd;JQ}?wSȈ| @ @~I @ @0[[[Y=BZSToU Bn)&s}ooBأ"{Ki KL)2sY=[[[kaӌ?11fffʾ;z*;d @ @7* ~ޜ @K MNNfr_#400P3Z'8J W7[qd>dd$=})E!'OG YVYuRzzhOMMMy3qIDq}-~5(fggϟSٳ4:: @ @/ ~ޑ @Ԭ@>~ rhh(x"Ev@ lnnWE[OOOL} |"*-.w%rXAop9)oK &MLLCq\޽{eXA @ @/U @ @Pׯijjl#gBmֵ@&ި\---z PY 1V~\ }\EF#P+ղCNϟ?weBV @ @ͼ @J`~~>});dO>.,cu llldu#tSwttdè+UN 1/*DŽ\bUTtsi˗܏jjjGFFr[H @ @ o'@ @DE;䎹%~: 殷u R\uӟRj  @{Lޮ1*1*&\inR &aD5浸@歶 @ @pކ @ @@VWWpLV#!bM,HTG466f."D^JvOU<1*&`9LK9ϟt q?44B @ @wQ@.uL @8<}sɓS\ /*S|U=Y*  @@!kaa! UL"^EUus;l)u$@ @#:ڙ6 @)zc1[QGUkZ?݄:<<(^nkkknFtF*UVVVrUrY,$@ @c:޹6 @j_ B>|([A{ll,x"EPe"m|"^Mho``8w: PTdš]]J߻H&U3 @ @pQ^oN @Ǐ*y=ׯST\V ~= ŕ*E8/Bz @]ctIqL8:::]u lll?3}^M?Ye @ @" ^/{v @ @@a_>v @ @@   @#ppp>UuKKKzUPFGGG)&OD.k`jhh8 @X^^Ύ ztwwg8kll<N fܷOʞy\ښB @ @Ep/3n @(@SjVׯSru,$'R{}J ===  @ 17q cq㱱4::bBF"LLe @ @߁O @-U|~;Ц4>>FFFr[HNv5;-S"\gE*+  @\v f]]] T%޿vwwsgW477箷 @ @@܋ @ %ϴ;#箷@@\ *#oO"<,L:ԸWVVq@5{{{Ǐeڲ/y;} @ @Ԭ{#@ @ D)ȟ?NtϳP@i{^uiqh @7.=77{.xr1;oǕ}4y^'&8&8V @ @@- ^1& @(v믿RʝYUŨ8O t~= V,$a9]8vOOOJ9;O%(vvv:;;;zzzN. @ @@!  @ 0;;>~rɓ7sy,}=gEq( @ @" io+ @Ԥ@"Tᒼմ)Xv,pttU[Jǝ߃Empp0 ,Ԯrt_XX8wQyÇ)&Hu;lmmeWZ]]uOo޼I----$@ @ PkG @ %޽{r=66?r[H ?~H_|IN"~,7(@cR[\J[ښ?~FGGK(9THtkooOo߾MݧWyN @ @kn @E *pioo̐#UۣZF|B,%[6#&⻥ @!vōjkkKO>]=(w @ @nA@}$ @G( (ONN:*n|2555宷n lll/_QEgϞ$ @* DRt޽b?+@_k1ñ @ @ rrH @EKgnÆƊ9 \OʪlJ @"9߈+D]#PXXXɻ2U\M(LQ @ @ %@ @ZX[[K޽K;;;gښ޾}+,tF.joool{ pJC]1f`` ;ym $_':tŕ޼yJC @ @p-yK @5+ÇttttfLR51brr2~_JBQ=*Gv pY}qq e#Q[#߿~ɓW+Wi @ @~y @ PӧOYX9occci||\#-=\ʂd*`.,込\-3w^z]ptt;U˵,.UNr @\)Bv;+dGe1Ǐ$O>;1aT#@ @ pYy @Ԭ@pƲZcr)9XNSirr2;ɂy-&|R<:^ 600Us @ @_Fk @ @fvvvVWWό1^JgYPQ}tbb"̔,U5 @[[[d+o`OSV,//g{]){ꪻA @ @7/ ~> @~Jz]*xm0VQai?wghjhhc! @糪[xQL(}qvs0u0&`yWJׯS\)I#@ @ phK @5+۷ӧ7oޤ֗@k>~)mHzD = @J499bRa^/_Ly-3rWMzazIum @ @&oR{ @ @ Dinn.}*LS_ rD* ^J=== PbOL)Z >|&>I= @ @pEA @"޽{|~SSSV=B5Z} D&4?NkYА2 @K,,,dAW766Ǐgxշ@\M)G9_ gd, @ @8- ~Zs @(@&3L{V*e7ttt4={LȲBV @&WUL_~ͭUܣ W.«JgZZZ:33ҙ @ @?w_ @(f[)*k+˵ @ lmme~@t7,Q],MLLdNoPN @ @@& @ @X]]*Ǐ,~"(}bKHjhh% @,,,dA9ړ'OR766>g6&o޼I1AY#@ @ pZ@ @ P?1F3-Ǵ^vFGGӳgRKKK>V @ܼ@ONNfA{{{V}ppnM *{.[&@ @M/FE @fff҇N-MY~- YgA}eۣcӓbCk @#U?}bj600;::ukkkٕt{Qv&W_:-9 @ @ }o  @ P/_nOWy^GGG)&6LLL-Jϟ?OdN @ܺ@TD=E٭)eJs|He7bll,={ĆBV @)A穩Z\i||<Z} ?UY޽{WyN @ pN @(zV}ww̐#vAT@lm@˗/Swww>V @_ &~)-,,ݘܰl+'۷lߟyLlU @ @Թ{`G @,--wޥ3C~yzW`qq1>MfjiiI߇Mj(n6r @<1yWt7sL|{{A # _~FFF, @ @~w2 @F`nn._g Q= rC &0D={ @~Tky- mmmy-+r;ӧ)n @ @pV @ @f"-*3}6 ^yAVVV ۹[p޽ݝB @%|DŽW^箷xcN8lY,aYeYlYuM  B p/ 4@S(%PB8C p4)[ۖ%_,wfvfVJK\;;i>>t'U:B@@@@}}9;@@@ a4* czzٳX|o> gѧٲeˬ8l5@@R\ӚԩS +Z :+8sZUU    0uOk˙!   +;رcc̴:5kV` OǚB):<[bedd$q  &pY۽{9r$5gΜi| umf'O F~CC@     >u%g  $ vĉb В[@[ZZӧ[yyشiG@@ TsN;sLz}L*|$BunllqC:F4 @@@@` pzה3B@@V@Cͫ _ooo󭺺 J@&;ê-lԑAU۳8b@@I8}r >z2U%:˪rkkkD1rrrX    ܓq   @Y}})oϷJ*yap ڢR{YYCv  #8|ܹsOu?{j Zr 8pԯQG@@@HbI|8t@@@ YT[Ϟ=8EYyyy`9 K@3U]U4B@@Q 8uuu!;;GZr C9Mg5BTQQ    I*@=I/  $@{{566ZXE +))IS8c;vvځAOYpӉʙ1Y  0& .ءCl޽iSZj:5a K.:!@@@@ T{( @@@C >Pʕ+п$8sڵpkN%ż,C@@`\zzzB|> ]vF) td0   $^-   4wƌVSSc ВW@ӡ'1|[lz@@(Up߿轈!--Z\\|8p]WWgYYYu,Hsٞ={LZzz&;wnj!  0!j Bs̙3V, v۶m5Tuu5n:r    @0!  J@FSuoS]vi)pI'$V%QgPˍPr^_@j?ٻwFR,L|]ㆆ lvvsI    @ pOK"  @ 9U9s昪Λ7rssb3gyo:ߚad~;x`ٲeˬ8t= @@LԩSQTTdܯ$B"{ȑfffZmm턏"L+4h"+--5xEC@@@ZFl   [@'6l`&֪+WUNmTCPdM7d~#=8UCN>=/TmcXs~!  gϞ]vѣGCQ#M{~~~z&urҗT딫J yX;v]Ueee|%2?܉={<`=</X.{;to<    f   0vٿɓ'aSS ox}4HΝ;#=qDdz'T~˖- VRR|i?m4*\@U[ZZl߾}iS8CA]c_y@@DPYoWվx6UwW]}\RDK<!$#@IDAT~ӽrcc\fΜiwZkuVgT ZV#i7n;>C9?gyƿy@@@@    X>OӨ_z[|͟?ߩe K8pÑ9r>ˋ,O U_]AJ9p6۳giTVVVf/F¶e  (*ߵN'Ͼٴi7B>`t}t?aSgy9ܷmu_kXUnܙ'|2n[sܐve]f7"{-OM@@@@. p@@ƍjm#i m~;w6n߲eiuosL':g455YcccHagdd*CEZZG@@g-ZtT(l߽{/ߖ(_*%UW]YqTy_!w HC#%|=Z6ԌK_LU>@@@@ U@@@`\ُ*D;Qܹ3j~jgΜp#4en%3fh6ܐHGyXn[`?v饗NcGC@@@0/9   H[N_r w/+VX^^SZZx_#_WEU~Mtvvw]o~cn'f'O|@^:'Nӟ]doy[ދ/v?Cg'@qq򕯴뮻Ι~رq|/_1  T=Dyy͝;HXy4*p/\л8 <@[?я:!wu>{*` ܽ~͜9ӻhD7p=3 Pc_@@@@̦] /\@@@`to| ~ov{ӛΎ   _6 \뮻|UUU$O^;>} pl޼ӿկ:{rĜ9sLz5?:|uu}_%K8 ^WU/l[w( Q.KG'}9 [U+++/@@HFՉ@?y9GS'lj>9w]|nFw6Qr׵u[GGsΫc=F[ZZ/}id>33 %{4FG!   I`:   ꪫ|wèpQL g>v]]]qp{`rˠv=ɓN ]4ܮ({*S;L}C穂y59m۶-4ܮ 8jkk /  S@unTSS:”FRG;eň|xZ׼&?tގzřٳg;G)ᗿe֮];'^B    )(@=/:  'pZaaad +ͩ 0w[V+\s5v*?N;t|ԧ* k5US0൯}}tG?}C9U[G>hYp;qc~F=¼n+--5UmSO=U(ZOO󻨎V2U!  @P`ܹn: ԽƍMzi/Gy$㒒{ ^ׄ_G>''r {5yf@@@@O`=!  'mw}]wu歖~QoG\r%Η󭺺f̈BwuWB??~z'л}}}ާEMU?9TPZi6ww+**뿬,nѢEWҩ}/?o߾=*`SyEg͚5ξon1Wۋ0'>l;w t`! S |Z  *Nlm}ŋo[vL\Wi1suy߹Ȋ?{!`^ӽtmY@@@@Q ɮ@@@ 5*/]4@;7|.T^պ=nwoovש❎{a.s)p {+,Y䯐z?+L6$Z[[)xy'خNXBU>\z5)y9)@@xh+WƼۿt?{l<^>%F^ywF|yyy5u:ӧG]̎9;u!   G 5+   0TnJKK=_7O~.r{m{9]_"*p X_}T\۝:u*6 sz)tqׇU_UȮJwA֟C.Z(j>lF!6Pj_SSӟ4jM߭={VAASݘ   0:9ݻ'"괻l2FOR3z .O~B'^uUj[bرYPW"ls^6t 5:B(콟; @@@@ >^@@@_}ΏiwU kéA`ML8pݻ<߿?5y{]fǼxb+++@@@ (N;g۹s;Ҫ:xOO)|+I&1Z6Tܵ}pWGk!wuN,    (@}1   0U1}cQC}7adQ0Z!2 uVhc 򗿴{Ƕl8TYo۷o)ʕ+l@@:fgg;!쁁}ƍ湹Q xVlذD-SO=t~Z6T]ZUݦk@@@@`   ^CϏ\4@@@@? P@@@`hO~0֏Kg>3=-Xzy޽{#ÝXdIԦ&WUU̝Q]UE*pCaǩՎ?n7pCpz<+V8GU9ssh_&:(~;p@k˝`F,D@@)!Xwm|^DG5upFwvׅ=;؏c{gꤽcǎS{FB>Xݟy8ÞPǝ* q饗??ļj_G@@@r%9@@P,{ͭXի~OsrmCBK.u7z萻Da~^ zPƫw1FSSuvv^Na ]'e,@@@ syyy͙3̭QiZtg͚H?Q~}9#E-dٳvWرcǜԱ[Ȱн!FgٳNԻvrZ;BUw{zz'ua    I#=~}6  LXpB_oٲŝ: #m/z*nU}yW'X Us[AA)pp1ߴiShݭO@@;w[Apg{hZRm^ym9muV4ݻz~y(ܮz͛UM}͚5Q~7 yᇣx+^aϥ!   .@=8@@~_Ɍyw]iUmP]ëNF8!g}tn+Ml,!M̑#Glͦ*ʐ W1  ( k׮ oQqo7W_}^kzW8Y333#bM+/~Mlayw`!   )#@=e.5'  -ַռUW;we_olo7y57naӐ#maUrW-Z䝍9O*̟9s&Bn׮]cǎp{%%%NEðn#  L@ZZ\Җ.]zپ})M#=#Q~;S^^nuuuQPm$vwL^YYT{Mjy{K/@@@ܧ@@@ n , {} y+dq֭M>ݩ"XQQa!  @b :S7nTY&jıK.$v$K6?իm8۽tqq/|)@6u_)?TSxu{/| C=    @H3D@@@8|u*ڞqSp.VSScN}*">k {[UUxE#V[o>8S~/Mf:{'GƪBj*'a(&Ks?Svw;f/i~{hxSUu*+Q]]=v@@F$g֭s>IlӦMN𢢢w*lFW_5?5t(Wb _qU`;utpႽo/~vqg-w{hg͚ܿ;w]__v{ f@@@@ SG@@ ׿u l +6UM?m%%%ξF[} /u\n۲e'#* FVz&`!woE:F=kru]}ʝ_l*T|'rv߹ꪫ"Ýp^.t;ݻC{Sn K_r~䂂Zu\vwO}ʩ     `   c;w=Cv 7*]{ƫJ~{;|>TTTE/lΜ9Q͸!wݿh|;0wG=*}n]xN[lYi=Xd:Q&Tu^a]Tʬpy@@L@#P-_ܩڭQM^njO]y6Rx._N:whjcm\J/x3X>;::BGҶG?]s5aOe    K^4'  C)O :zvŋ5yo5* ئMl<!/--ͩڮ4@@:Ŧº8uTԉuuuƍza%aۮjav=Iv޻wodw_>2? u׿M-Vӽ]MM t܎#   (0x KE @@g}0uggsI'0o<[`󥶾Ϧ[cַ"z)+((̏dbC#9DѣN z&ypL   06۷'VpkoyyyV[[k    0|÷bK@@@ c7tk׮k֙nWt 裏\ OJ--]ԩe   0u?t IUTTļ*3Kp{d7:kT.U!    Orsb+@@@ Z[[… Mu}rrrlpNꡇ5aL-==VZeفݻ7fESt*3޽;4iz  @aaay֬Yokk/2$Z]/T@@@@1 p3!;@@@&W@_ڵ9EEz{{#?Ddկ{"cpڄܣ:\ffY4= @@RW ++˹73gNݶnj9+["dޗN<     LX5@@@ Qzzzl͑}N;#*<@5\c˖-";q℩s'h=~ݻh ](|////;8{SmQTmfΜ_<  :666B!Q6UZ"۽@jjS~    a-   N]ڽMAoݺ6m|v-ǻr7u 盂iiiM@@@ TJiuT7u&|k}vӈk6}t[jUn4    S7G@@P%pUn:~֮]kv=o ִj]v`y]*unW}?UVVƥcG@@8p۷/p([SScyyyuSeA2]sٖ-[L#y[zzYf͚]4    GI@@@ T Na'ND*K򜜜rU~g---v!S(@닊l…/^>r?ym۶)-Zd#  :UUUe Knw5צMn4@@@@ K@@@PAℛO{{{566סJJJY 0u)M F^LxHllɒ%#   )-@=/?'  "e[n57UW5d7B>ڮeddXmmeggW1 0 *+ HXx27OU_^RC@m۶zzz'oզl#   )+@=e/='  "g7o6U9sتU"{.S%~9kll"YYYVWWg @/`Bl2ܪf2;I fr< zihh8m(TM#y:C:%@@@@[  $ߛ6m 9ik׮5UA -C:~UM\\1h  O [U#Qe{2|i{u!Lw=Y™#@j 9V韛R!.]zHmަ^k֬a//     Ss   {˖-д 'z8arWRUBJ*bS"AvoevUdC]SP?e&G[ݝV >DX дw^kii :kFKĖ*v^tO.WG@@@HUz9o@@HhQǩ֪ULUbK{OOS=,YRRb˖-#p7Q9'T@[lnBZj #*gӵW{w+s)Ͼ@ Q:dw n2ZݵV]!w{m999zjSg<    Ss   { jEEE }c=d wvvZCC5,Ybeeec @B (`:x+@b jsp{+wƭm1SRرcoree'yj?ymݺq Aʫ4   Tڜ+  $@kkڵ+pNѣGmǎ ̟??pX$:twwXT] #vqrbO߱ٳgۜ9sQq4X(  0'N۷v]xg2[]{ܦQ***G@@@RB{J\fN@@Eöm8\USp:Z[ZZLMajS= 08vzTlٽT+O$ߗʻwӧO뙩3Enn|ף橚; &I-}sNz2GBĺ\tFo    S"s    n޼904y~~֦d*B.`CPk 4@ Ο?ؽ hMu7>s h􀾾:fGS U=--m@ {:R}Νk+W4u؝F=\Z#iD7SGBb@@@@)-@}J_^N@@E@I7mmW6R%B];vرc!33J,@T@uoԑg,MvwPXTyHoһ7?q}.S]aw;OCE@U۷owjjjLwֿSF@]^@@@@` pWC@@PRUnWSe۵kך*ߦz̐OCC8q"prrrT!аH@aި@X\sU(NA߉@J@ގKST߂>w0QP'Fkoo-W]vQkjj ^ p/ Ν;g[lqFȫ4   LeSrn    [iΨcU8j͚5OrWe}]\~~ix*&9hmӿI 3^G{< oEx^,m6mzh5yK@vK=K!wX1ލpEuNz6uBP=Gxz0   S[Ծ  $@ss>|8pVPPX &2䮊P󭲲d!-OXAv=w#ddߒt:tˣ4y2l߾}]oMMX9Gs ;^iuB`Đ @@@H.u8Z@@BVRR2t|Oe"B r*ۢEܿy@`B^?۝ǰjWߚ7AaDΝ[ &[@͛_5y#&̫k#@OOOJiJC (dEoԩS{oHuwu0a 0!!F*..qĺUիWF .BYY-Yd'@@@HbI|8t@@HN.ۺuk [aa\p0/kw\'k o~~HEʊcnI3MMM&WoSGZS(    0O+   @ (i&4,ڵk9+7!XvUO]j,i 0nVAXuIS( lFFHζ 0t^ѣP낂GiiiC= N>6yD#Z͛7onhT:ds߄5kpEa@@@)q9 @@Ht}eXUYW_Fgeey3=BUau֭W^MP`ׂ@`hg)Gj 2PbG qԩEܿ۩} Ou慠V]]mőyL3F_uR3gu)    0'CD@@Pю?uN\sss33:ф{zzp:`x M{{jUǚ4{1g'ԮJt"N78q)r$M Az!c{Bsp_$> +_oӽ:h3ʇWi@@@Hf|8v@@H ={XKKKX(I=V]gϞ= Eُ9tpR5ԑH|SLmrWuwuQt$M ϟ?m@ 0;_\h$Bjjjx>;G@@@ >QҼ  @kkڵ+pK,r] V}V+o~;wGEOssz D@A#) uQ@UvozsL=E#i @@(J7nRLiib޽N8_<    Tܓrq   ]C;w.plʕ6msöGm̸ !M_v   h/v4 dI\T ou?}t`9 @@@@d ,WD@@صkF̙3f̘ (䞝a   >2fAbԁ^5z9sU… L#   I#@=i.   p;|pPsFFF`9 /p   `ׄYMMMC}WW۷oD@@@Cx(@@@ࢀܹ3`Q^^n,?w./+   XwO i+V#    @ pO+!  @RnhhGoAAF-cfbnߺu1 x*   @Scuww1 s MMMc    Lܓjq   u|NiӦE-g&Nr|k^@@p]]__o=TrwI&Q#͙3'5Ϟ=k;;Gm     `3x8@@@ Z[[رcQǭP{uuG-g&#@IDAT# 0Ց[ĊD@#p:aGveѴ閗g3{ii>p& @__[GG={LeeͲVoӦSKg*V!wer:#&hZVX<rJ۸q9s& g,c@@@Hd|u86@@Hx}I{q.[f_ B&VN_Mpqn;V:`a$sȑ#I}ؑ_ lΛ7 O'F2BY,+^tT}jf{m.[`6s)© ݼ"s;!իW[vvvjcNk4*Y877]4    pL   0ߪm Dx1= 밦]߿YTZZ_<$9v܇j _Yaa!!͡XSR@ o?~ wuu<_}&>x𠵴8L\@ )p{ssXM~]OvCN=ꬹxbsmkx]=k,w    @B pOA!  @2ر6}I\YY]h[Z___Ty9B6Ӧ[VVVn{3$ MՆ1Iv@$fw~4GX#ӧя* @ yb)+b(:8pb:Wޫ;\q]PVVf'OtFp_Hl͚5y    .GAO@@@P={D_]tQ*q[b~|` m۶-r6zG8SiGХ— a0Ç;A^pF6RP elS (,mzAɧ鳙) ;ý*Hg7n4=zޗuLC@@@U{^ @@V@l8>Un/..,gAn ӾY@ oWAKUl`MJUjWp`RC{{<ߒzl.0T]32~ުosoE}/c 0BYX    .0#C@@J@1)N=gϞn_|Gzzֆ zI9#PvUkWkn16"h6FbSYY3ǝX#h;w +4t4H GryyyVSSc۷o*[nUVp$cVK. Bk.={6Ѝї#   @|F/>@@MMMmٲeS WTT8ՙGsGs8wtt8!IU͙3 Q*L9mڴ6g= (ONDzoV=>}VндLxݳwB%ԩSN}ՌbM:k= n:HG4@@@@ Ɖt58@@HhXggg1Kj R**$x!u4PPj, geevJ---,@ ^7nt4,ܮ yL:;w.^DT%.`IU{߹s=3٪LCW= 7hMy+V:[ss:/   Lȼ@@RT@v(qWȵN<x.\X>Gs8Xjƌh"[~9''g=" K 33Ӗ.]j^z[FFFidڳ>,{zzbn ?x#H:s֭[Mawʕ+B U@@@@a vl  pojj *J0mbav+rW>wvv04Uhokk!w_XXhӧSaH06@&P@yἷ… ~T ^Q0nw5B u)eg:¸8vٳg:ڵ+jg{9s@@@@D Wc@@@Зv̙cԗ U&F}v D*h'*H@ǏwGУyyyCn +{|kkd]G|QU4D#߿+mn%5k֘hc6ڬ[   *@YI@@@ kT l'N%KlѢE J{KK1 0iٸqo}p +x@) ٶ|rKqZ5>?N(^i 0z Gwe7_YYif͊zر#~    (@}y)@@H.rUUeff&$۷ώ=8ŋ[YYY`y<r*DLﳛ6mrFkX~3z?y,GH\}g9+{vY'a;|%rb Lv=yM˛Wa4At@@@)0#V   ),*3'8ػܐm۬/U]4j93 .֮gΙ3JJJiӦ I-peQQemmmN:}޽ _*,>I hD Gy>~әeҥ5    0}X  )( Jަ/w,Y]t:;;mΝWPB'r u^s* 8q www<- `{NNNX 0y[?lsܹ:uxAܹs X-^5bFY`w1quP"u.F[n͜9ӻi@@@@`O5/  "===Q`ʕ+ DoFU@UMJ &>8ylWxfJA& @ dff*8]T'TsG]2UtWН $j=BVG猌 FOsXQQa]I#f455Y]]$@@@/f)   G+NK\m۶Z6}ʺ!wmN˿yRQ@AuVw*C2Pk:XRb9 z̥{.+..s7oԃHp{˗/PmѢEQ˘ @JX"Vu&ctZ4:Fvvv0G 0j ϛ7/kk۷;'O<s;V 0)Ϙ1jkk{={ݔ8 hT ^) = @@@@q >Π@@S`׮] ޖaUUUNE9r#{ps̉ϋ^ "Hzg7c^Rٳg܎  &vZ;wnMDI@ 1r>'#3C4-`љ@@@@9Jr@@@hkk#GDIWeaihii -]TE.!DB_N:e `UZNNUWW[]]ڌ H ++鐺zjKZggmٲTߩ5sX@ $sݵgF݇w_|@@UMaٳǻi@@@@ @@@ TQMD?dW/KJJ4iN{\*tN>nذ ppH@ bJۦMQGcn M`*]sPQQF>l3?UHjvСAGko<    0cE@@L@l744磎\.\tww;4{/((e˖'r߶m[:O~ƒs.pSE#_;3k,+++34" @P՚*5STTd-29i$T @ E;m޽y󼋙y^޶c6}ާ!   {[jG7:#::u*f,G ab֨jo]N\}C Lp]'WXagώ۝ Q+w]곾8˘F@@@[x?@@Hx'Oڞ={YQQ1hX0* ֚BSr W1AuDٵkSJX﹪k*^\\L0$!Lܹsm͚5NXV#65}Fh%6mMX@Lp {Du0>P]!wkkks:3   d?   "\i꛷ق @sss`Hyz~vvv^urvK}ryձ }rݶeݙFXdl{'P("$>oںul1;U 8 g4 DHp뮀:BGZߧ:N3+Ǽ<糿vI%}?     0n|8n@@A@O:uYYYN%j!3qطo=z4o˧BS*9ϑ#GlÆ vГVͲ2[~-\4OC@ tWV>l2Sx6^@@^@!hSUE9!_>8p B Oܧ՜J[n]v*57 p aB,CH&TKKKY›qFӽ Hpk*+Vpg#Ǐ{F晈3埑dw'w}־uHL86%<ÄI1`b0f0ؘĀ6B fI2I03vZo-K%j,JGԩs>GV~e@@@HD(@@Hy lU-kkk50ޞ'OrO a8P۷B %%%rMk >! I:hMnݺ%tX_{{{6 d{={Ǚmm@A:`ww7In@@@@ [g@@2q`i$loog I3. ɶ# ֌,..F<} uvvʛ&)//  d@QQ\~]<CUܹcUu4.BpSYgsv%L wQÇz;6b@@@839  V_XXp7-\@ ݓO:QD}oK ;XMъccchu7 @^zI%ҿ䜞۷o?A푯4δpڬDDy:::Ѝ s   #}Ixx,   {;K@CnwW6[[ȠC099)333~:W@FGGpiyڵk?Zx@Ammmr-x2;ikoo/6t"tv:={byN+011!%A@@@<=$t   @& {Z魡!N3% ZawVBׯ_퍐{\ϣbꫯb'֐JWWMoЉ @ fWWWΝ;255%Zݝ@"GW˓7nHAAc,b:؝<Jcc 5P     xy<  ښu:sFKؘh4T^^eBY{/777_ԊZ]]oz^#ч 555K/IKKK+59==-oߖ >Z}moo[ ZU?x277'c    uοds   ZM+[gg F@[\'N=rO }pp ###o|"Ry[  hUnݺ%UUU7ߗ!݈Љ?O':}߳RzHmbb@7     pfg&   LMnhhwq??*EwS777Y>5NBe ꫲqs tuuYv @@ v"G|kܹ#i"@=, :-yw}ooxjW>   U `{@@@ 4PdۛV\b> lnnZ+ݻ6poˡ{dgg'[^_-YDw]r$hf)oIN:k>*wƆZ]ϯNڨ؞Gt j%Av v: -wttnOC4${{{ϣQ:]gqws?jvnׅ   Gyx   ӧOJa>v h0)--g`Alo~IJ~#A`QIA[7( X~]IP8L3!{נ=JL;888GZ]w?:HH@tmkk\zU4DOwY0@< vF|]}oؑ HEE QZP7pP_u;{@@@@ F1B  V/ .'PT{h~\~]nZ|8[hϟc>DM'xwpPZ_aOכ Mag.[;D@:tp~DAgҊ2M7ϔ=nOw0j:֭[C( ^ayM/@@@l WsD@@ K44b0UO[*j%1&wwwO7nigА{_C>x#fC&< kySAު$ӟT7qz]Z.y kEĥSx}}i  |T!ϙnaO kn~WN%Ig ܞˣEukfUs=yMV7{377'MMM{"   Y!'Yq9I@@2_ӧVe0LVIܲw?~ء&G? gXy"3>$7/K~Só? ·PX^мY4aW$Q'OȈTDoi  p:՚=Ei;wX^ֺWۓ{ lO:ZCdllL]ҽ-03ٛ 6cW>   D M   Z ^%Lš";-N rccê@>tFYUUfm:ҟg|$'J EX9< Ȼb);4XM X5VY+]~@8@aa[HUBtWVVCsSxo8Pg}+//:G? п4448f+t^x^@@@ Yq9I@@2[`mmᩞVNae/ @jՐҒKlpׁ:HTe.=r<ΆTVV&%^@g+E׭466& #   d  #iw*LVI̲ڇV5T1Η^PD0cow-4WW8|ym:  ϟ"@͵~O:!4xT+Jݞy/皶XH4pjZQ|ppPnݺ[%޽ثAႆ   D M   ޞB"U$ ]ooZ1_'cW~ ΧdCj> 8ޑdR#ת'xG8i'z=ʊ+;E@<555R^^.cccmqqQGxM2 R~__nJ599)GGG13hiݙ Sϑ(yq=࠼KlZb N ܼy׵r7@@@2Jdd@@znnq999Ve0B-U7>K@~t+++j[[[\v٪:@=uV6gw,U>|h 8 q8iO_;տh"a    Kg8t  ӧOW_To*Zx ޽{ ȕ+W<.gsrpS];2M!rx @ _}[8U h^wgOϟT}z"LP3+c$|h$ ^y--LR\@qHnt`E#>p{G$gs{+_As:^̚)͗}xkkkr]ǹ7RXXg@@@P*}  i%011 WTTP+IWQ+ yCsQe{?l2EɭII-|&x:XGgFX^XT4 JmYriy+8oU7ۘJA/&`™I@@B T}.**rwqtI?g@Cr_{0"&~]&AiGm$ 蠑i_isMؽ]jkkr>S5%!r$o yV?-<yG^=,_@2g;JIh>?%< _wυ @^  k>|hUs<2y.> 'Ojw}ϻc~W 5YYnܸJnuڵkr=r:Y@@@@ ןG@@ mϽ=j%q|9H w|y__=;:@ 6Χdm"+QwtG_^i}wEݖ /mUm}?i8-]~|/Y#tt?? Ȼ*[y{Hyݞ$]PVyj|kY^%#C'    @@@MYm?PhKE5;J*Þf<,ڑP'+2%rxX2.oQe [`0٩X!Y9~IR=y χk⑩PoUT'<ߣ)u?Yy%/6agy| ˩y}!qOO{ JCC WNq6x&^j<ۤ?_I_h    p@@RZ T}(**rwёW]j8Ó!Po_)ul2.Mn ϑV[]Y\aTQ"S1v19EI coxT?ț; yS>hu-/g(4 [O }()M Zu Lp aDŽM656ISs?Wn4^1Vyބq޺y G ȇf =4fˀCOjxTPy^i g7\n/S766^~MnOeUV0tv VI̝jkCԛ   p{@@RV`}}]rrr%V@C2C{  C{# ^#.@VE"mB_ZQull8]]RZV3lmI9#3|8`Ox>)Y hf+IZyVVCy <3_3p>:+kߋr2z`_nOb B000 oߖ%t0iPS};~lvI   @ pKω#  ZÇloo"S%XڮwPgh/cBwmEF-VX5_bw?6BѰb\ evfVffg"> F\O'!SRb%Iy-_]; ywx oMz׬.I9pv)@r厀5'z^Pz ݙ PXX(7nܐIu^2>>.:~p{p3+w̌X%N //Ozzz9kWUU!   @ pkϙ#  Z!mb+//&M'`A9::r[?oiiqbʇG=_mm1r hHU#)5yvxEV@~G u'냑'u_qgVx~qi; 疗WWwV?O kpx\ǬJgIX.++l̪2˜>#}psshtK/ϑ%EgBM_t͛7C]"   @ p‹)#  :ܜ0upFa5?{ Uq?=JߖƟE=`_@_L_mdITHl*s^rSȻ UA8@=& OܵgOgˡJF{(9<¼s:oXϟji(Wgnc^^{5RIig ~vt~d&BM_|Q tuuښNuy~~^}A@@@ ]כE@@ VFs7J Zbt 5MhG STvܓ'Ũ'"e5{m G%sl??:{ݨT]&~@ teYV?-<Rd©5Xke 2M!|'y& Ӈ*grx؜&ʊhE*թ8ydJ۷oAd||\}܉_#sLuP,,    5Rs  N8ri$ Znll̳+VVV#~gehDv_ #bmK=*h|4)K7z;FаEVgyg%mY'}y" Л[Ox޵7}KZ\}_599SSS!]ǀVp$k:4T!w:YWTTHmm4^WW'_Lׁ   '@=9g  @ .Má=*յV741Ͽ"oS1x-YM Ndxx ׬/n@ I ϛuy+ǟTwT7L8LkMug}TO7;Y2iP>e<ܞ54_CCCCJEEE`=@AS'e[GT>[QBL{67dddD<+~gH[ߦkON wwmy{Pބ5N˟TY|]X!? WnCۙn݆'!Px]]]r3+W7"    d̾  i! kE.{+++EK@T~ga<<,%{c`s+x&;?f}}owOeMhڽe@ 坄' o&ouM`7< A{[4.C _^Iӛ )yNB^엑11b7oޔF9:-P^^.2>>؇׿_8Y8z)t~ϘA[@@@l}}9;@@R^ T}.*sCCC)uw!kmm}ژe>    @ pk˙!  M:7-q299aOOylҿbpZ˯ȓ~H%Yr?<<)!!, Y466E@#3Aܚjx -ջ&Xz75oM.'uNǂ/׽Un|P):.lE@;wCmiiIjkkE#$Z=_߫UVV&I    4  /0>>@XXãZÇg )ݓ'_ROrr1!9y{\4r5@'Vߊji@8L-}'\ܞ}=T#Og*--.k`GFF\͌t9ucgZ^g@@@2K{f]O@@Њ[?voaah.ZB ؛Vmwq? >a} dVk۩3ummM4rtt(-)kfYG o*TyVU2ofV Ix<’irGsire U+t @@4|6N3l,uZٝ   @  (UC_wеV%F@?쬷gJuJ"o<]{^%wm&ܗDgԮ^*D¡@NHfxhwO'gwaxkCUy߼_pT'<}>AD@gxҗ$O> { -MٴhW_}ձGWәh    Y!   k{ӊ\W\wq?D0<<,zko֔>g@Ak~eS%вO;3+3Ӟo MxVҁ \T[]~mbUAg>S}^Nn Ji-`ytķ<==-Y,d@W]Џ‡>BM/J|C,)Oאny3W d;ڥ^>>6K#u•M p|P֭ Û |hY@d{kq$}+ XeyyY›kֺpwhkk޻ߔBM R\|4-   d̸  i#099)J\ZQgwnNNe[v_/Q5r&?b-~tt$ZUB xQaTF! Y* \*Soll8eߙ 랷At? 絪UA8,f̝;TTp>k:K_y}ikkkƾ))ett4<66&7o q@@@2GdC\K@@}Ji=༼fkt{ 4R8c:~kı^CsT\6Vp{*^9 @.Z@߫iHm]aE|> VWI~stK7-_.%_V˗^?F܇3x,l>~DN+Gz,} D֮WVVb ["   @pOKŁ"  ZYpV%F`ffF677;+***9:Y@%S\$mɭpXdW+S=便gǭ UUU200G@f[= }wlmzl|I?vT|#77n@ `Uq>/@qYh    Y3zr6  ꪧbrqq4661ہiGyW4BC @A[/@[;ڞ!UFUF^*===DG@Pi{Gz_S><;g n7ǐgmGmOՈ <"5bqqQ!dl@@@.Se  dVmSxkX?|S!Y5eoJt=ggj!u?x_ioinN^<2t  NrYZZr>N HwoO# p<pa Dz699)Z1   #@=s%g  @ ΊVԲj?̌lnn:TTT$>E)l*9R3±}WVVdhhHF©&q  p+WSZ1>>.3}NS>.= @@@@M@@@ VY-~`0(>&wqj]R:?~^ <'3 > )((@@ > ۫Wzv+ޓ32vs>W8q4(4tvvzv3<<|ax<:^mmtP@@@H?w8b@@R^@+eMLLxS+ki-ZQQQ;X@ Qͯ|D1n?Y='#侷gU<ߕ+WS9ѳ!  ymnj@ lxƎ)|1(</"@F]E@_{rryk=ٳGD9,V#   @wq#  *033#{{{ Eeqɹvvv" Ъ$<@ni%̵&-&=侹)wݕ@)aφt  $DY:::3X0CPǰh:gљh JyycG[[[c@@@C _<8J@@dn~llsp=U@}#Unjjg)Uқ?i֧?'q,3Ӟ˗yЁ \@Qq\q=X^'ZKT=Y ۻ 䖖H_Ҙs㟑Bsss25  Nt,l  pq2p}SYY@ 'pF, p?R g<yhO xgk= %%VPwe>@@Hgܫ=Ǵ(&Y D p.KZtC [TTʊ9X@@@@ ׆#C@@ -V²VъYtH^t=F > *GBidW>kU^;5><<g@C}ri  %;^vM"dhhHFGG='U_ ׯT>ws׳Dx_Byو@@@H )q8@@Sɓ'M755ٻ4C9::r#96K_r_]]8G#C  >JUUUpٹ/% ދe8mv6{xx555~ّ@@@t WcD@@ E&&&vɢTpm{]XlyoT699)O>uw   )&@$.  @heMj0A+dݕH"M_3h/P@ƴ㣍MYxɑo5I@?H8! i*!w}#\~}@fD62j;$Ո  g](`aaAXt&<{;88   0  .ܭ9t:##h `K? e_c:Y|muւA M奥D@H_<+iZ шX -S"m AOUikk %P8Y@@@@{\$@@T*bRZZjvdz,;::}, Zs/}222env۰@@ }?~,=ˋ!nX(Ϡ}6h laMMM;DX@@@@ 5@@HyH۵"->>>>ىNWCA@rJw?-9%1+.w:ՠrw iSK؉rim q~tw hnnh=/g    H_Ig  )766},] ׵*ng3@r {W_}}Ⳓdm/ˍ7xB:@@8-^_ 7o܌8;T*.S=_`u6ޱ Q{ccc;;8X@@@@ %@@Hm "g_4Vn8x)$Po?1Q20/%%G=&=6B@Cy1䮳}>qh;v)4؀!   2SRp   'Od}}qUUUTowoabbBScZ@ \}߿N#ojF{_+r@@n+}}}RZGC kn^F݆ HtvttTf+ "Vq#@@@@9ܟ*@@p hݨ9Ɔ,--9۴ LFg?&m1+YrSp@H[X3ͬ>ސGdqq1oc.O $DV***ڊ{ޱ,^{_|N@@@ %@@Ӫ_eȳj1h6ZHC Srˤw?-⢘Ni?);rSp@H;C'!!w=P81Up?6@ Y]]]]!ߗ3th#±G@@@@ >@@)YRCr:xЊm42M`Vv~{$ˉ»+S3 ) y<'Eš,//cK!cd J}}co3X*"9f1{#   #|:ő   @ VpJz])=zy`Jm@ udppPb:'2A@R^ p{w@)3bp~e {fv]ϱ U$,    p/'G@@ 4z{EEE| V\qannh6$cUn Lx߻%9;[$p*).q”^~T6! \@Vr/·###^~_~,wH@cc9u`Xדxhik/ s@@@.]_@@z{rV\k4AC St#nNNs/a}#:Vrwp @L"ܵNhoܣ "rம.Syو D>mKVܝ@@@&@=i@@`Z][쭰P2 LPDCfoܐR)W>b_}#Yx2;!X \@ UrC]֭:44$Zy͗] *LYsss>&ޞ,..mGl   I Vv  @fP=Q+i5wӊlZ@&lmm9Nn(?=w9#`@ NNé pgۘ*pwpl.#Uq{_X@@@ #HOde$@@Hf핕,loo;X+8X@ &&&duus ===R^^ҷ#p,U=$t @ Y)Y.Mݝ]ږ͍MY__~[>]:3>VACREz`HwIm]X@hPR+D+C0V` W(h݆<>`V$5Cgܜ\Vsr|z?T*˗ϳnu9OKC+pY񖖕JwwhҁnUݳv<{D:/M@S-..:~?_ RRRriǕOUU۵{]]{UǏ   @ pO+q#  DUAFJl42A`ee EnrnegdMhmY7-_ؔQ 1jh VIحg]Tcih>DGڧ k >0i ]c j/--IY01p@vu<ܼyBf&}Ϫ!P*4@@@γ"  P,d;;;M?.tЁ1ÞSЁ1RP8#͟9z0υ{$ѱ8@gNnvJ졀x*aipE_5^T\$E [}!@v J=UeaYHUL>~` m*v1̢!w >X&:=~A1OjUǷUܯ^Jʜ   @ pO+"  d̙۫1 j5`:P@ ёuv3*eY~7pD燤rwp@V hP~8dC2NV_yx WTdB/LCHp{Hzik;7cOg ~7sп`4"Uqݕe+~=@@@W _}  i%zV_@+k4]@+jݪk;1m{dA/{gyޠ,Hݧ^#!ꚁ}1# ٿ.58g p~iͺ;^>dӋr+x$zzzk /O%C1Ft67wTN.4bu|[l)4ʾO# j]Uu[OlCqy*yѼ\hSt+W,:PgP 7Z~g9%#   Pd  dVo0Iuugp]]]|@Q#{hh ڏ]Ìn?o^y|~YF9:/9 NzB:HK}4lnlky2>˗|A;zߺ5ڢv]5PMD?Vj&0uz?Qt?2MJ RRZ"fYie:\odr=thOoܻ{z zu30)Z{4!_@GG=Ԧ}%m: -..D0w@@@pC @@@"UookkɈ睛kjj39uAOOxґWU)m}Kpw/Cc/E<rЁ@J mh?eyСp5d)~(yؗ&WyMC`$o ewT͏st@楥Vؽܚ{&^繳THp{O$˽vÇ`1EkA3@@ hYÇ&&& O@g0u/:p*Q   #@==  @ lʚToO*A,L7.A@?_^^,>x:Lc{#- YMCB)#^jU S{Kw{5xTERhB`X~*G EjWxZYgwW̭V8 }i4 )b ݵoGƠ<ߎ5Y?$Mc«F-2/Ý: 776E+EEb/o~kA rpPw < s ۣ-// 학J&w @ yniTTTXB]펩uC*;XH9aJ`?8~]?@h!7+W0@Ҏ}@@@,@=@@tJZRJTf~徆[PP A) tx䉌zNA?O֠y} o+/rS +3պKJKZscq Az K?NM:By: bTVY(`-50o+++/`HC dB=t-kKx`w 3?+"l%&&&A8Tb_>rjj*%   q p   UoBiX^^}Gk0}J ࠸JҫUWI_o$h*pFk'E_"nJ=" [@kOj,&08TCvC&[_ߕaw 﫱VVWW/e)).*+4F/\ !Ni00%B-!+Y ff6eE>gmX!< @@@l WF@@D@+PVO@CUwwwSq֣BGDCxDъ^O|XfџT\Hck=!,t"J'UׇXv':DҲҤң[Vw@)@L-53;#=5Uu^L Y昪===r}9ʉp߁i?{w~vWKnInL0@83 Il 61x;a N2 CnuZJKMV[Rުn?Z#~]〰@{LI_)΀ih%@@@@4? ,"  oƍ*>e!Y4? hPGD E3jp{04V_r?羬oxo`ev_RJ _:ex&fPzSSS']jN*Yp-Y[ZZLߛ%fA$5# @@@8g  _){{oo/xi5J3f Lj*k\ h^,}_֊we~F>!릓uO(X@$\emm-ԾkڞjE72f=4@>T$1 GN+܌e76ğ@ {p{zQgWH6~w$èG WPHd Ԡ3>sI% tЀ51o 5! @@@8g  [@/--N&W>}jfJ{g<<\m=с0e'7Yvx=)&򻭛N r?`݋hc HYi7ꤸ8 ΚklHXy--Y=zIP׬*K6@IDATe;Z@bL]~䉼 $30[LA^;d'   dVz7@@|#]3SiUJ^UT)Q@okvkikk R _(m r?>݋k0c *+⃵chDu$\|-{rZѬO曛3! ~(5*I}{, ~\~]~yb}u'fqojjOHtokk+^ ?@@@Ȭ@o2{<  9pޮ~ 㔽]yj4 ~/Z\̕XRϯB? 7Km3Vn`ُ`ݕ;gN_I)^]kY…!PC3A!H8)..-ePHT 9(p]EXuֆ_7:@:YFٍϥ;]+]2Mx@Qe@@@2'@{,  @%S?`<TɊkzӓvvvӧnk濺:[*JZ狟 NS?/e׮H^8Tr?kkkuW=An Aoh-lmnr`\vvYxctƲ$Rx50X4{FX XܵwoGR   nd}@@@74RYYiIorr޾ijqkjjLu eXq}.; fi|wO5,]5L5qlA:euuUݻ'wʊmkkko޺$) 3'^.#F*;urYZZ"4,% =)W';3>Nږ 9(.I8zxtFgLWkс(jD` ψ 8媯!XL   pwoEK@@|'4=k;%}===G  {)Eݔ厛6A`uuUܾ#?ay*{‹/HW+>܂5𣀾'ooonƳC%= thI vi^zܣGo50t }=>>.;JANYܧy]9ųWu    @@ XkG7hp- vZrp|<*Y;::L##$NťS#   @\0`s@@(@ɾbt>itN{{{ϴ/@4K m\=!:ţ%YwKԒ~tؘ<|PvvwA4еU^uKTPT"36+KHX:ZmԔlnnZYGsNYs9}ƀ?\9   uܽ~  g8>>#uB f5Aa){{OOCȮ-LG ng(,|KrF'$ ޾LLLȝwN͠FGFʕ+RYUY8%dDB4Vg}hnnNglm%}|!@p{f.S(e$둓 ҳ#9nۀhJL:ΪFA@@@ lQ   #4]}GoVPfkCW ^p4}.%=9Qݍ:âq    p@@_ hY 3XP]m-tF7N5@!7 -3vwwMj ~l75* i)imvN6jklDQ;;rolL>}*T*ʕ+2zSR#PU@ёQNEȝwl9;_е(>=MD.]$XǏU,#9⮁Bwe9Q~3-R@@@@ }7  xV@c2R){{ooG s qܮ7)J[~J$y#Ö߽gqH;'/:88ɧrwl' V VQy444xt@uM\zU]&555g,mw-)E-3"֓bKښmia {ԝfPt#'@@@W  @ ֛f%Qrڲe,do?'ʒnMŹ_FKm4$Gk-W rOm:ܾ}[Am}}}r illdG%*@ u222y޾sGfldGZFja F+zxd:u= ࠭mT  ,_/C;(so   Z\_  @eooϴ7fښAԀG;Pq}TR]]-PXr ]8E7>D]76 ׮JUe:<=3#lTN`{k[% Nen݊u##lsMrtffgm< a1_8ͬ4N"   Eܳ͡@@kf~}jF2k!{Uu/ svoo% lB:V/H戫~c:5"IcAk:PѣGNUnݺ%mmm sB@u޼uSB]!ǿu:Ng;z8gbsvuǞ9VljjfSXVxF C, .fpEg`T     =-@@֖?ciiig3ֱ|Ύ-Yuut7N@L288fjJEHq7eSI< ؐ;'Z02:2*.]u5Ok(7\777N,"E97<dp{ }g,kkkIg1c\hwi,dq7j[:â EXF@@@ m؂  ۵Ý:ȬVֽ"&&&lNO:{~R]ujDJfwhjr*8r8vedtTkm۩@]"X!r)/+f~I| ԣMeQ7xO>H^֐ r ]g#{zCgXd]q;    5*    &YZZ2FŽޞ-{foש)xQ@ yk, U,_@mst_9Z[wީAN*ڎgm_X\pܑf,y󦴵1 PH r [߄ܾ}['%=Nlj?W?_677,bdTVVwOiXfc4ng@@@^ g  >XXXe"{{)swsss烃T.nmL3sh,Y Ag3?N3Mؽ174fm׌eeeT *Z\t)ͽpxx5XZFj&{쉝3 ^^^6Vg;}{#NыE@@@<%@.A@@ϛ;e25`&A8`0Hv+^8>> [wE3S'K?+7:_w6Y#ܓɸݓc2;7 DD6FG нslnl:nu=Lp0cH$b\ hwvkkkrOiEQgf    @rܓ۰@@ h}sxZvڃuX2k@m rե=nQE~3RX`![&kD{2`w~ 222" v*@;44lz]:rJK@ .7nܐ:Gy{'6h>PIp7/wg\tI} v Eg3 OfP 3Q)    ,@   xV`ooOtJhc,pd5ZؐsM[[- ~؎E hԉ a4sfpNkZ:~}:h}UdrO&Fݹ{W677ߨ4,uvtQ4Բ @yy\zUgߓ{c27;W{rbsѣڤ[A/_=LG"[=R@T[Lx:#Ž&TЙEgf-@@@p مZ@@<+`:ll=1=t1ʩӢ[EۻU,HGm~8=+?-wpp > s(Y^V.#F1y"&z7ߐjAwvfvFim{Һ=,:3}c(xM@h8}bβ]iEN    0'  xR@oxTƢSEoee􀺺:aDX֖͙DR!J:]^_rFu6;NZ[[RS[' @*22:*ݡn'۱Yܽ#]Hv\dpO\t6fsh(xI@?{hx:3Žμ30hn2   ,@{!_}@@w:Nm,@WHyьB|^8eu% Iuu z)np7hW ?N ܗiiI\rE4ض @瑮PJ"hi}ͳgyPAp?.bE{lZ ;R|m]eSw&dO ᘾ@@@(\ s  >wc)YY h`KYYmzxvȅ̌-[eetww;3@Ywz,3{ﲛKx) w255,5k{CCélDȜ@Uu\q]:;w:0/]/7+] ~^\4772:{ r %*љEgc0Q$31~gM`2   *kp  xH ۦnmmMi.{+N7`;::ȂɫUڒYfFjRJiTtoOmljZB rۗ{cD[fjhfT  @vtno_\zMJl9cwdks˶ JR̠vg39cY]]ec\})@;zXd}}X2   pi  Onnk;%=zs= 8>> BTWW@KSSӲJ4v[ )}mmMݕݽ]["(#aȾ@m]^Z#,..ڶv]% b/b/_FBEt}ΐGqH喖[#l@@@@p/ " W@,6hڸe- ޠ-//7 ^,TVVS!b䊫_/~UT=]gfÇrl VSQ@ KիnV׿듓A:υv^ج/Jܵ}355ec\ 8eAN*岟^?~e>O Zuw   ?w1  @ h\foGZv7Z"y wcA)*#E/~V\us&ǮڦjAGnbj;@Lo_o3= _X.r_;P&b;aKlecssЊEr+3Yr%ѭ32   opw @@5{vz3̳Hf⢩7ۚ5Ԁ,:=p( IF&/G]M(߂wwvn;2w~O( GKEy;;rz[cUq|Ta֘:c˶GL:/hqM`,3Q X N#-@@@?wwY9#@@|%YیEo(XN!N)f&%R BYʬ@{\4 ;hsUT%]I8ruU\~J6*@ c^[' Iw۱33#ZnI_bP?XLO6#- Og3M*ƾzeݞ~    .@;@@<.4E&O![__ hkk#p8W$\3Kuumwv#ԇ꠫?Տ~U[7D`;@ .]˗/KQ_kـ@|"ϻB]2<<|uuUΈv]3w(b i46@fp|rpp 3"efwԈ@SS롱0[Qe@@@BN`?8@@ XonA|ARKh fd 춶aEUIq]}Wen)}ksK޹kYVZ&#F}E  zqTU?eޘhW ^G$LIggk3ss hlcN߽0ypAƢyd7   P@@73"= (.IgpNI(2/:55b, hpΌg,3Q XgkswXFK@@@K   @ 8ML{zy~~Hȑf`f+**^@Ziѝ];xkU{7'&&D:C^*M#䉀gvfzfF&N:Ndl(g2YrH 8}b|Кݚ :/NN"   p_*D@@ NY% fbck@cccA?'})穱twwYY@;&\)Yx3 g3z Io_o,P +vv5-.-CY;] ~9IqʃGS:𣿿߶ uzfי(\܍emmM"e@@@ R4  666l7ޞޕutt(ia%W;SƢ0۰|Xʇ]?Ϻj붑Wu Ǐs[etdI6*@7KuUdWWWrcm *%0wܵsZWWg,,,XA W]]]C[ PapOϢ    P3G@Ғo---:* X @4ӧnhFFoJg(禬}e?:H)p2X)##d @ kl4ؽ Lp{=N'P:={ϒ}zz:k=r}:C6 plmY3cqNиe@@@ Ap9G@@ @kПfm4݉e۲i:` X\\ͼh,;nܸ(+=1M)>?E31X. t쇥|貫?_4 5mpQ} /:J|=zd{  oa1+) Y#B  ~'D@@@ pϳ  _@+4XorlMT lmm57d LMMٲo32;#UJQMw\ME> < A`-  nU֢ﳦM[])؟G֓?[gs];9dYܭ/ y:se,Nh~k   }}9;@@ Xo^MfInYMoooez45`,hfE}~f`$(RXsW/O"O&]>@IDATMQfӧ.h`455ٶQ i552:2*eefǏm m 0 l10PFpxhe=E?XF ',::YN:擃 So6   @ C@fN/75N]E;;Z],/.XO^~%W'v-o}Iw\OQ&23;c;tiI\zMlۨ@@@2(##R5_YYq۬X ۝T ev5/8}H$чЙ_w4ـN}ooO=V   yvA9@@ hƟ uN4K6\ hFENsG WR-3Od]?j{p䮙=z$KTWh, ʶ @(//k#D3ZƆ<_N n?(7ܣiX g Zr(**AXsu&3vN.//   @^ D@ua9h~g^:eoNqBifm7ձ s#˿(僗\O}Ut%]>|R]]϶[^QnWh V KSSmΎܿNp +%);e͋ۖ)[O ӳVai=j KVUUIeyvwFK@@@-@G@# fjnn7̧A WĂ(5K6\ h&Eͨh,zӟ",c{Y)r|c]dl9 Dv͚k-իRZZj: Af;ߋer`Np)}|YjlGQ@6s5Qδg,}۱Ylnn4/    ܄@@8M9Ғ^4ա%folr%M`͸HA4~GOkƶhT|F]kpĄێCCC زP )}'===]x;6L=4TlƢA+++*ȺLzdqw ${?Z"  s-9@@ X5/ffrlkksZ"pN{{{E)YZTۏ7d-Wm*YHr% N{@3 hPe;;2vw,>˺LFFIyl'J xO pzg|HA W]Ψg,:KHe͂_]]mjFc)   t9W@@ t577iSR f6fWZZjb hP4aY ?X{PjbnJcY|4=Sӂllok޾^[= \" nT r zD;0H$"sss*ȪfqVWW?L2ٲmXF@@@ ɷ+  R]OiJb_\:4UsGGG!pjSSSaQoSp+ϗ_]s?Yj{F .3V @ۥ!ۍ\Rģpupk@,\ `#g_nr?;A~@@@~=  @74x}}}өkjj9C sr?ͬ)+P\S-_UUzG>%;ڞ_b砰Lϲk @4ݚ:s J KR|4u를\L>N`Z    'Ʌ4@@+'ۦLMLWu*g6h>33c;LOO  T ^grw>\|{`jUtsٳgISwvy,k(@\ kNE_&&9=pI0 DcYXX  Xd9К06fmm=   dF8@@,`>;< z֛)zH@o[s2 ztŏ owM;xwU{4 ӧ)Sc<rwJ;@L hpĩڒ~Ro,qt>ՙuB):VȦ@SSoE;}>XNm+H_@@@+`V{   5@[!M{? ܫGA tݝp<ozWgqWm4gjPna@ ɂ۝^677AURxbss'S'mYE>Sȅ wc *JCCi+@@@ ABʜ#  gvvvdג]/a2\ h@ޞdo7qrN@ ݿ)jOdsUT&:(KA+nݒJ"S@ ɂJ2gc+}Q wuu.͙XA htЬiS X#YL+@@@|.@/ G@S柿b{oޮGb{rQ?==mk@v (/~F*]BvjIY\ZmW]%&D @N n&IW9X!=2gjy8hl=Y:dq]U*(h{N:}.PyK9w,#   /˕<@@|)` ڗNk0կFԐ@.ޞ =fŕ }^.{`z]{K+ܮ*ܞ())!b* @v'z-ՓhB %Ujɲ?S3#PTT$ֿͦHTNJ~]Ƣ}6@@@p+@[)!  aM7:i#+&!zpp`JeoBY*4o{Cio[.{{'M?Ņφ< nOl =!O@l ܞSOotw$VO~g v()Ny# uvv2fk;)/7 .Hk‚ :t^ꧯQ+++yqn    ~@@@y֛VxxiJfkV0ߟ$'͠g niiJߜ@ۏ$5u:yHjy>oY__ܞ1A ~"\Y}ϵ5K(/(N D,;:t2Nr"XS4ng@@@| ="  ;ͶdU]]-`w璋۲UIyyy.1 \W=?_Bʶ:hcjjN IQ츧Oa @&ܞ8~_%VO~..-f@II/]O;77GW!D֖mVCv7*bK:+XA@@@ Nog    ۍ(>tՓyG~KU@]ӹldo7ruJQ^/I{-?m+W nO< ?@2-D/giyЁJ3U{laghHXɢw^dqw^VVV   P w><)  ۵N7~&fӀb 'kV T J?Y0~=r03gkߗΔa,JWۍeܭ"#W 퉾K}}}b:Yg!Rdq3^) pƢYܭōYFtu=.~߯Fg+cϨ2   @> WsB@5諨|AA- *Ȋ>ޞjB~\9^[COI.ʕ+ SSVr?M i \Dpv@JUe?:ᣇox45`slU~ _TaSZ;>OFgYqšAgp@@@U|  g46gIeȊI@Z7IM` = @ [mTݯuuȽqYzOFQyY?mM\&  \Tp{JU0S#V+`pn=?gps!Kn3^?w^6C@@@"  p6559ŝS+w{ +8g,MMMRUei2-eՏIY_Cm-k ylnn300 UՙyNn@E'QVVإƲޏ5aٟS; :::L6Mu  C-//YI.PWWq:Cq   ]w_A  ;' eb @q7Z!p>wduJ޷^+!`⾷'Z@ wc~Gf2   ~ W# J@3mllAleeeEѨZ[[M BlHs T\Ч>צ-hL.IM@E?LXY@ @gzדeq_XXqp,;p8,w@K@@@|$@.]E@[ޜY^,--v٫4;l 8eoBCToiy{OmX-H8ۓt!? rVv@ٕX=9|NKN6;TуtvvڲΒևbd>&= N,ӿ/|iӅ~!W.]jfݝ]S=+H=~FG;1wuufsx(UdTfpG24uHw{    ׇ! 䑀f 1i#+&kEg"b% :Hekkt$}DŠJK@UV>Q˿v6rτ"@Ck3F IEuHE?Q|, Dc:0YM"dC6pheeEt% g,N|   "@{\I@@>ZoJP߷ݬӌ_@6fffl#{  GH']bA\ n9w>r"@|.^K "S)(q~xϓsSwXT]@kki::롩+''ˉ   _p땣  ި+eNuﻓRNSZg;@eo@><G$ǫk֗x?}& ES ъL(W3'p=2G<~cDl.yCCΎD"S+   ]h_A  mѬhbe7E3}c\P4CoƓDŠGѣGHr䪷[m)Ix_O FIͭu!p~x菓qK ,nkk3+Mu p,G$:`Z;Ev   p  >pt3ʧwvB hkk!{Uu/ ÇEE%Z[-O剪S/_ͩm2 L?@{~ nO(vvvJsssb5Sg횘 l65b{%)=ȯw=P(dQN?@5yw@ꏟS[[kvOD_@@@ na@@ d`0xGʿ].--NJȚm"aD3fo.055%:hof }ɗc n9|l!P% ?'%XaL9Ǐ N ৛ >8=Jk(--k}}0MoӺH{ c_EXF@@~@@zcnssO  'n" W@3?[3(566skv=tKKK{ ]@X:5SZ;qAAZB)KbOW÷dpv_.F+/ `eP4fan2G/k~ad+E/UI4X?wK   0c @@ꪩO@@LutPiCeeTUUXA"4uzc ^Ь箾eOHiݬ[d7iX!=X| nOh577K[k[bޙUIi-I6IuX 2  ")*#3&ԁB ݛi5m4{r{N=.}{{ՅfÑ0$Gn=TIhۘnF@.P[EN,PŞq @ @6ܳ^@ #`zOa !K S'(D=q: ]veEEEb ̒"%s& t]} &KNY<"`@)'0EMRQ\;66M+|!P|ºj3zr[GGk=c$ߛM܅AEK! @ @ *@ ![{ 9zcN>9 D5&RM@'ըN8N\RHlYͯDQ,W%R=T)@j 亸]"+z"ѣGe_=}b,w=Tw".؍QטPcH{.N,N @ ]@ SL9s):脜99c 1@{{*S@2H@dvӚڌvgVsxc]+dbx+9qS!$@>J,/K. #mrH0%x.=k{.Ұ=c$n*I p05i! @ @lh1m @@0'TWYYE=LSu"sttQ98N^ u)O PO[nqGjhWZ*Nyi,᧟Ϋy= @bI&^ϛF>uڰW$((*]˦UXNVEkt|dS=[UUh9H$@ @"ܳbT@ "- u p,:SX&;B*'!7l7ip4;w!C8WRR"+VwH4yţ 맾&;"d<@#0ƦFעH]cB9|f/-pW^:^;ZeJQu"cPcH{NwÄ $@ @@ pz@ %T`7sɞLoSJA@CsIG vT+WwsgKӏob_dOʛLܓM L@>ە/_gy޻gSBR L/YX<ٞAwb @:w׸Z:ڒmu!>|،" @ @:ܳ`@ l!5=45Y$r@ 1k 9͛'Ӧ QJ%GJssŋDJLQ"֯߸:J[%jdCDcMMbwq{.]lY8e^ӌ1giӋ.՝09f3bڒMsa8"C[!@ @a·I @ $0'***BMO1'9}C$L@aw A#0f ˷m&*z>4Jtdz;G\r:De" @;sLY`3 ޽[\Dd@Ν2ҔW;V"Y|LyC o i^cDf|{sܬ|1? @  =."] @Qs4̜lr$0'/DQaHqTB‰A hsYc̿Rʗ:c6/^+o*2!rOUʄ voN .jG1];:d.P0ݏ},s LcͺcWwڝ.͢<"UUUs9pL0w$@ @lJ @ "m9ٔuJCV^ @:=#T(JEIVBH'F X";oz1{'#DiNu,' =fٲeR4ȑICgl, lĄ%3ow|A?O`َJDa x9zMF/T@ @@ p5 @9BDRѡ/Gnl2e7srӞ1I@c:,++m@ d׮]Z/^,FL#Mw*NqdWEgg*c]Oa.D)K@@ܞK$EŎJ=*8)"`Dz|lt >ƺng?!/ZxlG-)  @C{z8S  @@Pvww:$gkm̙y@* z iΝ;]Xh1sEcm+%1D~y |!=WZF/YUqKK H.?'g|bѝ0@EEk51t+3 p646B @"GPp@ ؘs2ɑH BT/Sm @ =ĩo2222Hpο RvzG' =7 %5{ZqS P3watommk.Gǃ{~ ܕyJP$< ck ~?b 4#z B @2O{- @ix!7=JHkΞ1RE"KSSM&˖-ˊ]AY>~tLGwKLg|U9y@R@@s@ Rdv:GoR4Vp鮾xEe缒=ȩV -K\ٷw;qdEx^h% uQN<G;S^-((!nإ=c@ @@ pUM @YG$2'Cij9)إ >88 RϟLΊ$W#~G!'_$9"$8@ H`54Zǃ ΔC7~uEDXRu'M5na @ d rh' @@` Yە 8gN"9 LLL5kV3 nngPϬ{1eY8d{WXk_zLXA0DA H5&X 2msꦭM+(^5]'FGcɇ :QP71tn:7<O&ǒ݄l*OM &3gtTcJ<9x*++# @ @ `,4 @A"`NGAjkP2f z{C; t鑮.GŲ`G\*^q_yi1214,m}TW gϊ?"-o~GZZBfN>猎 P Yqh}lt,"Zt)*9vSaL=Ӌ~oh")c[gqie1b#nϮk?{lѝ)uuuՙ֏wK;=i:fca签d8O7~ow0100 N1@ @@ +D @M@EJan:yE'ʠ @>P1kssˋ/V] Y1r'cZKO_³%N="3̥T480(C?ۧMz>6Tw{8&5]eRVZ&e?kx,? n뼨ilڼka՜9s':L!00cܘטÇǀ LӅG|3a@ @@ pU  @YKM/ ~[WTT$ .{FNѝ#Vq "dxpO.A t쨵QhwwwNl}Ùc i @ 1r6P @9)ؗޮg p͍@6GT@)/_}ݜ?" + {K GyHN*H/+-2)-) U[ɢ ڧ\T:22"cc!{X>4<x?v/> eQ2 ?w̙3#X njk͛'aSQM.&gAai  x資.睰ܹsA>=TUUIWWW$E.1@ @@  ri @2H@BL/HXΩ|X/'0!\ !g(C[Аw8_,Ő3U?IR` kb܃r%chpHt[vK ~*.+qqIIHlbj24sl߀9d>H^OMf͜WTzRCq{jfTnZ$۶ms4c};vTp`/0=sńg⫔@"YLںX1lS8 xÎ9s漘#@ @@ pEI @AޮFڍe\x8ԻTDÎSKKKe| ,WdxN|湘]rkߔyә{:ih_SbъrK=CfT U4 :_uu;]oѾ/DoE2ma١:!<ۓ2h%{z/ﵰ}sʧs.  ]hY==]yD͊X@ @ @ .zM5R*~ J(S}ͮ܋/iӦ!bZi4y;ء#1Jɺ52mbMgD=y]ÖE2yDଙ&&eBh Sͅ|Oܚ!!zǒKq{ry4HULe,^8A<$f!yAw,)ɣtKy&lz!p^l @ @kC @L@=pn^[96C pH%<֥ʆO*UvSzoǬ߃WL3c☰t]iR8+XǼ|Iɠa*dRA~Y+^TRUU%#PRR"uuu]EGCᨅ Ⱦ}BC^g͚%USmg/lX(]D`/#P;:3!kYM}~^C6}CMü eGGG$QCtuY<#P8 @ `'pA d~ {+"(sQۣ3#uBiS/ 0U*&q"Q*{K/dl~iЧi#G%A8*fjokQdVWDPQQYi2P E*0jrHhA,o*D*nWou&p  wf…gϞH/Tz/"qX41{8jˇf,/u:uvdbmޭ&$^c}rf@ @@ k0<}'{~_ g]+s xx%ySf筨p/Y_u@ @ pkH @2@Rx=~!LfkR2z)B?G7g'b0-5g_J[pL_N}Mw&DS'`n*(s5ܹserIQTpe@II/X OX/k׬yuzU17?Y6o:6Ff'q{pM:Z ,\Jfԋ;^ϔwq]5dOcUYY3 @ @&@ 0'T]PPvg&")--d; 50/nuMX ,'Ma4mi~b)3b;>~-_"%Vbqoy~;TH@fk[k  0QuuȬYDEX|״Itт^#GL`/]SϛW'uuQq[=;w8u0$|g]|W`zD@ru'"7C*D7ǜ" D(3;'}ұ3#8 @ p.oXh @Hرc)qll|&$l{"e ʢE^G75 ELBֿ ݽēN +++'m B}$ojkkhz;Y ;P`}'E D3iIѐ昒>S"֎dMgK  @ ^˛ @r$Qt5i]`Q@PRꅬGN@ t𰣒:D" }]=Sߣr膛|D&DngyVv)CC +W˼y>)KE?s̑k5kCe`r޽SOK{{{ {ĩ 8@p[k#@ 1=D ɽ244IDB'q8:E2s4I@ @YK [  @@?ňc6ivŐ _zzzDEp2I@=8v_ietmwʱ#1tZpz̼oy~;ԫuۑ#Gd~{復Fϛ/e}>| nبٳ'$Ua's5=[\zڭ^? 6_?_]M \M( m'ę(--"}k)s<.ӱ߫`W:;tC=jާwuTUUظq\}ծN:$җϖ+Bi7,MMMp:ԩRwY~ s@ @>U@ wڱoYx"2@T8A M'7.SϽD,1ORl\3o&2Ƚ_4.k,0h-;=#ò{ni=*/3g$(9yY)/A^ܛeFnG|L/ K@;a=X?JcOKʟ?Uc'!DOEUlYo[9s<կ~Yof;Ў;"]n) ~u @@2 0L@ 39h=e7'u@'KbH''vkOy_'ȱ^_3),rpU[pgsѼY6mU>w\9azYd lIj446 '"^/[exh+K!nKI"GؑHIe gzRA<`[t^cF/T?UxL  @2K{V mv@ )ֆzMhȈ ;j6'! 0z2w;SO='ER3}2gt|!oN@&ZZrY䮋=t7^ٜ9sdeٲeRǷ0m|QQjMp̳ʁrBL=oo:n?9DZ7w;}2Q }EQOb x!֎~` O'}? @ &= @H32ɡ47+ձ( З'gzo=.s;4@;[;?+o2Ƚ_ۼYteee.At%m\L[T_Lz,{~mWW 9Zv)Y"覻n™վ9r˿JʛL&rW17m$}Ǝa5rJ)(G _TtҐj!ٶm[߰쫒 fBܞAY^u%Үw%nkmsp(C>6>Ov$"!%k *ssarrgM-Zh<~q} @ $=; @Ӄ9)fZsL'U|A s)9sU d<*tC+չ`=u+(tz؝ԼtB @"=@@ kR֜ v2:srfPk)؜OYyo>W˼B'ȱޣg*S6,;w;v{dp 'ȼy 'xCL[~5>>Z|K#n7,Dϟ8U;xp8b -2v5";S A qUUU׸9v&>ÜqjG9"/^,w\$ @ ]g @$55)&A fL9ӠÇ2k,WH *GDr|R':{t|3"nyf3 ?iӤ; H_ ·ꬅD{bv{==ߏ 'YMsN?"p"E\2ܵLdԕ+ex˙;VJ_Gv8묳 ~a?ݑw]$ "8hkk.g֡;477c=&wΩ֡k[lv-T4$*C#n[O<<䓲m6  @ 8G9s @S"`NQ)Uc'̴{^i9m!hTsHCE@?]c7Xv;/k2} oGƭ2W̛ aVkڙn~{tF#ó~766JmmWmϓ ʪUB{ȰDowM7bGz&3A= {qfho|+1U6wxUܮ<}V"cұ9s-"_{{{%( 5N===R]]e`` ϖ7p}/$h=nr);y_oO}*ʿ;婧r-W._| o]WF]뮻Bum߾ݕEWJw˫_jWz"{|RaCm9"O9 @ ; 8](dgh5 @Bk렯,- ɢJLf:0$v Y'2E#Jf΅$*ʥǷIaut=[_y3),rTbl=*4]Emׯ:lR[ٳLJXxQPʳ>_zKuTՋ Lɿ滘z5Eɯ~ו;nE9  ΍:7)Ҕ1kGy$sp}EwqZ1gO~"~G? ySӸ~X.2bxۿo}C!MS_~~f~9SCb}/q}*袋{1J=2W׽uru׉c2;vqn-((@ < =.2] @:\6'ɠג{%̼*Ͻ^ӣLv vLQE&EA@V{HK7Jÿ~C,%J:+o&3QC-Z矓!-Y$A;] $"Ǖ+WJ"WU0;wfD0uIH"kkj%̌y}z3FND'`ϙcQTȈ ;wO2::,GxG8Z@jdQ퉘>s9r׺iD+O!@򋀏}  @ݶW=͜ q,! f"%PAU3cqM1+뗶>, \ͨ?"[HzrW_ -MTыzQL0˖.ҴJ ,՛={D*uuuI>Q!|Yy0`P|FQO^cԼ ;HqvX=j8Gq$/j4Hc9_n1d'(:%O@z{ְbp|Ob~%D-nݺ{Ckkkȫ~;ӟ)Rw?,ꩼֹ0:|^xYg!o|NeC?/~a/&m&?7g> k׮+Vڰi&y'{U,uOuiYv\pzj >tڭ|ߏڠ_ע ^G @@~{~\gz @ 0E^b.ɠ)VSO0s DvVUU%* j=gSh}* @͝3kt\Y3WVTڢ"Vk8vl޴S^`yollq{'JH/_M 6?Y 3_2ˆۓA2(-+uT 6l<9 [+ޝ'I`َ<===.  &qtE}48/1xo LKNfs=k1ܧM'L`4]pH3q]h?,]MǠ^ࣝgOSO24^|gDk|R꺸6l`s 'l!a|8MYd5WwKJvC @ pkL!@H@^}}}R̉3G"s2E"` UhhS@oo{ܹs9N{_k% ;j7ә%rvxns;˗KӢ&c J@w8nqR4~&;|pe;vr["㤤ԕFA@qszqWAUWWW2ϝ2,!\,Ã{,Bt}nr$nDSx~S2O5A ^T{4Sa{+_)裏}^|O~uqzF.3bկ oy[d޼yhr$Ss `rTv2[;Kկ?8!@PYxh2 @@z 9)fNEM-Ca떍-ԿMӋNxyd`hoow5PX TZ2n X.eVשw곖w7ҒRYv̙3[2A fX=;~x=s?'Sꆊ۷o*q )"PSSZޑڲKӬw\,~MWtM-WgTLfeU͝ګ|p'|2~gG޽{;±V;ΑMEvgy%ݯi^?N=̾p ~khhN,ns5OҗT.,f9 @OΧd@!@ $PB,kk1ϰQjsIIŁ`:;7ȮϕIe?[9r2J\\Xuwz[~nNg԰A,_y>a~_,ZH*gTnZzt_d]b riC1٭CtL`zaL cc1M@eOxnv"fjtбPSǦ&ڒd$r4P/wCsGyDwZq}E^&xN>o<8J,\БjzpwN;iLA|3Y:V:I\cu]'*9SxEBU  @YKY{h8 @@; &ށt5(wefM kɦLy&VՑ@FVVHӏoihՏm5y"ʊ W{TXsfOq>6cQ$=WĵkJI5fDg@{h2s!i0e 3g:Nw8} Lẕd֗+ed r{ 홿..8w/G!RBdbi_m:>iٽ_䚊]TرCԋi%ru.Q0r@yE;~K$T˖矏* FܞkwDC`ggtp*=9ub {gϞ8Uq  sH7lr9:@ VX!˖-TOWX _EvSg-,׾_TTw5>MFqW0 "IE~o}K^t"Ջ>1DD@ !-E@ @ !9P9|MO$cwׄ)Hcs*zk\(3^/txkv퓶>" LyxFY@2E[l>Kc7V`=:m۶m3ܞdR7zjٹs`n7URRZjO ݾ}#NEŲfqD@ 9YmC׋z>g+^cc1O[O  {K1N]ȭع2}Pz zo>rF}EU<]j ]b?1]4h O>dG tQիq=#-Xw=KO?Xϴr-/~ y'6'r5ׄ֍7`Yx( @@V@UB פOCsr1mmCޮ-MdOhi68x𠄷x3ԃ{⯁O}$W4yk/464$0#nw!!"@\ioowSD%jexp(je.zZAb(t<]d7P{:H73TΨ\x:Óf&"P[\7fy'PkPm繱chhv7|kA ƠYEΕeuc9a:T6`G? eÆ x$!΃zK/utę͛7:xnpxwd;է?iٴi# .p +_)ZLJ?aGdHM ` @E{~]oz @ 'sRǜ􉳸nLgʜ7L/|XY']v@v0Y_]ɴCQyx8I쨊L3t.4̅M^*6\r >34ELX-k+VXA`*&M΅I(X9s#@(!M?Mv~&)YwՁ>ly~ G/X>@d۷o*{~rj뻢@:1{:PN>dy^(mmm,>.\KݧZȨr|ߘ_r \sMh씫:OUWW'G 뼌i}^7@ __כB A>>k' [9`=dO0iٺ{-ٔ)N@̉KޮX(]T~_I;f6z<ۺe  **).qũO.,D@A`2q.x2tߠ܇-OJ⮋3Kh>ZA_PcTߕnEx!0zFKN\:kkL4L_ 6$3/yK{%K%niFi8.sj*~YOOOKܮnݫ\{^'p֐'z/q&w#*O/\4}Rop`Գf4 @y@{\d@ IJϽ [xp&g2 ;Bd,@WWI쎨p~r_镶?"‡ رC\[t;~T2͈݅DL&n/.*ukʪl3*)a}w_keٲeQT!>9yD=c q=@IDAT;|…SO=U~_{fN:b絮o9EԻ#<"*v% .@z!yf60 @@(&t @qЭ9U mE$"__4FcHc9D:U)\ӗD ]Jdt-x" &SO9Id>sGGo9S-_yәIٷ8׭ߓ-ޚd DYs]^m8bիW 2 N>{I' c2+=)re].ޭ g{QϬ۷ow\#I@N;֬Y#^ {y/ʕ+ }@[[[{Eߵi̙!OꍍI[Q?|s޽{C+^ QzL--ȑ#RTT$ 8t߿_z}wj]`84IǕ@ l^Z@ 0Dyӕvݖ<,n׶,VKhՓ" AVX![nuP;z޽;GI &* u1iwwwމ@ |L=׻Ѕ=t)#La?u.p7߁DN&oذ!+,,uօ"}oyߘ*|0@ LF`d C @ 9^dNdPi^" 3a$Jv2=g%.K *iVVQC[g_ySKZ N5|7o=*tWVTTz+xa.kW߲?OY\1~;elbl,V}P1`7A 9W=kʞǦ xA!@ s)m @s2ǜ D#ׄbKS)~IkRd̒f"/*++43[wO W{{ze׮]6Ϟ=[]Da|BI q{-~~}8` @ w@EvScy&.8IJcxpOzAA 1)<F3Ǭi&Ѽ-N!@ _!@ Ǭ둑Gd#HS`#RQ'e/߆jjjaIͧK͕չi#2>8+3 ɶdbbQzf_l3#@n!"nkhl9s愃ݻwKOOO$@WDʦ=Y/֢A $`IcVɬ+r\ @@v@׏C Аdsr̕!#̉/x 'I>3)"]Q pϟ7WG&g_yI=+nٲEtaJKdʕ2m?Dvz3dەz(^tK o.YזON`̙RXx:thr0g̫'$Epݨ"w $`IeRLN9& @ fRS7B @ &q&{ہ47L'M/JEȃ\4 D@ Af +,|%4 O+ )^}s}MF&Gw%#]Tj*)..Dq"sH=FXBJKJQO]"wsa#n̚5Q4`hȐkchXL2LJѣ'zorfHٹxs'@ @O{_Cz@ リ*d=cKK%\C ;Νkr gVKӏo2_=t7dO;Lm(FF\R|q@n!/-ns+** -8ѿ-  Jss=cd9s\EcRM*BZ~׻=cKkLk/rs5.3E,իM @ dsh) @@ ^%%%=7L>X#`J"b0csWH-_׵qi2 }--,Y"UUx"C@ U0ҲRY|Lgg=cd@uu'wy= s`}&21B ,LBkLkj2d 4 @ @@Ac @B1'yΠYPN)=4ݑufzt;?}&_閶?*CǛidw'`TUO{ww ʫ(ň;:(  . :"b縢83("kCC/MwSU]{UV嗷0#Ň̌Sܸʌ8ycZz衢Ӗ-[& A~(Gn/[.Ye+l@̗/^*~ttT\`kgwKg9sM!q͞X,`:`vJ }  D@tU@@oDƍ27q,%`:u,A`ppPfgg]~2e#V+.<[zOx:O>y⼏xJ[M"勇~Xf23Ӻeƍ}n^ G] իeѢEs><uThI5{mTuB-I^o+6h U=p};n3Tjg,gW{ @+kB@@W;_֟@@]vvc6+ƝѪۂz{{#Z[g3C |t.Ewg==eWKS=Lo__̓^ X= Ib%n7%vS}2_Hijjr=wg`` 0Rol|)Ja+{OUIMo|kSp),veR}3ً   @0J  1ݼq} t剗 tCwwYY[5$碃XO@+>ṱsdfoK2Oټysѕ+Vŋ wEɯQ nϷG8f?.ccmVhop#n?Wd3V0YgdV)Daʶ] NQ. (uC@@)@{:V# )EټpO:aK!*j@kJT箒sOw_&Jt`˖-d\z{zd}An.y!|;WX!K.o4_5_dafY ! -+iܛZZ+Jg'p7k/ ڔ_=$}*G@@-@{#  otttHs3oKQM:MRJw(iG&nn5eIX]SWv1Oiu={ u. |pOrwqRp{mƍٕߜ9>1.۷mwc0Lp"yod ?Im:ݔV]('kS_2[^{^[r&   @DoH   7o͝5h/!fuCoYEfE =ޘfğؔ 2_Jۺ՞:׾)m>Go~xґE#ND1ݴ|QiO{ZQv 쐱ѱ@ , v'~Lzp}F/-Bi0k]kX)J   @popP<  @Nj]mmmbXK@9%{zzʞ|( +%ih]H6| -|şaʺo˖-b ŋeɒ%]:9(|szz{d5f͛7ܜk?%п({D1VٌqHPQwww~l PՐeO^Kzq    =RAe@@-`lEqc]DŨ[@9L; ~ 4w #_b9bٕ{A{ u.&pj:A `Qn7c5wP:s_hp94hWnOsEcf-[ /^,K,)yN(y-%|zz{d5K~7o.zJ ,_ٌ}%ibsيiHPWlרlJ琮#E ƫ   ! 4  Cvvs' :ݔhy|M(!36 ~ eI{ ;_ri[LFw ˷˚ 5yu#Lfo}l … U~ҍ`7Z+?';K{S4l(#TcUL{Ԙ7(   @0J  1,~ܺN X .Nez|X*Bt]{W6 Д [KۚUR(538ZYY!=:}Ԛ$1=WK,ѱ1ٽ{k)$zwSoCy7/.mFY!    @{ h  LK톳a8@y=27ZYS@#,Xg䅀,zkd{eW]Qyh}*dHhoo׻.ٿvv-p!   ࿀+vJ  DM@nDލfaGT`4Z`tt ^Dd#5ۿP&/8Cz.dg*KЧK1GWL ﻯ(`[盲z;7Nn/otRٶuLMҞ={dmEޞ//UёQ1OHewĴ=" џgB3sD:(07bӤuvM}r~/*?T<"  kOnG@@6M͜rOY6/䵜%gaՃr+022j\sstwwfv7t/ ?Q~G*73#V[`}RW+`` WŰg8==-7jo:'ђpji& Vޮ6yaĴ   <@@H njnD ^ @OQ&aV͎RAS3ۙ2 l0A. 0&7ⷾA]Jm-;udsI[A==EM33p~_ {Y;fwμ63s]۹/-ƺQ3s@-ٮmEN[ ϟ@@@   @Nvv3 H#0ᗀ-Wy>3 r.& drrUĊ+}~@}x^vJ~c}5U{kVN2v~ J k~f~,g>gCEΧmU!=)lJOR@@@ *G'  @Cl7i􍯆V0bk/"A1-fR 8QtvYU?vM i](mǾo~W?>c߅@pg*WB3{KKk߮@=_3al& '*K6yu׮jJCZ˴@@JQJ@@L@23#*7go:9g8(/02Rg%-GNnyK/7|J1^'.X&pKC{캬 ^5Yܾl0S2<<\H ~ tuw]L6lꗖ{#0-3}J_ W|#  I =)=I;@@7M2O5s^ 6I1tvv ~ 2f @۝v??Uz}zFN{d-&GrqU:<^reQ]vc~ ==={*mx pY܃V܃NwڕnUl@@@ppכ@@"*oj1{{^W9@yஃʟQ* *D jt!-*w^ف]$;3%y.Xa+yJ) .t#XJוĸsXZ*?-蝈vGy N6X-N\ܗV_{S_K@@@ GrA@IozżyW/I!@U(Lsuk9@{3r'SB1{Y&S^2 A6k nԼ>5ljTsg2cNq/3g3tgw%خ[)vW:\l    @{  }}v+&A}J.R96'0::Z9E$Q```[ssXµ϶ќ (Y/WHeEOߓ߇Or%`:z{z)-- N`짿]w!dZ۵+}=083]    *7! DU@вjî2v/$<[-!,h[{___ŒJxcnɒ%n\.~4yd?yJDDZמ3yĊ]/ݻ׵ 866W ͧr^~Ki]]JKV]za$c٩i3ev}I[!=~=Jp{}lr1Op.{qn7#O2k2;AwG{ 6-j6}gĠA_1]JfoZ^;r<#r ' _B*r?+=o~yXZj K.d=ǫ=  @WcW}*  @"\l7qӼneIf#^^0[&ȁFFF\Y P@6djnD2於MoT̎2%9 AYۃ+eѢE s@oO+ɩDe$muuj7,3bG1][]q}(^0].bٷotw#{|guVuf3͛ VCariͧ[妛npI@@ ߾  > nnT\+]Nijjt\|M5}#'> .[6G똣5.?IBʴ)D%hQ0?R-K.ɧާ} G38c>A˂(<@@Hn  ̲idT2_3гkYK S˙_GGsu|07Ru{__ֶj%S=wGeO= 1LD{:Y/^*xddD\@Nɘ%UN%󾊠ZߙSާqpmeeb <r9wݢca;/3{erA7on-Iͣ-  @A+  iݜInJ ] \=7c1 ~ 0_SI̠5;嵞۝<zvjZvz>9X2M^$q}dɒ™Ž>/TߣOLNsh屬'x591a *Mn^b*xJ? o[oa$jӦMw֓b&z;Yh:+  @pORo@@l7g 2NI vteՀHp:݌/}>ͧi! M~oe߾֬V\2;dϖ^q(p¢*ݳ9DV.SlOɩ5FZy4⍪^ʵ}!RBc}㋱U>E۷oO?].-0O {"o'nK^߼ 3@H@))Jڀ  @}3Pdte?Tп We7RxW]]]O&%:x)V"!O΢C\YvǓ3~XYS3sş%]lmr69V|IG; ~K/]O*96>& XAF} gXqZi|,q?%N͋S]mm&=5451^x~//###>a&0Tvmry^/L|3嬳ΒfYWo}[O"SS8'fowbgkg!;[7o78X 0#E@s4V[scSw%lc *)}|N_NT\b; ٳG:O6g?+<|p2_B47O`x뭷ٴi<¡! _~|9u1_WYq~zyӟ%Esͺd8 HuUE@F@ߜ7o)5߾z21,w-¶fwp@FȪO|Yd }]ǒ'޹hܾy_[Ϫ?{R,_/<%!xbWcc-l P@WgWQSpOʸR_̗@gE_ # e_ªGh `;!>h*g!K7|s9b[~%?f^+^ݛ֭xN o/d+Q0W̖8)? _V(d@+v1nUG@@9ox"5I̬VfV҈X峞hZJN6%AWG]OʏX.T{,}[e{e߮XTfUi8{L#7I\«{dJ6Fy ];]3Kz 6R#QT<.|O\T5?3lhqe٬/ @4N;4ٻwon-rI'__/wk0|ojo^|3e͚5?Y~_ɍ7Xh[nroy["pwοF+$(;dl~w}rG8 VvG@K@(7o*' h+&3K ~e~i,y 1060K5]$S?$w߫P=?O^&K?z~ѱxttcIiN1>d /X` >/浉?hnn*d71Y8Te62?K2#ɽ΅#  n7y''|rիW.z~<@]]V^K__ۿ[JQ~Pg3iӞ׮`^hhnsnq E X9u  "odq42)aG07I N f|٭XS@qg%jͦګeɢi6}CF+Qn;7{D5 PFm3)exhع:tvu=-Ǖ M-0{Xݨ? ڮEUI[u}lnJKկ~+Y;g/BWp>q~YÑ]w_>/D|ժUkOwqGd!  ^@@%`)cyFM?Tk`NtUg[`nnN!:FUkܷ7<Ĺ{6Nq8U"@…gebYy䑮/zыYzks|iC)ڶm[a=+裏(tA}݅uV@@ x"M  IJݼ)C:hŰ{ ;;AYn= CL5Ae"o;ϩwʪ/SŬ23d~ -+K/]xդ&inrs%Hwgf.[O1F payVWM/wPبK#b˛Qg{=8ն$^ IhyI^/خuE]45n_Kj@:(ioo/|rg<mƂ GFFva{M($jݻ]5ذakύ(oܸQ5o@IDATfI>L'{i@^  @X%M9  ĊF#Hvz|u&xA/fpQ`QCÞ=_:E& }]%fn9WVqE#CrTƥr+V[fZ](avyܗj7H ~M푶6*?44$,%`ĤUD4y]2VςK NfA^3pYHA xUڵk]۶ {=[d nW@F+Ah@@ q27kx ^q`ӊw5 Ba^<\zzrF-k>{tu'ײyJDng)jζd`@iuc/tUয়2JU tu?`r=W6.yk=ҟë %%M@/V=^APnwS̞nkq9ՒwN! q =D@@ݔ7+<cNhMs5SMWD;+ղm&Ą͋-rm)JZ{*z蚯O)mTy#!B{,ΗˠE~y5:W SSEⲣK{@,> ڮ߄SJI_=l\* `\_b&Iڢu퍢n )@{ڔ  9M,Dx*4==*Yrd*l*IZV@^U `+e>/ǭx*P{S(&tݞfoIGW Y*]tt,`Gpop$xevwĤ^jpoB%!_mm*|%c|Uއ4Z{O~-%ȼkOK >Nr  how]KG@@ ۅϸ=~3 kneawdś>4, s@܀HpAF<B?pdvhS(%UE*#Ƚ@QX)C}p"+萶6W\l P@gi!(7y4rU7gAgD5Ƅ&*18@.]jАk;8K,Izi Dt4D@ 2+}t2zz ীpԗtəǷɮ+ٹ9O飒۝&}Fv^?[aUё/@Kefzƹ֊2{E$> >E6)ˌl6B oM_8wћ@ \Нwe˖ $@{@d  Yu)o ?cˤd|HuzF>Vu~,022J۝Zs%yġ]%oMKځ;&={XqOMO=W2ZK+! ^fpfpkk3K~rlg+xoVzω @pi|w.yu@@ Nǩ+  z&HJJPLJ{iGzl_AKK@Ӷ&''EJE:eõWKˢʉs)&Oih wfݬ\tDDir'Јޞ'N%`Ug=7A3v54iSkK3 ܸП{՘E@-SoW_6|r Ihc68%s @**  )C{iegR$Zڋ# %I~=l S@u`(V_#9M꩑ι@xSF%2qb5Np{aעѱضGOJ^KԨoKUOaz|vlGBN> ee|JgrOqy2;SF$kvgNp瓷njبk }93YΛZ*iF߳HVzlkjq}Jrl@?>|yiݲ}B۝  1 =G@@7eMJIF.ʴ dmZl7PO?=L lXk5fBe{. _W8qHvnS0=cG[,^fow= A;{<},A6R茙LѾX2{&TR&.* خeٮyU( Jilb Pi\N]wjf@@Y# B@ߔECB2E|J :!% 43=LS866j}gowVt?!Ur}[%7\T\s$9ȝv['s_OOafکI>6U΂ecj{) خeٮy\dMQQR'uB~'NcIjSi Pv:MF@/o6S^ tfI[F>Z쇀lVuy4wwɆk2z҆͞~XT$^=i2L\gpo(^3}őUlײl׼RDR \D ,^X8B ߅ \q>{$i i =ͽO@@r~7m /VV iJEvvv keW>+᮳>$>={I r'ٳX*~M$=B+[ZZ>ff2!M-3枀~nIۇW#JJZ\R{;! P_8;vW/4NV@@ TbQu@@* 2Mt\[㕦l[ p7͹e,tL}h{} Ѯ2 ^ +?|x.н’8 Y{eAf:{뛽ɑrr7ǜdm۫V>S+À6n6ٚy&ɉɈךI5>?kWawԖ8+ug7㋧1ŹWQw۵,5hԶ^X5OAgN>d1Y."1]֭[Wu})5y|+_)1tM׾d'x(?-LtRyK_Z)C@b'mz5 #  M@ߔ7m咎Tʴt}Э4EB_Y-Wz?Mi{{{3) _JO<:㼢mO'hwʯ'4yԕSܻ{ EDcѥ,19E{cz" lLg9><VeGT+kYDějVST)xby^W8+'m<}'?IYrtttYA@ @{z6  ,o65gi"^ 4Q=nFz8H\{'{jo'/SZ=}Pn++6A nS=YܓǍlQkAW#VMM+-l$Qw1%`e:) @L&(7oIͫ.;w?_7T@@N   2Mp%/gmeZW156襹ڄfg݁H@r,dqN.D<npҲp~Dnh6)ȝvgϥw=TCޞHf{LLg9Wʪ4Oѿ)-\˪΋ x˗˫_BE~֓✝o}T  D In  1Aܴ)݁ʤīG 0[z=ª>G@)ڥgp5O˟5=cϗ֏Df_y6,0{ qr'c^r6ׯɩtzZL<ܛZZ*Ĵm ώѬ=c:/R#@4K p߻wo4*S-y/~1O)gA@%@{  4XvӦULxE{b]V/'=] NMπٲ^BYqٞ%;6.OFF=7їStt&r;npMLN$a|21 pom7ld 9z/IblʤīG@ W󕙘M6Eb>+m?|)gA@%@{  ,onڄ\LElwŪbXuW*[=/ŮT!^>{=z,xel";hٻwر#Z6{M{>яʢÉ  @ώWݩ-  u 26u i^ 7Hpvw_O%bǁdd[N7Q,EwyVSO:SxsmUWAp_ͧ-w+`rk#!P@[k[ 3ҒeJD}vP2K_]LJJ{q'׽N$,~˿KB@@O{b"  @R Mvi+s>^*&ز={<?2*-I;}^bYˮKz^ώu7~_s3 7zgsOb O Y$=bBi+S$^![K4ә4@@ tC'@@@( 26Qo#뢭L]jd$lV7t:IKe[&ᖊ=Qe׮}—b&AgowV2 w۝0Op.5yuhj*Nm{V*z{Z[,|1$N}& < *ͦLJJ{q~'߽@@b/eB  P!ciSOI:W[ᕤn\[[OzɌpc733㪀u0ګ/%c7\?yDcvg[A3o۾Mv 8״Np{Ml=lƵ5 X"mj?[ZʖV6K c/M@_blV&%^8   Y  @  M6+*k+S^P.SV<3BNeA:]ώ4ͫSӞ*_zJ[*Qgow% w۝Ҭ{hms>;;+sss^N% el mfMIZ Kz|ulFi^[^J^~@@@vkL@@ nnļU/(H 0 0|$#@&83qKoVd-d[c˻2gݏ    ^g" \v3v& +hS[a cF2Y<</?A̍gؘDnǹYr(y,* r'=*z؞2qQ'~QoB]+ա z|ul/C 0 j+s&H   Pq&  @l7cl7mbLߪ6e@_0|a$mc[DZ~{/Ԗ6ˮ>TU۟qigowNpSjZۊNc ޷ރUo#7/6lKn, ױ%y`ly_wѻ)@@@j v;D@f&Z}텕L-J-(H ᖖ Aq*8ou|Z:S3~v ^SZK{{3 r'= =:^(XW6=Xr\;KxsalVxdQ*L[3]GJ@@@<֞g"  +MX5*j/NYzl3R6j.c+ XtuG6| Ҝey3W/~U1w?^1.j j r'=j侗RN%b5ul5VnmfrR&_ulBF 0Sj+s&H   PugΙ  DYv3v&mn 0][dyXcl%r[O)<Y/7L۝ ?2>><$۶o^zO]hf˲wqv3{O_^px+[pB6F*Wlǖg pv&flC u?9C\ ͌oWHziik4E@@H  DM$6ټjɇszl{خU@-VMs 0Oʆo}A6Ƌ={~as 珤mv' w۝b"`g{-%oA@ ul5y pdtsP@vulHD5 0i+s&Hdn)lj!=僀# h.u  $]v3v&^ۧ*GJJBU@-]jrSؿyڿZ6+{p-(}0Gd%[s`@v <* ^*qlMױ nĆ~؊&p 0\e7IbY2"  $@Od  ?M,k/qNc4z8mc˔kW8i,חxe֦H2):tLnb8&?\1PhmDZ#Rg^" _`hܳf_&flFY[i+3ޛMJ@@@N   ݌ݴiLW*z}1sѯ[ƼvEPKjsssqz(u4gi?p^0p˦M&* jko"܋HQDx$(RVωbO3dX֩hle9A1nc{i+sI   7q#  ݌ݴ}C}j'X)1bP%_L/tӝOKKK,3LZɆo^-=ݮ6r/ݏZsD^.*r-(2!ȽlQ2Y".2BE0O-OL󉴕y&%   @pB/P@@nn4r,T{aNi[1T:[ A#(` FVګ/TfKnu||({O:h_wT n萖f9 r{gGs\kYDK5b&_ރŢI-0{E$豤ǚEU[;\[3]GJ@@@pݎ3@@b.`cifV}텕oψ!-p Sqss%Txm¿y,;ݞLgf >xya; +^$=/zfg_leu5I'2{6nkDjcbJCB`ly'VL~@@@vQԞ7g"  iMH7"i/Bħ(IT{[[[MqyRc+n|LgXIyA=mVrg-`W\undk-݃#IyŠ UQ[V0V ۾RfW91oپI&  @MY  M.7*mő:@H~=[3XC-pUڮ)7M'Q}t¿yd•Wk nc䞗gzm9/s~R85ze6 aeزc Z@㶿<$Z9-!Ҙ~떟K׼ҭSzM؃   S  @Dl7 V!3!R1 RA o h["uG [O|r\O]*3vxJD~G{^ ^:vm'}e{l-ɽ LƟœ_q[KPsX_pMG@@@ GrA@H7hJw$|m8R-HA2WgU6t CZmhwz|ÃxnhXv~MNzJD~G{^^X5\~Sv,JS[ܷ%#ފdUOv񺕬mdkBVziy"  #@{0  +}4+u' =L{]Lz>ҁ ԄR(b^Ӗ=򋻶wyaOȥA{JDAH{^^23YL^#y~)*3!$Nu+f3pwѻ)@@@j v;D@f&Z}EL-bo-}M}F.)6W\\`gٽ8eO&C_Htwܞo5Ay ~zvFy94Toomq b&I%eT=>a 0j+s&H   Pq&  @l7cl7mbLߪ6e@_f9ВIN#u׶IcmryLx {2ΏJ䞗g%iWt\@ ٹmȲqI=gg۸ 'dfNv6uCl_BVHB@@@!A  ZMk/5 e2b|ɉ,:ȝb.333f]/pO},zsW9y?̎i"p$|s rK;];c}y)=ew0{Xh{nV}('Yz|1J2)*@@@pϒ@@b&`cifV]eM-8zl.qʝtp n7A,zvgV*?>9]%d s%4@#%=/R36fp/elۛ[Z$*[[+$aH>%-gG# *=IWi/   '@  3M5+m3fl~ r*ЩTxm<ۇHZ ?Qx42=foQc/zls//D!Ml%:jkc2)*;[nwU0"5r: FVT@.Py: ~@@ Y}̸_l7mvxz.v@U,"M@/[H[@nNOgHvέ{-{[55˭oc'DxL[e,}ZLk[IWi/ v?O_Z&hzɒ%qFٰay04&sϗ{WV^-?яB+7|s+wvVK.Q9/Z Pv:MF@/`n8onO5+=&j=c/I M}؂CXʟxeio|!ȫ^]{/\:;Dlܞo:Ay ~. y~'[5}^- geFJz|1>-meb d+o.y'| ;{A&=;|p)笳 ߼ys!{奿_N;[oUn&y+^*S7@H@s H@@()onڔ<9ei>^)5,a0[V A@M6cK/^fo7gwJ9ҕ X_sܙ=Ef(;K|-*43(l|%;pO~χBު,TRa GP &4e*x<%_R^ZmFwqMo}{þۺu\s5}r'wR3z,֭oާ?iJjSi DtD@F@ݴ 媭L _?Fz|9:SxV<-.3+6{}dWRv'e{ϕ٩˝DZ(G{^Sߑ&ikk_f/IklX(c"+6Q$6@ 5}Lfff m^jwy/}IzW*Їd4e]V]pl6+\rL qg}O9';93Θo|%Ŵ@.@{{! *onZeLQFz|1"a1؊QŠ]]]ZӼq#lHݙpgI u*>?˞ !=n919h΂zmץr3'Vvּ9/_{ؼΐ$U>\p222Rh_z~ +{^Z9y8?c[BZX&&ܟW X;3;7erA'nv"@@{1 D@H9oڤOtIWi/T'Ǘ.7R#_@-^۰V@ww+sSׯH8{^pohpqCUrss#w";?!G@Vֹr1Ұ ɛntɆ]tu꟭g w8 A#ZnZY;瞣e˖QEE1Wf2q𿣏>:W[oUJf̘AZQ[S?.]ӆ hĈ@nZ     ⱺZtyYH(tP? 1nhᆦ > v^ՊS݂WKXo2pomWh}vΛFIܮ"wDj|'3kԠ^E=*#ӻW`8g;3@-~$ [G_GZ;V9 8E`xbٳgSmm-]tEqF5=AO< 4opPnn:ŖoFYRāmzV2 d\cM/P\ERnp4 5 ܵN+vƧߨ=~8a$չ!E i˴ ȏv=?@R?ْ{uUD 9ߟ<^n! 4n 3͈wܝq~F|gt{{+8*:+\d`9!nB3gR]]tWDHF[mxvYYYtg-З_~Rkl"bq5cϗ,\Pwu}хOU\afg}-ZK;c 6mqd͚5db6;u m }~'j~^5ja @qlk;N N:ɓ鮻 6%(7ngت (zDG4"p vR%ze($P dffJw$EVR٘K“>w2vm-_ENC9Q*(=?@R?ْ{uU[# {D$@]8Q#=s(2YXpvA ;S@=#{ܘ9^H  bl]ۆ)S8ϙ3G'n^u++ofw]+-36:Y/K2(h/ەkyI'g4hi>cA@@@ c5- 7``e$bL< u஥7Qܹ3b=ߨ=~0_}x3i v MEq"w>v6Dt(///" ]g.Ei=R8!~.qAݲ/ pož]WA ~11a:(l\ ^{h-&=˗/S|ӏc%ɓ<ƍՋFs~[Ö8 5i:ύ9rH'@e    ZE,qƵOBD^Ih nuA7D1,`P|քk }ݙxy+3ޮ5^]>hhLv D |B'NȞci ۓp}/\p,cdu}_VE9,Dk]4)A 'N$ѰXouQ{キ., h9hby,+teL:.21i۶m:t., ֭[Kl9E[4?%u7վ^@@@l PQ$weą.W5xoq_];7Qο],9zz5uq~ EUYe](O>z7 Z ;mgJv'{p@侇}ߡP~~3'@{Gi麰x. Yv]|3ZV J)ȊshRX*5e,%6/jjjRN2J3PS__KaDzj]aƱ#Fu8"Ku;    ` !  ed7%`g"/2-N+:/\1G@fɪ]/2W"RֲrAsA|'?1Vngmdu譺A/Ƚ%2b\G@_:oOtm{ 5̀*{g?Xq* 5#R"+^ZB@ nh]V@ E{gwiORdq}GV k#\DJqq?KJJN#˵{<6    VJ( @@@@sd2u̦&)Xb,l`SE \ 6Nb)=]ovΝazA~#£Tt֩޵m;mj v|w:ѱ7 V+$Ql3ND"DA)e #8ˆ.\?M cI\8d[^Ȋ ^n5/cި6w\) ;i۹Qt-Fh<ѠAtX3bX8"KA@@@J[Iexl2Wx㹎`̪MUXVZQIn ^zz"KFKk&H͔gEZwsVPE   F ،B: qreFѝ}`ѷf+-Jd-@;M@Ent[~+EUޮT}K DlxEПu8CzF=v,6],{^^{鿮&T'?c近NnD&3@ϴPp fee_1jH ⼟l+%@ȊpH)J-{_p;x>nteE,WWʎ;taYTe]8VLXxxBa>}l@@@' p@    #VxӽK^d􈿇E>!mC _6quS/D;V翼Kmޮ4"_*}n d+Q1?s֮S@ܮ}̘1{F466Fl(Ua$.| `݉A=Nu8%gJd%y@l}jwO>Y#WWWו+ׯڈ[ @@@@ qaFxc('YqXE;>%*/h&%@ɉ{Up>~Mg}k G})"M;DZ $ع#4Pw hoЕy". d[[,]@qK6e8_'YqgC΁@l߾=l\߿z'?g 6l0č7Nl_Dk p(qaFxN`W^6NbE2)xe#/ah|Eaa,pIۧOp"P7*Ey 2BE'W[M-H[;'Wӵ#';']@::̌n,iq,H nF-E(ٳl+EDt" @@ L^x!iÆ EѵC !+W^!Q̭\~?_˒8pVn"z@@@@\K@\Ȓ-޸7LdՃÃD>$tMDL*}HH׫ݻwv!Pwѣ5Uq[۵ tՔڨ濽@G]5bKŋC7xSh+ t323]NS2`=:~⻠,o P_ ds]~~xP|M; s8o>J+ 5O9|̓O>y}YCBh_QQ6ypNPF    & .do\'yUh-_>t'_,<36UHْj~ٱ@z: yO66*~+jt<~N _n {xߒWǷ.7w-nH>9u]]q AtY>PB1Ro1 C_-]T0[;wnvj=?я֬YCO;hjgy~i5,z^|Ezh߆mFjHx@@@@FflE  Y &a|Cd6hx@"e}'C`_zYm`0 !ȧ~pzfK}𞛨(eTTli d} -|nڕeljUt@]}FD [9Zt~#)NOs~QwEF;p  pă>1zhztqF;|EI3Ln8 _ҤIb5{Μ9t]͌s-_J&4`rss#jkiixD@"ڱcZlhh Hz/^a&zlI=e=^ ׶n֏Sۮ>l}aa!ac2v񅴽rBKJeB*KIWp `3rs(zms0w^[&:ٻa0B@6%2RV*a։sk>6nܨUul>1A6.ر8;s1~zz'8v˖-#'syyyBoIr~tZ;ϭ~~&   b=\64 @@@@! .di*Yq&D >tt!^,еp `5٦Zq{9!a{{ !GSH&}qhsy9Ui22'^.,*JNhmf}QgQ<]v]s5qO1b=4uT]I_Zx UB?@@@`ݏ>" +.ޘ*&';= {LU 6 U[ZlnnY7`kx+۵vwчR`0ʾU[D([G'A}rI^JY' #S E`q ,B+(( @,V&̌L1!2 v{hΦ+WV檫L ğsE@@@@& o;OTNOt?mAwB-5=8@>}tw-c; ߽Zo?dAIL΍Imwhu#w74Җs/]NMx#V:hAş~u}Kc'ES}x񻱱QRu8l mΝ ÛSuZw?Xog,}a݂;(vw@$%*D'  _DϝzW pO1GO?!XTCO9fM7D/Hm㏧G}4<~op ٷo_:3bejjj] ܏8[SW^yE5D\X   N0w6ӭC}     x@--9Xlmfl\'[<4$tN%n?neeeQ4QSfkf跢h]x\AKsK%C\w,}aq;ǎKY^UY<)P3=w8ookom*.[ ݱ\0^y{[L@G\#w1:+\p9,^XiXr+ o{n@fmөc7һ!oٟ٤R][&DZ7FX׻wom ` ֖N ܧ@ZOm"]GB6F| _Fws@^8]ak ,'yP|\(p箊}P+ܳ'M#__DMU }Cb⭗jO)7lW~ݝv6qHba|ܵ4oi_~WR@K^ΛxL --fG#en@!pgSz7v,pVwc=V{YYYu%%5 ̌L*((0I@<т{vV 9KuQxܻܵE,i Al JN&J8?*C  TtӼy󨵵~ak#tI'ѫJׯ_[lM6f̘AÇ'8sNڲe _uʸKhѺ8ϟ4k(//]BA@@/Zf- AN3Πw}VZ_k6s=t駇|y&x~:7</_N^?訣z~     0blQ5|Rha']E7@WX+)v8ݢ"nݺtijqP1ȥP][jԳW㦵* _Y%v?wt?Mj=???2[rGqvٯ__ % bGqCENH'H;vQpipds wnW)M/s@}z6|r|"ł , ,iFYYY4ȉ'҃>H^x6{v|"⽖    HSNԊ:@@@@@EdE59MȈ"  Z+a ٤  TGY+7T50WIOv; ̑hĒ]T3jxy62#?Ŋ l} }ΚNؾ/--_y){YYY"wv!Q9,6eիee2! HNδ4^@^7#% {- @@BJ(@}!5)A@z;# _6 vuu! F@FW42xsA]uԳy+B     '"4@@@@ ⢩DT[:Ҁ?Q>&J`kZbcio5zvޭJߨ&:c=ve@2Jш^D o--̢Nlc-]2:{;PB=_r+ 8E䞟D˩R #'!4h0XJUW^Nv.@g|;uCW]\|7te(ﯬ,ϴ= dPG      ZfM;::(  I@\ ptx$+Ę' ~Y|Dq# 6V{@*ӊ H۹m6bnq\d-velzdfАS`qU|>te da>b; /:v_Wu{YYd N"wv%%O'Ш;}QV6zzRYI-L-3'wJoHWC&pۢD[~ۈ?      =1CA@@@l [rlֳEg }ywnxccgڏz ōs!+ռ òjlKܦ}JMH۵}):4P~ΐ_S[~. Yl?kۖڧ~:-g+;,+D}VoH8h G@A"w#.㛜"!"*~&dQ C(.(A@@@@@@q;lT\qc&JԨWjs2{Fٺ&444xsXuŶR]]..YWc'JDn+}ʙ+7/d)H]nHcCnhG(=B      !{rV-jA}ddKN@vEπ+ zb w!V())(*"V%Zo]E4oQ'+Q?{֟vZph b3L#/ ۵}]K#:7O 46O#`=iC*{瓽&ds|l{oN(@@@@d4c0=/b4#2---@D{0$Á䀢"]l7W-0F^+| oG de)ц>'oHzqsb"}}˞ Cؚu 2PXMֶV]o,w-{2ՎvLY{^3D      =q(@@@@jNf=L{=@222td_A|R777@ "EY,4 ȬWTT]mYo׋j.>hS1l6:Nq* ~Oj/vo F:ⴑbg'8l#V~AU&lc!pcw>SLٜW@@@@@@#\U @@@@M2`]!!d^ZF/yNĂ@|,p iDCbM:;=63\oՅﴛ8۽.nW+k(l5%:g.jbW8SMߗ(j;tN[o]a3d͸iEGlZAwn?DڑG4tIψ~J5) {0WVTFXo4h &}Yt=/!pe!p+ 8gsZp Wt6@,9pzb 7@?S2(QT' .n9G?xD(pYQ(pߵkWxS2hc4R@>}" lɽz!y4OnM`*ZE5Qh{ӕ+RnWaFc+i{?8kaA侇F[kl۳!ID+$nni֕^_ )`Ă{k슾 kZ'{'^9-3eBZJQFA@@@@@ pw    Z4,F/b ۻwp&JARM R"ccsUk : ]a~mw.0c[W-^W_O׭ ?giAǍ,m:a+r]|1 kܮ[L~7hbVed rJyEye-4vnH~ :as wBkFBms# ^x!q];wҦ7ϐ)g =EA@@@@<3CM^ɡ+;;f.HOO[k&kw>@{ -t8S޴S{+oNSlJCeϴz_6҂߫rܒۛUoUeQӉ$]s#~)#;/VS]L:YYԿ] `Ɔƈ0f`,; g-ٻ2ND6N}GWl>}[i|3݇.XB%▸nZ % B@4DQ" `ֱw> VEVD;_V'ĭ} ngayK'ϘvnGtwױ.^|*f:-WKOE.n./J߲\9oCKɉ"*FDJhhl;7'Ҍu<H.B2@| LA('4jKm^OerBxii      ܝ"z@@@@\O@X{alp-Cxl [@AA@ȷ+d58pΉc˖D7A&$R.MuBO=vd䈗b;ʏ5Rb*wA|~7QmH6ր$߂{+ -w}& 'v)u洔k) T+HܓlF¦'I2^Eä4(j`mmm:[& ZďJK#-1,RgzRkD^+OzwuUBCh0Y{qٽϸ>RIΛ7GZ̀455Eot-c{菴cIN`* >=ٜ}-Vɲ=      e$ уut R8(##CGt8HL ZK dɡ4Άdeeuu,~80TL{UZ`dx|1=?XZ_7N44jiWCTPsKn{E"(wP:KwZ[[#6R[>l ̰xE+      >(@@@@"e[6(8DǢ]$D ,[Ae!0dbѮUWW[εoM%}nk"w0Ya݋vE~wV%fA8n=wY~B*ϻϿ͂SŴEl9ucX:# V;vʎK@`h#udx[%s{!nr=D 2 {R      >(@@@@D.dhhk(x5;;[OŞHYl$ NdJK#|MED4商_bvۿ\G.7Y-lwc u\b;7~KOW^,rgq]z ܼ\+"w&Qx_Ԕ}d, 3>-N|4^R@$qJˊ̑1ރğsSk%.\/ ̖BcQ$ ܹlWo5h щ yS[r/.6'Arz,l*z{U B/?~?ᘁfOO55-<(ڄ+2*u Ƚu\^رcm߾]L2+KXLXug&u?Xp'Xptw<~p `qnO˲^~I@@@@@Ow!z    `!q-Ab bpD^a#Y!{Xy- "SZk 4p1U@9M5FIVҁ`K}!o.ƬϜ>@iѓxEܾKWѿ>O]K0=(Ux>WPۧ+iQ>Eq1D,&޴qS0 6XN7p)`w-إ?aqc]@Jl ^x!2Gۮ$yA80+nrL< ;YYY>uw)r ---!ѣ@F,,fj-lA&AXejxi&k8Oo}C 㦋 vSHߠh!Kŷr*.=nn4"OhQ'ҠGS6(Dܫ*MG>W8A`gN]5 oҀ1pĬuw@uA,/sz=('X_pJ 'fT     '3? -WEӕD l89zҵOY.%Bl 0tPJ$n׶n⇖nv5k#h[QõqR SM]fazsy9UUZc.~mmTYo#o1|]U\J+9WA~H3pRT5dvw@kjC)H@9Q m~ dFM      NIڨ @@@@d6"wS*>=GȪD@wEdCM --FnذʩYv7ۿ,?;Ͷ^خ(kȽ $v7Bsj~;^u;LeKb/7l@`P7%%tPpd#ޏ?ÑF[UI=y~+GnF9Ɍ5$] Zg|H5z@ȷ@IDATlK#dK x;q\* d"|K ;;%b1[[ `@߾}w޺l3 E4G#xF -ܪxqTfc]BsA@@@@@^V,+iZlGV&>MN/pϏhc^ AAF{w:ٻGf@SS%"$H@@@@@@$Q'7,p`;[Z(O =$%!t n\L]]]7KC6H?]t6mzVWЊk,&qW;Ta+#d6b1!C\,l_҈WK1Ý뿡i'SoLNjnƩo&p@Scuv7ɞjO2 N]4)7/cvN[hkkՇ{L#"{D$IA@@@I@s+a=XEp > WG@\==@޽#eψ `#>}Pz13[ꫯlda.%+Sb{HkC.q):w^7UAL ؉;nKVKw/dQ : 2*D<f (" ǀK %PUUEoV zN\`>(@@@@dw^hm6sѣN`St>F\; , }\۷oWkٹs'?G@1tV([[[iÆ 4j(YvXoO Dΐb'L]=iBUNuM3\wJ\Yh܊B=pQQccś˿;Douvء+5jH< 599b`.q{7[Yf,es^' Yf׸<@F~;Zƿk\s Y_i|s=굫Ng[nx!B{ۚ XpOAGA@@@b-ވbZWY`,.DS zk5^NtM# `1c"[n%ޞ,qt#!,yb2' 1K<<6c,/}V,aEE"J1ڲ0oڼysDy%Dt-ަkoK9.T D ެ,Z׆8Q/x33Wes9=9chu]G֭#>͊'3<s]_~9edd8Qm+Ob"> ^ls"GwآdMry<=[-.DTBSxqݾ(RβK<Gl=䖖FJٺ{+h75ň+Ƿڝ q"l~RH!ؗx W/g>q:s1<թ*8Wc%ݵdhh@K}FI!P__Q/"#FNaϝB"wif sS|yfsz'~q #cիj>M48 _Ґ!C;뮻`k @AE@@@@#uyt R< .Dwtt8f%ѧLq!Ŝp `E^z銮 ())!u,[v-q6:^S.8-n__. YlR䬣k%? ەϬqch[#Fک鸞CV6ʁNbW_.AMÇw}HϠܼ\mTjCρ\0Kh!:.: `LnTJ/I%&+@VZE>h,In&KH.6spCsMM5k@@C@@@@D@P$[qS{QFmD8G:ڽ{s~_ŋO? 8b p~4rp^{ˈT    `m"A@@@Owsc([$CO@"jRÁ){キNxE|q;=vv~g*a_bc)7A !QgT~Iv++*6ѣ)+[Q%""@!lQtE)*pO3D8Adp|◂ lNJ6wԻ" Ź#$JOUTT$Z~a5fNA?{j.\ @4q    "N8H>:b: `(p fAz0D@n9D3&\۪&-nı}} |3N O`R?NAq?(sѱE\۵m;U||k~K7+#RޱORȄ(p&&x.:HcI3ٜKqn4vn\=wy^~p$o? l TSdavaڵkUkKBHCn[Sd{ŅBbbpbDKU0G@ m3%СCɰc'Dmvi- ۟(zc JKi?^'NHv%dx57ҖKG[o8E-7D`۷/G#E`WH->S5@Ha=b &3ڪ87 466ݻ ӊ3 mFz{H=O=ZG㱊Iwqz<٘!6'T⛢p5 @@@@\B'3*Rf;ԈU` #TXF}]X#,<o޼YaP$7uAG-F)nz'ݿtuZ [kgO?~$RV=rṴmLXnzU([G|?"r/++#h,h~VX8uy#Fh`ަu,pOYgĂ{qGҐ B4 ϕlأCt8شiis!~ijj [L_d q~'O=԰_SeeeO>|8ztiʛnI]'p [}ҊynL̨cN?xIu3/zxEOVPywRς|y=R Z"wv%%j4 +j =nєs^b۶G4o߾q, ݾ%s,J!+$i]^^U7@;Pw~9ch4d˗Ӄ>Lhj;dzʢ3<3ly$n_kjٚ[oE UV-ZK;c 6m>aQ5khɒ%lxcwީKoU-%vMMMv0:>A@@@ngn$:O,ʼn dJ<>Ax5;;[gO&n"]cэ>㣟g1/ `'ۧ ˥~9^?~|*vGv<{wN!Uκ߉TT1dh#Y<ƨȝ-}SeFAlHF׬80b=$j35VQeW:rwdsQ2 േ NرSN9Emnqq1رc /TrӑGI|s=D?nݺp~Ny>*5ja @q8ԩ&OLwuW؈Oҧq)'3f?8ESq1-sh^ dNuh?I Udؘ֥yv}hљZ<-\#- t_K^PyFrEO?_y$Gd_@#.Ŧ-UL?_ΒKY!:^UYI6l륥' и]4_Yp΀=1%yQο=z`2I@M"9)1^ 2p'ckVN2%,tƱΜ9:qW_XzrSO=&a+8P+pw1)vj_er%-ڋvtItgk,'{<4hi&|0kd;bT    Uډ;₏XL1 G=G]z-_x?M7Ӫ7Y(d}pL9!-%"nW*񦄅4C&Q s'Qo9TVzѕT{ǽ5x"w٦AV@dm~\`,wg@$qNE|N">fc]{@^^͞=;f'L~A-"5~kԘ /zڕyN8>`1aDqF#9owgq4hi'{|͛~@i    9,b/}<1,[3hљMX"E60`@D^DZotQ1-Hq"~SW}w0l?qx?RNvmmk#7TM6u"\e*+"wV-A jkk#§d/uBq]hyw6x|dFdsU9S7F6ocY0u |F,is⺈,kFoFKώz]FW6l.+0bĈX}-"Ku|+@nE    ["lǷFDz'̴4්hŝQVՁr@@Ks7N:x: `/[,[o9#Bn4򖖖&qk#]JaWA/8 l"wMdGȷNXi3Ҹ][ө$l~v\nN.K.& Z9(vKރ+ Ĺ=+CY"3~w#> Xo101;MUUqjguM4I ;EFņ]RRb8F-gxejbDڴKGy     q"s 1cAoJP=7q!ǽfRvhŽ+d:c\#giզq3OYo5Յ,_.jz\vqE~Mm-KJE kȽ $v7::k)a*{뉭_GsTUY2A Z[ZIC=`~_klletnxc+ݬDf\/:N t;sp 3رc .H*gNʃ?od%ٖ8+YX҆PB)kiŸRH I˖(-K;mm7ky&sl,cif}ssfP[un.K&QfzFJdiiZG6d@H{4C"  Gf wsۖ:5`|Prp Ќ Rhll^haÆt#eoG0{{8=>sN!tCkjʞ lϟCP__*7g(c?~ 7e[]򕛥= O 5cbf vJ_hq[e$*066شɱ,_$Q<ɑctX@=(G/ qȩyZ5FFeKgxyG#̻M<7&կ~E擝XZZ품9‚f^:J"Nyc{cu  ]ܳ@@<.PG-xS2V=Fox zX%9t쒒P׀t {0}öGFYu(S e,fp{quYzGGF"U\bTSUO l}T>,{?ʉc WqቧˤK7IzAyqC ^صk#U;9i .'](^Ç#IuMתlXNO@S3u!_ic7c @ X)ƏMo9`;ޱcvv;l۶vh3ms>N@!PjP @@)Af'3xś5^W;ΜKf?f{.xGə-wjLMrE_QO=-Wo _~5k`m+G/"k{,ICHZƟ\9:!C}ׯأ[h'LMM9j ===}vvkc? -혷lnԘx3}:'q4UjuK"3fjNtSogZ@@ SSQd&@@ hp{EEXX=XWAfnT 4}||<(}w@4X'FGG#]ÏɓwX;U fn2946%C_sPᴮ g_e|V?[dcl]2L1++r7o~/M7}R A~)33{nY\r"ݛCM!O>d,drΏzZ?;[@Jٟ=F{ 8%qmm%3R-!=U>'w3q;w  K@;nܸ1&uwU,#笵[*28pQh <mU-kg-u  @pO(C@9}f}6|o5z *))qbPv*epJƊh'T4449|(h& R)p{KS^8jpԒ˷ +Nj_{Yҳm(,+[?+G^x  ;%ZcYؽOZ)ٲ)ݲѣGe߾}fiokM%&~ I,bwGa-=zS)HZG/\_2o~]n6ioo̯u 6?_uTȌ-o:#;Nd>':1s>@%Eo՗   qaB0rf3?zW@o[3hM? ShnnvESH@_JZkmU(-4uG/r߯9 rR nĭ7\!SZjd%_7={wvv: kFCh&w=.l >|d= JX;:h!6=i6fNs~x̼ R@ Af ~Wf;Gjm\X>00iFKKKd @@ gBs  Z LC7eflKi9d hV130-x"Xhnox9qlϻSG9].>Ӟaݏ_])?8q/HlPqs{"=k)Go\'sTo5kPm&mmm*6nhwS hKǹ?9Ē ,sH<:`f`&??R;vW."lv]w7ȼ9q}ɭj.qtԶli xJwO]*  E;C3/;u24S3SHguX 039}CA =+O{n%Ʀ_wӻJn/[6/|R&7~A;91q,}ӱ?<ӢYR\T,l?EU0'enaCh @ tjtQs]w;,D I}{SI277e_HΝ;#&jn뮻N]B?O}{|pt윃?Ugfg@H@4>;G@@7:f= 15+++ Ghf N9xhpьF͢ PH-,avQ0{ )Y -] tׄ}'B٫ {6tO-}Hs m_I/oӶ'_7 f߳g,,:;dVVTʶ~'Hw%SSS]m˙A ]#ÎCx܃ÓNrM}^ֽݾ%wTF)0??xt.qUi韆ɅG3<3n3^޽{_jdGyD[ ~##ӹ4a p>;G[@@E  0=~-SKkwO.D(hF U ӠG'T*>yL{_羵Y/}K7ER(d= R,07;'k¶g /]ǩ{bѱfGxH='{S)<eipfI3Bq4R@vi[# L]믿^**bF޼y|ߐ#}m^"@~^ @^F" U|(f>Zsm 1ckWL55d-"Rq8NA 7/~v=ޱoX/rK_"Wy:T4c@)ۤgH_%7ly`~A~9OK`i)#*K޽[z{{ɘ٘e֭tV d>CCC}ql nonYcl:y3R힓y/oL3rR0J@3o~ ׼Fu]T-C|_Nhz`M’kEdb /'  n{t#  3TZ<ZA;vȑ#G"K5ɹgT ɡCl{ɶ؛EVb Kem3@N;/=!?{Wz2^|]v0e > ݲe466f_zynKe%-}N7&Oʾ}dqiѱvvCCcZ(4558LƍX*(=GyY3z޿/K{cG<6hϧpP̦[ԇ^wm#4PO?+XΝ;Ñ]}nd ~Vկ~e=YD?QHЈ&nVZ<ߞ   2:QK@@, e123e;iRVs)*6Ľp pˀJwo^+?'}-m:9wE0cr9ݎv=}}saCu$/IaMuU=&/L~hm@e;]JSOKyp֓L^-OȨ-]֚C1{_׀v3;ɹ}w{ 6@ yO*C&{tK"r饗Fڧc!XۇiB$kɵ?AW]u &@@ gRs! V!̷KS̒4M9(PSS#EEEn`&֢٢梏`ݖiL޾Pk? lٹ\ۭ(--N;M:::#cccO"$LXj{)ݾղ42xrߎq[h~Z]ЌtqTVUOBS1G##͋ҁv)(ZMg}'Ӡ3  <=Ts?(uGW_WO3=r7'6§<#Suuu\oyDmm\~,ڀ > ݇*# d^@Ql'&q{0),6lرcʾc;3$(@,!teo?ic|![+gSOfр" rwd 6e>J7uJϏ-/0GQ}27ܾLNNkɬ ===, R r7GhmmB EE㊂`GeKdU kr'NӎUTT8@SS\tE{ߋL=P?3w-n}~uF ϵb|WJyyy5  O E5@@/`>q{Zzz p *N@ E@&4 j||\2qzΑC?goύ=f:묳\3]} Tð. +ʥJˇQ#ʓx7~|00~ΝrGO;]2=nUG@ p7Ӈ*# dG|أ3zs\yׯFZ\\}HA $A@ N'T*sXז}xx8N&Xr h}kyBۯ,9\SCЪ׿޲ek}-PJCJ-s"Ƭ">R7vЃLτ:Xθ[|7o,:FK8}׮]Ck QHV`xhضnmk-c&-={n١Qb:03(JtO笅{V @ W*ꄯY_KWWy: M7$W^y?~48h.f}ɥ1cdpb5S?=mMHO":z9^T"ʗm,n>=[nŵ ځ׽uNyYq/}Iַfދi?:Gmm|H8  O 4z@@C@yhf.%ji阂@w=ftJ8Q4}``6r`00%xE!`xU{om elTPYI}`-o>ql4>>. }:>I|2ޏJ`a1a\_~-Rz/,.T6m$ދ%N&w/^ihhQ{'<, $= {Yܾ0j'=,:V,E h7g嶶6GÚ=yaC@IDATMo_td:M\QUUz^򒗄m8 v!T;_}ՌƗה&  U   @mR :J$zCTܭEgG-..}m}i{W鳝R|C"b,\4Zg4uV.v`Y)}Aaq__n,׀xL{%Rv6}ûdiMf`_jYm2y6ع1>FXA.BTavfYX+*sukBb pvEwVSSms#&=~'{wLI=( @ \z饢)uuuW2MsnSO=U㎜k B@ G@@2,oNw5 7}HA 0i}(RFS]+Om׬Oӫ =zTo.ݹ']%PRn(yR3VYQQak5F3O?t)++iLpgʶmD;0::*>ٳ'4v,=9p@(-]_{ jK^/KI絍 r^}fdtV1}477ۖ1@Q"鰝~& 7??o;yɶySG[ /@@@ +C@@<+@{!i+d rСCe,|n^F9쳥1:uqy駟&Ǧggge޽^E[kZf?z+N/<n r~ݴ3;.N`}6"4x@:){Jǹ|L3ݼQw@@@ =)-B@HDphr3kTCm3H5 {V`Æ XYSSckԔ9rĶ y E0=\ٴiSOc=&CCCL`gK4 W;0ؘh~'=+egIe+G'dkwF+rU|fBG3HKKu $](tۇk0)J͍]@?giBk1qZ1   @p  p{c> ]2Pa3y3P N'z#ke\l7-{ooo N7RpM9鑲;go[ٳgYݣJyw^o~װHvПd˃ߔ^\?)yLrzhk=t1 k@@@Ȝ@q3W΄  /LZi Lp<<<@ |lk;a)dS@3kQenlMMMEaYwCG:wd -[g~M^/### uJ(-- ej/F*^p  ,-%XvEJlJx?/mrߵkW賴n}-m(/0=5m|-./+o|[XP$H"1sgV"G`)o&RjgM-PTS-]`O㯣c.E@Ȥ@t B@@8Tևif(4#Ut{بnn3^9N _45][Y5jnu8t+((~ gu+P8#k;v,~aGPJKGGG(@W_ʆ7\!姝,o|,Զni~U|e/ A~Rg_;7JN,p ,`dAv$=[v{KM7} =`]U]!  @ ĿKMa  ^@Y'''E3ST3qjFõ &H7Hfƞ \\\ jN5zh e֌'g1 L;}?Ѐ`J4}bb"Ԯۣ]+kMZ;%hd*}nw @(ݽX6mVdamaoR! ptk[zjv-[Hwww(xzddD v w vנwݣjZkv,~"Az"^\\sNM ;d7;qcʺg}vRT]8ZN2R f$gG }W˥[6z=wI^![6;7k;=YObf #e456gvNe%=A#Y=:z1ꇚ+@@@{ Q?@@O hbYY-lܸѓJi`^BW p?l"ڮy\Gkd~FYKx笽R}^NY&4=ӹDNkD?9VK筟NO~Nn.~YصGZoE;;\BܽxUܼv ZZ[l˘I@"0Ȭy(??͠N@a0s tO~.JZnYJOښ~ܐ l'n:RAtJw ,'1)5tN8v!j%yi۽ڴ#   {N:1@@ n wkq{d]ϴ8 lAA 8-D!e16 S'@p{l92~XWU)]_YVj es_NjllL{6ԟ=`6>SݛE %dp_ί tkE:aޓˣn @@@(@ uB@mvv֑eʗ KccAJ^j6m ٩L!v9pm3 =u \h~ۥ;_uue?]x)?2x ]~YZ^U^%dp`|)=ȑ#\1WRR"c,Wcj   Sw K@@X"Ҫ;mذB}x>99i[ ԩ816n(m;&dϴd0rB%"=#egT{WNȱLjllL{ggddtvb]]]edP(~r+SO:g#v%pg@@@, %xN  {555RPP`k63]7:|,D )d[@Gزe rx)p@v7W$e%8j A:4|sGGՊ3+ȣctr`4 4ntz^9zoG@@@J4@@ RUUe;C%̄7L7P! 'NLHsDP\&; =@ @aYlg>,Qs[1V{fA###2=3c;YeEؖ1YD27C50{_^dQQTTTߑ-@@@ T@@fF$}L !z|6HhaH^`ӦM֢pEL')@p{`lZ|R>=W'˰ {92c#W #G绑G.DVC;OLLZu+Jl3mG`-   .7@@LR!ƿnCL>|8l@ "},(xADUٳgh%yۓ7c.PqsFeM`zFFyXYqrOuo>{ysSTUGKO 8j,uEVssJo͢ҶR(ZY3-{ځZduL#   eܽ|u  4+YIzE*++FaEm[ )0ccc)<B`m---RUevӠy7yxi2(nj!׼. 2|[ıIrOАLMM\\T,;7ږ1%2򠣡~n2;TU9&`&=uuu97[2ԟ#"   zSo@@Xp)65==-f֩;5r͒m-nfgL kt֭RXh5Lo"oW"/OH6~3RPn%K?2Yxxfm=A7o,}}u d)_^~E\Q3iQ#t wqn-Vi~4;KR@@@'`2Q#@@|'`fF|f35*nhhp,Ivd\a>m nYޱ6m @j/{Rҝ\&A2uiMto^fGf27uGHA`D#cǎjV__/NA ]|Dv(z[?^I   :@@@ f/ϧ9qG6.2ĥE#wfq %VGݻ(zg.g p~Om{,d]G7S6C¼ ee[Lv g?rq.) h[i JlEmdޣd@@@  D@@'̠VƚQjÆ em )(//wWG0ƥtU lݺhrrRV}\ޑ\ o [_#]w}I|M/ZGَ /ih}O߁G56,[Fv;kQ[-m0@ 4gC{4sfi   @ p4W,B@Ț>!mfBӚ^A(dBH"n2Q΁@4}@83ZBp,d\@[>x](н:1?rI헩 rONzaaAةS** E dp_ zB_֢ߕot LOO;^潢t7=v    Wz7   I]We)jkk 0m e-fB:Ȗ@}}Nv-'NnqfnjȨ@y/~WJ;;(ŪȉP&_vͲ =ZhҒA* dpw@,*a:[~1555{l A@@@{Q=@@ ܮY(4Hζl"̤K@_ff85dh$sܖ4  n}[_rArm ю2een>}35A񑇇E;<[KQ0C-[ȈmEt,TJd˽vO IgM_Sdvvv ޤm%3   @w\$  ?H&v\Bؑ 2 % @ ̢۶msƍ[4W3'3 @aEtv|=6e苦_.z, D(Kkr?3=# 6o,%%%,@AQ5GɺiR%0??/333Ùl+t۽L    }p"  JKKVqmQg^sfT(VEXfLhi99E IJLfٻwh6|+WoMkO;vI/eRebcܝQw߾}`ᦦ&O;Β kE_###fiG s+ B{?v稣/P@@@~z@@f$ͦdfBtTbG>.K$Ohc ^kkkmU$ rϧ^ y3ʱ2|⹿/eooIWWm3((*Y@V nϑ֢5u 0vB0GT7}_    gJQw@@O j b,255q|Ќ&)xQ`֭RdaiCt ݋J6_nȑnk)+S.A\}o]lm,ޝXʭ 1rhhv=l[ XZZ3 ҿzqzy'E@@@{P+@@p{d>ˁf f䕖sP(nЀa2f@III(`άO__# R( '󟔂Ғ@f~_*Yܳ/ҽqk87n(U,@ ͊Vvtv*nfihh01"`foMI"@@@<-@/C@f֠Ck2E@*+GbqZEC ph(#ت3vޝ[m@.-~S[jҁCkd%_7 w}ݿ,/۳{Hkkr6׈((Z{`{ lլmmme NOaa֦9sl{!   @^ ח# [v n;6`&"`fqz&H>L7:4}tt4I`ӦMe~~>hg] U  ` y<|T檘䑷^'G>Pg| r3:lٲE4`#uWFGx{umk٥EL#6`g3vfjF_   >΀.UD@̇vm]zkntt ld-CCC( ۶msЍӋON'*v G:WmoH_M^&9qhk| r~(`u\΍ѝ;YE#6dAvOȺgE;5[ vV @@@,@uG@fp73N<߈,UP3N ebiA-Ͷ/,,&ŒQޜ`EpҲrP KʊZ8/ǟLjtnAss#455f!P/VDip4g-RYYi]4ipt     @{.\Eڀ  Y wk<33u= Y&''eqq B mmml؃i>+G`mu jسgͭYܛ,sjȊW'[~])ٔFd䷿~8ܗe׮]r=wU0@حY:9v #99~/dou43H[;YqhiWVV&u@59    }Ul  @f>?Z~mii͇w%Bk3-333gBpzzz7gΝx~+Q_H@͡ 2C..?|@a ,xh.k`޽{eaqv}emѼl1mhNq˲SC=T])dJ@,--Nv/ȶ3!yQża]4   ~ oW" NAډ]׋X vV 3!ٰBwSy , LBp_Dt "M_+e:7+^) %T]]N_ l>9~-k-ܮ%)(0>C$`dw;Un9(v>Z6}Mn̈́@@@{Q=@@ m-|l]3b>؜BLA SUUU,: fr eOBڃ!hoo &@i~ۥ;_uueW^xI{٥2b>|XG6mgcCxZڭn366 No 3H[G1#[    }r&  ̇ċa޴ӎIA dqϤ6Jvڼy㐚S\nաn -0^, q]]v^:S}VTTÅ2f@KK477;w^v"qXDJ6˖)W\YʊȧdJ00ůAYyݲ͚e]Ĵr9vlWG>/6b qF.'.-@@@n`@@t ;c͡unHjkkmGNA k m ,pOҒj*Bp.A [>%7|P ? _#%_:6[wٳG%uVGtq $=pŸZ[[E)dR/VZZ*UUUoev̧    Kդ-  0Yv bL;X=N':,))vttTHApI'9^Úv׮]4Dp_I&+e&E͍IUmq>U2㇓/)OIv4H%L@b>88h*(( p I mjjvJ28hg z#    $7\@@ňKn@+f6uȩ@@?m-=ڨA 4o|d gP@sϒT Vew `\6GFFD3_G**+\ `OWߵR?oiۀ v?Ln!;&z/ZY3   pU  ai'v)խڶP f,k͠FA^xfѠ=Bp{9/@qSluI7M_"'OzT ǏKooYs)9((nFi<]dv@5Btdy7^"Ekw    {ׄ! 䨀f6QimqjefᬧS{@ jiimnm14K[ fqL3-@ W lg,f/daǮK^ r_{J 5N;6`dp,+Ԕ=kѠ؊ F 0~Z(cZ@@@|(@ҵWB@IDAT/UF@->J|sa>ԋ@`mmmn~&@DE%v%ځ(SLIs'^![n)ޘTeWԽ'_7R`ݻcZKyYyhD1*96mֺpKt)w ptrz|QeiiVUl   9t1i   4lX ѧ5\yymq<3dBD4Y ´4 o۶mRVf|;vpMACc"z'E_w]/0:7BʊٳGffmѺtIu񽀎;@G"0=TWWޣ i^~71;fN~9{vKPO@@@b Ku  XPteka53 %N5{L ;Nѱ @Q0pk9ٹsgZߛn @ [_#]4^x+_WADzס4A:[JYc#_1ݭAe|wq;[;Y@*49 Ry\:iWYY贜K-   -@{~_Z  s` 3S 477;6q,c s5==Ss|R*en}-?ӢQ.Z!4+n^/RXS}C5}T_vfd+L5lqp =ElU---utm iעv"{=L?#I3F@@@ R@@ hPXɺg43n-p4s0[C̈n / "===*i={8P&$H@\z~])ݾ5fpj9~Iʍ3Jkkk*Ʊ,@p7^nAnÎ]Ƽ/ف (`&)Qxz_!vT@@@ qX  @᝙ORR}\9D0`|| @z&tɺNcr_&_6NWWXRSS#[nT5E w#pkM[XXZSȴʊN@n#:vм7ugV    S}z6  tj[#V6`&"-Xd&H;uuu9l׎ [G,}]';bp HRO'[O>#=W+N& I훊SZeEl۶LXPP.~C=]G$0G7n!o=[ :t Çjgۖ1   @ kW  F  Ӿ6+񴓀hХ޺i%PWWxtZI8MvЀ>}%&=W#k(nm|]^Yr &杲20 r={8GO @>|³82>>n~v,nۈ$`&%n#G>h:Rhr.ba@@@ pūJ@@|!60]:}g>~X[wk?G@ 3}vrpq`c Y’'󟔂Ғ9󓇥W}I헊>?7/OzZ4pZJK'Kqqu1y&P@~1Kgg'#(gD@LLLΥ;k#:߭̄fҌ;@@@ G@@-PQQ!eeeFn96,X@ 277'ccc)< B 8x)Hyy\k.-' /]*[&U?JjTl w ܹs,//۪^4F@AѺ4^?wǬE?466Z1@ոX|v"^&} @@@r]\´@@f@{^vUGA* A ,}}}$+|Uwy_eLޓ9Y ,$a $x  !3bĠՑ9+muuW򶻼7KpYQ]ԩ7"nEf~efhVn g5vKKKH0[3 'N 2m  @ NuKOIO_ 2%Yޫf:Hp{Q)(425b%sg=І9 ){8A- M˓ S+gvEA@@@ pO{C@ӔL>w $&c$ hkk5Ib/8{/(䞝mE===Yp}# 'M|OF?󎌌?!S+$S@?+KKKMupNW쭹@@@ ==G@@ ]VVf: @h W4XP:YmQ@bJGGƢAW\ic5 i"/?O?!oKV󌗲oϼBnYܶKˑVkkz]VRRb'FB dྙrL:hp~@A Ua}}tx8wƢÌmXF@@@ ̿  H:հHgwfiJl,#hͰfZ3Z$Sp'Dg,8vhPcр^h۰ l_~L$Ӊݐ\]Oj(=Wzd}Tڤ^lfz;A@1 dYim/oll/bayyٖ%[NA N8%%He|l>:~)   dtos  pjiJb_D ;?Y0? :Cbeqg }@GJg"cڵk{Z|(ziWͶduo{,Yh~n^^ K~F@,ܽfp[CjRYl555ٮRGykkkN 2O; vi   @0pF@@P@Lg+&k8>>nj Рߊ a5W=;;;Z r5  V95U'dA6gf=oZ{ʦ%x߾}v 4܍,p= N3qsDLLL^%PiOwU^^ˉ!   KX2#  kF&@wRZZjj<99i v15`$Jm^ۣ\:Xɓ ^g@ wS,Y?.=*=Wn"ӑYBT x rJ?@VX7ݯp/":kT  ]+&mƢu@@@Lp/  lW`SHVWW*M XA  nv =///Z֭[244 @ ?/InKnU}}}uKt A;p[x:!ˬq7أ333R\\Lْ4 pwhvwHK@@@+@{p;z  N+n,靍l bkf+5 j&0;4=C}?;qhhQ̣v#WI)tUۻe}:UCpPǤTk X2ggWB)~[לf5 8}A:8h   @ Fw&  4˳5;[zibBTgggeyy91d`_ ᠘a{ثhO5Fkw̻ X@Ri⧤o|. 51aixhXn޼i_Nvt떢"m;U侓N&fҁdqqtr? 3fFq'bO-    (@{&3  Yk'_:g "w ]466QȈNjl2hsrr"A:KhޞV@4u}4'e_`S]yY|Y~lmmɍ7dphжI^ntwwKA}[c P2MTLIU f!{{RC@_h8}7ceS| F!  dus  ,NLXB  J mhh0uAn߾mcd $*=zu㢯277'.\%M#@/<)y]j3}W˵?E֒/ǺI~.:A2lT%3 Ƣ9 "4adXg]/1*Ά AG7   ^@@=fqS=!nw,Wkkk2==v O)5lN@ۣH8x19p@j\xQ/@kmo~I~N2H'ϞY]޶(ܮA{Qr G'ZO t l0IgG(Z@333nTUU>bXA}S@@@T3@@|-CؘY h0۽߼ySlT HdGA399rD:v  'P>{ow)ȾȀcݒeq(#dvIVuB}}$ NߵXܘ"NNk   @& I6   1waaAMu,wޕuS+B@.--5zyyYMu HdGE677KggcFB :{ @ }rJO'}gP*98<.) Dl.%<@2~F;qxz>>>nj/eee:Vb l_KL ba@@@ o&Jr  챀S&N{|شڝ5c:11VW;44$NA  n7Wuu?~\Ցe}rJ8n,9cP {t|Rpc"ӟx"arv[96]g }^iW}j @@@ =}K@@ JJJtVec%l -(,,Abj ()LN}>X\pAV@4ȩ֯A*{ۙ2_oۺl r/..m108(#̾csI CD~Y[[3R.?8}Bp{j=UUUvBk@@@P4S9%@@f ___N`߾}RSScj( 1\466J^^Z'75`Sp{4ɓRQQ r@ }J-Y/Iaf|ߕ\nl׷iѣG ]r,7<ӌ~n5QSζdZ^^.z}Oq'$=>)   d@@|-?jYufv sAڥa2- *0T4 PK?G/2XC@@\3@@ cz\?VWW{tQP(i[zuL$)뀮ÇK{{mpܸqCn߾m n@` hjȤl+'.4&=Pݜ?{r"gQF zAn7jcǎٞfddDz{{ ۱ ,& :sT5U| yeto'3Y`7r=NM{+kr$v)pҁ^X8e@@@ =  AiblA8TQ 5XɎma9:ևAY]]SNAnf=v8nmmɍ7ڵkh 7:+͝;wu[g:ym'?3k2w{YrKM+NPx^umD"`ޮ:t_~8 u   $H[@@R@3v999iԀכ4hX)E@3[:ۀS_L?'.Q ek,ϟyM#D`ee%20u*zsxI_Ծm~CpM̺/~%1Ѭ{YrKM++<@Í p lՙllT ,,,̌𕕕RXXhcegkԠ@@@/@} @@5fw#8]` $l\ӗ?n'NH^^:.]$'mP 4@$  XuSoIZӲz//ގHWfyhgYZZ!yn*YA Nߡ466W:ܜsXjkkmWog@@@L =u@@ բ?pf 4;5(tj2==mcT hyYfqlb sp{KJJӎLCܹsG\"M "{ v5L5{X<)'yv޴2=pّ#G6K蠥sLt#$Y@3^pA3+mjnoze-K/[.{3T'X4]'$4[w,~֝ @@@    ^)S'{̼EEERYYi:q \XX0ձ@4uֆY(2)xxI̦'2(Ě ո@^@u5]ܭ%''G;&---e@@@"@{P)  jkkMkkk)4شNMlZ43իW֭[ֶ̓#xРK.9ՀǏKTIBUN"㟐WQ6gw r߭rtaξ0|M[ÇKNN R)?~?@:w!   2SFρ@@؝@^^TVV6֬:Vv,YF:P`2v {$PZZjˌNLcrIwl4::*/^%۩Dp/]rEn߾-:XZ8 gΜIfѠiKVz?^?_dEjxM]N+&6r=|]2<<,+++MM XA N':Ž:Z;2;%   &@{.  @zX3<eqrI: ͌njE5ZZZlӖONNߺJ,@p{|` immG:f\\\spЁΝsl}]8,A}K|6d~A;OjL{,ge.H///f5sS },LF333NQ@@@p مZ@@|-ܳ-ӥk ś:j&=.qbrMV4^'۝2Hܜ` rt5F{ԩ3iX'zI)tʪ2Ihf"[>s;vlLyN_.~}ZZZ,A9ցMzWx>;{B l3S߾}[.\ z}Tjjjٳr}WW ;OJ^Wm3?jn߾-/^w#" LrUѬֲo>innӧOeP^=O:U)8{z;oc"]{#sJot.Yv*::655!2n,:@mme:pLwxYF@@@߷` @@@ K^^N Y]1Gmmmk‚ X tC=d8>.\y~Y3ZF~^sΉ9鞹7VZxQ'uaû5][rg=r( i30)$`'qǬ{KcE3g    4wNB@@5ʊ~؁=A㮩+P ;;;uڅ!^(>_'wf2An&+<[Rp?l/Mnc cZI,`M:%¹1    (@#   O]'''w")N}AS/Yo@ 4#GDƢ]&&&U,Hv;tTN>-Xt3/5hT{fրg}vY,3W8p/]Oy?T|FZ}2im7v}ctܹsT^ aT fTWWK~~~*cʊ>XA@@@o@@#PUU 0httԸʲK p  N5OA:Ckk{nݲnkDEnO:P"T=B35?afpB&I:MDݝx4tlN;I㺬%MSWTL?dʅ˞6&=*YgpmllwPg}}}|I*@gt@kV   qp  E@ jjjL]XXe 4(Vtx돏r t&YᬙW6 ϽIp =˓N9uꔔ9nϹ;wDJIőJȞ\pA_.kkkG+,,cǎIww9@K~Zھemk_bicdL^2hmoB$5.2GlwIgrY]]^}577XAoKKKQE@Xv!ۭtF(NA@@@o{5  @IDATp֢)lai#‡mmm4e~~^2۰ۓǥKnULgggP쥀(^rEzzzdqqqz ҎD1+;ۤ"/18ް.2I(ƀ~TIN:M3+OMMقZu#GfOnG Nu:t(HLN     ` nB   @+%'kv*ӑD(Y@4ôh;_Jr nOw23&={VZ[[%;;:˗իP@,9ܹs1go@[ V|衇"3eeeu72bKsMģ_}Y~1Ѭ^ A^}VvCoܸa,D2n {G:@ee׃1k~O@@@@   i&h;#27H\U`銉F>ftl;%'-θ`f@iʃ ~oIZӲV_>"K=Oic==./~ua&Au^PfBn:}bjȈ@1̑J@@@ 8w3   _4ԽIY]]5ձ_DA+cZ b bYE_4\ۓ띪iwzv~shL  U@i5 ؂OˋVJ^S⨧=n޽'#x<9Oic==Y9γwz/Y:K^/DM%777浬ftƢ*@@@@h  @P4Ch@P X-uw$Y@HwvvڲI$G8(ɓ'ԱkT ty󦬬80 3DĚ @=*ݶnM Z_Ro; BN2_-g rF@ʽ)[TA.044dk~>ĄmΪ)W86   @p=H@@p̱,k#<}:ś@ee6S+Q@uZIB*nOk`v8qBDޝfzg}V! :ݾ};2`̌)-2^R#/?O?!o6j!C? v뎱:2AqAq|Ʈqh$Ƣ-*]hR eVVh;@@@v/@@@ iNSO|1liiH(A)F__.C<%1'5{=p={VZ[[qΙ`Ν;'W^eUh@ƍ_FFFb-z nVUUf5i1Vo%''Կ9[9SVv-@pvC 6l|G߽{W.\ ===2;;keȬ:xi =477SR+P3SR&ݛcAhrg}Vekk+f[n@ w\pAzzzl_gA1D̔`T<iƗ$o ϽRuuìqLIq7)}]xX^^ @5nUZZ*GA@@@ۊ7d  Z!{0YwwiaMMicAsttT ~Рm ^~v"w;SNɱcǤ,fWVVƍ_4cR @pt֔Yt(VAiGgFZ߿cmG Hw: ޏ]2Ih}նbrE2 0;;kKxsTUUOdoP   p5"    Ѡ9cyc.Ee``@677U,#["q@m1z_rq9yTVV,?svb(Ew`s\HB@3`+c\I.X7 xd @@@b Kz@@HL4PX4f%<=Ż@SS h/ AhmmRSwzcBp# Y:;;ٳR[[cЌ"{vGk-:uJE)-P ;OJ^W gp~2vAvl|sjp_ ,?wܱif/[#*lY܍%'''rnc@@@L`bk@@@ccwCCC:* 䆧znnnSf}<^zU4,@p D9yhvH ٩}'nC`4[訜;wNdkcM̙3bo c2Z_aÏ~@=2Ax'ݵVCρ.0>>.V:C5/ ohh%BK   A =F@@f7m+1 euu56܀4@ѣ5͛7]_v_  ,}s#A;z}GnDoݺe @ ;::y{Iaa "Px\N/eɿ݌ D t¢mF'mkiiQ_@w?Ƣ3XF@@@= }  Alm,CpO."MMM cMmj >Ќhg-OP ~߂ ^;v-'O T-oy~곲rΫk{e? ÷`vv6'pV} ~p:;Ż~&\^^6m3ě]ɴ+    JŷsC#@@@mmG7S)GakV|-H@UU֢h5"Bp;? {n_rE&&&Dv) [@Oy]g\lEEE--Pcϓ'=9lȫ~E?i;wҹJyqY?Iz,M@MlzHٝАmCk2 [*@@@@`W@@55ƍ`H I:55 fvk ڕš7i?WD-~iZߍhY"7oޔ7Ũtg,hbك=`@@@=p]   orrr"Y%Z^^{Xv)A&hñcĚivqqQ4' v&l_|Ydmm-=8\]tiPk"۷vKHč|#_zO{Xy' YoAv!g}g_EwI )8$]`ii)rm`ܲLt@@@#@{b\+  )ENRMcѩ58@ "ܭ?uvNp{ܓQY]\yt钌`4}bbB\ j jA#dk=>.O?%E?|O0v rϪWhsQ V} zf,yyy3Qv'Yld+@@@ 0L߭@@H# `+--ݮcfq?iEA Hmnn~Su06ݐf+Y5}3yV5tdݶ"zp֭HJh Gu^:[ jǺGH!}B32'?Ogdeee w`aafG: 65 ҲLEVU*w 66!;wz# Eb4>>nj M'    ) =@@?:t},~^4ɘ]ifF@_#1ۍE3ܞ:uJtL:^vF}?\AtJ^Z\27am_ >}$qǖ39\z~W\T$hf^ij Ik3c2=cGFFly   [w@@|+g?Ѣmi=D,w=fN&/Q7mmm h+W"AGpB hP1=MP=$rl&Ji{^F 0vQƠv {Xڥտ*k7Ȩ 惿'|qL r.ׯ_յUINvttv[v׀P8Htࡵw\YUܭuKnnXF@@@Tv  @P41]iA9_SvVWW#?k DΟ?/2ZVVVD3=z4m%n޻GYO/`X3GuoZ#A~IǛ0_9F;4v7jI@~gWd-o<k2++.K+YLk^F,o`C:nˋ[?6v$Ht>p:(Q %:ۜeڢ!Z@@@H@o{|  )РHh7ǥErrrU ,}200 |Olz hOWWe`En=H-`H>o Ӣ`w" A h>vvȫUUUmӰ%㟒?/\z #{*leJ䤌_\lg}ۂ DAZqMٝ6zS+    ^@@566F21G;^K8ȝ]@<ɄZ43>QM@P[[[͛kEqqq$@tCVnНEW}!mmmhPͤTO3 L4=9;h277 hנvEd7EW8%}7l}-7I2+)3z G~mtr__[nλNjjj.#۰@t‚} Cg#y< @@@{=  i&?k/cˑH7P 4஁GA CL,ruϏ냰Lp{%g ԠtӢښiM4H{)**2An$Ffqq12gEMhpWQH7?歲rm޽'#:wJ/Wv7׮]3J'_ZZ*-6B mlڶd h^Zn^:tX2   $P s <8F@@ hJ 6U5U)4Jo߾<00 u, 4֬5ncWN>-J!=( WWWGѠw ^vS4Q_hh{,k%:̮nj i`{aanwvJ A_oOf)S<{Aj>I wf {Q^nttt8 ;RHm@Xmmmd`1zb,zˠK   $Vw@@!|?Gfw?ڈ1txxؔ_tnhhq~@Ү.9鱭W^nA3~/"VZ5}CP@# , zuޣB "4+`~~t&~YAw.I'>,gH5mYoڵR?f䮃:rȑ4hڄ {$S}as}Vcw5 { @@@*@{By9  Ь̮ѢYWFN@Aׯoo^)ѣu, 4ҮK.hVw}wvv:=o: h 5'jkڹ9o 팳Jh@C59d60yާ]!ٽ޷NmIIv@.s:IQU얁lOXv]^r?~itrIήUXlJh =:Kk uzzڴqEEET    $T s =<;G@@hfqcK()).//o@+at[ hhGG\v}fL~Y!/@@"aD4@kVof@i%80m+_NmⲭءK4=߶T욭]m) @HO/Cvnluk~AF_fH;,YYy䮳h 􇋇IeeX5'a6YF`/4]1}655X(`5   {.@@H `vcf; 2ӬeeepI? ;|\rt۷oˉ'Lu 4*YXX  ~*ޠ/4^o94CD@ ?q*NA: ΄x fe߭NC4.!؝@Nm~/dw>,w_y㟐s, b﷝7j[+ mcú$M```@zXt@=Fozc$4;@@@+۹v!  @PcdpplYGt:յi0Sz}_%,j}ЌwTqSDp{ 94 ֠wd zwТMT4]T%+8^7? |r޾N~:uv fgeu d_~w9dOBgX=*uwmwLG ύZgC[7o޴uE?'І9v@*HB1]?| ̆}]@@@/۹#"  @4Ш\fff{p޽H #Qv'Y/^hXn"a%I}0}khMM:'"P][[9!ifwcwnh 3f?oc0nkhsu)O2? HQɮa&c?,H^[jNvNZ+{NYe,m{/0:ZZZZx_xX탃- HXA@@@ DQ$!    fzoߖǏXq/P\\֮EoooV ~ҥHhD4cqoooC('Cc l ms*<Ѡw}Su9i@kvϸPPPLHs~M Ϟ7K\~ /|$R3䮯zͩc^8J5scNr,sqӍЙ \7@@@@`psRv  @Q\e~=Mzk?⮁)GFFVJJJ7d h`dwww$]E===rIѠD˾ CꟛNAmcpxm4xn \7Fx܎@f>iǯHk&W홠c)lO𣯖W+#͢\`Q6 v'{WVVMA:]GTe%+< (:d g,M>`-:hxuԨ^O:tX2   $Y$s8@@ ?j0˗MRO>mcŽfU7n6Ϝ9&V*~ESi'bfL~s&Av+N@d 䵵H7$Cop5{? +.J/"l=ɠ w4-,A_;;;.YI͛7M`e4My zl .P>+*=Q]>"K䮟I5쬭9Tde #d ; `Z2nEqYֶa@@@/@{9  ժ*S5oհf$@T #GBg-zmx[C@   GǞ'O?%gOiiykfVF^+2OGB'+;5jZs'dEf{?0ۺSSU]]mcś,:YMM@@@"@{BX)  #4u3QWNX4mXF h=S3 ZL$ ApUu@@`9_ro; g1*[ ACN:+;^iشְ hA4x{{Nuy    ==@@@U1ձM@>~qh6w $PWwAlyav @ l1(Āad(р"M0AHf )0}7Փ'{^tT\N~Vjijj2I;uLLLT   ^v­'ZR23Zy _9ZҒ,,.ґǚMcp+B[,ؘ5:}FɱW1Ɔloo;*,,MA@@@ =>@@@ f"^tQZZXK;h| &P__/aov @@ ]OKFm;9ݲ_xښucII5bP4.vV#zoE"v]o5@@@@ Ho!  @BdeeI]sw nw,󲿿㖰;/ýWVV; f&Nc ۽TC@"/Wھ9?CY?Cn71;7'!^je ]n58=hQq\ 8==Ic;7 hM@@@fo  VA]5 ķ Ζ&)^Ð QS{=i@ 7  yyߐ@ߐA{\?>>n?/7O:;;웒Bs܍CŽ4=j^UU{ɼ ϑ cG@@@ .pB@@? n w{}o GNA 4"yeӎUnR@y|Ǥ7IRre[S޾{KvVtvuDb:k(DR`{{[VVVdZZZū/$GGG7     @@ IffpQLxÌ('@jjD022"[[[$   EHfksX?[\=V ɹ+CzFzv{Ӱ!Cd3vu npW3~:cFs,    <N@@6{ ۬ؔ JMMc#:KNA .3>~XdxxXz<  *&m_~׎SY_R>'Mgdqa?>>!{"{kȞr]CڗtJzڭ#D,8ѯū/5Ա3    `?=;F@@:tsnsXuQ=zddd[]]8j%MA rP#Chfweftנw{D0 H _/KՏep,}J{qɵA3280('ǎM[uuKNn>3in>0 ,5::Wq߮ۋvihhW1   q$@{   tfGTKkkqa)$f wo/>==Mpi@@ NG~H?V\V__ni r_\Z4u\ZX6}%׽` $0AM;=v    @| V!  RPPh"wbʚmnnQ $===n*dnI@@ o/}N=Oj_z7Ie1JEcl3֌T3pcccIDp7%dž޲Q    ėu>h   hii1:55ed[6V ,DN3䞚SyP@@G NZ?i) Qٔ7~W~SrSuzTZZ޶#ts!\Y.;ILLL]{d,Lŵ333oUMMMvv   1Ø잝   _ =Ѭc Yoì@ Ņg+u8]D@xXԜli՟ ۃ Y㒺b>>:D(gnK0i999qUEEcfBߩVWWo.Վ:f@@@@ psB@@GY ƦOAlmmʊwЇ}9| ###76}ttTo\7@@NWZw$"F.H}B2ܜ,.,1Er}]cuQtAwinn6Fs/<   <h  ˓JG.---9 _ 55Uۍ'''E\SH$`p{(c&&&DX@@ }si$^u(RsTr?Gr9c݇ rO !}wǹb&tFjdo%=4I|@@@B@@Z+̌3L}O\qqс@۽2w_C \ܮ}}}m4M?s<)  )qGj`ҹR"){u$= 3}'.G&s,_PP 555:f&ۉHw:k!   @p0G@@ 4qj)hiitWe޾,p[p{aa䞓ctvvVz*@@C %#Cj'dgը|%%蓒6 [M[XCX49Hn))ՃruulD    V"  lٕ5Нr?balllLt8s ~-===//8TH311g@_2jTg$/cr2GA qc仺:euA@+!{ @   Opɉ  ij@efzgC~ͰL@uuh&k{988y{F wLoo^uD:|\q0 ĥ@No?a/D ɯK޿c^.]/Cg/YYYlbzxxxXf@@@B@@|!j/rttdb:<0:9we7=ty^dttLW"L  %.srKcQ|Rln_X,S.Ao+}4fowVcd<2.pqq!}c/J3$L#   }qh$  @IDAT/vٮP`ѱ3! Y׃7ʂXfLOO^ehhHsAA@ɯ>*o@y9a52chT$}kQr%e2P7czS^^cn rrrXFrrql@@@x"  0;;qp+++cnځ!KA <ˠ.M͊HA@xX<66&KKKFCr囤duT%EIb rOIOϵdp7Ro86̕gqnnj^'ם3    a  O@z <55心kjߚ]RWHO` a@@0}uuyQQ<~Xr;Z 27U\vf+"'֢Q rȸ){3:WފQCBCqwd7"$Y>^233CZ@@@@ pAk@@@EE9Ck)^C8[@ n6QܵGuuuuwwW޽{'<]  @...dxxX֌}HOOh]-y/>%՟1Ml,SEg)H#ZE#=F*,zb/I]]; ctw    S _ y@@b(A=2HwW!\{"P n~+(d_޾}+  `!NRVV&]]]q棩<ߒRj7ΧOJd~g- oliÛ \ޓx&.zOČh{ill r    ?_y@@H@;Z#J@VV4_c.###]2#+hۏC?./GGGG@elmm[֑:;;=ۃ 7_/_< V/?)ܟ ۃcg!W`llLa/555RXXhbE7W1   > g'"  벸.( CIG3<@,ۃ9zU5؝  S.UUUjjiߓ{37Χ\g}sR,) r%{2k=t5wg {A^h7ow@@@@ pA[@@H )//w`8꘹ca g766QB lvhmm ^XAWuL  DF@;{N Y[[qb,hH̔O}R~%%3Y+)GݾSWfW`d~&o Ys^Jee}6˺    I   $frpW3e<22"KA YE5;{b}^@@Р7oވu#츗n{KZ>iѬe) r/_w{JAȁ32s~eYcxxCG4HWvQPP@@@@z@@Z@fihv?2N@}}96:f@<QFs+daa!(  w?@qa>땶/}7nѱ¯J~Vfgd!dp=s, OOOdgg{8,&>Nn{{۱B)++s1    ݟV#  &IMuzzA⨡LyÛ^:щJSp{Z}_MƌluyE@Y`~~3;*uuu7o wJѿM)ևѿŸS{hn+$g]0@ Icᖖ @@@3ğ@@@@  w^"0ijnQz*@<Dz{{%###Xu*ta@]-jffXX;6k{/c;TI'~L$5/7-d)Y;=% rvV{X8tD fDF@;NGƗ    Y   $@CC`"[[[ ~; rPORPa&<΂y^wvv͛7F`L  \ hwdmm.8)}}},EHfksXI[ߐ?euxAen A)$8kjucc nѣo5@@@@ pSB@@H.SX7 33!*V@{rƂT$jVG3    8'ιH@@febbBȘVv"#p{bdH9ɓ'O$Xuzxx(o޼:&@@Dk u #ridHɖ_9x?o[r25X/%#0,f7㐵cvDF@GY4S>@@@S<  q-6j)G3 âBHkVn V]_j!&@@L8RcIJW99rU&e2}wB\^3RS`llL@uO`qqQ4Kmmi@@@H0r8  E@eiiIvvvULSM4Ki{x $zp{SRR^E[pt $ vs "2|?/}NrExߗ| ,N){VŒuY[[sơ=c!f^_u8E   Nwߝ2  @bdffʣG h,w]E34RN Y_]]-===[5PG? oi@@Oz599)}jYoc ieR lr뺁3S+ό #NN{wL;h|    $}~9:@@Zx(1oaa!z~;d nӧO " 8>>nlDk    $9B@@Z ??_A}y3Agg9ZЖu$_;7e-l޽  mbF5=JNo#M=yDW@?;F^k^N|PRR".+#   pϹ  $@SSh3{@[DN@Tڌ jV4cA*Zvj_f$~fmhhB;69c!f@@@@ pO   O*~]KM@UUL3zt#-~nc]K/.  Q<[ZZU_@ai_Ԃ{n{a1TN;S"'Kx}OsvvvvĖ@@@@ pSD@@H2?{ч*# nd:~R3>;榼zJCK! 18887oWlYkjj۾YھY4G gtˏˮ~`/Q\;+%rj`nn9A@@@W?!  , cCCӥhJbW˓OJAAfpzfE5V@jpKVVuw=h!.k[B@&(rttʯNi`n__444 PLoiJ>j<2_(t1TWK^[ZZ-k#   k}}h<  )PXX(!'&&u_ ''Gڌ QOnГ'Os 3>Ox@@@?  -fdI,}ptŞAÞ!2L)))$?<./G@nؐW^yvDMKKCtǟ,+˒2iL{db+:RА1ڒT[[MJ}ĄqE| @@@R<4  1w^YsTf#_S#@pß+4sc$ m~4cddD4 &SSSֵC^^<}Tt$,JRRS%==]zzzA/*7]G[333"Jf""emyX@@@H*ܓts  S^4^~lдfJ22WvDXcs[fvwuyL^y@Hn#y,..zBTWW˓'O&υAa,,,ʊ kD&cA*ّ%:yjiiq1   -@{r@@_hеS.F/2̇/+ƊX O l>2Q4`Mkt   `v۳W[iiiVV0 =1֖ggnZZZ$ѣG)    @P   RUUhٙ֔ TTTHccql =>KU3)//V]j qJ @[B{ddD xQ;cg=ZzCCh}ǖLG    vL#  @\ p<`/\A"8dd \ =::T$nba:BuYV5WD_)  kYYYDvtAQƵӈjy{˳u&Jdw.[y@@@     wwnH>`\džOOO@,1؎4C'O$''ئ~dffFS @K@߼y#]]ǢQ u< :LOOPa/eee@@@@:ܯ@@Z@3lUTPYYil|hhH40;cg=h }}}R[[ۣ#yՙs*@@AWGCzz6Z;={L =ߧ2rszz*FGkDjmFGZXXpb)    Mߤ{   Dƌ`q{>lXGG3LkI  66'8?^ѣGV{y  O@߼y##KFFtuuIggh4ſǹϙfn)?D^@;xeׄ::@@@I_ln=@@kRpQGGG=E 2s'}tc/փkrLOimԪ[$%%hf`9991ާ@O@;NNNJ# UUUɋ/,I ;Et%ozoA{<*   $ u:9@@OjC`'LX3A2==' nOڡ t/((X__zO% ćޣzJ<-(Udm$u%Awt#tt뮱g}`qqq@ک@ݽ::d@@@    kͶiԔTDF qomnnNuy '---ffwމ@A@QWtA9>>6ؔ =vww9-aJGrf:QG@@@kp7@@@/eeeRSShn ap39556  B --ApFj`jЭhP(aN&X-^QQ!/^}*ܮA333|C@ )ziiI^z%{,Ϟ=:== quD3xddd8ꙉރLMMloo7~30@@@p a@@+5hDU"7((e{{[&&&UL(@p{PI~4W' y+N?@[kscG\&ST$A9͚A|yyxggTDF@k=@@@HTgA%Dž  I#P__/Ŏ=== rDO@;hhK.@p{V,@II<\jjjiii1>p211!%@P`wwW޾}ku=>>6P;zϥx Be{uRP6TΊvt2O@;靬v@@@@.Eu@@@=X]\\$3gP3www{Y[[9>Y+nO3+خsLJ244$FKD@ NyyyySinnI}r]O4]{qq Xeݛlooɂ   W_Z+   ha~zzjS9R+s{SSSt0D!/h deef *[[[k̴^P @ 5҉v*̮AܮA"%@::`UU5^*++E(    @$p"@@@hhh"G5])|٢5[ۓ?qˋ/Ƭ˗/evvVϯ]7@HD@ KKK‚8Ǭ9?n)"-@z?UfDW@;9vYu     >z  Ѐcs#;::$??q 3 vx322 +))lY}+++~@]@Ӵשz]+ݢ)@ץfff<~XtdJtԧyc]]]׎e,L    "    >+ɜI<gV 4@j LHY~h\>yyykNA@Q@3{3h6xYYY7>}j\W!@SU777ک]95ȝ=7$j@@@@{ ~/>VF@@? TTTHUUɚxhhH= @Z < ͓ܞ gٟX\\li'낂#~W 66f$@h ̌|R rq~(,H 3)..ܴv C 62d@@@ 4@Ժlmmfl|V>υx>;-A zN5ftCD@ Tgzz lSv萧O^!+}, w n Y;UG^3""zAn@@@@ GSm#  oh>`?==5ꩈfhEg6=@II]_222Y9]?׫~kkkz*"/jyyTWWG~l@@@A x @@H*}p)W}||,cccVvJ&&Gڡ1Nϋv6aYޣ֘6Lp{H,T YZZ <<;;4X[[zё( \'ppp 󲾾~cTE vn# w$lcQhtwvOF@σLVVǦ@@@ n`@@[@35fg e2蟇1h@cO54;t<,ІxЬ8USScel@jӑ4꬀wDHJ=+]n*^K^7M$ w lAeeګ{N|,T    @ p2@@@XԚ-^4_ 466Z5(^4A?t?gi`C 4kݣ#4FҸT"DM@ںqzmv>Cvbvޥx+]iau$b @@@@ B}   dcc 6z3.(Q~mii284XC3=?D!!٧RSSE[5~4`q4Sh"_QQ @b ubwwʲ/ 䮟uwr=B9;;FWb^( q.p~~.ܮ2ҼԑʴaУ^233ɓ'O뫽lMMi@@@@Apvv  ~hnnwɉ ؝q/vj0Uh稏 d[\/Xt/^HeeX讙5;@:77g}OMM^W_W4Sfsk@Ax wkpsmϺfpN`ttԸk{B@@@n B@@RRRKCy;b&]Y4U%4` e{.Y޳G(^E;,--Yk1@@@;#MOO[Ff{+**ٳg-F( UAi4kfsg쀚P f%=NO6B&k Ԡ5m8&`@8uǚ];戞 6>11an hgaY;9v-gO    '@@@ l /_ l{zz$%%%Xk4럞1Ǟ4f P J!ߵ5XGذ`o)YL#w7[I;&VUUIii)wgM& Y\\4[WW':2%F&}/b   (@{P,  *UA~eF:J4C{{Κ. rL#?"ѿGYBgu׀Kͽvy@ 7[^c-J{sa33ƒ}bS]/3vf]?oP   ĉ@e@f   ЌtF5 ZyyQOEt&''e~~+I Lcd}̔>! +(+% Z$55 @ =iO=:B U333}>*<{5zhgׯ±Zw     dpC@@@ >0 u2<<,ϟ?*<;ӧ)%Nٳgg@@@W.@@~Z}5k0Tj~ۻ5=c   @b h{JFLG.RQQf@@@[Ըm C@@|$PPP Fdyy٨"a=u@@@@hX:Aؽ(f n7T@@@@x =C@@TUUI}}^͞cS]Ly䉤\GA@@f ˋ؃CXQJKKɱ,3    pY   GIII@zЬ)ʒ4n}c@@@ Ye``@NOOmɑ.IIӷ@@@O}qh$  E@k:p'''VŅ_%ay0   *Іs3::*{{{ݦIoo;A@@@"@_D@@d}ewwWULGY>(#  W*15c^3S@@@@ 3G@@@ rssݍ\YYw5QA?y.(M"  E UfOAD)ذ{z葔G@@@|%@NE@@? Iss䉉 4ꩈ@0=I _읗Gnl @@@8(oG"=0ehhQee444T    ~H|[i/   '"hrzz<!*۷%O*%Sv$y޶/bM]fojj48T @Hkl_~YHBRXX(EEE`X8>>?{gN8eYŲ$ˎДa H%@ze=a-[Ò(;h&@$-[dIekɲ%ٲ?;3Wdɺ=GμܙXw._ oH^^,x[VD}FO;ydx33ljuӾTI;'0[~~mݺs/4   ħn5  đرΜ9qԹR+䞖 _qeg?x} lͦ4@RoĄ9Ξ=߬R+))q`:VD }Qb$=~{|'azrPYYEJ X{:_k{I{{{}׻vrx'y}ܽ{"|O]m6n    *r   *pAKG{TTn߭ϩLާiU=ݲe)(@CK <쾘z )..v~TRuU_@W@B~DvKΧ2Xz x_+rj F\t'@@@@D (W@@@PxiΝ㬯w[@ǂnw`vAw6"aQӡSSSڳL wSSSVF''NqSt1-333jWPbX"I:kZkkr->A޶av3   ĵ|<  ěÇMýMUUxK *xmN]4@`|UhIMNN.mnW @[,Z@-+$(ئAvnv j!ԾXAG ߨNm***L!Dݫ<cਪ*knn^7a/    @ p   @rH*xWZ^^^D?3 ,W}!۷o;zUl͖cX)bvW牉 SŶPཤ ,A`zz:fWܹsK؋9߭z:BKz#6B(033cv2MꦦE[Dݫxi>?={6bGܸe˖E]0   İ8  $ܜܹWOrH_Zp{xw^w6B$L eq'4*/eff;OX" ){ /Dw( ,U@4 2а]r_o# tA۶m0    %@=.''  "*y+{*tJTJT}WUNUMVEd]US!! 8) SSSK: ;Q (R(W@_._qoo GHOۺuG3   $D   ĕĄرvW'sv;v>iiiaz< Xmg:Awm\'p< KiVKdDP\>O>mΦ`^T]JJJT)ݡt_lWlڵn@@@@ PA@@x{{ƍn:_w\p ɻwﶹ9yUżM69A ,v׫*/߹<'~4~&0fW]ҩj0nvÀ%Q@k.v---VQQL}Xjkk!i@@@@ !'e@@@ СCW\aA |@Di-['V^B\o   q#@=n.  $z[2c=~۵ktת*kjj"tI!74h91{]~}yU`]у@i @2 پ}|c В=>::j{]5kX{{;>:@@@@ Y'˕<@@@ TiOjjj 1/v[aN;uz-//w*@M@A3gD5l"*+ԗGy_@KkNrss {AASXv]c 0x)ܮXjӱ4;۱clݾS+..^GC   $$؜*  ėd]]]зXEE;-b+Pɓ'ݮkaamڴɨ "ap쮠{x(ZӪ}ABA2`|Ae&n=(.mVi`:yyyV ssssN51߱͛7;| c#BTG H \@@@X5F#  P@Aƒz\yYYwkkݥuڳg?~ *Bx4@V+M!wo@~5BAAXvCa^ $ߟxT]"o%~i{'_˜ۺuk_cf@@@X)+%~@@@ePԝ;w {_-B{#G]Wڬ4 oxWݝv_ŞZȮ4@ (0p{@0=Uy2m!)۱cDw*# @@@@;@@@ oUx8ZU ?^f%~;x`xWhɪCL , 7L{KOO^WPOWh +#p12rkiixH!w}'Q;An^B@@@@ G@@xH?'bL{OOO`ȤҚMi W@dm ^3XwSQ!~Ri+s]+ p1A\mVWW,:-䞨1"   @| pQ#  @ *{+q[nuM"]SNݻ}JˋT ? /6m.w PʾۓCbM@z{{mttwh7|#QB(sN yf0b3    F   g8?'dEU;;;̙3nWU׫JC@@"{qꙙ=F~~oYv{]4ĉKޞ|'F    ܗ]   [ɓk.V-((-[bKp믁v1+ 5; @@O@Oij oڴ)n;y:5.}XEEy@@@@? p磀  ĩӪm K2MK- v!+777[eee @@@ \NX$/SVVf7nفx O    Sܟ` @@;mmmt,dz)୼u1fYq3  'pa <:Ox k)خ; @@@@`~@@yUwǞv#yǝ gx[II30!==ݻy@@H2 ݷo_`p fVR{ߣ'E@@@ G@@VƩ Ԛwp{Ԕrk[F  ${챓'ON8##6mde!xyZ2|N8G@@@o}8z@@@ $XO?c/w#>B]]]v ߊ [QQo   iz<'ܞbc1~1g ;SSSG@@@"@=    @ L+Xm---VQQ^y 5볡!)))n:2:@@@ 1T]Rkkk4ۮ]Lx᭠l5 Ga@@@X    /sssNŸ^VVB} ۷/pCU_~)NC@@v !iqMM\D^XOLLΝ;mvv6rrrl֭'t@@@@'@}q^  ļ?MA͛7Rpe5(A*5YZ[[t^D@@ fhÇQq6lODwf}rrҞ|IPrz!   ,^@@yq]dÛeǣ1gϞǏ;!s9YQQak׮~ٟWggMOO)//:::@@V@5UOޖnzJRgίF];v07Ulu7=Kz2S=\i@@@@ 6,A@@ |'x"r~~~z{ӞTuSB-bm签>;csss#`ǎ馛o~sD_ЌoGqUJ]w%/u:No~h}/}iۯĆɓ'}̴M6ߛс  +*7q5+_JZiVAUUUV]] 7448!󠝎٭ZTWWg_BAAGFF{b5mꪫn&*#   Q  @@@ 񽽽0` ַFὫBZw@*}ZtW\a&;w_;Cu]v3www~n{ի^ex;ĻoСCf)pBL?+,Xwz/bBgm7n [x6<<(SRRAA"TI  (A>=U Hpp){O ^ʮ'i`Ą'O~v~?iz @@@@ R 9K?D0  \k^QۑCCC n>ڇ?ak~[~o|۴ihݦ?+~#{Gu[=//^W8׭[geee6>>nP_!y=V~m۶mZ?hk׮ ꎙSU%0)V% _4  Ė=^EApE {PSuGn]{vÃ*V2{'O:/~W׽ً^"{ֳeӏ+X?cM4-oys7!   A;@@@`Tum֭Ӄ>hgL_ww[в5###<`v[ *ͅӧOڑ#G»/:p?lVT}wGL #1ggۈy;iW_}6`bC;vt^u?|[}}}Df4iO{|_dv'A};@@@H$8GN@@I?կ~ռUĿ,x~Pev] 5k?]Xccch:ڄ(??^؝w9o]*׾^|U£T+BBU)|'Lh   {OG|'Vg0{=gUU}M돌8kOӈM'>p{Ċk__(HŸCL    .@=??  BxyyoZjn%PgBU㚚B"xn!,h U~S8c}wI{衇Y^=e+//,1;v̷@@X=*ଁw 9997)zzz O3 +uooғG]lFg#VӠu7D@@@@ 'E@@@ ?h;w.+_e<@|Luu9w*VUUmqȑкnZ3᭬GӢ =~nnTI?~@@VR`hh456ol+yI+,鞷&j])Zy@G}C^o/fO]}աMΟ?osOh @@@@ '@@@ &T/%%%t,p i ny_߄S^! kЪZ>33_3L۸q_:Xɼ(v!{'mzzڻy@@ 7S=Jwh---2x >J5 [NU{x{[jzR[m؞Y}}Rwv    @B 'p2   @ W=ж}v'ЬTkhh I2 E۵*NLL8+|^׺[ЫuY)R̶nj.=Yvm!  uY{hȴf2:O@ëk`xvv ڵ+t/] ui7tSh~)]wG?2|_ʾ@@@H$D:;@@8JU4_L{_B?áJnT)njjʺ"z,{^#oW^ypvvֹv677[N  ,*h{~oͧG{={58^Rk_ 755ne@@@w>   * |_}{Gǒ/[ή&<@hzzֳBǎQ_+^Wܹs|'?I{M!k Cs-&''Ӈ  ({!U߿4x۶mP0u=M]\sw5@@@@I }n@@@!paԧ><<|3=.Ѧon=x޽<<^9o|c{mǻ}׽ΦC9rľ/;? p(|??OvS`9ڡCxɻRŚ%oKn2n׀fCX@@kǏfff|瑚j6l0 J-]ࡇ XUu/8n=便nW k`|MWWZCCC<3    '<;  ĥ??2>})؇?aKKK._lQSQ#PkmmzWWWmuUnwZT=yn|/~hxsk:栠wF[~m+)ʐ u8q"H欧WfD 3  $T}pp0uf\[򖅯5u_|dށnѣQ-[ޣ]lĎA@@@ pЁ  ,^W7 x}]ruk:U}QgGwK^L+X?_:4r6}vu>!]z׼nt4@)q=[ĄѠ   ,N@U58X߫ZUUVwlt$ -rhr{{VRR>4    2 ֖]!  P`\_uv=oN:B a?uwuPEݻw;Cq"++TUtzJ|mvv~ӟڟ??m˲RRRL[FTwR gǎFp@@P{,0ܮt{{577{oޘZ){nF{m333o̮5XpO_KC@@@4*_[#  @kkԩS600Vc]?_ _B;Cxnv.BwWZuuoh wvvڦM]k>m,U6;yqNp$ Y W(c۶m΀q›ƍ-###|1   &077gD<<<daa0;;NEf={0Oٳz衈Nu}t/6t3#!   qe   djA=88hs}k_3"N0Bν4B?{G} 7Pyo]vYGGEC֭sr,T?}_&{_uk:rA" 9 Ǐ;().._4  ^`rrҺ u~zӀ_ h`B_r{;i?Wm/{rtOmA ݧ8 @@@@VF uev^@@@\Pi'?iGՖuQ 47_:](|ojjj|sN;wo|xhwK_^x홎.PYYi Vuh`^H/Agzdž@AAAāEk:4۷QZZCtg'hO>m?^   $dp   pxD BU؅ .x;vwGnǡ?϶BwVUU9+**Bۨwwwrۼcb~NNmݺ u ,B>C@@ fffB<ʜKMcRxe}Kپ}{h3wPgnn= -_mfiiiM;;;{?veHk_C|3CL\>U ꪫH*===Tзc:@@XEUj?p4*tXzѶmLOŏܜ]rOݣ}p[[3lEoo#G?j?O".6344do#qÆ vW_lS#   I!@=).3'  (mЇ"MղΈ<9ϱЦB +q)M^EB?Ȉ)T0|v-ٳgCݯ{Li#̖-[>tmx ;sLr:@@݇hpAMOR=///h1}1*gx;8B=LOjii 7|s侁>Kwq}_z/~ {`'Npg><    @ ="?   pOnF{C??믿>Է USp6nM_~ݻwvc'$x[n뮻TOdz~S}9& o]N17: Y ; U]U۽I'd@C@@ 4WOTJetłߺ,{dYY>Xk׮-_l>Oۭjr6w=k^{ _Tr=ν#< ss A@@@X{_|N@@bC}{[x6Uvkp}P݉B|3KzU%/}Kë G_HrQ(_W[nnϬ* *AC@@ =VoPxu?>ʻ_/M^JJJW^yYfnXWWg7o~30]~Qg?&&&S_i    O >5   jDxעV*r]4}{ӛ޴_r/*$^ҕXYFSBoSxSNy1  @L LMMٓO>5^]]PLU;2kmm%@@@Hs-9@@@ @@8uprr2̲lÆ VZZР^@jj>:@@@@ ЗC@@KٳNӾζ-#~TSU]f'@ @@ UzrUUU*iiiQaA ;wcmi&.b@@@@ '@@@xPe޽vQߡ+̢J%%%etķԔSs||22bA 8-@@ Nfffl߾}666xXWWg+ ]]]׮]k7n@@@@K ~Ʉ@@@`FGG >{MMMT$w*tرQjjjBt" -}}}vUnUm \Ng| >|عAg!   $=   gSGo+))6KOO.b>=ϝ;x6 ;}tdddXSS.3z6=òG@@@HbI|9u@@@ TQռ>;cEEo!0;;kCE=B'W  (̬Gz +ܮ;-1N8Tn׀eo[f$&/     Tp3   öo>Sjjjx%{*:k:Uv! \>;x ~_בZ ttܷЉ    G*Q@@@K'Oڞ={Jqy.5AU}nn.pP]]muuu  #d UUU9ҢB \[---nݺ8?K@@@@`%.F@@XQ)4z[^^mڴɨIi'p{}}UVVZjjjX  4}w2}7֊BhrWW8qw6nEEEet     .@=\i@@@PBUPȽл>;uT3`ʢ@@ [X|[fMUO pI:f<@@@@ @@@ .\`a߱ƍܷ8zz<455YAAApF  eT]߽5 6u` i_c@.055Tl?zhԝdddX]]O* 4AO:w$|@@@@Ƕ   q!088tVպkkkї044dG=r[~eggG]  @" HnH.\<q?Cg h޽{MߥҚM    *@R@@@ .T;0n:۰a;-n?pA-  0/ ɨά |ZF    K 5A@@KӧOݻٳ/,,v-#*eddX}}:%))я $6==L悂 q4BUY񶴴4kkkR"@@@@$   &p9'>11;l۴iёN~kㄼ֬Ym@@Xw+++sVN{e     p߇    (p*---v)H>@@@@ \@@@ .T{޽0Z{{镖333N Lah0|%@wagP|t9'Ouj @@@@ @@@ &&&lݦ@)lE'Ԕ ѣGyZZUUU9ą@XIY'~С{:O-*((pxMR'N8v 6ZYYw    ae   &p*+TrÆ TIq7 Ҡ*FC@]@d=u6_lkll$W v'߿>//xU    +%@}d/   @ (ܡ* xhR ^s*OOOGHIIr%U  pgϞuB E]zz[eei@-=+M=H!$焳G@@@VCj   1-p) yTWW9ppG@2<8oTMYYtg6   055  (r]]O$rQѣV!ZZZN@@@XM{#  ĬA6nhAK2YvfΝKJJ{qq@&p#GD[OKKs9,L wiqaa^EC@@@@`<   έ ަ2;8 z@C4@@`!zҐǎwu T]UU&''4@"MO!    WSF@@ @Q $;Ae A:wshDL^^)++#L 'NpWm{tCCS'QH@@@@1r!8 @@@.S`$UWW"TҡOXtWELXUUi -077<-СCQɮ@aa+]^~Ӏ oSL#    (@= DŽ    #AM4 ZLNEVUufN]i  Xz2Аܹs\IIl/**w=&̌DLj--- Lޏg   ąL$   @ ޽{CT0yÆ V^^[F :[*l륤n7   "kA%OKdUl JǭΞ=[E%ҁ    @ p   ğ$ (P***04 bClxxTuA η@@ Ek $y*P4%%A0@}~-///p9    ĚX"   @\ (Tr;x`+F$PpUpU5W\5k{AAA.F@rBȣN 9!HZVVVGЀ =Qɓ"֭fcm     1*@=F/     q{JMMMVYY]<>UqW5wUx z 󵬬P]O!)Q)g*N@@@@8 'D@@OO+oXCCUWWi,TرcNb9r…@@`6<<H@V_`srrLvK#wءCO';;xN    &@=Ѯ(  m$Zpk ,l3?N&BWGmlǀd?]岑riy D> D5?# On rZ @@@Jo޼Z=:ͥׯ_@#@ @ 0 @J!xgffҫWRToC@Uv(Q@2Z9~>}f'ƕ4 @ @$ Mm_  @ @GGG鯿JQűZˋ/r2- ' @@Z־KZ>Xv^ @"ǏF*xZ{Tk L NOMz˗/]y @ @. G'@ @ DUݫ,侰Pme.JUX{GGG>.$@ ]k橶wWSқ7oa՗24==]u @ @# @X">Wk333Yfxxj܉nkJak }+W*ңGRT nM6wޥo߾jzY  @ @O@ݑ@ @:@ `wgս ͋/rBw!'aDݍQ4l "ppp}ODP{\&Bq8Ox EÈ8;/_|ť WB)d @ @[s, @ PZ Gʨ^g!j-#P˰nc{vv6 Ge @@'''i{{;mmmt||GFF.C ?OG-7oR+ıի%4 @ @/ ~S[$@ @kkkYUʨNYEDU@"|WvJʹE8-Ew hWvk椢e}ll {Dqǻwҷojnuu5={,c @ @' {~M @J-;~Dpɓ'j I2^* SSS^w qU^@{8'5tnn.gf/~GȽZ~:@5 @ @W@F @J)T+311zT^-v{TwíXV=" Dx=G}kk+ GȽ<WE ~/y e0$@ @ f;I @np{#^Eٳ400Pe +p||Uv7#~5'~Aa#*ggguzW_8;;ۅګ;YZ\8|>j.^JΣ @ @t{gΫ"@ @- 3b,,侼u5 /Պwvv.Ý85055fff*"O\~E[nLTio|E=>5e8)N˗/bՖ @ @ pw l @ @QÇYUZJ/^HB,/@Ts޾ V*W6g~S%FO"@ qZ^=kvKʼn;gZGW#Pfx?{.܍} @ @ @n  @ @@7o^*\F%k@'f, nI WF:[i>|[Q" wyJEZ^J=r @ @I@  @(EZ__O?~LբeTtWe8>>V ]{T| Њ@\i%GEzըm?W?"$SZ[[[iee% @ @ @+ @ @R DUϟa@IDAT?/_ӓӧOnU" ;@ (okeҙ499[ٌ WU?w*JКm9W\P{|6 B 3O5Nϓ @ @?W%@ @8::J߿O߿QٳgY=bj:Y`2t8ǯݜ(Ҋ(@q"[|δh<4*ÇYk8˗)N6 @ @({Ĉ @ @@)"x۴]sŋi~~f+t@VuŃF{hhZ=©L#@3NNN坋z\"qHN4kK&'{.{Oz\ XN @ @@ 0 @ @,"`a"&\VxǭTajUoVzITe1 f'DRdUnt Q:q@7 BV̮. @ @ $ ^0 @ PV쮯?F[eGFFju@G ] Gȵ-cccׂ{;tm@s'}E  q_:[ ~soϵ;W0XYYINd @ @ oN @V {?N_|IU#ӧ)*QkY 3B^zWݹ8nWw` q%DfxoO>8qV[XXHϟ?OCCCXN @ @@A :1E @,pxx>|^s7l#55O * F5v<>>~ttm"HwGv|o C6:E k`qe/_fNwA @ @ܻm/ @GJ޽{Uŋi~~V t@k{jUa^}bb"{,X]W&###)kh{jՇEׯ_o.b9 @ @%p/D& @(?jPONNf]< >E6‚~yL===x `)8rUC73x:{f%еq2WTlܬiWϟ?Oj*YA @ @\/%@ @JkkkӧO)*jsssYEn М@"6tKFkZ kzq^:$ I"y4(ߏ?W+JZ]]uH @ @({Yf8  @ @@D6B_|XrzY=N ¼y=w"tdqj<ٯޟK|~Q=OLLd'|AM2+4$'oX=Um @ @p9G @ @B|}ب9G}iiIܚJVhM a>[GJy}rP׈pk{LPK$_ Ҳ@kqM }_MOO/_fZ},'@ @ @C{@ @J-PTһwvlj@qvKy5FZo#XyQ^=N¸V~^]q>gku@߂Vdr @ @:H@&Ӯ @ @2 #Ydn{p E=B-ѧ>ѯ'ED%Vnlj= E ͚ٞ_{& @ @:N@ @ @ Dvmm-}1 Kړŋn> pͫ_σ7^j=7o%J%NϟS{{{4\c!еqu^ ~}Izvtb  @ @Y@g߾ @ @ DpӧO˗/5OQ3>EQ#@|8eiS+ _qBHyDj|Y(@|'2ֻǏ  @ @) ޝn  @ @@)"Qshr +AǛ BwY؜կG5hv P kswE4>>^Q @ @) ^ @hHRoߦ#VVV5 PJttttYQ%X{x\jq"RjX'&av')=v gs\'nVɂ=r @ @L@& @ @2 #{. ڏGGGku”7RӫՐzp>?T q˳gϲF#@ @ @@. K'@ @J!#0Ǻ@cgj/ž$ϙFW5՛ Gu ^}/O<~F @ @7EM @B */_Z̤Ozݬ#@hR`oo/}9}3㤙*;uZI @ @@w w{ @ Pz׬bhT&''ln @"PTҧOfݞQ=*MTV @ @   @ @@G\\\dC~}˂sssn_+  @WV}kk߅UEj{To @ @ Ш{R @ @{T{TFFFjzq: @@ 﫟?fo}5<}47e] @p5͉ @ @ 𯀀 @ @].pvv{T2LTn @ #>^wL}}}iyy9=y$ k% @ @- nQ#@ @J/p~~}dtJ @C dk677a`` Gn_+  @ @ pWw%k @ @@...FS߯?cccY}nn.k% @>`_PZYYI)k @ @xH @ @@)",^Tydd$Ǐ޺}$@[v @ @- ~^ @(@T@TB}IZXXHg'@/pvv]yqO @ @ PG@U @ @ZQ=d{zz\ZZZJuZIhV`ww7}5}-EȽ^LO>MYG @ @pP~/N @]`oo/}9}]ɂJ PG ־⤻Ll @ @xp @ @:A0 GՋU⢪u$@ 4S=WW71 @ @ - ^18 @ @l˗/)'''_U[t @]-l㴲FGG @ @ PNrΛQ @ @8??O?~Hi{{Ѫ~+ @U0n*+;K @ @@g w| @ @Y۷op~ EjKKKibb(a @ @-d @ @@7n'&fMG}%@ @ =3 @( C!@ Z{I @ @J! ^i2H @ @SZU[:~ @K۷o)B5o @ @Np? @ @@iTu/8+Z{]+  @ @ pM@? @ @/ρ @vE @ @ @ܻm/ @ P*ׯ_cIKKKiaa! _ @ @ @>s{L @P@UN! @@W Umg  @ @C;ĵi @ @]裡讪]&h\j틋irrғ @ @]$ EmW  @ @Pս @@yTk/\) @ @p/ߜ1 @ @?Tusssidd?۳.p||~}*UM?NW @ @uXE @(@Ucdz{&x  @NP{۷zzN @ @ 𯀀 @ @:J gfOOOڷEU6 @@' ʹvvv5b҉ @ @ 7Ĥ @ @Tu{vF:U BQ=BJTa*  @ @ а{T: @ @/Uݿ~ޡ˰xӑU2Ծ0499t$@ @ @sҋ @ QYڨTk _'&&: @@g ĉ^ywv`` =z(ϧsu$@ @ @ܛқ @ БJ%ÆqhhZ]a:  @"Ȟ#hP\jjoN? @ @oz: @ @vww/ eprrRa9  @][.`P{g @ @ И{cNz @ @R nlld!faw<<|v @ @# ^0 @ @@i. 2Paކ#HWCGGG D}~~>hy: @ @ @ ߯W#@ @t@ݣrn*JaGeAÙat$@@w D}{{aPxӑ @ @N@2 @ @/QawvvoN?t@jȾWNNNPXӑ @ @! ^y0  @ @@ ]ݣnZ=tyV=B훛P{糫D]#@ @ @ w @ P˰_wOOOHmrrRut$@@JnPro_GFF}~ @ @ PpO @ @:M Q7*6v>55uxpc5(~ں 558)><] @ @({&p  @ @*pzzzv dapxT.EB U:-Z\vjoEs @ @ P^Ν @ @:V y82[EdK II)Gs{ppkZA @ @- k @ @!Ю#5h\,moo_tō+ @ @ @5k @ @(a|+m||Z཯x:VĝXJ<'탃ls @ @ @@SMqL @ V:Ν{x  В@\booZ=WNQ]#@ @ @- ~^ @ @Tpں zWYm@ NTdJ%&"Ȟ @ @xhO @ P*+mooӶ?*'e6B@9Ue`{,kGMiff& gϘv @ @S@E @ UY^+Օ{~?::*UGT+D\JDGTd?;>>?" @ @ @" yv @ @Bmٗ Bmw"azׂfq2L[tm @ @[@Ž @ @@W DUJk< |ZTfPe>B+}Wg#ގ6440{, @ @ @@wL @ @ D6Q]AkAGtVLh>WnVfբ {r600Ю @ @({!Š @ @UjXޮj vJ/B[NFN0\  @ @ @fܛӟ @ @= D U*^vzzDжZ=_ztm=T+ybIDn @ @  @ @@I"{v|||{!<^N_ 4#pvv؏D=P]$ru|~Z=JU$  @ @ @  $@ @ Pf GZz#>44T5w_C:] ֯z~rrro {A#@ @ @poKo @ @*{{{UoG8>q5E]_ G~!jW.MN#@ @ @~_@ m @ @@i"@ݯ |TWDzS9薁8٢[~\ާ0] 9^ @ @U@[g~ @ @h@Z䤁}< N] FWE(Iu 2ǁ @ @ @Z  @ @t@ޯ>0|ޢ{wwn}*1y@=E<^>N#@ @ @- ^1: @ @Q\#Ш@P-/4 @ @ @?'@ @ Pjo[򇆆0{~!}5 @ @ @s;wn @ @H?;; F D輿?e[oo Ζ  @ @ @R j  @ @V[yͲ='Rh @ @ @vC6 @ @h_+ _^Q]#@ @ @= "3.4") withAutoprint else force)(\{ # examplesIf} model <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) r2_nakagawa(model) r2_nakagawa(model, by_group = TRUE) \dontshow{\}) # examplesIf} } \references{ \itemize{ \item Hox, J. J. (2010). Multilevel analysis: techniques and applications (2nd ed). New York: Routledge. \item Johnson, P. C. D. (2014). Extension of Nakagawa and Schielzeth’s R2 GLMM to random slopes models. Methods in Ecology and Evolution, 5(9), 944–946. \doi{10.1111/2041-210X.12225} \item Nakagawa, S., and Schielzeth, H. (2013). A general and simple method for obtaining R2 from generalized linear mixed-effects models. Methods in Ecology and Evolution, 4(2), 133–142. \doi{10.1111/j.2041-210x.2012.00261.x} \item Nakagawa, S., Johnson, P. C. D., and Schielzeth, H. (2017). The coefficient of determination R2 and intra-class correlation coefficient from generalized linear mixed-effects models revisited and expanded. Journal of The Royal Society Interface, 14(134), 20170213. } } performance/man/check_heteroscedasticity.Rd0000644000176200001440000000365214501142162020653 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_heteroscedasticity.R \name{check_heteroscedasticity} \alias{check_heteroscedasticity} \alias{check_heteroskedasticity} \title{Check model for (non-)constant error variance} \usage{ check_heteroscedasticity(x, ...) check_heteroskedasticity(x, ...) } \arguments{ \item{x}{A model object.} \item{...}{Currently not used.} } \value{ The p-value of the test statistics. A p-value < 0.05 indicates a non-constant variance (heteroskedasticity). } \description{ Significance testing for linear regression models assumes that the model errors (or residuals) have constant variance. If this assumption is violated the p-values from the model are no longer reliable. } \details{ This test of the hypothesis of (non-)constant error is also called \emph{Breusch-Pagan test} (\cite{1979}). } \note{ There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \examples{ m <<- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) check_heteroscedasticity(m) # plot results if (require("see")) { x <- check_heteroscedasticity(m) plot(x) } } \references{ Breusch, T. S., and Pagan, A. R. (1979) A simple test for heteroscedasticity and random coefficient variation. Econometrica 47, 1287-1294. } \seealso{ Other functions to check model assumptions and and assess model quality: \code{\link{check_autocorrelation}()}, \code{\link{check_collinearity}()}, \code{\link{check_convergence}()}, \code{\link{check_homogeneity}()}, \code{\link{check_model}()}, \code{\link{check_outliers}()}, \code{\link{check_overdispersion}()}, \code{\link{check_predictions}()}, \code{\link{check_singularity}()}, \code{\link{check_zeroinflation}()} } \concept{functions to check model assumptions and and assess model quality} performance/man/icc.Rd0000644000176200001440000002420214501062052014346 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/icc.R \name{icc} \alias{icc} \alias{variance_decomposition} \title{Intraclass Correlation Coefficient (ICC)} \usage{ icc( model, by_group = FALSE, tolerance = 1e-05, ci = NULL, iterations = 100, ci_method = NULL, verbose = TRUE, ... ) variance_decomposition(model, re_formula = NULL, robust = TRUE, ci = 0.95, ...) } \arguments{ \item{model}{A (Bayesian) mixed effects model.} \item{by_group}{Logical, if \code{TRUE}, \code{icc()} returns the variance components for each random-effects level (if there are multiple levels). See 'Details'.} \item{tolerance}{Tolerance for singularity check of random effects, to decide whether to compute random effect variances or not. Indicates up to which value the convergence result is accepted. The larger tolerance is, the stricter the test will be. See \code{\link[performance:check_singularity]{performance::check_singularity()}}.} \item{ci}{Confidence resp. credible interval level. For \code{icc()} and \code{r2()}, confidence intervals are based on bootstrapped samples from the ICC resp. R2 value. See \code{iterations}.} \item{iterations}{Number of bootstrap-replicates when computing confidence intervals for the ICC or R2.} \item{ci_method}{Character string, indicating the bootstrap-method. Should be \code{NULL} (default), in which case \code{lme4::bootMer()} is used for bootstrapped confidence intervals. However, if bootstrapped intervals cannot be calculated this was, try \code{ci_method = "boot"}, which falls back to \code{boot::boot()}. This may successfully return bootstrapped confidence intervals, but bootstrapped samples may not be appropriate for the multilevel structure of the model. There is also an option \code{ci_method = "analytical"}, which tries to calculate analytical confidence assuming a chi-squared distribution. However, these intervals are rather inaccurate and often too narrow. It is recommended to calculate bootstrapped confidence intervals for mixed models.} \item{verbose}{Toggle warnings and messages.} \item{...}{Arguments passed down to \code{brms::posterior_predict()}.} \item{re_formula}{Formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects. Else, for instance for nested models, name a specific group-level effect to calculate the variance decomposition for this group-level. See 'Details' and \code{?brms::posterior_predict}.} \item{robust}{Logical, if \code{TRUE}, the median instead of mean is used to calculate the central tendency of the variances.} } \value{ A list with two values, the adjusted ICC and the unadjusted ICC. For \code{variance_decomposition()}, a list with two values, the decomposed ICC as well as the credible intervals for this ICC. } \description{ This function calculates the intraclass-correlation coefficient (ICC) - sometimes also called \emph{variance partition coefficient} (VPC) or \emph{repeatability} - for mixed effects models. The ICC can be calculated for all models supported by \code{insight::get_variance()}. For models fitted with the \strong{brms}-package, \code{icc()} might fail due to the large variety of models and families supported by the \strong{brms}-package. In such cases, an alternative to the ICC is the \code{variance_decomposition()}, which is based on the posterior predictive distribution (see 'Details'). } \details{ \subsection{Interpretation}{ The ICC can be interpreted as "the proportion of the variance explained by the grouping structure in the population". The grouping structure entails that measurements are organized into groups (e.g., test scores in a school can be grouped by classroom if there are multiple classrooms and each classroom was administered the same test) and ICC indexes how strongly measurements in the same group resemble each other. This index goes from 0, if the grouping conveys no information, to 1, if all observations in a group are identical (\emph{Gelman and Hill, 2007, p. 258}). In other word, the ICC - sometimes conceptualized as the measurement repeatability - "can also be interpreted as the expected correlation between two randomly drawn units that are in the same group" \emph{(Hox 2010: 15)}, although this definition might not apply to mixed models with more complex random effects structures. The ICC can help determine whether a mixed model is even necessary: an ICC of zero (or very close to zero) means the observations within clusters are no more similar than observations from different clusters, and setting it as a random factor might not be necessary. } \subsection{Difference with R2}{ The coefficient of determination R2 (that can be computed with \code{\link[=r2]{r2()}}) quantifies the proportion of variance explained by a statistical model, but its definition in mixed model is complex (hence, different methods to compute a proxy exist). ICC is related to R2 because they are both ratios of variance components. More precisely, R2 is the proportion of the explained variance (of the full model), while the ICC is the proportion of explained variance that can be attributed to the random effects. In simple cases, the ICC corresponds to the difference between the \emph{conditional R2} and the \emph{marginal R2} (see \code{\link[=r2_nakagawa]{r2_nakagawa()}}). } \subsection{Calculation}{ The ICC is calculated by dividing the random effect variance, \ifelse{html}{\out{σ2i}}{\eqn{\sigma^2_i}}, by the total variance, i.e. the sum of the random effect variance and the residual variance, \ifelse{html}{\out{σ2ε}}{\eqn{\sigma^2_\epsilon}}. } \subsection{Adjusted and unadjusted ICC}{ \code{icc()} calculates an adjusted and an unadjusted ICC, which both take all sources of uncertainty (i.e. of \emph{all random effects}) into account. While the \emph{adjusted ICC} only relates to the random effects, the \emph{unadjusted ICC} also takes the fixed effects variances into account, more precisely, the fixed effects variance is added to the denominator of the formula to calculate the ICC (see \emph{Nakagawa et al. 2017}). Typically, the \emph{adjusted} ICC is of interest when the analysis of random effects is of interest. \code{icc()} returns a meaningful ICC also for more complex random effects structures, like models with random slopes or nested design (more than two levels) and is applicable for models with other distributions than Gaussian. For more details on the computation of the variances, see \code{?insight::get_variance}. } \subsection{ICC for unconditional and conditional models}{ Usually, the ICC is calculated for the null model ("unconditional model"). However, according to \emph{Raudenbush and Bryk (2002)} or \emph{Rabe-Hesketh and Skrondal (2012)} it is also feasible to compute the ICC for full models with covariates ("conditional models") and compare how much, e.g., a level-2 variable explains the portion of variation in the grouping structure (random intercept). } \subsection{ICC for specific group-levels}{ The proportion of variance for specific levels related to the overall model can be computed by setting \code{by_group = TRUE}. The reported ICC is the variance for each (random effect) group compared to the total variance of the model. For mixed models with a simple random intercept, this is identical to the classical (adjusted) ICC. } \subsection{Variance decomposition for brms-models}{ If \code{model} is of class \code{brmsfit}, \code{icc()} might fail due to the large variety of models and families supported by the \strong{brms} package. In such cases, \code{variance_decomposition()} is an alternative ICC measure. The function calculates a variance decomposition based on the posterior predictive distribution. In this case, first, the draws from the posterior predictive distribution \emph{not conditioned} on group-level terms (\code{posterior_predict(..., re_formula = NA)}) are calculated as well as draws from this distribution \emph{conditioned} on \emph{all random effects} (by default, unless specified else in \code{re_formula}) are taken. Then, second, the variances for each of these draws are calculated. The "ICC" is then the ratio between these two variances. This is the recommended way to analyse random-effect-variances for non-Gaussian models. It is then possible to compare variances across models, also by specifying different group-level terms via the \code{re_formula}-argument. Sometimes, when the variance of the posterior predictive distribution is very large, the variance ratio in the output makes no sense, e.g. because it is negative. In such cases, it might help to use \code{robust = TRUE}. } } \examples{ \dontshow{if (require("lme4")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} model <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) icc(model) # ICC for specific group-levels data(sleepstudy, package = "lme4") set.seed(12345) sleepstudy$grp <- sample(1:5, size = 180, replace = TRUE) sleepstudy$subgrp <- NA for (i in 1:5) { filter_group <- sleepstudy$grp == i sleepstudy$subgrp[filter_group] <- sample(1:30, size = sum(filter_group), replace = TRUE) } model <- lme4::lmer( Reaction ~ Days + (1 | grp / subgrp) + (1 | Subject), data = sleepstudy ) icc(model, by_group = TRUE) \dontshow{\}) # examplesIf} } \references{ \itemize{ \item Hox, J. J. (2010). Multilevel analysis: techniques and applications (2nd ed). New York: Routledge. \item Nakagawa, S., Johnson, P. C. D., and Schielzeth, H. (2017). The coefficient of determination R2 and intra-class correlation coefficient from generalized linear mixed-effects models revisited and expanded. Journal of The Royal Society Interface, 14(134), 20170213. \item Rabe-Hesketh, S., and Skrondal, A. (2012). Multilevel and longitudinal modeling using Stata (3rd ed). College Station, Tex: Stata Press Publication. \item Raudenbush, S. W., and Bryk, A. S. (2002). Hierarchical linear models: applications and data analysis methods (2nd ed). Thousand Oaks: Sage Publications. } } performance/man/performance-package.Rd0000644000176200001440000000541514407025063017515 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance-package.R \docType{package} \name{performance-package} \alias{performance-package} \alias{_PACKAGE} \title{performance: An R Package for Assessment, Comparison and Testing of Statistical Models} \description{ A crucial aspect when building regression models is to evaluate the quality of modelfit. It is important to investigate how well models fit to the data and which fit indices to report. Functions to create diagnostic plots or to compute fit measures do exist, however, mostly spread over different packages. There is no unique and consistent approach to assess the model quality for different kind of models. The primary goal of the \strong{performance} package is to fill this gap and to provide utilities for computing \strong{indices of model quality} and \strong{goodness of fit}. These include measures like r-squared (R2), root mean squared error (RMSE) or intraclass correlation coefficient (ICC), but also functions to check (mixed) models for overdispersion, zero-inflation, convergence or singularity. References: Lüdecke et al. (2021) \doi{10.21105/joss.03139} } \details{ \code{performance-package} } \seealso{ Useful links: \itemize{ \item \url{https://easystats.github.io/performance/} \item Report bugs at \url{https://github.com/easystats/performance/issues} } } \author{ \strong{Maintainer}: Daniel Lüdecke \email{d.luedecke@uke.de} (\href{https://orcid.org/0000-0002-8895-3206}{ORCID}) (@strengejacke) Authors: \itemize{ \item Dominique Makowski \email{dom.makowski@gmail.com} (\href{https://orcid.org/0000-0001-5375-9967}{ORCID}) (@Dom_Makowski) [contributor] \item Mattan S. Ben-Shachar \email{matanshm@post.bgu.ac.il} (\href{https://orcid.org/0000-0002-4287-4801}{ORCID}) (@mattansb) [contributor] \item Indrajeet Patil \email{patilindrajeet.science@gmail.com} (\href{https://orcid.org/0000-0003-1995-6531}{ORCID}) (@patilindrajeets) [contributor] \item Philip Waggoner \email{philip.waggoner@gmail.com} (\href{https://orcid.org/0000-0002-7825-7573}{ORCID}) [contributor] \item Brenton M. Wiernik \email{brenton@wiernik.org} (\href{https://orcid.org/0000-0001-9560-6336}{ORCID}) (@bmwiernik) [contributor] } Other contributors: \itemize{ \item Vincent Arel-Bundock \email{vincent.arel-bundock@umontreal.ca} (\href{https://orcid.org/0000-0003-2042-7063}{ORCID}) [contributor] \item Rémi Thériault \email{remi.theriault@mail.mcgill.ca} (\href{https://orcid.org/0000-0003-4315-6788}{ORCID}) (@rempsyc) [contributor] \item Martin Jullum [reviewer] \item gjo11 [reviewer] \item Etienne Bacher \email{etienne.bacher@protonmail.com} (\href{https://orcid.org/0000-0002-9271-5075}{ORCID}) [contributor] } } \keyword{internal} performance/man/binned_residuals.Rd0000644000176200001440000001011714517461276017144 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/binned_residuals.R \name{binned_residuals} \alias{binned_residuals} \title{Binned residuals for binomial logistic regression} \usage{ binned_residuals( model, term = NULL, n_bins = NULL, show_dots = NULL, ci = 0.95, ci_type = c("exact", "gaussian", "boot"), residuals = c("deviance", "pearson", "response"), iterations = 1000, verbose = TRUE, ... ) } \arguments{ \item{model}{A \code{glm}-object with \emph{binomial}-family.} \item{term}{Name of independent variable from \code{x}. If not \code{NULL}, average residuals for the categories of \code{term} are plotted; else, average residuals for the estimated probabilities of the response are plotted.} \item{n_bins}{Numeric, the number of bins to divide the data. If \code{n_bins = NULL}, the square root of the number of observations is taken.} \item{show_dots}{Logical, if \code{TRUE}, will show data points in the plot. Set to \code{FALSE} for models with many observations, if generating the plot is too time-consuming. By default, \code{show_dots = NULL}. In this case \code{binned_residuals()} tries to guess whether performance will be poor due to a very large model and thus automatically shows or hides dots.} \item{ci}{Numeric, the confidence level for the error bounds.} \item{ci_type}{Character, the type of error bounds to calculate. Can be \code{"exact"} (default), \code{"gaussian"} or \code{"boot"}. \code{"exact"} calculates the error bounds based on the exact binomial distribution, using \code{\link[=binom.test]{binom.test()}}. \code{"gaussian"} uses the Gaussian approximation, while \code{"boot"} uses a simple bootstrap method, where confidence intervals are calculated based on the quantiles of the bootstrap distribution.} \item{residuals}{Character, the type of residuals to calculate. Can be \code{"deviance"} (default), \code{"pearson"} or \code{"response"}. It is recommended to use \code{"response"} only for those models where other residuals are not available.} \item{iterations}{Integer, the number of iterations to use for the bootstrap method. Only used if \code{ci_type = "boot"}.} \item{verbose}{Toggle warnings and messages.} \item{...}{Currently not used.} } \value{ A data frame representing the data that is mapped in the accompanying plot. In case all residuals are inside the error bounds, points are black. If some of the residuals are outside the error bounds (indicated by the grey-shaded area), blue points indicate residuals that are OK, while red points indicate model under- or over-fitting for the relevant range of estimated probabilities. } \description{ Check model quality of binomial logistic regression models. } \details{ Binned residual plots are achieved by "dividing the data into categories (bins) based on their fitted values, and then plotting the average residual versus the average fitted value for each bin." \emph{(Gelman, Hill 2007: 97)}. If the model were true, one would expect about 95\% of the residuals to fall inside the error bounds. If \code{term} is not \code{NULL}, one can compare the residuals in relation to a specific model predictor. This may be helpful to check if a term would fit better when transformed, e.g. a rising and falling pattern of residuals along the x-axis is a signal to consider taking the logarithm of the predictor (cf. Gelman and Hill 2007, pp. 97-98). } \note{ \code{binned_residuals()} returns a data frame, however, the \code{print()} method only returns a short summary of the result. The data frame itself is used for plotting. The \code{plot()} method, in turn, creates a ggplot-object. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") result <- binned_residuals(model) result # look at the data frame as.data.frame(result) \donttest{ # plot if (require("see")) { plot(result, show_dots = TRUE) } } } \references{ Gelman, A., and Hill, J. (2007). Data analysis using regression and multilevel/hierarchical models. Cambridge; New York: Cambridge University Press. } performance/man/check_heterogeneity_bias.Rd0000644000176200001440000000300214473560127020627 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_heterogeneity_bias.R \name{check_heterogeneity_bias} \alias{check_heterogeneity_bias} \title{Check model predictor for heterogeneity bias} \usage{ check_heterogeneity_bias(x, select = NULL, group = NULL) } \arguments{ \item{x}{A data frame or a mixed model object.} \item{select}{Character vector (or formula) with names of variables to select that should be checked. If \code{x} is a mixed model object, this argument will be ignored.} \item{group}{Character vector (or formula) with the name of the variable that indicates the group- or cluster-ID. If \code{x} is a model object, this argument will be ignored.} } \description{ \code{check_heterogeneity_bias()} checks if model predictors or variables may cause a heterogeneity bias, i.e. if variables have a within- and/or between-effect (\emph{Bell and Jones, 2015}). } \examples{ data(iris) iris$ID <- sample(1:4, nrow(iris), replace = TRUE) # fake-ID check_heterogeneity_bias(iris, select = c("Sepal.Length", "Petal.Length"), group = "ID") } \references{ \itemize{ \item Bell A, Jones K. 2015. Explaining Fixed Effects: Random Effects Modeling of Time-Series Cross-Sectional and Panel Data. Political Science Research and Methods, 3(1), 133–153. } } \seealso{ For further details, read the vignette \url{https://easystats.github.io/parameters/articles/demean.html} and also see documentation for \code{\link[datawizard:demean]{datawizard::demean()}}. } performance/man/check_symmetry.Rd0000644000176200001440000000115414501062052016637 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_symmetry.R \name{check_symmetry} \alias{check_symmetry} \title{Check distribution symmetry} \usage{ check_symmetry(x, ...) } \arguments{ \item{x}{Model or numeric vector} \item{...}{Not used.} } \description{ Uses Hotelling and Solomons test of symmetry by testing if the standardized nonparametric skew (\eqn{\frac{(Mean - Median)}{SD}}) is different than 0. \cr\cr This is an underlying assumption of Wilcoxon signed-rank test. } \examples{ V <- suppressWarnings(wilcox.test(mtcars$mpg)) check_symmetry(V) } performance/man/r2_kullback.Rd0000644000176200001440000000143214257247716016027 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_kl.R \name{r2_kullback} \alias{r2_kullback} \title{Kullback-Leibler R2} \usage{ r2_kullback(model, adjust = TRUE) } \arguments{ \item{model}{A generalized linear model.} \item{adjust}{Logical, if \code{TRUE} (the default), the adjusted R2 value is returned.} } \value{ A named vector with the R2 value. } \description{ Calculates the Kullback-Leibler-divergence-based R2 for generalized linear models. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") r2_kullback(model) } \references{ Cameron, A. C. and Windmeijer, A. G. (1997) An R-squared measure of goodness of fit for some common nonlinear regression models. Journal of Econometrics, 77: 329-342. } performance/man/r2_nagelkerke.Rd0000644000176200001440000000127014257247716016347 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_nagelkerke.R \name{r2_nagelkerke} \alias{r2_nagelkerke} \title{Nagelkerke's R2} \usage{ r2_nagelkerke(model, ...) } \arguments{ \item{model}{A generalized linear model, including cumulative links resp. multinomial models.} \item{...}{Currently not used.} } \value{ A named vector with the R2 value. } \description{ Calculate Nagelkerke's pseudo-R2. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") r2_nagelkerke(model) } \references{ Nagelkerke, N. J. (1991). A note on a general definition of the coefficient of determination. Biometrika, 78(3), 691-692. } performance/man/check_autocorrelation.Rd0000644000176200001440000000312414413052536020167 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_autocorrelation.R \name{check_autocorrelation} \alias{check_autocorrelation} \alias{check_autocorrelation.default} \title{Check model for independence of residuals.} \usage{ check_autocorrelation(x, ...) \method{check_autocorrelation}{default}(x, nsim = 1000, ...) } \arguments{ \item{x}{A model object.} \item{...}{Currently not used.} \item{nsim}{Number of simulations for the Durbin-Watson-Test.} } \value{ Invisibly returns the p-value of the test statistics. A p-value < 0.05 indicates autocorrelated residuals. } \description{ Check model for independence of residuals, i.e. for autocorrelation of error terms. } \details{ Performs a Durbin-Watson-Test to check for autocorrelated residuals. In case of autocorrelation, robust standard errors return more accurate results for the estimates, or maybe a mixed model with error term for the cluster groups should be used. } \examples{ m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) check_autocorrelation(m) } \seealso{ Other functions to check model assumptions and and assess model quality: \code{\link{check_collinearity}()}, \code{\link{check_convergence}()}, \code{\link{check_heteroscedasticity}()}, \code{\link{check_homogeneity}()}, \code{\link{check_model}()}, \code{\link{check_outliers}()}, \code{\link{check_overdispersion}()}, \code{\link{check_predictions}()}, \code{\link{check_singularity}()}, \code{\link{check_zeroinflation}()} } \concept{functions to check model assumptions and and assess model quality} performance/man/check_distribution.Rd0000644000176200001440000000532614501142221017467 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_distribution.R \name{check_distribution} \alias{check_distribution} \title{Classify the distribution of a model-family using machine learning} \usage{ check_distribution(model) } \arguments{ \item{model}{Typically, a model (that should response to \code{residuals()}). May also be a numeric vector.} } \description{ Choosing the right distributional family for regression models is essential to get more accurate estimates and standard errors. This function may help to check a models' distributional family and see if the model-family probably should be reconsidered. Since it is difficult to exactly predict the correct model family, consider this function as somewhat experimental. } \details{ This function uses an internal random forest model to classify the distribution from a model-family. Currently, following distributions are trained (i.e. results of \code{check_distribution()} may be one of the following): \code{"bernoulli"}, \code{"beta"}, \code{"beta-binomial"}, \code{"binomial"}, \code{"chi"}, \code{"exponential"}, \code{"F"}, \code{"gamma"}, \code{"lognormal"}, \code{"normal"}, \code{"negative binomial"}, \code{"negative binomial (zero-inflated)"}, \code{"pareto"}, \code{"poisson"}, \code{"poisson (zero-inflated)"}, \code{"uniform"} and \code{"weibull"}. \cr \cr Note the similarity between certain distributions according to shape, skewness, etc. Thus, the predicted distribution may not be perfectly representing the distributional family of the underlying fitted model, or the response value. \cr \cr There is a \code{plot()} method, which shows the probabilities of all predicted distributions, however, only if the probability is greater than zero. } \note{ This function is somewhat experimental and might be improved in future releases. The final decision on the model-family should also be based on theoretical aspects and other information about the data and the model. \cr \cr There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. } \examples{ \dontshow{if (require("lme4") && require("parameters") && require("randomForest")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} data(sleepstudy, package = "lme4") model <<- lme4::lmer(Reaction ~ Days + (Days | Subject), sleepstudy) check_distribution(model) \dontshow{\}) # examplesIf} \dontshow{if (require("see") && require("patchwork") && require("randomForest")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} plot(check_distribution(model)) \dontshow{\}) # examplesIf} } performance/man/r2_coxsnell.Rd0000644000176200001440000000303414257247716016066 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_coxsnell.R \name{r2_coxsnell} \alias{r2_coxsnell} \title{Cox & Snell's R2} \usage{ r2_coxsnell(model, ...) } \arguments{ \item{model}{Model with binary outcome.} \item{...}{Currently not used.} } \value{ A named vector with the R2 value. } \description{ Calculates the pseudo-R2 value based on the proposal from \emph{Cox & Snell (1989)}. } \details{ This index was proposed by \emph{Cox and Snell (1989, pp. 208-9)} and, apparently independently, by \emph{Magee (1990)}; but had been suggested earlier for binary response models by \emph{Maddala (1983)}. However, this index achieves a maximum of less than 1 for discrete models (i.e. models whose likelihood is a product of probabilities) which have a maximum of 1, instead of densities, which can become infinite \emph{(Nagelkerke, 1991)}. } \examples{ model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") r2_coxsnell(model) } \references{ \itemize{ \item Cox, D. R., Snell, E. J. (1989). Analysis of binary data (Vol. 32). Monographs on Statistics and Applied Probability. \item Magee, L. (1990). R 2 measures based on Wald and likelihood ratio joint significance tests. The American Statistician, 44(3), 250-253. \item Maddala, G. S. (1986). Limited-dependent and qualitative variables in econometrics (No. 3). Cambridge university press. \item Nagelkerke, N. J. (1991). A note on a general definition of the coefficient of determination. Biometrika, 78(3), 691-692. } } performance/man/r2.Rd0000644000176200001440000000572114501062052014140 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2.R \name{r2} \alias{r2} \alias{r2.default} \alias{r2.merMod} \title{Compute the model's R2} \usage{ r2(model, ...) \method{r2}{default}(model, ci = NULL, verbose = TRUE, ...) \method{r2}{merMod}(model, ci = NULL, tolerance = 1e-05, ...) } \arguments{ \item{model}{A statistical model.} \item{...}{Arguments passed down to the related r2-methods.} \item{ci}{Confidence interval level, as scalar. If \code{NULL} (default), no confidence intervals for R2 are calculated.} \item{verbose}{Logical. Should details about R2 and CI methods be given (\code{TRUE}) or not (\code{FALSE})?} \item{tolerance}{Tolerance for singularity check of random effects, to decide whether to compute random effect variances for the conditional r-squared or not. Indicates up to which value the convergence result is accepted. When \code{r2_nakagawa()} returns a warning, stating that random effect variances can't be computed (and thus, the conditional r-squared is \code{NA}), decrease the tolerance-level. See also \code{\link[=check_singularity]{check_singularity()}}.} } \value{ Returns a list containing values related to the most appropriate R2 for the given model (or \code{NULL} if no R2 could be extracted). See the list below: \itemize{ \item Logistic models: \link[=r2_tjur]{Tjur's R2} \item General linear models: \link[=r2_nagelkerke]{Nagelkerke's R2} \item Multinomial Logit: \link[=r2_mcfadden]{McFadden's R2} \item Models with zero-inflation: \link[=r2_zeroinflated]{R2 for zero-inflated models} \item Mixed models: \link[=r2_nakagawa]{Nakagawa's R2} \item Bayesian models: \link[=r2_bayes]{R2 bayes} } } \description{ Calculate the R2, also known as the coefficient of determination, value for different model objects. Depending on the model, R2, pseudo-R2, or marginal / adjusted R2 values are returned. } \note{ If there is no \code{r2()}-method defined for the given model class, \code{r2()} tries to return a "generic" r-quared value, calculated as following: \verb{1-sum((y-y_hat)^2)/sum((y-y_bar)^2))} } \examples{ \dontshow{if (require("lme4")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Pseudo r-quared for GLM model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") r2(model) # r-squared including confidence intervals model <- lm(mpg ~ wt + hp, data = mtcars) r2(model, ci = 0.95) model <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) r2(model) \dontshow{\}) # examplesIf} } \seealso{ \code{\link[=r2_bayes]{r2_bayes()}}, \code{\link[=r2_coxsnell]{r2_coxsnell()}}, \code{\link[=r2_kullback]{r2_kullback()}}, \code{\link[=r2_loo]{r2_loo()}}, \code{\link[=r2_mcfadden]{r2_mcfadden()}}, \code{\link[=r2_nagelkerke]{r2_nagelkerke()}}, \code{\link[=r2_nakagawa]{r2_nakagawa()}}, \code{\link[=r2_tjur]{r2_tjur()}}, \code{\link[=r2_xu]{r2_xu()}} and \code{\link[=r2_zeroinflated]{r2_zeroinflated()}}. } performance/man/check_outliers.Rd0000644000176200001440000004366514516276477016661 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_outliers.R \name{check_outliers} \alias{check_outliers} \alias{check_outliers.default} \alias{check_outliers.numeric} \alias{check_outliers.data.frame} \title{Outliers detection (check for influential observations)} \usage{ check_outliers(x, ...) \method{check_outliers}{default}( x, method = c("cook", "pareto"), threshold = NULL, ID = NULL, ... ) \method{check_outliers}{numeric}(x, method = "zscore_robust", threshold = NULL, ...) \method{check_outliers}{data.frame}(x, method = "mahalanobis", threshold = NULL, ID = NULL, ...) } \arguments{ \item{x}{A model or a data.frame object.} \item{...}{When \code{method = "ics"}, further arguments in \code{...} are passed down to \code{\link[ICSOutlier:ics.outlier]{ICSOutlier::ics.outlier()}}. When \code{method = "mahalanobis"}, they are passed down to \code{\link[stats:mahalanobis]{stats::mahalanobis()}}.} \item{method}{The outlier detection method(s). Can be \code{"all"} or some of \code{"cook"}, \code{"pareto"}, \code{"zscore"}, \code{"zscore_robust"}, \code{"iqr"}, \code{"ci"}, \code{"eti"}, \code{"hdi"}, \code{"bci"}, \code{"mahalanobis"}, \code{"mahalanobis_robust"}, \code{"mcd"}, \code{"ics"}, \code{"optics"} or \code{"lof"}.} \item{threshold}{A list containing the threshold values for each method (e.g. \code{list('mahalanobis' = 7, 'cook' = 1)}), above which an observation is considered as outlier. If \code{NULL}, default values will be used (see 'Details'). If a numeric value is given, it will be used as the threshold for any of the method run.} \item{ID}{Optional, to report an ID column along with the row number.} } \value{ A logical vector of the detected outliers with a nice printing method: a check (message) on whether outliers were detected or not. The information on the distance measure and whether or not an observation is considered as outlier can be recovered with the \link{as.data.frame} function. Note that the function will (silently) return a vector of \code{FALSE} for non-supported data types such as character strings. } \description{ Checks for and locates influential observations (i.e., "outliers") via several distance and/or clustering methods. If several methods are selected, the returned "Outlier" vector will be a composite outlier score, made of the average of the binary (0 or 1) results of each method. It represents the probability of each observation of being classified as an outlier by at least one method. The decision rule used by default is to classify as outliers observations which composite outlier score is superior or equal to 0.5 (i.e., that were classified as outliers by at least half of the methods). See the \strong{Details} section below for a description of the methods. } \details{ Outliers can be defined as particularly influential observations. Most methods rely on the computation of some distance metric, and the observations greater than a certain threshold are considered outliers. Importantly, outliers detection methods are meant to provide information to consider for the researcher, rather than to be an automatized procedure which mindless application is a substitute for thinking. An \strong{example sentence} for reporting the usage of the composite method could be: \emph{"Based on a composite outlier score (see the 'check_outliers' function in the 'performance' R package; Lüdecke et al., 2021) obtained via the joint application of multiple outliers detection algorithms (Z-scores, Iglewicz, 1993; Interquartile range (IQR); Mahalanobis distance, Cabana, 2019; Robust Mahalanobis distance, Gnanadesikan and Kettenring, 1972; Minimum Covariance Determinant, Leys et al., 2018; Invariant Coordinate Selection, Archimbaud et al., 2018; OPTICS, Ankerst et al., 1999; Isolation Forest, Liu et al. 2008; and Local Outlier Factor, Breunig et al., 2000), we excluded n participants that were classified as outliers by at least half of the methods used."} } \note{ There is also a \href{https://easystats.github.io/see/articles/performance.html}{\code{plot()}-method} implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. \strong{Please note} that the range of the distance-values along the y-axis is re-scaled to range from 0 to 1. } \section{Model-specific methods}{ \itemize{ \item \strong{Cook's Distance}: Among outlier detection methods, Cook's distance and leverage are less common than the basic Mahalanobis distance, but still used. Cook's distance estimates the variations in regression coefficients after removing each observation, one by one (Cook, 1977). Since Cook's distance is in the metric of an F distribution with p and n-p degrees of freedom, the median point of the quantile distribution can be used as a cut-off (Bollen, 1985). A common approximation or heuristic is to use 4 divided by the numbers of observations, which usually corresponds to a lower threshold (i.e., more outliers are detected). This only works for frequentist models. For Bayesian models, see \code{pareto}. \item \strong{Pareto}: The reliability and approximate convergence of Bayesian models can be assessed using the estimates for the shape parameter k of the generalized Pareto distribution. If the estimated tail shape parameter k exceeds 0.5, the user should be warned, although in practice the authors of the \strong{loo} package observed good performance for values of k up to 0.7 (the default threshold used by \code{performance}). } } \section{Univariate methods}{ \itemize{ \item \strong{Z-scores} \verb{("zscore", "zscore_robust")}: The Z-score, or standard score, is a way of describing a data point as deviance from a central value, in terms of standard deviations from the mean (\code{"zscore"}) or, as it is here the case (\code{"zscore_robust"}) by default (Iglewicz, 1993), in terms of Median Absolute Deviation (MAD) from the median (which are robust measures of dispersion and centrality). The default threshold to classify outliers is 1.959 (\code{threshold = list("zscore" = 1.959)}), corresponding to the 2.5\% (\code{qnorm(0.975)}) most extreme observations (assuming the data is normally distributed). Importantly, the Z-score method is univariate: it is computed column by column. If a dataframe is passed, the Z-score is calculated for each variable separately, and the maximum (absolute) Z-score is kept for each observations. Thus, all observations that are extreme on at least one variable might be detected as outliers. Thus, this method is not suited for high dimensional data (with many columns), returning too liberal results (detecting many outliers). \item \strong{IQR} \code{("iqr")}: Using the IQR (interquartile range) is a robust method developed by John Tukey, which often appears in box-and-whisker plots (e.g., in \link[ggplot2:geom_boxplot]{ggplot2::geom_boxplot}). The interquartile range is the range between the first and the third quartiles. Tukey considered as outliers any data point that fell outside of either 1.5 times (the default threshold is 1.7) the IQR below the first or above the third quartile. Similar to the Z-score method, this is a univariate method for outliers detection, returning outliers detected for at least one column, and might thus not be suited to high dimensional data. The distance score for the IQR is the absolute deviation from the median of the upper and lower IQR thresholds. Then, this value is divided by the IQR threshold, to “standardize” it and facilitate interpretation. \item \strong{CI} \verb{("ci", "eti", "hdi", "bci")}: Another univariate method is to compute, for each variable, some sort of "confidence" interval and consider as outliers values lying beyond the edges of that interval. By default, \code{"ci"} computes the Equal-Tailed Interval (\code{"eti"}), but other types of intervals are available, such as Highest Density Interval (\code{"hdi"}) or the Bias Corrected and Accelerated Interval (\code{"bci"}). The default threshold is \code{0.95}, considering as outliers all observations that are outside the 95\% CI on any of the variable. See \code{\link[bayestestR:ci]{bayestestR::ci()}} for more details about the intervals. The distance score for the CI methods is the absolute deviation from the median of the upper and lower CI thresholds. Then, this value is divided by the difference between the upper and lower CI bounds divided by two, to “standardize” it and facilitate interpretation. } } \section{Multivariate methods}{ \itemize{ \item \strong{Mahalanobis Distance}: Mahalanobis distance (Mahalanobis, 1930) is often used for multivariate outliers detection as this distance takes into account the shape of the observations. The default \code{threshold} is often arbitrarily set to some deviation (in terms of SD or MAD) from the mean (or median) of the Mahalanobis distance. However, as the Mahalanobis distance can be approximated by a Chi squared distribution (Rousseeuw and Van Zomeren, 1990), we can use the alpha quantile of the chi-square distribution with k degrees of freedom (k being the number of columns). By default, the alpha threshold is set to 0.025 (corresponding to the 2.5\\% most extreme observations; Cabana, 2019). This criterion is a natural extension of the median plus or minus a coefficient times the MAD method (Leys et al., 2013). \item \strong{Robust Mahalanobis Distance}: A robust version of Mahalanobis distance using an Orthogonalized Gnanadesikan-Kettenring pairwise estimator (Gnanadesikan and Kettenring, 1972). Requires the \strong{bigutilsr} package. See the \code{\link[bigutilsr:covrob_ogk]{bigutilsr::dist_ogk()}} function. \item \strong{Minimum Covariance Determinant (MCD)}: Another robust version of Mahalanobis. Leys et al. (2018) argue that Mahalanobis Distance is not a robust way to determine outliers, as it uses the means and covariances of all the data - including the outliers - to determine individual difference scores. Minimum Covariance Determinant calculates the mean and covariance matrix based on the most central subset of the data (by default, 66\\%), before computing the Mahalanobis Distance. This is deemed to be a more robust method of identifying and removing outliers than regular Mahalanobis distance. \item \strong{Invariant Coordinate Selection (ICS)}: The outlier are detected using ICS, which by default uses an alpha threshold of 0.025 (corresponding to the 2.5\\% most extreme observations) as a cut-off value for outliers classification. Refer to the help-file of \code{\link[ICSOutlier:ics.outlier]{ICSOutlier::ics.outlier()}} to get more details about this procedure. Note that \code{method = "ics"} requires both \strong{ICS} and \strong{ICSOutlier} to be installed, and that it takes some time to compute the results. You can speed up computation time using parallel computing. Set the number of cores to use with \code{options(mc.cores = 4)} (for example). \item \strong{OPTICS}: The Ordering Points To Identify the Clustering Structure (OPTICS) algorithm (Ankerst et al., 1999) is using similar concepts to DBSCAN (an unsupervised clustering technique that can be used for outliers detection). The threshold argument is passed as \code{minPts}, which corresponds to the minimum size of a cluster. By default, this size is set at 2 times the number of columns (Sander et al., 1998). Compared to the other techniques, that will always detect several outliers (as these are usually defined as a percentage of extreme values), this algorithm functions in a different manner and won't always detect outliers. Note that \code{method = "optics"} requires the \strong{dbscan} package to be installed, and that it takes some time to compute the results. \item \strong{Local Outlier Factor}: Based on a K nearest neighbors algorithm, LOF compares the local density of a point to the local densities of its neighbors instead of computing a distance from the center (Breunig et al., 2000). Points that have a substantially lower density than their neighbors are considered outliers. A LOF score of approximately 1 indicates that density around the point is comparable to its neighbors. Scores significantly larger than 1 indicate outliers. The default threshold of 0.025 will classify as outliers the observations located at \verb{qnorm(1-0.025) * SD)} of the log-transformed LOF distance. Requires the \strong{dbscan} package. } } \section{Threshold specification}{ Default thresholds are currently specified as follows: \if{html}{\out{

}} } \section{Meta-analysis models}{ For meta-analysis models (e.g. objects of class \code{rma} from the \emph{metafor} package or \code{metagen} from package \emph{meta}), studies are defined as outliers when their confidence interval lies outside the confidence interval of the pooled effect. } \examples{ data <- mtcars # Size nrow(data) = 32 # For single variables ------------------------------------------------------ outliers_list <- check_outliers(data$mpg) # Find outliers outliers_list # Show the row index of the outliers as.numeric(outliers_list) # The object is a binary vector... filtered_data <- data[!outliers_list, ] # And can be used to filter a dataframe nrow(filtered_data) # New size, 28 (4 outliers removed) # Find all observations beyond +/- 2 SD check_outliers(data$mpg, method = "zscore", threshold = 2) # For dataframes ------------------------------------------------------ check_outliers(data) # It works the same way on dataframes # You can also use multiple methods at once outliers_list <- check_outliers(data, method = c( "mahalanobis", "iqr", "zscore" )) outliers_list # Using `as.data.frame()`, we can access more details! outliers_info <- as.data.frame(outliers_list) head(outliers_info) outliers_info$Outlier # Including the probability of being an outlier # And we can be more stringent in our outliers removal process filtered_data <- data[outliers_info$Outlier < 0.1, ] # We can run the function stratified by groups using `{datawizard}` package: group_iris <- datawizard::data_group(iris, "Species") check_outliers(group_iris) \dontshow{if (require("see") && require("bigutilsr") && require("loo") && require("MASS") && require("ICSOutlier") && require("ICS") && require("dbscan")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \donttest{ # You can also run all the methods check_outliers(data, method = "all") # For statistical models --------------------------------------------- # select only mpg and disp (continuous) mt1 <- mtcars[, c(1, 3, 4)] # create some fake outliers and attach outliers to main df mt2 <- rbind(mt1, data.frame( mpg = c(37, 40), disp = c(300, 400), hp = c(110, 120) )) # fit model with outliers model <- lm(disp ~ mpg + hp, data = mt2) outliers_list <- check_outliers(model) plot(outliers_list) insight::get_data(model)[outliers_list, ] # Show outliers data } \dontshow{\}) # examplesIf} } \references{ \itemize{ \item Archimbaud, A., Nordhausen, K., and Ruiz-Gazen, A. (2018). ICS for multivariate outlier detection with application to quality control. Computational Statistics and Data Analysis, 128, 184-199. \doi{10.1016/j.csda.2018.06.011} \item Gnanadesikan, R., and Kettenring, J. R. (1972). Robust estimates, residuals, and outlier detection with multiresponse data. Biometrics, 81-124. \item Bollen, K. A., and Jackman, R. W. (1985). Regression diagnostics: An expository treatment of outliers and influential cases. Sociological Methods and Research, 13(4), 510-542. \item Cabana, E., Lillo, R. E., and Laniado, H. (2019). Multivariate outlier detection based on a robust Mahalanobis distance with shrinkage estimators. arXiv preprint arXiv:1904.02596. \item Cook, R. D. (1977). Detection of influential observation in linear regression. Technometrics, 19(1), 15-18. \item Iglewicz, B., and Hoaglin, D. C. (1993). How to detect and handle outliers (Vol. 16). Asq Press. \item Leys, C., Klein, O., Dominicy, Y., and Ley, C. (2018). Detecting multivariate outliers: Use a robust variant of Mahalanobis distance. Journal of Experimental Social Psychology, 74, 150-156. \item Liu, F. T., Ting, K. M., and Zhou, Z. H. (2008, December). Isolation forest. In 2008 Eighth IEEE International Conference on Data Mining (pp. 413-422). IEEE. \item Lüdecke, D., Ben-Shachar, M. S., Patil, I., Waggoner, P., and Makowski, D. (2021). performance: An R package for assessment, comparison and testing of statistical models. Journal of Open Source Software, 6(60), 3139. \doi{10.21105/joss.03139} \item Thériault, R., Ben-Shachar, M. S., Patil, I., Lüdecke, D., Wiernik, B. M., and Makowski, D. (2023). Check your outliers! An introduction to identifying statistical outliers in R with easystats. \doi{10.31234/osf.io/bu6nt} \item Rousseeuw, P. J., and Van Zomeren, B. C. (1990). Unmasking multivariate outliers and leverage points. Journal of the American Statistical association, 85(411), 633-639. } } \seealso{ Other functions to check model assumptions and and assess model quality: \code{\link{check_autocorrelation}()}, \code{\link{check_collinearity}()}, \code{\link{check_convergence}()}, \code{\link{check_heteroscedasticity}()}, \code{\link{check_homogeneity}()}, \code{\link{check_model}()}, \code{\link{check_overdispersion}()}, \code{\link{check_predictions}()}, \code{\link{check_singularity}()}, \code{\link{check_zeroinflation}()} } \concept{functions to check model assumptions and and assess model quality} performance/man/performance_logloss.Rd0000644000176200001440000000204314257247716017676 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_logloss.R \name{performance_logloss} \alias{performance_logloss} \title{Log Loss} \usage{ performance_logloss(model, verbose = TRUE, ...) } \arguments{ \item{model}{Model with binary outcome.} \item{verbose}{Toggle off warnings.} \item{...}{Currently not used.} } \value{ Numeric, the log loss of \code{model}. } \description{ Compute the log loss for models with binary outcome. } \details{ Logistic regression models predict the probability of an outcome of being a "success" or "failure" (or 1 and 0 etc.). \code{performance_logloss()} evaluates how good or bad the predicted probabilities are. High values indicate bad predictions, while low values indicate good predictions. The lower the log-loss, the better the model predicts the outcome. } \examples{ data(mtcars) m <- glm(formula = vs ~ hp + wt, family = binomial, data = mtcars) performance_logloss(m) } \seealso{ \code{\link[=performance_score]{performance_score()}} } performance/man/check_clusterstructure.Rd0000644000176200001440000000421414316511005020411 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_clusterstructure.R \name{check_clusterstructure} \alias{check_clusterstructure} \title{Check suitability of data for clustering} \usage{ check_clusterstructure(x, standardize = TRUE, distance = "euclidean", ...) } \arguments{ \item{x}{A data frame.} \item{standardize}{Standardize the dataframe before clustering (default).} \item{distance}{Distance method used. Other methods than "euclidean" (default) are exploratory in the context of clustering tendency. See \code{\link[stats:dist]{stats::dist()}} for list of available methods.} \item{...}{Arguments passed to or from other methods.} } \value{ The H statistic (numeric) } \description{ This checks whether the data is appropriate for clustering using the Hopkins' H statistic of given data. If the value of Hopkins statistic is close to 0 (below 0.5), then we can reject the null hypothesis and conclude that the dataset is significantly clusterable. A value for H lower than 0.25 indicates a clustering tendency at the \verb{90\%} confidence level. The visual assessment of cluster tendency (VAT) approach (Bezdek and Hathaway, 2002) consists in investigating the heatmap of the ordered dissimilarity matrix. Following this, one can potentially detect the clustering tendency by counting the number of square shaped blocks along the diagonal. } \examples{ \donttest{ library(performance) check_clusterstructure(iris[, 1:4]) plot(check_clusterstructure(iris[, 1:4])) } } \references{ \itemize{ \item Lawson, R. G., & Jurs, P. C. (1990). New index for clustering tendency and its application to chemical problems. Journal of chemical information and computer sciences, 30(1), 36-41. \item Bezdek, J. C., & Hathaway, R. J. (2002, May). VAT: A tool for visual assessment of (cluster) tendency. In Proceedings of the 2002 International Joint Conference on Neural Networks. IJCNN02 (3), 2225-2230. IEEE. } } \seealso{ \code{\link[=check_kmo]{check_kmo()}}, \code{\link[=check_sphericity_bartlett]{check_sphericity_bartlett()}} and \code{\link[=check_factorstructure]{check_factorstructure()}}. } performance/man/r2_efron.Rd0000644000176200001440000000207614327475467015361 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_efron.R \name{r2_efron} \alias{r2_efron} \title{Efron's R2} \usage{ r2_efron(model) } \arguments{ \item{model}{Generalized linear model.} } \value{ The R2 value. } \description{ Calculates Efron's pseudo R2. } \details{ Efron's R2 is calculated by taking the sum of the squared model residuals, divided by the total variability in the dependent variable. This R2 equals the squared correlation between the predicted values and actual values, however, note that model residuals from generalized linear models are not generally comparable to those of OLS. } \examples{ ## Dobson (1990) Page 93: Randomized Controlled Trial: counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) # outcome <- gl(3, 1, 9) treatment <- gl(3, 3) model <- glm(counts ~ outcome + treatment, family = poisson()) r2_efron(model) } \references{ Efron, B. (1978). Regression and ANOVA with zero-one data: Measures of residual variation. Journal of the American Statistical Association, 73, 113-121. } performance/man/model_performance.lm.Rd0000644000176200001440000000473714325324065017724 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_performance.lm.R \name{model_performance.lm} \alias{model_performance.lm} \title{Performance of Regression Models} \usage{ \method{model_performance}{lm}(model, metrics = "all", verbose = TRUE, ...) } \arguments{ \item{model}{A model.} \item{metrics}{Can be \code{"all"}, \code{"common"} or a character vector of metrics to be computed (one or more of \code{"AIC"}, \code{"AICc"}, \code{"BIC"}, \code{"R2"}, \code{"R2_adj"}, \code{"RMSE"}, \code{"SIGMA"}, \code{"LOGLOSS"}, \code{"PCP"}, \code{"SCORE"}). \code{"common"} will compute AIC, BIC, R2 and RMSE.} \item{verbose}{Toggle off warnings.} \item{...}{Arguments passed to or from other methods.} } \value{ A data frame (with one row) and one column per "index" (see \code{metrics}). } \description{ Compute indices of model performance for regression models. } \details{ Depending on \code{model}, following indices are computed: \itemize{ \item \strong{AIC}: Akaike's Information Criterion, see \code{?stats::AIC} \item \strong{AICc}: Second-order (or small sample) AIC with a correction for small sample sizes \item \strong{BIC}: Bayesian Information Criterion, see \code{?stats::BIC} \item \strong{R2}: r-squared value, see \code{\link[=r2]{r2()}} \item \strong{R2_adj}: adjusted r-squared, see \code{\link[=r2]{r2()}} \item \strong{RMSE}: root mean squared error, see \code{\link[=performance_rmse]{performance_rmse()}} \item \strong{SIGMA}: residual standard deviation, see \code{\link[insight:get_sigma]{insight::get_sigma()}} \item \strong{LOGLOSS}: Log-loss, see \code{\link[=performance_logloss]{performance_logloss()}} \item \strong{SCORE_LOG}: score of logarithmic proper scoring rule, see \code{\link[=performance_score]{performance_score()}} \item \strong{SCORE_SPHERICAL}: score of spherical proper scoring rule, see \code{\link[=performance_score]{performance_score()}} \item \strong{PCP}: percentage of correct predictions, see \code{\link[=performance_pcp]{performance_pcp()}} } \code{model_performance()} correctly detects transformed response and returns the "corrected" AIC and BIC value on the original scale. To get back to the original scale, the likelihood of the model is multiplied by the Jacobian/derivative of the transformation. } \examples{ model <- lm(mpg ~ wt + cyl, data = mtcars) model_performance(model) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") model_performance(model) } performance/man/check_sphericity.Rd0000644000176200001440000000200414501062052017124 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_sphericity.R \name{check_sphericity} \alias{check_sphericity} \title{Check model for violation of sphericity} \usage{ check_sphericity(x, ...) } \arguments{ \item{x}{A model object.} \item{...}{Arguments passed to \code{car::Anova}.} } \value{ Invisibly returns the p-values of the test statistics. A p-value < 0.05 indicates a violation of sphericity. } \description{ Check model for violation of sphericity. For \link[=check_factorstructure]{Bartlett's Test of Sphericity} (used for correlation matrices and factor analyses), see \link{check_sphericity_bartlett}. } \examples{ \dontshow{if (require("car") && require("carData")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} data(Soils, package = "carData") soils.mod <- lm( cbind(pH, N, Dens, P, Ca, Mg, K, Na, Conduc) ~ Block + Contour * Depth, data = Soils ) check_sphericity(Manova(soils.mod)) \dontshow{\}) # examplesIf} } performance/man/r2_mckelvey.Rd0000644000176200001440000000240314327475467016061 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_mckelvey.R \name{r2_mckelvey} \alias{r2_mckelvey} \title{McKelvey & Zavoinas R2} \usage{ r2_mckelvey(model) } \arguments{ \item{model}{Generalized linear model.} } \value{ The R2 value. } \description{ Calculates McKelvey and Zavoinas pseudo R2. } \details{ McKelvey and Zavoinas R2 is based on the explained variance, where the variance of the predicted response is divided by the sum of the variance of the predicted response and residual variance. For binomial models, the residual variance is either \code{pi^2/3} for logit-link and 1 for probit-link. For poisson-models, the residual variance is based on log-normal approximation, similar to the \emph{distribution-specific variance} as described in \code{?insight::get_variance}. } \examples{ ## Dobson (1990) Page 93: Randomized Controlled Trial: counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) # outcome <- gl(3, 1, 9) treatment <- gl(3, 3) model <- glm(counts ~ outcome + treatment, family = poisson()) r2_mckelvey(model) } \references{ McKelvey, R., Zavoina, W. (1975), "A Statistical Model for the Analysis of Ordinal Level Dependent Variables", Journal of Mathematical Sociology 4, S. 103–120. } performance/man/item_discrimination.Rd0000644000176200001440000000323614362032043017650 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/item_discrimination.R \name{item_discrimination} \alias{item_discrimination} \title{Discrimination of Questionnaire Items} \usage{ item_discrimination(x, standardize = FALSE) } \arguments{ \item{x}{A matrix or a data frame.} \item{standardize}{Logical, if \code{TRUE}, the data frame's vectors will be standardized. Recommended when the variables have different measures / scales.} } \value{ A data frame with the item discrimination (\emph{corrected item-total correlations}) for each item of the scale. } \description{ Compute various measures of internal consistencies for tests or item-scales of questionnaires. } \details{ This function calculates the item discriminations (corrected item-total correlations for each item of \code{x} with the remaining items) for each item of a scale. The absolute value of the item discrimination indices should be above 0.2. An index between 0.2 and 0.4 is considered as "fair", while a satisfactory index ranges from 0.4 to 0.7. Items with low discrimination indices are often ambiguously worded and should be examined. Items with negative indices should be examined to determine why a negative value was obtained (e.g. reversed answer categories regarding positive and negative poles). } \examples{ data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] item_discrimination(x) } \references{ \itemize{ \item Kelava A, Moosbrugger H (2020). Deskriptivstatistische Itemanalyse und Testwertbestimmung. In: Moosbrugger H, Kelava A, editors. Testtheorie und Fragebogenkonstruktion. Berlin, Heidelberg: Springer, 143–158 } } performance/man/r2_zeroinflated.Rd0000644000176200001440000000225414257247716016730 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r2_zeroinflated.R \name{r2_zeroinflated} \alias{r2_zeroinflated} \title{R2 for models with zero-inflation} \usage{ r2_zeroinflated(model, method = c("default", "correlation")) } \arguments{ \item{model}{A model.} \item{method}{Indicates the method to calculate R2. See 'Details'. May be abbreviated.} } \value{ For the default-method, a list with the R2 and adjusted R2 values. For \code{method = "correlation"}, a named numeric vector with the correlation-based R2 value. } \description{ Calculates R2 for models with zero-inflation component, including mixed effects models. } \details{ The default-method calculates an R2 value based on the residual variance divided by the total variance. For \code{method = "correlation"}, R2 is a correlation-based measure, which is rather crude. It simply computes the squared correlation between the model's actual and predicted response. } \examples{ \donttest{ if (require("pscl")) { data(bioChemists) model <- zeroinfl( art ~ fem + mar + kid5 + ment | kid5 + phd, data = bioChemists ) r2_zeroinflated(model) } } } performance/man/cronbachs_alpha.Rd0000644000176200001440000000234614403575764016750 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cronbachs_alpha.R \name{cronbachs_alpha} \alias{cronbachs_alpha} \title{Cronbach's Alpha for Items or Scales} \usage{ cronbachs_alpha(x, ...) } \arguments{ \item{x}{A matrix or a data frame.} \item{...}{Currently not used.} } \value{ The Cronbach's Alpha value for \code{x}. } \description{ Compute various measures of internal consistencies for tests or item-scales of questionnaires. } \details{ The Cronbach's Alpha value for \code{x}. A value closer to 1 indicates greater internal consistency, where usually following rule of thumb is applied to interpret the results: \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.5 is unacceptable, 0.5 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.6 is poor, 0.6 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.7 is questionable, 0.7 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.8 is acceptable, and everything > 0.8 is good or excellent. } \examples{ data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] cronbachs_alpha(x) } \references{ Bland, J. M., and Altman, D. G. Statistics notes: Cronbach's alpha. BMJ 1997;314:572. 10.1136/bmj.314.7080.572 } performance/man/performance_rmse.Rd0000644000176200001440000000276414501062052017150 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/performance_rmse.R \name{performance_rmse} \alias{performance_rmse} \alias{rmse} \title{Root Mean Squared Error} \usage{ performance_rmse(model, normalized = FALSE, verbose = TRUE) rmse(model, normalized = FALSE, verbose = TRUE) } \arguments{ \item{model}{A model.} \item{normalized}{Logical, use \code{TRUE} if normalized rmse should be returned.} \item{verbose}{Toggle off warnings.} } \value{ Numeric, the root mean squared error. } \description{ Compute root mean squared error for (mixed effects) models, including Bayesian regression models. } \details{ The RMSE is the square root of the variance of the residuals and indicates the absolute fit of the model to the data (difference between observed data to model's predicted values). It can be interpreted as the standard deviation of the unexplained variance, and is in the same units as the response variable. Lower values indicate better model fit. The normalized RMSE is the proportion of the RMSE related to the range of the response variable. Hence, lower values indicate less residual variance. } \examples{ \dontshow{if (require("nlme")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} data(Orthodont, package = "nlme") m <- nlme::lme(distance ~ age, data = Orthodont) # RMSE performance_rmse(m, normalized = FALSE) # normalized RMSE performance_rmse(m, normalized = TRUE) \dontshow{\}) # examplesIf} } performance/DESCRIPTION0000644000176200001440000001172114517665742014304 0ustar liggesusersType: Package Package: performance Title: Assessment of Regression Models Performance Version: 0.10.8 Authors@R: c(person(given = "Daniel", family = "Lüdecke", role = c("aut", "cre"), email = "d.luedecke@uke.de", comment = c(ORCID = "0000-0002-8895-3206", Twitter = "@strengejacke")), person(given = "Dominique", family = "Makowski", role = c("aut", "ctb"), email = "dom.makowski@gmail.com", comment = c(ORCID = "0000-0001-5375-9967", Twitter = "@Dom_Makowski")), person(given = "Mattan S.", family = "Ben-Shachar", role = c("aut", "ctb"), email = "matanshm@post.bgu.ac.il", comment = c(ORCID = "0000-0002-4287-4801", Twitter = "@mattansb")), person(given = "Indrajeet", family = "Patil", role = c("aut", "ctb"), email = "patilindrajeet.science@gmail.com", comment = c(ORCID = "0000-0003-1995-6531", Twitter = "@patilindrajeets")), person(given = "Philip", family = "Waggoner", role = c("aut", "ctb"), email = "philip.waggoner@gmail.com", comment = c(ORCID = "0000-0002-7825-7573")), person(given = "Brenton M.", family = "Wiernik", role = c("aut", "ctb"), email = "brenton@wiernik.org", comment = c(ORCID = "0000-0001-9560-6336", Twitter = "@bmwiernik")), person(given = "Vincent", family = "Arel-Bundock", email = "vincent.arel-bundock@umontreal.ca", role = "ctb", comment = c(ORCID = "0000-0003-2042-7063")), person(given = "Rémi", family = "Thériault", role = "ctb", email = "remi.theriault@mail.mcgill.ca", comment = c(ORCID = "0000-0003-4315-6788", Twitter = "@rempsyc")), person(given = "Martin", family = "Jullum", role = "rev"), person(given = "gjo11", role = "rev"), person("Etienne", "Bacher", , "etienne.bacher@protonmail.com", role = "ctb", comment = c(ORCID = "0000-0002-9271-5075"))) Maintainer: Daniel Lüdecke Description: Utilities for computing measures to assess model quality, which are not directly provided by R's 'base' or 'stats' packages. These include e.g. measures like r-squared, intraclass correlation coefficient (Nakagawa, Johnson & Schielzeth (2017) ), root mean squared error or functions to check models for overdispersion, singularity or zero-inflation and more. Functions apply to a large variety of regression models, including generalized linear models, mixed effects models and Bayesian models. References: Lüdecke et al. (2021) . License: GPL-3 URL: https://easystats.github.io/performance/ BugReports: https://github.com/easystats/performance/issues Depends: R (>= 3.6) Imports: bayestestR (>= 0.13.1), insight (>= 0.19.5), datawizard (>= 0.9.0), methods, stats, utils Suggests: AER, afex, BayesFactor, bayesplot, betareg, bigutilsr, blavaan, boot, brms, car, carData, CompQuadForm, correlation, cplm, dbscan, estimatr, fixest, flextable, forecast, ftExtra, gamm4, ggplot2, glmmTMB, graphics, Hmisc, httr, ICS, ICSOutlier, ISLR, ivreg, lavaan, lme4, lmtest, loo, MASS, Matrix, mclogit, mclust, metadat, metafor, mgcv, mlogit, multimode, nestedLogit, nlme, nonnest2, ordinal, parallel, parameters (>= 0.20.3), patchwork, pscl, psych, qqplotr (>= 0.0.6), randomForest, rempsyc, rmarkdown, rstanarm, rstantools, sandwich, see (>= 0.7.5), survey, survival, testthat, tweedie, VGAM, withr Encoding: UTF-8 Language: en-US RoxygenNote: 7.2.3.9000 Config/testthat/edition: 3 Config/testthat/parallel: true Config/Needs/website: rstudio/bslib, r-lib/pkgdown, easystats/easystatstemplate Config/rcmdcheck/ignore-inconsequential-notes: true NeedsCompilation: no Packaged: 2023-10-29 16:13:28 UTC; Daniel Author: Daniel Lüdecke [aut, cre] (, @strengejacke), Dominique Makowski [aut, ctb] (, @Dom_Makowski), Mattan S. Ben-Shachar [aut, ctb] (, @mattansb), Indrajeet Patil [aut, ctb] (, @patilindrajeets), Philip Waggoner [aut, ctb] (), Brenton M. Wiernik [aut, ctb] (, @bmwiernik), Vincent Arel-Bundock [ctb] (), Rémi Thériault [ctb] (, @rempsyc), Martin Jullum [rev], gjo11 [rev], Etienne Bacher [ctb] () Repository: CRAN Date/Publication: 2023-10-30 08:40:02 UTC performance/build/0000755000176200001440000000000014517502247013661 5ustar liggesusersperformance/build/partial.rdb0000644000176200001440000000007514517502247016010 0ustar liggesusersb```b`afd`b1 H020piּb C"{7performance/tests/0000755000176200001440000000000014412771210013714 5ustar liggesusersperformance/tests/testthat/0000755000176200001440000000000014517665742015576 5ustar liggesusersperformance/tests/testthat/test-r2_coxsnell.R0000644000176200001440000000030414355346734021122 0ustar liggesuserstest_that("r2_coxsnell", { model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") expect_equal(r2_coxsnell(model), c(`Cox & Snell's R2` = 0.440140715155838), tolerance = 1e-3) }) performance/tests/testthat/test-pkg-estimatr.R0000644000176200001440000000075114412771210021266 0ustar liggesuserstest_that("Issue #530 from the `modelsummary` repo", { skip_if_not_installed("estimatr") toy_df <- data.frame( y = c(1, 2, 3), x = c(1, 2, 4), weights = c(0.2, 0.2, 0.6) ) mod <- estimatr::lm_robust(x ~ y, data = toy_df) modw <- estimatr::lm_robust(x ~ y, weights = weights, data = toy_df) expect_equal( as.numeric(r2(mod)$R2), summary(mod)$r.squared ) expect_equal( as.numeric(r2(modw)$R2), summary(modw)$r.squared ) }) performance/tests/testthat/test-r2.R0000644000176200001440000000204414355346734017216 0ustar liggesuserstest_that("r2 lm", { data(iris) model <- lm(Sepal.Length ~ Species + Petal.Length, data = iris) out <- r2(model) expect_equal(out$R2, c(R2 = 0.83672), tolerance = 1e-3) expect_equal(out$R2_adjusted, c(`adjusted R2` = 0.83337), tolerance = 1e-3) }) test_that("r2 lm, ci", { data(iris) model <- lm(Sepal.Length ~ Species + Petal.Length, data = iris) out <- r2(model, ci = 0.95) expect_equal( out$R2, c(R2 = 0.83672, CI_low = 0.77725, CI_high = 0.87665), tolerance = 1e-3 ) expect_equal( out$R2_adjusted, c(`adjusted R2` = 0.83337, CI_low = 0.77282, CI_high = 0.87406), tolerance = 1e-3 ) }) test_that("r2 glm", { data(mtcars) model <- glm(am ~ mpg, data = mtcars) out <- r2(model) expect_equal(out$R2, c(R2 = 0.3598), tolerance = 1e-3) }) test_that("r2 glm, ci", { data(mtcars) model <- glm(am ~ mpg, data = mtcars) out <- r2(model, ci = 0.95) expect_equal( out$R2, c(R2 = 0.3598, CI_low = 0.09758, CI_high = 0.6066), tolerance = 1e-3 ) }) performance/tests/testthat/test-item_splithalf.R0000644000176200001440000000056314355346734021703 0ustar liggesuserstest_that("item_split_half", { data(iris) x <- iris[, 1:4] expect_equal( item_split_half(x), list( splithalf = 0.7864936, spearmanbrown = 0.8804886 ), tolerance = 1e-3 ) x <- iris[, 1:2] expect_equal( item_split_half(x), list(splithalf = -0.11757, spearmanbrown = -0.26647), tolerance = 1e-3 ) }) performance/tests/testthat/test-model_performance.bayesian.R0000644000176200001440000000750014413210361024125 0ustar liggesuserstest_that("model_performance.stanreg", { skip_on_cran() skip_if_offline() skip_if_not_installed("httr") set.seed(333) model <- tryCatch(insight::download_model("stanreg_lm_1"), error = function(e) NULL) skip_if(is.null(model)) perf <- model_performance(model) expect_equal(perf$R2, 0.7398733, tolerance = 1e-3) expect_equal(perf$R2_adjusted, 0.7162912, tolerance = 1e-3) expect_equal(perf$ELPD, -83.49838, tolerance = 1e-3) model <- tryCatch(insight::download_model("stanreg_lm_2"), error = function(e) NULL) skip_if(is.null(model)) perf <- model_performance(model) expect_equal(perf$R2, 0.8168386, tolerance = 1e-3) expect_equal(perf$R2_adjusted, 0.7979026, tolerance = 1e-3) expect_equal(perf$ELPD, -78.38735, tolerance = 1e-3) model <- tryCatch(insight::download_model("stanreg_lmerMod_1"), error = function(e) NULL) skip_if(is.null(model)) perf <- model_performance(model) expect_equal(perf$R2, 0.6286546, tolerance = 1e-3) expect_equal(perf$R2_adjusted, 0.6053507, tolerance = 1e-3) expect_equal(perf$ELPD, -31.55849, tolerance = 1e-3) }) test_that("model_performance.brmsfit", { skip_on_cran() skip_if_offline() skip_if_not_installed("httr") set.seed(333) model <- tryCatch(insight::download_model("brms_1"), error = function(e) NULL) skip_if(is.null(model)) expect_message({ perf <- model_performance(model) }) expect_equal(perf$R2, 0.8262673, tolerance = 1e-3) expect_equal(perf$R2_adjusted, 0.7982615, tolerance = 1e-3) expect_equal(perf$ELPD, -78.59823, tolerance = 1e-3) expect_identical(colnames(perf), c( "ELPD", "ELPD_SE", "LOOIC", "LOOIC_SE", "WAIC", "R2", "R2_adjusted", "RMSE", "Sigma" )) model <- tryCatch(insight::download_model("brms_mixed_4"), error = function(e) NULL) skip_if(is.null(model)) expect_message({ perf <- model_performance(model) }) expect_equal(perf$R2, 0.954538, tolerance = 1e-3) expect_equal(perf$R2_adjusted, 0.9529004, tolerance = 1e-3) expect_equal(perf$ELPD, -70.40493, tolerance = 1e-3) expect_identical(colnames(perf), c( "ELPD", "ELPD_SE", "LOOIC", "LOOIC_SE", "WAIC", "R2", "R2_marginal", "R2_adjusted", "R2_adjusted_marginal", "ICC", "RMSE", "Sigma" )) model <- tryCatch(insight::download_model("brms_ordinal_1"), error = function(e) NULL) skip_if(is.null(model)) perf <- suppressWarnings(model_performance(model)) expect_equal(perf$R2, 0.8760015, tolerance = 1e-3) expect_equal(perf$ELPD, -11.65433, tolerance = 1e-3) }) test_that("model_performance.BFBayesFactor", { skip_on_cran() skip_if_not_installed("BayesFactor") mod <- BayesFactor::ttestBF(mtcars$wt, mu = 3) expect_warning({ p <- model_performance(mod) }) expect_null(p) mod <- BayesFactor::ttestBF(mtcars$wt, factor(mtcars$am)) expect_warning({ p <- model_performance(mod) }) expect_null(p) mods <- BayesFactor::contingencyTableBF(matrix(1:4, 2), sampleType = "indepMulti", fixedMargin = "cols") expect_warning({ p <- model_performance(mod) }) expect_null(p) mod <- BayesFactor::correlationBF(mtcars$wt, mtcars$am) expect_warning({ p <- model_performance(mod) }) expect_null(p) mod <- BayesFactor::proportionBF(y = 15, N = 25, p = 0.5) expect_warning({ p <- model_performance(mod) }) expect_null(p) t <- c(-0.15, 2.39, 2.42, 2.43, -0.15, 2.39, 2.42, 2.43) N <- c(100, 150, 97, 99, 99, 97, 100, 150) mod <- BayesFactor::meta.ttestBF(t, N) expect_warning({ p <- model_performance(mod) }) expect_null(p) mod <- BayesFactor::regressionBF(mpg ~ cyl, mtcars, progress = FALSE) modF <- lm(mpg ~ cyl, mtcars) p <- model_performance(mod) expect_equal(p$R2, unname(r2(modF)[[1]]), tolerance = 0.05) expect_equal(p$Sigma, sigma(modF), tolerance = 0.05) }) performance/tests/testthat/test-performance_auc.R0000644000176200001440000000257614436307766022040 0ustar liggesuserstest_that("performance_auc", { model_auc <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") # message set.seed(3) expect_message({ out <- performance_accuracy(model_auc) }) expect_equal(out$Accuracy, 0.75833, tolerance = 1e-3) expect_equal(out$CI_low, 0.6, tolerance = 1e-3) expect_equal(out$CI_high, 0.9875, tolerance = 1e-3) set.seed(12) expect_message({ out <- performance_accuracy(model_auc) }) expect_equal(out$Accuracy, 0.97222, tolerance = 1e-3) expect_equal(out$CI_low, 0.89722, tolerance = 1e-3) expect_equal(out$CI_high, 1, tolerance = 1e-3) # message set.seed(3) expect_message({ out <- performance_accuracy(model_auc, ci = 0.8) }) expect_equal(out$Accuracy, 0.75833, tolerance = 1e-3) expect_equal(out$CI_low, 0.6, tolerance = 1e-3) expect_equal(out$CI_high, 0.95, tolerance = 1e-3) model_auc <- lm(mpg ~ wt + cyl, data = mtcars) set.seed(123) out <- performance_accuracy(model_auc) expect_equal(out$Accuracy, 0.94303, tolerance = 1e-3) expect_equal(out$CI_low, 0.8804, tolerance = 1e-3) expect_equal(out$CI_high, 0.98231, tolerance = 1e-3) set.seed(123) out <- performance_accuracy(model_auc, ci = 0.8) expect_equal(out$Accuracy, 0.94303, tolerance = 1e-3) expect_equal(out$CI_low, 0.90197, tolerance = 1e-3) expect_equal(out$CI_high, 0.97567, tolerance = 1e-3) }) performance/tests/testthat/test-check_distribution.R0000644000176200001440000000201114507335630022531 0ustar liggesuserstest_that("check_distribution", { skip_if_not_installed("lme4") skip_if_not_installed("randomForest") data(sleepstudy, package = "lme4") model <<- lme4::lmer(Reaction ~ Days + (Days | Subject), sleepstudy) out <- check_distribution(model) expect_identical( out$Distribution, c( "bernoulli", "beta", "beta-binomial", "binomial", "cauchy", "chi", "exponential", "F", "gamma", "half-cauchy", "inverse-gamma", "lognormal", "neg. binomial (zero-infl.)", "negative binomial", "normal", "pareto", "poisson", "poisson (zero-infl.)", "tweedie", "uniform", "weibull" ) ) expect_equal( out$p_Residuals, c( 0, 0, 0, 0, 0.9375, 0, 0, 0, 0, 0, 0, 0.03125, 0, 0, 0, 0, 0, 0, 0, 0, 0.03125 ), tolerance = 1e-4 ) expect_equal( out$p_Response, c( 0, 0, 0.03125, 0, 0, 0, 0, 0, 0.4375, 0.03125, 0, 0.46875, 0.03125, 0, 0, 0, 0, 0, 0, 0, 0 ), tolerance = 1e-4 ) expect_snapshot(print(out)) }) performance/tests/testthat/test-check_normality.R0000644000176200001440000000276614412771210022042 0ustar liggesuserstest_that("check_normality | afex", { skip_if_not(getRversion() >= "4.0.0") skip_if_not_installed("afex") data(obk.long, package = "afex") obk.long$treatment <- as.character(obk.long$treatment) suppressWarnings(suppressMessages({ aM <- afex::aov_car(value ~ treatment * gender + Error(id / (phase * hour)), data = obk.long ) aW <- afex::aov_car(value ~ Error(id / (phase * hour)), data = obk.long ) aB <- afex::aov_car(value ~ treatment * gender + Error(id), data = obk.long ) })) msg <- capture.output(pM <- check_normality(aM)) msg <- capture.output(pW <- check_normality(aW)) msg <- capture.output(pB <- check_normality(aB)) expect_equal(pM, 0.2054236, ignore_attr = TRUE, tolerance = 0.001) expect_equal(pW, 0.5496325, ignore_attr = TRUE, tolerance = 0.001) expect_equal(pB, 0.734765, ignore_attr = TRUE, tolerance = 0.001) }) test_that("check_normality | glmmTMB", { skip_if_not_installed("glmmTMB") skip_if_not(getRversion() >= "4.0.0") data("Salamanders", package = "glmmTMB") m <- glmmTMB::glmmTMB( count ~ mined + spp + (1 | site), family = poisson, data = Salamanders ) out <- check_normality(m, effects = "random") expect_equal(attributes(out)$re_groups, "site: (Intercept)") expect_equal(as.vector(out), 0.698457693553405, tolerance = 1e-3) expect_message( out <- check_normality(m, effects = "fixed"), "for linear models" ) expect_null(out) }) performance/tests/testthat/test-model_performance.merMod.R0000644000176200001440000000365314412771210023566 0ustar liggesuserstest_that("model_performance.merMod", { skip_on_cran() skip_if_offline() skip_if_not_installed("httr") model <- insight::download_model("lmerMod_1") expect_equal(model_performance(model, estimator = "ML")$AIC, AIC(logLik(model, REML = FALSE)), tolerance = 0.01) expect_equal(model_performance(model, estimator = "REML")$AIC, AIC(model), tolerance = 0.01) model <- insight::download_model("merMod_1") expect_equal(model_performance(model)$AIC, AIC(model), tolerance = 0.01) expect_equal(model_performance(model, estimator = "REML")$AIC, AIC(model), tolerance = 0.01) expect_equal(model_performance(model)$AIC, 23.58593, tolerance = 0.01) model <- insight::download_model("merMod_2") expect_equal(model_performance(model)$AIC, 21.4729, tolerance = 0.01) }) test_that("model_performance.merMod AICc", { skip_on_cran() skip_if_not_installed("lme4") m1 <- lme4::lmer(mpg ~ disp + am + (1 | cyl), data = mtcars) m2 <- lm(mpg ~ hp + vs, data = mtcars) # REML expect_message(expect_equal( compare_performance(m1, m2, metrics = "AICc", estimator = "REML")$AICc, c(177.52804, 182.88598), tolerance = 1e-3 )) expect_equal(model_performance(m1, metrics = "AICc", estimator = "REML")$AICc, 177.52804, tolerance = 1e-3) expect_equal(performance_aicc(m1, estimator = "REML"), 177.52804, tolerance = 1e-3) # default - ML expect_equal( compare_performance(m1, m2, metrics = "AICc")$AICc, c(174.5701, 182.88598), tolerance = 1e-3 ) # default model_performance is REML expect_equal(model_performance(m1, metrics = "AICc")$AICc, 177.52804, tolerance = 1e-3) expect_equal(model_performance(m1, metrics = "AICc", estimator = "ML")$AICc, 174.5701, tolerance = 1e-3) # default performance_aic is REML expect_equal(performance_aicc(m1), 177.52804, tolerance = 1e-3) expect_equal(performance_aicc(m1, estimator = "ML"), 174.5701, tolerance = 1e-3) }) performance/tests/testthat/test-performance_roc.R0000644000176200001440000000243414412771210022023 0ustar liggesuserstest_that("performance_roc", { skip_if_not_installed("lme4") m <- lme4::glmer(vs ~ mpg + (1 | gear), family = "binomial", data = mtcars) roc <- performance_roc(m) expect_equal( roc$Sensitivity, c( 0, 0.07143, 0.14286, 0.21429, 0.28571, 0.35714, 0.42857, 0.5, 0.57143, 0.57143, 0.64286, 0.64286, 0.64286, 0.71429, 0.78571, 0.85714, 0.85714, 0.92857, 0.92857, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), tolerance = 1e-3 ) }) test_that("performance_roc", { set.seed(123) d <- iris[sample(1:nrow(iris), size = 50), ] d$y <- as.factor(rbinom(nrow(d), size = 1, 0.3)) dat <<- d m <- glm( y ~ Sepal.Length + Sepal.Width, data = dat, family = "binomial" ) roc <- performance_roc(m) expect_equal( roc$Sensitivity, c( 0, 0, 0.07692, 0.07692, 0.07692, 0.15385, 0.23077, 0.23077, 0.23077, 0.23077, 0.23077, 0.30769, 0.30769, 0.30769, 0.30769, 0.30769, 0.38462, 0.38462, 0.38462, 0.46154, 0.46154, 0.53846, 0.53846, 0.53846, 0.53846, 0.61538, 0.61538, 0.61538, 0.61538, 0.61538, 0.69231, 0.76923, 0.76923, 0.76923, 0.84615, 0.92308, 0.92308, 0.92308, 0.92308, 0.92308, 0.92308, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), tolerance = 1e-3 ) }) performance/tests/testthat/test-item_reliability.R0000644000176200001440000000074214355346734022225 0ustar liggesuserstest_that("item_reliability", { data(iris) x <- iris[, 1:4] expect_equal( item_reliability(x), structure( list( term = c( "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width" ), alpha_if_deleted = c(0.454, 0.877, 0.489, 0.467), item_discrimination = c(0.894, -0.349, 0.863, 0.921) ), class = "data.frame", row.names = c(NA, -4L) ), tolerance = 1e-3 ) }) performance/tests/testthat/test-icc.R0000644000176200001440000000611014426632764017427 0ustar liggesusersskip_on_os("mac") test_that("icc", { skip_on_cran() m0 <- lm(Sepal.Length ~ Petal.Length, data = iris) expect_warning(expect_null(icc(m0))) }) test_that("icc", { skip_on_cran() skip_if_not_installed("lme4") m1 <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) expect_equal( icc(m1), data.frame( ICC_adjusted = 0.910433109183341, ICC_conditional = 0.310947768161385, ICC_unadjusted = 0.310947768161385 ), tolerance = 1e-3, ignore_attr = TRUE ) }) # bootstrapped CIs ------------ test_that("icc, CI", { skip_on_cran() skip_if_not_installed("lme4") data(sleepstudy, package = "lme4") m <- lme4::lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy) set.seed(123) out <- icc(m, ci = 0.95) expect_equal(out$ICC_adjusted, c(0.72166, 0.52239, 0.84024), tolerance = 1e-1) expect_equal(out$ICC_unadjusted, c(0.52057, 0.32429, 0.67123), tolerance = 1e-1) }) test_that("icc", { skip_on_cran() skip_if_offline() skip_if_not_installed("httr") m2 <- insight::download_model("stanreg_lmerMod_1") expect_equal( icc(m2), data.frame( ICC_adjusted = 0.399303562702568, ICC_conditional = 0.216907586891627, ICC_unadjusted = 0.216907586891627 ), tolerance = 1e-2, ignore_attr = TRUE ) }) test_that("icc", { skip_on_cran() skip_if_offline() skip_if_not_installed("httr") m3 <- insight::download_model("brms_mixed_1") set.seed(123) expect_equal( variance_decomposition(m3)$ICC_decomposed, 0.3262006, tolerance = 0.05 ) }) test_that("icc", { skip_on_cran() skip_if_offline() skip_if_not_installed("httr") m3 <- insight::download_model("brms_mixed_1") set.seed(123) expect_equal( icc(m3), data.frame( ICC_adjusted = 0.930217931275196, ICC_conditional = 0.771475122370036, ICC_unadjusted = 0.771475122370036 ), tolerance = 0.05, ignore_attr = TRUE ) }) test_that("icc", { skip_on_cran() skip_if_not_installed("lme4") data(sleepstudy, package = "lme4") set.seed(12345) sleepstudy$grp <- sample(1:5, size = 180, replace = TRUE) sleepstudy$subgrp <- NA for (i in 1:5) { filter_group <- sleepstudy$grp == i sleepstudy$subgrp[filter_group] <- sample(1:30, size = sum(filter_group), replace = TRUE) } model <- lme4::lmer( Reaction ~ Days + (1 | grp) + (1 | Subject), data = sleepstudy ) expect_equal( icc(model, by_group = TRUE), structure( list( Group = c("Subject", "grp"), ICC = c(0.5896587, 0.0016551) ), class = c("icc_by_group", "data.frame"), row.names = c(NA, -2L) ), tolerance = 0.05 ) }) test_that("icc", { skip_on_cran() skip_if_not_installed("nlme") skip_if_not_installed("lme4") m <- nlme::lme(Sepal.Length ~ Petal.Length, random = ~ 1 | Species, data = iris) out <- icc(m) expect_equal(out$ICC_adjusted, 0.9104331, tolerance = 0.01) expect_equal(out$ICC_unadjusted, 0.3109478, tolerance = 0.01) }) performance/tests/testthat/test-check_sphericity.R0000644000176200001440000000134214355346734022213 0ustar liggesuserstest_that("check_sphericity | afex", { skip_if_not_installed("afex") data(obk.long, package = "afex") obk.long$treatment <- as.character(obk.long$treatment) suppressWarnings(suppressMessages({ aM <- afex::aov_car(value ~ treatment * gender + Error(id / (phase * hour)), data = obk.long ) aW <- afex::aov_car(value ~ Error(id / (phase * hour)), data = obk.long ) aB <- afex::aov_car(value ~ treatment * gender + Error(id), data = obk.long ) })) expect_error(check_sphericity(aB)) msg <- capture.output(pM <- check_sphericity(aM)) msg <- capture.output(pW <- check_sphericity(aW)) expect_equal(length(pM), 12L) expect_equal(length(pW), 3L) }) performance/tests/testthat/test-bootstrapped_icc_ci.R0000644000176200001440000000411014430456456022663 0ustar liggesuserstest_that("bootstrapped icc ci_methods", { skip_on_cran() skip_on_os(c("mac", "linux")) skip_if_not_installed("lme4") data(sleepstudy, package = "lme4") m_icc <- lme4::lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy) set.seed(123) out1 <- icc(m_icc, ci = 0.95, iterations = 20) set.seed(123) out2 <- icc(m_icc, ci = 0.95, iterations = 20, ci_method = "boot") set.seed(123) out3 <- icc(m_icc, ci = 0.95, iterations = 20, ci_method = "analytical") expect_equal( out1$ICC_adjusted, c(0.72166, 0.50154, 0.79417), tolerance = 1e-3, ignore_attr = TRUE ) expect_equal( out2$ICC_adjusted, c(0.72166, 0.64683, 0.88631), tolerance = 1e-3, ignore_attr = TRUE ) expect_equal( out3$ICC_adjusted, c(0.72166, 0.64359, 0.78347), tolerance = 1e-3, ignore_attr = TRUE ) expect_snapshot(print(out1)) expect_snapshot(print(out2)) expect_snapshot(print(out3)) }) test_that("bootstrapped r2_nakagawa ci_methods", { skip_on_cran() skip_on_os(c("mac", "linux")) skip_if_not_installed("lme4") data(sleepstudy, package = "lme4") m_icc <- lme4::lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy) set.seed(123) out1 <- r2_nakagawa(m_icc, ci = 0.95, iterations = 20) set.seed(123) out2 <- r2_nakagawa(m_icc, ci = 0.95, iterations = 20, ci_method = "boot") set.seed(123) out3 <- r2_nakagawa(m_icc, ci = 0.95, iterations = 20, ci_method = "analytical") expect_equal( out1$R2_marginal, c(`Marginal R2` = 0.27865, CI_low = 0.20403, CI_high = 0.39177), tolerance = 1e-3, ignore_attr = TRUE ) expect_equal( out2$R2_marginal, c(`Marginal R2` = 0.27865, CI_low = 0.23123, CI_high = 0.30851), tolerance = 1e-3, ignore_attr = TRUE ) expect_equal( out3$R2_marginal, c(`Marginal R2` = 0.27865, CI_low = 0.17018, CI_high = 0.39031), tolerance = 1e-3, ignore_attr = TRUE ) expect_snapshot(print(out1)) expect_snapshot(print(out2)) expect_snapshot(print(out3)) }) performance/tests/testthat/test-mclogit.R0000644000176200001440000000263714412771210020322 0ustar liggesusersskip_if_not_installed("mclogit") data(Transport, package = "mclogit") mod_mb <- mclogit::mblogit(factor(gear) ~ mpg + hp, data = mtcars, trace = FALSE) mod_mc <- mclogit::mclogit(resp | suburb ~ distance + cost, data = Transport, trace = FALSE) test_that("r2 Nagelkerke", { expect_equal( r2_nagelkerke(mod_mb), mclogit::getSummary.mblogit(mod_mb)$sumstat["Nagelkerke"], ignore_attr = TRUE, tolerance = 1e-4 ) expect_equal( r2_nagelkerke(mod_mc), mclogit::getSummary.mclogit(mod_mc)$sumstat["Nagelkerke"], ignore_attr = TRUE, tolerance = 1e-4 ) }) test_that("r2 McFadden", { expect_equal( r2_mcfadden(mod_mb), mclogit::getSummary.mblogit(mod_mb)$sumstat["McFadden"], ignore_attr = TRUE, tolerance = 1e-4 ) expect_equal( r2_mcfadden(mod_mc), mclogit::getSummary.mclogit(mod_mc)$sumstat["McFadden"], ignore_attr = TRUE, tolerance = 1e-4 ) }) test_that("r2 CoxSnell", { expect_equal( r2_coxsnell(mod_mb), mclogit::getSummary.mblogit(mod_mb)$sumstat["Cox.Snell"], ignore_attr = TRUE, tolerance = 1e-4 ) expect_equal( r2_coxsnell(mod_mc), mclogit::getSummary.mclogit(mod_mc)$sumstat["Cox.Snell"], ignore_attr = TRUE, tolerance = 1e-4 ) }) test_that("model_performance", { expect_snapshot(model_performance(mod_mb)) expect_snapshot(model_performance(mod_mc)) }) performance/tests/testthat/test-r2_nakagawa.R0000644000176200001440000000735014412771210021036 0ustar liggesusersskip_if_not_installed("lme4") model <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) test_that("r2_nakagawa", { expect_equal( r2_nakagawa(model), structure( list( R2_conditional = c(`Conditional R2` = 0.969409477972726), R2_marginal = c(`Marginal R2` = 0.65846169440315) ), class = c("r2_nakagawa", "list") ), tolerance = 1e-3 ) }) skip_on_cran() test_that("r2_nakagawa, ci", { set.seed(123) out <- r2_nakagawa(model, ci = 0.95) expect_equal( out$R2_marginal, c(`Marginal R2` = 0.65846, CI_low = 0.33708, CI_high = 0.94718), tolerance = 1e-3, ignore_attr = TRUE ) expect_equal( out$R2_conditional, c(`Conditional R2` = 0.96941, CI_low = 0.94299, CI_high = 0.98426), tolerance = 1e-3, ignore_attr = TRUE ) }) dat <- structure(list( y = structure( c( 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L ), .Label = c("0", "1"), class = "factor" ), x1 = structure( c( 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L ), .Label = c("1", "2"), class = "factor" ), a1 = structure( c( 9L, 1L, 1L, 5L, 9L, 7L, 1L, 1L, 9L, 5L, 5L, 5L, 5L, 6L, 4L, 3L, 5L, 9L, 9L, 6L, 1L, 9L, 9L, 9L, 9L, 5L, 2L, 7L, 7L, 7L, 4L, 5L, 7L, 4L, 2L, 9L, 2L, 2L, 9L, 9L, 5L, 5L, 7L, 5L, 9L, 8L, 8L, 8L, 8L, 3L, 9L, 5L, 6L, 6L, 3L, 9L, 6L, 9L, 6L, 3L, 5L, 6L, 6L, 5L, 7L, 4L, 7L, 2L, 5L, 2L, 5L, 5L, 9L, 5L, 9L, 4L, 3L, 5L, 5L, 3L, 9L, 3L, 3L, 3L, 9L, 9L, 3L, 9L, 3L, 3L, 9L, 8L, 3L, 9L, 7L, 9L, 9L, 6L, 2L, 9L, 9L, 4L, 9L, 7L, 5L, 5L, 5L, 5L, 5L, 5L ), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9"), class = "factor" ), a2 = structure( c( 6L, 6L, 12L, 12L, 11L, 11L, 11L, 14L, 14L, 14L, 14L, 14L, 13L, 1L, 1L, 13L, 1L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 12L, 12L, 12L, 7L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 5L, 5L, 11L, 7L, 8L, 1L, 1L, 12L, 4L, 11L, 11L, 11L, 5L, 5L, 5L, 2L, 13L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 7L, 7L, 8L, 8L, 8L, 9L, 9L, 9L, 7L, 7L, 8L, 8L, 9L, 10L, 10L, 10L, 10L, 1L, 10L, 1L, 10L, 13L, 13L, 6L, 11L, 11L, 14L, 2L, 2L, 2L, 2L, 6L, 6L, 6L, 3L, 3L, 3L, 13L, 13L, 13L, 6L, 6L, 6L, 4L ), .Label = c("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14"), class = "factor" ) ), row.names = c(NA, -110L), class = "data.frame") model <- lme4::glmer(y ~ x1 + (1 | a1) + (1 | a2), family = binomial(link = "logit"), data = dat) test_that("r2_nakagawa, by_group", { out <- r2_nakagawa(model, by_group = TRUE) expect_equal(out$R2, c(0, 0.05771, 0.07863), tolerance = 1e-2) expect_identical(out$Level, c("Level 1", "a1", "a2")) }) test_that("icc, by_group", { out <- icc(model, by_group = TRUE) expect_equal(out$ICC, c(0.3200625, 0.1096797), tolerance = 1e-2) expect_identical(out$Group, c("a2", "a1")) }) performance/tests/testthat/test-item_discrimination.R0000644000176200001440000000073114362032043022705 0ustar liggesuserstest_that("item_discrimination", { data(iris) x <- iris[, 1:4] expect_equal( item_discrimination(x), structure(list(Item = c( "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width" ), Discrimination = c( 0.894040250011166, -0.348657747269071, 0.863271047498634, 0.921040960149154 )), class = c( "item_discrimination", "data.frame" ), row.names = c(NA, -4L)), tolerance = 1e-3 ) }) performance/tests/testthat/test-check_outliers.R0000644000176200001440000002077014477405322021676 0ustar liggesuserstest_that("zscore negative threshold", { expect_error( check_outliers(mtcars$mpg, method = "zscore", threshold = -1), "The `threshold` argument" ) }) test_that("lof illegal threshold", { expect_error( check_outliers(mtcars$mpg, method = "lof", threshold = -1), "The `threshold` argument" ) expect_error( check_outliers(mtcars$mpg, method = "lof", threshold = 1.1), "The `threshold` argument" ) }) # 1. We first test that each method consistently flags outliers, # (given a specific threshold) test_that("zscore which", { expect_identical( which(check_outliers(mtcars$mpg, method = "zscore", threshold = 2.2)), 20L ) }) test_that("zscore_robust which", { expect_identical( which(check_outliers(mtcars$mpg, method = "zscore_robust", threshold = 2.2)), as.integer(c(18, 20)) ) }) test_that("iqr which", { expect_identical( which(check_outliers(mtcars$mpg, method = "iqr", threshold = 1.2)), as.integer(c(18, 20)) ) }) test_that("ci which", { expect_identical( which(check_outliers(mtcars$mpg, method = "ci", threshold = 0.95)), 20L ) }) test_that("eti which", { expect_identical( which(check_outliers(mtcars$mpg, method = "eti", threshold = 0.95)), 20L ) }) test_that("hdi which", { expect_identical( which(check_outliers(mtcars$mpg, method = "hdi", threshold = 0.90)), as.integer(c(18, 20)) ) }) test_that("bci which", { expect_identical( which(check_outliers(mtcars$mpg, method = "bci", threshold = 0.95)), as.integer(c(15, 16, 20)) ) }) test_that("mahalanobis which", { expect_identical( which(check_outliers(mtcars, method = "mahalanobis", threshold = 20)), as.integer(c(9, 29)) ) }) test_that("mahalanobis_robust which", { skip_if_not_installed("bigutilsr") expect_identical( which(check_outliers(mtcars, method = "mahalanobis_robust", threshold = 25)), as.integer(c(7, 9, 21, 24, 27, 28, 29, 31)) ) }) test_that("mcd which", { # (not clear why method mcd needs a seed) set.seed(42) expect_identical( tail(which(check_outliers(mtcars[1:4], method = "mcd", threshold = 45))), 31L ) }) ## FIXME: Fails on CRAN/windows test_that("ics which", { # suddenly fails on R Under development (unstable) (2023-09-07 r85102) # gcc-13 (Debian 13.2.0-2) 13.2.0 skip_on_cran() skip_if_not_installed("ICS") skip_if_not_installed("ICSOutlier") expect_identical( which(check_outliers(mtcars, method = "ics", threshold = 0.001)), as.integer(c(9, 29)) ) }) test_that("optics which", { skip_if_not_installed("dbscan") expect_identical( which(check_outliers(mtcars, method = "optics", threshold = 14)), as.integer(c(5, 7, 15, 16, 17, 24, 25, 29, 31)) ) }) test_that("lof which", { skip_if_not_installed("dbscan") expect_identical( which(check_outliers(mtcars, method = "lof", threshold = 0.005)), 31L ) }) # 2. Next, we check the print method test_that("zscore print", { expect_output( print(check_outliers(mtcars, method = "zscore", threshold = 2.2)), "5 outliers detected: cases 9, 16, 19, 20, 31." ) }) # 3. Next, we check some attributes since it looks harder than # expected to test the complex print output itself test_that("attributes threshold", { x <- attributes(check_outliers(mtcars, method = "zscore", threshold = 2.2)) expect_equal( as.numeric(x$threshold), 2.2 ) }) test_that("attributes method", { x <- attributes(check_outliers(mtcars, method = "zscore", threshold = 2.2)) expect_identical( x$method, "zscore" ) }) test_that("attributes variables", { x <- attributes(check_outliers(mtcars, method = "zscore", threshold = 2.2)) expect_identical( x$variables, c("mpg", "cyl", "disp", "hp", "drat", "wt", "qsec", "vs", "am", "gear", "carb") ) }) test_that("attributes data", { x <- attributes(check_outliers(mtcars, method = "zscore", threshold = 2.2)) expect_s3_class(x$data, "data.frame") }) test_that("attributes raw data", { x <- attributes(check_outliers(mtcars, method = "zscore", threshold = 2.2)) expect_s3_class(x$raw_data, "data.frame") }) test_that("attributes univariate data frames", { x <- attributes(check_outliers(mtcars, method = "zscore", threshold = 2.2)) expect_s3_class(x$outlier_var$zscore$mpg, "data.frame") }) test_that("attributes outlier count data frame", { x <- attributes(check_outliers(mtcars, method = "zscore", threshold = 2.2)) expect_s3_class(x$outlier_count$all, "data.frame") }) # 4. Next, we test multiple simultaneous methods test_that("multiple methods which", { data <- rbind(mtcars, 99) expect_identical( which(check_outliers(data, method = c("zscore", "iqr"))), 33L ) }) # We exclude method ics because it is too slow test_that("all methods which", { skip_if_not_installed("bigutilsr") expect_identical( which(check_outliers(mtcars, method = c( "zscore", "zscore_robust", "iqr", "ci", "eti", "hdi", "bci", "mahalanobis", "mahalanobis_robust", "mcd", "optics", "lof" ), threshold = list( "zscore" = 2.2, "zscore_robust" = 2.2, "iqr" = 1.2, "ci" = 0.95, "eti" = 0.95, "hdi" = 0.90, "bci" = 0.95, "mahalanobis" = 20, "mahalanobis_robust" = 25, "mcd" = 25, "optics" = 14, "lof" = 0.005 ) )), as.integer(c(9, 15, 16, 19, 20, 28, 29, 31)) ) }) # 5. Next, we test adding ID test_that("multiple methods with ID", { skip_if_not_installed("bigutilsr") data <- datawizard::rownames_as_column(mtcars, var = "car") x <- attributes(check_outliers(data, method = c( "zscore", "zscore_robust", "iqr", "ci", "eti", "hdi", "bci", "mahalanobis", "mahalanobis_robust", "mcd", "optics", "lof" ), threshold = list( "zscore" = 2.2, "zscore_robust" = 2.2, "iqr" = 1.2, "ci" = 0.95, "eti" = 0.95, "hdi" = 0.90, "bci" = 0.95, "mahalanobis" = 20, "mahalanobis_robust" = 25, "mcd" = 25, "optics" = 14, "lof" = 0.005 ), ID = "car" )) expect_identical( x$outlier_var$zscore$mpg$car, "Toyota Corolla" ) expect_identical( x$outlier_count$all$car[1], "Maserati Bora" ) }) # 6. Next, we test models test_that("cook which", { model <- lm(disp ~ mpg + hp, data = mtcars) expect_identical( which(check_outliers(model, method = "cook", threshold = list(cook = 0.85))), 31L ) }) ## FIXME: Cannot use a single threshold, but only for this case # test_that("cook which", { # model <- lm(disp ~ mpg + hp, data = mtcars) # expect_equal( # which(check_outliers(model, method = "cook", threshold = 0.85)), # # Error: The `threshold` argument must be NULL (for default values) or a list containing # threshold values for desired methods (e.g., `list('mahalanobis' = 7)`). # 31 # ) # }) test_that("cook multiple methods which", { skip_if_not_installed("dbscan") model <- lm(disp ~ mpg + hp, data = mtcars) expect_identical( which(check_outliers(model, method = c("cook", "optics", "lof"))), 31L ) }) test_that("pareto which", { skip_if_not_installed("dbscan") skip_if_not_installed("rstanarm") set.seed(123) model <- rstanarm::stan_glm(mpg ~ qsec + wt, data = mtcars, refresh = 0) invisible(capture.output(model)) expect_identical( which(check_outliers(model, method = "pareto", threshold = list(pareto = 0.5))), 17L ) }) test_that("pareto multiple methods which", { skip_if_not_installed("dbscan") skip_if_not_installed("rstanarm") set.seed(123) model <- rstanarm::stan_glm(mpg ~ qsec + wt, data = mtcars, refresh = 0) invisible(capture.output(model)) expect_identical( which(check_outliers( model, method = c("pareto", "optics"), threshold = list(pareto = 0.3, optics = 11) )), 20L ) }) test_that("BayesFactor which", { skip_if_not_installed("BayesFactor") set.seed(123) model <- BayesFactor::regressionBF(rating ~ ., data = attitude, progress = FALSE) expect_identical( which(check_outliers(model, threshold = list(mahalanobis = 15))), 18L ) }) # 7. Next, we test grouped output test_that("cook multiple methods which", { iris2 <- datawizard::data_group(iris, "Species") z <- attributes(check_outliers(iris2, method = c("zscore", "iqr"))) expect_named( z$outlier_count, c("setosa", "versicolor", "virginica") ) }) performance/tests/testthat/test-check_zeroinflation.R0000644000176200001440000000240414412771210022674 0ustar liggesuserstest_that("check_zeroinflation", { skip_if_not_installed("glmmTMB") set.seed(123) data(Salamanders, package = "glmmTMB") m <- glm(count ~ spp + mined, family = poisson, data = Salamanders) expect_equal( check_zeroinflation(m), structure( list( predicted.zeros = 298, observed.zeros = 387L, ratio = 0.770025839793282, tolerance = 0.05 ), class = "check_zi" ), tolerance = 1e-3 ) }) test_that("check_zeroinflation, glmer.nb", { skip_if_not_installed("glmmTMB") skip_if_not_installed("lme4") set.seed(101) data(Salamanders, package = "glmmTMB") dd <- expand.grid( f1 = factor(1:3), f2 = LETTERS[1:2], g = 1:9, rep = 1:15, KEEP.OUT.ATTRS = FALSE ) mu <- 5 * (-4 + with(dd, as.integer(f1) + 4 * as.numeric(f2))) dd$y <- rnbinom(nrow(dd), mu = mu, size = 0.5) dat2 <<- dd suppressMessages( m <- lme4::glmer.nb(y ~ f1 * f2 + (1 | g), data = dat2, verbose = FALSE) ) expect_equal( check_zeroinflation(m), structure( list( predicted.zeros = 153, observed.zeros = 155L, ratio = 0.987096774193548, tolerance = 0.05 ), class = "check_zi" ), tolerance = 1e-3 ) }) performance/tests/testthat/test-r2_nagelkerke.R0000644000176200001440000000130114412771210021362 0ustar liggesuserstest_that("r2_nagelkerke", { model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") expect_equal(r2_nagelkerke(model), c(`Nagelkerke's R2` = 0.589959301837163), tolerance = 1e-3) expect_equal(r2(model), list(R2_Tjur = c(`Tjur's R2` = 0.477692621360749)), tolerance = 1e-3, ignore_attr = TRUE) }) test_that("r2_nagelkerke", { skip_if_not_installed("MASS") withr::with_options( list(contrasts = c("contr.treatment", "contr.poly")), { data(housing, package = "MASS") model <- MASS::polr(Sat ~ Infl + Type + Cont, weights = Freq, data = housing) expect_equal(r2_nagelkerke(model), c(`Nagelkerke's R2` = 0.1084083), tolerance = 1e-3) } ) }) performance/tests/testthat/test-roc.R0000644000176200001440000000136614412771210017445 0ustar liggesusersskip_if_not_installed("ISLR") data(Smarket, package = "ISLR") m1 <- glm(am ~ vs + wt, family = binomial(), data = mtcars) m2 <- glm(Direction ~ Lag1 + Volume, family = binomial(), data = Smarket) roc1 <- performance_roc(m1) roc2 <- performance_roc(m2) auc1 <- bayestestR::area_under_curve(roc1$Specificity, roc1$Sensitivity) auc2 <- bayestestR::area_under_curve(roc2$Specificity, roc2$Sensitivity) test_that("roc", { expect_equal(head(roc1$Sensitivity), c(0, 0.07692, 0.15385, 0.23077, 0.30769, 0.38462), tolerance = 1e-2) expect_equal(head(roc2$Sensitivity), c(0, 0, 0, 0, 0.00154, 0.00154), tolerance = 1e-2) }) test_that("auc", { expect_equal(auc1, 0.964, tolerance = 1e-2) expect_equal(auc2, 0.535, tolerance = 1e-2) }) performance/tests/testthat/test-check_homogeneity.R0000644000176200001440000000161614355346734022363 0ustar liggesuserstest_that("check_homogeneity | afex", { skip_if_not_installed("afex") data(obk.long, package = "afex") obk.long$treatment <- as.character(obk.long$treatment) suppressWarnings(suppressMessages({ aM <- afex::aov_car(value ~ treatment * gender + Error(id / (phase * hour)), data = obk.long ) aW <- afex::aov_car(value ~ Error(id / (phase * hour)), data = obk.long ) aB <- afex::aov_car(value ~ treatment * gender + Error(id), data = obk.long ) })) expect_error(check_homogeneity(aW)) msg <- capture.output(expect_message(check_homogeneity(aB, method = "bartlett"), "Only")) msg <- capture.output(pM <- check_homogeneity(aM)) msg <- capture.output(pB <- check_homogeneity(aB)) expect_equal(pM, 0.3496516, ignore_attr = TRUE, tolerance = 0.001) expect_equal(pB, 0.3496516, ignore_attr = TRUE, tolerance = 0.001) }) performance/tests/testthat/test-check_collinearity.R0000644000176200001440000001472614477406111022527 0ustar liggesusers# https://github.com/easystats/performance/pull/547 test_that("check_collinearity, correct order in print", { m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) out <- capture.output(print(check_collinearity(m, verbose = FALSE))) expect_identical( out, c( "# Check for Multicollinearity", "", "Low Correlation", "", " Term VIF VIF 95% CI Increased SE Tolerance Tolerance 95% CI", " gear 1.53 [1.19, 2.51] 1.24 0.65 [0.40, 0.84]", "", "Moderate Correlation", "", " Term VIF VIF 95% CI Increased SE Tolerance Tolerance 95% CI", " wt 5.05 [3.21, 8.41] 2.25 0.20 [0.12, 0.31]", " cyl 5.41 [3.42, 9.04] 2.33 0.18 [0.11, 0.29]", " disp 9.97 [6.08, 16.85] 3.16 0.10 [0.06, 0.16]" ) ) }) test_that("check_collinearity", { skip_if_not_installed("glmmTMB") skip_if_not(getRversion() >= "4.0.0") data(Salamanders, package = "glmmTMB") m1 <- glmmTMB::glmmTMB(count ~ spp + mined + (1 | site), ziformula = ~spp, Salamanders, family = poisson() ) expect_equal( suppressWarnings(check_collinearity(m1, component = "conditional", verbose = FALSE)$VIF), c(1.00037354840318, 1.00037354840318), tolerance = 1e-3 ) expect_equal( suppressWarnings(check_collinearity(m1, component = "all", verbose = FALSE)$VIF), c(1.00037354840318, 1.00037354840318), tolerance = 1e-3 ) expect_null(check_collinearity(m1, verbose = FALSE, component = "zero_inflated")) }) test_that("check_collinearity", { skip_if_not_installed("glmmTMB") skip_if_not(getRversion() >= "4.0.0") data(Salamanders, package = "glmmTMB") m2 <- glmmTMB::glmmTMB( count ~ spp + mined + cover + (1 | site), ziformula = ~ spp + mined + cover, family = glmmTMB::nbinom2, data = Salamanders ) expect_equal( suppressWarnings(check_collinearity(m2, component = "conditional", verbose = FALSE)$VIF), c(1.09015, 1.2343, 1.17832), tolerance = 1e-3 ) expect_equal( suppressWarnings(check_collinearity(m2, component = "conditional", verbose = FALSE)$VIF_CI_low), c(1.03392, 1.14674, 1.10105), tolerance = 1e-3 ) expect_equal( suppressWarnings(check_collinearity(m2, component = "all", verbose = FALSE)$VIF), c(1.09015, 1.2343, 1.17832, 1.26914, 1, 1.26914), tolerance = 1e-3 ) expect_equal( suppressWarnings(check_collinearity(m2, component = "all", verbose = FALSE)$VIF_CI_low), c(1.03392, 1.14674, 1.10105, 1.17565, 1, 1.17565), tolerance = 1e-3 ) expect_equal( suppressWarnings(check_collinearity(m2, component = "zero_inflated", verbose = FALSE)$VIF), c(1.26914, 1, 1.26914), tolerance = 1e-3 ) expect_equal( suppressWarnings(check_collinearity(m2, component = "zero_inflated", verbose = FALSE)$Tolerance_CI_high), c(0.85059, 1, 0.85059), tolerance = 1e-3 ) suppressWarnings(coll <- check_collinearity(m2, component = "all", verbose = FALSE)) # nolint expect_true(all(coll$Tolerance < coll$Tolerance_CI_high)) expect_true(all(coll$VIF > coll$VIF_CI_low)) expect_identical( attributes(coll)$data$Component, c("conditional", "conditional", "conditional", "zero inflated", "zero inflated", "zero inflated") ) expect_identical( colnames(attributes(coll)$CI), c("VIF_CI_low", "VIF_CI_high", "Tolerance_CI_low", "Tolerance_CI_high", "Component") ) }) test_that("check_collinearity | afex", { skip_if_not_installed("afex", minimum_version = "1.0.0") data(obk.long, package = "afex") obk.long$treatment <- as.character(obk.long$treatment) suppressWarnings(suppressMessages({ aM <- afex::aov_car(value ~ treatment * gender + Error(id / (phase * hour)), data = obk.long ) aW <- afex::aov_car(value ~ Error(id / (phase * hour)), data = obk.long ) aB <- afex::aov_car(value ~ treatment * gender + Error(id), data = obk.long ) })) expect_message(ccoM <- check_collinearity(aM)) # nolint expect_warning(expect_message(ccoW <- check_collinearity(aW))) # nolint expect_message(ccoB <- check_collinearity(aB), regexp = NA) # nolint expect_identical(nrow(ccoM), 15L) expect_identical(nrow(ccoW), 3L) expect_identical(nrow(ccoB), 3L) suppressWarnings(suppressMessages({ aM <- afex::aov_car(value ~ treatment * gender + Error(id / (phase * hour)), include_aov = TRUE, data = obk.long ) aW <- afex::aov_car(value ~ Error(id / (phase * hour)), include_aov = TRUE, data = obk.long ) aB <- afex::aov_car(value ~ treatment * gender + Error(id), include_aov = TRUE, data = obk.long ) })) expect_message(ccoM <- check_collinearity(aM)) # nolint expect_warning(expect_message(ccoW <- check_collinearity(aW))) # nolint expect_message(ccoB <- check_collinearity(aB), regexp = NA) # nolint expect_identical(nrow(ccoM), 15L) expect_identical(nrow(ccoW), 3L) expect_identical(nrow(ccoB), 3L) }) test_that("check_collinearity, ci = NULL", { # 518 data(npk) m <- lm(yield ~ N + P + K, npk) out <- check_collinearity(m, ci = NULL) expect_identical( colnames(out), c( "Term", "VIF", "VIF_CI_low", "VIF_CI_high", "SE_factor", "Tolerance", "Tolerance_CI_low", "Tolerance_CI_high" ) ) expect_snapshot(out) }) test_that("check_collinearity, ci are NA", { skip_if_not_installed("fixest") data(mtcars) i <- fixest::i m_vif <- fixest::feols(mpg ~ disp + hp + wt + i(cyl) | carb, data = mtcars) out <- suppressWarnings(check_collinearity(m_vif)) expect_identical( colnames(out), c( "Term", "VIF", "VIF_CI_low", "VIF_CI_high", "SE_factor", "Tolerance", "Tolerance_CI_low", "Tolerance_CI_high" ) ) }) test_that("check_collinearity, hurdle/zi models w/o zi-formula", { skip_if_not_installed("pscl") data("bioChemists", package = "pscl") m <- pscl::hurdle( art ~ fem + mar, data = bioChemists, dist = "poisson", zero.dist = "binomial", link = "logit" ) out <- check_collinearity(m) expect_identical( colnames(out), c( "Term", "VIF", "VIF_CI_low", "VIF_CI_high", "SE_factor", "Tolerance", "Tolerance_CI_low", "Tolerance_CI_high", "Component" ) ) expect_equal(out$VIF, c(1.05772, 1.05772, 1.06587, 1.06587), tolerance = 1e-4) }) performance/tests/testthat/test-binned_residuals.R0000644000176200001440000001132714517473361022206 0ustar liggesuserstest_that("binned_residuals", { data(mtcars) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") result <- binned_residuals(model, ci_type = "gaussian", residuals = "response") expect_named( result, c("xbar", "ybar", "n", "x.lo", "x.hi", "se", "CI_low", "CI_high", "group") ) expect_equal( result$xbar, c(0.03786, 0.09514, 0.25911, 0.47955, 0.71109, 0.97119), tolerance = 1e-4 ) expect_equal( result$ybar, c(-0.03786, -0.09514, 0.07423, -0.07955, 0.28891, -0.13786), tolerance = 1e-4 ) expect_equal( result$CI_low, c(-0.05686, -0.12331, -0.35077, -0.57683, 0.17916, -0.44147), tolerance = 1e-4 ) }) test_that("binned_residuals, n_bins", { data(mtcars) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") result <- binned_residuals(model, ci_type = "gaussian", residuals = "response", n_bins = 10) expect_named( result, c("xbar", "ybar", "n", "x.lo", "x.hi", "se", "CI_low", "CI_high", "group") ) expect_equal( result$xbar, c( 0.02373, 0.06301, 0.08441, 0.17907, 0.29225, 0.44073, 0.54951, 0.69701, 0.9168, 0.99204 ), tolerance = 1e-4 ) expect_equal( result$ybar, c( -0.02373, -0.06301, -0.08441, -0.17907, 0.20775, -0.1074, 0.11715, 0.30299, -0.25014, 0.00796 ), tolerance = 1e-4 ) }) test_that("binned_residuals, terms", { data(mtcars) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") result <- binned_residuals(model, ci_type = "gaussian", residuals = "response", term = "mpg") expect_named( result, c("xbar", "ybar", "n", "x.lo", "x.hi", "se", "CI_low", "CI_high", "group") ) expect_equal( result$xbar, c(12.62, 15.34, 18.1, 20.9, 22.875, 30.06667), tolerance = 1e-4 ) expect_equal( result$ybar, c(-0.05435, -0.07866, 0.13925, -0.11861, 0.27763, -0.13786), tolerance = 1e-4 ) }) test_that("binned_residuals, deviance residuals, gaussian CI", { data(mtcars) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") result <- binned_residuals(model, residuals = "deviance", ci_type = "gaussian") expect_named( result, c("xbar", "ybar", "n", "x.lo", "x.hi", "se", "CI_low", "CI_high", "group") ) expect_equal( result$xbar, c(0.03786, 0.09514, 0.25911, 0.47955, 0.71109, 0.97119), tolerance = 1e-4 ) expect_equal( result$ybar, c(-0.26905, -0.44334, 0.03763, -0.19917, 0.81563, -0.23399), tolerance = 1e-4 ) expect_equal( result$ybar, c(-0.26905, -0.44334, 0.03763, -0.19917, 0.81563, -0.23399), tolerance = 1e-4 ) expect_equal( result$CI_low, c(-0.33985, -0.50865, -0.98255, -1.36025, 0.61749, -1.00913), tolerance = 1e-4 ) }) test_that("binned_residuals, default", { data(mtcars) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") result <- binned_residuals(model) expect_named( result, c("xbar", "ybar", "n", "x.lo", "x.hi", "se", "CI_low", "CI_high", "group") ) expect_equal( result$xbar, c(0.03786, 0.09514, 0.25911, 0.47955, 0.71109, 0.97119), tolerance = 1e-4 ) expect_equal( result$ybar, c(-0.26905, -0.44334, 0.03763, -0.19917, 0.81563, -0.23399), tolerance = 1e-4 ) expect_equal( result$CI_low, c(-0.52997, -0.70426, -0.32935, -0.59948, 0.55472, -0.55251), tolerance = 1e-4 ) }) test_that("binned_residuals, bootstrapped CI", { skip_on_cran() data(mtcars) model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") set.seed(123) result <- binned_residuals(model, ci_type = "boot", iterations = 100) expect_named( result, c("xbar", "ybar", "n", "x.lo", "x.hi", "se", "CI_low", "CI_high", "group") ) expect_equal( result$xbar, c(0.03786, 0.09514, 0.25911, 0.47955, 0.71109, 0.97119), tolerance = 1e-4 ) expect_equal( result$ybar, c(-0.26905, -0.44334, 0.03763, -0.19917, 0.81563, -0.23399), tolerance = 1e-4 ) expect_equal( result$CI_low, c(-0.32623, -0.50543, -0.80879, -1.15154, 0.67569, -0.65748), tolerance = 1e-4 ) }) test_that("binned_residuals, msg for non-bernoulli", { skip_on_cran() skip_if(packageVersion("insight") < "0.19.7") tot <- rep(10, 100) suc <- rbinom(100, prob = 0.9, size = tot) dat <- data.frame(tot, suc) dat$prop <- suc / tot dat$x1 <- as.factor(sample(1:5, 100, replace = TRUE)) mod <- glm(prop ~ x1, family = binomial, data = dat, weights = tot ) expect_message(binned_residuals(mod), regex = "Using `ci_type = \"gaussian\"`") expect_silent(binned_residuals(mod, verbose = FALSE)) }) performance/tests/testthat/test-r2_bayes.R0000644000176200001440000000216514412771210020366 0ustar liggesuserstest_that("r2_BayesFactor", { skip_if_not_installed("BayesFactor") set.seed(1) BFM <- BayesFactor::generalTestBF(mpg ~ cyl * gear, data = mtcars, progress = FALSE) r_BF <- r2(BFM[4], ci = 0.89) r_CI <- attr(r_BF, "CI")$R2_Bayes expect_equal(r_BF$R2_Bayes, 0.71, tolerance = 0.05) expect_equal(r_CI$CI_low, 0.62, tolerance = 0.05) expect_equal(r_CI$CI_high, 0.79, tolerance = 0.05) r_post <- r2_posterior(BFM[1]) expect_s3_class(r_post, "data.frame") r_BF <- r2(BFM, average = TRUE) expect_equal(r_BF$R2_Bayes, 0.72, tolerance = 0.05) # with random effects: skip_if_not_installed("BayesFactor", minimum_version = "0.9.12.4.3") mtcars$gear <- factor(mtcars$gear) model <- BayesFactor::lmBF(mpg ~ hp + cyl + gear + gear:wt, mtcars, progress = FALSE, whichRandom = c("gear", "gear:wt")) r_BF <- r2(model, ci = 0.89) r_CI <- attr(r_BF, "CI")$R2_Bayes expect_equal(r_BF$R2_Bayes, 0.36, tolerance = 0.05) expect_equal(r_BF$R2_Bayes_marginal, 0.21, tolerance = 0.05) expect_equal(r_CI$CI_low, 0.27, tolerance = 0.05) expect_equal(r_CI$CI_high, 0.54, tolerance = 0.05) }) performance/tests/testthat/test-rmse.R0000644000176200001440000000145314412771210017625 0ustar liggesuserstest_that("rmse", { skip_if_not_installed("lme4") data(sleepstudy, package = "lme4") m1.1 <- glm(Reaction ~ Days, data = sleepstudy, family = gaussian()) m1.2 <- glm(Reaction ~ Days, data = sleepstudy, family = gaussian("log")) m1.3 <- glm(Reaction ~ Days, data = sleepstudy, family = gaussian("inverse")) m2.1 <- glm(Reaction ~ Days, data = sleepstudy, family = inverse.gaussian()) m2.2 <- glm(Reaction ~ Days, data = sleepstudy, family = inverse.gaussian("log")) m2.3 <- glm(Reaction ~ Days, data = sleepstudy, family = inverse.gaussian("inverse")) expect_message( cp <- compare_performance(m1.1, m1.2, m1.3, m2.1, m2.2, m2.3), "seem to be identical" ) expect_equal(cp$RMSE, c(47.4489, 47.39881, 47.38701, 47.41375, 47.39979, 47.38705), tolerance = 1e-3) }) performance/tests/testthat/test-r2_tjur.R0000644000176200001440000000044114355346734020261 0ustar liggesuserstest_that("r2_tjur", { model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") expect_equal(r2_tjur(model), c(`Tjur's R2` = 0.477692621360749), tolerance = 1e-3) }) test_that("r2_tjur", { model <- lm(mpg ~ wt + cyl, data = mtcars) expect_error(r2_tjur(model)) }) performance/tests/testthat/test-coxph.R0000644000176200001440000000171014412771210017774 0ustar liggesusersskip_if_not_installed("survival") lung <- survival::lung lung <- subset(lung, subset = ph.ecog %in% 0:2) lung$sex <- factor(lung$sex, labels = c("male", "female")) lung$ph.ecog <- factor(lung$ph.ecog, labels = c("good", "ok", "limited")) m1 <- survival::coxph(survival::Surv(time, status) ~ sex + age + ph.ecog, data = lung) test_that("r2", { expect_equal(r2_nagelkerke(m1), c(`Nagelkerke's R2` = 0.1203544), tolerance = 1e-3) expect_equal(r2(m1), list(R2 = c(`Nagelkerke's R2` = 0.1203544)), tolerance = 1e-3, ignore_attr = TRUE) }) test_that("model_performance", { perf <- suppressWarnings(model_performance(m1, verbose = FALSE)) expect_equal(perf$AIC, 1457.19458886438, tolerance = 1e-3) expect_equal(perf$BIC, 1469.5695896676, tolerance = 1e-3) expect_equal(perf$R2_Nagelkerke, 0.1203544, tolerance = 1e-3) expect_equal(perf$RMSE, 0.882014942836432, tolerance = 1e-3) }) test_that("r2", { expect_error(r2_xu(m1)) }) performance/tests/testthat/test-model_performance.kmeans.R0000644000176200001440000000203114355346734023625 0ustar liggesuserstest_that("model_performance.kmeans", { set.seed(123) cl <- kmeans(subset(iris, select = Sepal.Length:Petal.Width), 3) expect_equal(model_performance(cl), structure( list( Sum_Squares_Total = 681.370599999999, Sum_Squares_Within = 78.851441426146, Sum_Squares_Between = 602.519158573853, Iterations = 2L ), class = c( "performance_model", "data.frame" ), row.names = c(NA, -1L) ), tolerance = 0.1 ) set.seed(123) mod <- kmeans(subset(iris, select = Sepal.Length:Petal.Width), centers = 3, iter.max = 100, nstart = 10 ) expect_equal( model_performance(mod), structure( list( Sum_Squares_Total = 681.3706, Sum_Squares_Within = 78.851441426146, Sum_Squares_Between = 602.519158573854, Iterations = 2L ), class = c( "performance_model", "data.frame" ), row.names = c(NA, -1L) ), tolerance = 0.1 ) }) performance/tests/testthat/test-model_performance.rma.R0000644000176200001440000000303514412771210023114 0ustar liggesusersskip_if_not_installed("metafor") skip_if_not_installed("metadat") data(dat.bcg, package = "metadat") dat <- metafor::escalc( measure = "RR", ai = tpos, bi = tneg, ci = cpos, di = cneg, data = dat.bcg ) test_that("model_performance.rma", { model <- metafor::rma(yi, vi, data = dat, method = "REML") mp <- model_performance(model, estimator = "REML") expect_null(mp$R2) expect_equal(mp$AIC, 28.40474, tolerance = 1e-3) expect_equal(mp$I2, 0.9222139, tolerance = 1e-3) expect_identical(colnames(mp), c( "AIC", "BIC", "I2", "H2", "TAU2", "CochransQ", "p_CochransQ", "df_error", "Omnibus", "p_Omnibus" )) }) test_that("check_outliers.rma", { model <- metafor::rma(yi, vi, data = dat, slab = author, method = "REML") out <- check_outliers(model) expect_equal( out, c( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE ), ignore_attr = TRUE ) expect_identical(attributes(out)$outlier_var, c("Hart & Sutherland", "TPT Madras")) expect_snapshot(out) }) test_that("model_performance.rma", { model <- metafor::rma(yi, vi, mods = cbind(ablat, year), data = dat) mp <- model_performance(model, estimator = "REML") expect_equal(mp$R2, 0.6463217, tolerance = 1e-3) expect_equal(mp$AIC, 24.21375, tolerance = 1e-3) expect_equal(mp$I2, 0.719778, tolerance = 1e-3) expect_identical(colnames(mp), c( "AIC", "BIC", "I2", "H2", "TAU2", "CochransQ", "p_CochransQ", "df_error", "Omnibus", "p_Omnibus", "R2" )) }) performance/tests/testthat/test-performance_cv.R0000644000176200001440000000074014355346734021665 0ustar liggesusersmodel <- lm(mpg ~ wt + cyl, data = mtcars) set.seed(123) out <- performance_cv(model) test_that("performance_cv", { expect_equal(out$MSE, 5.91153, tolerance = 1e-3) expect_equal(colnames(out), c("MSE", "RMSE", "R2"), tolerance = 1e-3) }) set.seed(123) out <- performance_cv(model, metrics = c("MSE", "R2")) test_that("performance_cv", { expect_equal(out$MSE, 5.91153, tolerance = 1e-3) expect_equal(colnames(out), c("MSE", "R2"), tolerance = 1e-3) }) performance/tests/testthat/test-check_model.R0000644000176200001440000000274714412771210021123 0ustar liggesusersskip_on_cran() skip_if_not_installed("see") d <- data.frame( y = c( 101L, 219L, 70L, 67L, 31L, 243L, 41L, 250L, 140L, 210L, 22L, 121L, 282L, 144L, 223L, 297L, 20L, 13L, 148L, 57L, 143L, 109L, 273L, 83L, 28L, 153L, 261L, 209L, 134L, 95L, 17L, 11L ), x = c( 9.43240344971252, 15.2821279871535, 29.1169666338249, 14.0859852649899, 15.6464367574587, 8.86321119888889, 67.9427830082998, 8.60340052656454, 21.9029971533007, 19.8586681899898, 9.68086847417484, 25.0990259928273, 16.1398284119823, 29.3829154122785, 31.5592351678585, 14.0320212214305, 31.3815560884357, 18.3566866719804, 28.3822251897697, 67.9433435559261, 26.6656339570149, 5.83151069454924, 7.93210796912854, 35.9198997836162, 21.6330853399868, 34.484392512508, 35.9444483480784, 28.4517728364097, 27.2868577206239, 8.1803022427107, 46.3029232706936, 41.516915503604 ), offset = c( 481L, 515L, 396L, 451L, 547L, 409L, 375L, 430L, 526L, 456L, 450L, 425L, 406L, 396L, 421L, 417L, 430L, 419L, 436L, 517L, 511L, 435L, 489L, 417L, 372L, 373L, 351L, 367L, 350L, 339L, 169L, 63L ) ) suppressWarnings({ m <- glm(y ~ x + offset(offset), family = poisson, data = d) }) test_that("`check_model()` works if convergence issues", { x <- check_model(m, verbose = FALSE) expect_s3_class(x, "check_model") }) test_that("`check_outliers()` works if convergence issues", { x <- check_outliers(m, verbose = FALSE) expect_s3_class(x, "check_outliers") }) performance/tests/testthat/test-test_likelihoodratio.R0000644000176200001440000001032214412771210023073 0ustar liggesuserstest_that("test_likelihoodratio - regression models", { m1 <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) m2 <- lm(mpg ~ wt + cyl + gear, data = mtcars) m3 <- lm(mpg ~ wt + cyl, data = mtcars) # stats::anova() rez <- test_likelihoodratio(m1, m2, m3, estimator = "OLS") ref <- anova(m1, m2, m3, test = "LRT") expect_equal(ref$`Pr(>Chi)`, rez$p, tolerance = 1e-03) rez <- test_likelihoodratio(m3, m2, m1, estimator = "OLS") ref <- anova(m3, m2, m1, test = "LRT") expect_equal(ref$`Pr(>Chi)`, rez$p, tolerance = 1e-03) # lmtest::lrtest() rez <- test_likelihoodratio(m1, m2, m3, estimator = "ML") p <- c(NA, 0.5302030, 0.4747344) # lmtest::lrtest(m1, m2, m3)$`Pr(>Chisq)` expect_equal(p, rez$p, tolerance = 1e-03) rez <- test_likelihoodratio(m3, m2, m1, estimator = "ML") p <- c(NA, 0.4747344, 0.5302030) # lmtest::lrtest(m3, m2, m1)$`Pr(>Chisq)` expect_equal(p, rez$p, tolerance = 1e-03) }) test_that("test_likelihoodratio - model names", { m1 <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) m2 <- lm(mpg ~ wt + cyl + gear, data = mtcars) m3 <- lm(mpg ~ wt + cyl, data = mtcars) rez <- test_likelihoodratio(m1, m2, m3) expect_equal(rez$Name, c("m1", "m2", "m3")) rez <- test_likelihoodratio(list(m1, m2, m3)) expect_equal(rez$Name, c("Model 1", "Model 2", "Model 3")) models <- list(m1, m2, m3) rez <- test_likelihoodratio(models) expect_equal(rez$Name, c("Model 1", "Model 2", "Model 3")) }) test_that("test_likelihoodratio - reversed order", { m1 <- lm(mpg ~ wt + cyl, data = mtcars) m2 <- lm(mpg ~ wt + cyl + gear, data = mtcars) m3 <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) rez <- test_likelihoodratio(m1, m2, m3, estimator = "OLS") ref <- anova(m1, m2, m3, test = "LRT") expect_equal(ref$`Pr(>Chi)`, rez$p, tolerance = 1e-03) rez <- test_likelihoodratio(m1, m2, m3, estimator = "ML") p <- c(NA, 0.4747344, 0.5302030) # lmtest::lrtest(m1, m2, m3)$`Pr(>Chisq)` expect_equal(p, rez$p, tolerance = 1e-03) }) skip_on_cran() skip_if_not_installed("lme4") m1 <- suppressMessages(lme4::lmer(Sepal.Length ~ Petal.Width + (1 | Species), data = iris)) m2 <- suppressMessages(lme4::lmer(Sepal.Length ~ Petal.Width + Petal.Length + (1 | Species), data = iris)) m3 <- suppressMessages(lme4::lmer(Sepal.Length ~ Petal.Width * Petal.Length + (1 | Species), data = iris)) test_that("test_likelihoodratio - lme4 ML", { t1 <- test_lrt(m1, m2, m3) t2 <- suppressMessages(anova(m1, m2, m3)) expect_equal(attributes(t1)$estimator, "ml") expect_equal(t1$Chi2, c(NA, 85.26365, 0.84141), tolerance = 1e-3) expect_equal(t1$p, c(NA, 0, 0.35899), tolerance = 1e-3) # close, but not the same expect_equal(t1$p, t2$`Pr(>Chisq)`, tolerance = 1e-1) expect_equal(t1$Chi2, t2$Chisq, tolerance = 1e-1) }) test_that("test_likelihoodratio - lme4 OLS", { t2 <- test_lrt(m1, m2, m3, estimator = "ols") expect_equal(attributes(t2)$estimator, "ols") expect_equal(t2$Chi2, c(NA, 105.73844, 1.04346), tolerance = 1e-3) expect_equal(t2$p, c(NA, 0, 0.30702), tolerance = 1e-3) }) test_that("test_likelihoodratio - lme4 REML", { expect_warning(t3 <- test_lrt(m1, m2, m3, estimator = "REML")) expect_equal(attributes(t3)$estimator, "reml") expect_equal(t3$Chi2, c(NA, 89.32933, 2.85635), tolerance = 1e-3) expect_equal(t3$p, c(NA, 0, 0.09101), tolerance = 1e-3) }) m1 <- glm(am ~ mpg, data = mtcars, family = binomial()) m2 <- glm(am ~ mpg + hp, data = mtcars, family = binomial()) m3 <- glm(am ~ mpg + hp + vs, data = mtcars, family = binomial()) test_that("test_likelihoodratio - glm", { t1 <- anova(m1, m2, m3, test = "LRT") t2 <- test_lrt(m1, m2, m3) expect_equal(t1$`Pr(>Chi)`, t2$p, tolerance = 1e-3) expect_equal(t1$Deviance, t2$Chi2, tolerance = 1e-3) expect_equal(attributes(t2)$estimator, "ml") }) m1 <- lm(Sepal.Length ~ Petal.Width, data = iris) m2 <- lm(Sepal.Length ~ Petal.Width + Species, data = iris) m3 <- lm(Sepal.Length ~ Petal.Width * Species, data = iris) test_that("test_likelihoodratio - lm", { t1 <- anova(m1, m2, m3, test = "LRT") t2 <- test_lrt(m1, m2, m3) expect_equal(t1$`Pr(>Chi)`, t2$p, tolerance = 1e-3) expect_equal(attributes(t2)$estimator, "ols") }) performance/tests/testthat/test-cronbachs_alpha.R0000644000176200001440000000242514513446720021775 0ustar liggesuserstest_that("cronbachs_alpha, data frame", { data(mtcars) x <- mtcars[, c("cyl", "gear", "carb", "hp")] expect_equal(cronbachs_alpha(x), 0.09463206, tolerance = 1e-3) }) test_that("cronbachs_alpha", { expect_warning(expect_null(cronbachs_alpha(mtcars[1]))) }) test_that("cronbachs_alpha, principal_components", { skip_if_not_installed("parameters", minimum_version = "0.21.3") pca <- parameters::principal_components(mtcars[, c("cyl", "gear", "carb", "hp")], n = 2) expect_equal(cronbachs_alpha(pca, verbose = FALSE), c(PC1 = 0.1101384), tolerance = 1e-3) expect_warning(cronbachs_alpha(pca)) pca <- parameters::principal_components(mtcars[, c("cyl", "gear", "carb", "hp")], n = 1) expect_equal(cronbachs_alpha(pca, verbose = FALSE), c(PC1 = 0.09463206), tolerance = 1e-3) expect_silent(cronbachs_alpha(pca)) }) test_that("cronbachs_alpha, principal_components", { skip_if_not_installed("parameters", minimum_version = "0.20.3") pca <- parameters::principal_components(mtcars, n = 2) expect_equal(cronbachs_alpha(pca), c(PC1 = 0.4396, PC2 = -1.44331), tolerance = 1e-3) }) test_that("cronbachs_alpha, matrix", { m <- as.matrix(mtcars[c("cyl", "gear", "carb", "hp")]) expect_equal(cronbachs_alpha(m), 0.09463206, tolerance = 1e-3) }) performance/tests/testthat/test-pkg-ivreg.R0000644000176200001440000000061014412771210020544 0ustar liggesuserstest_that("Issue #530 from the `modelsummary` repo", { skip_if_not_installed("ivreg") skip_if_not(packageVersion("insight") >= "0.19.1.3") # formatting of results # for ivreg diagnostics data(mtcars) iv_model <- suppressMessages(ivreg::ivreg(mpg ~ qsec + cyl + drat | disp | wt, data = mtcars)) out <- expect_silent(model_performance(iv_model)) expect_snapshot(out) }) performance/tests/testthat/test-check_overdispersion.R0000644000176200001440000000234114412771210023064 0ustar liggesuserstest_that("check_overdispersion", { skip_if_not_installed("glmmTMB") skip_if_not(getRversion() >= "4.0.0") data(Salamanders, package = "glmmTMB") m1 <- glm(count ~ spp + mined, family = poisson, data = Salamanders) expect_equal( check_overdispersion(m1), structure( list( chisq_statistic = 1873.71012423995, dispersion_ratio = 2.94608510100621, residual_df = 636L, p_value = 3.26607509162498e-122 ), class = c("check_overdisp", "see_check_overdisp"), object_name = "m1" ), tolerance = 1e-3 ) }) test_that("check_overdispersion", { skip_if_not_installed("glmmTMB") skip_if_not(getRversion() >= "4.0.0") data(Salamanders, package = "glmmTMB") m2 <- glmmTMB::glmmTMB( count ~ mined + spp + (1 | site), family = poisson, data = Salamanders ) expect_equal( check_overdispersion(m2), structure( list( chisq_statistic = 1475.87512547128, dispersion_ratio = 2.32421279601777, residual_df = 635L, p_value = 8.41489530177729e-69 ), class = c("check_overdisp", "see_check_overdisp"), object_name = "m2" ), tolerance = 1e-3 ) }) performance/tests/testthat/test-check_singularity.R0000644000176200001440000000111014412771210022354 0ustar liggesuserstest_that("check_singularity", { skip_on_cran() skip_if_not_installed("lme4") data(sleepstudy, package = "lme4") set.seed(123) sleepstudy$mygrp <- sample(1:5, size = 180, replace = TRUE) sleepstudy$mysubgrp <- NA for (i in 1:5) { filter_group <- sleepstudy$mygrp == i sleepstudy$mysubgrp[filter_group] <- sample(1:30, size = sum(filter_group), replace = TRUE) } model <- suppressMessages(lme4::lmer( Reaction ~ Days + (1 | mygrp / mysubgrp) + (1 | Subject), data = sleepstudy )) expect_true(check_singularity(model)) }) performance/tests/testthat/_snaps/0000755000176200001440000000000014507335630017046 5ustar liggesusersperformance/tests/testthat/_snaps/check_collinearity.md0000644000176200001440000000046614430505336023226 0ustar liggesusers# check_collinearity, ci = NULL Code out Output # Check for Multicollinearity Low Correlation Term VIF Increased SE Tolerance N 1.00 1.00 1.00 P 1.00 1.00 1.00 K 1.00 1.00 1.00 performance/tests/testthat/_snaps/bootstrapped_icc_ci.md0000644000176200001440000000223314430456456023374 0ustar liggesusers# bootstrapped icc ci_methods Code print(out1) Output # Intraclass Correlation Coefficient Adjusted ICC: 0.722 [0.502, 0.794] Unadjusted ICC: 0.521 [0.310, 0.568] --- Code print(out2) Output # Intraclass Correlation Coefficient Adjusted ICC: 0.722 [0.647, 0.886] Unadjusted ICC: 0.521 [0.474, 0.657] --- Code print(out3) Output # Intraclass Correlation Coefficient Adjusted ICC: 0.722 [0.644, 0.783] Unadjusted ICC: 0.521 [0.412, 0.615] # bootstrapped r2_nakagawa ci_methods Code print(out1) Output # R2 for Mixed Models Conditional R2: 0.799 [0.678, 0.852] Marginal R2: 0.279 [0.204, 0.392] --- Code print(out2) Output # R2 for Mixed Models Conditional R2: 0.799 [0.734, 0.918] Marginal R2: 0.279 [0.231, 0.309] --- Code print(out3) Output # R2 for Mixed Models Conditional R2: 0.799 [0.739, 0.846] Marginal R2: 0.279 [0.170, 0.390] performance/tests/testthat/_snaps/check_distribution.md0000644000176200001440000000075114507335630023247 0ustar liggesusers# check_distribution Code print(out) Output # Distribution of Model Family Predicted Distribution of Residuals Distribution Probability cauchy 94% lognormal 3% weibull 3% Predicted Distribution of Response Distribution Probability lognormal 47% gamma 44% beta-binomial 3% performance/tests/testthat/_snaps/mclogit.md0000644000176200001440000000110214412771210021011 0ustar liggesusers# model_performance Code model_performance(mod_mb) Output # Indices of model performance AIC | BIC | Nagelkerke's R2 | RMSE | Sigma ------------------------------------------------- 38.823 | 47.618 | 0.836 | 0.298 | 1.016 --- Code model_performance(mod_mc) Output # Indices of model performance AIC | BIC | Nagelkerke's R2 | RMSE | Sigma ------------------------------------------------- 13.228 | 24.424 | 0.998 | 0.009 | 0.068 performance/tests/testthat/_snaps/model_performance.rma.md0000644000176200001440000000021114412771210023612 0ustar liggesusers# check_outliers.rma Code out Output 2 outliers detected: studies 4 (Hart & Sutherland) and 8 (TPT Madras). performance/tests/testthat/_snaps/pkg-ivreg.md0000644000176200001440000000102314412771210021250 0ustar liggesusers# Issue #530 from the `modelsummary` repo Code out Output # Indices of model performance AIC | BIC | R2 | R2 (adj.) | RMSE | Sigma | Wu & Hausman | p (Wu_Hausman) | Weak instruments | p (weak_instruments) ------------------------------------------------------------------------------------------------------------------------------- 182.692 | 191.486 | 0.655 | 0.604 | 3.484 | 3.793 | 13.869 | < .001 | 19.958 | < .001 performance/tests/testthat/_snaps/nestedLogit.md0000644000176200001440000000055314507335630021654 0ustar liggesusers# model_performance Code model_performance(mnl) Output # Indices of model performance Response | AIC | BIC | RMSE | Sigma | R2 ---------------------------------------------------- work | 325.733 | 336.449 | 0.456 | 1.000 | 0.138 full | 110.495 | 118.541 | 0.398 | 1.000 | 0.333 performance/tests/testthat/test-check_heterogeneity_bias.R0000644000176200001440000000330314507335630023670 0ustar liggesuserstest_that("check_heterogeneity_bias", { data(iris) set.seed(123) iris$ID <- sample(1:4, nrow(iris), replace = TRUE) # fake-ID out <- check_heterogeneity_bias(iris, select = c("Sepal.Length", "Petal.Length"), group = "ID") expect_equal(out, c("Sepal.Length", "Petal.Length"), ignore_attr = TRUE) expect_output(print(out), "Possible heterogeneity bias due to following predictors: Sepal\\.Length, Petal\\.Length") out <- check_heterogeneity_bias(iris, select = ~ Sepal.Length + Petal.Length, group = ~ID) expect_equal(out, c("Sepal.Length", "Petal.Length"), ignore_attr = TRUE) expect_output(print(out), "Possible heterogeneity bias due to following predictors: Sepal\\.Length, Petal\\.Length") m <- lm(Sepal.Length ~ Petal.Length + Petal.Width + Species + ID, data = iris) expect_error( check_heterogeneity_bias(m, select = c("Sepal.Length", "Petal.Length"), group = "ID"), regex = "no mixed model" ) skip_if_not_installed("lme4") m <- lme4::lmer(Sepal.Length ~ Petal.Length + Petal.Width + Species + (1 | ID), data = iris) out <- check_heterogeneity_bias(m, select = c("Sepal.Length", "Petal.Length"), group = "ID") expect_equal(out, c("Petal.Length", "Petal.Width", "Species"), ignore_attr = TRUE) expect_output( print(out), "Possible heterogeneity bias due to following predictors: Petal\\.Length, Petal\\.Width, Species" ) out <- check_heterogeneity_bias(m, select = ~ Sepal.Length + Petal.Length, group = ~ID) expect_equal(out, c("Petal.Length", "Petal.Width", "Species"), ignore_attr = TRUE) expect_output( print(out), "Possible heterogeneity bias due to following predictors: Petal\\.Length, Petal\\.Width, Species" ) }) performance/tests/testthat/test-checks.R0000644000176200001440000000063714412771210020122 0ustar liggesuserstest_that("check_factorstructure", { skip_if_not_installed("parameters") x <- check_factorstructure(mtcars) expect_equal(x$KMO$MSA, 0.826, tolerance = 0.01) expect_equal(x$sphericity$chisq, 408.011, tolerance = 0.01) }) test_that("check_clusterstructure", { skip_if_not_installed("parameters") set.seed(333) expect_equal(check_clusterstructure(iris[, 1:4])$H, 0.187, tolerance = 0.01) }) performance/tests/testthat/test-model_performance.gam.R0000644000176200001440000000142614412771210023103 0ustar liggesuserstest_that("mgcv::gam", { skip_if_not_installed("mgcv") model <- mgcv::gam(mpg ~ s(hp), data = mtcars) # TODO: improve output expect_equal(as.numeric(performance::r2(model)$R2), 0.7348, tolerance = 0.01) }) # test_that("gamm4::gamm4 - no random", { # skip_if_not_installed("gamm4") # model <- gamm4::gamm4(mpg ~ s(hp), data=mtcars) # # r2(model$mer) # r2(model$gam) # }) # # test_that("gamm4::gamm4 - random", { # skip_if_not_installed("gamm4") # model <- gamm4::gamm4(mpg ~ s(hp), random = ~ (1|vs), data=mtcars) # # r2(model$mer) # r2(model$gam) # }) # # test_that("mgcv::gamm", { # skip_if_not_installed("mgcv") # model <- mgcv::gamm(mpg ~ s(hp), random = list(vs = ~1), data=mtcars) # # r2(model$lme) # r2(model$gam) # }) performance/tests/testthat/test-check_convergence.R0000644000176200001440000000136714412771210022316 0ustar liggesuserstest_that("check_convergence", { skip_if_not_installed("lme4") data(cbpp, package = "lme4") set.seed(1) cbpp$x <- rnorm(nrow(cbpp)) cbpp$x2 <- runif(nrow(cbpp)) model <- suppressWarnings(lme4::glmer( cbind(incidence, size - incidence) ~ period + x + x2 + (1 + x | herd), data = cbpp, family = binomial() )) expect_true(check_convergence(model)) expect_equal( check_convergence(model), structure(TRUE, gradient = 0.000280307452338331), tolerance = 1e-3 ) }) test_that("check_convergence", { skip_if_not_installed("lme4") data(sleepstudy, package = "lme4") model <- lme4::lmer(Reaction ~ Days + (1 + Days | Subject), data = sleepstudy) expect_true(check_convergence(model)) }) performance/tests/testthat/test-r2_zeroinflated.R0000644000176200001440000000353014412771210021746 0ustar liggesuserstest_that("r2_zeroinflated", { skip_if_not_installed("pscl") data(bioChemists, package = "pscl") model <- pscl::zeroinfl( art ~ fem + mar + kid5 + ment | kid5 + phd, data = bioChemists ) expect_equal( r2_zeroinflated(model), structure( list( R2 = c(R2 = 0.179754784762554), R2_adjusted = c(`adjusted R2` = 0.175242984898761) ), model_type = "Zero-Inflated and Hurdle", class = "r2_generic" ), tolerance = 1e-4 ) expect_equal( r2(model), structure( list( R2 = c(R2 = 0.179754784762554), R2_adjusted = c(`adjusted R2` = 0.175242984898761) ), model_type = "Zero-Inflated and Hurdle", class = "r2_generic" ), tolerance = 1e-4 ) expect_equal( r2_zeroinflated(model, method = "correlation"), c(`R2 for ZI-models` = 0.0945232333944027), tolerance = 1e-4 ) }) test_that("r2_zeroinflated", { skip_if_not_installed("pscl") data(bioChemists, package = "pscl") model <- pscl::hurdle( art ~ fem + mar + kid5 + ment | kid5 + phd, data = bioChemists ) expect_equal( r2_zeroinflated(model), structure( list( R2 = c(R2 = 0.0920246818082126), R2_adjusted = c(`adjusted R2` = 0.087030318121789) ), model_type = "Zero-Inflated and Hurdle", class = "r2_generic" ), tolerance = 1e-4 ) expect_equal( r2(model), structure( list( R2 = c(R2 = 0.0920246818082126), R2_adjusted = c(`adjusted R2` = 0.087030318121789) ), model_type = "Zero-Inflated and Hurdle", class = "r2_generic" ), tolerance = 1e-4 ) expect_equal( r2_zeroinflated(model, method = "correlation"), c(`R2 for ZI-models` = 0.08938686), tolerance = 1e-4 ) }) performance/tests/testthat/test-item_intercor.R0000644000176200001440000000031614355346734021536 0ustar liggesuserstest_that("item_intercor", { data(iris) x <- iris[, 1:4] expect_equal(item_intercor(x), 0.2900708, tolerance = 1e-3) expect_equal(item_intercor(x, "spearman"), 0.3147349, tolerance = 1e-3) }) performance/tests/testthat/test-test_performance.R0000644000176200001440000000324714414213045022221 0ustar liggesuserstest_that("test_performance - nested", { skip_if_not_installed("lavaan") skip_if_not_installed("lmtest") # Decreasing m1 <- lm(Sepal.Length ~ Petal.Width * Species, data = iris) m2 <- lm(Sepal.Length ~ Petal.Width + Species, data = iris) m3 <- lm(Sepal.Length ~ Petal.Width, data = iris) rez <- test_performance(m1, m2, m3) expect_equal(rez$Name, c("m1", "m2", "m3"), ignore_attr = TRUE) rez <- test_performance(list(m1, m2, m3)) expect_equal(rez$Name, c("Model 1", "Model 2", "Model 3"), ignore_attr = TRUE) models <- list(m1, m2, m3) rez <- test_performance(models) expect_equal(rez$Name, c("Model 1", "Model 2", "Model 3"), ignore_attr = TRUE) models <- list(Interaction = m1, NoInteraction = m2, SingleTerm = m3) rez <- test_performance(models) expect_equal(rez$Name, c("Interaction", "NoInteraction", "SingleTerm"), ignore_attr = TRUE) # Increasing # TODO: Increasing order must be fixed and double checked, because the empty line should be the bottom one (?) # m1 <- lm(Sepal.Length ~ Petal.Width, data = iris) # m2 <- lm(Sepal.Length ~ Petal.Width + Species, data = iris) # m3 <- lm(Sepal.Length ~ Petal.Width * Species, data = iris) # # rez <- test_performance(m1, m2, m3) }) test_that("test_performance - single model", { m1 <- lm(Sepal.Length ~ 1, data = iris) m2 <- lm(Sepal.Length ~ Petal.Width, data = iris) expect_message(test_performance(m2), regex = "Only one model") expect_silent(test_performance(m2, verbose = FALSE)) out1 <- test_performance(m2, verbose = FALSE) out2 <- test_performance(m1, m2, verbose = FALSE) expect_equal(out1$Omega2, out2$Omega2, tolerance = 1e-3) }) performance/tests/testthat/test-pkg-fixest.R0000644000176200001440000000530414412771210020737 0ustar liggesusersbase <- iris names(base) <- c("y1", "y2", "x1", "x2", "species") test_that("fixest: r2", { skip_if_not_installed("fixest") res <- fixest::feols(y1 ~ x1 + x2 + x2^2 | species, base) r2_res <- performance::r2(res) expect_equal(r2_res$R2, fixest::fitstat(res, "r2")[[1]]) expect_equal(r2_res$R2_adjusted, fixest::fitstat(res, "ar2")[[1]]) expect_equal(r2_res$R2_within, fixest::fitstat(res, "wr2")[[1]]) expect_equal(r2_res$R2_within_adjusted, fixest::fitstat(res, "war2")[[1]]) }) test_that("fixest: overdispersion", { skip_if_not_installed("fixest") res <- fixest::feols(y1 ~ x1 + x2 + x2^2 | species, base) expect_error( check_overdispersion(res), "can only be used for models from Poisson" ) }) test_that("fixest: outliers", { skip_if_not_installed("fixest") res <- fixest::feols(y1 ~ x1 + x2 + x2^2 | species, base) outliers_list <- suppressMessages(check_outliers(res)) expect_identical(attr(outliers_list, "outlier_count"), list()) }) test_that("fixest: model_performance", { skip_if_not_installed("fixest") res <- fixest::feols(y1 ~ x1 + x2 + x2^2 | species, base) perf <- model_performance(res) expect_equal(perf$AIC, 107.743, tolerance = 1e-3) expect_equal(perf$BIC, 125.807, tolerance = 1e-3) expect_equal(perf$R2, 0.837, tolerance = 1e-3) expect_equal(perf$R2_adjusted, 0.832, tolerance = 1e-3) expect_equal(perf$R2_within, 0.573, tolerance = 1e-3) expect_equal(perf$R2_within_adjusted, 0.564, tolerance = 1e-3) expect_equal(perf$RMSE, 0.333, tolerance = 1e-3) expect_equal(perf$Sigma, 0.340, tolerance = 1e-3) }) test_that("fixest_multi: r2", { skip_if_not_installed("fixest") res <- fixest::feols(c(y1, y2) ~ x1 + csw(x2, x2^2) | species, base) r2_res <- performance::r2(res) expect_equal(unname(r2_res[[1]]$R2), 0.837, tolerance = 1e-3) }) test_that("fixest_multi: overdispersion", { skip_if_not_installed("fixest") res <- fixest::feols(c(y1, y2) ~ x1 + csw(x2, x2^2) | species, base) expect_error( check_overdispersion(res), "can only be used for models from Poisson" ) }) test_that("fixest_multi: outliers", { skip_if_not_installed("fixest") res <- fixest::feols(c(y1, y2) ~ x1 + csw(x2, x2^2) | species, base) outliers_list <- suppressMessages(check_outliers(res)[[1]]) expect_identical(attr(outliers_list, "outlier_count"), list()) }) test_that("fixest_multi: model_performance", { skip_if_not_installed("fixest") res <- fixest::feols(c(y1, y2) ~ x1 + csw(x2, x2^2) | species, base) res2 <- fixest::feols(y1 ~ x1 + x2 + x2^2 | species, base) perf <- model_performance(res) perf2 <- model_performance(res2) expect_identical(perf[[2]], perf2) }) performance/tests/testthat/test-compare_performance.R0000644000176200001440000000454114412771210022667 0ustar liggesuserstest_that("compare_performance", { data(iris) lm1 <- lm(Sepal.Length ~ Species, data = iris) lm2 <- lm(Sepal.Length ~ Species + Petal.Length, data = iris) lm3 <- lm(Sepal.Length ~ Species * Petal.Length, data = iris) lm4 <- lm(Sepal.Length ~ Species * Petal.Length, data = iris[-1, ]) expect_silent(expect_identical( colnames(compare_performance(lm1, lm2, lm3)), c("Name", "Model", "AIC", "AIC_wt", "AICc", "AICc_wt", "BIC", "BIC_wt", "R2", "R2_adjusted", "RMSE", "Sigma") )) expect_message( expect_identical( colnames(compare_performance(lm1, lm2, lm3, lm4)), c("Name", "Model", "AIC", "AIC_wt", "AICc", "AICc_wt", "BIC", "BIC_wt", "R2", "R2_adjusted", "RMSE", "Sigma") ) ) expect_silent(expect_identical( colnames(compare_performance(lm1, lm2, lm3, lm4, verbose = FALSE)), c("Name", "Model", "AIC", "AIC_wt", "AICc", "AICc_wt", "BIC", "BIC_wt", "R2", "R2_adjusted", "RMSE", "Sigma") )) out <- compare_performance(lm1, lm2, lm3, lm4, verbose = FALSE) expect_identical(out$Name, c("lm1", "lm2", "lm3", "lm4")) models <- list(Interaction = lm3, NoInteraction = lm2, SingleTerm = lm1) rez <- compare_performance(models) expect_equal(rez$Name, c("Interaction", "NoInteraction", "SingleTerm"), ignore_attr = TRUE) out <- compare_performance(list(lm1, lm2, lm3, lm4), verbose = FALSE) expect_identical( colnames(out), c("Name", "Model", "AIC", "AIC_wt", "AICc", "AICc_wt", "BIC", "BIC_wt", "R2", "R2_adjusted", "RMSE", "Sigma") ) expect_identical(out$Name, c("Model 1", "Model 2", "Model 3", "Model 4")) models <- list(lm1, lm2, lm3, lm4) out <- compare_performance(models, verbose = FALSE) expect_identical( colnames(out), c("Name", "Model", "AIC", "AIC_wt", "AICc", "AICc_wt", "BIC", "BIC_wt", "R2", "R2_adjusted", "RMSE", "Sigma") ) expect_identical(out$Name, c("Model 1", "Model 2", "Model 3", "Model 4")) expect_silent(compare_performance(lm1, lm2, estimator = "REML")) }) test_that("compare_performance, REML fit", { skip_if_not_installed("lme4") m1 <- lme4::lmer(Petal.Length ~ Sepal.Length + (1 | Species), data = iris) m2 <- lme4::lmer(Petal.Length ~ Sepal.Length + Sepal.Width + (1 | Species), data = iris) expect_silent(compare_performance(m1, m2)) expect_message(compare_performance(m1, m2, estimator = "REML")) }) performance/tests/testthat/test-r2_mcfadden.R0000644000176200001440000000146514412771210021026 0ustar liggesuserstest_that("r2_mcfadden", { skip_if_not_installed("MASS") withr::with_options( list(contrasts = c("contr.treatment", "contr.poly")), { data(housing, package = "MASS") model <- MASS::polr(Sat ~ Infl + Type + Cont, weights = Freq, data = housing) expect_equal( r2_mcfadden(model), structure( list( R2 = c(`McFadden's R2` = 0.0465152150591893), R2_adjusted = c(`adjusted McFadden's R2` = 0.0459671013089695) ), model_type = "Generalized Linear", class = "r2_generic" ), tolerance = 1e-3 ) expect_equal( r2(model), list(R2_Nagelkerke = c(`Nagelkerke's R2` = 0.108408289848161)), tolerance = 1e-3, ignore_attr = TRUE ) } ) }) performance/tests/testthat/test-model_performance-various.R0000644000176200001440000000506614412771210024032 0ustar liggesuserstest_that("model_performance various", { skip_if_not_installed("AER") skip_if_not_installed("ordinal") skip_if_not_installed("betareg") data("Affairs", package = "AER") data("GasolineYield", package = "betareg") data("wine", package = "ordinal") data("CigarettesSW", package = "AER") CigarettesSW$rprice <- with(CigarettesSW, price / cpi) CigarettesSW$rincome <- with(CigarettesSW, income / population / cpi) CigarettesSW$tdiff <- with(CigarettesSW, (taxs - tax) / cpi) m1 <- betareg::betareg(yield ~ batch + temp, data = GasolineYield) m3 <- ordinal::clm(rating ~ temp * contact, data = wine) m4 <- ordinal::clm2(rating ~ temp * contact, data = wine) m5 <- AER::ivreg( log(packs) ~ log(rprice) + log(rincome) | log(rincome) + tdiff + I(tax / cpi), data = CigarettesSW, subset = year == "1995" ) expect_equal(model_performance(m1, verbose = FALSE)$R2, 0.9617312, tolerance = 1e-4) expect_equal(model_performance(m3, verbose = FALSE)$R2_Nagelkerke, 0.4042792, tolerance = 1e-4) expect_equal(model_performance(m4, verbose = FALSE)$R2_Nagelkerke, 0.4042792, tolerance = 1e-4) expect_equal(model_performance(m5, verbose = FALSE)$R2, 0.4294224, tolerance = 1e-4) mp <- model_performance(m5) ms <- summary(m5, diagnostics = TRUE) expect_equal(mp$Sargan, ms$diagnostics["Sargan", 3]) expect_equal(mp$Sargan_p, ms$diagnostics["Sargan", 4]) expect_equal(mp$Wu_Hausman, ms$diagnostics["Wu-Hausman", 3]) expect_equal(mp$Wu_Hausman_p, ms$diagnostics["Wu-Hausman", 4]) expect_equal(mp$weak_instruments, ms$diagnostics["Weak instruments", 3]) expect_equal(mp$weak_instruments_p, ms$diagnostics["Weak instruments", 4]) }) # DirichletReg is currently orphaned # test_that("model_performance (Dirichlet regression)", { # skip_if_not_installed("DirichletReg") # set.seed(123) # data("ArcticLake", package = "DirichletReg") # # ALake <- ArcticLake # ALake$Y <- suppressWarnings(DirichletReg::DR_data(ALake[, 1:3])) # # # fit a quadratic Dirichlet regression models ("common") # res1 <- DirichletReg::DirichReg(Y ~ depth + I(depth^2), ALake) # expect_equal( # model_performance(res1), # structure( # list( # AIC = -199.993722776335, # BIC = -185.021667961168, # R2_Nagelkerke = 0.0405982703444639, # RMSE = 0.922951614921502 # ), # class = c( # "performance_model", # "data.frame" # ), # row.names = 1L, # r2 = list(names = "R2_Nagelkerke") # ), # tolerance = 1e-3 # ) # }) performance/tests/testthat/test-r2_kullback.R0000644000176200001440000000044514355346734021071 0ustar liggesuserstest_that("r2_kullback", { model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") expect_equal(r2_kullback(model), c(`Kullback-Leibler R2` = 0.3834), tolerance = 1e-3) expect_equal(r2_kullback(model, adjust = FALSE), c(`Kullback-Leibler R2` = 0.4232), tolerance = 1e-3) }) performance/tests/testthat/test-check_predictions.R0000644000176200001440000000770514517461276022363 0ustar liggesusersskip_on_os("mac") skip_on_cran() test_that("check_predictions", { data(mtcars) model <- lm(mpg ~ disp, data = mtcars) set.seed(99) out <- check_predictions(model) expect_named( out, c( "sim_1", "sim_2", "sim_3", "sim_4", "sim_5", "sim_6", "sim_7", "sim_8", "sim_9", "sim_10", "sim_11", "sim_12", "sim_13", "sim_14", "sim_15", "sim_16", "sim_17", "sim_18", "sim_19", "sim_20", "sim_21", "sim_22", "sim_23", "sim_24", "sim_25", "sim_26", "sim_27", "sim_28", "sim_29", "sim_30", "sim_31", "sim_32", "sim_33", "sim_34", "sim_35", "sim_36", "sim_37", "sim_38", "sim_39", "sim_40", "sim_41", "sim_42", "sim_43", "sim_44", "sim_45", "sim_46", "sim_47", "sim_48", "sim_49", "sim_50", "y" ) ) expect_equal( out$sim_1, c( 23.70112, 24.56502, 25.43419, 20.40954, 13.58266, 20.72532, 11.95366, 25.14559, 22.61286, 18.48403, 20.26737, 21.2291, 20.67149, 10.07628, 0.25886, 10.64176, 10.18407, 20.68235, 28.10115, 27.55045, 28.22301, 18.94021, 16.87727, 14.05421, 13.8378, 28.13797, 26.86451, 23.90539, 10.68719, 28.17587, 21.65853, 26.07681 ), tolerance = 1e-4 ) }) test_that("check_predictions, glmmTMB", { skip_if_not_installed("glmmTMB") data(mtcars) model <- glmmTMB::glmmTMB(vs ~ disp, data = mtcars, family = binomial()) set.seed(99) out <- check_predictions(model) expect_named( out, c( "sim_1", "sim_2", "sim_3", "sim_4", "sim_5", "sim_6", "sim_7", "sim_8", "sim_9", "sim_10", "sim_11", "sim_12", "sim_13", "sim_14", "sim_15", "sim_16", "sim_17", "sim_18", "sim_19", "sim_20", "sim_21", "sim_22", "sim_23", "sim_24", "sim_25", "sim_26", "sim_27", "sim_28", "sim_29", "sim_30", "sim_31", "sim_32", "sim_33", "sim_34", "sim_35", "sim_36", "sim_37", "sim_38", "sim_39", "sim_40", "sim_41", "sim_42", "sim_43", "sim_44", "sim_45", "sim_46", "sim_47", "sim_48", "sim_49", "sim_50", "y" ) ) expect_equal( out$sim_1, c( 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1 ), tolerance = 1e-4 ) expect_true(attributes(out)$model_info$is_bernoulli) model <- glmmTMB::glmmTMB(vs ~ disp + (1 | cyl), data = mtcars, family = binomial()) set.seed(99) out <- check_predictions(model) expect_equal( out$sim_1, c( 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0 ), tolerance = 1e-4 ) expect_true(attributes(out)$model_info$is_bernoulli) }) test_that("check_predictions, glm, binomial", { skip_if(packageVersion("insight") <= "0.19.6") data(mtcars) set.seed(1) tot <- rep(10, 100) suc <- rbinom(100, prob = 0.9, size = tot) dat <- data.frame(tot, suc) dat$prop <- suc / tot mod1 <- glm(cbind(suc, tot - suc) ~ 1, family = binomial, data = dat ) mod2 <- glm(prop ~ 1, family = binomial, data = dat, weights = tot ) mod3 <- glm(cbind(suc, tot) ~ 1, family = binomial, data = dat ) mod4 <- glm(am ~ 1, family = binomial, data = mtcars ) set.seed(1) out1 <- check_predictions(mod1) set.seed(1) out2 <- check_predictions(mod2) set.seed(1) out3 <- check_predictions(mod3) set.seed(1) out4 <- check_predictions(mod4) expect_equal(head(out1$sim_1), c(1, 0.9, 0.9, 0.8, 1, 0.8), tolerance = 1e-4) expect_false(attributes(out1)$model_info$is_bernoulli) expect_equal(head(out2$sim_1), c(1, 0.9, 0.9, 0.8, 1, 0.8), tolerance = 1e-4) expect_false(attributes(out2)$model_info$is_bernoulli) expect_equal(head(out3$sim_1), c(0.4, 0.42105, 0.47368, 0.61111, 0.4, 0.61111), tolerance = 1e-3) expect_false(attributes(out3)$model_info$is_bernoulli) expect_equal(head(out4$sim_1), c(0, 0, 0, 1, 0, 1), tolerance = 1e-4) expect_true(attributes(out4)$model_info$is_bernoulli) }) performance/tests/testthat/test-test_wald.R0000644000176200001440000000251514411402617020646 0ustar liggesusersskip_on_os("linux") test_that("test_wald - lm", { m1 <- lm(Sepal.Length ~ Petal.Width * Species, data = iris) m2 <- lm(Sepal.Length ~ Petal.Width + Species, data = iris) m3 <- lm(Sepal.Length ~ Petal.Width, data = iris) rez <- test_wald(m1, m2, m3) ref <- as.data.frame(anova(m1, m2, m3)) expect_equal(rez$`F`, ref$`F`, tolerance = 1e-4) expect_equal(rez$p, ref$`Pr(>F)`, tolerance = 1e-4) # setting test = "LRT" is not expected, but should at least not fail expect_warning({ rez <- test_wald(m1, m2, test = "LRT") }) expect_identical(rez$Name, c("..1", "..2")) # Reversed m3 <- m1 m1 <- lm(Sepal.Length ~ Petal.Width, data = iris) rez <- test_wald(m1, m2, m3) ref <- as.data.frame(anova(m1, m2, m3)) expect_equal(rez$`F`, ref$`F`, tolerance = 1e-4) expect_equal(rez$p, ref$`Pr(>F)`, tolerance = 1e-4) }) test_that("test_wald - glm", { m1 <- glm(vs ~ disp + hp + drat, data = mtcars, family = "binomial") m2 <- glm(vs ~ disp + hp, data = mtcars, family = "binomial") m3 <- glm(vs ~ disp, data = mtcars, family = "binomial") expect_message({ rez <- test_wald(m1, m2, m3) }) ref <- as.data.frame(anova(m1, m2, m3, test = "LRT")) expect_equal(rez$Chi2, abs(ref$Deviance), tolerance = 1e-4) expect_equal(rez$p, ref$`Pr(>Chi)`, tolerance = 1e-4) }) performance/tests/testthat/test-performance_aic.R0000644000176200001440000000231214412771210021767 0ustar liggesuserstest_that("performance_aic works", { skip_if_not_installed("parameters") data(fish, package = "parameters") model_norm <- lm(count ~ factor(persons), fish) model_pois <- glm(count ~ factor(persons), fish, family = poisson()) expect_equal(performance_aic(model_norm), 1930.755, tolerance = 1e-2) expect_equal(performance_aic(model_pois), 2758.236, tolerance = 1e-2) }) test_that("performance_aic for log-model works", { skip_if_not_installed("parameters") data(fish, package = "parameters") model_lnorm <- lm(log1p(count) ~ factor(persons), fish) expect_equal(performance_aic(model_lnorm), 1025.352, tolerance = 1e-2) }) test_that("performance_aic Jacobian", { m1 <- lm(disp ~ hp, data = mtcars) m2 <- lm(sqrt(disp) ~ hp, data = mtcars) expect_equal(performance_aic(m1), 372.8247, tolerance = 1e-2) expect_equal(performance_aic(m2), 367.1239, tolerance = 1e-2) }) test_that("performance_aic lme4 default", { skip_if_not_installed("lme4") m1 <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) expect_equal(performance_aic(m1), AIC(m1), tolerance = 1e-2) expect_equal(performance_aic(m1, estimator = "ML"), 125.0043, tolerance = 1e-2) }) performance/tests/testthat/test-check_autocorrelation.R0000644000176200001440000000036314513452236023233 0ustar liggesuserstest_that("check_autocorrelation", { data(mtcars) m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) set.seed(123) out <- check_autocorrelation(m) expect_equal(as.vector(out), 0.316, ignore_attr = TRUE, tolerance = 1e-2) }) performance/tests/testthat/test-model_performance.lm.R0000644000176200001440000000210514355346734022761 0ustar liggesuserstest_that("model_performance.lm", { model <- lm(mpg ~ wt + cyl, data = mtcars) expect_equal(model_performance(model)$R2, 0.830, tolerance = 0.01) expect_equal( colnames(model_performance(model)), c("AIC", "AICc", "BIC", "R2", "R2_adjusted", "RMSE", "Sigma") ) }) test_that("model_performance.glm", { model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") expect_equal(model_performance(model)$R2_Tjur, 0.478, tolerance = 0.01) expect_equal( colnames(model_performance(model)), c( "AIC", "AICc", "BIC", "R2_Tjur", "RMSE", "Sigma", "Log_loss", "Score_log", "Score_spherical", "PCP" ) ) }) test_that("model_performance.glm-factor", { model <- glm(factor(vs, labels = c("automatic", "manual")) ~ wt + mpg, data = mtcars, family = "binomial") expect_equal(model_performance(model)$R2_Tjur, 0.478, tolerance = 0.01) expect_equal( colnames(model_performance(model)), c( "AIC", "AICc", "BIC", "R2_Tjur", "RMSE", "Sigma", "Log_loss", "Score_log", "Score_spherical", "PCP" ) ) }) performance/tests/testthat/test-nestedLogit.R0000644000176200001440000000277614507335630021160 0ustar liggesusersskip_on_os(c("mac", "linux")) skip_if(packageVersion("insight") <= "0.19.5.10") skip_if_not_installed("nestedLogit") skip_if_not_installed("carData") data("Womenlf", package = "carData") comparisons <- nestedLogit::logits( work = nestedLogit::dichotomy("not.work", working = c("parttime", "fulltime")), full = nestedLogit::dichotomy("parttime", "fulltime") ) mnl <- nestedLogit::nestedLogit( partic ~ hincome + children, dichotomies = comparisons, data = Womenlf ) test_that("r2", { out <- r2(mnl) expect_equal( out, list(R2_Tjur = list( work = c(`Tjur's R2` = 0.137759452521642), full = c(`Tjur's R2` = 0.332536937208286) )), ignore_attr = TRUE, tolerance = 1e-4 ) out <- r2_tjur(mnl) expect_equal( out, list( work = c(`Tjur's R2` = 0.137759452521642), full = c(`Tjur's R2` = 0.332536937208286) ), ignore_attr = TRUE, tolerance = 1e-4 ) out <- r2_coxsnell(mnl) expect_equal( out, list( work = c(`Cox & Snell's R2` = 0.129313084315599), full = c(`Cox & Snell's R2` = 0.308541455410686) ), ignore_attr = TRUE, tolerance = 1e-4 ) out <- r2_nagelkerke(mnl) expect_equal( out, list( work = c(`Nagelkerke's R2` = 0.174313365512442), full = c(`Nagelkerke's R2` = 0.418511411473948) ), ignore_attr = TRUE, tolerance = 1e-4 ) }) test_that("model_performance", { expect_snapshot(model_performance(mnl)) }) performance/tests/testthat/test-check_itemscale.R0000644000176200001440000000143414412771210021761 0ustar liggesuserstest_that("check_convergence", { skip_if_not_installed("parameters") set.seed(123) d <- data.frame( a = sample.int(3, 100, replace = TRUE) + 3, b = sample.int(3, 100, replace = TRUE) + 3, c = sample.int(3, 100, replace = TRUE) + 3, d = sample.int(3, 100, replace = TRUE), e = sample.int(3, 100, replace = TRUE), f = sample.int(3, 100, replace = TRUE) ) pca <- parameters::principal_components(d, n = 2) out <- check_itemscale(pca) expect_length(out, 2L) expect_equal( out[[1]]$Mean, vapply(d[out[[1]]$Item], mean, numeric(1)), tolerance = 1e-4, ignore_attr = TRUE ) expect_equal( out[[2]]$Difficulty, item_difficulty(d[out[[2]]$Item])$Difficulty, tolerance = 1e-4, ignore_attr = TRUE ) }) performance/tests/testthat/test-item_difficulty.R0000644000176200001440000000245314362032043022036 0ustar liggesuserstest_that("item_difficulty", { data(iris) x <- iris[, 1:4] expect_equal( item_difficulty(x, maximum_value = NA), # old behaviour structure( list( Item = c( "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width" ), Difficulty = c(0.74, 0.69, 0.54, 0.48), Ideal = c(0.56, 0.61, 0.57, 0.7) ), class = c("item_difficulty", "data.frame"), row.names = c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width") ), tolerance = 1e-3 ) out <- item_difficulty(x) # new behaviour expect_equal(out$Difficulty, c(0.74, 0.39, 0.48, 0.15), tolerance = 1e-3) expect_equal(out$Ideal, c(0.56, 0.56, 0.56, 0.56), tolerance = 1e-3) }) test_that("item_difficulty, maximum value", { x <- data.frame(a = rep(NA, 5), b = 1:5, c = c(1:4, 6)) out1 <- item_difficulty(x) out2 <- item_difficulty(x, maximum_value = 6) expect_equal(out1, out2, tolerance = 1e-3, ignore_attr = TRUE) out <- item_difficulty(x, maximum_value = 10) expect_equal(out$Difficulty, c(NaN, 0.3, 0.32), tolerance = 1e-3, ignore_attr = TRUE) }) test_that("item_difficulty, maximum value", { x <- data.frame(a = rep(NA, 5), b = 1:5, c = c(1:4, 6)) expect_error(item_difficulty(x, maximum_value = "a")) }) performance/tests/testthat/test-logLik.R0000644000176200001440000000117714517245570020116 0ustar liggesusersskip_on_cran() test_that("logLik", { skip_if_not_installed("plm") skip_if_not_installed("withr") withr::local_options(list(expressions = 25)) set.seed(1) nnn <- 100 ddta <- data.frame( x1 = rnorm(nnn), x2 = rnorm(nnn), id = rep_len(1:(nnn / 10), nnn), year = rep_len(1:11, nnn) ) ddta$y <- ddta$x1 * 0.5 - ddta$x2 * 0.5 + rnorm(nnn) m1 <- lm(y ~ x1 + x2, data = ddta) l1 <- logLik(m1) m2 <- plm( y ~ x1 + x2, data = ddta, model = "pooling", index = c("id", "year") ) l2 <- logLik(m2) expect_equal(l1, l2, tolerance = 1e-3, ignore_attr = TRUE) }) performance/tests/testthat/test-backticks.R0000644000176200001440000000122414411402617020612 0ustar liggesuserstest_that("check_collinearity, backticks", { data(iris) iris$`a m` <- iris$Species iris$`Sepal Width` <- iris$Sepal.Width m1 <- lm(`Sepal Width` ~ Petal.Length + `a m` * log(Sepal.Length), data = iris) m2 <- lm(Sepal.Width ~ Petal.Length + Species * log(Sepal.Length), data = iris) expect_message(check_collinearity(m1)) expect_identical( check_collinearity(m1, verbose = FALSE)$Term, c("Petal.Length", "a m", "log(Sepal.Length)", "a m:log(Sepal.Length)") ) expect_identical( check_collinearity(m2, verbose = FALSE)$Term, c("Petal.Length", "Species", "log(Sepal.Length)", "Species:log(Sepal.Length)") ) }) performance/tests/testthat/test-test_vuong.R0000644000176200001440000000333314412771210021053 0ustar liggesuserstest_that("test_vuong - nested", { skip_if_not_installed("nonnest2") m1 <- lm(Sepal.Length ~ Petal.Width * Species, data = iris) m2 <- lm(Sepal.Length ~ Petal.Width + Species, data = iris) m3 <- lm(Sepal.Length ~ Petal.Width, data = iris) rez <- test_vuong(m1, m2, m3) ref <- nonnest2::vuongtest(m1, m2, nested = TRUE) expect_equal(rez[2L, "Omega2"], ref$omega) expect_equal(rez[2L, "p_Omega2"], ref$p_omega) expect_equal(rez[2L, "LR"], ref$LRTstat) expect_equal(rez[2L, "p_LR"], ref$p_LRT$A) ref <- nonnest2::vuongtest(m2, m3, nested = TRUE) expect_equal(rez[3L, "Omega2"], ref$omega) expect_equal(rez[3L, "p_Omega2"], ref$p_omega) expect_equal(rez[3L, "LR"], ref$LRTstat) expect_equal(rez[3L, "p_LR"], ref$p_LRT$A) }) # test_that("test_vuong - nested (reversed)", { # skip_if_not_installed("nonnest2") # m1 <- lm(mpg ~ wt + cyl, data = mtcars) # m2 <- lm(mpg ~ wt + cyl + gear, data = mtcars) # m3 <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) # }) test_that("test_vuong - non-nested", { skip_if_not_installed("nonnest2") m1 <- lm(Sepal.Length ~ Petal.Width, data = iris) m2 <- lm(Sepal.Length ~ Petal.Length, data = iris) m3 <- lm(Sepal.Length ~ Species, data = iris) rez <- test_vuong(m1, m2, m3) ref <- nonnest2::vuongtest(m1, m2) expect_equal(rez[2L, "Omega2"], ref$omega) expect_equal(rez[2L, "p_Omega2"], ref$p_omega) expect_equal(rez[2L, "LR"], ref$LRTstat) expect_equal(rez[2L, "p_LR"], ref$p_LRT$B) ref <- nonnest2::vuongtest(m1, m3) expect_equal(rez[3L, "Omega2"], ref$omega) expect_equal(rez[3L, "p_Omega2"], ref$p_omega) expect_equal(rez[3L, "LR"], ref$LRTstat) expect_equal(rez[3L, "p_LR"], ref$p_LRT$A) }) performance/tests/testthat.R0000644000176200001440000000010614412771210015674 0ustar liggesuserslibrary(testthat) library(performance) test_check("performance") performance/R/0000755000176200001440000000000014517502246012762 5ustar liggesusersperformance/R/check_autocorrelation.R0000644000176200001440000000502614413052536017454 0ustar liggesusers#' @title Check model for independence of residuals. #' @name check_autocorrelation #' #' @description Check model for independence of residuals, i.e. for autocorrelation #' of error terms. #' #' @param x A model object. #' @param nsim Number of simulations for the Durbin-Watson-Test. #' @param ... Currently not used. #' #' @return Invisibly returns the p-value of the test statistics. A p-value < 0.05 #' indicates autocorrelated residuals. #' #' @family functions to check model assumptions and and assess model quality #' #' @details Performs a Durbin-Watson-Test to check for autocorrelated residuals. #' In case of autocorrelation, robust standard errors return more accurate #' results for the estimates, or maybe a mixed model with error term for the #' cluster groups should be used. #' #' @examples #' m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' check_autocorrelation(m) #' @export check_autocorrelation <- function(x, ...) { UseMethod("check_autocorrelation") } #' @rdname check_autocorrelation #' @export check_autocorrelation.default <- function(x, nsim = 1000, ...) { # check for valid input .is_model_valid(x) .residuals <- stats::residuals(x) n <- length(.residuals) dw <- .durbWats(.residuals) X <- insight::get_modelmatrix(x) mu <- stats::fitted(x) Y <- matrix(sample(.residuals, n * nsim, replace = TRUE), n, nsim) + matrix(mu, n, nsim) E <- stats::residuals(stats::lm(Y ~ X - 1)) DW <- rbind(apply(E, 2, .durbWats)) p <- (sum(dw < DW[1, ])) / nsim p.val <- 2 * (min(p, 1 - p)) class(p.val) <- c("check_autocorrelation", "see_check_autocorrelation", class(p.val)) p.val } # methods ------------------------------ #' @export plot.check_autocorrelation <- function(x, ...) { insight::format_warning("There is currently no `plot()` method for `check_autocorrelation()`.") } #' @export print.check_autocorrelation <- function(x, ...) { if (x < 0.05) { insight::print_color( sprintf( "Warning: Autocorrelated residuals detected (%s).", insight::format_p(x) ), "red" ) } else { insight::print_color( sprintf( "OK: Residuals appear to be independent and not autocorrelated (%s).", insight::format_p(x) ), "green" ) } invisible(x) } # utilities ------------------------------- .durbWats <- function(.residuals) { n <- length(.residuals) den <- sum(.residuals^2) (sum((.residuals[2:n] - .residuals[1:(n - 1)])^2)) / den } performance/R/residuals.R0000644000176200001440000000035314271050334015072 0ustar liggesusers#' @exportS3Method residuals iv_robust residuals.iv_robust <- function(object, ...) { datawizard::to_numeric(insight::get_response(object, verbose = FALSE), dummy_factors = FALSE, preserve_levels = TRUE) - object$fitted.values } performance/R/performance_hosmer.R0000644000176200001440000000511214327475467016777 0ustar liggesusers#' @title Hosmer-Lemeshow goodness-of-fit test #' @name performance_hosmer #' #' @description Check model quality of logistic regression models. #' #' @param model A `glm`-object with binomial-family. #' @param n_bins Numeric, the number of bins to divide the data. #' #' @return An object of class `hoslem_test` with following values: #' `chisq`, the Hosmer-Lemeshow chi-squared statistic; `df`, degrees #' of freedom and `p.value` the p-value for the goodness-of-fit test. #' #' @details A well-fitting model shows *no* significant difference between #' the model and the observed data, i.e. the reported p-value should be #' greater than 0.05. #' #' @references #' Hosmer, D. W., and Lemeshow, S. (2000). Applied Logistic Regression. Hoboken, #' NJ, USA: John Wiley and Sons, Inc. \doi{10.1002/0471722146} #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' performance_hosmer(model) #' @export performance_hosmer <- function(model, n_bins = 10) { if (inherits(model, "merMod")) { insight::check_if_installed("lme4") } # check for valid object class if (!inherits(model, c("glmerMod", "glm"))) { insight::format_error("`model` must be an object of class `glm` or `glmerMod`.") } # mixed models (lme4) if (inherits(model, "glmerMod")) { y <- lme4::getME(model, "y") yhat <- stats::fitted(model) } else { y <- model$y yhat <- stats::fitted(model) } cutyhat <- cut( yhat, breaks = stats::quantile(yhat, probs = seq(0, 1, 1 / n_bins)), include.lowest = TRUE ) obs <- stats::xtabs(cbind(1 - y, y) ~ cutyhat) expect <- stats::xtabs(cbind(1 - yhat, yhat) ~ cutyhat) chisq <- sum((obs - expect)^2 / expect) p.value <- 1 - stats::pchisq(chisq, n_bins - 2) hoslem <- list( chisq = chisq, df = n_bins - 2, p.value = p.value ) class(hoslem) <- c("performance_hosmer", "list") hoslem } # methods --------------------------------- #' @export print.performance_hosmer <- function(x, ...) { insight::print_color("# Hosmer-Lemeshow Goodness-of-Fit Test\n\n", "blue") v1 <- sprintf("%.3f", x$chisq) v2 <- sprintf("%i ", x$df) v3 <- sprintf("%.3f", x$p.value) space <- max(nchar(c(v1, v2, v3))) cat(sprintf(" Chi-squared: %*s\n", space, v1)) cat(sprintf(" df: %*s\n", space, v2)) cat(sprintf(" p-value: %*s\n\n", space, v3)) if (x$p.value >= 0.05) { message("Summary: model seems to fit well.") } else { message("Summary: model does not fit well.") } invisible(x) } performance/R/test_likelihoodratio.R0000644000176200001440000001416314512471542017332 0ustar liggesusers#' @rdname test_performance #' @param estimator Applied when comparing regression models using #' `test_likelihoodratio()`. Corresponds to the different estimators for #' the standard deviation of the errors. Defaults to `"OLS"` for linear models, #' `"ML"` for all other models (including mixed models), or `"REML"` for #' linear mixed models when these have the same fixed effects. See 'Details'. #' @export test_likelihoodratio <- function(..., estimator = "ML", verbose = TRUE) { UseMethod("test_likelihoodratio") } # Short name for test_likelihoodratio using the test_* naming convention #' @rdname test_performance #' @export test_lrt <- test_likelihoodratio # default -------------------- #' @export test_likelihoodratio.default <- function(..., estimator = "OLS", verbose = TRUE) { # Attribute class to list objects <- insight::ellipsis_info(..., only_models = TRUE) # validation checks (will throw error if non-valid objects) objects <- .test_performance_checks(objects, verbose = verbose) # different default when mixed model or glm is included if (missing(estimator)) { mixed_models <- sapply(objects, insight::is_mixed_model) if (all(mixed_models) && all(sapply(objects, .is_lmer_reml)) && isTRUE(attributes(objects)$same_fixef)) { estimator <- "REML" } else if (any(mixed_models) || !all(attributes(objects)$is_linear)) { estimator <- "ML" } } # ensure proper object names objects <- .check_objectnames(objects, sapply(match.call(expand.dots = FALSE)$`...`, as.character)) # If a suitable class is found, run the more specific method on it if (inherits(objects, "ListNestedRegressions")) { test_likelihoodratio(objects, estimator = estimator) } else if (inherits(objects, "ListLavaan")) { test_likelihoodratio_ListLavaan(..., objects = objects) # Because lavaanLRT requires the ellipsis } else { insight::format_error( "The models are not nested, which is a prerequisite for `test_likelihoodratio()`.", "See the 'Details' section.", "You may try `test_vuong()` instead." ) } } # methods ------------------------------ #' @export plot.test_likelihoodratio <- function(x, ...) { insight::format_alert( "There is currently no `plot()` method for test-functions.", "Please use `plot(compare_perfomance())` for some visual representations of your model comparisons." ) } #' @export print.test_likelihoodratio <- function(x, digits = 2, ...) { # Footer if ("LogLik" %in% names(x)) { best <- which.max(x$LogLik) footer <- c(sprintf("\nModel '%s' seems to have the best model fit.\n", x$Model[best]), "yellow") } else { footer <- NULL } # value formatting x$p <- insight::format_p(x$p, name = NULL) if (is.null(attributes(x)$estimator)) { estimator_string <- "" } else { estimator_string <- sprintf(" (%s-estimator)", toupper(attributes(x)$estimator)) } cat(insight::export_table( x, digits = digits, caption = c(paste0("# Likelihood-Ratio-Test (LRT) for Model Comparison", estimator_string), "blue"), footer = footer )) invisible(x) } # other classes --------------------------- #' @export test_likelihoodratio.ListNestedRegressions <- function(objects, estimator = "ML", verbose = TRUE, ...) { dfs <- sapply(objects, insight::get_df, type = "model") same_fixef <- attributes(objects)$same_fixef # sort by df if (!all(sort(dfs) == dfs) && !all(sort(dfs) == rev(dfs))) { objects <- objects[order(dfs)] dfs <- sort(dfs, na.last = TRUE) } dfs_diff <- c(NA, diff(dfs)) REML <- tolower(estimator) == "reml" # default anova(test="LRT") if (tolower(estimator) == "ols") { out <- .test_wald(objects, test = "LRT") out$df <- dfs # Replace residual df with model's df } else { # lmtest::lrtest() lls <- sapply(objects, insight::get_loglikelihood, REML = REML, check_response = TRUE) chi2 <- abs(c(NA, -2 * diff(lls))) p <- stats::pchisq(chi2, abs(dfs_diff), lower.tail = FALSE) out <- data.frame( df = dfs, df_diff = dfs_diff, Chi2 = chi2, p = p, stringsAsFactors = FALSE ) out <- cbind(.test_performance_init(objects), out) } # for REML fits, warn user if (isTRUE(REML) && # only when mixed models are involved, others probably don't have problems with REML fit any(sapply(objects, insight::is_mixed_model)) && # only if not all models have same fixed effects (else, REML is ok) !isTRUE(same_fixef) && isTRUE(verbose)) { insight::format_warning( "The Likelihood-Ratio-Test is probably inaccurate when comparing REML-fit models with different fixed effects." ) } attr(out, "is_nested_increasing") <- attributes(objects)$is_nested_increasing attr(out, "is_nested_decreasing") <- attributes(objects)$is_nested_decreasing attr(out, "estimator") <- tolower(estimator) class(out) <- c("test_likelihoodratio", "see_test_likelihoodratio", "data.frame") out } test_likelihoodratio_ListLavaan <- function(..., objects = NULL) { insight::check_if_installed("lavaan") # Create data frame with info about model name and class names_types <- data.frame( Model = names(objects), Type = sapply(objects, function(x) class(x)[1]), stringsAsFactors = FALSE ) out <- as.data.frame( lavaan::lavTestLRT(..., test = "LRT", model.names = names(objects)), stringsAsFactors = FALSE ) # Rename columns colnames(out)[names(out) == "Df"] <- "df" colnames(out)[names(out) == "Df diff"] <- "df_diff" colnames(out)[names(out) == "Chisq"] <- "Chi2" colnames(out)[startsWith(names(out), "Pr(>")] <- "p" out$Model <- row.names(out) # Bind all data out <- merge(names_types, out[c("Model", "df", "df_diff", "Chi2", "p")], by = "Model") class(out) <- c("test_likelihoodratio", "see_test_likelihoodratio", "data.frame") out } # helper ---------------------- .is_lmer_reml <- function(x) { tryCatch(inherits(x, "lmerMod") && as.logical(x@devcomp$dims[["REML"]]), error = function(e) FALSE ) } performance/R/item_intercor.R0000644000176200001440000000404114477405776015766 0ustar liggesusers#' @title Mean Inter-Item-Correlation #' @name item_intercor #' #' @description Compute various measures of internal consistencies #' for tests or item-scales of questionnaires. #' #' @param x A matrix as returned by the `cor()`-function, #' or a data frame with items (e.g. from a test or questionnaire). #' @param method Correlation computation method. May be one of #' `"pearson"` (default), `"spearman"` or `"kendall"`. #' You may use initial letter only. #' #' @return The mean inter-item-correlation value for `x`. #' #' @details This function calculates a mean inter-item-correlation, i.e. a #' correlation matrix of `x` will be computed (unless `x` is already a matrix #' as returned by the `cor()` function) and the mean of the sum of all items' #' correlation values is returned. Requires either a data frame or a computed #' `cor()` object. #' #' "Ideally, the average inter-item correlation for a set of items should be #' between 0.20 and 0.40, suggesting that while the items are reasonably #' homogeneous, they do contain sufficiently unique variance so as to not be #' isomorphic with each other. When values are lower than 0.20, then the items #' may not be representative of the same content domain. If values are higher #' than 0.40, the items may be only capturing a small bandwidth of the #' construct." _(Piedmont 2014)_ #' #' @references #' Piedmont RL. 2014. Inter-item Correlations. In: Michalos AC (eds) #' Encyclopedia of Quality of Life and Well-Being Research. Dordrecht: Springer, #' 3303-3304. \doi{10.1007/978-94-007-0753-5_1493} #' #' @examples #' data(mtcars) #' x <- mtcars[, c("cyl", "gear", "carb", "hp")] #' item_intercor(x) #' @export item_intercor <- function(x, method = c("pearson", "spearman", "kendall")) { # Check parameter method <- match.arg(method) # Mean-interitem-corelation if (inherits(x, "matrix")) { corr <- x } else { x <- stats::na.omit(x) corr <- stats::cor(x, method = method) } mean(corr[lower.tri(corr)]) } performance/R/looic.R0000644000176200001440000000470614517461276014230 0ustar liggesusers#' @title LOO-related Indices for Bayesian regressions. #' @name looic #' #' @description Compute LOOIC (leave-one-out cross-validation (LOO) information #' criterion) and ELPD (expected log predictive density) for Bayesian #' regressions. For LOOIC and ELPD, smaller and larger values are respectively #' indicative of a better fit. #' #' @param model A Bayesian regression model. #' @inheritParams model_performance.lm #' #' @return A list with four elements, the ELPD, LOOIC and their standard errors. #' #' @examplesIf require("rstanarm") #' \donttest{ #' model <- suppressWarnings(rstanarm::stan_glm( #' mpg ~ wt + cyl, #' data = mtcars, #' chains = 1, #' iter = 500, #' refresh = 0 #' )) #' looic(model) #' } #' @export looic <- function(model, verbose = TRUE) { insight::check_if_installed("loo") algorithm <- insight::find_algorithm(model) if (algorithm$algorithm != "sampling") { if (verbose) { insight::format_warning( "`looic()` only available for models fit using the 'sampling' algorithm." ) } return(NA) } res_loo <- tryCatch( { loo::loo(model) }, error = function(e) { if (inherits(e, c("simpleError", "error"))) { insight::print_color(e$message, "red") cat("\n") } NULL } ) loo_df <- res_loo$estimates if (is.null(loo_df)) { return(NULL) } out <- list( ELPD = loo_df["elpd_loo", "Estimate"], ELPD_SE = loo_df["elpd_loo", "SE"], LOOIC = loo_df["looic", "Estimate"], LOOIC_SE = loo_df["looic", "SE"] ) attr(out, "loo") <- res_loo[c("pointwise", "diagnostics")] # Leave p_loo as I am not sure it is an index of performance structure(class = "looic", out) } # methods -------------------------- #' @export as.data.frame.looic <- function(x, row.names = NULL, ...) { data.frame( ELPD = x$ELPD, ELPD_SE = x$ELPD_SE, LOOIC = x$LOOIC, LOOIC_SE = x$LOOIC_SE, stringsAsFactors = FALSE, row.names = row.names, ... ) } #' @export print.looic <- function(x, digits = 2, ...) { insight::print_color("# LOOIC and ELPD with Standard Error\n\n", "blue") out <- paste0( c( sprintf(" LOOIC: %.*f [%.*f]", digits, x$LOOIC, digits, x$LOOIC_SE), sprintf(" ELPD: %.*f [%.*f]", digits, x$ELPD, digits, x$ELPD_SE) ), collapse = "\n" ) cat(out) cat("\n") invisible(x) } performance/R/check_zeroinflation.R0000644000176200001440000000634314501062052017120 0ustar liggesusers#' @title Check for zero-inflation in count models #' @name check_zeroinflation #' #' @description `check_zeroinflation()` checks whether count models are #' over- or underfitting zeros in the outcome. #' #' @param x Fitted model of class `merMod`, `glmmTMB`, `glm`, or `glm.nb` #' (package **MASS**). #' @param tolerance The tolerance for the ratio of observed and predicted #' zeros to considered as over- or underfitting zeros. A ratio #' between 1 +/- `tolerance` is considered as OK, while a ratio #' beyond or below this threshold would indicate over- or underfitting. #' #' @return A list with information about the amount of predicted and observed #' zeros in the outcome, as well as the ratio between these two values. #' #' @details If the amount of observed zeros is larger than the amount of #' predicted zeros, the model is underfitting zeros, which indicates a #' zero-inflation in the data. In such cases, it is recommended to use #' negative binomial or zero-inflated models. #' #' @family functions to check model assumptions and and assess model quality #' #' @examplesIf require("glmmTMB") #' data(Salamanders, package = "glmmTMB") #' m <- glm(count ~ spp + mined, family = poisson, data = Salamanders) #' check_zeroinflation(m) #' @export check_zeroinflation <- function(x, tolerance = 0.05) { # check if we have poisson model_info <- insight::model_info(x) if (!model_info$is_count) { insight::format_error("Model must be from Poisson-family.") } # get actual zero of response obs.zero <- sum(insight::get_response(x, verbose = FALSE) == 0L) if (obs.zero == 0) { insight::print_color("Model has no observed zeros in the response variable.\n", "red") return(NULL) } # get predictions of outcome mu <- stats::fitted(x) # get overdispersion parameters if (model_info$is_negbin) { if (methods::is(x, "glmmTMB")) { theta <- stats::sigma(x) } else if (methods::is(x, "glmerMod")) { theta <- environment(x@resp$family$aic)[[".Theta"]] } else { theta <- x$theta } } else { theta <- NULL } # get predicted zero-counts if (!is.null(theta)) { pred.zero <- round(sum(stats::dnbinom(x = 0, size = theta, mu = mu))) } else { pred.zero <- round(sum(stats::dpois(x = 0, lambda = mu))) } # proportion structure( class = "check_zi", list( predicted.zeros = pred.zero, observed.zeros = obs.zero, ratio = pred.zero / obs.zero, tolerance = tolerance ) ) } # methods ------------------ #' @export print.check_zi <- function(x, ...) { insight::print_color("# Check for zero-inflation\n\n", "blue") cat(sprintf(" Observed zeros: %i\n", x$observed.zeros)) cat(sprintf(" Predicted zeros: %i\n", x$predicted.zeros)) cat(sprintf(" Ratio: %.2f\n\n", x$ratio)) lower <- 1 - x$tolerance upper <- 1 + x$tolerance if (x$ratio < lower) { message("Model is underfitting zeros (probable zero-inflation).") } else if (x$ratio > upper) { message("Model is overfitting zeros.") } else { insight::format_alert("Model seems ok, ratio of observed and predicted zeros is within the tolerance range.") } invisible(x) } performance/R/check_collinearity.R0000644000176200001440000005255314500142437016744 0ustar liggesusers#' @title Check for multicollinearity of model terms #' @name check_collinearity #' #' @description #' #' `check_collinearity()` checks regression models for #' multicollinearity by calculating the variance inflation factor (VIF). #' `multicollinearity()` is an alias for `check_collinearity()`. #' `check_concurvity()` is a wrapper around `mgcv::concurvity()`, and can be #' considered as a collinearity check for smooth terms in GAMs. Confidence #' intervals for VIF and tolerance are based on Marcoulides et al. #' (2019, Appendix B). #' #' @param x A model object (that should at least respond to `vcov()`, #' and if possible, also to `model.matrix()` - however, it also should #' work without `model.matrix()`). #' @param component For models with zero-inflation component, multicollinearity #' can be checked for the conditional model (count component, #' `component = "conditional"` or `component = "count"`), #' zero-inflation component (`component = "zero_inflated"` or #' `component = "zi"`) or both components (`component = "all"`). #' Following model-classes are currently supported: `hurdle`, #' `zeroinfl`, `zerocount`, `MixMod` and `glmmTMB`. #' @param ci Confidence Interval (CI) level for VIF and tolerance values. #' @param verbose Toggle off warnings or messages. #' @param ... Currently not used. #' #' @return A data frame with information about name of the model term, the #' variance inflation factor and associated confidence intervals, the factor #' by which the standard error is increased due to possible correlation #' with other terms, and tolerance values (including confidence intervals), #' where `tolerance = 1/vif`. #' #' @section Multicollinearity: #' Multicollinearity should not be confused with a raw strong correlation #' between predictors. What matters is the association between one or more #' predictor variables, *conditional on the other variables in the #' model*. In a nutshell, multicollinearity means that once you know the #' effect of one predictor, the value of knowing the other predictor is rather #' low. Thus, one of the predictors doesn't help much in terms of better #' understanding the model or predicting the outcome. As a consequence, if #' multicollinearity is a problem, the model seems to suggest that the #' predictors in question don't seems to be reliably associated with the #' outcome (low estimates, high standard errors), although these predictors #' actually are strongly associated with the outcome, i.e. indeed might have #' strong effect (_McElreath 2020, chapter 6.1_). #' #' Multicollinearity might arise when a third, unobserved variable has a causal #' effect on each of the two predictors that are associated with the outcome. #' In such cases, the actual relationship that matters would be the association #' between the unobserved variable and the outcome. #' #' Remember: "Pairwise correlations are not the problem. It is the conditional #' associations - not correlations - that matter." (_McElreath 2020, p. 169_) #' #' @section Interpretation of the Variance Inflation Factor: #' The variance inflation factor is a measure to analyze the magnitude of #' multicollinearity of model terms. A VIF less than 5 indicates a low #' correlation of that predictor with other predictors. A value between 5 and #' 10 indicates a moderate correlation, while VIF values larger than 10 are a #' sign for high, not tolerable correlation of model predictors (_James et al. #' 2013_). The *Increased SE* column in the output indicates how much larger #' the standard error is due to the association with other predictors #' conditional on the remaining variables in the model. Note that these #' thresholds, although commonly used, are also criticized for being too high. #' _Zuur et al. (2010)_ suggest using lower values, e.g. a VIF of 3 or larger #' may already no longer be considered as "low". #' #' @section Multicollinearity and Interaction Terms: #' If interaction terms are included in a model, high VIF values are expected. #' This portion of multicollinearity among the component terms of an #' interaction is also called "inessential ill-conditioning", which leads to #' inflated VIF values that are typically seen for models with interaction #' terms _(Francoeur 2013)_. #' #' @section Concurvity for Smooth Terms in Generalized Additive Models: #' `check_concurvity()` is a wrapper around `mgcv::concurvity()`, and can be #' considered as a collinearity check for smooth terms in GAMs."Concurvity #' occurs when some smooth term in a model could be approximated by one or more #' of the other smooth terms in the model." (see `?mgcv::concurvity`). #' `check_concurvity()` returns a column named _VIF_, which is the "worst" #' measure. While `mgcv::concurvity()` range between 0 and 1, the _VIF_ value #' is `1 / (1 - worst)`, to make interpretation comparable to classical VIF #' values, i.e. `1` indicates no problems, while higher values indicate #' increasing lack of identifiability. The _VIF proportion_ column equals the #' "estimate" column from `mgcv::concurvity()`, ranging from 0 (no problem) to #' 1 (total lack of identifiability). #' #' @references #' #' - Francoeur, R. B. (2013). Could Sequential Residual Centering Resolve #' Low Sensitivity in Moderated Regression? Simulations and Cancer Symptom #' Clusters. Open Journal of Statistics, 03(06), 24-44. #' #' - James, G., Witten, D., Hastie, T., and Tibshirani, R. (eds.). (2013). #' An introduction to statistical learning: with applications in R. New York: #' Springer. #' #' - Marcoulides, K. M., and Raykov, T. (2019). Evaluation of Variance #' Inflation Factors in Regression Models Using Latent Variable Modeling #' Methods. Educational and Psychological Measurement, 79(5), 874–882. #' #' - McElreath, R. (2020). Statistical rethinking: A Bayesian course with #' examples in R and Stan. 2nd edition. Chapman and Hall/CRC. #' #' - Vanhove, J. (2019). Collinearity isn't a disease that needs curing. #' [webpage](https://janhove.github.io/posts/2019-09-11-collinearity/) #' #' - Zuur AF, Ieno EN, Elphick CS. A protocol for data exploration to avoid #' common statistical problems: Data exploration. Methods in Ecology and #' Evolution (2010) 1:3–14. #' #' @family functions to check model assumptions and and assess model quality #' #' @note The code to compute the confidence intervals for the VIF and tolerance #' values was adapted from the Appendix B from the Marcoulides et al. paper. #' Thus, credits go to these authors the original algorithm. There is also #' a [`plot()`-method](https://easystats.github.io/see/articles/performance.html) #' implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @examples #' m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' check_collinearity(m) #' #' @examplesIf require("see") #' # plot results #' x <- check_collinearity(m) #' plot(x) #' @export check_collinearity <- function(x, ...) { UseMethod("check_collinearity") } #' @rdname check_collinearity #' @export multicollinearity <- check_collinearity # default ------------------------------ #' @rdname check_collinearity #' @export check_collinearity.default <- function(x, ci = 0.95, verbose = TRUE, ...) { # check for valid input .is_model_valid(x) .check_collinearity(x, component = "conditional", ci = ci, verbose = verbose) } # methods ------------------------------------------- #' @export print.check_collinearity <- function(x, ...) { insight::print_color("# Check for Multicollinearity\n", "blue") if ("Component" %in% colnames(x)) { comp <- split(x, x$Component) for (i in seq_along(comp)) { cat(paste0("\n* ", comp[[i]]$Component[1], " component:\n")) .print_collinearity(datawizard::data_remove(comp[[i]], "Component")) } } else { .print_collinearity(x) } invisible(x) } #' @export plot.check_collinearity <- function(x, ...) { insight::check_if_installed("see", "to plot collinearity-check") NextMethod() } .print_collinearity <- function(x) { vifs <- x$VIF low_vif <- which(vifs < 5) mid_vif <- which(vifs >= 5 & vifs < 10) high_vif <- which(vifs >= 10) all_vifs <- insight::compact_list(list(low_vif, mid_vif, high_vif)) # if we have no CIs, remove those columns x <- datawizard::remove_empty_columns(x) # format table for each "ViF" group - this ensures that CIs are properly formatted x <- insight::format_table(x) x <- datawizard::data_rename( x, pattern = "SE_factor", replacement = "Increased SE", verbose = FALSE ) if (length(low_vif)) { cat("\n") insight::print_color("Low Correlation\n\n", "green") print.data.frame(x[low_vif, ], row.names = FALSE) } if (length(mid_vif)) { cat("\n") insight::print_color("Moderate Correlation\n\n", "yellow") print.data.frame(x[mid_vif, ], row.names = FALSE) } if (length(high_vif)) { cat("\n") insight::print_color("High Correlation\n\n", "red") print.data.frame(x[high_vif, ], row.names = FALSE) } } # other classes ---------------------------------- #' @export check_collinearity.afex_aov <- function(x, verbose = TRUE, ...) { if (length(attr(x, "within")) == 0L) { return(check_collinearity(x$lm, verbose = verbose, ...)) } f <- insight::find_formula(x)[[1]] f <- Reduce(paste, deparse(f)) f <- sub("\\+\\s*Error\\(.*\\)$", "", f) f <- stats::as.formula(f) d <- insight::get_data(x, verbose = FALSE) is_num <- vapply(d, is.numeric, logical(1)) d[is_num] <- sapply(d[is_num], datawizard::center, simplify = TRUE) is_fac <- !is_num contrs <- lapply(is_fac, function(...) stats::contr.sum)[is_fac] if (verbose) { insight::format_alert( "All predictors have been centered (factors with `contr.sum()`, numerics with `scale()`)." ) } check_collinearity(suppressWarnings(stats::lm( formula = f, data = d, contrasts = contrs ))) } #' @export check_collinearity.BFBayesFactor <- function(x, verbose = TRUE, ...) { if (!insight::is_model(x)) { insight::format_error("Collinearity only applicable to regression models.") } f <- insight::find_formula(x)[[1]] d <- insight::get_data(x, verbose = FALSE) check_collinearity(stats::lm(f, d)) } # mfx models ------------------------------- #' @export check_collinearity.logitor <- function(x, ci = 0.95, verbose = TRUE, ...) { .check_collinearity(x$fit, component = "conditional", ci = ci, verbose = verbose) } #' @export check_collinearity.logitmfx <- check_collinearity.logitor #' @export check_collinearity.probitmfx <- check_collinearity.logitor #' @export check_collinearity.poissonirr <- check_collinearity.logitor #' @export check_collinearity.poissonmfx <- check_collinearity.logitor #' @export check_collinearity.negbinirr <- check_collinearity.logitor #' @export check_collinearity.negbinmfx <- check_collinearity.logitor #' @export check_collinearity.betaor <- check_collinearity.logitor #' @export check_collinearity.betamfx <- check_collinearity.logitor # zi-models ------------------------------------- #' @rdname check_collinearity #' @export check_collinearity.glmmTMB <- function(x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ci = 0.95, verbose = TRUE, ...) { component <- match.arg(component) .check_collinearity_zi_model(x, component, ci = ci, verbose = verbose) } #' @export check_collinearity.MixMod <- function(x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ci = 0.95, verbose = TRUE, ...) { component <- match.arg(component) .check_collinearity_zi_model(x, component, ci = ci, verbose = verbose) } #' @export check_collinearity.hurdle <- function(x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ci = 0.95, verbose = verbose, ...) { component <- match.arg(component) .check_collinearity_zi_model(x, component, ci = ci, verbose = verbose) } #' @export check_collinearity.zeroinfl <- function(x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ci = 0.95, verbose = verbose, ...) { component <- match.arg(component) .check_collinearity_zi_model(x, component, ci = ci, verbose = verbose) } #' @export check_collinearity.zerocount <- function(x, component = c("all", "conditional", "count", "zi", "zero_inflated"), ci = 0.95, verbose = verbose, ...) { component <- match.arg(component) .check_collinearity_zi_model(x, component, ci = ci, verbose = verbose) } # utilities --------------------------------- .check_collinearity_zi_model <- function(x, component, ci = 0.95, verbose = TRUE) { if (component == "count") component <- "conditional" if (component == "zi") component <- "zero_inflated" mi <- insight::model_info(x, verbose = FALSE) if (!mi$is_zero_inflated) component <- "conditional" if (component == "all") { cond <- .check_collinearity(x, "conditional", ci = ci, verbose = verbose) zi <- .check_collinearity(x, "zero_inflated", ci = ci, verbose = FALSE) if (is.null(cond) && is.null(zi)) { return(NULL) } if (is.null(cond)) { zi$Component <- "zero inflated" return(zi) } if (is.null(zi)) { cond$Component <- "conditional" return(cond) } # retrieve data for plotting dat_cond <- attr(cond, "data") dat_zi <- attr(zi, "data") ci_cond <- attr(cond, "CI") ci_zi <- attr(zi, "CI") # add component cond$Component <- "conditional" zi$Component <- "zero inflated" dat_cond$Component <- "conditional" dat_zi$Component <- "zero inflated" ci_cond$Component <- "conditional" ci_zi$Component <- "zero inflated" # create final data dat <- rbind(cond, zi) attr(dat, "data") <- rbind(dat_cond, dat_zi) attr(dat, "CI") <- rbind(ci_cond, ci_zi) dat } else { .check_collinearity(x, component, ci = ci, verbose = verbose) } } .check_collinearity <- function(x, component, ci = 0.95, verbose = TRUE) { v <- insight::get_varcov(x, component = component, verbose = FALSE) assign <- .term_assignments(x, component, verbose = verbose) # any assignment found? if (is.null(assign) || all(is.na(assign))) { if (verbose) { insight::format_alert( sprintf("Could not extract model terms for the %s component of the model.", component) ) } return(NULL) } # we have rank-deficiency here. remove NA columns from assignment if (isTRUE(attributes(v)$rank_deficient) && !is.null(attributes(v)$na_columns_index)) { assign <- assign[-attributes(v)$na_columns_index] if (isTRUE(verbose)) { insight::format_alert( "Model matrix is rank deficient. VIFs may not be sensible." ) } } # check for missing intercept if (insight::has_intercept(x)) { v <- v[-1, -1] assign <- assign[-1] } else { if (isTRUE(verbose)) { insight::format_alert("Model has no intercept. VIFs may not be sensible.") } } f <- insight::find_formula(x) # hurdle or zeroinfl model can have no zero-inflation formula, in which case # we have the same formula as for conditional formula part if (inherits(x, c("hurdle", "zeroinfl", "zerocount")) && component == "zero_inflated" && is.null(f[["zero_inflated"]])) { f$zero_inflated <- f$conditional } if (inherits(x, "mixor")) { terms <- labels(x$terms) } else { terms <- labels(stats::terms(f[[component]])) } if ("instruments" %in% names(f)) { terms <- unique(c(terms, labels(stats::terms(f[["instruments"]])))) } n.terms <- length(terms) if (n.terms < 2) { if (isTRUE(verbose)) { insight::format_alert( sprintf("Not enough model terms in the %s part of the model to check for multicollinearity.", component) ) } return(NULL) } R <- stats::cov2cor(v) detR <- det(R) result <- vector("numeric") na_terms <- vector("numeric") for (term in 1:n.terms) { subs <- which(assign == term) if (length(subs)) { result <- c( result, det(as.matrix(R[subs, subs])) * det(as.matrix(R[-subs, -subs])) / detR ) } else { na_terms <- c(na_terms, term) } } # any terms to remove, due to rank deficiency? if (length(na_terms)) { terms <- terms[-na_terms] } # check for interactions, VIF might be inflated... if (!is.null(insight::find_interactions(x)) && any(result > 10) && isTRUE(verbose)) { insight::format_alert( "Model has interaction terms. VIFs might be inflated.", "You may check multicollinearity among predictors of a model without interaction terms." ) } # CIs, see Appendix B 10.1177/0013164418817803 r <- 1 - (1 / result) n <- insight::n_obs(x) p <- insight::n_parameters(x) # check if CIs are requested if (!is.null(ci) && !is.na(ci) && is.numeric(ci)) { ci_lvl <- (1 + ci) / 2 logis_r <- stats::qlogis(r) # see Raykov & Marcoulides (2011, ch. 7) for details. se <- sqrt((1 - r^2)^2 * (n - p - 1)^2 / ((n^2 - 1) * (n + 3))) se_log <- se / (r * (1 - r)) ci_log_lo <- logis_r - stats::qnorm(ci_lvl) * se_log ci_log_up <- logis_r + stats::qnorm(ci_lvl) * se_log ci_lo <- stats::plogis(ci_log_lo) ci_up <- stats::plogis(ci_log_up) } else { ci_lo <- ci_up <- NA } out <- insight::text_remove_backticks( data.frame( Term = terms, VIF = result, VIF_CI_low = 1 / (1 - ci_lo), VIF_CI_high = 1 / (1 - ci_up), SE_factor = sqrt(result), Tolerance = 1 / result, Tolerance_CI_low = 1 - ci_up, Tolerance_CI_high = 1 - ci_lo, stringsAsFactors = FALSE ), column = "Term" ) attr(out, "ci") <- ci attr(out, "data") <- insight::text_remove_backticks( data.frame( Term = terms, VIF = result, SE_factor = sqrt(result), stringsAsFactors = FALSE ), column = "Term" ) attr(out, "CI") <- data.frame( VIF_CI_low = 1 / (1 - ci_lo), VIF_CI_high = 1 / (1 - ci_up), Tolerance_CI_low = 1 - ci_up, Tolerance_CI_high = 1 - ci_lo, stringsAsFactors = FALSE ) class(out) <- c("check_collinearity", "see_check_collinearity", "data.frame") out } .term_assignments <- function(x, component, verbose = TRUE) { tryCatch( { if (inherits(x, c("hurdle", "zeroinfl", "zerocount"))) { assign <- switch(component, conditional = attr(insight::get_modelmatrix(x, model = "count"), "assign"), zero_inflated = attr(insight::get_modelmatrix(x, model = "zero"), "assign") ) } else if (inherits(x, "glmmTMB")) { assign <- switch(component, conditional = attr(insight::get_modelmatrix(x), "assign"), zero_inflated = .zi_term_assignment(x, component, verbose = verbose) ) } else if (inherits(x, "MixMod")) { assign <- switch(component, conditional = attr(insight::get_modelmatrix(x, type = "fixed"), "assign"), zero_inflated = attr(insight::get_modelmatrix(x, type = "zi_fixed"), "assign") ) } else { assign <- attr(insight::get_modelmatrix(x), "assign") } if (is.null(assign)) { assign <- .find_term_assignment(x, component, verbose = verbose) } assign }, error = function(e) { .find_term_assignment(x, component, verbose = verbose) } ) } .find_term_assignment <- function(x, component, verbose = TRUE) { pred <- insight::find_predictors(x)[[component]] if (is.null(pred)) { return(NULL) } dat <- insight::get_data(x, verbose = FALSE)[, pred, drop = FALSE] parms <- unlist(lapply(seq_along(pred), function(i) { p <- pred[i] if (is.factor(dat[[p]])) { ps <- paste0(p, levels(dat[[p]])) names(ps)[seq_along(ps)] <- i ps } else { names(p) <- i p } })) if (insight::is_gam_model(x)) { model_params <- as.vector(unlist(insight::find_parameters(x)[c(component, "smooth_terms")])) } else { model_params <- insight::find_parameters(x)[[component]] } as.numeric(names(parms)[match( insight::clean_names(model_params), parms )]) } .zi_term_assignment <- function(x, component = "zero_inflated", verbose = TRUE) { tryCatch( { rhs <- insight::find_formula(x)[[component]] d <- insight::get_data(x, verbose = FALSE) attr(insight::get_modelmatrix(rhs, data = d), "assign") }, error = function(e) { NULL } ) } performance/R/performance_accuracy.R0000644000176200001440000001757414436307766017310 0ustar liggesusers#' @title Accuracy of predictions from model fit #' @name performance_accuracy #' #' @description This function calculates the predictive accuracy of linear #' or logistic regression models. #' #' @param model A linear or logistic regression model. A mixed-effects model is #' also accepted. #' @param k The number of folds for the k-fold cross-validation. #' @param method Character string, indicating whether cross-validation #' (`method = "cv"`) or bootstrapping (`method = "boot"`) is used to #' compute the accuracy values. #' @param n Number of bootstrap-samples. #' @param verbose Toggle warnings. #' @inheritParams performance_pcp #' #' @return A list with three values: The `Accuracy` of the model #' predictions, i.e. the proportion of accurately predicted values from the #' model, its standard error, `SE`, and the `Method` used to compute #' the accuracy. #' #' @details For linear models, the accuracy is the correlation coefficient #' between the actual and the predicted value of the outcome. For #' logistic regression models, the accuracy corresponds to the #' AUC-value, calculated with the `bayestestR::auc()`-function. #' \cr \cr #' The accuracy is the mean value of multiple correlation resp. #' AUC-values, which are either computed with cross-validation #' or non-parametric bootstrapping (see argument `method`). #' The standard error is the standard deviation of the computed #' correlation resp. AUC-values. #' #' @examples #' model <- lm(mpg ~ wt + cyl, data = mtcars) #' performance_accuracy(model) #' #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' performance_accuracy(model) #' @export performance_accuracy <- function(model, method = c("cv", "boot"), k = 5, n = 1000, ci = 0.95, verbose = TRUE) { method <- match.arg(method) # get formula from model fit formula <- stats::formula(model) # get name of response resp.name <- insight::find_response(model) # model data, for cross validation model_data <- insight::get_data(model, verbose = FALSE) info <- insight::model_info(model, verbose = verbose) # accuracy for linear models if (info$is_linear) { measure <- "Correlation between observed and predicted" # check if bootstrapping or cross validation is requested if (method == "boot") { # accuracy linear models with bootstrapping bootstr <- replicate(n, sample(nrow(model_data), replace = TRUE), simplify = FALSE) models <- lapply(bootstr, function(.x) { text <- utils::capture.output({ model_upd <- stats::update(model, data = model_data[.x, ]) }) # stats::lm(formula, data = model_data[.x, ]) model_upd }) predictions <- Map(function(.x, .y) { stats::predict(.y, newdata = model_data[.x, ]) }, bootstr, models) response <- lapply(bootstr, function(.x) { as.data.frame(model_data[.x, ])[[resp.name]] }) accuracy <- mapply(function(.x, .y) { stats::cor(.x, .y, use = "pairwise.complete.obs") }, predictions, response) } else { # accuracy linear models with cross validation cv <- .crossv_kfold(model_data, k = k) models <- lapply(cv, function(.x) { text <- utils::capture.output({ model_upd <- stats::update(model, data = model_data[.x$train, ]) }) model_upd # stats::lm(formula, data = model_data[.x$train, ]) }) predictions <- Map(function(.x, .y) { stats::predict(.y, newdata = model_data[.x$test, ]) }, cv, models) response <- lapply(cv, function(.x) { as.data.frame(model_data[.x$test, ])[[resp.name]] }) accuracy <- mapply(function(.x, .y) { stats::cor(.x, .y, use = "pairwise.complete.obs") }, predictions, response) } } else if (info$is_binomial) { measure <- "Area under Curve" # check if bootstrapping or cross validation is requested if (method == "boot") { # accuracy linear models with bootstrapping bootstr <- replicate(n, sample(nrow(model_data), replace = TRUE), simplify = FALSE) models <- lapply(bootstr, function(.x) { text <- utils::capture.output({ model_upd <- stats::update(model, data = model_data[.x, ]) }) # stats::glm(formula, data = model_data[.x, ], family = stats::binomial(link = "logit")) model_upd }) predictions <- Map(function(.x, .y) { stats::predict(.y, newdata = model_data[.x, ], type = "link") }, bootstr, models) response <- lapply(bootstr, function(.x) { .recode_to_zero(as.data.frame(model_data[.x, ])[[resp.name]]) }) accuracy <- mapply(function(.x, .y) { roc <- performance_roc(x = .x, predictions = .y) bayestestR::area_under_curve(roc$Specificity, roc$Sensitivity) }, response, predictions) } else { # accuracy linear models with cross validation cv <- .crossv_kfold(model_data, k = k) models <- lapply(cv, function(.x) { text <- utils::capture.output({ model_upd <- stats::update(model, data = model_data[.x$train, ]) }) model_upd # stats::glm(formula, data = model_data[.x$train, ], family = stats::binomial(link = "logit")) }) predictions <- Map(function(.x, .y) { stats::predict(.y, newdata = model_data[.x$test, ], type = "link") }, cv, models) response <- lapply(cv, function(.x) { .recode_to_zero(as.data.frame(model_data[.x$test, ])[[resp.name]]) }) accuracy <- mapply(function(.x, .y) { roc <- performance_roc(x = .x, predictions = .y) bayestestR::area_under_curve(roc$Specificity, roc$Sensitivity) }, response, predictions) } if (anyNA(accuracy)) { m <- ifelse(method == "cv", "cross-validated", "bootstrapped") if (verbose) { insight::format_alert( paste0("Some of the ", m, " samples were not eligible for calculating AUC.") ) } } } else { if (verbose) { insight::format_warning( paste0("Models of class '", class(model)[1], "' are not supported.") ) } return(NULL) } # return mean value of accuracy structure( class = "performance_accuracy", list( Accuracy = mean(accuracy, na.rm = TRUE), SE = stats::sd(accuracy, na.rm = TRUE), CI = ci, CI_low = as.vector(stats::quantile(accuracy, 1 - ((1 + ci) / 2), na.rm = TRUE)), CI_high = as.vector(stats::quantile(accuracy, (1 + ci) / 2, na.rm = TRUE)), Method = measure ) ) } # methods -------------------------- #' @export as.data.frame.performance_accuracy <- function(x, row.names = NULL, ...) { data.frame( Accuracy = x$Accuracy, SE = x$SE, CI = x$CI, CI_low = x$CI_low, CI_high = x$CI_high, Method = x$Method, stringsAsFactors = FALSE, row.names = row.names, ... ) } #' @export print.performance_accuracy <- function(x, ...) { # headline insight::print_color("# Accuracy of Model Predictions\n\n", "blue") # statistics cat(sprintf( "Accuracy (%i%% CI): %.2f%% [%.2f%%, %.2f%%]\nMethod: %s\n", round(100 * x$CI), 100 * x$Accuracy, 100 * x$CI_low, 100 * x$CI_high, x$Method )) invisible(x) } # utilities ------------------------ .crossv_kfold <- function(model_data, k = 5) { n <- nrow(model_data) folds <- sample(rep(1:k, length.out = n)) idx <- seq_len(n) fold_idx <- split(idx, folds) fold <- function(test) { list(train = setdiff(idx, test), test = test) } lapply(fold_idx, fold) } performance/R/check_model.R0000644000176200001440000004453514517461276015364 0ustar liggesusers#' @title Visual check of model assumptions #' @name check_model #' #' @description #' #' Visual check of various model assumptions (normality of residuals, normality #' of random effects, linear relationship, homogeneity of variance, #' multicollinearity). #' #' @param x A model object. #' @param dot_size,line_size Size of line and dot-geoms. #' @param panel Logical, if `TRUE`, plots are arranged as panels; else, #' single plots for each diagnostic are returned. #' @param check Character vector, indicating which checks for should be performed #' and plotted. May be one or more of `"all"`, `"vif"`, `"qq"`, `"normality"`, #' `"linearity"`, `"ncv"`, `"homogeneity"`, `"outliers"`, `"reqq"`, `"pp_check"`, #' `"binned_residuals"` or `"overdispersion"`, Not that not all check apply #' to all type of models (see 'Details'). `"reqq"` is a QQ-plot for random #' effects and only available for mixed models. `"ncv"` is an alias for #' `"linearity"`, and checks for non-constant variance, i.e. for #' heteroscedasticity, as well as the linear relationship. By default, all #' possible checks are performed and plotted. #' @param alpha,dot_alpha The alpha level of the confidence bands and dot-geoms. #' Scalar from 0 to 1. #' @param colors Character vector with color codes (hex-format). Must be of #' length 3. First color is usually used for reference lines, second color #' for dots, and third color for outliers or extreme values. #' @param theme String, indicating the name of the plot-theme. Must be in the #' format `"package::theme_name"` (e.g. `"ggplot2::theme_minimal"`). #' @param detrend Logical. Should Q-Q/P-P plots be detrended? Defaults to #' `TRUE`. #' @param show_dots Logical, if `TRUE`, will show data points in the plot. Set #' to `FALSE` for models with many observations, if generating the plot is too #' time-consuming. By default, `show_dots = NULL`. In this case `check_model()` #' tries to guess whether performance will be poor due to a very large model #' and thus automatically shows or hides dots. #' @param verbose If `FALSE` (default), suppress most warning messages. #' @param ... Arguments passed down to the individual check functions, especially #' to `check_predictions()` and `binned_residuals()`. #' @inheritParams check_predictions #' #' @return The data frame that is used for plotting. #' #' @note This function just prepares the data for plotting. To create the plots, #' **see** needs to be installed. Furthermore, this function suppresses #' all possible warnings. In case you observe suspicious plots, please refer #' to the dedicated functions (like `check_collinearity()`, #' `check_normality()` etc.) to get informative messages and warnings. #' #' @details For Bayesian models from packages **rstanarm** or **brms**, #' models will be "converted" to their frequentist counterpart, using #' [`bayestestR::bayesian_as_frequentist`](https://easystats.github.io/bayestestR/reference/convert_bayesian_as_frequentist.html). #' A more advanced model-check for Bayesian models will be implemented at a #' later stage. #' #' See also the related [vignette](https://easystats.github.io/performance/articles/check_model.html). #' #' @section Posterior Predictive Checks: #' Posterior predictive checks can be used to look for systematic discrepancies #' between real and simulated data. It helps to see whether the type of model #' (distributional family) fits well to the data. See [`check_predictions()`] #' for further details. #' #' @section Linearity Assumption: #' The plot **Linearity** checks the assumption of linear relationship. #' However, the spread of dots also indicate possible heteroscedasticity (i.e. #' non-constant variance, hence, the alias `"ncv"` for this plot), thus it shows #' if residuals have non-linear patterns. This plot helps to see whether #' predictors may have a non-linear relationship with the outcome, in which case #' the reference line may roughly indicate that relationship. A straight and #' horizontal line indicates that the model specification seems to be ok. But #' for instance, if the line would be U-shaped, some of the predictors probably #' should better be modeled as quadratic term. See [`check_heteroscedasticity()`] #' for further details. #' #' **Some caution is needed** when interpreting these plots. Although these #' plots are helpful to check model assumptions, they do not necessarily indicate #' so-called "lack of fit", e.g. missed non-linear relationships or interactions. #' Thus, it is always recommended to also look at #' [effect plots, including partial residuals](https://strengejacke.github.io/ggeffects/articles/introduction_partial_residuals.html). #' #' @section Homogeneity of Variance: #' This plot checks the assumption of equal variance (homoscedasticity). The #' desired pattern would be that dots spread equally above and below a straight, #' horizontal line and show no apparent deviation. #' #' @section Influential Observations: #' This plot is used to identify influential observations. If any points in this #' plot fall outside of Cook’s distance (the dashed lines) then it is considered #' an influential observation. See [`check_outliers()`] for further details. #' #' @section Multicollinearity: #' This plot checks for potential collinearity among predictors. In a nutshell, #' multicollinearity means that once you know the effect of one predictor, the #' value of knowing the other predictor is rather low. Multicollinearity might #' arise when a third, unobserved variable has a causal effect on each of the #' two predictors that are associated with the outcome. In such cases, the actual #' relationship that matters would be the association between the unobserved #' variable and the outcome. See [`check_collinearity()`] for further details. #' #' @section Normality of Residuals: #' This plot is used to determine if the residuals of the regression model are #' normally distributed. Usually, dots should fall along the line. If there is #' some deviation (mostly at the tails), this indicates that the model doesn't #' predict the outcome well for that range that shows larger deviations from #' the line. For generalized linear models, a half-normal Q-Q plot of the #' absolute value of the standardized deviance residuals is shown, however, the #' interpretation of the plot remains the same. See [`check_normality()`] for #' further details. #' #' @section Overdispersion: #' For count models, an *overdispersion plot* is shown. Overdispersion occurs #' when the observed variance is higher than the variance of a theoretical model. #' For Poisson models, variance increases with the mean and, therefore, variance #' usually (roughly) equals the mean value. If the variance is much higher, #' the data are "overdispersed". See [`check_overdispersion()`] for further #' details. #' #' @section Binned Residuals: #' For models from binomial families, a *binned residuals plot* is shown. #' Binned residual plots are achieved by cutting the the data into bins and then #' plotting the average residual versus the average fitted value for each bin. #' If the model were true, one would expect about 95% of the residuals to fall #' inside the error bounds. See [`binned_residuals()`] for further details. #' #' @section Residuals for (Generalized) Linear Models: #' Plots that check the normality of residuals (QQ-plot) or the homogeneity of #' variance use standardized Pearson's residuals for generalized linear models, #' and standardized residuals for linear models. The plots for the normality of #' residuals (with overlayed normal curve) and for the linearity assumption use #' the default residuals for `lm` and `glm` (which are deviance #' residuals for `glm`). #' #' @section Troubleshooting: #' For models with many observations, or for more complex models in general, #' generating the plot might become very slow. One reason might be that the #' underlying graphic engine becomes slow for plotting many data points. In #' such cases, setting the argument `show_dots = FALSE` might help. Furthermore, #' look at the `check` argument and see if some of the model checks could be #' skipped, which also increases performance. #' #' @family functions to check model assumptions and and assess model quality #' #' @examplesIf require("lme4") #' \donttest{ #' m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' check_model(m) #' #' data(sleepstudy, package = "lme4") #' m <- lme4::lmer(Reaction ~ Days + (Days | Subject), sleepstudy) #' check_model(m, panel = FALSE) #' } #' @export check_model <- function(x, ...) { UseMethod("check_model") } # default ---------------------------- #' @rdname check_model #' @export check_model.default <- function(x, dot_size = 2, line_size = 0.8, panel = TRUE, check = "all", alpha = 0.2, dot_alpha = 0.8, colors = c("#3aaf85", "#1b6ca8", "#cd201f"), theme = "see::theme_lucid", detrend = TRUE, show_dots = NULL, bandwidth = "nrd", type = "density", verbose = FALSE, ...) { # check model formula if (verbose) { insight::formula_ok(x) } minfo <- insight::model_info(x, verbose = FALSE) ca <- tryCatch( { if (minfo$is_bayesian) { suppressWarnings(.check_assumptions_stan(x, ...)) } else if (minfo$is_linear) { suppressWarnings(.check_assumptions_linear(x, minfo, verbose, ...)) } else { suppressWarnings(.check_assumptions_glm(x, minfo, verbose, ...)) } }, error = function(e) { NULL } ) if (is.null(ca)) { insight::format_error(paste0("`check_model()` not implemented for models of class `", class(x)[1], "` yet.")) } # try to find sensible default for "type" argument suggest_dots <- (minfo$is_bernoulli || minfo$is_count || minfo$is_ordinal || minfo$is_categorical || minfo$is_multinomial) # nolint if (missing(type) && suggest_dots) { type <- "discrete_interval" } # set default for show_dots, based on "model size" if (is.null(show_dots)) { n <- .safe(insight::n_obs(x)) show_dots <- is.null(n) || n <= 1e5 } attr(ca, "panel") <- panel attr(ca, "dot_size") <- dot_size attr(ca, "line_size") <- line_size attr(ca, "check") <- check attr(ca, "alpha") <- alpha attr(ca, "dot_alpha") <- dot_alpha attr(ca, "show_dots") <- isTRUE(show_dots) attr(ca, "detrend") <- detrend attr(ca, "colors") <- colors attr(ca, "theme") <- theme attr(ca, "model_info") <- minfo attr(ca, "overdisp_type") <- list(...)$plot_type attr(ca, "bandwidth") <- bandwidth attr(ca, "type") <- type ca } # methods ---------------------------------- #' @export print.check_model <- function(x, ...) { insight::check_if_installed("see", "for model diagnostic plots") NextMethod() } #' @export plot.check_model <- function(x, ...) { insight::check_if_installed("see", "for model diagnostic plots") NextMethod() } # other classes --------------------------- ## TODO for now, convert to freq, see https://github.com/easystats/performance/issues/354 ## need to fix this later #' @export check_model.stanreg <- function(x, dot_size = 2, line_size = 0.8, panel = TRUE, check = "all", alpha = 0.2, dot_alpha = 0.8, colors = c("#3aaf85", "#1b6ca8", "#cd201f"), theme = "see::theme_lucid", detrend = FALSE, show_dots = NULL, bandwidth = "nrd", type = "density", verbose = TRUE, ...) { check_model(bayestestR::bayesian_as_frequentist(x), dot_size = dot_size, line_size = line_size, panel = panel, check = check, alpha = alpha, dot_alpha = dot_alpha, colors = colors, theme = theme, detrend = detrend, show_dots = show_dots, bandwidth = bandwidth, type = type, verbose = verbose, ... ) } #' @export check_model.brmsfit <- check_model.stanreg #' @export check_model.model_fit <- function(x, dot_size = 2, line_size = 0.8, panel = TRUE, check = "all", alpha = 0.2, dot_alpha = 0.8, colors = c("#3aaf85", "#1b6ca8", "#cd201f"), theme = "see::theme_lucid", detrend = FALSE, show_dots = NULL, bandwidth = "nrd", type = "density", verbose = TRUE, ...) { check_model( x$fit, dot_size = dot_size, line_size = line_size, panel = panel, check = check, alpha = alpha, dot_alpha = dot_alpha, colors = colors, theme = theme, detrend = detrend, show_dots = show_dots, bandwidth = bandwidth, type = type, verbose = verbose, ... ) } # compile plots for checks of linear models ------------------------ .check_assumptions_linear <- function(model, model_info, verbose = TRUE, ...) { dat <- list() dat$VIF <- .diag_vif(model, verbose = verbose) dat$QQ <- .diag_qq(model, verbose = verbose) dat$REQQ <- .diag_reqq(model, level = 0.95, model_info = model_info, verbose = verbose) dat$NORM <- .diag_norm(model, verbose = verbose) dat$NCV <- .diag_ncv(model, verbose = verbose) dat$HOMOGENEITY <- .diag_homogeneity(model, verbose = verbose) dat$OUTLIERS <- check_outliers(model, method = "cook") if (is.null(dat$OUTLIERS)) { threshold <- NULL } else { threshold <- attributes(dat$OUTLIERS)$threshold$cook } dat$INFLUENTIAL <- .influential_obs(model, threshold = threshold) dat$PP_CHECK <- .safe(check_predictions(model, ...)) dat <- insight::compact_list(dat) class(dat) <- c("check_model", "see_check_model") dat } # compile plots for checks of generalized linear models ------------------------ .check_assumptions_glm <- function(model, model_info, verbose = TRUE, ...) { dat <- list() dat$VIF <- .diag_vif(model, verbose = verbose) dat$QQ <- .diag_qq(model, verbose = verbose) dat$HOMOGENEITY <- .diag_homogeneity(model, verbose = verbose) dat$REQQ <- .diag_reqq(model, level = 0.95, model_info = model_info, verbose = verbose) dat$OUTLIERS <- check_outliers(model, method = "cook") if (is.null(dat$OUTLIERS)) { threshold <- NULL } else { threshold <- attributes(dat$OUTLIERS)$threshold$cook } dat$INFLUENTIAL <- .influential_obs(model, threshold = threshold) dat$PP_CHECK <- .safe(check_predictions(model, ...)) if (isTRUE(model_info$is_binomial)) { dat$BINNED_RESID <- binned_residuals(model, verbose = verbose, ...) } if (isTRUE(model_info$is_count)) { dat$OVERDISPERSION <- .diag_overdispersion(model) } dat <- insight::compact_list(dat) class(dat) <- c("check_model", "see_check_model") dat } # compile plots for checks of Bayesian models ------------------------ .check_assumptions_stan <- function(model, ...) { if (inherits(model, "brmsfit")) { # check if brms can be loaded if (!requireNamespace("brms", quietly = TRUE)) { insight::format_error("Package `brms` needs to be loaded first!") } # check if prior sample are available d2 <- brms::prior_samples(model) if (is.null(d2)) { insight::format_error( "No prior-samples found. Please use option `sample_prior = TRUE` when fitting the model." ) } d1 <- brms::posterior_samples(model) # get samples from posterior and prior d1 <- d1[, grepl(pattern = "(b_|bs_|bsp_|bcs_)(?!(Intercept|zi_Intercept))(.*)", colnames(d1), perl = TRUE)] d2 <- d2[, grepl(pattern = "(b_|bs_|bsp_|bcs_)(?!(Intercept|zi_Intercept))(.*)", colnames(d2), perl = TRUE)] } else if (inherits(model, c("stanreg", "stanfit"))) { # check if rstanarm can be loaded if (!requireNamespace("rstanarm", quietly = TRUE)) { insight::format_error("Package `rstanarm` needs to be loaded first!") } # get samples from posterior and prior prior <- suppressWarnings( stats::update( model, prior_PD = TRUE, refresh = -1, iter = 2000, chains = 2 ) ) d1 <- as.data.frame(model) d2 <- as.data.frame(prior) # remove intercept from output for ridgeline plot. # this would increase the range of the scale too much if (insight::object_has_names(d1, "(Intercept)")) { d1 <- datawizard::data_remove(d1, "(Intercept)") } if (insight::object_has_names(d2, "(Intercept)")) { d2 <- datawizard::data_remove(d2, "(Intercept)") } if (insight::object_has_names(d1, "sigma")) { d1 <- datawizard::data_remove(d1, "sigma") } if (insight::object_has_names(d2, "sigma")) { d2 <- datawizard::data_remove(d2, "sigma") } d1 <- d1[, grepl(pattern = "^(?!(b\\[\\(Intercept\\)|Sigma\\[))(.*)", colnames(d1), perl = TRUE)] d2 <- d2[, grepl(pattern = "^(?!(b\\[\\(Intercept\\)|Sigma\\[))(.*)", colnames(d2), perl = TRUE)] } # grouping variable d1$group <- "Posterior" d2$group <- "Prior" gather.cols <- colnames(d1)[1:(ncol(d1) - 1)] dat <- stats::reshape( rbind(d1, d2), idvar = "id", times = gather.cols, timevar = "y", v.names = "x", varying = gather.cols, direction = "long" ) class(dat) <- c("check_model", "see_check_model", "data.frame") dat } performance/R/check_normality.R0000644000176200001440000001751214517245565016276 0ustar liggesusers#' @title Check model for (non-)normality of residuals. #' @name check_normality #' #' @description Check model for (non-)normality of residuals. #' #' @param x A model object. #' @param effects Should normality for residuals (`"fixed"`) or random #' effects (`"random"`) be tested? Only applies to mixed-effects models. #' May be abbreviated. #' @param ... Currently not used. #' #' @return The p-value of the test statistics. A p-value < 0.05 indicates a #' significant deviation from normal distribution. #' #' @note For mixed-effects models, studentized residuals, and *not* #' standardized residuals, are used for the test. There is also a #' [`plot()`-method](https://easystats.github.io/see/articles/performance.html) #' implemented in the [**see**-package](https://easystats.github.io/see/). #' #' @details `check_normality()` calls `stats::shapiro.test` and checks the #' standardized residuals (or studentized residuals for mixed models) for #' normal distribution. Note that this formal test almost always yields #' significant results for the distribution of residuals and visual inspection #' (e.g. Q-Q plots) are preferable. For generalized linear models, no formal #' statistical test is carried out. Rather, there's only a `plot()` method for #' GLMs. This plot shows a half-normal Q-Q plot of the absolute value of the #' standardized deviance residuals is shown (in line with changes in #' `plot.lm()` for R 4.3+). #' #' @examplesIf require("see") #' m <<- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' check_normality(m) #' #' # plot results #' x <- check_normality(m) #' plot(x) #' #' \donttest{ #' # QQ-plot #' plot(check_normality(m), type = "qq") #' #' # PP-plot #' plot(check_normality(m), type = "pp") #' } #' @export check_normality <- function(x, ...) { UseMethod("check_normality") } # default ------------------------- #' @export check_normality.default <- function(x, ...) { # check for valid input .is_model_valid(x) if (!insight::model_info(x)$is_linear) { insight::format_alert( "Checking normality of residuals is only appropriate for linear models." ) return(NULL) } # check for normality of residuals p.val <- .check_normality(stats::rstandard(x), x) attr(p.val, "data") <- x attr(p.val, "object_name") <- insight::safe_deparse_symbol(substitute(x)) attr(p.val, "effects") <- "fixed" class(p.val) <- unique(c("check_normality", "see_check_normality", class(p.val))) p.val } # glm --------------- #' @export check_normality.glm <- function(x, ...) { out <- 1 attr(out, "data") <- x attr(out, "object_name") <- insight::safe_deparse_symbol(substitute(x)) attr(out, "effects") <- "fixed" attr(out, "model_info") <- insight::model_info(x) class(out) <- unique(c("check_normality", "see_check_normality", class(out))) insight::format_alert( "There's no formal statistical test for normality for generalized linear model.", "Please use `plot()` on the return value of this function: `plot(check_normality(model))`" ) invisible(out) } # numeric ------------------- #' @export check_normality.numeric <- function(x, ...) { # check for normality of residuals p.val <- .check_normality(x, NULL, type = "raw") attr(p.val, "data") <- x attr(p.val, "object_name") <- insight::safe_deparse(substitute(x)) attr(p.val, "effects") <- "fixed" class(p.val) <- unique(c("check_normality", "see_check_normality", "check_normality_numeric", class(p.val))) p.val } # methods ---------------------- #' @importFrom stats residuals #' @export residuals.check_normality_numeric <- function(object, ...) { attr(object, "data") } #' @importFrom stats rstudent #' @export rstudent.check_normality_numeric <- function(model, ...) { attr(model, "data") } #' @export plot.check_normality <- function(x, ...) { insight::check_if_installed("see", "for residual plots") NextMethod() } #' @export print.check_normality <- function(x, ...) { pstring <- insight::format_p(x) type <- attributes(x)$type if (identical(attributes(x)$effects, "random")) { re_groups <- attributes(x)$re_groups for (i in seq_along(x)) { if (x[i] < 0.05) { insight::print_color( sprintf("Warning: Non-normality for random effects '%s' detected (%s).\n", re_groups[i], pstring[i]), "red" ) } else { insight::print_color( sprintf("OK: Random effects '%s' appear as normally distributed (%s).\n", re_groups[i], pstring[i]), "green" ) } } } else { if (length(x) > 1 && "units" %in% names(attributes(x))) type <- attributes(x)$units for (i in seq_along(x)) { if (x[i] < 0.05) { insight::print_color(sprintf("Warning: Non-normality of %s detected (%s).\n", type[i], pstring[i]), "red") } else { insight::print_color(sprintf("OK: %s appear as normally distributed (%s).\n", type[i], pstring[i]), "green") } } } invisible(x) } # other classes -------------------- # mixed models --------------------- #' @rdname check_normality #' @export check_normality.merMod <- function(x, effects = c("fixed", "random"), ...) { # args effects <- match.arg(effects) info <- insight::model_info(x) # valid model? if (!info$is_linear && effects == "fixed") { insight::format_alert( "Checking normality of residuals is only appropriate for linear models." ) return(NULL) } if (effects == "random") { insight::check_if_installed("lme4") re <- tryCatch( { if (inherits(x, "glmmTMB")) { var_attr <- "condVar" .collapse_cond(lme4::ranef(x, condVar = TRUE)) } else { var_attr <- "postVar" lme4::ranef(x, condVar = TRUE) } }, error = function(e) { return(NULL) } ) p.val <- re_groups <- NULL if (!is.null(re)) { for (i in names(re)) { for (j in colnames(re[[i]])) { re_groups <- c(re_groups, paste0(i, ": ", j)) p.val <- c(p.val, .check_normality(re[[i]][[j]], x, "random effects")) } } attr(p.val, "re_qq") <- .diag_reqq(x, level = 0.95, model_info = info) attr(p.val, "type") <- "random effects" attr(p.val, "re_groups") <- re_groups } } else { # check for normality of residuals p.val <- .check_normality(stats::rstudent(x), x) } attr(p.val, "data") <- x attr(p.val, "object_name") <- insight::safe_deparse_symbol(substitute(x)) attr(p.val, "effects") <- effects class(p.val) <- unique(c("check_normality", "see_check_normality", class(p.val))) p.val } #' @export check_normality.glmmTMB <- check_normality.merMod #' @export check_normality.lmerModLmerTest <- check_normality.merMod #' @export check_normality.afex_aov <- function(x, ...) { r <- suppressMessages(stats::residuals(x, append = FALSE)) p.val <- .check_normality(r, x) attr(p.val, "data") <- x attr(p.val, "object_name") <- insight::safe_deparse_symbol(substitute(x)) class(p.val) <- unique(c("check_normality", "see_check_normality", class(p.val))) invisible(p.val) } #' @export check_normality.BFBayesFactor <- check_normality.afex_aov # helper --------------------- .check_normality <- function(x, model, type = "residuals") { ts <- .safe({ if (length(x) >= 5000) { suppressWarnings(stats::ks.test(x, y = "pnorm", alternative = "two.sided")) } else { stats::shapiro.test(x) } }) if (is.null(ts)) { insight::print_color( sprintf("`check_normality()` does not support models of class `%s`.\n", class(model)[1]), "red" ) return(NULL) } out <- ts$p.value attr(out, "type") <- type out } performance/R/check_factorstructure.R0000644000176200001440000001751514512471542017511 0ustar liggesusers#' Check suitability of data for Factor Analysis (FA) with Bartlett's Test of Sphericity and KMO #' #' This checks whether the data is appropriate for Factor Analysis (FA) by #' running the Bartlett's Test of Sphericity and the Kaiser, Meyer, Olkin (KMO) #' Measure of Sampling Adequacy (MSA). See **details** below for more information #' about the interpretation and meaning of each test. #' #' #' @details #' ### Bartlett's Test of Sphericity #' #' Bartlett's (1951) test of sphericity tests whether a matrix (of correlations) #' is significantly different from an identity matrix (filled with 0). It tests #' whether the correlation coefficients are all 0. The test computes the #' probability that the correlation matrix has significant correlations among at #' least some of the variables in a dataset, a prerequisite for factor analysis #' to work. #' #' While it is often suggested to check whether Bartlett’s test of sphericity is #' significant before starting with factor analysis, one needs to remember that #' the test is testing a pretty extreme scenario (that all correlations are non-significant). #' As the sample size increases, this test tends to be always significant, which #' makes it not particularly useful or informative in well-powered studies. #' #' ### Kaiser, Meyer, Olkin (KMO) #' #' *(Measure of Sampling Adequacy (MSA) for Factor Analysis.)* #' #' Kaiser (1970) introduced a Measure of Sampling Adequacy (MSA), later modified #' by Kaiser and Rice (1974). The Kaiser-Meyer-Olkin (KMO) statistic, which can #' vary from 0 to 1, indicates the degree to which each variable in a set is #' predicted without error by the other variables. #' #' A value of 0 indicates that the sum of partial correlations is large relative #' to the sum correlations, indicating factor analysis is likely to be #' inappropriate. A KMO value close to 1 indicates that the sum of partial #' correlations is not large relative to the sum of correlations and so factor #' analysis should yield distinct and reliable factors. It means that patterns #' of correlations are relatively compact, and so factor analysis should yield #' distinct and reliable factors. Values smaller than 0.5 suggest that you should #' either collect more data or rethink which variables to include. #' #' Kaiser (1974) suggested that KMO > .9 were marvelous, in the .80s, #' meritorious, in the .70s, middling, in the .60s, mediocre, in the .50s, #' miserable, and less than .5, unacceptable. Hair et al. (2006) suggest #' accepting a value > 0.5. Values between 0.5 and 0.7 are mediocre, and values #' between 0.7 and 0.8 are good. #' #' Variables with individual KMO values below 0.5 could be considered for #' exclusion them from the analysis (note that you would need to re-compute the #' KMO indices as they are dependent on the whole dataset). #' #' @param x A dataframe or a correlation matrix. If the latter is passed, `n` #' must be provided. #' @param n If a correlation matrix was passed, the number of observations must #' be specified. #' @param ... Arguments passed to or from other methods. #' #' #' @examples #' library(performance) #' #' check_factorstructure(mtcars) #' #' # One can also pass a correlation matrix #' r <- cor(mtcars) #' check_factorstructure(r, n = nrow(mtcars)) #' #' @return A list of lists of indices related to sphericity and KMO. #' @seealso [`check_clusterstructure()`]. #' #' @references #' This function is a wrapper around the `KMO` and the `cortest.bartlett()` #' functions in the **psych** package (Revelle, 2016). #' #' - Revelle, W. (2016). How To: Use the psych package for Factor Analysis #' and data reduction. #' #' - Bartlett, M. S. (1951). The effect of standardization on a Chi-square #' approximation in factor analysis. Biometrika, 38(3/4), 337-344. #' - Kaiser, H. F. (1970). A second generation little jiffy. #' Psychometrika, 35(4), 401-415. #' #' - Kaiser, H. F., & Rice, J. (1974). Little jiffy, mark IV. Educational #' and psychological measurement, 34(1), 111-117. #' #' - Kaiser, H. F. (1974). An index of factorial simplicity. #' Psychometrika, 39(1), 31-36. #' #' @export check_factorstructure <- function(x, n = NULL, ...) { # TODO: detect (and remove?) factors kmo <- check_kmo(x, n, ...) sphericity <- check_sphericity_bartlett(x, n, ...) text <- paste0("\n - Sphericity: ", attributes(sphericity)$text, "\n - KMO: ", attributes(kmo)$text) if (attributes(kmo)$color == "red" || attributes(sphericity)$color == "red") { color <- "red" } else { color <- "green" } out <- list(KMO = kmo, sphericity = sphericity) attr(out, "text") <- text attr(out, "color") <- color attr(out, "title") <- "Is the data suitable for Factor Analysis?" class(out) <- c("easystats_check", class(out)) out } #' @rdname check_factorstructure #' @export check_kmo <- function(x, n = NULL, ...) { out <- .validate_factor_structure(x, n, ...) Q <- solve(out$r) Q <- stats::cov2cor(Q) diag(Q) <- 0 diag(out$r) <- 0 sumQ2 <- sum(Q^2) sumr2 <- sum(out$r^2) MSA <- sumr2 / (sumr2 + sumQ2) MSA_variable <- colSums(out$r^2) / (colSums(out$r^2) + colSums(Q^2)) out <- list(MSA = MSA, MSA_variable = MSA_variable) # TODO: add interpret_kmo in effectsize and use that here for more fine-grained interpretation if (MSA < 0.5) { text <- sprintf( "The Kaiser, Meyer, Olkin (KMO) overall measure of sampling adequacy suggests that factor analysis is likely to be inappropriate (KMO = %.2f).", MSA ) color <- "red" } else { text <- sprintf( "The Kaiser, Meyer, Olkin (KMO) overall measure of sampling adequacy suggests that data seems appropriate for factor analysis (KMO = %.2f).", MSA ) color <- "green" } # Individual scores: text_ind <- toString(paste0( names(MSA_variable), " (", insight::format_value(MSA_variable), ifelse(MSA_variable < 0.5, "*", ""), ")" )) text <- paste0(text, " The individual KMO scores are: ", text_ind, ".") attr(out, "text") <- text attr(out, "color") <- color attr(out, "title") <- "KMO Measure of Sampling Adequacy" class(out) <- c("easystats_check", class(out)) out } #' @rdname check_factorstructure #' @export check_sphericity_bartlett <- function(x, n = NULL, ...) { out <- .validate_factor_structure(x, n, ...) p <- dim(out$r)[2] detR <- det(out$r) statistic <- -log(detR) * (out$n - 1 - (2 * p + 5) / 6) df <- p * (p - 1) / 2 pval <- stats::pchisq(statistic, df, lower.tail = FALSE) out <- list(chisq = statistic, p = pval, dof = df) if (pval < 0.001) { text <- sprintf( "Bartlett's test of sphericity suggests that there is sufficient significant correlation in the data for factor analysis (Chisq(%i) = %.2f, %s).", df, statistic, insight::format_p(pval) ) color <- "green" } else { text <- sprintf( "Bartlett's test of sphericity suggests that there is not enough significant correlation in the data for factor analysis (Chisq(%i) = %.2f, %s).", df, statistic, insight::format_p(pval) ) color <- "red" } attr(out, "text") <- text attr(out, "color") <- color attr(out, "title") <- "Test of Sphericity" class(out) <- c("easystats_check", class(out)) out } # Helpers ----------------------------------------------------------------- #' @keywords internal .validate_factor_structure <- function(x, n = NULL, ...) { if (is.null(n)) { r <- stats::cor(x, use = "pairwise.complete.obs", ...) n <- nrow(x) } else { r <- x } if (nrow(r) != ncol(r)) { insight::format_error("The correlation matrix is not square.") } return(list(n = n, r = r)) } performance/R/sysdata.rda0000644000176200001440000275314514326012310015125 0ustar liggesusersBZh91AY&SYzD@`,0 ;]Ƕ8:(PR P B ,@PPPP(PE @@RPH( PP@)`-h W $,h6G@v@\ H P U(P)@(P(PQ@@4U*P$RPH(P HHPTPkTQ) hI PR4(* CP( Q@(PIPI" S =4Ѩyi 4zA@ &iM4zm=SU?U4hdzPOOSOR=OU2S)$4~zH#@OTh  hmAMihhɠژiI!T2"PyS@&LLLdLрLL0L#M10H@4CGѠHBdMjzj~jhh'bi 2hd ML&hL413SM4 I2 =C@==OLSM)JH'hh @h4@4CM@4@TTSTTUT@#sy}G aSz޿XoI7>e"o39g& "!iuژMRI$(k~g7i,g8r\VD)RߤtΧVܧi;iNy}Re/;&flɺ6]jmMwMn{rL&{ݛq9Io nlo yo75<.K˒似.K˒伿1PUeo]_aceghsN ?#tN*[K33332Lih}'!9fq'q'w ԝIzvu~ҷkF۷jիVZj5{j5K[V8pp[[t}NQjun>\8pj\vFQj\%7qtn>G|8pÀp7nv8pvDh4h$:,A'x 4h44h4'y'ƍ'y'g{ԝIt'e:N;;;;;<x x'ԝIpK'ՠΓ<ϟ>իQիQ 4hѣիPj=|( (n7nvѺ> Ѻ7n|8pÇ(((".:tt:tp8ppv(7.cvݻ.Kǃ>>>+x'^!'x'x+x'W^'Oz~Wx }_=G=GWJpîJ䮮+EK EJ°TTJĪ_=>O={='OO{='{ ^GYe ׯWEҞ)iiJR:zvFJRC))) Br9F͡Blٳfa6I (J rQ˗#\G#˗#r9r9G.\r˗#˜.\lٳdlB !%8peQ4 }`<}czG<=G=~Y=~_zY=~ZR/<<<<<<<<<<<<<<>OరML9ONSSR)SSOOON5555%ISS MMMMIRTԕ%IRTԅHTJ. `#2z=Gz=z=zzSӔ뮾`#(`mmiZBHI__^W^y fY!9Y٥Yef22sNi97ٖve_^[TUUUUUEUUUUUSzWVmURVeeebVUuukUUOG^{RT%ISSNSOOOONS9O`1MMMDH FQєtttiFQbIIHR NJ"(r9rr9(ˑr9\~( P% P% B"G#+EED,׷ @P bVZvtn7nj۶mAA@PP իVZ4hAլ(M۷.Ȱ8 @H DQ9 Cp8nݺ tteGGFQiFQt:;۷nݨ (?v::tct]L1LS1uOOuut]A=Q=G]]ZUYVUue]IRwӾ^Q=^}>O?<x? `q|_ ӻ}|_xǐ]ROx;v۲)) JDK.r) BtH:PPSߢ(%QAN#ӧCtӧCӧCD***'-Ѻ7nѣAѣDh@h߿l6 f͛6`44)BP4% CCyxp8p@h?G~?pn(Fa66fafͻ]nfpↆ(J͛6I|;=e6 e~~z{r|XrӖrYr&crbp''&^/]}uy}eߢŭ|}r*"#jľx(7xL!q݉j)-p6%-i7Shj4R]i5Vw7 ZXVW:5LRqC:%ˌWsAq[W(Td`47gA-HoE+쭙yYq[ wJ}Z(Hf^TTjM`;&&8$u6R丼ABo@=qSQM!u{_BI0f 9H/[5VBwCBz=K 5I!6˅xc/W?v|t%/e}S-AQEGITd\HSrJD~k#Ke$aKZ(f2sNl-{es# U:)复lm6XKI(X#SG5zWe_8zuri>^w'?:ZH~#fxU%+ ƺWmE׿C6*n璡<.,N$MliPF`o>tPy ,g3DݒZآ9Dng>:yCcIvSN<^~7w  ˅I"+=d3Kܞy_ٌ扊1EEߣge.\MG2-̔Ip'g]p*j#;:CE;ց\k7Uӟ (zrST{GI4V8J-ʈ{tBrU-Y#JA_sƐBlWqω~ ~xLSwI7xJ[JU-=*zl;=x5T 7,j27Zh [yV!y^I YY}&H|NRDf[eG ;?9&B^|7 R=hKoIt^OZ:LU.i55aYoHXy=-I5Kl-RMPl#C:j@i Xd#8{HChH n5g5 &Dq&H$D'<32tD *'ix }.V "R$79g\9{HeLs-YϢ#KC 1ܑZQ\g:I5GmʑNo!?:C5ueK dqR˅)ڻΗ!3d P}V/ ӛxyz\e3݌Yua DͳkԢ3r ٤<,ITtg+ S4)q?D8hXǯGXyHZ鎕#5iwQr(e^Wdm;K*fWoA9в8g#';{X>?z(ZlB։^< |]C~ .&ܴC=G48 {L~e^,Tk&6YVƟG`qז&&2@ Bdw- 1g= q9@=,sAA3h~G] Z=%;7|H^[_n,JKJQD}ief5EThW9!v%-̏>+B@&U9wS^L]QWK̍oe$N"ތ6CU1H/O -52 +8K$9VG_M*[2G:4~7@pDʸvNoEr&!xayA\%T@yx; /- kuWYfXb'&4DĀX HPK1wusVOj7Oܺl2EڏVϦl>4[,Uξ,wNPlq#FUHh$I<.:mN`xp^T8im IN:!]/Ws6|~4CJm])}G}MK"W>^7xFe#9hj:PLS"CSTVJ 52&~.kW֭#ۏ|M ەo7nj2zJ-16C6k{- Qdm%\roK|K/dl\ÞWۋZFZThGȢ1ПҦ!bV'rQfz{/U-h\oUrT2 ؚr5XbҩVLBЫ,!ѧHpB Oy16 p7vFވGU,dlscYKm)hk%̋4/G*k2w\*D~mDh],$zUո0B S.v[(G) Ew,^m1 ^ vW%9m*:‡GeVO߬ Ox 767;ڰ,-ոOq:tCgF;.xqn-Ո t7TěU[ġ Ou򩼄a7r %"fzg۷tgI.zvaʧWҲy+|E4Sd)PfVQ'*r8r N,\^QڧR.y H,^q}"R [KM%(UeZf2HRq~cK+*gB|ٲd^m)/b69޶7K2V*(z67T;P%jcWcEB\ux_D4൉o '6V?p57!N `j{+qTJ׳ )2,[\ffً0ᄓוm-93e 栮Xwskf-;R) ËUpGi+\֢"GijZDԖ=ג~vŶ2XXm˵aG1 gFJ;8D#TyѱUxilǼOz3nsR+QUطr3wC: UGSo6Byаz6?N,WL(Z$LlCF4UO0RjUVQŒ!e@p"n)ԃ3qI%t$ʍźi<,uN9YaT;&d-=~UcKFmJf M.@ǡ ܛ)0Ժ]h⹻ʡX5glM,de,eJIH\ mG3`|kZI=nȓ(_AS1ntYQI4"#W!C53I+,4-ZbLc[2H&)g!yIjn*$R+赙/PM&SC Aۑg3n5Wӭ;:2[]w`lQ3)$/j*齔Z@^&_w}\\^9rڛ"Ls&RiQ3w˵ӑ3\T .Wν/HZ]2C+$uS 0Rl Qo=> II:nK@s/I-69k%Yw8AIAV_E-6.Ň';iq5ئV 9W+,-낼rq_Ɲ֓?EdYһ% <ώؚ"<Ӆ2 (vB+NbcMr6&rqX%1m3(ELʃID=]jɽMdiXpfJVMIgfϑQщ={gf2DN#'$ 5GOQn Z_/R4qD!Vp3#!+[mmUuvhVA`̗]#=| ių˯tJvKD$eZPkp --#RS=m.tx Rm4 dTDaբ5<۳%RӨL[FRbiT15Sht&qb1ʣka[ku5ಢ5WM̥0n=U;2MM-JpOZٗHymI#Yߚe<$x[]Qy'w}\z2ͻ}VYl5,RgQ9AM*8pʮq[ɆV%usGT6i&6m譋Uel^Z׍(1r-~:R5^o>%ӱy+^$O]sfAM9j> m( ;mp@W-ÐP~~5˥NsyIqFI{yM⻫i@-~L491\GBDYyt1᪭iZC͍nZ׌ [Vh4?t'IF#ȷ-ɩ{~ e|>|ozoIyyyyy{roɾK{{{}e%bX7{ɹ6{b:'G:'D}рtSttn4Z+[r>c+++3y0=ynݿFKl>?77* e6GHM D%m}}qtt||LLln3{{TGG7iS'';pzj1NC)33__ZWG#jxI1g{};^oddc:tcQN29q&"H$u:v:ߟn[w755MMSSSĬ7;;QQ "3իVn`QJ'p1t]ΏG} AE"bb-"ɉ`+}f.."Z++ƒ,Nq H9--5 $v--$MH֍4ibX ZV6662rrr}W#˟(&Y++caapÊ_TȒ""%q%  J$%%%$(@EEv+ݻuz^TjU"Gǿ̔ǒv55h n[^VjkY8p\k:~Oo*JV]%$J(dܹ% II)'0(()! p8q&I(Iɺuk5YIwD$II$HBFFFF9-VU. VUj3UC$䤤 ӫw++++'c]ж)>|hDm6ze{6әڬk2sTUUUUUU[]^{wWWW7Z[unFs:\w*ҭ[~okf&&&&&;=g8ߛo[}%>}߾e߉n'~?|oM촶mgg7}6THHWWVVF}]AGG}^_G"H·}xL'LOA qmv￧2Tnvl[c V"X(\O7nJ6GhUEZ<~[&0j^q^&,?ڤDŽfލ8F2`y!zuK , o+2uN9HFrEV.B}Aڌ;WAY$Txx=Ĩ!WPeHc;tpb=j|^։J/?1Aهh`Uz}*'8P\}Sz۝J&QSU'T@_ui{ݑ >UԸA3ȯr{&sϐ﮿0F6.&ŹZULcgkK{ǡKy#<::O51, *!~jqeY@OA]+\9d΂F]rōR7GǶUrNTS$K6<䒘ZayCڣ^ Cgp@Fv5>Sޔt!oC%!dgZ63JTcTI83EXc~ƈ]4yQ>^MdŅ]n7ktn} Dž;1Sn ME~?I$r8(soʹLuu: afCvu.C/]Ƌ2g}Jc96ÿW8֘,q+Zvh#!>G{.mAp􃸮U*6~2f6/moegkOtg ЇO5t*UnWyxL/T hM+)(tNo|ő \arj=⽺zl hd 3 ic4;[E>Z%ǛިN-)A"2\IJG!5Wr#'ZiDͣDnGQB<*:LUL(V0R\Sv \ЭLG:vn]^I:!d(bwcM of=Mi]Ӵ,;\)sOZxKW*Y?<Q\Ys۴zi-˾1qjJDc)1oe2ոKo4KqI1$Sţ*V)uNeKmϨfwxFtéI7Z[(pa8sb:Ե+zTklJ4TK&T.^ܹB{9,|,z9Av5:* s$AT!=6]Dns`r\cVO-8ej]΍j <kZx)OiFuO \ d+bJ%.Qs~U5&t+2sOڬAj/j6}X7ihgTaUY A* J R/eycAx ޛQuKYV MUw'1>'Jj!BL)-]s,Km7~4T9ɗr!qPZOmܚڈT +ՒzA5'U| :t^M(nEZg˥\tެwz=TSC**C_DTvLpI(J~C+~M=3+:BT30S9̆ Ŭ |Te*W bzf3$TW]S FR*J,?z0ʜaK0\\KV7qrHZSӣCLj=z&wJ6$vVXn~1C`͌[Ƥޣe(H_({U=S9]|Vjeɒօj (xQg}[Ly=7nSjZt}>UCg&SaZO VrF,)뗾حS* 1~{NNJeHX藾BЁ^J y̦4j!nI::|:Zl켡ڍ| 7.GȝAo^ZqU9*y%Y%g% \e6Ğ9r\۾K3JQU6vHe gyw6[5˱)*b69癟wj dF!TIݱE1S~O ?:Otwoۿ~\]˛.okw> ^/c1޿_ssɫ5fGGGG!!PZ .[w[k4_/KTSNi= kkRԵvwfffffqX>;bN'w ~Ͽo/FF#cZFEACԑ:'1n5E"bbbbbq pxII"Hc7KI)))*IIII)(BВlۅ•e'`r&DȦE;:::; Oʤk|Z^C0f áПizyPy5m"2Y*cy|! d.  PPm604i `hm믍Y[Mɹ۷omn7oii;{ݛrZZdmv>oۮۙ}lYl~,i~[mvmHm eeݾ[-}}˹s_/w4|_2h("z°E5jլb mlTW|5u{- @5u{`l5:}?l62y8?ƾ Qu"Qy:lozWl7hDw,ow6]ksy6j ll#%vųm>O\kA r EUN_O-FyE_Ѧ[-z9\W+[[[%8qfs9d̙lmRZ[iiikkssYq6gUEEE*lv9Le9FS)\b+NaYYaUU/v~<ߥYw_By5 nm7NfEL#?7MOU-( _<~;*K91"1ߞgh4OHn\kMƝzɆw> 4|<3pZŎ&lwdyuI:ŭ#j@uLs9/<\ وa#[Zj8uAZ+`9^22fz^+tT@['CDRKAXJ|Gʳ~bx~C=SY68+^TWu.kY^O9p{#9B3DhB$O4R?MrHJ9pN;)$m"Z?֍ zͽ썯[4铤*A)cb&mgU85x,JA-T"kCbxv'%ȅ-S(^3Z%wS U(M9s PR'ݰ=qIfן675zw:8F#b1SX|>jk[kk~2fN12K[\S)e%=_WUWΕ-#d}3f=?N^_̵jծ[-FQ|> ry>6dI\Sy9spf2xϗv{?WQm125upÇbwZ>?3n)k r9w{:usy?ϰ>\>/[0G<+<_Ox&r22#ҍFSNVSRh֏QVh ]?a!=qs&XFưG沉E-$h+ʳx|3xco+Ffٚ${Bw [C^6Dﭴ=^~9#f rw W]܄1PN=ʕ)cPX 3`oNG` $"/1{1 Mj *RWoF|X]mФr'jzL؟^grauk*kzJ_g 2XP걢c@,[\ƞ|\`7ГqV*_l{-8wC5T_0?c'k4YӽVz# oYYjY*.Շ{᫊-;9R#*$@oae>9.ɾYnŢCpے@>5(Q0%:0wz$}/gQ;^s<\&<q:=j>CbgG~XUyBmGG ^D3ݶ,?5ʀR˕PY /}u.GBTl=\J>u)vug$ŌP*(r*h1#<'K0Ǘf\4ЖnZAAMV(df$/v*kL^Tjt[y]k!Q[ زlFLu7KvmPelI0Lj܏*I6*?2Ue%ۻت_&Orwr~j6WT&zl'$B#zԼXFat]7zw*xaގI7UlRu W5<7A+79'k-QzL T\y~&?Gx5Zsyy|oWw _ke%<*RL~ݻJnsSY[[ZTE=L\Ow oyGyz8vVY,w_埿swtU.?&$l{%ϡmS X߇8]EDجU-/{UV7__ڿ1e>PY0Mh| EF %%OOWWT[EE2׿{++KKf3w݆G8LOrq̳_}_+Y_~\pZNƏGGO߷rR?{ a< IFYruJ7U-DyҭʕSuV)郼ɾ:AG+;w{$EmzSNIy{*lIM&[!J8}3;L(XWް^X'.4oq6 L XJj=a8ΰǓQyWt}{V֮?w5558\/}e56 LOiZj?%&feOsNZZ^/QQ7Q10?w;-N7<ɞ{,>Mapo}ػI|$?f8擙j ϡ{//3}N& EEo(UT{=Qe2Ody|O匾79/sZ4k_s&q:^x@q"Ow$Q5Wպ|$)[H?/)45: (sNO>f]Sp7Գl63\e g+ş 4OsQZF%(*ǛpAc .SZiݨ]Otqr_z _E)鍻-4}]1AtՒ4̥ .Tt,%N;6ӄ~y#I \ǁl14.[hO#dgvV rE3{+@+U;Iz01M9 ugZMТ fTr医hdxoI<, dsTKP6 pG?OwnmMM{Oy>ǙBe {6NT+6J%+N%$+)k3/˞_'o.ryiM4[vZ0o>Z[/4˦Ͳݵeerh%B< u4?gW|[!~_+e?_ƞ?nw?^z<0%4/{ߊg?w`mtֺi9s?%e_CBsNN 3YKD, }Ur3a;b$k]R]fdP(>B憈*X`~(Jڮ mη|;5G'&cGk"ݿ#rC*_S|+ycO$+m߯؟{2Fl˫"[Y_my #zv3WYF?X_&FNjjG2{i-Hdۨ\44bW3QfMиw'McơVk5[ҷĦn,kXk H!|p #s%I BVxTquMns"pWW0m }70ziXw '7%bW+bcɱv)l}'Zf\=ùwo{j7#.Nor.T߯z]ر |MAR枎HD+[JUbIãcݓ7g %m.w9 SKM}@9)EalJGG &Lg3p^ …z*_S9/1Akn"hLE *s6p9 f*.bDȰT``(b/u5c1E\_|z&G\\1٘dap\:pLPS0j9@xZ"h|N 3㙑ɘb࠸ɄxDBJ@Q@P. )␓*qP5Qp,291ACXc ku+!&GQp+kD\82!6A$ȜjpcZ$qB8G%Aj a*&<0P(D1rDP.f\#pPD\0QLG1ȖAAc\\P"l`)"`"NC20Pp\P8. eB"q\ +SX9*ElT݊`(2(*G ..F8 L#3Z&9D&` aS qud&bD aspv`_$sr18 Er!.dH#W+I 2#T* r8Df.aqLQEPl#p*NҴ%B$֎G! #CVdC+`ᑉAsUsԙ6es^`r& Tʁp *&GW#deKmp#EGڦq"Ȯ (2L#\Er EL\UD" (lRт!8.5 CQE8<&B8*±Q "" L!0Y0\̬qq@&<0*dPS" q0lT PGB(1L05(\ k:9f8zS&"pP9m9#H**D +.W>&+aL"É\]up##f9SDZ 2[n\^96G 6L+LȻH\AQMp! TQ#!aI0S#"bA0RL\ "Y$%53Qs+sݥaT{S$HLW0.TS"*p D0c25 pcy TqZĨ"-\Qqv|aR*)Sr!݀u\R"1LR1"2a 51jbDϫp5+$EG#&D3땩^18S H3d MH\L,) t\:[ \B$Dp2".")]VrL*HujxkqdyZTZbC3\5Qq#H!x1bݘxqȚEqApP*GThK'`~ôS\«AAqCd,"8ƹP\ű!&,;kR.±TjD.^Du#\=+vg1ER5B>_f;&ab*D󕸱1+EK!\Ș\i-.bg()$21ALC^X.JS#. d\LU3 Wb.ra-\F~r@UpU_ gep.<21NG:XB8G2XqW/a5q b8,x#|tٕ \Sn8T#&g=g$ N S ud%" 3U\$)SqN&% uȅc8 )Tp[3qȋD0ȈkSu#".`_+ˆD!q*`+L5P̉ 6"ApT6.b֚r53Q..sb|]&W waESpԊI0dHSP#c#R(0fz;0GRBы8f\#ZA"Eles6L\&kkUfI-5q#32$@GE&EpdUd#r&EqB$[\`)UlQbW\jL*3?\.Qp\*T#aơ 5,Y[dݟ|"Ɉrž_Sy WH~; [Ns8' $ VG5( H9 D~x6pqX^ҤWDAr")NH҆F**!5Rr1Qs 5dj-ME,üTv= j7aP L\G*'8M=z'6F9mJX91٪ʚWk+^lUYY!&"&]QNG S\%IVGHW77VًbrLȚ-"盠vm!r GQͻ 2]p \BԨWMHgoɻ^iXo>̶F9Td1xef'9[֢%<*݂u zj.bW52 %AqE%f P`.}3_o sԮ{4GdqJX"jdf3#$ %L$E@Tc+2JH&.ujjEH$U1W3o$r:LPGH*q L&"MR3IUWUrjkP*L u0XdqM+X[`(EHmS"`.Y f(~>x|Bd ]K0ʉG+Ypq˳T()pQNNsB292 G /~9 \*b9MvaT\#\kRRIfbs\J常G?+ , )d x$AOjkT#mn٬vd@Fײ楮lDJɄQPqrH)R2"n[1ss\SnE˂8LNLR"k$##r{#؆jHəZ83mY93l(mECK .@Cۄ ,c53#k#ZXĈ]vg93zʂB\L_G֎..ԛ>+ٝp㗐Y/r}YlZO-0$\#QL\y'ā6L\HO%V׻(.!6FB|Qsk<^<9P-8zo]= 7y3brvkvjɖdK=S|N!X{1br.6{eF #!~Ilqq5#QzR\m[wV+N k$U%yEAKlME$] pgQ:2ʩ"6\H)9lvV ҡI"&,v,Hr@N2lb{.Hbb놿\1pזc0U4bb KJ*Y0înqP25X%Upȸ;7`uGK %WbX'Py+PqeQ3Sb$p? 䇳 ) 띰H+ɐMIO5LX']G/#XNB;&R$Jl=T6iJ# BQFE噻/eEqN$@ԂqȨ/[8qUZAv_הy%Gy-fH"(MF1Ŏ"'fxcU -kI ~z݋b0;.c+S8EBnPG9#,HdD,.T3zvS#Fʊ vb{nUP__U8〦2D͙6^JO-sǮ_7d?9aXz34_\97jȐQqp1kLAz(ȸ*96LRB`BdYb M|sEU{КW\d}ZbNț]>xfxU9kj#d}.($I?j|~%"E:"`9\WV̝pX~<٢IpTe}[N^첷ϖ ❏j/!{5qB{#Xfj5/\[auN$#ʁ3r9dN>|ڠuɳI:䘟nWq<ٞs_$#(}U'-+ICE`(}9@0ixU]%BQ5?[<1|$dć&DPvM+QN>/mW8}{g6dju W4K1wf(M?&nq\V(F&~s6H>^yv`ƶL/ ʑ9;pBr1H*2=QW,߫o6mlj:;dL[em GX*y"* r ǖU $Lq_$EQf:dMjBLDLGJ5.BLS F`*9+&EcĮsjX8z0v/(Gk*Y1( $TB5pސ8HCՒg,Er89ٜb"cer( %Se Ē9{*qlMT\|:3+1D[9$PԚ^j(x A9fD/^99,ۚi-╒92lq &K"Atk 2lٽfo:r9"5%HMWqu'fAG;!Yhm wZ)r҄تld$Ey,BۄWOXNf/G*lfm#&|/R1s\ko)aPP_&#Pvof+:s5\-u݂# M'&^rxv͉;ͺ$!#YZ@gP8r9,GdĬϐ=CĎ2!MHVgƵJ@b  Ǎl1PwI1[V+lWYl2aa*G:NFgm; qAtOś*.9%%݅d܇KkԞrIJV紩\'&ń!$Hm؛lbrQvlȮHC%u3lva_W#vy }n3f&EsśMh4%=FGȡ& V)L'9iIK7&^Ck,gkiNˢy*y4?SDu_~l)')D^H $j{5nT8ưpqr\werߍs+YS0'nR/(|2=s(ups~55 % #i6ټg pd& "`K!L6LP '$N%Eȕ#î LSͱR:Jm]`j(SNLq0\r٩.;j~RbH!sƾHa|a#QJv͠Yxkp03.#y[*>L/m*G#jF>;ORʮdNWꨛȥȍ+]dS7eV*QkIa*eFo8$dJrfԬ{&78('HLGH{~TGuG gG5=<53\.c .N۩GdS #'ZCK1r$CV˲͌s<+ɮDjipQW#8KN^vY6aӈj-^QGDyt G2^*bQcN&(Q\DDy:u(Ȃ99$fAL9bw F{젽nTQȊvE+ ,LF1bf';4_+:UF6{%QٙyɊ9DlUb!Zr!l+9w֡K-8GX7߭,(V0\˲y_iG|C9ʒBEp8N7띰\/nMg&X/w 4رT H[Ő[Hޘ(=Vf*M%d㵘BLJɼ%\Rsg2[豩$̉VQĊ6Ap#Ȝ]P5Gl"R휷QÍH9msMvNJ&H'ȤpSk6TxLM <{N&nk[0dF5X5aכ5lʕ2lf_!OUJ9`!8ڡ:N̐G>R-JI&EaΛ(}N`"EɒdVA\["E7y܏a^o752q5!QsS∧am'1sG2/;c:,̋ݺCl Y>\$a+&6Tra H%Px%JGXv; 9 YxWB*UN*X$-99ɢd1D&)\[2R|__6]||)MRmYwIӵ\[3)6Z.lI)#eGm>Ï cz2ʽ&ϐ4#ۍ3w݅eD%3T-u[HxXJVRw^.D}Z:٫ᔡ6uDţ?d7SK))2c1bWqͭ>+sh'k.$k%m3n:{N~!W/7L:orc;iD)0L :*H7,jT/!v3.lP C>CԄgA鶜Cpڥ1KkKƍ=4ͳ*kCX7{}sV̹{ %cYr&R"HV=9TTJyFb!L]=;*4=>h27|ip}e/kxx҈GS[`zĨ'-\466aiճB+J=^.ō7] xqm.u+f\D,d)OP|SwUx1: ϒ]X˖v^^IHY(2%grEC_ NEuX[ě3,Ǫ%Ȟ $xH#Mq$2d=pvjL g28 ۯ֚!&eL`o9yӑ媚ˋ廮MۨVYyp7}sU=6AiNgĊǸkxCNvYN[fzR~_UJagWѧƆD A4ϯטO>s4G1G2 GH"b./\2I$̌r!1ȘF/fQ#8,P0D, H䶕) .*)1+8TX"E""'$jVD AJ& pQԇ$/%q#aD+L"AqSõl$ f%Jᵕ-!݀kRcP T 2 \3mr%J\"D `G̏ ]h\8 91y!b1TY$1O\& +{3\os+3P\#ɄH2YSy!sKd\:l#1WXV1>_njz9¨c` A3lȇf^mWE p.W<\X৯vk˼-p(b}6w{f9SSP\D ^7pNm29Uj'!'%^PGW ͸UTrzLdqrD(i$1\\;f<,++Z-׏TS+NJD"6 9LvF\Gevg"&Ku =*`6eB+:08'{e"BaavHغEUI'E@ԉ"3S\2Qr̉frb0Nu;`q8x"K8q29rE Dʄ0n"`J5 ՐEB9a oi9üqslBBȽZL߾SB#HGB:vg9Y"b+"6,2-EsßW9o7iqmG58q[ɫ)*ֈً,o=?R;G*a̼wN,"㉲(V*N0sS%׺m;\J=_&ͽoa#Xym+A2EdRa.IZٕ#<$&HMHY9?(dqKwQP$W;'y5V{398$~i v螼gͦiGB|fJM;p"=6MC'lɻ#휓R*R S)ď\Zo%rKE ϞKV(Ųnqq;ۿtgl-íSb]̎D4bHJB9Ƨ<+0qoGpFB x_l{]\bMvI8qs2o&)Ur~sES ^pm6MV2\éfc Qׅ$CF肇Od>oz>#͜lpĩS5 ǰ+EXB9Ry0XͼF]w$B9x#7p&qLSɋ~wA~İ%lKhDݚ0bB[H ]Höi$'6:NI#Xj)>5&8|ސ-;P=(႘bH"Î-ipSXB$8Nwhb"VLr>{egY$HP--׼3-iȣLW9'x٥B䊫"G{}% g`MbW|}ńy&pԸ<gϨ]7]fsVCa8|Ji\#Ul/VI!uS7a y3҉$AlN<'9x¢eȊ3j=iv܋!)r3d +œl=!y"2qqN>fJU)ѼeNy0T|bk8!ǎ +ԛ5ݹYɕ!9 8%xxҵkH{>$U:9#I2/!f.#&%0y s[ q%dJcbOLy!oyK^Pu"(ɝrK$SwNCXJ8>XbԂ4QvhC ! 6oaG<A+q zJB}No $qQ염Dq,Ytz]Eϩ.[2B|+W>MpDؾOZq8eeَ97e7vV`˸X>dq{EUDD ϒ第~f|ǓO}vrG-ȅ<ArHc{#3{mEX$Ò*.Dy5>5䊎 Bb0 bjZ쑄ö!"َ̖.kB`# R8 fELrHO;DLkDRIGKRO}HLՋ7xM 55+TZ6F`yfkfɐWXࢨ6Wx5;Mqkٞ]{&(o*ULUO^Jjr *'qJB3+xR8ʇ$2UӉldʮ;3\n9 7ԙ!)g׉n^HbDM/ƕaPq[`>LT5\슦呭2!jFdK2K9` H9NN8>?9 c{I4+4d/s>ҧI5 L>9Dye"$R%y6kp뜑M^}PyeyMv BI801"Uswx~{/a‰ZkT+<&Ŏ$N}Nxl$NkT^.&kQvШGdWֻ*cQ[[kusa":įӑu[ a$dn9ǥq%~m:Rl6;0u$7"$16VͻW2*DhG.Ԣ&TUq+!d6Uqs8MD"wˣ0,<9mvZV |vE3gresqo'fM[.SoO#ٞwYb[ Yk$vrؿL嬽^Պ$ҔG]nΦ /[v!K4 {Ѻ&/4_]htIW׽w߭+EI y.r[OI|3'$9G4fa$gW,Y$GUck5[*%##\ފr-X׉Zp\)R&I*svDqdvjyyb/ᙩg[jDĶr.!!>Bt:6H'5}KG FrrbWMJ,$rk 2xKM|Nyڏyo6]XH?%sH̶+"j[W59yC8\R_-MLȸjW*x\=jj*L%[F@sM&v/'y8Y6afg6(,d9ٝrɊxm:ۋĊ5&6dY!0\nZȊ-Nhov⅍"h OlFߛw\QqAkGX~|nlLH:F#'`VY+t?'?S8mE7/.l\*ə󜣳X7xZ5ɷt\kV@=%"o=vT$+GE7 yI优>˶^ʆ#+6|HrJr8JOK##{ d0<yJ+?/aӏNrg1Yy8.$f$l֔̈́K"TI9"kQqjDxHX7cc{UB sz&Ueق y>nM-JɑdN!ϻ)뤗8r2q~pSLduDXκS8>Hs<űH%Ex_$j:kN}lm! e!#5k${:D,Cs. ,~":f:쯻lB1Vq GEG7$(u 5Ţ#<]̧f1P& g : ;T{ 75\I>oGS}xr^7 6NDXubW-mvFHB0+m9o Vqc#(5+ We9:H=7'Ԁ긿m#3q9{m\giD5ͰN[U^AxMqy8B#}Bz~ϧsL.ȠLkq$RGk]l&{(k1Z&HEH%|moa>5SjsŻ9h>(u'Vy.dckn|q{=k@ylBw1"/o9 䨟oYdO#apS#QVWrI俉89%tк}vnO#ݝ|o{y cvlxr)[N%9]KHe^:ka>rlc1 5l =s]S;ˁN1q<(>ȂPtKD&wZysĚizgO% :UCbGV~]DyԒ;TChT_c*YDldz-\[4nIg+N5ϴpIuWv0Y޵!%&kE7m) K#J"%ۿBPK*n85AKmTAͭ9%Dq5/M/MH1-ܔT%؄ ܾ“([P2ǑiVIZ*gfbSZGcOS*|ʹ-]K;.ja WZȕhuchǪr|;,W}^)23Ywi:Ye:ǡ]*ыރݨx]U.GR3㭛dc䴄r'W`fw"N sRRLe& HB @{2:%1 2g|wCW*!t['JkLcZbTWXb{uS}K_"m [<Z/>9IƲ[JTxq 5BQMh'-tYD U-.d?:9*YZd['%չǍX$n@ׯ a^Dٻekz`1_Tϭ"V˞nL>Ze"+t&uiL0[{䨉8|Q\ ).J1-SݍKl-7]&s^-<^V!M!!Q!3z4ƛ_zU=/m*N8ƌ(?{XE> ͋v* Iq;yr$g@wc]n9!-9EJ̜Z&]XNPSNE߻IFfR߯7oJI kO֨XFB!ŸNM.L3GG[W3\?n">j<^;D,OQUm Kt-r継slX9څQ} 2~Ǖ:m; ܖSOoR}B*=ID(쯏Uy{Nha&ϓ^:ވ6LuRvsd=Ic籶0[dՏM+kۉԿ4Lz1@UNg35sX,Gfޞ/)z7#z٭V{taĄp2zD!n5)B0N$Un*Z)z!={N5 ¨V"ON} ^*rL.x{ƿAr+#ވkTdta K7gVaөE/M~L!ळ-8p8^r|c<i%5fHՈX]xaIV)]bjVnd'̂TmY|_ULع5uztf,͘CGXU%M'N[:pz%5mеaU"qǘTO^\=dyI,6Eu_U?Tx= wpBV]BOm6IkT0%_a/$#A['Jut3 oi (fg^cz'<셭{ ý>->+i fyޕ:2ލ(X]Bp1a!+13-V_u s&sU#lG0E+ kDۂY=QGU$سX~$NkgA˩<ce)<6nMvd%*y) H;Wu>+gz|!1^>_%3_- aMbCla@,+U5UfNeXƳk#3K2g#e蠭)'B7@eh_K+b|(Ƣvlޮ픢N;w IVG5952$a*l箄I1$3.*ބV}l>{#&M.o$Zuwx[baIjf1w.;d;ն7QSj]C䌱R mKp%q)Ug]\BV]:JبW܁}^=yd1|ZH}1:##^]Jۄokd/!ga/y \ݙlmb (\r=JkDs=~nsYVA2ꑐz%]{USC#k1xASJe/IқuF%#<ަ4Ʈ$e՝`S`a*{)wJeCycit,M-9:9Z:΃S2bD)\%&rU$Bb!͗@>kN~Ւ鏴 =Mw9!kkEEC!D˭wZZ٣txc65]b9Vv}ՕOrUڿL6񘞧2 ˍh}=Xi:^tE'<0׶A6 x~;]]C4PHMtYai,+%Xu#8oRf_V#e~V4G>7l,ѱ=\^ejrSX$؇HH>R+o,%AEYV=Ek%t*l."D8c48LFv})Z=&.x]{jLzEFfA PQn=EWDOm1 )q$xFr[ntu8j#&{IĴO+zM~9{/$Fe \ߚ.^7Ho>ofԾ;8O Y_[#V'}Rޯ4YQid"q~Y܁yِ|@_6bh4?so*s ,鲭z"vu7;9&SxuDvq=>ݏ(s_g笄Pl֫<1S*xy M4$WF#d6 3ѻ&PvxtT c|ha^9=F:/5`M_ gQD@ګm% p֪qɎؖmŦTR{mh͍QvWFDֻl -v)q |s2A1iNΈoHǪhkRXVyjQJ7쩎(`5lbOd\Qo{7(յ%kQSQPmЮ\RԈt 6Jhd<Rw^g [Ů>TrL%%~ZSuly w8VRzT.Jl'O~O'yO(bejTXK58,cΩ;uEDͼi3ؽg~?yj VE+俹|#"ió:C' ~;ʧƓ;§<4CRY`W&಍)%yZ7P@;X15lVC j#KIƹJ7r%u-QMZ5iM"87z~%r<1fYvI]kcw\` ySӛUܔ'- 3^˨=א ū'[Ui L?[y5y~p0όP i+!mOCq2َ.Ģ3qtrFTħ1g 6+ЀG+:fd'g$Q \OX~16G!h&;ַb"}5 |Ы0F(v]?5EJY5KvW6HB eAB[lOw/m};<Ueh\Uh=Ʒk>}ֶ6%hOI % h)~]ҝJJo4q~DQߥ[o"}HĢUD$9NHmYC;3Dn4][A姶2padvBẉ7{u<#%G %9Zt NWejM (ujXFw2{_si1ɣZCCP.;Ԥҹ)̓80 ~y0>\Yդ=S6i(.|:HgW:8+9 冬$>ywI{d:/4kHd7_])=k]%PΎmͲnm(wy}"Q7M:+ٝ~v#eye)T%JY\]1%f-+1,O)7_l.ҿK:¶5᪐E)]:S'!yyRr,cs%i㰸=<8%rӺ6!łlٴU!T4rJ N1&`oe§^Ɍ}wwvn1盝W_jn#td_͇W"nE;C /(f9e|{B?~X% Ŵi[L SBYc^Ĥ8ՠsdQhʰ[U4Z迍b~Pb _mGɺ3!Yl.3EF0-DD TIzꑐ6ds-TM: dYXM.x 36Dج '*l- =FJsJrnEB݅6&[̑ޱ`+w,K5të]b1h@q~Eh2=ˊ*GMA YIԧ<.tLd7(l2Xa ^*0zoj7GT"WeEZ1 K ,lѶ^.xAk*Q3ac;jDa9 e<{샴z̄rp^HW=įywe UW|ң_kbemuI-;e{YUN)̨)"YF8K|o!%np`kɞ\nKC'"KZx7]r h͈rbyXiڹ#*Ăg+;jDHG4 +:A+zo6f@ӹG/zW&z藔k]{ZsJGIwuFa2"]z'(-/^DhGHZ{g =HC]z"ƴObS;2iZW)^.mƂ]\jzvfC)I8cϛȘbqr<-ĕu5TI H!5[M\YM'2 RbM<~+]'Lc/ ꞵ_{N/ |^ⵔ3`:7 uK;9Rf| MVcZYy[X*iy۫\$^b,K4(2VTpqa"iˇ9näVtsY'9L%U]p ʞN^TQD2l][$W[6AOˎ3ܗa)HǤ/<1I3Sp?(9|!U2./ӟ1Wj1~@S0#TS-ΐAK%y{9k+u\ȼWFeyk]쪵X;@rM2G[3/$"JQf,#K#5. SrZ_>W ̼kX< cJ,7t;y|Vl_ui)BDˣOs˧k FČqDё}+}NݐOv5;dȪ縱렠h ]R3n!RoArьU yYWe5J)dخ2|]4I?^{TAgV_}_"֕ZeX_Qc䓚$fk?ŎMs12%PEcO[#yc #@Bkraύ+oCwXh7 CVag&;i2` 4V*mB彾)Q&%>2=2 Oj)g < f;XKiҘYxd Ү(SgRrNnʬ+{Q/PGXt񙗒|pxn/2BW}۠)W.Cn,\!yX?JxjDE\Xrz0)/;ݴ"enP5jH7w]()Bͥ+*ţE,ɸcuJ\l fw|Z\7wԏīCv_%GadiWZ֣)z簪.\/cZ0Xɶ$?a&AյL_†&df4r %fói4fqRcg.S*sѮaX':kQxzYir,̡-=J_;[-f 3Dt6ti5D '? ,ٯXm4MeklG xxߐ̫,َS¶WFnfY{nfrQG)zXM+a6zݫ.Nޥ8 ]ƴ4=9ҜBQ>zJW2jˏgQ#~R]A'iIYY?;-FZ/yK\dЩpd 7Ln/3 ͵Ms=5d4ƹA̴ݒ~K7HnmλXEqKW6#O'=xzs-[+~2BUD_L<%"\OkFO+ӹц io6 Mn7z 1Ǎe,p\^4<]tYڴMO)߬f7|uG{adzSJ-<9~4=Vnu*Iqg6%'V)*?ʱ$gaԂC(#-?L f!"A9 vSu_ {%kih{m)4K$UyLٝJʧKl;;Y4< .W*{7_EU=XnOP9zҎ4Y04e5"qno8٪MU#ôYT4iwm8?WRa¥rY&eQ%555vm[kֻ}LYx$dyO>}>HZ8 GȾl銝3HͲQ8Ϟ/~99 'k"hlQHt_=HUi>%z)C=x \dBu)`oo%#P!֯j߄S5Oʭ';Ity~Œ EKۑfأ\w9rA\f=i{ޣ|D6A+ad 8Ӎ-DNdR颟L+2]v/s sRuA@՞I&a TzJ-, DW;P;=38e*[$#͔$Lڜ)`h䃡-r\c3QӫZ#aA/Zs4\^wq _}lل 2fYpgmݍƌ.FdCb!/iAߙM?uꑱ)SK%%$- NTw+[Gn(u<z&7iS1A{ucZ`|| %#K%A<톮K+Dݪe`e޹ޮuvqTn &Wl?g3qdt]uMVwUrn'mL8`M>)dsuɛ>jݰΕQGxh:j<1=Zކ?z _͜LG0C= *e:Zs,-!;~dNQvt￝%I&HqhԾI%&-:Wr^oR#gZLiVIJB?2ЩjhCH~v"lY/pxOU3P^r@}AӗB:s\9NY4SW}M4r2+>ĝ-5mm<= :JWB$4>K:Oe<D+ŀJx[GYT %cVoyq$0>T&jN&a95;wk'1Kl6c5H{)FAz[$ZQZ=Lo4=O\TaOުwO/bG+fU^}9Fyغ[gO5ENTZ=(xMK Pڇ:KYn;+Ujg$:`r,: hΜm|+KZh8lZhs;"22_ҩK)l"ɻrӗOK*)uke4Ս{Pնt*ܗ7-"p%[u~EzZ%h3+1Fv^ZYћqόU@KĻ# .H_¹+,yWǞeC)!蜪1$ZjK"Sv!X(j12g&v)Y'ķ!. iLZSK:4&T^ΑA%Ŏjg>{֭w02e='g=tpf~h-6ewk3Z;jCvQ~.ɂno:Yő69Bb/u ƍLrG+Ʀ7 Ht.p)x&+,+_QlʚcF@vٶJzOp]ibud;v3+E&Ą W굠ژjP}Cc`3ygGU@kO ))WJnv$)=✷Z]tL6oL\OkތJCD"ˤglV3qԌi N5blG1-~Ѓ插 j枌ypdH\$GanGrb2F:oy\Uٮ1=GGoe^i跈I]YhvAA6PZXD;SuNobQ#1;k2˨Hc4('7z< 'B#ȋ\ez]Gل$8+u^o/CScA Gg`" P Wzm<=\2 t֋$*Mc6CFm/ ( uOz>θzՃT޶vN ^{`[v@LXbt(J=]Q岉 .NbpjHB򳢽E.y 9^ޟ ,& etvCO;#=>{Wz[2g_W: 9'pjp%bR4yc1:\c% ?n ]UV)HVnĎeZ#5Y $d_gZh}9oZf4w4.|^rҏySJnBAM4-^yKljYd:A$U58uNw74Zu±v=ԆZgwdH6zx]I ~=hbT6kWw瞲*&;Y T{fL'<3wy/J%/&B1&;k- gVj'JeDEi+%0j,6emB9Fh L /#N>-2+_ygX΂/zQvCC@)ƞc\lҠﮝwF+UfYȟ^W 5}_L(-#,S;l@W#lLqMҎ Q_GرN@N$c֥%ob1V>q#+?˸P6GTQٿGB98+J,w6nî-4P~W^9.ܒ1EUgx%YWx{^Q :mCU5 q9KOll{׆&J9PQ?LQ]!%{R7c )JV˲xo81(>nWLKGbnq@w}5fVͅ3[*^tn^2g+Db72'(q,0+%wjU&JL $D3Jן~lg*j9&'wlM+ u ,N65e ?`WE}Gيw:1O)?)U3o A8쓔\0vY/ DfO2WB LTz>zAajݵ~Re_L/v _qN/,OMgVZ:l-VtлG]Wkje4R2]Tx4D}Oӥgt5 Zӽ2o3s} wVj+R)P]Ulxҿ>lzTW,TATg6YdQzR^#m6궆v6Bj {ځ"A~RtnQ&r oTziV'Sۺ9}ȉxזXw${{~~_}[-c(U>sh)etT MVh]R܈Sd39kǻ%VTH~)LW}'pcM n<ޱϕMYiJ&&M=/iQgtԑc?Z}h =̈́@^()IƸlHW]&\d=}KG$W4{eQPvlIgI}=6Ô٬k.awwcI5ʙdVAVz= ǕDB8`r$NCmR%ZtxrJzm+N6uC.ɣRJ*@rf~rC N zKSe܃餸+tEN\nJ: 9.ũB[ɽʙ#/]c[\J~嬔AA XÅ [k>#sRtw0 ߥ^;++9KRA#ĶP&N  RysdYU+[j֒#zBr[DO섗BG;2yf 3?p>}ǞI9I XNTAsԓ/af9Z{)#m%mKߺI*Fk̊$EHdˈ)\[Vm䣱@ɯR  Zwx `UšV,Ü#[*J[rckJqbDC:΄5jK;W ?Kȁd7!PhB_x%VYy ~3JZC*W[22c:KkX+Eq&}VMu>.hyZ W>R2)vD^[,aE*nm 5#]›EJHg#2RL44t%Pe (!ɿ$W{M+gg+^'vS#u)0o[2I]̝1ِ2YVɘə8~!_1E(%b$Tgς[?m>_24a3OyTr2Id" {f%N!쩠yL`۲TYt'lNnFdsFH{:NȺ9Sa Щt9<+qomYlYYz$"$S OdxźSWG)\rr}/o)q(pL䎄D urSSn44IPUF5rK>" W(-]Vt$y BD`/=t/i anqH-׋KPJxu-o@ϵd9a]4,;II3j;,\jAbJF$ V*ab+ Iy VBwE{FL>͇Z Ha|fpѪhtOMZPYƦ ĵfe%PM@6U])A +@WCjngxN4Xck*$q3s bemX`˸9zWfos/ ݅w,y8!<S):FQa!uv?6\n\Lv 邇:zT@yYJ&=;z )3ɽqj͗lQK6*q ѹ['LPjbdTLfOY?2W$dPm>|q_[`\d֖ S z[LFU q?a~(MĈnV=261%ǁbbr2VVTژ;7|rklIhր{Kje)up+TZ_Ný.bx57i7ʉo}2)xmݞnEn.yu+¡p.:j|k]竌$wW~#\T8HUTv.mitӗ ^~,Ʋ{'v=x>]j[RS2 8儴 5b-k'bJѾju\ lłxkNPb[ a@u0+T1fJ]lȈ\6Cl,zRT7*CWʹPyi|uᙝ,=8%: M̑"9bspvi^X,Ihrm:z L@tnΰ)TO󫏿3JQP(F}ʃ+a9wX%2Yul#qfRaDm<4''J,NMڟ qVeˬbtZ<.bgX9iIDY3mOU*Eqz7aKEd*O`3K6!uLTaۑ\.5JÒ* ܡcɫXxUk|H:,$t%VY>cXuov+َG~䬗A%X4#H6fvrl57Ժ'W9lX(}*]{ޟ(MbuŤ~zIk(PQ( hOXxxTKiIP{ᾝ,Z3Dl&Y{Ie|rn/d+]ѮgiZxʊ_IbG]uo58U~-^ǛbZqjI BvMƪ2p}ƒbӗ^,&9*6U ˗X/D#Ẃ0d.5ɆCOЄJreC[;gnKJq],W4rjH|S cWtҒ6,J{i+XOlxבSs[ wu+ZG!kA!TwϪ/'L0Ieg蠞R듀Q^d-3IUɓkWAc_#Daj@|'׌$(6G:7KONzQdgSSV5Qb"Lk?d27*ҴYؼ,MYTFRpgw0O-^jsL8u2#FDo>5ȳl59ڤgTIO8kiTJ47'\<ǟ0i񌳦|vm1v8Qȁ@mN/O{VY!b i9/`w˹u_&=zaAYOOhE"b&?&?@W'J*,,H"a =0bD &$J0ߡ(PC$B"||| B&Oha@a>.`"X Zj}HKO>9Be !:u!2@Ǽ $, ,Nt&Ќω%0 B#p&OMh<6(~.T0$:HVZ%_X:n%Ή:%`oSe'p0ueY'TK;pxPps A|@ȗ"\CN! xdLȐ||Piġ|=0<ώ)SPD0P100?cGؕ(PF4hPBJ*V(QB>GBJ(PR(P0hQR}СR4(QB4(PFJhѣBJ*PO(P*TR *Ti\ (QFJ(PZСRJJ*QF4(QRJ*V*TFJ*PRJ*V*TR hԩBJhԩRJ(PBJ*PZҔ(TF hԩZԩZѣJ~d@n" 811VS PD`bqT8 CD(`TD``% P?z 'F OA1d! ft=@ 8bGA=:H0`@}0` @ބ"D1$H @11B$HB$HB0bD$H"D$HB"D10#d!# ?! "D`@cPB11`֔hPB RJR +Z+Z(PjT+Z*TB օ (ѭhPhPjTR*TBօ (PߐU PT Z֥JRmJ*VJ(PJPBkZִ(TRkB *TRkRJ(TZԩRJ*QRFhPB )OѣR }4hѡB ֔jTjTBJR ֥J(ѡB (PB օ )J+Z(PF ֥J(P(PBR ֵJֵBhPB*T)J*TBBJ֔k\*tW1A3qE+p( LP\B0Q `Q+WChPF օ (PkZ֔hPhPRJ*TBkZ)J+Z*ThPhѭjTB$HB1F0cqB1 @$a$HB1`@HBH$d$H @1`@1bDbD @$H"D"DaB$H#0`@! @`1 &.8!@AA\L Ҩ9A 2`PA!b n("noNkk뮆hkyYz4su55]}ֹfx<}=ap88pp8aì8tOsLMMM X7773CC_-tOFnaa뮻fffyf뮺ho444OFuixXXaXiuh뮆zz5]t47z^^]wц1ޱ]MOk\SS]t45]uSS~ u] MMy멩kF;ю*h`kRc$c0c$c B @$cJcDcu 1`@1cB1g2$H0bD11#a @1 @ @1d##!`@$H @B#$H#ӈUp@8B # @`@$H#$1$HB$H 0hP)JRz(V kZֵkB>`@ cHc$cc$H @$ BcB DDF0kjjnx9p8<8pÇǏ;;;;;Ӵ;Ӱ;{=aavavvvvvoav3÷;{+N9 ``aaFKļddeFFYAeeeeOxIB!$^x^x0 # Ȳ"Ȳ ȰȲ, , ,,,","ƬD@`X"YXdXXYdY<Et]Et\]tp]Ep]]p]]p]H)AA R BAH$0` Ȱ**********EATTTTEPTTTTTTUUUWxdXXXYac\E\t\\]u\Ap_0 0000 0 #00#0 0xQezPzVCHd8pa !28a !0xO"1D|` |bpW`@CÙ1A/P "Hp4d8a !4ІC<xM t]x|x]4]*Pb@#uNnkLJK=* u`2BB3/}gE=? \_<&,G. .!$ ~"f*.*& b+" bcf*cb I/䵙/˿-||K|mG8 3+M'&l:T6n$#GZ0v7deq f$/4NZ\DY, H.2EJƤAH<% HǨ<>4<ؗV:V剮\8BcC.RvcX@>"a&[gH*B1݅?^k]gZ'f]9;!qÎ&DϮAϩn*c|`+S#/ vDDQ /rNr9ʕ8rdK'il^R[j G bfSwjU$K$f88W?Nql8|+v]$' `MJX"􆩕VJUҕ9 f{{[s,a6埳{q3X!ʟIÖrԔ͐]ECەW(YQ&/u&u Dlݲ$'i^Ϳ!̩Im86S,8'ͻQ<Փ|aj:5y"#}rGل/H;#^><ͽr>I-\VBBKh RssaZdL?TT~ ?S؇('GlADA/T{QE< ? bQ~pXbD(ApU`!PO`mT]c;rLS8`aa28VD}Y\G b .D5[ (ka(w.3Q!r5e˅jE@\L&fIez'#1TSȒml=[`rY< CY Υٿ^;S\8ݕ(XV%|F?,<|YH8WbqpJ#u%ɇi2bRvbGfAVLxXY>{۳:+ZAduIٕ fJlI\lF$H3 d|Ǒ$!s!Ԏa%T'`j/jLp+ˊ샴WDŊ{_^G&.c7awlQslyAqMy,OSVTV9QQT \ํE5Gry ^^DPkĩvqMqDWlLȘ.V2A$"TwH⩮a,". %,Jmws-33 Ѩihr~(>c20S \U_$D\0#Ws0qqcIIpS?'H\$D#2 (`*#*dB8epP6 UqT̬r1SR$Hc (pP#Qb"b(. W#(*8#ĩ9WqGq̎ . #G¸.f(Uu#ࡂ`D9࠸.QL H#r1pS8)qpPr1*##p\%$2cF %$̎ f(" W2c&. zz3P(/b.*@]}6YY,Jj.rG Ru'9*$eAźx#{0#ț!%{g=#_%Bl&kGC\#l)儳*)$ 5_zMk, j1jdW,RbdqqH9拊x xO%$zt%=zf¯fۇ>啩߽>~~Ϸ"3$8ɿ?OvbGk͍r:389+XDR?.ȢՌ8rv󓩍)ǏsP&/ fsڥC?!'\"3-)$+T3d9V,7xbvY;P\(V:2N<'up~r5{t2<10s\'ԉJ^<7(#8uT?$n};"` Wl¢O*'9}YR嶢J+≤ ТrLvK".MLe5]V8D)ɇ&Ŷ62LJ`c^Ks'㘡I37`XlV9SiB0C G.^8~gǹsܮ0iLIu i6IDO6sB*pR;v]Yeeg;8sP+Zg) $IR-*`wI6%$sP֪W|tBH}uD8gc͵9|t]e/oUa&N2RWX $-͠R1Xn#sJ!1Ggv܎VJƭmzÉ,SVc ݮ̥̊2dq6[9-mB#ػfE\gY͡R<ڄ+,uHBJ jϐ`L{q58MFw`9K''.ǐ ;8nG\6?[i,H7axxTQyk7B]Z v|\|٪B|rtMENN^I0,8-vIqG6CKqWȐfs~Wyjp~k#&F.qv^]>VX6}PEpTsGQ#!2Q/ԪZN0B>9l5)Ȥ1\P ~!kx|q"홛&pWVbTX&.*̈́LRLS8k g;qbq8GvlڝIdqG2g7FeCC(.F:G*A* b.kS TV8ZCPU mTAI;3Ώ93sU7>[!y"7b6*W rT[J+TI }.TRbj3˓Xym)7j.9<W3\]FJw,GYV2*r]p08rK"?!bZ??{<6f\\T\Y&D$DH1ũVV+Xj `)$G.b2G1ʂLccW&CI{虮kI5m!Buܓ$dْ4R8ȰT+Ւ7~ً땶։O6'fWE#Qi3nH1-,Y+21dz:".c1HD%~Ds Bb)ALN|\UG;9O)DQNk Qp9ȑr3fq+ADLs+`VvҦŲy&8îY4#c&Q 29p8#21pi; fT?$xEN/PB8Yd"E@LXGwuT9VC#(.Yɣ{HzFmIb榹"aL 2<Hy\x9&/6dq8g͆UsXvqhqER0`3nR/upD^{у_EFg? ?70 08` * fUPPPE 13193!D $L3ዘ p\ LS29j ,Hf* @낁U^I[H#m `** $RHc5#L ȑeĘę%KeJbD*" ąȬr&XqTApP L\D@Ld"I15#)TM9\\Es3\$PQAkcE+Hp(s($rH*. . V .Q-XMGX$D¥W1p#\#,#5ۆkm|rd T(!&V9.ej*#Sd"D'T$`,rDdeLQQGxr9Dqg!߻= oQGbs'&,qO;H"Ga+&`0Wc3 v̍s -jq8Mz"smEs^ 8$9r)ɜM[]X,EGl;)"(a08ܞ^D)L}ȱU4kܮk[2Rt'd+|F9́S~RXs,fmsZ"kLYypWi$fc"6bOnݚ}[ԞH** "V]r jjrujjDw`TD]I jVS[cy-쎱 *Fj$e%A$S|~3CGz*ֹѝy'f*nV=h@q0XJ]Ntg,ϞtUj_ ȇO8ͧRg`RI;x5TQ"[2HXH>!E!=b/DGg[ 5q_כDف!D`Y$'jQJLES>gg<sKYÄy [ Dqy"XȶKk@뮵y'fVr*IgjTS!{dʳ+0a#X"(W+fj{T5"\֪8Pr(Ԃ`.Qr Dr26r? ?;2P*p"rd^w\P䀪'LxȄkGsZLZ"$lEA"rƭlLd@%l !ݘ⨸Q_ K1AH(2_nMB8D\2$5d֓!AʹNnB*v3+*T(u0Z &z#`S H!;Š00qH GZ D̘H21ȋrF Gfɜx)3*s\'S`CT\Q0q5CE*|uYbԝHf,5k]ۊ;qs^[r??=uep_%os\W䙚Dőcd2&s*֔BE5ʩW^;f}9 "..Gx6gRQHmjĶq{ѯAxN.\.¡Yw"E@=ȊVCdTFC96n8*Xfoa<d5u"OCT'& u؇ʞ9):'nغ[{ @lkP݈I]r9ֺ1RASا-## 2!7LQc՞wC֥ݭŒk[Drb9ݖ*VP^G*[hsI\}̎"/O&QwH=Y N?["H+>>9r23Mۻ>l$ZYsr&몝ݼ^L,lHNPv;F7b~rz\Mx|9,NDSdjeV<4kJ,égD(r9F?s<=qό~~$ fVdY FlZ͇r#|g*B:wMS\Qi: tWfw}ɶ"D%i|n>AY*v)kyw͙x*"oC*yVTa_dQPF"]Du MEOw7y&DʋM96^@A\_\݇N̈u{9|J8q:Wdcj N;2 =5ҝAvoU `X홍"2fq㙨(3 " U<+1"(n2LwƟE2j&(Eى[q\櫊]\[ N$p#&EE d28l >9tV%^Rʄ۸ᢰr9¢T]U1qB96j.V ssGɜqB$H8G]G +o!) Uc;xj(D:W^:{&T?P8 I{j eG A2(fHkL,#cI#py Q52ku˒I2[+l[H*QP\I lXza`TbF8CXXQ|H'G:g%C UrP8;\OK"q a# Ef䄧 hvAq*bu'f(AT H8ǩG9;H$C6)!Sms&+ݘ\YG52v-[5$n]cE-TT<11s, AAH@%r"l>]h01D1IA@U0P6%Ouq!WglQz9w킩9X{p0P B9\#uS+R9djr(' V k8~+}pӓ!eq|es8ubC#&eXb^B:}I#ȳY1A b:{>P\#T""!!0V_BXI8"a'8)Dȅb;#(cEI&,ҔCĨW2 DĶ:Dq(⋚va3]b#LH7٩n슫/&pHH#9d:{ 5ȋjԮVTfVrfA'^9q9\\"dOC.\\ G3iۭQHq~)DڨI7ɆufŜr%`ȯdij $@Wy\z]z{e3_30WGǮer300P\Y0,aZm`H00 ?[*`"`` I#c$穩8(90Lkd6ZDED"Dc s DQE̩$NX6ʖ`(222LQ\U KRHV16H̎ X6$)iDw$E,Iz,INRqeOԎES)&seKeK97ww⨺OvdW .0a$¶aE\Uoq07- 9.e,I->lkaB8.eKeE\Uĩ8"bABHLdH$bpR(LHbห#) ูDA#L -IF5L"2DOR$g'llѶQf2v/!eGjl ă~8~~ 'LoJOtx:QCeۗqk1ȕ Bd,HKJLFVeީ]`IVE Ar#b* I݌#9˦oɝrH{n":SLjT7׌9xqȋlHְ9b/vSF/Upz̏dd=bGE3G>9_6^p"JTa3: <;S9jͳ@XҮe$8OR!.k}|2m?pF,t,FX&Muo䑙S҈oeл]J"!Mq +4#vQ,O;,N`*,xqrZl1&nn"XQ,<y u#ǒ<*ȯ\+ҘdLWP RĒ3UA]ľGȆILN>L=z@ -`A2ga- CFg/9gW"sY :=B!dd$A,$4d{}bֆvY:Rɉ[H#W+i"rN!l24sX=GNHhR dl÷!9e5 WR"⌆DT_'nR9GR!P䃩ĩ̀),Ŗcf\jE1{M'¡"Ol8µH!H#OPPRIqTJ嬉$u"q2!"=]ں׽I5ѭhB¤b(r$sUU\-V!qȐHHFmۑ"22u-̎ $Œcbg !DddݷdDTG8ų"ə$\sO|HOۦ[بsT&ɜ5$E)4[\Of{UIV.<'Ɔ!{7!G+< :e;j-Y#Y젣Ro&8;-lr|w~?Gu+!&#g\]H&='dUƲfFů˫T_}|;>9A(CvufD#sdMrn2~O`xG`d/?W 1|{̯3T!d;'j''{Ρ?~"ѷ*,-kh9>q΅k{+m|0 Ęf,YcIFH%tɄٙvW:`feXrt3\2%Y\I3щ dEsÀ3s~:MR*D1?4q,Gc WdeXJRdpNbIk$̈sLQR'o*d# ß\bddr ANxgU>Y&ܐWXFLuTCvAԂ)XȂg!焢""FqFq&`û3;Җd[aa99޺xBIMHLO֝mTO9L6*Y\λ-bdyٲh((o753J"Prx#R[* )1pg2??S|?yG~#?"1p#I"8)#Bdc1cgkZG"I{fݛ^nwoHlV1Ͱ$r!I I'axWv˞1 !Ó-,_vq-45XckPJI%0]̊F[DRvq-]Y&h9UQٚ k`$k kEly9n8(`.Wl9KJ#I",ԶW qW^9VXdH#F ,8k YD8#_r;zmZAyyOr[+vڡbKHUqT#Uyf[n\R$H VH#.BLQ͒d&>1AUqTr1ȐbA\Uvܶ Ilwۚ4`{eKg=c$HO$HH,\IEpPq92BHu ķ#(qm+@A r1Ȏ$Og/{=ؽy k"=. \r8ײ9Ă8; &syA쉭3Z61D-mq$ߎ^6Gd!^$E&Y2wM"+c2 2EESݥANR,¹V|sfG_WX?-y%gTֹG#ǎOag\JOv`DrS6{LqrT匏:TFZq-y^./.UgbH$wLԊ"c-#*&QH~l ˛w>yAv5!͂$H TnGð'$LuMKgs=Onܭ2G c=ڮ!x'm, Cu[{f Q[aypʯ)5#UkZx=٪2L)ZϏ6y5ɏե82=cfnό//͋\{ߜyԌ Ouq sY=<-sm (G̵CC(uȂRf9+nṰY񩸤dje$LfFkkx g6su,UqBs I@fqJXr Q:#.–Ҋ*-)m.;Hr\ܯrrkkn. O$H8. O$XwrK!eNL޷wwfV<)8mpI1HQC,-ّ?"IA1ȓD܄92DvDdyI?R#$EDUL__z~boώWY[VFcMcC6&$\SnzrA_7d0kYܚӟ4xu3d m}bͳ+멋(Oyv&ʚ17LQp:EUzlVzyP^p\;EHdAH@XO C/hQ #E2CYamJq5X_vWU$mo1j.)&@٥5W Myͱc#RvC#ǎ]Ɋα%$v[8g^5)~ _@XvS$뢼ٗ~T|^;E\,4, *,jRX&:8:E@\+f}\m*HQ׶-BIO}w+>? ~T?)S&Kd:c gxvBaIQpI\&IyR"GQ5w62ˬ$`lQpU"y8+y컜{zQG{^gsg!#K84BlSOd,nncn>wt&ɒEpAAK㑰%LZ[ Y/-;`|%Iu(<_9FLO>ֵpHmN0F?}/Yci';M͘#zBYO<]Չm8fG>+7Ms{'I"NSx8pHi׍vLa,>i7'Ͼ9 Cͷ#9#^C;ɞ:)̲*@"{3D);NjNFIǓuZPy$Ov78 32 LKl쮱H=nirEǨIS~UC=Ogr~ !RR8q^Ju3aDs0 QHnT-pUdȀMx쩇=jR L-lε|%S ^LB G:P񈼑U3?i|f vdB iflX*)!s7X+91T8Qt'k1\s96@DI" H?v_< y6dH9M/bc\X d!8D;䮼|# Qj̣IR#/.Y8YH(2PQlٴUŃ$ImLrۜIɩZO^,{!Wd"Q2[q(ݍ>D v%)5:O;9 .r,rng吏r4C!t8+&>m9VC~]\|GAg&Yxˋxi_"TuUݸQHITQF,œG#d\Ѕb,$&~ZKbZ AّrjAƎEB1ߕZIƧ<\Z;cJ)Q]SBuau+dD8%ni- dHy&DY=G?g3~mĈ[ԉ,"F =yux͙'n8D!hP\JXAD)D &+}9 ^8Xk EsP]yC5+Χ\SF qTd?*r!4)/8 ڹUҐdG1v̸J/nQe휙s~ZASdgS  LGw:={t{J Xwd r2@f 0él33ac#0c ¦fds09dL30\S06 aW0YpfD\07!&A'& eKdc 5۫\p OD24pmZA^9AN$!ƹH*(."[f=Y 0X]w{B1D3]"yonF 9 [JVLc1x#M\*&u[mkC0AHHAS;i\ʚHq1I"bGXfGmնM#HmIEYK a$HXVI[MВ$@ x#I$8kjjmIF."K'+9#M""|vGq)'\=+."( NswKr$}/yQOZ֡ -]|i;2HH#$nIxZ$F Z8K`I|m `ks~;u=Iz#<-*WfY"5>~3_ χ>V/|@KZ>yW,+sot1R'sƥOYbV LG5QD\ $k28SDPgɉ"C{qOIS354'Y^Sy7\d$=7RApחœJHEdK:jʣH#6ۥ"|q,&)4T !Sק5Ak9!v&_!,2-j?^ܦTs87p&&y˺X/[+͑v,~L>ן#ĶH514Ob2*5(Km _&!lEQQ@\^B*(=If[0\."! YE~8w0~%s/X2qȎjj`U+rdx!f6Al:󧔴\9'd\^& O'78 m!q+ȚGP#0*Y8(*B(HK\:N ݖavG3zl5$7fb6°Br;s*jW+}/<'^C*Tr$C b HpwiHR͒>9q ȭx+dNH<^Hg;"!"=u9a,Y ŲfC !D5 活2`CR61Mfrn&k >jOwbG9upE3֒`゗}]vu$/dp/!P\TdT8F9L" G8L8!\ h)#XVo^/q{u}%+A|{yYe|$ 'Jc Bɚ 6}p۩2Lp}G-RHb!|!&ӎu6iHK!IIH(.  ɭHGLUQAW R23!!-UaD3b KfE"gX<P긹N4e%\Y2"c+*L2Tvv܋|c1cWlNsmPanKmӋ+5dpRH15^?L E"0Y"ESF33vt `JQ<-;9)$s :7flսmMdsMTU"F#S))EieԌN?_%m|*AP\p0_Ig$_6ms+y}y<ǛX dYez,3Ȝm7!W9c͝l?׿ק;9Yِ:.rB EzjkSsx .#>8WϸpW~Bk{+!PnT|BX2aɜw#pSdqX9E (䅂:~+)F8Y2 |(eedLָ*L_|p\#?|x ijcxMQ1DF#!ɑͰI A)F,Bp8-x3w=pg*9dPJ2r^D3rr[ DM\k+)RGI3Z9c_i{LH9xvkqXdAb~ߝ _.$dȗ ^@`,/6gSo(Ta9xR ?U<mJr9BWtњ666g>y~ė9OkUٔttsy'?\c|yy=dsABG6@F4Z̲Cvڑlx-\WԮzɂE0b(ozB&jY2rGUmqAkr(wr9\bVk;"Ď`bbF(u89UGaL/(+}7^LjCBFfȫS!2I# yﰖaԌ2wog@=<5ASvX"T#)HL㌘H?Ufg 6x)G0Q^I8 .d0T_ +lH .Ka89Yf(slK̎I&Y6nIN7;&ax榡̍qGf60~@qZnmFHqY*DY $pwfSʝH8T"Txo)6N¸ 3(T9dr&P\v!QJ0^lQEb4n )b$$FH5B1el {y!m_V' $OR5%׷%vaZfBClB9# sP]ڋ#5`5ّdq.%I0\!U /F=ƽ_קReW?yuu$?m)a1AsͶl &el-kl"*[\.ͅmmKf.V$l"D!45FEO)!ԶUITWqW$EirGjuX1T>(;;[nTBPPRb88ԋ`(rZwm/^жfG0cc#$[KkK3|$Wn3_FG\%E2'IL$r."zpC u&;&G"R ؤuݑ̻YXiy e$:8j08Q깄pU1r>L5E1O$88٫!ab!UpfsXbQ*a|s-S5' Ɋ"+jA\j+qp"ḍfl-Uf1TU!s5Įș95581fY kDcR/.♓+W3RV!08Dp90* ,3R$$RN1>y:J$3Les&&-a#񴉃̢/Pq:9X&)rϦX.EH}&^I 2 ./\"j}_bWR"D6$6KaTBHrMQljb9~?X:g"5[KW?"a䝒dy"2A\c1(qkltԦAmoMI@\Ud%nۗ$&#r)W"O\k ']vuF L$pSY F5$"ӬF =)m=QmO`E6X06{%S,f?l|/b`dc[DD$Rp "ߏ\cQ#$-[#WfHuᕎ=<ܐc5S3Ҏ#S"|$=|V?{ *#A:݅m3 D63$[}KekQ m9". 8&$:#1 2H–l2d$Ȅ$k+,¶ʅAWEɾJ6$'IXyIAó֖6 'a ?_ŝ?x?{=H SMbC S6 _plNWED) *b!8̽IcUd[m9ȏ&=A3HsaUdH!k 7^HT 2(-[>H0WT͚5[ X ;lW\rÎ5\rqJ#fNODs(MIgL=~&ɝ9ZQq&)t[flOӿ7OȈYOlȗ ˔u;"#cE+WP$ɞlo6zM_8W nBjHIE+^n'#gdsY-K:ꠧ~q=V3-&gG!h9f,7qy0*Uy9bl; s]s\~vyy0mu]EOɶJ]O˼Y2OM*1G&J6ڞuԄ$ ϭ?W>Ow"'&N?AϮgƔO?sz9WU&.x7|TR82jnS.9v%vD*GəKhDpdm Vfs{Ԃ/!*qk6fPWYr$B8 r28WRW#,* ǎkLjztsABqWXq-K <fAE1ܭ:K_$6d\9ur1!#fET's$sɑc qI!"u퓑r9N'lL" qG, TG53&(l2Lsy0&]H8f* Ts/G垵b*=HqC'%q,HDH϶ CWdtp!P#dfvLQ]#(\LauL|3x\ݷa cG5:Nεsds %j+Jfy\SRDk l#8q'6D0+G̞FI~u3Ud"\ksIxRìK{8\ɮbqY(ّF<q|^ιW&j. dL ~A??w ʏ@T$/:I%W!,``g3\ L3 șfO ?-a]̩fpkT ̥dL29Șafb-FCmȸdE:G_vbF1OH y܌Hj%mԌ &T+('Yv6wvywws\HbAHK¬-lOa.V,dPdb2Tve$ȂR A[eyrI2 xΥW|~yN=HFvl=""ƾ]d Ad k9!!)ҖhI6aR$cK%d ֶʝ#[qînj; ,Hc06\_\uxČ߫_{wwnjVIHbF<cI6V۾+ RܒccmTn1`"$G5`"1[gԼ(H>Km_$d0qq$I&I ym]-WQNjHeK$$<\J"x}""$z=N󈤜l3S4 Qyk6{l<ݒgtRvI&b#$V"R"mbId$"7$䓶I8#__?~?g?خ 7m9-s7 >5e< %DqQpF?h~?x,z]S|+ksv5H=gFY,Q@$vD$U?yőU_^ź?{uJULڹiNky񑩒Әvbh"Zo|c4iܐ$@o$4]#¶`ҕzwv;,`{nt8P)ǧ{++u5Cuͯyt'pX00cD=˗V,Yb.ўpUU :JID̒C 2{S#|o86 ` *fRS$遁0h#s; pYt+CbLu_룣2!A٭[9 WaYQr 'F O+2n;zs23c+!.L*!3$; ^yMߌ=74q\@ta&tJ"wC "[Ku1}t`[$0XR@{gm~s{>3м真ssֹ{#Jt|B9 r-g*H+R<_WwX X:A.N0KbXbJ>1E.R<|GBqY|,'Ø! a\mcf:mT6۫uk) E*sv0}3_z~[o"]˷nF<ݵ<7ymD&4!D.QbǘV0u$AA֔(S!W9 RR|bK 0L̒MiB99\5(o@Bܕ'BbVĘ) ŬZիfFf፩VuA;`Ht )O)BkcM͹~w8GBt,#puSpCI؝fId4ū|ϸX Q]P P'䙈!w~u3SR烗1,.'XE H0*I o{ڵ+~#|pB* 2``ffjj~#}$!B7P 0)1ݟZUg$$ v2z9JϒǑ[/ 4BdFRr楬XZ*uҺsխ4zVˡ8h#Vɔ9+ܩUZ(AJ0sྥC\Gd  XdD3%˗WrE)$ӕsp_[Rޘlᢹ.`,2c  N;H8[o4:ܭ] S)pwW,D \lI& q/vם9[=P@gv?g>mֽ,c#զ+Z.Q!e`S ]eD@əbӸդVvNBYJ$* BԄ#cQBj)C8֗y'>pi@R)W$NkVmR8]i~78J4`R)W$ &L\`br8sj|F`utTK$sdްI*IRI'wf-MT.%2`d"TDDF$f" qﶼb=vQ(ԢĄ+B8Iwmbc=֛n(fFQbB2TA ""wZŊR[<FPXH:vaL,sYqDC&LHHBa/r iB/Y62] Cp’0.^˗.\x(Rz}/0* . ,(ps <c1'?+J䵵O'5G@t!(yCJy}T鋗nNe룬u)Nyc;.Գ=ȰJedt0tBv1v<Hm<~=龛s㿴y?>W|?'?!r|-ns - , # :7˷n`0c-b9=. S?)]ݗnˣ1;wqcW6mƞI3\$6% \ t&TBs 1Fsf#$Ģ e$~o/=̳./|?@?ˀqy(/'!|!'|h{iEG瓓C- L uXLrBH&BI$0GUhtV]NM _P@pTul&0A61Xs}kiVN..et @+_!}ymn]vPA{-<>#*XFLsJ_Gߟ6oy52g_)j:}y4~g,FpGT ^a@\;.'e˙4_73ZfiyOwsʼ|F̿>! F]{°T0I<~WzיkJl2zz=yi<tJ%HH² ]>/=IwwunNAw֝b^Kpo͑B$^A@* 2|qӌTJ9iʛSIGRf;DK1v }56^˼]q/N;NM#G,`pt;,z><Sdky?y7ykԡ%׻'  `$8*yasǹ<[{ލ8uߓs=sw#B8X$+\L`}.]u;Wkslv=κW-{daa!FB$*0I331 "-npqtl:iJ20ua$ !ӧ89)<3q]m7a`%]:%;,V( a\Qxew}UӢS) 2a˗|Nv6P5~ tj(V!Q.4F2a˗{%9aֻm1MwFE *!"A\˫S1jR)ƚT5ԝlg|%HJ!Xb2e6ZcM |pj"Q)!9?pt2aaB+ZPMz :qCtHJ!)$fWZŧGBh;M !(ԅ$Ivb(rs5KkMEU!B TR;5RNy/rh[]sHD(DJqө%DD "!DV}c&rQ(bӨPA*I!DADBiﵭkeyUrJ% Q:u H{]IB&VJ6f4dЬ%p4&$u$KZŬYY6v26 \YHJI(hM.Lr$s홟6 E²ue"bT?kХ 1'$9wf| Y@\]`R$çwv005W-B` U3mQh,Jrx?fDCD@EY-C:Ks|Q(b&.鉆kkMZpqmmM(DŃP .8\HO|83 >&r[k^pm@j&, ,"TJԪ$ŭgmzlppD)S vWt{X4J [m6*&Lfx]~iɟ,Qdăp XB "㔎wڑ:[YD@bU %N (" tkS9mKu(epS;2akm/mR)r <10r/r*qȾ2\"CAH]!z$.ffn5*q^n !tDrTyv;v;vvG]u{ӎܮy꺻U9 D"Qr0DD("0"]ڜB (r0  V(w֕߀@B8$R DI̓$I$*fZ8Z*Mԓ|!()Vu!)wqwݫZӍr{[RMR& D LJħR&TC^ 58w(D#Ep2x,&feNtB !Pu( bw30 {EV6ք`PT" ӎ;?LZQ"j7P((!:+wqw O'^[.UBQhR4Ka%8b6 0] xRu2ff/<0f7jֻ󳔱c'DBUA,2Îwr\wb<}o-S:~vr,dАHJ0ņ$<33ڮZMyԉ6DQ(( X%@㄄33ڮZMt"jm6Ӊ"Q(HJpCI ɋxjD?,kzq sTr%!'28ik^f89Ƀ@`U\ C@I I&!DDF2F/kX {kmmYHQh QGLBD>-Zԯ Fqɸ)VBL0\u#/kX^wi.qny}ͷ)wX$WDSEאR~]vf,[ن8kۈ7rw!T)@JRDA81urKZŭwmt1B9\*4(Q*k` qZyU7!ÑbB0kb7{E]ggd2`:00aJ1g]ݶuk,."E))]#ADDC0T")N/ԬCv CubQ(iR$wwDslkI:ŔP SP8ˮwノo^yn8 йR3+HJ 0sz'ŷޖ-}8PE #2# !ݘ^#I{^t!)C¡€ČBM*f!qcZnFQJe%b˖-n_v/k_zq'.BE",H$$.LJ$&fIfsk6G2\EtX0HH\!1!*OL̒!DC ӝukgLJn&'.@HA$1*f\v- ]9Z׌>2ϜJ.RQ R B;8/}ؾ\M>3ϓ"hE8f~Wˉ_\)@UD,9㖱bŭeilKIŭ#fr͞De!pB%NIOtA{.Z"7ŭ9f"BȲ\!RI왯urV,}Xݷ/{>Z+m`Ee# C92&k\RkZfZZVH(U@2O|D2fafla{Rm#kZdY N01!!!*YekZֵe{RmgZdY `bBBT8阹b֭v+CC8'gv__=?}W>韔Wi~w#/_//>A(K//}#?S09l?'_m}8t,,o;rOW2KI&Q"D5Üo#=w)_o-cj$Sn]mkmݩbƪ+̚~ZIZsyjRoͲ7^+qxvS}=2ܣ͜Ÿq;|y2rqN_*ݯ1:WE((z54 XӀwP_"ߌtX6r'=8{n&5>e{{/ku-< _#TqkrTW.xOSKj(-HuL }\ڨNZcR4۾8cՁpJ˷eQߜu^xL+6MA*.;uEhv&QM}JxC^0X4T/<5X5W zLj 66ھSss'qn<`jk#Iȗ4[k>Ob^NoY۫}[.sǾ~yf6P6Hp<S5bAS'|T5ϻ=yֺ#˯^o:VZQ.;,0\oqZ.+rB|٪'_6ws ʵi6۾,[|%>[]pxӯuUgOCruS]ttǤߢ{ۣX'.pjC|5co-RÝrvƭlMUmO=dmm:"*B.S p瘨^P,Q:_آ'sYk}rk+lsTf'bٞ^S^cZpZqɧ&|,: U+f<Ծ%9\O_mϧW6Z7oC8i~U]s59]s:ڒ}vwŴuǔUmnYwu|w_T'] --[,[t&jk$Ʒjh& W}4m=BtBfA6 [A |Xh ~* M/>*{| yG_]Uo.*[eR<3^ \^oͿ[ػ] ]w=뷿ӣs[ꤿԊ~Y 6Kd <ƅnM> Yuk~t/TEꞽN-~)M6dyׇj5ܥ BقGO^gTA.RMh󺺷RKGK Qzʬ9/_9{[֝nTr77RN)>(LkF(TiaJ87)UIqEVh9ݞ\7px`jKȞVkk8m']IvF㊛vHKLr\ɮNqMjtsb[ǓqHr*Nn\ۅﶇ%k_}Z;Ll6-fUQSӦ3WY۝_]n˸Ww׹kʝw~9\;kTme7EG'('A1NPkn!"YDR8HP7b*U]WeTRJ*M5U椸oM1|`QDiskLRhcTz5SeUjW2QkYiU7k{J 9MqP˴kъ*X=ow!ݒ5 A(48;u-UF=1\өrJ={Sp_>Jwu6FoL*滍}G_S[}gkEyʼ mAK G.aT'w)qKR`mȡJMqܨtէ$o+4ڟţoqh̔޻ɩuiQTv;#P…oVnYxdŪmrDjwtnp;mJEsN42d݊حyy0ظT-voW-GU6İl5jTی k^ӭȾm_?* -QXл *~UxBeW^Vz xXU^8}y{Ζ^>ŋxUJ1j)z^>wߊ*5<_ 9̿$ߏm]+>rNQ'w/_> ƛ^?9t3vT3 1E?ǠTevdt}~K>Ͽxӿ۞} bgrW3{Uu?2މ_sWVbh*e߅OLbQV^޶:{OW1^]}}y:]rEw|[۾O=#^v&~gWQov7^Օ:=g:Qu3Mod0[D;r3}uվ\+;[u⇜9)x7}U}={E_}zlGgcJyT3)y]I4h]\:=ŋ6Oo<͕Ǜ;LE/u\_yz<'ll` 꺨*@*A]vFEкUD(D(uR AH)%IRT"J*Th !pWpdHd!qN5MST4SE2N2HR)R AH)D(.d)R)E˔RJ"HRHRJFFFFAd,q\YAd9cc>>:XF>>9c.Q(.\WJ2QH) \.!99&Id䬕d99+%dHd䬕d97.d%"H)*T%EQTUQEdA@P @(BAPA@(q]WV@dFFBYAd@,ddddd@d@dFFFE]QHRT IEк+%d䬕U۹99!9999&Iv5MdVIR)Rd+%d%MSY&I!tS)e:t5N2MSTe5MST0)e*TE7BR)RT"J"I*IR)E"IRT%HR)E"IRTE*T%tduQLSLS1]L)Ӧꦩe2tvU R BPRT BT P*T****T * B PJ*T*B*"@***tU*ժBZT*] U*".ݨT**.U **T ҢTT*T*tӦS)jӦS)e2;nЫVTRTU*PVPjJjժjPBT**T**TU*K+`V+*ʱX*X+bV bpW+꺯^"+jJjժU*JT*PBZRիVTBTU* RTҦ˜S t颚)0 TJ1F**jHjXV+`V#º+׮讫0ºׯ^\¹\ʲ*¬*VJ꺮W*P**P**JBT P*"** B*"*"PR T**P*T)jLšj:tL$2B*J*JH*B$2C$2C$#0*bhšj:aL)0jS)je2Ӧhh0)Ӧ8*T* * P.*@T* RP@*TRP*C$2VJ2K))ӦtjS jh*P*@*T* P*T+⬫*ʲ*꺮W+׮\+pW++z꺮\+\rt((J "(QEu]VXbńXE X]E6K%]FRYK)eFPeRYFQeYVBY,Uf͂`,XDBQ BQ(H¸W ]\+u]WUpUDED"$DQED !].bŋ,X,,XEXaaXV`X aa`\d,eY !eYVK%BY,Ud,BYEX a`XVX`,XEaXVa,XEXVaXV`X DQEDDBQE]WUtWEr\+p變\+pV+ȬʲXV+*ʵjX+bV ի"+".+\^+\rW "$J$DJ""""1F+ °X,+ °",+,+ X °X,""Q*\\+\꺮+"+"V ȬX.W WJW \+p¹\W+r\tz꺸\"(Q(JXZV ʲ*ȬX*JTJPpU*ժU**"*⸪PVTU*jիTU*QU jJRUUUJUUU*j T*UUUUURUUUUUVUUUETUT*кBUUUPUUTUQUUUUUU VPjETUUUTUEPRPUUTUEUQTUUUUU].ETWK`VaVZbTUETU*BUUUuVUaVeYVU`bXVYVUBU QPUPT QPUP*@ BT* .]EV+eXVaV+uWEt]WTDDDDA"QBQ(J%DBXXV,X bŅaX,,X"]]"$D@DADD( "DBQ"$DDD"r]WUutDID(QAEJ ½z\++tW\+p¸W ]WUu\U\] DAEu]W \U]WWK "Q(++p^]WUtWu]WUtWEr]\]WQua XJ`X, X `, X+`X,XX,+ `XbŁX`,+ ,"`+ °DDHD !DD(QH+t+ `*rzWW *bbkꮊW+W \+zr\]¸WUr\+۱(QD(D(z¸WUr\+z]ׯtWEDJ(J "%DtDJ%DDDDJ(Q( "%"%" D(BDDHQ $D D""DH"" """""""(!D( "$J "DHDEDKaXV/q{{{qq{{/p./p=C+V"-jիt2і̳-hYk,2Z2̵і,2XZ HZ-+AhZJEjիVhVhZ]եiZViZ-iZhZ AhZ-Eh-+JZ HJҴZ-+JZ Ah- ЭҵhҴZ-E-"-"ҴEЭ -"ҴiZVhZ-+HJҴZ-+JZ B+Ah-V%i+Ah-+JhZ-"- Э+JZ EhZ-il,K(h-AihZ AiZZVViip.#,2Z 2̵hFYefZYk-e,Yk-e-hFZYiefXeYeXeYeq\\rÖ-r-rÖ\\irY9ka\XrÖŘfab3f,33-r,\rÖY9|Z\g,Z3 Ř Ř,fff,Řb3fafa,f,Řaf`fff,Řfaf1f A,f`f#1FafbYf,řf`fb3f#1abYK0303\ . ⸮+p. 0h#F"0#0#AFbQj5j0Q54F###Q##4F8084F(#1F(00#iFF4FFiFaFFF(q4G#E]\Dj5#Dddj5#DbQFF4FF4F0#DiFddhF220#Qj0deHFQe,AeHFPelVUeYVUdYdY,K%dY,UdY,B]WTDJ%U*JZjիTT*RJAddPBB (P`cU0n'\~DsٵuǏ4^|w{fʔT5w͈^7WqgE@}R]Om~/ǍR6 ;_W=E<߫wkڮ@QBu-g -݂G3)gr`Nn: ɯ{(ߒ-|ǂq7mGT@?s.z{N$?5(}VZmqbkݸs\w9++::_'|ܥ{zsCOQRv^x+vWust;SK5wq1$':psu\~T;J}3,@q<=R{*{XosX2N @NUؕy齾Ԯg:s* {5\vUB/37;1?oگ^r-kp~w.{~9{ [W:U'8UR͵GS˾ۻIBܴgr{;̿6{?'@޿0&Wh\U&Q M0 MU<)E imÅQDyw,FoU依]rz v.U5بi-mNAZߣoOp|فX|>]:T/Qxt -8]P}(ʇ v->#kW^r8j]ݗZx1Dae⛺ *(\g3W x/I6XA /\oS?;gZ"P_lrylX(zG3P[R4cZS^ĹŶ)*Ѩpt4ѯG]WygmZ4;pT~;iD7KfXc?E_o$9ij奱yiqӯt~w+:񷏥̢__`5=Tz/TCD-mp[6[w͐6fU4ePb- _Fabb$x6Qm֛OvȩsAEs_'ng,Ъ"tFX_V~H/˕wz0]=]1dj`c}lȿt=δqeNslgPv)skwv [28p侼㟏>}ڧKY}U/R'CY~:==[\z)U.uWWWuo3y7~vEqsgsud9nͲ0u1yoWsECՍ՘ύd=/ 2ZjcWI~A07"L_tQEQEt)ҕjߋtHt%jիt'AN@t@t@t@t5M}N:y9='Id/KVNM%IQ(2LtEQTh+]OSu]Q(P((PO'ϟ>|۴ ۳1vyޗ.\.Gz*^םya׮[-cz۷v7xo7FQfc=ٖlwnkk^}gٮv}gVg}v}}k?÷]z=%*wrnOH= ÔrW+]g9\W+9(OrSxi9Zu4iM)]bҚSGWGњ3Gz9ӴңJ'NtW <5A5Pj CQj0puj4je3TjVTQPj FōP P-14m6Lie3Q5*, u漱c_LH___|a gٛ2(+bc؛blO8|>8|?q{psoXYz|> =# . 8'px<^߷pG++ =p. l.0g 38\.8Gm{kG".'q".'꺸^/qO%8qq88(qWqx^/8U\Cq!zeU\^/qUiq2.18o#cŶ|ϟ>y~661c0ccc,eUٍ661LRڶqm\[e121lllc1e 8kXYzGal=c=o[=c^2ݳ=c=bl8C."Xw."wq98:㋎:8spsǸrG#8NA#rNO'rNO'rNI\O 9\qsqsqqq18ˊqN)#Ìq18h8qr23r9B.G"8+~)bqzǬzǭp|. 8G 8G zwo=g4-x?O1 i2~#IIS$L.d2ABRysr^o^LVl;jU]_+'ft?eؑn:COuκ떪`p]J_ kwk/mW\%_z+ht]*qTcƣLXɧmA vԋ䥻pO)ny,usGstdnծh33IQUJުØ޶ɾx;햋n]"O8wk1Z{n/?-Px7QT[mƕq攞uKVϛݦR:^Hx5ybOw΅_k띮x\Bz:r/DcmQC[J5cJ]s~7~1_O7|*xI~88ܟK}W{w,_wpMu^_r}ߡ_9{]Vl0~z]nxvyRw]A}3߼wQ.5"I ʅUU@UeLlC)5)ɖjEԱ:׼kI5/ɶ7lI\PQ8$c~[yFnGmnƄA eR**Vq.Mœ>hv֊{>Zf0^eJN8`!)) _k{ bԺl^|~},^1e񂕹ڏ-ꔯ>oVj_'.4ݲZߪ|O3\ssrJa7mI^)CLLDc2{Ra,*":iϋGߒՖ|T hK$MG@¢drtƊJ]w.#Myui6 5LZwYUb)ҔrR"\j8aΥWLKn)+%NV]׷k_YEw8^xYԮ.->WG\5X'תʑC\z.I|zz}ۿP_JDT@ ۟^c9/kS'??SCq>?Gww;K/4O}c{TjwywJq}_?g~O'~?xO~ ~yc3lv87]..w;:wtwGtwG98zk_wjclv^*Vs3oϦ}?>:yg'hv*Thf}x(g y:gs_9/~v6_X>gc}83{=i3Ǜ>yeFR]?OyVUۺCHuG 4Y\~?Qql,m7Wg]fZu=_W?G/ {۽_W՝YZ5ך^ku߷z~v=c\=cv}g}}c[qu~?ZuZuZu}_=i֜cm6r[W}_W[w]uo[m\pm6_uܾ_[}_W^׵{^]e}_Wc|_7 ]R꺮G7Q:γal:γ3y<;EDţGqlO>wYpkiڝ!pg3 rtΙw;Lr|ϙ۸gnGtg g }}wVlsw`hh4oTBWjRajsjZPRZe˚TNSӚsNDŽ= ("4}>:tNiU|\]NNi.''Cmz=GpNSu:t:94z= ЮAh4 A;wlh4h14wʥLCS.BhM ]4:f\16gԚ|NzXk @5v]OOY5s=v\kv@,|},+|_el[--ۈl6 fYr, <|}… |al5Llo lo|_Y< loW21cV5z^Wz^W՚WՆ5j1zY5zVM-"i4Z-4Fh14i4JŪU5A Q5Foݿ Ÿ?[)e c؛blMϐyyy{>ϲ{'yGyE<<&'<<$2C<^:{?/aoRyJ `,ZyyUU^j͹/9yǜyyeqywX+y_ZrrzFQ/H=B"#@=Bz@= #2s+sܛsw(ܣs[=?N"#vnٻ""7-{.xo7[w[~鞟鞙鞙ٻ~yo7xo7żQoo~yo7moVowzo {[ޅ ~yh=ooVoM{[շkv{ٻ7{ݪշo+Vߛ߭o+ꞯzꞩUzo~o~~owzo7n70. VZ hoZ-ކzowoV{7oVޗn[ow^^{]M7,圳n~ݻ~鞙ݙn7o}c~[/ j=9\{iR!u+7-\E瞷-Y+ׯR~_˨EJ^ Qls+/ojuNn,}Yrkq]P 'כGN…UwB~Nlm?:1^Է[H)~ߎPj.RۿwÛvוy5mƏ FZӿJ~j~|aAs]B}{k593g}vWγ|usvmIq>_o~*b}N^7]O?Qw^9C_q|NXtR[D^:/㾯C>Wߠ6vn6/ /ļ*~6>gt=C珯>ww ۈݪUjU랑]uu;xow^ gG3y5jdyw|21U.7N GwZ3uU A'쨤jUc(LBs#Xd-]վ/_sps-&ra#=c_Ow''j=oz}sss##|nW\#'T|WU}6McI=g_}gY=OXXXYYYo7|ϙ=o{{_oM}_7M1|1tcOmmh! V##8<9ߛ4oO7;jmvj>_ˤR#')RךO,r>O}.G#Shmc?yoo[qOos7+t6q&'7M9F)a*_krXx|W1s~ګVP_k}񱾯湭.oN4~۶8_yr(zt~zph?z7kњ;Yk;9 5o<;k>:?/#<΋ϙ=|ZT^ΏC>|o:8.z|k9`fV;ys M&I}CM-&=Cp.p*T𗄿;i*?ϦS94fqs4Z-4H"@z!:\C|?MD#:.E/TM*>MW?-"#^Cj7;3FQj.\@z 8K7;|}^kDZn Ǵ;>ݾӴq;^׵vf̷n߷}9ߛdkV]<7:gLw=Sq?s<̬w;@=;3̬O'{~߷^{^׵n~߷{e9s{늎*, sS;^״8_]o;-hv]/ð@;ð/ת:|:  ++,M߯oc;\{ؙfY{g ]a}}ug(J'?Q~_J%|___+|_|e|~}=bffnvv=c=vgfv}bv%=cFq7AvqnT(g3s9g3qs'rn]ܝs=sr}ݝݙy~.G" yw7f?~\GGywxzk^צzfКНw߷f{=Yg3c;9sWn(9AkuWk~ךu]~>֚a-kS 9x <ok5fk kn6U (P O'ZOz^K&՚Z^Ucci1i4-ɤ4G۷cwmXb~o_輼r5.oOzH5DZjLGw]pn=ҖSsY=R3O~&/)yBwʩY>Ol-Wltfz=K|u8sb%Nx\lk]kړ~7ΗNت6qκrYZYMTnEo_߶׵r'j&ә*!L0hLjBP2\CF#}w{(TfvmVI_?>}\_=wyŝy׏>'i+߽)֦<7m۶~nW+jT}ϵ'濯;߭򲹎cW_ On?3|yi_˧wah]GQxx8i !:wO3|~O?'ONM9k5msny^W[^WE>91xVhP{[:~?S3v}}?OO7_K]Iz>tzt'/J\xO~/sNWIN'|5w5}_y^W}:wXWn5N5`ӧy: b~s\5vkVU:wJ'=;ݷr2G<.tw;owmp76z{ LL G##q|#߿/΀{s1+Vw1(s9< <34f0 k4f9 5߷ yg9>jS0+o|^oygyg{ol#;N23Ӵ';S-odl~Mô>;M9Ü:3Fhc+V.΋/ϳ/ӴΌz3 k5sر3Fh!bbk~s98t=_4t= yk5suFBt'{ޙ{YVZCw>?BhMdlt;:N./G>G#~ Fkeg4t?pz}>OwzGMt1t7Mx<NSΜmY:^:3.w莈11s}hNtҚS{=΃:<<}nv]kƸkƸkKc꺓:`l cG~#~-f'8|=p̌{M}?i:ΩuK\o7꺭a:::~o17t}ѝ?^ϳ{>ϳNu?y/. H62/ 7)̝ $L~Xvyܫ8S+ ] (ArDпI:|W];_9oٚ.V^羡ŌQsǕ߭y's/5,5ccUUI+kxF&k8$@mWr|od>/߆m55TSP @mQC Yz2IJ7).o<]mJ|E%d̕沈Yxܟy)\i&^t]>Yt_v=ax>TZg_~Gv=f'o={54Mq{?o}z8yW+ߞ:MVF߽C|!;q;|?)RGho}Kt&Is;'~MK??fk5~mj>鋋~wy/~?ٰ͜}o'ݗehxv[WwW>'}>&:~= ?p0>?|_;^ց@ng\k6[-&[-߯:>Fw;X?*\1J3O3<3>OM'<1BfgO޷Yf{o73kZ;>}7|1ر>^9w1m_yY_S}OO<3ŋO3z_K7C7~oooON|Qz ~o|>o{:?϶[:γ~I?7ϝNl*Պ?)|y֟OudmԒ)7dU_d^Oޞ&KMe*B ^Pϕlﬤ}ogdrxoiWR~S/UsϟUX|^ϵm4b$rNAe]O_b=!z\uRLbjLUGQ5NU8*F}g׉?˗2r]gz^~/~gmLOTJ'(tm=/͜F~vy}:͞Zt)R7sOl˲yٯ5#}=QR:w9i}?tEb?5jOVJw=/s]m}/቉ރAiu7W7wT'Ӫ?ϱ<6>moN|?QvuEjx|ϙg>/űc[mtoMp<~~#~;羏~oyuo:LloL|}GVudqbuw}yޏׯN; mf~.FGOPM7My>fuj}~/=}osqs؟lv=}cu˲wZ:^=$d^ggɑ&"\H$d9&dU䶘?v_{v]Ys>?yޗ,,.mlw7W]w_3yyf[۷>9s8OПc]s[9Ü4~۶|\Ow>\_??xf>c?п;+ٻ0>Z謁/ƾϯ*|sv~j(T9׏2dR&̽=2'yϥ#8oӴg; ljsh>/'_}/[_K7?km?=WOW~==g?w['="LI="I^^az^>%}|Ѹ7&M%޴Mx08Imǟ=w?sjTnQC}]y=ApnG#S[=/K?ygZ ty;>ݶn9Saoο7S%u/zR>ܹ2zδ?/ˑ@|Ϛ;Os\޹|9I"CoK3?߷:u}Ǿ{ۗ:U{ߏLL~OBm6V{\?5|2ʗ"Gۓ3?51ܙМ@C&lHϓ.dCT~MM=n\o̙sV,s\7x?EZ7>O$$2[_7w ?y,nG&8Dޫ?O:yuwOS͝|oQ{ZnDG"MGƽ#|(?8{Oܾ\ 9>G|LH쾗ogeʕ#&^L?$޳o>/rA&{L?y!nK?'ǯ_sG?G^7eKlסq{ɿ%1z7M߼9>$3΋~x߮^_+ /f d+˒1W\!{qnøT`~^i0M'O=64_rƽzpdJitiϩN/x;k~Gg),vwsvxMkSeDֿ҅ D@ؓ#Rc5!qYRYf%SIwuWdjۭ7u:)Ygxt#]rʽЪYtr#.+ khuʎ6y;ʿH^sIOOJOO<랑Ijb_^rbgj G)U=8{ުu_֧r qjs UAi ׺ )RE=LPw^vn8Me6#8{qjLO}QW68=@⸛cve2ZNPi7ZqkySJ1^xוֹr߂QH$SK"inJC]yșnU8痚 m:UU]]3-<8tu]*ϽwjӢxjںT|\\o=|ߎ785kC\٘~ Ȯ ͆+:m$lQ"u"ZXy `L|_[+ W€ *+CMɠVp^5wԤ+iuTJ[iV{5k~ܛt,nI_#Q3^hԷsIS;T$t!LJVӴV]O^* -n[ 2 51]+uum_tTbkl5Mv"}\KժHNdJ$QWja`/wG.(־Z3sDrt^[򷎱48"*9Mtۙ#ETKG ^gLw_~yٴ" BDcSvZH[ H4*(8ڮ>zu+^=ԺxB,RIUQnRqٗrڡզKٴt]2S"A`bR)j:jmkL-$^FfĴXTzuК[qHmCCR ` bߺT 0q3$U.CWmt88 Uv7{vĶYo^yy3F3z C?;Z=N]siz$دytЛNkaՖf5_rm.5OƜN c=R2um* 3'-RU bS#~YCSFL&Cu@4Ԓ ǽ.FؘΟƺ*ۄ[jzm wrE5/=9Iܻ'nVծi7Ѷ!$ۧ)hB|Щ-Z*]_gߦ6vT\Ss_-zz[;zu~Oqk@2r -)eP6h^06Ex8!2" = Z+:J9 Xnm&oqAUȻ]J,͵WoҜ}Ej؋j5#ti)PxUpeHg:ʮ8mRs{˷$R&L3cw>,U\펱IxqQbO)+n旁<.RG|.´&i2ԻF[Z_>pg<¢.ѥǖ%x /r=Ԋ:BMQ9IQUEEEHv=B5'QʨJʕWzўo7!=<3kC8&|#d{]— Ңm˕R]Ԧזln+2HݫmCYܽ@j[i]f#nmMM\X۾Tn365<4Fm{m~%ة ~TWTUpk>tJkt[Zr;h3X!bY=3sCfηy\ʷbwqlh(ԽuܭSW[uX{qx% wCA(EHuVꛮM q E7)Rn)5;/[s^A $~!PbrW4ڧwKx(mC|pg&`T-1%>U"g&(YkQ1,vj_*XHo[ظW{/-xTRN/ |E~moq\={ΣR%(^W]A:1Og-mI9غ0[܋Qq4t'3Y'ߚMUv%^KЁ'K[iVɕ/M~+LKdw=RTGs/&[\m?Z֖$kI ֐)$ !C7[}i|>z6O|XZ^>=9:]<6gsê᮴ !3qLo7[CfM[vq)mwyݾmr)+pU=ԆwRc-Ue3E=g+ u_[\ɴr+:+X77۳.YNnM-5ʸ(i\(fw9|O8pwݑSǦ5uuOUu.Kiwo@ R8yD]n"37/jaL.;ܕMd%tf[R Ug2o{ A,"cUSL5*a)AutڨRqTRMzӭ],VN+"o-a0R(US`*lIN _NcR խ%λ^!^VۦRI:RYnnm2wFm3A NdȺs6f#qZ6C %;}p)e۫3ߟfyTˤ5mI$xԻj b5 {OTJn>].~);oJuouu¾Nwmn5wwCAr5ǘfR:5s(7hV+/ ~Mi~N|j bKUj;#KnTR~ܩbT*ET c_dHZZ3XWQ3[Yɨ%*]VmUC=ݾݏu&&&nV _X[HĮlF뗵]~]Pu7+եg t?.xvoH&u9WK7"wึm ąUu-ZC:wJYTO]*9g8ov쬴NZLyYq !sq" ԛSw^&5 yH]r8 7IS D@f$wyW۵ҰɭW &KiJto&WwewJvޟoTq΋͙odT+r U}t06muX.Ou:-:" {%)_'nEOdbP#˻7S;sߝO/R9QΆ:ʔwOH,j& +q];<u1V;5Jߊ{2.L!ˊA=鋾_Y^)|EC^=@pOIk/.ڷQ=k=zЕB bIiM14׃,r5GOt?8go~^+P^ TDW\ȮPL'oOfnێTI@֬m鉃r:IaN#E+W!7t>ۮWx6>VuUGUwOwr o3XQs,kʓnX|G/lr{S-. q<̳]UBT٫Sl}4&jdQRȭ_ϯwzSS~z~sѻvW![ʶR 6prMsUKbqZf]zB<}ujQˆbYY~VSsk izO~jiz6մ mt򩊟JTXU]#y˺j*DN:BQ-體^"Bޣ Sbmdxm4:հe].o-xUrV޷㜋c:B:BYMf in!RԱJEUǩ~P54!fԗY4J,WFMͨWYn最3H}Ko~{ gy ~/*]kh:DQQэe%An41mʑ+&:ٜyW.,ܪYxr|۶e3Ģx}kpT(9Ƣ/jjwڹ^b+ꈹ8. /1N,)qeb0x5K)Y .8d]R9{ٲ,)]~]g]Dž=y}twwQtwCse[vz󷛰jBlKjl.RUp[I9dy@P{U?4360 ϣ ldwsvsRBE=DP±,H417;qB`Dl&es9+ԵM|{۹IUͲjɅDZ%dHtKc6-E5NΝKY #$nf9hC b]-{Ώ,kF`ya9eaFyNdiĮbqqQcWejZZT = 3IM (4n6Z[Eb%qO J7iq7LTmMu6Ob"e1}vhq+cqbIDнv;ݾ,EMkf\^6BWٱk/r~'ULUGqrAEUPfk%v\̑BdRg'%Q#ć4u7T꜅D4\UR媏X*BeJaYTsr~c8 6hu7]FtvէkF/&kVȊ"!yGLꌹg}o~Xsp{9\GXTXsʡ{IsFVksfb\}}^0^_'tz(+E $U%a0&͕kG4o5m{RʔdPo95vV{z:9]rmE;3#SC޹%:ao%nVbQѥs1tYO2aкfjfmvͨ_ipWdEU5Fn۱S+](Zno|Q3Qd Ś mZNyaSrȴ%qN%6*@\E Xg4v3+Y}{O\wMZ^کEww(n<tպm藆.(kTxwo{EKʝiHiAm&!"_"m3.hd^uan{k]vS0352m%4G8u5*TЄWxّb#ֵ}C1`yY*,%b`<׋-*a(rgaQaRT"g̢Omom+\ fQSUdb(J-5s2t҄;ir<bt#UF(| }w_ )%)vlyMV pjX}5_' Zōc"m|auSB7l^Z&5"ڐ_^ܫ(m#kv{d( 2ENY&\4= NFP14uu;ηu-; rXjE%yVL"5VaOv2XƼ+ڗ]j ɆdmNO<*3$>vTgE`("^XIY5p}Xx"y/^uzܹjWqz[gփw4}Hj=Qjg $(H`Z׏__&n)e+Wt&~ƒG\*'ҹiAfJШ׿og -E;N4[/=V퐳/SבUm}UuS1pz~ż4ӟR^DR/ˡTuRNUíWqd^ؒ][f$mkIحzTL؉-JgЕ<,U:VKZAiL^/JzY+Wo[QC^,9|ߟޞ_$R,A$"fkZx'=M,ogS< esqי/-Q5j$f͂*ըཉ}0~'x:\nur^N?SL6'TC~zKjLYqRsS%5xWמUnT/۟6:Oޑ. :9may\c(̅LVPM͍eE7M&;Sq_w(SKPY\¦*$E| ]#S5nFvA v=v|6[bMfus$;T5PJS>džo]{ӢjnnN TCWyѷn {K}PLל2sLNjq997(Q̬VYfgyqײmշ^82_z+3b!gfW={O&Zzu{*- {w^p!3vb=z)kɅ.C];M߯wK"vN(?US@lі ԎS Nmvokh=LkSD5pc9R^\>s燜׹?xɺʛg ʹ;uLv: df߷A5kTjbaCZ-`|aa21tMk ٬9z:n3I~,Oj|n3Q*Sr.e}N`ߘ0v×]>TV)Q"}'ȌWYy˼ո芯\A+m53\X*̦yQ}3̪ŕUyڋy\J[y@{YBKx'MTM=Ҋ#@de)ݯMfWlc{U׎m("x]x'Cc`S 2∞]fk w~8?&LoԖo$Dde]ov;L^35gF((TJTm[cZ>!Wּ'Х5s+?3tQksAk 3Soŗ(l\:ݖ0 m=X 肚BOS/+L=!1ոj#=;q7|UmԜj VDIkPۏtmw㜷ߕM]9J.?Tq 4U wk[p̢ԓwSnȮf[ EYZc*nß]KuSkVgo]6C˷;6`!媋{tWȯ[g'۵D;sEDP!Kp 11gRŁ] c PY%qy.'uݝlOTzUc-DmDm jVhZN]0ĭ4U̗9&PH%aDbkYl(B\{QztӿinmkZI~|]~K}E')67}qT>੧O5غؕqEg 9~7}tx\ƺ~FDGm̲^^ا~2 rk$7NMp{:s^u]w8d n]Of%=מvvT :׋׃~;b[š/5^Q2^>4!"p WKοTaM} G6!ѽ* UdJUcמom=RUC?:Q/ִ=t}4s?Ma}TЩE~q9SMf_5uO3'yn//ߊh]uOolͯxy\׃]}w~U微xb+9V[^﵎s릭v|k^Yf߄]oU>wӠOUgmxYzn_\^h7Y]Wkr^I=^eW.myKmX~lC_a].{}/N]n ǟk>~ I7=%6y!EWMA_qLzkAHPP/0NMWTHG;qCOYoeWמU,ӯ]}ÏC곏wphl|t{ʹ>u)/.γӪꗯ}bL};q_y}jK~ž<&?_. ~=^z=yhU(Qm" >}tmmAJy./=WԱޘYN~-1qu{nk*힘:*f~uH^E(ʳ1 fb2Ab R PAER (Q`/0Q`.|j6VAPAP9++gbzSNeXoS'23*y<̬eNNfTYȰEfVVV!YYZXȱ32,D#-[fsa;+3JRS1T)X ¥b("Em YДVy ̇+QLQS$h\k Qq AEPkBm`Y)"2,QfJYREff(EX*VF  * !ʅ:ŠT)ZUR-VJdXNL$R.lEZ؋EsfdM2d&bJ5PRfU ֜LδZ"1r k9'dʓC0BaYZ1* ]IPFHN㘪'Uhha6C 0!DM %krmVnedef]j͠Qtj$qj$ATh QTh @Xʜ^eNJ-jkTP̨̬*(*><@PX,)`,QJ㘨 ZF)"1aJ0^@̘`%NEr J Td 4LD+#XJ"ŊTP((LÒ((LԽC''1rNH2 \s@wgs"OaaVRdU!YFSiU UH**P7YUPNRX( ]C&C,D O[*bܕhU2Rd2V P9 P3Ea9Ea `j%Db$Ȍ\\k0YhALQQ,͌\f *$U#"$U#"ł`ł̣"<3[(ȎfT!lS*UVٚU?9NdDQ%QBd2C8zȰu q<'Rs2*¿̊*9 P[F*uPS+0)GLJ=jsEB{efY̬VBf{P ur 0cBA\qMa*ㄶޠg^eL]qlʙ!aP3Ð9Թ@FeB@\w*3'6ʠ @@25 CqBQOjP!(q$&qg!PŜ1dh"ȵ5E}Ha RCdPrJQ@OfP%A! u(RU"*}K R6,2UJI#$X(u9u.) ԢJ&bTU(Jϛ b7f39AEfs0ΰ3 :αξ¼_|/Z理}>|߭3M+dޱ$i~4:kj'i:-MxnvEQUGX mE:sV-ʢ=rj!ǏΟ2؜/ϯ}~}^}ow)3!#{"}ɯ?^v%*} yoۯ׏|6n~]-BsP_ 5H}zU4fܨ ~&|+x]yh^'J'?DZnԎ1KLJ e%:NkRE!j<᡼ \pV%H^I_Gy$|&L2dHDLY55 @da*%eE!3_.`U!%s,D?,_.*wiQIhZsz'\4ڠ..{$n'ȔNoiݞB49"b+9a2dXi jFC>җaDEzRLGaX~(W_ćF;'Ta,uf"UۮV ?gZŬ%eI! ZU,[vI a>2:ZE$ Q3RkHI B76I!P$HkAQ! h" $IC 3*"! !A` ԀEf JBVf J@d(+ID2AWZʐAU٫flՁR̨ong%Qݹ"aXu_QA^QEXqG`Ѷ5Z//⹆ RS` Tװ\ -KB,Z]=os* O{L2]2Wc&eTmG! :c;\ldR(9L׺&C'5.AA؇P-bCP* Vw^C|$ڒRdYfB ,+!ms%5%53֓3f&g9KթR&U]wfI*ɕUI QATR( R)DI D Φ55bȲT¢ɒW05)X,,9݀XQ %aRfJUZ:S*lv%cQIJň23 %sS Jk8JN$ I0L`NQ;d^%s{Jř ¥b̆faR)ZIm* `*ԋ++u"Xӓ!Pcۺrd*ݡE;vfEEC:ڙ,#2ss@cYU3s``wbBLԊ,-C絀u)kLjDA1TSD"ADdQDdBٮYKfsd4LIyd9L9*l#faB*PEX R 5TŰkbP Ad* P,JRTȬT*FE`Nd\u+%d+TD(+TG 4xr`hv|2sڂ5#ZTϮKqŦ$Kqŕ?zZȳSqmdYֱ,cYPj,Rڬj²fsuaY3 rfC!ZLd *L-CYTL*qjN8B,癄 >)9)(si*yȧ**sNT9 RPXJW?̇!U f(WYE,RUC20!v%k3 %IĬIRq(6-BC\5.B) b+e%bQXư1bf8F2 >fa4b**϶y*)QVfg .<Zʙ]^@f Jz°NVszUZ-eVBjk7i0Ԝ!8")$ HM$hErT2dBdOuTDRw]DEo'!X{ԓ+ʙʙïh'YU/݇RmY2&C2IX!\oR;:DbI,@W^V5 dWkd'1pY@PUUSfNd999?t~~?t>d~|_~y.1O}GZYaΣi N=aQ̐dۆguGVzBHN.Tm I:X"*38"(,O;~o,Es S]ܑQQ B0 Q p(sy$\B$̄&d@\$BQ[ۓ!/XfBH:ܙ R*@dI*%B.f@%dOy9%dBg{I"|aYQC>!Y2 > r@N44c@N44cꅻC0Y[3뇞O3 ZA׭a3>jL:Kdd,̆E3Bd3 kjAEX~6,5/?IRaDk ,HE,R)RY*X)R,X,EVzmQU{Nb&Im>jE$Qu* k`JI9*a9VI9*a#8k 24~J#3S X#Bs R=o4JXζ VkaAWWA+^`(Ss39PPf"r&Ts9234J'%8^{)X/0IQSN**u 䂇%E32TSV:o";=IGbqQI%QIR5X)m$L9&`j=p'Bhr8%$q(\E\ťÎ(NaQg'y|¢'d%5/Y*nJj^W!=Gݪr,^AB~|ݟv|x|ϫ>a}߬߷pv)PRկjUMt+x\u+XXTϱ7K8{Qı\%ɺZYТڲdml&mcC FoOX:yWk/]k~_Z?pH_q/8i~b ~ՖTq*jIUs>;vj7m?~+o {44!{4e $ǻ4>^uJ^ED9=޸uKBW_}_,Fzbty"1Q3k!y]f'Yy{?^w$0.j!6AMoꡃEJi"C@4zg(j\h*iХX1[C"4^V(ǼAOĊ mmo*&BSVQAGo!$yR5c )""u,f~lV  "ՒJŊ-DbAz<UUY 8'2Lc:䔶QJlQPU('rbd9O"tDJκsY QOθquv ] aqǐHGm4FI8y**EfGW8v'ׯ9NMt.Z`5bMfm+4hM/[2.rI'xl]6۱*땏Y(dơEE|ebJQC%A"syN$j j9NBǽaxCG,に8ނG}~HA_;ygY]z<3/ 7ovYro2/YQa!D~qeCv-T;Q^%)Rr9D*N[VyP.f:x'E泙D䢌RejEąLdԕ}P\VhV*3g=bֹɚ#S'n jZ’TH)>_2,+<̋ d{w ,ӑ(o`Dh' wCR"墋!ԣpKsԮE ˩\)m~mh)mvfJzC4EYSVi8-CLppZG*sYݻ*sYl \t{śΑfhX#3«MLL<ũuHV*DT/ŊO!\,Ud< +Ub[ɄցTk@V,/\VcTcI#•.Hxr*kUy,գ,"Yad+R,+ jEaXuIXV-3P|{/S0eݑzf-g3ebYɄF"Ca 3*0,9*0*/S?.TQy$\X&L`J&sP` T _W9-j9mj"(Q? BZ2 2J[X~bP{< 0(2s \Ymbֲ(LC1Bg2a*B%eO3V2Lՠ[`WXl,PUkאX,dP[bȠ(y&rIaޤ^evWVQGYUF?-V"8k,sw4 %fbeO|  mMA A\yiaǙwM0veN%ws{u{Еsb2;.Ct<̊J̬Ȳ!ڜ3۽!ڜ3AeANfGS_r^**+f,hEk$Ĝk8肈|EyAD<||E0z.dh-vg[ vsV TZXְSVO2u3S+7S9U*V*֪T Y>vȠ;E󟅹3-́CD㙫 W4g5*3+V!AgQKQZx`4X*ƱYRk2B.N`[+`U`RE1a:yX Z!21[x1jhWQJ#l1I>:y&xQxT#"3$AMf *R[!TŖC9Y9d\d6Dz l#I嶵H>GP/g5{C{usTްƵR u{Ԝ*eOu|r^`/9 S@zuȰYXd26Vf XIu$y^M|^M/bzU :Yiԯ0̒+"ݯZNC̝*E&-<̙"Mk"ԱTVŎ'\h$-qxA'uQ"Ly8OuHw;RX7S*QC1GhCP$җ8N).jamjISPە%MC$҇0\]ҢbfDnO'-B៧v^Qy>S>w"ܛ7ˮHdDB1]yL'Y+?gO͟?6?6~}?3~?Zv(6*S9߷g s 5}:왕(fBL4DC4"Ku5.~.vO"u 5v]%k^;Mm_>G)+(j㑭4FWZbfkքCZGM! oNfY5b#ϕ^o5B r bj7js_yiOڱOim8OlTEKK/_DUW־}ӾY]Ȥ^)8 斵l86tI",WaAd H6AF% d I!!$+kZЊ$NAr,!$ ȡ$g%H̄"<%H̐zOb Φӱ@$yԩY!$%TԩRI%C :Wt.\'vÉr5;'jqvTC'˨ڊG˒|p}(4aY99-ۅdU{p*̻ ;@^v/dX\ "ŞmBP-mBRKhf\0Ms.{ RO9b+Ȥ8ﰪ&8j#1ya0MS<V\'[H6HS泓C9SNy,^!4]~>;Opk>#Lb_o֕^W:Ү-6mFu;XNOþP)̶z9qqpcCN.{3ܭ~5YX%ebO5PVz9jTygG)ES۵b ޾g1W;v싉=wUۖqam3=׭ 'YQpRsYREg Eŭ-c4V2v7N"=>y哈l4`=v{`=|뮟9[:$6{Eǂh*&?}ؑ/v \\IW7ĜHwQy+a/%c2e\lr ʸXQ־(sɔT樊ϊNkQ;.S@ ȈX٦X`TA8[7k v-y7_2M^Rn > Y2a i`n+>-\ [Պ @M B$"BP=EEVE'Iu1LglMRJf$kҊpQUqAs$W2Af y8C*\Pu*E ӽ̨.upΦp|"<p|͗zm_sTb9ݲ8g5LJULJU!lT@,ybXfT@S(O\:&H.nY,z+4e,zj`Ԙkİ3$X$@hR{-wS[\7;WlObE1x(*J*hb=jUufEL0E"*LnvWۚv^:eHVY;\;ma&/Ps9 ʩdrS֫־+@m+R"QTsbQEy{g+iXwY5sTV6퍽2lm}e}¾YWg֯@"DB|SFT? :+Km,X}|z3XfQMJ,2reAEQRV HD:ܟʘR1?nMSÛ* "b58/1AT2*6iX ت{\_&wsAe3 ֆL3\(~7U; C)=W߶~_4rhP ]SEshnmN&^s8C'<|b"#}#X/aG@iC%Fr_43#wCIm배1.q(?~sߘ6}/rDDJ\J3=opqJh,bT@ 4*,wK_]/~m 繦U% T&~Q \wڮpL_?3g,>w;&QQ5Wَs r ՄtU 7`%\gըR L3m9Xz :ZELE #kšUeF*UwM^r6g&Y[L0ak!v)Ԧ{JmЬʱXVTZ$P5*"O9J+* /\~MC7͐wRO͂vm"m7էUm"*,YOmA|ئŇqSu 9Jल]P޾AT d.JdC)E ŝnձPCPv(6 &nJT {b3U"ӑ6<1sXQO7'{r9j*m N9Cr5GU66T0kB޻&V]vf S6{C =U eYXXaF/"d.nBY "u.a]~t5؟8WD9&upx#lV7RUg?5L2ENѥ .S\±y-s0 TxWdy/=%/?d;U]b,J<^^d`cWY/= Bfd 3 3J,X*36rFHOYP guTBIRP$'3+ @ $̮d Y@ues7Y V!H%I!L l ^W5̀SI$B{v!$nS0*I?Ŝ, `d$"$I<3ay$Hy&Ɇ*Hsf`I5XQsĠn.m1.؍bFze_TUe/uNVu-@ihmG%fj6ڡ[D+S[8齼Nr/I>' Pw'T*(fb:1VmfBN)Pu!5*5(f9F(nZ]N&fE9S3"ܕ-vC*[%K]Pʓ%'w.\dˌYqYT*7+ʤ{ BKݸN,³_;VflY̋9uY9s,ky! ڢ  Ly3TYUozFvǽ'$&kA)xTrrs*oeE~5SQ_5ﯘPwv39'rqA\QͩVwrQTX9(q:q:gceiQm^^dAA7-s9Jr DȑD29_-'uجY 35#UBLbSӁu%:u:UNL iɄANEqPru@YIoE{޼=Hmm*<刼fT*s"%eNC$rv ifgB3ze| 61c*ֱ)b 1,6qGڇ^bg{ӯ%k7SDAy&$ZA2MfITڐX? vqPwqS8ն ;wVG[0MlR"Y9%H q%ÑUO3bpbpb!'39PRu8}sbSL{9'>{1`%(|rʁJPQX6c u,c u,90;NNH.*' )qQ4ւֲSk'!Եۻw-ikۻw-levF6a(YC"mfE Z\g2}=sYO_w` M&DVK i4%dE VǫEbXB&lKxljG(/}!-cN]sh3ʖ֕fy]>;-8Iu6/;JKۈ3>wyu0{_%wZlqrR9-JbgU8֕' g%Wu/hyQXDVPA!ɪR,0[M Pmpj\W[cjՏHPj*QCӭWu)+;fŊHEH[N!jU^`T9E^YTi S'DE\`dQ%^>p^D3c:ۓ9wX-9<{bÓUc2Tʬu-L0Gin`,5X:C444 DxAV^>'9XV",Umb"ԛQSQ'U<̩?'t=UH:}0{Yca}?)g'"@JJ[9μؐaћ{?@~aч~>Hψ^$$8VQ X{~&h68jb92 UʿRd#.(-$j0fAQX+U"2eCSdUEO#I_qb+̬%s+YM9^նH/v8. 7o﯎s}b\Umu5*MUzC9cq}}}gw!CsT\W@[{KKV%B [Ix E"DgK4A=Nv9;ƿ #QHu /y!ʂQE(Z*!bCk*2U(XBqdQr5Mhꥯ>jq'jJ'mh|Ή5uvBPj "Wk}nh<8$(#~y~Ң{߆B.g2TP^jNeꡄ7\-p¥)䘸JHNY=}|V1 {l~MVsZ` }RFw5#UAr<9/{ӕ] chɋ hb޼~{Z<cQniv 5SdTikbWm%g:6)6܀cThsbx X =~U>uY~j>D#/=_I~%/wf=34i4hIOf\ur,AQ ʰGQH_9 bچd筮TC2s_*r&#*nheG}Tzdxnl m9UxPTNNÅ,WE\7\DmjAAۺ[e;vF"/3l2+,ޙì׻u:)-h&y%CE#D#O:CJ'ܜ'ܓ %Jvd*%5*=otp-ǜ!)l>d¥-mݓZWe{:vZy3N`R/ź8/.^nO ̨sSQK/qs4Kj㸱>vou-lew x(B4.,wlsg^yf푮l4\bR79fĥJTv !^8əkP ƚ>=J+{&t_3g[P:Y5`XJH=8pC.*6zA\T5hyca0ְU 5SQNr.)NJsVpT8Ds+pyeˌadV`J )oWTA^S"ܹͪhv hy[cv d~"SӐvLh\b%yI|R1M*sou8-Tzqs{::↯v ##G6ަ){ަ)(d%1'DS4JbMpВ-i@ioʳPa^ljG뚹'וC$nz܅b9)j혹䥯_&'[unujNg'ӭOO>jy%DuT#6٣~>>W(:}ŝP1iqgb׆fhZ6g+"ݬaf9\NEsr-,lv_e7}deRR:qB`ث{Q kWڇXy;|U+a5R^;dR/%'w*E2C,UsTӑ-e0ϝUݢlzNOjy6;U'[ߖާ33oi_0Y7~[\ +ӝqS nN]z3'6z3'Zo_%}3'|J'vn\n v\F_4ڇ>X|~ *.wl9BQ԰Xk*Ň&Q݂K8[!*2NX,?CWTDQsXs\ߕ>iDD%>9g8Z9M'3cjjC$D/IX(?C*aG !)dN:EĨK.CY~Ͽ>3껹}әY~ޒ(d" sIrZR*fT.+G98^j n뵜Ad'!;뻭k'+BpN(a͂J/NR[s|?(buЁY_T_~~^W^Bg8~DS\OOyUGT3umay_!Ğ9Ͱjpw?SqW2+lAmj$jI?_|'VbU_bLT֎n ~~. ?o_й!ܨYb!I3ŮwMgEXok?|f(0~{zNjӇ}K- ֙%<7.du S%YݾOyX5s9Јztpf ,6ѶK';ZzgߋL+l pPz,OY j_U}wl_?Ԍ?oHI5#_=ŒD?UDb&i>VX=L`gerok2 W& +a-ӱ,0iLk)ؘUX.B* s\e9&r;Z2y+SyL$TL2\Q2]DW)^S+oEuT%gXUO4Ugς{v ek8N݂w E]{wpJ;Uֲ(5YQX9%UwsJaxW!xWM#3뤡U'Y6sxڋ }W֯y̯W4v%azYob^xBbɶqRsdZqSǨ%jFjhcVhs m}J9-wtT"\sgRc֋Oliš~9mm5R;^nԪ RTVJE\dY&ix5+Xچ\qG 2ɑ!iUx"[k{&]l ׸l-YL#mU\'SDjURF6heYմe9SgO)U9Owh}%9?SϤ˴ez)\?K-Tup(L?؏vX+uMEdT@4CiE[ Xcﬕ{Dr'8]6UKOT ?ֲ!U\\x'êQ~rv?@~R}䯱}a~~ׇ!'~dDrP$vp"#$;EmXBI;EmXugǯt $9w0 KOc2+a$Z KI!ݻI'w|[zZ|nd IDl;sI%]J [J1dUZI&eQvDUy˕viU}lPuiʃsg*瓺oYzwUM*"ww%7rV(@Pz  (=[hnV޳M܉0s<5sURQ^f9"V$ 4̗ZV$ 4̗2(|{6QWe6lRf=NȰ;Ⱦ}׻ھNIt˧Uqr8ǦC7Ng<6&nH;ޒγ EU9"-2}0)M!S W:oCC/N>vއC/ZXؿ4V;lViJBw|ͫо{6ƝT]x"sql٬7Q3+_V'_{axMR0(We<&^(^L5~$-2YSWlQ˶feTf-Y3/%1Rí*kq2ZUƷr8vqXd9R>j8 , cb2 ŃAd|Keu[)R5T̨mT̩'js[ݹͭr6WCfեXg&%KnynvN|>3(ֲg3 k/\{,RC'w߾{MQQO{|;#Cə93Ru!6Ɛ cRdǑ!ÞNݔqVkp瓷c?Xݜyn>-۝s^fJ я1fjnM5[P+&94], B pHL4=ɼI;ۓdܭΧ;ܝ{nqN:$m4ز,!Ok(4%;n.L4̔tqBUF=F 4%#QQg) \V#)\UMo aCb7K3S7NPܶW$\Er qE{׺~K|N򍔯ӀFj6RyKhe|*oY_ٟ`ʈB*'6){ǺjTy&yLG\5@$(fMgJVo<y+ *P϶E@Pv>(<m^j@:~&}8~8~&~'C$VbKZ1AOǮ8 T{lb)2V *Uur Q>/pJz1cF++t97XyQ`^]UyTQr3RWߏ(x@JQd\ ?yF lQjl{UU6$Ix_^z^Hs3T ǒ?>_%.>b媋9 ar)nL%N,DQ:zsGsa}[#8)Al[ѱ4Ǐ}=f ަ{c [.= hтӗ?_,ۺ@T7BmЙЫx"m}~{ۭvۓK ؋nߩ~c]ȼHoͷ]Ko@Lhr,v? cC;Bd*>|cm`|B,eN?GyÛjkH5AHJIX!X*q.PL Ы7̜DUA(ωB5* ,&qRsN:5dݳ|zI9&C>PzM()ć U%Fͻ' lMT5QS'#>j(}!9F*+32eEϺvu\Y-;}ə?D [2Nf[H [4ċkVEuy0<b`/jWy̕~w>dX/σvˤrk̓r"p`+N''^qR|d0"VJ<ի 2s;<~ΠC:ŎpNg5S!gpͫد}~%C_zA?>ߡsrF'8E{$µ0s3Uvz!2|`Ha?~6 >@<V ԁ<!se!I6/Hz@ !X@$e!k'0$zJKhI`/s'LWЁ$$m9)^q9! 6E^AI9Y!Ag2B 2'Ny>&L$v `)}?=~6 C'|a}wwϝwv>zJ*aXثUb篎a9S%e]~׵:ʺ/Yˊ:r⎤_a<7tO[`fETf |԰/j;FŁwl\TXy7sQZ[P8$V˩!6jkfsZ8eNsíYᕛױ73[ yΣzL׬xiYMDplvilSX~גH|HR#:͛*|wY园`wXUaUU2=K|͐S+bBCL-Tp=N1\zh|L5 mؙ&~/k|ի^[\|f^D9+W%ЇiDQ/v *|Ept-hnl++=eVen+hzbnU_77[I5Uor]S^i=nktP> O~Q 9.O::7G%wcӷQJƔ7r鮍1@h˦q4a2%P%ޙ+XuUe`Gwoav۬9id({ƙfAf{:rfWNm2ׄ~˩hȄ[.j"L.!5MXAb4"fjXWMm-fq-n[GFfT4Zzk#077ێ۱.g&ɽaTJ4) Bɘg*eJP oKŧ6 O[~"?w Vxvc|;4m{JF#Eܚ+=j1Jfl(S3f螘ıVĘX6$ė x!5|j\Jq̮E#퇛5 iDvTn1&a(&IULE55|9O.>yRxdv@ X&m%X&wo{u24( UADTQ i` "1iIT}HbnBF VL@ZlqTUʘWVrS|m7Nyoof=rO[E˔ mNicTfw·B7ff;{u|tX!zp؎'nv`K>ĭ2ĭes5^W^:B[euŲؘ#XǪ2 Xt7+妴y7+;e~g9fg' q9S ڬs99v4vˡ*2UBʟZ'x(j擼uOBю{5ʑ3ϒnvb1wvb3}>?"zPXFaɧ=o^h+WR:ʶz۳eȉٴg΢%6:y WiZd1n64 Uxh8sGxO1% Re ׋ܥC]olYۻuck%<> \Uzb߽Ʉd¬Jܲ]6)䢑F <hޘcF_|g?I~~_Mt^Z?uBˏsx߽yUTs&Gygz9~ܜF>r@]pO"}]8DhBU:"A X4ñE8]lwst[d?Py }R!ƅw jo߈}#߇wӇܒz]~뀠 Tk G sQ?+9kDPj~njĬK҅4 i3@ae!dz,}//?iUϪu%ZWmkV%ߏYƿ>9/ܻY]k R)z- !_ol@~^?,Tw+]>׎_ߏ:Dh4*-I[֪}ϙ}fU^tM3FvQg^;Y%qq !AE\Qgg6gZ{i Aj(Ta 86*lMEtlM'OjцOL&$Ž\.FbԔ-dqdj&ƜIzpL4Q%˜8SI>mzNxB9;9 hz\udwOW$;v]\eۆq2qu\$XA g" ǩC=Эڟ"e=8zڞgÖ-fy9i b+%QYЀYf &STrP=~ws^cv'޳uzR68sjmQOwO30iE;w:gsMru(r(<#7c"3׷OW.Rġ !t]8h5qf/!14jkdѠ]4|f/F)~,Q,Q+b%m݌kkAq]ƶ|| U.;%-ѽo20HVeQY5%O*-cRTɕSVFu腏Ic"Y06k Vin!fT@TQծ0)LWy)̧ 3.4˻J&HF+$#LIW˗ȓ +YtdIB|iBG4[ys/`ǵ^(*hkovB`Ђ)QFwcs;L';;nIMdsC4]LXi}ywFďl:B|V6+w'{\oo۷V)>WX3G;u휜֟,U;9:v>2]osd]z=_F̊.NO駯WU\$lh1&-]׶U^ ζgq8.8qZ;";۽GZ;fmͲNY^mͲ}PBQcB";F7vT̽a=*fճ*_-W>4@F v^c*ztnƐn[–ږ<zǩm<2m'3>eǶNegk$<n$г#Н{G49;5b]Y"hN2Ht>+)DZŃTRՌVۃ@yYڵ+;^iIђ|NNo$N>!([x1l6ijhs˺.A?=aYw`B*ːP5MEQH6i"}yj҂.-U[J M@S7*{ʝO2ӱeqŗw=ob^CkLR<&kjzPTzKOU;s-"o)y̭n+lA)VVGr13*05w#YrLs]'Ba繜wyqy(yKzpG'z'bԿ.֙;;'?#>SQWv^,9aDi׿Qe{$va(y>lÚd3T؍[j-UJˮwi; >+0̈u(^* -:늆*Y}maMt. lA = @B_==>juuS=P8/$p'b8&(/ҽu.hXI~BVE}N8ȝn!#5֢::V|CȳO;^s9=|ϙ݊^{~s ?}eH]W)?Kk/丿:KTG@!\7t@gi4>wtSjgIb+y'}v9Η-a%Dp]T;~=Q >O+FǪ,c@(S~nך׭囕3XgbL=adoǗ.?(kK ~^[@VV}6LytrcEqqszjH1F&r%tXfU_[կ\X <>п?oh6c.VDsYhuTHn%졷PAмX?:5Mh?OկA6S&Z뷪lX޼6Vy .5Q 5T⩨(C.x"8㢢3'.jjߛߊr\_ۯMJEΈ(P.cUT,z5#AПMixV%ߗ}os d" e nWnqQSgjD*k Hn(#y3 JQA Az#BuI,W̨3LDm *Hrq!0EOɘ/n͸JQYQœqu,V:Ն#%GúMKS(&quDU»4DT[P陘ONdXMEQ(ć1 Lg'g6PQu oNGV }9KY%P)5g1]ɬ.IV.TV|h|c\8Τr TPPE`#!PQTgsSg&<޵!פYW޼|؍l.Wwb5޶]YcÓEy͊"DV fBƴ 5ݵrD/6S۵yưY zOK󇇾dݧ_jYeaưAW..9bdTqW-^2**1Wy|0bӚ*7S-U)_]-Tȣ9R8 iʏtܮi<4=z,.}b\!g' eURjTEduMR+&DStUIQJF"7Jq:jA{ eRlտ7x|şk^sn)}$uWwf|xW3ZfrƬ#Jӊھ6*̕)ʂa.K 'w(d,[n=ɢfM# r u$rg9wt^rQL+4TP…*4r%brmdXj4 zlF.i;'q[yPĪ# PcfO#PceɦXBPIS[2|~X%37{^YCN6$UK4p"\<n5*)ɻUCqBiaBE`A B-ǻxvjEJbӨMq ʆMBcueA"ޓ];ՉUj5bjQZU0edAVfazV5ᱠPoJ WKC{jCx.n;mmͮZ5%RES* oH̊ :%~[}n^c}c³3;w^{Vfy{1 A!X pP(DwM$}yZ#yn,y(HՍj8h pS1]cQn*4͓v"tP5bFQ )5[jqnV&3Y2փ *Ca']Wd^xP[t1ŗ.S pP%rnY^*U_[vZ`㒪ּe9T/Sݽd̯!YUN0̽T;yTNJs{>r=>$8Iǭǩ:ɒrkvް՚#֏y*X{B3J/'ʖAQF3o'C[(B.s+D,{8甓ݍpww&YAA= 6plMm@ i]8*dru}YΥh%g6u?x4?|>~RC'>'[~=_,Kdg4mVkXXATPJʇǜ*"v#[gm. =K@rqLwʑCθ>*牊,x>hAv!~rgPU֋9OlhAzg/߾<35>ҏé.bՂS=Ȯ4@@GgU1AW['1Wj*(#䳆.~/9F JGPQ5&* *9(G>F | 6*BB(*$9t{9T\r r*srX.ڷ~d"ݱmS|븷k ~8:Qb+=av{IR,'k(HpW+ƶ+T?S2 3VEhs SL+34-.Jo'[7jYXl* []ۣm *Cd{5ͰxkXYɰ}pLXBhS4}j83DuSyݿ^r`)'+\i7R݌#i*S [Slb ԨHH͕R=Ɂ9g 8"I4)V^]H{yeri_a"/>98ւzwTG U$ 񶜱ةE9Q__ax"oZfsw'0ndUTa-4dS`osV &J>5޹"yNz?xO[*YȔD>o85931W؇ƭPUبsb-dfupcO4,Q;Jְ0z͊X[bf]4E m' ([&I4Y:%F`%k%wPo%n'TaDQKaoYYJQftԖl:GX=7[RfgM9*TfTGL1xɴ d *~ئs ~ȼ+IL'RToQ20Z-ƙY{j2eUBsfaPX(ȫ&k *1dg3oaJTQ6gQ4)dyag<42qN(IUzߕ}3 h(?VaS|4NkXoȪpH`c_5egBi#$%@^P'KX&B=sNAAONN8-dI8YUs=7`*甹}9࢈^Y͗7f5:}JɚWߥ3?OƏ֯G_*}'jXaw)5`(8__z!2? iOe!G?Ig!~mG!PPLU|À0FO׬I M݅;YK^@ |62> /݅7֕^NSv! Gڋ9$$p,(I,>?㰐!ɝl^׮f:>^2.uzEʔMO$*Q9f9h*"TTr +.7ӑ]\mD]՛[yu7ABXt 3&؇yMҕv!׼J +Inj۱3B̨S]Tk2Ly`ccF6;GuFzLnrwMLt˃Ox4ObvAEQ[vA@ Gbwwv!le7wv͸i<R 9ləWə|yZAjL!QjIj%rOW=:; *Պ2@163VVT\FI댓G^$syיO.̋́.>AORh'cеAg:aEdl_5OvS TRSNŨ|O<[O{a܇´ܗN|Pkt+((6 &ѡR 6U2jIK sdqVCyX\vf/SaUu(s=cUԢ,j5Yl7RTm!aU(*=,EFMᦫ5cSF`bnʴ9Ei0WUi`lL-nn$=pLztԞ2wcӜSnk6nD;.OL\6t{qw [[^W =vzN?e-pק'8Z(\6" k4Uψy3<%s.̺c}MiSjq}g]$j%)I.Mdf7%͊Ecrd6Z)ֆkT* 7{ 3"^pISՄpn+nj82+ R㜥?X>JTRZr2|܏H5arS Յ[6٭Ȥ˹f]GeFdV&^qw>(!Q^]>NUvsQĕ&x`\hyN.vjOF15a2ތct&aq/J9/2[m+;oum_kz2![M,m2![Lټ*+rM3fenb!4ʍ1 u㼢HEќuI@I.$܌>/H]G$6%@h-fV'"ޖ@5kޕj2A-U7=(Lg>^&rӂb*Y4meV*&iXh!bұCA5z#4˶G ߼L˻y&B~YZ5U ׍Pe 6Z_O{Wo4kW.zv&: Lޥ Hzu \Pv Pq};pX՞{=}g|oWqR[TymFD xɡdOJ!JaX9A^Vlmkf'U`7 ɲnqRm2ptqRm2++U2]b\hQ/2 Aow gS7R/;S&nqMQ<.=]bIS3,wh }C!P$IWZ"!_fs'oښ.a ~e4@h'lOPHV$ƦqLXkK5:_ OkΚP4̿mnܝ(k,E_䴸C2P__ֵޗ_olHc&Q&k'2pg}{ŰE釟.E#ft+ϙ鷠A;V0%O~lPUp֯Ό.?=ݏB_ʂ 1E4If 9OVmF),ʳZAO$YmkPf͌wv,h,V,͎fVL"!2eL*}_"'vtT3:ї!mR"# Q&S\[l Q~|?D?LGy蟢r={?WO<ЂQd${?DܝSȠB7gNd)]F3 y@^)(̼36›hm!k}z6Cac nInѰ"H!@(Bs+;jna]p q.lA3%ĺY 8a7QԀ!@$ʋuT'ć u{,355lO/U7c J602IyzʩZ+.eض7#b`8bUu\s#W\2N399-k33|v}&H[Jbh+ kιw΋9\v=g1r۫{63x9BzEU_+G}G}s=sQu΢VpU5 fN2Qa,u4_ LJ23#0"fR5cn6e'6kUk;^ۺ*Ī: e9ȚϐobV|CR*Tژ*E6 |\4LV`ⵔ X'm vEmQ PՐKQv٠Ke^wFm=Be (q 2Q"uvRh[^3IBu5~Q4i JqNO1=Xe)<ݷc/½}gX+vu*ݼv!JӶ`tM<#Qn/h)YJZ fsWJ^qSɘc|Kt )5-Erծܛ=խh+f侰lNsTLH P0+T-a>DLLMؽ*۫uw*Xu^ܩc3 籯߻2H+ < lUTqT_YNw\Zar.rV6]wMH#*c6Ww)SNA+p[6&s^1Q3OoT#z~RS>#5YMc Z|tjo*![:tjfU+m,1˺ԙNRd, 5&Se5%c*nJUiG8ٔbyu<$ XI!=v^M\B 'uTFqg^u-귛{{ͧ'|sʎ ʹ%}FGj&G5FD&l{F5v;jCVݧj=ƇT%7n3cuw }cIhb?] i;b VLU(hT06V5jjq)cbecx=H/rl4̜|\돐.֦Tk\ӕ^o<'"r8d䙦P#ʭՠ1Uuh 5K-RBlIKѯ wF;/yhǛ! 2+,9w0kjE6>` m;=[icV +SP6,M)ʉdI@ȓgeuMu=3vSH]<3Uܫj"zA%4FP+rշ.#((s{$g<-'q"y9ƹڐy2wc\@;.'N6ihD 6,2E}hBm ȯh;t-ܓmn7q7㭜qC={u=آ/nav(^"Hź7ܫZRsch<ӭ϶1{߯[FY iM[:Al6H6-լmZcf[15F&6eC6B!''FQP:X+5bӫ䆖+,YUo1 'OVܧfVfZy2l8ӂ)Rw"ȨlQ]GC!b^ -zړ@oRlԉ0{lmMzϛֱ>({qyɔEoKg??=~'g>?pC_}Oi槯mi2SqT}&?x󺊳M~جB#?ikpq}ߐ>ܬG6>Efٳr,./d4Kkw{_ؿ k/:n}_I?[]z/ϟl4Qw?K5*ho8k<<~m[K &?7{W{`kCɎS:Z{[nå56icMmf/SϭuZ[Tnu; Y?MArYtӪ$>T*%Ӫ$;Mٶv:6`PT[K+k7d崰׎,?ua;KR WE̹ #{=8ک'\Q~=w3r]r; G\\35>jS1`v% R#SȁUIUN ni?Ogٷ)iر`͚b.IT& LEHXJ睎{a+z=|7DU#݃sQd~ZߗCMFYjRLX)h@JMDY&o{>tjo{V-LA궴:Q<Jrr?Y_]67r. l}N]spi.ᾢ8.q;wM"yv( [2AXe ԍq:mv1-fzjTҥ3%Z2TZIYEr0(ՐFqxiu{xFVKYZV m7vGiH؜j fwRXN7P,UmU50b}Pl* MFeyTSɨǑj7P mF3w&()[̨iYU9JYU˷c-;s([-;ˣ*jm<.Lu U-*[j[RhDԪ&OUwRWWu )d5n԰ؔFlJ#S+4UQQZ]b{ʽ~C)~yO%$BIZF ,9_>bd<'xϳXIj(2փE*QUFҧQNMvDVmBܾLRZq hr۶xEW/2SUUS4kd˛(snMW#PuMgsMʎ2cuгiJTEǏ6KB,<a\ؗG|קΪgl3~Sv 'hQgҫ}ky>ڋ SF_@X|Qk9ïezݰeweRWk-}h_=r_;3'іʪOQS{> q>~|Ϙ3Iϙ)08b[MqDd \Q(rJa83NգOzO"Î h 3V>#cmXjxX''Vjk٢u$t|ONֲkb8TnVy/^j87|q͵SZ mEkO0F. 9/eQq{#5}bydG4^Y~俗_^rW$ՊR~ B?cXpJ GU" ^@|"6AnQÃ/_LtCm'QA*t㷤QCܡexf63^15 /h\&WȊXQ^*VL(7w2/z_ɯSTh7ΨzzPJι'z7~3/* /-s[%YCP6ڟk4OĪ\ݾj/l槙))+Qog*!7R(wn7b^76ސ-1bD8OGt<#(qUAV*5f UǓ`v#X2c9pZ똦!_@[vNԑbu<Ǿ]S.fh(]qW~23f*})'{ޣ[!yBuub4v7b$P^VH$RheC۟qESUckUd^Lό*I2rrhS T9j5_/paur#buA3JcuQ/XUwSW-J϶Q:D#sgscD8 m*$N*@Rye p~+y1 e!*/B#jbx"Y*\V,$Vp&@QDq{CA8a3Y)ȑs4Ovu!DQQQu.Y-xՂo` :'=u*(lf5hT@6&P9i24lR7L]#UEQM{ښQ;M[ ee`vg6'|IӜ9IUY'|3r <Ðs1`-E5 ʎϞAJa'M6v PGYͥ6''57ij9)S(wB%Ay/[mC׹2|a5z{U:ڍh͋nma^DB]8E1ETb5ξTb?)u9PSiz!VBgW5<;<ψWV^ۚ:]AT6* )H[E$ 6T X,⢜ʌs<øoal%.lN (vVѨuYHΓu&UkɏY<[)h=A턈! m+8pF>lSO<'\'q)L_NMng}U&%UpvT=!\%QƲhR9H/;4rf"6ցraGZ7^Ŝ2k,E)`Ĝ(.^d*,y [JrIwDyNq$XCb+EQk*,sEnWl(mUݴ~]eb,' =S*nٹswM\RZSmpY!Qʓ/vNggnzZٯD{Q{[h~lOs|b >>6 Aᙇh'ү?G>|Gj]3:}}LboT S TEJ.޿*5lHYd̛5n6~N:y=~u;փB5t*Wnv{|ˈ{۽9ݵͣ~+bwckRǸõ0iu>֑zM/۬j4C[ƈh!Ȱ"doO󶪝S[*ޡ#:UrܱqeEavźQv;Yqonk{∻]ݨ+AI".+5"",^D8 Wju$@FPIY#N--.꺤ʒ좬^:GFhiKag}/>OOwyu}׮<3O<:15 eR2K4-n}*Fj|r k yP=*((lv:V[a ʪ:T+{@SQJ}1^_Iʕ^rLm_O3F*OT1kMsD͗c dE̬ l#n#=pACNw":6* bS'*S.&(BͮH'SvdOtGY|}ә0l-~V燫BC9 V{%ƙ-5Y/bC5O?}_/:ϧ~' Lȿ~%V*~YUJE;2HRZ>'~˼>vy.3?}G^tPoi8ʆ8v#8q?5~_]_9G6TM(/tGBTM &/Ic@=&j ;phh\HPТzLBp[]؜"QP_%w{'9`$yov"dmVc&vG{rg#i~ϙqq'ĵv P@5q5ΟxϾk_|kBNGR2 rNK  PRjd:V(r?5,~˟UVg@$CupW⟊fr@PcDYwgOvqط\Ɏm/5sX~),F50V5`HXdzB?(ݲ~g Y pke1Nut-n Q T2k$m+. v3u7V|Nxb<mΥ!W-yHyTnZ>O//7CԏPF#{p~P<Vg Ir3u k<1FL'45,!>"fO+5QC\=9a, L2Gha^d{rf=C?nmAeheVYZs~KPbQ\5]R%L\޳DR*}yxؽv9:9Tfۓ3huW.(k@bTueR13HaK;P_ :ԛiWbdKB1rXu7^rl-Kh w=,ENH(K/ӓ2R]DX cPp\DD;Kۊ$QU{{!'Fg{oB_h~~`j쟷ww;ݮ:uvvuv;;ӏYߝoj$h8V"3'L T~2Oj{(oty5PA*B(ul>/S:*gq`EH@&~p~}y~}?`(혦J&q5=eʹ 7^/͇ZxIvh0GA;_/}BjJ L]]4t'n-h߻?r{~F \YS\oB_RRf*|oaL?/?w}WkIw!4qqs=Nr~)Y˽AJgfa'OƳ Q5y(dX+Lo9<{h5sdPelF}%QCs+ɾ(1~ NkRsY̭e֪f5+ صgݼrT|SuuE-%*-eEZAj!noKd'MNHWۚZ,A%A4J0/\UWR'&LEQsXֲaPG=#|~ڮoi̟Jmߋ9(kU[bDӭV(rW2I0U}hh}ؾՔgU)vӳknww;g3gǤt lB?/Ƹޗ޼//kMxٯKKK~Ux׍}?J?ߏ5/?߯◱U9J'm~iJuǩeϿ؏J񻧿$7`!^UMS>~` f6A4~~#_~UySCR?'Yd&2deeL~#5'(|#~vfpQvԉ 궻.NE~nnʱ؞b=r-AQE3ad4Si꿚]-WէmUQӜϗ8$sc->MS*N{,-|ޥvXFTR7">O_4\u_ӵS=E~7kTw9XV:1l?eT:&9'0_uWw|OƢ֌}2QTB(N!4X8s$S|eD›8$wϟ>Ac>N8ܶ!et>ovP^닟=0$OU]sV`GjwjT'Ԉ@Nm?Z~!CꛂC$ǏLH?g{Ce}kÿvkF1&q~ʚORi{f'/h)ShjČϪk\4B=#62}B_}5>uؖL[EG%`sOAZLʞk5Oɔa+R -RnBHw7ڜ^8UFo7cٵCQRqvSOcTٮjk8Il0=HŸT<(荏6&5p iBPҔ>4[5fTTw~[=Izm;TYybAնAabg9}>I]=jf1ȥkJ3fkI؆ffC1fdS74z|Üʪ')Ts,;G292,w.`Z=jڌ:ĥv4²()XUEE>01U+ Y?̄Əd|U_%W]?ŻkS.9Ç8\|}1x]uGf́h-Ryx8E1_(Ւ,x\jp.Ӵ(ӵnWgi۫GWlf011B40u:::>>Dz\׿jxߍqzjbc%i)tع, br\ ,0YXe2ņ Yv0c0ˮ||| `@M4L~p}Su42=,_,tzYw'd| XP⸝ Xd,22b+L22̰rq󯯮o}sO 9Z]s!>浯aGWj2>|VST)ӵӳWWNgWnWWNݻYrHɣyxy<<&@M&lbcM|oww2f3;ʯy VQ+X\,.:t룵ӳN\˗r㓃˗` }958i;)D_mvj/l2y#_*e.rX19WLa,`&1`?N\˗r㓃Ç3yǞ>>|_}`~MuJu7Jr"CQU!W_e`r]vvv;tvv;t]ۮtM MMP1`1`4qiBڼ^W]{{daޏ9{菝],ܹObt;.'q`,2ee,,ed˧zvN]xϟ>|Z_KיS~o~k0 .}/ꏈ) Nòe;1ec,Yd#& 2eca0McypW|j8Wei#]v:vtvttvveca0'~|sS|WvSN;:;uwˎ\r P" M ||}9hhii`v\f]I' CWT|}U|,LVGg{vv;:vuӫN]r'.NwsxrMO<7)$H$%#ޯ?*ʿ`_ꬫe1Xe,2+ _/|_/;Oys2XɃLx>>^:ef3;yQWʻGj:]Nݠvӵӳg_>/|_'{s/'㉲c&K0y郒W鷾^:ef3;yQWvtvNKvU۫ӫӳ録9998w}}>]Ϸ>|cqr ,yD܀jB :LW/Y+u]2œ# Xdœ&V&VefqW~룮ͅ2q%`2\oKɗ:'$'~ՐbKtŋ&YYa,20aea1(HHQOcccm1р&Lw9|u_ZLI} AIE|Q}d,N*;vtۧz̰22edŗ pllmB88:0uɌ%c㗍9&K]x=X;bNu_k䲝Wn:w{b0̙aOc@m@9!$!IC R$B$Bd9L/`}xL1,e,3&,22뽱efLfekilm z8%$g~?Gr_%L2bņ2,>9q8],a|`룤;j%JvD " AMH&K/uô~u>>Kv#]۳vb srpM}ߚ@1axmFjT/J}'^y{;0)y̾ ;GC%vY2ɋXɓ&LYapN99yv!P)$_%]$SDC!e_Q:Ydɋ dɌec2ced돏yNM cm N'3%޺/d>f_:뷇Yv<${#|Weڻ] nݝ];;;;:۹c2ced돏?'sδkut{YM`ONG|GҾUt;]N]]]vtvtwXYc f1BBC`<<?n~ w'ĝ/JW|K#L&YYa,0c1e BD0HH`}O8}ڙ0}Zt2Y*a1۽z 7A!"D"h!D%>/\WbtÃ.\99qnw{ޮӷN;sXǞb`0qƚjdrj s RL<|r{f3ODx#ޯ>%^K. Yd 2,2aLˮtӷN9>gϟy׭z^z_:^Ww. ]_3ڧ<]Wer\.+btvviw]dŖY<wSaM451] d-1F::7^MIHW>uSx]C,bœ 0ɕS&V<{vlBPB1`LJjc)a <<.{|~?۬Y/y+zUʾv#RӫNNgk:ݺue>|u1cX0燇ndW! 2!d 'eWC_v^UNõ`drYN];:볧nΎNgWnn:КI> LL`0``Se߿fg(o~ j?vN#0Ɍd,2bɕnnntwN_||` 4 (ŋ3jI]vKW`].+xX;tuvӫkkW]{v]:vvwc,׾9K}{][+L]ToZh쟪>ðWStbdv.kӫӣӳ{c0g(@Nq lnvfK/S/T~TzzLPִҚ_i%tp>e9L%c,1dV0L3Î8r9珟>1}\_:]|Z5\usǪO秤dž^U;Ž毝^Ht|.Ct,2a&Xeb 2zNt&hMSfT! >}>bZjd :^^6Ju54BL!""h"CUKrUSn;;;tuuuzNt۽< c-S&/yx)֜~@wļi;RZܿ4 ۢۧGWWWgGNgnΧnwwtNvfqϏ~/kfo}گ~NybIKKޔa]KK`p\]0 bɃ d޻޺tvuӳ``p0\.lc˖e!~=, rzZWҾKd8XFLd,0`a 2wuޮ]]uӳ.KɆX`2Yvwuޮ]]u5H`1 `ɏ>lyϗÿgN;Ƀ._T%.%r×W+ˑ:,fYd2 9>/w}}XxI{^}WX{y h4~-/jʻU>KSˇ\9\\W.G+]c2&Yapbc']m} &K޷.C^yy8Y}ݤG;ڮ_>⼗̿lc,X0ņL1,.~qp@ DLٰ!m|}\hiq̖Rf!'B!/Db:]W𺯥|.Ք2]:utvtu\?pN.~ qimyuƆhizteyjGdw.UU2ں۳ӫWkne10 N; vYN&L2eL1bV۳XXg:qǞ^^^|}>xϵꪗVwiѤKK?R>; YX]&LeYL1eqÓ2 $$0 $0a]u:MO:&L}5*rTϔgrG}GWʱ:&LeYL1a311'ffYffc1g>oۘLjU3C"j `FC>OrUeӫ]]v복` \$ ppq9G]|yq@M^ލx{{*hL7tG'v_~v02]VWXbYXcVLY?X?8p( <:::q9G]|yq@Mx>^'wù;ODw_?yu|+Ye2`ɋ+&VLc??'?_e^>Wy} u}W4sVG*/%vi]Wd.,XɓLX2eb;s/??7/X.r}o翗2?^h>{I_5켗Q} u\v]vtӮ;]ݝN_1Xc&fVO>u5LJ_N$^8ѐM$!^(R4~}+}+%N%K&,1YYdy_1Xc&f% Ǔ:]u8Mia0x~<^d/fx]ꏚ<ò\/]W//L2Ɍ0+ eu۷Nvu٨4SI<]A:1]&4Lz RzD:WQvrUNSd, 2&YXg]tg]۳]u<:ucMphz9/|=r3|®GvWh}'*^+auݻvtuӵ۫.\<C}}>> @|xxy/ Ǐ|YﮩUee/SDuO*e_}K|VK#1YeV aXry<^^^ }> `<<>ϻ}}x뮵_:tw}}iX'vNÒq^&+ %:뮝uuv보ut2qɖL3HBi6X<'y]uGmƚ m*S$y.`%H!5q^&+ )8N]gNvuv۳f_0 2ŖLec,g{m}wv߅73 4H]=CZOF+S!qYKc,aXbɞf_0 0ŖD0 )BB!bcɹ%0*%/fޗ&=ywy1;G`S!qYKb,`ɋ&,YXb8|1b=MLby<)c&-~qIכ&Ș H="jA~'~edad,.ӫn]]gV~q×<<<<>}'ן}|š2kΐBc~qJk 2D`x'(I:?$]/̻, ,eޝuv::v;:;]:uvɜˏ/<#+{9 #+;dž|i_ 1YU\#Ya+ 22` YY]d(}>I0@c8< ^ןbz:׏ /I}iJ0?~QrXLX+#&VVVY0ɋ# ۮfbs/뮾.]uk~1f/ku|2ub{֯iy]Krr99\W.N\N{ P*:mm :IK3uҵ{:KLT}%-+֒*rWjK&Xɋ&FV>fe˓99su8AnbLCP:8* /,W+eY0,2e&Ff3, !Pٷ`Lc0c66}͇wksz$ z-$ִ#8^+^ Ņܰ&eV,dùec,2sy|66}͆ uGJ2e3$5!"A#8^+^Kr]뫷k]uvvt볫NޝwST6h@2  PA mPBK,o~juY:=Uܘr/9,qe e,0]Ӯ۫n?k}uK־},YRęTxܘr/V+ea L ,Xrqrqˎ8M|}<'6171LqLpicoe:ˬ<<_t8beXYYe 13 3,eb˟9@(@C6N)ܱLf2ɓ ۳8 Mc&&0b=fZiSqN/f D D9uXj|.)L1ebɆY2`eb; ゚!h88.tKy^)C} Z ?a?Ty G<,r*ew&d,0e2csE'<~~]tK[[{I5⟻:3e̽ ؞d{)xX r)ܘcLXec&,X'^~9^xO>} 1Ǒ Ͷ6oa}O ?4%A LF#U]>iu]Ɇ1dņV2bŖY://c0c1ȅlmɰl`C MKyᧆzC B!MB^!#U]>K]b ab>w!!Pa!&zk1٬y1Ը]v[nHnd TOHD O`|/_!,'*La,0,s?\21q\;ߗ0b5<<88-Ke@@H~9Ga W} d۷n:vvvsǟ <1qadɒړ$=n;a|SĞ<]U].۷N]]tv::sǟ1`O־կx_\k%f-/>}/|KʲN99p >>y tNkI'xyy^ﯾ}../W_+]Wj]/ p }_T_ ʲ\8rrqppN.G.gzn,B@/y<=1<M&L&q0Lu;z^~gz=N{#/ܾG9O)raLa0aF]뽺cɎ/}ϗ}s[Zݿ{aBb_p?Y;G_p}/)d?Xe0ɓLX0teYfa 5񃣣̈́m@ܨay燉nx2axg:γ8xI'jAKX+),VX0a&,2aeYfc,}_Oq\/ϟ+N-My|%-&3ZKƒ_*/`xL/%e\8フ899Xy^/'x^>|^|^~xrj׭gOyG|_ zuGk;;]V=usϺiCXk)a1O< .,3 X1 !D 0LL&!}G;v{^k/tw|7Y!$qNQؼG쏺8|Wadw1b0Ń _y||/=.v^׮s*] Ͻ%1='T|^#ή}Kq,2LY2d/c'9p@D @!c&ٯ<8@ r-KieI)N%/P@j>ʲ&S dņLœLY0Xq\r>|>_}:p2\KRdReJ)N&/\rCX e 2a:,̙c&c'.^+]uk:#aq\,Gz۷]tӵ3?A PA>>>ナpN8{]s:\gW禴#KKSC$V#+WʸVWp,``ɓ eugg'<___qS\cq9Ѷ}jqy%L;OvҮԾjr*Lb&FLY1a;w;N:j' M^z󮭭﮽k[]G^BI|֒ZJʰ_eYLLq1w&V1e#&LXdNӮݻ99ϻ&G 5z^κL&:moJ䮙cj;#v'b'jeYLLOr]gngNήk۷Gc<}f__ր}>S`P>ɯ5A@@c:kDž_]Y|޴-,|WU_ʼX]/d&FL2bɃ,0dwe en^^^<˞|MP@P'Ύ]tuWɍ=~GWzWܞ_ʼX]/d,Xŋ&,ee|w?XfY?6eC &!A(a1L&&L!u.Uo/K٭AI}%9'+VC_U}8w&Yb,Y01e+lceefXfNr8/vkǎ]t\W;Fq_5d>WڹW øŖ c,dŝqˎq.(1b`y0zhノ9A6Z~:W75kZ?%+_b_ 0ŋ&Y`ŋ&L2?yyp);'<}wL2|Gr~/yO|˜q8pqqrrpsxC>>}0cO' <5I r*Sd5PMd D8N(?`ݬKѭ/kKZUGhðtN&SeY` Xc++V,~3, ߟ>x!qccmlѹrX̐۳\ fgO"zGpO ~a+Ç.\8qpqr1LfYeBBHaD٬c0xxy\q^߭>@pؗzt0~#꘬O%\\\\pp1eÎ|!Ia `cm L:Wɛ5TA! C01_t e28rs9889<>b`01 BM @MP Lo[׎{uvF(9F+RdFS ˋ'#G.]Xd0̲!!DM8ilmwɒ?)P @@%iBV+bx˱rrËw ɌadNscf,ZKIV|G?}+)~Qbqr㋃..8qrrplfc, dɆXqsr 1y\qKma a^4b?D}|1Yp<FN.\qpr..NNNf2̰Le 0AA2<<)pm6; ^ 񧄠LE VC꜇dd.W'NW\s\@@ P(aP> `xy]/룮~S%c9)Nd)(~GSyL,LӧN]]]]kOu\8s\~Oޡ<"]tXqK`y23g;COivN|!Ӕbadŋ+++?]a×@ OvKPLJy B>.~Y\~|B@zI}i%p8NK*.C}Ӆʲ1L0Ŗ0ɆX_qqqrs:Ϗ> ɰB8MJuc-zc3,Nx=林ay W9rpˇ'NN\_8s\\q@"1 =5au!߿z߽y'^}-z ޔv8NKXLeqÇ'.W.\\yYeccyL 898p˕̲c+xyz^zURdN':_5"%SZ>K#|/q_A)+ņ,eaF,r>_'៙ ^燞yNpqih)Ǐ|\fLə'xx_v˰_%\O.N\.\88\0@C&.HN*<<Npqih) ǥ~C&̙w|Wz;˼=)\V0,`+,_332f_Y$*A Nfd]4K. gu̳.wZ3I}KZ'(`d_×.NG...NWŖe9qܳ}w۷q|J_f|Y㿵u׼.|Z~>äC}(t;.0]NNN\8rr\\syp8}c1bc< c]N6S&;1ϲzgwƏH{e|% 8+%`̙2ɖ 2eeb Ōy޿N!>>'#Lc1HcOBpq1َ8=(KO=H &bip>q\dbee,aYXe!HT }|uGm.y\׏m}o߮_:iǼi1>|ʹWڼ`e<&Grˇ'+.L񌟩2|uGmlyi; Sf>K n_$}<~c2Yzʾ+)䲙99pqrrrǏ<|O  C#* >> c&Ls\~y>k^=%$i%4a>%\XXd bŕ&Leq/|.s_Ľiz뵽\3߿>z/Oב"8a>%YWڰ9.C#\98r+1fX,,ɋ$! `xxuuq_nb&2cOgŘyN||}&Kdq˓'\rqrf1eBB L1y<룣rYL9rrr˃+~c c 1,}__Ouלq`a.\ ԶaHjA&BO!!#/r\.K 2ɓ,X Xee`? 1Ye1뮎:um}L%˗!v^'>PG`2 VK2++&2d1`œ&9/˓N\N8eYaə3+.~7?ˉ:m 4rIcW$->|I>^_ExY,10ɓ&0eef2ɌdC Pq8q8\pm:LSa& n1dH\)`I'𾋕yLK\\9pp˕˕LeLb2aac,i(T$$#52Y  zeO66ԙHI|WQ]VFK]œ aYXeabř1Y1,Ɇ0 Q BBBC0Bッcxͩ&d#RSf&^B%4@PWUpWkyC>Ke2X^O'y<Wc0aeˋ\sϏ]uZ׮/µkuUxɦ/9S~>C>+䲘Y,\9qqp12c1,w39.ˇ<|%cԩRWXp5z8JT A .#O2^F#y.+.pprgsc/ن12s3r0Ǜ[&=-J({%̗W9Gq_~i2\O*\VYXa+ 1`ɕ+&fbYr98}}B>ӎ98pUK^U`Ç+.G+əa\ÎN<<όyxx`]q2cĹrc8M52 s!$ӪvzU䝥/*O q0rrrrrNW...X2̱2"PB|` qj`Ll~L/o}盘ɒe6B Ԃ"hʻ˱:\''+ˋ1,aLYcǞ>>|||>_oK}ϞkK_z_zT]Wcv0^WS.W'''N998̹ˎrr9pϏoxz11:A Lݙ2[y^jRǮVuGz4ƞim6mD`- m"ZIa}F+yL.W'''..\\8qr̿c,\+srs<>SML>O"ca15 CRG A?ڬʾ%+ˋ\cs/,'+㜂A>OnMIyS yO.|>E_ e_qddrs.W+.\8pYYd BCI# =Kkku߾Uy[\'G,W*}`\W.\\8rqc,c,bf?u88886&>>8^8llxq|mr>窯+{˖_ֻB0^֒Қ^K8_ı\_)#N.898\8s'8˓\8㓓.8g9y|\KW_,X>!}w|;O%~a+a}S!d'\N.r9r8㒀a!6@M 7*T7X%8rd!RA &ХIMI~a+a}#8qrrqpË3cd3,s^>>_xxラ>zYK{KǿϥuoϽh4LzȝC1465 2K{KǿϥuoϽh4BzIOڟu~ix+ '9r9r9q(HA-( P( D<ã|zkW^Շ}ζ֗Ԝʿz0>)0YX0)de%.9i˜rNs>s^WǍ|k|+߫jþ[Z^|k1OIʸ/t,rprqÃ''.99f1\8\98x>B<<<<<<]]u@<ͯk)ׅ|ֽzi@ZKHVK*v+ÓNN98q1rrÜ8Ϸ]]u@<Ƀݗ!-B$33;j>!W`e\iXnN9\\\88rg9ˋ BS#'ͧqd$eJh׿۱.z\/O2X8pqrrpr99a8AO! HGO'OIH ʔ%L!L @EZJp?`\/^ʱ1XÇ#+˜rrpc122b,c.sϏ>_>___mb]\\^3y/H{I؞(YvޯQ/U|W ʲ.W.rYXɋ,P@0cvd-K%q`r9ྍ Lbb>ii}%KI}-%YWW_Wʸ\FU98rrqrprW G]NPuH   D u&%YjxL;־_I-y֒־W`|}KÎ9r98889NW+ tuuPt111`@uֶf*]}3ZhI}$ZJUʼ}K\OL3FL2ɓ1b,L!!~dIO|}6By߽bKھ_7[k/Yge8ʰ?|Wܸ+×''8rr%ܝȼVC29.Յӓˇ\p+^c?K1,P!!Dpq8cmWcNxB "lE<K_vWG'''+8pÏ㷘g,0Ō/'7}N&lnjU14ouDMI!y#1~0a1e #,13b,Ha*`u\llL& umA.XcHHR*x̲FKVbf XaVL&LddYr'q>O:::u::Nq^8@lcefA#=cg>ESƝ'`#%\X3.9r9N'+#f9ˎ(|cΎA]u\z\}խiU00?ddW?{v۵n )>}_y燞SBmcɓ%L H#ɁQ/W%pavӵgy[(*_vk`$r4ϯAl|v׮mO}h(׫g^{w -4]{:]}ǝ{zgy>}]>[a{Ֆ﹩ݾ]_oc<4|{{}}e9=/WUm7@.﷏5tg{uש̺۹۽۷}Fvti@7`@J}:|A@4uA@{04-m6Akz{{4oM;CCm{y{loukvϳ^>_ow}Ms]믪rkw7fkc;Kݾv]t__xw[w>}nw'])Wj6;֧}{}܊U PkhSw_w{^ݵvݚݹlm{<7{RʹLJoVWwtZ݀7mܮIvIjl;[Fmi)@ũҐi[bn=nXUKUm4o;n'sV9;mRf){2қiwu-D 6lͪj]qmӻvvvIJ0W5Rbe}{g6=wz:z4hPt@@@h@ @::PFV4 hP:g(= t h @)@4=( W@U@2{N:P};=z-mutlW;rw[Nݝλu6ʳnsk3& ̭Vk5f]M)kvseѭuuwnݹamQmm<;2YڥZZԔvkR'+jnvllkn٪7mVe[02՗Wkݝv5ޝ`+jݔI)umv;Mu7ۺ+Xj;kQΛv۷p໻H[^Tae]kڪk{Utj7[K}zx]+N\qaVr\c*=]:6YƹkgKU+knnT.]]ֳY\Ϫl"Vm[ջUkQ5mlݮsjԥkMiNBl!uJs^w`7nZL\\ۻf;m ٣MN;N)VvWݥ8Nζl Fm[W\̒;N3CuNe7)a7ojnsz:lr6{U6JͰm;cW[6nYVvFv4%Uݝ\Eo1vջX;퍋]wum͓3mEwfuki;:4gsuQ1m8Zͺʝ5]MʇvV۷lV\%݆G۽=KUc{oyHttE;0Q뼃memf7mjwvܽj[6Ztv{6uݨ]u\wv'En]jέUw]qP& k;ޞ].*Oݺimv뵲ʼw5}u=˹w[ewmkI-vjqavtk#۵gHivU={}d]ݩeFsM\iuӹEۊSSm]wsw)͆moKo]MOwܷu]޻۽ngynZݐvt{ӷnr;znڻPŪ}ժO]]V.n}Um׾]}^4on֮ѽ2ejWw#go{5nY{tۄ(M=){]v|ifmj}7o>}z﮽ܥomƞ}ڼ}϶yyg}}ݾoJ{7>{]޷|w;g>{ik{wm{misvwCxRt_q}JzݽnvXwMoYmwtiwn;]byﯞSϷѵ;}}{\v}ܺ#Q{۹YWuۺwZw:۪}{^}}gsM8s{]޾}_={[_{vs{nz>>m7ܳ{_>/]w{V}ww]۾}>޳>v[_o}ަǽ﷭k1{^}>w}y(>=[4{w}}w{p:tt݀}C.4nt4]כPwG{}=g+g{݇>\>Y{>suʵ_{y;oyy'&wn}o`3^[wonGh]Ǜ{wgFmپfp)}[w p_p=ރnzi_B@믰ztOo|o@9>k糾{o}c·n{v3pzӾޯ׻{.m}=}pu}}s*v7_qw٫(k9_[|kǭw}zo^o^|" bi#M4шO&CF#FM ɡT &ɀL 4 @h @L&y40dɑd hh4S@LF F `C&`10L&d4ɐhɣAOPxb44hh 4& iF@4 4#@M&^C;ʴ5#Ov+8Bs{ۏ6Ai"HAD[:ik`ҙF9P.$\xj 5 a }df`%X c,LE15^ᬏyLJHhR#|IIazwԆu#Um8!4xAшƽsaS(b?FDCl$G- t]E |K%pLd 9oaE? ǚ$G*Fhk]V-*01^fG&QFP"E!J) w[33/.J YA%2D-# H(a&̀&1V H9ab~UM<$#E"Y=W"44Yy]h[A%F uf!Z)*p E#4Q#n'9:K0mBE#."OgLr#"m ,`3dڃ2Ր+8FŒIXMbAMS`?/r^_vD5#4YQ< J][IqE@T! _rLB<B9چhV-MΨ@Rb̛$ |#> Vݩ*tF*H4W"tyV0DR3_*aQΥR4M4v6Z"kCeU&q<0̒i|횣T" `p/8OX"\9C:&#bW|B$^vM /`CThT, (Q4l DX5cbl>(8A?If+)ZRMH98x-lL $X 0U#?Qvx^aJ, ڝ 0T!;PH@1feA fh-Wĉ9:l(ĬU"3V lp Vʈʠlj3EaɒR%dT c@;ɣU@)QUZIy@1dA eX3I3D /H"E>;!20@W6k(CJG^Nk9ˀB2AֈN)L*j|߆Y97= N)!=blhsJB1TTfz%44U&v QA쌢@zʯWfl!GM&ՓRhWt63pX5@ΑY)1ft9AEf=Bjؠd#@L%1_*<)'ȑVlBݑ L2`63 ״IfbR$%WgԛWzx]7LI[aZvDBy;W vN)$ bDp#*!Q ZQ)@V/ f),#k9?lfdٲh1"bA_veE(8Ǩ-"DXd$0 3 "vGA&UU+E;d sYj(:d޾ ;V x2(-k0F}F +9F&Γ"i$^5zbN(`ƁܢEDW*{b `dgHڤKzk8lF_铊#rN[ 0?*!Nd9`hK0E{8pʑo.# XDGSR1 lhH(c-T :ST(1:@0yP "';0KSUF *(ĎܤMI $BQ%)q²)0C& `R ',CIUaJAH&%*0`zAfPAY3Nxs j? (AWC'Z3&.TjUDfgnB(26`ZY*d  ɤIBI ^32eJ*Lh UT1O'⾎^EmY$$-%B-<_/Ҍ*P^#bن5 )o;& @+B5:.*kj X'aovp"k,PnmJ`sjrQd,9X_rBF%(Cv3JT-QE դQIEJqMT BȪ 8 ux&$!&CH"@8ԙXT6j i̼UHƋjEw:uYԙgYӂi /YR#JRH !ϬjGJQ+ʑ0#kѱ)N"CA8ȫVlM[/0S-5 1W h$v/Er (#*4veN,A8{!F\Vd)EX(BEAqCë[[PCU`UՁx u1 ||](K/5Z`Y \t , KEW^ |U/kq-uװaq_*8=+KqXX:  "G~/:!_1aj UcxZZXVAp*T(CT@KHPA-Tc* @qU(RI _X0f~4,h/!|1Khh7`,1$0bT5P0\U(Pk R8+BQ0 $IR5AH-hTu„1T@$PC):\ii0\ck1T8\.1ֵUB5>k8UC^(ci^8KU(b  p!FqqUkL2¸ᅇ z "h@2F@k(LdX`@ f1@L!/DI"&@e0H,PJTop]j'B\!ui-^&AϑK08EG) WJqY+?{ 5T=M+t$l{1 8O\LǔX`Cȼے= 㛝'7S#fJwpN{Uz8f?ĉ(M GRlB8p'`/[sP.ҍʡcɜeh>l"J9 cI+h) 8KfL+y]teD!!O+|)>~֝zlB[<$nqy6>/CA~7YWv1ȹ̢̖*ldOUNj7E)N8'仆C7mw]ѡ ZO?,E\`|4oȬÝCo܀FuG"r] /JCix5?z E9 U1x^"BciӦԨ_k'ރy~1_T&<1{@DaXj+$`A]PjRvϿ6P >NyдTswk3}S٨i[l>efO0'V|[]+QZCmՓy{KJgqN>WjVj[s!}jAođ@dγj148C"Iʟ#+\:e=dFy^:v!-Mß2Y\4O^ͶOBe ȹKBB/h>{T:B--A#5N;mIpUшy3B(tss^ :k0r.3~pSIs]4vQ(\L@P8a:Sz_NGD !m@+aVe%Q7)f_&!=vFjN1$jfTsBxi\80w/ wW C =I#&G q&eܺBs~}z}o_f,  pKjYDPF*oԒղ_gbb0wD(kx6z7i kޗ眢N^Gk6tZב5 {2΋J H5Y.Řś_%$YZ1t%<'r_9'}u-&\9grZ{UZ *Tayl&j`f>J%km@[0VQrQJ |.ulw<>u VlK|}ħEo]W l*8]%s/V;3ƌwq gnA#[Y[$N!o$F TS^5JdC?>Ħ5z?%C w#D/]YNWpO74tĖۓl02R?Y ĥPm>s=^w g2}?C`iLWKv'701PJ)c.Om`A:o"X'4QWL%ԮQIc2CJلge5num7#$VMbT.ԍ|՜tLikbgڭ YETI]\5¯zbϔi{(?3;0~Tl뗨Rս'9Mt_s?3XQxaZo#qjG="wxkv>= Z{ҥH(o|za.|?Q*1*Up0Gm16n5'sdcw9M]kn]ǚ."R%bdC}-KՐrkڍVPikçDǔY0睞wщnMnDX^=7^/qf٬KCU(t-'`KU|Nc_k*Mwb)_ԬGTư^+bWC( Nt^uuSTiqnwľЏ"&!zg4vg{N;W;NyH3Z%/)ˋʌ\(( ,=mzҏY9t|[=ew<[Y@g|s3b}c 5 Y룲)avFGw7fЙxсF~EdWS%}cAV|Ity'9?u eѭ(Jo"^rYӊO6)#ȇZQLDOjtUyQ[_#Y< S|_YVvuZ鿿Vb9p$%/O_Td%~άEo7[)C]! >st17H+If뼂|I8C F#yp 0q+k rbɣv . {R5 I60׬H|}\]VǴbv7:)nKIeSI(3#,ҵz9+F_Pq=圤'TIUqKVjO֬)m̨q~Zc5y@ۇe(qF :YafIIap)IOĞfвnO lzc^;ZSR(J\ߌ.@cƍl1řqsV&!#9%+;K^g[yX'mRoۣk{"ޙe|JɇԬYrPүvby6k""ڕ ì%OߩM ȲBf>Zu-kTj3כ|%_$9ML.7-Pk*=Q2w+/諩2 erenH>N4Gr) ҖfITOfXH@FBmĮIBlòU𺛓׏^N9|.(3g#-r|bxq6F:\?k-τ5BQs]N=EL܏U-Ņe$̖Τ3V'Rà0> eLA$߲K-1 cw9^:!4q]zz-|G, yeW~ ljc|LgQK]nb1nkWϞ],vգI Pp<)͗TՔA("pS;ki"4#;)S?rR@K?=KIsM Z\yֺRԜ츹9Y.$/|-<Ïw`E 9I1T,p&X^\6C5&hETˣbtT"s^>Eƈ?qIE}*IG:$ql0ݞ@nns]\7q!vSRz4]E@Ll{VKJ=W0;sSɊ^st|rǦIdn_Ӗʈ9Iޣ$VZ0"vEW? H0#?+#0Ky1vS\|ev혔-^ߑ|cU̞Qz9b=l8I-#IR=bO$4MKUKDd3ɃcjU)_8Ak'2T]1+Q_8K,.6OLxt%*O qtyGhKZ欲#~M/5ИKNgɨ˖4m˭ѴTc$ [eCS7y)s3UY]xت S5Z'O%)ޭfo??A(zab&`Nl[/{4r\Gc؞Qx,IR\}kV: #6zixH= wjϑٓ_-ͼH'*Al\ ND‡ x(&|~{19OVaK$lB$*zs6eOU$$Ompq NϊbO+)RPכU݋ N6jmNيJqVW4{Of?T",T% hiaE[#uK[h| v$7߯g~Hy9 xȥZBo"RIWY[&iW"I F5Mi]KJ4rfRDz+^;pWV}j`( 1Ϩ(ztmBs(Vָ i ^e ^<!%zjx:0(ˊ{W%G>Z;{6^ 4/h$q'AfޒWtnс}LZ,p 4@y4j_vkL-. fս;ͯ;&z6!Q4pe5}tͥ?yԴdN=n阉uGVP}_%s[{dחt>&j4ݶAݳ,NT bmVhɓW  M}'8hJHՋ9v)_p-m/!='Z+=HKRa皘-7@<~jP\h%oC6RTFff?ܬ{('Ż?Fw:?M QEQuG44~X #kP(.Jg}!-)sf]xeutH&UUIGR~1IQ3>"w8rj]/46ZazհrKl{ gaB"k7[$blZhRt Yƒ/RC]@$TV2ldRm8Z}=mULft 6w46 >mQKnI}z)+Qfd$XU#jj<۶|Xsm_p0A#"TI iot΁HEjx>MFqgR)) PgR9|,r#[:Oȕ!Te퉣ƽ q^JQ/%pE~말~Mq5.*RHT^c"̈́t&!/1><蕧@/0R?t竕c20NktBA4T<-3[wꄆp͍un5}F2 2z+j3xX&T]<)>*ZqWfߦkiJ-鹞¶ԥLyJ;[cZКj3*}|]^oxӖUq']?bZ.y\k{\:8j ^W[:cw:S09|Ե,;xU|rbj<5/>;up('#C٫3m01KMeڳ і?~Z\g| TGAѮ?q3Zg?э,D}>V<d$# AdywpsEẝKtgmRXˑG%= y.vyN K5YuҬ&9c.]"hwFv-z@7a<6KzY>8q}|*o s*精 FEZ%\h u`u2h˯Eԧb*ݲ֨|WbI.:E=5rhz 孋䫘nP2I,q[*TH㧏Q' vVQ'.<_#BTr}y%+4I?8q[KtV[bWNQɳ63vz$dH̬tJ=d.k=hK9HA'^GU$8k]PHMsR-d(aR] iʾB` 8ZzGt_X_ zzNlUQ~v`{0;Sj-&!qK]׻v8L-#X\7,Y2JA K*"^פϳYGkK/%JȺUȳ*ƄXT8[EHj xƃVںsl4^bnj ~\[ꃾٵ_,r,3; O-dYP-x(f#&X:Rz=ǥ>z hxûP|AJk;%>:+љ8oα?UInNRUf$*!$̓Y!R$R="9եeq>zAi Mh![ ?ё}52])Սu=LTp0? $F* mKשgRt協{:d&ZW4^-jKgVu˒_::qAFaXi;YyGm`RO9A]|e)ɞ/$Q?vr͞tc6a9 Z*% E'> N|TnhƜNR(d0!=BHI_%ɏV/vn֣k,A=$3q6c+SWe\?Bj?~V6ohƾA8,JUo%PY<~m_,k1!r\1Xj3Iήo#fm j}|/N4z! Riu[ύ܁f%l6#c/Zb{܇f9>BKr* >n #qҞ[5 CWSԶ`6)堟?P{A*`[j:T2%:NuSpi.,ֈ MDCSG{\bD>Kf/dX/X#j$_咹dgI_Znೣ,D![ikL""jZD9s^@ܑt/ EaٻM3O޶t>#= Q3TPš\h[!zdrJ_L3M'T6-MXtkyE[2]wn3v U8UԽMd"W-ϧkS4`ڈvnȹKOט僎A{<CʓMf'kYoҜ2!oBa/ƫOXV&ŷ; %MΜ*9`ݣN0mb-=OBoƓɃ_!yHcZbը:/˄-Kq_)q˗2B4J> 7Wm~Jms#LL[z[0UV+ T!. X纯,}@1kme|[~"M SقDg1Ʃ7jXJInstU͎WÍwo?UXX`x 7ܿV/&\v#PL; Ѯ(z"j ϩztڤ5I9'=)ّBg%1A.Z'ڞ+6 x5p0R5JkƣC, )zKۙ ,yꦊ"!{^~ʕ\'cJuAWq%={sZMVj%(Wլ76vKW'tE4Ff&yv N+ cҺz/KV*cS>lF 3v?+]^t)M'>ǜŋ|}O/[A&΢zZkt{%EkQd>A.UɨIVV\% vSAik?_yv˹51Z5g$|l :p㷘¶d6>2qfuECM--ϙ/"ϓJ:}~ z>8D5`RіFw 7;V4e-fÌJq>)[JW>,3$E gn7=H\jP[?f9?+#xQf0M&g: -ל%~XwGK}8e~z.O]l /O9,FgMDYAmEZKGRݫW캸/zn&d=CqUR݋!y Ӗ*TGeC/5ܡ@BKJ.-=s~bzM.0L0Q1c X Jl=ӥ9nV"c$I8^1SdP'{D>c}Ij|#lv bW W5IORUfH>s^r%ڷ9-~ C@k熟Ğc3 0K ~)L7 l2 EvyWv{:v(waR REmvi<8h;h4)uyUQ8*mĸ E?Ĵkn.7 Vdd&"$%57˩B173EX/%y͈0ASLfsE@["P 5|ث"2ySVxFemPieuf0jT ]1Z -߳)|Ylu3eFf6]Gf tdvC(CvX:7WFaPXcV# aOJhNS|?R5pNFJ5'\C'97}$܂/;eKY*رZqiDZS+WD y6r%/7M2v~ӒS,|-|KOL**瓍-㲿Qlx 9^*|1A#CB9qո=-l>~]}ukkZnj DC/q1ko;+؄$DtR(1hK/r'p i!bJ $*A(h%.9ܽ }u !/f`e~mS(hF<& 2#8EL`)U"Ū2 gI$36sM&94*R&DH ;4j1A*6zWL Yy$PZvrٻfl6 *eofʍ32ɪ6Th$" `ĩ9!ULD@$@  vJ1$P aΊ XfR#"͓L9@d;RPC {XJ`RU+蔎Pp׌ PN\$:/UnB1xDDc(CQ H]Dĩ/ RR;5<( $WpE> d@AH ~Z1ɒgiaXd;3DSb]^Ry5C:JRjK=7^ԷRMBO'SM`PYE@h'.n '顯& MK$f2zvT! S:tsKketwsΐ1ԩ$Mo톰ՂqG:m%Ɓ њSHRZeX%Q^O tr3{lLY+\_A?1<ٗ5>9%:_{<\.IL{6PnJ Ҽ|C?ʢWJhW~ #s)> h(.ܦ \&/osd)%?&QV>g .Cg}mSK֥cHXy\8&&jbKkYݫ; W^.~I*co3YQF::oYdd&eYUKٕA*Rq&R/FfQ,2A;D=QBnQ1e-D3g.v: UǼG"}X㮼nY<1[R^ wke%wcn?D#ߎM_Yu$M_`~LqBpsVf2.~nDs8+' 82t9OIZiY2C=p[9&.~ryh"$3yW =/t4_$&Y&ZdFx+QΩ۪:: gƏ @6F;I+y>GQASi5hCލQܺ:40ĨqT1ah*-<^8ܮE@}yS]sDu]%2SW|M=d>7z&׮uUQvyTe ȏ%M_ҝ2V.=jkhIi:<~_Y]51WEᤢ{Gm4 vaZA~,ٝI-WV9ݵ&,˺`1#\ /;RE=^J4BˠaBfAu]cc5۳ pv 3)ojG=RTୱ4IDpet(SKxnښjZd#1 )rUiHѕ3M.Sͪ(b7˄S(~s}_h`seY#j=أs j1s&UFD.0pѿ &m v&M=GUIG6Fk`# q²Rʂsf}gS|L`΋sp,Nwk皡! tf|t wl<.ca}dgP-n(Ư#MKsyEЅ?Z N )ui%C`ЇO.mszceՒNwZ.(d2$MUm4"gʮ^oj"yV2޴D4{mZ%d5-WbTЈnW#sJ.Y)?iW_c;o1^Cù%JUfxFBf2Pm쳍{ɖQEJ Iz_BQKe$惝ۙz|,^BxN$v)䌄aLQksuBE&hҧWfkv*L2ɶ9_"6;園2{wvdk4.S BVE?yg4pVCD˺r.;W07[R\}KIJ)yJf__KjߠOʇ*r"hOZ?2h~ٝZO: _\EПlI"]r(}0[D i*m9_B=Dãe-zSV%OD-NaZ-M{ljiShLv}B^( D1$ zQ36c~7m?Ay$1k<&:Z:?Y3PMȃ:o>X+L=FƧ0~p͌ѺrO+-UD yW1'>Hq֍x D ưB?6C頴^(Gw:e&3I̴s$ZI+]T DHF.cL2ẗ:Mkn,9 &g=G&u!ƏUhʍNXɟ *+ΟAp|^4^r1EC ^Q`hk e_,հ׊| !oz MM[cRѐ,!w!ɚB9"(In 㰭[AtyGoRiҠ:9 VԇWI3&r4Xʥvr63d\)TxiRbJ]t(x)m:BDC넡-!Id\6"'ې>ԗVwmst{XV;ꎵ2;V_IlQ]dpհVB- 6X1Lq/cx: El\6{P[<)}rN '&hmܷ! (Ozp3x| v:\wwW 2M-ύ8r({B/k9XƾPh6M..@9&@v)ǞSq0%C0aPkz٩s'hnRD,Ee%_ɾX8$}K(6,fΪ4B$;!!o_C3J'p?6c d8BX@q4>!;"|dsG)x]Nɭ;|{%փ%0},T\Fyp3m6 24A^^?mcsd]1lގGk04֭H3pNTٓU#ЈCGx48ؼ6nOEE(XՖJV+>B4M笃wdϼoj&źS^ZK0pculaPrF2T"sLv"r<յ~7'Fr;b˲*kp6I7oHB`+n>k)Si<@5+wY=i눽)woBrئpo*՘^t~!2*&tkCX؉|ΌYQq樔siς֧4'D?hKcT=x+*EZ4BjWz(Gm]Ip@~ v~5#3쳴<58bXQoUyڥm9"K'ߙQꉔG:/* S'w}.~ $!/u/@ŲW囥6A}`soad7Ul'>Xn)/41V("D&j3U בrH}(]-u?MQTC S5$[A#Er"0'qŦCt=G}ll5/Jũ͉=;<(c0P.\MRl|}73롇T8l-gj>]Ի\2k+M0oUm.b}LX7sk$>6ʖĵ^8F'~`"V zcxɜh3<7]d?C}*z|"RՖc8Ӟw -(&TO:݇ǒ{Ӎ1Uonߏ![(מ7C:]CH[^gĂAWG8 ^L66L _*̬u ~7Y.0xe ;зqbٓqY''Cs˭Fc7Q=!g i! c:W+a3΄CbP(ں̺ 7x71`R9>Æ}PV_`G4Bt*|ɇVjHUmU0` e/N;&S}Nidt"I~b;Q*_XwiKEUt7x,c䒚]@Ę{=Xr Bf:[^*feI9I \_B>5O tΌ󵈪 a5J]&(QU,ߴ\a9Lq1MJQ j7u2.WFw_#Ih|P؞. "+Zȼl~$eBP TN5TN]㶻G?r/7K$Ö[3֨ T,gK^_]p6BQTcPEtWu+K+6o$0QR^ML.gS~ѷORVe9壺 ~,ߚoG)n%x4KudC٫*׺7ׅ {U'P.0?Vz7(<|O2,O7przJonb y:m b [xu;OZzR-!⅙UH rClVji2wr:ָ7W ᡃj 2 XqAC*AXw?V,,p5C%V XX\#Uf  fwiBP>6pHn>W+ՈSLqxZ T1*/@L`J QCk]PԊ-n(Þ#n)sj Zpٟđ"b,0<__`hBN$#:B G2y%_.El6U^\$d»z[W/(%ruP<{L\6l4-(ô'H*ŧpX)*(Aa 4`cеa/4B;{V-3I*h1nM affVps&2DΜb>2:D ,h V6b z@d8*ȢW@uBMz 2(TFH 4EsȻLa)DX`H$DwFtZ:q.]  E&h{Oѯ$@V(c 'u`v͘ {WX#YFD@;2dS+bBkiPe`R!i`5524:;wI7pV A bUmWfBv̈fؠ'd;>T3;cdr:qL\6VT.MUM~#*U4XuM6[i@yܾ#bm&,hPDSJ=}88ɜ%S:v%׶"),-&[(Ќ:ժHL|.\jeT.YWi,/M 3PL< 9+PԧOoX˶E9jqz}WSfSNL(4,9בv%^d!ftÂ\klRucbΘ%Eh ^ }USnj|}`SIFh NuSd퇗2i('KVQԜLԢíeNI񱑅;o,>s;Q -e3XgBܺ)Y ]I(7y-pzr4$5X\Er}rԹYC}3Ȫ71IBtOKun=kS~AydI4:\nw_!oAjqOI7/Qq@[:C-:ja g 3%`>Vʛ\6N0Z/@`ICBCy "氃f#[̅!S*WQ˔t. [ٟkBK{|N7w $|TmʶfR^E{ȦmFɌ`U٠<"Y5`^6NXY~UaCj|Vm 2m괏N\HkѠ~ZW>E}kmˎZu0lqت~Ǩ}Lu<1,M-sa9؍1.D"G4xrW$v!i{S Y"C:ꏜ&]%n'(s`bjY2*@dM!N͗a-oNvc v~Fm`MpyȟʕUI/Hn)A I6iK6=Ӫ,{w0y٣C5:޲Ggz;I9~WZ0O.ݍ_fQ \'I6Oo/Dț `'܃QJ{2v~SrRBT T 噯ͺ>=9粧{ng\^{wemj{Ke_GE󋸈6q K`y@7rlɾb䑾bgK$-؛(iٖ \ĝvJ:ʒu,1ꖞBhfr4G_5 I4gyNBqH:Z ^Ra~g>DJ\%q}unT;TeК\b)ZTQ3[eEy.7ˑ" /8a _љц#ܳw7dVPψ ^1x-Iۛ=H(zI6Rf!ǦXo"~Mw17QdDm%9]Yx i'^]u`Z:AY^aQF AjNѷivUKe997Hv{vqLa ,6$3мG/|U] }cUCR01ya:f=N+µ]f%f797~Z(Lw{9hkk2ᒹm3:Q%i+ɏ0c;E}³2u9͆H {?D2; R/lUKR6ve枙)^^PadleSUhBG Sai: ~A&Hj ?2!!їBF^VJSS}f>Ba6lV,Qky:`9aEr{>~Y޺6<' .ԂUU+Wb՛_ZMF(lfx]O)ΡRCtߓۇن\5zΩZ{5yZajC%y#E!^bg ae9TvXԔWiPή"KNc&6}(9@+7H W7mܫ4ٌcm]Ni<(&[Q NO Ff5F\>O/Ў:-|έZDZKufS{k%Ylm:Xyp| f5PSoi̽""xEo/}E9Ws>ڙ*)d>{ƪkҟ65!pjAyU╔eZ<ǝVڔ\o JZTv5i{Ң‚0.$:RR|MS0CC'8!%N*. |g\M~k#ykkCؓtik˥MSNԬnYĊIYvaϸfw&61cM":3koJ1Oƿrt/eij0 Y 6p \!KV(e1IvU*9?CχpPOM Ɇw4_\O>kq"N5(L2Kb禷 L}|ը:+GTK\|?GQARmg,wp:pA>_ ?#"oV2Zj5~*3xeoQ6MCY!iFvp_&w w9jI<Jpj&J8`*'_J!ZмzgW?έK 3FI*ɤ t%G/z9ڱmaB{9et9K=N7:ס;Rn!+|iu>1iXɧ*}0F#0cO@옞T1Q%LJXq4:Mxqu"b5!ykC'؄ 8,뽚+JJofY>+hiv3n:kalzťFpǘs`{(S~M]|n,C3FliYub&rMxk kvr|X\tͩ bn>;'(&AͧLދW[B쎹 +GcuڐsFmb{WңFxy*IϡI՞֝1\" }\lhd K67FN|LC,Uhڟ,~ZOSia;5ɹ`)*E1g@0m$\k2Uv_%a̪a;uL -Bk>f4{lqz_s]‹FѫKA|-lU4}?cҩQc?Í9Go YuLlt%QGs]˵dD] V<})}i.%-e lNF˙zj՝5NkWU^սXiкe8aG]NNizY%j>!7?^C,؁('Gҷ02>Jz0Lںnc7~&/ܢ}E5V=9pBf˞\]}y?zdlYBp}sU`ӉueP#a0qO|v,2>ܴQiB'V wKNTk\+zdֶ q3CS?BIrrf*Еwv] ?Ks)5<@ =\=?Cs6M^M l 0I.C{kuڙSKmg.ݻ]5q*iHZvb:iF(fӡz]btg\ &x)y3ʚ*f`H#ZHѮO3)cO x&,͝fzg˛%2ܳR";W P_`WUx/:άlc#7};E}cAxĿ5yPT-x6Tp:ׯ{?_=lGd^#0)܋0,0Yy ɩUfQP#0"BUE|FU!IweV#AoE,LaPyuo!1!V+u`WZ;IRTeaQʥA*?WteՐqٸh/m1@V(*Y^;YN})xEMƢ _RI]2Ir{2O\w4ƛlCf!#[W##gb!/fB^~;-37F%IZoh&v哿1 o1ņlg"vZU7*h&W[A7ªPYУŊCЈ'nvWw 1l,\Xg Y}4ˏS83P]B;9V3p↯÷m-|KՉ~ =gC)^wO2 mYvF֤ք Q%ږ,eN0=C>r6M2 ܳ(/xc9rDXWDPݐ"wߘݽGYg`3>i)y sv 6"& Hߘ@ΤX83b,l3  0G W˧5b9B(+. '^y׸{W3cHX/]UI$|s :vui3*aRje·3<8q)dlMnQ֟m?P0J[b n}>'Dڊ[=}g?L9**ZOuzammyvNv.MT&f{nQs0Ho{2Zw1;p[`-U+8A$lE -> (vV~:!Ϊ.%WI([?''CyvܢdyhҦئ#ʷGT|:i ++QݍH);II:QǦŦq]Ώy8@"|m,I5βFu`ENaf\+5@U]hv ƹSsS(ftF~ ս7M b?G)% íiϼP5(vy]]Dk竪~4>*2@EB Xo,Ml,-a}X˗z.9> HjHueΛ E(</9Z!6|S#ihʜeY^D[?(K-*d-C0#"RET!.B#"C! JAEPYE`2+Ɉp!bkp1[K?f&.\ዟ&dcMZj]YR'SnUfXuTP00:v_-܊Tյjm#h,&65H%̳֭%lA$5es1|=3H-Y'I7LۊetjT8/'s.pTf k%e9_<螵xrv).0z*()kx8moy%-tߴ}^K,i{w3lsg3K,w8"RT~+GM>` b3fC4voCv8nLHG7ty UO,'6BZqgĤ|Al4i&߳gV:[ 0b9J9#EdjbyԈ>5ӱܱA?UҍNur`i^]]Vp/~Nnt+'j4~K0ֵxz&ؤT! U>}kw*<|ۺ|X#[|pJqJtmRl `L[j7MU |9B\&v\Y{ .~b!:s}@tX=& B9Bw $W+KtPv|+(\W 9M+fDj{suqKLŭ=/x cWuemP ܒ Fml6k6>zTc~[F,eNDIcf>VZV X}(N +4/8Z-Qzj]ɩr,n#FIaYc:jEY35xϡ\h*0"SAue53A)uW9{9yQr4iYkG",`]D19#NNO sge>B,:1n{u0Z4T:/+, #t" 9D -!;Ps9"@(PئTN32)eEFBFpNQ ΦN9jT.55ZUd2p1W7\qA  U!HȈ Oٶf;jq\j C `\ÒWblUH_>~']DuNjT\j*Ռ!Lmh]"(z$hP $I$I$I l QFC$qXup`qU \`c XP KXKqERt101Xp553HxƗWUKֺl8b:\F5Œ(U*\UcT1ñƖuZI--PU%׀XVI,W `@@$B\.0>iR HRTz_1Q1b8c0J(`%1*Hb4 ;ZIzҰtkl ư%U!1I)!J!8R(֢_b @@("" @"DbphqQ^V)$+1X1XmZQbX1X^c0xz1X6 xcbb0*KUHaiW`J:cazT\VCPPǍkqPUBHxCkk^0 ˯+Š $=bj(Ҏ‡:.I*5.^"_8/\Ga.5CHR0E CPR$1.+/cX8U,bUqZ\UuVuG!%T@`WX cX⺊K汊!Dd)5D8dP zư=c`^8H5c Uc>} Hj<!W5 !v!ƿb!b5ↂ]k .!a`ת^<$5M*׈\~@?cX+ :\!0 yׅ1KOY ua@0 (@2,Ua!cZ굎5U\j5\V;T=u1UE$C-*JtbP,PX֗IcXZZ~qNJЬ$0W֪Kmz㮿!Ʃ.A14 xVWhkHb 2 099F"BĤ!"azWxKҊ04KUk^0cak>/:¯CCҰ܁ Q@!),A 0PRb@b *CUcIbc",XIca#F\B,PTTR )UR T)BI$aBA$!\*U 08)h.* 2@LPHG-P04Ȇ:KUqꪗCZ4* eV  RX!i`PQ*,tK$!! a.*5BJuUƵ .CZ V0\,qQI *ҡi%XC Da%ˆˆJ$)k%ҊPB5PA$ )B((HuRTUR%8$JU!0 @PA@B*+@!XUbXZ*XU""CF`d\VF*X#Tw+?l YXTA.(F.:\Fz^K8XaBD#0P0ҥ.1%EPCK( !  I uZXCI,(Ʃb$(UR @ @ uqCW5X W! ~0 A 01V|cP44 q ⱊja$0Эk"U8aqaE!XTiR AaF11$m8CK(pJ.8-aPI5%cCuZƺqajqbc` -$4WqZT**B\U ,~ҥҠ5ֿq$0r^(!TXȕat ,, 1UHPD!XfhkB8ZIVPqZcu."Q:g !XPǡky%"x EU财$1!p!4!r^X40$$ D4) D U@  ODVb^ؒ i9EI@@; B {CB""&*EY5z8@DPP@ BB!BQ !  D^:fM|P9$(@PD5 TD@#""|J"#UDDEƏ!!*&aaE8(D* FP$. bQ {!T FF DgDA!"" DD~^@a)B@* Pd H@k|1V>'h "WbN@B|8D"D/ID,`! Dk@{mhD^qX@4_z 䝃 d+|C7Erw 8|VZjadi#d&Xb"S  aDшP/>Gczn52x4D 3ǫJ duIzJq";*,GB"NhPbEt#mA踨@DuQڠPE)0 J%u VB*B2UDK$!DA"t_9@B@/pN|}z|jqLGݮ_p! IY' &Zէn,kTN\[e؎;cO))p|=3 @[dY>9| a", %%?JF=#Odg mܷ{c$h72l 3+Tkym1- mUwq7>!t羈y$g؂zgV`b,Y,hHܻk$Y 3'۴LL4x%7Fjw!$b sP~/ 8_!6h?ɐs進[oR(ϓ23 S=>dKUC'@(dhJ*[Ů[O5YM@7gGQ8i u FA319njS T,*5'^nϗNʑ0kxo眢3e~mN }\|"i$ M.`1!r Aw_/ZI0z˝yoWg'@h*0/OLpo`7~ʮfr9읔DZ)ޯ E>Yd/q|9vޟ=%\&3^ڭ&:\pu. Yڭk~K+w9>)C:NٖO(q0~EakW\7&f2UQ w1%}t v;l"?2 !,VDoQfNU[<`J;fapwzmzr3b!: ;f]ᷠE}2`YjHeN.8=ad6C99p^ RÇ0pғʡ~"ݎ`a/.f4{^vg@|^rA!t& 0@Δ"7m0oE:LCƷOիxXm~2Q`/a|--PA'5dnqB/-SDZKͰBgԚ:w!:a]%rQs-{uM,<\<; gyt.-BT6;ޯ疍WWg =7@ )*W:45N'C՞2KGokʊ+M髷ֺ  qvo_V7H _ Vt;79*(yJOfȨ{cEWb(ږo`0@fWNga$o+<|^-^`f h,/u3!khTLw}y|{2 m~+mp^th8Ż}|A1N;<`!7hoWdexWX/Ӏ 5 _˿8e*0\BKTݛi9b'm|@Ȣglʬ# DHTrN$G[ :KpjUAD^{ j6x[;Lň&EB*JJըl|o|,x᲼(<]_1#pD3n9AM;۝}HR,>_[ڧ.w4Y "H@ *U0B5I$ A@s؄k=4(lcejhz8MRrFpj'ВaX#wf2 ]oA/PcVK^n &Kq2$ԅ V&ʠvS}f|LWnx‹CB93^L~ 'W]^_Bnبӆ7 Ygl.ߠ["ZZ!V=hnF;&}R++DTZ1|ta[W<;:ҒRtfwl"c)B( jF`$Id{k+kDH WmV6]'+dFJӾ'cEftg+0 .wջ?I.~P_jRCc}٧(\[C@D2$`!-D 鐁+1b$Ԁ(XAT_̉QDL@2$XD"DߔDP:$ JqDDDK`J"Y(r("b ސBDDHm(aP <(X ) ~JLy@eq?*20R7bw*ʊ?Ř09oc]Gwp^^[Z$a2[.zm;14BA0fp#WMtA/xE3;,:JtA&bowGh6 K/" g IzTQպO~zoS q(,%mOvNL K߮WJecۖCR"REfhI9ƛ__Qνeyx0όtm$W%j6Yos޾40 LGGõ`0" ?!*\h1o.C\S~߱(\܊Cɝ⏑!N7W@A ˀ9ifcF`4\4y.qZ3o>"͸^75e#ښcuhlѺabPiEk'RҖpRJm+Pt3g.&ȰTmQ"OB֎F۷.|.Ud$E)Klb+]wuZ?^g5%7#|6w΢H%hR݃|Xq`ؐzF : 14_ kk<А]x^)Y*olQFv3:Q-O'EoKp 9Bnl#292L2 d9AӤ- $.y"ZR3aq4ջ"3`K(+~,0.a" R >#:3'qL/4^SYKpO`z} & 9@Cىïds0UqdJOls2Q/gޡ͵ӜuSCF+H Sβ0Mbdz(<ΈZ6ˤ8Kd~<=y+|G7@SHn gq)0C,io?~:=ibAd~@°,KKi߸]i5Wfwp%t2qnz Bx9]1 W~j tXA%0XAho;Y{6g]|p]EfI]^σk?൪ [xHRDԢ)F*ޫ#|+=VcOtZNˆnZwWim9QoM03w11 !aQ*XWT$z׽q'ooHwx?f,&&gFPNt6 *1qE4;2 gOXOTPP@(# YE">QPBTK ¤4* Ai:|!xl.x+#7oBP*DxȠU{,f 7@۰hkq&EKf7)*6Ghj6նc5x%>-P `3|ȷԐ|4hGԃt9 r6*_yd# #g}^|cU,1GXJs{zeóʞ8?pn(?>=^MK䯣wR(?gg55z rތ`Wr!ɥ"yV#MJwCAAO4;bTϱqȆ[M9[~dr<;e9n~#a߸PEXI쩂+&РF%D|M!2<:$B0%02$kH'D!@hT&)? T[bTBB!#Ej A $r-#kj5]T4Q@(N`:@#2I҈DBM!'JBNiD#R&,H@B98AE!Bl c D" @1 AD DC € "@eH$B Z& 2" (Pr( @A!R ސ[JG”ETY@(L׈M1  EH<!5E=D/="2;7TG>DA+!)UG`jȍ)NQt>W\rܢq8n^i#+2%7SWO/pFGɭDư&@+ ?ZKgi<`=?mu}x}qC299C I hu80Q֗ѽPܕUlO=[/- 0Lm,4YN(NƋTmό>:اh]8</kCu-c=3aVz.i"Z#FUNEFy -kg;x>s2/&KW\\t/í3OEOz/j4;##-\/e-w-y#x}Tv?.ylGNX7DS l >M0I)? hy! ޮ/3rlcR- x"T` jt<˙2tDŻXfRjo\ ܨeǑ^rk6c뭹æԤ9JHGQ ʑrѪxDtI4{;^9&U *Ot:뎄"ZQ]' {hDDE@qsb3VazJ !(NWu38xan]Y:cA% 'z-Ͱs۾E.'6n j } RgId 3iEIP4}<]x@GHU۸:=?S٠xGj_7,g T@' rHXPvsGSj8Rycڸb2ݬ9s%4S<Ur(JA `] ! ~ՓT/x ~{G*W֯ѕ.8ӱI^c"mx^q(7BeѿPʿhd;Qp! ܇]ƣߪu? i.3/&DR⡑{]f1 A5^;f? e4\^n;V>фyJ|5cDZw{Fmlu(~M׭Rg]!th=IeҬ_U<ߙOyw3tm̚DR պk}pBÍgZ\oƽQ J֤/IBpC)Pyh]tĚq k̅Cԝl @ !I$ :UT$1T ,, I6=Cydկ/U{w1s9E=u!0,EY‰5:e:ΫK^hk(NIԦO"(TJ"Vy/-WޟLcoRxwj u)8m}]0[d9sHǎWS@Uؽ2 *P ı0Dc0*R ¥ $f#%EK ML몮(tHCz1wXjlNKp<PhۦaSvf]~T~}<働h֤\MͳųshYֿ{z{6fMmQ{,#\3RGo-+Yu(e~GrZ~<&}̳I78Q%4z  H`JTX_ v~SV!@ ]%!uł'gMVfb/qgDMvjn œ@H eC:EY4w4Lܑ޺##D(`?PZ'H.:DH,A 7Fk'XPIn'w_# kU,cTMD^HO@3$҈ZP"P@D& BB D x@@RLi@3d% J(%5"d@@4"2Д"g R @%d"2EB"&@8DNHD@B+̀hN)b@ "P  D@r!Q 9D2 B DA}*aHDDM@\ ?`H5 b1!KXW iP!O Z !D܄@@U+D@)! q@D#Ba QAñNQ/`J"rwJ2( _1 ͔2 DP%}@q<+ D @4" Q DDAk("yJM N)@b@xJ A "c "}D* ܔ (&( bjB&(" A2a̢y JI@-eA PLa@Q^P"'Ġ@ $@' DBBbHA(#‰) 5@Wu\&etPU!PP32 EqZ.c^ʚjOyx$ۥtf??d)MQ;/4JOjO`I8 pXӷj8O6zW:Дډ_lQB 2O~W{Ow|z˗J*?_)^nǩqG*`ɍmztZm nE#MuӋuD ?֎ɗ;Nuph-nq +G5bt6]ϳR5dž丸XZ'c hA=4薏{j j T" ݽi/&~xv*1 cu,6kQ@> כ7i\߻2XsF-y`ht4W5Ku},;kD'wh($xb,~/<׾<*Bs("zuCD[c>~0Lx}x{KԠzcZ|”CT`OKykθ x*ٕH<X[@h;u%GץZNذbN&z[>?iTRK:i5Ɉ3W2Q<8;DNH@=( :D 1@G" #Q%D.@(B`L)DF_2k;m%q^聃ۈ Jt?%>] QQaԳ&y8Tuv#_.3 `ko»;"W9^@-^}De^|Y|ߎ@LQԷlPOhO+w!wˮ0 l&Z("Z yTh>8 ŷ|շfKQIXK'@=s1(l6bHI~ɾIG>fPNs M^.)PjAQ_K}M[ {v1nm#? u;nxmh1tH$>BL>[٧Q޿6xGa1>v*Y-Șz#cEw{n셲`RVSkw%.x\6|?`%Mv}@{iD,Sij;< 1! EvQi) ~r0opћdzE9;#P\'F~c! 3CJecPF zr7]뇴:r wR_kz;p~@8-Yc\Hb`R:)G0Q (6$g{w%&ʩYXLi*p쐛XZD] nϱ-Hnn=[6>gw{]=576 T@YlC )N:tav0_j%{E#ݵ: ?\npkY)F2l.9!m롪3Jc3LN.y&G}eNna@ZTs"g:#vPv6˽㼸pQo*/dQP$%A40*N9~0_΄_TiI>A`f춛zCBNnt Q !./T$лhϏAh*JWkДyUg-Z7i/ɉIWv>c,qƈ*-\LWA"i)vI? m߄K0J3INpB i 4qo1F 3w,85w00,Gm8nAʭż]sUYx|ɾC9TkΑh'c?5MAf YR2&y?]w?<ٛ) MW/URjuƽga:g&XQeeKnۀqFvNkN-Fv1ЭU垹 e*׭A+!$xz)d ,vӎEVy}/t0R}-_Cw ^tuf0M Ҟ Z@u6<HMBsYMveL3~܂~lp4&+b,vhQz×qa{YE @8:@Bg A~ڊ2t~2HxN^Ff7l1L.~4< _ϋ>~349J3JWGsmd(tfd_!=d?0]P}ej< 57Xm(Btx92 g*rD65>4؀ __@(N VP#gR8XmFٌ/ @0gX 6BI ML֖Ca bYA\2bWX?^f/􇪾euBTIsT !kSIM>f&jAM eiG>!|_TL[w NA Mϵ|r_^)P` f43K7} G_y`GJ/qK56Hk1s )n O(-gRv5VG|z'v0 z8ē/ϳt-gهKb3T8?A谐0`RJx>yG7W?Hau3`h) nN2Cy9T 9,&m?[C(_|_A Ȼ0ꉿK"7?C= ldԦpȅH6,XEucjo VVLיVKmk7O5,ǵzߑK{2~'fRIb'67J8Ytלq] ڲ~3쌫w*™s@Yۨl^9uI&|wH"t&*~mTsCg: cRף#otpx1 `&08ַP6T=" QDo~4+th^)=ڈi7g=v9KFR5z[;+jHl`m>Nʬ;Q3TX8F`SVbjm`zfse$R A$W u|e UiDBZ. zOm 5/tJFj[:mkc,yiQ\a~R%]{m=kC݆ 7|R+QS< e!2E{}&/Wk8Ch%Qzwrw#3P\SUSh&[7O+d]*{ԄaP/hepsKIZhQCb ;(ˑzOGEnl^~G ^U6Xnf`D08Z~&%Aڍ@*"\P mF q0 1oST/I_"UB-K; WeUF_6ΒT U{wfyXE`@l)stxhikΗXd4o#ҟ2wu$HHJ0 wT؄= x.CZ82#U{Ȑwws$@0/Qb~c&)8KcnRn0f?+g(_҂`ķ,"\Vd %VźAus/=.Ц%~z.ׅѓoD&疚;e=ץ)imppDF΢=\zt4O6q6,.0/<7Jl`9#(AV(TG$["'m{ݾk7]5sDeq2R*0cTc6=g6(PM_y j rC{D&Ǎ*Gb}쩫:-ECVڬdRĞվ T^pL9?_Fvn;^ rp'N! 8KSLr+ 2Z C{+X>I/\O,NOW|o<$|YN /`@!pTY5j??"6>W3XN!x}܍C?r`,(EAHPz Aⳓe*bJY mN/E2|xNbsdqTJq=E{# w9nN>d a_GhbaHQ @^z*T0X5afbaJP ЫC1 76Ox֏{,Io *ހ66MOݪ]#\ &ԴG` @TDa0"xtZe; yyRw(Ƿܥ}#[e{9oFXP|+ʥ/_vv9G7vW74g;Ө-g*qZI=D{]3w\?U&je3c2LB $b(@:>@tuc߁U֡c jQFV#oŹDAT12wPw 7ܞte/:/]ѓVTsa'Iܴ]?xFѡ #(``o?U2;/!QB8ℳ[!s`d_[Zopύ} ʛ$ w5YAA]eaKXѫXkP{JO M`LmmǓn+PX/\X$*ct x zNo/2KQ%(c TUXI (( J>W#ɸ|^M3:|>_rcYF )he*'υ :=IWguz)ہl3(]Ak&Ą_e_LMf\[.b> ˇ-Lbj5E{=\&!<5ӏY&ZbC PIBIiaU )%"ID$Bc'mY2ai H XT*A XT@*KN\/:YzvmM2]ZAP;λzC`CvJPvԇI[~:T輓ҭ`ւދMBzAt偰0Y:;=vٔ`4P+`m?\aI}p9  ` Rt\(liv-k*'%k|ۡ^W֌aEf]%gxhi(  TPiOA0mg<PIϦqBY;5IqH ⫇w_ڮmpP1ҽ0>y$ظ3)<,z0owWk8*nK jK"|Dl4 }zMl 29j. s' =RC/Q1Vol7M̘>=fүrֹXM3#37\M8yߌVpx,l%לVYj1]9ecGc8OʲЁ**SVKZ WvêcH4.<Moc"߅ 7=NNQ{l UTQtp#,Q3"F %D`c H>2y`'˧/xe/h@~ e?C'[$5{[pR$MQm"d݋ވHS^ٻoGqﲞf/ϩ[a;pB\t` Jm؇V\ǽk}rb{˯;Yn"/!1i}cwhz0Rr4'D)oO qhH TfX(ܘ-ڒhcHZu} bc)/[A`9W[KT90#JAN.7+|2j ˓W0-cfB p)[1ԛ-i}&>A6oZ@Пd`cFb/&Ȁ֧w/!4<Lo˥uhPK(Fijh^ 1t&]e8p=Qzf ,_RO2? b%}n ?\je|ghRU (ckdO 3>RU U0Ӏ' ,30>1eЂG RNk bbsd\/[jq!6vߙ23,@`\z쬂{Zvoں&l߇1)RH} *5g?ՠS3K赡ys%X2EC_^gC bm}uJ{:mL5?; eBmxo8w7#7h!,-;L,FQ!TR.h M3[蝺) 77瀑+Y%*t'*BF RHRUIFT*A A_kC(Kb ;6>T,9BCꀔ,UUSQXKkPY`WU$b?wW;j`Qr&VfBNh@"!HUA!jVB)KQ*HTR UE$)@J(T@)) Q (,( J)B@I (Q䑡qRHa !H PH,RJH BH$\T j5T R,:.Oq%ZxzPnSMub}m`^H%l[ļѢ?prk{_DS뚴@=wT/*>#pE-ISxEr34>"a!Xl:k_x;B|d 6[ !L-MTRB#y;67#g#LA I7i9cբ|+f<Sȟ_Q|K$Hh&/y0{G7ySyk\s}U뭆=m<T\U}ΌpǥΦͥ/#hzh/4/~#r" Kq>GkLho?UR&Hf;76Ҙ=֝}FRj Cd!tH M-uǬ-Kj^Qq(PP lT}{_HŁ`z֠i/FPVaq|hQAgɧD@gė{mXG$eQ~,WOf^[B+Ve-sO&a(X#ojJ,k,_uY9e21 7}({cyfqbRpf &e &y> )s ""Z G IO%ch,H c)A q.X]Pmylұ2Q3xS⸷?{Ca& "j8:-W_L ?52QIu^N;#}g]\Ɩ`m{3oTEkZmZŏ0;=4_|2?})Pw-'Y/Jd~>E ,ZF_iL|cZ8?Dnhk_@PJv?2} Pq\mҊ`tQ5 #CC5 ADLy cSG"q*v*,,J{|w#~wk0`KP 7FpqyGܟ<Ň xX"C(#3X~FwmꟶP jb]_137;NXrHC5$ZlH +Q`=)Z^X)-\ fO{O ][KYkd{‰-ٕ1 н^5z[P$UʦB,qmxkX-xE'Ζ/_a\z7Ō❒EL! 1ۥm/8nNg59]/b}(Π b zQHaSb + %(_u?>st]U.f2-z) #t @[J"FkD:d DY8"R  񈏔K (=(W6"DD ()xT{ (Z@0V@־@DrH rdEG?](,RBL ?x#Lea; ;M$A ]K d]Kka7(ˈث+0o@8x|ߚ|̕8Z?t W/OQzt~ہ(D2=|Wt9]~EHB0(9P]cF \hx\GL(qKGEoQ gF|/|,RS bHSEO D#F^u{x%N;ƺͷj;8)`lsf|ϲ>co"\/28b?~ *MbK:@?umEU//E2b=b,}t<#Wc?G.P??}ysE4]Tp=?Р@ =GR @60r^DU zQn&^_b8M?)/@_62Ӆ~`Ev7,Ns;ЈN]g۟Fm'k;PQ>->Ym?x(Ax. I+'R HV) HR&gL7ǿoOStL]>W|oQ$(JE HK (IR'T4}9 VBД ewkޟ )1 aI!AU$Q kBK+\p5# Ep*PH !P:LB`pU-*HX^5<.]:(> MhµP%f$ENjmD.5ja NVς%_CP VƒQڶ>!h2 S"yʁ=bƚyF/'lwa?ib*'y|Q(j9[f Dzos%(NNW835. ֓>NrE ;=׊ ɹM.0j* KB396xF|;q%2<=V 4|\E}6w/R7,;p!~oܐ7>7~'h* OjKd[]$}WZNɈoIRDID!A(@Œ1X2(BvikGojZqNXXS</]S3Ma~N :PG`Fg~wgָT;LHվVg4/5)t- y(}:;z*xh/%Q+9 ЭUb}| N[]L3 V̝OPlnbi:&+78[Te^"-koJ7[IAI!IR RJIj)* R)pZAJGXJӧ 1E(ªCcx^oQ1wsp%Oݷ*Ŝέ7ޞ {Dw){)킄flTψJ6*O01/8f1u{XPj }l?n$D g;Z!sXэ,rՍ>E ,V-w_J&C`g[B$9@&pD q@+(@BsqgHB b, BQ 1Q[܀$҈ LDDؠiDpQ$R @`@="$2D!H@DA(pQ%A% DrNJ ۨDP@N1҈ I$Lu( @ U)(4p@?DD&T~ 3Ae(m 耀 DDr@*^Q  ("!D$bMt @@KD !1DA(9̢@H R(t}!(JrB @!"QJlr \PuH5%= D X J"kDڢ(% (b)M "NHo&,B6( 2(&Drz 62frǐ(L@!HDDA(%L,QTPh[Ue(NH s(-hQ?A#FP('lʼnf%sebgKL1'!|ZoaRc m>ꄿ%lWDt7e!dL.p*qKyT0Kq@_5NEt+gl$)eѯ}Fw&y<r pxp "x81(0II&k3ma1&Ƿcn`lpZ"L0P -1O'\;XX|.y)C\"Ӓ\p@/\]|)).&@S 1_c>ӥ׀/w*1Z$wSf 9,M*hhY44bЋB=6=GR]fƔjnx2e>DW;Y|&ODk<=qJ^G7(_Q/؋w+r q$- vcbAQC.b+bs(v$~JQ?C0hS5NbkrǚݚwGW}O_G{+s. qů|b>*mѲ:N%'5CBE1 q,c=&FWXMBC]ˮPnXw_U8O-R盷;g!KaMϾ|w !xݡ{̓o6j*#ݥGt|ǁh?qp:C1ҟ4 ,5S#oa%Wlq'9 ːЩ=Yn5۳"rK~}UyIawFu@%<(R /TP ^ZzBB$ UA*,h lOx -F3Il`eDqT!B#M @YloLb`d,X^iY⾼#\Z4湽iXƞ:eê*@p (PA(A( E aViFP Q a J @ 1aFH.*aFHiGq`a @AqBJ!(1@`!HRa$BG;hU'y9 1"mgHgw\$r3zr.hޓx{=ű "+(9tV2ÝqD<øV.[ge28^HuJjS6dRyTeͶqb/T%Q='V!W7 ؼue0*5 uq|-|)S|۪z/XdzZ]ԃPSxT6Q1"?rm>P@ҏ,K2R_7 ^F ( E*URZ `dN':4U9V2˜dܕp_@S$W ZC>+"5Ñ P $Q)*{i,{`Iiycm bwˇ!TfRk$pj {;_bdoYbĉ?Z ŦX zRv^D. 2k-iUȒܭ8 R>~皊^2(<N>c4ϹK":cbt3'GI׺o5F@pO8i*^(B#!x [1ud%=Tx:s2س=xv&iKp!ؚS2zW^rPY)0 K5fPX[McRy08=햀{-KDPp8- va4:2|ijOR 7,=Ve+qݜLil?3ys-Ub/(DL'sp,*Ds+ Jf b 79y~pk ϊxyJpoվi]LB2#V5{r$i)ϋ\2u/ɕU zOLnU#+6F}8{EనA ٲ2 ;n;.a*kI AFԾA;#.wM1 :>ec`;M N F+%f N 7諨L51 <9MCS>wlɿYi{S+׃_ZDyܢ10|]lrG)esъz1C!ϠbGfRr/ jN ZA*:=/"s jSћ"F쯼8Y!e.b+i7/>N|ySwF<+o'1<rtIѰ󣧍u'rtJe23Ҏ{^QLs_*nEL[fWdTGֻ--3xp,`viɻ=6&[(֬Qf&IZ[I&oKX$ix!&vΖ" EcS=Th7!8m3g' A[Y07?-lo1!o[qG!b -H?{ $ߙ֊'c*mV"=P/q`ϙabv̎q-rOPnkM>zxL'?*WeA,ѺS oI;5\zzybu[&S o\ɾkqj켷 | $h$MC* dc vyMC\ŧ{HLUH;ZoeuY u/r^a%JVF<],| 4\7(V,Q`1,|J0k{b-( >6@Fr7.e,)ˉ[*g "l8Y,& *`8+e xJx!4LKk3P#aSAŊfRE!#6D\@VxtGDDkhi> w]TG h 甜VlҮ! 8jx7uqF-trV_>:Qaj\l8df؎^jasݧ? KoA|BIf2uA!M1,N-<Ͳ&W$IcdۃC;5&y`q]Ӡi+22Q)Rcp AqXBxM ݧ>2sq{€7s_:vǪ~\Dܦ=UMPCEUM@6*c@F$7gaѾFK= 57E^:(<ݶZe~9 #ʉ.:X&nx_,:~lü"Ccdt"wf D _a[xOZ㊃@O еr7s*-r6AM3P)F}Q|˻`he2C/ ~J<clLwqJ|l|S<sFbK$&_ق߶ZQq?lQ149^_so"Jۦ= {LP^Գ+CU,% H[Fme(y reK.-6`PHIORfpkv " 4"+utE1䤻Ǭ0^?0w@=RsNmbr:CT5P 3Pv4(Mjʛhś|F9dK[VͺR#ɍD˗ ӝ)3¸O'cf C|(6{h[ 3%7d~=Je_Bq6s+!3J֣6L髮)TAwW,l#-08k*{Nv$FsC򀴇 x3X[ egɣ"Eߌ>KZ۔U܏oWo8H&r8TX^O ?J2/B6+ >mˎ?L: \dO<=h,Ϗ:Bu/C5O=˙8HQ$UMɆ"ޘ K@r"ɸdQiq| ~+S4T)+F7zz5Ýe0??1fᗪL7^N/'mhD`S.eJl6xH?|_m ~#QM²NJh}_-6!g^wt$>@r6q/ww)U ?;μX$mD0]o?'U$APpkYsRJx?{@Hb`]?<׳\pTXI=NДf"57rLZgDSUl/S4x;Dc9H}}صE$t@+w%VF0X*?uV5Jn֞+[WQ㟹)qNբtέ~+Ir +:ܗPgElyj:7;H`{ ifNcYhG5)z?$lg Lv] f}.yuBKĀ`b`QI!DZP8ZdYW޶E)W>O<:1k:L}B'D=jkIg\,M!ޗٵJ1U{, g}# ]DO_@ZKVt3(3EڊEÂ4HViχ 0^f ]Ou# BvusJ x]HD%_ _w@UAaq,6Q;8%T#Sw0; E%~YM /he!@/n\-h p8"q2?>\uXdKH;/6g2lr"]hphx}/p'=mʊ4\1308ݏi@ C) /hS6He9srwSs_1x$b0F LFV+fk=G)OV`6"gU90zD*c|'WzJSyQTʅϥ Qm7pzQ`!Ǝa$lޑVj++G z"RVcdJ%D@ ַo EVPđKO˻ O_, &>Vn xm; IkMK}m|趘VͦKvruh= r9+El1I߬N ];k\0TY z3}oKp^oyQ5s+@p/ B򥋓>+4F0`x+b3eY6iw%>r _<,'ƅYShp1S]@hYS= hFRtERT;uz ;AIZ靔 >B{w#zHaz,T R<~/ 178D'=bTŇtnxݲ"W)C`Ex(W,H{ ۤ0WG8|Ҙ>_r{I^Ӗ{ ^/b{2VCtzoE_:&MJDNszb^rhuN}Nzm-s;C&EmY"ʍlVtjgDmanZbj@k]"0~H $}{S>c3}n y$ePk6oO } a2MAd3Mא ":A,hrfɗG/%Wb)  s_RhjQWU tư\hxBJJ!#J)kP.C %IU (%T!UGI%"/X$.2r9v,ؔE**RH .b2p C a%UT⢱B#4\U"4l%ABQ8$]),wJrp r@1eBU#T#:hyu=|͚ 4*%X6H (+"KK*H$. B4 c0b(T\%\,!RPHUU B Fc !RaaFUV*H$0(TIJ)$PGH$,iP0% `aBT)RI$!JC1J4 %Q]!1T TF0^ҎTUBB.P"ZT cc% xT'; ` }/ މ1-38%e|x`LlȠ0G0pTdGLD#!pZFG'{g+4 M~S#1wtyVabn¸a+y|@K :6OL9l0_jlEۈձ"ĔUKsu&K@mѝ0}hor=VN>ko[y楂Y")d҅I̋8ʳ þzθOF0gim9>|SZq֡w!29t f y49y (dPe ő(,LRG8NO  ^J(EQ-m) QA(1 ru QWKAVOT ?Ո8 ygK0 |褓ĨY&,ڠ6j`f;8y&#s[a$q7ecݞ}0)7VAňhtc+gxXAqL0 {ڔL}5~4_y켞|qq&o[ŜFȨc BP_sMWT:sY[Qڷ?_ѦyY1#85Gb}oP?7!`wm<3t+cL?'nyqGh 2]r `ȍʡ&mK.̮/ șx?g<b P7 G4NllJ9I浟RBg>Sź矌e߈SBƲ8kd`Yf3o ToN. _*F%8!xE?Tnnߥuއ0[CSzFJ#֊\jk{>E*y#e/XqP|:qX7 9Q5+ ? S&T+.:Eoo?ోq{j ,c)M*Eu4mI C}hش# 3\  sd'ztx6`-} Ig=]D](eXHf-SBgZ bP% &e2;q/hkǁvXG+k|i %8q*ī仆q"3Xc6&SEiMz=::[ri}j^.z&|uI~gN2>{k* #J\^]A-)|=7Y#P03 lbĪ6VP*0`tSVGg]5l7`E2x3Ɛ|"h?`PbK0(Hj@A%P ¨Q( (b5CA1 j@%">D)O۾䵾{v/gsz*T>$BerI ] (ej@rZI:)"]H *B "`Xq hkҚ7vrxHJ*j9#.Hq]2ڏl;cS=?V[Z(V9wZki`D ];XivЉqhG:岣3M"f5RJ(HEUJT!EX ( HW (   % RUBIGb @KHRCAP@E$P8\!*@PIR B-!J,`PU HR* A\kh W+W"eRO7zn88jg<2,o OLC/4;W'28n&S]U9֦ MtǡYt{x~K M>5rܶޕ8 W.Dªxo*E"J΁VK2sؚ38r3-\<,g|4mD\˺'eRD޵;vY7.2~'|+F62mX'GfR~~ bI#[+-\]8Zy V?>}dtnHϿk'c8$۷&0:k1URhߌ(J)-7R͐ÍgPೂLBkH}EML2 (T;LD9H@ҀdMȦH$@QTJqzjF"|dPJoω"BWL}ʹrr !>8)Qz(!B*d92OzI1I*r(4yD)Er.uA蚨A謰Ah Q3D%$A(r#Ɯ@Y(5D-:MaoHh2mo#oqnݩ`YkCic^%PQSVcij`Jd'O&jN¹Cg} ?^) Y4bu+8o"@d]ٙ1_̫sۨ(,] d3EÚ肁G#$p?y.\n1ً9= Wh1g|f%БfVgAa=dX pԇ~Un잵{4siߴN6O䤵NB0ocL͏&^-yᨿȫ ASڙjTzMWR,v|hgWKP[qx컆" /4 po,g;zv~Fњ7vӕbQ1\nVLkČ.M tu >äcQQW/Q h$ͱG.l] Xvzm~⼟֮ᅃP ݰ ˰ !Φ̙fí܊;Z_2G6 'S^ 1cdSt uY@zx'濣Q"RZ@L fJ)I)X-ƫ☚Jkˀ;>.^EsFna*ffƫS]| 32lc95,35ej`o-n<M볊nT sfpw'*IEdTҨĽM{yFݢIe4hr8iɕ,Yw#YY-e 5#x'I5'f'\rrPX*-6$r)u'j}ҜN&28߳us$xN~R8{ZTRAHar%*)YO55fXQr1&,9i0K}ǃTS?ث5=uZ}`f2F]ޱ1U@-w՞?of}Ҩ;ʣ`qUŔ"u9rp{x)g?wK@].52z F f wS p9Nf<>0P]3M,e`r76*˹-x~vv;jYs[<*<޺`Y]b~\S*vΛ/i a46s=-'M=IpU5@K5V|'*7dG6kطoM =_ &-OUdf?|ժb˻ݠ#S(pNDIxE^jw˧jL *Eӽ}_<88xRjQ@+2Q˯O}d( ~"OA6#_zGWܲI|64ߙHϓBÏۨfGk t4DU*5ȍK^R1WxCܷ t !DP]Q+"A! -@@" %DrmDRV bP@-E@8?E(OFR D)F\ k*({D21҃Qj|% x(܄ $xD#KaA " ҘD((e'X@ҁ"= ngv s<6B4=myT=X:q4ZƵqӈrc0 v[qР{vR AuZaj6t1h^hw>S1/ۤz/J[.uGkQ,@)vH؉(C m>b@@'kaWoJtB0b94IVN bm Ai |ww& Χ,0.Ho VlhAElhX|Kߨ} AvWэ#>984ZYUY-|'&^V//$vjrXըO6#cPk8;~KC mcN+S/5w'EgUݍpٗxhڢN=EMصa3^D[QkAp 9ވ ͚TfU?*g@Fi#nߕ tR0we 9$Mդzp~ _M^O:\ˏ3 #Ť/ u^e^7#]c5mHL"U3S0d(d4rE%?'7Rr9o!WHP^$0((I$T PBa* PJ"֪T+A C(Q RPQJ (p! XBKe1RJCJ*0ҥT *E*P.Dai^ewVM,iqs *1xʰ b;ϰfRB}n.ڎzNVBw"vJ }{Ȣ/D,ez:(1U!{`FzT {*$n9Só)9]{! XMâa{9 M?es~B@ gp9@w(WIxщMwۛ)7P-G֠H&v e&QQ)(/ Ěm"Fo n\UDMDE}:hux56FcSbigl>,!v;<1ݾڵiaFJ4)CÅG,38,@%r.IEv%xܛFy7YS(Ob洞s٬8=MXEqOffHL'vINoo{kKj3rELyMf-r5WQvZ.}d `뜫/jvd@e;^q'Ls0w+衰oFlz7ډwCgmjPѹL7:] }:`c%gÛkF* e^2bB,;EÝa\.dZey5"7.gh@{L }q|gƲuzVWR6ufgsPW%"]m o(O%r&^5g7`#{xhcY{fxWwsW칎wQDLBtv25 jRaq0;| x=3%kxʖV%+nHl]2-k 1lpS'{E5hNH_$Y^wV_[itUT)57LiQ|}Ҽh'Y-c+T1ȹb͌ ?—l*e|,ZW&㸴Rk`A&D#X5KM^aewqoدEFjbc89i:"HxA0,Q;q;( @5:u) 21IT̞^1BMAdfۦ!0Dz 6u{~ Eg ,ggcTTXӊHrL7>Z=us1W73*χ)Hʼn͑+"9f}eTR~A3b !;i._A@TOE# J_91/#pXA>` ܾ, |̩إtڌe(J=Xl.D~GҫF)`Z-OٕD0OI)ѹ~%WtoS1婔Ϻmo_!ލ}=*XNz-3 GPxZfCQ- eK\j#U?+u-;gz}m.S/p5QC,p֏lwua 軭씥}g e q'W^`$iGte HS[lFXkt{E''Y ;ŵR#*e] w]P[c)4;Ѷ @"yfZJkՋ]20Oψ,`LM*q8z?7KO\#t7fVxeGoH0ynϋ~Oj8 aKd1玗8 D (@Y rbnM!;Z) غ'd&^?BהP؋%-bjQcQ`:,9~Q,?-?lKnJtyמjtV &8>,_mqk2 s;;&ԋK =zFVu_./5ub"7a@U8:R歾}4'vC z{&?Ph`s44y#L h֑,sX$ 䰛O ȧ<_)tCQ}1K\^Yo$cםv/98dR~$^gv7~,vz}SnOb4C?-hHYNc8)]t?*yrHh: ?orm0Ώ?N: kĤjuF}pyc/DavNҜR$O`dsX~54Gq<Կ%;xܑ[|M$EIAh\la/&QB2FoFU"v/oTu\s4{ )[V L?ϝv=GR 7B2ZNAR9~#3fp]oWkΪ.|m?!pVI>{HIhٜo|=EG0Z*l _Aъ4: .%kv #0UOl d +.mgjjTuD`\ys[,G\׼*iUK<꿕|f/>Db0CPyƁ?p ~gDo,Ov<"TzKD,dU{"\c*բ]RfU Y|Z>fkcc \H>o8CjQ@ǿ jP@ Ur'+9퐊y%c9,SbMvQ|/`>5G(7.cwh:d>8T±ޢ҇,N㞆slliҞkDôPm|zyJ<[VKk^(}b$( ˜$4㇓F77mNyX]TUذ-p+ހa._#g޹g/Cfik:!h HV1pj^xvoBA+B˄mY ٽуvawN.'Nɽh'Zk[N3AR9O1NE?[jc\k7&<\wFkX*p0x'smwN?9{<0;,ԨkHcjYGƾ.ȍ[!?axcNpG(D9xsSRi2Bɗ ta`M Rt;tmJYr( Q>nd$̕/jky\"~5vo_I˻VWؗLɬ z뚄ύ^Rcvt +uTTyNq=c$Ly:.|v񏩸!a gc˛2#ߥ^` 7c <qsWݿu<y:|<8WQ1I'r 3%l{Pm%<hzH7!%07`Ql̷$z`V0_(b bzalwzm;olh)rϱv#sC.mKb E )߳hKho8T6Գy'jis權nFͶee\^D_uDži{N혓qؿym|R$K9@jA'+,n3}^**ʾP.L]%Nݑ8tr?RJGH;G )Dž$8kGo?ӹ+i\jS79)__bsY>˺?+רx,Q!*djEF{lMw` 7{βn^d?Qjn~ր=Qv+.Z4^w N I6"3[`Y,ݙ\hȜaSY4+_vP5m~.<)?%cb߽R 'f"{͈nƒCbXFQBo>CЉEE p_B?+.&ÊfDߞd,&] D-V. oHRcHѲlP㝽VcН0 5jC!Lj xpr:"ay+BpNnUzB( J)_dׅHۏȨQ>z_ɉ*RDQ۬{ηxH\RqɚCf %he(\! 5N nhI-{ f~W?X`Z%;aUX˴HE!2 +E3oyϪl&Яn\6ET",D7QA82/GC~ڙIN0|ŽS3۞LX48^0!0)lkZ"1Cl %}ʷn?m#ZXJA.O:G, [g9j_V[+{:}`uKR*@kS]Ƈ`p8ҐSwvҳzT;ˆ"y?iYL$<_P|*,#mScx_O'f~ .`z)U܈L߷FLvMYiٝ;By2¨RAQ㮗 `[9-{ﴄXPO=.ݼމ/Dz{:H@kye\M=R9dfW)V6nNcejo-9'SCҲ1o.慲jmFly4p(s؏C[dfqW9V[+o*e{gK9FI9=˒ D2$9ys ݃P,6A|\ׇq,5(Oru}y$nla"od2@EUR HRLT36g%cUoYaqSe(&lFhuxLq<YN-z͗6B>Þ62{SgQ\+QYQ|ɣ=w]ot1Ӝ]x:*3:zٖ]JC&Lv^[06.~ȭri-o1KYŷ˶]ճP'ĠT]H.țMZS`H*r&V3E4N} 3&r܁)@(Ijc* aeTS*GgE8bkxHf]id?I8̱+An雠np_5JD ++ޭ@sp-9VjZ h\OJ,{|m0f2z'Gj.kZ6napSoٵc#8d4X3iYƠ(J2AL퍧z5ڮHĂvl_p5_W'uX  2wX&R̠0{j(̜fg^?8L?/$pތxzJ|V w@(^g],نW݁rd8 Dp',| ѧ3g*kYߋO+2A_kG>:j5}-2]n"݇c.`VɒpѦOj*_$thvVٿPb~!fG\t?~*@AJamb86a:֞f~5s 8w|I0_ O4S\~Yȸ+PHj=o?Dǎ0=C|ˊ1]`+cr*CHttCko_,Z)`h;qxW+uΓČ +#RbSjWUd$,[ɧydn0^$oս~ǒBYP nmCRƃ(iin>H &7RvY3sڗIJxĴ" 790p2}[ vx,\.kGҗ9и}Jw@UP3Klfd`oOze@{lnzGme$H 2#ѽe,o7zS(x >+M-_ؗ@"(T|7OtJRe)ȕ2*SLP nNi!g%!+Z(WKh#kq>g>ԅ.qlRK/:5KcKH?Ig Y)'p6 p~B* q8 T@݂^I.z'0floJ}^T-ͭJƟ96+Z[Rt6c[Lpz5':\S;CO͙~(/Qpƹ1g;Zl˅b|;ti/V-Sqfn%x>Oy{8L0cQn"/!;>U1NCnoI|QTaە.M7ݸښ uGv/r8u  9hآ?ƗFmPmx ih1y2mJ[J7`sKd^wYgX.q>s8c0EpA(Bd̂* Bf'z[%A3LB =ʠ_y|;:~^ZRl^QJ& ̶o{xޠ{LA,˚\2'C\ 1ZhO{r|]DQhv!4785f'==koNC? }ow\# aޅ)\2S3)y_o}yؑf4mkԮֱ\rxb]&"=nF@1kS&I 3gfd2SY#rz;q# tEE~brR~QGOf56Iuϴ> -V5􍙪RJ; u Ķ<]ݓf\!JD,,9' j*0aHo 5P8P2V-G hO˜%/,JΌ@O=)(*RW]BgQ~XB`LP WA-.%"C_YhApuu񟔭V<ȵHz&"!!*_[L̇4:;/WN}p  rZ6)(b6{vL<۽bdal/Tgh9۾9="(5?N1?Zo0rwxaH {a`œ ~21>9| CT=ܜN.upPop$-kEHc5̛7W@i3p~j`e`\FN i(=׶˜lZТwκ5ȩ(S=R SBA/s53Y) fs"|4\QiI!#oW;IM^ Bp^B!렜ʫEE`W-G& ؉}.'xOG" K+U"ء1b}||q>U @f r,cD~tȇ+}R>=DŸ0g^(`VC$+HZ`.FBB}]ܿA-jLDV_X "ֶ't,nr~t#:FLu%w2E9'[RYzj5,qeom]j|GV8R_q)p" <]_fd,̭uQIh`2W[A2a*#aqNbcUa1 $IV*ۺ?NG!U(1Z.gz6u@eo5gie"}ōEA 6ąa.WH>{#BcTav<^"-c|;x<4V$_+ MOD ]1|I~+" #}A"E4 :%@;Ձ97B[14O4wW|]l(, yz2\{tlHW炦cXu^tɡ?yْYQȂspJQE;F&Ǟ[bhsH"Q0 Fg!?&ՒdYHx3U]S%F':e }?Zh`|OsO/7H-}} Beك,@yz'46Il0RھX[E(P.B.[Ԙo]nt2j^f`6Mq561}_AAAN񑩙0*j^FdcB@* 6IL.cUрM!h ӧ t_ފ#g8&~J>a0wCgoƊy6\޺# qG  zB7r+ƆY#b;P&j^/u k;RF/e `|}T%O_Z6GZ(J@H@ >(@:$&oB,TB&Ą=^JȐGL ( ""p@D230%-(26%hRPyj\-&t4 Aa!P$KSX"'X(QIDN SBDB ikJZpӐ b`@j$F@Q#fP8JDA(rQC*$ "9"x:MHYM@| !䠍DI@cp( œB.EP$xRx, YRR B AAY(( 7FP7&B" )E!HYx:e¢WLt^(N@'(OQaMq Br?^v"*IDay_)уľ>(Ld&?j+S Ϟdշ>zNplE $^úD($5((\$̥5 lK(jD5{"&[![WҒ_MS<3͜`4,>?tm, ڮ$u{Ll:GmNXҥǾM&ufI[D;m7sNGW+gfkRu\^^\ *3q͒E&76ǤUN^J{) ˎ8˯ V/ Y"7 i+\xnn '@ et}Ҡ=}i913_Q?0lX܁}|Ǚh`)?G-CvcDE!. }q"lSp="|E7~9ꅄ{ufdewc65CvԨ<%5䦷-(> XL1.7q&%%!{W`VZJV.+oBhTauƹR%gLDwȀU L`s~%1gw_R@GѠ_qAK;P(?e2->3;hTMZ))\aFAxp`.?imDŽ9'r]gՇqcسTͻ̂+Mt̙M A 'RIHmv{,Y#qE %).;qeO%aދ'}^Y]q3^*=G~:GJH1UzdWZ, 5ziCdwmg?]kD5-*K9rUVN1跣;HRgg 5S(H0J69]I#½2!e!Ac ~MRW=*RB,׻A0Hf,E}uc3:|Fcr\ UȪY`zQAqKN8gͼH󞹳  yanx\yֱ=(!~aK 1~"ٗ`І_nt1W!$?☢V?\h3"N @1o=Aa µC'U$t ,J͒d|<R"8j(Pxw :qcq#;zo5;C癝-pUIŴ, +;x (=$ |-ԚK€Ś70] ,)-7v< nPA8Kۤ_1 {HAC$!"$hV% x>}$fȸd@@-a9; >-.==@TFȅ!_)z qWD)4^Ta>)˜XN#{/QX=9x&mͬPNChlTIsƃz.CD8|ԁZ)JM^#_8-&LNGǽfy::Af6XFQAK,R(po{3H)_;=CSȹ4`%,~2_I% lsٲǘ A-fS wX&+˝Rq<>cz05au9&xnb3w8՘Ô0fycm>t[,FN5N8,PɶclR &8@B;@{PE1GS+=})_ΕBvy Sq_Ff"Z_7pj,d[\ zwi.`d)~LIb>]uiH0J7lvUWWZt,2LXJrJ۫C(⥷bhK e2ƒuV3jзHbL܂+>I3I!Q md񥀰.]<"!AVs֔[D^&DEou xd!DJ"w7s 1t)L)L%QLhN9)9܄<99hU$.rfʩ4-^ %$2mtAK9 + ~i3gߘ)9s,;ICmgoJ5zC(#?m>=@;@ Z5e@f\O|pGӈ *aOTQE@ת? .FUh":kP(Q7(~@om)aʄCF;P Q VO%D,H3WeWME.pXpym7tKk\֊j(t.1vۓhʥ/giq+=%Y2͙h5aecW`xdE9?N 3cQQ´N4FU)Gܩa`\~DVWCr;\|6g:O~48vy"1.koI4GʁbI戏\ks ׮^ԟR=߯|ikoL=K; k~9Ib*u-|r*PJk'L`.?Yi2N#I@붎 >bo̭|2K}.H |܄y#"o`t,j8vh'~Pw#REV"!VU,IUs˦BpÅp\\rL?'i8TA&Lf=ùn7]۱KiiP .X1r|G튇̌d bقDiSwMgƤ1E1 EIpڐ%5{rq$0ɼH`'Kae@:Dgv^=tnE.8/p}>ZJPǩ)[鋡ķMx1F`rw0Ou; ʼn(˼)ZvȥH/pJȗ6kxyVz@|%r3Ⱥ-R)[l95;[c˝bdHS3[SW #S}a}(va5PHGaݱ|<' Yg3qd?2"6!-R.:CDe)d4}EJ؂AU-QJXHì9QwVWa.1|WP,oSWn5 E:Kc}gVq@a_ \X ZKR<;VV(Ndn^F4yZ(~khG(Lv_ª%9jǔi;NXexNbyvxa[>ۚyٴE@x\~l݌p #wl/MCyKF[vgDRLJg xΐ=+wh^w (Mz"gKo x:KW eOqc?Egaߒ4c.i[fBn|Lw*pJECR njdKT}7e&ͳTJм'ߔ^1T68cM? w:yWUWJB@N~GIEtέt?..NE'Թ|VbL_8 T't K=DE+/Gb^R&^qz =#G밞 >*z9Eό^p;Y0f85i.HʤU.>;CdWFذu(.k׮_"ҽ&)g \(a*ۏʯ&92< $Bzd z2Wph1ODRMd0soT2(iV,4_6-9iM%=q2%5!y_#[F[VL=aM !/o>48TIܖh}jlo 4Nǭ)wR +Xz8WNᐺāoz&\K-Nb^$=,^5d^sSJþ9V.:ngʙw_rf=14H"MOݐk\%xY<P8)$OD7H_qd*G;t̐[\pJv.rpBN2#m 0bۄVMW{ӫB$k߆Ĉ:02zo6P&6^5@2i8/ w]cúspkcV-s>ps@CЀ[-#^uКg =_ pT0C G溅wU@pM`K-DZg,YW;ӣ,T*^Q,0Np%$`@Tg)9d[z)`(kW;xТX"8 i,H /rulIzC8*8Φ5dm(;1B>J :*·lq/?ޗ*MH`LGX }e72ڝk 3( f tU/@:n*N*atv@UI'n:IX,=Ns|KJ>,zsEG7yu`GmS`<4ldX/pXm,^}8Έ=4C1"%Buwq Wy׻TQժ~c!u.0[s%CHYkJ vL@5HI).'!&ȁW v0μQۙ ?f͏wh!DM MTvMY8X@=0}mw5ɬp(p8smL&F ZF oOG(` Vێhc vUO3` { ,vtN˼WN؝{ݜ/-b !mi%׈d,H~%D Ń "8۬.?ލҜ"Q _2Y wr؇ϕإ|]) IbqgIVn>-n5>T uJplQy@,O53>2@H6Lk~a0BhdyHSKJgUoV~HG3e{"n^宸 &~߻@Yj=zös2 Кbx 퍷@V_ CζJ;ںdxVG;^Ss}]yJ<ԡ`c~Sf}*CF;b]R|<60GH7}Jϫ;}yMy|* (09r9S<^ST xIodI](;n Apw=3a;̉\Q$*ۖz1%IU|KŦF/{GddCAy^bBC]I"9I)U 1]?p+)δj:|*x`v e]cD dλ9cbkPwAqk. ?G0EXQIg~D0C|8-[Psw^)DžRo'e\hE=^% fצ^A12Fq2ivğ mav Pmr@6hf _k.!t@h >65ա[o"K=Sw\xֆOr [ɯJ.Գj)0=B+u_$i1F߿o;G)A/%YuR*F4P޴;HRi-ם,Pc8Q ف ޠ` ;FLCݪ~'<aE $V~9PSbɺ1 qr<|Ybi2#qkm,2<ƄB^8zVx'TԾ#Ɯ'R/vK\SĈβI`cG]ReC%vɷRC9R*XI4cL\>_.Q?{E#|wN b˗/ڥMsb@F t -JEz k`}?U:9M 5ܰ8RSI]VP)W(},{>?3eC]_Yj< w9ΞuKҬr.Eb& dV R_Z9b ]H]5wpfv &x:~ /: RlW΃P{~rK9&:H~gU j b5.a#Wp/n6Kɒ>b P! ˆ0o!_XaA<&9i0ơRSbǁ%v?NjB3 $ʞ&%}Y!1z_l:EK9UMG;trnCwD$ ,kk]H<ϺiM=V<;ǣ致FeEwT)*[eJ~RqDYg1R{ṛ,ѿ fxs-+,ɵ1h)c\|Q dv:y҃2[ywi ~>΁3.SDtC;s;OjS<՛4숁<3?Zٕ2ZL8F*$EwC2DZ? x|~k-UO,EV2t"]-Z_Z<οRRJ_ablU:.3Sbwbl![wϸ+7- TiOj.nك4 =q/HvdMZ'-(/|&0GyijG^Q¿Rۖ&ݨ۟H@ ,S>r4bEyЏPQf9xeO/_A蛖=|{T'gn ;8mvy0a-ٲK wBa|eBh{|ޥ@$6KcRڮ}L/}d95|{/&g͖Gj'lmf;Ý2Lv$Z!-V3/ Ն?|X:.P$mnA:=pa`BW5zvvQ'RvMȩm&y֟ް }3ˍiCC`(K_[ z 9@N FacqnGzIl-<;*吼]}5{TI;S&G xxvXP]G E@a ^pe \<7DQn(T#ID}OAGYV5IV(4V [Be$pt(BY^ذZ5VPoi oݔ]/sG@ . QFA~F BLl4! YJR=6!H[wd}c i9{dX`sB44^+X"AԄ4xߧ3lڤQ|*%=Cpz)&ZOiݽ~gJLb?ʟay;LV&gfW*% c"\3:B>IX<  ?ɜP}^7 -bp(8j#?MW o=@/0':ވԣ_A$@|L wM/B+†l5m|&y?uzÑi髿[8 ""E[Q'[bDg-ߘȧQ4Mr<(ye ~/C) 6OtdWM=GcJ)lJϞMqN}oXM7=  P叕Q]˾W gHZ\{ Q4ںsjd@?Q Ppe!x,J1aFZw=_A[p>0F^sh_kHdTSzzWC5҆آPJEËL-kQLJ=.P >-3zS ј`1XI ~U! 2s5XGu4RuYCl7d)Us a0UrF2Bn{»8^''̫AV\5[-'p`J="JN,mT.W:il9*bgY-!x{w 7՗w&?2QKN 7-zӟ .6vK:[1A>m}޽T﹮YdJpZ^a|X0vGPZT]@2 ,GvPdǡD0p#Rvk(\O~WR=+$yr9^;_n[m^,BDpFs]~21vң)]an F0dPz>05gkȺ ܺ oh FIH`VU,S'=<.x?v5< KQoXy9P<\j=\ϐo~%| `78sȋy^M!<5d&:(H@w"F(@J)D:J='T]\(aXzVؓmg™{96ȋW#nk뽙5e00NDJV{,DQ<`O_+LA'(6OÙC# afq]O̪'^|Naj.وPGI(Wj;o{?z%Wɒ=.l}n @񥟽M[Sqҝ#(`4Umt?!6ݤK!9IM ̰E, GfXVqp!dJ'h.H.wX1wv6sh0 YXA9MRYmn6~.V/ gf[_<|&nxгMiԧVrZ~Ì~?Y tLliaF98>qn,Q9dqG̅%:stQlTq[ KOX(9vgf*8rŊ,Q 4w`?RP L0wL٭H<~#1@_h~_i J A&_>|$4zKXx&(b!H(0Dfe9d @ @,B(1$DOI3$.uѵ.W^1kS!=@MD93! %FiD|tN9^%H's5_n×:4 {ie[7W Ih[2"j AFnˤG;N]dkf⸆67'즌=oqo~LNHhm㔩¿Sv an4^0_kX[y^K' `ͧo?}#$[_,?*!W A#hPZP nʰ @PVcq}oBN+Z3.'lr ,&F&F(KkU@4zy`m y^]Vx/'/ǝ :R\b79r2&HAn3kߣ6cf`-zgm>|WV-udB/p7d/ҟs%|P,*[D3o>v9̷yKV b>Ц!R)PaqN~ߐ/$T_Sߵ;x)f o9YʍNۯd0)5ϝjXúԨ8 45 :P4kչٚMǭ_;HW2IwKAZ%rl :qnMie6_YB8*$ ]u,#wl chg V5/gI?n׈ibɘ1: ̒:MEۭ}eb ^4Gaf-Gޝۚg14.AP١}ĩ_ |v+Jlb|dNuL%D9ԽQ ]ٳ䊟.=EYc 쉾wpH<I1JaQ6?4vD7yQ|mmz=lW3KDc<ŋGxhxM#_JCeS+/?Kel1WQ#Z -k8XNYY6ʞ8 dM]'UDtl2BHGonXD{Ӂ#Lv -\(u5o~ԊたnTGw m XŻ'?StOИn)ފEfvz+s+Iє652^e)pBG =Ay-\/*_PCA  {I( ~F- Qć_$&h p^AI kIGs?3N>,~a=)ՠA#g/v}33 vCB{__M֍f֮6_卯h}F߹S܌zce,>i+ .A;*?u}c @=P ٶ84WW,*<ʴjYRxabm eRư?ga챺.hm')d]ɎG6/hݝCDE9v΄c^@DZk9bhxep77餽]} 0^k _-c 뀭*jnʀS+33R7!ov!?ZO>9]]e\`(v%?vF6D%-x‡9S:}?px5De` ,#EN!13{BEK&$^%bT(ROg$`kc%YyLG*wN%0u0ͅ}8 f1\mVU2|,m0V0"ag)OT$. Hw]糶q/zLr}֕Est?=m%)o i[azթt\[*j.V(b(eB#,e>TJG".0×#]4}_s 3R*?dV#yEHHGQ+rmMv4eE5,aӘZjrn(K˵v=MxojR1vn{:|?]+: QBە(7xMY2 ^@Rȝ!Md$X_;E $*sUoH%gѺtz!ʢ)V++h#EBHR ,eUsz秬T5aeO2 ˙rJ#gkyL`[.M .{Q\4`g**!x@~3D~dh:`ǫWS)!, FZ5 f]L(/KDƂSywo֘8y$]y dAGTtt#!v%e~i~:amtpo |߮"<SiG^$o`8vK ZWK9I9/U_~ͳ_|vnG؜C¤|V?+8ECiS |D5gɒ;Y7<7^}:&_͠)=vw5+vںl)W؆>ϗk!vot )Wf{+}揶yTwa\=3h9`jaI|c/n=څUפȻ~@?狆LCL~nUڠBY{iMIK@Dъy a8VZ%K#B&0*9R5Q ƸY@.V+;,P B.Ⱥ|| dU:-;̃'/r5'۲k_|54 YPmDx~' 2(+$bbj"bq~wXz>WLB{mwE,u#'<60[Fr˾T@:8- ^Q穥Y? eccͻ4\}ǐLhV[NirQ#ݤ~,bfsj j>o0p*vMM&Tu:C. Wy k >v4nsRTךfɥQ*VSOC+378B5Y::'0TrY)Ś~Bjv'Bρk=4[w/7: %dz#zJq>6es[RH ^wң/Դ\^m@JXi%Z<#\w[x[N@w,i|A,?!3α3Vo7n=̑0H=ݚF|NPXņm|hUj" @ ^g{y]UP1uC`K"NmUq334HsTC!mtɧ0نq3YB3꣋ʽ𮖡nH)yS>,;5[`&0|Ǥ5e}|'\щ+h z|RCA~"Vl>%ǻ \c6cFf"Da*%xUG$~t&2r(b'#}%Hbf!x][ur^ˡXZw[)Vdd?\A\N6HP>e,GwV}rr(;b{ѧsY,o%Tavy*3\w6/׀dM9H)_`b.Q;SFA(E}X* dX8mWʸtzi37c3E#{IƏ 8޼qf$qWvU3'E(ɫPS~ڒYRc5'AMFD Fc*Rj;&d~̒_04 P4My}<]kHW6wOF PܰݺRf9* _C@T^cVJMU8w$ QƵ\?Ӯ(17]3 ԃrT]lzx9@%w!3dƛZ4ͼVNy1wØ}z1ę=6Oy4yO~c?~~z>F{r4$K8M74ܽ۠ KǟHNL3 R8AToWAX'9Y)J?'n8OY.4")5хIZ3[%#$"N?$0zvݿNx̽!Kȯ#7yTjHoyDы&S0W/# Xa#[@kA0b~O^T\ "1X% 4], ƆDs.x7 vxDcU qLSEGU P4i+x^²6jlZPw% yDžCb22Rgwd]rm5שu ըF445r[Q|5o!|˝ FjYhy?_20sBcyR\$ޝ[&\A;.}sbhaW Xmҹ7 aP9Za58Y)gh)8 g`q#<1z; 2Fv+j7z\Niop^`3,_c0`h 4&U~W#} fJCe̾b Y*#-Rywk'Ywn},:q@HzZUAk8R5ϣy1 6;R 6Ұ1Y(39(Z$IMu(f'ݯsY=p[vA?"QVF 8 +鹭vc%vo3\9F(.`$6X[(ҀQOm$(=`{ )G PD l/#$a;B ,t`T4| ӥ2.gQt1jZĮPwK&Hi9vұU3z*L=OH4d7=.2̸3<4\T[I?yj=UKQƂf1 WJw^NT"F $ye.*[ocr8+w<'3?RGQ$U|;?B`~cKA5eгHEG8GujK IJ{ZW);2eC6^(i1J׿O42Wu399Te4ly v>~bGӘa nʟf5_ߝ~]e[b3*C 5s 82,W?rb˛rrM5F/Z#rs`6V!`#aH2t0ZAe6qoiSD_J Ǩý{TuAOB1MM}1j!qGMKI}7Ɉ-y$:ۤYʦ.tEA'(eGy /Q6,ܩàA~4 ^ [+d#B^owpa<_Ƽe&钑>5Uө;2X\p0AnEg7emvgS8-,g0'%qX%erG'?5\(\ռiAEXj2QЕl9UP">n}#+SK{>R!U] ׋/">$>c2q:4zqv,bwhQz°Q1Ca;,JkhMTg&i뽄@TjzHȍK3RY鯭X+Yk$qM~?@(73ց[UbU] X_9t]Mt<÷|Q C鉮>'?NeZW5(k{(*?KB|_{=W|j GHi3Zap6HUykZh_EAqӭNvP$wkgqKi⦓иNl"J(SĖ%Vc黷61+>&1Em Ee oeօ[.{Un˦D0ciO?(v&¢C eixLw230B8:-A:Aʙ죇Yle.> IxyWBGkvm:b kҔ\h ŷI/6%Y{wP+oC adGkѶ;/TGz VtSq8;=>=wj$lYtXdqjOwx&d@Y ܨI} ;x5" aaɌtH2 !rQn RJ1A(=1uY2H :1ґ~(* i@ |B h҂P y[D)ĔejIϔ*y\ ǕvQlz @%5~d DDQJpSn@M+D|:%(#e`"9e>gB$0$!D )1GxB r)g܎=]^xǼ7Ze3.?x:'{fm)*EVQv<-oi}-- F%̈́^.ȵ<5s 62oZ}1RI`RY]hSդUyhuD+_X )Y޵>"aʽg ^uAf^QoO&[+ȷOumdUD;^;N|B-kb)3w >rWOVm(ZV v[?8O qTԇJE0tXRiDK~<>A@U5D9Ϳ9j1iH%5;y? [`{[ d@'X3X#ΰX4Q$ #H7yNMdC[M.sӷ KD?i !Uƒ_,b $ja[Q+>pȬ3T҅&Nބs?@Hw6:بMZ꼾^4q8}~UHO Bm@ I1,h'#ܚ"!Y0l}L*z UO3JIA 9#reQ[[l!7‹jRgkMV@Mߗ-&n;J#kA=*"_xZtwoIqՐ?[f8ਹﻷCW'k+8a&5ib]zdjO^O5Lܯ.5Zީ Q?_Ka)`6C/k(Ϫz:V4{Vok 2N6c,H=Zv{o̿ڨqWY%!a+ Ɏ F[5c#tn֬_`X& EqrGJӋRx?F#sN4Ch]6BjyJ[$oV>>j9O Prq=,R&Tr5SdBDE)aa3GpIBeX=p{K,3kCkUu0GqpumApq&4첸]fc!1q҂B_yj;ժGyd@Ԉ_Kߢ1] Z'wrQ{0LAA`sއxJFG=7n ʸqv ۹| AےmH{Im~@1a=a#ߧ0@zl38q24GN{ o!z9͙oc9à|5w{T\ɴMb7]#H]E47zHH^Fq1׸vV!ޞQ\?d憀D#hf|ҳvo_e `P'˘@,;8=.SS4:Xk7'(kܭpxȱ\>z56KP\l0  qM;8Ϛz/ץˆSٛm'(:GPi@/ 鉼ƭ_-K5ZG^L'3~XwI?E'[ΫkScB\>'S\rMӏ\D 5LS#B-aMjDG;\u  ּ]*.(G^{4%,HR.ΤceSz?Ԥs(rhM3ar/ܱuC y r` a]pndBb7P~AP+} sv7DZҨRznIU2 e SpZ۝Ke Ξok-J7E̡8dUt?F2FJ6rG[ aO)`zX%9\ c2˽of&_%_" eEpSJ,_.i|/F=E/{;|xhI O)?+@s_fnUpnӱf,ZTI G>.5$_O)ԝ#^ oέ'N*m5Y.Y^lwj*c{uEj`7=#Qy?22+$ bxQwK'QU⦻+yc{Q *W;.1^4e'0iJ{*]|J2~!߮IW#dx=4Je iWUh_56twί+Oɤz A_8nKRH'HcOHs?qA’~ǹΣ*BgGqDA%*`A$ERl|^u8,7tzAˌM!'ldpي t-uːw>MS"TVl4L+BC)R%^ _|_%؛C+ *Z 2$Wv_(Ӥn}jqYZE_[>˪1c9#0ɭ_G*6٭OKX`{6;acwolWk-rtw,nKT[%$;԰OƟgyʦbֳr%p,<jKSq~_h.L:z!-Q!虌@YR4foQ ~=:AV` \b}<7#Y}vg_DŽ*2v<~`7x4U1V]:RCc)kцn#aY] Y2Iz4D;ZU2ѧw$]ޒ-6*4=99 &o!##k-PFߝ JwRF#΋X CѭZv\Y_2a)!+Aݔc3vI7A#H ' 1o7sj{X1vK+Džى(X̑m^d5֕>k]ڒ 3[`wϳ*l|[a8l(?7xҞ1qWG$bѤ9N^olnTEqzѡ P4q/imj\0"8ȳK&n[} t7@WQ3yՀ/MIi9~SV ٫,^v_bq@~jFwTMw"3J;1Ȗ8 CU+=a <- ~v *+Gt\Ek>hW}qM,g9Hy6t0{+[(< c͑S{6M~Eo rerY(,]! b)=ih{̨~3wNg{w yJ\o}͂yR- -:l-8dM׈> OMdD1+V0 J$S)1dDK``<)Jo#ho|4;b6pn.%S /粥y.ٰLOH!5 `t/*7NdP[3I>%k#8u@nm*kǑ 9Q(VtK$~AaLv271aIME .8p_alUp5f}ӢJPx>{ՃII]eɌy,}RWpۖ' ÉogNttHљS+I'}ukRʞe坻}MI .sTᴻI޶~"v1NNEm6-lHLăfÃS!k7d.}:p]@{>G{*  sP`|jw>1 T'9Dx6xɤn ^8/d:g s1:eBb3n~EJ߀FD?QөZ/#)SwNЋ*&56TX UDnpY۲Bllc+O*I*4ŜMlDA=ff &Tjj"?w"7Rk4@\iqpa* IQezK!wFgdD.KT<>B >CIx204AOp8I!!P>J c gC]`=gOVYZᣦ!'hQl?;QÏ:hS^ʶ9DavZj <fSSԙl(r5kex \^ ,|];G\dғ٣s}>`%c1Cvq˅5g~eg&|p @X $#{V%-&'EǝPxz/k,E=ue!d7hFqxb)*\DAk"n~ܷO(19^ {뢄uKlX{wv[4Cɉ'>O9.š Q!˜G('wM L'RC3R(c#' (/ݖ@V5} ;ӭȥc>{:JzQ\vP/ !hમ{.H^% .#PŘxĨJ2~j}āQߪcomX6-VU1I6_dsk<~gJ ڙ GSDql~g[[ U+QoᆌЩoX}hc}֤ۡozp^?%NB'|ńh1CD <45}}bLXR%S`:Fp!4 B] KxT{TFe<)y_U3~_k۬JUWXJL2y* ,"ut?uZ/CjlU7wj׹poLuB_0AüH B(%+(5nnͬ^y@;WRݯyGQGs2,?D‚$v#df|ExKHx X+jCL8"gs+rt '.4{.UKQFwZ5/R#ůQF|N ﮆJ-.:X4];O/~5ӹ&zv{`)mz٠f0Xwh%'~a8;%^.@{tBl=.&3G\wCQRmJӌs 9EWD(ǻRnP$ʃSU )yC-([ބv{ 5(RO$vƏ (s×2 Z>=M'w)VGX'*hyqso9wH\J.htD>as5k=*{KQ J9ce+PrOR3 Pu҃v-59-DD9 ۊQdR2Ru`):Ya ϩlafƨb,Ƽd$MsdP68NA1>vt{_JGgGNEM'wk3A3FT[VqPaHs(Hyg4f"w*JD 9A͔pu7ޡr?껱?/fOʗ$C㖟& Isu.+rF}:Dՙ6g>0bAv*5B8 %-&LlO~\UKh+4&*w7[ Y]O_?"^mlKSdbY ֚<lڒS7#Go$>mXنjiPW ۟L4* 6K@7z xmE/H͌jK!KTOs;l_v4H:yܺÏb^LC?|?XϾ4TZF-f>&EtRcPBf?~ 3/TP(ͮ ̐D(vMcXq]qd+,%L#·He1)\)0U/ybKgcuS JdHbg tY7E#HeiKP]+}}`|Qd|P F3!lUX@=*@h`wkXnv5fiEW *Yc27xxp!xMx^PaN ?k4b7|gW/ r2O3`3܀(b>9} ﲱ8aDE#>l[YxuB7ɥYJ?i\haj*bƬYD% kqn/d(e2Y)Kup?n^ċG4m _,ǵ9i8"B" [>CD SsXj(gb1i'`n=m@9_RB iO8!%D r<"HS_$Hx;5pyE4`6WӬzfoz?(Y J`9K }!;P1%UbΚFsȸ$_i3|E]/"$FvG^9Ui(\%ȷK_n48&kku2UO' GbKq^wSL]H*⎚{dT\C HBe7Y){\0kn+pZQܧ鿲JBٕ]W75* ia`+0wY 0t/qK#P&I?_<å}Ypca^tڄhmk@SZpcu=A#UD39-H`}Rns#v9Ü  PCLeV)tδm6K 9^L9/U|[D:cb( 'O,^֊RMC, ^]ސm+ T֜ZļR;Ӯd6]B ^9IZԙ'2姕!U2X#ClMUpB ؟Wq`{RrbuF'=: g X12 >}ڢZ68TW>CF!TQ>0C6Gc JИrŽpzIy(rA](sfd%5kwFͺxR~V[#fs7 R *g5"F,&=pUz"gbH~ I&{F)>u1f`zT{ ŧ}|y+>#UXOH}Z9*| ԾB16wN{01;|]`3>pyp{TReTm&9g_ 0 KB-p G)YR5N/'ŏ)}7WCNj3 }~lB¨PA8>_ 0쥋x ܇VT7Y{*n@*Iؤ!!qADK GK*(% PFaS Un"?t`Tw qc|ц.>йΠϴƀDzA9mdiN; ~YrMs~Ѡ{Xjg#Ȍ4@+3ӱ]B THf+OW|/;v׸y' enwZ c{+HJG(.\V0.R;)^\U?yaL}^8oT](qqxi%~@ Pj h*џSşћ璂ީ=`**Ǯ1.jO|\C$4DBJXPex9,j'5R>@,MPێбԖR>y{- l AlPR*obA`t!S;(Lphghw5?|D%9*'L3yAo!,#TsFtQ" 稟A~2/B[AR))5(6wb y"ep)γk2Q%BM@8w>ܳM1/% )hUK,#|E;pt]J K/fG HlhʏGۗ`(W+d A=[)##@a!,E1f(F'[: &Ϊ .@QM[rl|n%;(K:B|ߪt~rJĩK2wE T4^`X)9Ee T.Վ2ȤWaimg|vBcq\ߜDɗ#32aEyXF=DL?!t ,y?(z'Mupr?֞׊2]lWR'OJ#9/W{X]~̐b;ΰc.SnAv:(Ģ(k}z#b wʆ,e'-H۵e my Tyn*`QV^tBN" *?!@wd *@`Otq8.H;5Nt4^FkiC#,Y{H-CD:{_;yd{mJR7IgӍ-^VZ \3)~d p\SO`?\B{pf37ď0hc ySBVZ6G I*=J}b:j#! a}dYV,}pnm8I0?P=v¡ o2̶G :qzo; ^3؍ 33s\؇RՎ`1Oz > Qlߑwt:fƷtKRdMfo! 艖Pfʇ6)sC^E# _tQDRg0m'GBB/>Tnx/iVQ>&g*}8[μ TcuqVxyA3-L<}D9Qv Xe:ui^pޕ.Nz3૵Z{ZKTN~l zD|5vW2в bLJ~ZCH)%<>Dąq1R8.f<7z%,T3Msr[1'|@9&ӄ47fH:,m}8ͩ:O91EiJsTw.=nݜg1I T ~! 63pD8աnoEpJ }=J[kA0r-t`(신D}#=Ⱐ1SBP(NlU>S73:(ن6ٳzo _OK!dg{g5Vu~ngt ~ȄY,4_ZO1W+#%bm0 E (_aƛZ of^ibC]aT6҇T>|LMl δp>B>m᷇%Gt| t>Tbx#I2?s&Qey s>s B܌._z~6:`>]egx!XǩT*4j'e$Ow',W>ߡXs*+}.6e6@㧀Esu(\oF c3ŒX5=\F (Wx@(*rCN/'h[%bx7E4JsY~rT, \t<: "Ӓ$k Wb1yE3;IL=Wsu}`%ZZz2"pa]z9gknND$hbt bMv#;hjய< X\L^$nd95Zjgp>J mkjGkr70Yuz.>41 H=Z.rFvɿ.)b>אt%P KؾH':,,` ʐ\9.G@T2 Li-#Lm3 dR`OcN@ Ӡĕ!p'byhGjcGb[M4d/TstX(@vkZOyZ(؁bO9aeJ"RLBqMQPSJ&yW㠱~y9+Bb [}o>WhGa*Šx(a, ֥(%"~428#F2! WJ>[̄/C̊2wȻo83ԕ0n4&VJZ'3 rqKP t)swٻ]kN5 R):Sy3/<̷XIx]h=RMGG)9pctf]Q:~NAvMn +|:87 쓓,Tw+g-δXb38hFq< [ɔ f1?uQ YqLfz,ƙ)d75lk*K%j|W8 97[cgd(Bof\uhyD"zO]/~!_y%On9ⴹW~?yNN_#/ZG+6e=&}otd8R!f^_$r$/#!Ў i~H+A;gz:_guD*ͬ1HP{ 'T?}0#X{ X}z +TDxҟ x4E5=  響W!1b Uⅾ^;*Od )qJWnG$K/>f}JAVI/in|=@ωf"eNa-l}-&xN$8{1m|%IkO/ .%/Sʺ"W^2cz'ri\W ?[31]ۧ k繈{F[!- /K+}hjCpX[mxX6ok}c6AKT}ȵsTFz9ĥ(TBc +ظ>Uϟ#4EzN9TtgYsXStĘv)}r_$˱_U\mK`[#p3QzK,l_|i=Ek G4q?hH3i8>uKA:FSZX!%b?Il e1PձNaou^6#0lE͉+q5!0𑨉\EO(O'gxQGUI?Tr)wmLԝ?~-Wjaxh+vjȸ9CGޝc#^Y8N"ɃNվE6=/VJ۴_wL{]?|J'}3'h3l[v3l|9`d+$lg1U'.-tMEg݀5D:[> d겼#t0#ߝ@j${k/>fYmJ>@x]cIU10x`tZSO4n_y>Fci1Kx3PC 4ܞQo M4#?c _1nĉXdž(B&e#"K)]{yՖ:&f04>OwVƼ:dB\bEG&8q23M 6&ySMࡉWv6|%6?b8T1,/(u{)!{;hBƏI~ډ]ʮIe2{ x3->TϏ&t Tkh |Z 2ԑ3j3oo }23wb8/S x+f8iCqfQp\Eeâԓbhk2(L)}N/.JA}%}ĆpO#ǰcaQK@QKa7o+yѨ{rZ !}6t1ַVftxIǚǙm8 ꨾E7XؿMԵ'ym{sF3'׵WV"ˌp4i]UIN&4C7)|#*/HI PI8EF`Pqa~[3-Knk;=\:R|[퀼LH"f%2dK&/Uͥr } _#TFrbk!ee` 3wg[ oС*G]ͺ ZԊD:E _d#)*ѭj haW] u0X *GoKsĖҼ]'H;mC~^X"T$ z)UpC\RF#uv(ٟNPM}RxDa2TT穗c+\~ћܚvJ)Z;5&fDD`{&w mxlJT"T@[3=!k" pas;bhdpzWw)K ˡD0U! p^0Wf5G(ýyB4k߲&ӟEևjgm!o-Ԟ$Q3Az[Х mrqR(i M~V^__Mj-]Y9'#Qpa@HΐD"ބ ^Gt#v5Å6(Ǜۙfˮrps5oKOn if@S5)b1a@dEM, ڛSaOڌ.V{mOKj$:+KǑh}A1y:x =\D@yU3P'EYmx)9DoQ2 Xw͏;:D7#|UWQ`ieNbLshmdiYu^Ňқ(Dۧm2IitӱR+V˚!꠳}dV>ղx':ʳdj9Hv5~D-pI387OmهqG/1fJIBQI,w3^ҾieU=XpO +Ԭ3؎ 횇? Mɒ^׎),kبLIzp]klG_hXrxQtbVUh/I[4t/Y;loz7_G ;ȱ*l,joh~LO, = 80Q7PT\8dM'0DZF~T|3_/6TuSԑEjiI@|ڥD+/%b#U,¯;B8UX@(tlOW+%aq$ݟl:Lj 0~ד֧L)ꨆ(Ubur˰IVq08k3?hc*d={> u9G/- v}h0]pΦ"m~%Go/ *elS_bWԭQ,m榺{):EUwbN`EP5a۪/WVSruy&#> ZY4Qet>;T{Y_}>K~`೥/C{"Xc2xۯ-/ 2V?}(\"l>V$.T걟 s|pvd Lq k{3:)omct o9^B9{4ɣSrcBliT'c'ʷE>C7U1_()ø >HpxLV_r{a -x+C;F&[e9IHM"X($~S -M+ᚔpG _O6u`D+p dVu#AA{Q,+HAB(x*ðe sA3YKw&{\edmgO*|Ϩh8^X7T]n)jŽ]eŎ{T{zw'헆(5Fh}I6ői<;<&FZ&g^9kx~+*wڅsqkkRQ]>~PȟO8CT=,I 7_N4%1Ű{h=&Ps<33N *}ZJSG'8Yq͸ϯ3Vmoͪ?O!BuEyٳG^Ґ EŇcvzIwc;߄_H7&h;:_Qpm,|@&ӥ\ti]}tE>MkT̖7Nq΂( '9 ieA wC 81b=LMdrVM(3*⡶Ӑx;_kcθCg4`$3Eu˛Xsa(*TXrNnpV܍`_kBtpuc 3*^?#u߃5=VߐW>S*`P&u!mhϕ,72> =ܛtZ1m>o6FEi%7! ⎻"V(V2|@e*W&m[]%/U%b߆+AhRUῳɡ)pW>{l(-ĞXbޱR@FRa4?޹&VRؗ!=p#Lys'BWiDs îor_w.n0XU/_yd,ߖ[g$U@ 9]kb2G\"%:R_'c1ve? rFHsQy4 @W+4 5酓|.W`HNwɈJ63g˚7CɶRX3'&Sǐ/AsW~Qq:'HBʿV;uy4%vofDGcS> `,ςsE?Wkv`|#.乏a6V@ۉNi Y*n\`2lԇXg'0ģ0wF/>5K&2*9KuB|%ڶ.l:RyhMdhSτGj 3TϞ %wE4)DwCZV(RA1G[IFfAUV?RJDv_pӮ2: M*믋 F!?eP)܍zcvB~4q:`ڼ9" Xa&ޡֵ-V੯4B4e<-&tt\{=r@~)䀫=fXlWsN/V%̼%}fH3C.Um7cWP\'拮Mr}Js#!13}싪7e\begvn:UcuBDa~~-$(cv^L'/Lڦ+YQbP0> uE7.>!]>{Amh2 Hw,/ce;ijR.`/3j}"oE~G==0QU.d7'g(8s!Ε‡NKjbfɕon}lV߅J}J_7<}=B??i謌I@dž/xz>Z\QfK}  -`у$( Slʸ''Nf-]ݲv$IR)b3,~,w ڋoޜ#r[uBQ#ݶh>tʡU961ڮ&V_B>Yۆksl}n~%κz(s~hA鏋O]+2 \^ ;c5L_VP7a[_Cm߼_ui_bQ{M9 z-oi}-؇;+4ur [{#n[}Sз4?Xs~pt&ouZ#K+v QI\8gm>q5O_m t3sjV|oHOB)o-XK},MIq.T &Э) Z [&A5qhhwj{?AN2MvȈ2n ӄa1fy_B70x\S|Gu'q˥񰳽 .Ʀ!r&[#8\8#9AAAPRHZS Eςm/ee88,0 8[A=EF6aڶYcHtİoU˷E4`摦Zx!O.jk2ۑ*aH m,:cbüQ&U&m e Cwr֝B͗y<4=t0{PݥE߻Ap7q;շz,~{T`3fS&cK_:鲕;u 9qk܂A"tK$p;P?1}^rp Y7)AP0dVɸ _d'5L=ח5:zuP%Cd^1Wy85סs-BzEery^8 @x}{щg+Ҏ NO $J'`#fd'fOԱ-ILY?߹wg^5H!J} Xb3zLJX Lx/vf* Q[{'/mp)_hFA_p6۸`9E-ț;c`NdtT<^6fԙ>X[cC 2BkFJ(|\rF$nQ* R珒T$ m42H09h674KvOGYŐ`JݝxF)+xG0TV'iHj \A2u3[F?E ĈSjH`~a3D!rIM.٧wϨ=.Z&>̫vq4/ᰢd!85@3a?(w]ί:T>q}4;(x: fbzJgWfV(|$8sܘd}TmsK1mx?R_'A[qD1Ce4uG'rur e+קd?o^P6cUac;ki-G"N!bv2+ 6KcUڷ|tI+GUtGىmڏ=,!w- ͿNΓ'" Y; u!}ٷ[q U2El|Wʭ(>n =#ڍY%PYl7mu]+@mѣӽ-WၣI6Q"%C6's^1g N{;u6ay۵ Pkүά@.~{A(2 e}itnC<z˕MR˓jk@zF^l?HQ=}5')l@V+ uE*E IulD])P:;a\?R &]w HggfL`Tw7_-8}2y0QP,ORl<)9aa ~UW2hhX70yB_% U pR[FE-xe8N.O)6__'L>o,6у!CǺk2m.kC}SIt`ߩ෌"2dy@-1LZݿE8θz"*7kT7&|@\eV( }޻MU73|avʑs`ؘwTU}*0m1Hbowϲx[S ґP0 ~%Wt~*'(]";?t|MPE2{ ~̤-̣4_yMðvz+(rvQ;8E\q_<I_4Gѷ)T4 LC_2'x C j12*OZ9\ʟ0Wk_CI0uYiY J 4K&ߤ3; 4IOu [!V(-ϙ[k)+7M)e.DXs!kdpIy;zUV'YSr:C(B̹ #b+ m`)7CsLQ(J߹xq*rvWd$L;wC`|g*4:[7?@ s]X)z[_V%QDc|4H' ȭmȐb=o#hzNdns }K %6z؄o 0ГkW|wYlxϫwOCjd*z5neIյi0 w$z(F@d 8c?H3pEsG]=-K wƛES챑zG vcm$D;s٧m䟠{/ =#> kE2)9,15{bx|9 `pVxǚyYr{F#fŅ3nIo#-kdh_]o@'VMLJ$~8l2 {oQ#fX9cBw^0/0kO@>|6A,rgUYzŐ~lX;riK>M9GovjKpAuV&Eˉ4$:8 ͯէ}+;10Վn ˱ ş{K6iw8#bpgXb%԰yOA˴Q^E(tʼr^+RlQ)F+ :[[ W"םNs<Qq6gS!ulyL]\"qחWO+U9 bEL~h(c^>f/n><;0yG }#> 1kD|'yLDBbCn䗺5&jU+ H\F]2N\%P  |5ßO%t0`׳y,2﹍ O㞺\)G{+Q?̩Zs 7R@7͸N[8*yRU|AԏW`;?f lg$GRy,ᶂnJvп߿ 6KY  ;kb1vs?ezwc22kv Szq4OuL2i8ە_=}Ԃ:>\Q҂CD90ۨ-.rA IVPO79@B\}Q҄h6ʵ?*D2ԕo Kv#WnxF+WE>g/af+g{pV!z"|c&Ԓ*kx d |Z0W;`7lYE6_w#Le2d<]DǒD尦ٗ183wNPރ[Lw#9mTspAthޘ@<%Ak'\eEs0}td).5(DU m-MOe^x􁴾bè,5 {4puZ~L)r5fɪ`Q;I|"zMgpʹ1,,N}87h'r(b\"2W`9ə/7Qq{?4@t2^b¡sq?>خ!_\LӜ;a>fC3/ud W+AfAtCR)%a_;59!O6HasC.k$W,-{Kړ\-B)_ܵ5`4Oz-n)Bm4~s6z Z 9 /5`M/MTf7{A/lC;? ʹBNsCz c2N^ 9 eŸ"Rz;\0rn||u|muGmiE*w֢"?%yȹvyWkSw/,NugƔ7eBdwӿ-']4e {8SѨηPt E.ʎo^jʠeIA? ֭tB 5G&/39ZX8x9@ES&SEJ>3HҁfwHPUٔjW(ͣU"j3PF=V(xu J"8~|gg*Yv&&t|@AGefg TinMi)-{9Ken׭'yXS~ֳ{};P왴vWo 'tX/2-#UĠTLZEK%7J)݊i@,E^a]~6X_&_ǻ+-(GBSxK塀-5@r %f|3W{~Kd-?eحzwR' C?0hQDjY\r~H Й/L=Qj*1춋91;RyAnF i8(/#s8 B+seW,56FݲgNI*|ϣZG5W̜ko·\Uy2o꣔Ɯ[T*`9>ED+WڻMSy"6`7#ǩYxOfhYqVWe}>dҹ`n Br<9HJͣ`ۮ Ϝor3ho\iڝ\9$k&!ZvPۋ/Eg2?;]%Ѝ3x?!L<ܴ!dUgֽ"}|]WlTz==yS \z;('/J:āfѝ0LD;0`z\(Puq^:^d0M2Đ#_EuVpċP~ X bRvx+PoL,p]ek-^˞o25ZU_:Dp?0ͺ<=9ZB5<"\:^e"ڶ娣ɿ*njd)YFyK,DF*Fć gVIN[A ;Tq,$s6Ҷ$Op Q= ^UXj.&foA~DNw@t5e3 A(ڈL Z>@ر-Y@?S.$L3,Ug!6ɱ3h?CZgHjI.3i@t]89;NQ# ,pͰ6|7Ƌ)ɼ>>WeZʥ"I\vy'":1<3^P%S:X@7cD*R?',_X%zmH!/Ls& (gTނ쎽`~.;no) yfMyٮnRKnΓOd"3r˽`m-bc=/3?=t1tzI3bI]dѬ%lyF A?\R>]* iVS$n劊t6v.s\/&Aλz_GW.?hƥ! G& e'\͵I'xvx^K1&r8#0C?kg)acRpnD3HcZ7x߼xq.@gɭ YlR;+1;}qzIS'E3fNK*.5m`agKa touڜdu9k3eeH)< QJ]REܓF}0Y"sc/וSX֘\):vqpcNuzaD!#q'n=?U1vjHyŕ$̹!X.? YLuS}21Oc*Oax#*t}Wzv"v+/%ǼG' 3ܐ> `|ּZo)48G߭f3 }J΂V3O'zS*}{`>-s%mweZ  1pzEӲT$5( nǍ+F(/-Iy qz5̆'A20%_^v+Z'˭@r=//'D7yGx`M]E~J> -Xy>VU'uLM(Y-U?~ WxZ :_.$ԇeK>>mYH~As0-&Z0w }09 ,vj^``H, e: Q¹a9rJ]s_NZ-qw4[F,עXM/,'{Aϝ%Ո8ց/q7KASzZo^ gk+V,kBsq[,9i=nG$۶ h$ZkԪE I\B=iL1>bC-4]O0p0S~E50kS3[Ky0iWy>L Y8 UBiA4)75N}+\emQ Hc(H ‡4HJԲS8Q2/[˰;[v4PTO-$!'Т(D)9v% HT}a3-%~CWe / =bҹNބ} EE0G"TZ$gQN ƍ`_BK#0\v9Hptlb !A_M() Yϩp9qń lqOy^@ae%{L]cgK3YSleN͒_å2P4n?IKF[c4G<{]7v7:ۄUP(Sşs[]DIpkD&?! .R L$Ն[/ +p2F]&1N{e%S5ѯHH'x 'ؔPKH#MgybcҶɤ6%C@ă>2ڐao8!.+mIu2f;Lih7Thԭ~0< `5bliym__~АTkrN}-Yy"U,xd 8٨wj .濸Eo̅"brΔ/d4Ulp5 *gxYwuYO`7 PbTs<:]%xUە$ynPU JN{uÃN[J:$\Zv+\0i"P#ļ[%$I7MVlt0nAzސl {8AFQ)$Y$A+ D=g"LLɀd% ~WyY T4dMy*,NSӰK%UP8"@f8{#aY!,$ϲ[,r;P` `Q7/fH Ѓ hY׆rg&_JXrI&o-V n"fdP*4>[ j\E ZU2%Ŕ!7@P&C+[O.)T'޲FL^>RׄdorDZX-mt" _ĖK5q~AsJ1a\|̥d;-Y V{bd&69`!}__.tBZ-[Ukw#SZܬlHɕ9ςUԐ2!%Kz5f" N[N>"e\i:f/Mou-E>܃6F{;p u3įYv5nQ^4Gn.>(0w#jlkq] !!Tq4` x~`w61# 5\_CF1Zd>&;ಁL!^Q5۳1R(>^2Z`p S*;ox1G%:ʂ#zO\%֯ h "jL&JפPl BBY#x olwug+$K›;_)ϗcB7ߦ*4]f*EyL1.JAo2@ bI/ƣdlBU )#$C2D,sE7iMs̺n?H0s.'"pvYZk%׀`zUg9{I!jfءzE Ŷ5|p-vMɹ 766x2%*/Ԟ]=; @ c{8eŰ:țBÁո&c xV`@m1dG(,a(o/^&&g[ȃs AWtNH,ꃡÿ_/ -9'?þB?Ŧ gb:l )K#|D`;Ċ0pU}J2Y0 L"2?owν.MDkn2 2 ^6TOLg_b%--6Ыk@$`P{m76B=@Iڮ:tfSRX E'/͌8}ᶕVI,\kGb z@ g|Y\"`wrVSoH2Z,@lu9u( -!%o 0A@# g$j"xnPo^SDmQJT2dWpW@+xE IT>6tke?kNz д}ZS`-s&0]˳Z|;tуᵲ &vs*klw /α_TZkqau# _ ѽ|@Aoc7>|glk0i*'ЪgzPxawumX!027HZ9P8#m_ , AyP,C' +=--4v'ӭQ7mK񨛮'M6+@Z_cVѳ.43,p6( @`G9h}-<=2Xx$J a dõhhT4V*2l鳿ذ㭂 <8׸#RpWy!@25l+ʓ'44AcKpY ɚ8|jzEr8%̓B'&=sꗤՋ3ͽS;ͯx5ɮN]bJBIaRgo/4: 1"ހB˚Ajz ^1VxBL.=|gi'#M ^s/Jfi%UG,B8BN:l#@ "! k)'LD` +.k V 3%|/%,w5g''UMH`x%47/1xcj{2y ` W!ƕ@R+f_H#ovѐ } 0q-2 ]073`m՚aA\ .xN~7Z1--ДD Zo&K僺, YCdMaf*f:pN25"pXё`RzߛDK3 ##17}co>raYжv|.eXq!Gi+F|tzI*;<@d"/FgDЙ} YǸr|9.5娾*D.Қ=֠b!op6;;lbױP ӅrΊp_5xMX-n+`a BmBdU'ôQX~tdIbf;#|ԫ)7v{0)Fq5kG"dSx8K>`Ah>%V-;4̤hhKu' | V[ ~pW[o= Xڌ@c+ L>X_ ߤVv_y#ft-[,IY2-D5LT3+H5AW\gPfx%qecY-+ 鯔c)B+Y(^WyCfq`%ܚGxݹpι1&>/wv p4F^D2-q6Xuޒj8S ZFqp+&hMN0a6iLsk*`;"H"wҾpOh C ~0վ>LKKNs B2oD h- = 8|T ̫SD^x%_I[(-a-N`v',kq/}Wn@)oFN«lonN=  \ (ɓ[>s[\?7x.yi5\Tu8Byx 6%\y:#n#r`,q28x2d0@r3,m|LO"[Ŏ^Y ߙ !lpMc Qb0H]:]V]Zobn V~:i8 HaKoH턤lկV2ey b+QV`xU6q%֙sLm: 1N6N6[]MJBWEi`Ib6`7gQda)?v I ,ďAk"B+w4\eRjfd "h,d&lꧫkI`7Zæ$~?@aY0 =8$|!N s@^KS 'Þ:zK94Wh[ߡQ>ѫwOx@;'K{{)Q\JVKQ|j]]nWoJ`[ ̒f22w|5I63Bه-a%.l+MLJ(Xm9? 琺?{̄A'yY RBzV֑ ԪT"}'Pc07IwDt8V؊GaD6;dz?yo~Ys LD˽k= vӣ,GZE8EXDKsmXVdhA1,saJwVG!$jjP7~uiI[ԗSz'k˚_FDD_r,4Cױ ͐}OǯeQP&|޻i[׿zU[.8ms-4+6t&G:aS[e@Öؠ2A+p 6_2 f@0ix9#UbeFDI%U(7evJ+Fu!_RBD|^͟0 h?O%" 9KJ(90֟ʯ3lqq %[%U oY[iDzŒYZ;eO5~3J]4R xσ'Y mmrZF4W%Elf^v ޖ,taKc<&ӧȘ `{Xr]_5W`DŽ7QTI|*Qio[ʙzߐZ-\' h{;cpJQ>܅&T| ׸vP[Dۋe胋W|u7k4ZL"n5s ʝz:@n f=z[A|+a8GG'1~2(cwNcyȡ^aϔjҫ(:1h1XҶ]EX v-b ^I퓦 vTVo\y\(u??q:m")5NDTVZ'BEބZmwbOթCe؊W3UJ PվQ A'ϼ_Ꮰ-\PJ=" ˠNwF>AhK:RSY3у!e%JDi PWѻ,/cEM+`YWB`jHWp 2, x6n~kJ? vaOH{d,v`'[䀑(/)"$f՗Xiy=׺Ң<`»#h? Ͳ-(?n }|t棣~֏BH]FXQ=0ɾ'd58p,0a-R.wT].gW]@4Pe^;UG ÄU'1VzI:A5#->1-1D^4-<qlC rej-m+ęܮ(e[`"tā#@cl2H WV9Hg@33n pU3DcVIm1'an ى؃ȯ87;>H2uk v#\\1ګ~Тl'#/ԌU^=*[a=HZRsޑ%?wꤐ-ܩ/b DxK-7Q@]Z@vWKmEZ)TaH2B/rćp+3:#Eهcq+z& V!Go":E36t/=2Qە3a[~Cu;H_ZUnaKAmJ ԁҡR@^JU- Î*M/񉅨19,!JYgS_oC8bϻAse*$vpa`h [4fm ?c*Z\@I ȳ۬E~nR<ȝGOV8nl mjN a)E~;ru CȂg*u4f{)UV33%1Is Xf,& k 8$$1)cHA +̖}41ens!eu b H5%;p0[OO1&y+Ոݡ!S[ukUNo{e \7r9Њj'pjE6Kxveij`މ~hډCI *^sՒ 5Ptqͽ6;P'ߡ[% # B!'80ٷb,YXm" F^ "S)wv.*y.)1 #S@ C2`4Qj!~ ){B&?[S/Oq :N7o0 v ' L#ĥ;iq/@ޱ6r_0 #[1gɯ9*T>O0VK 7#yIF|WSp~;[-.A1YiF[-Փ\+(* C߈c?nEXz4祼aݙ@/^^}cAĶ3(w3pm8#@ꩶ )L+2€Cf+*,cMo @ bQDV!u,.חrذaaaSsL%u{x<|}vf5ez#m)nH1WYp%cB'8&cfqd/mAnx; q!"腦@B:x$=HK+Mz@:.*3^E/t ?aM -wn)5nPҗ-P=h^(%hgDÍ)Yf|6j^wWqMb ŒeshQjQP>$@nkcTfWuv N0ljOE:HG_bE(+Шdb $+z@.'yDaN"ugy6LJc9A%,C.im>ڷ8e2͔ޠTFw|ad[]%u/@PڡL4 <4KAN5A_?@ P^( n'01v7S`Ĥ)8"h`3!wh̍IZf@P.E!Dڠ<M$!B ':D~Y#v^jmvi^A??-1O]6c$ (NHAo?UA  %uc,_9e͋yYVm?Tp64*0ȏ].漵O) !M#NRtpb(/grh|yX! j1&571eQ2[\_q%:q;3(lI/\W{tGp ciQmbq`p%E#QR:^LQL-YgAD7"eRXXk2kͮ+v€Pn &V Ῠa0d b9,#SwZN=4B~-_ 0/\QU M3g]5h¾h.!}6sxTJ~נmp4Oַݦ)~op3$͝X;&/ki*뼸AT,p'vBM(v i S(~NۻrP:Pnf/Ux]LD5pa{7^`vA]Q(~Di0l-x=XS%ZO:>="œ=jU, FiX{u,o jFjHEƮG" ,/~[@g syc*4Ԭ_/X`(+BG!=ZPwՍtX "r@gx  t4,gȬ5{f_[͎J&-SY݁^P >l|x湗-RO253KAG=>9gh'BKKLQbXwB h~.?g\z ;B̈́'|:Eʡ:n=#3orqDcV_ [CxDޒ57/OAự_wd!-|&]낸r[KʂV s5+㔗D Xd}/lq,j>ĿCB iw`g}e*: 9bwFIb-ͷYi-# _; }X ef/EnO f8|Oz`,R`dִ'`ЇpI/Ƿ| (C _[ eH ~l0WAzDkWnvO_zyL XOIvXȂU r+jxm7؄6sUbί@eBx1("qL(*wv٠ߘ la{bbwcDIAY.{9POt& "+nSep0 8oYq6Wt*Pk1"o;k8*EȽ86Vj_yգ^ 5B ϻdzc50?ڼS.-ـ! aL"ryu)8ӵT _50'H).gŸ_ͥ0P,=SAoּbG&rџNK.VU,Ěh.2ՆyTGlkWZW`nyXbfG-؟T2;D7ҙ.JX שzc/>R,;'ԈXO5":3J"$5|PܞOj_MJأo~+b`nbGҟu-A CυA%nB<䜉]pEd 8pMoFyC8p0GVSrՎQ-+g0SOQ2ج,KE׳4GKtkgV- L}$1 Atk] }\^` 1IwÁ@27ƍ8R+>*ݩzb_ VQotz)'-9ӏ`fqk $ݜ=Dj˯h ނe:ڮƖb<0I˭k蠵8t$! KhHA1XzÃ=h$9.]th/]ˢWǀaQ>c[ihV-+hbdp9|Sk %>_Lmx\j6fg1A 1K4A(cD 5-`kqmag^2 kb 1Dy Se=\.j[ZW`lZ}Z$+I Fwh6\4>M[Z"7lˈ).i_[qS%K_, OyHUCͼZlM=+$Y(<"}0-&a/\5aCT'0Q7Ԡ C^S=0~@fT_h~$?iQxt0.WHt"w+Pn9G ;SrH\@Lȴ>2LC&>W#aY$ǫUfEe&;H؄4P7j@: p9rOu@ѫ"3wR4诜xUpV>vŴa$68I+BF$>jQaWۖsB`(f V4`.$ϐ"E2MIIL uђ%rplx'{ N;58oG2+M?=  grm"!0n,v5k,%&"-a!V+=˶&$zmibѲ#ܕ&,))PeU>i>J=D[dTvuy[0(Hp5Z2,G +*AuNA-@r XdvtPx6LEF&C6/Vћ ||b"ï'G#s/AErkv3Oq", QU{|@n@5 b050ÿN)Ut@H<_){Lׁ?hJG ׍H x|#et1Q]rYvml BA$W!džgs6 Z%$Ջ*{`J x6dD ZhJH:*m="\s䛈/j&}ba ^%Q3 (lߞMfPL2/ė< >a~?;`pc_] Ltѕv *Źyf_r0#k䴅E/Bjf` aK=\7.;uI-B>9]~JaX8C#O+s^\GM]뾻}ĝE`HƗgd^B"_&N>8aiƎ@ :ZX⌎au¼16QR/ݱq%wϔ5(~/h0e9D ai}d;0ll2_9ҪiV-KKC'p.e FZ+. %֮\_; %@gJ!zW{;={c6DW;䗠fD=D% 0N?M@'%5/Ԃ^6+zvW0gĶN&k!i.H;&46ǖ /2qW @*q2b٘IF,7dj\.װ_ӳuEzWJHn,͸! c:2ChJؘu&UP3$:2.>jONӶ¨ t_ `UŻ吅<"H ,/J.YMx=kC 9Yg_mS;^rVYEOy갖錑)) K0/J46K7ԫp'3KBm1z6 b씣8e{*X UP'5_1@ʼnv~7Hg3JߥC{NF7ijWkO ԱFGQiC6B"/\øęgm.uRǑ'胉 Iе?.X }4E/pʡ%0 /Hϕ d)MB-/7iIZ:QW(K %Eka_(lڢ+fI#ydZ|EM3D D! 6GC,BJg@pbnapf(,(AΈlZ5@y -ߜ8t^F vWx8.uߛXhOFԷL:>Sޖ,D8n'_HZKKbWKSF ObW?v'ATL8w2꩷?Z ,0q9q6 fCoHC>?(NqQ_PLXV`wB [%pb8y;Ń5sL ۩`2vP0=l VX(*Q ;*O^? M!m\eZr;1\=mA\M2=;K%+voiqg<si*#iUC_z$QiRX`ńapEeĚ<Au8h,5@4uQޜ=D eIւhmH>/ouf bAocjma^u'_1^ %Va"t^)b m uq>ἢWPBWȈbCJU>"'/O_J0!^he{`se WZ7t"Rs?LAC|؃[8')``^oB/ZŇp38rRb@.y!X0?ݞN'M-=.l3Ƹ 0v6ZJVs5w+(-. H>q v@?[ E" "F8xĆe@<2vbD7gMFgua& PKCD x[%$G[XafS:Kn$ֳLZs-Í܇lQrgQ. 'YYAKX*ӅVj0( a _Co#^3f QY6?Y(vWC /)Yrcϴ.T \eE1aheQI֟O~iCCZ.Xr4b 5,V89CbD fXfv>|e@x,}8&OY`Fr(HqLle/$O7d79b1p8&;~ME\7S"P ¹#.h[C8d!^KZ~CA5sy_˪賁2hN5bLMV4#~qm;&>@9 ".AQ@gBxŤQ~Q%k/-5|䴘H`-b?3FPj`!*(A oC޽6+ĝw2V5xklݜf 6vM([8a.xsF$! {;u *.B+;HoCn1vy5&d c+΁4l,Rro PZ P:cnI"cFPODɄSGYPVf~uU{>s ŇUEi󭄒8eVټҏh?p\q^'+JNsn`-`vgu]\~Li+`#+\mu'܋[< xɋE9*wRHM;o4t…~w5إDxc<,vfJLOm/XU谎KSF@YM6e l2Pe! 1fT Trps(h{GNXI$6:lxIQ+D2( S 80Н(Z.Y}<3"~GWR)3 ot)G»gTpX >D@>r,O+|A% H ۮ z6YttuF.  ĸ|%L#(є,qBvd+S17Tot'lxsA`¨K7 lLvU_Hn.Y7C__c͊b6@mV_¦zwTcPrz2 8^LgV`ׅ`_~tFt_ o5ɳJʷd蝦<͕2bx Gq8B-S+IԕcW%nF=H4W*˞/[>f j.`$D|76@1@e5YcɆge{rpj⠧e+yEAkG k\)v9OsސcAW WP$Hpz q^5T XX/l 64Xc奈 f(I/~{uhr|mSB}7!!2t2286춖 X:{7-|5_pTģ>@ZDeTRr^#sT+FV{Zn~r Pijx+D49D`!*8s m|b/X{r':E,&; c:hM\EZ[U f@ Mw~|^@|wJA ; ^'mi!+% oD 4nHx*қe+:N͡i TdWFqA/ف"6[7, *@:{,Dh%Wy^h9<:TbBYT߇ B*1~ƛßձ'K>8LYrJi ]wC:@,y7;Aַ]p'}4I#;K6 #Nja`,kё$^ [dX֛X.[D^y0Mj݌?ar1JX:4<+R?$A 6 ~S׶Kz5<Bn$:&xY2dj䛟{cی\랏hkߐ^u Am1.^[Ku&?v!v&W ɢ!͌lX<o 3Y5[fQ8:![#@WǜQg|'j إ uOBe}oMw+uG):zq f˲PUѵ1؈xR0`uZYCrfd~>6UZMO\Q VJAِ9wɃ $SPZ-1Уrݡޜ[uB^K+ &]{ 3cvB |S[#/bfG9<Ĵwv/(_2j۵ q.X5L%'b)mǃn&a |#%FIq@-hqػ i֫m?*. n_IO"H8io0QXfk[jfv#(C q#EbZ A2:wڽ@O7;-l8h_숗n%LMi/J`smۿ/sCnHCAd>MbeAPk3"()H+'3fUm)7h]96(mM+h `:6,e8S9-]nBpF! qBxt&.WEA`s8@Pʸ+R&*fvqakʲXXH yln\6¦ht"U24^)5UKbs2qO1[%y>wLhĚܧPW ytKH]*#x-fh ;ȭK8X=*#Z ek5@~øD By4"noG[WzAGDȉ3Q` ,v$|AGk%4J=\HCgѴ fb=#c6Z)` Nجw t6j;[4V{2VY2ډ:E3KĠ5U$5d2p+$>Z:AG%r18E5IAg3wX;@"fOWrytite*>c;krsל-Lc퉱fj: F/B*IcD6_ 8㨒!L~3y3K!)b9ʩVz(TSGrjq瑭m=T Y8+Nc0&K`u.\}F\702L#XJ(LN^TԁcploL pb(/vH,bYdr q'|`_ثsF#1[2'K&9릤tFpN0! UY7\e,Py\7AY]sT ,uzwȲnЌZzR7<@J@v (b븆}вM? 4OB0B8?PO&~W%7bd A 8MJi?)6ɤ,7űzh-aتp`|nSbAv9<{:K9&VMYh*mp2ND+¯`-e,ZD/^;%E d4"j#VK]'D,X}M[#cܹr*Dzΐ0+ecpYL؍Xkfﻠj|IFdHe}Tteao9 ,)V8Ur!&]ͩ7ܴw]H 60ZL$ GbڼrL? 5Co0S%*j1&_琨 j4Dg3Nlc %g7Z"Lpo ].09qaB+Z-^ZF6#&8+t&C,''_{dS6)}aQ >29%X-2-tdX*^*#FN(%Ӵ/V06rDA@ÕcXe0Ymy YA |cXw,hSҺ/){Z4۾jp65K@tRF u$)A̅X& gb%! H_ jD P;M& oo 2Aή_KRc9N0({'䦁/ϸV ui՝IejF!.]FpN:8^e*AuG0; ,]Ȁ#I_{4=24E-R`;hꤼvw$L-E1d S H) <T2<}3 MF, 2":FcU(ȤZ;4Θ꞊$lpW/Ș`ƕX8ָxE D}%%& $l#wNt=kG 9Mֱq9]JjI``9 { ri`LE?{"K  u"+(|9)1) 4>4g"",VS–?{,,!g$D*Ҧ4P#) jPLH86W_w{ niRX yes&_AMfEs4f0(2iqy1M}b_`BDP:=Tr;"1UN`woͳ;m{mP؃&h  _A^,K ;"l}jia r d~V_um*sz VC)ryo:C'4:?j;o/Yoj)E?X(4:&+ʺ[~yp*#X}@lw2?y Xp5&Q{:7RcY-wb^QnS&8=ý{(+5݊2:z m,T>aظ~lzUPڵ_)^\l1! a$ 3åǼ_ս` N JP!DV@↉WXdW% k;;P |xWvN0;40ܪlQ|~հF`# YgLK Lܨ2A0[s+`Z%YPϑ_S!uKwIzal^EE"ڑQ0i"h!wly\'  h:a jD$z 1ϖpy6FT~\icbϴ |Fk|YdWdW1Ϛ{^i%e/߁)^y y~w[KY/#֐P$ql XɴFSzAp@hVע)_R3l`ӷ5;WVKi.J gh5"; 4pᳲAv(X1! X\II ] (i^S)J+`Wa[2JTgY O)1y=1S 1姊Ȟ~b 'q T/Q/ 2_DrV"5}q^kN7g.Ӛ<='z{y5Ƽ[h2hCĖ U%}cg5q1$189߂`~YVjF `` .ZLp 96*i:2(:=HcJ|U.c>d*@Q q2:5bx4IR;@!jΟWP"ŖȕħéGqMBIo'zOD390o!~011N/ 7#&TH[wOwO|]J{>:k) ee wۻd "A.E-(a/&Dzx҅\5GT@cSsJF0>?= -p/rciU&;΁e#}xɪ,R6p0 {~agyA&8M9m\6h;z0SBmgv`PG'#Hd(Cٓ}s_Oj1ZD׶9ƚ!%?%,[Äd 3|BPCe<|i9rK++#ٵ; A[k.k2i@ [zh7A#xoL-{1\{W;M~@uB 1 ذ)d_rWdVε]H6^iBzt^klʦQ8+.D V⢍ec!p1ԛq9VK [-Yb\HM G߀QׯTV`E 5&3-g)􋻐?jPh dzq f!*;@m&M/oj Zz*Netp =U Ob>&?#B0qE %eDo[ ݑN]>X9+S Sy쫎GmK&v)Y~C$L(Z֕0؉SOdV—Y7@diګH+qf-CD'6uiSVfsu)ݶF]Ka=]=WZ/@?$a"HC񚐾Ȥ>%٢W*] -6SQeA4](!w,ue^5#60qM(wDUJM:LiEx9#L`Q]jW,_ vKss03pb8@U0W4VC#_(goQjvd(ֈw!9^۾>#@daF]<߮_('mG v [Evd`q(BxSk8j-EE"]#.969$IBAJsH6S2D aTw2Ã"2gj9ajH?[8k\|!aScNG:PfJp[mf:ࢬDFg~ nRrEûHC^Cd&P0V:t+VZRd~cmǭ ޽,T QM;O `*Ұ?TF`ĶknŚ;)6=DMgkci` !j;5͏952'U]n}̈́?gS_r v"&$s&VDχ$ᩁt 22A6A2s83i΍U%>~E&x JG6{@C6! aC}ۊ?dV;Mc_drdSL7 <_+NI;bC3P]}D~yu3jPC*JoQK %W='aQf7 W ԣ q8SH ؄rё%"38א~D]ۦ8wX|MEMh>Wojg(?FXO/%6!:x?&w& w gX#i][#fjC`,5) ^*Cd%x2Jv:FQ!/ fc:8f2p% sJT{ԢϛQ;jDž:y4,iGq5qe d Eh"F{Oe~4,p9y瓰R}*:=P[f ۀVg2ZjX|oo7Fpveߦ" Z[\kL|.^ #f"AFe;Ñh $L$ Х7@)+@q8g_Xf}|>((aU $5} $̡X 3a6E2E]E!pɼ\jJrNO1{ I ~~E0[~? iE0V^w**NE}4(4?vIx D\!X*gfnwY- ` m8謅'@4Bf v:bEeoJ*Q(?r?>}A$,)P}JŇG&ؾhw T_,T 7D{#BY")Pd_*>e#l>?SW]u &ł{dΝNp h0\A CHQ!6ťiB-ЖD@MG^ڂx@ UJu|( P{:xX%+(P\h [r ]{dk[W-%.@"0~؉^2&DF^-.#wylkVe& ٘7 Kvsu ~:Ï9+MD4-&-!cd!M,l\til>2>E1jLkƉvj> C=Ot>+9wj@PXÆLP~2x!{g5JN-|mbZVzB?ş=π@(^!C:̨sYSsO!i4$!8BH06PDU B…ORd9t>.f Wfѧɺ|s{̈́ZmȨ{dʋ_*pi]2Ź:sB1pE893cf:t_.B'nd['jIdtxˉXK2:D[߉L׆@^LmV+6F[D&h:!B[CEnJYhaa Ȁ/mU/ʗvGHjhuG"F?osf7ެ0jUw„qbUq2DɚMTr?mAgcJfx.<95 60 o6%TfsdTN(5ԁCbfl4 YӚ_§Gc HuKHώHj^ƨ"ժ7yV;jjku069g6hJ//2= 7bAo=22%OstMBJi4m߅D'7~׍u2Q\IzetH]}rS< g ]- V3˻fW^x TlH3׶I6cR-s}<o^iaZXĚJvpFE5ab˗Cp=x IJTDzoz d2^G ICt<'NlȘ ? W1S0P[0,^:7,t5Lg!.BooſSk!;k_F3Ur0.PVE 06\R4%YHy }8ħy I* 'O;@},݊!'v֣Pp̧s5 ڋ9*iaep3cĐy,gU!#/kxI<11"NnwudQ)>AAY 7jpxF|jb>(R!e7@ ˪.4v;fXw'$H ̩ze@s#- J =E8t5sT7{jOKtkʠ+Ե0SVXZFľq ej`PPܮghMg `gtG&{˟-Ä jL7f> y_Bk^(4 u1hKtx[kF+.LZP86KRԵJ/P\%@h0]cgW!V<<dy+io!뻊hj\wVS fk#=$-ZqQ'3 yKݘm5u%\'sդ\B^JA3sK> \&!ckb4C"^'m,BnCz;FDsHIR^ܿ^<U:Gmmg`4Wc`iSbF0XPCl p h-yy1X!e-b l˝X՟zfK|7:UI& sjİaIOt x5XmsGc%̤0ޫ2dTZe%ihɩ>HG?!R͢k0u7'PӨ[XL`9#;:nTzns nKĠeGU6@Dt~Lpljtl 76z Y4~+j[^ήn}t,pG=Aw~&pǺlYd.Ihwn?pHDu.UXSAO%QP m82cPƴ:xST('8A8 (8I&9ɵs:g,64y[[^4zlOOWpkЊ䡭dh3 SrcJ&#Dϓf"=kL\H~2\$2^SQX2zWmYَ=IB35VwAľ-vGM=i>R $A;a>00(2Wj>QT|Z5j^AbOW!eLK\c28Cr#^g[/,3Т _JzLԒ+ A iA+s1r0/)WB3u'*V;~IRH4 Ơmy0Ϋc0S'jxvib:BBg3 R{ּN \ld5l?qO2 hXI/q诀G-XIQ -"F6NvuL?oeA%Q57vp d.x[1z}Ҡ p!1~ӱ368JD R&%%XnFCKVY4rɨFjLt\Y]#V7ە_& 3Qf<0S"f,bxm$i%ej[WX$Qek8`I0Xi*s_p|(4 Ajw 9{)e]z0AA M_ɕGOMr=`vH%Q"=2R٘X(녒htkNJ^;p9pf͝g؅bhQ ?$t>ZEzk ~kpg4)c}IЛ qMdS)ךa`a^nv4'4UXc|X0'υ!4OCiCGE>4ajw%+漃 J-/ŗr@ێނtJÒ1ɾ^d!\]/p!~eQTj5džm"EU·Ӗ;`ɔ/,Cvc=x(\onZL57bnYnw(c]:W--(3W.J}4 iޗBy^k1 ~_*5{~y2XtA f>-2l('P:`{e9C^f󸧿Gh ^rp8Q'c/|S-O4͚zP"z1."&p pyzRڻE`JQy/u.-aMENwB݄_)R_\ G ;D=Krfa~0;97iU[Fp|LA*fat 8L:fp *D>N_1O rZ16qg 6@aG{S:cƑ@{=eO{/,Շ Ȑ8E``^擭F@06]]K\$ Z ,5zHjn_FM&Jfe)E_vѣxXNi̓εV SQ(#D^TXv8)#kȍa]<Ӭٔ.]HLbG@$f&0` =n Yg}|D/hrzD2:R(z,bJb.͸nL^ j:AIc͞,~%8_VcxN6{aJzBy0P2QhhDv3Cӥp,[1ЋݩߋUaT.U**c b;2\ H^[KP[Hok[.Fx4m[ScCH[~{nWr2e4C$?](n{u/Pv??yʍR}R~yB~$p8mI[ݹ/!4 /=!polш}E P}j# *'eA>&\f-*5} FL]Q0aB ÕV+`8c|6ohKRA+Eo{r;!Elۜ&7kqaE}!\' \?:Q=Mg+,=(M'F5cp^%ue% lݡF;mȮ/2'R -pnHҢty˲/働%[yNH[ Y\"j/p+\ 2v%,VrcI=ߊrJFEF[uz~c$'?$ Q 3сKipLԾu 5:  8 1^MaV\I]ĕOSԍzC 1o}l.:5Iuq)GVylQӕM琁ᕨ-fXp8xZ=Xq]{U훱gr#V&@JHј"Jk-ŔF SB7Z~^ >$&$/pflb0[o'hTY3q}M |P|rX,PB]\R l&X1Sa`cyo#990ʯM\v裧©r(B 1GȞ(J\Z0j5um]-F˞¥J`қ@kr=+[-L/GR1NSXm1VBY#˙'mjViStmKB0Lul"KkH_ >O+ca6flDŽp/FYBacfϊ&\+r58bqͿD*>L s."+ǍEs?PK9%f̓\@Lcd`D5Jj ]#9KA$;Cw0>݂MclJ |*;,y/JT7qkNXo.Ȁ))g Tˡ˘MazeF@iTM\oAq{Ls N+:PT:r O]U.(1ډ4sqD.JT 8އ*07t$ɳg%OMߦ$=TCض^"0WޚPL]^j%GpN$^)1oݯE7@EW24 V; V@t~TQUc-[~g EȐ=RQ̙# R!3mMj#48?ϊux3JA Pேf'c, kZl~Uz 8$Ҹ ˜v0i#&t2#JRg<=887VʱxB^P(C zqgL.\ |(?IAy o~pQLň"9)qH5VWU:jӌS5+T$Rdࡾ.o}4`rL] v[r3Iy@_;me_A@v"%j_~^uFA:$S6`6rTg7$ũ|m C 0{` JAeG,` }&ƒ l5c"$7+M3`" "Xȣ\b?N.jD$G%e"m_Xطľ᫒#>ъ9 G*\LR`bmǛׯEf\Rm/退Yw,1"RTδ)]^UAFte:X1tB\+o;$lcWR"-߿U"ل2h?x?UBTF%xy駇02㴖u๔p' 9pa=ApuQ7yߗF{_!+8?  K̮ .rA?MheY4K9 b6-_ o<-!^ K|($ VW8hExxƢN̶lEi+4zNY FTf>ENPv -BApl0x3X!\r#\e#A?:4-| j+bUk<^$]" .۰Vr8zg0lC[T7bί{Ȥh_:Icad':a3-w~}4ₐraeNNҙ|:iH)9na3L@c(Q}}P :+9},S"}C}#a$)%n;k;C@fDMOOuJkE:ʍ0U%*U!9Ŵ6!S"OEcT^G),C@r _2C}E P2!ttXE4x*V8M""db %Z!Dٔ}?u-@Zn-'^@'e`BpI#P(?VI n݆ϛA08^5rڒN_aJk,*'QK㸳Ca5GK dO``m$8uP@Hk!f\W{тn= M64,`(M.Ӑt#h!HPa})J>΍ⳋXVH{.V^FZJkװ"`/kἳ͋@,@lBo$poh'蓁eb"𳺺$">@v  M +[´ζ= yTGc/[]") #Omv*pI sL^?Nb,+CkY-e\:Xհ ~BEKݚ3fфP y!,l2DžOC)!VǕiT@9Z͌ #LՃ=V)t4\FVi+2Oz6J/G Uӿtko9Ք8[$Pyd Ź*`ѡ `QP x4]zX"gi~؜t3K"m#p;zkxb?yA1,.+R͔ ht D$`A|m`% I HPngm4̆K>-!dllWY_FJD O ~2+nVH!cL^jAү0s,q?雔p9)F\_皱 ߖs2I{.|,ÃвtxFB %BKb-ɥqS$VgeѝikjB3[f x۪3Rm~Y ҲȾ|ezЌRp忾5(4ՋU3 6Pu]oT:L!Fs!`Z(k+h뜂+5(iڰy$`m[=vzUN ȷ!b#{)k "ڑ>{ _Ak/-ϒer`nY_n~D) ~I '8mt{MW6a[dAu$!dM_o'`",Q#ҺoPLUx^*?@{**էg56=SPV }_ %[1O l ڬ GEQ߫IHdGn_τcjXC:F$p1Ϣ(vBvf7Vw">"9Rfa#4ڣێ@ ЎWvL3؃W*;1Jc|;8jRjt'zR"7@_0bf=g<ιz~735]Y4N{9Cz!] t ;b l_aA=fzܙz_yCD[,^F ,&C.K4Hd^& ֳ&7Qr!Ҹ+k eUX6ZYb343]4 1!CTݫ, XaoHąyA '`k5ڱ=)a% %ĞXvk;uOKwUM. gniXB .ġĆCd 4dz J xdaojRP :F-^}QԎAh2 JVb$N[LhnihW* gBǏ|ZmG2&0py'p polӷdBCl}״Sv+ \*> CyA/d$dEHxrޔ`KE=^,jN̕ xȀl;BV,d uG@{&ǚmu]A]k إ;- rW;Dbk@wh5 +EP8ЗA jA=+nN?Z29xqF#*'bk>IX/9bu3z> Pǫ>VK(F2}?ևd%՝n-5*<[.UJ2]Gy+C^GZIAh|L'[ϥ7hiQ6W؛oW]hu XלBA^Ԯ*yuy%c6&qb rO& N@f wkwV "qq">7/MN@8hL)jτD7P&Kc}6?[y,+^O Hp^cȑVRޠrJm ;&sBZaEz`#pYpiN lR xV^^3kWYÀ=VdK騟qn~{qWG'Wܢe%Aw}dF<>;CCᣱ(CS**\C$NH(=7s$|[٤(aj WcCsuY+w>LƑ0v\  Cq%-=s`^j5mYJmȯЩl} 4%cK#` WZa}V E򨮑_Bi ԛI$_xp So6g8pYiy°ZƽzHy=mL{gž 5$jGTE oP<R0<% FiΓڢ\ wK\S@B޻ȸ[Y"cId@25X cMMDefaAޝvݜԱObٌ+ދnM$[tƏ 8E&0({ l2VQi4Ӝ^EI -)tyd{\c{uU J̶ʲnLKGЃIZʰi-Y1]z 9~oi2ae` Yņ(;}(ۏg h9MvR8VwmNz'U,KYg%zCPA"|vWL[gY zXUqժp`n噊A{@a=h#=[hHr{z'! WUJq@@{2 W{ŷ9H(3hqV4=K0׬!`87iR]Po1dgY|٩mݞT:Wwn^3z!Obnqv3+/k-r L#r^v]{MV/aRԚOy-l|J#S\ez3 -6*:Hmk~Fwι6꺓$|.x6?xx:Kuw{oy4ػؾ\~{ڎßPwKT č<spnT9۲P5uآdu&k/.Ti%2ߞ_$7@ IƈU/,hr}'_^,S _F@31PWĩy mieVL0Dn[[ػѧ𝊺v8;ԲnոP\ZeǑ`2, 2 hFD0* E&ZWmƠBAKxqi@ zxI@#if HbaH 1Ph!?;fˊGѦJAa7Mڷ džͰ] C+ɒ@aFY^.F@liD q.(/^ۘ&.9,`q4`dq¾|NDӥMdT\JR#8Sτk\{hZNq wN~-]/_m5u]k\*ʲ`oVr[``DD [:%ɲװ>D8X:ӈ_֋Bw"gA}"H=m=Uu}Ԭ:"8hAqo%箮2^0¡-֔FP/rcsprMp&k`:XtPΨ#]j/>Yi͂f𿦉5{F ~?`S у+ ]);jC ܹ֘oTF/@8l0DvHv`g{T] eZk{FL6KRTK㵨=.[l?U9Lۘf 2ЪؘamkEћ>.g3VjTtܜ#2!E":m yk86,ĽٲH]K2 UECrqWr蛎քPzӞ3(OL I8bឝNAvߠD~|Bn靈|i,,؄):Ј o:Umw!L] t=LAI2a"  $8 2IZob 5N%nەǽK46Ex;E!2Լ© @֕W^mePbj+6l#դȬMRY=U;{נleq^}Zzz 5B)i}V[Ωa y$k2A7D6 |8I Ѵp^ J+tl" 0liV FW56TnjKhB`P/2Ca|U{g7vDsgc74]Vr$clo 0&7Z(_Aj(4eոSA?"f`w9dV8Ē/Z]Uv^ kT,# '2*@kjGYOF䎌{%-t,-!ӊ]*:Y DcDV,VTڬ)Zj؞kmD -VX15袹W ,(%pj/g"g|f#` I ۴8mh,Ed^p8V@ňQ ۥdu` .sAe@EG5щ!=8bq6XAC:zK==KnI^JRɵ#A9 BaHgg>r!5pM#=IWG=ȱՐ\n#"RA\Cnu3T`ؙM4 I`1;>bn3AYH@0'4 @!oJbr W-K-/ϼUnrSCL`zi0AEKb31 Rycb` V`M3 P0Yg3#|u8îƄ?gY(0+4&\ˠMZ0y3@jLZiYW€Y&zZad<4ᘢsZ ; `H,c?d#'"HU &Tp0Ei5m -D%QGqG.ap:p) !K,>1eQCͶ8^/ok "D9^KWk1өDN5Gp  ck* E, S8"XBo| u f$cj':‚"*d![?r% 2 l{=%ślQ4=@vP\uW?: ujaV+;K[ Y7(:a f.Yw-eŐ hf˝+qYЅı2! 2#*` `2Fyń|b}<9 | tX7/?3AߨPU>7):% XMi;s>W  jz",İVH[oƷ&y7 YV緔.n$H 4)Op\]U5lܲ`Jj8Sl7RSq z5'ߘh*>1'J&x 0"Al1[p0o3r0~[sD2e5B= @b(5'*B&,:Հ¢ikɕgla Ch%Q ="Uy .PƆʓLH1[4}ѥ xz(n<*K~a/vг,ⶖ³ƒlDu2ĩ!id~=)o+EG-IyK1U{ eNĚF(@g Le4]z 3l1ՒL e"*q !VbL=S6Ыk`-pⰈW$3v$u}I1]Ǚj &a1xv5ֿfqeLYH3 HSClq a03۞7xҋ0ւH^ 9cd#xnVFlB׎*H;'lZ*Qk n+۳Lm79]do/j]V Q~0Dp| E0dQۤ>?H;A9R ic槛 |.{b!br{Uc^zn`@ gh.C 0K'u5Džty)>o%-i_4uemVgmF X>#Ez|*.]}GbDɞN:~"Sw)7RM|V>*K*|~p S}„D9;-{P}qV4i?b%]mHy;d(.Niݯr4{2l?MS/ONS,+ک!N1/Mb$C%K1>@L _ǧpAA}}],T 4ͬ@\;[L+>I?^|Z8ai jfvC+Z>3EX >.MbUtL8AC.ȗhUD6c?lPW._iOt dEvb'}GCܟf-:\COU48 :`nE|ѮAZ}z(lp|xU`OvL]Ʈ!y^ p!d0tEWD/g*JڟQ7oHDQu$ɒD&IgbAc\ۭd✆|0EBǺ_F?B^NfPwO`@<-x;}ѽ{W0wQ仺J`d0-NL2Kl:)њZ='ϠP` TPeG͆ڹj"e3 )RP4qrSx883ŀx.ٲnJ8_5[FK{0H7iThZJw* .8]3 uZ0P>ѓ%U4#*H:wP~tXt3~%Q}cs=Eq?<@/eZKX\IAO?;j;qC%FA&O jSCJM_䠠A`h#b8[ex2F$ Tbҩ5ͪ6@_uk@u'"*i'NxPB+'>Q~ꯁ>p}4R30o [PUj9ENJc|1z2"ŴWkیbn7 %FR%ݹ:d;QzS}ڰ/%OVGag ծ9n}uz\ȷ-v_lO+ F2_ߪLso~&+1J- GjGUN+|BG ePfBu]vVS1\[{i'b F$!H8J\GVI/ְ5Wݞ$DEA5pK/Lƒ&WFJCc#+nC^^[?l{jGd>f2 ΓR&<ā]E:C}hQ  lXkz=O#mJ2pB'uO.a~i"I(ز9{Cen]VgԄjd;kwI[l~V?1??t2&Qq v0vA^dWt -[U/tV3#}4# v7 1߫HjՓjG wwUW1ͽ,@qjWۊf&6{Cɕ,q ѝB1DlxR?DFf %>NL_5hwQ(3V-|t:viZG KU_٤:xWGF?bbR8#O&J 9\f ( O]nO:9 [G,v `<#Xeh5X /{AthA%Rr`wi,%UulS>oA;щ_Iaqb(!ؠpw&'+bYdcw_|ptCFp<1ˊ s}umMyK[y3,yE_ i_rnL?- 5jDV)ɷq{XXb,oRyfܨ6$>ͰC =\DD{A0cjfnA帠▬~ʀĒχ4Nёl XYD9E?cg'ׇHKNƳlo,c|bV),YҗB?佾Ҍcjp>z6'8oP`mVb[j ƨH8 .gb qFܠ`;as %Ic.[u.Ffu= &L 6l n!qrC~}8P>J62>U0@=IfۻDZ5V-*m͆~7_HR!p5tAl,ct84K&jI" Z<( <;rv B'cj&XVזqQ )paQߑqlefkIB'=@% D p{#2ɔ{+mM 0swŻm.aqic *V˦%d$9O"'~/*+`_T }K/yA48u-߳C;="4p}TVDi?-9ĀD`XZN@YJ63ҷi*'?s_MC -d"ɅWA~JjBd̆ TYRl5k9f+2z%[;rRmyXG4ݣ}-fKP1sF0r/1D03k=kG~p񊍃x8/t 7.v˓4pM-*"$8iFy.v ևĖ~|mղzVZc9'QYGAx̓ _\=u ?Ahп4ASqŢ^NW*F,ɥFvZ:'!,& r $eα:-¡n~' d}xQ+ k#c~Vt.ah5A^{5|<*1;oJzq[Jp~2ۘv6ŽP{^WL}N^81+l5R@=B/E&| 7#Ňb`m g6^  kvUfyX=ИX9ɖn v|zm eډpX+(i죖Z S߰oH` r8$E Е/+fe7Ґ`4A8 }$}+ܕ|E,+X lHb|q{ w%6.!][o2[S4>=J~ۚoܢF=Dl2V9Ьr}! {KVQM#X: J|'ZAӉdPTOyV]|<]N$r|.j8)\5k5W~[F*_jLm}Wjm5-!12m!Llndp(aId8EBlx׸Omwc5p,mxV ܣJ]{J .Q ϓgMR lQNH j9r7Os&mmv=,>8_8[ ٦ łF.(yՊ@& \fOZZ~.4+L%_㻍L5?[M=ai1Ma쐚*3Y?ыn(8vJͿUTa W7 \o7]]zBW2{(_)R>T!!2efۚS$ J܉a'JCDdq?\2Y܌;щk9C?t)W^;h|/pqg\jN$ ޹Ǯ9}p~U3Q//4Bqvx!!,ظ;qou )G o+ QArQ 7Zn;gOq.$l萰<\* R¤b`F_38^6cėԔLMMW1)nȦh"G](q C="cKLQdZF`Bŀ<`CI2sTi4JC$&ѯeoeoW]`J0;߶\!01:f9%׭}\VјMt، XeYX*K&`υIe ]n=KQ;N׭ٟlU᫒;5-<s01@l3"i@9EoC F҅o/)G$tn}u*X)&I mL.x% &[?lɮo_n=YDn[pXl`Z&2[}j?1ڇ;Mm<>/wg?ņO SyR/e^a-U JiYc\$Ur65njCl+3a=hS꽗TR/r{0,nS@]"|:>h= 61nUOڑ:g(K6-ŰBր-`]3 p9)"0$f)Sէ5XlZ͈ AKA GN_tEº+e`Fr!S@087[_@}gI#0aڑ7EYeBX+KmPbJ6Ztc|.-3.Bʇ*|YaYYq(26JJfBXDA"wv7r,zOo>!TDUYxdH+Y74 8RQ#Q[EIK5ߙSNXle![kFv #$( JzC*6DL({Xw3|W]WYu1 0o't}:3l&d !s>|-Q%CJA/<_YY՜z=%zγ,PK\ ?3L:o7S9}۶Ò*! zRmubhܫ># ȍ3kp6 m8>G3X~>iM.H"<`x`6li4y]F Dxaٶi.l1uX%a(6)n%*2 ډ%Rğʊ`: P76:HNcDDG@{W 33U ߒZW9+q,M2|Z\QMO|ӆۢ{t/r0H'}Xɣ ۝WW=XWΖ[`BCX0>$ k`ҟ/&"&f\9%&A~<Ξx-%^!fr#gny*Ć#S+;+ Zc\7JQْnlE[4$TlBLšlв+rm: 3fe7`MN._UgjmuRbbx8V[`K!-:lyGy?o5kT&2̜:#7sH˞:c8*- _p9z2O?cawUk0i g>#QZzaJ8Ź(J$.~"$43%B9G%C<#-=T2-y}U򄽏qe:+ htҬ :sPfJMҫ$f2ȋ|6F{A՞f"5|<=Y˝hM;@WxEP$[l JIxQe#ȯG}X31[e49%K= ʛ+jowP8b~"Fo~ ee[.*!b&L12FY!q. }XV~DQ5Y@;0:h ЗfҬX9B6QB-=JhaMHK@F+o*'cPPz_kqL:JYKe-:a|b&ohڥ3>13mH@AXmϱ2ϖSsHjC4G&7FD!nv}팷I?N҂A4>+qg "J{kVWvNq eΉ(TX:QA%Rs|Wf l^0 p@9/ Vj~@ #[KIڭtĩyt4h|>2j*4w%_.!->$Å8]|_1 =U/C^ , K"OaRn{l}ebJ9:[8imo3J9{v,U S•Of6W׷>?jmg@ܺ:ywf> cR#) 9cLG#1<QOg PGQqrn 8STF}P]GbSQPؾckh_ภM{so硷b'%d;톍!>@Y`f)mYmS09Τ_sU26|qy{+%&$ᔿS[g>GrUDs5|.- .kN߿1ix`6<Rn%J̦DP8\T/lɅ@-@l=%{94ظiS7H g\ч+ mSQ2$AvDi0 /Ńg|w9as|N,~9ڥe1S..1-/ {D-*Z7K'ÆRip*!kǗbۖ(`3Ve"ygdITuw^9cԳ`}Vh],Y`! PYX{Q6Λ= \/T{N?bgL qMJ;g%ч.p|'+1; Ǘ.< B#vCiǘ5#2rL;  osumEoK6_'+p5Y=b/9 /,=_GdSXC}r+z+= qb)M&wc R\u'* 9b·sP@9c>EP4Y"ͺ}ԭ~ׇop 9ܝZ1~ ֏D4zmǵzc,˪l=诠e-"] w̠j݅RxVAlh q^.V/!QHcQE;_r-(;)why1Dhl%R}9|ajl/V:"lQ*Տ={',"Q~I{V, 4@9VM߈|ρxQ"<) ?zLu,24ɢyȩ+@=Vyy!^D-5:(yw8JС8R6% h ,Q![S sZQEk0O 3TS'dsC.r?`> } :0|azFTNޠ&]YU?9^uqĎׯyG0߆D o_|X0ϖfY\@dF! }7 qg}g؜W ľ3Iݍޮ$LH}TX⃙׶Ѥ!sX,C#+N~{EZe獦*M4 >3A6݊9j(7t9x[@Ib~g%%1aRir@Eu7[xY,Ґ{IQZN<tY`-.xVmxvD=U"sMFߨ{M[a6%`П,f_{aSO20>l~C]\ɦ~)n]?G 6s#-{.jxA@j-ڔY c@{ovBT i>Цʂ~'PN/OMyÁAg$h~<NX߮ ʆ챇?Ô7.y]mqLl,y$) 4'U@ 840[1P>XӮn oN#>rI1!qŵ$&ҝkJϑ\sc/>bf uJY^c4,Y HwmOm8]30cȰ/{Ϸ>~?ua{G9+ԡn&vVK C@kbsSѳ5r3I<= oẼE٣$ -wz7߉F:g$iݷdPe4xNRt9v{,^s[ jqwKxv!$kLM‘!ϫb:1qcQZgANxU9"Li/1r+%ּa%jCI)u~#35d/G%Рܩdސ{1{.l/V@ӆy'7]r} Goɔ{=:)]=QYic "NB6#qq[6C~NKD} Ɓy:P~n$*0/kx]2l\n zu/?%[/'5.,c5:y}}T>\:qHU |b>/{@ \"&tg\i S B.S=B654ϲTG U ;o7T4;eʵ @[)g2N_OqW^ϣ@D6džмI6]n}\Ft@*%g3jGgƒDS3AM[͟}'Ѷǩ4+ޙblmAP>`9`5'ê$,9.?^)P9]K@r%y:G̣Tt΁Dy$| _1ȫ >8XyKS#"nS6Q@_!E'T^u(JR&DP\5 .Sz9FD ǷwR,d̺p":( ɔH Vc&&[s]0:5>:=М+˖xk)`vIa5K&\#WօeYfT;/uǧ(qƒ! hGk=~a݅5#nlg(8\NW u ~__reaԳ"6yj}c~bEg`\Xjd3@] 0ov"zX<||\-ѾE DRxvMiҲw% %,)O^ Ih0JQ7[%}?4QΆt܌l,8jPxF oufey/vμٌ;vL*MQ]2Odig-AtuOmm3e*92]?-K&oD/ 窚q6ꎑ,"轌z6D-9Zg|}M^%ke-._ujSui @ktoo[XƧe!pTʪ.)P90wTMľӲtL%]m{CxW' @4X H6Kb/ZzTB3,yz`6Yggw6hW}>?֧wƱ0OQ |.F=)9%uw=vtyvM*W[ZW'Tnd ;o +.Y|M+kY>jbQ(ѱ~^[=o奌Զ'T?`My/9ppXeK^Z Ně/|45P`ٳg\fH$j]?IL)hY,s,awW ƲW=++p{Jѿiۧ\s>鲞. գyX XlZmN(6ʋ/AVuj]hzT + Үo*WXw`7ĘO,W&;P0qW6ܗLXjJ5Qp>Q'NPoGw|:{ $\ eDfkqgG\PdȠƺ]Z9`/<:}"cGPeΊ v>4mgh=x)=h34[먙~:5x"$dH뇿dKR{FFErRvw*uk 50&2Smu3s_)̾T d3?b0ラ3-b+S?9OVC\jLvm\Ίf$t"w]}i!̎Y4R x-0oNUV}͉jc*e.3>)%Qȃ KwNJJSS/J:9 uiy'mo3jm`c.F7@XX/s 9qe++5ڀ<XGm 8a`3)0\.r}tzҊ%'!{d,bߗ` 㥴vexFz%'gpӄ}E^9!UT^z#xm[]I(w_;B_EaOR jN**SނV -olj҂&ב궊P_E{ )qΐMttKg_ $+^d&_&++< >`w3Ľ7b,-kANJ{*NApu_:4b|z!ң9EI~z yjc~bvMU6>>Z r-!by(q?ၮTmzm6.,$0/#JЋ}OwK Aq8v/?,gD+҇AKbMNJzP֒"cUߕM@N{ ͬ2||ѵ+.gͰQYW*GgĀ噭4T$4kYӄWKG&;E.\gCt]"5B+uPf%)D TV ׹Mvx;_8ps'gZr=BkO^宗7;۱ w NeH5XBD`Xz\D'~K6Gա BL|"1i.K[}u[H\mcO-OMv!xZvf#¨F~O~WBcy=>_ETa;F{N;Iyz)}ccbw*;^>!lÏ_ƆIrKi%6<"o|Di-2_BN0DAضzNJpV={n l@( c{mL|;jrzA6[$lipH5 8l=k5Ѵ5llg ;(+pM_o:c:֖XŠ]T%ѻ#^VeXpfhLU'_ep0CU.l yNcbT=_SÑL|M[}HEj$̳aAqi<lt~4o YŸﰣīoy,z'kR'NbP%0F;58\Y:N5o9eF+8E'L#0>_&sX5?pMЂy=&(8+,wqg̏Fh/s/QP]_S&[LtꁯQ_ogl*wEt:iȧu.9p.`(ňuT2Tp?aYLLæs1RR܅V ̣w s{X~硭#j*eЯwb(%d9*ORFjwqOPKSsd1؅L`}ߝj]\֦W[O욭gQ^nm5; 'OvnJ^161tM F{`̴gw"ykۍ(%_Sf咿`QQsg;mZd36UIcqE<άyҎ8tR :*r0 vYv&[EP9 $/e]s=fY-t&S\ݩe>ǯvbCSD6>R#XS7HpSr0%GhwXǂ7\ieșCh&R|4Kcјh\&!5~L<ٙwDuw3^Fݰ%mCU[,i:nN7;JhAڝx>hގ =}#/D-JiƧGCҦގoV%? 4ړeg1TS?ml[.>Q`ar/Xc||Q>mu 5ȴ@}o¥<D\99Ko`1и C)#VO]\d&vqm?Aw*M+ EN/=`u-)DNSѓ&8T/نطy dRM8(q@C._!:lH%F{-H=@e_ U$>E;Z@,44Z`T6>O\,1Wrm53Nսiu: y6̲Ghg!oV5-/]ۭKp,}kxZE+tvnV8ENNd  ,(ٜܰ_gwN>RF^F"e $HYM^ A~`%F'O_ /}|cjeh:3&/30_Gb.9-2ᑱpjTe$W2wl̲ێd!~vR;xU+sHsX>Gww?v9;{-:̣;jKLjsyAwD%$s[>]+Sw)`)n6Ty|[agV`R50x'|py>@/'(9c|^i["i}+=O.9`2X;5t4iHN3[ tOѬְrt2,ir.Vֽ61B:@qzo$Wr:4y@}D{RH#1pgrf,TctF)-6jv&ݒ*teUFDޒ2qp],뫗_Uא4 ; BtT/у0s;1ṳ(KFz?ԛyI;L8W1BM-L3SuKOsS~Re):Y<|r\3Rb'Kx j5^O<~K:Aӂ[\qOۓFK9(9 ޴3xsF@rAKlx}a87rB))}vCeQun/R81Wt=~I%z4P{)ש\>)&NyZ[u keۿ#D'QOf?#8Dp(Bs _c+=XEVXdvk٩ܢΨ%\)e'c) ăљO!(A&r~1_[>%Лt\cAgU1g?NQ\@591ׄ0۸}jcܾ)F_ri5(\ `yK7*h0ŠvABĕO 9=}/6R>_Nt>p _#!蜭,KX\*@=_',;>k{R-1٧|=HV̇x2S1*jj~쯡S[ОHr3T#PTV$f,AYVĶ/L>`%%p6-5zqt>Ve5~N7K:Vܹj6.t_eRȺ+jPO^`DB 3_qh;j ZcDiu@a?|(f/Mf;r EFT;'P-@nNHbo 'gBP1uý/iW1 ?{b, Q҆ RJDrb/7tӸLSA|sky:}Aδ߼8}< Esv!ĹI-m3DLӼ+ݭ#$%TҪ簚SK&4o i;YGqރyDi/&z!A}!܌AA–ÏY!RQ6Uh?i[K1JFF/(]OMwV|̍$wz ٨#Yڠ?JVʊ^a1ʹ') V;jșژ%SrR٦pd#F_ײyLH3WĒJCFsϽ4@f\v\QQw_A,clX/:{ ښV )v<qSڔKC iI(3q9 4d?x,Ϟ e){aa-N5~"ufPi|6T\eeK"cTaRLI+aQ)FD)xn"LԉE/,Z(mu )\MWDHֈORlݟ_ R o߱a(\ ZC(sQ=;dgە~Vb3V6؀H6:6֤]FVa¥96bv:0F:?ItKa)]fq<` QV=[@VqϺKk6.#uIһM΄HSJvù)j,NV^bmZZBY(x/kr΃k_mj1DW9}.~Sn~YRFn_:3G]Ol(uyA?]>hO; /K!epc{>\T'zKp^15>D^H;c3y20vɦ!56 {6|FLS 7L*'@-Oj9>|a^K"h8J}_# 'EBW&ê.iM}cn˧D53+3ڱC8bc<խ")rT$J?PtIGyZM+u 4̆!T>ͯ'4]&*Y@L8&B)54&şK).wZZIQg˳a:/8-IH6Ԣj춶۽)(45fh|)BC 5UacN޵2&L㏴'K;%Vsl>ܬ5I˾_ veSo2[j#zu08c鱥^rd|' r>TTtζh'R@+_$ie5'vVc*9 0Ϥ0W__B.r^ߓV520ʶXk [[ac0n3OL bVn7h^ЎbV{lFaF0qeݪBq}dTmfR}r£R`)B=OB3S!J-[ps> #S)%]\` ?JzʡʖάfO,+i 6-,zv* u1\qyQoꀭamLj\r,nв,B%TK$$ۛZKr;1z$YT&^' *:ոG'Ny9>YTQޫ\G+ۑYXJRښ5xTzKQTLrXR 14RIʥ@)|ܡ$a\<;-2LI }#(!&EZxMEqDu#R3Ys9awgMny݋R;N$u]Ts^2Jݷ7a#nc ;SIɲ]h4b]K5SmI! _ k#0g"f &FrqjwEE#/fpL~D5O3wwQZXқvP%z.A9T@zLawo4B jH& ?o&$w}v<~jok8J9|c*dLkGHqk0ȳ1/:&WAWcjKKPxg#iVUb0)V$;ҴqVXBr}'Cg~5~}ZTxH$7B&s޸פ0[UMM:JRǍO+;_OWMp*㇢UٟІ9(XppەM2+[xc_~sx$N㨇0;(k[@Q?:0(z"JqsLLl V,9cNKZNyhksfuk^4Lpgyx4 |Xa\wK&npۺ}~*Monv^o ~RZ|8$ ǰ;:AoRkJu X2ݴsط>˲'Ϯm3rlHJPu\S(/E9U-\{¬wnv¼M>,2>{?KҮCe8JUE 1;vF|֙1)y1aiEmcN[ʻԆ^-@¿.^.R ?AF)ԷJ_)F{YgIfwΟ޷ rیd/ѝSWC{1!jzZ{h4aPs7$܆QͺB0ya㏧w54\| }s婠9"6(3Xm X t{:Z%C~ {\ mzgdEY;S{:Jd>9ΪȊ?1+@ǼhLc!t*T ^VQJ"KGb`DyjJNb7/JdRl3lJk :0HG?t ;t~ϩ }m cVPB! zԲ߁ԶD `sr|m&W~g'9oԙH:h㣫'My~&&2_8aA1Y|Ƽ}L!͝~i6x^J1Eٚ9 lV002-Y+r@PjsD[]I_vT7D8 I/VO) 0Ail|_Mexo|V? ?D1خz!\NLN%Εilk{q]؈٧P:n+z5Y>0Y FD-$?Y'E _4?ȱ^S@(0:̑B+9RoOqdy؏Unh_9f͋$cW} .yqm(t">}. %'F:#{}(7v!͂耫ڟN@>lSvQ똤Ov\6Tg),gI3܉WEZQu,,t-rxZ|RNt.}+v ujho=%vO_u]CzZ0[g]A|jsm1xh5Y7kn> Ixټ'+lcV!_CsG2psSKw"- LG65Cs÷LÄ, 8*~bqDUmUH5Fl`` Ḡw~j|RƏtiTCQGByrr1^lc&Ϧ(p@IF凑}l*d qy X0!J@kDlΤ^ a9s@8I]ب<#FULaWv5o*I6ì!Bf_z^{}sgS|x-yI%ۥMZ} SĠ=nGxΏ iv]鏛" LMBo%MUt]n}&B\Ym]$:^xlK$q[z ]8Lv +1;1{/{ڜRޫVRIKR %C0 y" ẗ́so$?O5JIW.<ӽ~V[<16(.D_,wd)7!m'h` ~ڲD2݉ZbBhܲ^ >z (eoc3Q޿jW#Bg^k"lD%T㯱!e.\=y$*=+He9RI}Ч.vv0,CXs+:*ZaO ]A ﺼbAgO1Py$[?2G>7?3iw0+p7;lvU&a8;LQ΁iȧqf~qf׍fwKT'9w 4]/l>Gl&5QʳGCIt XR| - ^%k&E=}Q^[d&[c5>Tmo}v w;wr Dug2TDCB_jn^f Ʈ;ӕxRMasY c~u}xvEpɈFNuk\LX(D7gd6/J5F]@yOd EDOHjMN"K xH7VE9ff-,$cO:=4fp4]4z b`V"f.Hjz7}`+%z35<^GL#,VH <+tB;Ѹ%o[6;q[:u.YBlti]Jo6\ai:0}O^cՖЍlS}G<)kdP#<Ig% =BZ36s;S5p"HA,08}p v ,ݫD1V;Q֬CR2OfmumYG:fI}2ubp4!,!.@M b EkZ\^L7;g\f,zGBwT7# }!Ί pvò=04*Pd=suoq7\4 TS%n* QUjjP :eTJ Дȋ(84x=ֆ}%w#s)n>IcX%HH|銒Coֻtt?֝<dبj[!LG7E)6&Mnﰾjx&d}q[W[\|a_Mܩ˱#]~[cVuɘ.,ڊίVaT,m[@xOxI$0]x:*VJ%K-{ISLneܣܺMdU^7&@N]WgSL cbO/E7\OCPMy9g^?J~QY_ ڣ ,K5TfnKk0ȧohoXJLE# C o p?sf2HϜ;y4zzj-^LU!E m'kЉ>In{35 cHP7dϚh8#ʆCĢ^ͧrW fڈש"td30ajԤ5EeۑdB͓VE¼f?2>nnnG`2_0 "=лMЬs&jx<'>̅ XWi<穔/Yt{DSe3NQޞӴ *ۉpHŁXQ7ndX"$λjfia=?*qm{\Cw߄.?S6T,V:1~"-3ÓeL}/ Бd1_ɴ{UXb"@UنG)ʲs{edC/sj"'W $h[o YDϻ@x>O}jpM7RVIk(9bRY h]dronNeue`{})ƖZ^W]+3G__o_``vNeﶍSX$$JQlFm,#hZw(¥u' o«L=*,Ymtox.>Go{;л'?7ˌRjl9?RΑgۿsOdtjS7N/)Q]+rj*O2֥iq[!A^`"PAOUT/?A|W FW/_At iD_.)%a?ȿ%ۧIQkTno2كc<3;E^L[Q]ZG9 fE[b=*j8=3H|'UN1jwk|L&?hX <.uQ sTD\SJ)rsc<{}9;K8v^*L{/ę,mUF Q̒`>%'t`v[^sԜy+*_&wtYd=cz_´5W֧'H/7 Hĺn^')-˛S/Qح_]Q:x;I_^_ N%j5vvl}I zGN>URCNw[M€ xa9Uc-p~mK*&y׳<_QVSh'8׮ 7DAbއڒӠ`1cjvK@ Pb'/4n+-W GY\gyQ!%˷%ee:"L:Kص$J<ؐs{b!ߓr"+_,ո#&pCMehy%gGWK{vg)vwb\Ov+ɱ.n'[-@!. sTRNVɲm&w@KJDװG ,hیg`M|m -#D64°dW]mhq8%KS|Lwl%eH|.Qn^꽸DQVo/El礧;^<Ć=!Qȿa\Km</ʌĎAK157*a )פҰbR'jncxcrHJƼFtϹM0M g#Ӎ= 'tgnz;mI{T Si_KpU'[m -[Nnw[gSFԭV野Slw$|*Ff`Pd#LCMEGT|󯞴%y_J;)X4.>d,Hb4  3Zv vzdf wrL%V}e^ujx,$jbkH2Sݮ;Wʍ0/ Z^68S<*2sf"F*K}7;)f $ |_|& }D?D{bj-(rÃ܀td3uW[^RK]R>L0`#PHO)w`fm:]}< sެK6-X_ܾ聆iqп#V#hTӗ+,3VשyWiOSGnSq0sL]1FVDJZv7[bP$mlKbc\櫇k2/FH6]ӿ3ɳP;vU ?R%~lh}t=6֏y8(`nVE:0]3C7yK su]t.?gA?y36@v?uFל~#wwY+Q?Fqs)2cts{6֤GKHHpir';,Ӥ䀒Xɕ%5֦TBs+[X{׉9CMܬ"w߭R UO{K𕉍.U 3&ȂG<{ *裶[2_V暽s?Iua[dsN5wtsiTS eY:^orbi0([E1hmbrm;=\Uؚp@%퉩9 % ЊCmM۹Ô{}ߦʣJ܁!^QT~J(_ɌEMj O6!Q}_E| zp椭1GϞNH֫$];8)eui0NeGl9|'k(Vk' c_=_:mV!<ѫ`EpZ=v7eoàOxIPo\(1R:F( o;0-ZT={xIYθF i[x_*5̙SάڤE dk g?5=oL?xs<ݼᄐMb,m:iG9+H$ OL')QPdo!h4(GIbWX&+ eN \lgr4uV}:z0 /^R<_~6VR6'[rkx~3A jqB'GV7U.+'7-.D6<Aبa!/Z'm(fa|7 e2 ]I a,_3Nؘwk(eL]f%_T^݊nٌq\ D1}~ECDA;O&elb7-9}(HS& AY-2~XnIfc(`.*K(wAL- , .R#\)P%1v\#-/O/ai/3S).LN]X>i竗YOpbӹ53wg"7HβE[ ONE7Ϯ$Ԯ眼V '3O͗.4Ϩ\Irchp6bNYU}ԩ}'RcΫXLfQ@5bh+ܰ='dB]!`R)CfQȺB+2R.h/,5A =bxubmKtvs& M,Nd}m:iqONGB́[os'@+ $KWx!^oG^ʔ ~n7pU!)8P]EPY[?ީe`v1P2D8_UjdUc`] ifov誘i ée_NOe&V%ViRV=ڟ֓m1Wcr[sϯ!fе Qa(Nvggξ} ZFTtzv_O`Pwf0MJ$Kl!&)} ǧ5U?BO[ezN heFl ?5}uiqUޮ{r~Od>? }ct[]> 3Pt{Kw3k|AN"Wgwz󅧰M3c)}ofxR :ß=t݁P#呦Ywa<||~psn0J8[Igȵkx&z kT02 ^UeK(.W?0~Գ!'6-x"$q(  U\&;uIJ]lf\*M o^#כ|>0Q.3_n~\Fazq8M3VR$p"f>'D9ɟvb8LysmVǛߙOe1;/1;Yjf&ju >5EVY,'pa`nZ, *ۤ?9Q813Kڨr|=į:m }银 :#g=ksÌ5\埫q]j9;΋ Xi1ͼkhBƑ*b{ܻԜno?3 _|592 _ PУѵc2 ]櫖oװQ=c~ae6"k8ػÙEh`*݇&Qɮ.2vݿX GgHwi 0oN.vx.QOh.yV`om^\ vv^Pzi 9h_] Gɧtzu !5q{ onc!F}͚\Tq;8-,DgϾRdDP4UM7/`ȞzDi~aj㖁ݭ쒰.VkVT%1!O77ø4ZhM;'KưRamP8U<[R}ʺM@ukٔ/ԢЮ ?b=We;592p왆gm=]o-z6h6}sx`d7' <4CVK]Kn O` Y~Qsыh5V 0a~b>ȋ՟8d _o2=`SJ'ļ2u7}.s#5]6*(ZW4FSs G3) i /&P:P٩O_!e<.#aμN]-W)t$'^[ojf*8q:(.򺮆bɺYvB3%r[NxZxҒi8Ef)|~7[ُZj!b8u.tSu" dۭVR= Kc/wׂR+i5(bi >(SO g^æ s%,1^9+YΦрS7ԡ 1BSL:EGt-pHWl)soED/-d0CzsLsQ5fz~C+L*؋+]z@foA,R`)MY{@EZ 6^#VjX(+0L_ALkx[37zsˬ$XQK?|_";]ɒΦ|tUpo{{>&w4W9i4ds'{',?,ןR<9n>4*?;prBd33E yMk54eCo׮Q͗i2WY͆n2Mo6 7{A?Fa lӊ>c~Ջ"\O JaCm$S9ǨY2%(d {0Z&C4*$t7ǻY J0Q)k&b¥h*|(҆e!X9&O[ dna%vG 5,,dB֦Aot-|tv zI =Ό7#׃yhG\t4@uݛ/!Q7YX$)TβS27n7Pg_:g~y-\х|f}~uQ9PF8uîL&G ,{ VT+&@)TG1ť.O|k[uL\GTjȪ؎|\x-@w^ =~cS$B,M75'3V"v+`0!mz:.U p5RSu|wB=RxpB*艶(l9اwZ_y'#ÑabE۫bw9{}l5QB+_NMj~S[KH`%3q}6>siO2alpGjsS[B֙#  ;RI/c D\BKFe; ] #1Z49ˏ[?* P,SiY0 Үqѵ$]W>EG:6{_^ʎnX#u4R-3ъho',_^)d,uSB |ؿ_ C\F>CG:v%sZ6W(7 pGĊFCojK3'kl4I*Q'zg*mFb849kJ抡7g]pQc?Lt<=5LR#MbLVotbgQTwL,J #oPXEѥԔn4,N ga>{09 es,P)W7DKt/,Z!RP?ccFOLh#}.|A0^sa_jƓD.`̕?}A7q hU= 6KsuvRZ2ITo@ź1=PIՔL&Cgۚ2^ TJBnR{3ǭJ`mF D[](cprIkn (9zfo4կ&Pws?e8"+?J,r](*_3P^YD $"@ʹ+mzZ潔"]Lhrq]/Ue?sݝ0/f,jqrԙLIf`Pwq#%ev{ŗ3]/?МqX$vʹrX$BFCvWJKly5C`4/<$%Ib\cV~/y{(rI/>10Z(tD߹)-АD\SͶvgf$b-ͼax^l)_[S9́eD~Fp[n uy;jx~E7n^ioڂ|c u*Mh9`lGoתh;{vR΍T 3;0P@*\<~->:6aFf2ҟ:&*9kϲv7iu| !@zC?#aT`q$r["cug-?@v%nxk崗~Nm 8)Y'5q 6IF7V1P.6<}?[ynq|l_c_Wa%PgI9z9j靮Ѫ1#{'| ]˿#Pq͉0?=Ct#8[|=.Օ(זTA[;h6nў<<LxaO!%;!PAe=8$]Ip뢓'xZ/^.+'d{aDA(bEgM@RtQ6cx~xzs,H /'0 R ܋0cErCey 0_ŽcHk6 -Ńg%`*CӪى9+AU5rO\pMq係~2% #e:.tEIֿ& "#'$3UaXvrқ6{HP. b}z [K(n`2S5eàbBOƑbmZ5L1Y}P9}DlvArwGw:aڡJ=&U=K)b<7D~ETn(iG[K<^{POM#<wTJ#iD^ɼwyw!u?#agca WOz)n}MŖu_-+ Jvߏj \U`pnْU.*Wn l9]S#@k?}e܄weܪPY*Uz`\y4P,!?7z nzwpGZ߄ Ҵʨb aH}u.8~oزߔKr0fO[2dqy?/?4,+u ugEr܃^"Y HhST5 ,g4m34ElnjߗFtco;X$SКJlJ:eLX -5XkiHn ` r&ǯ ~Z#DhSw&E@0%f4yl6T\Z  -̂5ӷJ[z18h]:h:$<ͬ SOф+YbkX`f: Zw/DܟV4пaRj5Ou$qO:KX>#fy%[uc[ϫNTwfK`>8៸co45?@Kz9AS~]jf{g*Gkkn^qp.XD}1V TD] ef/bNQԋ LːK1G;~}D轝kЀ߳v )UUڐ; iagB!mwdy/V [P$7.JDibޅJi]))ƅ.Xq:ϟW W? CTc0jձDb`@qTkjن.gF>Qs|Q>Z,Nbm 5dzNnt=XU nN%[ ,FE%>;T IKcBM^]AVt^Ot+10x[N}pk?_sp88\짮_~G4z~u^.|hߩrBq;3z!_Cu/Qsquv^&{o*Yu1&92E6tZ7ۺ95u߂pݡ!*dmWay^Wrֈʯ;:ֆK V.~ӠAk5:g"C Ĕ(( `5_V(ːHJ6A,S #c|9ͰT/D;")6ojRF۳ ]&֊ -yj UiڽYх^%Cuw~JMlnE'JddjSg:\ռuhU" w+{(%`s%gKݞ}yWŭɻ1-'@Dfs!Xe*IX2'bi,~{S=oR:]v^B%c 7רX~_蠀Jmt^p,c=0emR{>S:{(;v2_{W8*On=zsNl'_blJ"D@EPX!y b{u,L\Xb' V*M>/gzS?iLaJ`WG> 򶹲 + ;VLi)3zz5}1+;mrr!Ex;s!8 -}h)ZQOC\ba1͇ܵ̚_TMe2{ܸ^wDW#3sԓgO)>\̀q[Eω羱>땱0&PdTڶ]O(]Ľҳ {~Ťp 3ai[mq6x;oS`bB0vڼ]kR&;m: dv[$ox/^1$f4 ׭th8d@omϏGK Kk7)Sqd/ \W %.R%@`n48s]B`ƗłOM3Lt2BoW}hL+M`ѫ>vG( Wc=h&h,z>?K0I"#ak(>o<_-D4C/JX J#nTڬn.u" EBb($<U>QF"A'OA%QPY>ʀMË>qͅ#gPܹn)\LEO#t6ɯ@|)< CQ97$7eԞ?V_#!)-xæ}JV ހ` hSѭ,Rg&{Iam`ؕ&#;;9#}"RF* Z#zSܶzNfxn>e/ϫUT: S7UOt=\uϛj^FBRInMAOOuD} a#qSAaJ4TE- r8unPۖ &k=79'Aa17\(XgS=&ok><߶cҜ P9T7O9 w<՗a-U" ?-z>ΛO Õ;ܒi@w(0L.ﳚ_+Ӄ>io5Ab &(/2nj2)<CgudhWzR(+=raJ.B`0XKI5{G nA\ڞ"DD֘srzXI9 Ut$JkZijj]!uZc0ۦ) >׻pE. x)Z4@J}[ϴw7.z{ \ҤUԞ͂Fe-Ju_OX~’+.@0<5QRY}oo8 \^JANTw±4>@"/nvB8 +W6/>HP ؕRr_E[z̧ Pq'ÄG,8C9tŖX*7 8O#D- AK{1C߭(ʶti%y۫ǵ3dIХuub{q8L3_8։4_PQTC-_&;Ϫ]&pe`/JIK+(*S'; i>7xnK1ƹK.{R$n`wvL"T(&6wkY p:#.@'UyP7]nst)%d1}!-z-FfY\ O#?B3ުn]/MA{ `c0:ZwsR}Gio)?S~bGpV7fbt*DK,K/wa:) x($b`K″ݪg.+ҝ24a@{ˀ0bj pL٦]#Aӏߺ1\Qm6)($X5!I-oTO_r '@n5Wꆷ3iV8MmӺx2-G$4UpD>=@!?wsfWN7++_ˎgKᲚ]LMZY9-YaɟKAuwlQ$.5G%Tw ֬ﲺ(byڮA@+\P^Zt_{?ֲfi] -kO eG{5@⩽ʺyoUu;5BAc 9ɖnIY#e`SoOJ2-[x `/hsI@f#Qxp~S,MUuUXXuY7O[˹Q^`wÝ7SaN{s24EK%\O,>oC_Sql(/DƋi[M#czLpƘr SE79ѮEBi[7)&/Eo.5ѐ%bUW@| ^u7>dB 9?~s:(F:$cYDEjKL^Ǎ ̤{ۻL ʺś`ԓpn8Q?D rMJ. WhI ]8<`g9d W8LRR?׀'"̦e 7Z+JcꩣH~7b$p堉T|n-s㪩U&fx 97P2Ql3]\trS.Id'Vyu0̞Lv8 髪Ys/LJQq*Sa?W|PbmAH{h.b}  ծ#Pj>%{ҧ{J[qCm#?Kiic0Pǽo[%Y*xh,U p'FMɼVɄlnۇOwД5kbBR9WKn|A_%H;ܫ#xe]yӺP8nz N_$Z4J`IakDΫTpT;d^;G=(R2)aĺqNk[.t%0dx+xM TAu_ Ǟލlګ4T-:N$tw-Mqb‰΀l64i߯,X]˸~|Ğm.bQ,ߐ<O=ИF{OZ˹8ծfC?EcEp9@;J /6C"RےwO3!pLIjӴ9nlk<+ifTִ{?̍bVSӭգ#ded·̽L SZB2]0]f}uoNϵT;,[vZ}P^tVeʷ֋p¤XZͱ$:QRcͲڵ>͉Sm,@qE+ KDYoOBx}R"cim[?ӻGGCμKcњV96(MTEVsQX1kZ,uMӌfRˍшfr"~7{ UɧD0ۦ5 5gdcv܉jt  Myrna3^O)8e ߝ N[!U}b^~X~dӼ덽->ַzfOO$vv w\K˒E# 9J\ϜevԲ'aO¸YX,;x/ҥY4)ZE< ^\*aJZ hg SgBTľ8n}l8d2c9TJ~})O%)Ntolr#Tl.~)RW_aI˞\+X0}=O_`AdH!Rza^^菿n9'qk>;Vu#QIkPNGC8! eށ5e*_${+s';?&([asU7 sc9$@:㭧k2PG6ZJc8VY U6q VXirՉzHKeݷ&~=guvFn "K}9E@/b5BaK&4<]DՊh;vԒ)NJfB-DReр~6ֹ=}y'G4p` Ml5>KKllxȞJxjC yL鵛cF僫9yl% X?n8`zT>%efj)Yq wܲl1'V[cv_;@QT55 } ^  fUU"u~lA9iq1CzG)oE'ws Uor 6⠉-o÷u R3I4r0i} ( Ȱ?F?*Te~uNܣ|+1 %vAL' VYc,rSTnQ'7qTlz٥͹ŌQǼQޡ0#:0ckLU}68o"e x'=;7ja^5ܯO Wf-9,jaoң"hfi}`0z5diS!u<K WOɲ/U;;K@&/Y.X3BJt-A 5 ʿW c][P9^HZ/ Qkz ~,GVM]@Jԑ^)˦6ZW{後tB En'WeփgEnӠN=[Wt""NF_^uچ0M axDCfS`ez ~>*E9 !Q,|^բ{k)VUOy#(OOf'Kܻx܊_v檋@2U􎋜`Bm2˅ pΤZh{ ŧNMo~}o_&&O\q;Ha :|#ZѼ;2QD@MuYquE4۱y,G.]*&/ ƆĈ:$i"&q{FEܓK_YuJql|I)`o-H2`mj-@g 7i/~]|XQp $|zOssL;BEE Zk㏨k`zpX"R o]K#kxL=US#1 G fkREUؿ35[A >w68)X:M T.OXǙbAhZKB;MɾqŤyJP^m8Y.@>" E=hݫ {K|MоT#Qo@ie]J@ GUң%_UJߏ`N_Nہ&:.@d*3w19ƌx\+}g;:B |zظDŦvBS{?[^׆D܁7~13YaMx)]R |`ݛB/evshM?xYJR2gN9|늇&-\" CXql}R2[zL_'P`îmk< 7xM}<ᾊF^D-)7*inTwbߣƐf&KfСm5,Twʥ"GSR8!"Uə'du?3o>>Z=_pL4ԯˀ;{_伓I=}>ME7Dzkd`ubڄdv+&A*[)YZq>~YBaSk/=\}D|31>s?zx@?5_W|0,4hJ6ߢ?ؚsztN~Dax,GhfWU?7mݯ ?N~441tp2RWºԉM!,s:Bū֩_)-2C-9T7gj]8p"n $XDd[+Tۓ cY <bXy74kܾ R&Xz9&?~nw}#uNɒX7 [1`;pF'_@G1dҫ(3t Ӳ˧YyD;~D&VU5za]n0O)/^s 喐>\}BmM3dA1y[,uj}.e`:D~>'ޕJY+],{" e7kbj/nTm;bTbI5fhb~ve2j4>UٽFO6'/R\jG{|)e`[LS}!vɤ1ORx+^bj::zcVz)Uo\Tޖm*oOqT(읻 rl{ qTD(<.؃/DX/G@Jç&Mr;w\UŊS[fyONa&)9EGi+2B$'RN)dzc򻓌˘XTv$/Ѐ[e< Dظ P؉n=k0MņsStv8k2rÈl ] ^^X3w^CAEZA dSHg]"08k}-\~A٫Qyޑ+QG< F.5}8v(;YbHMⅡh#a$FDjdnHvM0[6DGnX[⒆kncL+Pvuf'stzy _Sk*1Tq]d>=I0D|j1srD09~>(UqM@P6qpõU sE,XU:8%LQڍ[᠍8܎t] NYOh?O@Q4uR9ۼeWW{ysgظ( DBWQ=h!ZN ? "DAYÿވ[Lȟ臾/$V:h찫.K.;?sWSY3evޭXg%N"/TM,2JK綞',+Tf _vX%.LbƵ#ϰz%.qDu:s'J9\Ws2?_@Ne#5~ˣkY >Mٌ| ̊mt$0pҗȆ&7pX1rw/U'K~ޖ-yDtEoH6օm}m/ HgV_[3FNbMlЬ }aH?c@NY3Fdz$>@M;mπ'h{Ӗy8x\9[phO&U?W Z~NV ^ ||UԈFZ~b޿V^P ϐx}ٚFN&\<*Usr%Tdu25)| Rۉ7ݩO?@mB_Eyp+k"KbG[mkhe&\oՁ!;1!:c։mlmj0`7-Nm^XnqRdNj=M]_ضg<7ت蠮a ?1"mݝqr esWƽXw[˜ݻjD?ke~k5]sC0@Wm;56PJRB^fP""`j&^:lVоe_wGŹ;"iY x ~zYYߕ "U`Q”mMB>vCT_R[Gz$Eײ`܏t D2";9Hu(YрH;vCg~ 64h(۳6w[|݉Ňa "切; L7lX5EBE+lP1e4[-Os% cǚK ${X<huh>oLq4Y=QyĿBnąp+F:^ 3HI wb2?Eq5m_1i55[,5Ҷ 45M ˽,ʅGhuHxá~SPf\jCaW /zjSIփ՜{3V+&&#.p s`UHX7ڍ!.J5Pd!Aac"Tk!CCK 4:HP 7/ףI5lUіֆr<륬=z+W <%s&-KGbm>ӨBu_\pLڧRQSOQ΋ն贾 z|ύ ]g]kS(b +7э Svb_0mQrws4o u/8ێXjP^&Wad. A@ n ݉p9»_#[kxԣp); mZ >)UOSeis;TWι=s|\f_f?Mr 1΀m*Z 5,i.8W ވ4`qKn|`a09 JE}>},Ιfv?\w-(. P;@Q9A:}x<ȆɖTI4\Y >KC~pO/`&f/ϻ'~ Mng=LpI:=Gi] [Q~'J{~CO m J6*rg5=0 V\ZW!5e E|N{گtl OX^!0s\N|5g# ~,'k`e60OuTlC/e~òp !XRU7E\;+eyuFū&$3yjVceyA95p]ŶWxǢnLn,QZ{:Wұd= .8f(s  aE|w<~Xszps WS^(}}3wW#ѭow<;dwzQEAh>i8kӛ'mrG[IV)YO1=>^auhnSR70 g?ʑ7w-sk'ݢ |MURcx`s!շy |o:~,CjCh}~}y1i ES]9;Cy;׀FG0%?-uW&ƾ Z~&RRaxJ uj#;i=s2dzɜgZ4<Dˋ $WmrWÌ]M;K_!4{h2"oFo-3 gr{͘5/T1C\  W*:5M;j٦&SW\p/Sz+-q3FQdqgKXLk{%oHsG;|KQe:@ld_ iB{aS(?Ju>IP?c0m5yGsM,(s@,`lc?yﻶcHBP+^F B(efZhќp@ܿmëS-ɟ??*wc< 5.y?s:tV#X ύk ]{xF|{ϜooUwf9^x{EAag%_trn 43 g| -[rtws7W}{sSu>L͊ZFnd:G~$ 0-UB&YrF+QkY{ٽ`G7tOvR`5 Eϡ4)3@h Y)Z~2Qz͚UƇp4Q =6><>_gSSHqEIe{cр<x[%uռPڅU{~{tJbB1.P+JF1a0e>E>:ʻ< n)#,agZkS7ie꾯wl8P"|{. )Db{#~o4̯묓ĸB|6[y>K֬FVؖ p_F '`]*AO;UQ$z ۮ=Drvէĕ`CN27ғu=Ј)i׉1 h%jm^GJxkO)ְN,OR2i+w 4`JUѺ9nAiB~B]K %Y8T4T9t'7ھf[ELKpaIsso(֮b8E9ũTQ$ rR;a+VK,ep%'GvaP4jrL%ADt IQf4'?u~[d ,4tTȇhca~o۞+'guU.n|lhT!\o}>C۷ v˭8w\C20s,bZpiuc]Jvu/\HP"j|T?=,&7VE)9BS }R@}N*#Rf@z3Nio.g-;^# `>s>afviDUy#˛WO`M62P.U1|%]6|f+_ZJz͖SJ$ ;4yKvagu憫/J-m4FPo-Sue1{=6q}ž0gl?R̀3<!Q}>R+oZjyr* ϟ0~`:P+ bMSrV wE=_w9T -Nļh~Ep[|NN*< h)Og| sQZ6\[I>5nT0:`,:ŊbH w<3$=w]qdE`%W+7W9]p1D"ٶc"͂/#QSYK؃7l?{x ㅠBF3_Z|>q9!v;ԵZ!VQ7uL*X*FRthC|s\)bž7:W-)N重=#mR9Np1 |Iyyfjtք0U:4@4k\F {nA-$7]}˧?;Ill0ERBqi qd\z CgOׄ~Zkbq&^1#4H~D9ȋ!>K,'y Md%8 x䬜w:\ FٻtP:EI)sVQn2'9k3C,kNSgPl!aM ]]5SzDt\V% #)uO>MǸM>=o`eClD' S C@qs9] 9 rh 4}qkF^+|!(0z;OvJse*S: kСP: $ĥPȱYXy n 6+v,{o>ǛkS|]!SoNm&?|#\KX_ˢxw<^ם|Sv?}ùGkx+,ӷ̊:{wj`Tec2îx}~2Rw=\HЈ繿H%ZFGcP̱꿭8.s0c1xH>w&:!&7Rޢs rs!jz 니a:LYz_I gNꪖ~ pga2'cK949I؞̪O(=wjV69z`$γ~jvA[{11d͹f妮-\ŠYS)A`fhlSqDHǫGȸ].v9B'԰%Q ߤ:VT xӨO&'E_?]g/8;b uɉK!ZѵԅxOHa'P:rĶBl7A_T$^MMn[z{q)H̖G۲憛et?*c|~D؂XRsӺx=|8t{G̣3)~qEˈlbi0LmER7/??Gk`I Bx zd+/Ͽ2l 2e9yJ@#6o7j˶:=W͞&"Y?+z LQU(U7žjR>L@}^íw|۟3jp3OD dnHXR7(~ZD,W^.['SQWKuR/%{{ʮG+p&oc JXWR- ^AtXƷ+RqHLj.NmVO`@M&l+6ֶwT[pg/Ox>XZlAM7B*ӋY-In%-S4n'n4^͋@ڝه'k M;G]J{"ǂzZD?r@ )}+W_͇BGRʧ0`syF'8'w ~pp|am|֊V*&e亶2xW" DO#姷 ~B'ʅ*@5<-c1⍙D>DTei2soSz΂8.³;Qq/6m&mʧZ$\uZnVA*  h>#'oP޵_`c=fU b sdܾs]?IKvE2Oy(Ǐǿ*`T(1Naiuhj AeϼT2YTǒmo\µ?0c( W87yK⚑\'3ٝOHT+߲&רӟ-(7NXk}ItW ( 2:D.|,}w&ݔ W4fyمoުKr6?YP[iT5aJ<2LƏMϒ?ab37 hb@3]~L*⩯s@"~bi>kKܖx m4 )s2Jϛq`='4M5~b.OJӐAR\{6~h@MiQ^<9:,ƻֱaX,g^,y85w5mQࣀ8sȄ?56 S]*$TMbgVSy IPF/+ @Kv%4-:?0-[ @qK6ku9:pQP羳x랤dPidzae+m}Hq`Ѿ=iz3(@k`&tT1_k}\(vn5S`t"~\H >G "Tk$xaN6*]Z.R}HȻ伟>f?.Q=nI)tv[ɞ}|FrU/b5Ub V&eT ZIId*mg3wiTƧjG*|aR3tqԼ*p3(jBt9as*UOPn5I,l|7ߤ(z?0}:`O>A+E~*˾csg|Ӆ*[+Rx|P~aS`bvhy1D%-g=opE +\=XynrLId*p mjL\ziFֿ쉁eM9bRL1 ,ɏJ=\ٔrbhFQd.׻enQk/IN/U9a>2a>[0-C.43e*U`ჾaD*b E'7Ƿ^>ZG9Crՙ4(0Op}؁v!J4ǁU_C BAp0;"{9b'v\ڦ|!3}*#kd}K:MuQO7MPpJ$~+~0DҐEL1>ӮJjv^gb(;bsR۝A_r,gu"_w>lO~(j*cywlsS%˃ jN)H;Riv߉_IE޹ lq6DM}o`Fdw?hחꛇ*Y dT9GkVFȩT@o;P]kV5QpϞE REG:jf S-|삵<1[5-բnXg3+D6{oN  @TNUyN@|hyR;no0tW1kz ل-"imoܹw|?D~[Ԡ?]!LZ.rM39׌U%Y5u" 4~Q? x:Dd}S÷ }|4( mRӵVewnO͕,n *Zlͦ voMd݋٧A"Ota>"}S׾!h!;+D{eP n`j>=ìKVcXZJԾGݐ~`+Dg:f%')#Z0tsϱ9L֥3]zNH 0}T8] lrTZ-Ύ>_veo4j;SNe;ʵ,.e@d%=nfzxvfbi\4 s36M^G;YEF&F 5= j?[i;?N'pėwhis~m:Y(<(#k,o7DCbc#e}ƪdl%l쇃/vVΧaWIiL|caD <&<2?T&vy7U!P}I^%L/Ab765+RGCYM w.96/Zv*~y7giLPb⳹ ߣz{ոsw讳A]]g߬^VN-A"xkkd_XT/f_*.4]Mz w 2n>W(d͙sF&;&i]0l{KK:p6}wJH>usܵ ֢Z9`hz(9^ͯہRfK a7=U.ڡ]'(o=$_&>S8_U8Y箴P6dj'GӚ2ŸG(wާy*GG}^Ρ۶88OSw RMqT)ء gԞsm2mXBr=yG},Ts1=lƟ3:!Bɏ 8<"㞠fRoPݤe*tH iI^-HUÊg1ї* F"!:KIH}^U&&L^=Ba~A.N`Mm.-75E2nHvIGO3OAs57$1qo wTw)HE#g6+KІu6I@1w(%u,[6MZ!rDYC#>)M?n>щ5?(1ŝ9D^dJxbۼwyޭ1WO)ߞ)@Yo'ˆ3~=v2e>+.JL=gڡ%>c_ _EJL{BT9qi}Ͼ*9)P D` ~^lR>? )Bu~=i[Ώ*K-==Ps!Gn}&dvvIqsJ?'nCaf]urhq"|]uvcL~Ssa櫶z6‡|UP,2xmOG%xslQ [WrجλZ)L.fBy/g_i?MCdAGn y ~ń΄WuS`%hL&mw1k|-aӁ)=fF9JJqГ:S*ޏ޽ڹq|[y=-;hbiLjcer\ 螺/cN.>;4 TLxSvW:}wzvjϻ{'|ȭʤgQBmdr eߗWlX:I@Jx93AJs:xaM '* U|9WbgpzB%{?k+Mf'ʫN Wmς1B!g|5aX4z0ƠQO2,V |} NXEkx-ʜrQes.>^YDY2+"&QSW%eTUW/3@Z+>6-5ç\yPX[WՑ= [vj"rm!Ӵ7`) ,WXq:I9tL}t鵨x2S+<.+<&Sb/؀z9sL:0Lni1k{mbnK։75OWɞwor6_γE 7̣WO1=KO 'EN(:OB=_HR}TN$lqFy=kaW-Ħ qq8&FDP'V_zqvaqi5;hОH.f #;섛#g.IT9KI,U)7/7^A0_&R\V~,)d:~:wႛ^;"| i;Nr▵:*!)P'k_|y='l&M7Qъ(-щ㶦xTW̖+B(pOOs w%HF3͎_lӒ+OSw~1QE[P(O#!8[1~6k ,.c/!> \so}0;g#Id_}odN~? l3Ԣj0|@Y0Ƙ)|leN pZzѺt7Jw`m;b`ׁv]3s`IY U=C85{OgR;J5M?"2^-r.r5ŕtW ZA RV!b|00kfN[4ռC 4 3 LGB2]pJ# U8࿾e;zcx'+F'\1. X-l̿+x]+?ǙrWiwvq3;\bCѻ2kT k1Ys_t<P{93_᦭_ v{ :+;\+N= "2P^7NIc*xhBaTo:l;rVb uV\.8lӱ[Cg'q?} ;e{Rӧ5` ~2\B(VtQ|j}̪=dz,5dybc'Tue>gѿZ"Z4H(|5% !#AoI|K O/&_gaHlP 1zKx uo{+44f|"]\{P8TV[Gz zTڃ\ H|җn %HeȨ_enl7܆R-l=Cԥ]kP M1-3NTj>D>U7L̀Ts>D kPid)PHuH"գ^\f!nAn/:ڝˣyYA:S55KxďNu1Vˁ/hGNlb\f$S?=UtmT o" p[Z0 4Zn4~t}:Iƀzp30F/v&Y'wߣlǜҟT]G}C3/}p?\.qս˚StH:7gR?2@GXZRӒicvk24V=3pK+E åU%hzPN$sv~J?D@[h욯̘zڿɥdǩ`œEC/w@S7n7@SԽNBUv Aٗ9g-V% ,6x=<$z70W(؍!Ea&L ݔD_.By6ӉE}ʕF61fLZ|4nppXls+. :s]z]c k%r4PaWE+_P"w5Hh|!hbv7^6@bI FDtP<<`2ߩolGNhp )cWպ7dl{6?XM Ph?UæZfXU9RD>\†xs (ޖ0~zedIK ґO.Jo5h$l6}5 aRi0@bgT_VomM%f)ts*#S:^nq;\6gc2ICo >\/WG s;yZhR,֌rا@͙=>QNױ:U+M/30Ύj,LFЙlA&""~ɈmjTS:Xw6eԯ{g#t6"hU"q?Q0[9o^v['b*O؝e!PjfZ2A89oʤGVAp5I{la'C|`sྷwWg3p4 9G}>ddGG9wމpUNak#)<>s^H>ti.w/ƏM'ɌxB:57? >n%#h ZRk&)is@,'썀sV5욖bp6B\hC(LO%{:O-]c6lm!?8>ˀľ{MO>k\W6Kz C1H:7w'?GZu{RX>%g\ߴׂ(SG\<+lOJ^Wfv R^PU˽ %55cQ5_:*O>)f)Mg ۊٿCNV*E/$GؼfvQn/cNnkB!]ƽ4EMFⓩٷc]z pkLi+ɱ'؞ίk0\ڮFpMOЇo&4gAP :OO}qx?cLuk!IfI^d\47LI`BMUa h&J46h٩ȣRE˾iEl3C 2FOXw7R.,M('[Nh@")X'rr e0[*Oj@k5ߺAmH>L lz= 9MŅ>wi:V}7z[ ~YmO[᎝i7i9P .XdZN1K#ܣ8ܯG=ƔMiٞ'ӤRBOXu_(u|NSJ^h;rK}_j#6YOfjdWXuNguksp |E@`bEӺ{{HIUr&}k۞+):ctkmH?4Iĕ[t\лj#6, s-6Km``-С=M2֖ φ Dއy<=@ˊoW2yg. .X3[ϐɔd2}҆]-&ݰl)\9llr507WSgY;l|=OUYy#&&zg>Tr.5p ϵOCp FDSz.Yހj^.jٯO<SSZ 5hBRt'O6W 'U(.Rgc# &]nL,5wz̸'_s|L[gy|n"ᲑI7WL&&&jid[+ oM; 1:)nkMŠ&v&%/4}J8JҀcu}BWCu< ="_fUOdVQD[i}C,ypRfo_ʒbU^iv&p&T㝂8bah BFyaڦҳbPKY# `cwpf;7a^yiш^DnESkd5k'8f4ٵAsK/UD y]zp^+H^쪻tKBC]29{MF3Vi{xgl{YGj6 Q,b'di*G (]4}Cnt󋳣L(3SzkwЌQ\Au͵*:<8[鯸ԔyNe\m63'd5h.~uю+,Sc}XªehF7ԫG1|2s;`Df(RxL d5{(a EߠLBbs^0oىB "<uNM/(USϒb3 #pc7d= _&=nԘ^51ʌZ.5Y(V+0v#8b&[?0aޕWK钃dj: B{J.nc&*rX>İ{WK7 2vfhk˹Q괝Z&pC.EcG}8 %5Y D-fh3bحP "OgQLa x'o}cg峁yݜj_X5/{Z,\1.Wֽ& [<|ϼEF!n3zS\ )j.~tgstGRFUF{j->AOׅp/z.L}@g'1х@5w*ZC3LFBK! Tt0F,9q{W~:/ܼ"Cx:Kg+X^ùCu$D[wIt#GneVfʱRṪ4(9c3H1qZiy^z7~jWYn)EH0=F"+Jv?mxMꀋ_ Q_bh8b\3ef{pj|KwO\<.kiPKzl::Ӫa061TEVLt@y>kj,  O[iD lƬp ^^nC˔R\mDrBi01]/ƨq3Cmr)C_zxEZplw|U+Uv!?|#CJ\d"6EfVӧ?q&> >5{D/"lWTg.#YQߔIO-#~-ikrhYI:kCq:Yq8bq~QN&iJ5I[PNζfޞ9yCmVM6꛻˻'V \?Osѭ:K/|A|od.2V"g$ugIޕQRۚ5o| YX7}ؖ%2EvrEC:^w߬*pIۍ 1K]V&مU0SεXIGaG]tI0&m ^] ˽|$Hs-{^ ^f88l׼'_(dc 㿿+yg’iS$\C .k54dsXeBD}.s 4gOaLk~5aA)f;n-~%z[9*?&`]i6xhU"0){Y|O[ujNAnH;j*{< &W>$ii2xK@`c+R8GmVcGbi=;籑{qvOpZTg16bϷ#" ~`a_S{l*A;sMZ>?Q[X\i(^u.4Wҗ~3Cqo"%Tb7偩}ZnJ:}$ޕ畔{2ǃ9=f$vB|0EJ1v)m,if&z&:ŭk,2fF_1q/ ){Y5۝%p9dO UCm]X0dvȧփkǢjq's~T(cy0A/-ٞ!{$NqcމN|+.esG`aHJV:䛭Jۧ`[|V9BXf?@XA3`b^*Ŕef:j=\FP,;-n?Yk%m\u CdQQk ,n}3(`Xky6N쮀{_QBA\ZyPoyȯ) %ϽOܤg^f:nj7e)EKUz择%HIaQu;oŬ҈ȫM7AאxR<V(p/CbC\´qK43"վh^I,->!V 9׹&C5w4/0_̠aȭQfz$#f3*}J!@nk//ϬS21`N6zPq|p| LT},oySu/[LN iWǕydi^\i>?MĀ_ ZSZͿqIGПO=U0V@h tEtE¿RWY*y5Giqa$,Gy?Ƃ64uPl,80X.q 2lo߾}=MrfUXƺOuU;> T'jSH;.=2jݙ8-C 7N\`G`sJSq$<YnkY*T8>_n:@j~{npayxN:m4sVY{O8'w7ʃjmTuFw ~CH[K2-w k]l_ ȨfZ'̦&i|3}*UHZ^ز^reybVDT }L{鋼;K}iT")A nEg~@lO`M);g6/ &Jnd1 GS@X^J8m7}$P>ຈL3f4ǁtφ~`r&b𭜦 _nxt5C5zϛ0f?]´׸R+/@2k(/ӓ݊mF~HyJWYBB`xr'c+,"i!;ˍ``#ƁZTYƊU4z_39 9Y=_ zdhSsG&׭m>/@9BE8W*Ӆs?M02La%Q@ZG̍eߙ6*$$&a+lnbY1Ap63\ \ 4Sok \4r($U'*I^v}FšԁAU_'Ҳ cKTQ1{_wb7T=ga*oߨ[ḑ4zg6%>Y{UP]2s [{5`R94WET>t( Xt8fi ͔A/n0-SH e:>~7h~9"L( 9:𮊢"Y?ԴuP}z̲tלzx'[ɜ[kK-LpuG*~bJ;DւV/{E)uuBr&TJju?TaQ{ Ue>=M:.rb+9oӨ0)<-X[z>O!WS \:ͰE׾W3&τI'IN~ܤ:_XS %xJ.:~լ=9p]u/wX4,_m:6Q/䃴3L˚*$Ȉx}c䩉+LIk 7vO-;a/w.grN*[;WS:n%goyMMĨݫ'3Rа͎d'9әfZ|KVs͢v{Dma_.ͶnնX8pf5v7]W\Z*v#:ꉔ!G`]BWL:=*EDJv>Y&ڎN8AC'L7C$kEzղfr[f t2uv,RAKpW?_iqy18x1f? 9V7%r|ʮ'gEIM:H8S: -0oR4yy l#,@w9) "`],m22  p1|MItOp ɟȹۛ.AG'*|MH¼^i/Rf!aKFYp \(g֦R"HT ?"fK4bo[{ quǃ%G8oZPAe !6bfC?s'A2ڟ_`:4dzGAAOyWB5iC_>s0U1`&1(SB-WW t:+!67l%6oSWWoiaW|X㄰9,GN#fCWYy82?6W-c1EyyHuHA*gCǧ_{=xL*E,te C0~4`x|Ğ_㩐A -I=YJuzGSX %qyX|;xz:Oyo{,=YLʎ QW^:ΣX櫄PwVh/fG KjMkLB,0 c?{3.L^0R S|0|}.r݇:}.wV _ Οbv~7swބWv[BC"b!{c8KQh2v2DLK=T$͹VϽ ZDp'َ5CKG& s<÷Vx9SH9J䎯 W;qWTrY ֐HBG[ N;\8&dк6WuI2|ұ;}i~և06ur^UT] F@р{! {UJ]C(.(.5WX@pwǩvM ;45 s0X՗g:m~Q[~~ˈnt&rxAL-tSZctywoOP `tWk}88W ]=訨B^@)}>=AJݞĒ|i뙱 >vxdFc M. cy(U8+̬ W'8No3ŠjEi>}Ҹx/5;o*în3x:!)**lB! #Ie+ݏoeywi |CFu}o| 퓪BK/.7i8)%ƥ!C1(Πl~^ȅ";bB-,a{JSY;;`n0f ;qYh475G{|I.ǐN@!ղstS;c>C Jȯ( =q*,2ѵ gӸW$]> ێ⁒AdNLnC@Lcѷ5^Ɔ]k!6i qF8g9 O껔_?'?S,r~wSLY 3/M6+/_do`ݐW\ˤ%/2p]ޚoiw?a!LںvTRG6/; _sx՘˜uru*ƃ@aO~R> 3ຜZhvqJNɑbxq};(_eZi< #h &j,eB4ȴb_yIYƇH)Y({e?sn0cWح/Lކ>oV fTGw[Ġ=y2*>ǧ|Z@.ׄESz$̓\Ta@IEOo_ݞ\2r^v"/NaPc~齝9>s~5#?:]wEEdMє՜_gd{)c3͐opD:M|%4CNPy9Oپ=k!o.w10%[Q>"(ED ESGs눈(%,2iy=aDДOCDtvh2sJ wbfl/&l4 7u6AiNJs+uPM\K'kmO%ulїZۀߪ}ev LOMR$!2o9gvN(A=,p'*XS{CmGP8/.w8Wpva{Fg`0KiY7.ԍw rIKwm%QVRϓ˰N7&ۯi}OlBr DLkmi"$<^|k8o-+BZ>ٷi=]k-U9seh0]V3^g$K'V$ 6Cb%ݔNOmzÅdk4%5] 4%U*MR(}6qΙ"W]OۧuYyz|L>7/IMN"9~ِ;P=/G5KSy1!y0V#zY1gscᖙlH Yq=_ڍTiG~72YNVM$ն 7~4?5^+–:(ޅ&MUg:R܎tu/psPQ 84; RVAlxA@lhfDm  f dYW5\*-?(7X >_w{ro{@ * U68J'ƩЉ\ !x<45j{CK*۹)ݞ\H(0j.B ,r+з(FrZiƬM+тzaH1%,+'KDaQэ$_n[ -2 ҟ[GQ?SÓPD-jC7-;ޙtS_pglNL*FBTY\z>-hOWJjԥu+˻;S̆K/#JP -J=1ڭ`r-uj6 #e ucy' zU[c#ؑܤwk{/» h~o2ވ$jJg/J G>iBG)GSFt\$l[/#ˆ wu3tc y;(|j˲4| X{Ƣ_q B!f1T!f~BSUҺ"4P3L3dm_ű[n{Pf4_B -(rA8LZ-"G 7G6Gq<͎oכ֧/FM5rUi$<4"# + zXY.7GtgWx]Hc GS,8~@ >hlIV#6]#U.5/b: uYьFPYzT3bGO`50,2h )HqEeP$8@QWTŦ߆J&q<{.Jɬմvq OD7}It:i-8Ի$}{:0"/QasUԏn]d|#;p{ MX0/33pgʏ w׷*̗ AqmeG:_8tflSd=\4߈TVwd|hRh'MZATRRbPvOƦ}Sޯtws:8?U0h޾ dMexEnD)|&g wʹӣRV÷ؕq7 (`X`b8vݸpM N/d4y.uzA.7^~U4^05_KZP[?NN/&#3Bzɡwme uc }ʭ[N?>@v}[ _EoZd? C<:DyW7o MX^m_s*}[.UNShY6XP J}Ϗ"Q-%(PUgMƠn-p*dbN:q7r+#Ɵ"͇}E|+X}CS~:S<=;-cO]8*^Rop猢4*п(Cn[Os?5OѣSbׂ1TtDo^@ Jo1hJ/mO1SU =4p|p8–%y2Q 3K)M#kS܈&&F9J?-zC_l*xA)]:`W:lkÜ2& a7S]E#Q5̑ ޓn'qkZZssP#mKU)O+QNjl]">ф]U"% Kt`KofV؊;*_F[3]JF4tGM/I&F& $0dzyMנ=MeJM Cwi0߻8G&v*zEX` `@]^SvWcP؄+Ob0,f ٵ,6+K7I?ߧl-2̚YDa%>cOW[߅DI4YyNY{=]yo(UlQ ׳ƔD>P5J8Yӡw&/` UP=V&[m̪t.'OHn-8 1ɼoۥ'|qĈ].DŽ@;c+.^>,zP>CGۓĿ }7 Y|0ܼsX R&>OWrsJk&o1#w)VT9>S@G1~..eHgF0`z؞%]@r/)m_Qbı3$z6q3J`+%ޫDޝ't3əiE3v ^TJ\P>DJ'-/ݖAU Ho~)$]~EV붨:J ^#䜹.1&b!d"]UTRx>v9Ok#BSIKBkD72t}X8Yt_=a7*۸XWq^ (ݣp8yHOƇJd~M( bs]$O>5㬩<_q }> C`̾su ֌14o*ߓh  G )7꼿S^fR ?䖅RS63<x^z~[̍ 89b)y)0yioa:rLCQiRl҂kç$.v=:wvd57E8`Q[ցw)p qDFJN[@Kg&3~Ŏ-lCT:/;r9vUdS@d#3Í'5 Et N9Ԡr{K͛j So|Vr A!%%rf4.f:ǰ#WAE`fnW$ uW+`[]gL岐YVˀαM9cL Qls&Q*Y\{9*ZfWYErNup>33:(m,Vqt7o8(F3ZU(a;|tfl n5!z λٮܼPys/2$ՓLjZMwYP*eV5A쮞Ru nkt`P=S@$]Dqp ?zC]dG e-B\c OO7?Y"ZK}!(PS">fJuݩF j\>즠Tc4:hn+B`Jjy,.swhPJ'g-ڷ|p3mV|˲o5w6&1$6\)#ie0\#0 +/$VtZ0*7[ۉk~Ƶ:]҄kſNҧKQC~osكz1#"NQN Ǧfd`%1 'y*IfC'C]d@OQkmV&>(_x.mnN޾@:inWm.}F|E ڐSԬE{|8 :îNRd`š<{VǦzKM}mL:ŠLd3dP5T_KQGbfxZB:1X |{)g ۤv ԫdA˖ 'M_i8)N @wYP%m tqtz1S<~^>~iEQ^_n`(/ 0MicNkm"TsAR/iYHix|+|}2mR A:—d\?g>˙p7|jJt q҇gQ6p [F'V^f$BnAmF_ [ԡ1>@Ͽ˨j PO-ǚaY d4oֻ=rbi& PΙ'qcǧݶ9!;TрM : =1]5c(wFͱ*n E yJJhu ɦOvh6in789B|AAUx){0j~87 E"NܚU}ЉQ}e?Z) 6GɄaAǣx$S< lTI5:/7uLr@/:\_}GJS|abƜeHiN5I̗`b!^*oFy`ż/޺VR[<tODJ*ٛܦs9#էҼ_#tYDpW#=6Y o9&S͍xV,0lŮJ8r-L9x(/|^ " z^Gx`]å|"h<>RÕ;4ݡRjV:n␞8Enz>$6)TAq총Ł*! W9[ F hDy?BkOM CdҤ;] y5=h OX BO: (t\y5\Mc;Jn.II&0?e)7(5{zC|`ISއυ'Dc_HfLؿ^$\NQz2övuyW xk^kqq|qjI1 wJ¯?MqxU&a{ NhOR aD?!8XkHБMb(.7! aբ,e;:Ca3AGFLm阆*RGgzqshݯ.q7t0`Ētk2@C/g.)@н9_V/<0}ǔNٯq{3KlyJ}̄->q;H]gQE,f(LG 1d%O|-}9#aB\Ϫ@?w,*_ݮ9ЙQ痨s8klTr=踷o:"g [E5F$-yޒn ZO.̶z~%3EmC_+;qPKPb*!=/;IdHKeS}0e*q2-O%̐2Qnzhulm/t ^r 9lA*S*:~[|O\Wć_\b2%TeQ1@f 귐g|D]\%y 3 "~JpEiEi蕂)P_꾡*aYxJH!IEF-:>z/uH!']1QɯR .$-U)g*;]g05 _lݏqfw?G-6hk)w_rIbߣE ϩ&XsL]d>ZvMUN]X-Pq,\5Va\K)["[w#sK“i>gQ%:*o M6kCg׬pY+%?Ɨ:Ƚ/@2fO_tMKb'RٱI[dwXt[U|14B}?ZH#|L ㋣Ѽ|3cǕB`y ,'^aѲb R y5 @M%KDy0F#W Z;,w_]/+!/+J7KŋN553Jq5d/Z9Q  c2Tk)*nDJMvvx"ұjȢmXq쿟yHwE V6  y6`4'-5Q-xm|8PmgֆK7Ӟu& ~.V~>ܞ_Kg okGb86mg%)l¦V445u1-"SMGSâM| Ql,g,kxJQ%k_j|<_kKylC{rQgx2SIkX t1Y&ߋ<^C._H3r +*OvXNjaS ޞhXh-~9o9Q!AH)<0`BMaGUj8J6"DN~\*AU@S|~TIK+g2q#.3Í( 4L A|*.터wyepw|G%Ǐy;8Ǖ\kq,lڪae.S9ع kA,)7C-djCf2&RjZlnϳ0", "9#ǚE!,әPI(UjWL}iL*u/sn峛dd]!ӬpzhyTqe)UYf 1'Xsb,5Qȥ$,=p B<ψIO.ȡw([Tp>Pj R`8Ԋdm5~ˢ7TXiMٗԱIѠEcҒSL8,rdT28o|֛#o3 y&&Rb9 KW#.J b{S2n [ۅ4wtY˒'(6W/kLUT_tp<srvq񹾊p)qrOr8n5񶼧V1*i~ J3~c C&:uj+`r& 5ڻ* xuz4GKw7%J>q-~`Ɯ=E8ft6>jpT]}wFmlqo6H?]_E\B[ˮOEU";`_mvoe5sJS ,ZN חI@#Y#ozOI+Ƞ>aJ'TӨ谚PO3oU 0K;V>־VaTG vNcN |t^8Z$,vDhoU=;̡4ՁrVRQi4;o~c_OMH5Y (Cr /Ym X]l@!U@qP09N}vx [Y8X$U˙|{|)g%st0 G4p=݋[}]1p ̷R[|\=8yR7#8 kO%>n{R8N<_F,U F OU+RgIlu@h{.Lk^N;,-ڽDr{(c6;(ua)]"IV*w^PBʒU.W !=i0s]{.X/Wu}/,4eF?O!lc^էc) &۪X$_:t:fUPܮ~?-.T ]1VOP6ðl4A8b|C9kLv8l?l=\D6Q9:"+w!37l|zuj]ŗGP!/c(~SE^:2\\Yp^@-oA{={:'uH>f m>{\P@J( s@{M~ݥE?G7&B Sri!iec>P2>P΍@l/zPKdAVC_Z ɗqHJP+x |?ʧq Ч:ak_4 vmuTh]^E㪾>5/ S7{<3t߽aQHA cT .gvH,g]lh 668apX;`1vb߲weZJs>miѵJjE-vY~Nu PUt g?q*(>W?B nb.Rhp43\;}{i_sxc;'ĪTIlkGz?PO+: ;ʺgM;㩰`S,(.Ro|:xSÔ5&sH%ؘHRH{IQ-cHOܰ]EHX¢m{){Y~NsIᅋnep.O_[EHwiYpn/Y/~+!e4v: ")fřV+8gؕR?\Q`z*+3EϘdn(}v(즙lFkC ň QGD&sdچ¢ΜW! Qrr?2d3=js~E*mz{ }6JȽyJ D1bnέچ\璈*[UrϭzEУ_q$Wr?K{6N08PɨxdKCSPkQ3+HISf;z%R]{R*!j:Խs Yq:o\ߑb'.5R~9L+(|@'͊<7.`( bG}ЧL l5)Ӑ<uzVQzT>+O, s۲U2bxΔjMUz4;?XIuq߭x숮&s&K>bkd(/(cOZħ7cM d%wҗ`W{}_ݫWܽfg@.OvJ&A[fiEA; z&}J.2uKx+uyȄ=1ae IeQq@F>~j*|3IVۼ1Gq0omEÁ OP6_Ks`+ ޮaO,TK~P&VgN#I։*ktZ|h!ў \UWPB뿫݃ nW0Y~VkTI46W)}o\ ,A-PܮtlBIK<|-mj7u% D3nӍFrܑ%D,\]0y#n%% )5qR $yV{h ? m̓ Ո`ؖdei^9X6{r52n7 =Q1?@$8ʁtVI@z8R2Lh叒pgnƭy^je/WbX;\rߏ ~I)W]vsڣ x۰60,D+eg۝|"0ˁ[|e$>QCmnw|?Ӌi'c`}#Zվ`K'c/%V$ Íc=(jhH?ҴdC!eSL;K+A][DzRݡ ֗ՒA(/&ИvNAվM-Ŧ :$=-T!$pgÐht|@}HoڞZ O.;#iɝۖLbLSun0Qu%FO%Ci*-`fBnQrmntc6TB^^kwAט{K^cSA" )N:ޣ&>{^n*+[<Ⱦn :k\'E챔3DÙY]Lޗ'.d|IG(cH@ARu<@e(jRiKr9bMUW&b)[.rօ7Me7k*l=Y9'%E~?ٸT|wsf7Kz适u-mNcc͞&&yX< !j` e/hKy ,ͩk*Q7`D xOV?-1wN/љȜPXܰD$s oaIWMziQc -~܄ąGZ\2Rh=aN$GC%Ug(?2ЌKgI8ȏ(H:S(!iʷv|l] k3?i/ZjP|ɠ"tF )P+g9k إ<,0B;KXRۡlfӁ(nqWl/3oɷ֑?F˟TCF<~*ϲV> c[Ĕ s#^ewu>./fc|A=8q:O R见ʧ!čw0{@fo)D3-&3k!I'HwSyʦ\ns{߽an~LލSv5:7ݦ?vfhKnYjl+8Z."AJ]C94uC`"We "QCX]uX[YKB1x)ʯpZbY||_Wt]|@ze-p>9TTedPHaq 3c -nR#"NR!qC-=+L] ͹/VkׯBp#bLJȣ0##2bFY5D’#.tԐU^ D"F1b0$2X4Q[©cG`5aq]:Ł~|ڂUP/%6CD{41U&;1 t-%Q81dD*(OA1IR d#OʝdB@8F(Bukb4s?o Ȕ,va.rtM- U7leq/ӽZvfUॗrZA۽0(-adz#|sLx%i4Zfh}G(îB@lqa2\]%nl ~Bl.7 kDe 2TiX 21ۈ"BlEMpJ"E HI 64K@1! B * 9H"E @xFޚ`)Ģ"tCe!u7p N^D~XڬY$12Xd ^?,_l !A"M [``PEҬқ[9Kt?_mh3J̰`gdu"cj:):JP[vt[l[|,W:z+ЗA_e~˸XHb8*^)p?^7 ~LLYx]F*>_pj8`b\eǎy烹ه ҏlc5]+}R]z)֭hn+*vTF2|({U'݅)HZ@Xf%b;1qPCXUOK); ¯е"oeѕ@Ϻs!ۛ.~~Q ^c*N" f1?jُ_ǽ3S7n4.²\_S\\ǿd5@|WirzMk\Yޒ8pI_mOl,2yOnaڊf4KjL:SՈ}³j|5vjUb>W#kw wH{@2eL2&G弨WH*BRyJOOB&?V5^;bR!;GIJN$ՈԄjHy4y'(vړc ]$%ovؙK Y1j*̙8Hdd1Xkw٤.NLڭ똤G~Oža-Y,xKݎ'3KP-0i7Fŗ sI]Ӆ} = X ;G $.;4s!^ >㭸t^[bW:HoDÞ6f5M  0k u "m1^0X(aȌ"o\ۼ>HRQ"KuL`!\;6EH3ж|Op>HA]tQK˶ThTD,;H 'Ŀ`r-a9Z܍wPNNܰ=vaH!C6zpnvkt;ۅ,v,>QV}$~ɂ5M9b-&%"xG+h>r }o\z!@7ǧ?q7~^ ?+D}ҿ!i?zX`R!dL⏺EVR[~;xS-O7Mi:fk$rZ iinZ==j# d:/vC[9O<EJt;sVPS2> ߺMv5Rt~Bih =,gcQSޘvg}\66P\|e𶜙_"zT1 %3oY3ysj)FReߦ>H1QS+[Z @{oz$nE&؂.FV /A ʋT/O8(ۦI2KKab5pﶲ?|\uZ7 ~Uv(E4]=P*_d8ScMтJ?q=puIKdՇxF,I(~.=)2H|-柏k9J#O՝0y^f"{b;Aed`7PbgBK #!Xq$VӛɁW/`xaJUKKHα@fTxw'{ͺ2%2O]Oh(D|n:ڗwOBy?|H޼[#۲zźkdC'Gz|'`]6\z.gvS_jF }LKpM@jJxi79m(8'Rx2*7Kˇg$;K4ERWzL?dg ӟ+U$hsZW(pi@Wz iޟ]IE26fZ3iy0_4 Sqx/fRTdEeX6$mA/L<6'%`\6`v|rܢ8iH{"Ֆ1N0ݦ>o`B rhlP2:X ۇaqi ƯR,m>T(ZYyQAVJ(%p`)M F[@G]kŞeCO1/{L7bY %qarb_hWQ y,Uzaf72| 黸W!CtNpDQ4|۫ 9܃ֱH4Ht2G8PTDDbDsF`{YY@s.DuE3vA;d i eK N~.櫽}Izi<ͩ8I/ю˺=Yz`<ͼ2 e6]GVm<4ؐxàQHz!<=J/V/!~Xd<I+(ꭈ#>4%p"oebR}6f[0lR7I@e6MŬ`ŞYT?yiVu_/bA@ v^<~h`ɱa:oH{8{` [˴U ĽPz鿎^5:}Rq+W}u1ߤrE`/}& a.'fN7Fm~6Bʷ |, _ӦAHoO*#=C'E<*8^.]3h3sœ VTbCI\e⨈*ixT sam} 'dz cs!mZ{ ^2 Ygw9Մ.Dڒ@F e=Wre^O.c9:gc<*Fb{_fn) Co}`E=GI*Vu?K_mFW&>r.myx6ϼ):9@[ .8,*U?SWFX",4h:60ȽmVeIZs`ئYUm4oNMr0+ݿ93 } ?~'oOU5Y#`DZ:]8BnQei/u/n4ozPlewn^U!_t̯?59rPz1L`، _v1]jt2}[Ħ"ah. "6+/q=nq%QxRa6/1:INeQ<+⫶3\mQr&*XIΫ;аm hns Q+sz}w6ލ_4 곺 ZEæ!wLAz_Aqr]iX$F=9n#3g8ŒSI^P )ړz'um1N%xpւzNg-cHlx8 O \K,e<HrznnJXs_:1'# [w`3dL0ڻpn00[r kC{SO;,"nWg%G`4EcKg <b:\r5]/p*gLZPM'PV ک3;cOJtĎ !tI3OՑ"9ׯ'Gup)x)Pt8XJ߈o4LaGczEuVO$ :9rN>xŒ n\'*A+ҷ~O+m]i +o?գ<='4RjL7r ]5^]09w8jL떭b*c.7N(!;C])x2$@7EnЀPNERu&oF1=,{eyaO& Y$i^)Feꎥ1oo>oȼ`pc3R*zl+/D]-ZL%Ly!PSW@̿EOj>VGZs-TchS#fiLETI}BC YK`nh?>]Vr]<je w1ւ,@K<3,.`x `]Ov1)XyذJ GV~$sj' 2>,Pm?j@{ ~cH U80zo2/uSrd +(J'L?L9@Qa3lI6@W w,N`lFwL hv;%aj5̧v Zi#+[qwp0-ē{!lZjD*mRYa˻M1Zc'ɝ|64NGS*bYTsQNmʥ ,~C ;YA,ߥÞ<ֺV36B* Uǣk h{Ƨ .jRzϓDtqDvLړp7zw`ɗ(sV/kq[>ԁ`B%, -"s ,}IWLzI $G N+iU AVe궎QR"O1dŊ&8+rQ[2.IXy,\5~J0ٛx쾐jhXvo.4\EO n +: 3Nx|3?yo~5Y<_ETm[ejgRӝ}WyʏQI.5j9ׇT{|B g~+* pLWBqZ>`BPwJ/_DٕEwgeԑoz>Z?Li]afC,nPq} +uiCuݴ>bL09ҟ'a.sbğ!@=$LN-8Hk`IY3BA| 9F(tDəAR(8Uń,:Sz&h[6V`7مRTF~EOx7;#eL-?6S>+i F=u|b˃7{b!t$AK7FJ<  ad)Nf[]s΅od⵾U(hPS *:ُ9*@ۃOjD Rڞi> M`fI _45 ]W/[ZsԌ[NszDM7 i}Bhw a9@w, CzN*\._K̵>\6BA4QH*|o/fVd8|($ćwdyOa.Sf/K+ Tt4]|,YEHFgpHx=ˤuȥ.!>lT@>}E{ )þvȲAvF6_'[(Qci_4 E`C^AS)>-qK:UYBn IfIk1Bʫ;*z66$=`7?Z|ܚ"0NCZ>\`LO];JѤjt < .-ҿai0+n']dY~mݓ0sG,=:}=ՂPƀL@̙?3<`FVăvW(AN@VdgJ{rb*KEO$ KOk <㻒Ut2qئ@C̱jvX/Epo ;ֈ}>(on+^&?y(XW?vN#p_FPWR)trmuH3h槤/ȪI?jǀi$P f]|Ix'\=qiT0Me>hm]sM%);ӦIi v ZZlNåֳ^ui9ͅ=F;*j"ݏ&_[Byk|DPa* <3'؈|Z"Sq.iU|+[|YJx?V U}JJ X ˻6!q;johS$NU8.91 MQW)fF1!HÇxTƾk74a7- YY]ˑU*غރ>1 E#f{GXp@BwI>2 }T&oh` 'TQ< pL'[?,;Y9bue^yϒ/%ub+3 ؘkW lꕳ!?Or(JL-5;4_]e40@Smoag( A[f-HjR;Rј_՜?d=דLt#,, fS`_H `K0=bxqFsZ X3b ]58>Ss<۟)z;ʫAe(ra9o@ &: Vr3Ґ.}hw}YڼٛLp'؊:~k].'vШxrwsdr um(BXm;ִ!zFI+}gY[ < [FiULބ9b^kK=G $ 4goIS DL5QڙQHz+MAA =(9yRg&DKh3EMP& ZTi LȂ{%oq,2H;#mSUF!~{ XE`ީ6(a[ϑIg:K̦ݦR18Sh{} ?}}n6oP΢Qhl^s%y[?[#3i!sNrs(YU* 9//-?Ҕ8$e@^60ްXPhE0&roaT&O eGƃʁ=PB2x4)6k~&,wLµ'75QGWqqS5\F'#g?=q:%yD>^tK8OfsC;PƝ@\k贓Ä]ziV*66;b:!]e0Vd ^*tj2}Ѧn#ס˰Bcc`iƙ VKNt<(6H۠ ؀0( oS*Stv01&o-aY%IZ gnzϟ*&s0v-3+Z bM&*ps0&wUo"RDL@0*yJJA6x.c|EޣX@ט{\NlbB$I6({8vߐG,ƌĊ-:MKyFT'Rq'HTp؝yUTQ׺CJE&q/"0O64lyx3U+(ike Thbd:ijI:V*wm~n?Ԫg O%/b|F):sԹ[Z ?3pSlƭ#VQ0)x?F h5X`u{h,-RV;ٌ`†э*KZ?7> 9Fp>;kC!ԞaCu7jBfy6`odӨ AH`LypޥmFwz꜂'̟1 c.H-l읛zA 1o?f~#ǞC+QBч"*L@2^N\}]N^ /4&=]n7Ǜ(59/o#c.B{fQzrmvsZaG)c܀ <3bLݖpMz4j@[iV~6)\1?B]x~?3Q^VN436LLuTw*0Dzv(K?LsCzQ^m] z<`%Arl]cUmR%b%AvTCu-$%;aӌ?`QOuaopѮ-:8+y[6

͜km^A Zli& 3ݍƮjWnǼO>g[;M]|=$/6Oz憂={»_ߐi^qT!'Pi鴅$UCrrrrsAС,Y#[J+WT !Eq#%NX˞@K@-EveG)6E1mo|RZ+=?Qb6dRaq`, FW0lK 7{ =2`dlH\hn% MkB5؜#"0ԴJZ=6\X0BKsʿ&?Aed9G&LVbRcmmHŖlH~zM&no3ahvg&h)d[A/[L\OJyW} :;Q:YY] Lz(|n; n|hR_݆+XII[p6>qd.9$ޭSj!3?_[5쏌&}ȧ D&9DGX k'聯P r֏(؞;47BRV)p*K Z@ay *vk" 0Gv[WT|h&!MD_z ǃ`gؽ!pL4GGъ/ʷד[VWgp=Jγ+&hl=fWɊ*֠ru%cO m-{H)yC``rLrpl]xw#/)c˨m<@\O/ױ:~SQGTR$"m[5<Y$4FMCH!dN81e 1"tVm3 ےIV&O3g`dxu|bz+5\:xK Hּmd`yUJH(SdOa>NNeeWe^"I1`7;jϘkk"_;AA͑襆M>쿲ډ4jQ)F@(0[>ȽnW$dkq?Uc^Y\oVkG*#󅰚AQ*+4R(vUB!umKHb7@{u="Z'Td>Y_޻٪3M5-+n#zʝB|!P /JZL 7P vԽVF.{@N'M[En vbG=;#%S?Fۂ' |Y P"Sᡂx RwGLbc4R2h[ P)?BԣV :YH Q.W X$0iVFTNyuMݜ z}Zݟ4xr<N;b0Qa5/h-[6뭳Z==+RՃU.25T\} i*:{>^|_oP]kգb_$j*v3f= wʬfSM̐mW:%hazh)nd>m[-<5dk~}2dIf IBc?$~{GUҪlAK %=r:"FSL<o޹HO6pK_BaVfXi>peT_#D u­+'wE=ԿX[@ctcH'V'T 'WMr3t>a7=ϵ=pyfˋdFh]GdRE#yhRm(HD0e'%!q /*#vi1g'XJ/K[ra9*Eѳ.!rT7bfK2Cx|ù-GێQU%Gݔ7`4I#o#_X](eOnSPL}z/=P͢#,: %#-wKDhj(xsp-OP?>Ƃ=-hi&yMݷxuܵ8YM"lL$?>IE.,@{ }4,e ux˙ԤҌ|eBTHJX X^RrI?-l)D4OUTҥqh>@/~ =>\ig) ࿟JT+UU-}*#ړs;PHK"ԁcqa|PŃ`/#[F%ɣā`&xj~b+8vj(TG} x)eC?{N͕1cSJ4)/!^o1Sr/A}0_[ewr7a"@ZUBǟW5rF` sOI^~'J>*WP׃g8W;k&䀤bBa|φ9N޺ 0QDkxVQu;zIE]EUNpTqywu#RsP%^s*N = y>Zq*twz><]c@w/o^GE ]wJY_tZ#DhBb xk"~~Z/63C ~oaЇ5uꬨNw..ZIW~`goǐi]鼩fsKHrenܒ|eϲ~NV =d[SgpV; 2ř3`O.D馻|1ڪV> Rnt}?C8 RZl˭e6%'`&6Y&a;nBS8;04:K0NT|/ #y^E?v&X?.b.XE_˨K{+/8\)Lk7e&OZ3DǝȳNc4?Q*z~#NKr,!þ@lPB޻f5*ܮ:z}`t$`yvXP>X>x,$#®AP"| q5r:q"qR=L,|UKvk@8EQ}d}qRuo3 5`2~&nUT/ޅE3q-T@}hr /#myL 6$y~~k,<_s.G/i¶MG;^[/곿ưm22uVhg 5/nPH`G{>0#JQNK}6W"}YdT""r>]gA:nd]{D!g$`"!F9Krv:eF?e' OVlTnx^wv U=B91< = X&m9 -lW(擎9l+o3v lѦ޾=?DƷ^IUcf?z3VRYՔy 5;Sѣ t1Ӊ-W97y&K`ZuC9z^TBj0nq?^ yE4nтDz  glE?^)Y",Trv@wT!"N&znJJ8(cԞ[QU9:LW{ FngǞXMM1Tz#⨔$CoqjO o܄pv"a| aU_3grdrv:dʅaHNBh$yhڄQ̃UM_U?~ 5#7H˷Qu粩KQ0=*;sIME D4у34B,8xt>M;&Xۧ>ޛ-?PٷϢ4?}ADC{Hob#5Mݓޤ'am˃U'3<]_!/. kiLf2PދzZy-_ߪCiF_a.4]_2A';70|?΃ ^ .'v笲y1$if-C9)viWQW B#a A5 9~>]媄STbfpMٚ55g\4rnFV \|x ̫][<">cH?{KOj\ebD,稣ٛ}WB|1.iy,MqwDՍ<=t}b} [Fi4@܃^Tdu6UPC8Ud867ֺFC '(+k{ҔԺZӇiSV$TS\w|arxـ6d.ARZ ɛ5=qW*(åP)F?]==^)9SKӎ˂ 7{y݀:=y#p3=0s L0"GfNw*D ʿ!MVܯrۡf}+ m\ uAV NYkۧ2  ;_0J{1ɸB;8So):yc&?:)8i|~3skkN4RS*ںf,$ rL@V ?Ȥ:!.#,2HL>x 'V"e~"Mzd*NJna)m.֖CǞcT)ymcB({F'9* 1 ?Ns4y] W  nxK+u;>x-P"0&HP5=tna{1 p7Lxۙ'qm6/͍ЕɃJqe88%kGFNü飺17ldljr^Τ9XNYc_le'o}i,R_jg"N/׮3/ܚZ˝boKIEͧb{*Țo•o(ҙʒi zIF׃2|7!9a] u+m%f|skz*9|%{.OUr;~~ܥ#w oO'ViّWU$}Y/YwoQEe`2ǵa wgzlLPII`z\L  3ЫVn#6wӢ_|K:300 bo-=wABMg +8H*5b8_ nUN!>7`.?p`tb3܌Rou/q`AK+o-!Vt $PRsLpQ򠮾h{0nT0H1Zrd+'-j $0 ՗,09p <ٖ)hCm?02"CO͸f+/z:d5y~OS1HBH@8(a`n0K7n$btn]/÷`}٩^15)w0OXذ9fڵvnogIً2}( 6/6zl=±ymQM:j<UEQ[TtT'u~a00p @3Y+_CAukB &g˙TXl TT( |yV3hfS۟ay" 3 o}3r d:Rm7gZwPPXL4TKi ˽cowʳN*Y+}RL¸Ğ᯲ uJeg@dgKT1Z kOY)؁ENqLǛX!%wEMO(2I~;Fd{?t8HLPMqG »zG0e G{d'd6NjAJxFLm)?2G ͬD)ϸ WÉķ>jk,AOg-a_#oK9%>h2Ɍ=Z9%Y\%Ll+߿o?ߙ~Q^*6G銜odV tc-s@F5ߨJBY7b%Pod:8:ޢc܊OTZ^G_}пUѻ;߱$ZvXNvM%)tkS4e]fKmWoOD[j|t&cK=_>b?cMU{3􉟜Y1mE>.:D To^ߔ-vPK<*O E=l"ufUZM$LApo٬{ߪ~uQ2yCs؟&8piZS3L%CJ RWjO}U{ޫ~q=;[}<\c6;82rRЌnObB6Wźd=IJC{G_`nhOVah*:)q:wN*"s^v3ιgRU*h:o,h{V^h>x.豶xw-觡6b1pne%{Fc^j+Eo2voqY]2m~]/>h9K?o{QOEo@G˖Կ@gKk-:(#vo?6 h~= ڧP^O~7[qe[`fX{d~$wsUc24|MjPuaĠYNz,t&13>p?IHj3wݵb҂~5RqʥzBDfoP / soӽhYjoeК͡5NˍW<+Yl1w{0Z W l<. n&{D9|t!bꅹbKkUF9y mŧݒz9&W 8ٻkHKvI>8`k`PvvY(W W p+rlY_H]dc5v4括ڲjmW}Ⱦ0 d v⺝fiANn# `WZ{‹D_ BeI=[k#q 7ߜs#„%mL^Jpw=I/aa_Gs{#Z2(\|,ZH󉶳aS]3 k |'}֪i';C7G_,R }"@hZ+VQLs0f WQգ3?;ڗXu^8Qu>pLnE)X7#u-nZxtMO6Ŀq*CP-y=5Uv_>frȞA>6nzӶѬoRzby~x2W|_}ǧ'т2NL$8pt*hqnHĸ0\ l{߱pڒZIJdɻeM6Rtc[o8hتH<&0޻n Ez,[ )DJ:ݙN!I%⸠)[HyQ zXXD9LpN8C.܈\YQM vP{a%;(߬t}b)*ѽxY Y'mD?Ϫ}? :1yRO [Jfrxvr~'EP%ZD8+*r]Xѐ_[X^ߐF@{TpsN6i8aT+73?g;өQ 놩E1/eM2,R `@z%IRXj^2VP]O ^tRCIGS#˖F١S7S|aI q--Et/ } f3>;FN@|u|,pGϹ 0#o [ `m` iS":op*#~WmFN͕v3L|kj[ꖨ,٨v!LX.J;{0N5Ŏf ~s&J%̑Rc7?Qx_V~.WM%q?@9r='yMm,^K$Ytdb>.ZrNt hH5G8,%ZSWG65Wg xg]@Gk>V䁦K`r~0)xU?s{9oe%3Tc3FZP5lހqh8mTFv'Ǘ[ZmV<" dxj7N{\He[2.jU|9JĞORμZVö!} B?V9²ɚr߁ƨvmB\WUl'JUUx^ q\`aB,)?B"2Bh LU.7ΛTd=$\+%yvSV>Qz=Ŧ?+οrl m)Z%NNR?r)ə5soZoA\z1&X6DHS-[BS)a7=庋Kk64OY߫>(hgf]@'_`Q|T/l:g% E(+ kX`ϖwnaTT3*|lYrևfWzVϪ -wgl-a`C&ȶGw0Ϭ K]n)9@ >T[ydEzHUxn]pP2I|2E <: )kNt @8.U.#@Z3uP1r6>tػKyL.] h& Nsꃪ*H8<O~(jyC u-51 9( ,"@v&nLXI}KR AM݂TGgbzRS4Yn`kXNXHlw$CUk연99hMSʆoNy[|olD3f<;s 7Fc0=7 sBzS4;IO) 03=9d1RsŴ wtiy.86umH0YKC ^n8:}}[YާK7r_)_ y ~="\7=da1x wMwS~ EKIJ+s}P.$It_ɇuβ)> ;o>x),@abInGV KЏ9?Y{BUzIJ`uQ6AlU]0˴|:MD=ƏN%;OpKJրxIPFxdg@|t;nZ=}}P9(*q1]?S8(XL7E 5)Tx_k `nh]=dPz6׹j$?f| jpzQZuN&] /6^/}ҳ{ wWI罌<.&)S^3M\'!kBQ0Kr9)}dˊ:C~Qt/K62<.G'XGpbE<.|5fx׮._s){_ĈЭMqs@$wB8mViU#u0Xw^lr~:W5wY<٬iu&n` ;qHDc?@)smiCEsxx"|]A^YJy5mO7YtQkh ;ܿ U>=]S=?}_vC( fߢ(4JM ]ɤV_ " UلIg%:LswZ\\Qd~-ȟM\Q72RK-O/. Q4Hl=z<5PRj/Wd|r_i` +YwG!S0U˛λE`7rzr+µ,DڊCMem'*fëP&B&OZ,MeOy,f ∧ /ɟR1jYeLݴM2ka/1*pA3Sz@Z$oiKɋ}6K%;zL#OE{Qrn[q20dL#n.n?|Q~'H8LO>dҖf['ZᐮM('pnU$61x"b#ò`('j< mPA5 =&FlbC}b xi :ۤC=JQ5d'E+Yb:U5Z ^:n#{|]{ۧ#|!d )  P_vB T_z2Ŷ 4ȾW ) I:C$uG85l*A%ˉS(0oopuX %=.0v;Kyhό7@qlXe& P ((͐q}7HZ'`NR1.l c  gnfD=P20 Jzya^T;>=i!y;/ */ @n%bM%&=<# [4>@vjCr&CrL)\?LG(?KM lθ9I RTQ] ݁Kf-4u\t}+LJf?86~$:{O)=Hi/V|QbXQWr'"|m%:}õ,Ps |?O htTE>ӌN:DZQԫeIDr>ly?ƿPH0șܭr^&Jв8T%; Wb'rKځ`.7K_\ G?okD ]GVp,1Az֓0|Hdݗ`ϫI3ۂd[O1\2sGR|ka P`~ #B杬zAMIZ9Ѳf艄.=YCOSxJ_BW*@g)Ost3߬b ޝͨD@ n\̻6 _|=[e {X n#J1 7/=iT-Wӱ2"g4USE9pH?M4Ht҉ҁny@a*sMu]e 0[zXJWP;TA]ՒY|9}amgy[XMt__OeW1x0ˣ)aZ 0^S"wAx]BFO 1WIl$ĔEj ܉枾CƒyU~G D}[ ;)ַ!gDא qivؔ=į$.v5om^y;Bw 'YEDH¦A%\-u2ƀ`%J#H!3^l;Ü}iaa>;rDhofcpì gMۄUKU6(%Ma˚K' 5 E{۾FO4îGT&4@dO`BLTySӑmwz]e/*jL+ ;lg]zQY^ kB4 ?K}݋4zm_AI qS,nBr̤w/֒#%mtfYv쫚z}Ƿ̮5TK _8/Ky&̔$#Gܚ"sJg&o77lm(4f8b'xPIU<{,; cһ1 _?Gm撂7 cZm{VP8x!V×l80mi4~ ?r X3*pITJmJʹas;TJgv|[ch^zwW أ h /:٭亝Rt‰ H5&cRO5b8)Ъæ ab€X\1|,'AСtJ r/嫒$ -+I2ܳܨ c8d>Ûn|Rݏw ,aJtªTBKIQ?$mVy( R;wBrqkD@ v̺ƻ@FV{ J^}uUO(p+{P8; +gNֳ0)B,] =8yv:o6OWu:Q.w9^x/oNd;]p^0cߚGʱ՗dl,~~Fef@ g i f,, Ȫ%q \mSOհo_ΎhETG?cMZ bv.bጮD9f}=?(G$!eoD-)h ^3Vc(Ƒ;6M" (Ff㦬Ԅ&c}whx E]{Z4˟j{^.BlZE{e9AaK2!v~'d3a"l$">Urh.˴{{i:Bfh}ɿn%.zE4pX/V.|N`TN|y`H2!ux$-]$q QuD䃚cS~z ٺ[=VsL/ Y[t.n`n~w㿂 bR /g;=obFe0ŜwSIPQ |1T_sR]H4#@M0z!X^ pb5A^_w @D5 mMj"SP)PL24H^͖,Wx9>H1@MRj𮽏wa@)\aV+ٵ6dK ;yn =XHHJ[*9 LN8h\.oTur9' E̪B[^AThg>" OPfXn%6Ly*v7_fW~'6A+Ӈ[v5ad$:1wj*_QPǑq*u@h2–J#[ajtY oqIdҠ)CJۿf*p10 z)cSxIUWM KHC(^[˪&^)SgyK¦ (g~C?֛cX(' }w0TvA~ >ȡÚœpEsM eT/[շ_/Ks1 ] |6@/PR |ʌqr> g-Z.EDݴSǖ($COyH Ƙ%$ǯ `71yEhdWmlOq{_-K:jH #wRkO?>}|2G2Q)r;{ɧ/SO'\cYWasٹy$;ݛv]#X*!l"qϱJ(ÇO+-rMD^`eC v>` ,:jr~0fi;SؖwRvo/j:oZ@(?m1׿ӂCx&M46o+CO!ׅDO/xU7~m)@ly+v6_S2DsUJYSjHVY2_mRM!3,`¥E:q]);^i3<x=jذd>ش#RD\r(ݳ0vHJrĨ s2uobWhI_*ҦeG^i~9Gy)`4P#9ߎbvZ$N}M%t_UmwWS70B(SoZ~J4/l`Afce}(-&q!|lEkPޤ{\HY#f,_~cI?Ge6~9wï:Jvc'l.QQ6EBsoy"oi9F*~1L?꜒#Ռ{c23kV/\u'C˱|YJ#dzu`=G834k D(Knu,S]\&p5l䆍IY7 2.2ƃ6vXPKRI`P3ٰm`Ùyb}Cٮ*BKf7#*> |'(0.ڱSek=vbdi(E7lv̒xuu^ҔqPjMj˾'$AsYs,Ujk=*uFmjTGD5.snA΃+IL,. Q$$86ߊr_P%w! a{ n3#)|"D:h]x`; Lϫ6V90M`>jUTi-J-'Pŧn~AB+L%O/?X΂ۄJ9[wvpz"WI89JR-у 2cpǵ% /??zw6NVm"oFJ эfMj ?sū)od4*Q޴ 9O&Ss5qt20Q{^-jЧשSJTXBPB"~H= ۷)Cڥ(T*, K16_f|hBCBYNè>Ɣ` m5\vV .(]uMnlL8tP88vnEKw[Fr$nc|}M[m&5 U/PlT*T/RyCs"PW\$$h`~ӋM[Mt'R[>["V̢8X=)>lx\JxQ0u)@nw?隆tŲ0PMfXe䲀 ds:q;g=X Pxm3c#/Xw?.璆,IHu}HIZ:| XDm^8INy1ڒ$(UU^ol0_d#gi a-ȖO2oz*Ȭd3V֡dwiRtOSܼ=j-v[-nu ǡg s8/5 $[Nyǣ) H1"(X?/;יS,xj~?E &V0z&"fp1˳)be  LuGD2[2";q󙥾/W7fhVp Kt}3T ^8&=6$!rPUVo) K1,I6gq6wWT&_SvߛFƘ*P8kqqM4v&պ&iHgOh3b{79| уCWLh~T1\=;hUmwTV )LU_M Y'FQAlg/7jh0Щ6Zq8Uq:07^w|5O/)bs1SWL4ʑΩÎQݍ]F&\kδQTT&Г,^U'7ySq#]k2otC+g =~xӓVCǶHHPS>%4XN}^3;5sQ(MA\z+Gq0F= jWg:hb>ͧQ1C U ʵ]NcKh8ȣb;g^77R y!Zݘ=@`'92yXp6뻁&eƯ;~^OD2Gk/ [YYeCǯ{5xX z=ۧM\n* 7p]ܐn]|\>G׻OK+zS, ࿘P ?Ͻ>WF EOV;~.mpsNFwT$%dw7 W3*HC @oWPT_'- @}B{YRބ$YVCj _Pnj=""Fb2- 40n{)94E(_0PR鞜ܡ!SXt̹I刪!U'&DD-}!P n]>5kM):g @p$k ]^>q=QaIrJBr`BrJVM_YB!.76W5чM6PUʹAec ""оqw%[ hEHc hk)gz%u?\\:"e}F"2)ecoxdGI}yz_gjD 9"0C|m =G98w$}f:`-z#)FSv_|Nٜz*{9{,~R۸(^e\3*fE#tTXN$Rn!= zi_es}Yղ{ +I^팠O3]A|(A;u9ļTF 1x?X6lYtUɇ78V^_ 64luqjߞ9gM:ڇ$K:s "=у7+Fi>v'BIN[Gqj,gdS(J /) " /[U6m fa^ݜ:QYZ13G vl=zw{Eh8PvU6BGWM*sQ6fL&Μk@CSAM!*5$H f6zӢ̩ۘVZO$ 9ءO <4F,? \"xv^qV|XG-$u4[3UWwd o@g,Esc&GGϝ>N9kMпE 7U$} wmCWDZˡr.vCP9EA8Tg\Y>D r ++oC1$M5Hq93=Y8$O)-ooerJQaHӛeܱD-M#hhoTkC~J߻lj诖1pF&K4oKр *Ś׈VD:7)ZN-iɉ]ٔqx,>}՘pH}Ls"ɱ)>p_t}R/?~xk @blCR dۗ&f4 αͱ%ELwgVF: OƲQ?Rk .o=Bc+mu;n]FG AYBpZ?I&xH:hJr<:uHSYIOy ^_p&[P>By8OYZQ`~lYVhpSӂlz_Pg 344W) cj|1; jYx.,'j Q3A}"bbDq@ ^:C (d. (ΖDE#CT V/iwmy[xŨ?eƦ/ޜn9t޳BG1w1;mе!3,mj$+>X|:vJL/Їaʇ߁@m#Gc8\-_{Ti.Eǝ皡nJr .{wt#NZr{hcf dm]4}*5~[T"A 55{Br?b^7&nTYGe"ީZIߨTz,N?i}aWa%5M+zpƎV,,ZP=M N$1%KJS:Ǩ(fN!EU0kv_{UEBtwe{qЩ9 >[݂[f=:>W^H0|?C댬ŅI@rOPug 48KZd*B yy|ȰłZ3f__sjY|]coCȉ@ەQs/d(-97na Ȭrlr^iQ(UAo+ eȽcdL?r=F/؜n]DH6,ɳhI^x릙/Yg#t:]TtAg6wYB"yJ15wJĵe)[r)֎@X`E[C7B6P"/k̶M#[3ȥ]}ʟ 2zt jL$@c#!"X `o! Ib1SC@dblD#VdIk]?d*gщzly~ջYذLL;R۝Trpл*jǒ |a+(4~u#Iݻu"AڔixL>+_,@ŎB'$9KQxFIzy 5f 3-Fm ubJ-` e7xQLģKG]rU|<)6~OYᱏ-E#./͞1Rn<) k4mP;Zb>Fk{HL'&b̗DֻT5?i<u1gtէƹ;PNI=w@3R;nC+,v|W]  Qc܆*~@v e? ,t|3e'-jvZwIĉLĊ ʏ3p2) 6u5^FMDML,Nr L)>ͺYO斃B]Pm7ws6 [ \C*~q8/$|3 5drOc%\TCmF'?jT]$\# ۞WASEπ$fH@SܥC>{jk`jt({Šuӧ!5aQZT,9:,@wRU56TP4Sq{pdZWȯ(ݭ7ږ$] n4w|}9[dAݮ=b3 +pX ,: bk -4TAk$j*{#;8zrxoQI금s'`rHuA S_^u~|s5c 9:⍆7E ` s֬(mò*rR6nw\LpiyW^s֢d03'56lw7W`ge)IIi5@q@HSF d^G_ cԉ!MZəg}#%veĬQUrqr_7sQA̳mCcz@^>SM L4:Ŀ7'nQa^PRégG /xOS,\~bO(ȱu5?t ޒ>`yڻNd\:m0ZW2/XUBB)]ʚUܯb5w,k6⣜nᖵ Ȳ@z|5"?"tfh/O: |w]0=U~%&|H[ 8$,wY_3m>WSyu#KI;$ 14ұ/mV +9GcNإOUp{N a-\Fۓy0nSo |@+!!WY~5Mg/ $a0vN:җ4{Nr4kv|! r6KSnYK+k9Yhˠ\5Fk\0$kfҰfֱѝz1\46@0wɼxMg&?r6Ł֯'d7G7n+ZIfZ=*8ާmUBgX[0Rw@sy ָރ ǯ53#N*BP-f qy+ D`W' %2"jͱ {IZm7}ؐ;֠|'En >>ԙ^r'zUS"A3w] kBT#I+M6Ru&S, "*XャZsJ4n \"jZ?S`xU6;mu VdfվeJT`*N6JX8|ďo"{Ú.X%6Z2GI1+|~.rCn t%lFA`,uc+]SI?*wxvǰ {c?Lo{cBH^L "?ǢZ?@ O%&@.~?%P~F##n h~>Z~a4~bLqSއB>ErV 4 ;k11;6Y7snI@ W[a 畘ÓggdgЕɠJeҙ Z[#y{K. q2_βݾ[\%C'f~4>>q\/ʬHl Ky/_5䣃Hdݬ8Bu1겥o6vၧ ˂A,gO* Q_Js͠R@&=8DKq(4`uC5a|FĪ֏uWx(S&+A'GWC!@qxdh-JLpO 3[4;a8:~k-}I24" " ۃ'&֣ n){_x莻&07ו$^B!VAC/`D|:`1CJGL競*+pjǻ"!QkRC |Z1=FD~+^/{;`"Od9q@p8&zt a4|? ;K=cպCcN>smad^vDtt퉫8 :֑Zo˭n|ג +ߔ_`)-צ% U8 c>]4:fv|G[P:<.,-溝L9Fm* KgY!Y]΍8*KeGH rnQB9꾚 zz< &ܵu]U$A0ءоu҃L 5'u"O"wÏ2=Iw;W~9,&>W9N\۞x!\O࿖q x~P9?GI@>Z`7Y{@xƵOHFLf^lر}}rTzr$벁m=Ǡ$P,C>wpm{\5* FV<c3V¼OtݜJ-,Y0}̄qQY. }kPvlwpRxr9dΪ{vՊT^8SY8û^u'-痔sn{ve_7,;E߃1٬';P^>o(~\w4^fd钃PA`I7G8`*<:YuE_FO\9?D"#|)Dݗu*8OAqA)8]E{j&W GO$ƹ 7nřQ{!F[Yj.-sm ID/%TI_׿2k2(;3\En6(N"*u :_P!׮.u靭" <)):YgsOßpjn$ ;{=1d`l02Q(po`N(N mγz1_"*Ea0+cֱ|M8s_]`a1g.'|/!Oʁ.n`ROG(E$a㧢ډIj$ Zx +2Rz~W&L[Gc+c`*5ֹފ8{^}'!2#P9(2sů?E0YEETy2g"˚Ϊզ=B4aS3rؒ+_#X+mANc%NeGw_b$;wKVZ,QB/BBWCqy DĔeN! ", E1lKG+_L(ay$B6UuڇuKcV7@Pp*~渊vzH0-l!;\ɦLj=Rf}#tb5G9X4_KX)̔72l#sal]C [ p d!BHܛ0j#ryVU+cw?m)McV 9|c(LyQ6O0~=",cg-G:|h;xk1*S ަ+7N)SkPedR?աR(:~zߪ;<Hwu[YN@]8{*[M"P{|יu=|SAwֻ^Ȕ[ZȎ/]XSs1ܝϊA2/ZN~N}_fJ,&Ǵޒeby}m!)?%kIp  ]ئH? =>v$ДyElO+ 7Y3gxe7&18?L-*|?)P[i\}_Lʶb{L2}5cwp !֩@Xv%G|kȯEH)},kRFkqg Ö6j6K'ZIpK?S)7Q9L=ʇч/.Q~8^}m«]zf1EN^cS´uA#xWVlC(\uxV/XEYIK!1 FBdzg$f,g]И\o'-}ױ>y Yv<*M蓇}眐=CdːM盧',P?lh|X5yрkQ2]ՓOQ:?MS<,Ĉ $꼞0 폔ܭ# :GA`C (;~1X͐vqOSK{94Ճ_VLݙqx•\/fibޣs):V#R;xjjhx5&CcSMR%/BUJW|Ƶ\c; 8 }SP 7;фtԟCIދtfVI`[؞yEɻõqNWU0 Ȗ_q;S R2} #@q'L;P~Qe${sbB.ʏ;a0&Dj:p9 *9cx.pe#)?+r@_; 6EKIk?,uD]drp-΢u'[ }G_c /ɏbg~].OTP$! 1iNymZ)EߏGzșZ(D{i$5Xݕє~~.y^vZ?Qpۘd \8֘&:NPᆤ7$U5t+; S>zt&crogH-*xA}`,7ײp\J-adN٨v3R ʺh"=& XvX ']z]W7FI< )Xy]n@jk),9Rvct{j3 չfCvG2jW' zhAajeͧ Iڭ9 ;M7ğn+vDQ ×h%XԘOfծQ;I!:ش+PKm ,d#1kB u߸GiW!5ྟW6%6| 񐚨!/jFic5VWn8@L#@> 0G{0ncB"Ѭ-֗oՆ'nъtYNnR"sc9u4ֿN[pcꯗf'Ե"9BR6J&ly̾._P͎9ك}Ft3{ WɻF6iÁ(=Q*!._^ 2wpbJŹ?ҷ)vg$z=dz-By"l)7NL a9l`P"2|Ih r1x="RfP5~u o|=m+́yTFuCc5=~=5D2|SmL05.32.LML)LsLQƗq0wgYuvnX$!0=[VoDab摔]IvgbSL .АF9T:on/lj5oߔ.9zڒB/{W-vqQ~!/Y7 1p9 szu6_=S|ճ`\,{|x#¨JArwWE']nm('oZPZ0oy-b*6*;4 f`?WOEֿA/b.F-L v4r:'4 /K݀.O-7-/$6x=8sw(T}&{hAȖw!D`Df!˥iobV|yo/R̈vnNۓkSSC"ψ>[[:6},Dʋ;sDw.VJ̓}=gKO0@›Y{zd6te؈mق4!z1z㨚y0A|gϳKH$gīKo5}Q1.bӳ %Twb6N1e&4eK B 5^J(4/jQgX' s*sV(zI=ɰމȤ]pm&aﯓFDρ]P/Y Át,|#Wظc=X"4O7 JLZ"lŐxGwX^ 1}b3r29\`=瓑dc @?waU7x$ 'yH7A`}JJ˪҃޿Ii(eKnb3mdEG"zoQa: 0OY!2HRƸUZ h4Sk#1 n'i]}"R]HmZ6Hw6Yak7PSL:@w =Ay[u,.imDpD)d&e*gC3%)TH4R-^?u}qB=M%b\DB 3e,lÉ|hkN]bV@>nZW7bP>U┝Bi4EEa^¹8,K,dRYJ&n1!:8F.D& Uäڞ m6K6~q ;MhO)|L! h́"?4; 1J%NYPxO䚃,\VLN/"*-^*^A[̞%`3,CЋq-9 iCk/X܅vaWo*F`"~?qlgcL[ ƄNF*^Tlbw3f~;¨5D;T,u(}S[W*&۫|{^Z(;Q} >ya?щ>Z_Z;jK8aF˞e{N?/]LG3vw)hjEUE3|֌9;~wvV(&CJS=PG88EsOwLLPxVkeuvX o!X.RD`(c֑QCٓ\ƌŸ&Sw9p1u\ۀ8VJs4 4@|#a5f &1n@f8e5yvaM*և@!{ʥ^L'>(1e PB\0ꪯjfؘ?\t|1;.5;K4Ig< c =ouG\D^ӳ-3K.v8WHVu@ёI68^b»kcyi)m? < *U߲2aO$‰齥zwa{(5l lf7y^B< ߀ /_!}=bRa*44"_2G.Hk c+8PHMdRT~$`.]tVa`#![>Xn P=b|yG!N! X? m]V2C - ԝ$ v-w.g&47e^L3w'qvJd˙K]^Q*sP*{sߢ,;ƵђÎΫziԱo$8`|Ӏ"e>K [O㕮9]#0Gzf\3ޱ!X6 -FJ} 8o$_hD&?LLjaڲ|y$x_Uk介+Fl7KX8brV]˽rWNKU:Y1Őbr}5mQSCTS,EJq_Zg\2Nly̧>X<.Gw{)O&lȶyo]/PTuk3=޼k)WӗOL3Xd?YM4mz"cvYS<2bWWW (Tt{27.D3ZZ`ՙ>vA'Ox>0?Þ1u<ЁY o> 4WeCV:ǻP_?rLw2bAbV@\unbqFfĝO#l`X\ϐ] ֞yY?5t4 Sԏ2)QQsL-dzh|5Nu{e%%q|cUZŀ-=0qyF뱈 W8xN8 M@/yᬹ[30šcaRfmׁb2pڴ^F<!%е&+'bufiE}+-s"_:}~#Οg$jџ!M9MZ3&D6kDZgI⿃)>Ho7Gm3mUN܋ז uS$7~18kл>S#D\Hr-x 70L 3,I5({SĮ+,f;kE1hf;bB C ea "| [ؔWCKYlF ݾh|QFCEIZ^=/Z JGyQC& لiM_Jqo?xχN*>I㥒h>fqD/ɢMw~~Vlw֐-Ѡ7\u- VxFdB+">98EPPS'&3Y{kDFl7?suT`]y%k]ʽj"NM74${Qj^vKu0s;p>|^?[uPvtlm9{ CȔCQB К}𩥀gG}})UH6$Sz0DɑF/Zf4 q"8,+}稽~X%Htf*D7vA_Cbј ͗X09B[9'gz _r k:2Q!H>0#D%PrwNXr 4'yHi o=.ݩ}x(k;^vVK|st%6tMN /ǒ jOTal\=>ӜL[c42r/ {_5Q2YQK='\,'ϜNH+ P46VBlqs6Jd?GU p}ƞzԉ#t=|TA AΞOx-Ya㽔'gVt@0M ŅG0g8 4Y2b*?Ba$Ihq0g^|y]q4miOI-)-D[ᔫ5A|#=&̨7+S3zS\N^ 8T]pZ*i4wzR$spFf4CEkc~A ?PK-a|냗L4׀_*n?\jZMLpn4׍F^os@gwTBK{2'f.m9IQ9E00!yd`M )S)G|i1AB)°~BS9YK!}p \AiI>,W2R."oN-zD4u}V#;uF>TX\M]~~`6 K(&r7S /Ɔv'n0]W*bJ]qk!\xcd>}P4]G98 ]ڼ}Li QONkĆ`|*WF[;A¸ـg!N=-%cwA@7gRY'߻'(i; Ŋzi|J==zgs͸kvxHV\m#u9j[E="Q[2'xW 5Ģ|I \ w67LH,J*wŗo=OH,YW`˫2w‹`C,W-"P3$e{'߃}/W?OȳxAz@ tadÚkVFIL C ɚf>+Ы$Fz&UF$Ƣ4Xiyb]Rб!v!szoO[tn,ozzG8YDj[U'㠹$֜!NYO2]a ̡mp*vqP at?-@:VBO>9Shƴ?KRsh*-i?UkYYK9XDk>2@/4|wp5K{rDj>ax.w1l)Jq,]&0O}%2#'V. YHܾ@@tr cMzOv0*f=aX4B셀0Q?U6 f/O@ɩfaPy̾C=3>'QL5J nsLzK#)h UW?'`fAΗen NRV㰃SUy RH̙zOrx*9_ k0uK4C'n8QP7 c.'_ j聯Zcuu]q+._\ hZ9 θ/9;s|]2XWlQf7$ MO+vt ~JFϧJ {AƯUAJlT1_<~V>{E$m>Vn{hbu})fٞ<3[P2kOxʛ_ H kfKW<ʦKiX8']x2 e=h<KÚoǶUAbF3XB5V.~Daߡ%t-Fm ΚE(W1or8mYo|ͅ:k[Qʽ_getʕSz'f +*FcC$S^)W4OZ<瘀\lw' jGg$Gsk ٩ϗٜyW2sʛK72 bU*r3\;?WZ{th{=&Ml9jA]TyfuD0{N PrD78  ?t:kIFcGyRz/-1_p-QzΜh`Hm =z%cq rCDZ7 ?yQ0I -0uW_[ ]d1(݀3 ds`,3>s֫B:!XhG@=y$r c˙0\y^9&:a؍'3ḱhiqf,a%a~~:xF)ah= x -m/<TKjRWk:{`*!tF?؜;yHxC(3S`Fių6Bc[UO؉pQY9.J@9,w|U^C+Pf+gj[#Pp #w{͹uUX'Mq?;y@zVwآF,L2`H6BM5 3ia,&M8*ΜL|BR[3\oa }e1 9fysCKOWxC?.띖JTeCPQIapa\pn$g*bԏfb`Eܛ(92:N $53Kg儴'?TR{Tʼnũ^.缪g<ω}˻^Ap5#Cp{T;{2Nj}Ɉ/ $6'~ g QQ7}2I%L3{82J&0l\V jHA/Rs>a9=R)Z16a!;$#{luwt$N|,`jS 1k.;JQQ11ЄTmuvk`^In+Z0~oKuIuIf!ε,BU] _|ٲgE_2;b#,،вB!6\]Ǽ,'6)酊I'x¾'3Ҹ] .nb݉-Xj(c#aDad&X'TcPҽ4,~?` *UA/j u=9'0\ i6cCuҫ1i@ڬyohi "ʢXXkT^>& wQi-e&%'m>Bv CsbYGLIKC7rf`qﴁ#e YWn&U>D}]m 1[cmJ-TٓGDPU !("P{ⶌH Ews,kِEDf,r[i>5)HEv,?sP 6^ځ.t]FW#)6u2@VV&8^0h{AҺNA%( *Q+\&܉`?N80?CJZW0=h.ISC4 _7KPđOTe$ <оI9,Y*͓m4 SB+9J PO8FpѕuO̤מmfFWOfaEo?F[k|`6ϪT5n>aKy9K+$qcgD>S!r</"9)?B@uq~J+ VG;ak$:*dBeNS\oš } )>hmٍ0x4g|'Ŕ.t~6 HP?FT.d_zӖdR\2X)y ~#N'y!n穿RR?sЗ)QL!6=p^F zbj}õea ;~b P>iv^i7]cgw{ 6>j/άF" m$,ko[DD vn-Rj*uUWEypJGTb/fX=auQG婌M)^5٢wvW#5Ur˨)^Pk Q[ x<cQFim~ n)>>-'+x2S^rSHψ9uɬai@m wXkPhDѫ8 ïn1A 'w$:=@B^Iz*T~nНO螨9Œ4u5 dlO[_#xiL6MD񸙒OD7﯑]VUVBoBXsag,қy<=ܲX%5eEf<^a;#NoWmgȯAoj#XvY8 ,~Dm KHV?݆i⌞ZX,pr}  ʃ&R&mrַ;"yV ߦ6wa@ԝ[xkbVu7G WfhsdIa8`%R)1 rYiX 75>㍫z%1razmœS ,>o'ۡWV:Cއ AEZ_.`.ɳͯ tix1l +x]>emr/g9ojiB}nͥ4b易3.v+~`e;>YAU{){]/IRFIɼ,&0 A ^^CE3ىK4},U?/]qH_UCO蝲Q&UCL5C;{iWWߣn2,H<:vF3F|c ޯ7ߩ>U !sjAP:yK!"@3P߱K%QᛔH~!4ƿ#^a<ыI ՀDİ]Cp*DA+<«9 ř8yn H»t]UKc Nn$]*t`;%$YC4 kGq"ϸ \6¯ [gq7jF#1vE^#D' CZr#v7L8 ]x)Q+O!A}|2XIcN"O9Q|xP !XIN"^RC@"r䷮@{u? =ձE5Ъ؏!L/K6s[؏:y߿ 6(IIG4#k{X77P\d{751 BH(xKC˿䑁AY5CT>M$D0x:b!ms+(T4 kbƏg^gg"`T0erU琑ܘB3HfpbQ>fshзms_91??5#-Ehn %GwH#opXсs~/]j&QEq`nyGn[JJe OG~1OX=T"5/B=q;NWͪ =4~ڼ~S%0e: h30^ѡY⻑%zbΙBuTCwqG bP,!ZW@j(EhpA~[ܵþ iLa9sАM%$k@WNɨz{L Dk@:kd~юjRCLIwl7iz@Py]i\ Z_j b0G_NgV{@2bOˊۗ,h#!j[0 ,[@|~ ='s似b& =ޢ. ʝ=S#4auBQBu{y e:PUXq\z$t9tFeƐxN,l/ sʼn$WUdeE[JuA? Sij_gϧqDhI1T|6r{{о=lo: ׄ}QVȽ +̳;`Q{(PƒƆbX FQ_Fi;KŸݿWPM@]oU^:GyʼLlbw]Aq Ng63P3.3m~:&Q(1:*լEoVN|<'þ&zŶ-06+yQlUDʙw?H-?(k\L݊(:>h]~aH$fJ{ژy7sBSl eJZQ{۲AπTɉ,ꇨIt:)6ȮKVA=l"nmE5+KѱxqANIB"*QxNQ4.QԜD4;2ijJvW g՟_osF).skk;m7S)b|_{w#.TPL١48;Ud?kȗG/S4Ūof\4 L/w@JsW "0CЙng'HQ+uYZ5,L/Ra3mkۋ_Q.~5tI\ ,֑W߻{:XsNyͤ1WyZ@LEp ,縿OaQ_˵g"\p ABfJo fՈ!bGT[Fw[%t=xjc][KJLo(675uػHs`$;̡0{P 8NX:%pǴP_BgpN>6ɻnă3eX$VH{5z)Y.WYĻ$UӢҗ肇Jkdj)!菔<ѯ0}'.%S#4?9 !MIU~R# @TKz#{5} Y'*,*x>ObKApK}&+8+",'%9^TQe;e5`#˧ȇ3?v e'Jl&+ sRQ\/X gp2-Y{V 1\ԠPޭ! (4ߢ8\txRgVf=(0QStN?{v{@N+v\ tTN ۺ{ȑԮRoDπv&<-F5!g.,hċpKFGe3ȃpEs FwfCٕx."t^^'X[\֩tHk=chT=\dAtksh5;x%;d:0Q)>dO/U/Ӟܦ(e,U݈z|Oi0HP+2Ѫ@^z.;,Ѿdq=ԖR͈!qp$m?8X Igb2 AWB/D}cHHi%>a,uqe=f2[Cm=(X֭WsqEֱ59 Oe|>)Z Q4рOE,1YڿR5RT9GRgb%W]>`1ӁQq`˟pIiצԩr'ZþXLa$$N:· v ٮK|EYR^g<>8-s.` 6:^֒05C)H牽Zy4^U\;ot0mc N;~ ]wPܿ%?iB.Pާʗݭd 6|EV%>ȕ}]s~Ni,>ZvrVHu/5甍J ?b?lXr'3^_5-|DVz[ҹm,w읠wZH3o3=9y(=CZ`o@gi1lИea䴪w?!ܼ䯦tt~SB]aѷR(mss`)ǯ;9+{Q:ӽb|c*'¨o68m-v(;DqiZbq/ J87h'EHQՑ}#̈́Gg;2y{!ּ#^D̽gvDDLffqjO0zhf ς_7ļ=BVbv"wUTzH/:XPP >Ndx$sKBwԷV+ɛKZaۆVyXϡU3[ rH򲸆$ɃvXzgcXt<F>}'3}{S4w7Cf9\|=O- qfӅ_Sf7OC-z{y ֽV3v;_R`kESs@ϛZ|}FnẢ+;۴nG' 6 7:|5u^Ɯ;_5weaU`F ^o6ճMzz xw@16GYk4eA9H 3*bވ6T1!}7a"АXi[5=)c U4|܁M‰#^Ǖ4Ƹ-q " P/my؟Th<W5SlBmuwkaTؒL^^DKWi @gt -w[̥dGu "y1TLVB}ǐP*fϽ2qi)817bA.H|,؆l?v&NtJ ]pqnIoؾs6x6F`\+FmH@V{%_~wyI$.G+H~7EopLvp94[ daNaoJdޤWO4izg.U~H1]#},!v;5\]de"[M;yXiB䎁%@Z[BT9Odz!5&`?A k&%e"p &Jk3 D p-KI"W3qtRa/zv92Ӕtι?yp#>&Ԕu:oyj:XNPP8AFVeHa ^;V_>3[k4׶~bfG5 ;k.A$hO-俾n c3LQ^3n78䏲mpA@]s-ڹu=?{uWDMi {J#Ds5:ǹX閔q cU}a}kbm)$WĜPL;_4eG$4J;&  q03/mIg MޓYY@!8ŔKnt"Im0zD2s]ƾE8xb/t_ ,y t>3 [L%x+HZ!ƦװC뼠 s2/w6[F8{tΈI4 6B!Q.omȦ[@I;N PDq41vc0k'nHT};;6xmQ"-74֌9jʭ4:#jԆ qBuud#& /@Rțߚ.B6,wl閟`aIh맳f Ru P"{ (9X Ҍ, 0DiS!-AxjYĒ?2hU`AH~`G6jzl(F@ROf1;PӅ| إ9!8#B[u@I7˜]%>jlɁ\E[kc$U]ۯ|Ng+W~ 08QK(q[7@V/;M5eAaT%PݛگyF; Q+sI/т** jۤͺo<%6vt#Bi=vU|\8 vKC^T#HĤ+wxA347fqisJ%&8dcJB"r; S&Ph̲j) ~6ceDDkZ2@ꁓ(|9~w9_&|t%5.p{ĩ[`7N]}9&j^l$MKd˽>"kQEۼ4BSч#^Uyv8s=#WK'?b23g9LSFښRMO_=ꖾ辠ϰem`xS%(윎< y}N]F# 17" V&8NRBvցRaV\*"VZeHlYlg^m50/439LۈbõXOTf8*ߑ#CKCϟȐ "aFgٵ΄QuB|0]%9 ]͋VEo_+zrBo=8 V8:[c6VlB9ðrlOϳBS p SNlR=X"cO]%WҭMdG*fNoWqw'#t.'IXwPBC"6<3\{:ÎJlUeTSIf~ K׍9̯'$iُ7Na :n`qc4cRIHg!t Em Z[={1('=,)Vӷ ,\G^p8>;3猐e>+3Xy>:|*otH7F, ^ -1ŽefH'0d9I$/9}lnϹ$A~Um@=lS# 5<{8&sH$v/t(^Aw:-X⛴M7ʑ1y'G6r\$Tӑ_L ~渭R!48Ⱥ>igu Qx.oG¿!{B&g.7YZ~WjxzWҘ7wdawM!3_B6[ hSW#F!I=Fg> lR*?Bs8SցC=jDO'Q'pSnt^zqF<4_U;)}#$ 1a_^JS aùHhN?mr9&ϸkd&Lؤu%➃RЙQ:]LƯvdՐkBVK_ @ni2=)!u0~{TGU)Y&;1 :9tW^.2 ]OHkSH' Gڶum,(ogݱx[խy*IT'>fN3>*׻.J]סf |.U4RFRP Q[%^GUo ,$]IVebL C#zSDV^qVWC8JqguI%k~~o=ʧÕ!2SBK'%IF{ ,~w[wȘU{\ {C>}Ƕky`*J.o"k>LD\x R'P(𨠔,!N7>೵W" 2"`='L \\n6=;`D.9dFcH [Vm2*hzѝ³<^nuReV=ٲpZf(qfzѳ=ZxDE'Ө٩I#θB9uVqFtđ;,*#} "\>vPtZv+ zg@CE9y(C³c}e:$'郯27Qae+XB%Aޒl.;WR¦[{!>zS,r8}{M:\hoZClLHpV^wteMi_c=ٸq4YSې0T9^,?`4F3pпk(WRJq ~ \λ]U$@ Y7oE/86NƄQgD(Բ1SZq-@Zȩxh _ʋ-J r4鱠 ?ңh Vq@RU)c4ox,)R+g'OK_57A5cԏ?WUL?I ;t ̡VL8# [t9Y[_[Ü2v)T@I( GT,s6<<<` 2/cɒ{zn1i0M~nO֓L*-SL80|wwvB@r.=/9Q~#.o6>GĬFjs:fs&19Fو)?Z&q C˓Ɓ7gr,^Ni ,kf3CiUf. 5w<PWpr+\h?ިUwH)e}$/zշ~}IJ?P @ܐw~>; Y3Eۨ 7>GH6q$::AM@ Er^xJolޫ$WMK B@=q{ #'nVd*\_qdEn@.7\4A.l8ě^d~gnҝfpPIe"ǠajTknHIYe[z֧8)kдEo) k=:Pb75dbngћPT' g ) 1O@vG.Q BdIz;rIU0= x.SF^A RH0cp }I k: Kuj1#/*s?_|(k\$ʾrPn f6U=ve*sB[$aފcD :-9L˒o3~X'96`ʷ58r>\pq~s^YiĻpLwY--|]q(lm+dHi]wUT}~й}Vo·fbwtZ^557x/6>]>&@'=6{}BOފ<_NWs#(VQ@bvqfMrDžœZ;>"WօEwP7Ua/mA-f7?n$K/r$ĹSfbO UpGVPp!s,T061*#lOnL aRɘ4Ԡjj _JV@1yT :'I|1ix)J߯lw9= [4o;4mY/SU#@wTؠfw8Vz*j>0tKOpWv4,ǎtY: ߶lۂ3Jx-$4\I}ZpNcEug儖ҙA@8֦x5,&&: c4$6tQ/gUۘԽN/rʚQ/x04D)p3o7nK|M=xkIש7~/ٮ>6yOs' <)5P.` 7z]-⻡`1nA<MB{6&VYB](-f:3:Ǡ17g7Hfc:gyb&x['A3aj&8GE!;b)AvuiL_q;^ V^ݾ(qIGqR{|YpxwR2ʻe{y?s vT- I,E~r<֎GgΨ7vv~wG+2]J dqЕ|ϫZV|◠^D N:1w7Mggm3ڴL`.iML$ :NoȆAz4RA1B>9Z2}lT_dl ɱ 9D.8@>vڨkt{t 1ÆR-*PNjBҿ7p6|$gFTCZxgxn77*5Z(CqXUxk3S}74Q[͑mY!PZ]nCDR$";紡;WO(*bOҢG+1%?nNulR> ] yy[N+r`>]X]eû`r>mV˒1=B0>'Q Hŀ,0.u8I!_@/u3.9s273]ύZ|9KDK_t?Nˈ/Wui]19gͣ_7+5v>a)1!%m&2ɍðd o)?z-tBhHduOO2M?Wk-y(ٱ[XƗ_Wy?Dzj84+}+K-v^_ʹ):)ee,5Jt{š8vxeTi;@ ,G(S(a ö㱱NlgeTt6 * b8~G]y*2.do;o>HEo'ZEz+SS&_W2W6C }'0^Iwc\ e}(krgCKe(f)'K%C]~³6茉 ,+&)1]6+}jٙ|LLXGDz࢐&TYi/E.767EB#?eq^brxs"6RLVձ.Q/]?۶K?D x <)ݯd1c?% %uN=~& xҞ[x1Z!r۩e߾bzrA@Fo"2\yeL^ +b0O^ 9mh6Ogә6'8.!XlUX TyC boܟJ'j(c^޶(ˋL+J-fUE9A3S[ت2<V gm'C%;1!~y:~Fc:M&@HRfٵTXm7p5{)tҾ#Bx=t <8 DI~)B\3QVOI#C8ew9ӄ(,%jq+Aw.LuwxOJֳpm`Z ԇ:2l2SPsr+QSF/2)l) [qy_!/JmzJصUlbz?WYb[c:޽;0R4OHE s~sI 'b0oyJלT{D!AKT Kx Ĩ.>eڄBA sHH}.vyˌ|.b|Vޏ7ܐáʣ'նRxap5>ǔP&kZ3<͕\ȤyBzl\ތ?:р1:P"~x*>ûm^M7wS Y~+W*CN:H@?^dvs<_.Z^H-.Pc(#.@s?y/4pJzW^yiJj>x B8:>|AY* =|VBp=⇴06V\VDl͢(߆Hvvn`eצ>5œW+=+QW~EV)&Eue m_Ceʉ2ADuG3[3<_mxA˜/ho4X Y{TIo23$k*C4sĊ8W39nq : {Xt V$8ң f 㬕F>cg\#(;iL@٩;a=T>gF75چ8XH`h>)G"0Ue#n]cue\ ŏ"r*&m4T7o_ǎRg%]@նA_);b7 ~*)iEO(8PBގ} v(E8i?]DRrΧ׭&bܴYDk޵Oi)qK~RƵxN;yΌczj݌HW\geaODmBCʅJ8cSPP.Ph!Eeren>:o@Gͭ=u)LZpXAjzH}ܢX2WQsd $l%ӍU#iD@ݽ3v!g0kuOΣٷnn^iW k,އDaT??7381cxR*PÜ;@\8 ϭ aK~onΉх@G%y1}lҌdB8ZU0o7B'f5>qs˽CW6~ lܿ덲9F^jN^+:EڜCm&S?Xkmߢc-ʐ YRWnQYKWR . хiHW;cO і.|k7km?k 画kьEL> >FoL^C` :ᶱ'- Ӵ?,DzJ%ӶOyULt{%Xd,V҉|nú!hn`=?kEsu4KtWsI!qsyp|qb:|t``UxU6dͮ(1_ůs āF`U][32 0LTKx{]?8ȎYN+SFA eLgcs밑!WC M.rȠ%U--E^GzlR\2z5{.IV:,d73qkY<^2Io6}M-d)t~>R ;"!s%a}*N~g# 9vo/VJ&8/Őf2\@2]2g`[,?_F2HˊI uUp\CK ~~ ?ܝM P06j2SndxӪ~{ Vd}C^ƅEi z.jb|#LH\SQ89#n4+kx~A8 ;}.]zxxuLѪ SH6w AT; ~jV+"e) Q >5D8e Qp$: x@P1m!Ϫ53ӓ+˄)w8MfĢR++vOwx.K&2{?-5kW,ݫi[DwdU_|76n@b2xrrvBcm)/ˀqV0ŮuRB4{gW~qN(ޜ%Jڗ:/{AW%YV`RyK_{LU+S!zkK?)EG|RriClߘr[%oлR>8Ag\(3_@޿i߬?l^b=.̘oc e<6vr&80̗eVqƏ?ҬG.VTC+ tϊU ?oƸa!&36)\u¸,AOluD, gm:M͍5Ix7޻f  q8Iٻ>hC$~)X pM'Ao8h 88Ro3 wO 1*pIgLߚ3倇y"uLH ;;;&2hL+ioEo,rRϞא:qj`NKaWX7q:=YU6N y˿5٘FŸ40z^HYw߅_?߀zD H_[c};–.YZ/O|Fq ׮3tRA|aZzA᩽Y:qx-m|#uq,.3[L쨺{<Ϩ$7*_TR0y%.hs}uWmk"Tak-+_"ϘxTʓlUy<~kd,&BMIqo.]\ ]u W()_G!wd0a5q>cڌOVU,g.3H P _Eq R/1l枛|#Ę jBX~〄1~74wktfЏï HGբZkmCa 3%K8e)g442|WD% K~-^UINZHFߤLmYS K2tRxSc xI0h7#ڵi0q\G?#]Gig%X%&(Ym5GgR|A9Bk&|UF$"Is4ޢYV;A AOJ}> ˈ`!;#SuZPbA` x3@ 5Ar`I t zPO+6`IR ,V݂Gp[xw\YRxK$?[3'dwivïRqÝRұu <0,+$у/4)njfmvuWK.g׵ %R*J=7AX4dP@UTR;&AE¤D+" <~[oPd1RsfЯ_<%=XO<P> Q$¿>J("WðnT#4OTS3KNUY3;[Kҹ g͗FȎw vzvr0iUKo=ViJ#W;\!͊1fWݸSR!U܌m䥯DF{T pxxMSU?ƶz(6pns*ŴDfq1[Sm.HzKTnfQ >sϗ4:2;o1lCèN -ppEfa~@b@䌧A-<n>]5RQ+rzNF\ {` R$Lϰ2v4PT; +*ෂwCxspl2=/IXZiBvs9WbnRA[H%=YŠ<$=WEuߒiq5!5{M0 sgHؚ#T`.18ۤ^<:_ %Qv6{סh6n"\jQqZRV b.Bf)潁0B: Z(dɁK_ڃ> ^? YiH7B"X(~|2Y"lT_<H]%nu? O ,WGW\>'#>ߘ 2|OLY3쿌"bX"-p vt RWwwȑGжx츏;SsGGmRh}f\a_{8~__!n 3LL;sq%Ţm]1=qVv1ܝ%S]!VK޻s+aJ0WO=ZJ[0h-KGS۾[V7r:t%ytmDM*U Jݮ(fXkcߐ5Z'c;[,p 3Hm<de.9H_0DHbq917`:$Z:}]6XVt懃\d42qh%{"TA&k2Idx3rO 24-T:&Φ6cЕ'c#p)2o ʅ,*x)S”z+$`J{}_ x7N׆\ \лYdYIM [&5ǡˠmn3̝ӇN?9Z̙l.6$%uLEQ~@VKfWv6 t#FT3,7ohpo,جUUXHqcFY^V$K_EP8mPxEMrbĵ8Ah _ͩ&*xÜ@$2<'>!f^NX24SnA9܉@eq$$THw >vWr,ڱ>9ܾ`k FB2;[ W,5PvU @Sѽsz&>4ly@fq !?]d3b` X4{"=H8D\8G?P !>F^3{XĚhh<B8~:R 8 A F, VrΨox+Khe Ѝ$xȖ+Ns2 qKlw\H؆CGuΉ 0^aXd@ܣpKhYhsڳb n@_>sAoGSAJַ>@H6VG(Iv1 **Թd _9GbO{ʣXd3zg:|$l_Ռ(r RldyrTS0#`ȱ({fX'Q&By5:ok sy3ՓeAtop1P5`XqzFQ*,[H+kEyF'EXv '^qr_]~D#d o`1QnWB} YǕT0wgFQ('cO|XrH̸YO b:Rc=9= ǔSyXOwDhE{#R4;@Fhx19p2W$k1bBb#8|$-?|;^ 3n֬5KH{ .>x;S9\@ihފIr︨i\K~V)T嫊5\Xr&HD# :9KqIհbu"f%įjŤi- K7B{TB`JLcTNTB|=%&Gh _01k:h+竚툎{Vgܑy55+e3H;'CzGcdnU)OuZT8B_?gͫ++rlDQ&r~\v{gٜA~D" |krM1.+j?Ftm+TU![`MFΰcx@.w? 󈤑P֦")?]bZK%΄ntZiu Ӫkh,Ь+iC$SFg^"Ki7H,T)tHLjƖᶗ2'$IЗbƇ9Ԩ8;1]CSAq4F8hN;oKa;6s$8x9Oa:PvnU$l*ۑ` /ؖ|8ӛie~ע2?d x$@v `sldxvwu-v/R1|N)tR zͦIG9I[#鞂=4c웎5V$9Ɖ?I|쓽Mz{0h'(qhnGp+WΣ{F4sυ}JU{}09e޹A=ÄK `'I`e֗xjyr+B.Jgǂfhٯ:P&!C{0`paۥAzPIb}ѣņ-@kp-WRMKWV xchZ+/6'9ґ21S5?Df`sXg8:y*01 D)BuBcuC-.䞄i5/ EwY xA͚eˀ@Gk05h=S_: D׸,y/oTgorL('~/O6h>'<>nNn)#}9G8sWh?y[s1?DwQ\iѽĤFha}Gk#ma#8{QQ(~fHS7-%*k~|W) ^1%WUdjcz"n42G3JLC,%?a_}m4gKO̭LnLПm!x>\LMYP%Kv:=Q|eT$N `dsjѣyϜB>.`oC&:)4ʮ1 ! f2/ާ$VhFmiD97S>G\rtd"6t_Bwbt&K{A2tg:݋uF2/lӜM/2u#^rd>3X}aNH$/pX~Us/HF#+>j0Şi.'|/MbR1=!< :_SJ<A!D8TU#%_AwΥIO+ܺO][Z0+샼Nʩ?0p @z_0M66cOzijiu}Wzt#E-&Z-%FVS @x5^t6!IIlE귺\ y4?y|ރsŸ8ʼnuXmRM!>dT93!XL%r} uX3&RWbkbKMKqd LGY,p;~U:OQ&f ja6ix`x\y>Q!h|uZɃ4yU6IZa h _/'eU0ld^4d(ا9{,Q R9o2!(ÛKe-P}#wdô$I(ZEz/iǢf%Tx_cT j,#7qyZ9t+ 8A٫u_"v#MFyAnƔ;:b.==si 1VWj'|u6(I·iښ]$a¢t֮iHl2ϿU^ڇx`PvҦ1#y !dD(`XWa9䣝 Ը L17JZO&e[QDT_WU͐eCZ~N竆ZUmEHڛJM!JMef풧px "-y29(pb B/- CfwCj7BFcX{QeRydk3\7H8oFo6cuq0WN;2guXI b]DB[A3ORh9n,7&*b!6? -mrz ;5re"7"N/b.TU)g-N\/_l?SŁwFWgڎn.7u6tޖz܂"-c5m|Ψavk.dFl$7}nX{.s櫶A1c)k,Š*uEqҦR#ɒy[E56\c%7L W' 'mt, GלOs{nsݱ.)Gx1, y2})G\$Z̧{ Un:ܷ?)<3vVi8r;} oBUZ-G_ɝ܈lЌ4v>vjh='sPsRC#8aӄB.Yg̿H`G "uR}4:·YO\sZ0w _M)ڦ融]S o1C6A@} u-l!Vg['F;36WiY,gݼJ*x;D>Ȣb $@d#"(f)S.&}/.;]s%^Yqy#CTj'誙d[L#//j!CPx#z$+)|odTapyb1'3&yug8P -F+NB[oU.Zr\&tos2V @{l<]"?XFRo^D՞J=3RЕట6jQ2oLy iKdHhNDOϹ3u,pWhy/ dXy1];|^#jU?Cs.sL*f$B9xU[^3*ex/ 'W8HbX"Ś%xj_K6v?Co #-V VL..'Vi4N"`QĒ*;vR~B CdWeq9t.Y]qfCk߹4wԏT8{6@O:V6vH"QwiD,hM全W>v, <%DI-$ [@}"; NACf1K/qJHHjطsu+In]ÀӔFvhr'!d~f%cem0Yn8?CJ<\Ci-[>hE3!>[?SNڔ9gaFnIb\l2Ksv漆p"HR V@ymHWMsUn9uE՟MhQצÒ@0HA͸;T,|Rױ8$ Ta4v;hX >?D7нFFqIz>mHwq:]쇫ZK!4 Ҁm=#L۲(# Oo!%~lh?5Fc=2|v!q8Q7l8o;ƙX6oh"N/c*]sb7vut`g?r9 =~7ڜ;jBPp#o\a PjmH0qC:I?'ΓR^Jp@RR,%|M 1(1D ^7pKK$tǹϾl~˛߿-}3K\ȕI*J0z5y|`C64@@\-G|McT|d SNP9_ vxG,ݻny̩wm =>юQ*9)/}{1mBR02bJ)}1`Su;Zjw]J-_@e`R)we>TY;ǒ .0IײoD쌾 ~уo1H X,SZƅ2Wy?z#PH'ȟ.n |!fsg()@[`Q 7ΧHc2=o;J[9 wF>-Ex%J(04}x Z(r0 3̞\ pSJm HT'aj9|@U.6R<'7mP 0!5fW4-FR ?uڣ8KYI4&Z K4T$5_ \#=3㫣+O %(&<Ox$l,0t"/rH%dP3mr brާJ>"󄰍(r+_}=tgW~Y@/yNX82R>eFOfe,z͕x-Qj:@bC`^a`9 Г>j&)3kYh",LTPa% 'ΈuvcvɸqN ={eeaI\%]x5"W?Sw 鿔%HcP( U[8pECE] TYyvUm),o ,|+P..SDB%o3+{@u籭,:RqG+9{ PTԘ@ ?} AKr1Nz8z^IXs!D @Wy& dݢN;1JYYfĥBO?ri'T;08#BN֌=8kv 0l.ac/GзI=12~b\eo*͟b-'naGi<4үʷѱi4:ؿuY20w=l& tĚ̟ϴbfrQZ{]G9Ll3i0,VQjt:]/+yM?KJ&v]+K|GQ؈Qc6E /4D^*\'GM3`@|b:E98 |uU's:XGGf̡Vv he#٪'M!!ly׋NbA_[g8+rRzq-U 8>r@4aG9\h'ИflҢ7.?F"..P1csfQ[_}V"hz.6lQ2N z$_\F&JI%>?k_2j uˇ2ak?Ⱥy9oyǥRaBNk $BΩ, Ĭ @T0+M`7EK͏|!壣'ːQL)7QZ ?]"scMI?x,FN{eoe9yɟ9%-{5g9osfcgҐѯl RĖ~V!Ht~9 u\4,ͼ؆[p89)^ kW[Vx{jBMN@/`SaG?AAIP8DC sqq@ 8y%5cTUzN~ǔo, osSZumUL$P[,  ϓA?Jyķ1G`t7DA~c~/gQ))2N3/Ar2.و~MqrT5O.@u;sc`hmih"S j.B#—)D}t]_0 ɔx@ ?{'sMY.knn ? Qg fNlnD_ {j CVk`=]|uvTlT'>o"VuE{O5\Dߘ"[$FE 7 ]rk\4r4 N"Jv30iCp6hoZfEEXJÅ?ͳr kw)bUsև^r+n/>Z  ȢS9fC!3a^cvɗF~v`,Y*^wC$#Q/L)~5{XeVm3tʅ|3 \F&l(3xd 1ЫD^54Xn|`5fWD閊O*%C2el ( {qƱzw,=bd _ѐ0-3)kJ9k_ Ϊ-E.2k"y\"?n\7ߙ 4W*I#(ټ-Oh$x)jIp@4r &a I[][lv6?( sY?2BO}X8Ҟ*.sβ*k)/[/z}zH먛][w[Gj[UʶoHl6XCe^>ΚsUG-tԞAsw-GU;Tƾ榷:t .(Z,j~`40Vq{>MH8ask8otYuE707KQs-м2jxPPD=C[%^"-Oi r̜SqhI|ŮCUBņG"; byd4jh2w-f?)=2_Ӂ."*5i/f`ǔr?~*%PjP…0zURN .NNfʫ5.y srq֒= 2s0@|&詃 <~Mu%J )V|Ί0D%~K-#7;)RQtd+aEׅm @ ݧK+Hq[HyƪIܶ3ʑ[OFj;l`vg6hpw6O+Fo< M#!yUoNӎuzQWiƾaYU!\/ly-b{閗 Xx'54\zşiBZ)Y5i ʪD _LnoxwQ\?- 2z3C gTѯ@ KLs]*;GS2՘MKh&:{Rfی7ndW4DX%\^ t?DSWXĘ[>i\~һq~oCˣB?E;Rw*ճ"GçmS꺲΅z(C CD?sPhe#x*mԽxm\E=* q<ڈľ|,mXPJ%QW=-1v; W%„iSnn-N1sj~Y~-r#E0sbuF¾IxjCr]p 3x2Z'pX?8i k0 >q=b$@u#2I{ q(5tYpVh=6%S;E,dPRZR]|c'Ǹė[g훔}%{/Xؗq!Xnx D2W;PүAJ-r;-Q<(=&9y`LFDnXQ!]Y[1%V#S|Dq\9 LPoxYR%@sОrΠ'KAq @c{V0X+ ŚyUdBh,NV?w<}(m{ pL٧P({Q/r[2*TnKt/\2ٶBwX\_L <WhY-nR{%1?8{mM759o^&; ӉRfk^V:&xNZߵb}b"s٨~ېݕ:#BQucF{gRzTf'ͭ;2@젢i ~XW8z>i` iV ]etz7$ _A"C[!f}A"%m +RِIf?o!~}owݪL"u`4_nKl"DEk4i>| uE] ?,`s$4I =*6s'S (uk!vTZ/d=~*f n nL~-[Z\dt(ZMzE1tG90r(&s*w?M sĹJ8*s· X+ l\ho f}{aEFY b &'3|-v%e"\X|KnɁBD{#zIﵬ<4E3Zw~ߐf9MeLcv`(2l}>kb"AOa#,R"/2;$B2 %-1L<$D &lsV7OWrdeXtHiix=akm LzZ&q>`0U[[mҊ~+ ?Ec "aʿY󘝄wƸE~ wQ2wK'fsa-d;Ԏ.;5l0XN6u{ǢpjRtŎQ@{4~}kňUv~2؞l"Ҿ&Y ,oJ Ɏݾqĵid"(/c`5 `j 6),NJ~p`wkODP̆M{cCr(dKS&i<1lG14{ nL)wgC3bn?}5dmWk#H6g[q:F˩-cZXlwGx+rȎ#pk9򿒣ͪ}ܧ D1RIٽx`%Jg!ŝΦ(;D.;J pa8q 3}+acBr\oZǠ<1*Jw|Ō$%ȳZY߮46#$' `ϛ/OJ,|Zt:I |o\ҙՀ?LܜiE(ƘmbgtWB6eO0`_M8RaHN+80+>AP"9^чK\ffswȵL#2]tOCxh+VO0 (P9ɗ3OJ/-A汤ޕJQoLtƄtKF.CO?yfNks&e'0FYrEmJ:u~vO&OBaEu-J~}!5*D\;s4=TS Wgh]ZN5C/goC-@hc+ԔtYSy`Z"Y(zr&0~wAل^_غJ% -(ed?36/U5VG>bJ QMGVKg.VJɸn9x&m[nRG\ÛFzγ@8|~6E(gJX! ?SÆr@N%(Dz w,+3j]Ja lڊoXke D?KQ߾/0k>:55g:R 0Ӡo-zD1ӗńZ}zo*d whxP5 FY\SOX**݌jVܙ~Y{0~Ħ7gRpB@%8H~5s} EG l=ecvx*UmeFa`gaM.d-#cF2u0@3xʝFs ^Z)bkX;-i'źDo:uSUp[D?Ǒ Udkv)gTp|Q njVE"q1KnFD9aS)ّ*nXu> qʇW ԙ;vΪ/p3~yv?X~d6:cxSg4/QHXkMܘKvUTƈB$yG[ ]~Kiw4-S` R\F>1ͪڴƪ9<oI@{i4{ѩ%#[~x*ams_Br^M_)i#JF0@ݚJ'{{wFȋ'[ K͜EzA*`O ~& +[a&gU) |fXC}, ܢ 4x=6J灀[AôG1x.@Vbċ/aw/p{z&c2/i9A܉&'\u)5FZ1N0+vG :Bk4W^B+Ã3G ָ{[nX2 ;uZ=u%q]"PxcLfmZ˘R5C97&> ?3_> ].H-)x=G@`IRA! ʹ.MP"F6 $@#:7va 2ܡC|BL\ڒq8ݺ,LEk:vܸpq;bWyG5BtSt qn U=ѓ!$%2G<&nG@ %?t qpqli(J^ZVo*UqS?P wM2DU  jIM,/>Ngjm(9kƓ/wwWFՕR~>D4Dٕ<γsf2[ʹP6wX+X+ky W<ċ-@]( ufɮK>3WVq;*@Bq.X(K1Ɩ]RtDQ/6gLiFfϮz5Ua&QWop[&]?/ !rg70d^ޘU6Gyz~!Ma`VgIh16k'qٻ1~KL.:rL$RT E|kYg6Nq/h$ 4``I@_'j}h?"';4pV$ !&4DYDo_O[FIuҋl9P@a_}ޫo7u|fO!QFjWG2] H=bj7Ζ$d|*yM܍jRmk4`2tD]Zcsvp@~T.87ܾf|]~: Z] HO| sxZ :m|(,SlNނ_S~GGEW8+_{nu*6'[NlN#lmpc˝XIw36W f #AuGd0FbGΏ<)NtD" d}ႪMs4i!tB#xChS̆-%ιr>h*pY>A\tW#*EDm'#66E=5ݙ$s'j)o# >oi5ͭGSZf7ELUYv/jnuI)Y?G"䁧E̓\Y~n)y% J'_6\ r!d(C e|3DzoȀuaV ZByse5x_6 dRn2jc?lH<=+/VNJo.+{6:#wN21(Fy ,& +QwPxH"Ps>|AjtejU:ٿĢ+7#jH7pe ۢLrbdһ%ANUH@/0Z ߹WHälkmǺ X1ٳچ6,F?Ǒx4Ft׍'?"{I=; 1Ox8aDۤ{Щ'u9SYF;rTV91 &Tt'+yWz$w3l\%gx C9 6(hDʿ{};i7\%\6aF9ũ=vYZÝZC׊)|4H*q;pHZ Q4p` \YiLH 5+̒P6SljMegp]cYcW]V`a*%u^E4'̸y@tHk\vp@wc9{Qi8; |ƨK/%%S0e=B{Uy(R"lԇ*Jo,G_g 8|]14$^62*~3T ;t' ..Кno\r5-ZB1ÅhD^#> A c E; ehr[X U眩ǹƜ~G  o3~\TGE_D(X6L~aР1?ZyN1ب|(3u'<1e6Fw혢rבIvem .j&oů(-=kpV"1_k雭=k 9ޗO!qѾТC:[ kɘad'G204/rz揌j {lgQ +4$%EZ7G w-=>E?b;P?Ϭ a}Fd)\+XCx fXԏϬ|j)vDd#mi 6/Lr"VKA9pCaJQ+ᓯPOCv>{[9z]'SE_.`m kL68rM* ᛔ<#6TwtKrhGfn t4W6lmI` >; `y/&AܿAF|pn@!dkT@]MaRw.Xu;81~*UyEMG,HrVG㈋XTm-,J,ucxGE!7t5#O!hkѸ~NV;" G9#3(ki{j*PɗI-ɹNM1;wfUP:D5W5-+8H@qh 5T*x= ,36}+)rRf.Htj0-0Kk?tD˨n'l s&# ? G!q,)c,n ;R]ǘ_>4KVRǼr惕ZMv6^ _͑X:!.?"u.rMO:3+'yf2K2=Y"|b0‡}0*qf+OJ(!MrXBzdgmae,gR)Ox(9#p\"~\U6: ,0#N7P# $wÓn7DuP-T a_F $eލ?5Ԋs̝젵3h7 , JQXfg UBzOCVې|23r05qI PohK+vW݅o"jU9fppȠghQcі[1K!C1#|4wK3(]%1мzvqoCI%a3;yTIvqk8D\k}pK4U]zG.52Z^F_KrqqV}_d uWgB1^}"YFH)jڅ\k.H>_Vل^+2a'dI,VҔ sbDpܢ)JF^#lY $Iuٕ"ҥ Vk8BYl D혁u&,{Tb+HA\ݾvԦķ\a!pš1Zݻ[M\HB^z 8(C uPHb03(;]R0dI%,#~>v/rzfK+V:n{U{O'I @jI`H::ztYjpq.2"ZC U0W"Kj3I3Ǜo |motL/18iKOʖ>_"G/op߾e BiȒM> !.~X37YHXغpy91Un_j_$ruJCjaL[KZXYW$ 8\Hxŀ yxY"y$j 8ݶnz$E2!ɇ%lmV$ImJ%r(:`j؋Bm1,L\ Juʼnw_rC" 'I0`c?:m9_ø_4G@AÀMS^G њ,y*o=hiǍ,_\{28f-I*Pp܉|u,ZިauBkFNJMd7 kݢ;cj){leh.AmX㊢{3)4"X@`_5Jl gZ"Bp݂:T<5aa=lL!Sنo.P/|VVEoJrp|j?ԡOvoh٭GZi2낸Y}@Lߚ|( DaF`vɴtQbp~w %tU Y['rfZ^-djЗΈ~8 o3ߨE)!,_hKc_PiP/LBCG<'7h4:A O>YVAc{QF!j;_\YP.>SNPUu(qlI] 7rR/>M޵;.+Bm5[[)_$6lx;ubV="еɒ>.4+Mx'U~Pכ7N_{ZVdJ0{8K?%3rݒeLMv1@Q.Ÿ2QUj $@1p!9+ ܀0sA4%8N3#mDGxv E/肓Jcf"GvTWq99X@ѺȖ2Qbe/oZ"};sC/$phFbmAg8ŅEٺBMmBzx b|x7j_%9R_lbZ-@{ :%~i4f ,Eh ~OKvϢ‰x6bja;WXM3Yydܗ|v+>2/R̨>pp*)W sXzp;%]﹞2FśYw0wDxUǵLލ8p>;B_!\Ό0e lEB#d#MKy4l Š%\[A+T)3b|pu .NGi{ $#PTLG'٨vX'U5H }Uϖǭ&@-vZe\Tov9HAAWT0C2 Wtt^FǶ3FiAD!%n`̬/%OH]c\ [ սXQӲ1Xg#/v9.~Ni {oCf !80 .4Oz9ЉZ]UtxQǧ8Jh2)HG\ rUQ hxD !%o#ʫq [/UlFO27HjP%:nD NGʵH٠ Q!7|#g(UCc8048i@E_:vx3C !$3A[SXU m'l%\[v=)x#[cХMRx `KҪ]R]  pyʂE J &d/$t<8hՙ6 4+|(4*7=d `rm$L]_E!JD E@g>M4eW`nF]k) D qHϻ<8jcU #zx/|°Y9dYB'Ք{,icZudy6^ nB2N\ 7D`2 }Ln0M. _g@+<`]CN)'ǖA'9+Њߎ[ROf6(4d^~*Յ DX3VjGsn `( A_qӡKJ2?X#T)ɱ#x=@M<\c'Ϊ70bȻK }`R1X'm`B Ҧ@d Wao 5AzrAz)&(LiS3PJmNvES/nld4ȌB?Fh£t(e`j WJנaN!sRdmHz",0v;C# d^Z/R|Zݐp!ǹR҂;/8?oYe3YԴe`ұt:)k;3y7G#$xxWՑ鄌MȦPWd!G[xQ1##Qhb,uO ёss6b/~vO\j?@Vo*$4he qF1]QI9VWfxLƫl)r[O6eI-G 孳 xjѴ¬i7!`ְwbw 05CٳwAvwL57(+yw"P~G ae0~q1 ]SU pTV{IeFtRWϱ}:4;c)VHO 8\ y-KݲQح8YJ]$ʵ1팥6ciTANJ,VH,[ؖ= vrM=OE c*r $%4Ԡ·ͭ{x0#LJ7=TX>d I8)?~)aL6sΚ `rQyjG8,S @wr FOm/1 p=t&yC^Djȷ }3;$>FvQ,(7e$!N1jPN0dr$<,h3FIS/[}~SCҫCg,9M6şؚ:5KKQ;4Z03'meeG揸A-q0l5łHWD{!-FJFIDQQֈ1/@BO5>N<:@4jx~+whSnk ~݈F\c\XNPgeo jboׯ}JV1EiR0&,œ37S& mC ؈ -B߿`D=ZB.[;6AĬ_~_Asֳ<aCe8zOF- =-eHc=ImuWUI6D ivpjm#h:~'0v4.*5SO^^{{|]\pTCВ_YL|3D.:1b̟ʫ,P[7ϓ'`YJ-z tK0CfAIxrqCt!YnpS3$Rpq;a`@pH k ig@4'Ya IfCEQ5d Rs r;^!d(|ʇjtR&½|!0Ku7f=o1=yua*c7m1+MR/QH16rYU ,Z{da:3Tguqa{Z /,Yvg摡IKXqqP6c㻻y7@C3Y[.#de$L{gDȔ\'3&ҙAXu΀hbNsB4x˒zp"0]ݒy YߡX!WzcrC@P4T˥'C >x?E.x|ozQRn,B:YK~܁"H ˢۈbiRy馿3(a @ ԅfϝ}~KC𹲈lI,ݽ[~$JrtlinǴa#AE2رН%3-4n~YkkXZ_eT0<{yIstt_ V8x`1 5T7@+҉1E&YgF"0 6s898IP2?aXq~ӭ.`ILބX®.=?fW85% KҼ0&L`U^-[7?Te/;&ol RhD,~#?I0\޾ G/5V^OO FiMV Pŵ]akt}tIi;b!$d}e^NC1"8$"/x7yt>quF|."T}%AsHcrs+}$i#̥d|CʟCرP2EGh[9^8 n\.lX ZIh7]JPW'Bp3JFtFβS2è7f^c gxo֧΁/ 0EPDTǵջ3Fj۹3x1/{Tx8uL<ΊE@ebON@lCCBV'ߤ FVa=?hrǜZy<Fhzg^Dܝ ȁPPΝNmW>٨^#:4qowY4#j8 >7bAչhso}giB4Ύ],+}0tqܓ+{;,>M717E?DkA/BU EgaxА05\8վK*x&엟]ka,2}~ g ~&bϢ"Q׳'f(%ړH7v~][Qdi @*xIN( 1uS+ܘQPDWMh- (7jswyt|( /D1?R #* "oa(dg]1ЇSa#F=lmCl(5x|ӎ؈R\{L>Ԕa" ~e0Aև\δ)Bfn$147  Y5 m*ڑ9[&8+2<X-%X㢴`_ݩ!39S옻Ƀα_10b Fbcz 6_Z}>ygDVɨq@H#kbn8xFS]8|,*NֺE`-qܲ*8r7! ̆ 79R9:,:{εʐC^{dkh}q7v8Yh= TrSp39/DUzKE"w>P:JT!Ql" 4U[R@I8qN (@i>2~"\^w-U0=(9$apN @XR ?%m ]M@&kEYSJWG(:]o@<@xEz 9'}4ϟ tR*)MsS\0Mx/^ rxP.£eQ枈YqdqL\Qp)|cQ. (oӏL$_4UQ-B^HP@ 8 òo\QΧPxbv#@l48MŬav55/մqLd9ebڬ]n fEEJKF oln@6#x3wV!e2{!"6F^$F@ M&Pc>.x?c7^K$&J:8YqjǕ7&[O-3n0(Ʊ-ʫ`4as8ֳtMht4 q@`a#9U}bKW̪?QcVqt 4 X&SOll6o%˓EU&E&$񿩁~\ _s`½8 Khzg/VMDz%#[ޒܢl| lKTJx.d#c~#O)j }gi˻O5>:É+?UB:j?~f?3]ҵI] 4i1 *!jļ,<-ul@`X#J}D* 0DBTqK\r|D>"p!5t˭uWT B~nd~^"Ni0H͌#+HYr؃ d {" tiSsp`533km@L+qU2l$;$-Ws0#])9&n rW޳]W6~"Ь`}v {Ie3cl72}^a'. ;'QŧI@Y|c `,EsX8pF;cT|&oe`P^r*vݠ*y6Lqe WGEN6xq8s`0Py=ܜ -p&0KHgc@K섃oF`7CpA"qc<ץ h= mf}1CR4Ĥ\p(;w.wܳZ43 Դc)-0'=؍2[VrbȞrƙ3[ VP9aC X`K$8/1_,Q$@ -`н{]ɴLoF>K] |rW t.uophnWjfBW}@z=*C$͍3pgRÞ= r:.n7%#d_ Np-Ѹ۰ V3&T/#w2B Һxpc?'S6:嘋y-ߜD0!Z4.($2*4p(/Cvb`ѩiQ4&!|8PAdr.[8˧.؇.@w_/DލC1۪%,QQ, CBC7^v:RHad1}NI1$QC!<-#ہ*E .`Hz<' j>5#Ow߉n<蔚ohi-^_ugw~<@oBbF}- 5>Ö{i/ψ`%(vc:FdPlj}NJ_@}a 溗8<=O ]P} W@g9ޘ ||dT~u̬H[O@WB\Un_&$j$' 5J>̵v,V5?]X?pyӯ)5}ܙ# 7|J:2NCWEXFƓmW'F‹yMX9u;ӽz$fЌMvVѽӛ(؝coen5tS.`45:)Tg.oفtx#f5G;{L~#Yo`!K8/py}b'@tu6l&rIX L[&iey.N'V$hMpS.HudXrCUñ& &rKFӛ#M{$fxq\&, /-u`AY0>6}uV^;Uor^S g"cz'߶y>$V磭}pƺSx>">wdw_ 6+!>$-CJ{qPtǏblVcp6?Qko计jppBlSe7T91E_E2BNB-SMh2Xb'Dg}lk\N.[D|-MU8kNYFcxT=:Z?j̯ QNO>i!1'a*G7(Pz%K@TWk`HwD_+Ngunz;-S.o۵K{mKE+S^E)I]C@tl$iK3 u*rԱCy.*ДHl4~0?ZA&m C+ ]LSaėp'-}YsnLo ;M塔G^5; p#1Y = yÀw-0~.](c]>|n 8C׮vH =PmrudQX8٥aMsʹ;"^(_A~9E@D?f5ډqҤ6(@-&8̯}1u \kpN@,JQge_Ch+/gs澵&`5>xnagg-+9M:]b(%Ekk[pW0>o~,$0[-9&O  8<: CC:u=:*mIo( !'pBfmr)nUaxnJ:uGv]j eNIMneh?m[Dy(>uNaZ72cڎ62eCo߬\kEƌQ=ڽ4&fϳxkzg7a{~\measjJDvӻG0 _*VCG~XcRSįx)6h3vxNtoCvmb~i{X߾:M7'cx^_>0ZVl\\@={^Mz*I3T?no쀷 RU/KFGc5]2LSX&LȎNh?Ŕ;Nj$lUCpש=ybMP7iZ:~N4cjR*F/48er%6vg7reML`=( &^ybj1/a612fu.J`j }ZgcSNޝH^w$Nm ԫDgnL͐@ e0Q\ +%5q \Tކ29\>ڢbz*R~=J(h:f(^!V8'/6RZ83U f=Qu "TZH$FTp-{%D!1#h_NNJ979aTL7䗅>AZR]RbQJa`bYLa | f^g]Cƨ5ῧ[%+v~9Bt*t_$LDjiT.&k؜Ļ?,#Vp[^~LIҳ,FX[d\'D >e5r#zbhxES0bڗ=<ϝEkL͓7ݸtP#]{aAċ,?=t~ߒ_#Ka %.A,n@<`f Ɏ"<?+Xc&JEG; )|Ow)) !aIgOo!8fβ'W zjAn*fдiL!\NÙXsJJR)f~t:j9X*ae,Ò_e4~fu[g\:?!gہ`SpU_&mHw5u.xf{8[Yzo“ @WF8R7􍬻sZrV堬,:=sP3 /z,7&n-[MSwHe. 6o^mf)7x @PȀvӤ[az^Km^; -6)<F?[.`zz7&{ Ujrjb K ҁG c %V?0.jGE2Y%MOݏ jRg u ?\aUooL?.9J?@ ,Xފ7Df'=MG@Zq#f/%6F\6qW[qBy 77VxVBrB3FzIדt &bq̮tVw;J/X2`\K#Ioz^}Qvl"$(` W=L+PcpN)a Ȕo>!\"7D&'؛šZPAZYѹ>t_l/9 0AE{d-@v3S(ab҇S߯a|굿Bv1׾}# #<\MY]wʚ:3vnOREAJ+4Mw=M bF&ielh-UyؕuIԩH![)@JMywPuy8/Ghݽj 6k w*W%cat-Ac0MAU$eru&C9#TO.=ÇG(K .{Dz1G=@^=r-D9Zi!~[3-[ɪ L[2=fQ 1 ɕ V3@1>yl=b豮~&okyIM6kKj &,#D֫_a±ܧ)ȇb3|T #-լ(3 lA GnW~F? HV8oXAmӨ:4@DŽHpEt(f1et6b07ع)J[J s#**q~rY-]׏c:d"-P)Iob,.^Ϧހ B;JсT(p9囀R-c`@ñ,~ 1,ӛ3N4G26ZlK3NPQ烠$D̪gZPBVCJ>6%n%8^JNCA?32MAO} RP3ӯ(m_4mO2Ept}w"O*`USMl*vaCq'Gz*hqq\Ǫw(F;zlgPڟ<ތ+[?Zh='m?G'#N N@m]>0АyKrB;,= \KWuЮpGV.וQsT1m'$`~``o yXJa|=h@}i94y”LĦHuPF&93DZ}l w+L\R&]iG8^ OfHm$H:\".]8 7~:owts>e} ap/^˅C"ysqegiŃՓcGZF1OI/d?XWȊM`B\MØf !kT'CtTV&>qBg vwW #ڈ҄˂[e=|u+NţT*@me ~}j,aVjp*?8c͠A˸0 Q슐o7vb";1u64E%_s9;Rj+ҍ-t.Q`zX2B 46(/)Y؂5EV!{֓=]OQuR7o1Djd(9\n\;k+M>/ޗ52$0/RgHꁓE+ dk_8l=vZL/ ̠;˳[oᏥJ Kc/7U8>%b΅}c8Rm !>6H'8PĦL/:ghA &xq12n??|^483gAio% /B#j5ƤLqqzmaFb&Ea2lIxir*؍`#5Fh 1e;.EN~4E@p2dד\Bfۊcn:tDr,^;;3Ǧ)T|( s۞% 1n0~^ `:,&+f*OhЂ{w4ZnסX"3 P0R[O*8տAB/`&5 h wJ8g@H \.nK\kbcy(nQOS_5#@{q<~.~>7畖+Aie?q4AYw6n1Ť\W܋"y_P^wXOt|TwM̴T .e-kSA\,^{D'G MC;X8y7fgҊLbb.Yܬ:m$Kʦ[Djns,Sa_0\u8^6lEȨgs쳸8xG5 Z_&t׷&V%Q48m^OɸFz32F_koܤE^҄wmt)MX.`s+Q ^b1^Q$/SJf==}txZkъ2kZ>#bXakg,Z[0 7&A~h]6S)[`_o ΉGu>,2y_2bZTˀ Iat1or$Iu%ZrTF,O);'^Pxbf:<&,PsyдH) pF P ҠUNK6e%! q  QXOkI9H[_UM&uzaD{k[3DPy3uV밡 {el,f&4vNB b~֊B.n#IWW 3 S޽Kg/RF} =K-h1&&k[VV}lK=MDyGOp'7G^;«NGx,e<}7qBc>^}NjK^yQ_9صعn*(/hOIW}ڮp^NC }ԝukNd>I0i՚j.7dDy>9 ,>>X ĺw 9ɤ'2R?Vfxдb1CRg#w@UBa05H64U55,ჺcw!wդ חS)=V@=^!h։ͣ`F61L8HMg" R=OJ%w2\4l|㘇'L+BPp]>B;w//@!*T-"m;xf\ҿZm#nOgjd4{c(Xq Z ]Y~x% wrL3YGR ËyηWVȉ*bNo],'G$)M n-y 6LYv'_/ [K+y !L҆rAgj*{㱡1ٗRK$owo1VB'c!R]%\d&vy  > bB@+#@j]AbX݋q!d m/Dk3| ewtG" %d-$M~AKȵ$[:r̽S颰dz3yD\=}@v|~#jw[*ԙ#S%$w=xD{3j2n)r 2t/˿ShqP>G@C7I4@#1* 9s|M\&Yãld(Wv0}G->" =C2C zO4U&*Gxc%)l%|- c8'1j>Cَ}_ؐpA\ty"\lƲ8a5\.``i^ MqܰFqݽsesi>P >ԺB l]+uhO Ć-GQu"e* xBU pFW)y} 0 0OEMgYѦa'?B#-hhm-!`aAWX8n^I>Ϭ|}+fDkZRvY"IC6BƬx94+:!c"V#}P},!R|RaۑK,sOBب3Wax8:3$"\7^.N {^V36g[/ӋХPR30i*hO'ICTh 5(zbXk{zԍTC'*1+?qH ~N6B&=~/':6ttU@}3'4|>N}ǷN WK(;co6K"U$US=?cuw"*k~P41f`uԚq٫ 'Q<}|[UX5+3KSAcq{.gUۋBаXٹEXeXKgـ&c66nj51VcBz#}"; f9 |gjKrsnBPeQYv’?ݳ.' Fo5a-TD}HF/lô|K /n0j:/ػ$`ybw#L7d5-hҿam@2u:6Rsl}.ё`si~ƹɖ tzyv`[`>3҅YfA,%Tcw:%LvzT7<v+U|nHkvLU6+1Y7YywgH> RWM(˪kyZZOo=&EU)괿5w>RymZ]o| ƻR_SF=iˤbOTޒEga(?q[b0W+SvD[XoK1P! *ܥOX֍lPVa!:k~ZtDwcf&:>De+kv+*x>S*]8']6|)lgאbxFE 5[2$\(xw6 m+߄$(zG+:>@Nk`a l9WTG2j*l7ֈ/q P|"h3.hX N5,FVF;^)^%zyW/ h6ج_J\8PS_w=X!sQRv{&nV|3F BT΍h2u.@Q^6e٨U(52۾O1UD@<ߩ \ `IK]?f,Q 1 |`*_ qQKY\V?de4]Tc ADǦߘ%hvhdȪc[|]* o} j*pz@B YD}8JkbB݌J!pr\a= a̰d$?&Nzq`ĭ1B8ܧp8G`8^ -է.ӉO|+=}<[eP \@NO {+/YML᎘ -0[X|@h0XHLPa=*%>X2"a&b[%A{xrj}cvC')A# JvA]>n$PoI$Tx$.LAћKrK!vkI*sJ@tںJ s5D??Ӏi yrf o( H}l.y(]^!y dPX+ 1fzv4FMue)~7ފQK\ |m&0 i ݯwzBB0-` fIG`ej]ǔoijCNǥ QA{%']Ix.k_$y[{-x?s{b C=Ww H?5O[-8 sF]I5O0IÁ9h*<Ʃk:հh^U@ F)/ Tw׫1P9kS:"~ۻGAu sm2 RՇBEQOš0춱g~F =X$u6 Ayh#'\un6s>-)LNj}Ilp uW[{Ρm4O39СNEgo"jH}2on* Mӷbu509sE8t9^jJ<ڗCxJU*>f SWsy$!Ć(E^vf#MJtõ)sU G[U)O6^Ŵac0o_ed|-̲iyrR; =_idDx%6ou=LO F4j4ib>h>BF9k<s0̂tYVةz?3 1϶ ԶHR9(kv|^)Xy\yZ]#!HSveJĂu9>0"98CECc*MYV/d?礖b4X`y 5PC @lXטo qEiz 5q8iIv)P/tt 5~5%T Pǃ#6F:i7Wf}fo-#yn]knc٥pLa])=?c! JW}'mg꫾yî2aŹ_oI)dH8i#Uzo wz]enc\~w^Ζyy}L EU5bV7ofE,"t;U\t^mOMNAwLZi3&5TE}AIrv(E\P}twS>,GK@~UE%? #Uk&I-_0 .)bèHޱQ`@n3➯ + R}|PVoWLUn$۱1K`K y^&͑1E#`7-"bC<>Dc!lxd 7sCP1oOX/iYֵkPNėmU{8xBٰv3i;$c˃E k8+Ѝti`0w[r!\: SP'Q3hF/꽎@+U|'lB0bJ9 `߷(O^uo{;)ـ}ll 5;Bd@h|!cE*&0F٨5 ajaH2_ Ɲ&c6F5li82$ BrnլhP57}G10{&Hf\G V懲@5;^/*wQL:=}Y'4;޾{os-=OUhJ5Uf؉⇕|>bJ0mU_2 n| ƳЃ҉?b")I$XgX zt<Z--`" {Obsa|2rK!"e Pn4eaqD,9%L?KeLi,ѱݥ|l\Y|zψ i/Q0ͳШVgk\±10mVG.h+k&PW8s8n͓FqfU ߷.}Hߞ049{_35NQ l3}*9(,+%C3fZ8}8nLs64`Qb}(ya4zðjSeqi<}XmY.`rL[=CCgɿh;)v۞FϦyZ8(?8N6`N ʴ"OcRHra*#uȧ#LI9 CIޝ4iA r7bBsFn٭TU6FyA@ZG)<?4k~j_M3!Ml>lP|XP-)g5ҺChf?+9h1F\MX_YU{Sјplk]VJJ[BX̯d,-:ʒ7.]P pu 9[m\A:Kz'G*cl'|9=_uU4"e>̕u{$3qv؅P b rP1ACD3eŲBQ#NL_2𔠙5|juC,QˬZ}s"e'1';K.8JI8_v ye#͚ЩkS2D6;?)d11N&:‹G :E}µDjY?O#̀Ƌl/4 R1$qH ='.[CFa8)Ezu%a+Gw $_K0p}؝V:'Ȥ Q<g)͢}Ec#LeX_=G, o~c}&l1vxS9s-3;6@ҟ4XVPRofk=g[ 5gmf:IZE?iz^,Ji $$S<>渦c*=7*ܿ+&!KhXPf;C6u|p=M)+L1lY=CT8->fwrGtK09'KzE$5M!Et|<oq(O҅V j?dƇhV#ߵ'MٺK!% i -ZU|IssJB (+x^>qv~8{gP[Z*CJ0_= @9~[(BDH0D| >J8gH(bC=n@J`8hⴸ!}&,"( Q:{9m(~B…D}cDKGIVS s𛻨S;KX&^Au@>?tP=p{@3,+SiO?=B7 ʽU} 18.0lA\IOVτZ8˫h9ET]\sKq3;f(4Z7Y~X޲`%/$;򃕠ZacidYQn12 g7*_$;T2OPNyJ"W9 0fJ:UxRjqs>q6S+Er*'-D$1Si?;QDE]>5Di2->{FM:Jsq<+sCL: OlFV_E6H=,O}1UQ$Af 8tqoX`w$%J|o%,Ċ'НSs?JcGnbs;;;&nLמEFrMjw  cD_ t9G%&7wͳ8kֻj03dȦz+ִyS֖ŐI:  _JHI.]1k(VLHu;T%-gPGpoFP{}>S(bir75>N᣼M G7x) iA}'^Dx9^m ڃ[&&*G)\Ct)"RJ8D"0!/ ,NO\IS,дEr. jc8`~W4lc.]I^VەF4 ys!kd~38)JEZw@9H'WKuM= -oQvC uu }TL+uܟDk JIWE;]hF)ğ42< 3hv+vC'd7Ve'8?[rtfݍ@ή;"-uʶ,PкDp@ئig];.ں]`)" worDJ )+ffFhw$|4 }[Rjih t{bM1gh:cw˶ `4;4TlVc= p*w 8qC.D.*m4oXڌg9f*^&⾀aO@Al-N/?©k"zgU Pcf,3QtnM~+*ѥcy ulMODeNRaL5ODԉ#\ˆtCu{&,@v&MeQ0A#d3`Ƣ1 =bܘ-[X)q,G,tJI)\"ƳH&=82<@1a㻩LhY: aUgFVs՘t\-xe? -|E&낉H:i.S&9B*Ҙ]'VxygKՍ֞n-bfGѱin:>> ބofȠv2%[w_CٝFǾj]l^ T{p? ū( ]o |ڒ$8?`qy&r,ÞU cp3CF9X Y=I'9WK@v?˟ٵuw 4Dwʒ`@tw QH3pq؅ f~1j'eylst58WъU)g? E2[mX.hԷ ocǨ_8tvS.52\fpaE3<9&)aJu-ƕ||=чiql, )G+MB8 &uzojYˊ6A0ыxKgf-Mg]^"|^?p1d8e6;4wyKvږx^mQΞ^-`H ;}VxHܵ e`i?|]0iwQ8t*r΃Se[P% =E_W1o&-̧혭QYSgȲ~~8{|.YX'JE_Yv1J2{egiIչ%韡(7^FXsoMBk"`N¸i5yBTh!)5zΟ?H߉+g{#(ySzXǹ+ܿߏm/m[NJ6q\ƞ:n sv%2p1ONX?_aUgsj oȼØS=\2Z07Ā;0wk3ߐ/#L-_]`A(g3~˭!kET@'Ӵ)OJsg\0fn2恁!X<УaVc>5>ӯ"ڌ3w)91?S-f6,(_j⧪/4׹7wRjR"w] /"".0^8:ҙdқ_/t u(Û^;p]01߸8-616PJ7SoHJ@>D0L+BLh2[rC0Yp@~Ě:,<2 3D_Kp6(+>TZ 3{Z~}۵2p s:e"GaC˷c"{5ӦT<=_FLs#S%noUĤ6:'E&Rz KE_+*P8D)= Pi|d/?c|5]@H(:AhwP3 EȝևcF2LyBfD8Ova+84/TL͇.x2C Ck4@^D%S,BM]x>Q֠)/QFb+rI^ <,WGLTa޹5֎CA'r)H*p`E3,*F7v͎<+ur$Ae'or*#mWRxvMӧYWڼ $FO~pI[_Mtޛ /")[~wVْ}a* ӳ܆ޅ4dr҃ޣ\rGQ;s2VnZD}%7R>(<%9X^>7AqjY5?VEoc.0F>Mk2%d; ؂x"jj9c>Yx\"ﮰ(b ze2w;WǞVEܔHͪ4ċ ' f˷pd6s31Tv\waTXθ- r/E3c-_-\p,#1>= 1}|Ms8 QNex&Yջ,p8: "C.LdJݙfsY7̄+Ycm7zS ͽrScQд71\SD`Ϯop,ʰf$Q`fyOJt~(vogNC˚;#\v ) PB;nᝎ2(]R?N(⠄f] =sE>:q/x~+!Vd???>@H=M$oNԢgnO1dQ5^ნm o ;gȹ_wm w-PoE)6}.ܶ-n8dd(ւ.A֛FtW^w׾V)nw4L)[v =<|DKg0t^q]zҷ JOR&LX ծ lkQ^a)W++;qJUh]:eq/@k`37Esj}mpC`zT4+^Ē$?FO3;xP5' E^yK/gWl`s-n56]I_1:QIe ;As+Bym3O/K5|d03Jyf[IaaǴ,MRCrv*ts(ɤo e{ē[SoPD7!dcXuB#~ |/TDbi|]/c ~M '-p~ D~nl|,<ƕ1bpW!?۾>Zjo5|S)sKDSӭI7FvwcI658#02>8b ,;h3zooW+er`EǕeC]cCN#4 g`̱8D7Oe7H1BZ 4O9whDCˆQoj*EvkY.߅})\bk_K}Y y*2S G^Տ\Hz$[Ck^yL %c%)htnPRo絚ϿGUt|'s#"ō7k3ТLjM%% 8nup*dkS,r٠(ro N|rk@ E-ʜcZљHť+K9m+ tLvw{h~<6@[5BLe ^@1@ Fw6`0۩RHB=y=^W-GxMfz٧O$F*!˥/Ư rj*z 3Yܖ$-j2|ϸw[[OxoA-4WM֑S̝Ԃ1w}d `׃!Iae{A+t|OŬ*ys卍X)?}L'X~[{wƳhMJq)װ}R )EU;-rv*RpS~E% qM(ňO XfмkNHyj-9ƅ68 90qUWB0ٝE/tQkVqUWNQAVo2]4xV]mװ2j9 ooσ,ʜpp!#''%ȍ9UYF3;Y ,a;#f^L{vwH K7RC8Dk(3]:uTpy]ǯܲj#1z.@ mˀ7{ ^ E3i84 ~xH#iΐ?D B6k噺5F̕rtCuao: ̦sR߷_P5~c`B˴FO@XowBrI7^\ڢ(|0"U"LF|v8GÒm d Y>e%mN-T22!c+77|sc/q E1&.6 Q"UK}h'rGO|CZ1 ;QSf8p>~G7 tbc5w1Zow]~y\w87DO5.W.\kr%S\5(4N!3o"<⮐mr,Ю?7/']zcŃ  ;0xvڞlv$h͌[?는2S\qb}Gp@!MR 3 >UOҸùw꟤E쀀h$9_#01#YΆpE580xˇOhyyhmlQb! 3@@✞[h+5[?'zz$֡`BzPB5s4[Sww.\2 7 7=fo-uJie,$^jeF?n#ÿG]ӖtĦHD:Me"h6x> b) xZAS&<\uRtt)?=v~iް.ͦ ' ?Lbyb`L˜}/Yhk}gbٮ݄ !|9-U[eMbO j,Oe 4q ^#U,{#l4&; 6 pI7H-_@<) ~_\9m>hdT(@([mhsg${jyGLU O'b{lr>&>kZ+P:r(X[@_rcnXG 32jj7ikyk^:-Щ(51ZaFbr+h<X@DEOV,W0k,eEo9mR 6GkPPX-buT*}F {MP쒱=StnHj^1O^ qgJ%qׯHۙ.1MlXQѸ}eoS2f-5F,yO0q@!I;SBg_ m%aX6ܞqƲPt̿Aĥ}Sxm>7jw;P.2(#„KQ/sH85MoOT X[mޏcϧkׁ?As)ι⢈shf~*^S)Ά%{dn%t=zn*ւ]xZdۛmQXG".m,)Wُ~Y ?sbYȊY Al ZDF}\HR\q XiφKƀȡi)l&F/nc.@Z8xhC3RB)AΜ o"cąRpaa|~}/:طxq-I@`4Ϫ >.z|Mpt>[ Ls8aTFƨw$ۢ0)%d=y{^4P>瓳c)ԺkW¨ M XK^*ci'`BMr@ts&4EI gQZ@< 㛾r?Z}qRCh5CUP4ۑ E_ю9|[;TācŻfŽs/Do$2O .Y݁R}+<fAW1;xq;T7BXu` 2ѭZ h _ݾpe1`ˁ&7*J4Wg< =K:Kf 1u25)Pm>O:>m(pJRSg6Zq!KU{֤X8cdV*G(ʵ8n*#]Z"DŽx^+~ɂweO #tVBS@cbRú#p6܇:¤챤)T1N^~Ϲo|%WDӝF#4\LadhUC|lI0Όdޢf[y){gQ-Y!Z iFV<ӏ5'g?GgnzpM"=NL'%g$cd=OߛkG;Hs_O rBEžV+Ҁ%`+K 9$ X;tS0R`G<09buU\蒥uyZj( <=86}d,V0Hӛy:1|$^:Az'|*~br(wx +qc_Qo?ʇg(>놖,6Ϩ s5i55e#qE_elZyXg i_S 98gc1VesJQ*YGZsS_IHL`cS?K&N_1d_h3ZEyl#C]^d+Mܫ1CsZ ۑpW>nQc/i ER,Iwsf-Wc|;`;LoߎH @ݓojH _7}4G|EJ/ FME7A3;#.sT9-m8^ֺʳHOۛ_~PX6S}Y,yh.6dA(A7szJUW=*-11 i钀FDmbV 87 `hYF B9 }DSǿ,Ub:}@<Uy_ Coƙ WZ0X?LV Hr.tcaamt p5ΰ@Rl2-$flWXS',p>lóy+`u nHO 1` ~1 zH ͖ )Lned070`J) D&!%*g3׼<4:?j]ma(!2L?؃ym$P]Kcޅ}1@TDȉf"5)߬'&([ ==/~pBaA)O|6.E?|F`Y 폵^>|6L!$6,HPFVKo'.Kp$OVR9R"n.w?ӇGߵͫ좺ə悉AМ~ Q`s"Bm2t 0ހzGV j;?`L+e8:Oa!+ ^߫wEEe֭7AN_Og3S*,uc<xڞH.W4jQ|cH?VmĊvdk '_ &VStC§~[ ~;ͮˇz2(8u 5MfP&lo)QvLdANhQ`q j/LЯǨ>\AЁnoҶxvPJ&Bψ4p5 +HJ_V1VH\dz*1/! @m B]l vh JH2O17 2.3, -AhT&s`_Gc G9B^?۟S0XHLyar?zw 6sѬCu@օ(7|L8 8B!FT4znK㌲W, 60{n̨g,̿Mٔ Tv'떡4x|D4A$c?8Vi,o} vsPiTP)!ϦnO:s!|EwEw}S5VaN?0 Ex+kTr!mp +mȝ Wa  BD jd `O7AJm4ҫcYst6``fgE(jG To&wڌKa_0/w޿@~H{jT05ra/KX bC19ɾX$7W=8 0ŇgMĠAS1'%.ep5^4\58a L9ÇhDr9 .Z漉gC1Yg ۟Q[.z4qcܭGB'~ڞ_A"/8<w_- M!m5j32|BrD5`:;݆ΐ@ʯ4k=LdO/d"z('5 ;n-\f($Dc)[^qf,a3J\ދP)?Қ&<.hޱyv$CE łWXxSMAôf-;uxPb1(n'=X!X2_R҄]|?z A>jn=]ԴW&Oo=N)Ām>LNYsqGb_3aw{jޞA8FB]ҹ装` ۷ykf=b¥G_=ؾI܉ݠw~nw`X َ]#=RI-[Pr` /@Cvq<rTD^~@KV8%EԲ@~A79~?ghe~8;CC$If2u T:bTZGȤL9|2%n,d2 [`L,ΫL")jZ\n+GTҕ;0c`;&ĽkJo\mcs}d!tOOWU68k&N|˚ڊ10HNhϟk.pLɭG6ubˁ T̮F77:a+ o5/^^(0MA=_]6J o_G t򡀵oB+LsX mܱavw^jeeXnvxψUMx] ,c/qf Ywdg(ȻdYtW~q_ P;(IqlQ:Xk(ߺѩ &=+ 7m9G.[,޿|?2l 3IDcW~#.05 %tWAA l!3l7fk&9%߭D~ߕTq]܌ɟW.qq`Q!M O x|[m9:^mF)Wa"`}uDl{3 b0ϭc$hߪfsx\x(܋x1!;xbIؔݹ/uZTV`fو )'Ajw?W4ŢmDD*|tOR]}p__ϮcpLS:3&o>g(]7jQ6%׆upw^)ku,y\zmXӂa3/{7(JۑQXč$7P F8-:}/'bL4 A?BkŊ%ZpSZq)ŁϠy[>*<~ =n]\g8g We  }jCX?Ubl݉IeI8͵mwu5t꾀f֨\3= |7r+^Y܎0l/W0;5^/]&Au%W`MMej4΢j܏LtGQ'g| >/Hz0nTm`ocw/P;^+7(6Ǭ,-ϗ^olMOXֿ;|)|.]pw]Lti,kJuwك!;w G'[qc sSk+[7 -eע/|RǕߡ$qO@$ꭇޘE s7idr5@9G[l_f]eܹ 1bS|sX8ɼ5c{A05p"ѝ-@5.] POdᔩOc4(WIh5^cTnS$;pv{wěhp(f`<}i4Ϯ#[ 1"/ӍT0 {? j BJZPMZE]-bىYpq'ktJ i|f`@h@Fj!? bpMcqʤS%Z3P(gU;"@3dhLFaāw ]Ǵ> ً's zd8߼%y&yD壺;/y4_g- c<`LC؝H7Í.Ajpu}Ckẖ$vs9giNᝌM&_01IG8?ϖILqe^`[3[VEgx6ūWcıc4ǜkDT p@Pg8j8r#镶 78pv]x ߆@,:wE ,QDevFFbUhaH@ |U1DSjWDdHTp8$eX7՞9ęDꦘ*M"N0T^,c¾go:_ |Lp=Â#gsI,qX ^ шւb \î(Pt+]1l“ )RrT'3 9'B@& v)fIo\}YZ!_pdi+aZ 66.F2`?L^N"SX? +a[ NTwC1Ԑ+gn<+%U# +6?^_7edk ňiAPM6}'xޚC/}B N>=E^>17 $4r֊)wI&6.':6D+u(}=hgWhe ECai<=şc=`)O[7 ohjra+jIe{=d%(GJc9Nc@D8j`/~3$z\p{gjF79E[U].݇Ր&zT5%Eb R.s>%j#ZQm"h!`rS]K э"rV+øa @][.{A!ZUkڎLyDHfWY}b?udž&<֨ab^zx[̗^ӏ#)zo#v+8@tCM6?->FGy`LBg1zC"eW(3<\ܤϸTŽC'vyçk(c}pP4tAվ4L(o>WN"ZN aՃB3\_iȏFD7/6w5,KHg{!}M4S[iO-gg54b.O@0Y dCa:C8W*]Z3EUg->^UXnl"߫'=ujsp/_F@)cB@7 :@fO2VvTfDw5C+-+erA÷Nri#ƀǒ7фYW>jX9ƛt| h± }  耴2ZTq$^=1KTU@7pP.LǓ0+B#xl5- omْ\ix.CVkBcª\(Fjd%e(ӣxw/gE^PߚR&V]Y&5#paBy9^ kiUZ6ڐ@F+-:OHbyoF~U_"PkYW@3v8n##qQ Y?,1 a-cfNRhݷv{DWؐ Ot!Z1K4 ).ag`m 85:I78/ !6 dX_x"e)͌mbBy'ؠ.`cWʼ*R@~ Ѳ8NQD%Rpuˏ֖f&w'H0k/Mop> Ç:MgXP0:mK+#ٙydLEz?aWcH 'pn8̾>L!*m zşՕN*C$,gWãBpb*!56/Ddh~̋jZ<\Ly|C7 N>[tlL>jfآʙc]S9糣^0͵un1#ޫ [`- u?=н|BECf'R @PMuGo>ߠJ.&x^ッ0- E $ws`g/:;u7%$H7 #nuKo"Rqׇ!k%kTQE|x> њQ@&/_(iNlOtTPVA|:ib@Ȁ eF9ī}x~jcj/:_Cp[sI`̾,D _"7Zwk`ֲRyiJUM}Kco,'%`*`IY1 7=+ZZ <^ /a37Ogh~ୢ={ngڔeߡ+]=_yo#y&P'g9oxsP[.15g=huBCSʋӏ:p*,";d4osRck &J_-UOI(L?:Hg!%v1 Xw{=_ϸI[\&7w)>u=G@#bGe?`;l΂_BbQ/ot,^>k(]^geHT`'"<`˙e5WrcW!k5TCάxd[izMvy*X1_ Lx\ovFϸ?yvG5{fb&6.q<1;OG+ m.m0YPbOZ9!{ ~927'.F2ߔ cw ԕ^ S3mA| IJ%2r<,}'m\ T@0 # 0k\oi._0`7QƏ-0 kf T_\ㅥW`WTIXt 1Y2^^~;(s}.[Qqq |e~{C= tsHՏE S[60_!|G>΀0咂gCN떽kaŻ7V? * |&c}1M`Zk3Uq̦`v3*4lϟ=(.ϴ2$K(@z7 }30 ZYq5}ֈ1VwЎ{6-*- 0S-Fͅ!^1 B3&_qwDg\ήܴy {96wo7m)Xhb@Stxgvrh{]{sKy87̓oq1݀P|[0>Dx&g[rQ؃87ɼC,`QTdNז Ȳˆ+Z%&noQ6 e"SԫAW#L {fq(ަjLKl@v\MMᕹ1QB\+>.컜ePzV\:uHy[Ǧ{/I\. 6,!@ hS):>@1BR_-*AJ84 ΊȠgvyS &ݶH&'L x` (MΉH'qb8Kv7{u$oAw܆4 Vȶw@Z;7eۜ8P̭sJa'^4y%/s" ղ.Ooߺ4wF4螱/}SxౢMU[͏I#g:\'6UDhip#4m2!eKC)2tZ%Cr ׄ1Q:1Sv̵+s+W&lX:Ȣ5t_#OCYJkˣZjtxLesR) Wf)2DmsAN{Mzܬ3託 42lxvrr{~1kRɥ,ztֶ߅5$wBc1@.2tFTE;u{oBkL$C];[t>1c:XhY%YϯҶk/٥u=xEwݠG6?`y2U:@@pXi8_>wܮWizj0Qq4، >KǑ-z,85g6GB=5I\ĖY*Na<}̛[h x{%[Q%ΙԬ1@_Rr $Kj#]uX0YAHu$*w s'%܏,a|ͳ|8@kYe!`UGŠO1W/}1pw`B4lF&cL7.8BǺ:X6s: L.49vuY[G(saNu;HT!< .x%M6ʣφ@tEX||mD0 /D-b7Ÿh; t=vŤK\MrťyRٹ`a7Gn{s#5$,یR0v,sZh7/\tspBH~YMBމleb,E(FDR;ɐ=Ϊ]6s4L$_o \U;gR9 hI *hiU()j뻠Ʈ&5mNEU;ԅh{s0N9Sjt4U@לr%@fIU\ծYe$ƭ8Q.DGLԎ jP,6'P>XWbZbg8twtXXp >lQHnL՟UxX@@\Op&CN\z VeA%-m&ͳ@AxLC3=@*MnU6c@a-GBD1~FF ذ_ ޼Q8Jb,o=DžΌ$L]'/׾퇂=Hmn}8z ; |xv;mx#j_᠀ ~2>1Vr(0*D{zwM |Ho<`m&2߅R0Z}Ha^7Z{xجPZlKΦ'<#kzkhq@ ;.x#x Qe|I,ZO{[\m@uHGƉ^Oy~& {`~vM*=$̌b_\ 3T2pl;'Q+8_PsWh_lay޿BLzo7%ž G"qKJ&p'>?`tˉ:Ǜ#jQ Pȡ/CvT]&UlNdx!S͒)1l68 >##?}*xlG:CbH̎mr/ ^#U\71>,1(m 910`1QK9@hk6ߧ0Jۊ ka=qmq0&?66 (-6v-n7g#4R;׊3MidrR@89IxD{z}X= IG{he`e?o8Md+7Br!gfm;:T{-RNUևj%{ QhxnSnYƩ9':P='j{L=gE#fz En,;e&s s *d7Z~pjp_'vHuҤ͜' 3"]=!F:8,GlВH$gWX?s0RRjҩl5fu~^hMrtQ3y$6jFc~d"ew}GPe}Jd;6vӆa::l ` pA0Vbֱ(j|_|@@ˏ([gθM2JK1]Ԥea"H%sM=65j]C(,~Mcv'9^]ualzk+;k}чN1Lw WZZ= )j6M\vcV-v;&v<\OO'! 6B˦a5AC+G/3Up>l"eܢmY9C8H ,k|w}ᦇ]i|%Û"I-?{Gr/,F t>N^W(;,h;*%]PB~`Tox;0ڂb 6C69Dп{_1#qJ2Ơ L3,f `]1Ь3==4 2^[cZn4.<~~9wb։$fikQN$D{>4,S#0v21DE.q 8|jL8j /uwH8Ԭ/]3HG)W^r@amTϗ l\C( VI藆; #t00aH"'>^9d?y(]h9HKlp53xv_%.-BOx@Qg!XﯖҒk ِ5lv]xpe_Ѯu{~QȠ Oǜcy<8?ͱUdDp$P&Qu@ E<_絆x-vj06@se%}}bm.J&9.cX3Bψ} GjSڳD d}\ubcWĽ+Fa|ڽɋuV:N^0DY5y3W. <1q"D(+o wĜTWH^1u\1AS0D@K65SN`[̒fkFq`"h?Y`=jg bCψH.L>hR+sJEiCe^@xѼzx??AWϙ>Q ڧqh\">Bf 2I1=1q/q<][ Jb ~oF{;To9ƆX\7a^25yQ⫋= 8Yfy`Ppߙ S`29*?nT="/(a"Pb6^;@{Y1ΔQ6r2;x!IB6e[E;8݂x)S,!40|> .Nu)\m|Khg85Pt,N[9*sjqtTR0U0lUmiqt? N@ O`PYRy%0r. 0_>On`ÉX&Β Jv7ӛO$`mH}.TXSB( $d,k6t-)w[Dw^ήqbil*D@49`;+QV τymw-T>Uڎ)n\Km ?2 h˸?Nk he.FA H ;nFY_1&H9/lT엵v:~ 8W-=r\;%{ykc][5=r[ m-};Sq\H"{Ⱥ3%Q`S1Hӎ<=-#;on(5fLԺ]Q!10r~h rp@y!+@ |pe]`f&0E +^!ZHBIlHq 0Ns.3i UÉO Lz(=V݃i_qS5rML^{a,ʍ4m{fAaf`esg=W}% '.FaY#Y`^jxL˵r`8XP ] o{ `NP`~q%oAing3yj.WfL`Z.D||P``Q#ײDАڇ&ߑ+CC^EGdhԗ2$g93EFc,*ɀfa"0M*Se1ZIp`-=2/8E>7M98ҹ~JYъgܘDG͙`WWYyUvPvYW"?;VG%4q?NQjF{/ù:chxrs[-⢕5!x&}L{7\.LYs!~T8}'}GU>{xwiGӓ.>=5לv,}WTA8cf?V9#eqGcyd@x'թKcMk6PzHë6P]('!ŁP"H<${}gC 4ת :T9XpNxӤ0B$ ) ~;UX; xŲ ɨkdEnbbGk4`ڎ뿕`T|Q.6É> VHFcھ;CzŁORv;ōVL7N8w Vo4\qF`?vk;+9G)W;FfD%7r Pp6 qr܏ZlZj?f+ nIu~㡂R(z7Nd Ac{8aA֬,9o 5Q(B<C.UCtU4~~9Z >tIKɰw7GnCDZn k 嗯JoD#SeGE%k?#I٢)~aڔ"zݔ/B-:6[F/XNl Q9[mT`n qӝ?;. 5 :33q8C;;unt^y*L3j^ճub i:yAu&:V O9pQ.$K; EY>h2 lpFYU3 28] jNqccn8l8lOim|q!,U󗨧_@FЁL)/0yq;>2 ;nE7~XxXFua 2}BίD3+q#TTIKG:Yys\[2 oeƓW<(5~,tvڵ(՝3~w?\AJ˷r~Qw-+'+9^%(>t?R9ӗQJe<TxLO("/xޮR5ne5sS-+1Ӆ__uêl 4~CIJKCQ2rRG.E܉B0BZ @1]78უ7ߕp&yZoDAbNB8%ŚpU#C_%rΟwwkOcG }C5g7B;/ɏrȰ|%7 yEFb`ac}ɁU#1{[}":* EWh Z2*OA__(r(lOe|ư0jӹ~6r KzQy&U)us\ǠEà.70p0jKL \jw+6Gk,omKi.F+?;Y]5nkB$>N!ni;E,M 8uSpޛ)&3n,H 1a<+S.XG'ҀX@iBA7|DJK9g*th5,Fφ)}HF aEr9RX;滵#Xb9=%Yw8?hų72_`&i]iiԶh9Tms%(zE9Xx[0Q9m+޳|=MBgݛ%5xԐ^ը/+?ƾ[ n_~Ndf|f!:$l{ <_oV~^|9^x+ NGIGL`쏌u s\O9K-?F9~!q{3l{Ƣm)@0{.ES/1YFCQNP|Mkcq"pF |7QOvsQI?QiM1++f ?HCAg@|42l'T0RG `vL+ّ~WIӠUvo*bVLh^l.@qk{e_՝϶e.in9A6c97< ⛦>߷&*Ql1oBNnThV],Y`6 e1 |Eof][N> {Z1k!3|!H9=ٙ.޼Z'fV|y1 uF[lp tcpfsC⏋jc*Y8 ll6P[} l^\кyFWe_qjW&LS2%&;8h}Y5)/֧*@će<)E6Ʊ9SLdӃj5*olvwq!aK@8k}0Fr:b I~ . .moXbr5) n]Ը^<:lnb:z0CA`xhGR+/|Xq5g`JjD) D7Ek<H) Dq}ycIe%5;}]e{͑[uy{)y[{Zs& 28γ=o#r7y^-?@lx|S4t/P4ܞ2> H:;OB@؃:ݨz|2Eodإ#kEs_<6dZ6ʷ κEnY){Oh׽[ѡF{K,6s:-4C;AgnB9Zݹv0^3:/WidU]/vSDz7윈S֎2;{ꖼj}3u@h}Tv Sw4]jMRKpz '/ z<ޭ3U7nTRd!`%Y *OVNVT 5k9)gE-WCF\@k(.c|FnZĄǞ{u"Gk/1"$Xաӿ wjP^dc|c|@L7T]]hF7=pK[c5kع6FIU8\C~o_|2aP]@LK eMnwo{[3޺0 ~K$K+bq;1aR2x1繨jĚ:Ϭj}g<"`:],@ވBCՏT s^ ]ٕ> qgO'?P݉Z"Am(jha/zT\Tv_0˨;%hX93n|~ ʞρRvX[}L\#zn-{DF Vz_}KƍV=/g(waEFUh)痸Pͬ{Fnkکz1.WšQ'X&5 $Q_żg?I:'S9GESg~ 1,P_\!D{29lɈlREO+;ײ%1KUgNX#vEO_1 gWEۈ(GY*4aҔ?-#ٖQ~INېqc9>vZ#FE4RZV쒉7@9h73^i5NϗXe*;uT94;E9أ2ziy . 'Mƶ꒿UjpFO&,kI\CooA伧;{{iɂ)2gbV3!Ox SCac# ۨmaBP&{-`=\ԠS'TF?$e1WSi\@f&|F"ef Oá)5U 7>"4eɯvX#4UĶt(p}̷DXFt:UrF 288vTCd*:8җ ߏH+0{˔M3Һx}a;8d^_}9.򴏃JkPcj-ju60WM-wLjEjH\u5qRNw,>-.-E /{umHFTB>d3 {EWVԋqBNJfF,_%mDIZ+6WJ{HwXLgy7zlGK= ~6mb/ٷr<JؑAPMCMc9s@90&m/zbEg]wc}\Ȗ3>eQ8(F_<~m8G5 08b[`=~ .FJ²fd=?C:.N<~#$%Hߜ.|iq{F,uii.q#򼨩bY:Rn J;h;8C~ׅu'&(L:/Ҵe .٭b }U[o3\|j绖69цU%h }ɬCxk;B$F8볉N'Ȟ\+u9ݞ֯]p|{;dv׻WmG57)fJdg4!ݏߢ:TEqVѸD0r,붷5=== 8O5Uh1ϒu*D)Wrkn8c{wH8=V)rKЂ팂R#t AqON` &._ ֤̣aK|ut<|exʁ2" w^°0$K =Xc^;@q@J8yml9W%X~s2Hh:/"k4 -fU˯rʚ-ԟ[eI*%QŗiVjs٩zG5?W"0<3)7r 3Q=/! _ex CN'?mΖ2K<|Ra:?fn 7ǶQju&̺)%B̝=\g&#_ؐa*RNK/"ʴK}+KS0wE*>TKZ`ql"L°hzԕri^cY~'{b3M>1 ,v6 Ue8YAP`ɷAI^*$`˲qh었 NcH~~Stp`(6R.cކw;,])O!q,D. C⸽hRqx8a[xg82{MZ[f՛?:a٦W jL geH7V3nmU#c M?>,(é˳"0KCݰrqs TffNqMow>?CJC)NBV2~cZɲ<e|^e"XWy &0͉UT@c7m{xYU;d݁fUJa]h{, PwM_m{|?[FtK #=m^QA &2&>GVpyG.'rS/XTH[| $&:ݵ"AߊhŒ/ܧv]Y!q (,'cvɤ~3$` ,xIg@34P-+#ҫwaO5v f+Sp]H>TG٭i׶U[?9X'D53Pyc so1x㑚 rc.;t.mokX_ޟI}:΀AZO~g2۵ݥLOI`L!=h0 t@d''4J*^6zzX`Xbr@nIzAڴjwX ݵpUh>rk{z֏.c$mᱼt#>Wˌ1vbGtqh $}ƚwᄁ7 wѲ kG[bsj 1IE2[Rƹ+# JU/{KR+'DjnJch(b 6mo\d ɶW8 (H!Buy\$D1t:l #@GE>q̈rw;Y (B=5OS;rbG*9v8? 5O \H=ܥ^y#1z3(@V'A7Z0BCN5苝 /UZHdA3!68hPFHC3mɮ]&miYَ\׭3d`Oɭ=``X0C7{fGl쫙ۜѰ,ѽ#=3 O~n>+z2E8juKufF7Ϡ^O뭀K^2NizuӄnTD緢T, ABb \Bed1@j"ޥY!+O?iPr1'$||Ā@ JX ^cuFIM<7E rѰo9EI':=MQùژ^;I,QccOE^g6@sYŪaL[vj?l82j0-ў$cJlEk B _D6!xPf.Zє[?MaGoł)<+Ēʺ:^[2OAM3)Cǎ:O=jvl,B5_LږmnQߊ›=QC/kΧ(ͻXJmX(h9S=7o DC)pXL;&{p卄o`ʼned ǟ%/?eLՒРG !/۱`{Lݻ LC CɇH̦d{w_?}80q^^$l.8ANA-$l*|$ >b3(C -͗=v\A(\fv,i old:=1 Ѽ?GIOkX ^ f| t2CZ -Ҁ.ȟ32yR }2;O2N<Ds~6c:Sɂ]mVhQ5aWXzթsqH/ߴR~UX_=i+-%Jܥjts-R 1Q )!|qP%ņϓbDX|1XuhY&,#E^Y-X?P >?#$fG ]HP!]NJQPGf3ft$Ō3 t }rq4<肗Wdش+"7paܞexvVcyHyΩ6Sas~P IW¹य़ 8l_L#ąސXZ %؀Qo/miP8rNf5229Wh*x/TE*1cV箻~mЗYnգYFl0 YVk^l8vl|kimm ֳk>٢đ%no*z EomŽigOv.&Vlig܎h2E`C-gx;Ե]ɤ1}<\_Ⱥ?|6fiC2~n89z|C{R=m_اpj?DqlZiY͊ K`hXGY/?`~0&)~8JmLa)P9f\dX&9IW҄pO>N^Z-,'n+hN w0wdphCb|S$k~uJN,>q^0~p>x;{o^ǒ!GGZ rRFx2\C}:zdGEkRPQƬe_̨ f_2Z9OQnٯBWH(^R7#)T`1 ?2//Q_}c޼I>)6ur)vȵ[+WiyӲT_4L20aQW+$yv|#w:xin p(PV+]=Y&n$ []@EA(Lퟸpgps5tI_`AEh]_K(nu5m"OW윤$6ihSjB]fĶrΞJh4O#oS{tbdӥɻӻ"7Q:#D?m)U(l|~EVP(^ ." 98JRZ"2VPaV(=s>fCf[8)[8J= iKEة*9CHCcz f"P֣tP<O(c ˘ك1"zRg y0StXX&^G(./=陊"| <H_{H]VH`XE@Eb `Sl2M@K>Ⱦ*nbv6lsS=Q Yt 5k_ ],eݳ#gy?XLoֿ>"#nԁQ_~qh>$nCl\aS? Z Aћo̘-46hRy7=<~j0Ofф?:~Pp5+hua|.=gN NnS)ZHYmdY6nu;O!b$v_S+ztU]G.<, lu&E2?8Tx?cIUr[i[. 獋b%m`LJ uOYmH y'3_RҰV44z GK1T1df0]$ﻜH@n>kgֿ#[ѐ?QlQkԺSBVȭLH{, :#:[iлBBPB䨊71^9ڤ!z>fO"kC T~ߪl,km=Z[qroFEA:l@UrG=/0D1GViϋH5q@CX1:1pW U$ 4>=ւB`\͜>rə, V}ISgYv&En7fe*GHݑB:˺ʨ;Oj0Cr#^2:b]NWGm\,1N^7v#!TجOˑ#@o+ ie~6UZYwLwXG>@_rqzQ/AZ~,9C|$]Xly`t[ww9]3` :u(}+)>Ec&ilS]pG]7z5ڛFLRhlUmԿG)FoG۬?1-ʽW22Ftd/7I7-yɾmCm}:l,,ӝ^;bW3qγ ԙI,>]~Sý#k/ds.| "<#;EUn%];|V B.:{@e(eprޟK1;M,C4gJ=; ǔx:{|Ibopfx7wKի]VaʠV㹇ݒr93qf[l ;:&OZeՂoO"cXڝCY66x1R\iƏdg ~trĤ-0:!TȰV8! !Cn~gs|>F4Mƅ^clɏZi CӅd5<8ab!ް)bY|T(60R1x{G:/߅#237^8le7wmmtFf9S蝰siMNsvJ}Ew .XpP[K?^orvr\f :a[ )t]t|=\;( t};k.}&{* t=AQO,x[-J#\PBK|r My;˽eM2\{2h O+rrɦ3W]x;Ƈ@T"3bC0iWV@_>1JWx*8xOih'Iݝ2}&Cs<բ[ŏ5J|e=rL#IyK K~#dAČI#:7`fyQ`9Qs`aTd`/Y)Hl v`36yz+*%3/4z5PF |GG[ Z{rXN* O壡p"a%D V. lf;_J:y72/EQȬl,2 Ghw]mđaQ.@m2 Fgʢoٺc@psL?9߱{*i Ck2\Oa$Y҈;O81ԃ 5DX7nwtxLn%@c$qݷE9j T%Pu-8aX_2R{zLUV7`GW~~D߿xNzcprh~>%KN>ka  u^ ?VjQ0cs7<ӡ(e;6(7!n?0gwDLc \l^Ale PHF=Q@#}.[nY.-Xǿ$Bv0bw™#< QG补o}3FFm1e3d̕lxyKӴ&ק\gV@d&"4V{?2_׌:~˱ڕ Qt7"O|&h"7@~n~.spA-9,XY"E:i.lͽV 쪬M7R&+Z_#Тq(x@Rx׈#}PlhKcMI06FuYp>H{\:¶}GBյ)@eVmR%U@ QgeXxkLxQ/ydr_&@悺(Y a K;Z4^޹UYpGH7?k]M˪-R<뻚SsVy2Ȕҙb(&.sڢ}N@4woY3Gb2å~I(x׈'mdq#ȾޗEk ?'BEcF7efcP-g;'f}|Lǻ4N^v0En8g_t72wd"ZAr\jfo 95ջN.3nv#YJj~M[[vzѡL`GHAZ"BVs I񜉳0 S1ll Y ~yN0}煛yz)_عR炔WJS>'Z[ٺg Fh^7d[1,cK_X`FYg3߬x.,s[Ƈgz.}{#]aL{[ʼn~+2`\@Z`mCn! BDh˵88x,Gѡ?,Vb^C3`CFV ^)BVoF1e%Lz9qT*m Zu[l56E2vXTV KiYQ2_]PMz6h-jga' &Df\Dn)֬bv0{kG< /bGZ ׈9* ˸ P``XWL*ˎ/jˮm<],4z{$O׼E/jg~wkFvy'=Iݠ%\ 8ɱ%$+_+C-Z,(p~(yX;z f Q|A|u䒯~zBd=>_{e i,K{% #Im;0G;f]T4ܐ.SBm;K"TdN\0##&HaLxM|q zxvq@[6"lbYWl5z=s4eBF9@z&4[e%K$"H"hShOrC`w=];H[za9r2NbYĂAezG#x KIM+S:M(AWFѤ璼8El=%"ܬ3A@"9(\Ţ:ܳjdr3EUvK8W ->ȺOA4=Odf3CI㫿JFu1TKsMv=G"QT0.)k)Ր G#8|(SNȪKC2ZW2 oG:zsg&4xL̋OPp__#1FZ7PlWL"M|.(@ g9@4y Zf󒘠_1 5Ù1nd|"JLe !,YVm#c'm s$CCN|/#ޒiY0GLG9~E2yYM;]`Il!^8X1] J^%anwDwzg2}j.Hy!;V#3DS@2G<OGГj<\\sX5n,6.7i_oPprxM΅J&?>a>ܚ?8,:fwzVO+KTnag'Zdmn2pyIV78djgk8}y_.IC|f=wd x3\+\7jZ !Fhy.5? Aj.Ov:1v-{/ d2;g,}zj-o]@v$=w^AT~kNzw${{2)4w5`q)4xbn'mv?c: K-nOi~5DZ4kKyr;[=@C89k;7$vpR?}Z|6HT,$׷UhlIH`^II]rtx]E"ODx8k W%=2]+ Y '1y݄S4YZI3GwO˓VQ(Qϖ}]z4XaQ0%dr7CuG,9]|KӁol%|0?іڎs$2La|BٸfA_D^oF`ZvHCNSE%B!`# B+4贿4љC-=[=.гFvolƩORs؊R١[er#X!O7Vh~y]Bka A &Ìb>{ϔ$tH&YDU:ϸ;`ڙ_C~|ɀgj_-y&"S_6 !1Mw4 DosZe×o%ڎeS<ݞ)rCrͬ)ukUגa\`2n0ʑɩ0@x%)]mOl9`bS g $;z, y9);O?S/J9pw1#q&H#@˔{<5WMj4v*!"JE*nJ& 8,E3A ͏ߝorCDp0Z z $ [\]3>)/ 1WEEESh swx-DGt}ziFFx/_c8k;KOgYGӳ|rbM5ioͼX/+?bUx;<θ`3l5b5LTC{ѲośxZ_^ *τxC~GMJA Qm |5? հu'2?; וfHc{ 69*mK\jB& A`'מ,—}I93Q WmÝ*{.a2s48܉xwVZ`2=E|Vca%Ղ d<]e'oMw!AL#+Lu>2cL@B3] `I!Yd㎗X8a6.Lt/綍{>`\3t ~E`jEfk"|r_(@_mNz4@u7>-93&XԪ.lzSʻ@{Q&=厷I 8VWYz '" 9cClX^ 6T; 8߷V-V ߣVįc2!Ax$l/Τ|fӟ0AM{-9jyn4B9Z(ef YÒ ({︂2Mh[''tCTӐ_ -Ԭ|*')\X A+31H]Ja*u]շK/>|a20Ok\qѹ2k4!1?LB}H<ى@ίP2\zjTvf v5H bJVGCިT'?  ь?>P/c0|pѤ `QG%QIgjGEP~/ ;}j&tSVT$푡u< WRJBئ޻8_}ReqWAHĈ)*qJy#/\^ld>X:("hZ*Ȼ-oZy7uw.LCz}~Bg=y_.k*[z Ľ-\#OZ:QlS:SӶus%-Gj:E<DĊZEmנ*݃̔-j^ }zpVui`l ȥΊ✵ TzQ궯jY='{m@V0@{Uob7ZSIҰ_Jop~5oJZw~O,.N~$}A>0I, HurFTjc6)iKt.We|<=h`‹&3-)SW>< #]5NIMi(v\O τe2uQJzHg{n&?pan0m_l)kt?tt&mmu6:uIhgFܭo{j4ZKSr{S~kV1[&YzZHqnoRd/* uʾ7&)8 ~uUǡOpZ6i6P b|/C~"] %Ǝ ..*^ & tu竃t6K]rY@Q+G^P^`1GYSf ܮ 2..]zMw{Ì̬$]]ΡoyRЌr:zJ)3D8A]NFߜ8J$٣/WOb6%;"ک]wG#F؟<A/y>a~U0P(y +UgtjvhDCb|Mts9/-_< ԒRTuP*{ Ӌ¾(#f0T{QL~Xx +d\+ԙx9[$p<L]5Sk.*ci+5ʒ>*ղAۆ0޺ x/BP +o5HP3 -cjwW$ R6# U >{[0{RA]\FE~ \ K)J3u}8M`{$xgsݫRR&FVˡ|qP+qz%+7#",Q_ ao}C3r )?ZkX>?br ;Fwz(u z?GӐ TI \\w@Tg,zAn J<˲Ȋ9l#s cF&19{SvW%c27<|FP<1y[@y0^)5/%?7gהbd 9Cbmj;4cX\GD]wۥUe3Ƈ=y?݋h~]qYlHFI72 [SfdW3ٷ֯;@g+L!o'y8t z3EZ.?[Ye>*۸lAx=Vg۠q\aoyݲ\VECNz۱yDuZy"ҏ P3A=4_xrV *p`{4) Xd~5;auG@9}?|lsT$x)=D\y4^hRT_ f5Ѝo.(PM{q p*XftEN8dhbA 78պgB˓G.$f}qXpƎ&.2E"c(b^-G|ỌXSDk3֓\c,F=0{Vy^/BWoCU0#|<)4C?]@JoydJjGrn\ p5 ff/ S{ȫӣ 66824׺pcn+\g/L=lkJT>Yz,tO79C#%rj綤ZL68 2^~[(c+( C!Z9y4#HOސ+oq9$*'3(%EL 4l/m ݃m,-/Cc~OJhX;5_vr4/B6·Umh.CakYMEQm3B|[1Pw/9>h;?.˱9Nl3f%[Cwк-b"r<kvUmzyV6Z ,VH D/W)xEUȺVҥ_ ɬ v J/,zH)6w'Y:0JI4\N%B>]fa G %r'(^k_P0dH"o1.*o f*q^$A,O_xL˿Q<^K .G^t@S;b.7ׅQ+SZv˅W&-C KʥwgLN&>_[>o眝%Z=aX j2$_9K ! e?A{{Y$5Kf^>A]q!ƘyGVN*/j{;p}n`D-`lg% q@m27,.|ZGW8ԍF>Ճn|؝S]9go OÄdS?en6Ql&iJߙ¸#vO뵌i&ma쳽όDm%VZ%yʨaxL%v*4+DS +x;7V1EWdj'qu2ydҗRT@쵎|)}\j3]c_y\iWD\kIkWIg 7M]B`A|W1wMnGa0x} DҎ?;_/v0$ o"kjug7iJi_hBxʯ: #"fUpa!K'GR}&OGjfh*8 fRyx0"yP$zZYL |24$@xu*DU`N|\oAU2OQ9溩+Я?%CNL7%(CżՇΙ(4?HX5 By. mt6ϣ!W@S.?f4*)3L M(PDE/p OƲm_Xė$A`㍚c%[eK"8, bbCO{6B35~U")bZ5BtZ˟{r|]UDxxƻuxh3GYitLuo;p{P9\eMVqPVǖ< n;\C)ðyxV“EyT9ݰ|5ڙJP!K<;[$.(ʲo=-B%ϵɿMt ^,p^tW6D^?yEuEg3 d6W6ↂ~H.J$.MP4_ b湣*fG;-oe&Dm9U{LDDiw=@G<>S*G}~*~5w Q΄vuNBANjuWSiπILY3뚧fgY.H`+u5MG 0Fzѯ}؞.X[LJt JZ uLF5Wۿ%a& ]*0a`?ߤ)n)Ϙ%CRʆ-̆[^EBi@UpJkC<2ؙt }4k54r<$3>dߜ`1f(Fӝ䦎LL = O3E&io8 DbIhAyj7z=vJ|f1Ǭc}hlΙ㻐n6 r%wgw[лkWlٺřW.W'"} PF{ŵ ^#؃CCB!#oGbE)Q|AUb :+Z/z6'q4THf%~іPjt!`y{2W~Fw,L.HqFݼ5-딽^~yl/^lN 222yC1*Z41Q]p59qX$\E`і&!sݩ?3+\1WS_V9\OF R9nϘH@Wч'KUP阈E@/:g1B x@szY|JKr?<'~5;+P=@_-åٍ[ ;Mi2\-`%HwԮuPi!;r̋f[WOx~k}.ɄF8+'HGFMe lڼEm@Y*S`,;əT9_# _#=\B1債Z_"qc8r`ݏeczuZiQ u"|XV65EHQ;"GՒ6:kF hC{Kk}ȹ\٠54ri^# dfl$ 2qFar~u}ٛ?^AHf )]11SP+E;n8{ݷʵ1׭ 7un^ lz;ɕV W4&=ƣcY|{Paq2h]pL]B-$^G NuJTC-}ֿGPO:8?IfZwG;_#֐(@KkR`-Ogo/'jڽ8M~Y,e6#l;;)&2k2^MV/jW뿱D X[.HkҔȸ {\Si0~\VEɘ B1$[1$6 |\XF ӳL۷_gx{' ɍߨmN@dF"ZzY^a:Z od0{\%k!ϳe*OC} 6G/\S?K3XB +16A.9-ҁ"_tEj9 ƝxBAQj؏C)!%:|R#ű٧,!uɌC،nUFvg @犋A|NjsvUc@zSp@<,0~ik:DgJqMjbgcN Ac߼ab*gC|>fJJtPJ{G- SMBJ3tj!ůjC8mIwƇ^5e$5f7)~G(5%w^'!ו%R_YLΎ7Dׇ /JKR+pe}2٘z$:ZsQۍ kJ3 .b.əsTSWz..%+q $* =ˌ0Aw9E9eu)YQ 1QP)Adޔz烓_*R9蹌dC0}mړ0}3U^3U/[:?UѥLY%Sq'E;ezUyuQrcMs[5͙4sfnڴH"(gA$v]6c@9:GUCsU70Qcq'rE2AF#FpM@a&~!h("*胲 dK`.)NoK7h !D_ ϭff~rYH:3"ߵhQ+L}x᠆4lM.wo @6BFDgP7y2iFp g)raT&@G>SH ,8zO3Gb &ylah!̶o ݚ{Ȳ1j,@?r.eNt Z#vn/@$G|j;|sz/)K:c~+<z5Gd)+|tۘ g~#;8|ז؛\{٘s,4҈6D'4ȏ31Âm鼇5h*-:eze#f໴)!.9 $kk0Ƕ NEvՉITUj'ǝ~i!ZFʣy`k;XgOg[A 6}{X̑\3$\ ?RSHĻ('@һ}4^m vGӖ\פuA`%Zl+hlX3ϗ^m& 3?;g ϶5#\r0YrI0)Αx Maѻt,6=6ϛ:b(auoEt iM*oN\fCʼnG)ĨF:FpNZL=ˍ6MRЀzq?[AG 9&@iVdă,&v' Y S)Ub$z! a3t,`Ѓi >+Yv6h ifC0NZ^D_q$v w 4ۮ? }p,L'8V)=׮'ެ߳dۡ7s٪֞,dzA}nGe8aNf| 8awGX/!CA{jeQ_zG+lbkp8sȻenv%̏=Us0 )R" "> ".n$ZsPHͱYz#bc#d4< mwE4LY4z{ÀT-CEg{{vAz~~2->W]љlLxC뷈Gp꛼*" ҵBٶUWa yY(lr.1H%s 6ˀ=Zg4$Pu(D&`ꆌio8nIMXsY xB4Au<9ʏfE۶Sj|yCNݐI3+L" ާ@`/ՐBm,CWϕ4fFJjiv5br~+F?GT_||w6g57`wu:)X]^qwsoR*!'nȘzWz|Q$z;[Lh3/gMÒ6לώcXfW1X.53M!#xusʰ4o%JLb쮁w24^5(-^~ԸMi0w<>af6ڥ3Y3rwF2d_mU \wLoUt[u\aE@vz5uW)S2ShP(;ڟ7Q.3ؠ;Y ծĞ`EEQ72 Y2\u)NzcxXŕ\U&1 : >Vj[q/g;:b;/ٙ>W`ߑ*&8?b`$ΌӦ[Zd<|Y5e0e7٘u h]mbYfh M1?!!Р~d ŐpmATUT?&>5ֽa9C|im7:)6c<>aM kq`[oa9M ˆFe}7Ӵ+ɋA;|eOi?%NXQ4NZXXÜvf*Ka_L֚a1&OY=TX4+/@,'lLd9ktio׸0dt9:䚡v̀3S]KPlOܴ̺6(+f5258D_ lqugK`=Ș潂g&ic!Vj2ՍJhcQ˙Zs WV'UzgYeLb9T~ u]M%`wXF{]n6-IW9"8vy7c ="Fvm٧RDsժJ3 Xě4sãȺ*#$+mG=Sa (~vFw. K+3J*e*fAQ;lY|t.~:4U81E #'.gHP}r+xp9QA)ցS=a=㑪xN!`ͅ6O3EʚeG~\q*gA00O6$Y- ׂ:mРgχˈ<É e(re_]f+V\N+xnu|KÜ#5I[\̇m̆zoVfV␷"iF[>FS63[?UwS{0h!sw=Yi1پE|`DON5 ݹFL=5_=DvF_ȱ[Gm_Ҡ?FX# (E_{6 {r]k!CnIv'g|AJ)K>$P &-Hys5^s_ L8R\%Ohnr\.U P0TII! ܪ\.#u:y!"b\(,/7zE9M RGw1F ǖ-a}u3o|ئ#+Da]0J>N_rkgq EK}||AIPWCt\d"Qlم/=ӛuL3aQN PH?YE-"LmI s1_GRBQ}T!tfsI`KZ#!|7AGzyEyD8x?^*ӷl,GLF)],Щi8T35T?6Lz^uTcKчX2?AZLghjTFH{ڛ1*JǷrG=_i Ѥ\lzVo7TFUa\Ý6t9huuк|{КtLBmqI?:$Lo2:EJDgmZe#;E.m`P ̔zX6l7Zʝr2wטeE1E.dh|TCRyզvrbҥH_ik1gjȑ5zq|?/ȎE0(mol~7mM !K0Ot!CYprQy (66S[,|~ Z~E˟I:$?k_et&HVr.^2ZgǬ=$E=ZŮBI +n/9ҕ7z\E-u>SBa{J~!nB,A6 ;ۇ)0"OcJ]`ኙ}Pfy?E}ufnr]o9ɞEmj3j=/^x ^J3;I9QfHp׼0N/y'Eȍv|;יCv ( Q]qb I#V 5k I~Ɣw}xQ#bu] ?s qL|^;:a?).9BG Ueq1y(f^yFԌqi!ƊP`_&D-z׉-Уˋ]j8yq{2b`{v좽z!niND6}G='f"}B­$]`,;}}&Lה7DMQXCI}Il֍wÃS-LI\B3ʂ&ZCd鐑ST[x G!l;HV)odv\ Dp5VUhΏ^n*ҝB=_`=TJ)[rrC2S3폲fjRfCGdQk#05ˣlRs90G]Q`:Ϣ"g7?߆gz%ߕ":S$ycƋ'-2}?{A[}";,[fusvUwAI #ttodΪzLkNmk3Z57oީlLhn}ѽ6f/J VRH4y7G5 MίenO~ ?%1i[bDi5.0uOe& z,㢍oRNd,GFzύ"oVwE| Qiuz6M[^ht6D,@4r@ I`jNJV&40CO@Ks]]=)Bꑏ:\ebW0'NZʼ +l1+<5[,w3bsI#T| q#ׄo䁥OOٕie~Xa}┍>ظ;cc89v˙z1]=0k;،ݴ;B|͙5-:ه'd!Q^*{uj@>I4)1RxXZM+~Fent.5@hZooCpy8C*~z{>UeW1wI ~%~1?{:)Ǽ-;NW;zbծ2w㶬8Mg۰:t2CQJ>w ]@?y| KV|0=^ $!B2cxKsM6کx#EBVSÈ-@ݤj#N.ۼS'h 79o#,ugMiڇt\՜]65i4ؔ7V B?"*. M׈⋔P]W!ܰLJ5/q;pf\&@YgyZ`w1fO4NB! J tÈqPD)//TG-H`e w&[ ⸺7H8gWLƢ!TCqӳBwK.X\}+1o)Ľ͒Kl9~p:<ώA; >U)IZ힁<|{ET˅WF8 זp:ݠFry ,t^;t>51yL;U߿oBNodmz?MC8ԫC(jV>ZmapQ \"M!0oȏţy(_%t`1HU#{32 Io5]] Ai.e+{Ăw ~o*W$ΡÄ*RȖG%+E NU>![X\Vd_$iݾG2rDq߬L6eح)9!it΀nPU&%ẍ́XCapp:Ew;jF]5  B|`r~Ae!" yC@SA%${!f|t?YB(ICó>ZCsZcI>s>X$,ͭ(۞&gfhĹxaǩ䆴X lbzT[Pl H艝~:1ql}kϹ3fY]eDhD]yz D4@` \)TX>Me] |Aw/Y!U?mF Sb9E*S͔{IYI1GÇh6.nm;kM05OvkؗOF_@5L0',ng+8249?Q#'X^cQpkpC*o^¤:v8eKPg9y#^8pR;髃զ}>GSV D^䝄\|`]`tȟ]wῺ<ڮ 8 ѿ ]nϰ"j23_n?{Xt%U19 jglS=bMh$7>00b(4xzr4,$tUN3XOZ2e|Y ҭeiv}z%CKAur|:eqa3 !#Rf׏luB[e2:|ьDzKfd?:;+/1P+s3"TypV㌐_UC [k8w$i<'h81QSgx pFp$_g]iOȑRJvW+>:ZϮB{>vv ~u]Ezk%KN6M_+r7x. >L%Ś𹍷7x祃@21lh#k0T ml>QO\`-M0b!4Ie)5Ob\8V ~?Ȧ4}Mg$v] jWdUɼ╣ҹ<@gSc){4}0۷w(mm_d4ANKypclK#cՁ|6H97DQ=Ea)i*(k(٥ˣ d:фMӝ ,jƝ]aۍ$rŸM8hm1IBV}d8?Uv l jC6HLe[A-S(`Ąn7Ð 9kg }=`YV4 `ӳmTmGkԍ U2٥߭%[{)eG<{z7ۙ,WrۨuONg2q[R3@sl?VTFZ::Ƥ'74{ZC_b (^@GnQRw ,S R +I(S]b24l",)9E k`D&(+,8.0m~0ȿUԳoy$]pR(3)`C/Eb7eerɅ"EzY NI~oܻi}hkĝq3 7y[]< ,@ϱG컿M=z/l|zɑ&xfg\k#eX?Y;#-$do$:KGS 90zd*',%ǭ;2`$f?dDf4w.lx2\7{@R!QÃP[.`mFy)T7!ro H_cC9?at#}oMgK|.7 - Fc^pV5V(HN!T$̸ xT`[n蓆לc@%$^Ǒ3Mwal䇿RlQhNg7V%JΡclr{Yvr-{~yH%>ó2f7ػT+93rf]1\P'ϑO1ge;=P l[6~ɨ|P-'|  Z&ap9#z =MlcP@f5o,)⅊F: ,[xg^}`]& <_.=4F bQ1/ f#1xʸ 1? 569ZcZ+_ypQudaPJ9L(3`LaHAË=]T򘷘1ȗ^]q)&[ž x+T!qY@ O{d=Z6Sr~Ju@6 >oarF5e\Z5wW WkաtR!]I­zӪW\`(6q8Lr]%=v@X&>eԉ 40ЅF yʞd"iqX;Ap)e?{i'SGU4Q֋X>ֈN)*[HP[M֏g!?OtXC\3yʲ}kST@ !{rAJAS>έOHHA\:\W2$3'٠:YCx°> M[a}h{B|ml)cjŲtcpr7mJCQW5s,%f3/nȋeF$lGҽSc(W֩N$AEKfR5h\Χ%︃xDa|Lte9llwspy`o]o\L-.nq (`AW4r![U8h]Q;9C#foBvقw\$./CH{'#k. Nr)4~ ˈ8A|D lty!a`4pNqB$T|l\1y#Q )8~LDH0n(x4V’o0omvZA"k U8l_(6&4W0 &߮Iz+1 ih~WYtd7SfSQ΍Vf[dͳ5|Ed[,\D91u @d#ᢖiuy)E"f ރ:*}-ES&k#8~F&v11@cgd~f->8ns C+Y|״ն}:0ILav=mZX]FAٳRNuu(de| b?7 D&m?p0Y ۾{Z| ANP7}|GOSAlX5 F=BHiXel 8휽BI{5o|ɲ *n#H_~ WU+ӅCOf'#|wFD H d%W!Ko ) 1gXQoDaw54>I;>^uB;+@N=յ H) Ȟ;*E. W|]-8+c )9|MOLHrr.^K[݃G.$4idqz w_Zd&5{~9x y+ /x.PNh rJ" q%ԏ(ny,g"!VZ,MF\wEѢ4TG̚sXOQ/b/3Bh`@TSP>W^+?;NyK|ݧki'__V]/F.ydXwfL^z%EHVo4Ezڛ1:GfUKQRup?-D|Gf&n}=>wQ#R]H$m mB~qO&Dzj,GeI{p* ﬠ:`BXXhtd/#><`F"43 y'wa9}D_b̅vO wWE-J@?S 냣d }څh)Ԋ1_.EA6{4|;=x5&xq*/$( Wf>濼e(K^b Li>?2XMJWF (&BGnEsE8?W^YßM`|P~8XYÄ^V-3Y\ a8;@;l9ݾmS<J7jt:\W_l/:Pr[kEUH;Ymi$V˾%`Oa~@xe|m}.1L0 F񠟅Ty}{'[Je7~Hfxd7zg4uZR$D@Р#)  02U^VُnaP`Rd0Gb͗HOC 0EjA}ȍ分,)W|uU2?Ԁy׭W^9;2!3u]u؍F, 0iq *d-(`닣q摡(u`n %ۮ פ7OwHMʹp~} 3*l #@ (LgZǭYR2:4|'wOQ-2R#{x;\]z0 ⦫X*u{SV0&?\|-ap~ kXv趺ʙt_C=I(M6,4׎VS[S TLj_P/IHyN.2i\u& >'`to'wG]}-[eֱ>jf?Wἀ& t&yC Fa`f~4"!:(YAy&m _[o}8{Eb/hs׸Yi,=nqshn) (BI#L+];n+b@:tFdiv;Pi7!{83(ydG9#%5]ssZ,>Z:J,P39[h6e]oujfcnd.!x1߉qVf'NT%)\qTt:LH` *BXH Gq"o5ॊObh(/@aH IQW6޿xn0a>TX9;FCrTlGËVn SAN566 =eW9sSENC tH80epČ&b́YA ,cbPQ aK0o" TT3=~;zCxz_ ׀4&Nog3eFS#ͼN ]fv'9Ӵf:/J)[ Kb 8w4Z 2ipƦs~8W@/?#skׅG(W Hņ %3b"(5 sdlr5j;{V(s\sKc"Ի84];w<3.& znM,ALvPK=πE t<<~ !E_p_k#ۥ4& w;{jא''8\  -F_re!PXgtqBJԪչ.rMаSVwLKϙt=冟yq}JaT:|Ⱥ*+x 'H({ѰD/Y3yRަz`}Ϧ\\\ke6;؊u_E*4/\ T0XsaOigw/.pCp޾ T7LGAkXKS|*+I0~}K=S5an_-WtB4ʭ!LM.PU(N$U1;*!:B b!lW "Jڗ`s"n8+Z˶f3*>1%lRVkT{U.~u J;g5>7wH3OFFuFODJX?oMF[ӖLADAVW BQs\)fq5. =fBho}tkjw@8qy 8WkT$_ʞt}'ז%'ڞdL0&fSmaw<*qM/cYI9d< {r*}Ῡ$ f4.c&z>@H(aVNiz4 eʻϝzX`+Dȉ 2!+m [UrhxϲâoYIK63-U* vg.9|7-C(#;-7~baTG2s2#o3} 9#`*u;?w]o<=ȳ^x#+w~yпWWN>Wn-ڃ>NI\yv#uA_UtB#YY{ δ|»ǼMޢ2 0dp&~g}QSlfb#ی5:-%+>?[ޝR|RSK#>Lq @>pP1à#'G-|Kn4"`Of⏖QVϕ:Yys=S/U^m*WhM'z%yjWW8<>*ڇ\7zT:c1["aƟ8>Go^bG*;*tfU-)¤%@'DM wy4,^# C6ElcI㠖=\GgMZK6%$k[q#4UG8>qE 9CIdRT̐!/}w=3& [\oXB D^<٨:$' 6h&AKi[#(30" _a"q!x ~^t{0Bb+byԽ)C*녁ỳxQb~@t:_#lM TyY,}p*N Frӎi 7~' 0]&/z`9z`ycO_ @EYwmLI쉏 }hX N5Õm[&g%'<ؒ~/wBq"|^(R[V,0#/2$Xa`O:*/J/ѰNhw\rݓ"ºe Md^Ml?o1ya^\uw#=RjR:o-U0+{G#pGz[G3,%=GVpZt=,MCѧb/{0C#|k*T#k>>op|q.{+md\'vt[JCsoGdr쀂Zl4v"P8ܥs@6%٨ &ëTHS{5/0p߉爾n797tN1 @?4}NS³HMao?PRT`]E;"F#Z`psTŧ(._i;4ݨ7>836G0H$K =r1VY5M,r{/1$C#7sSd?8n~'#@lPZ]88r ؏XOWȽPEfE zϊڂz CCUetUxqDt  k̚.z:v*S@7Y!]woJ丆@i /A;2b4ކϖiYհŘ}0f2UB@fazv-ERSRdV.n3rz*B(\#W! n?vÿISA%i/lM~l33w#S2r 0BJ1Xm,{AKt(O| aږ#F*J>g"$҅_Go5|ZɐH[ 쌘:Qfy&eeyRs,pNf: [Y"KN'*sD]Q ݥe\ttW`3j;+0sԜ8e},Rڇ2)~oFl*`r޵_[<mٜ +giTΙE8H73~PNseћ|^/t@瑁͖<瑤BՎ5}ϏPިy ŊH*0 LbcFd$ -q>Wns/s5k![&f'![SK~&GDlX%F?8X:FA)F /QXTA(1`o+{9˴עvu 6P/t/\;k;//BFm`8N>JZp+[ej{㴔TB b{(1@ORo.+ a6C+@98vᗅڇ:NCPuCX2v']l0`\/z;tH ԌF%fS!TEB5ŬqwYN D55n)M(b1ƀ.u"N[=F Hڼ5C;O I0?A=Uf˰% f#;"do?/$q$0" jGr+{ G77_+`S@4Œ5MUeQLhmт4zCK~Sbx\5W*`Xj70Fts"?pWG؝Eؼ ̍t¯V0vaIg!wo& E§Y T5 CC#$mi2h=X@21 %, Z-R]=̤ۯkHI.kN>I:Kf<@=-VD|ZZfρZ8~ه w:,0z/N; =磿TlGFXY94N!!=*/u\G] ?Mpnehk <6zd,Xp"oC)]7(ΐTzA5pa ?Mξq:y(|mU8*8yϏV5ّp-'E#Yp FHeRXC ,}\_#BD!zH'Q?q0-j|r [#yZ!d^z"&9)>s#s1JN ƥFP~nUBY~asd=}>*]'{et%s#llu~V,c '4e2St:*dGLHK~up5-}mldE鬝KdYZ^] 堁t ݙ[~^RU i(8Ի~6bh| u45Vh:+%&b3U!ST 3@ ᨜]=Q- %mB.'9'?e^pMR]xp7{!_J<s!(DNN 4i5|*Sh[jr IMu T%y/r_n=Z-V_'b &=eV{x}1@i6=k"+\PAY`|>nZs~Yz _dG0y9k_5CEI'Q ܖi ?]t1|AHa,>MjՔa~hmaAuP(ɇ=oH[MX!iC.rAN{AlNA&%sѝCi)]zqՖTY`WHM@h;oMO`O`޼SňЦc-PtݍF9}g "Gk`[GMe9R3ՠpo)eiGrJ ҤE!?4Lv3?:/ߚӺI7Z5y &x=O@uCܹLx'b-l#2Gj),S$>N7#&P28MG\6 .FxfZ-),K6Wqh!lU 람GzV3dCIz-5v09 _-=n\Vv4$>Qp4 ]9lT,Yk# ,ѷ{(鋗s\GFؿO+!C]6πLF@^Sls'j3Y(}RSň0_ w,O4$ăqn2$՝CC:vHA^FM˝77sd\ʑbȦPz4}nyEeↀ2_Z~g VxXjRcn@Bp )U2~s8sW**x ݼ 596UGPUJ +[8Ҋ|03-8tLIvb}+F:]۴?晸6IwJ0yY4†/ _ <@>5ŋR)9f4w\wlUaЕexUv9݋gK|2k49<:Q&}<>x[b^,7 5l: '2Jbxo~G(QݳGm9:Xϻ߽G5рNfCT@ Uọ988'~ \ xRiW6.H߻Eǭ_X6b4R墈H~ݵo"t tF;%Yb2b0A>dbg uHHKFn-dPJ@Bߵi?B~;c؊OxyZ xE$ڤZ-{ CqJ W54)xLj>Lri}?N,NHo W(uKj#_h#eK7+겲pJ}^ƥ.jvD%YG\H?} NˡYX,@sdțJ!{i]o,t?3 eInf9(.ze/^OSR/ƈ%;Bo-<ž8Y[R5x̹Igf#deP1NZuG> ~|9dI8)ޛȂI}ɼ!T`g"pJ> bc:̽Ҧf,&[WL0hs8{Uf"JaAcXo-& z\]2jE$i| $E7)r ;pc؊0eYT5]QBҎKHj]1QT (WvyNWgm5o5L]Ȁ.~Zi 俥k:JXo{dR>-eΒˇ凥h&߈PtWrO*ay!%?3 Ɋ@:?s\p Ge}Gcdg/Uۀe"B,F-70p=gon'rVu2)j`(̾<#Eѥ<{IYnyMݰQ Y}#mgaTM؝bcYߍ'\)[_H]yYBHfwBVͮJd<t47rɇv䒨=X4x[`BtI * qnrH2gkxw>j(Zɤ"{6l0QYup :6+ 1) { pred <- paste0("interaction(", toString(pred), ")", collapse = "") } f <- stats::as.formula(sprintf("%s ~ %s", resp, pred)) if (method == "auto") { check <- tryCatch( { utils::capture.output(p <- check_normality(x)) # nolint p }, error = function(e) { NULL } ) if (is.null(check)) { insight::print_color("'check_homogeneity()' cannot perform check for normality. Please specify the 'method'-argument for the test of equal variances.\n", "red") return(NULL) } method <- ifelse(check < 0.05, "fligner", "bartlett") } if (method == "fligner") { r <- stats::fligner.test(f, data = insight::get_data(x, verbose = FALSE)) p.val <- r$p.value } else if (method == "bartlett") { r <- stats::bartlett.test(f, data = insight::get_data(x, verbose = FALSE)) p.val <- r$p.value } else if (method == "levene") { insight::check_if_installed("car") r <- car::leveneTest(x, ...) p.val <- r$`Pr(>F)` } method.string <- switch(method, bartlett = "Bartlett Test", fligner = "Fligner-Killeen Test", levene = "Levene's Test" ) attr(p.val, "data") <- x attr(p.val, "object_name") <- insight::safe_deparse_symbol(substitute(x)) attr(p.val, "method") <- method.string class(p.val) <- unique(c("check_homogeneity", "see_check_homogeneity", class(p.val))) p.val } # methods ----------------------- #' @export print.check_homogeneity <- function(x, ...) { method.string <- attributes(x)$method if (is.na(x)) { insight::format_warning(paste0("Could not perform ", method.string, ".")) invisible(NULL) } else if (x < 0.05) { insight::print_color(sprintf("Warning: Variances differ between groups (%s, p = %.3f).\n", method.string, x), "red") } else { insight::print_color(sprintf("OK: There is not clear evidence for different variances across groups (%s, p = %.3f).\n", method.string, x), "green") } invisible(x) } #' @export plot.check_homogeneity <- function(x, ...) { insight::check_if_installed("see", "for homogeneity plots") NextMethod() } # other classes ----------------------------- #' @rdname check_homogeneity #' @export check_homogeneity.afex_aov <- function(x, method = "levene", ...) { insight::check_if_installed("car") if (tolower(method) != "levene") { insight::format_alert("Only Levene's test for homogeneity supported for `afex_aov()`.") } if (length(attr(x, "between")) == 0) { insight::format_error("Levene test is only aplicable to ANOVAs with between-subjects factors.") } data <- x$data$long # Use this to also get id column dv <- attr(x, "dv") id <- attr(x, "id") between <- names(attr(x, "between")) is_covar <- vapply(attr(x, "between"), is.null, logical(1)) ag_data <- stats::aggregate(data[, dv], data[, c(between, id)], mean) colnames(ag_data)[length(c(between, id)) + 1] <- dv if (any(is_covar)) { insight::format_alert( "Levene's test is not appropriate with quantitative explanatory variables. Testing assumption of homogeneity among factor groups only." ) # ## TODO maybe add as option? # warning("Testing assumption of homogeneity on residualzied data among factor groups only.", call. = FALSE) # ag_data[dv] <- stats::residuals(stats::lm(ag_data[,dv] ~ as.matrix(ag_data[between[is_covar]]))) between <- between[!is_covar] } form <- stats::formula(paste0(dv, "~", paste0(between, collapse = "*"))) test <- car::leveneTest(form, ag_data, center = mean, ...) p.val <- test[1, "Pr(>F)"] attr(p.val, "object_name") <- insight::safe_deparse_symbol(substitute(x)) attr(p.val, "method") <- "Levene's Test" class(p.val) <- unique(c("check_homogeneity", "see_check_homogeneity", class(p.val))) p.val } performance/R/r2_coxsnell.R0000644000176200001440000001432514507335630015344 0ustar liggesusers#' @title Cox & Snell's R2 #' @name r2_coxsnell #' #' @description #' Calculates the pseudo-R2 value based on the proposal from *Cox & Snell (1989)*. #' #' @param model Model with binary outcome. #' @param ... Currently not used. #' #' @details #' This index was proposed by *Cox and Snell (1989, pp. 208-9)* and, #' apparently independently, by *Magee (1990)*; but had been suggested #' earlier for binary response models by *Maddala (1983)*. However, this #' index achieves a maximum of less than 1 for discrete models (i.e. models #' whose likelihood is a product of probabilities) which have a maximum of 1, #' instead of densities, which can become infinite *(Nagelkerke, 1991)*. #' #' @return A named vector with the R2 value. #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' r2_coxsnell(model) #' #' @references #' - Cox, D. R., Snell, E. J. (1989). Analysis of binary data (Vol. 32). #' Monographs on Statistics and Applied Probability. #' - Magee, L. (1990). R 2 measures based on Wald and likelihood ratio #' joint significance tests. The American Statistician, 44(3), 250-253. #' - Maddala, G. S. (1986). Limited-dependent and qualitative variables in #' econometrics (No. 3). Cambridge university press. #' - Nagelkerke, N. J. (1991). A note on a general definition of the #' coefficient of determination. Biometrika, 78(3), 691-692. #' #' @export r2_coxsnell <- function(model, ...) { UseMethod("r2_coxsnell") } # helper --------------------------- .r2_coxsnell <- function(model, l_base) { l_full <- insight::get_loglikelihood(model) G2 <- -2 * (l_base - l_full) # Is it still necessary? if (inherits(model, c("vglm", "vgam", "clm2"))) { n <- suppressWarnings(insight::n_obs(model)) } else { n <- attr(l_full, "nobs") if (is.null(n)) n <- suppressWarnings(insight::n_obs(model, disaggregate = TRUE)) } r2_coxsnell <- as.vector(1 - exp(-G2 / n)) names(r2_coxsnell) <- "Cox & Snell's R2" r2_coxsnell } # r2-coxsnell based on model information --------------------------- #' @export r2_coxsnell.glm <- function(model, verbose = TRUE, ...) { info <- list(...)$model_info if (is.null(info)) { info <- suppressWarnings(insight::model_info(model, verbose = FALSE)) } if (info$is_binomial && !info$is_bernoulli && class(model)[1] == "glm") { if (verbose) { insight::format_alert("Can't calculate accurate R2 for binomial models that are not Bernoulli models.") } return(NULL) } else { # if no deviance, return NA if (is.null(model$deviance)) { return(NULL) } r2_coxsnell <- (1 - exp((model$deviance - model$null.deviance) / insight::n_obs(model, disaggregate = TRUE))) names(r2_coxsnell) <- "Cox & Snell's R2" r2_coxsnell } } #' @export r2_coxsnell.BBreg <- r2_coxsnell.glm #' @export r2_coxsnell.nestedLogit <- function(model, ...) { n <- insight::n_obs(model, disaggregate = TRUE) stats::setNames( lapply(names(model$models), function(i) { m <- model$models[[i]] # if no deviance, return NA if (is.null(m$deviance)) { return(NA) } r2_coxsnell <- (1 - exp((m$deviance - m$null.deviance) / n[[i]])) names(r2_coxsnell) <- "Cox & Snell's R2" r2_coxsnell }), names(model$models) ) } #' @export r2_coxsnell.mclogit <- function(model, ...) { insight::check_if_installed("mclogit", reason = "to calculate R2") s <- mclogit::getSummary.mclogit(model) r2_coxsnell <- s$sumstat["Cox.Snell"] names(r2_coxsnell) <- "Cox & Snell's R2" r2_coxsnell } #' @export r2_coxsnell.mblogit <- function(model, ...) { insight::check_if_installed("mclogit", reason = "to calculate R2") s <- mclogit::getSummary.mblogit(model) r2_coxsnell <- s$sumstat["Cox.Snell"] names(r2_coxsnell) <- "Cox & Snell's R2" r2_coxsnell } #' @export r2_coxsnell.bife <- function(model, ...) { r2_coxsnell <- (1 - exp((model$deviance - model$null_deviance) / insight::n_obs(model))) names(r2_coxsnell) <- "Cox & Snell's R2" r2_coxsnell } # mfx models --------------------- #' @export r2_coxsnell.logitmfx <- function(model, ...) { r2_coxsnell(model$fit, ...) } #' @export r2_coxsnell.logitor <- r2_coxsnell.logitmfx #' @export r2_coxsnell.poissonirr <- r2_coxsnell.logitmfx #' @export r2_coxsnell.poissonmfx <- r2_coxsnell.logitmfx #' @export r2_coxsnell.probit <- r2_coxsnell.logitmfx #' @export r2_coxsnell.negbinirr <- r2_coxsnell.logitmfx #' @export r2_coxsnell.negbinmfx <- r2_coxsnell.logitmfx # r2-coxsnell based on loglik stored in model object --------------------------- #' @export r2_coxsnell.coxph <- function(model, ...) { l_base <- model$loglik[1] .r2_coxsnell(model, l_base) } #' @export r2_coxsnell.survreg <- r2_coxsnell.coxph #' @export r2_coxsnell.svycoxph <- function(model, ...) { l_base <- model$ll[1] .r2_coxsnell(model, l_base) } # r2-coxsnell based on loglik of null-model (update) --------------------------- #' @export r2_coxsnell.multinom <- function(model, ...) { l_base <- insight::get_loglikelihood(stats::update(model, ~1, trace = FALSE)) .r2_coxsnell(model, l_base) } #' @export r2_coxsnell.clm2 <- function(model, ...) { l_base <- insight::get_loglikelihood(stats::update(model, location = ~1, scale = ~1)) .r2_coxsnell(model, l_base) } #' @export r2_coxsnell.bayesx <- function(model, ...) { junk <- utils::capture.output(l_base <- insight::get_loglikelihood(stats::update(model, ~1))) # nolint .r2_coxsnell(model, l_base) } #' @export r2_coxsnell.clm <- function(model, ...) { l_base <- insight::get_loglikelihood(stats::update(model, ~1)) # if no loglik, return NA if (length(as.numeric(l_base)) == 0) { return(NULL) } .r2_coxsnell(model, l_base) } #' @export r2_coxsnell.crch <- r2_coxsnell.clm #' @export r2_coxsnell.cpglm <- r2_coxsnell.clm #' @export r2_coxsnell.censReg <- r2_coxsnell.clm #' @export r2_coxsnell.truncreg <- r2_coxsnell.clm #' @export r2_coxsnell.polr <- r2_coxsnell.clm #' @export r2_coxsnell.glmx <- r2_coxsnell.clm #' @export r2_coxsnell.DirichletRegModel <- r2_coxsnell.clm performance/R/helpers.R0000644000176200001440000000401714401657012014543 0ustar liggesusers# small wrapper around this commonly used try-catch .safe <- function(code, on_error = NULL) { tryCatch(code, error = function(e) on_error) } .get_BIC <- function(x, estimator = "ML") { # check ML estimator if (missing(estimator) && inherits(x, "lmerMod")) { estimator <- "REML" } REML <- identical(estimator, "REML") if (inherits(x, c("vgam", "vglm"))) { insight::check_if_installed("VGAM") out <- .adjust_ic_jacobian(x, VGAM::BIC(x)) } else if (inherits(x, "bayesx")) { out <- .adjust_ic_jacobian(x, stats::BIC(x)[["BIC"]]) } else { out <- .safe( stats::BIC(insight::get_loglikelihood(x, check_response = TRUE, REML = REML, verbose = FALSE)) ) # when `get_loglikelihood()` does not work, `stats::BIC` sometimes still works (e.g., `fixest`) if (is.null(out)) { out <- .safe(stats::BIC(x)) } } out } .std <- function(x) { if (!is.numeric(x)) { return(x) } # remove missings tmp <- x[!is.na(x)] # standardize tmp <- (tmp - mean(tmp)) / stats::sd(tmp) # and fill in values in original vector x[!is.na(x)] <- tmp x } # recode numeric vector, so lowest value stats with 0 # factors are coerced to numeric .recode_to_zero <- function(x) { # check if factor if (is.factor(x) || is.character(x)) { # try to convert to numeric x <- datawizard::to_numeric(x, dummy_factors = FALSE, preserve_levels = TRUE) } # retrieve lowest category minval <- min(x, na.rm = TRUE) sapply(x, function(y) y - minval) } .get_sigma <- function(model, verbose = TRUE) { s <- insight::get_sigma(model, ci = NULL, verbose = verbose) if (!is.null(s)) { as.numeric(s) } else { NULL } } # functions to check if necessary default argument was provided ------------ .is_model_valid <- function(model) { if (missing(model) || is.null(model)) { insight::format_error( "You must provide a model-object. Argument `model` cannot be missing or `NULL`." ) } } performance/R/check_sphericity.R0000644000176200001440000000503514512471542016427 0ustar liggesusers#' @title Check model for violation of sphericity #' @name check_sphericity #' #' @description Check model for violation of sphericity. For [Bartlett's Test of Sphericity][check_factorstructure] #' (used for correlation matrices and factor analyses), see [check_sphericity_bartlett]. #' #' @param x A model object. #' @param ... Arguments passed to `car::Anova`. #' #' @return Invisibly returns the p-values of the test statistics. A p-value < #' 0.05 indicates a violation of sphericity. #' #' @examplesIf require("car") && require("carData") #' data(Soils, package = "carData") #' soils.mod <- lm( #' cbind(pH, N, Dens, P, Ca, Mg, K, Na, Conduc) ~ Block + Contour * Depth, #' data = Soils #' ) #' #' check_sphericity(Manova(soils.mod)) #' @export check_sphericity <- function(x, ...) { UseMethod("check_sphericity") } # default -------------------------- #' @export check_sphericity.default <- function(x, ...) { insight::format_error(paste0("Test not supported yet for object of class `", class(x)[1], "`.")) } # methods ------------------------------ #' @export plot.check_sphericity <- function(x, ...) { insight::format_warning("There is currently no `plot()` method for `check_sphericity()`.") } #' @export print.check_sphericity <- function(x, ...) { if (any(x < 0.05)) { pp <- x[x < 0.05] pp <- paste0("\n - ", names(pp), " (", insight::format_p(pp), ")", collapse = "") insight::print_color(sprintf("Warning: Sphericity violated for: %s.\n", pp), "red") } else { pp <- insight::format_p(min(x)) pp <- sub("=", ">", pp, fixed = TRUE) insight::print_color(sprintf("OK: Data seems to be spherical (%s).\n", pp), "green") } invisible(x) } # other classes ------------------ #' @export check_sphericity.Anova.mlm <- function(x, ...) { S <- summary(x, multivariate = FALSE, univariate = TRUE) test <- S$sphericity.tests p.val <- test[, 2] # validation check if (is.null(p.val)) { p.val <- 1 } attr(p.val, "data") <- x class(p.val) <- c("check_sphericity", "see_check_sphericity", class(p.val)) p.val } #' @export check_sphericity.afex_aov <- function(x, ...) { if (length(attr(x, "within")) == 0) { insight::format_error("Mauchly Test of Sphericity is only aplicable to ANOVAs with within-subjects factors.") } check_sphericity.Anova.mlm(x, ...) } #' @export check_sphericity.mlm <- function(x, ...) { insight::check_if_installed("car") check_sphericity.Anova.mlm(car::Anova(x, ...)) } performance/R/performance_rmse.R0000644000176200001440000000401414501062052016420 0ustar liggesusers#' @title Root Mean Squared Error #' @name performance_rmse #' #' @description Compute root mean squared error for (mixed effects) models, #' including Bayesian regression models. #' #' @param model A model. #' @param normalized Logical, use `TRUE` if normalized rmse should be returned. #' @inheritParams model_performance.lm #' #' @details The RMSE is the square root of the variance of the residuals and indicates #' the absolute fit of the model to the data (difference between observed data #' to model's predicted values). It can be interpreted as the standard #' deviation of the unexplained variance, and is in the same units as the #' response variable. Lower values indicate better model fit. #' #' The normalized RMSE is the proportion of the RMSE related to the #' range of the response variable. Hence, lower values indicate #' less residual variance. #' #' @return Numeric, the root mean squared error. #' #' @examplesIf require("nlme") #' data(Orthodont, package = "nlme") #' m <- nlme::lme(distance ~ age, data = Orthodont) #' #' # RMSE #' performance_rmse(m, normalized = FALSE) #' #' # normalized RMSE #' performance_rmse(m, normalized = TRUE) #' @export performance_rmse <- function(model, normalized = FALSE, verbose = TRUE) { tryCatch( { # compute rmse rmse_val <- sqrt(performance_mse(model, verbose = verbose)) # if normalized, divide by range of response if (normalized) { # get response resp <- datawizard::to_numeric(insight::get_response(model, verbose = FALSE), dummy_factors = FALSE, preserve_levels = TRUE) # compute rmse, normalized rmse_val <- rmse_val / (max(resp, na.rm = TRUE) - min(resp, na.rm = TRUE)) } rmse_val }, error = function(e) { if (inherits(e, c("simpleError", "error")) && verbose) { insight::print_color(e$message, "red") cat("\n") } NA } ) } #' @rdname performance_rmse #' @export rmse <- performance_rmse performance/R/check_convergence.R0000644000176200001440000001016114503335324016533 0ustar liggesusers#' @title Convergence test for mixed effects models #' @name check_convergence #' #' @description `check_convergence()` provides an alternative convergence #' test for `merMod`-objects. #' #' @param x A `merMod` or `glmmTMB`-object. #' @param tolerance Indicates up to which value the convergence result is #' accepted. The smaller `tolerance` is, the stricter the test will be. #' @param ... Currently not used. #' #' @return `TRUE` if convergence is fine and `FALSE` if convergence #' is suspicious. Additionally, the convergence value is returned as attribute. #' #' @section Convergence and log-likelihood: #' Convergence problems typically arise when the model hasn't converged #' to a solution where the log-likelihood has a true maximum. This may result #' in unreliable and overly complex (or non-estimable) estimates and standard #' errors. #' #' @section Inspect model convergence: #' **lme4** performs a convergence-check (see `?lme4::convergence`), #' however, as as discussed [here](https://github.com/lme4/lme4/issues/120) #' and suggested by one of the lme4-authors in #' [this comment](https://github.com/lme4/lme4/issues/120#issuecomment-39920269), #' this check can be too strict. `check_convergence()` thus provides an #' alternative convergence test for `merMod`-objects. #' #' @section Resolving convergence issues: #' Convergence issues are not easy to diagnose. The help page on #' `?lme4::convergence` provides most of the current advice about #' how to resolve convergence issues. Another clue might be large parameter #' values, e.g. estimates (on the scale of the linear predictor) larger than #' 10 in (non-identity link) generalized linear model *might* indicate #' [complete separation](https://stats.oarc.ucla.edu/other/mult-pkg/faq/general/faqwhat-is-complete-or-quasi-complete-separation-in-logisticprobit-regression-and-how-do-we-deal-with-them/). #' Complete separation can be addressed by regularization, e.g. penalized #' regression or Bayesian regression with appropriate priors on the fixed effects. #' #' @section Convergence versus Singularity: #' Note the different meaning between singularity and convergence: singularity #' indicates an issue with the "true" best estimate, i.e. whether the maximum #' likelihood estimation for the variance-covariance matrix of the random effects #' is positive definite or only semi-definite. Convergence is a question of #' whether we can assume that the numerical optimization has worked correctly #' or not. #' #' @family functions to check model assumptions and and assess model quality #' #' @examplesIf require("lme4") && require("glmmTMB") #' data(cbpp, package = "lme4") #' set.seed(1) #' cbpp$x <- rnorm(nrow(cbpp)) #' cbpp$x2 <- runif(nrow(cbpp)) #' #' model <- lme4::glmer( #' cbind(incidence, size - incidence) ~ period + x + x2 + (1 + x | herd), #' data = cbpp, #' family = binomial() #' ) #' #' check_convergence(model) #' #' \donttest{ #' model <- suppressWarnings(glmmTMB::glmmTMB( #' Sepal.Length ~ poly(Petal.Width, 4) * poly(Petal.Length, 4) + #' (1 + poly(Petal.Width, 4) | Species), #' data = iris #' )) #' check_convergence(model) #' } #' @export check_convergence <- function(x, tolerance = 0.001, ...) { UseMethod("check_convergence") } #' @export check_convergence.default <- function(x, tolerance = 0.001, ...) { # check for valid input .is_model_valid(x) message(sprintf("`check_convergence()` does not work for models of class '%s'.", class(x)[1])) } #' @export check_convergence.merMod <- function(x, tolerance = 0.001, ...) { insight::check_if_installed("Matrix") relgrad <- with(x@optinfo$derivs, Matrix::solve(Hessian, gradient)) # copy logical value, TRUE if convergence is OK retval <- max(abs(relgrad)) < tolerance # copy convergence value attr(retval, "gradient") <- max(abs(relgrad)) # return result retval } #' @export check_convergence.glmmTMB <- function(x, ...) { # https://github.com/glmmTMB/glmmTMB/issues/275 isTRUE(x$sdr$pdHess) } #' @export check_convergence._glm <- function(x, ...) { isTRUE(x$fit$converged) } performance/R/r2_tjur.R0000644000176200001440000000504014507335630014473 0ustar liggesusers#' @title Tjur's R2 - coefficient of determination (D) #' @name r2_tjur #' #' @description This method calculates the Coefficient of Discrimination `D` #' (also known as Tjur's R2; \cite{Tjur, 2009}) for generalized linear (mixed) models #' for binary outcomes. It is an alternative to other pseudo-R2 values like #' Nagelkerke's R2 or Cox-Snell R2. The Coefficient of Discrimination `D` #' can be read like any other (pseudo-)R2 value. #' #' @param model Binomial Model. #' @param ... Arguments from other functions, usually only used internally. #' #' @return A named vector with the R2 value. #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' r2_tjur(model) #' #' @references #' Tjur, T. (2009). Coefficients of determination in logistic regression #' models - A new proposal: The coefficient of discrimination. The American #' Statistician, 63(4), 366-372. #' #' @export r2_tjur <- function(model, ...) { UseMethod("r2_tjur") } #' @export r2_tjur.default <- function(model, ...) { info <- list(...)$model_info if (is.null(info)) { info <- suppressWarnings(insight::model_info(model, verbose = FALSE)) } # check for valid object class if (!info$is_binomial) { insight::format_error("`model` must be binomial.") } y <- .recode_to_zero(insight::get_response(model, verbose = FALSE)) pred <- stats::predict(model, type = "response", re.form = NULL) # delete pred for cases with missing residuals if (anyNA(stats::residuals(model))) { pred <- pred[!is.na(stats::residuals(model))] } categories <- unique(y) m1 <- mean(pred[which(y == categories[1])], na.rm = TRUE) m2 <- mean(pred[which(y == categories[2])], na.rm = TRUE) tjur_d <- abs(m2 - m1) names(tjur_d) <- "Tjur's R2" tjur_d } #' @export r2_tjur.nestedLogit <- function(model, ...) { resp <- insight::get_response(model, dichotomies = TRUE, verbose = FALSE) stats::setNames( lapply(names(model$models), function(i) { y <- resp[[i]] m <- model$models[[i]] pred <- stats::predict(m, type = "response") # delete pred for cases with missing residuals if (anyNA(stats::residuals(m))) { pred <- pred[!is.na(stats::residuals(m))] } categories <- unique(y) m1 <- mean(pred[which(y == categories[1])], na.rm = TRUE) m2 <- mean(pred[which(y == categories[2])], na.rm = TRUE) tjur_d <- abs(m2 - m1) names(tjur_d) <- "Tjur's R2" tjur_d }), names(model$models) ) } performance/R/print_md.R0000644000176200001440000000775514327547352014745 0ustar liggesusers#' @rdname display.performance_model #' @export print_md.performance_model <- function(x, digits = 2, caption = "Indices of model performance", layout = "horizontal", ...) { layout <- match.arg(layout, choices = c("horizontal", "vertical")) formatted_table <- format( x = x, digits = digits, format = "markdown", ... ) # switch to vertical layout if (layout == "vertical") { formatted_table <- datawizard::rownames_as_column(as.data.frame(t(formatted_table)), "Metric") colnames(formatted_table)[2] <- "Value" } insight::export_table( x = formatted_table, digits = digits, format = "markdown", caption = caption, align = "firstleft", ... ) } #' @rdname display.performance_model #' @export print_md.compare_performance <- function(x, digits = 2, caption = "Comparison of Model Performance Indices", layout = "horizontal", ...) { layout <- match.arg(layout, choices = c("horizontal", "vertical")) .print_md_compare_performance(x, digits = digits, caption = caption, layout = layout, format = "markdown", ...) } #' @export print_html.compare_performance <- function(x, digits = 2, caption = "Comparison of Model Performance Indices", layout = "horizontal", ...) { layout <- match.arg(layout, choices = c("horizontal", "vertical")) .print_md_compare_performance(x, digits = digits, caption = caption, layout = layout, format = "html", ...) } #' @export print_md.check_itemscale <- function(x, digits = 2, ...) { insight::export_table( lapply(seq_along(x), function(i) { out <- x[[i]] attr(out, "caption") <- sprintf("Component %i", i) attr(out, "footer") <- sprintf( "Mean inter-item-correlation = %.3f Cronbach's alpha = %.3f", attributes(out)$item_intercorrelation, attributes(out)$cronbachs_alpha ) out }), digits = digits, format = "markdown", missing = "", align = "firstleft", zap_small = TRUE ) } # helper ------------------------------------ .print_md_compare_performance <- function(x, digits = 2, caption = "Comparison of Model Performance Indices", layout = "horizontal", format = "markdown", ...) { layout <- match.arg(layout, choices = c("horizontal", "vertical")) formatted_table <- format(x = x, digits = digits, format = format, ...) if ("Performance_Score" %in% colnames(x)) { footer <- sprintf( "Model %s (of class %s) performed best with an overall performance score of %s.", formatted_table$Model[1], formatted_table$Type[1], formatted_table$Performance_Score[1] ) } else { footer <- NULL } # switch to vertical layout if (layout == "vertical") { formatted_table <- datawizard::rownames_as_column(as.data.frame(t(formatted_table)), "Metric") formatted_table <- datawizard::row_to_colnames(formatted_table) colnames(formatted_table)[1] <- "Metric" } insight::export_table( x = formatted_table, digits = digits, format = format, caption = caption, footer = footer, align = "firstleft" ) } # Reexports models ------------------------ #' @importFrom insight print_md #' @export insight::print_md #' @importFrom insight print_html #' @export insight::print_html performance/R/performance_rse.R0000644000176200001440000000126014257247716016267 0ustar liggesusers#' @title Residual Standard Error for Linear Models #' @name performance_rse #' #' @description Compute residual standard error of linear models. #' #' @inheritParams performance_rmse #' #' @details The residual standard error is the square root of the residual #' sum of squares divided by the residual degrees of freedom. #' #' @return Numeric, the residual standard error of `model`. #' #' @examples #' data(mtcars) #' m <- lm(mpg ~ hp + gear, data = mtcars) #' performance_rse(m) #' @export performance_rse <- function(model) { # Residual standard error sqrt(sum(insight::get_residuals(model)^2, na.rm = TRUE) / insight::get_df(model, type = "residual")) } performance/R/model_performance.rma.R0000644000176200001440000000736314512471542017354 0ustar liggesusers#' Performance of Meta-Analysis Models #' #' Compute indices of model performance for meta-analysis model from the #' **metafor** package. #' #' @param model A `rma` object as returned by `metafor::rma()`. #' @param metrics Can be `"all"` or a character vector of metrics to be #' computed (some of `c("AIC", "BIC", "I2", "H2", "TAU2", "R2", #' "CochransQ", "QE", "Omnibus", "QM")`). #' @param ... Arguments passed to or from other methods. #' @inheritParams model_performance.lm #' @inheritParams model_performance.merMod #' #' @return A data frame (with one row) and one column per "index" (see #' `metrics`). #' #' @details \subsection{Indices of fit}{ #' #' - **AIC** Akaike's Information Criterion, see `?stats::AIC` #' #' - **BIC** Bayesian Information Criterion, see `?stats::BIC` #' #' - **I2**: For a random effects model, `I2` estimates (in #' percent) how much of the total variability in the effect size estimates #' can be attributed to heterogeneity among the true effects. For a #' mixed-effects model, `I2` estimates how much of the unaccounted #' variability can be attributed to residual heterogeneity. #' #' - **H2**: For a random-effects model, `H2` estimates the #' ratio of the total amount of variability in the effect size estimates to #' the amount of sampling variability. For a mixed-effects model, `H2` #' estimates the ratio of the unaccounted variability in the effect size #' estimates to the amount of sampling variability. #' #' - **TAU2**: The amount of (residual) heterogeneity in the random #' or mixed effects model. #' #' - **CochransQ (QE)**: Test for (residual) Heterogeneity. Without #' moderators in the model, this is simply Cochran's Q-test. #' #' - **Omnibus (QM)**: Omnibus test of parameters. #' #' - **R2**: Pseudo-R2-statistic, which indicates the amount of #' heterogeneity accounted for by the moderators included in a fixed-effects #' model. #' #' See the documentation for `?metafor::fitstats`. #' } #' #' @examplesIf require("metafor") && require("metadat") #' data(dat.bcg, package = "metadat") #' dat <- metafor::escalc( #' measure = "RR", #' ai = tpos, #' bi = tneg, #' ci = cpos, #' di = cneg, #' data = dat.bcg #' ) #' model <- metafor::rma(yi, vi, data = dat, method = "REML") #' model_performance(model) #' @export model_performance.rma <- function(model, metrics = "all", estimator = "ML", verbose = TRUE, ...) { if (all(metrics == "all")) { metrics <- c("AIC", "BIC", "I2", "H2", "TAU2", "COCHRANSQ", "OMNIBUS", "R2") } else if (all(metrics == "common")) { metrics <- c("AIC", "BIC", "I2") } out <- list() attrib <- list() s <- summary(model) if ("AIC" %in% toupper(metrics)) { out$AIC <- performance_aic(model, estimator = estimator) } if ("BIC" %in% toupper(metrics)) { out$BIC <- .get_BIC(model) } if ("I2" %in% toupper(metrics)) { out$I2 <- s$I2 / 100 } if ("H2" %in% toupper(metrics)) { out$H2 <- s$H2 } if ("TAU2" %in% toupper(metrics)) { out$TAU2 <- s$tau2 } if (any(c("QE", "COCHRANSQ") %in% toupper(metrics))) { out$CochransQ <- s$QE out$p_CochransQ <- s$QEp out$df_error <- .safe(stats::df.residual(model)) } if (any(c("QM", "OMNIBUS") %in% toupper(metrics))) { out$Omnibus <- s$QM out$p_Omnibus <- s$QMp } if ("R2" %in% toupper(metrics)) { R2 <- r2(model) if (!is.null(R2)) { attrib$r2 <- attributes(R2) out <- c(out, R2) } } out <- as.data.frame(insight::compact_list(out)) row.names(out) <- NULL class(out) <- c("performance_model", class(out)) # Add attributes attributes(out) <- c(attributes(out), attrib) out } performance/R/r2_nakagawa.R0000644000176200001440000002454314512471542015271 0ustar liggesusers#' @title Nakagawa's R2 for mixed models #' @name r2_nakagawa #' #' @description Compute the _marginal_ and _conditional_ r-squared value for #' mixed effects models with complex random effects structures. #' #' @param model A mixed effects model. #' @param by_group Logical, if `TRUE`, returns the explained variance #' at different levels (if there are multiple levels). This is essentially #' similar to the variance reduction approach by _Hox (2010), pp. 69-78_. #' @param tolerance Tolerance for singularity check of random effects, to decide #' whether to compute random effect variances for the conditional r-squared #' or not. Indicates up to which value the convergence result is accepted. When #' `r2_nakagawa()` returns a warning, stating that random effect variances #' can't be computed (and thus, the conditional r-squared is `NA`), #' decrease the tolerance-level. See also [`check_singularity()`]. #' @inheritParams icc #' #' @return A list with the conditional and marginal R2 values. #' #' @details #' Marginal and conditional r-squared values for mixed models are calculated #' based on _Nakagawa et al. (2017)_. For more details on the computation of #' the variances, see `?insight::get_variance`. The random effect variances are #' actually the mean random effect variances, thus the r-squared value is also #' appropriate for mixed models with random slopes or nested random effects #' (see _Johnson, 2014_). #' #' - **Conditional R2**: takes both the fixed and random effects into account. #' - **Marginal R2**: considers only the variance of the fixed effects. #' #' The contribution of random effects can be deduced by subtracting the #' marginal R2 from the conditional R2 or by computing the [`icc()`]. #' #' @references #' - Hox, J. J. (2010). Multilevel analysis: techniques and applications #' (2nd ed). New York: Routledge. #' - Johnson, P. C. D. (2014). Extension of Nakagawa and Schielzeth’s R2 GLMM #' to random slopes models. Methods in Ecology and Evolution, 5(9), 944–946. #' \doi{10.1111/2041-210X.12225} #' - Nakagawa, S., and Schielzeth, H. (2013). A general and simple method for #' obtaining R2 from generalized linear mixed-effects models. Methods in #' Ecology and Evolution, 4(2), 133–142. \doi{10.1111/j.2041-210x.2012.00261.x} #' - Nakagawa, S., Johnson, P. C. D., and Schielzeth, H. (2017). The #' coefficient of determination R2 and intra-class correlation coefficient from #' generalized linear mixed-effects models revisited and expanded. Journal of #' The Royal Society Interface, 14(134), 20170213. #' #' @examplesIf require("lme4") #' model <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) #' r2_nakagawa(model) #' r2_nakagawa(model, by_group = TRUE) #' @export r2_nakagawa <- function(model, by_group = FALSE, tolerance = 1e-5, ci = NULL, iterations = 100, ci_method = NULL, verbose = TRUE, ...) { # calculate random effect variances vars <- .compute_random_vars( model, tolerance, components = c("var.fixed", "var.residual"), name_fun = "r2()", name_full = "r-squared" ) # return if R2 couldn't be computed if (is.null(vars) || all(is.na(vars))) { return(vars) } # compute R2 by group if (isTRUE(by_group)) { # with random slopes, explained variance is inaccurate if (!is.null(insight::find_random_slopes(model)) && verbose) { insight::format_warning("Model contains random slopes. Explained variance by levels is not accurate.") } if (!is.null(ci) && !is.na(ci) && verbose) { insight::format_warning("Confidence intervals are not yet supported for `by_group = TRUE`.") } # null-model null_model <- insight::null_model(model) vars_null <- insight::get_variance(null_model, tolerance = tolerance) # names of group levels group_names <- insight::find_random(model, split_nested = TRUE, flatten = TRUE) # compute r2 by level r2_random <- 1 - (vars$var.intercept[group_names] / vars_null$var.intercept[group_names]) r2_fixed <- 1 - (vars$var.residual / vars_null$var.residual) out <- data.frame( Level = c("Level 1", group_names), R2 = c(r2_fixed, r2_random), stringsAsFactors = FALSE ) class(out) <- c("r2_nakagawa_by_group", "data.frame") } else { # Calculate R2 values if (insight::is_empty_object(vars$var.random) || is.na(vars$var.random)) { if (verbose) { # if no random effect variance, return simple R2 insight::print_color("Random effect variances not available. Returned R2 does not account for random effects.\n", "red") } r2_marginal <- vars$var.fixed / (vars$var.fixed + vars$var.residual) r2_conditional <- NA } else { r2_marginal <- vars$var.fixed / (vars$var.fixed + vars$var.random + vars$var.residual) r2_conditional <- (vars$var.fixed + vars$var.random) / (vars$var.fixed + vars$var.random + vars$var.residual) } names(r2_conditional) <- "Conditional R2" names(r2_marginal) <- "Marginal R2" out <- list(R2_conditional = r2_conditional, R2_marginal = r2_marginal) # check if CIs are requested, and compute bootstrapped CIs if (!is.null(ci) && !is.na(ci)) { # this is experimental! if (identical(ci_method, "analytical")) { result <- .safe(.analytical_icc_ci(model, ci, fun = "r2_nakagawa")) if (!is.null(result)) { r2_ci_marginal <- result$R2_marginal r2_ci_conditional <- result$R2_conditional } else { r2_ci_marginal <- r2_ci_conditional <- NA } } else { result <- .bootstrap_r2_nakagawa(model, iterations, tolerance, ci_method, ...) # CI for marginal R2 r2_ci_marginal <- as.vector(result$t[, 1]) r2_ci_marginal <- r2_ci_marginal[!is.na(r2_ci_marginal)] # validation check if (length(r2_ci_marginal) > 0) { r2_ci_marginal <- bayestestR::eti(r2_ci_marginal, ci = ci) } else { r2_ci_marginal <- NA } # CI for unadjusted R2 r2_ci_conditional <- as.vector(result$t[, 2]) r2_ci_conditional <- r2_ci_conditional[!is.na(r2_ci_conditional)] # validation check if (length(r2_ci_conditional) > 0) { r2_ci_conditional <- bayestestR::eti(r2_ci_conditional, ci = ci) } else { r2_ci_conditional <- NA } if ((all(is.na(r2_ci_marginal)) || all(is.na(r2_ci_conditional))) && verbose) { insight::format_warning( "Could not compute confidence intervals for R2. Try `ci_method = \"simple\"." ) } } out$R2_marginal <- c( out$R2_marginal, CI_low = r2_ci_marginal$CI_low, CI_high = r2_ci_marginal$CI_high ) out$R2_conditional <- c( out$R2_conditional, CI_low = r2_ci_conditional$CI_low, CI_high = r2_ci_conditional$CI_high ) attr(out, "ci") <- ci } class(out) <- c("r2_nakagawa", "list") } out } # methods ------ #' @export as.data.frame.r2_nakagawa <- function(x, row.names = NULL, optional = FALSE, ...) { data.frame( R2_conditional = x$R2_conditional, R2_marginal = x$R2_marginal, stringsAsFactors = FALSE, row.names = row.names, optional = optional, ... ) } #' @export print.r2_nakagawa <- function(x, digits = 3, ...) { model_type <- attr(x, "model_type") if (is.null(model_type)) { insight::print_color("# R2 for Mixed Models\n\n", "blue") } else { insight::print_color("# R2 for %s Regression\n\n", "blue") } out <- c( sprintf(" Conditional R2: %.*f", digits, x$R2_conditional[1]), sprintf(" Marginal R2: %.*f", digits, x$R2_marginal[1]) ) # add CI if (length(x$R2_conditional) == 3) { out[1] <- .add_r2_ci_to_print(out[1], x$R2_conditional[2], x$R2_conditional[3], digits = digits) } if (length(x$R2_marginal) == 3) { out[2] <- .add_r2_ci_to_print(out[2], x$R2_marginal[2], x$R2_marginal[3], digits = digits) } # separate lines for multiple R2 out <- paste0(out, collapse = "\n") cat(out) cat("\n") invisible(x) } # bootstrapping -------------- # bootstrapping using package "boot" .boot_r2_fun <- function(data, indices, model, tolerance) { d <- data[indices, ] # allows boot to select sample fit <- suppressWarnings(suppressMessages(stats::update(model, data = d))) vars <- .compute_random_vars(fit, tolerance, verbose = FALSE) if (is.null(vars) || all(is.na(vars))) { return(c(NA, NA)) } # Calculate R2 values if (insight::is_empty_object(vars$var.random) || is.na(vars$var.random)) { c(vars$var.fixed / (vars$var.fixed + vars$var.residual), NA) } else { c( vars$var.fixed / (vars$var.fixed + vars$var.random + vars$var.residual), (vars$var.fixed + vars$var.random) / (vars$var.fixed + vars$var.random + vars$var.residual) ) } } # bootstrapping using "lme4::bootMer" .boot_r2_fun_lme4 <- function(model) { vars <- .compute_random_vars(model, tolerance = 1e-05, verbose = FALSE) if (is.null(vars) || all(is.na(vars))) { return(c(NA, NA)) } # Calculate R2 values if (insight::is_empty_object(vars$var.random) || is.na(vars$var.random)) { c(vars$var.fixed / (vars$var.fixed + vars$var.residual), NA) } else { c( vars$var.fixed / (vars$var.fixed + vars$var.random + vars$var.residual), (vars$var.fixed + vars$var.random) / (vars$var.fixed + vars$var.random + vars$var.residual) ) } } # main bootstrap function .bootstrap_r2_nakagawa <- function(model, iterations, tolerance, ci_method = NULL, ...) { if (inherits(model, c("merMod", "lmerMod", "glmmTMB")) && !identical(ci_method, "boot")) { result <- .do_lme4_bootmer( model, .boot_r2_fun_lme4, iterations, dots = list(...) ) } else { insight::check_if_installed("boot") result <- boot::boot( data = insight::get_data(model, verbose = FALSE), statistic = .boot_r2_fun, R = iterations, sim = "ordinary", model = model, tolerance = tolerance ) } result } performance/R/r2_bayes.R0000644000176200001440000003255614517461276014635 0ustar liggesusers#' @title Bayesian R2 #' @name r2_bayes #' #' @description Compute R2 for Bayesian models. For mixed models (including a #' random part), it additionally computes the R2 related to the fixed effects #' only (marginal R2). While `r2_bayes()` returns a single R2 value, #' `r2_posterior()` returns a posterior sample of Bayesian R2 values. #' #' @param model A Bayesian regression model (from **brms**, #' **rstanarm**, **BayesFactor**, etc). #' @param robust Logical, if `TRUE`, the median instead of mean is used to #' calculate the central tendency of the variances. #' @param ci Value or vector of probability of the CI (between 0 and 1) to be #' estimated. #' @param ... Arguments passed to `r2_posterior()`. #' @inheritParams model_performance.lm #' #' @return A list with the Bayesian R2 value. For mixed models, a list with the #' Bayesian R2 value and the marginal Bayesian R2 value. The standard errors #' and credible intervals for the R2 values are saved as attributes. #' #' @details `r2_bayes()` returns an "unadjusted" R2 value. See #' [r2_loo()] to calculate a LOO-adjusted R2, which comes #' conceptually closer to an adjusted R2 measure. #' #' For mixed models, the conditional and marginal R2 are returned. The marginal #' R2 considers only the variance of the fixed effects, while the conditional #' R2 takes both the fixed and random effects into account. #' #' `r2_posterior()` is the actual workhorse for `r2_bayes()` and #' returns a posterior sample of Bayesian R2 values. #' #' @examplesIf require("rstanarm") && require("rstantools") && require("BayesFactor") && require("brms") #' library(performance) #' \donttest{ #' model <- suppressWarnings(rstanarm::stan_glm( #' mpg ~ wt + cyl, #' data = mtcars, #' chains = 1, #' iter = 500, #' refresh = 0, #' show_messages = FALSE #' )) #' r2_bayes(model) #' #' model <- suppressWarnings(rstanarm::stan_lmer( #' Petal.Length ~ Petal.Width + (1 | Species), #' data = iris, #' chains = 1, #' iter = 500, #' refresh = 0 #' )) #' r2_bayes(model) #' } #' #' BFM <- BayesFactor::generalTestBF(mpg ~ qsec + gear, data = mtcars, progress = FALSE) #' FM <- BayesFactor::lmBF(mpg ~ qsec + gear, data = mtcars) #' #' r2_bayes(FM) #' r2_bayes(BFM[3]) #' r2_bayes(BFM, average = TRUE) # across all models #' #' # with random effects: #' mtcars$gear <- factor(mtcars$gear) #' model <- BayesFactor::lmBF( #' mpg ~ hp + cyl + gear + gear:wt, #' mtcars, #' progress = FALSE, #' whichRandom = c("gear", "gear:wt") #' ) #' #' r2_bayes(model) #' #' \donttest{ #' model <- suppressWarnings(brms::brm( #' mpg ~ wt + cyl, #' data = mtcars, #' silent = 2, #' refresh = 0 #' )) #' r2_bayes(model) #' #' model <- suppressWarnings(brms::brm( #' Petal.Length ~ Petal.Width + (1 | Species), #' data = iris, #' silent = 2, #' refresh = 0 #' )) #' r2_bayes(model) #' } #' @references #' Gelman, A., Goodrich, B., Gabry, J., and Vehtari, A. (2018). #' R-squared for Bayesian regression models. The American Statistician, 1–6. #' \doi{10.1080/00031305.2018.1549100} #' @export r2_bayes <- function(model, robust = TRUE, ci = 0.95, verbose = TRUE, ...) { r2_bayesian <- r2_posterior(model, verbose = verbose, ...) if (is.null(r2_bayesian)) { return(NULL) } if (insight::is_multivariate(model)) { structure( class = "r2_bayes_mv", rapply(r2_bayesian, function(i) { if (robust) { stats::median(i) } else { mean(i) } }), SE = rapply(r2_bayesian, function(i) { if (robust) { stats::mad(i) } else { stats::sd(i) } }), # "Estimates" = rapply(r2_bayesian, bayestestR::point_estimate, centrality = "all", dispersion = TRUE), CI = rapply(r2_bayesian, bayestestR::hdi, ci = ci), ci_method = "HDI", robust = robust ) } else { structure( class = "r2_bayes", lapply(r2_bayesian, function(i) { if (robust) { stats::median(i) } else { mean(i) } }), SE = lapply(r2_bayesian, function(i) { if (robust) { stats::mad(i) } else { stats::sd(i) } }), # Estimates = lapply(r2_bayesian, bayestestR::point_estimate, centrality = "all", dispersion = TRUE), CI = lapply(r2_bayesian, bayestestR::hdi, ci = ci), ci_method = "HDI", robust = robust ) } } #' @export #' @rdname r2_bayes r2_posterior <- function(model, ...) { UseMethod("r2_posterior") } #' @export #' @rdname r2_bayes r2_posterior.brmsfit <- function(model, verbose = TRUE, ...) { insight::check_if_installed("rstantools") algorithm <- insight::find_algorithm(model) if (algorithm$algorithm != "sampling") { insight::format_warning( "`r2()` only available for models fit using the `sampling` algorithm." ) return(NA) } tryCatch( { mi <- insight::model_info(model) if (insight::is_multivariate(model)) { res <- insight::find_response(model) if (mi[[1]]$is_mixed) { br2_mv <- list( R2_Bayes = rstantools::bayes_R2( model, re.form = NULL, re_formula = NULL, summary = FALSE ), R2_Bayes_marginal = rstantools::bayes_R2( model, re.form = NA, re_formula = NA, summary = FALSE ) ) br2 <- lapply(seq_along(res), function(x) { list( R2_Bayes = unname(as.vector(br2_mv$R2_Bayes[, x])), R2_Bayes_marginal = unname(as.vector(br2_mv$R2_Bayes_marginal[, x])) ) }) names(br2) <- res } else { br2_mv <- list(R2_Bayes = rstantools::bayes_R2(model, summary = FALSE)) br2 <- lapply(seq_along(res), function(x) { list(R2_Bayes = unname(as.vector(br2_mv$R2_Bayes[, x]))) }) names(br2) <- res } } else { if (mi$is_mixed) { br2 <- list( R2_Bayes = as.vector(rstantools::bayes_R2( model, re.form = NULL, re_formula = NULL, summary = FALSE )), R2_Bayes_marginal = as.vector(rstantools::bayes_R2( model, re.form = NA, re_formula = NA, summary = FALSE )) ) names(br2$R2_Bayes) <- rep("Conditional R2", length(br2$R2_Bayes)) names(br2$R2_Bayes_marginal) <- rep("Marginal R2", length(br2$R2_Bayes)) } else { br2 <- list(R2_Bayes = as.vector(rstantools::bayes_R2(model, summary = FALSE))) names(br2$R2_Bayes) <- rep("R2", length(br2$R2_Bayes)) } } br2 }, error = function(e) { if (inherits(e, c("simpleError", "error"))) { insight::print_color(e$message, "red") cat("\n") } NULL } ) } #' @export #' @rdname r2_bayes r2_posterior.stanreg <- r2_posterior.brmsfit #' @export r2_posterior.stanmvreg <- function(model, verbose = TRUE, ...) { if (isTRUE(verbose)) { insight::format_error("Models of class `stanmvreg` not yet supported.") } NULL } #' @param average Compute model-averaged index? See [bayestestR::weighted_posteriors()]. #' @inheritParams bayestestR::weighted_posteriors #' @inheritParams r2_bayes #' @export #' @rdname r2_bayes r2_posterior.BFBayesFactor <- function(model, average = FALSE, prior_odds = NULL, verbose = TRUE, ...) { mi <- insight::model_info(model, verbose = FALSE) if (!mi$is_linear || mi$is_correlation || mi$is_ttest || mi$is_binomial || mi$is_meta) { if (verbose) { insight::format_warning("Can produce R2 only for linear models.") } return(NULL) } if (average) { return(.r2_posterior_model_average(model, prior_odds = prior_odds, verbose = verbose)) } insight::check_if_installed("rstantools") insight::check_if_installed("BayesFactor") everything_we_need <- .get_bfbf_predictions(model, verbose = verbose) # Compute R2! y <- everything_we_need[["y"]] yy <- everything_we_need[["y_pred"]] r2_bayesian <- data.frame(R2_Bayes = rstantools::bayes_R2(yy, y = y)) if ("y_pred_marginal" %in% names(everything_we_need)) { yy <- everything_we_need[["y_pred_marginal"]] r2_bayesian$R2_Bayes_marginal <- rstantools::bayes_R2(yy, y = y) } r2_bayesian } #' @keywords internal .r2_posterior_model_average <- function(model, prior_odds = NULL, verbose = TRUE) { insight::check_if_installed("BayesFactor") BFMods <- bayestestR::bayesfactor_models(model, verbose = FALSE) if (!is.null(BFMods$log_BF)) { BFMods$BF <- exp(BFMods$log_BF) } has_random <- !is.null(insight::find_predictors(model, effects = "random", flatten = TRUE)) if (any(is.na(BFMods$BF) | is.infinite(BFMods$BF))) { if (verbose) { insight::format_warning( "Can't compute model-averaged index. One or more Bayes factors are NA or infinite." ) } return(NULL) } # extract parameters intercept_only <- which(BFMods$Model == "1") params <- vector(mode = "list", length = nrow(BFMods)) for (m in seq_along(params)) { if (length(intercept_only) && m == intercept_only) { params[[m]] <- data.frame(R2_Bayes = rep(0, 4000)) } else if (m == 1) { # If the model is the "den" model params[[m]] <- suppressMessages(r2_posterior(1 / model[1])) } else { params[[m]] <- suppressMessages(r2_posterior(model[m - 1])) } # when there is no random effect, marginal = conditional if (has_random && is.null(params[[m]]$R2_Bayes_marginal)) { params[[m]]$R2_Bayes_marginal <- params[[m]]$R2_Bayes } } # Compute posterior model probabilities if (is.null(prior_odds)) { prior_odds <- rep(1, nrow(BFMods)) } else { prior_odds <- c(1, prior_odds) } posterior_odds <- prior_odds * BFMods$BF posterior_odds <- posterior_odds[-1] / posterior_odds[1] do.call( bayestestR::weighted_posteriors, c(params, list(missing = 0, prior_odds = posterior_odds)) ) } #' @export as.data.frame.r2_bayes <- function(x, ...) { out <- data.frame( R2 = x$R2_Bayes, SD = attributes(x)$SE$R2_Bayes, CI = attributes(x)$CI$R2_Bayes$CI, CI_low = attributes(x)$CI$R2_Bayes$CI_low, CI_high = attributes(x)$CI$R2_Bayes$CI_high, CI_method = attributes(x)$ci_method, stringsAsFactors = FALSE ) if (!is.null(x$R2_Bayes_marginal)) { out_marginal <- data.frame( R2 = x$R2_Bayes_marginal, SD = attributes(x)$SE$R2_Bayes_marginal, CI = attributes(x)$CI$R2_Bayes_marginal$CI, CI_low = attributes(x)$CI$R2_Bayes_marginal$CI_low, CI_high = attributes(x)$CI$R2_Bayes_marginal$CI_high, CI_method = attributes(x)$ci_method, stringsAsFactors = FALSE ) out$Component <- "conditional" out_marginal$Component <- "marginal" out <- rbind(out, out_marginal) } out$Effectsize <- "Bayesian R-squared" out } # Utils ------------------------------------------------------------------- .get_bfbf_predictions <- function(model, iterations = 4000, verbose = TRUE) { insight::check_if_installed("BayesFactor") # Estimates params <- insight::get_parameters( model, unreduce = FALSE, iterations = iterations, verbose = verbose ) # remove sig and g cols params_theta <- params[, !grepl(pattern = "^sig2$|^g_|^g$", colnames(params))] params_sigma <- sqrt(params[, grepl(pattern = "^sig2$", colnames(params))]) # Model Matrix mm <- insight::get_modelmatrix(model[1]) colnames(mm)[1] <- "mu" # match? if ((length(colnames(params_theta)) != length(colnames(mm))) || !all(colnames(params_theta) == colnames(mm))) { if (utils::packageVersion("BayesFactor") < package_version("0.9.12.4.3")) { insight::format_error("R2 for BayesFactor models with random effects requires BayesFactor v0.9.12.4.3 or higher.") } insight::format_error("Woops, you seem to have stumbled on some weird edge case. Please file an issue at {.url https://github.com/easystats/performance/issues}") # nolint } out <- list( y = insight::get_response(model, verbose = FALSE), y_pred = (as.matrix(params_theta) %*% t(mm)) ) rand <- insight::find_predictors(model[1], effects = "random", flatten = TRUE, verbose = FALSE) if (!is.null(rand)) { idx <- sapply(paste0("\\b", rand, "\\b"), grepl, x = colnames(params_theta)) idx <- apply(idx, 1, any) params_theta[idx] <- 0 out[["y_pred_marginal"]] <- (as.matrix(params_theta) %*% t(mm)) } out[["sigma"]] <- params_sigma out } #' @export residuals.BFBayesFactor <- function(object, ...) { everything_we_need <- .get_bfbf_predictions(object, verbose = FALSE) everything_we_need[["y"]] - colMeans(everything_we_need[["y_pred"]]) } #' @export fitted.BFBayesFactor <- function(object, ...) { colMeans(.get_bfbf_predictions(object, verbose = FALSE)[["y_pred"]]) } performance/R/model_performance.lavaan.R0000644000176200001440000001622514501062052020022 0ustar liggesusers#' Performance of lavaan SEM / CFA Models #' #' Compute indices of model performance for SEM or CFA models from the #' **lavaan** package. #' #' @param model A **lavaan** model. #' @param metrics Can be `"all"` or a character vector of metrics to be #' computed (some of `"Chi2"`, `"Chi2_df"`, `"p_Chi2"`, `"Baseline"`, #' `"Baseline_df"`, `"p_Baseline"`, `"GFI"`, `"AGFI"`, `"NFI"`, `"NNFI"`, #' `"CFI"`, `"RMSEA"`, `"RMSEA_CI_low"`, `"RMSEA_CI_high"`, `"p_RMSEA"`, #' `"RMR"`, `"SRMR"`, `"RFI"`, `"PNFI"`, `"IFI"`, `"RNI"`, `"Loglikelihood"`, #' `"AIC"`, `"BIC"`, and `"BIC_adjusted"`. #' @param verbose Toggle off warnings. #' @param ... Arguments passed to or from other methods. #' #' @return A data frame (with one row) and one column per "index" (see #' `metrics`). #' #' @details \subsection{Indices of fit}{ #' #' - **Chisq**: The model Chi-squared assesses overall fit and the #' discrepancy between the sample and fitted covariance matrices. Its p-value #' should be > .05 (i.e., the hypothesis of a perfect fit cannot be #' rejected). However, it is quite sensitive to sample size. #' #' - **GFI/AGFI**: The (Adjusted) Goodness of Fit is the proportion #' of variance accounted for by the estimated population covariance. #' Analogous to R2. The GFI and the AGFI should be > .95 and > .90, #' respectively. #' #' - **NFI/NNFI/TLI**: The (Non) Normed Fit Index. An NFI of 0.95, #' indicates the model of interest improves the fit by 95\% relative to the #' null model. The NNFI (also called the Tucker Lewis index; TLI) is #' preferable for smaller samples. They should be > .90 (Byrne, 1994) or > #' .95 (Schumacker and Lomax, 2004). #' #' - **CFI**: The Comparative Fit Index is a revised form of NFI. #' Not very sensitive to sample size (Fan, Thompson, and Wang, 1999). Compares #' the fit of a target model to the fit of an independent, or null, model. It #' should be > .90. #' #' - **RMSEA**: The Root Mean Square Error of Approximation is a #' parsimony-adjusted index. Values closer to 0 represent a good fit. It #' should be < .08 or < .05. The p-value printed with it tests the hypothesis #' that RMSEA is less than or equal to .05 (a cutoff sometimes used for good #' fit), and thus should be not significant. #' #' - **RMR/SRMR**: the (Standardized) Root Mean Square Residual #' represents the square-root of the difference between the residuals of the #' sample covariance matrix and the hypothesized model. As the RMR can be #' sometimes hard to interpret, better to use SRMR. Should be < .08. #' #' - **RFI**: the Relative Fit Index, also known as RHO1, is not #' guaranteed to vary from 0 to 1. However, RFI close to 1 indicates a good #' fit. #' #' - **IFI**: the Incremental Fit Index (IFI) adjusts the Normed Fit #' Index (NFI) for sample size and degrees of freedom (Bollen's, 1989). Over #' 0.90 is a good fit, but the index can exceed 1. #' #' - **PNFI**: the Parsimony-Adjusted Measures Index. There is no #' commonly agreed-upon cutoff value for an acceptable model for this index. #' Should be > 0.50. } #' #' See the documentation for `?lavaan::fitmeasures`. #' #' \subsection{What to report}{ #' Kline (2015) suggests that at a minimum the following indices should be #' reported: The model **chi-square**, the **RMSEA**, the **CFI** #' and the **SRMR**. #' } #' #' @examplesIf require("lavaan") #' # Confirmatory Factor Analysis (CFA) --------- #' data(HolzingerSwineford1939, package = "lavaan") #' structure <- " visual =~ x1 + x2 + x3 #' textual =~ x4 + x5 + x6 #' speed =~ x7 + x8 + x9 " #' model <- lavaan::cfa(structure, data = HolzingerSwineford1939) #' model_performance(model) #' #' @references #' #' - Byrne, B. M. (1994). Structural equation modeling with EQS and #' EQS/Windows. Thousand Oaks, CA: Sage Publications. #' #' - Tucker, L. R., and Lewis, C. (1973). The reliability coefficient for #' maximum likelihood factor analysis. Psychometrika, 38, 1-10. #' #' - Schumacker, R. E., and Lomax, R. G. (2004). A beginner's guide to #' structural equation modeling, Second edition. Mahwah, NJ: Lawrence Erlbaum #' Associates. #' #' - Fan, X., B. Thompson, and L. Wang (1999). Effects of sample size, #' estimation method, and model specification on structural equation modeling #' fit indexes. Structural Equation Modeling, 6, 56-83. #' #' - Kline, R. B. (2015). Principles and practice of structural equation #' modeling. Guilford publications. #' #' @export model_performance.lavaan <- function(model, metrics = "all", verbose = TRUE, ...) { insight::check_if_installed("lavaan") if (isTRUE(verbose)) { measures <- as.data.frame(t(as.data.frame(lavaan::fitmeasures(model, ...)))) } else { measures <- as.data.frame(t(as.data.frame(suppressWarnings(lavaan::fitmeasures(model, ...))))) } row.names(measures) <- NULL out <- data.frame( Chi2 = measures$chisq, Chi2_df = measures$df, p_Chi2 = measures$pvalue, Baseline = measures$baseline.chisq, Baseline_df = measures$baseline.df, p_Baseline = measures$baseline.pvalue, GFI = measures$gfi, AGFI = measures$agfi, NFI = measures$nfi, NNFI = measures$tli, CFI = measures$cfi, RMSEA = measures$rmsea, RMSEA_CI_low = measures$rmsea.ci.lower, RMSEA_CI_high = measures$rmsea.ci.upper, p_RMSEA = measures$rmsea.pvalue, RMR = measures$rmr, SRMR = measures$srmr, RFI = measures$rfi, PNFI = measures$pnfi, IFI = measures$ifi, RNI = measures$rni, Loglikelihood = measures$logl, AIC = measures$aic, BIC = measures$bic, BIC_adjusted = measures$bic2 ) if (all(metrics == "all")) { metrics <- names(out) } out <- out[, metrics] class(out) <- c("performance_lavaan", "performance_model", class(out)) out } #' @export model_performance.blavaan <- function(model, metrics = "all", verbose = TRUE, ...) { insight::check_if_installed(c("lavaan", "blavaan")) if (isTRUE(verbose)) { measures <- as.data.frame(t(as.data.frame(lavaan::fitmeasures(model, ...)))) fitind <- summary(blavaan::blavFitIndices(model)) } else { measures <- as.data.frame(t(as.data.frame(suppressWarnings(lavaan::fitmeasures(model, ...))))) fitind <- suppressWarnings(summary(blavaan::blavFitIndices(model))) } row.names(measures) <- NULL out <- data.frame( BRMSEA = fitind[1, "EAP"], SD_BRMSEA = fitind[1, "SD"], BGammaHat = fitind[2, "EAP"], SD_BGammaHat = fitind[2, "SD"], Adj_BGammaHat = fitind[3, "EAP"], SD_Adj_BGammaHat = fitind[3, "SD"], Loglikelihood = measures$logl, BIC = measures$bic, DIC = measures$dic, p_DIC = measures$p_dic, WAIC = measures$waic, SE_WAIC = measures$se_waic, p_WAIC = measures$p_waic, LOOIC = measures$looic, SE_LOOIC = measures$se_loo, p_LOOIC = measures$p_loo ) if (all(metrics == "all")) { metrics <- names(out) } out <- out[, metrics] class(out) <- c("performance_lavaan", "performance_model", class(out)) out } performance/R/performance_roc.R0000644000176200001440000001254614411556264016263 0ustar liggesusers#' @title Simple ROC curve #' @name performance_roc #' #' @description This function calculates a simple ROC curves of x/y coordinates #' based on response and predictions of a binomial model. #' #' @param x A numeric vector, representing the outcome (0/1), or a model with #' binomial outcome. #' @param predictions If `x` is numeric, a numeric vector of same length #' as `x`, representing the actual predicted values. #' @param new_data If `x` is a model, a data frame that is passed to #' `predict()` as `newdata`-argument. If `NULL`, the ROC for #' the full model is calculated. #' @param ... One or more models with binomial outcome. In this case, #' `new_data` is ignored. #' #' @note There is also a [`plot()`-method](https://easystats.github.io/see/articles/performance.html) #' implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @return A data frame with three columns, the x/y-coordinate pairs for the ROC #' curve (`Sensitivity` and `Specificity`), and a column with the #' model name. #' #' @examples #' library(bayestestR) #' data(iris) #' #' set.seed(123) #' iris$y <- rbinom(nrow(iris), size = 1, .3) #' folds <- sample(nrow(iris), size = nrow(iris) / 8, replace = FALSE) #' test_data <- iris[folds, ] #' train_data <- iris[-folds, ] #' #' model <- glm(y ~ Sepal.Length + Sepal.Width, data = train_data, family = "binomial") #' as.data.frame(performance_roc(model, new_data = test_data)) #' #' roc <- performance_roc(model, new_data = test_data) #' area_under_curve(roc$Specificity, roc$Sensitivity) #' #' if (interactive()) { #' m1 <- glm(y ~ Sepal.Length + Sepal.Width, data = iris, family = "binomial") #' m2 <- glm(y ~ Sepal.Length + Petal.Width, data = iris, family = "binomial") #' m3 <- glm(y ~ Sepal.Length + Species, data = iris, family = "binomial") #' performance_roc(m1, m2, m3) #' #' # if you have `see` package installed, you can also plot comparison of #' # ROC curves for different models #' if (require("see")) plot(performance_roc(m1, m2, m3)) #' } #' @export performance_roc <- function(x, ..., predictions, new_data) { dots <- list(...) object_names <- c( insight::safe_deparse_symbol(substitute(x)), sapply(match.call(expand.dots = FALSE)$`...`, insight::safe_deparse) ) if (insight::is_model(x)) { info <- insight::model_info(x) } else { info <- NULL } if (is.numeric(x) && !missing(predictions) && !is.null(predictions)) { .performance_roc_numeric(x, predictions) } else if (inherits(x, c("logitor", "logitmfx", "probitmfx", "model_fit")) && length(dots) == 0) { if (missing(new_data)) new_data <- NULL .performance_roc_model(x$fit, new_data) } else if (info$is_binomial && length(dots) == 0) { if (missing(new_data)) new_data <- NULL .performance_roc_model(x, new_data) } else if (length(dots) > 0) { .performance_roc_models(list(x, ...), names = object_names) } } # methods ----------------------------- #' @export plot.performance_roc <- function(x, ...) { insight::check_if_installed("see", "to plot ROC-curves") NextMethod() } #' @export print.performance_roc <- function(x, ...) { if (length(unique(x$Model)) == 1) { cat(sprintf("AUC: %.2f%%\n", 100 * bayestestR::area_under_curve(x$Specificity, x$Sensitivity))) } else { insight::print_color("# Area under Curve\n\n", "blue") dat <- split(x, f = x$Model) max_space <- max(nchar(x$Model)) for (i in seq_along(dat)) { cat(sprintf( " %*s: %.2f%%\n", max_space, names(dat)[i], 100 * bayestestR::area_under_curve(dat[[i]]$Specificity, dat[[i]]$Sensitivity) )) } } invisible(x) } # utilities --------------------------- .performance_roc_numeric <- function(x, predictions) { if (length(x) != length(predictions)) { insight::format_error("`x` and `predictions` must be of same length.") } x <- .recode_to_zero(x) x <- x[order(predictions, decreasing = TRUE)] res <- data.frame( Sensitivity = c(0, cumsum(x) / sum(x), 1), Specificity = c(0, cumsum(!x) / sum(!x), 1) ) class(res) <- c("performance_roc", "see_performance_roc", "data.frame") res } .performance_roc_model <- function(x, new_data, model_name = "Model 1") { predictions <- stats::predict(x, newdata = new_data, type = "response") if (is.null(new_data)) new_data <- insight::get_data(x, verbose = FALSE) response <- new_data[[insight::find_response(x)]] if ((is.data.frame(response) || is.matrix(response)) && ncol(response) > 1) { insight::format_error( "Can't calculate ROC for models with response-matrix (i.e. response variables with success/trials)." ) } dat <- .performance_roc_numeric(response, predictions) dat$Model <- model_name dat } .performance_roc_models <- function(x, names) { l <- lapply(seq_along(x), function(i) { if (.valid_roc_models(x[[i]])) { .performance_roc_model(x = x[[i]], new_data = NULL, model_name = names[i]) } else { insight::format_warning("Object '", names[i], "' is not valid.") } }) do.call(rbind, l) } # add supported glm models here .valid_roc_models <- function(x) { if (inherits(x, "model_fit")) { x <- x$fit } inherits(x, c("glm", "glmerMod", "logitor", "logitmfx", "probitmfx")) } performance/R/performance_score.R0000644000176200001440000001711014503335324016575 0ustar liggesusers#' @title Proper Scoring Rules #' @name performance_score #' #' @description Calculates the logarithmic, quadratic/Brier and spherical score #' from a model with binary or count outcome. #' #' @param model Model with binary or count outcome. #' @param ... Arguments from other functions, usually only used internally. #' @inheritParams model_performance.lm #' #' @return A list with three elements, the logarithmic, quadratic/Brier and spherical score. #' #' @details Proper scoring rules can be used to evaluate the quality of model #' predictions and model fit. `performance_score()` calculates the logarithmic, #' quadratic/Brier and spherical scoring rules. The spherical rule takes values #' in the interval `[0, 1]`, with values closer to 1 indicating a more #' accurate model, and the logarithmic rule in the interval `[-Inf, 0]`, #' with values closer to 0 indicating a more accurate model. #' #' For `stan_lmer()` and `stan_glmer()` models, the predicted values #' are based on `posterior_predict()`, instead of `predict()`. Thus, #' results may differ more than expected from their non-Bayesian counterparts #' in **lme4**. #' #' @references #' Carvalho, A. (2016). An overview of applications of proper scoring rules. #' Decision Analysis 13, 223–242. \doi{10.1287/deca.2016.0337} #' #' @note #' Code is partially based on #' [GLMMadaptive::scoring_rules()](https://drizopoulos.github.io/GLMMadaptive/reference/scoring_rules.html). #' #' @seealso [`performance_logloss()`] #' #' @examplesIf require("glmmTMB") #' ## Dobson (1990) Page 93: Randomized Controlled Trial : #' counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) #' outcome <- gl(3, 1, 9) #' treatment <- gl(3, 3) #' model <- glm(counts ~ outcome + treatment, family = poisson()) #' #' performance_score(model) #' \donttest{ #' data(Salamanders, package = "glmmTMB") #' model <- glmmTMB::glmmTMB( #' count ~ spp + mined + (1 | site), #' zi = ~ spp + mined, #' family = nbinom2(), #' data = Salamanders #' ) #' #' performance_score(model) #' } #' @export performance_score <- function(model, verbose = TRUE, ...) { # check special case if (inherits(model, c("logitor", "logitmfx", "probitmfx", "negbinirr", "negbinmfx", "poissonirr", "poissonmfx"))) { model <- model$fit } minfo <- list(...)$model_info if (is.null(minfo)) { minfo <- suppressWarnings(insight::model_info(model, verbose = FALSE)) } if (minfo$is_ordinal || minfo$is_multinomial) { if (verbose) { insight::print_color("Can't calculate proper scoring rules for ordinal, multinomial or cumulative link models.\n", "red") } return(list(logarithmic = NA, quadratic = NA, spherical = NA)) } resp <- insight::get_response(model, verbose = verbose) if (!is.null(ncol(resp)) && ncol(resp) > 1) { if (verbose) { insight::print_color( "Can't calculate proper scoring rules for models without integer response values.\n", "red" ) } return(list(logarithmic = NA, quadratic = NA, spherical = NA)) } prob_fun <- if (minfo$is_binomial) { function(x, mean, pis, n) stats::dbinom(x, size = n, prob = mean) } else if (minfo$is_poisson && !minfo$is_zero_inflated) { function(x, mean, pis, n) stats::dpois(x, lambda = mean) } else if (minfo$is_negbin && !minfo$is_zero_inflated) { function(x, mean, pis, n) stats::dnbinom(x, mu = mean, size = exp(.dispersion_parameter(model, minfo))) } else if (minfo$is_poisson && minfo$is_zero_inflated && !minfo$is_hurdle) { function(x, mean, pis, n) { ind0 <- x == 0 out <- (1 - pis) * stats::dpois(x, lambda = mean / (1 - pis)) out[ind0] <- pis[ind0] + out[ind0] out } } else if (minfo$is_zero_inflated && minfo$is_negbin && !minfo$is_hurdle) { function(x, mean, pis, n) { ind0 <- x == 0 out <- (1 - pis) * stats::dnbinom(x, mu = mean / (1 - pis), size = exp(.dispersion_parameter(model, minfo))) out[ind0] <- pis[ind0] + out[ind0] out } } else if (minfo$is_hurdle && minfo$is_poisson) { function(x, mean, pis, n) { ind0 <- x == 0 trunc_zero <- stats::dpois(x, lambda = mean) / stats::ppois(0, lambda = mean, lower.tail = FALSE) out <- (1 - pis) * trunc_zero out[ind0] <- pis[ind0] out } } else if (minfo$is_hurdle && minfo$is_negbin) { function(x, mean, pis, n) { ind0 <- x == 0 trunc_zero <- stats::dnbinom(x, mu = mean, size = exp(.dispersion_parameter(model, minfo))) / stats::pnbinom(0, mu = mean, size = exp(.dispersion_parameter(model, minfo)), lower.tail = FALSE) out <- (1 - pis) * trunc_zero out[ind0] <- pis[ind0] out } } pr <- .predict_score_y(model) resp <- if (minfo$is_binomial) { .recode_to_zero(resp) } else { datawizard::to_numeric(resp, dummy_factors = FALSE, preserve_levels = TRUE) } p_y <- prob_fun(resp, mean = pr$pred, pis = pr$pred_zi, sum(resp)) quadrat_p <- sum(p_y^2) structure( class = "performance_score", list( logarithmic = mean(log(p_y)), quadratic = mean(2 * p_y + quadrat_p), spherical = mean(p_y / sqrt(quadrat_p)) ) ) } # methods ----------------------------------- #' @export as.data.frame.performance_score <- function(x, row.names = NULL, ...) { data.frame( logarithmic = x$logarithmic, quadratic = x$quadratic, spherical = x$spherical, stringsAsFactors = FALSE, row.names = row.names, ... ) } #' @export print.performance_score <- function(x, ...) { # headline insight::print_color("# Proper Scoring Rules\n\n", "blue") results <- format( c( sprintf("%.4f", x$logarithmic), sprintf("%.4f", x$quadratic), sprintf("%.4f", x$spherical) ), justify = "right" ) cat(sprintf("logarithmic: %s\n", results[1])) cat(sprintf(" quadratic: %s\n", results[2])) cat(sprintf(" spherical: %s\n", results[3])) invisible(x) } # utilities --------------------------------- .dispersion_parameter <- function(model, minfo) { if (inherits(model, "MixMod")) { model$phis } else if (inherits(model, "glmmTMB")) { if (minfo$is_zero_inflated) { insight::check_if_installed("glmmTMB") glmmTMB::getME(model, "theta") } else { sum(stats::residuals(model, type = "pearson")^2) / stats::df.residual(model) } } else { .safe(sum(stats::residuals(model, type = "pearson")^2) / stats::df.residual(model), 0) } } .predict_score_y <- function(model) { pred <- NULL pred_zi <- NULL tryCatch( { if (inherits(model, "MixMod")) { pred <- stats::predict(model, type = "subject_specific") pred_zi <- if (!is.null(model$gammas)) attr(pred, "zi_probs") } else if (inherits(model, "glmmTMB")) { pred <- stats::predict(model, type = "response") pred_zi <- stats::predict(model, type = "zprob") } else if (inherits(model, c("hurdle", "zeroinfl"))) { pred <- stats::predict(model, type = "response") pred_zi <- stats::predict(model, type = "zero") } else if (inherits(model, c("clm", "clm2", "clmm"))) { pred <- stats::predict(model) } else if (all(inherits(model, c("stanreg", "lmerMod"), which = TRUE)) > 0) { insight::check_if_installed("rstanarm") pred <- colMeans(rstanarm::posterior_predict(model)) } else { pred <- stats::predict(model, type = "response") } }, error = function(e) { return(NULL) } ) list(pred = pred, pred_zi = pred_zi) } performance/R/binned_residuals.R0000644000176200001440000002115514517461276016432 0ustar liggesusers#' @title Binned residuals for binomial logistic regression #' @name binned_residuals #' #' @description Check model quality of binomial logistic regression models. #' #' @param model A `glm`-object with *binomial*-family. #' @param term Name of independent variable from `x`. If not `NULL`, #' average residuals for the categories of `term` are plotted; else, #' average residuals for the estimated probabilities of the response are #' plotted. #' @param n_bins Numeric, the number of bins to divide the data. If #' `n_bins = NULL`, the square root of the number of observations is #' taken. #' @param ci Numeric, the confidence level for the error bounds. #' @param ci_type Character, the type of error bounds to calculate. Can be #' `"exact"` (default), `"gaussian"` or `"boot"`. `"exact"` calculates the #' error bounds based on the exact binomial distribution, using [`binom.test()`]. #' `"gaussian"` uses the Gaussian approximation, while `"boot"` uses a simple #' bootstrap method, where confidence intervals are calculated based on the #' quantiles of the bootstrap distribution. #' @param residuals Character, the type of residuals to calculate. Can be #' `"deviance"` (default), `"pearson"` or `"response"`. It is recommended to #' use `"response"` only for those models where other residuals are not #' available. #' @param iterations Integer, the number of iterations to use for the #' bootstrap method. Only used if `ci_type = "boot"`. #' @param show_dots Logical, if `TRUE`, will show data points in the plot. Set #' to `FALSE` for models with many observations, if generating the plot is too #' time-consuming. By default, `show_dots = NULL`. In this case `binned_residuals()` #' tries to guess whether performance will be poor due to a very large model #' and thus automatically shows or hides dots. #' @param verbose Toggle warnings and messages. #' @param ... Currently not used. #' #' @return A data frame representing the data that is mapped in the accompanying #' plot. In case all residuals are inside the error bounds, points are black. #' If some of the residuals are outside the error bounds (indicated by the #' grey-shaded area), blue points indicate residuals that are OK, while red #' points indicate model under- or over-fitting for the relevant range of #' estimated probabilities. #' #' @details Binned residual plots are achieved by "dividing the data into #' categories (bins) based on their fitted values, and then plotting #' the average residual versus the average fitted value for each bin." #' _(Gelman, Hill 2007: 97)_. If the model were true, one would #' expect about 95% of the residuals to fall inside the error bounds. #' #' If `term` is not `NULL`, one can compare the residuals in #' relation to a specific model predictor. This may be helpful to check if a #' term would fit better when transformed, e.g. a rising and falling pattern #' of residuals along the x-axis is a signal to consider taking the logarithm #' of the predictor (cf. Gelman and Hill 2007, pp. 97-98). #' #' @note `binned_residuals()` returns a data frame, however, the `print()` #' method only returns a short summary of the result. The data frame itself #' is used for plotting. The `plot()` method, in turn, creates a ggplot-object. #' #' @references #' Gelman, A., and Hill, J. (2007). Data analysis using regression and #' multilevel/hierarchical models. Cambridge; New York: Cambridge University #' Press. #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' result <- binned_residuals(model) #' result #' #' # look at the data frame #' as.data.frame(result) #' #' \donttest{ #' # plot #' if (require("see")) { #' plot(result, show_dots = TRUE) #' } #' } #' #' @export binned_residuals <- function(model, term = NULL, n_bins = NULL, show_dots = NULL, ci = 0.95, ci_type = c("exact", "gaussian", "boot"), residuals = c("deviance", "pearson", "response"), iterations = 1000, verbose = TRUE, ...) { # match arguments ci_type <- match.arg(ci_type) residuals <- match.arg(residuals) # for non-bernoulli models, `"exact"` doesn't work if (isFALSE(insight::model_info(model)$is_bernoulli)) { ci_type <- "gaussian" if (verbose) { insight::format_alert("Using `ci_type = \"gaussian\"` because model is not bernoulli.") } } fitted_values <- stats::fitted(model) mf <- insight::get_data(model, verbose = FALSE) if (is.null(term)) { pred <- fitted_values } else { pred <- mf[[term]] } # set default for show_dots, based on "model size" if (is.null(show_dots)) { n <- .safe(insight::n_obs(model)) show_dots <- is.null(n) || n <= 1e5 } # make sure response is 0/1 (and numeric) y0 <- .recode_to_zero(insight::get_response(model, verbose = FALSE)) # calculate residuals y <- switch(residuals, response = y0 - fitted_values, pearson = .safe((y0 - fitted_values) / sqrt(fitted_values * (1 - fitted_values))), deviance = .safe(stats::residuals(model, type = "deviance")) ) # make sure we really have residuals if (is.null(y)) { insight::format_error("Could not calculate residuals. Try using `residuals = \"response\"`.") } if (is.null(n_bins)) n_bins <- round(sqrt(length(pred))) breaks.index <- floor(length(pred) * (1:(n_bins - 1)) / n_bins) breaks <- unique(c(-Inf, sort(pred)[breaks.index], Inf)) model.binned <- as.numeric(cut(pred, breaks)) d <- suppressWarnings(lapply(1:n_bins, function(.x) { items <- (seq_along(pred))[model.binned == .x] model.range <- range(pred[items], na.rm = TRUE) xbar <- mean(pred[items], na.rm = TRUE) ybar <- mean(y[items], na.rm = TRUE) n <- length(items) sdev <- stats::sd(y[items], na.rm = TRUE) conf_int <- switch(ci_type, gaussian = stats::qnorm(c((1 - ci) / 2, (1 + ci) / 2), mean = ybar, sd = sdev / sqrt(n)), exact = { out <- stats::binom.test(sum(y0[items]), n)$conf.int # center CIs around point estimate out <- out - (min(out) - ybar) - (diff(out) / 2) out }, boot = .boot_binned_ci(y[items], ci, iterations) ) names(conf_int) <- c("CI_low", "CI_high") d0 <- data.frame( xbar = xbar, ybar = ybar, n = n, x.lo = model.range[1], x.hi = model.range[2], se = stats::qnorm((1 + ci) / 2) * sdev / sqrt(n) ) cbind(d0, rbind(conf_int)) })) d <- do.call(rbind, d) d <- d[stats::complete.cases(d), ] gr <- abs(d$ybar) > abs(d$se) d$group <- "yes" d$group[gr] <- "no" resid_ok <- sum(d$group == "yes") / length(d$group) class(d) <- c("binned_residuals", "see_binned_residuals", class(d)) attr(d, "resid_ok") <- resid_ok attr(d, "resp_var") <- insight::find_response(model) attr(d, "term") <- term attr(d, "show_dots") <- show_dots d } # utilities --------------------------- .boot_binned_ci <- function(x, ci = 0.95, iterations = 1000) { x <- x[!is.na(x)] n <- length(x) out <- vector("numeric", iterations) for (i in seq_len(iterations)) { out[i] <- sum(x[sample.int(n, n, replace = TRUE)]) } out <- out / n quant <- stats::quantile(out, c((1 - ci) / 2, (1 + ci) / 2), na.rm = TRUE) c(CI_low = quant[1L], CI_high = quant[2L]) } # methods ----------------------------- #' @export print.binned_residuals <- function(x, ...) { resid_ok <- attributes(x)$resid_ok if (!is.null(resid_ok)) { if (resid_ok < 0.8) { insight::print_color( sprintf( "Warning: Probably bad model fit. Only about %g%% of the residuals are inside the error bounds.\n", round(100 * resid_ok) ), "red" ) } else if (resid_ok < 0.95) { insight::print_color( sprintf( "Warning: About %g%% of the residuals are inside the error bounds (~95%% or higher would be good).\n", round(100 * resid_ok) ), "yellow" ) } else { insight::print_color( sprintf( "Ok: About %g%% of the residuals are inside the error bounds.\n", round(100 * resid_ok) ), "green" ) } } } #' @export plot.binned_residuals <- function(x, ...) { insight::check_if_installed("see", "to plot binned residuals") NextMethod() } performance/R/item_discrimination.R0000644000176200001440000000530114414213045017126 0ustar liggesusers#' @title Discrimination of Questionnaire Items #' @name item_discrimination #' #' @description Compute various measures of internal consistencies #' for tests or item-scales of questionnaires. #' #' @param x A matrix or a data frame. #' @param standardize Logical, if `TRUE`, the data frame's vectors will be #' standardized. Recommended when the variables have different measures / #' scales. #' #' @return A data frame with the item discrimination (*corrected item-total #' correlations*) for each item of the scale. #' #' @details #' This function calculates the item discriminations (corrected item-total #' correlations for each item of `x` with the remaining items) for each item #' of a scale. The absolute value of the item discrimination indices should be #' above 0.2. An index between 0.2 and 0.4 is considered as "fair", while a #' satisfactory index ranges from 0.4 to 0.7. Items with low discrimination #' indices are often ambiguously worded and should be examined. Items with #' negative indices should be examined to determine why a negative value was #' obtained (e.g. reversed answer categories regarding positive and negative #' poles). #' #' @references #' - Kelava A, Moosbrugger H (2020). Deskriptivstatistische Itemanalyse und #' Testwertbestimmung. In: Moosbrugger H, Kelava A, editors. Testtheorie und #' Fragebogenkonstruktion. Berlin, Heidelberg: Springer, 143–158 #' #' @examples #' data(mtcars) #' x <- mtcars[, c("cyl", "gear", "carb", "hp")] #' item_discrimination(x) #' @export item_discrimination <- function(x, standardize = FALSE) { # check param if (!is.matrix(x) && !is.data.frame(x)) { insight::format_alert("`x` needs to be a data frame or matrix.") return(NULL) } # remove missings, so correlation works x <- stats::na.omit(x) # remember item (column) names for return value # return value gets column names of initial data frame df.names <- colnames(x) # Check whether items should be scaled. Needed, # when items have different measures / scales if (standardize) { x <- .std(x) } # calculate corrected total-item correlation id <- vapply(seq_len(ncol(x)), function(i) { stats::cor(x[, i], rowSums(x[, -i]), use = "pairwise.complete.obs") }, numeric(1)) out <- data.frame( Item = df.names, Discrimination = id, stringsAsFactors = FALSE ) class(out) <- c("item_discrimination", "data.frame") out } # methods -------------------------------------- #' @export print.item_discrimination <- function(x, ...) { out <- insight::format_table(x, ...) cat(insight::export_table(out, caption = c("Item Discrimination", "blue"), ...)) invisible(x) } performance/R/get_gradients.R0000644000176200001440000000423714325226672015735 0ustar liggesusers# Tests # data(iris) # iris$w <- rnorm(nrow(iris), 1, .3) # x <- lm(Sepal.Length ~ Species * Sepal.Width, data=iris) # all(sandwich::estfun(x) == .get_gradients(x)) # x <- lm(Sepal.Length ~ Species * Sepal.Width + Petal.Length * Petal.Width, weights = w, data=iris) # all(sandwich::estfun(x) == .get_gradients(x)) # x <- glm(vs ~ mpg, data=mtcars, weights = wt) # all(sandwich::estfun(x) == .get_gradients(x)) .get_gradients <- function(x, ...) { UseMethod(".get_gradients") } .get_gradients.default <- function(x, ...) { insight::check_if_installed("sandwich") tryCatch( { sandwich::estfun(x, ...) }, error = function(e) { insight::format_error( paste0("Could not compute gradients from a model object of class `", class(x)[1], "`."), "Please try a different test-function, or file an issue at {.url https://github.com/easystats/performance/issues}." ) } ) } .get_gradients.lmerMod <- function(x, ...) { insight::get_residuals(x) * insight::get_weights(x, null_as_ones = TRUE) * insight::get_modelmatrix(x) } .get_gradients.glmerMod <- function(x, ...) { w <- as.vector(insight::get_residuals(x, "working")) * insight::get_weights(x, "working") w * insight::get_modelmatrix(x) / insight::get_auxiliary(x, type = "dispersion") } .get_gradients.glmmTMB <- function(x, ...) { if (insight::model_info(x)$is_linear) { insight::get_residuals(x) * insight::get_weights(x, null_as_ones = TRUE) * insight::get_modelmatrix(x) } else { w <- as.vector(insight::get_residuals(x)) * insight::get_weights(x, null_as_ones = TRUE) w * insight::get_modelmatrix(x) / insight::get_auxiliary(x, type = "dispersion") } } # .get_gradients.lm <- .get_gradients.lmer # # .get_gradients.glm <- function(x, ...) { # w <- as.vector(residuals(x, "working")) * weights(x, "working") # if (substr(x$family$family, 1, 17) %in% c("poisson", "binomial", "Negative Binomial")) { # dispersion <- 1 # } else{ # dispersion <- sum(w^2, na.rm = TRUE)/sum(weights(x, "working"), na.rm = TRUE) # } # rez <- w * insight::get_modelmatrix(x) / dispersion # rez # } # performance/R/test_vuong.R0000644000176200001440000002050614512471542015304 0ustar liggesusers#' @rdname test_performance #' @export test_vuong <- function(..., verbose = TRUE) { UseMethod("test_vuong") } #' @export test_vuong.default <- function(..., reference = 1, verbose = TRUE) { # Attribute class to list and get names from the global environment objects <- insight::ellipsis_info(..., only_models = TRUE) # validation checks (will throw error if non-valid objects) objects <- .test_performance_checks(objects, verbose = verbose) # ensure proper object names objects <- .check_objectnames(objects, sapply(match.call(expand.dots = FALSE)$`...`, as.character)) # If a suitable class is found, run the more specific method on it if (inherits(objects, c("ListNestedRegressions", "ListNonNestedRegressions", "ListLavaan"))) { test_vuong(objects, reference = reference) } else { insight::format_error("The models cannot be compared for some reason :/") } } # TODO: Add a nice printing method with some interpretation (see nonnest2's output) #' @export test_vuong.ListNestedRegressions <- function(objects, ...) { .test_vuong(objects, nested = TRUE, reference = NULL) } #' @export test_vuong.ListNonNestedRegressions <- function(objects, reference = 1, ...) { .test_vuong(objects, nested = FALSE, reference = reference) } # ------------------------------------------------------------------------- # Utils ------------------------------------------------------------------- # ------------------------------------------------------------------------- # The code below is adapted from nonnest2: https://github.com/cran/nonnest2/blob/master/R/vuongtest.R # All credits go to its author # Testing snippets before each function were added for quick testing, but can be removed later # TODO: Get rid of dependencies. Currently the functions require: # - sandwich::estfun() # - CompQuadForm::imhof() .test_vuong <- function(objects, nested = FALSE, reference = NULL, ...) { out <- data.frame(Omega2 = NA, p_Omega2 = NA, LR = NA, p_LR = NA, stringsAsFactors = FALSE) for (i in 2:length(objects)) { if (is.null(reference)) { ref <- objects[[i - 1]] } else { ref <- objects[[reference]] } rez <- .test_vuong_pairs(ref, objects[[i]], nested = nested, adj = "none") out <- rbind( out, data.frame( Omega2 = rez$Omega2, p_Omega2 = rez$p_Omega2, LR = rez$LRTstat, p_LR = rez$p_LRT, stringsAsFactors = FALSE ) ) } out <- cbind(.test_performance_init(objects), out) attr(out, "is_nested") <- nested attr(out, "reference") <- reference class(out) <- c("test_performance", class(out)) out } # Vuong test for two models ----------------------------------------------- # ------------------------------------------------------------------------- # m1 <- lm(mpg ~ disp, data=mtcars) # m2 <- lm(mpg ~ drat, data=mtcars) # ref <- nonnest2::vuongtest(m1, m2, nested=FALSE) # rez <- .test_vuong(m1, m2, nested=FALSE) # all(ref$omega == rez$Omega2) # ref$p_omega == rez$p_Omega2 # ref$LRTstat == rez$LRTstat # # m1 <- lm(mpg ~ disp, data=mtcars) # m2 <- lm(mpg ~ disp + drat, data=mtcars) # object1 <- m1; object2 <- m2 # ref <- nonnest2::vuongtest(m1, m2, nested=TRUE) # rez <- .test_vuong(m1, m2, nested=TRUE) # all(ref$omega == rez$Omega2) # ref$p_omega == rez$p_Omega2 # ref$LRTstat == rez$LRTstat # # ref <- nonnest2::vuongtest(m2, m1, nested=TRUE) # rez <- .test_vuong(m2, m1, nested=TRUE) # all(ref$omega == rez$Omega2) # ref$p_omega == rez$p_Omega2 # ref$LRTstat == rez$LRTstat .test_vuong_pairs <- function(object1, object2, nested = FALSE, adj = "none") { insight::check_if_installed("CompQuadForm") # If nested==TRUE, find the full model and reverse if necessary if (nested) { dfs <- c(insight::get_df(object1, type = "residual"), insight::get_df(object2), type = "residual") if (order(dfs)[1] == 2) { temp <- object2 object2 <- object1 object1 <- temp } } # Get individual log-likelihoods llA <- attributes(insight::get_loglikelihood(object1))$per_obs llB <- attributes(insight::get_loglikelihood(object2))$per_obs # DISTINGUISABILITY TEST -------- # Eq (4.2) n <- insight::n_obs(object1) omega_hat_2 <- (n - 1) / n * stats::var(llA - llB, na.rm = TRUE) # Get p-value of weighted chi-square dist lamstar <- .test_vuong_lambda(object1, object2) # Note: dr package requires non-negative weights, which does not help when nested==TRUE # tmp <- dr::dr.pvalue(lamstar^2, n * omega_hat_2) # pOmega <- tmp[[4]] p <- suppressWarnings(CompQuadForm::imhof(n * omega_hat_2, lamstar^2)$Qq) # ROBUST LRTEST ----------- # Calculate likelihood ratio; Eq (6.4) lr <- sum(llA - llB, na.rm = TRUE) # Adjustments to likelihood ratio if (adj != "none") { # FIXME lavaan equality constraints; use df instead? nparA <- insight::n_parameters(object1, effects = "fixed") nparB <- insight::n_parameters(object2, effects = "fixed") if (adj == "aic") { lr <- lr - (nparA - nparB) } if (adj == "bic") { lr <- lr - (nparA - nparB) * log(n) / 2 } } # Null distribution and test stat depends on nested if (nested) { teststat <- 2 * lr p_LRTA <- suppressWarnings(CompQuadForm::imhof(teststat, -lamstar)[[1]]) p_LRTB <- NA } else { teststat <- (1 / sqrt(n)) * lr / sqrt(omega_hat_2) ## Two 1-tailed p-values from a normal: p_LRTA <- stats::pnorm(teststat, lower.tail = FALSE) p_LRTB <- stats::pnorm(teststat) } rval <- list( Omega2 = omega_hat_2, p_Omega2 = p, LRTstat = teststat, p_LRT = min(c(p_LRTA, p_LRTB), na.rm = TRUE) ) rval } # Compute lambda (Eq 3.6) ------------------------------------------------- # ------------------------------------------------------------------------- # m1 <- lm(Sepal.Length ~ Petal.Width, data=iris) # m2 <- lm(Sepal.Length ~ Sepal.Width, data=iris) # ref <- nonnest2:::calcLambda(m1, m2, n=150, score1=NULL, score2=NULL, vc1=stats::vcov, vc2=stats::vcov) # rez <- .test_vuong_lambda(m1, m2) # all(ref == rez) .test_vuong_lambda <- function(model1, model2) { # Compute lambda (Eq 3.6) # Get AB AB1 <- .test_vuong_AB(model1) AB2 <- .test_vuong_AB(model2) # Eq (2.7) Bc <- crossprod(AB1$sc, AB2$sc) / AB1$n W <- cbind( rbind( -AB1$B %*% chol2inv(chol(AB1$A)), t(Bc) %*% chol2inv(chol(AB1$A)) ), rbind( -Bc %*% chol2inv(chol(AB2$A)), AB2$B %*% chol2inv(chol(AB2$A)) ) ) lamstar <- eigen(W, only.values = TRUE)$values # Discard imaginary part, as it only occurs for tiny eigenvalues? Re(lamstar) } # Compute AB (Eq 2.1 and 2.2) --------------------------------------------- # ------------------------------------------------------------------------- # m <- lm(Sepal.Length ~ Petal.Width * Species, data=iris) # ref <- nonnest2:::calcAB(m, n=150, scfun = NULL, vc = stats::vcov) # rez <- .test_vuong_AB(m) # all(ref$A == rez$A) # all(ref$B == rez$B) # all(ref$sc == rez$sc) # # structure <- " visual =~ x1 + x2 + x3 # textual =~ x4 + x5 + x6 # speed =~ x7 + x8 + x9 # # visual ~~ textual + speed " # model <- lavaan::sem(structure, data = lavaan::HolzingerSwineford1939) # ref <- nonnest2:::calcAB(model, n=insight::n_obs(model), scfun = NULL, vc = lavaan::vcov) # rez <- .test_vuong_AB(model) # all(ref$A == rez$A) # all(ref$B == rez$B) # all(ref$sc == rez$sc) .test_vuong_AB <- function(model) { # A, B as defined in Vuong Eq (2.1) and (2.2) n <- insight::n_obs(model) # Get A (Eq 2.1) if (inherits(model, "lavaan")) { insight::check_if_installed("lavaan") covmat <- lavaan::vcov(model) # model@vcov$vcov duplicates <- duplicated(colnames(covmat)) covmat <- n * covmat[!duplicates, !duplicates] scaling <- 1 } else { scaling <- insight::get_sigma(model, ci = NULL, verbose = FALSE)^2 if (is.null(scaling) || is.na(scaling)) scaling <- 1 covmat <- n * insight::get_varcov(model, component = "conditional") } A <- chol2inv(chol(covmat)) # Get B (Eq 2.2) sc <- (1 / scaling) * .get_gradients(model) sc.cp <- crossprod(sc) / n B <- matrix(sc.cp, nrow(A), nrow(A)) list(A = A, B = B, sc = sc, n = n) } performance/R/r2_kl.R0000644000176200001440000000164514257247716014135 0ustar liggesusers#' @title Kullback-Leibler R2 #' @name r2_kullback #' #' @description Calculates the Kullback-Leibler-divergence-based #' R2 for generalized linear models. #' #' @param model A generalized linear model. #' @param adjust Logical, if `TRUE` (the default), the adjusted R2 value is #' returned. #' #' @return A named vector with the R2 value. #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' r2_kullback(model) #' @references #' Cameron, A. C. and Windmeijer, A. G. (1997) An R-squared measure of goodness #' of fit for some common nonlinear regression models. Journal of Econometrics, #' 77: 329-342. #' #' @export r2_kullback <- function(model, adjust = TRUE) { if (adjust) { adj <- model$df.null / model$df.residual } else { adj <- 1 } klr2 <- 1 - (model$deviance / model$null.deviance) * adj names(klr2) <- "Kullback-Leibler R2" klr2 } performance/R/check_heterogeneity_bias.R0000644000176200001440000000625314473560114020120 0ustar liggesusers#' Check model predictor for heterogeneity bias #' #' `check_heterogeneity_bias()` checks if model predictors or variables may #' cause a heterogeneity bias, i.e. if variables have a within- and/or #' between-effect (_Bell and Jones, 2015_). #' #' @param x A data frame or a mixed model object. #' @param select Character vector (or formula) with names of variables to select #' that should be checked. If `x` is a mixed model object, this argument #' will be ignored. #' @param group Character vector (or formula) with the name of the variable that #' indicates the group- or cluster-ID. If `x` is a model object, this #' argument will be ignored. #' #' @seealso #' For further details, read the vignette #' and also #' see documentation for [`datawizard::demean()`]. #' #' @references #' - Bell A, Jones K. 2015. Explaining Fixed Effects: Random Effects #' Modeling of Time-Series Cross-Sectional and Panel Data. Political Science #' Research and Methods, 3(1), 133–153. #' #' @examples #' data(iris) #' iris$ID <- sample(1:4, nrow(iris), replace = TRUE) # fake-ID #' check_heterogeneity_bias(iris, select = c("Sepal.Length", "Petal.Length"), group = "ID") #' @export check_heterogeneity_bias <- function(x, select = NULL, group = NULL) { if (insight::is_model(x)) { group <- insight::find_random(x, split_nested = TRUE, flatten = TRUE) if (is.null(group)) { insight::format_error("Model is no mixed model. Please provide a mixed model, or a data frame and arguments `select` and `group`.") } data <- insight::get_data(x, source = "mf", verbose = FALSE) select <- insight::find_predictors(x, effects = "fixed", component = "conditional", flatten = TRUE) } else { if (inherits(select, "formula")) { select <- all.vars(select) } if (inherits(group, "formula")) { group <- all.vars(group) } data <- x } unique_groups <- .n_unique(data[[group]]) combinations <- expand.grid(select, group) result <- Map(function(predictor, id) { # demean predictor d <- datawizard::demean(data, select = predictor, group = id, verbose = FALSE) # get new names within_name <- paste0(predictor, "_within") # check if any within-variable differs from zero. if yes, we have # a within-subject effect if (any(abs(d[[within_name]]) > 1e-5)) { predictor } else { NULL } }, as.character(combinations[[1]]), as.character(combinations[[2]])) out <- unlist(insight::compact_list(result), use.names = FALSE) if (is.null(out)) { message("No predictor found that could cause heterogeneity bias.") return(invisible(NULL)) } class(out) <- c("check_heterogeneity_bias", class(out)) out } #' @export print.check_heterogeneity_bias <- function(x, ...) { cat("Possible heterogeneity bias due to following predictors: ") insight::print_color(toString(x), "red") cat("\n") invisible(x) } #' @keywords internal .n_unique <- function(x, na.rm = TRUE) { if (is.null(x)) { return(0) } if (isTRUE(na.rm)) x <- x[!is.na(x)] length(unique(x)) } performance/R/r2_mckelvey.R0000644000176200001440000000472614327475467015355 0ustar liggesusers#' @title McKelvey & Zavoinas R2 #' @name r2_mckelvey #' #' @description Calculates McKelvey and Zavoinas pseudo R2. #' #' @param model Generalized linear model. #' #' @return The R2 value. #' #' @references #' McKelvey, R., Zavoina, W. (1975), "A Statistical Model for the Analysis of #' Ordinal Level Dependent Variables", Journal of Mathematical Sociology 4, S. #' 103–120. #' #' @details McKelvey and Zavoinas R2 is based on the explained variance, #' where the variance of the predicted response is divided by the sum #' of the variance of the predicted response and residual variance. #' For binomial models, the residual variance is either `pi^2/3` #' for logit-link and 1 for probit-link. For poisson-models, the #' residual variance is based on log-normal approximation, similar to #' the *distribution-specific variance* as described in #' `?insight::get_variance`. #' #' @examples #' ## Dobson (1990) Page 93: Randomized Controlled Trial: #' counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) # #' outcome <- gl(3, 1, 9) #' treatment <- gl(3, 3) #' model <- glm(counts ~ outcome + treatment, family = poisson()) #' #' r2_mckelvey(model) #' @export r2_mckelvey <- function(model) { UseMethod("r2_mckelvey") } #' @export r2_mckelvey.default <- function(model) { .r2_mckelvey(model) } .r2_mckelvey <- function(model) { faminfo <- insight::model_info(model) n <- insight::n_obs(model, disaggregate = TRUE) if (faminfo$is_binomial || faminfo$is_ordinal || faminfo$is_multinomial) { dist.variance <- switch(faminfo$link_function, probit = 1, logit = pi^2 / 3, clogloglink = pi^2 / 6, NA ) } else if (faminfo$is_count) { dist.variance <- switch(faminfo$link_function, log = .get_poisson_variance(model), sqrt = 0.25, 0 ) } y.hat <- stats::predict(model, type = "link") # fix for VGAM yhat_columns <- ncol(y.hat) if (!is.null(yhat_columns) && yhat_columns > 1) y.hat <- as.vector(y.hat[, 1]) dist.residual <- sum((y.hat - mean(y.hat))^2) mckelvey <- dist.residual / (n * dist.variance + dist.residual) names(mckelvey) <- "McKelvey's R2" mckelvey } .null_model <- function(model) { stats::update(model, ~1) } .get_poisson_variance <- function(model) { mu <- exp(stats::coef(.null_model(model))) if (is.na(mu)) { return(0) } cvsquared <- stats::family(model)$variance(mu) / mu^2 log1p(cvsquared) } performance/R/r2_nagelkerke.R0000644000176200001440000001274014507335630015624 0ustar liggesusers#' @title Nagelkerke's R2 #' @name r2_nagelkerke #' #' @description Calculate Nagelkerke's pseudo-R2. #' #' @param model A generalized linear model, including cumulative links resp. #' multinomial models. #' @param ... Currently not used. #' #' @return A named vector with the R2 value. #' #' @examples #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' r2_nagelkerke(model) #' @references #' Nagelkerke, N. J. (1991). A note on a general definition of the coefficient #' of determination. Biometrika, 78(3), 691-692. #' #' @export r2_nagelkerke <- function(model, ...) { UseMethod("r2_nagelkerke") } # helper --------------------------- .r2_nagelkerke <- function(model, l_base) { L.full <- insight::get_loglikelihood(model) D.full <- -2 * L.full D.base <- -2 * l_base # Is it still necessary? if (inherits(model, c("vglm", "vgam", "clm2"))) { n <- insight::n_obs(model) } else { n <- attr(L.full, "nobs") if (is.null(n)) n <- insight::n_obs(model, disaggregate = TRUE) } r2_nagelkerke <- as.vector((1 - exp((D.full - D.base) / n)) / (1 - exp(-D.base / n))) names(r2_nagelkerke) <- "Nagelkerke's R2" r2_nagelkerke } # Nagelkerke's R2 based on Cox&Snell's R2 ---------------- #' @export r2_nagelkerke.glm <- function(model, verbose = TRUE, ...) { info <- list(...)$model_info if (is.null(info)) { info <- suppressWarnings(insight::model_info(model, verbose = FALSE)) } if (info$is_binomial && !info$is_bernoulli && class(model)[1] == "glm") { if (verbose) { insight::format_warning("Can't calculate accurate R2 for binomial models that are not Bernoulli models.") } return(NULL) } else { r2cox <- r2_coxsnell(model) if (is.na(r2cox) || is.null(r2cox)) { return(NULL) } r2_nagelkerke <- r2cox / (1 - exp(-model$null.deviance / insight::n_obs(model, disaggregate = TRUE))) names(r2_nagelkerke) <- "Nagelkerke's R2" r2_nagelkerke } } #' @export r2_nagelkerke.BBreg <- r2_nagelkerke.glm #' @export r2_nagelkerke.nestedLogit <- function(model, ...) { n <- insight::n_obs(model, disaggregate = TRUE) stats::setNames( lapply(names(model$models), function(i) { m <- model$models[[i]] # if no deviance, return NA if (is.null(m$deviance)) { return(NA) } r2_nagelkerke <- (1 - exp((m$deviance - m$null.deviance) / n[[i]])) / (1 - exp(-m$null.deviance / n[[i]])) names(r2_nagelkerke) <- "Nagelkerke's R2" r2_nagelkerke }), names(model$models) ) } #' @export r2_nagelkerke.bife <- function(model, ...) { r2_nagelkerke <- r2_coxsnell(model) / (1 - exp(-model$null_deviance / insight::n_obs(model))) names(r2_nagelkerke) <- "Nagelkerke's R2" r2_nagelkerke } # mfx models --------------------- #' @export r2_nagelkerke.logitmfx <- function(model, ...) { r2_nagelkerke(model$fit, ...) } #' @export r2_nagelkerke.logitor <- r2_nagelkerke.logitmfx #' @export r2_nagelkerke.poissonirr <- r2_nagelkerke.logitmfx #' @export r2_nagelkerke.poissonmfx <- r2_nagelkerke.logitmfx #' @export r2_nagelkerke.probitmfx <- r2_nagelkerke.logitmfx #' @export r2_nagelkerke.negbinirr <- r2_nagelkerke.logitmfx #' @export r2_nagelkerke.negbinmfx <- r2_nagelkerke.logitmfx # Nagelkerke's R2 based on LogLik ---------------- #' @export r2_nagelkerke.multinom <- function(model, ...) { l_base <- insight::get_loglikelihood(stats::update(model, ~1, trace = FALSE)) .r2_nagelkerke(model, l_base) } #' @export r2_nagelkerke.clm2 <- function(model, ...) { l_base <- insight::get_loglikelihood(stats::update(model, location = ~1, scale = ~1)) .r2_nagelkerke(model, l_base) } #' @export r2_nagelkerke.clm <- function(model, ...) { l_base <- insight::get_loglikelihood(stats::update(model, ~1)) # if no loglik, return NA if (length(as.numeric(l_base)) == 0) { return(NULL) } .r2_nagelkerke(model, l_base) } #' @export r2_nagelkerke.polr <- r2_nagelkerke.clm #' @export r2_nagelkerke.cpglm <- r2_nagelkerke.clm #' @export r2_nagelkerke.bracl <- r2_nagelkerke.clm #' @export r2_nagelkerke.glmx <- r2_nagelkerke.clm #' @export r2_nagelkerke.brmultinom <- r2_nagelkerke.clm #' @export r2_nagelkerke.censReg <- r2_nagelkerke.clm #' @export r2_nagelkerke.truncreg <- r2_nagelkerke.clm #' @export r2_nagelkerke.DirichletRegModel <- r2_coxsnell.clm # Nagelkerke's R2 based on LogLik stored in model object ---------------- #' @export r2_nagelkerke.coxph <- function(model, ...) { l_base <- model$loglik[1] .r2_nagelkerke(model, l_base) } #' @export r2_nagelkerke.survreg <- r2_nagelkerke.coxph #' @export r2_nagelkerke.crch <- r2_nagelkerke.coxph #' @export r2_nagelkerke.svycoxph <- function(model, ...) { l_base <- model$ll[1] .r2_nagelkerke(model, l_base) } # other --------------------- #' @export r2_nagelkerke.mclogit <- function(model, ...) { insight::check_if_installed("mclogit", reason = "to calculate R2") s <- mclogit::getSummary.mclogit(model) r2_nagelkerke <- s$sumstat["Nagelkerke"] names(r2_nagelkerke) <- "Nagelkerke's R2" r2_nagelkerke } #' @export r2_nagelkerke.mblogit <- function(model, ...) { insight::check_if_installed("mclogit", reason = "to calculate R2") s <- mclogit::getSummary.mblogit(model) r2_nagelkerke <- s$sumstat["Nagelkerke"] names(r2_nagelkerke) <- "Nagelkerke's R2" r2_nagelkerke } performance/R/item_split_half.R0000644000176200001440000000330114257247716016256 0ustar liggesusers#' @title Split-Half Reliability #' @name item_split_half #' #' @description Compute various measures of internal consistencies #' for tests or item-scales of questionnaires. #' #' @param x A matrix or a data frame. #' @param digits Amount of digits for returned values. #' #' @return A list with two elements: the split-half reliability `splithalf` #' and the Spearman-Brown corrected split-half reliability #' `spearmanbrown`. #' #' @details This function calculates the split-half reliability for items in #' `x`, including the Spearman-Brown adjustment. Splitting is done by #' selecting odd versus even columns in `x`. A value closer to 1 #' indicates greater internal consistency. #' #' @references #' - Spearman C. 1910. Correlation calculated from faulty data. British #' Journal of Psychology (3): 271-295. \doi{10.1111/j.2044-8295.1910.tb00206.x} #' #' - Brown W. 1910. Some experimental results in the correlation of mental #' abilities. British Journal of Psychology (3): 296-322. \doi{10.1111/j.2044-8295.1910.tb00207.x} #' #' @examples #' data(mtcars) #' x <- mtcars[, c("cyl", "gear", "carb", "hp")] #' item_split_half(x) #' @export item_split_half <- function(x, digits = 3) { # Calculating total score for even items score_e <- rowMeans(x[, c(TRUE, FALSE), drop = FALSE], na.rm = TRUE) # Calculating total score for odd items score_o <- rowMeans(x[, c(FALSE, TRUE), drop = FALSE], na.rm = TRUE) # Correlating scores from even and odd items shr <- stats::cor(score_e, score_o, use = "complete.obs") # Adjusting with the Spearman-Brown prophecy formula sb.shr <- (2 * shr) / (1 + shr) list(splithalf = shr, spearmanbrown = sb.shr) } performance/R/check_predictions.R0000644000176200001440000004044014517461276016576 0ustar liggesusers#' @title Posterior predictive checks #' @name check_predictions #' #' @description Posterior predictive checks mean "simulating replicated data #' under the fitted model and then comparing these to the observed data" #' (_Gelman and Hill, 2007, p. 158_). Posterior predictive checks #' can be used to "look for systematic discrepancies between real and #' simulated data" (_Gelman et al. 2014, p. 169_). #' #' **performance** provides posterior predictive check methods for a variety #' of frequentist models (e.g., `lm`, `merMod`, `glmmTMB`, ...). For Bayesian #' models, the model is passed to [`bayesplot::pp_check()`]. #' #' @param object A statistical model. #' @param iterations The number of draws to simulate/bootstrap. #' @param check_range Logical, if `TRUE`, includes a plot with the minimum #' value of the original response against the minimum values of the replicated #' responses, and the same for the maximum value. This plot helps judging whether #' the variation in the original data is captured by the model or not #' (_Gelman et al. 2020, pp.163_). The minimum and maximum values of `y` should #' be inside the range of the related minimum and maximum values of `yrep`. #' @param re_formula Formula containing group-level effects (random effects) to #' be considered in the simulated data. If `NULL` (default), condition #' on all random effects. If `NA` or `~0`, condition on no random #' effects. See `simulate()` in **lme4**. #' @param bandwidth A character string indicating the smoothing bandwidth to #' be used. Unlike `stats::density()`, which used `"nrd0"` as default, the #' default used here is `"nrd"` (which seems to give more plausible results #' for non-Gaussian models). When problems with plotting occur, try to change #' to a different value. #' @param type Plot type for the posterior predictive checks plot. Can be `"density"`, #' `"discrete_dots"`, `"discrete_interval"` or `"discrete_both"` (the `discrete_*` #' options are appropriate for models with discrete - binary, integer or ordinal #' etc. - outcomes). #' @param verbose Toggle warnings. #' @param ... Passed down to `simulate()`. #' #' @return A data frame of simulated responses and the original response vector. #' #' @details An example how posterior predictive checks can also be used for model #' comparison is Figure 6 from _Gabry et al. 2019, Figure 6_. #' #' \if{html}{\cr \figure{pp_check.png}{options: width="90\%" alt="Posterior Predictive Check"} \cr} #' The model shown in the right panel (b) can simulate new data that are more #' similar to the observed outcome than the model in the left panel (a). Thus, #' model (b) is likely to be preferred over model (a). #' #' @note Every model object that has a `simulate()`-method should work with #' `check_predictions()`. On R 3.6.0 and higher, if **bayesplot** (or a #' package that imports **bayesplot** such as **rstanarm** or **brms**) #' is loaded, `pp_check()` is also available as an alias for `check_predictions()`. #' #' @family functions to check model assumptions and and assess model quality #' #' @references #' - Gabry, J., Simpson, D., Vehtari, A., Betancourt, M., and Gelman, A. (2019). #' Visualization in Bayesian workflow. Journal of the Royal Statistical Society: #' Series A (Statistics in Society), 182(2), 389–402. https://doi.org/10.1111/rssa.12378 #' #' - Gelman, A., and Hill, J. (2007). Data analysis using regression and #' multilevel/hierarchical models. Cambridge; New York: Cambridge University Press. #' #' - Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and #' Rubin, D. B. (2014). Bayesian data analysis. (Third edition). CRC Press. #' #' - Gelman, A., Hill, J., and Vehtari, A. (2020). Regression and Other Stories. #' Cambridge University Press. #' #' @examplesIf require("see") #' # linear model #' model <- lm(mpg ~ disp, data = mtcars) #' check_predictions(model) #' #' # discrete/integer outcome #' set.seed(99) #' d <- iris #' d$skewed <- rpois(150, 1) #' model <- glm( #' skewed ~ Species + Petal.Length + Petal.Width, #' family = poisson(), #' data = d #' ) #' check_predictions(model, type = "discrete_both") #' #' @export check_predictions <- function(object, ...) { UseMethod("check_predictions") } #' @rdname check_predictions #' @export check_predictions.default <- function(object, iterations = 50, check_range = FALSE, re_formula = NULL, bandwidth = "nrd", type = "density", verbose = TRUE, ...) { # check for valid input .is_model_valid(object) # retrieve model information minfo <- insight::model_info(object, verbose = FALSE) # try to find sensible default for "type" argument suggest_dots <- (minfo$is_bernoulli || minfo$is_count || minfo$is_ordinal || minfo$is_categorical || minfo$is_multinomial) if (missing(type) && suggest_dots) { type <- "discrete_interval" } # args type <- match.arg(type, choices = c("density", "discrete_dots", "discrete_interval", "discrete_both")) if (isTRUE(minfo$is_bayesian) && isFALSE(inherits(object, "BFBayesFactor"))) { insight::check_if_installed( "bayesplot", "to create posterior prediction plots for Stan models" ) bayesplot::pp_check(object) } else { pp_check.lm( object, iterations = iterations, check_range = check_range, re_formula = re_formula, bandwidth = bandwidth, type = type, verbose = verbose, model_info = minfo, ... ) } } #' @export check_predictions.BFBayesFactor <- function(object, iterations = 50, check_range = FALSE, re_formula = NULL, bandwidth = "nrd", verbose = TRUE, ...) { everything_we_need <- .get_bfbf_predictions(object, iterations = iterations) y <- everything_we_need[["y"]] sig <- everything_we_need[["sigma"]] if (isTRUE(is.na(re_formula))) { yy <- everything_we_need[["y_pred_marginal"]] } else { if (!is.null(re_formula)) warning("re_formula can only be NULL or NA", call. = FALSE) yy <- everything_we_need[["y_pred"]] } yrep <- apply(yy, 2, function(mu) stats::rnorm(length(mu), mu, sig)) yrep <- t(yrep) out <- as.data.frame(yrep) colnames(out) <- paste0("sim_", seq_len(ncol(out))) out$y <- y attr(out, "bandwidth") <- bandwidth attr(out, "check_range") <- check_range class(out) <- c("performance_pp_check", "see_performance_pp_check", class(out)) out } pp_check.BFBayesFactor <- check_predictions.BFBayesFactor #' @export check_predictions.lme <- function(object, ...) { insight::format_error("`check_predictions()` does currently not work for models of class `lme`.") } # pp-check functions ------------------------------------- pp_check.lm <- function(object, iterations = 50, check_range = FALSE, re_formula = NULL, bandwidth = "nrd", type = "density", verbose = TRUE, model_info = NULL, ...) { # if we have a matrix-response, continue here... if (grepl("^cbind\\((.*)\\)", insight::find_response(object, combine = TRUE))) { return(pp_check.glm(object, iterations, check_range, re_formula, bandwidth, type, verbose, model_info, ...)) } # else, proceed as usual out <- .safe(stats::simulate(object, nsim = iterations, re.form = re_formula, ...)) # validation check, for mixed models, where re.form = NULL (default) might fail out <- .check_re_formula(out, object, iterations, re_formula, verbose, ...) # save information about model if (is.null(model_info)) { minfo <- insight::model_info(object) } else { minfo <- model_info } # glmmTMB returns column matrix for bernoulli if (inherits(object, "glmmTMB") && minfo$is_binomial && !is.null(out)) { out <- as.data.frame(lapply(out, function(i) { if (is.matrix(i)) { i[, 1] } else { i } })) } if (is.null(out)) { insight::format_error(sprintf( "Could not simulate responses. Maybe there is no `simulate()` for objects of class `%s`?", class(object)[1] )) } # get response data, and response term, to check for transformations response <- insight::get_response(object) resp_string <- insight::find_terms(object)$response pattern <- "^(scale|exp|expm1|log|log1p|log10|log2|sqrt)" # check for transformed response, and backtransform simulations if (!is.null(resp_string) && grepl(paste0(pattern, "\\("), resp_string)) { out <- .backtransform_sims(out, resp_string) } out$y <- response attr(out, "check_range") <- check_range attr(out, "response_name") <- resp_string attr(out, "bandwidth") <- bandwidth attr(out, "model_info") <- minfo attr(out, "type") <- type class(out) <- c("performance_pp_check", "see_performance_pp_check", class(out)) out } pp_check.glm <- function(object, iterations = 50, check_range = FALSE, re_formula = NULL, bandwidth = "nrd", type = "density", verbose = TRUE, model_info = NULL, ...) { # if we have no matrix-response, continue here... if (!grepl("^cbind\\((.*)\\)", insight::find_response(object, combine = TRUE))) { return(pp_check.lm(object, iterations, check_range, re_formula, bandwidth, type, verbose, model_info, ...)) } # else, process matrix response. for matrix response models, we compute # the ratio of successes and failures, because the plot cannot handle # matrix columns with separate success/failures in simulations. out <- tryCatch( { matrix_sim <- stats::simulate(object, nsim = iterations, re.form = re_formula, ...) as.data.frame(sapply(matrix_sim, function(i) i[, 1] / rowSums(i, na.rm = TRUE), simplify = TRUE)) }, error = function(e) { NULL } ) # validation check, for mixed models, where re.form = NULL (default) might fail out <- .check_re_formula(out, object, iterations, re_formula, verbose, ...) if (is.null(out)) { insight::format_error(sprintf( "Could not simulate responses. Maybe there is no `simulate()` for objects of class `%s`?", class(object)[1] )) } # get response data, and response term response <- eval(str2lang(insight::find_response(object)), envir = insight::get_response(object) ) resp_string <- insight::find_terms(object)$response out$y <- response[, 1] / rowSums(response, na.rm = TRUE) # safe information about model if (is.null(model_info)) { minfo <- insight::model_info(object) } else { minfo <- model_info } attr(out, "check_range") <- check_range attr(out, "response_name") <- resp_string attr(out, "bandwidth") <- bandwidth attr(out, "model_info") <- minfo attr(out, "type") <- type class(out) <- c("performance_pp_check", "see_performance_pp_check", class(out)) out } # styler: off pp_check.glmmTMB <- pp_check.glm.nb <- pp_check.lme <- pp_check.merMod <- pp_check.MixMod <- pp_check.mle2 <- pp_check.negbin <- pp_check.polr <- pp_check.rma <- pp_check.vlm <- pp_check.wbm <- pp_check.lm # styler: on #' @rawNamespace #' S3method(bayesplot::pp_check, lm) #' S3method(bayesplot::pp_check, glm) #' S3method(bayesplot::pp_check, glmmTMB) #' S3method(bayesplot::pp_check, glm.nb) #' S3method(bayesplot::pp_check, merMod) #' S3method(bayesplot::pp_check, MixMod) #' S3method(bayesplot::pp_check, mle2) #' S3method(bayesplot::pp_check, negbin) #' S3method(bayesplot::pp_check, polr) #' S3method(bayesplot::pp_check, rma) #' S3method(bayesplot::pp_check, vlm) #' S3method(bayesplot::pp_check, wbm) #' S3method(bayesplot::pp_check, BFBayesFactor) # aliases -------------------------- #' @rdname check_predictions #' @export posterior_predictive_check <- check_predictions #' @rdname check_predictions #' @export check_posterior_predictions <- check_predictions # methods ----------------------- #' @export print.performance_pp_check <- function(x, verbose = TRUE, ...) { original <- x$y replicated <- x[which(names(x) != "y")] if (isTRUE(verbose)) { if (is.numeric(original)) { if (min(replicated) > min(original)) { insight::print_color( insight::format_message( "Warning: Minimum value of original data is not included in the replicated data.", "Model may not capture the variation of the data." ), "red" ) } if (max(replicated) < max(original)) { insight::print_color( insight::format_message( "Warning: Maximum value of original data is not included in the replicated data.", "Model may not capture the variation of the data." ), "red" ) } } else { missing_levs <- setdiff(original, unlist(replicated)) if (length(missing_levs)) { insight::print_color( insight::format_message( paste0( "Warning: Level", ifelse(length(missing_levs) == 1, " ", "s "), paste0("'", missing_levs, "'", collapse = ", "), " from original data is not included in the replicated data." ), "Model may not capture the variation of the data." ), "red" ) } } } if (requireNamespace("see", quietly = TRUE)) { NextMethod() } invisible(x) } #' @export plot.performance_pp_check <- function(x, ...) { insight::check_if_installed("see", "to plot posterior predictive checks") NextMethod() } # helper -------------------- .backtransform_sims <- function(sims, resp_string) { if (grepl("log(log(", resp_string, fixed = TRUE)) { sims[] <- lapply(sims, function(i) exp(exp(i))) } else if (grepl("log(", resp_string, fixed = TRUE)) { # exceptions: log(x+1) or log(1+x) # 1. try: log(x + number) plus_minus <- .safe(eval(parse(text = gsub("log\\(([^,\\+)]*)(.*)\\)", "\\2", resp_string)))) # 2. try: log(number + x) if (is.null(plus_minus)) { plus_minus <- .safe(eval(parse(text = gsub("log\\(([^,\\+)]*)(.*)\\)", "\\1", resp_string)))) } if (is.null(plus_minus)) { sims[] <- lapply(sims, exp) } else { sims[] <- lapply(sims, function(i) exp(i) - plus_minus) } } else if (grepl("log1p(", resp_string, fixed = TRUE)) { sims[] <- lapply(sims, expm1) } else if (grepl("log10(", resp_string, fixed = TRUE)) { sims[] <- lapply(sims, function(i) 10^i) } else if (grepl("log2(", resp_string, fixed = TRUE)) { sims[] <- lapply(sims, function(i) 2^i) } else if (grepl("sqrt(", resp_string, fixed = TRUE)) { sims[] <- lapply(sims, function(i) i^2) } else if (grepl("exp(", resp_string, fixed = TRUE)) { sims[] <- lapply(sims, log) } else if (grepl("expm1(", resp_string, fixed = TRUE)) { sims[] <- lapply(sims, log1p) } sims } .check_re_formula <- function(out, object, iterations, re_formula, verbose, ...) { # validation check, for mixed models, where re.form = NULL (default) might fail if (is.null(out) && insight::is_mixed_model(object) && !isTRUE(is.na(re_formula))) { if (verbose) { insight::format_warning( paste0( "Failed to compute posterior predictive checks with `re_formula=", deparse(re_formula), "`." ), "Trying again with `re_formula=NA` now." ) } out <- .safe(stats::simulate(object, nsim = iterations, re.form = NA, ...)) } out } performance/R/check_heteroscedasticity.R0000644000176200001440000000753314501142162020137 0ustar liggesusers#' @title Check model for (non-)constant error variance #' @name check_heteroscedasticity #' #' @description Significance testing for linear regression models assumes that #' the model errors (or residuals) have constant variance. If this assumption #' is violated the p-values from the model are no longer reliable. #' #' @param x A model object. #' @param ... Currently not used. #' #' @return The p-value of the test statistics. A p-value < 0.05 indicates a #' non-constant variance (heteroskedasticity). #' #' @note There is also a [`plot()`-method](https://easystats.github.io/see/articles/performance.html) #' implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @details This test of the hypothesis of (non-)constant error is also called #' *Breusch-Pagan test* (\cite{1979}). #' #' @references Breusch, T. S., and Pagan, A. R. (1979) A simple test for heteroscedasticity #' and random coefficient variation. Econometrica 47, 1287-1294. #' #' @family functions to check model assumptions and and assess model quality #' #' @examples #' m <<- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' check_heteroscedasticity(m) #' #' # plot results #' if (require("see")) { #' x <- check_heteroscedasticity(m) #' plot(x) #' } #' @export check_heteroscedasticity <- function(x, ...) { UseMethod("check_heteroscedasticity") } #' @name check_heteroscedasticity #' @aliases check_heteroscedasticity #' @export check_heteroskedasticity <- check_heteroscedasticity # default --------------------- #' @export check_heteroscedasticity.default <- function(x, ...) { # check for valid input .is_model_valid(x) # only for linear models info <- insight::model_info(x) if (!info$is_linear) { msg <- "This Breusch-Pagan Test currently only works Gaussian models." if (info$is_count) { paste0(msg, " You may check your model for overdispersion or zero-inflation instead (see 'check_overdispersion()' and 'check_zeroinflation()').") } insight::format_alert(msg) return(NULL) } r <- insight::get_residuals(x, type = "pearson") S.sq <- insight::get_df(x, type = "residual") * .sigma(x)^2 / sum(!is.na(r)) .U <- (r^2) / S.sq mod <- stats::lm(.U ~ stats::fitted(x)) SS <- stats::anova(mod)$"Sum Sq" RegSS <- sum(SS) - SS[length(SS)] Chisq <- RegSS / 2 p.val <- stats::pchisq(Chisq, df = 1, lower.tail = FALSE) attr(p.val, "data") <- x attr(p.val, "object_name") <- insight::safe_deparse_symbol(substitute(x)) class(p.val) <- unique(c("check_heteroscedasticity", "see_check_heteroscedasticity", class(p.val))) p.val } # methods ----------------------- #' @export print.check_heteroscedasticity <- function(x, ...) { if (x < 0.05) { insight::print_color( sprintf( "Warning: Heteroscedasticity (non-constant error variance) detected (%s).\n", insight::format_p(x) ), "red" ) } else { insight::print_color( sprintf( "OK: Error variance appears to be homoscedastic (%s).\n", insight::format_p(x) ), "green" ) } invisible(x) } #' @export plot.check_heteroscedasticity <- function(x, ...) { insight::check_if_installed("see", "for residual plots") NextMethod() } # utilities ----------------------- .sigma <- function(x) { UseMethod(".sigma") } .sigma.default <- function(x) { s <- tryCatch( { estimates <- insight::get_parameters(x)$Estimate sqrt(insight::get_deviance(x) / (insight::n_obs(x) - sum(!is.na(estimates)))) }, error = function(e) { NULL } ) if (insight::is_empty_object(s)) { s <- insight::get_variance_residual(x, verbose = FALSE) } s } .sigma.BFBayesFactor <- function(x) { mean(.get_bfbf_predictions(x)[["sigma"]]) } performance/R/r2_efron.R0000644000176200001440000000263114327475467014640 0ustar liggesusers#' @title Efron's R2 #' @name r2_efron #' #' @description Calculates Efron's pseudo R2. #' #' @param model Generalized linear model. #' #' @return The R2 value. #' #' @details #' Efron's R2 is calculated by taking the sum of the squared model residuals, #' divided by the total variability in the dependent variable. This R2 equals #' the squared correlation between the predicted values and actual values, #' however, note that model residuals from generalized linear models are not #' generally comparable to those of OLS. #' #' @references #' Efron, B. (1978). Regression and ANOVA with zero-one data: Measures of #' residual variation. Journal of the American Statistical Association, 73, #' 113-121. #' #' @examples #' ## Dobson (1990) Page 93: Randomized Controlled Trial: #' counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) # #' outcome <- gl(3, 1, 9) #' treatment <- gl(3, 3) #' model <- glm(counts ~ outcome + treatment, family = poisson()) #' #' r2_efron(model) #' @export r2_efron <- function(model) { UseMethod("r2_efron") } #' @export r2_efron.default <- function(model) { .r2_efron(model) } .r2_efron <- function(model) { y_hat <- stats::predict(model, type = "response") y <- datawizard::to_numeric(insight::get_response(model, verbose = FALSE), dummy_factors = FALSE, preserve_levels = TRUE, lowest = 0) (1 - (sum((y - y_hat)^2)) / (sum((y - mean(y))^2))) } performance/R/model_performance.kmeans.R0000644000176200001440000000134414271050334020036 0ustar liggesusers#' Model summary for k-means clustering #' #' @param model Object of type `kmeans`. #' @inheritParams model_performance.lm #' #' @examples #' # a 2-dimensional example #' x <- rbind( #' matrix(rnorm(100, sd = 0.3), ncol = 2), #' matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2) #' ) #' colnames(x) <- c("x", "y") #' model <- kmeans(x, 2) #' model_performance(model) #' @export model_performance.kmeans <- function(model, verbose = TRUE, ...) { out <- as.data.frame(model[c("totss", "tot.withinss", "betweenss", "iter")]) colnames(out) <- c("Sum_Squares_Total", "Sum_Squares_Within", "Sum_Squares_Between", "Iterations") row.names(out) <- NULL class(out) <- c("performance_model", class(out)) out } performance/R/check_overdispersion.R0000644000176200001440000002063514512471542017322 0ustar liggesusers#' @title Check overdispersion of GL(M)M's #' @name check_overdispersion #' #' @description `check_overdispersion()` checks generalized linear (mixed) #' models for overdispersion. #' #' @param x Fitted model of class `merMod`, `glmmTMB`, `glm`, or `glm.nb` #' (package **MASS**). #' @param ... Currently not used. #' #' @return A list with results from the overdispersion test, like chi-squared #' statistics, p-value or dispersion ratio. #' #' @details Overdispersion occurs when the observed variance is higher than the #' variance of a theoretical model. For Poisson models, variance increases #' with the mean and, therefore, variance usually (roughly) equals the mean #' value. If the variance is much higher, the data are "overdispersed". #' #' @section Interpretation of the Dispersion Ratio: #' If the dispersion ratio is close to one, a Poisson model fits well to the #' data. Dispersion ratios larger than one indicate overdispersion, thus a #' negative binomial model or similar might fit better to the data. A p-value < #' .05 indicates overdispersion. #' #' @section Overdispersion in Poisson Models: #' For Poisson models, the overdispersion test is based on the code from #' _Gelman and Hill (2007), page 115_. #' #' @section Overdispersion in Mixed Models: #' For `merMod`- and `glmmTMB`-objects, `check_overdispersion()` #' is based on the code in the #' [GLMM FAQ](http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html), #' section *How can I deal with overdispersion in GLMMs?*. Note that this #' function only returns an *approximate* estimate of an overdispersion #' parameter, and is probably inaccurate for zero-inflated mixed models (fitted #' with `glmmTMB`). #' #' @section How to fix Overdispersion: #' Overdispersion can be fixed by either modeling the dispersion parameter, or #' by choosing a different distributional family (like Quasi-Poisson, or #' negative binomial, see _Gelman and Hill (2007), pages 115-116_). #' #' @family functions to check model assumptions and and assess model quality #' #' @references #' - Bolker B et al. (2017): #' [GLMM FAQ.](http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html) #' #' - Gelman, A., and Hill, J. (2007). Data analysis using regression and #' multilevel/hierarchical models. Cambridge; New York: Cambridge University #' Press. #' #' @examplesIf getRversion() >= "4.0.0" && require("glmmTMB", quietly = TRUE) #' #' library(glmmTMB) #' data(Salamanders) #' m <- glm(count ~ spp + mined, family = poisson, data = Salamanders) #' check_overdispersion(m) #' #' m <- glmmTMB( #' count ~ mined + spp + (1 | site), #' family = poisson, #' data = Salamanders #' ) #' check_overdispersion(m) #' @export check_overdispersion <- function(x, ...) { UseMethod("check_overdispersion") } # default ----------------------- #' @export check_overdispersion.default <- function(x, ...) { # check for valid input .is_model_valid(x) insight::format_error( paste0("`check_overdisperion()` not yet implemented for models of class `", class(x)[1], "`.") ) } # Methods ----------------------------- #' @export plot.check_overdisp <- function(x, ...) { insight::check_if_installed(c("see", "graphics"), "for overdispersion plots") obj_name <- attr(x, "object_name", exact = TRUE) model <- NULL if (!is.null(obj_name)) { model <- .safe(get(obj_name, envir = parent.frame())) if (is.null(model)) { # second try, global env model <- .safe(get(obj_name, envir = globalenv())) } } if (!is.null(model)) { x <- .diag_overdispersion(model) class(x) <- c("see_check_overdisp", "data.frame") attr(x, "colors") <- list(...)$colors attr(x, "line_size") <- list(...)$size_line attr(x, "overdisp_type") <- list(...)$plot_type graphics::plot(x, ...) } } #' @export print.check_overdisp <- function(x, digits = 3, ...) { orig_x <- x x$dispersion_ratio <- sprintf("%.*f", digits, x$dispersion_ratio) x$chisq_statistic <- sprintf("%.*f", digits, x$chisq_statistic) x$p_value <- pval <- round(x$p_value, digits = digits) if (x$p_value < 0.001) x$p_value <- "< 0.001" maxlen <- max( nchar(x$dispersion_ratio), nchar(x$chisq_statistic), nchar(x$p_value) ) insight::print_color("# Overdispersion test\n\n", "blue") cat(sprintf(" dispersion ratio = %s\n", format(x$dispersion_ratio, justify = "right", width = maxlen))) cat(sprintf(" Pearson's Chi-Squared = %s\n", format(x$chisq_statistic, justify = "right", width = maxlen))) cat(sprintf(" p-value = %s\n\n", format(x$p_value, justify = "right", width = maxlen))) if (pval > 0.05) { message("No overdispersion detected.") } else { message("Overdispersion detected.") } invisible(orig_x) } # Overdispersion for classical models ----------------------------- #' @export check_overdispersion.glm <- function(x, verbose = TRUE, ...) { # check if we have poisson info <- insight::model_info(x) if (!info$is_count && !info$is_binomial) { insight::format_error( "Overdispersion checks can only be used for models from Poisson families or binomial families with trials > 1." ) } # check for Bernoulli if (info$is_bernoulli) { insight::format_error("Overdispersion checks cannot be used for Bernoulli models.") } if (info$is_binomial) { return(check_overdispersion.merMod(x, verbose = verbose, ...)) } yhat <- stats::fitted(x) n <- stats::nobs(x) k <- length(insight::find_parameters(x, effects = "fixed", flatten = TRUE)) zi <- (insight::get_response(x, verbose = FALSE) - yhat) / sqrt(yhat) chisq <- sum(zi^2) ratio <- chisq / (n - k) p.value <- stats::pchisq(chisq, df = n - k, lower.tail = FALSE) out <- list( chisq_statistic = chisq, dispersion_ratio = ratio, residual_df = n - k, p_value = p.value ) class(out) <- c("check_overdisp", "see_check_overdisp") attr(out, "object_name") <- insight::safe_deparse_symbol(substitute(x)) out } #' @export check_overdispersion.fixest <- check_overdispersion.glm #' @export check_overdispersion.fixest_multi <- function(x, verbose = TRUE, ...) { lapply(x, check_overdispersion.fixest) } #' @export check_overdispersion.glmx <- check_overdispersion.glm # mfx models ------------------------------ #' @export check_overdispersion.poissonmfx <- function(x, ...) { check_overdispersion(x$fit, ...) } #' @export check_overdispersion.poissonirr <- check_overdispersion.poissonmfx #' @export check_overdispersion.negbinirr <- check_overdispersion.poissonmfx #' @export check_overdispersion.negbinmfx <- check_overdispersion.poissonmfx #' @export check_overdispersion.model_fit <- check_overdispersion.poissonmfx # Overdispersion for mixed models --------------------------- #' @export check_overdispersion.merMod <- function(x, verbose = TRUE, ...) { # check if we have poisson or binomial info <- insight::model_info(x) if (!info$is_count && !info$is_binomial) { insight::format_error( "Overdispersion checks can only be used for models from Poisson families or binomial families with trials > 1." ) } # check for Bernoulli if (info$is_bernoulli) { insight::format_error("Overdispersion checks cannot be used for Bernoulli models.") } rdf <- stats::df.residual(x) rp <- insight::get_residuals(x, type = "pearson") if (insight::is_empty_object(rp)) { Pearson.chisq <- NA prat <- NA pval <- NA rp <- NA if (isTRUE(verbose)) { insight::format_alert( "Cannot test for overdispersion, because pearson residuals are not implemented for models with zero-inflation or variable dispersion.", "Only the visual inspection using `plot(check_overdispersion(model))` is possible." ) } } else { Pearson.chisq <- sum(rp^2) prat <- Pearson.chisq / rdf pval <- stats::pchisq(Pearson.chisq, df = rdf, lower.tail = FALSE) } out <- list( chisq_statistic = Pearson.chisq, dispersion_ratio = prat, residual_df = rdf, p_value = pval ) class(out) <- c("check_overdisp", "see_check_overdisp") attr(out, "object_name") <- insight::safe_deparse_symbol(substitute(x)) out } #' @export check_overdispersion.negbin <- check_overdispersion.merMod #' @export check_overdispersion.glmmTMB <- check_overdispersion.merMod performance/R/model_performance.bife.R0000644000176200001440000000252614360337646017505 0ustar liggesusers#' @export model_performance.bife <- function(model, metrics = "all", verbose = TRUE, ...) { all_metrics <- c("AIC", "R2", "LOGLOSS", "PCP") if (any(tolower(metrics) == "log_loss")) { metrics[tolower(metrics) == "log_loss"] <- "LOGLOSS" } if (all(metrics == "all")) { metrics <- all_metrics } else if (all(metrics == "common")) { metrics <- c("AIC", "R2") } # check for valid input metrics <- .check_bad_metrics(metrics, all_metrics, verbose) info <- insight::model_info(model) out <- list() attrib <- list() if ("AIC" %in% toupper(metrics)) { out$AIC <- performance_aic(model) } if ("R2" %in% toupper(metrics)) { R2 <- r2(model) attrib$r2 <- attributes(R2) out <- c(out, R2) } if (("LOGLOSS" %in% toupper(metrics)) && info$is_binomial) { .logloss <- performance_logloss(model, verbose = verbose) if (!is.na(.logloss)) out$Log_loss <- .logloss } if (("PCP" %in% toupper(metrics)) && info$is_binomial && !info$is_multinomial && !info$is_ordinal) { out$PCP <- performance_pcp(model, verbose = verbose)$pcp_model } # TODO: What with sigma and deviance? out <- as.data.frame(out) row.names(out) <- NULL class(out) <- c("performance_model", class(out)) # Add attributes attributes(out) <- c(attributes(out), attrib) out } performance/R/model_performance.lm.R0000644000176200001440000002323614507335630017203 0ustar liggesusers#' Performance of Regression Models #' #' Compute indices of model performance for regression models. #' #' @param model A model. #' @param metrics Can be `"all"`, `"common"` or a character vector of #' metrics to be computed (one or more of `"AIC"`, `"AICc"`, `"BIC"`, `"R2"`, #' `"R2_adj"`, `"RMSE"`, `"SIGMA"`, `"LOGLOSS"`, `"PCP"`, `"SCORE"`). #' `"common"` will compute AIC, BIC, R2 and RMSE. #' @param verbose Toggle off warnings. #' @param ... Arguments passed to or from other methods. #' #' @return #' A data frame (with one row) and one column per "index" (see `metrics`). #' #' @details Depending on `model`, following indices are computed: #' #' - **AIC**: Akaike's Information Criterion, see `?stats::AIC` #' - **AICc**: Second-order (or small sample) AIC with a correction for small sample sizes #' - **BIC**: Bayesian Information Criterion, see `?stats::BIC` #' - **R2**: r-squared value, see [`r2()`] #' - **R2_adj**: adjusted r-squared, see [`r2()`] #' - **RMSE**: root mean squared error, see [`performance_rmse()`] #' - **SIGMA**: residual standard deviation, see [`insight::get_sigma()`] #' - **LOGLOSS**: Log-loss, see [`performance_logloss()`] #' - **SCORE_LOG**: score of logarithmic proper scoring rule, see [`performance_score()`] #' - **SCORE_SPHERICAL**: score of spherical proper scoring rule, see [`performance_score()`] #' - **PCP**: percentage of correct predictions, see [`performance_pcp()`] #' #' @details `model_performance()` correctly detects transformed response and #' returns the "corrected" AIC and BIC value on the original scale. To get back #' to the original scale, the likelihood of the model is multiplied by the #' Jacobian/derivative of the transformation. #' #' @examples #' model <- lm(mpg ~ wt + cyl, data = mtcars) #' model_performance(model) #' #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' model_performance(model) #' @export model_performance.lm <- function(model, metrics = "all", verbose = TRUE, ...) { if (any(tolower(metrics) == "log_loss")) { metrics[tolower(metrics) == "log_loss"] <- "LOGLOSS" } # all available options... all_metrics <- c("AIC", "AICc", "BIC", "R2", "R2_adj", "RMSE", "SIGMA", "LOGLOSS", "PCP", "SCORE") if (all(metrics == "all")) { metrics <- all_metrics } else if (all(metrics == "common")) { metrics <- c("AIC", "BIC", "R2", "R2_adj", "RMSE") } # check model formula if (verbose) { insight::formula_ok(model) } # check for valid input metrics <- .check_bad_metrics(metrics, all_metrics, verbose) info <- suppressWarnings(insight::model_info(model, verbose = FALSE)) ## TODO remove is.list() once insight 0.8.3 is on CRAN if (is.null(info) || !is.list(info)) { info <- list(family = "unknown") } out <- list() attrib <- list() # AIC ------------- if ("AIC" %in% toupper(metrics)) { out$AIC <- .safe(performance_aic(model, model_info = info)) } # AICc ------------- if ("AICC" %in% toupper(metrics)) { out$AICc <- .safe(performance_aicc(model)) } # BIC ------------- if ("BIC" %in% toupper(metrics)) { out$BIC <- .safe(.get_BIC(model)) } # R2 ------------- if (any(c("R2", "R2_ADJ") %in% toupper(metrics))) { R2 <- .safe(r2(model, verbose = verbose, model_info = info)) if (!is.null(R2)) { attrib$r2 <- attributes(R2) if ("R2" %in% toupper(metrics) && "R2" %in% names(R2)) { out$R2 <- R2$R2 } if ("R2_ADJ" %in% toupper(metrics) && "R2_adjusted" %in% names(R2)) { out$R2_adjusted <- R2$R2_adjusted } if ("R2_ADJ" %in% toupper(metrics) && "R2_adj" %in% names(R2)) { out$R2_adjusted <- R2$R2_adj } if ("R2_within" %in% names(R2)) { out$R2_within <- R2$R2_within } if ("R2_within_adjusted" %in% names(R2)) { out$R2_within_adjusted <- R2$R2_within_adjusted } if (!any(c("R2", "R2_adj", "R2_adjusted", "R2_within", "R2_within_adjusted") %in% names(R2))) { out <- c(out, R2) } } } # RMSE ------------- if ("RMSE" %in% toupper(metrics)) { out$RMSE <- .safe(performance_rmse(model, verbose = verbose)) } # SIGMA ------------- if ("SIGMA" %in% toupper(metrics)) { out$Sigma <- .safe(.get_sigma(model, verbose = verbose)) } # LOGLOSS ------------- if (("LOGLOSS" %in% toupper(metrics)) && isTRUE(info$is_binomial)) { out$Log_loss <- .safe({ .logloss <- performance_logloss(model, verbose = verbose) if (is.na(.logloss)) { NULL } else { .logloss } }) } # SCORE ------------- if (("SCORE" %in% toupper(metrics)) && (isTRUE(info$is_binomial) || isTRUE(info$is_count))) { .scoring_rules <- .safe(performance_score(model, verbose = verbose)) if (!is.null(.scoring_rules)) { if (!is.na(.scoring_rules$logarithmic)) out$Score_log <- .scoring_rules$logarithmic if (!is.na(.scoring_rules$spherical)) out$Score_spherical <- .scoring_rules$spherical } } # PCP ------------- if (("PCP" %in% toupper(metrics)) && isTRUE(info$is_binomial) && isFALSE(info$is_multinomial) && isFALSE(info$is_ordinal)) { out$PCP <- .safe(performance_pcp(model, verbose = verbose)$pcp_model) } out <- as.data.frame(insight::compact_list(out, remove_na = TRUE), check.names = FALSE) # check if model was actually supported... if (nrow(out) == 0 || ncol(out) == 0) { if (isTRUE(verbose)) { insight::format_warning(paste0("Models of class `", class(model)[1], "` are not yet supported.")) } return(NULL) } row.names(out) <- NULL class(out) <- c("performance_model", class(out)) # Add attributes attributes(out) <- c(attributes(out), attrib) out } #' @export model_performance.glm <- model_performance.lm #' @export model_performance.Arima <- model_performance.lm #' @export model_performance.glmx <- model_performance.lm #' @export model_performance.lmrob <- model_performance.lm #' @export model_performance.betareg <- model_performance.lm #' @export model_performance.censReg <- model_performance.lm #' @export model_performance.clm <- model_performance.lm #' @export model_performance.clm2 <- model_performance.lm #' @export model_performance.coxph <- model_performance.lm #' @export model_performance.felm <- model_performance.lm #' @export model_performance.iv_robust <- model_performance.lm #' @export model_performance.lm_robust <- model_performance.lm #' @export model_performance.multinom <- model_performance.lm #' @export model_performance.plm <- model_performance.lm #' @export model_performance.polr <- model_performance.lm #' @export model_performance.bayesx <- model_performance.lm #' @export model_performance.survreg <- model_performance.lm #' @export model_performance.svyglm <- model_performance.lm #' @export model_performance.truncreg <- model_performance.lm #' @export model_performance.vglm <- model_performance.lm #' @export model_performance.fixest <- model_performance.lm #' @export model_performance.fixest_multi <- function(model, metrics = "all", verbose = TRUE, ...) { lapply(model, model_performance.fixest) } #' @export model_performance.DirichletRegModel <- model_performance.lm #' @export model_performance.flexsurvreg <- model_performance.lm #' @export model_performance.hurdle <- model_performance.lm #' @export model_performance.zeroinfl <- model_performance.lm #' @export model_performance.zerotrunc <- model_performance.lm #' @export model_performance.nestedLogit <- function(model, metrics = "all", verbose = TRUE, ...) { mp <- lapply(model$models, model_performance.lm, metrics = metrics, verbose = verbose, ...) out <- cbind( data.frame(Response = names(mp), stringsAsFactors = FALSE), do.call(rbind, mp) ) # need to handle R2 separately if (any(c("ALL", "R2") %in% toupper(metrics))) { out$R2 <- unlist(r2_tjur(model)) } row.names(out) <- NULL class(out) <- unique(c("performance_model", class(out))) out } # mfx models ------------------------------- #' @export model_performance.logitor <- function(model, ...) { model_performance(model$fit, ...) } #' @export model_performance.logitmfx <- model_performance.logitor #' @export model_performance.probitmfx <- model_performance.logitor #' @export model_performance.poissonirr <- model_performance.logitor #' @export model_performance.poissonmfx <- model_performance.logitor #' @export model_performance.negbinirr <- model_performance.logitor #' @export model_performance.negbinmfx <- model_performance.logitor #' @export model_performance.betaor <- model_performance.logitor #' @export model_performance.betamfx <- model_performance.logitor #' @export model_performance.model_fit <- model_performance.logitor # other models ------------------------------- #' @export model_performance.mlogit <- function(model, metrics = "all", verbose = TRUE, ...) { if (requireNamespace("mlogit", quietly = TRUE)) { model_performance.lm(model = model, metrics = metrics, verbose = verbose, ...) } else { NULL } } #' @export model_performance.margins <- function(model, metrics = "all", verbose = TRUE, ...) { orig_mod_call <- attributes(model)$call model_performance(eval(orig_mod_call), metrics = metrics, verbose = verbose, ...) } #' @export model_performance.sem <- function(model, metrics = "all", verbose = TRUE, ...) { if (inherits(model, "sem") && inherits(model, "lme")) { model_performance.lm(model, metrics = metrics, verbose = verbose, ...) } else { NULL } } performance/R/check_concurvity.R0000644000176200001440000000275714257247716016473 0ustar liggesusers#' @rdname check_collinearity #' @export check_concurvity <- function(x, ...) { UseMethod("check_concurvity") } #' @export check_concurvity.gam <- function(x, ...) { insight::check_if_installed("mgcv") conc <- as.data.frame(mgcv::concurvity(x)) # only smooth terms smooth_terms <- colnames(conc)[grepl("s\\((.*)\\)", colnames(conc))] out <- data.frame( Term = c("Parametric", smooth_terms), VIF = as.vector(1 / (1 - as.numeric(conc[1, ]))), VIF_proportion = as.vector(as.numeric(conc[3, ])), stringsAsFactors = FALSE ) class(out) <- c("check_concurvity", "see_check_concurvity", class(out)) out } # methods --------------------------------- #' @export print.check_concurvity <- function(x, ...) { vifs <- x$VIF x$VIF <- sprintf("%.2f", x$VIF) x$VIF_proportion <- sprintf("%.2f", x$VIF_proportion) colnames(x)[3] <- "VIF %" low_corr <- which(vifs < 5) if (length(low_corr)) { cat("\n") insight::print_color("Low Concurvity\n\n", "green") print.data.frame(x[low_corr, ], row.names = FALSE) } mid_corr <- which(vifs >= 5 & vifs < 10) if (length(mid_corr)) { cat("\n") insight::print_color("Moderate Concurvity\n\n", "yellow") print.data.frame(x[mid_corr, ], row.names = FALSE) } high_corr <- which(vifs >= 10) if (length(high_corr)) { cat("\n") insight::print_color("High Concurvity\n\n", "red") print.data.frame(x[high_corr, ], row.names = FALSE) } } performance/R/performance_pcp.R0000644000176200001440000001515214355346734016264 0ustar liggesusers#' @title Percentage of Correct Predictions #' @name performance_pcp #' #' @description Percentage of correct predictions (PCP) for models #' with binary outcome. #' #' @param model Model with binary outcome. #' @param ci The level of the confidence interval. #' @param method Name of the method to calculate the PCP (see 'Details'). #' Default is `"Herron"`. May be abbreviated. #' @inheritParams model_performance.lm #' #' @return A list with several elements: the percentage of correct predictions #' of the full and the null model, their confidence intervals, as well as the #' chi-squared and p-value from the Likelihood-Ratio-Test between the full and #' null model. #' #' @details `method = "Gelman-Hill"` (or `"gelman_hill"`) computes the #' PCP based on the proposal from _Gelman and Hill 2017, 99_, which is #' defined as the proportion of cases for which the deterministic prediction #' is wrong, i.e. the proportion where the predicted probability is above 0.5, #' although y=0 (and vice versa) (see also _Herron 1999, 90_). #' #' `method = "Herron"` (or `"herron"`) computes a modified version #' of the PCP (_Herron 1999, 90-92_), which is the sum of predicted #' probabilities, where y=1, plus the sum of 1 - predicted probabilities, #' where y=0, divided by the number of observations. This approach is said to #' be more accurate. #' #' The PCP ranges from 0 to 1, where values closer to 1 mean that the model #' predicts the outcome better than models with an PCP closer to 0. In general, #' the PCP should be above 0.5 (i.e. 50\%), the closer to one, the better. #' Furthermore, the PCP of the full model should be considerably above #' the null model's PCP. #' #' The likelihood-ratio test indicates whether the model has a significantly #' better fit than the null-model (in such cases, p < 0.05). #' #' #' @references #' - Herron, M. (1999). Postestimation Uncertainty in Limited Dependent #' Variable Models. Political Analysis, 8, 83–98. #' - Gelman, A., and Hill, J. (2007). Data analysis using regression and #' multilevel/hierarchical models. Cambridge; New York: Cambridge University #' Press, 99. #' #' @examples #' data(mtcars) #' m <- glm(formula = vs ~ hp + wt, family = binomial, data = mtcars) #' performance_pcp(m) #' performance_pcp(m, method = "Gelman-Hill") #' @export performance_pcp <- function(model, ci = 0.95, method = "Herron", verbose = TRUE) { # fix special cases if (inherits(model, c("model_fit", "logitor", "logitmfx", "probitmfx"))) { model <- model$fit } method <- match.arg(method, choices = c("Herron", "Gelman-Hill", "herron", "gelman_hill")) mi <- insight::model_info(model, verbose = verbose) if (!mi$is_binomial) { insight::format_error("`performance_pcp()` only works for models with binary outcome.") } resp <- insight::get_response(model, verbose = verbose) if (!is.null(ncol(resp)) && ncol(resp) > 1) { if (verbose) insight::print_color("`performance_pcp()` only works for models with binary response values.\n", "red") return(NULL) } m0 <- suppressWarnings(stats::glm( formula = stats::as.formula(sprintf("%s ~ 1", insight::find_response(model))), family = stats::binomial(link = "logit"), data = insight::get_data(model, verbose = FALSE), weights = stats::weights(model) )) .performance_pcp(model, m0, ci, method = method, verbose = verbose) } # methods ---------------------------------- #' @export print.performance_pcp <- function(x, digits = 2, ...) { insight::print_color("# Percentage of Correct Predictions from Logistic Regression Model\n\n", "blue") cat(sprintf(" Full model: %.2f%% [%.2f%% - %.2f%%]\n", 100 * x$pcp_model, 100 * x$model_ci_low, 100 * x$model_ci_high)) cat(sprintf(" Null model: %.2f%% [%.2f%% - %.2f%%]\n", 100 * x$pcp_m0, 100 * x$null_ci_low, 100 * x$null_ci_high)) insight::print_color("\n# Likelihood-Ratio-Test\n\n", "blue") v1 <- sprintf("%.3f", x$lrt_chisq) v2 <- sprintf("%.3f", x$lrt_df_error) v3 <- sprintf("%.3f", x$lrt_p) space <- max(nchar(c(v1, v2))) cat(sprintf(" Chi-squared: %*s\n", space, v1)) cat(sprintf(" df: %*s\n", space, v2)) cat(sprintf(" p-value: %*s\n\n", space, v3)) invisible(x) } #' @export as.data.frame.performance_pcp <- function(x, row.names = NULL, ...) { data.frame( "Model" = c("full", "null"), "Estimate" = c(x$pcp_model, x$pcp_m0), "CI_low" = c(x$model_ci_low, x$null_ci_low), "CI_high" = c(x$model_ci_high, x$null_ci_high), "Chisq" = c(NA, x$lrt_chisq), "df_error" = c(NA, x$lrt_df_error), "p" = c(NA, x$lrt_p), stringsAsFactors = FALSE, row.names = row.names, ... ) } # utilities -------------------------------------- .performance_pcp <- function(model, m0, ci, method, verbose = TRUE) { y_full <- .recode_to_zero(insight::get_response(model, verbose = verbose)) y_null <- .recode_to_zero(insight::get_response(m0, verbose = verbose)) n_full <- suppressWarnings(insight::n_obs(model)) n_null <- suppressWarnings(insight::n_obs(m0)) pr_full <- stats::predict(model, type = "response") pr_null <- stats::predict(m0, type = "response") if (tolower(method) == "herron") { pcp_full <- (sum(1 - pr_full[y_full == 0]) + sum(pr_full[y_full == 1])) / n_full pcp_null <- (sum(1 - pr_null[y_null == 0]) + sum(pr_null[y_null == 1])) / n_null } else { pcp_full <- 1 - mean((pr_full > 0.5 & y_full == 0) | (pr_full <= 0.5 & y_full == 1)) pcp_null <- 1 - mean((pr_null > 0.5 & y_null == 0) | (pr_null <= 0.5 & y_null == 1)) } lrt.p <- 1 - stats::pchisq( q = model$null.deviance - model$deviance, df = model$df.null - model$df.residual, lower.tail = TRUE ) lrt.chisq <- 2 * abs(insight::get_loglikelihood(model, verbose = verbose) - insight::get_loglikelihood(m0, verbose = verbose)) structure( class = "performance_pcp", list( pcp_model = pcp_full, model_ci_low = pcp_full - stats::qnorm((1 + ci) / 2) * sqrt(pcp_full * (1 - pcp_full) / n_full), model_ci_high = pcp_full + stats::qnorm((1 + ci) / 2) * sqrt(pcp_full * (1 - pcp_full) / n_full), pcp_m0 = pcp_null, null_ci_low = pcp_null - stats::qnorm((1 + ci) / 2) * sqrt(pcp_null * (1 - pcp_null) / n_null), null_ci_high = pcp_null + stats::qnorm((1 + ci) / 2) * sqrt(pcp_null * (1 - pcp_null) / n_null), lrt_chisq = as.vector(lrt.chisq), lrt_df_error = model$df.null - model$df.residual, lrt_p = lrt.p ) ) } performance/R/test_bf.R0000644000176200001440000000517714512471542014544 0ustar liggesusers#' @rdname test_performance #' @export test_bf <- function(...) { UseMethod("test_bf") } #' @rdname test_performance #' @export test_bf.default <- function(..., reference = 1, text_length = NULL) { # Attribute class to list and get names from the global environment objects <- insight::ellipsis_info(..., only_models = TRUE) names(objects) <- match.call(expand.dots = FALSE)$`...` # validation checks (will throw error if non-valid objects) .test_performance_checks(objects, multiple = FALSE) if (length(objects) == 1 && isTRUE(insight::is_model(objects))) { insight::format_error( "`test_bf()` is designed to compare multiple models together. For a single model, you might want to run `bayestestR::bf_parameters()` instead." ) } # If a suitable class is found, run the more specific method on it if (inherits(objects, c("ListNestedRegressions", "ListNonNestedRegressions", "ListLavaan"))) { test_bf(objects, reference = reference, text_length = text_length) } else { insight::format_error("The models cannot be compared for some reason :/") } } #' @export test_bf.ListModels <- function(objects, reference = 1, text_length = NULL, ...) { if (.test_bf_areAllBayesian(objects) == "mixed") { insight::format_error("You cannot mix Bayesian and non-Bayesian models in `test_bf()`.") } # Adapt reference but keep original input if (reference == "sequential") { ref <- 1 } else { ref <- reference } rez <- bayestestR::bayesfactor_models(objects, denominator = ref) # check for log-BF if (!is.null(rez$log_BF)) { rez$BF <- exp(rez$log_BF) } row.names(rez) <- NULL # Adjust BFs for sequential testing if (reference == "sequential") { # TODO: Double check that formula and whether it works for increasing and # decreasing order. # For increasing rez$BF <- exp(c(NA, diff(log(rez$BF)))) # For decreasing # ref <- nrow(rez) # rez$BF <- exp(c(-diff(log(rez$BF)), NA)) } else { rez$BF[ref] <- NA } # add log-BF rez$log_BF <- log(rez$BF) # Replace denominator attr(rez, "denominator") <- ref attr(rez, "text_length") <- text_length class(rez) <- c("bayesfactor_models", "see_bayesfactor_models", class(rez)) rez } # Helpers ----------------------------------------------------------------- .test_bf_areAllBayesian <- function(objects) { bayesian_models <- sapply(objects, function(i) isTRUE(insight::model_info(i)$is_bayesian)) if (all(bayesian_models)) { "yes" } else if (!all(bayesian_models)) { "no" } else { "mixed" } } performance/R/model_performance.bayesian.R0000644000176200001440000002471714503335324020367 0ustar liggesusers#' Performance of Bayesian Models #' #' Compute indices of model performance for (general) linear models. #' #' @param model Object of class `stanreg` or `brmsfit`. #' @param metrics Can be `"all"`, `"common"` or a character vector of #' metrics to be computed (some of `c("LOOIC", "WAIC", "R2", "R2_adj", #' "RMSE", "SIGMA", "LOGLOSS", "SCORE")`). `"common"` will compute LOOIC, #' WAIC, R2 and RMSE. #' @param ... Arguments passed to or from other methods. #' @inheritParams model_performance.lm #' #' @return A data frame (with one row) and one column per "index" (see #' `metrics`). #' #' @details Depending on `model`, the following indices are computed: #' #' - **ELPD**: expected log predictive density. Larger ELPD values #' mean better fit. See [looic()]. #' #' - **LOOIC**: leave-one-out cross-validation (LOO) information #' criterion. Lower LOOIC values mean better fit. See [looic()]. #' #' - **WAIC**: widely applicable information criterion. Lower WAIC #' values mean better fit. See `?loo::waic`. #' #' - **R2**: r-squared value, see [r2_bayes()]. #' #' - **R2_adjusted**: LOO-adjusted r-squared, see [r2_loo()]. #' #' - **RMSE**: root mean squared error, see [performance_rmse()]. #' #' - **SIGMA**: residual standard deviation, see [insight::get_sigma()]. #' #' - **LOGLOSS**: Log-loss, see [performance_logloss()]. #' #' - **SCORE_LOG**: score of logarithmic proper scoring rule, see [performance_score()]. #' #' - **SCORE_SPHERICAL**: score of spherical proper scoring rule, see [performance_score()]. #' #' - **PCP**: percentage of correct predictions, see [performance_pcp()]. #' #' @examplesIf require("rstanarm") && require("rstantools") && require("BayesFactor") #' \donttest{ #' model <- suppressWarnings(rstanarm::stan_glm( #' mpg ~ wt + cyl, #' data = mtcars, #' chains = 1, #' iter = 500, #' refresh = 0 #' )) #' model_performance(model) #' #' model <- suppressWarnings(rstanarm::stan_glmer( #' mpg ~ wt + cyl + (1 | gear), #' data = mtcars, #' chains = 1, #' iter = 500, #' refresh = 0 #' )) #' model_performance(model) #' #' model <- BayesFactor::generalTestBF(carb ~ am + mpg, mtcars) #' #' model_performance(model) #' model_performance(model[3]) #' model_performance(model, average = TRUE) #' } #' @seealso [r2_bayes] #' @references Gelman, A., Goodrich, B., Gabry, J., and Vehtari, A. (2018). #' R-squared for Bayesian regression models. The American Statistician, The #' American Statistician, 1-6. #' #' @export model_performance.stanreg <- function(model, metrics = "all", verbose = TRUE, ...) { if (any(tolower(metrics) == "log_loss")) { metrics[tolower(metrics) == "log_loss"] <- "LOGLOSS" } all_metrics <- c("LOOIC", "WAIC", "R2", "R2_adjusted", "ICC", "RMSE", "SIGMA", "LOGLOSS", "SCORE") if (all(metrics == "all")) { metrics <- all_metrics } else if (all(metrics == "common")) { metrics <- c("LOOIC", "WAIC", "R2", "RMSE") } # check for valid input metrics <- toupper(.check_bad_metrics(metrics, all_metrics, verbose)) algorithm <- insight::find_algorithm(model) if (algorithm$algorithm != "sampling") { if (verbose) { insight::format_warning( "`model_performance()` only possible for models fit using the \"sampling\" algorithm." ) } return(NULL) } insight::check_if_installed("loo") mi <- insight::model_info(model) out <- list() attri <- list() if (insight::is_multivariate(model)) { out$Response <- insight::find_response(model, combine = FALSE) mi <- mi[[1]] } # LOOIC ------------------ if ("LOOIC" %in% metrics) { loo_res <- suppressWarnings(looic(model, verbose = verbose)) out <- append(out, loo_res) attri$loo <- attributes(loo_res)$loo # save attributes } # WAIC ------------------ if ("WAIC" %in% metrics) { out$WAIC <- suppressWarnings(loo::waic(model)$estimates["waic", "Estimate"]) } # R2 ------------------ attri_r2 <- list() if ("R2" %in% metrics) { r2 <- r2_bayes(model, verbose = verbose) if (!is.null(r2)) { # save attributes attri_r2$SE$R2_Bayes <- attributes(r2)$SE$R2_Bayes attri_r2$CI$R2_Bayes <- attributes(r2)$CI$R2_Bayes attri_r2$CI$R2_Bayes_marginal <- attributes(r2)$CI$R2_Bayes_marginal attri_r2$robust$R2_Bayes <- attributes(r2)$robust # Format to df then to list r2_df <- as.data.frame(t(as.numeric(r2))) names(r2_df) <- gsub("_Bayes", "", names(r2), fixed = TRUE) out <- append(out, as.list(r2_df)) } } # LOO-R2 ------------------ if (("R2_ADJUSTED" %in% metrics || "R2_LOO" %in% metrics) && mi$is_linear) { r2_adj <- .safe(suppressWarnings(r2_loo(model, verbose = verbose))) if (!is.null(r2_adj)) { # save attributes attri_r2$SE$R2_loo <- attributes(r2_adj)$SE$R2_loo attri_r2$CI$R2_loo <- attributes(r2_adj)$CI$R2_loo attri_r2$CI$R2_loo_marginal <- attributes(r2)$CI$R2_loo_marginal attri_r2$robust$R2_loo <- attributes(r2_adj)$robust # Format to df then to list r2_adj_df <- as.data.frame(t(as.numeric(r2_adj))) names(r2_adj_df) <- gsub("_loo", "_adjusted", names(r2_adj), fixed = TRUE) out <- append(out, as.list(r2_adj_df)) } } if (length(attri_r2) > 0L) { attri$r2 <- attri_r2 attri$r2_bayes <- attri_r2 } # ICC ------------------ if ("ICC" %in% metrics) { out$ICC <- .safe(suppressWarnings(icc(model, verbose = verbose)$ICC_adjusted)) } # RMSE ------------------ if ("RMSE" %in% metrics && !mi$is_ordinal && !mi$is_multinomial && !mi$is_categorical) { out$RMSE <- performance_rmse(model, verbose = verbose) } # SIGMA ------------------ if ("SIGMA" %in% metrics) { out$Sigma <- .safe({ s <- .get_sigma(model, verbose = verbose) if (insight::is_empty_object(s)) { s <- NULL } s }) } # LOGLOSS ------------------ if (("LOGLOSS" %in% metrics) && mi$is_binomial) { out$Log_loss <- .safe({ .logloss <- performance_logloss(model, verbose = verbose) if (!is.na(.logloss)) { .logloss } else { NULL } }) } # SCORE ------------------ if (("SCORE" %in% metrics) && (mi$is_binomial || mi$is_count)) { .scoring_rules <- .safe(performance_score(model, verbose = verbose)) if (!is.null(.scoring_rules)) { if (!is.na(.scoring_rules$logarithmic)) out$Score_log <- .scoring_rules$logarithmic if (!is.na(.scoring_rules$spherical)) out$Score_spherical <- .scoring_rules$spherical } } out <- as.data.frame(out) row.names(out) <- NULL out <- out[vapply(out, function(i) !all(is.na(i)), TRUE)] attributes(out) <- c(attributes(out), attri) class(out) <- c("performance_model", class(out)) out } #' @export model_performance.brmsfit <- model_performance.stanreg #' @export model_performance.stanmvreg <- model_performance.stanreg #' @export #' @inheritParams r2_bayes #' @rdname model_performance.stanreg model_performance.BFBayesFactor <- function(model, metrics = "all", verbose = TRUE, average = FALSE, prior_odds = NULL, ...) { all_metrics <- c("R2", "SIGMA") if (all(metrics == "all")) { metrics <- all_metrics } # check for valid input metrics <- toupper(.check_bad_metrics(metrics, all_metrics, verbose)) # check for valid BFBayesFactor object mi <- insight::model_info(model, verbose = FALSE) if (!mi$is_linear || mi$is_correlation || mi$is_ttest || mi$is_binomial || mi$is_meta) { if (isTRUE(verbose)) { insight::format_warning("This type of Bayes factor models is not supported.") } return(NULL) } out <- list() attri <- list() if ("R2" %in% metrics) { r2 <- r2_bayes(model, average = average, prior_odds = prior_odds, verbose = verbose) attri$r2_bayes <- attributes(r2) # save attributes # Format to df then to list r2_df <- as.data.frame(t(as.numeric(r2))) names(r2_df) <- gsub("_Bayes", "", names(r2), fixed = TRUE) out <- append(out, as.list(r2_df)) } if ("SIGMA" %in% toupper(metrics)) { sig <- suppressMessages( .get_sigma_bfbayesfactor( model, average = average, prior_odds = prior_odds, verbose = verbose ) ) out$Sigma <- bayestestR::point_estimate(sig, "median")[[1]] } out <- as.data.frame(out) row.names(out) <- NULL attributes(out) <- c(attributes(out), attri) class(out) <- c("performance_model", class(out)) out } # helper ------------------- .get_sigma_bfbayesfactor <- function(model, average = FALSE, prior_odds = NULL, verbose = TRUE) { if (average) { return(.get_sigma_bfbayesfactor_model_average(model, prior_odds = prior_odds)) } params <- insight::get_parameters(model, verbose = verbose) if (!"sig2" %in% colnames(params)) { insight::format_error("This is not a linear model.") } sqrt(params$sig2) } .get_sigma_bfbayesfactor_model_average <- function(model, prior_odds = NULL) { insight::check_if_installed("BayesFactor") BFMods <- bayestestR::bayesfactor_models(model, verbose = FALSE) if (!is.null(BFMods$log_BF)) { BFMods$BF <- exp(BFMods$log_BF) } # extract parameters intercept_only <- which(BFMods$Model == "1") params <- vector(mode = "list", length = nrow(BFMods)) for (m in seq_along(params)) { if (length(intercept_only) && m == intercept_only) { y <- insight::get_response(model) params[[m]] <- rep(stats::sd(y), 4000) } else if (m == 1) { # If the model is the "den" model params[[m]] <- suppressMessages(.get_sigma_bfbayesfactor(1 / model[1])) } else { params[[m]] <- suppressMessages(.get_sigma_bfbayesfactor(model[m - 1])) } } params <- lapply(params, data.frame) # Compute posterior model probabilities if (!is.null(prior_odds)) { prior_odds <- c(1, prior_odds) } else { prior_odds <- rep(1, nrow(BFMods)) } posterior_odds <- prior_odds * BFMods$BF posterior_odds <- posterior_odds[-1] / posterior_odds[1] do.call( bayestestR::weighted_posteriors, c(params, list(missing = 0, prior_odds = posterior_odds)) )[[1]] } performance/R/check_singularity.R0000644000176200001440000001251214413052536016612 0ustar liggesusers#' @title Check mixed models for boundary fits #' @name check_singularity #' #' @description Check mixed models for boundary fits. #' #' @param x A mixed model. #' @param tolerance Indicates up to which value the convergence result is #' accepted. The larger `tolerance` is, the stricter the test #' will be. #' @param ... Currently not used. #' #' @return `TRUE` if the model fit is singular. #' #' @details If a model is "singular", this means that some dimensions of the #' variance-covariance matrix have been estimated as exactly zero. This #' often occurs for mixed models with complex random effects structures. #' #' "While singular models are statistically well defined (it is theoretically #' sensible for the true maximum likelihood estimate to correspond to a singular #' fit), there are real concerns that (1) singular fits correspond to overfitted #' models that may have poor power; (2) chances of numerical problems and #' mis-convergence are higher for singular models (e.g. it may be computationally #' difficult to compute profile confidence intervals for such models); (3) #' standard inferential procedures such as Wald statistics and likelihood ratio #' tests may be inappropriate." (_lme4 Reference Manual_) #' #' There is no gold-standard about how to deal with singularity and which #' random-effects specification to choose. Beside using fully Bayesian methods #' (with informative priors), proposals in a frequentist framework are: #' #' - avoid fitting overly complex models, such that the variance-covariance #' matrices can be estimated precisely enough (_Matuschek et al. 2017_) #' - use some form of model selection to choose a model that balances #' predictive accuracy and overfitting/type I error (_Bates et al. 2015_, #' _Matuschek et al. 2017_) #' - "keep it maximal", i.e. fit the most complex model consistent with the #' experimental design, removing only terms required to allow a non-singular #' fit (_Barr et al. 2013_) #' #' Note the different meaning between singularity and convergence: singularity #' indicates an issue with the "true" best estimate, i.e. whether the maximum #' likelihood estimation for the variance-covariance matrix of the random #' effects is positive definite or only semi-definite. Convergence is a #' question of whether we can assume that the numerical optimization has #' worked correctly or not. #' #' @family functions to check model assumptions and and assess model quality #' #' @references #' - Bates D, Kliegl R, Vasishth S, Baayen H. Parsimonious Mixed Models. #' arXiv:1506.04967, June 2015. #' #' - Barr DJ, Levy R, Scheepers C, Tily HJ. Random effects structure for #' confirmatory hypothesis testing: Keep it maximal. Journal of Memory and #' Language, 68(3):255-278, April 2013. #' #' - Matuschek H, Kliegl R, Vasishth S, Baayen H, Bates D. Balancing type #' I error and power in linear mixed models. Journal of Memory and Language, #' 94:305-315, 2017. #' #' - lme4 Reference Manual, #' #' @examplesIf require("lme4") #' library(lme4) #' data(sleepstudy) #' set.seed(123) #' sleepstudy$mygrp <- sample(1:5, size = 180, replace = TRUE) #' sleepstudy$mysubgrp <- NA #' for (i in 1:5) { #' filter_group <- sleepstudy$mygrp == i #' sleepstudy$mysubgrp[filter_group] <- #' sample(1:30, size = sum(filter_group), replace = TRUE) #' } #' #' model <- lmer( #' Reaction ~ Days + (1 | mygrp / mysubgrp) + (1 | Subject), #' data = sleepstudy #' ) #' #' check_singularity(model) #' @export check_singularity <- function(x, tolerance = 1e-5, ...) { UseMethod("check_singularity") } #' @export check_singularity.merMod <- function(x, tolerance = 1e-5, ...) { insight::check_if_installed("lme4") theta <- lme4::getME(x, "theta") # diagonal elements are identifiable because they are fitted # with a lower bound of zero ... diag.element <- lme4::getME(x, "lower") == 0 any(abs(theta[diag.element]) < tolerance) } #' @export check_singularity.rlmerMod <- check_singularity.merMod #' @export check_singularity.glmmTMB <- function(x, tolerance = 1e-5, ...) { insight::check_if_installed("lme4") vc <- .collapse_cond(lme4::VarCorr(x)) any(sapply(vc, function(.x) any(abs(diag(.x)) < tolerance))) } #' @export check_singularity.glmmadmb <- check_singularity.glmmTMB #' @export check_singularity.clmm <- function(x, tolerance = 1e-5, ...) { insight::check_if_installed("ordinal") vc <- ordinal::VarCorr(x) any(sapply(vc, function(.x) any(abs(diag(.x)) < tolerance))) } #' @export check_singularity.cpglmm <- function(x, tolerance = 1e-5, ...) { insight::check_if_installed("cplm") vc <- cplm::VarCorr(x) any(sapply(vc, function(.x) any(abs(diag(.x)) < tolerance))) } #' @export check_singularity.MixMod <- function(x, tolerance = 1e-5, ...) { any(sapply(diag(x$D), function(.x) any(abs(.x) < tolerance))) } #' @export check_singularity.lme <- function(x, tolerance = 1e-5, ...) { insight::check_if_installed("nlme") any(abs(stats::na.omit(as.numeric(diag(nlme::getVarCov(x)))) < tolerance)) } #' @export check_singularity.default <- function(x, ...) { FALSE } .collapse_cond <- function(x) { if (is.list(x) && "cond" %in% names(x)) { x[["cond"]] } else { x } } performance/R/cronbachs_alpha.R0000644000176200001440000000572714414213045016217 0ustar liggesusers#' @title Cronbach's Alpha for Items or Scales #' @name cronbachs_alpha #' #' @description Compute various measures of internal consistencies #' for tests or item-scales of questionnaires. #' #' @param x A matrix or a data frame. #' @param ... Currently not used. #' #' @return The Cronbach's Alpha value for `x`. #' #' @details The Cronbach's Alpha value for `x`. A value closer to 1 #' indicates greater internal consistency, where usually following #' rule of thumb is applied to interpret the results: #' \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.5 is unacceptable, #' 0.5 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.6 is poor, #' 0.6 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.7 is questionable, #' 0.7 < \ifelse{html}{\out{α}}{\eqn{\alpha}{alpha}} < 0.8 is acceptable, #' and everything > 0.8 is good or excellent. #' #' @references Bland, J. M., and Altman, D. G. Statistics notes: Cronbach's #' alpha. BMJ 1997;314:572. 10.1136/bmj.314.7080.572 #' #' @examples #' data(mtcars) #' x <- mtcars[, c("cyl", "gear", "carb", "hp")] #' cronbachs_alpha(x) #' @export cronbachs_alpha <- function(x, ...) { UseMethod("cronbachs_alpha") } #' @export cronbachs_alpha.data.frame <- function(x, verbose = TRUE, ...) { # remove missings .data <- stats::na.omit(x) # we need at least two columns for Cronach's Alpha if (is.null(ncol(.data)) || ncol(.data) < 2) { if (verbose) { insight::format_warning("Too few columns in `x` to compute Cronbach's Alpha.") } return(NULL) } # Compute Cronbach's Alpha dim(.data)[2] / (dim(.data)[2] - 1) * (1 - sum(apply(.data, 2, stats::var)) / stats::var(rowSums(.data))) } #' @export cronbachs_alpha.matrix <- function(x, verbose = TRUE, ...) { cronbachs_alpha(as.data.frame(x), verbose = verbose, ...) } #' @export cronbachs_alpha.parameters_pca <- function(x, verbose = TRUE, ...) { # fetch data used for the PCA pca_data <- attributes(x)$dataset # if NULL, can we get from environment? if (is.null(pca_data)) { pca_data <- attr(x, "data") if (is.null(pca_data)) { if (verbose) { insight::format_warning("Could not find data frame that was used for the PCA.") } return(NULL) } pca_data <- get(pca_data, envir = parent.frame()) } # get assignment of columns to extracted components, based on the max loading factor_assignment <- attributes(x)$closest_component # sort and get unique IDs so we only get data from relevant columns unique_factors <- sort(unique(factor_assignment)) # apply cronbach's alpha for each component, # only for variables with max loading cronb <- sapply(unique_factors, function(i) { cronbachs_alpha( pca_data[, as.vector(x$Variable[factor_assignment == i]), drop = FALSE], verbose = verbose, ... ) }) names(cronb) <- paste0("PC", unique_factors) unlist(cronb) } performance/R/item_reliability.R0000644000176200001440000000616314414213045016432 0ustar liggesusers#' @title Reliability Test for Items or Scales #' @name item_reliability #' #' @description Compute various measures of internal consistencies #' for tests or item-scales of questionnaires. #' #' @param x A matrix or a data frame. #' @param standardize Logical, if `TRUE`, the data frame's vectors will be #' standardized. Recommended when the variables have different measures / #' scales. #' @param digits Amount of digits for returned values. #' #' @return A data frame with the corrected item-total correlations (*item #' discrimination*, column `item_discrimination`) and Cronbach's Alpha #' (if item deleted, column `alpha_if_deleted`) for each item #' of the scale, or `NULL` if data frame had too less columns. #' #' @details #' #' This function calculates the item discriminations (corrected item-total #' correlations for each item of `x` with the remaining items) and the #' Cronbach's alpha for each item, if it was deleted from the scale. The #' absolute value of the item discrimination indices should be above 0.2. An #' index between 0.2 and 0.4 is considered as "fair", while an index above 0.4 #' (or below -0.4) is "good". The range of satisfactory values is from 0.4 to #' 0.7. Items with low discrimination indices are often ambiguously worded and #' should be examined. Items with negative indices should be examined to #' determine why a negative value was obtained (e.g. reversed answer categories #' regarding positive and negative poles). #' #' @examples #' data(mtcars) #' x <- mtcars[, c("cyl", "gear", "carb", "hp")] #' item_reliability(x) #' @export item_reliability <- function(x, standardize = FALSE, digits = 3) { # check param if (!is.matrix(x) && !is.data.frame(x)) { insight::format_alert("`x` needs to be a data frame or matrix.") return(NULL) } # remove missings, so correlation works x <- stats::na.omit(x) # remember item (column) names for return value # return value gets column names of initial data frame df.names <- colnames(x) ret.df <- NULL # check for minimum amount of columns can't be less than 3, because the # reliability test checks for Cronbach's alpha if a specific item is deleted. # If data frame has only two columns and one is deleted, Cronbach's alpha # cannot be calculated. if (ncol(x) > 2) { # Check whether items should be scaled. Needed, # when items have different measures / scales if (standardize) x <- .std(x) # calculate cronbach-if-deleted cronbachDeleted <- vapply(seq_len(ncol(x)), function(i) cronbachs_alpha(x[, -i]), numeric(1L)) # calculate corrected total-item correlation totalCorr <- vapply(seq_len(ncol(x)), function(i) { stats::cor(x[, i], rowSums(x[, -i]), use = "pairwise.complete.obs") }, numeric(1L)) ret.df <- data.frame( term = df.names, alpha_if_deleted = round(cronbachDeleted, digits), item_discrimination = round(totalCorr, digits), stringsAsFactors = FALSE ) } else { insight::format_warning("Data frame needs at least three columns for reliability-test.") } ret.df } performance/R/logLik.R0000644000176200001440000000304614505510012014314 0ustar liggesusers#' @exportS3Method logLik ivreg logLik.ivreg <- function(object, ...) { res <- insight::get_residuals(object) p <- object$rank w <- object$weights N <- length(res) if (is.null(w)) { w <- rep.int(1, N) } else { excl <- w == 0 if (any(excl)) { res <- res[!excl] N <- length(res) w <- w[!excl] } } N0 <- N val <- 0.5 * (sum(log(w)) - N * (log(2 * pi) + 1 - log(N) + log(sum(w * res^2)))) attr(val, "nall") <- N0 attr(val, "nobs") <- N attr(val, "df") <- p + 1 class(val) <- "logLik" val } #' @exportS3Method logLik iv_robust logLik.iv_robust <- logLik.ivreg #' @exportS3Method logLik plm logLik.plm <- function(object, ...) { res <- object$residuals w <- object$weights N <- length(res) if (is.null(w)) { w <- rep.int(1, N) } else { excl <- w == 0 if (any(excl)) { res <- res[!excl] N <- length(res) w <- w[!excl] } } N0 <- N val <- 0.5 * (sum(log(w)) - N * (log(2 * pi) + 1 - log(N) + log(sum(w * res^2)))) attr(val, "nall") <- N0 attr(val, "nobs") <- N attr(val, "df") <- insight::n_parameters(object) + 1L class(val) <- "logLik" val } #' @exportS3Method logLik cpglm logLik.cpglm <- logLik.plm #' @exportS3Method logLik svycoxph logLik.svycoxph <- function(object, ...) { val <- object$ll[2] attr(val, "nall") <- insight::n_obs(object) attr(val, "nobs") <- insight::n_obs(object) attr(val, "df") <- object$degf.resid class(val) <- "logLik" val } performance/R/r2_mcfadden.R0000644000176200001440000001064714410644543015260 0ustar liggesusers#' @title McFadden's R2 #' @name r2_mcfadden #' #' @description Calculates McFadden's pseudo R2. #' #' @param model Generalized linear or multinomial logit (`mlogit`) model. #' @param ... Currently not used. #' #' @return For most models, a list with McFadden's R2 and adjusted McFadden's #' R2 value. For some models, only McFadden's R2 is available. #' #' @references #' - McFadden, D. (1987). Regression-based specification tests for the #' multinomial logit model. Journal of econometrics, 34(1-2), 63-82. #' - McFadden, D. (1973). Conditional logit analysis of qualitative choice #' behavior. #' #' @examples #' if (require("mlogit")) { #' data("Fishing", package = "mlogit") #' Fish <- mlogit.data(Fishing, varying = c(2:9), shape = "wide", choice = "mode") #' #' model <- mlogit(mode ~ price + catch, data = Fish) #' r2_mcfadden(model) #' } #' @export r2_mcfadden <- function(model, ...) { UseMethod("r2_mcfadden") } # helper ----------------------- .r2_mcfadden <- function(model, l_null) { l_full <- insight::get_loglikelihood(model) k <- length(insight::find_parameters(model)) mcfadden <- 1 - (as.vector(l_full) / as.vector(l_null)) mcfadden_adjusted <- 1 - ((as.vector(l_full) - k) / as.vector(l_null)) out <- list( R2 = c(`McFadden's R2` = mcfadden), R2_adjusted = c(`adjusted McFadden's R2` = mcfadden_adjusted) ) attr(out, "model_type") <- "Generalized Linear" structure(class = "r2_generic", out) } # r2 via loglik and update -------------------------- #' @export r2_mcfadden.glm <- function(model, verbose = TRUE, ...) { info <- list(...)$model_info if (is.null(info)) { info <- suppressWarnings(insight::model_info(model, verbose = FALSE)) } if (info$is_binomial && !info$is_bernoulli && class(model)[1] == "glm") { if (verbose) { insight::format_warning("Can't calculate accurate R2 for binomial models that are not Bernoulli models.") } return(NULL) } else { l_null <- insight::get_loglikelihood(stats::update(model, ~1)) .r2_mcfadden(model, l_null) } } #' @export r2_mcfadden.clm <- r2_mcfadden.glm #' @export r2_mcfadden.cpglm <- r2_mcfadden.glm #' @export r2_mcfadden.glmx <- r2_mcfadden.glm #' @export r2_mcfadden.polr <- r2_mcfadden.glm #' @export r2_mcfadden.bracl <- r2_mcfadden.glm #' @export r2_mcfadden.brmultinom <- r2_mcfadden.glm #' @export r2_mcfadden.censReg <- r2_mcfadden.glm #' @export r2_mcfadden.truncreg <- r2_mcfadden.glm #' @export r2_mcfadden.mclogit <- function(model, ...) { insight::check_if_installed("mclogit", reason = "to calculate R2") s <- mclogit::getSummary.mclogit(model) r2_mcfadden <- s$sumstat["McFadden"] names(r2_mcfadden) <- "McFadden's R2" r2_mcfadden } #' @export r2_mcfadden.mblogit <- function(model, ...) { insight::check_if_installed("mclogit", reason = "to calculate R2") s <- mclogit::getSummary.mblogit(model) r2_mcfadden <- s$sumstat["McFadden"] names(r2_mcfadden) <- "McFadden's R2" r2_mcfadden } # mfx models --------------------- #' @export r2_mcfadden.logitmfx <- function(model, ...) { r2_mcfadden(model$fit, ...) } #' @export r2_mcfadden.logitor <- r2_mcfadden.logitmfx #' @export r2_mcfadden.poissonirr <- r2_mcfadden.logitmfx #' @export r2_mcfadden.poissonmfx <- r2_mcfadden.logitmfx #' @export r2_mcfadden.negbinirr <- r2_mcfadden.logitmfx #' @export r2_mcfadden.probitmfx <- r2_mcfadden.logitmfx #' @export r2_mcfadden.negbinmfx <- r2_mcfadden.logitmfx # special models ------------------------------------------- #' @export r2_mcfadden.vglm <- function(model, ...) { if (!(is.null(model@call$summ) && !identical(model@call$summ, 0))) { insight::format_error("Can't get log-likelihood when `summ` is not zero.") } l_null <- insight::get_loglikelihood(stats::update(model, ~1)) .r2_mcfadden(model, l_null) } #' @export r2_mcfadden.clm2 <- function(model, ...) { l_null <- insight::get_loglikelihood(stats::update(model, location = ~1, scale = ~1)) .r2_mcfadden(model, l_null) } #' @export r2_mcfadden.multinom <- function(model, ...) { l_null <- insight::get_loglikelihood(stats::update(model, ~1, trace = FALSE)) .r2_mcfadden(model, l_null) } #' @export r2_mcfadden.mlogit <- function(model, ...) { R2 <- as.vector(summary(model)$mfR2) names(R2) <- "McFadden's R2" R2 } performance/R/compare_performance.R0000644000176200001440000003114214501062052017102 0ustar liggesusers#' @title Compare performance of different models #' @name compare_performance #' #' @description `compare_performance()` computes indices of model #' performance for different models at once and hence allows comparison of #' indices across models. #' #' @param ... Multiple model objects (also of different classes). #' @param metrics Can be `"all"`, `"common"` or a character vector of #' metrics to be computed. See related #' [`documentation()`][model_performance] of object's class for #' details. #' @param rank Logical, if `TRUE`, models are ranked according to 'best' #' overall model performance. See 'Details'. #' @inheritParams performance_aic #' #' @return A data frame with one row per model and one column per "index" (see #' `metrics`). #' #' @note There is also a [`plot()`-method](https://easystats.github.io/see/articles/performance.html) implemented in the \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @details \subsection{Model Weights}{ #' When information criteria (IC) are requested in `metrics` (i.e., any of `"all"`, #' `"common"`, `"AIC"`, `"AICc"`, `"BIC"`, `"WAIC"`, or `"LOOIC"`), model #' weights based on these criteria are also computed. For all IC except LOOIC, #' weights are computed as `w = exp(-0.5 * delta_ic) / sum(exp(-0.5 * delta_ic))`, #' where `delta_ic` is the difference between the model's IC value and the #' smallest IC value in the model set (Burnham and Anderson, 2002). #' For LOOIC, weights are computed as "stacking weights" using #' [loo::stacking_weights()]. #' } #' #' \subsection{Ranking Models}{ #' When `rank = TRUE`, a new column `Performance_Score` is returned. #' This score ranges from 0\% to 100\%, higher values indicating better model #' performance. Note that all score value do not necessarily sum up to 100\%. #' Rather, calculation is based on normalizing all indices (i.e. rescaling #' them to a range from 0 to 1), and taking the mean value of all indices for #' each model. This is a rather quick heuristic, but might be helpful as #' exploratory index. #' \cr \cr #' In particular when models are of different types (e.g. mixed models, #' classical linear models, logistic regression, ...), not all indices will be #' computed for each model. In case where an index can't be calculated for a #' specific model type, this model gets an `NA` value. All indices that #' have any `NA`s are excluded from calculating the performance score. #' \cr \cr #' There is a `plot()`-method for `compare_performance()`, #' which creates a "spiderweb" plot, where the different indices are #' normalized and larger values indicate better model performance. #' Hence, points closer to the center indicate worse fit indices #' (see [online-documentation](https://easystats.github.io/see/articles/performance.html) #' for more details). #' } #' #' \subsection{REML versus ML estimator}{ #' By default, `estimator = "ML"`, which means that values from information #' criteria (AIC, AICc, BIC) for specific model classes (like models from *lme4*) #' are based on the ML-estimator, while the default behaviour of `AIC()` for #' such classes is setting `REML = TRUE`. This default is intentional, because #' comparing information criteria based on REML fits is usually not valid #' (it might be useful, though, if all models share the same fixed effects - #' however, this is usually not the case for nested models, which is a #' prerequisite for the LRT). Set `estimator = "REML"` explicitly return the #' same (AIC/...) values as from the defaults in `AIC.merMod()`. #' } #' #' @references #' Burnham, K. P., and Anderson, D. R. (2002). #' _Model selection and multimodel inference: A practical information-theoretic approach_ (2nd ed.). #' Springer-Verlag. \doi{10.1007/b97636} #' #' @examplesIf require("lme4") #' data(iris) #' lm1 <- lm(Sepal.Length ~ Species, data = iris) #' lm2 <- lm(Sepal.Length ~ Species + Petal.Length, data = iris) #' lm3 <- lm(Sepal.Length ~ Species * Petal.Length, data = iris) #' compare_performance(lm1, lm2, lm3) #' compare_performance(lm1, lm2, lm3, rank = TRUE) #' #' m1 <- lm(mpg ~ wt + cyl, data = mtcars) #' m2 <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' m3 <- lme4::lmer(Petal.Length ~ Sepal.Length + (1 | Species), data = iris) #' compare_performance(m1, m2, m3) #' @inheritParams model_performance.lm #' @export compare_performance <- function(..., metrics = "all", rank = FALSE, estimator = "ML", verbose = TRUE) { # process input objects <- insight::ellipsis_info(..., only_models = TRUE) # ensure proper object names objects <- .check_objectnames(objects, sapply(match.call(expand.dots = FALSE)$`...`, as.character)) # drop unsupport models supported_models <- sapply(objects, function(i) insight::is_model_supported(i) | inherits(i, "lavaan")) object_names <- names(objects) if (!all(supported_models)) { insight::format_alert( "Following objects are not supported:", datawizard::text_concatenate(object_names[!supported_models], enclose = "`") ) objects <- objects[supported_models] object_names <- object_names[supported_models] } # iterate over all models, i.e. model-performance for each model m <- mapply(function(.x, .y) { dat <- model_performance(.x, metrics = metrics, estimator = estimator, verbose = FALSE) model_name <- gsub("\"", "", insight::safe_deparse(.y), fixed = TRUE) perf_df <- data.frame(Name = model_name, Model = class(.x)[1], dat, stringsAsFactors = FALSE) attributes(perf_df) <- c(attributes(perf_df), attributes(dat)[!names(attributes(dat)) %in% c("names", "row.names", "class")]) return(perf_df) }, objects, object_names, SIMPLIFY = FALSE) attri <- lapply(m, function(x) { attri <- attributes(x) attri[!names(attri) %in% c("names", "row.names", "class")] }) dfs <- Reduce(function(x, y) merge(x, y, all = TRUE, sort = FALSE), m) if (any(c("AIC", "AICc", "BIC", "WAIC") %in% names(dfs))) { dfs$AIC_wt <- .ic_weight(dfs[["AIC"]]) dfs$AICc_wt <- .ic_weight(dfs[["AICc"]]) dfs$BIC_wt <- .ic_weight(dfs[["BIC"]]) dfs$WAIC_wt <- .ic_weight(dfs[["WAIC"]]) } if ("LOOIC" %in% names(dfs)) { lpd_point <- do.call(cbind, lapply(attri, function(x) x$loo$pointwise[, "elpd_loo"])) dfs$LOOIC_wt <- as.numeric(loo::stacking_weights(lpd_point)) } # check if all models were fit from same data if (!isTRUE(attributes(objects)$same_response) && verbose) { insight::format_alert( "When comparing models, please note that probably not all models were fit from same data." ) } # create "ranking" of models if (isTRUE(rank)) { dfs <- .rank_performance_indices(dfs, verbose) } # Reorder columns if (all(c("BIC", "BF") %in% names(dfs))) { idx1 <- grep("^BIC$", names(dfs)) idx2 <- grep("BF", names(dfs), fixed = TRUE) last_part <- (idx1 + 1):ncol(dfs) dfs <- dfs[, c(1:idx1, idx2, last_part[last_part != idx2])] } if (all(c("AIC", "AIC_wt") %in% names(dfs))) { idx1 <- grep("^AIC$", names(dfs)) idx2 <- grep("AIC_wt", names(dfs), fixed = TRUE) last_part <- (idx1 + 1):ncol(dfs) dfs <- dfs[, c(1:idx1, idx2, last_part[last_part != idx2])] } if (all(c("BIC", "BIC_wt") %in% names(dfs))) { idx1 <- grep("^BIC$", names(dfs)) idx2 <- grep("BIC_wt", names(dfs), fixed = TRUE) last_part <- (idx1 + 1):ncol(dfs) dfs <- dfs[, c(1:idx1, idx2, last_part[last_part != idx2])] } if (all(c("AICc", "AICc_wt") %in% names(dfs))) { idx1 <- grep("^AICc$", names(dfs)) idx2 <- grep("AICc_wt", names(dfs), fixed = TRUE) last_part <- (idx1 + 1):ncol(dfs) dfs <- dfs[, c(1:idx1, idx2, last_part[last_part != idx2])] } if (all(c("WAIC", "WAIC_wt") %in% names(dfs))) { idx1 <- grep("^WAIC$", names(dfs)) idx2 <- grep("WAIC_wt", names(dfs), fixed = TRUE) last_part <- (idx1 + 1):ncol(dfs) dfs <- dfs[, c(1:idx1, idx2, last_part[last_part != idx2])] } if (all(c("LOOIC", "LOOIC_wt") %in% names(dfs))) { idx1 <- grep("^LOOIC$", names(dfs)) idx2 <- grep("LOOIC_wt", names(dfs), fixed = TRUE) last_part <- (idx1 + 1):ncol(dfs) dfs <- dfs[, c(1:idx1, idx2, last_part[last_part != idx2])] } # for REML fits, warn user if (isTRUE(verbose) && # only warn for REML fit identical(estimator, "REML") && # only for IC comparison any(grepl("(AIC|BIC)", names(dfs))) && # only when mixed models are involved, others probably don't have problems with REML fit any(sapply(objects, insight::is_mixed_model)) && # only if not all models have same fixed effects (else, REML is ok) !isTRUE(attributes(objects)$same_fixef)) { insight::format_alert( "Information criteria (like AIC) are based on REML fits (i.e. `estimator=\"REML\"`).", "Please note that information criteria are probably not directly comparable and that it is not recommended comparing models with different fixed effects in such cases." ) } # dfs[order(sapply(object_names, as.character), dfs$Model), ] class(dfs) <- c("compare_performance", "see_compare_performance", class(dfs)) dfs } # methods ---------------------------- #' @export print.compare_performance <- function(x, digits = 3, layout = "horizontal", ...) { layout <- match.arg(layout, choices = c("horizontal", "vertical")) table_caption <- c("# Comparison of Model Performance Indices", "blue") formatted_table <- format(x = x, digits = digits, format = "text", ...) if ("Performance_Score" %in% colnames(formatted_table)) { footer <- c(sprintf("\nModel `%s` (of class `%s`) performed best with an overall performance score of %s.", formatted_table$Model[1], formatted_table$Type[1], formatted_table$Performance_Score[1]), "yellow") } else { footer <- NULL } # switch to vertical layout if (layout == "vertical") { formatted_table <- datawizard::rownames_as_column(as.data.frame(t(formatted_table)), "Metric") formatted_table <- datawizard::row_to_colnames(formatted_table) colnames(formatted_table)[1] <- "Metric" } cat(insight::export_table(x = formatted_table, digits = digits, format = "text", caption = table_caption, footer = footer, ...)) invisible(x) } #' @export plot.compare_performance <- function(x, ...) { insight::check_if_installed("see", "for model comparison plots") NextMethod() } # utilities ------------------------------ .rank_performance_indices <- function(x, verbose) { # all models comparable? if (length(unique(x$Type)) > 1 && isTRUE(verbose)) { insight::format_alert( "Models are not of same type. Comparison of indices might be not meaningful." ) } # set reference for Bayes factors to 1 if ("BF" %in% colnames(x)) x$BF[is.na(x$BF)] <- 1 # don't include test statistic in ranking x$p_CochransQ <- NULL x$p_Omnibus <- NULL x$p <- NULL x$p_LRT <- NULL # use weights instead of information criteria x$AIC <- NULL x$AICc <- NULL x$BIC <- NULL x$LOOIC <- NULL x$WAIC <- NULL # remove extra columns from LOO criteria x$ELPD <- NULL x$ELPD_SE <- NULL x$LOOIC_SE <- NULL # don't rank with BF when there is also BIC (same information) if ("BF" %in% colnames(x) && "BIC_wt" %in% colnames(x)) { x$BF <- NULL } out <- x # normalize indices, for comparison out[] <- lapply(out, function(i) { if (is.numeric(i)) i <- .normalize_vector(i) i }) # recode some indices, so higher values = better fit for (i in c("RMSE", "Sigma")) { if (i %in% colnames(out)) { out[[i]] <- 1 - out[[i]] } } # any indices with NA? missing_indices <- sapply(out, anyNA) if (any(missing_indices) && isTRUE(verbose)) { insight::format_alert(sprintf( "Following indices with missing values are not used for ranking: %s", toString(colnames(out)[missing_indices]) )) } # create rank-index, only for complete indices numeric_columns <- sapply(out, function(i) is.numeric(i) & !anyNA(i)) rank_index <- rowMeans(out[numeric_columns], na.rm = TRUE) x$Performance_Score <- rank_index x <- x[order(rank_index, decreasing = TRUE), ] rownames(x) <- NULL x } .normalize_vector <- function(x) { if (all(is.na(x)) || all(is.infinite(x))) { return(x) } as.vector((x - min(x, na.rm = TRUE)) / diff(range(x, na.rm = TRUE), na.rm = TRUE)) } .ic_weight <- function(ic) { # ic should be in the deviance metric (-2 * loglik) if (is.null(ic)) { return(NULL) } diffs <- ic - min(ic) f <- exp(-0.5 * diffs) f / sum(f) } performance/R/check_distribution.R0000644000176200001440000001611314512471542016762 0ustar liggesusers#' Classify the distribution of a model-family using machine learning #' #' @name classify_distribution #' @docType data #' @keywords data #' @details #' The trained model to classify distributions, which is used by the #' `check_distribution()` function. NULL #' Classify the distribution of a model-family using machine learning #' #' Choosing the right distributional family for regression models is essential #' to get more accurate estimates and standard errors. This function may help to #' check a models' distributional family and see if the model-family probably #' should be reconsidered. Since it is difficult to exactly predict the correct #' model family, consider this function as somewhat experimental. #' #' @param model Typically, a model (that should response to `residuals()`). #' May also be a numeric vector. #' #' @note This function is somewhat experimental and might be improved in future #' releases. The final decision on the model-family should also be based on #' theoretical aspects and other information about the data and the model. #' \cr \cr #' There is also a #' [`plot()`-method](https://easystats.github.io/see/articles/performance.html) #' implemented in the #' \href{https://easystats.github.io/see/}{\pkg{see}-package}. #' #' @details #' #' This function uses an internal random forest model to classify the #' distribution from a model-family. Currently, following distributions are #' trained (i.e. results of `check_distribution()` may be one of the #' following): `"bernoulli"`, `"beta"`, `"beta-binomial"`, #' `"binomial"`, `"chi"`, `"exponential"`, `"F"`, #' `"gamma"`, `"lognormal"`, `"normal"`, `"negative #' binomial"`, `"negative binomial (zero-inflated)"`, `"pareto"`, #' `"poisson"`, `"poisson (zero-inflated)"`, `"uniform"` and #' `"weibull"`. #' \cr \cr #' Note the similarity between certain distributions according to shape, skewness, #' etc. Thus, the predicted distribution may not be perfectly representing the #' distributional family of the underlying fitted model, or the response value. #' \cr \cr #' There is a `plot()` method, which shows the probabilities of all predicted #' distributions, however, only if the probability is greater than zero. #' #' @examplesIf require("lme4") && require("parameters") && require("randomForest") #' data(sleepstudy, package = "lme4") #' model <<- lme4::lmer(Reaction ~ Days + (Days | Subject), sleepstudy) #' check_distribution(model) #' #' @examplesIf require("see") && require("patchwork") && require("randomForest") #' plot(check_distribution(model)) #' #' @export check_distribution <- function(model) { UseMethod("check_distribution") } # default ----------------------------- #' @export check_distribution.default <- function(model) { # check for valid input .is_model_valid(model) insight::check_if_installed("randomForest") if (inherits(model, "brmsfit")) { x <- stats::residuals(model)[, "Estimate"] } else { x <- stats::residuals(model) } # x_scaled <- .normalize(x) dat <- .extract_features(x) dist_residuals <- as.data.frame(t(stats::predict(classify_distribution, dat, type = "prob"))) # Extract features x <- datawizard::to_numeric( insight::get_response(model, verbose = FALSE), dummy_factors = FALSE, preserve_levels = TRUE ) dat <- .extract_features(x) dist_response <- as.data.frame(t(stats::predict(classify_distribution, dat, type = "prob"))) out <- data.frame( Distribution = rownames(dist_response), p_Residuals = dist_residuals[[1]], p_Response = dist_response[[1]], stringsAsFactors = FALSE, row.names = NULL ) class(out) <- unique(c("check_distribution", "see_check_distribution", class(out))) attr(out, "data") <- model attr(out, "object_name") <- insight::safe_deparse_symbol(substitute(model)) out } # methods -------------------------- #' @export print.check_distribution <- function(x, ...) { insight::print_color("# Distribution of Model Family\n\n", "blue") x1 <- x[order(x$p_Residuals, decreasing = TRUE)[1:3], c(1, 2)] x1 <- x1[x1$p_Residuals > 0, ] x1$p_Residuals <- sprintf("%g%%", round(100 * x1$p_Residuals)) colnames(x1) <- c("Distribution", "Probability") insight::print_color("Predicted Distribution of Residuals\n\n", "red") print.data.frame(x1, row.names = FALSE, ...) x2 <- x[order(x$p_Response, decreasing = TRUE)[1:3], c(1, 3)] x2 <- x2[x2$p_Response > 0, ] x2$p_Response <- sprintf("%g%%", round(100 * x2$p_Response)) colnames(x2) <- c("Distribution", "Probability") insight::print_color("\nPredicted Distribution of Response\n\n", "red") print.data.frame(x2, row.names = FALSE, ...) invisible(x) } #' @export print.check_distribution_numeric <- function(x, ...) { insight::print_color("# Predicted Distribution of Vector\n\n", "blue") x1 <- x[order(x$p_Vector, decreasing = TRUE)[1:3], c(1, 2)] x1 <- x1[x1$p_Vector > 0, ] x1$p_Vector <- sprintf("%g%%", round(100 * x1$p_Vector)) colnames(x1) <- c("Distribution", "Probability") print.data.frame(x1, row.names = FALSE, ...) invisible(x) } #' @export plot.check_distribution <- function(x, ...) { insight::check_if_installed("see", "to plot predicted distributions") NextMethod() } #' @export plot.check_distribution_numeric <- function(x, ...) { insight::check_if_installed("see", "to plot predicted distributions") NextMethod() } # other classes ------------------- #' @export check_distribution.numeric <- function(model) { insight::check_if_installed("randomForest") dat <- .extract_features(model) dist <- as.data.frame(t(stats::predict(classify_distribution, dat, type = "prob"))) out <- data.frame( Distribution = rownames(dist), p_Vector = dist[[1]], stringsAsFactors = FALSE, row.names = NULL ) class(out) <- unique(c("check_distribution_numeric", "see_check_distribution_numeric", class(out))) attr(out, "data") <- model out } # utilities ----------------------------- .extract_features <- function(x) { # validation check, remove missings x <- x[!is.na(x)] data.frame( SD = stats::sd(x), MAD = stats::mad(x, constant = 1), Mean_Median_Distance = mean(x) - stats::median(x), Mean_Mode_Distance = mean(x) - as.numeric(bayestestR::map_estimate(x, bw = "nrd0")), SD_MAD_Distance = stats::sd(x) - stats::mad(x, constant = 1), Var_Mean_Distance = stats::var(x) - mean(x), Range_SD = diff(range(x)) / stats::sd(x), Range = diff(range(x)), IQR = stats::IQR(x), Skewness = .skewness(x), Kurtosis = .kurtosis(x), Uniques = length(unique(x)) / length(x), N_Uniques = length(unique(x)), Min = min(x), Max = max(x), Proportion_Positive = sum(x >= 0) / length(x), Integer = all(.is_integer(x)) ) } .is_integer <- function(x) { tryCatch( expr = { ifelse(is.infinite(x), FALSE, x %% 1 == 0) }, warning = function(w) { is.integer(x) }, error = function(e) { FALSE } ) } performance/R/skewness_kurtosis.R0000644000176200001440000000166214257247716016730 0ustar liggesusers.skewness <- function(x) { if (is.matrix(x)) { apply(x, 2, .skewness_numeric) } else if (is.vector(x)) { .skewness_numeric(x) } else if (is.data.frame(x)) { sapply(x, .skewness_numeric) } else { .skewness_numeric(as.vector(x)) } } .skewness_numeric <- function(x) { x <- x[!is.na(x)] n <- length(x) (sum((x - mean(x))^3) / n) / (sum((x - mean(x))^2) / n)^(3 / 2) } .kurtosis <- function(x) { if (is.matrix(x)) { apply(x, 2, .kurtosis_numeric) } else if (is.vector(x)) { .kurtosis_numeric(x) } else if (is.data.frame(x)) { sapply(x, .kurtosis_numeric) } else { .kurtosis_numeric(as.vector(x)) } } .kurtosis_numeric <- function(x) { x <- x[!is.na(x)] n <- length(x) n * sum((x - mean(x))^4) / (sum((x - mean(x))^2)^2) } .normalize <- function(x) { as.vector((x - min(x, na.rm = TRUE)) / diff(range(x, na.rm = TRUE), na.rm = TRUE)) } performance/R/r2_loo.R0000644000176200001440000001406214501062052014271 0ustar liggesusers#' @title LOO-adjusted R2 #' @name r2_loo #' #' @description Compute LOO-adjusted R2. #' #' @param model A Bayesian regression model (from **brms**, #' **rstanarm**, **BayesFactor**, etc). #' @param robust Logical, if `TRUE`, the median instead of mean is used to #' calculate the central tendency of the variances. #' @param ci Value or vector of probability of the CI (between 0 and 1) to be #' estimated. #' @param ... Arguments passed to `r2_posterior()`. #' @inheritParams model_performance.lm #' #' @return A list with the Bayesian R2 value. For mixed models, a list with the #' Bayesian R2 value and the marginal Bayesian R2 value. The standard errors #' and credible intervals for the R2 values are saved as attributes. #' #' @details `r2_loo()` returns an "adjusted" R2 value computed using a #' leave-one-out-adjusted posterior distribution. This is conceptually similar #' to an adjusted/unbiased R2 estimate in classical regression modeling. See #' [r2_bayes()] for an "unadjusted" R2. #' #' Mixed models are not currently fully supported. #' #' `r2_loo_posterior()` is the actual workhorse for `r2_loo()` and #' returns a posterior sample of LOO-adjusted Bayesian R2 values. #' #' @return A list with the LOO-adjusted R2 value. The standard errors #' and credible intervals for the R2 values are saved as attributes. #' #' @examplesIf require("rstanarm") && require("rstantools") #' model <- suppressWarnings(rstanarm::stan_glm( #' mpg ~ wt + cyl, #' data = mtcars, #' chains = 1, #' iter = 500, #' refresh = 0, #' show_messages = FALSE #' )) #' r2_loo(model) #' @export r2_loo <- function(model, robust = TRUE, ci = 0.95, verbose = TRUE, ...) { loo_r2 <- r2_loo_posterior(model, verbose = verbose, ...) if (is.null(loo_r2)) { return(NULL) } loo_r2 <- structure( class = "r2_loo", lapply(loo_r2, ifelse(robust, stats::median, mean)), "SE" = lapply(loo_r2, ifelse(robust, stats::mad, stats::sd)), # "Estimates" = lapply(r2_bayesian, bayestestR::point_estimate, centrality = "all", dispersion = TRUE), "CI" = lapply(loo_r2, bayestestR::hdi, ci = ci), "robust" = robust ) return(loo_r2) } #' @export #' @rdname r2_loo r2_loo_posterior <- function(model, ...) { UseMethod("r2_loo_posterior") } #' @export #' @rdname r2_loo r2_loo_posterior.brmsfit <- function(model, verbose = TRUE, ...) { insight::check_if_installed("rstantools") algorithm <- insight::find_algorithm(model) if (algorithm$algorithm != "sampling") { insight::format_warning("`r2()` only available for models fit using the \"sampling\" algorithm.") return(NA) } tryCatch( { mi <- insight::model_info(model) if (insight::is_multivariate(model)) { res <- insight::find_response(model) if (mi[[1]]$is_mixed) { br2_mv <- list( "R2_loo" = rstantools::loo_R2( model, re.form = NULL, re_formula = NULL, summary = FALSE ), "R2_loo_marginal" = rstantools::loo_R2( model, re.form = NA, re_formula = NA, summary = FALSE ) ) br2 <- lapply(seq_along(res), function(x) { list( "R2_loo" = unname(as.vector(br2_mv$R2_loo[, x])), "R2_loo_marginal" = unname(as.vector(br2_mv$R2_loo_marginal[, x])) ) }) names(br2) <- res } else { br2_mv <- list("R2_loo" = rstantools::loo_R2(model, summary = FALSE)) br2 <- lapply(seq_along(res), function(x) { list("R2_loo" = unname(as.vector(br2_mv$R2_loo[, x]))) }) names(br2) <- res } } else { if (mi$is_mixed) { br2 <- list( "R2_loo" = as.vector(rstantools::loo_R2( model, re.form = NULL, re_formula = NULL, summary = FALSE )), "R2_loo_marginal" = as.vector(rstantools::loo_R2( model, re.form = NA, re_formula = NA, summary = FALSE )) ) names(br2$R2_loo) <- rep("Conditional R2_adjusted", length(br2$R2_loo)) names(br2$R2_loo_marginal) <- rep("Marginal R2_adjusted", length(br2$R2_loo)) } else { br2 <- list("R2_loo" = as.vector(rstantools::loo_R2(model, summary = FALSE))) names(br2$R2_loo) <- rep("R2_adjusted", length(br2$R2_loo)) } } br2 }, error = function(e) { if (inherits(e, c("simpleError", "error"))) { insight::print_color(e$message, "red") cat("\n") } NULL } ) } #' @export #' @rdname r2_loo r2_loo_posterior.stanreg <- r2_loo_posterior.brmsfit #' @export r2_loo_posterior.stanmvreg <- function(model, verbose = TRUE, ...) { if (isTRUE(verbose)) { insight::format_warning("Models of class `stanmvreg` not yet supported.") } NULL } #' @export r2_loo_posterior.BFBayesFactor <- function(model, verbose = TRUE, ...) { if (isTRUE(verbose)) { insight::format_warning("Models of class `BFBayesFactor` not yet supported.") } NULL } #' @export as.data.frame.r2_loo <- function(x, ...) { out <- data.frame( R2 = x$R2_loo, SD = attributes(x)$SE$R2_loo, CI = attributes(x)$CI$R2_loo$CI, CI_low = attributes(x)$CI$R2_loo$CI_low, CI_high = attributes(x)$CI$R2_loo$CI_high, stringsAsFactors = FALSE ) if (!is.null(x$R2_loo_marginal)) { out_marginal <- data.frame( R2 = x$R2_loo_marginal, SD = attributes(x)$SE$R2_loo_marginal, CI = attributes(x)$CI$R2_loo_marginal$CI, CI_low = attributes(x)$CI$R2_loo_marginal$CI_low, CI_high = attributes(x)$CI$R2_loo_marginal$CI_high, stringsAsFactors = FALSE ) out$Component <- "conditional" out_marginal$Component <- "marginal" out <- rbind(out, out_marginal) } out } performance/R/model_performance_default.R0000644000176200001440000000262714325227320020273 0ustar liggesusers#' @export model_performance.default <- function(model, metrics = "all", verbose = TRUE, ...) { # check for valid input .is_model_valid(model) if (any(tolower(metrics) == "log_loss")) { metrics[tolower(metrics) == "log_loss"] <- "LOGLOSS" } # all available options... all_metrics <- c("AIC", "BIC", "R2", "R2_adj", "RMSE", "SIGMA", "LOGLOSS", "PCP", "SCORE") if (all(metrics == "all")) { metrics <- all_metrics } else if (all(metrics == "common")) { metrics <- c("AIC", "BIC", "R2", "R2_adj", "RMSE") } # check for valid input metrics <- .check_bad_metrics(metrics, all_metrics, verbose) if (!insight::is_model(model) || !insight::is_model_supported(model)) { if (isTRUE(verbose)) { insight::format_warning(paste0("Objects of class `", class(model)[1], "` are not supported model objects.")) } return(NULL) } model_performance.lm(model = model, metrics = metrics, verbose = verbose, ...) } .check_bad_metrics <- function(metrics, all_metrics, verbose = TRUE) { # check for valid input bad_metrics <- which(!metrics %in% all_metrics) if (length(bad_metrics)) { if (verbose) { insight::format_warning(paste0( "Following elements are no valid metric: ", datawizard::text_concatenate(metrics[bad_metrics], enclose = "`") )) } metrics <- metrics[-bad_metrics] } metrics } performance/R/r2.R0000644000176200001440000004404214507335630013434 0ustar liggesusers#' @title Compute the model's R2 #' @name r2 #' #' @description Calculate the R2, also known as the coefficient of #' determination, value for different model objects. Depending on the model, #' R2, pseudo-R2, or marginal / adjusted R2 values are returned. #' #' @param model A statistical model. #' @param verbose Logical. Should details about R2 and CI methods be given #' (`TRUE`) or not (`FALSE`)? #' @param ci Confidence interval level, as scalar. If `NULL` (default), no #' confidence intervals for R2 are calculated. #' @param ... Arguments passed down to the related r2-methods. #' @inheritParams r2_nakagawa #' #' @return Returns a list containing values related to the most appropriate R2 #' for the given model (or `NULL` if no R2 could be extracted). See the #' list below: #' - Logistic models: [Tjur's R2][r2_tjur] #' - General linear models: [Nagelkerke's R2][r2_nagelkerke] #' - Multinomial Logit: [McFadden's R2][r2_mcfadden] #' - Models with zero-inflation: [R2 for zero-inflated models][r2_zeroinflated] #' - Mixed models: [Nakagawa's R2][r2_nakagawa] #' - Bayesian models: [R2 bayes][r2_bayes] #' #' @note If there is no `r2()`-method defined for the given model class, #' `r2()` tries to return a "generic" r-quared value, calculated as following: #' `1-sum((y-y_hat)^2)/sum((y-y_bar)^2))` #' #' @seealso [`r2_bayes()`], [`r2_coxsnell()`], [`r2_kullback()`], #' [`r2_loo()`], [`r2_mcfadden()`], [`r2_nagelkerke()`], #' [`r2_nakagawa()`], [`r2_tjur()`], [`r2_xu()`] and #' [`r2_zeroinflated()`]. #' #' @examplesIf require("lme4") #' # Pseudo r-quared for GLM #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' r2(model) #' #' # r-squared including confidence intervals #' model <- lm(mpg ~ wt + hp, data = mtcars) #' r2(model, ci = 0.95) #' #' model <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) #' r2(model) #' @export r2 <- function(model, ...) { UseMethod("r2") } # Default models ----------------------------------------------- #' @rdname r2 #' @export r2.default <- function(model, ci = NULL, verbose = TRUE, ...) { # CI has own function if (!is.null(ci) && !is.na(ci)) { return(.r2_ci(model, ci = ci, verbose = verbose, ...)) } minfo <- list(...)$model_info if (is.null(minfo)) { minfo <- suppressWarnings(insight::model_info(model, verbose = FALSE)) } ## TODO: implement bootstrapped CIs later? # check input # ci <- .check_r2_ci_args(ci, ci_method, "bootstrap", verbose) out <- tryCatch( { if (minfo$is_binomial) { resp <- .recode_to_zero(insight::get_response(model, verbose = FALSE)) } else { resp <- datawizard::to_numeric( insight::get_response(model, verbose = FALSE), dummy_factors = FALSE, preserve_levels = TRUE ) } mean_resp <- mean(resp, na.rm = TRUE) pred <- insight::get_predicted(model, ci = NULL, verbose = FALSE) list(R2 = 1 - sum((resp - pred)^2) / sum((resp - mean_resp)^2)) }, error = function(e) { NULL } ) if (is.null(out) && isTRUE(verbose)) { insight::print_color(sprintf("`r2()` does not support models of class `%s`.\n", class(model)[1]), "red") } if (!is.null(out)) { names(out$R2) <- "R2" class(out) <- c("r2_generic", class(out)) } out } #' @export r2.lm <- function(model, ci = NULL, ...) { if (!is.null(ci) && !is.na(ci)) { return(.r2_ci(model, ci = ci, ...)) } .r2_lm(summary(model)) } #' @export r2.phylolm <- r2.lm # helper ------------- .r2_lm <- function(model_summary, ci = NULL) { out <- list( R2 = model_summary$r.squared, R2_adjusted = model_summary$adj.r.squared ) names(out$R2) <- "R2" names(out$R2_adjusted) <- "adjusted R2" f.stat <- model_summary$fstatistic[1] DoF <- model_summary$fstatistic[2] DoF_residual <- model_summary$fstatistic[3] if (!is.null(f.stat)) { attr(out, "p") <- stats::pf(f.stat, DoF, DoF_residual, lower.tail = FALSE) attr(out, "F") <- f.stat attr(out, "df") <- DoF attr(out, "df_residual") <- DoF_residual } attr(out, "model_type") <- "Linear" structure(class = "r2_generic", out) } #' @export r2.summary.lm <- function(model, ci = NULL, ...) { if (!is.null(ci) && !is.na(ci)) { return(.r2_ci(model, ci = ci, ...)) } .r2_lm(model) } #' @export r2.systemfit <- function(model, ...) { out <- lapply(summary(model)$eq, function(model_summary) { s <- list( R2 = model_summary$r.squared, R2_adjusted = model_summary$adj.r.squared ) names(s$R2) <- "R2" names(s$R2_adjusted) <- "adjusted R2" s }) names(out) <- names(insight::find_formula(model)) out } #' @export r2.lm_robust <- function(model, ...) { out <- list( R2 = tryCatch( model[["r.squared"]], error = function(e) NULL ), R2_adjusted = tryCatch( model[["adj.r.squared"]], error = function(e) NULL ) ) names(out$R2) <- "R2" names(out$R2_adjusted) <- "adjusted R2" attr(out, "model_type") <- "Linear" structure(class = "r2_generic", out) } #' @export r2.ols <- function(model, ...) { out <- list(R2 = model$stats["R2"]) names(out$R2) <- "R2" attr(out, "model_type") <- "Linear" structure(class = "r2_generic", out) } #' @export r2.lrm <- r2.ols #' @export r2.cph <- r2.ols #' @export r2.mhurdle <- function(model, ...) { resp <- insight::get_response(model, verbose = FALSE) mean_resp <- mean(resp, na.rm = TRUE) ftd <- model$fitted.values[, "pos", drop = TRUE] * (1 - model$fitted.values[, "zero", drop = TRUE]) n <- length(resp) K <- insight::n_parameters(model) Ko <- length(model$naive$coefficients) out <- list( R2 = 1 - sum((resp - ftd)^2) / sum((resp - mean_resp)^2), R2_adjusted = 1 - (n - Ko) / (n - K) * sum((resp - ftd)^2) / sum((resp - mean_resp)^2) ) names(out$R2) <- "R2" names(out$R2_adjusted) <- "adjusted R2" attr(out, "model_type") <- "Limited Dependent Variable" structure(class = "r2_generic", out) } #' @export r2.aov <- function(model, ci = NULL, ...) { if (!is.null(ci) && !is.na(ci)) { return(.r2_ci(model, ci = ci, ...)) } model_summary <- stats::summary.lm(model) out <- list( R2 = model_summary$r.squared, R2_adjusted = model_summary$adj.r.squared ) names(out$R2) <- "R2" names(out$R2_adjusted) <- "adjusted R2" attr(out, "model_type") <- "Anova" structure(class = "r2_generic", out) } #' @export r2.mlm <- function(model, ...) { model_summary <- summary(model) out <- lapply(names(model_summary), function(i) { tmp <- list( R2 = model_summary[[i]]$r.squared, R2_adjusted = model_summary[[i]]$adj.r.squared, Response = sub("Response ", "", i, fixed = TRUE) ) names(tmp$R2) <- "R2" names(tmp$R2_adjusted) <- "adjusted R2" names(tmp$Response) <- "Response" tmp }) names(out) <- names(model_summary) attr(out, "model_type") <- "Multivariate Linear" structure(class = "r2_mlm", out) } #' @export r2.glm <- function(model, ci = NULL, verbose = TRUE, ...) { if (!is.null(ci) && !is.na(ci)) { return(.r2_ci(model, ci = ci, verbose = verbose, ...)) } info <- list(...)$model_info if (is.null(info)) { info <- suppressWarnings(insight::model_info(model, verbose = FALSE)) } if (info$family %in% c("gaussian", "inverse.gaussian")) { out <- r2.default(model, ...) } else if (info$is_logit && info$is_bernoulli) { out <- list(R2_Tjur = r2_tjur(model, model_info = info, ...)) attr(out, "model_type") <- "Logistic" names(out$R2_Tjur) <- "Tjur's R2" class(out) <- c("r2_pseudo", class(out)) } else if (info$is_binomial && !info$is_bernoulli && class(model)[1] == "glm") { if (verbose) { insight::format_warning("Can't calculate accurate R2 for binomial models that are not Bernoulli models.") } out <- NULL } else { out <- list(R2_Nagelkerke = r2_nagelkerke(model, ...)) names(out$R2_Nagelkerke) <- "Nagelkerke's R2" attr(out, "model_type") <- "Generalized Linear" class(out) <- c("r2_pseudo", class(out)) } out } #' @export r2.glmx <- r2.glm #' @export r2.nestedLogit <- function(model, ci = NULL, verbose = TRUE, ...) { out <- list(R2_Tjur = r2_tjur(model, ...)) attr(out, "model_type") <- "Logistic" class(out) <- c("r2_pseudo", class(out)) out } # mfx models --------------------- #' @export r2.logitmfx <- function(model, ...) { r2(model$fit, ...) } #' @export r2.logitor <- r2.logitmfx #' @export r2.poissonirr <- r2.logitmfx #' @export r2.poissonmfx <- r2.logitmfx #' @export r2.probitmfx <- r2.logitmfx #' @export r2.negbinirr <- r2.logitmfx #' @export r2.negbinmfx <- r2.logitmfx #' @export r2.betamfx <- r2.logitmfx #' @export r2.betaor <- r2.logitmfx #' @export r2.model_fit <- r2.logitmfx # Cox & Snell R2 --------------------- #' @export r2.BBreg <- function(model, ...) { out <- list(R2_CoxSnell = r2_coxsnell(model)) names(out$R2_CoxSnell) <- "Cox & Snell's R2" class(out) <- c("r2_pseudo", class(out)) out } #' @export r2.crch <- r2.BBreg #' @export r2.bayesx <- r2.BBreg # Nagelkerke R2 ---------------------- #' @export r2.censReg <- function(model, ...) { out <- list(R2_Nagelkerke = r2_nagelkerke(model)) names(out$R2_Nagelkerke) <- "Nagelkerke's R2" class(out) <- c("r2_pseudo", class(out)) out } #' @export r2.cpglm <- r2.censReg #' @export r2.clm <- r2.censReg #' @export r2.clm2 <- r2.censReg #' @export r2.coxph <- r2.censReg #' @export r2.polr <- r2.censReg #' @export r2.survreg <- r2.censReg #' @export r2.truncreg <- r2.censReg #' @export r2.bracl <- r2.censReg #' @export r2.brmultinom <- r2.censReg #' @export r2.bife <- r2.censReg #' @export r2.mclogit <- function(model, ...) { r2_nagelkerke(model) } #' @export r2.mblogit <- function(model, ...) { r2_nagelkerke(model) } # McFadden ---------------------- #' @export r2.multinom <- function(model, ...) { out <- r2_mcfadden(model) class(out) <- c("r2_pseudo", class(out)) out } #' @export r2.mlogit <- r2.multinom # Zeroinflated R2 ------------------ #' @export r2.hurdle <- function(model, ...) { r2_zeroinflated(model) } #' @export r2.zerotrunc <- r2.hurdle #' @export r2.zeroinfl <- r2.hurdle # Nakagawa R2 ---------------------- #' @rdname r2 #' @export r2.merMod <- function(model, ci = NULL, tolerance = 1e-5, ...) { r2_nakagawa(model, ci = ci, tolerance = tolerance, ...) } #' @export r2.glmmTMB <- r2.merMod #' @export r2.cpglmm <- r2.merMod #' @export r2.glmmadmb <- r2.merMod #' @export r2.lme <- r2.merMod #' @export r2.clmm <- r2.merMod #' @export r2.mixed <- r2.merMod #' @export r2.MixMod <- r2.merMod #' @export r2.rlmerMod <- r2.merMod #' @export r2.wbm <- function(model, tolerance = 1e-5, ...) { out <- r2_nakagawa(model, tolerance = tolerance) if (is.null(out) || is.na(out)) { s <- summary(model) r2_marginal <- s$mod_info_list$pR2_fe r2_conditional <- s$mod_info_list$pR2_total names(r2_conditional) <- "Conditional R2" names(r2_marginal) <- "Marginal R2" out <- list( R2_conditional = r2_conditional, R2_marginal = r2_marginal ) attr(out, "model_type") <- "Fixed Effects" class(out) <- "r2_nakagawa" } out } #' @export r2.sem <- function(model, ...) { r2_conditional <- model$r2c r2_marginal <- model$r2m names(r2_conditional) <- "Conditional R2" names(r2_marginal) <- "Marginal R2" structure( class = "r2_nakagawa", list( R2_conditional = r2_conditional, R2_marginal = r2_marginal ) ) } # Bayes R2 ------------------------ #' @export r2.brmsfit <- function(model, ...) { r2_bayes(model, ...) } #' @export r2.stanreg <- r2.brmsfit #' @export r2.BFBayesFactor <- r2.brmsfit # Other methods ------------------------------ #' @export r2.gam <- function(model, ...) { # gamlss inherits from gam, and summary.gamlss prints results automatically printout <- utils::capture.output(s <- summary(model)) # nolint if (is.null(s$r.sq)) { NextMethod() } else { list(R2 = c(`Adjusted R2` = s$r.sq)) } } #' @export r2.scam <- r2.gam #' @export r2.betareg <- function(model, ...) { out <- list(R2 = c(`Pseudo R2` = model$pseudo.r.squared)) attr(out, "model_type") <- "Beta" class(out) <- c("r2_generic", class(out)) out } #' @export r2.rma <- function(model, ...) { s <- summary(model) if (is.null(s$R2)) { return(NULL) } out <- list(R2 = s$R2 / 100) attr(out, "model_type") <- "Meta-Analysis" structure(class = "r2_generic", out) } #' @export r2.feis <- function(model, ...) { out <- list( R2 = c(R2 = model$r2), R2_adjusted = c(`adjusted R2` = model$adj.r2) ) attr(out, "model_type") <- "Fixed Effects Individual Slope" structure(class = "r2_generic", out) } #' @export r2.fixest <- function(model, ...) { insight::check_if_installed("fixest") r2 <- fixest::r2(model) out_normal <- insight::compact_list(list( R2 = r2["r2"], R2_adjusted = r2["ar2"], R2_within = r2["wr2"], R2_within_adjusted = r2["war2"] ), remove_na = TRUE) out_pseudo <- insight::compact_list(list( R2 = r2["pr2"], R2_adjusted = r2["apr2"], R2_within = r2["wpr2"], R2_within_adjusted = r2["wapr2"] ), remove_na = TRUE) if (length(out_normal)) { out <- out_normal } else { out <- out_pseudo } attr(out, "model_type") <- "Fixed Effects" structure(class = "r2_generic", out) } #' @export r2.fixest_multi <- function(model, ...) { lapply(model, r2.fixest) } #' @export r2.felm <- function(model, ...) { model_summary <- summary(model) out <- list( R2 = c(R2 = model_summary$r2), R2_adjusted = c(`adjusted R2` = model_summary$r2adj) ) attr(out, "model_type") <- "Fixed Effects" structure(class = "r2_generic", out) } #' @export r2.iv_robust <- function(model, ...) { out <- list( R2 = c(R2 = model$r.squared), R2_adjusted = c(`adjusted R2` = model$adj.r.squared) ) attr(out, "model_type") <- "Two-Stage Least Squares Instrumental-Variable" structure(class = "r2_generic", out) } #' @export r2.ivreg <- function(model, ...) { model_summary <- summary(model) out <- list( R2 = c(R2 = model_summary$r.squared), R2_adjusted = c(`adjusted R2` = model_summary$adj.r.squared) ) attr(out, "model_type") <- "Instrumental-Variable" structure(class = "r2_generic", out) } #' @export r2.bigglm <- function(model, ...) { out <- list(R2_CoxSnell = summary(model)$rsq) names(out$R2_CoxSnell) <- "Cox & Snell's R2" class(out) <- c("r2_pseudo", class(out)) out } #' @export r2.biglm <- function(model, ...) { df.int <- as.numeric(insight::has_intercept(model)) n <- suppressWarnings(insight::n_obs(model)) rsq <- summary(model)$rsq adj.rsq <- 1 - (1 - rsq) * ((n - df.int) / model$df.resid) out <- list( R2 = rsq, R2_adjusted = adj.rsq ) names(out$R2) <- "R2" names(out$R2_adjusted) <- "adjusted R2" attr(out, "model_type") <- "Linear" structure(class = "r2_generic", out) } #' @export r2.lmrob <- function(model, ...) { model_summary <- summary(model) out <- list( R2 = c(R2 = model_summary$r.squared), R2_adjusted = c(`adjusted R2` = model_summary$adj.r.squared) ) attr(out, "model_type") <- "Robust Linear" structure(class = "r2_generic", out) } #' @export r2.complmrob <- r2.lmrob #' @export r2.mmclogit <- function(model, ...) { list(R2 = NA) } #' @export r2.Arima <- function(model, ...) { if (requireNamespace("forecast", quietly = TRUE)) { list(R2 = stats::cor(stats::fitted(model), insight::get_data(model, verbose = FALSE))^2) } else { list(R2 = NA) } } #' @export r2.plm <- function(model, ...) { model_summary <- summary(model) out <- list( R2 = c(R2 = model_summary$r.squared[1]), R2_adjusted = c(`adjusted R2` = model_summary$r.squared[2]) ) attr(out, "model_type") <- "Panel Data" structure(class = "r2_generic", out) } #' @export r2.selection <- function(model, ...) { model_summary <- summary(model) if (is.null(model_summary$rSquared)) { return(NULL) } out <- list( R2 = c(R2 = model_summary$rSquared$R2), R2_adjusted = c(`adjusted R2` = model_summary$rSquared$R2adj) ) attr(out, "model_type") <- "Tobit 2" structure(class = "r2_generic", out) } #' @export r2.svyglm <- function(model, ...) { rsq <- (model$null.deviance - model$deviance) / model$null.deviance rsq.adjust <- 1 - ((1 - rsq) * (model$df.null / model$df.residual)) out <- list( R2 = c(R2 = rsq), R2_adjusted = c(`adjusted R2` = rsq.adjust) ) attr(out, "model_type") <- "Survey" structure(class = "r2_generic", out) } #' @export r2.vglm <- function(model, ...) { out <- list(R2_McKelvey = r2_mckelvey(model)) names(out$R2_McKelvey) <- "McKelvey's R2" class(out) <- c("r2_pseudo", class(out)) out } #' @export r2.vgam <- r2.vglm #' @export r2.DirichletRegModel <- function(model, ...) { out <- list(R2_Nagelkerke = r2_nagelkerke(model)) names(out$R2_Nagelkerke) <- "Nagelkerke's R2" class(out) <- c("r2_pseudo", class(out)) out } # helper ------------------- .check_r2_ci_args <- function(ci = NULL, ci_method = "bootstrap", valid_ci_method = NULL, verbose = TRUE) { if (!is.null(ci) && !is.na(ci) && !is.null(valid_ci_method) && !ci_method %in% valid_ci_method) { if (verbose) { insight::format_warning( paste0("Method `", ci_method, "` to compute confidence intervals for R2 not supported.") ) } return(NULL) } ci } performance/R/print-methods.R0000644000176200001440000001115714327475467015724 0ustar liggesusers#' @export print.r2_generic <- function(x, digits = 3, ...) { model_type <- attr(x, "model_type") if (!is.null(model_type)) { insight::print_color(sprintf("# R2 for %s Regression\n", model_type), "blue") } if (all(c("R2_adjusted", "R2_within_adjusted") %in% names(x))) { # print regular R2 out <- c( sprintf(" R2: %.*f", digits, x$R2[1]), sprintf(" adj. R2: %.*f", digits, x$R2_adjusted[1]), sprintf(" within R2: %.*f", digits, x$R2_within[1]), sprintf(" adj. within R2: %.*f", digits, x$R2_within_adjusted[1]) ) } else if ("R2_adjusted" %in% names(x)) { out <- c( sprintf(" R2: %.*f", digits, x$R2[1]), sprintf(" adj. R2: %.*f", digits, x$R2_adjusted[1]) ) } else { out <- sprintf(" %s: %.*f", names(x$R2[1]), digits, x$R2[1]) } # add CI? if (length(x$R2) == 3) { out[1] <- .add_r2_ci_to_print(out[1], x$R2[2], x$R2[3], digits = digits) } if (!is.null(x$R2_adjusted) && length(x$R2_adjusted) == 3 && length(out) > 1) { out[2] <- .add_r2_ci_to_print(out[2], x$R2_adjusted[2], x$R2_adjusted[3], digits = digits) } if (!is.null(x$R2_within) && length(x$R2_within) == 3 && length(out) > 2) { out[3] <- .add_r2_ci_to_print(out[3], x$R2_within[2], x$R2_within[3], digits = digits) } if (!is.null(x$R2_within_adjusted) && length(x$R2_within_adjusted) == 3 && length(out) > 3) { out[4] <- .add_r2_ci_to_print(out[4], x$R2_within_adjusted[2], x$R2_within_adjusted[3], digits = digits) } # separate lines for multiple R2 out <- paste0(out, collapse = "\n") cat(out) cat("\n") invisible(x) } .add_r2_ci_to_print <- function(out, ci_low, ci_high, digits) { paste0( out, sprintf(" %s", insight::format_ci(ci_low, ci_high, digits = digits, ci = NULL)) ) } #' @export print.r2_pseudo <- function(x, digits = 3, ...) { model_type <- attr(x, "model_type") if (!is.null(model_type)) { insight::print_color(sprintf("# R2 for %s Regression\n", model_type), "blue") } cat(sprintf(" %s: %.*f\n", names(x[[1]]), digits, x[[1]])) invisible(x) } #' @export print.r2_mlm <- function(x, digits = 3, ...) { model_type <- attr(x, "model_type") if (!is.null(model_type)) { insight::print_color(sprintf("# R2 for %s Regression\n\n", model_type), "blue") } else { insight::print_color("# R2\n\n", "blue") } for (i in names(x)) { insight::print_color(sprintf("## %s\n", i), "cyan") out <- paste0( c( sprintf(" R2: %.*f", digits, x[[i]]$R2), sprintf(" adj. R2: %.*f", digits, x[[i]]$R2_adjusted) ), collapse = "\n" ) cat(out) cat("\n\n") } invisible(x) } #' @export print.r2_bayes <- function(x, digits = 3, ...) { insight::print_color("# Bayesian R2 with Compatibility Interval\n\n", "blue") r2_ci <- insight::format_ci( attributes(x)$CI$R2_Bayes$CI_low, attributes(x)$CI$R2_Bayes$CI_high, ci = attributes(x)$CI$R2_Bayes$CI, digits = digits ) out <- sprintf(" Conditional R2: %.*f (%s)", digits, x$R2_Bayes, r2_ci) if ("R2_Bayes_marginal" %in% names(x)) { r2_marginal_ci <- insight::format_ci( attributes(x)$CI$R2_Bayes_marginal$CI_low, attributes(x)$CI$R2_Bayes_marginal$CI_high, ci = attributes(x)$CI$R2_Bayes_marginal$CI, digits = digits ) out <- paste0(c(out, sprintf(" Marginal R2: %.*f (%s)", digits, x$R2_Bayes_marginal, r2_marginal_ci)), collapse = "\n") } cat(out) cat("\n") invisible(x) } #' @export print.r2_loo <- function(x, digits = 3, ...) { insight::print_color("# LOO-adjusted R2 with Compatibility Interval\n\n", "blue") r2_ci <- insight::format_ci( attributes(x)$CI$R2_loo$CI_low, attributes(x)$CI$R2_loo$CI_high, ci = attributes(x)$CI$R2_loo$CI, digits = digits ) out <- sprintf(" Conditional R2: %.*f (%s)", digits, x$R2_loo, r2_ci) if ("R2_loo_marginal" %in% names(x)) { r2_marginal_ci <- insight::format_ci( attributes(x)$CI$R2_loo_marginal$CI_low, attributes(x)$CI$R2_loo_marginal$CI_high, ci = attributes(x)$CI$R2_loo_marginal$CI, digits = digits ) out <- paste0(c(out, sprintf(" Marginal R2: %.*f (%s)", digits, x$R2_loo_marginal, r2_marginal_ci)), collapse = "\n") } cat(out) cat("\n") invisible(x) } #' @export print.r2_nakagawa_by_group <- function(x, digits = 3, ...) { insight::print_color("# Explained Variance by Level\n\n", "blue") cat(insight::export_table(x, digits = digits)) cat("\n") invisible(x) } performance/R/check_model_diagnostics.R0000644000176200001440000002541714516515020017733 0ustar liggesusers# prepare data for VIF plot ---------------------------------- .diag_vif <- function(model, verbose = TRUE) { out <- check_collinearity(model, verbose = verbose) dat <- insight::compact_list(out) if (is.null(dat)) { return(NULL) } dat$group <- "low" dat$group[dat$VIF >= 5 & dat$VIF < 10] <- "moderate" dat$group[dat$VIF >= 10] <- "high" dat <- datawizard::data_rename( dat, c("Term", "VIF", "SE_factor", "Component"), c("x", "y", "se", "facet"), verbose = FALSE ) dat <- datawizard::data_select( dat, c("x", "y", "facet", "group"), verbose = FALSE ) if (insight::n_unique(dat$facet) <= 1) { dat$facet <- NULL } attr(dat, "CI") <- attributes(out)$CI dat } # prepare data for QQ plot ---------------------------------- .diag_qq <- function(model, verbose = TRUE) { if (inherits(model, c("lme", "lmerMod", "merMod", "glmmTMB", "gam"))) { res_ <- stats::residuals(model) } else if (inherits(model, "geeglm")) { res_ <- stats::residuals(model, type = "pearson") } else if (inherits(model, "glm")) { res_ <- .safe(abs(stats::rstandard(model, type = "deviance"))) } else { res_ <- .safe(stats::rstudent(model)) if (is.null(res_)) { res_ <- .safe(stats::residuals(model)) } } if (is.null(res_)) { if (verbose) { insight::format_alert( sprintf( "QQ plot could not be created. Cannot extract residuals from objects of class `%s`.", class(model)[1] ) ) } return(NULL) } if (inherits(model, "glm")) { fitted_ <- stats::qnorm((stats::ppoints(length(res_)) + 1) / 2) } else { fitted_ <- stats::fitted(model) } # validation check, sometimes either residuals or fitted can contain NA, see #488 if (anyNA(res_) || anyNA(fitted_)) { # drop NA and make sure both fitted and residuals match non_na <- !is.na(fitted_) & !is.na(res_) fitted_ <- fitted_[non_na] res_ <- res_[non_na] } res_ <- sort(res_, na.last = NA) fitted_ <- sort(fitted_, na.last = NA) data.frame(x = fitted_, y = res_) } # prepare data for random effects QQ plot ---------------------------------- .diag_reqq <- function(model, level = 0.95, model_info = NULL, verbose = TRUE) { # check if we have mixed model if (is.null(model_info) || !model_info$is_mixed) { return(NULL) } insight::check_if_installed("lme4") tryCatch( { if (inherits(model, "glmmTMB")) { var_attr <- "condVar" re <- .collapse_cond(lme4::ranef(model, condVar = TRUE)) } else { var_attr <- "postVar" re <- lme4::ranef(model, condVar = TRUE) } }, error = function(e) { return(NULL) } ) se <- tryCatch( { suppressWarnings(lapply(re, function(.x) { pv <- attr(.x, var_attr, exact = TRUE) cols <- seq_len(dim(pv)[1]) unlist(lapply(cols, function(.y) sqrt(pv[.y, .y, ]))) })) }, error = function(e) { NULL } ) if (is.null(se)) { if (verbose) { insight::format_alert("Could not compute standard errors from random effects for diagnostic plot.") } return(NULL) } Map(function(.re, .se) { ord <- unlist(lapply(.re, order)) + rep((0:(ncol(.re) - 1)) * nrow(.re), each = nrow(.re)) df.y <- unlist(.re)[ord] df.ci <- stats::qnorm((1 + level) / 2) * .se[ord] data.frame( x = rep(stats::qnorm(stats::ppoints(nrow(.re))), ncol(.re)), y = df.y, conf.low = df.y - df.ci, conf.high = df.y + df.ci, facet = gl(ncol(.re), nrow(.re), labels = names(.re)), stringsAsFactors = FALSE, row.names = NULL ) }, re, se) } # prepare data for normality of residuals plot ---------------------------------- .diag_norm <- function(model, verbose = TRUE) { r <- try(as.numeric(stats::residuals(model)), silent = TRUE) if (inherits(r, "try-error")) { insight::format_alert(sprintf( "Non-normality of residuals could not be computed. Cannot extract residuals from objects of class '%s'.", class(model)[1] )) return(NULL) } dat <- as.data.frame(bayestestR::estimate_density(r)) dat$curve <- stats::dnorm(seq(min(dat$x), max(dat$x), length.out = nrow(dat)), mean(r), stats::sd(r)) dat } # prepare data for influential obs plot ---------------------------------- .diag_influential_obs <- function(model, threshold = NULL) { s <- summary(model) if (inherits(model, "lm", which = TRUE) == 1) { cook_levels <- round(stats::qf(0.5, s$fstatistic[2], s$fstatistic[3]), 2) } else if (is.null(threshold)) { cook_levels <- c(0.5, 1) } else { cook_levels <- threshold } n_params <- tryCatch(model$rank, error = function(e) insight::n_parameters(model)) infl <- stats::influence(model, do.coef = FALSE) resid <- as.numeric(insight::get_residuals(model)) std_resid <- tryCatch(stats::rstandard(model, infl), error = function(e) resid) plot_data <- data.frame( Hat = infl$hat, Cooks_Distance = stats::cooks.distance(model, infl), Fitted = insight::get_predicted(model, ci = NULL), Residuals = resid, Std_Residuals = std_resid, stringsAsFactors = FALSE ) plot_data$Index <- seq_len(nrow(plot_data)) plot_data$Influential <- "OK" plot_data$Influential[abs(plot_data$Cooks_Distance) >= max(cook_levels)] <- "Influential" attr(plot_data, "cook_levels") <- cook_levels attr(plot_data, "n_params") <- n_params plot_data } # prepare data for non-constant variance plot ---------------------------------- .diag_ncv <- function(model, verbose = TRUE) { ncv <- tryCatch( { data.frame( x = as.numeric(stats::fitted(model)), y = as.numeric(stats::residuals(model)) ) }, error = function(e) { NULL } ) if (is.null(ncv)) { if (verbose) { insight::format_alert(sprintf( "Non-constant error variance could not be computed. Cannot extract residuals from objects of class '%s'.", class(model)[1] )) } return(NULL) } ncv } # prepare data for homogeneity of variance plot ---------------------------------- .diag_homogeneity <- function(model, verbose = TRUE) { faminfo <- insight::model_info(model) r <- tryCatch( { if (inherits(model, "merMod")) { stats::residuals(model, scaled = TRUE) } else if (inherits(model, "gam")) { stats::residuals(model, type = "scaled.pearson") } else if (inherits(model, c("glmmTMB", "MixMod"))) { sigma <- if (faminfo$is_mixed) { sqrt(insight::get_variance_residual(model)) } else { .sigma_glmmTMB_nonmixed(model, faminfo) } stats::residuals(model) / sigma } else if (inherits(model, "glm")) { ## TODO: check if we can / should use deviance residuals (as for QQ plots) here as well? stats::rstandard(model, type = "pearson") } else { stats::rstandard(model) } }, error = function(e) { NULL } ) if (is.null(r)) { if (verbose) { insight::format_alert(sprintf( "Homogeneity of variance could not be computed. Cannot extract residual variance from objects of class '%s'.", class(model)[1] )) } return(NULL) } data.frame( x = stats::fitted(model), y = sqrt(abs(r)) ) } # prepare data for homogeneity of variance plot ---------------------------------- .diag_overdispersion <- function(model) { faminfo <- insight::model_info(model) # data for poisson models if (faminfo$is_poisson && !faminfo$is_zero_inflated) { d <- data.frame(Predicted = stats::predict(model, type = "response")) d$Residuals <- insight::get_response(model) - as.vector(d$Predicted) d$Res2 <- d$Residuals^2 d$V <- d$Predicted d$StdRes <- insight::get_residuals(model, type = "pearson") } # data for negative binomial models if (faminfo$is_negbin && !faminfo$is_zero_inflated) { d <- data.frame(Predicted = stats::predict(model, type = "response")) d$Residuals <- insight::get_response(model) - as.vector(d$Predicted) d$Res2 <- d$Residuals^2 d$V <- d$Predicted * (1 + d$Predicted / insight::get_sigma(model)) d$StdRes <- insight::get_residuals(model, type = "pearson") } # data for zero-inflated poisson models if (faminfo$is_poisson && faminfo$is_zero_inflated) { d <- data.frame(Predicted = stats::predict(model, type = "response")) d$Residuals <- insight::get_response(model) - as.vector(d$Predicted) d$Res2 <- d$Residuals^2 if (inherits(model, "glmmTMB")) { ptype <- "zprob" } else { ptype <- "zero" } d$Prob <- stats::predict(model, type = ptype) d$V <- d$Predicted * (1 - d$Prob) * (1 + d$Predicted * d$Prob) d$StdRes <- insight::get_residuals(model, type = "pearson") } # data for zero-inflated negative binomial models if (faminfo$is_negbin && faminfo$is_zero_inflated && !faminfo$is_dispersion) { d <- data.frame(Predicted = stats::predict(model, type = "response")) d$Residuals <- insight::get_response(model) - as.vector(d$Predicted) d$Res2 <- d$Residuals^2 if (inherits(model, "glmmTMB")) { ptype <- "zprob" } else { ptype <- "zero" } d$Prob <- stats::predict(model, type = ptype) d$Disp <- insight::get_sigma(model) d$V <- d$Predicted * (1 + d$Predicted / d$Disp) * (1 - d$Prob) * (1 + d$Predicted * (1 + d$Predicted / d$Disp) * d$Prob) # nolint d$StdRes <- insight::get_residuals(model, type = "pearson") } # data for zero-inflated negative binomial models with dispersion if (faminfo$is_negbin && faminfo$is_zero_inflated && faminfo$is_dispersion) { d <- data.frame(Predicted = stats::predict(model, type = "response")) d$Residuals <- insight::get_response(model) - as.vector(d$Predicted) d$Res2 <- d$Residuals^2 if (inherits(model, "glmmTMB")) { ptype <- "zprob" } else { ptype <- "zero" } d$Prob <- stats::predict(model, type = ptype) d$Disp <- stats::predict(model, type = "disp") d$V <- d$Predicted * (1 + d$Predicted / d$Disp) * (1 - d$Prob) * (1 + d$Predicted * (1 + d$Predicted / d$Disp) * d$Prob) # nolint d$StdRes <- insight::get_residuals(model, type = "pearson") } d } # helpers ---------------------------------- .sigma_glmmTMB_nonmixed <- function(model, faminfo) { if (!is.na(match(faminfo$family, c("binomial", "poisson", "truncated_poisson")))) { return(1) } betad <- model$fit$par["betad"] switch(faminfo$family, gaussian = exp(0.5 * betad), Gamma = exp(-0.5 * betad), exp(betad) ) } performance/R/r2_ci.R0000644000176200001440000000375614330025012014076 0ustar liggesusers.r2_ci <- function(model, ci = 0.95, verbose = TRUE, ...) { alpha <- 1 - ci n <- insight::n_obs(model) df_int <- if (insight::has_intercept(model)) { 1 } else { 0 } model_rank <- tryCatch( model$rank - df_int, error = function(e) insight::n_parameters(model) - df_int ) model_r2 <- r2(model, ci = NULL, verbose = verbose, ...) out <- lapply(model_r2, function(rsq) { ci_low <- stats::uniroot( .pRsq, c(0.00001, 0.99999), R2_obs = as.vector(rsq), p = model_rank, nobs = n, alpha = 1 - alpha / 2 )$root ci_high <- stats::uniroot( .pRsq, c(0.00001, 0.99999), R2_obs = as.vector(rsq), p = model_rank, nobs = n, alpha = alpha / 2 )$root c(rsq, CI_low = ci_low, CI_high = ci_high) }) names(out) <- names(model_r2) attr(out, "ci") <- ci class(out) <- class(model_r2) out } .dRsq <- function(K1, R2_pop, R2_obs, p, nobs) { NCP <- R2_pop / (1 - R2_pop) F1_obs <- ((nobs - p - 1) / p) * (R2_obs / (1 - R2_obs)) exp(log( suppressWarnings(stats::pf( q = F1_obs, df1 = p, df2 = (nobs - p - 1), ncp = NCP * K1, lower.tail = FALSE )) ) + stats::dchisq(x = K1, df = (nobs - 1), log = TRUE)) } .pRsq <- function(R2_pop, R2_obs, p, nobs, alpha = 1) { a1 <- 1 - alpha # This approach avoids undersampling the area of the chi-squared # distribution that actually has any density integrals <- mapply( function(i, j, ...) { dots <- list(...) stats::integrate(.dRsq, i, j, R2_pop = dots$R2_pop, R2_obs = dots$R2_obs, p = dots$p, nobs = dots$nobs ) }, seq(0, 2, by = 0.25) * nobs, c(seq(0.25, 2, by = 0.25), Inf) * nobs, MoreArgs = list( R2_pop = R2_pop, R2_obs = R2_obs, p = p, nobs = nobs ), SIMPLIFY = TRUE ) sum(unlist(integrals["value", ])) - a1 } performance/R/test_performance.R0000644000176200001440000004463614512471542016461 0ustar liggesusers#' @title Test if models are different #' #' @description #' Testing whether models are "different" in terms of accuracy or explanatory #' power is a delicate and often complex procedure, with many limitations and #' prerequisites. Moreover, many tests exist, each coming with its own #' interpretation, and set of strengths and weaknesses. #' #' The `test_performance()` function runs the most relevant and appropriate #' tests based on the type of input (for instance, whether the models are #' *nested* or not). However, it still requires the user to understand what the #' tests are and what they do in order to prevent their misinterpretation. See #' the *Details* section for more information regarding the different tests #' and their interpretation. #' #' @param ... Multiple model objects. #' @param reference This only applies when models are non-nested, and determines #' which model should be taken as a reference, against which all the other #' models are tested. #' @param text_length Numeric, length (number of chars) of output lines. #' `test_bf()` describes models by their formulas, which can lead to #' overly long lines in the output. `text_length` fixes the length of #' lines to a specified limit. #' @param verbose Toggle warning and messages. #' #' @return A data frame containing the relevant indices. #' #' @seealso [`compare_performance()`] to compare the performance indices of #' many different models. #' #' @details #' ## Nested vs. Non-nested Models #' Model's "nesting" is an important concept of models comparison. Indeed, many #' tests only make sense when the models are *"nested",* i.e., when their #' predictors are nested. This means that all the *fixed effects* predictors of #' a model are contained within the *fixed effects* predictors of a larger model #' (sometimes referred to as the encompassing model). For instance, #' `model1 (y ~ x1 + x2)` is "nested" within `model2 (y ~ x1 + x2 + x3)`. Usually, #' people have a list of nested models, for instance `m1 (y ~ 1)`, `m2 (y ~ x1)`, #' `m3 (y ~ x1 + x2)`, `m4 (y ~ x1 + x2 + x3)`, and it is conventional #' that they are "ordered" from the smallest to largest, but it is up to the #' user to reverse the order from largest to smallest. The test then shows #' whether a more parsimonious model, or whether adding a predictor, results in #' a significant difference in the model's performance. In this case, models are #' usually compared *sequentially*: m2 is tested against m1, m3 against m2, #' m4 against m3, etc. #' #' Two models are considered as *"non-nested"* if their predictors are #' different. For instance, `model1 (y ~ x1 + x2)` and `model2 (y ~ x3 + x4)`. #' In the case of non-nested models, all models are usually compared #' against the same *reference* model (by default, the first of the list). #' #' Nesting is detected via the `insight::is_nested_models()` function. #' Note that, apart from the nesting, in order for the tests to be valid, #' other requirements have often to be the fulfilled. For instance, outcome #' variables (the response) must be the same. You cannot meaningfully test #' whether apples are significantly different from oranges! #' #' ## Estimator of the standard deviation #' The estimator is relevant when comparing regression models using #' `test_likelihoodratio()`. If `estimator = "OLS"`, then it uses the same #' method as `anova(..., test = "LRT")` implemented in base R, i.e., scaling #' by n-k (the unbiased OLS estimator) and using this estimator under the #' alternative hypothesis. If `estimator = "ML"`, which is for instance used #' by `lrtest(...)` in package **lmtest**, the scaling is done by n (the #' biased ML estimator) and the estimator under the null hypothesis. In #' moderately large samples, the differences should be negligible, but it #' is possible that OLS would perform slightly better in small samples with #' Gaussian errors. For `estimator = "REML"`, the LRT is based on the REML-fit #' log-likelihoods of the models. Note that not all types of estimators are #' available for all model classes. #' #' ## REML versus ML estimator #' When `estimator = "ML"`, which is the default for linear mixed models (unless #' they share the same fixed effects), values from information criteria (AIC, #' AICc) are based on the ML-estimator, while the default behaviour of `AIC()` #' may be different (in particular for linear mixed models from **lme4**, which #' sets `REML = TRUE`). This default in `test_likelihoodratio()` intentional, #' because comparing information criteria based on REML fits requires the same #' fixed effects for all models, which is often not the case. Thus, while #' `anova.merMod()` automatically refits all models to REML when performing a #' LRT, `test_likelihoodratio()` checks if a comparison based on REML fits is #' indeed valid, and if so, uses REML as default (else, ML is the default). #' Set the `estimator` argument explicitely to override the default behaviour. #' #' ## Tests Description #' #' - **Bayes factor for Model Comparison** - `test_bf()`: If all #' models were fit from the same data, the returned `BF` shows the Bayes #' Factor (see `bayestestR::bayesfactor_models()`) for each model against #' the reference model (which depends on whether the models are nested or #' not). Check out #' [this vignette](https://easystats.github.io/bayestestR/articles/bayes_factors.html#bayesfactor_models) #' for more details. #' #' - **Wald's F-Test** - `test_wald()`: The Wald test is a rough #' approximation of the Likelihood Ratio Test. However, it is more applicable #' than the LRT: you can often run a Wald test in situations where no other #' test can be run. Importantly, this test only makes statistical sense if the #' models are nested. #' #' Note: this test is also available in base R #' through the [`anova()`][anova] function. It returns an `F-value` column #' as a statistic and its associated p-value. #' #' - **Likelihood Ratio Test (LRT)** - `test_likelihoodratio()`: #' The LRT tests which model is a better (more likely) explanation of the #' data. Likelihood-Ratio-Test (LRT) gives usually somewhat close results (if #' not equivalent) to the Wald test and, similarly, only makes sense for #' nested models. However, maximum likelihood tests make stronger assumptions #' than method of moments tests like the F-test, and in turn are more #' efficient. Agresti (1990) suggests that you should use the LRT instead of #' the Wald test for small sample sizes (under or about 30) or if the #' parameters are large. #' #' Note: for regression models, this is similar to #' `anova(..., test="LRT")` (on models) or `lmtest::lrtest(...)`, depending #' on the `estimator` argument. For **lavaan** models (SEM, CFA), the function #' calls `lavaan::lavTestLRT()`. #' #' For models with transformed response variables (like `log(x)` or `sqrt(x)`), #' `logLik()` returns a wrong log-likelihood. However, `test_likelihoodratio()` #' calls `insight::get_loglikelihood()` with `check_response=TRUE`, which #' returns a corrected log-likelihood value for models with transformed #' response variables. Furthermore, since the LRT only accepts nested #' models (i.e. models that differ in their fixed effects), the computed #' log-likelihood is always based on the ML estimator, not on the REML fits. #' #' - **Vuong's Test** - `test_vuong()`: Vuong's (1989) test can #' be used both for nested and non-nested models, and actually consists of two #' tests. #' #' - The **Test of Distinguishability** (the `Omega2` column and #' its associated p-value) indicates whether or not the models can possibly be #' distinguished on the basis of the observed data. If its p-value is #' significant, it means the models are distinguishable. #' #' - The **Robust Likelihood Test** (the `LR` column and its #' associated p-value) indicates whether each model fits better than the #' reference model. If the models are nested, then the test works as a robust #' LRT. The code for this function is adapted from the **nonnest2** #' package, and all credit go to their authors. #' #' @examples #' # Nested Models #' # ------------- #' m1 <- lm(Sepal.Length ~ Petal.Width, data = iris) #' m2 <- lm(Sepal.Length ~ Petal.Width + Species, data = iris) #' m3 <- lm(Sepal.Length ~ Petal.Width * Species, data = iris) #' #' test_performance(m1, m2, m3) #' #' test_bf(m1, m2, m3) #' test_wald(m1, m2, m3) # Equivalent to anova(m1, m2, m3) #' #' # Equivalent to lmtest::lrtest(m1, m2, m3) #' test_likelihoodratio(m1, m2, m3, estimator = "ML") #' #' # Equivalent to anova(m1, m2, m3, test='LRT') #' test_likelihoodratio(m1, m2, m3, estimator = "OLS") #' #' if (require("CompQuadForm")) { #' test_vuong(m1, m2, m3) # nonnest2::vuongtest(m1, m2, nested=TRUE) #' #' # Non-nested Models #' # ----------------- #' m1 <- lm(Sepal.Length ~ Petal.Width, data = iris) #' m2 <- lm(Sepal.Length ~ Petal.Length, data = iris) #' m3 <- lm(Sepal.Length ~ Species, data = iris) #' #' test_performance(m1, m2, m3) #' test_bf(m1, m2, m3) #' test_vuong(m1, m2, m3) # nonnest2::vuongtest(m1, m2) #' } #' #' # Tweak the output #' # ---------------- #' test_performance(m1, m2, m3, include_formula = TRUE) #' #' #' # SEM / CFA (lavaan objects) #' # -------------------------- #' # Lavaan Models #' if (require("lavaan")) { #' structure <- " visual =~ x1 + x2 + x3 #' textual =~ x4 + x5 + x6 #' speed =~ x7 + x8 + x9 #' #' visual ~~ textual + speed " #' m1 <- lavaan::cfa(structure, data = HolzingerSwineford1939) #' #' structure <- " visual =~ x1 + x2 + x3 #' textual =~ x4 + x5 + x6 #' speed =~ x7 + x8 + x9 #' #' visual ~~ 0 * textual + speed " #' m2 <- lavaan::cfa(structure, data = HolzingerSwineford1939) #' #' structure <- " visual =~ x1 + x2 + x3 #' textual =~ x4 + x5 + x6 #' speed =~ x7 + x8 + x9 #' #' visual ~~ 0 * textual + 0 * speed " #' m3 <- lavaan::cfa(structure, data = HolzingerSwineford1939) #' #' test_likelihoodratio(m1, m2, m3) #' #' # Different Model Types #' # --------------------- #' if (require("lme4") && require("mgcv")) { #' m1 <- lm(Sepal.Length ~ Petal.Length + Species, data = iris) #' m2 <- lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) #' m3 <- gam(Sepal.Length ~ s(Petal.Length, by = Species) + Species, data = iris) #' #' test_performance(m1, m2, m3) #' } #' } #' #' @references #' #' - Vuong, Q. H. (1989). Likelihood ratio tests for model selection and #' non-nested hypotheses. Econometrica, 57, 307-333. #' #' - Merkle, E. C., You, D., & Preacher, K. (2016). Testing non-nested #' structural equation models. Psychological Methods, 21, 151-163. #' #' @export test_performance <- function(..., reference = 1, verbose = TRUE) { UseMethod("test_performance") } # default -------------------------------- #' @export test_performance.default <- function(..., reference = 1, include_formula = FALSE, verbose = TRUE) { # Attribute class to list and get names from the global environment objects <- insight::ellipsis_info(..., only_models = TRUE) # validation checks (will throw error if non-valid objects) objects <- .test_performance_checks(objects, verbose = verbose) # ensure proper object names objects <- .check_objectnames(objects, sapply(match.call(expand.dots = FALSE)$`...`, as.character)) # If a suitable class is found, run the more specific method on it if (inherits(objects, c("ListNestedRegressions", "ListNonNestedRegressions", "ListLavaan"))) { test_performance(objects, reference = reference, include_formula = include_formula) } else { insight::format_error("The models cannot be compared for some reason :/") } } # methods ------------------------------ #' @export plot.test_performance <- function(x, ...) { insight::format_alert( "There is currently no `plot()` method for test-functions.", "Please use `plot(compare_perfomance())` for some visual representations of your model comparisons." ) } #' @export format.test_performance <- function(x, digits = 2, ...) { # Format cols and names out <- insight::format_table(x, digits = digits, exact = FALSE, ...) if (isTRUE(attributes(x)$is_nested)) { footer <- paste0( "Models were detected as nested (in terms of fixed parameters) and are compared in sequential order.\n" ) } else { footer <- paste0( "Each model is compared to ", x$Name[attributes(x)$reference], ".\n" ) } attr(out, "table_footer") <- footer out } #' @export print.test_performance <- function(x, digits = 2, ...) { out <- insight::export_table(format(x, digits = digits, ...), ...) cat(out) } #' @export print_md.test_performance <- function(x, digits = 2, ...) { insight::export_table(format(x, digits = digits, ...), format = "markdown", ...) } #' @export print_html.test_performance <- function(x, digits = 2, ...) { insight::export_table(format(x, digits = digits, ...), format = "html", ...) } #' @export display.test_performance <- function(object, format = "markdown", digits = 2, ...) { if (format == "markdown") { print_md(x = object, digits = digits, ...) } else { print_html(x = object, digits = digits, ...) } } # other classes ----------------------------------- #' @export test_performance.ListNestedRegressions <- function(objects, reference = 1, include_formula = FALSE, ...) { out <- .test_performance_init(objects, include_formula = include_formula, ...) # BF test tryCatch( { rez <- test_bf(objects, reference = "sequential") if (!is.null(rez)) { rez$Model <- NULL out <- cbind(out, rez) } }, error = function(e) { # Do nothing } ) # Vuong, or LRT tryCatch( { if (isTRUE(insight::check_if_installed("CompQuadForm", quietly = TRUE))) { rez <- test_vuong(objects) } else { rez <- test_lrt(objects) } rez$Model <- NULL out <- merge(out, rez, sort = FALSE) }, error = function(e) { # Do nothing } ) attr(out, "is_nested") <- attributes(objects)$is_nested attr(out, "reference") <- if (attributes(objects)$is_nested_increasing) "increasing" else "decreasing" class(out) <- c("test_performance", class(out)) out } #' @export test_performance.ListNonNestedRegressions <- function(objects, reference = 1, include_formula = FALSE, ...) { out <- .test_performance_init(objects, include_formula = include_formula, ...) # BF test tryCatch( { rez <- test_bf(objects, reference = reference) if (!is.null(rez)) { rez$Model <- NULL out <- cbind(out, rez) } }, error = function(e) { # Do nothing } ) # Vuong, or Wald - we have non-nested models, so no LRT here tryCatch( { if (isTRUE(insight::check_if_installed("CompQuadForm", quietly = TRUE))) { rez <- test_vuong(objects, reference = reference) } else { rez <- test_wald(objects) } rez$Model <- NULL out <- merge(out, rez, sort = FALSE) }, error = function(e) { # Do nothing } ) attr(out, "is_nested") <- attributes(objects)$is_nested attr(out, "reference") <- reference class(out) <- c("test_performance", class(out)) out } # TESTS IMPLEMENTED IN OTHER PACKAGES # # Non-nested # lmtest::coxtest(m2, m3) # lmtest::jtest(m2, m3) # lmtest::encomptest(m2, m3) # nonnest2::icci(m2, m3) # Helpers ----------------------------------------------------------------- .test_performance_init <- function(objects, include_formula = FALSE) { names <- insight::model_name(objects, include_formula = include_formula) out <- data.frame( Name = names(objects), Model = names, stringsAsFactors = FALSE ) row.names(out) <- NULL out } .test_performance_checks <- function(objects, multiple = TRUE, same_response = TRUE, verbose = TRUE) { # TODO: we could actually generate a baseline model 'y ~ 1' whenever a single model is passed if (multiple && insight::is_model(objects)) { null_model <- .safe(insight::null_model(objects, verbose = FALSE)) if (!is.null(null_model) && insight::is_model(null_model)) { objects <- insight::ellipsis_info(list(null_model, objects)) names(objects) <- c("Null model", "Full model") if (verbose) { insight::format_alert( "Only one model was provided, however, at least two are required for comparison.", "Fitting a null-model as reference now." ) } } else { insight::format_error("At least two models are required to test them.") } } if (same_response && !inherits(objects, "ListLavaan") && isFALSE(attributes(objects)$same_response)) { insight::format_error( "The models' dependent variables don't have the same data, which is a prerequisite to compare them. Probably the proportion of missing data differs between models." ) } # check formula of all models, but warn only once already_warned <- FALSE for (i in objects) { if (!already_warned) { check_formula <- insight::formula_ok(i) } if (check_formula) { already_warned <- TRUE } } objects } .check_objectnames <- function(objects, dot_names) { # Replace with names from the global environment, if these are not yet properly set object_names <- insight::compact_character(names(objects)) # check if we have any names at all if ((is.null(object_names) || # or if length of names doesn't match number of models length(object_names) != length(objects) || # or if names are "..1", "..2" pattern all(grepl("\\.\\.\\d", object_names))) && # and length of dot-names must match length of objects length(objects) == length(dot_names)) { names(objects) <- dot_names } objects } performance/R/check_clusterstructure.R0000644000176200001440000001124614316511005017676 0ustar liggesusers#' Check suitability of data for clustering #' #' This checks whether the data is appropriate for clustering using the Hopkins' #' H statistic of given data. If the value of Hopkins statistic is close to 0 #' (below 0.5), then we can reject the null hypothesis and conclude that the #' dataset is significantly clusterable. A value for H lower than 0.25 indicates #' a clustering tendency at the `90%` confidence level. The visual assessment of #' cluster tendency (VAT) approach (Bezdek and Hathaway, 2002) consists in #' investigating the heatmap of the ordered dissimilarity matrix. Following #' this, one can potentially detect the clustering tendency by counting the #' number of square shaped blocks along the diagonal. #' #' @param x A data frame. #' @param standardize Standardize the dataframe before clustering (default). #' @param distance Distance method used. Other methods than "euclidean" #' (default) are exploratory in the context of clustering tendency. See #' [stats::dist()] for list of available methods. #' @param ... Arguments passed to or from other methods. #' #' @examples #' \donttest{ #' library(performance) #' check_clusterstructure(iris[, 1:4]) #' plot(check_clusterstructure(iris[, 1:4])) #' } #' @return The H statistic (numeric) #' #' @seealso [`check_kmo()`], [`check_sphericity_bartlett()`] and #' [`check_factorstructure()`]. #' #' @references #' - Lawson, R. G., & Jurs, P. C. (1990). New index for clustering #' tendency and its application to chemical problems. Journal of chemical #' information and computer sciences, 30(1), 36-41. #' #' - Bezdek, J. C., & Hathaway, R. J. (2002, May). VAT: A tool for visual #' assessment of (cluster) tendency. In Proceedings of the 2002 International #' Joint Conference on Neural Networks. IJCNN02 (3), 2225-2230. IEEE. #' @export check_clusterstructure <- function(x, standardize = TRUE, distance = "euclidean", ...) { if (standardize) { x <- as.data.frame(scale(x)) } H <- .clusterstructure_hopkins(x, distance = distance) if (H < 0.5) { text <- paste0( "The dataset is suitable for clustering (Hopkins' H = ", insight::format_value(H), ").\n" ) color <- "green" } else { text <- paste0( "The dataset is not suitable for clustering (Hopkins' H = ", insight::format_value(H), ").\n" ) color <- "red" } out <- list( H = H, dissimilarity_matrix = .clusterstructure_dm(x, distance = distance, method = "ward.D2") ) attr(out, "text") <- text attr(out, "color") <- color attr(out, "title") <- "Clustering tendency" class(out) <- c("see_check_clusterstructure", "check_clusterstructure", "easystats_check", class(out)) out } #' @export plot.check_clusterstructure <- function(x, ...) { # Can be reimplemented with ggplot in see stats::heatmap( x$dissimilarity_matrix, Rowv = NA, Colv = NA, labRow = FALSE, labCol = FALSE, col = grDevices::colorRampPalette(c("#2196F3", "#FAFAFA", "#E91E63"))(100) ) } #' @keywords internal .clusterstructure_dm <- function(x, distance = "euclidean", method = "ward.D2") { d <- stats::dist(x, method = distance) hc <- stats::hclust(d, method = method) as.matrix(d)[hc$order, hc$order] } #' @keywords internal .clusterstructure_hopkins <- function(x, distance = "euclidean") { # This is based on the hopkins() function from the clustertend package if (is.data.frame(x)) { x <- as.matrix(x) } n <- nrow(x) - 1 c <- apply(x, 2, min) # minimum value per column d <- apply(x, 2, max) p <- matrix(0, ncol = ncol(x), nrow = n) # n vectors of space for (i in seq_len(ncol(x))) { p[, i] <- stats::runif(n, min = c[i], max = d[i]) } k <- round(stats::runif(n, 1, nrow(x))) q <- as.matrix(x[k, ]) distp <- rep(0, nrow(x)) # distq=rep(0,nrow(x)-1) distq <- 0 minp <- rep(0, n) minq <- rep(0, n) for (i in 1:n) { distp[1] <- stats::dist(rbind(p[i, ], x[1, ]), method = distance) minqi <- stats::dist(rbind(q[i, ], x[1, ]), method = distance) for (j in 2:nrow(x)) { distp[j] <- stats::dist(rbind(p[i, ], x[j, ]), method = distance) error <- q[i, ] - x[j, ] if (sum(abs(error)) != 0) { # distq[j]<-stats::dist(rbind(q[i,],x[j,])) distq <- stats::dist(rbind(q[i, ], x[j, ]), method = distance) if (distq < minqi) { minqi <- distq } } } minp[i] <- min(distp) # minq[i]<-apply(distq,1,min) minq[i] <- minqi } sum(minq) / (sum(minp) + sum(minq)) } performance/R/model_performance.mixed.R0000644000176200001440000001325014501062052017661 0ustar liggesusers#' Performance of Mixed Models #' #' Compute indices of model performance for mixed models. #' #' @param metrics Can be `"all"`, `"common"` or a character vector of #' metrics to be computed (some of `c("AIC", "AICc", "BIC", "R2", "ICC", #' "RMSE", "SIGMA", "LOGLOSS", "SCORE")`). `"common"` will compute AIC, #' BIC, R2, ICC and RMSE. #' @param ... Arguments passed to or from other methods. #' @inheritParams r2_nakagawa #' @inheritParams model_performance.lm #' @inheritParams performance_aicc #' #' @return A data frame (with one row) and one column per "index" (see #' `metrics`). #' #' @details #' \subsection{Intraclass Correlation Coefficient (ICC)}{ #' This method returns the *adjusted ICC* only, as this is typically of #' interest when judging the variance attributed to the random effects part of #' the model (see also [icc()]). #' } #' \subsection{REML versus ML estimator}{ #' The default behaviour of `model_performance()` when computing AIC or BIC of #' linear mixed model from package **lme4** is the same as for `AIC()` or #' `BIC()` (i.e. `estimator = "REML"`). However, for model comparison using #' `compare_performance()` sets `estimator = "ML"` by default, because #' *comparing* information criteria based on REML fits is usually not valid #' (unless all models have the same fixed effects). Thus, make sure to set #' the correct estimator-value when looking at fit-indices or comparing model #' fits. #' } #' \subsection{Other performance indices}{ #' Furthermore, see 'Details' in [model_performance.lm()] for more details #' on returned indices. #' } #' #' @examplesIf require("lme4") #' model <- lme4::lmer(Petal.Length ~ Sepal.Length + (1 | Species), data = iris) #' model_performance(model) #' @export model_performance.merMod <- function(model, metrics = "all", estimator = "REML", verbose = TRUE, ...) { if (any(tolower(metrics) == "log_loss")) { metrics[tolower(metrics) == "log_loss"] <- "LOGLOSS" } # all available metrics all_metrics <- c("AIC", "AICc", "BIC", "R2", "ICC", "RMSE", "SIGMA", "LOGLOSS", "SCORE") if (all(metrics == "all")) { metrics <- all_metrics } else if (all(metrics == "common")) { metrics <- c("AIC", "BIC", "R2", "ICC", "RMSE") } # check for valid input metrics <- .check_bad_metrics(metrics, all_metrics, verbose) # check model formula if (verbose) { insight::formula_ok(model) } mi <- insight::model_info(model, verbose = FALSE) out <- list() if ("AIC" %in% toupper(metrics)) { out$AIC <- performance_aic(model, estimator = estimator) } if ("AICC" %in% toupper(metrics)) { out$AICc <- .safe(performance_aicc(model, estimator = estimator)) } if ("BIC" %in% toupper(metrics)) { out$BIC <- .get_BIC(model, estimator = estimator) } if ("R2" %in% toupper(metrics)) { rsq <- suppressWarnings(r2(model)) if (!all(is.na(rsq))) out <- c(out, rsq) } if ("ICC" %in% toupper(metrics)) { icc_mm <- suppressWarnings(icc(model)) if (!all(is.na(icc_mm))) out$ICC <- icc_mm$ICC_adjusted } if ("RMSE" %in% toupper(metrics)) { out$RMSE <- performance_rmse(model, verbose = verbose) } if ("SIGMA" %in% toupper(metrics)) { out$Sigma <- .get_sigma(model, verbose = verbose) } if (("LOGLOSS" %in% toupper(metrics)) && mi$is_binomial) { out$Log_loss <- performance_logloss(model, verbose = verbose) } if (("SCORE" %in% toupper(metrics)) && (mi$is_binomial || mi$is_count)) { .scoring_rules <- performance_score(model, verbose = verbose) if (!is.na(.scoring_rules$logarithmic)) out$Score_log <- .scoring_rules$logarithmic if (!is.na(.scoring_rules$spherical)) out$Score_spherical <- .scoring_rules$spherical } # TODO: What with sigma and deviance? out <- as.data.frame(out) row.names(out) <- NULL class(out) <- c("performance_model", class(out)) out } #' @export model_performance.lme <- model_performance.merMod #' @export model_performance.glmmadmb <- model_performance.merMod #' @export model_performance.rlmerMod <- model_performance.merMod #' @export model_performance.MixMod <- model_performance.merMod #' @export model_performance.mixed <- model_performance.merMod #' @export model_performance.glmmTMB <- model_performance.merMod #' @export model_performance.mixor <- function(model, metrics = "all", verbose = TRUE, ...) { if (any(tolower(metrics) == "log_loss")) { metrics[tolower(metrics) == "log_loss"] <- "LOGLOSS" } if (all(metrics == "all")) { metrics <- c("AIC", "BIC", "LOGLOSS", "SCORE") } mi <- insight::model_info(model) out <- list() if ("AIC" %in% metrics) { out$AIC <- performance_aic(model) } if ("BIC" %in% metrics) { out$BIC <- .get_BIC(model) } if (("LOGLOSS" %in% metrics) && mi$is_binomial && !mi$is_ordinal && !mi$is_multinomial) { out$Log_loss <- performance_logloss(model, verbose = verbose) } if (("SCORE" %in% metrics) && (mi$is_binomial || mi$is_count) && !mi$is_ordinal && !mi$is_multinomial) { .scoring_rules <- performance_score(model, verbose = verbose) if (!is.na(.scoring_rules$logarithmic)) out$Score_log <- .scoring_rules$logarithmic if (!is.na(.scoring_rules$spherical)) out$Score_spherical <- .scoring_rules$spherical } out <- as.data.frame(out) row.names(out) <- NULL class(out) <- c("performance_model", class(out)) out } performance/R/performance_logloss.R0000644000176200001440000000414514327475467017171 0ustar liggesusers#' @title Log Loss #' @name performance_logloss #' #' @description Compute the log loss for models with binary outcome. #' #' @param model Model with binary outcome. #' @param ... Currently not used. #' @inheritParams model_performance.lm #' #' @return Numeric, the log loss of `model`. #' #' @details #' Logistic regression models predict the probability of an outcome of being a #' "success" or "failure" (or 1 and 0 etc.). `performance_logloss()` evaluates #' how good or bad the predicted probabilities are. High values indicate bad #' predictions, while low values indicate good predictions. The lower the #' log-loss, the better the model predicts the outcome. #' #' @seealso [`performance_score()`] #' #' @examples #' data(mtcars) #' m <- glm(formula = vs ~ hp + wt, family = binomial, data = mtcars) #' performance_logloss(m) #' @export performance_logloss <- function(model, verbose = TRUE, ...) { UseMethod("performance_logloss") } #' @export performance_logloss.default <- function(model, verbose = TRUE, ...) { # check for valid input .is_model_valid(model) resp <- .recode_to_zero(insight::get_response(model, verbose = verbose)) ll <- suppressWarnings(mean(log(1 - abs(resp - stats::fitted(model))) * -1)) if (is.na(ll)) { if (verbose) insight::print_color("Can't calculate log-loss.\n", "red") return(NA) } ll } #' @export performance_logloss.brmsfit <- function(model, verbose = TRUE, ...) { yhat <- stats::fitted(object = model, summary = TRUE, ...)[, "Estimate"] resp <- .recode_to_zero(insight::get_response(model, verbose = verbose)) ll <- suppressWarnings(mean(log(1 - abs(resp - yhat)) * -1)) if (is.na(ll)) { if (verbose) insight::print_color("Can't calculate log-loss.\n", "red") return(NA) } ll } # mfx models ------------------------------- #' @export performance_logloss.logitor <- function(model, ...) { performance_logloss(model$fit, ...) } #' @export performance_logloss.logitmfx <- performance_logloss.logitor #' @export performance_logloss.probitmfx <- performance_logloss.logitor performance/R/check_itemscale.R0000644000176200001440000001060014507335630016205 0ustar liggesusers#' @title Describe Properties of Item Scales #' @name check_itemscale #' #' @description Compute various measures of internal consistencies #' applied to (sub)scales, which items were extracted using #' `parameters::principal_components()`. #' #' @param x An object of class `parameters_pca`, as returned by #' [`parameters::principal_components()`]. #' #' @return A list of data frames, with related measures of internal #' consistencies of each subscale. #' #' @details #' #' `check_itemscale()` calculates various measures of internal #' consistencies, such as Cronbach's alpha, item difficulty or discrimination #' etc. on subscales which were built from several items. Subscales are #' retrieved from the results of [`parameters::principal_components()`], i.e. #' based on how many components were extracted from the PCA, #' `check_itemscale()` retrieves those variables that belong to a component #' and calculates the above mentioned measures. #' #' @note #' - *Item difficulty* should range between 0.2 and 0.8. Ideal value #' is `p+(1-p)/2` (which mostly is between 0.5 and 0.8). See #' [`item_difficulty()`] for details. #' #' - For *item discrimination*, acceptable values are 0.20 or higher; #' the closer to 1.00 the better. See [`item_reliability()`] for more #' details. #' #' - In case the total *Cronbach's alpha* value is below the acceptable #' cut-off of 0.7 (mostly if an index has few items), the #' *mean inter-item-correlation* is an alternative measure to indicate #' acceptability. Satisfactory range lies between 0.2 and 0.4. See also #' [`item_intercor()`]. #' #' @references #' - Briggs SR, Cheek JM (1986) The role of factor analysis in the development #' and evaluation of personality scales. Journal of Personality, 54(1), #' 106-148. doi: 10.1111/j.1467-6494.1986.tb00391.x #' #' @examplesIf require("parameters") && require("psych") #' # data generation from '?prcomp', slightly modified #' C <- chol(S <- toeplitz(0.9^(0:15))) #' set.seed(17) #' X <- matrix(rnorm(1600), 100, 16) #' Z <- X %*% C #' #' pca <- principal_components(as.data.frame(Z), rotation = "varimax", n = 3) #' pca #' check_itemscale(pca) #' @export check_itemscale <- function(x) { if (!inherits(x, "parameters_pca")) { insight::format_error( "`x` must be an object of class `parameters_pca`, as returned by `parameters::principal_components()`." ) } insight::check_if_installed("parameters") dataset <- attributes(x)$dataset subscales <- parameters::closest_component(x) out <- lapply(sort(unique(subscales)), function(.subscale) { columns <- names(subscales)[subscales == .subscale] items <- dataset[columns] reliability <- item_reliability(items) .item_discr <- reliability$item_discrimination if (is.null(.item_discr)) .item_discr <- NA .item_alpha <- reliability$alpha_if_deleted if (is.null(.item_alpha)) .item_alpha <- NA s_out <- data.frame( Item = columns, Missings = vapply(items, function(i) sum(is.na(i)) / nrow(items), numeric(1)), Mean = vapply(items, mean, numeric(1), na.rm = TRUE), SD = vapply(items, stats::sd, numeric(1), na.rm = TRUE), Skewness = vapply(items, function(i) as.numeric(datawizard::skewness(i)), numeric(1)), Difficulty = item_difficulty(items)$Difficulty, Discrimination = .item_discr, `alpha if deleted` = .item_alpha, stringsAsFactors = FALSE, check.names = FALSE ) attr(s_out, "item_intercorrelation") <- item_intercor(items) attr(s_out, "cronbachs_alpha") <- cronbachs_alpha(items) s_out }) class(out) <- unique(c("check_itemscale", class(out))) out } # methods ------------------------------------- #' @export print.check_itemscale <- function(x, digits = 2, ...) { insight::print_color("# Description of (Sub-)Scales", "blue") cat(insight::export_table( lapply(seq_along(x), function(i) { out <- x[[i]] attr(out, "table_caption") <- c(sprintf("\nComponent %i", i), "red") attr(out, "table_footer") <- c(sprintf( "\nMean inter-item-correlation = %.3f Cronbach's alpha = %.3f", attributes(out)$item_intercorrelation, attributes(out)$cronbachs_alpha ), "yellow") out }), digits = digits, format = "text", missing = "", zap_small = TRUE )) } performance/R/test_wald.R0000644000176200001440000000565414512471542015104 0ustar liggesusers#' @rdname test_performance #' @export test_wald <- function(..., verbose = TRUE) { UseMethod("test_wald") } #' @export test_wald.default <- function(..., verbose = TRUE) { # Attribute class to list and get names from the global environment objects <- insight::ellipsis_info(..., only_models = TRUE) # validation checks (will throw error if non-valid objects) objects <- .test_performance_checks(objects, verbose = verbose) # ensure proper object names objects <- .check_objectnames(objects, sapply(match.call(expand.dots = FALSE)$`...`, as.character)) # If a suitable class is found, run the more specific method on it if (inherits(objects, c("ListNestedRegressions", "ListNonNestedRegressions", "ListLavaan"))) { test_wald(objects) } else { insight::format_error("The models cannot be compared for some reason :/") } } #' @export test_wald.ListNestedRegressions <- function(objects, verbose = TRUE, ...) { # for binomial models, only chisq-test if (all(attributes(objects)$is_binomial)) { if (verbose) { insight::format_alert( "Using Wald's F-Test is inappropriate for models with `binomial` family.", "Running Likelihood Ratio Test (LRT) now." ) } return(test_likelihoodratio(objects)) } else { out <- .test_wald(objects, test = "F") } attr(out, "is_nested") <- TRUE class(out) <- c("test_performance", class(out)) out } #' @export test_wald.ListNonNestedRegressions <- function(objects, verbose = TRUE, ...) { insight::format_error("Wald tests cannot be run on non-nested models. Try `test_vuong()`.") } # Helpers -------------------------- .test_wald <- function(objects, test = "F") { # Compute stuff dfs <- sapply(objects, insight::get_df, type = "residual") # sort by df if (!all(sort(dfs) == dfs) && !all(sort(dfs) == rev(dfs))) { objects <- objects[order(dfs)] dfs <- sort(dfs, na.last = TRUE) } dfs_diff <- c(NA, diff(sapply(objects, insight::get_df, type = "model"))) dev <- as.numeric(lapply(objects, insight::get_deviance)) dev_diff <- c(NA, -diff(dev)) out <- data.frame( df = dfs, df_diff = round(dfs_diff), stringsAsFactors = FALSE ) # Find reference-model related stuff refmodel <- order(dfs)[1] scale <- dev[refmodel] / dfs[refmodel] # test = "F" if (test == "F") { f_value <- (dev_diff / dfs_diff) / scale f_value[!is.na(f_value) & f_value < 0] <- NA # rather than p = 0 out$`F` <- f_value p <- stats::pf(f_value, abs(dfs_diff), dfs[refmodel], lower.tail = FALSE) # test = "LRT" } else { chi2 <- dev_diff / scale * sign(dfs_diff) chi2[!is.na(chi2) & chi2 < 0] <- NA # rather than p = 0 out$Chi2 <- chi2 p <- stats::pchisq(chi2, abs(dfs_diff), lower.tail = FALSE) } out$p <- p row.names(out) <- NULL out <- cbind(.test_performance_init(objects), out) out } performance/R/display.R0000644000176200001440000000362014327547352014561 0ustar liggesusers#' @title Print tables in different output formats #' @name display.performance_model #' #' @description Prints tables (i.e. data frame) in different output formats. #' `print_md()` is a alias for `display(format = "markdown")`. #' #' @param object,x An object returned by [`model_performance()`] or #' or [`compare_performance()`]. #' or its summary. #' @param format String, indicating the output format. Currently, only #' `"markdown"` is supported. #' @param layout Table layout (can be either `"horizontal"` or `"vertical"`). #' @param digits Number of decimal places. #' @param caption Table caption as string. If `NULL`, no table caption is printed. #' @param ... Currently not used. #' #' @return A character vector. If `format = "markdown"`, the return value #' will be a character vector in markdown-table format. #' #' @details `display()` is useful when the table-output from functions, #' which is usually printed as formatted text-table to console, should #' be formatted for pretty table-rendering in markdown documents, or if #' knitted from rmarkdown to PDF or Word files. See #' [vignette](https://easystats.github.io/parameters/articles/model_parameters_formatting.html) #' for examples. #' #' @examples #' model <- lm(mpg ~ wt + cyl, data = mtcars) #' mp <- model_performance(model) #' display(mp) #' @export display.performance_model <- function(object, format = "markdown", digits = 2, caption = NULL, ...) { if (identical(format, "html")) { print_html(x = object, digits = digits, caption = caption, ...) } else { print_md(x = object, digits = digits, caption = caption, ...) } } #' @export display.compare_performance <- display.performance_model #' @export display.check_itemscale <- display.performance_model # Reexports models ------------------------ #' @importFrom insight display #' @export insight::display performance/R/performance_mse.R0000644000176200001440000000475014411402617016252 0ustar liggesusers#' @title Mean Square Error of Linear Models #' @name performance_mse #' #' @description Compute mean square error of linear models. #' #' @inheritParams performance_rmse #' @inheritParams model_performance.lm #' #' @details #' The mean square error is the mean of the sum of squared residuals, i.e. it #' measures the average of the squares of the errors. Less technically speaking, #' the mean square error can be considered as the variance of the residuals, #' i.e. the variation in the outcome the model doesn't explain. Lower values #' (closer to zero) indicate better fit. #' #' @return Numeric, the mean square error of `model`. #' #' @examples #' data(mtcars) #' m <- lm(mpg ~ hp + gear, data = mtcars) #' performance_mse(m) #' @export performance_mse <- function(model, ...) { UseMethod("performance_mse") } #' @rdname performance_mse #' @export mse <- performance_mse #' @export performance_mse.default <- function(model, verbose = TRUE, ...) { res <- .safe(insight::get_residuals(model, verbose = verbose, type = "response", ...)) if (is.null(res)) { res <- .safe({ def_res <- insight::get_residuals(model, verbose = FALSE, ...) if (verbose) { insight::format_alert( "Response residuals not available to calculate mean square error. (R)MSE is probably not reliable." ) } def_res }) } if (is.null(res) || all(is.na(res))) { return(NA) } # for multivariate response models... if (is.data.frame(res)) { if (verbose) { insight::format_warning("Multiple response variables detected. Cannot reliably compute (R)MSE.") } return(NA) } mean(res^2, na.rm = TRUE) } # mfx models ------------------------------- #' @export performance_mse.logitor <- function(model, verbose = TRUE, ...) { performance_mse(model$fit, verbose = verbose, ...) } #' @export performance_mse.logitmfx <- performance_mse.logitor #' @export performance_mse.probitmfx <- performance_mse.logitor #' @export performance_mse.poissonirr <- performance_mse.logitor #' @export performance_mse.poissonmfx <- performance_mse.logitor #' @export performance_mse.negbinirr <- performance_mse.logitor #' @export performance_mse.negbinmfx <- performance_mse.logitor #' @export performance_mse.betaor <- performance_mse.logitor #' @export performance_mse.betamfx <- performance_mse.logitor #' @export performance_mse.model_fit <- performance_mse.logitor performance/R/performance_cv.R0000644000176200001440000002043014406527371016100 0ustar liggesusers#' @title Cross-validated model performance #' @name performance_cv #' #' @description This function cross-validates regression models in a #' user-supplied new sample or by using holdout (train-test), k-fold, or #' leave-one-out cross-validation. #' #' @param model A regression model. #' @param data Optional. A data frame containing the same variables as `model` #' that will be used as the cross-validation sample. #' @param method Character string, indicating the cross-validation method to use: #' whether holdout (`"holdout"`, aka train-test), k-fold (`"k_fold"`), or #' leave-one-out (`"loo"`). If `data` is supplied, this argument is ignored. #' @param metrics Can be `"all"`, `"common"` or a character vector of metrics to be #' computed (some of `c("ELPD", "Deviance", "MSE", "RMSE", "R2")`). "common" will #' compute R2 and RMSE. #' @param prop If `method = "holdout"`, what proportion of the sample to hold #' out as the test sample? #' @param k If `method = "k_fold"`, the number of folds to use. #' @param stack Logical. If `method = "k_fold"`, should performance be computed #' by stacking residuals from each holdout fold and calculating each metric on #' the stacked data (`TRUE`, default) or should performance be computed by #' calculating metrics within each holdout fold and averaging performance #' across each fold (`FALSE`)? #' @param verbose Toggle warnings. #' @param ... Not used. #' #' @return A data frame with columns for each metric requested, as well as `k` #' if `method = "holdout"` and the `Method` used for cross-validation. If #' `method = "holdout"` and `stack = TRUE`, the standard error (standard #' deviation across holdout folds) for each metric is also included. #' #' @examples #' model <- lm(mpg ~ wt + cyl, data = mtcars) #' performance_cv(model) #' #' @export performance_cv <- function(model, data = NULL, method = c("holdout", "k_fold", "loo"), metrics = "all", prop = 0.30, k = 5, stack = TRUE, verbose = TRUE, ...) { if (all(metrics == "all")) { metrics <- c("MSE", "RMSE", "R2") } else if (all(metrics == "common")) { metrics <- c("RMSE", "R2") } else { metrics <- toupper(metrics) metrics[metrics == "DEVIANCE"] <- "Deviance" } if (is.null(data)) { method <- match.arg(method, choices = c("holdout", "k_fold", "loo")) } if (!is.null(data) && inherits(model, "BFBayesFactor")) { insight::format_error("Models of class 'BFBayesFactor' not yet supported.") } resp.name <- insight::find_response(model) model_data <- insight::get_data(model, verbose = FALSE) info <- insight::model_info(model, verbose = verbose) if (info$is_linear) { if (!is.null(data)) { method <- "holdout" stack <- TRUE test_resp <- data[, resp.name] test_pred <- insight::get_predicted(model, ci = NULL, data = data) test_resd <- test_resp - test_pred } else if (method == "holdout") { train_i <- sample(seq_len(nrow(model_data)), size = round((1 - prop) * nrow(model_data)), replace = FALSE) model_upd <- stats::update(model, data = model_data[train_i, ]) test_resp <- model_data[-train_i, resp.name] test_pred <- insight::get_predicted(model_upd, ci = NULL, data = model_data[-train_i, ]) test_resd <- test_resp - test_pred } else if (method == "loo" && !info$is_bayesian) { model_response <- insight::get_response(model) MSE <- mean(insight::get_residuals(model, weighted = TRUE)^2 / (1 - stats::hatvalues(model))^2) mean(test_resd^2, na.rm = TRUE) RMSE <- sqrt(MSE) R2 <- 1 - MSE / (mean(model_response^2, na.rm = TRUE) - mean(model_response, na.rm = TRUE)^2) out <- data.frame(MSE = MSE, RMSE = RMSE, R2 = R2) } else { # Manual method for LOO, use this for non-linear and Bayesian models if (method == "loo") { if (info$is_bayesian && verbose) { insight::format_alert( "Simple LOO cross-validation can be very slow for MCMC models.", "Try loo::loo() instead." ) } stack <- TRUE k <- nrow(model_data) } if (k > nrow(model_data)) { message(insight::color_text(insight::format_message( "Requested number of folds (k) larger than the sample size.", "'k' set equal to the sample size (leave-one-out [LOO])." ), color = "yellow")) k <- nrow(model_data) } cv_folds <- .crossv_kfold(model_data, k = k) models_upd <- lapply(cv_folds, function(.x) { stats::update(model, data = model_data[.x$train, ]) }) test_pred <- mapply(function(.x, .y) { insight::get_predicted(.y, ci = NULL, data = model_data[.x$test, ]) }, cv_folds, models_upd, SIMPLIFY = FALSE) test_resp <- lapply(cv_folds, function(.x) { as.data.frame(model_data[.x$test, ])[[resp.name]] }) } } else { insight::format_error("Only linear models currently supported.") } if (isTRUE(stack)) { test_resp <- unlist(test_resp) test_pred <- unlist(test_pred) test_resd <- test_resp - test_pred MSE <- mean(test_resd^2, na.rm = TRUE) RMSE <- sqrt(MSE) R2 <- 1 - MSE / mean((test_resp - mean(test_resp, na.rm = TRUE))^2, na.rm = TRUE) out <- data.frame(MSE = MSE, RMSE = RMSE, R2 = R2) } else { test_resd <- mapply(function(.x, .y) { .x - .y }, test_resp, test_pred, SIMPLIFY = FALSE) MSEs <- sapply(test_resd, function(x) mean(x^2, na.rm = TRUE)) RMSEs <- sqrt(MSEs) resp_vars <- sapply(test_resp, function(x) mean((x - mean(x, na.rm = TRUE))^2, na.rm = TRUE)) R2s <- 1 - MSEs / resp_vars out <- data.frame( MSE = mean(MSEs), MSE_SE = stats::sd(MSEs), RMSE = mean(RMSEs), RMSE_SE = stats::sd(RMSEs), R2 = mean(R2s), R2_SE = stats::sd(R2s) ) } out <- out[, colnames(out) %in% c(metrics, paste0(metrics, "_SE"))] attr(out, "method") <- method attr(out, "k") <- if (method == "k_fold") k attr(out, "prop") <- if (method == "holdout") prop missing_metrics <- setdiff(metrics, c("MSE", "RMSE", "R2")) if (length(missing_metrics)) { message(insight::colour_text(insight::format_message( paste0( "Metric", ifelse(length(missing_metrics) > 1, "s '", " '"), paste0(missing_metrics, collapse = "', '"), "' not yet supported." ) ), colour = "red")) } class(out) <- c("performance_cv", "data.frame") return(out) } # TODO: implement performance::log_lik() function for deviance/elpd metrics # - When given a model, it should pass it to insight::get_loglikelihood, stats4::logLik, stats::logLik, or rstantools::log_lik # - When given a model and new data, it should pass to rstantools::log_lik if stan # or compute a df like this: # df <- list(residuals = cv_residuals); class(df) <- class(model) # then pass this df to stats4::logLik or stats::logLik # - for model classes that do not compute their ll inside of logLik, # then compute the ll by running: # logLik(update(model, formula = {{response}} ~ 0, offset = predict(model, newdata), data = newdata)) # methods ---------------------------------- #' @export print.performance_cv <- function(x, digits = 2, ...) { method <- switch(attr(x, "method"), holdout = paste0( insight::format_value(attr(x, "prop"), as_percent = TRUE, digits = 0), " holdout" ), k_fold = paste0(attr(x, "k"), "-fold"), loo = "leave-one-out [LOO]" ) formatted_table <- format( x = x, digits = digits, format = "text", ... ) cat(insight::export_table( x = formatted_table, digits = digits, format = "text", caption = c(paste0( "# Cross-validation performance (", method, " method)" ), "blue"), ... )) invisible(x) } #' @export as.data.frame.performance_cv <- function(x, row.names = NULL, ...) { data.frame( Accuracy = x$Accuracy, SE = x$SE, Method = x$Method, stringsAsFactors = FALSE, row.names = row.names, ... ) } performance/R/check_symmetry.R0000644000176200001440000000232714501062052016124 0ustar liggesusers#' Check distribution symmetry #' #' Uses Hotelling and Solomons test of symmetry by testing if the standardized #' nonparametric skew (\eqn{\frac{(Mean - Median)}{SD}}) is different than 0. #' \cr\cr #' This is an underlying assumption of Wilcoxon signed-rank test. #' #' @param x Model or numeric vector #' @param ... Not used. #' #' @examples #' V <- suppressWarnings(wilcox.test(mtcars$mpg)) #' check_symmetry(V) #' #' @export check_symmetry <- function(x, ...) { UseMethod("check_symmetry") } #' @export check_symmetry.numeric <- function(x, ...) { x <- x[!is.na(x)] m <- mean(x) a <- stats::median(x) n <- length(x) s <- stats::sd(x) D <- n * (m - a) / s z <- sqrt(2 * n) * (m - a) / s out <- stats::pnorm(abs(z), lower.tail = FALSE) class(out) <- c("check_symmetry", "numeric") attr(out, "object_name") <- substitute(x) out } #' @export print.check_symmetry <- function(x, ...) { pstring <- insight::format_p(x) if (x < 0.05) { insight::print_color(sprintf("Warning: Non-symmetry detected (%s).\n", pstring), "red") } else { insight::print_color(sprintf("OK: Data appears symmetrical (%s).\n", pstring), "green") } return(invisible(x)) } performance/R/check_outliers.R0000644000176200001440000017046114516276477016136 0ustar liggesusers#' @title Outliers detection (check for influential observations) #' @name check_outliers #' #' @description Checks for and locates influential observations (i.e., #' "outliers") via several distance and/or clustering methods. If several #' methods are selected, the returned "Outlier" vector will be a composite #' outlier score, made of the average of the binary (0 or 1) results of each #' method. It represents the probability of each observation of being #' classified as an outlier by at least one method. The decision rule used by #' default is to classify as outliers observations which composite outlier #' score is superior or equal to 0.5 (i.e., that were classified as outliers #' by at least half of the methods). See the **Details** section below #' for a description of the methods. #' #' @param x A model or a data.frame object. #' @param method The outlier detection method(s). Can be `"all"` or some of #' `"cook"`, `"pareto"`, `"zscore"`, `"zscore_robust"`, `"iqr"`, `"ci"`, `"eti"`, #' `"hdi"`, `"bci"`, `"mahalanobis"`, `"mahalanobis_robust"`, `"mcd"`, `"ics"`, #' `"optics"` or `"lof"`. #' @param threshold A list containing the threshold values for each method (e.g. #' `list('mahalanobis' = 7, 'cook' = 1)`), above which an observation is #' considered as outlier. If `NULL`, default values will be used (see #' 'Details'). If a numeric value is given, it will be used as the threshold #' for any of the method run. #' @param ID Optional, to report an ID column along with the row number. #' @param ... When `method = "ics"`, further arguments in `...` are passed #' down to [ICSOutlier::ics.outlier()]. When `method = "mahalanobis"`, #' they are passed down to [stats::mahalanobis()]. #' #' @return A logical vector of the detected outliers with a nice printing #' method: a check (message) on whether outliers were detected or not. The #' information on the distance measure and whether or not an observation is #' considered as outlier can be recovered with the [as.data.frame] #' function. Note that the function will (silently) return a vector of `FALSE` #' for non-supported data types such as character strings. #' #' @family functions to check model assumptions and and assess model quality #' #' @note There is also a #' [`plot()`-method](https://easystats.github.io/see/articles/performance.html) #' implemented in the #' \href{https://easystats.github.io/see/}{\pkg{see}-package}. **Please #' note** that the range of the distance-values along the y-axis is re-scaled #' to range from 0 to 1. #' #' @details Outliers can be defined as particularly influential observations. #' Most methods rely on the computation of some distance metric, and the #' observations greater than a certain threshold are considered outliers. #' Importantly, outliers detection methods are meant to provide information to #' consider for the researcher, rather than to be an automatized procedure #' which mindless application is a substitute for thinking. #' #' An **example sentence** for reporting the usage of the composite method #' could be: #' #' *"Based on a composite outlier score (see the 'check_outliers' function #' in the 'performance' R package; Lüdecke et al., 2021) obtained via the joint #' application of multiple outliers detection algorithms (Z-scores, Iglewicz, #' 1993; Interquartile range (IQR); Mahalanobis distance, Cabana, 2019; Robust #' Mahalanobis distance, Gnanadesikan and Kettenring, 1972; Minimum Covariance #' Determinant, Leys et al., 2018; Invariant Coordinate Selection, Archimbaud et #' al., 2018; OPTICS, Ankerst et al., 1999; Isolation Forest, Liu et al. 2008; #' and Local Outlier Factor, Breunig et al., 2000), we excluded n participants #' that were classified as outliers by at least half of the methods used."* #' #' @section Model-specific methods: #' #' - **Cook's Distance**: #' Among outlier detection methods, Cook's distance and leverage are less #' common than the basic Mahalanobis distance, but still used. Cook's distance #' estimates the variations in regression coefficients after removing each #' observation, one by one (Cook, 1977). Since Cook's distance is in the metric #' of an F distribution with p and n-p degrees of freedom, the median point of #' the quantile distribution can be used as a cut-off (Bollen, 1985). A common #' approximation or heuristic is to use 4 divided by the numbers of #' observations, which usually corresponds to a lower threshold (i.e., more #' outliers are detected). This only works for frequentist models. For Bayesian #' models, see `pareto`. #' #' - **Pareto**: #' The reliability and approximate convergence of Bayesian models can be #' assessed using the estimates for the shape parameter k of the generalized #' Pareto distribution. If the estimated tail shape parameter k exceeds 0.5, the #' user should be warned, although in practice the authors of the **loo** #' package observed good performance for values of k up to 0.7 (the default #' threshold used by `performance`). #' #' @section Univariate methods: #' #' - **Z-scores** `("zscore", "zscore_robust")`: #' The Z-score, or standard score, is a way of describing a data point as #' deviance from a central value, in terms of standard deviations from the mean #' (`"zscore"`) or, as it is here the case (`"zscore_robust"`) by #' default (Iglewicz, 1993), in terms of Median Absolute Deviation (MAD) from #' the median (which are robust measures of dispersion and centrality). The #' default threshold to classify outliers is 1.959 (`threshold = list("zscore" = 1.959)`), #' corresponding to the 2.5% (`qnorm(0.975)`) most extreme observations #' (assuming the data is normally distributed). Importantly, the Z-score #' method is univariate: it is computed column by column. If a dataframe is #' passed, the Z-score is calculated for each variable separately, and the #' maximum (absolute) Z-score is kept for each observations. Thus, all #' observations that are extreme on at least one variable might be detected #' as outliers. Thus, this method is not suited for high dimensional data #' (with many columns), returning too liberal results (detecting many outliers). #' #' - **IQR** `("iqr")`: #' Using the IQR (interquartile range) is a robust method developed by John #' Tukey, which often appears in box-and-whisker plots (e.g., in #' [ggplot2::geom_boxplot]). The interquartile range is the range between the first #' and the third quartiles. Tukey considered as outliers any data point that #' fell outside of either 1.5 times (the default threshold is 1.7) the IQR below #' the first or above the third quartile. Similar to the Z-score method, this is #' a univariate method for outliers detection, returning outliers detected for #' at least one column, and might thus not be suited to high dimensional data. #' The distance score for the IQR is the absolute deviation from the median of #' the upper and lower IQR thresholds. Then, this value is divided by the IQR #' threshold, to “standardize” it and facilitate interpretation. #' #' - **CI** `("ci", "eti", "hdi", "bci")`: #' Another univariate method is to compute, for each variable, some sort of #' "confidence" interval and consider as outliers values lying beyond the edges #' of that interval. By default, `"ci"` computes the Equal-Tailed Interval #' (`"eti"`), but other types of intervals are available, such as Highest #' Density Interval (`"hdi"`) or the Bias Corrected and Accelerated #' Interval (`"bci"`). The default threshold is `0.95`, considering #' as outliers all observations that are outside the 95% CI on any of the #' variable. See [bayestestR::ci()] for more details #' about the intervals. The distance score for the CI methods is the absolute #' deviation from the median of the upper and lower CI thresholds. Then, this #' value is divided by the difference between the upper and lower CI bounds #' divided by two, to “standardize” it and facilitate interpretation. #' #' @section Multivariate methods: #' #' - **Mahalanobis Distance**: #' Mahalanobis distance (Mahalanobis, 1930) is often used for multivariate #' outliers detection as this distance takes into account the shape of the #' observations. The default `threshold` is often arbitrarily set to some #' deviation (in terms of SD or MAD) from the mean (or median) of the #' Mahalanobis distance. However, as the Mahalanobis distance can be #' approximated by a Chi squared distribution (Rousseeuw and Van Zomeren, 1990), #' we can use the alpha quantile of the chi-square distribution with k degrees #' of freedom (k being the number of columns). By default, the alpha threshold #' is set to 0.025 (corresponding to the 2.5\% most extreme observations; #' Cabana, 2019). This criterion is a natural extension of the median plus or #' minus a coefficient times the MAD method (Leys et al., 2013). #' #' - **Robust Mahalanobis Distance**: #' A robust version of Mahalanobis distance using an Orthogonalized #' Gnanadesikan-Kettenring pairwise estimator (Gnanadesikan and Kettenring, #' 1972). Requires the **bigutilsr** package. See the [bigutilsr::dist_ogk()] #' function. #' #' - **Minimum Covariance Determinant (MCD)**: #' Another robust version of Mahalanobis. Leys et al. (2018) argue that #' Mahalanobis Distance is not a robust way to determine outliers, as it uses #' the means and covariances of all the data - including the outliers - to #' determine individual difference scores. Minimum Covariance Determinant #' calculates the mean and covariance matrix based on the most central subset of #' the data (by default, 66\%), before computing the Mahalanobis Distance. This #' is deemed to be a more robust method of identifying and removing outliers #' than regular Mahalanobis distance. #' #' - **Invariant Coordinate Selection (ICS)**: #' The outlier are detected using ICS, which by default uses an alpha threshold #' of 0.025 (corresponding to the 2.5\% most extreme observations) as a cut-off #' value for outliers classification. Refer to the help-file of #' [ICSOutlier::ics.outlier()] to get more details about this procedure. #' Note that `method = "ics"` requires both **ICS** and **ICSOutlier** #' to be installed, and that it takes some time to compute the results. You #' can speed up computation time using parallel computing. Set the number of #' cores to use with `options(mc.cores = 4)` (for example). #' #' - **OPTICS**: #' The Ordering Points To Identify the Clustering Structure (OPTICS) algorithm #' (Ankerst et al., 1999) is using similar concepts to DBSCAN (an unsupervised #' clustering technique that can be used for outliers detection). The threshold #' argument is passed as `minPts`, which corresponds to the minimum size #' of a cluster. By default, this size is set at 2 times the number of columns #' (Sander et al., 1998). Compared to the other techniques, that will always #' detect several outliers (as these are usually defined as a percentage of #' extreme values), this algorithm functions in a different manner and won't #' always detect outliers. Note that `method = "optics"` requires the #' **dbscan** package to be installed, and that it takes some time to compute #' the results. #' #' - **Local Outlier Factor**: #' Based on a K nearest neighbors algorithm, LOF compares the local density of #' a point to the local densities of its neighbors instead of computing a #' distance from the center (Breunig et al., 2000). Points that have a #' substantially lower density than their neighbors are considered outliers. A #' LOF score of approximately 1 indicates that density around the point is #' comparable to its neighbors. Scores significantly larger than 1 indicate #' outliers. The default threshold of 0.025 will classify as outliers the #' observations located at `qnorm(1-0.025) * SD)` of the log-transformed #' LOF distance. Requires the **dbscan** package. #' #' @section Threshold specification: #' #' Default thresholds are currently specified as follows: #' #' ``` #' list( #' zscore = stats::qnorm(p = 1 - 0.001 / 2), #' zscore_robust = stats::qnorm(p = 1 - 0.001 / 2), #' iqr = 1.7, #' ci = 1 - 0.001, #' eti = 1 - 0.001, #' hdi = 1 - 0.001, #' bci = 1 - 0.001, #' cook = stats::qf(0.5, ncol(x), nrow(x) - ncol(x)), #' pareto = 0.7, #' mahalanobis = stats::qchisq(p = 1 - 0.001, df = ncol(x)), #' mahalanobis_robust = stats::qchisq(p = 1 - 0.001, df = ncol(x)), #' mcd = stats::qchisq(p = 1 - 0.001, df = ncol(x)), #' ics = 0.001, #' optics = 2 * ncol(x), #' lof = 0.001 #' ) #' ``` #' #' @section Meta-analysis models: #' For meta-analysis models (e.g. objects of class `rma` from the *metafor* #' package or `metagen` from package *meta*), studies are defined as outliers #' when their confidence interval lies outside the confidence interval of the #' pooled effect. #' #' @references #' - Archimbaud, A., Nordhausen, K., and Ruiz-Gazen, A. (2018). ICS for #' multivariate outlier detection with application to quality control. #' Computational Statistics and Data Analysis, 128, 184-199. #' \doi{10.1016/j.csda.2018.06.011} #' #' - Gnanadesikan, R., and Kettenring, J. R. (1972). Robust estimates, residuals, #' and outlier detection with multiresponse data. Biometrics, 81-124. #' #' - Bollen, K. A., and Jackman, R. W. (1985). Regression diagnostics: An #' expository treatment of outliers and influential cases. Sociological Methods #' and Research, 13(4), 510-542. #' #' - Cabana, E., Lillo, R. E., and Laniado, H. (2019). Multivariate outlier #' detection based on a robust Mahalanobis distance with shrinkage estimators. #' arXiv preprint arXiv:1904.02596. #' #' - Cook, R. D. (1977). Detection of influential observation in linear #' regression. Technometrics, 19(1), 15-18. #' #' - Iglewicz, B., and Hoaglin, D. C. (1993). How to detect and handle outliers #' (Vol. 16). Asq Press. #' #' - Leys, C., Klein, O., Dominicy, Y., and Ley, C. (2018). Detecting #' multivariate outliers: Use a robust variant of Mahalanobis distance. Journal #' of Experimental Social Psychology, 74, 150-156. #' #' - Liu, F. T., Ting, K. M., and Zhou, Z. H. (2008, December). Isolation forest. #' In 2008 Eighth IEEE International Conference on Data Mining (pp. 413-422). #' IEEE. #' #' - Lüdecke, D., Ben-Shachar, M. S., Patil, I., Waggoner, P., and Makowski, D. #' (2021). performance: An R package for assessment, comparison and testing of #' statistical models. Journal of Open Source Software, 6(60), 3139. #' \doi{10.21105/joss.03139} #' #' - Thériault, R., Ben-Shachar, M. S., Patil, I., Lüdecke, D., Wiernik, B. M., #' and Makowski, D. (2023). Check your outliers! An introduction to identifying #' statistical outliers in R with easystats. \doi{10.31234/osf.io/bu6nt} #' #' - Rousseeuw, P. J., and Van Zomeren, B. C. (1990). Unmasking multivariate #' outliers and leverage points. Journal of the American Statistical #' association, 85(411), 633-639. #' #' @examples #' data <- mtcars # Size nrow(data) = 32 #' #' # For single variables ------------------------------------------------------ #' outliers_list <- check_outliers(data$mpg) # Find outliers #' outliers_list # Show the row index of the outliers #' as.numeric(outliers_list) # The object is a binary vector... #' filtered_data <- data[!outliers_list, ] # And can be used to filter a dataframe #' nrow(filtered_data) # New size, 28 (4 outliers removed) #' #' # Find all observations beyond +/- 2 SD #' check_outliers(data$mpg, method = "zscore", threshold = 2) #' #' # For dataframes ------------------------------------------------------ #' check_outliers(data) # It works the same way on dataframes #' #' # You can also use multiple methods at once #' outliers_list <- check_outliers(data, method = c( #' "mahalanobis", #' "iqr", #' "zscore" #' )) #' outliers_list #' #' # Using `as.data.frame()`, we can access more details! #' outliers_info <- as.data.frame(outliers_list) #' head(outliers_info) #' outliers_info$Outlier # Including the probability of being an outlier #' #' # And we can be more stringent in our outliers removal process #' filtered_data <- data[outliers_info$Outlier < 0.1, ] #' #' # We can run the function stratified by groups using `{datawizard}` package: #' group_iris <- datawizard::data_group(iris, "Species") #' check_outliers(group_iris) #' #' @examplesIf require("see") && require("bigutilsr") && require("loo") && require("MASS") && require("ICSOutlier") && require("ICS") && require("dbscan") #' \donttest{ #' # You can also run all the methods #' check_outliers(data, method = "all") #' #' # For statistical models --------------------------------------------- #' # select only mpg and disp (continuous) #' mt1 <- mtcars[, c(1, 3, 4)] #' # create some fake outliers and attach outliers to main df #' mt2 <- rbind(mt1, data.frame( #' mpg = c(37, 40), disp = c(300, 400), #' hp = c(110, 120) #' )) #' # fit model with outliers #' model <- lm(disp ~ mpg + hp, data = mt2) #' #' outliers_list <- check_outliers(model) #' plot(outliers_list) #' #' insight::get_data(model)[outliers_list, ] # Show outliers data #' } #' @export check_outliers <- function(x, ...) { UseMethod("check_outliers") } #' @export check_outliers.character <- function(x, ...) { rep(0, length(x)) } # default --------------------- #' @rdname check_outliers #' @export check_outliers.default <- function(x, method = c("cook", "pareto"), threshold = NULL, ID = NULL, ...) { # Check args if (all(method == "all")) { method <- c( "zscore_robust", "iqr", "ci", "cook", "pareto", "mahalanobis", "mahalanobis_robust", "mcd", "ics", "optics", "lof" ) } method <- match.arg( method, c( "zscore", "zscore_robust", "iqr", "ci", "hdi", "eti", "bci", "cook", "pareto", "mahalanobis", "mahalanobis_robust", "mcd", "ics", "optics", "lof" ), several.ok = TRUE ) # Get data data <- insight::get_data(x, verbose = FALSE) # Remove non-numerics data <- datawizard::data_select(data, select = is.numeric) # Thresholds if (is.null(threshold)) { thresholds <- .check_outliers_thresholds(data) } else if (is.list(threshold)) { thresholds <- .check_outliers_thresholds(data) thresholds[names(threshold)] <- threshold[names(threshold)] } else { insight::format_error( paste( "The `threshold` argument must be NULL (for default values) or a list containing", "threshold values for desired methods (e.g., `list('mahalanobis' = 7)`)." ) ) } if (!missing(ID)) { insight::format_warning(paste0("ID argument not supported for model objects of class `", class(x)[1], "`.")) } # Others if (all(method %in% c("cook", "pareto"))) { df <- data.frame(Row = seq_len(nrow(as.data.frame(data)))) outlier_count <- list() outlier_var <- list() } else { out <- check_outliers(data, method, threshold) outlier_var <- attributes(out)$outlier_var outlier_count <- attributes(out)$outlier_count df <- attributes(out)$data df <- df[!names(df) == "Outlier"] } # Cook if ("cook" %in% method && !insight::model_info(x)$is_bayesian && !inherits(x, "bife")) { data_cook <- .check_outliers_cook( x, threshold = thresholds$cook )$data_cook df <- datawizard::data_merge(list(df, data_cook), join = "full", by = "Row" ) count.table <- datawizard::data_filter( data_cook, "Outlier_Cook > 0.5" ) count.table <- datawizard::data_remove( count.table, "Cook", regex = TRUE, as_data_frame = TRUE ) if (nrow(count.table) >= 1) { count.table$n_Cook <- "(Multivariate)" } outlier_count$cook <- count.table if (all(method %in% c("cook", "pareto"))) { outlier_count$all <- count.table } else { outlier_count$all <- datawizard::data_merge( list(outlier_count$all, count.table), join = "full", by = "Row" ) } } else { method <- method[!(method == "cook")] } # Pareto if ("pareto" %in% method && insight::model_info(x)$is_bayesian) { data_pareto <- .check_outliers_pareto( x, threshold = thresholds$pareto )$data_pareto df <- datawizard::data_merge(list(df, data_pareto), join = "full", by = "Row" ) count.table <- datawizard::data_filter( data_pareto, "Outlier_Pareto > 0.5" ) count.table <- datawizard::data_remove( count.table, "Pareto", regex = TRUE, as_data_frame = TRUE ) if (nrow(count.table) >= 1) { count.table$n_Pareto <- "(Multivariate)" } outlier_count$pareto <- count.table if (all(method %in% c("cook", "pareto"))) { outlier_count$all <- count.table } else { outlier_count$all <- datawizard::data_merge( list(outlier_count$all, count.table), join = "full", by = "Row" ) } } else { method <- method[!(method == "pareto")] } outlier_count$all <- datawizard::convert_na_to(outlier_count$all, replace_num = 0, replace_char = "0", replace_fac = 0 ) num.df <- outlier_count$all[!names(outlier_count$all) %in% c("Row", ID)] if (isTRUE(nrow(num.df) > 0)) { num.df <- datawizard::recode_values( num.df, recode = list(`2` = "(Multivariate)") ) num.df <- as.data.frame(lapply(num.df, as.numeric)) outlier_count$all$max <- apply(num.df, 1, max) outlier_count$all <- datawizard::data_filter( outlier_count$all, max >= 2 ) outlier_count$all <- datawizard::data_remove( outlier_count$all, "max" ) } row.names(outlier_count$all) <- NULL thresholds <- thresholds[names(thresholds) %in% method] # Composite outlier score df$Outlier <- rowMeans(df[grepl("Outlier_", names(df), fixed = TRUE)]) df <- df[c(names(df)[names(df) != "Outlier"], "Outlier")] # Out outlier <- df$Outlier > 0.5 # Attributes class(outlier) <- c("check_outliers", "see_check_outliers", class(outlier)) attr(outlier, "data") <- df attr(outlier, "threshold") <- thresholds attr(outlier, "method") <- method attr(outlier, "text_size") <- 3 attr(outlier, "influential_obs") <- .influential_obs(x) attr(outlier, "variables") <- "(Whole model)" attr(outlier, "raw_data") <- data attr(outlier, "outlier_var") <- outlier_var attr(outlier, "outlier_count") <- outlier_count outlier } # Methods ----------------------------------------------------------------- #' @export as.data.frame.check_outliers <- function(x, ...) { attributes(x)$data } #' @export as.numeric.check_outliers <- function(x, ...) { attributes(x)$data$Outlier } #' @export print.check_outliers <- function(x, ...) { outliers <- which(x) method <- attr(x, "method") round_to_last_digit <- function(x, n = 3) { max(abs(round(x, n)), abs(signif(x, 1))) * sign(x) } thresholds <- lapply(attr(x, "threshold"), round_to_last_digit, 3) method.thresholds <- data.frame( method = method, thresholds = unlist(thresholds) ) method.thresholds <- paste0(method.thresholds$method, " (", method.thresholds$thresholds, ")", collapse = ", " ) method.univariate <- c( "zscore", "zscore_robust", "iqr", "ci", "eti", "hdi", "bci" ) vars <- toString(attr(x, "variables")) vars.outliers <- attr(x, "outlier_var") var.plural <- ifelse(length(attr(x, "variables")) > 1, "variables", "variable" ) method.plural <- ifelse(length(thresholds) > 1, "methods and thresholds", "method and threshold" ) long_dash <- paste0("\n", strrep("-", 77), "\n") if (length(outliers) > 1) { outlier.plural <- "outliers" case.plural <- "cases" } else { outlier.plural <- "outlier" case.plural <- "case" } if (length(outliers) >= 1) { outlier.count <- attr(x, "outlier_count") o <- toString(outliers) insight::print_color(insight::format_message( sprintf( "%i %s detected: %s %s.", length(outliers), outlier.plural, case.plural, o ), sprintf( "- Based on the following %s: %s.", method.plural, method.thresholds ), sprintf("- For %s: %s.\n", var.plural, vars), indent = "" ), color = "yellow") if (length(method) > 1) { insight::print_color( c( "\nNote: Outliers were classified as such by", "at least half of the selected methods. \n" ), "yellow" ) } if ((isTRUE(nrow(outlier.count$all) > 0) || isTRUE(attributes(x)$grouped)) && (length(method) > 1 || all(method %in% method.univariate))) { cat(long_dash, insight::format_message( "\nThe following observations were considered outliers for two or more", "variables by at least one of the selected methods:\n\n" )) ifelse(isTRUE(attributes(x)$grouped), print(lapply(outlier.count, function(x) x$all)), print(outlier.count$all) ) } if (length(method) == 1 && all(method %in% method.univariate)) { cat(long_dash, "Outliers per variable (", method, "): \n\n", sep = "" ) ifelse(isTRUE(attributes(x)$grouped), print(vars.outliers), print(vars.outliers[[1]]) ) } } else { insight::print_color( sprintf("OK: No outliers detected. - Based on the following %s: %s. - For %s: %s\n\n", method.plural, method.thresholds, var.plural, vars), "green" ) } invisible(x) } #' @export print.check_outliers_metafor <- function(x, ...) { outliers <- which(x) round_to_last_digit <- function(x, n = 3) { max(abs(round(x, n)), abs(signif(x, 1))) * sign(x) } thresholds <- lapply(attr(x, "threshold"), round_to_last_digit, 3) studies <- attr(x, "outlier_var") if (length(outliers) > 1) { outlier.plural <- "outliers" case.plural <- "studies" } else { outlier.plural <- "outlier" case.plural <- "study" } if (length(outliers) >= 1) { if (all(as.character(studies) == as.character(outliers))) { o <- datawizard::text_concatenate(outliers) } else { o <- datawizard::text_concatenate(paste0(outliers, " (", studies, ")")) } insight::print_color(insight::format_message( sprintf("%i %s detected: %s %s.\n", length(outliers), outlier.plural, case.plural, o) ), "yellow") } else { insight::print_color("OK: No outliers detected.\n", "green") } invisible(x) } #' @export print.check_outliers_metagen <- function(x, ...) { outliers_fixed <- which(x$fixed) outliers_random <- which(x$random) studies <- attr(x, "studies") if (length(outliers_fixed) > 1) { outlier.plural <- "outliers" case.plural <- "studies" } else { outlier.plural <- "outlier" case.plural <- "study" } if (length(outliers_fixed) >= 1) { if (all(as.character(studies[outliers_fixed]) == as.character(outliers_fixed))) { o <- datawizard::text_concatenate(outliers_fixed) } else { o <- datawizard::text_concatenate(paste0(outliers_fixed, " (", studies[outliers_fixed], ")")) } insight::print_color(insight::format_message( sprintf("- %i %s in fixed effects detected: %s %s.\n", length(outliers_fixed), outlier.plural, case.plural, o) ), "yellow") } if (length(outliers_random) > 1) { outlier.plural <- "outliers" case.plural <- "cases" } else { outlier.plural <- "outlier" case.plural <- "case" } if (length(outliers_random) >= 1) { if (all(as.character(studies[outliers_random]) == as.character(outliers_random))) { o <- datawizard::text_concatenate(outliers_random) } else { o <- datawizard::text_concatenate(paste0(outliers_random, " (", studies[outliers_random], ")")) } if (length(outliers_fixed) >= 1) { cat("\n") } insight::print_color(insight::format_message( sprintf("- %i %s in random effects detected: %s %s.\n", length(outliers_random), outlier.plural, case.plural, o) ), "yellow") } if (!length(outliers_random) && !length(outliers_fixed)) { insight::print_color("OK: No outliers detected.\n", "green") } invisible(x) } #' @export plot.check_outliers <- function(x, ...) { insight::check_if_installed("see", "to plot outliers") NextMethod() } # other classes ------------------------- #' @rdname check_outliers #' @export check_outliers.numeric <- function(x, method = "zscore_robust", threshold = NULL, ...) { x <- as.data.frame(x) names(x) <- datawizard::text_remove(sys.call()[2], "()") check_outliers(x, method = method, threshold = threshold, ... ) } #' @rdname check_outliers #' @export check_outliers.data.frame <- function(x, method = "mahalanobis", threshold = NULL, ID = NULL, ...) { # Preserve ID column if desired ID.names <- switch(!is.null(ID), x[ID] ) # Remove non-numerics data <- x x <- x[, vapply(x, is.numeric, logical(1)), drop = FALSE] # Check args if (all(method == "all")) { method <- c( "zscore_robust", "iqr", "ci", "cook", "pareto", "mahalanobis", "mahalanobis_robust", "mcd", "ics", "optics", "lof" ) } method <- match.arg(method, c( "zscore", "zscore_robust", "iqr", "ci", "hdi", "eti", "bci", "cook", "pareto", "mahalanobis", "mahalanobis_robust", "mcd", "ics", "optics", "lof" ), several.ok = TRUE) # Thresholds if (is.null(threshold)) { thresholds <- .check_outliers_thresholds(x) } else if (is.list(threshold)) { thresholds <- .check_outliers_thresholds(x) thresholds[names(threshold)] <- threshold[names(threshold)] } else if (is.numeric(threshold)) { thresholds <- .check_outliers_thresholds(x) thresholds <- lapply(thresholds, function(x) threshold) } else { insight::format_error( paste( "The `threshold` argument must be NULL (for default values) or a list containing", "threshold values for desired methods (e.g., `list('mahalanobis' = 7)`)." ) ) } thresholds <- thresholds[names(thresholds) %in% method] out.meta <- .check_outliers.data.frame_method(x, method, thresholds, ID, ID.names, ...) out <- out.meta$out outlier_count <- out.meta$outlier_count outlier_var <- out.meta$outlier_var # Combine outlier data df <- out[vapply(out, is.data.frame, logical(1))] if (length(df) > 1 && !is.null(ID)) { df <- datawizard::data_merge(df, by = c("Row", ID)) } else if (length(df) > 1) { df <- datawizard::data_merge(df, by = "Row") } else { df <- df[[1]] } # Composite outlier score df$Outlier <- rowMeans(df[grepl("Outlier_", names(df), fixed = TRUE)]) # Out outlier <- df$Outlier > 0.5 # Combine outlier frequency table if (length(outlier_count) > 1 && !is.null(ID)) { outlier_count$all <- datawizard::data_merge(outlier_count, join = "full", by = c("Row", ID) ) } else if (length(outlier_count) > 1) { outlier_count$all <- datawizard::data_merge(outlier_count, join = "full", by = "Row" ) } else if (length(outlier_count) == 1) { outlier_count$all <- outlier_count[[1]] } else { outlier_count$all <- data.frame() } outlier_count$all <- datawizard::convert_na_to(outlier_count$all, replace_num = 0, replace_char = "0", replace_fac = 0 ) outlier_count <- lapply(outlier_count, function(x) { num.df <- x[!names(x) %in% c("Row", ID)] if (isTRUE(nrow(num.df) >= 1)) { num.df <- datawizard::change_code( num.df, recode = list(`2` = "(Multivariate)") ) num.df <- as.data.frame(lapply(num.df, as.numeric)) x$max <- apply(num.df, 1, max) x <- datawizard::data_filter(x, max >= 2) x <- datawizard::data_remove(x, "max") } }) row.names(outlier_count$all) <- NULL # Attributes class(outlier) <- c("check_outliers", "see_check_outliers", class(outlier)) attr(outlier, "data") <- df attr(outlier, "threshold") <- thresholds attr(outlier, "method") <- method attr(outlier, "text_size") <- 3 attr(outlier, "variables") <- names(x) attr(outlier, "raw_data") <- data attr(outlier, "outlier_var") <- outlier_var attr(outlier, "outlier_count") <- outlier_count outlier } .check_outliers.data.frame_method <- function(x, method, thresholds, ID, ID.names, ...) { # Clean up per-variable list of outliers process_outlier_list <- function(outlier.list, Outlier_method) { outlier.list <- lapply(outlier.list, "[[", 1) outlier.list <- lapply(outlier.list, function(x) { x[x[[Outlier_method]] >= 0.5, ] }) outlier.list <- outlier.list[lapply(outlier.list, nrow) > 0] outlier.list <- lapply(outlier.list, datawizard::data_remove, Outlier_method, as_data_frame = TRUE ) outlier.list } # Count table of repeated outliers (for several variables) count_outlier_table <- function(outlier.list) { count.table <- do.call(rbind, outlier.list) name.method <- grep("Distance_", names(count.table), value = TRUE, fixed = TRUE) name.method <- paste0("n_", gsub("Distance_", "", name.method, fixed = TRUE)) if (isTRUE(nrow(count.table) > 0)) { count.values <- rle(sort(count.table$Row)) count.table <- data.frame(Row = count.values$values) if (!is.null(ID)) { count.table[ID] <- ID.names[count.table$Row, ] } count.table <- cbind(count.table, val = count.values$lengths) names(count.table)[names(count.table) == "val"] <- name.method count.table <- count.table[order(-count.table[[name.method]]), ] } count.table } # Preparation out <- list() outlier_var <- list() outlier_count <- list() # Z-score if ("zscore" %in% method) { out <- c(out, .check_outliers_zscore( x, threshold = thresholds$zscore, robust = FALSE, method = "max", ID.names = ID.names )) # Outliers per variable zscore.var <- lapply( x, .check_outliers_zscore, threshold = thresholds$zscore, robust = FALSE, method = "max", ID.names = ID.names ) outlier_var$zscore <- process_outlier_list(zscore.var, "Outlier_Zscore") outlier_count$zscore <- count_outlier_table(outlier_var$zscore) } if ("zscore_robust" %in% method) { out <- c(out, .check_outliers_zscore( x, threshold = thresholds$zscore_robust, robust = TRUE, method = "max", ID.names = ID.names )) # Outliers per variable zscore_robust.var <- lapply(x, .check_outliers_zscore, threshold = thresholds$zscore_robust, robust = TRUE, method = "max", ID.names = ID.names ) outlier_var$zscore_robust <- process_outlier_list( zscore_robust.var, "Outlier_Zscore_robust" ) outlier_count$zscore_robust <- count_outlier_table( outlier_var$zscore_robust ) } # IQR if ("iqr" %in% method) { out <- c(out, .check_outliers_iqr( x, threshold = thresholds$iqr, method = "tukey", ID.names = ID.names )) # Outliers per variable iqr.var <- lapply(x, function(x) { y <- as.data.frame(x) .check_outliers_iqr( y, threshold = thresholds$iqr, method = "tukey", ID.names = ID.names ) }) outlier_var$iqr <- process_outlier_list(iqr.var, "Outlier_IQR") outlier_count$iqr <- count_outlier_table(outlier_var$iqr) } # CI if (any(c("ci", "hdi", "eti", "bci") %in% method)) { for (i in method[method %in% c("ci", "hdi", "eti", "bci")]) { out <- c(out, .check_outliers_ci( x, threshold = thresholds[i], method = i, ID.names = ID.names )) # Outliers per variable loop.var <- lapply(x, function(x) { y <- as.data.frame(x) .check_outliers_ci( y, threshold = thresholds[i], method = i, ID.names = ID.names ) }) outlier_var[[i]] <- process_outlier_list( loop.var, paste0("Outlier_", i) ) outlier_count[[i]] <- count_outlier_table(outlier_var[[i]]) } } # Mahalanobis if ("mahalanobis" %in% method) { out <- c(out, .check_outliers_mahalanobis( x, threshold = thresholds$mahalanobis, ID.names = ID.names, ... )) count.table <- datawizard::data_filter( out$data_mahalanobis, "Outlier_Mahalanobis > 0.5" ) count.table <- datawizard::data_remove( count.table, "Mahalanobis", regex = TRUE, as_data_frame = TRUE ) if (nrow(count.table) >= 1) { count.table$n_Mahalanobis <- "(Multivariate)" } outlier_count$mahalanobis <- count.table } # Robust Mahalanobis if ("mahalanobis_robust" %in% method) { out <- c(out, .check_outliers_mahalanobis_robust( x, threshold = thresholds$mahalanobis_robust, ID.names = ID.names )) count.table <- datawizard::data_filter( out$data_mahalanobis_robust, "Outlier_Mahalanobis_robust > 0.5" ) count.table <- datawizard::data_remove( count.table, "Mahalanobis", regex = TRUE, as_data_frame = TRUE ) if (nrow(count.table) >= 1) { count.table$n_Mahalanobis_robust <- "(Multivariate)" } outlier_count$mahalanobis_robust <- count.table } # MCD if ("mcd" %in% method) { out <- c(out, .check_outliers_mcd( x, threshold = thresholds$mcd, percentage_central = 0.66, ID.names = ID.names )) count.table <- datawizard::data_filter( out$data_mcd, "Outlier_MCD > 0.5" ) count.table <- datawizard::data_remove( count.table, "MCD", regex = TRUE, as_data_frame = TRUE ) if (nrow(count.table) >= 1) { count.table$n_MCD <- "(Multivariate)" } outlier_count$mcd <- count.table } # ICS if ("ics" %in% method) { out <- c(out, .check_outliers_ics( x, threshold = thresholds$ics, ID.names = ID.names )) # make sure we have valid results if (!is.null(out)) { count.table <- datawizard::data_filter( out$data_ics, "Outlier_ICS > 0.5" ) count.table <- datawizard::data_remove( count.table, "ICS", regex = TRUE, as_data_frame = TRUE ) if (nrow(count.table) >= 1) { count.table$n_ICS <- "(Multivariate)" } outlier_count$ics <- count.table } } # OPTICS if ("optics" %in% method) { out <- c(out, .check_outliers_optics( x, threshold = thresholds$optics, ID.names = ID.names )) count.table <- datawizard::data_filter( out$data_optics, "Outlier_OPTICS > 0.5" ) count.table <- datawizard::data_remove( count.table, "OPTICS", regex = TRUE, as_data_frame = TRUE ) if (nrow(count.table) >= 1) { count.table$n_OPTICS <- "(Multivariate)" } outlier_count$optics <- count.table } # Isolation Forest # if ("iforest" %in% method) { # out <- c(out, .check_outliers_iforest(x, threshold = thresholds$iforest)) # } # Local Outlier Factor if ("lof" %in% method) { out <- c(out, .check_outliers_lof( x, threshold = thresholds$lof, ID.names = ID.names )) count.table <- datawizard::data_filter( out$data_lof, "Outlier_LOF > 0.5" ) count.table <- datawizard::data_remove( count.table, "LOF", regex = TRUE, as_data_frame = TRUE ) if (nrow(count.table) >= 1) { count.table$n_LOF <- "(Multivariate)" } outlier_count$lof <- count.table } out.meta <- list(out = out, outlier_var = outlier_var, outlier_count = outlier_count) out.meta } #' @export check_outliers.grouped_df <- function(x, method = "mahalanobis", threshold = NULL, ID = NULL, ...) { info <- attributes(x) # poorman < 0.8.0? if ("indices" %in% names(info)) { grps <- lapply(attr(x, "indices", exact = TRUE), function(x) x + 1) } else { grps <- attr(x, "groups", exact = TRUE)[[".rows"]] } # Initialize elements data <- data.frame() out <- NULL thresholds <- list() outlier_var <- list() outlier_count <- list() # Loop through groups for (i in seq_along(grps)) { rows <- grps[[i]] subset <- check_outliers( as.data.frame(x[rows, ]), method = method, threshold = threshold, ID = ID, ... ) data <- rbind(data, as.data.frame(subset)) out <- c(out, subset) thresholds[[paste0("group_", i)]] <- attributes(subset)$threshold outlier_var[[i]] <- lapply( attributes(subset)$outlier_var, lapply, function(y) { y$Row <- rows[which(seq_along(rows) %in% y$Row)] y } ) outlier_count[[i]] <- lapply( attributes(subset)$outlier_count, function(y) { y$Row <- rows[which(seq_along(rows) %in% y$Row)] y } ) } # Add compatibility between dplyr and poorman info$groups$.rows <- lapply(info$groups$.rows, as.numeric) outlier_var <- stats::setNames(outlier_var, info$groups[[1]]) outlier_count <- stats::setNames(outlier_count, info$groups[[1]]) groups <- lapply(seq_along(info$groups$.rows), function(x) { info$groups$.rows[[x]] <- rep( info$groups[[1]][x], length(info$groups$.rows[[x]]) ) info$groups$.rows[[x]] <- as.data.frame(info$groups$.rows[[x]]) }) data[names(info$groups)[1]] <- do.call(rbind, groups) data <- datawizard::data_relocate( data, select = names(info$groups)[1], after = "Row" ) data$Row <- seq_len(nrow(data)) class(out) <- c("check_outliers", "see_check_outliers", class(out)) attr(out, "data") <- data attr(out, "method") <- method attr(out, "threshold") <- thresholds[[1]] attr(out, "text_size") <- 3 attr(out, "variables") <- names(x[, vapply(x, is.numeric, logical(1)), drop = FALSE]) attr(out, "raw_data") <- x attr(out, "outlier_var") <- outlier_var attr(out, "outlier_count") <- outlier_count attr(out, "grouped") <- TRUE out } #' @export check_outliers.BFBayesFactor <- function(x, ID = NULL, ...) { if (!insight::is_model(x)) { insight::format_error("Collinearity only applicable to regression models.") } if (!missing(ID)) { insight::format_warning(paste0("ID argument not supported for objects of class `", class(x)[1], "`.")) } d <- insight::get_predictors(x) d[[insight::find_response(x)]] <- insight::get_response(x) check_outliers(d, ID = ID, ...) } #' @export check_outliers.gls <- function(x, method = "pareto", threshold = NULL, ID = NULL, ...) { if (!missing(ID)) { insight::format_warning( paste0("ID argument not supported for objects of class `", class(x)[1], "`.") ) } valid_methods <- c("zscore_robust", "iqr", "ci", "pareto", "optics") if (all(method == "all")) { method <- valid_methods } if (!all(method %in% valid_methods)) { method <- "pareto" } check_outliers.default(x, method = method, threshold = threshold, ...) } #' @export check_outliers.lme <- check_outliers.gls #' @export check_outliers.fixest <- check_outliers.gls #' @export check_outliers.fixest_multi <- function(x, method = "pareto", threshold = NULL, ID = NULL, ...) { lapply(x, check_outliers.fixest) } #' @export check_outliers.geeglm <- check_outliers.gls #' @export check_outliers.rma <- function(x, ...) { ## TODO Check whether we can enable CI argument # but we need to find out at which CI-level the overall effect interval was estimated ci <- 0.95 thresholds <- c(x$ci.lb, x$ci.ub) lower_bounds <- as.numeric(x$yi - stats::qnorm((1 + ci) / 2) * sqrt(x$vi)) upper_bounds <- as.numeric(x$yi + stats::qnorm((1 + ci) / 2) * sqrt(x$vi)) # which study's CI-range is not covered by/does not overlap with overall CI? outlier <- upper_bounds < thresholds[1] | lower_bounds > thresholds[2] d <- data.frame( Row = seq_along(x$yi), Outlier = as.numeric(outlier) ) # Attributes class(outlier) <- c("check_outliers_metafor", class(outlier)) attr(outlier, "data") <- d attr(outlier, "threshold") <- thresholds attr(outlier, "text_size") <- 3 attr(outlier, "outlier_var") <- x$slab[outlier] attr(outlier, "outlier_count") <- sum(outlier) outlier } #' @export check_outliers.rma.uni <- check_outliers.rma #' @export check_outliers.metagen <- function(x, ...) { ci <- 0.95 thresholds_fixed <- c(x$lower.fixed, x$upper.fixed) thresholds_random <- c(x$lower.random, x$upper.random) lower_bounds <- as.numeric(x$TE - stats::qnorm((1 + ci) / 2) * x$seTE) upper_bounds <- as.numeric(x$TE + stats::qnorm((1 + ci) / 2) * x$seTE) # which study's CI-range is not covered by/does not overlap with overall CI? outlier <- list( fixed = upper_bounds < thresholds_fixed[1] | lower_bounds > thresholds_fixed[2], random = upper_bounds < thresholds_random[1] | lower_bounds > thresholds_random[2] ) d <- data.frame( Row = seq_along(x$TE), Outlier_fixed = as.numeric(outlier$fixed), Outlier_random = as.numeric(outlier$random) ) # Attributes class(outlier) <- c("check_outliers_metagen", class(outlier)) attr(outlier, "data") <- d attr(outlier, "text_size") <- 3 attr(outlier, "studies") <- x$studlab attr(outlier, "outlier_count") <- sum(c(outlier$fixed, outlier$random)) outlier } #' @export check_outliers.meta <- check_outliers.metagen #' @export check_outliers.metabin <- check_outliers.metagen # Thresholds -------------------------------------------------------------- .check_outliers_thresholds <- function(x) { suppressWarnings(.check_outliers_thresholds_nowarn(x)) } .check_outliers_thresholds_nowarn <- function(x) { zscore <- stats::qnorm(p = 1 - 0.001 / 2) zscore_robust <- stats::qnorm(p = 1 - 0.001 / 2) iqr <- 1.7 ci <- 1 - 0.001 eti <- 1 - 0.001 hdi <- 1 - 0.001 bci <- 1 - 0.001 cook <- stats::qf(0.5, ncol(x), nrow(x) - ncol(x)) pareto <- 0.7 mahalanobis <- stats::qchisq(p = 1 - 0.001, df = ncol(x)) mahalanobis_robust <- stats::qchisq(p = 1 - 0.001, df = ncol(x)) mcd <- stats::qchisq(p = 1 - 0.001, df = ncol(x)) ics <- 0.001 optics <- 2 * ncol(x) lof <- 0.001 list( zscore = zscore, zscore_robust = zscore_robust, iqr = iqr, ci = ci, hdi = hdi, eti = eti, bci = bci, cook = cook, pareto = pareto, mahalanobis = mahalanobis, mahalanobis_robust = mahalanobis_robust, mcd = mcd, ics = ics, optics = optics, lof = lof ) } # utilities -------------------- .check_outliers_zscore <- function(x, threshold = stats::qnorm(p = 1 - 0.001 / 2), robust = TRUE, method = "max", ID.names = NULL) { if (threshold < 1) { insight::format_error( "The `threshold` argument must be one or greater for method `zscore`." ) } x <- as.data.frame(x) # Standardize if (robust) { d <- abs(as.data.frame(lapply( x, function(x) (x - stats::median(x, na.rm = TRUE)) / stats::mad(x, na.rm = TRUE) ))) } else { d <- abs(as.data.frame(lapply( x, function(x) (x - mean(x, na.rm = TRUE)) / stats::sd(x, na.rm = TRUE) ))) } out <- data.frame(Row = seq_len(nrow(as.data.frame(d)))) if (!is.null(ID.names)) { out <- cbind(out, ID.names) } out$Distance_Zscore <- apply(d, 1, function(x) { ifelse(all(is.na(x)), NA, max(x, na.rm = TRUE)) }) # Filter out$Outlier_Zscore <- as.numeric(out$Distance_Zscore > threshold) output <- list( data_zscore = out, threshold_zscore = threshold ) if (isTRUE(robust)) { names(output) <- paste0(names(output), "_robust") output$data_zscore_robust <- datawizard::data_addsuffix( output$data_zscore_robust, "_robust", select = "Zscore$", regex = TRUE ) } output } .check_outliers_iqr <- function(x, threshold = 1.7, method = "tukey", ID.names = NULL) { d <- data.frame(Row = seq_len(nrow(as.data.frame(x)))) Distance_IQR <- d for (col in seq_len(ncol(as.data.frame(x)))) { v <- x[, col] if (method == "tukey") { iqr <- stats::quantile(v, 0.75, na.rm = TRUE) - stats::quantile(v, 0.25, na.rm = TRUE) } else { iqr <- stats::IQR(v, na.rm = TRUE) } lower <- stats::quantile(v, 0.25, na.rm = TRUE) - (iqr * threshold) upper <- stats::quantile(v, 0.75, na.rm = TRUE) + (iqr * threshold) m.int <- stats::median(c(lower, upper), na.rm = TRUE) d2 <- abs(v - m.int) Distance_IQR[names(as.data.frame(x))[col]] <- d2 / (iqr * threshold) d[names(as.data.frame(x))[col]] <- ifelse(v > upper, 1, ifelse(v < lower, 1, 0)) # nolint } out <- data.frame(Row = d$Row) d$Row <- NULL Distance_IQR$Row <- NULL if (!is.null(ID.names)) { out <- cbind(out, ID.names) } # out$Distance_IQR <- Distance_IQR out$Distance_IQR <- vapply(as.data.frame(t(Distance_IQR)), function(x) { ifelse(all(is.na(x)), NA_real_, max(x, na.rm = TRUE)) }, numeric(1)) out$Outlier_IQR <- vapply(as.data.frame(t(d)), function(x) { ifelse(all(is.na(x)), NA_real_, max(x, na.rm = TRUE)) }, numeric(1)) list( data_iqr = out, threshold_iqr = threshold ) } .check_outliers_ci <- function(x, threshold = 1 - 0.001, method = "ci", ID.names = NULL) { # Run through columns d <- data.frame(Row = seq_len(nrow(x))) Distance_CI <- d for (col in names(x)) { v <- x[, col] ci <- bayestestR::ci(v, ci = threshold, method = method) d[col] <- ifelse(x[[col]] > ci$CI_high | x[[col]] < ci$CI_low, 1, 0) # nolint m.int <- stats::median(c(ci$CI_low, ci$CI_high), na.rm = TRUE) d2 <- abs(v - m.int) ci.range <- (ci$CI_high - ci$CI_low) / 2 Distance_CI[col] <- d2 / ci.range } out.0 <- data.frame(Row = d$Row) d$Row <- NULL Distance_CI$Row <- NULL if (!is.null(ID.names)) { out.0 <- cbind(out.0, ID.names) } # Take the max out <- as.data.frame(apply(Distance_CI, 1, max, na.rm = TRUE)) names(out) <- paste0("Distance_", method) # Filter out[paste0("Outlier_", method)] <- vapply( as.data.frame(t(d)), function(x) ifelse(all(is.na(x)), NA_real_, max(x, na.rm = TRUE)), numeric(1) ) out <- cbind(out.0, out) output <- list( data_ = out, threshold_ = threshold ) names(output) <- paste0(names(output), method) output } .check_outliers_cook <- function(x, threshold = NULL, ID.names = NULL) { # Compute d <- unname(stats::cooks.distance(x)) out <- data.frame(Row = seq_along(d)) out$Distance_Cook <- d # Filter out$Outlier_Cook <- as.numeric(out$Distance_Cook > threshold) list( data_cook = out, threshold_cook = threshold ) } .check_outliers_pareto <- function(x, threshold = 0.7) { insight::check_if_installed("loo") # Compute d <- suppressWarnings(loo::pareto_k_values(loo::loo(x))) out <- data.frame(Row = seq_along(d)) out$Distance_Pareto <- d # Filter out$Outlier_Pareto <- as.numeric(out$Distance_Pareto > threshold) list( data_pareto = out, threshold_pareto = threshold ) } .check_outliers_mahalanobis <- function(x, threshold = stats::qchisq( p = 1 - 0.001, df = ncol(x) ), ID.names = NULL, ...) { if (anyNA(x) || any(with(x, x == Inf))) { insight::format_error("Missing or infinite values are not allowed.") } out <- data.frame(Row = seq_len(nrow(x))) if (!is.null(ID.names)) { out <- cbind(out, ID.names) } # Compute out$Distance_Mahalanobis <- stats::mahalanobis(x, center = colMeans(x), cov = stats::cov(x), ...) # Filter out$Outlier_Mahalanobis <- as.numeric(out$Distance_Mahalanobis > threshold) list( data_mahalanobis = out, threshold_mahalanobis = threshold ) } # Bigutils not yet fully available on CRAN .check_outliers_mahalanobis_robust <- function(x, threshold = stats::qchisq( p = 1 - 0.001, df = ncol(x) ), ID.names = NULL) { out <- data.frame(Row = seq_len(nrow(x))) if (!is.null(ID.names)) { out <- cbind(out, ID.names) } insight::check_if_installed("bigutilsr") # Compute U <- svd(scale(x))$u out$Distance_Mahalanobis_robust <- bigutilsr::dist_ogk(U) # Filter out$Outlier_Mahalanobis_robust <- as.numeric( out$Distance_Mahalanobis_robust > threshold ) list( data_mahalanobis_robust = out, threshold_mahalanobis_robust = threshold ) } .check_outliers_mcd <- function(x, threshold = stats::qchisq(p = 1 - 0.001, df = ncol(x)), percentage_central = 0.50, ID.names = NULL) { out <- data.frame(Row = seq_len(nrow(x))) if (!is.null(ID.names)) { out <- cbind(out, ID.names) } insight::check_if_installed("MASS") # Compute mcd <- MASS::cov.mcd(x, quantile.used = percentage_central * nrow(x)) out$Distance_MCD <- stats::mahalanobis(x, center = mcd$center, cov = mcd$cov) # Filter out$Outlier_MCD <- as.numeric(out$Distance_MCD > threshold) list( data_mcd = out, threshold_mcd = threshold ) } .check_outliers_ics <- function(x, threshold = 0.001, ID.names = NULL, ...) { out <- data.frame(Row = seq_len(nrow(x))) if (!is.null(ID.names)) { out <- cbind(out, ID.names) } insight::check_if_installed("ICS") insight::check_if_installed("ICSOutlier") # Get n cores n_cores <- if (requireNamespace("parallel", quietly = TRUE)) { getOption("mc.cores", 1L) } else { NULL } # tell user about n-cores option if (is.null(n_cores)) { insight::format_alert( "Package `parallel` is not installed. `check_outliers()` will run on a single core.", "Install package `parallel` and set, for example, `options(mc.cores = 4)` to run on multiple cores." ) } else if (n_cores == 1) { insight::format_alert( "Package `parallel` is installed, but `check_outliers()` will run on a single core.", "To use multiple cores, set `options(mc.cores = 4)` (for example)." ) } # Run algorithm # Try outliers <- tryCatch( { ics <- ICS::ics2(x) ICSOutlier::ics.outlier( object = ics, ncores = n_cores, level.dist = threshold, ... ) }, error = function(e) { NULL } ) if (is.null(outliers)) { if (ncol(x) == 1) { insight::print_color("At least two numeric predictors are required to detect outliers.\n", "red") } else { insight::print_color(sprintf("`check_outliers()` does not support models of class `%s`.\n", class(x)[1]), "red") } return(NULL) } # Get results cutoff <- .safe(outliers@ics.dist.cutoff) # validation check if (is.null(cutoff)) { insight::print_color("Could not detect cut-off for outliers.\n", "red") return(NULL) } out$Distance_ICS <- outliers@ics.distances out$Outlier_ICS <- as.numeric(out$Distance_ICS > cutoff) # Out list( data_ics = out, threshold_ics = threshold ) } .check_outliers_optics <- function(x, threshold = NULL, ID.names = NULL) { out <- data.frame(Row = seq_len(nrow(x))) if (!is.null(ID.names)) { out <- cbind(out, ID.names) } insight::check_if_installed("dbscan") # Compute rez <- dbscan::optics(x, minPts = threshold) rez <- dbscan::extractXi(rez, xi = 0.05) # TODO: find automatic way of setting xi out$Distance_OPTICS <- rez$coredist # Filter if (is.null(rez$cluster)) { out$Outlier_OPTICS <- 0 } else { out$Outlier_OPTICS <- as.numeric(rez$cluster == 0) } list( data_optics = out, threshold_optics = threshold ) } # .check_outliers_iforest <- function(x, threshold = 0.025) { # out <- data.frame(Row = seq_len(nrow(x))) # # # Install packages # insight::check_if_installed("solitude") # # # Compute # if (utils::packageVersion("solitude") < "0.2.0") { # iforest <- solitude::isolationForest(x) # out$Distance_iforest <- stats::predict(iforest, x, type = "anomaly_score") # } else if (utils::packageVersion("solitude") == "0.2.0") { # stop(paste("Must update package `solitude` (above version 0.2.0).", # "Please run `install.packages('solitude')`."), call. = FALSE) # } else { # iforest <- solitude::isolationForest$new(sample_size = nrow(x)) # suppressMessages(iforest$fit(x)) # out$Distance_iforest <- iforest$scores$anomaly_score # } # # # # Threshold # cutoff <- stats::median(out$Distance_iforest) + stats::qnorm(1 - threshold) * stats::mad(out$Distance_iforest) # # Filter # out$Outlier_iforest <- as.numeric(out$Distance_iforest >= cutoff) # # out$Row <- NULL # list( # "data_iforest" = out, # "threshold_iforest" = threshold # ) # } .check_outliers_lof <- function(x, threshold = 0.001, ID.names = NULL) { if (threshold < 0 || threshold > 1) { insight::format_error( "The `threshold` argument must be between 0 and 1 for method `lof`." ) } out <- data.frame(Row = seq_len(nrow(x))) if (!is.null(ID.names)) { out <- cbind(out, ID.names) } insight::check_if_installed("dbscan") # Compute out$Distance_LOF <- log(dbscan::lof(x, minPts = ncol(x))) # Threshold cutoff <- stats::qnorm(1 - threshold) * stats::sd(out$Distance_LOF) # Filter out$Outlier_LOF <- as.numeric(out$Distance_LOF > cutoff) list( data_lof = out, threshold_lof = threshold ) } # influential observations data -------- .influential_obs <- function(x, threshold = NULL) { .safe(.diag_influential_obs(x, threshold = threshold)) } # Non-supported model classes --------------------------------------- #' @export check_outliers.glmmTMB <- function(x, ...) { insight::format_alert(paste0("`check_outliers()` does not yet support models of class `", class(x)[1], "`.")) NULL } #' @export check_outliers.lmrob <- check_outliers.glmmTMB #' @export check_outliers.glmrob <- check_outliers.glmmTMB performance/R/model_performance.R0000644000176200001440000000431214355346734016576 0ustar liggesusers#' @title Model Performance #' @name model_performance #' #' @description See the documentation for your object's class: #' #' - [Frequentist Regressions][model_performance.lm] #' - [Instrumental Variables Regressions][model_performance.ivreg] #' - [Mixed models][model_performance.merMod] #' - [Bayesian models][model_performance.stanreg] #' - [CFA / SEM lavaan models][model_performance.lavaan] #' - [Meta-analysis models][model_performance.rma] #' #' @seealso [`compare_performance()`][compare_performance] to compare performance of many different models. #' #' @param model Statistical model. #' @param ... Arguments passed to or from other methods, resp. for #' `compare_performance()`, one or multiple model objects (also of #' different classes). #' #' @return A data frame (with one row) and one column per "index" (see `metrics`). #' #' @details `model_performance()` correctly detects transformed response and #' returns the "corrected" AIC and BIC value on the original scale. To get back #' to the original scale, the likelihood of the model is multiplied by the #' Jacobian/derivative of the transformation. #' #' @examples #' model <- lm(mpg ~ wt + cyl, data = mtcars) #' model_performance(model) #' #' model <- glm(vs ~ wt + mpg, data = mtcars, family = "binomial") #' model_performance(model) #' @export model_performance <- function(model, ...) { UseMethod("model_performance") } #' @rdname model_performance #' @export performance <- model_performance # methods -------------------------------- #' @export print.performance_model <- function(x, digits = 3, layout = "horizontal", ...) { layout <- match.arg(layout, choices = c("horizontal", "vertical")) formatted_table <- format(x = x, digits = digits, format = "text", ...) # switch to vertical layout if (layout == "vertical") { formatted_table <- datawizard::rownames_as_column(as.data.frame(t(formatted_table)), "Metric") colnames(formatted_table)[2] <- "Value" } cat( insight::export_table( x = formatted_table, digits = digits, format = "text", caption = c("# Indices of model performance", "blue"), ... ) ) invisible(x) } performance/R/model_performance.ivreg.R0000644000176200001440000000461314407025063017700 0ustar liggesusers#' Performance of instrumental variable regression models #' #' @inheritParams model_performance.lm #' @param metrics Can be `"all"`, `"common"` or a character vector of #' metrics to be computed (some of `c("AIC", "AICc", "BIC", "R2", "RMSE", #' "SIGMA", "Sargan", "Wu_Hausman", "weak_instruments")`). `"common"` will #' compute AIC, BIC, R2 and RMSE. #' #' @details `model_performance()` correctly detects transformed response and #' returns the "corrected" AIC and BIC value on the original scale. To get back #' to the original scale, the likelihood of the model is multiplied by the #' Jacobian/derivative of the transformation. #' #' @export model_performance.ivreg <- function(model, metrics = "all", verbose = TRUE, ...) { all_metrics <- c( "AIC", "BIC", "R2", "R2_adj", "RMSE", "SIGMA", "Sargan", "Wu_Hausman", "weak_instruments" ) if (all(metrics == "all")) { metrics <- all_metrics } else if (all(metrics == "common")) { metrics <- c("AIC", "BIC", "R2", "R2_adj", "RMSE") } # check for valid input metrics <- .check_bad_metrics(metrics, all_metrics, verbose) # the lm-method does not accept ivreg-specific metrics out <- model_performance.lm( model, metrics = setdiff(metrics, c("Sargan", "Wu_Hausman", "weak_instruments")), verbose = verbose, ... ) diagnostics <- c("Sargan", "Wu_Hausman", "weak_instruments") if (any(metrics %in% diagnostics)) { s <- summary(model, diagnostics = TRUE) if ("Sargan" %in% metrics) { out$Sargan <- s$diagnostics["Sargan", "statistic"] out$Sargan_p <- s$diagnostics["Sargan", "p-value"] } if ("Wu_Hausman" %in% metrics) { out$Wu_Hausman <- s$diagnostics["Wu-Hausman", "statistic"] out$Wu_Hausman_p <- s$diagnostics["Wu-Hausman", "p-value"] } if ("weak_instruments" %in% metrics) { out$weak_instruments <- s$diagnostics["Weak instruments", "statistic"] out$weak_instruments_p <- s$diagnostics["Weak instruments", "p-value"] } # remove NA columns completed_tests <- intersect( c( "Sargan", "Sargan_p", "Wu_Hausman", "Wu_Hausman_p", "weak_instruments", "weak_instruments_p" ), colnames(out) ) missing <- sapply(out[completed_tests], function(i) all(is.na(i))) if (any(missing)) { out[completed_tests[missing]] <- NULL } } out } performance/R/icc.R0000644000176200001440000006152014512471542013646 0ustar liggesusers#' Intraclass Correlation Coefficient (ICC) #' #' This function calculates the intraclass-correlation coefficient (ICC) - #' sometimes also called *variance partition coefficient* (VPC) or #' *repeatability* - for mixed effects models. The ICC can be calculated for all #' models supported by `insight::get_variance()`. For models fitted with the #' **brms**-package, `icc()` might fail due to the large variety of #' models and families supported by the **brms**-package. In such cases, an #' alternative to the ICC is the `variance_decomposition()`, which is based #' on the posterior predictive distribution (see 'Details'). #' #' @param model A (Bayesian) mixed effects model. #' @param re_formula Formula containing group-level effects to be considered in #' the prediction. If `NULL` (default), include all group-level effects. #' Else, for instance for nested models, name a specific group-level effect #' to calculate the variance decomposition for this group-level. See 'Details' #' and `?brms::posterior_predict`. #' @param ci Confidence resp. credible interval level. For `icc()` and `r2()`, #' confidence intervals are based on bootstrapped samples from the ICC resp. #' R2 value. See `iterations`. #' @param by_group Logical, if `TRUE`, `icc()` returns the variance #' components for each random-effects level (if there are multiple levels). #' See 'Details'. #' @param iterations Number of bootstrap-replicates when computing confidence #' intervals for the ICC or R2. #' @param ci_method Character string, indicating the bootstrap-method. Should #' be `NULL` (default), in which case `lme4::bootMer()` is used for #' bootstrapped confidence intervals. However, if bootstrapped intervals cannot #' be calculated this was, try `ci_method = "boot"`, which falls back to #' `boot::boot()`. This may successfully return bootstrapped confidence intervals, #' but bootstrapped samples may not be appropriate for the multilevel structure #' of the model. There is also an option `ci_method = "analytical"`, which tries #' to calculate analytical confidence assuming a chi-squared distribution. #' However, these intervals are rather inaccurate and often too narrow. It is #' recommended to calculate bootstrapped confidence intervals for mixed models. #' @param verbose Toggle warnings and messages. #' @param ... Arguments passed down to `lme4::bootMer()` or `boot::boot()` #' for bootstrapped ICC or R2. #' #' @inheritParams r2_bayes #' @inheritParams insight::get_variance #' #' @return A list with two values, the adjusted ICC and the unadjusted ICC. For #' `variance_decomposition()`, a list with two values, the decomposed #' ICC as well as the credible intervals for this ICC. #' #' @references #' - Hox, J. J. (2010). Multilevel analysis: techniques and applications #' (2nd ed). New York: Routledge. #' - Nakagawa, S., Johnson, P. C. D., and Schielzeth, H. (2017). The #' coefficient of determination R2 and intra-class correlation coefficient #' from generalized linear mixed-effects models revisited and expanded. #' Journal of The Royal Society Interface, 14(134), 20170213. #' - Rabe-Hesketh, S., and Skrondal, A. (2012). Multilevel and longitudinal #' modeling using Stata (3rd ed). College Station, Tex: Stata Press #' Publication. #' - Raudenbush, S. W., and Bryk, A. S. (2002). Hierarchical linear models: #' applications and data analysis methods (2nd ed). Thousand Oaks: Sage #' Publications. #' #' @details #' ## Interpretation #' The ICC can be interpreted as "the proportion of the variance explained by #' the grouping structure in the population". The grouping structure entails #' that measurements are organized into groups (e.g., test scores in a school #' can be grouped by classroom if there are multiple classrooms and each #' classroom was administered the same test) and ICC indexes how strongly #' measurements in the same group resemble each other. This index goes from 0, #' if the grouping conveys no information, to 1, if all observations in a group #' are identical (_Gelman and Hill, 2007, p. 258_). In other word, the ICC - #' sometimes conceptualized as the measurement repeatability - "can also be #' interpreted as the expected correlation between two randomly drawn units #' that are in the same group" _(Hox 2010: 15)_, although this definition might #' not apply to mixed models with more complex random effects structures. The #' ICC can help determine whether a mixed model is even necessary: an ICC of #' zero (or very close to zero) means the observations within clusters are no #' more similar than observations from different clusters, and setting it as a #' random factor might not be necessary. #' #' ## Difference with R2 #' The coefficient of determination R2 (that can be computed with [`r2()`]) #' quantifies the proportion of variance explained by a statistical model, but #' its definition in mixed model is complex (hence, different methods to compute #' a proxy exist). ICC is related to R2 because they are both ratios of #' variance components. More precisely, R2 is the proportion of the explained #' variance (of the full model), while the ICC is the proportion of explained #' variance that can be attributed to the random effects. In simple cases, the #' ICC corresponds to the difference between the *conditional R2* and the #' *marginal R2* (see [`r2_nakagawa()`]). #' #' ## Calculation #' The ICC is calculated by dividing the random effect variance, #' \ifelse{html}{\out{σ2i}}{\eqn{\sigma^2_i}}, by #' the total variance, i.e. the sum of the random effect variance and the #' residual variance, \ifelse{html}{\out{σ2ε}}{\eqn{\sigma^2_\epsilon}}. #' #' ## Adjusted and unadjusted ICC #' `icc()` calculates an adjusted and an unadjusted ICC, which both take all #' sources of uncertainty (i.e. of *all random effects*) into account. While #' the *adjusted ICC* only relates to the random effects, the *unadjusted ICC* #' also takes the fixed effects variances into account, more precisely, the #' fixed effects variance is added to the denominator of the formula to #' calculate the ICC (see _Nakagawa et al. 2017_). Typically, the *adjusted* #' ICC is of interest when the analysis of random effects is of interest. #' `icc()` returns a meaningful ICC also for more complex random effects #' structures, like models with random slopes or nested design (more than two #' levels) and is applicable for models with other distributions than Gaussian. #' For more details on the computation of the variances, see #' `?insight::get_variance`. #' #' ## ICC for unconditional and conditional models #' Usually, the ICC is calculated for the null model ("unconditional model"). #' However, according to _Raudenbush and Bryk (2002)_ or #' _Rabe-Hesketh and Skrondal (2012)_ it is also feasible to compute the #' ICC for full models with covariates ("conditional models") and compare how #' much, e.g., a level-2 variable explains the portion of variation in the #' grouping structure (random intercept). #' #' ## ICC for specific group-levels #' The proportion of variance for specific levels related to the overall model #' can be computed by setting `by_group = TRUE`. The reported ICC is #' the variance for each (random effect) group compared to the total #' variance of the model. For mixed models with a simple random intercept, #' this is identical to the classical (adjusted) ICC. #' #' ## Variance decomposition for brms-models #' If `model` is of class `brmsfit`, `icc()` might fail due to the large #' variety of models and families supported by the **brms** package. In such #' cases, `variance_decomposition()` is an alternative ICC measure. The function #' calculates a variance decomposition based on the posterior predictive #' distribution. In this case, first, the draws from the posterior predictive #' distribution *not conditioned* on group-level terms #' (`posterior_predict(..., re_formula = NA)`) are calculated as well as draws #' from this distribution *conditioned* on *all random effects* (by default, #' unless specified else in `re_formula`) are taken. Then, second, the variances #' for each of these draws are calculated. The "ICC" is then the ratio between #' these two variances. This is the recommended way to analyse #' random-effect-variances for non-Gaussian models. It is then possible to #' compare variances across models, also by specifying different group-level #' terms via the `re_formula`-argument. #' #' Sometimes, when the variance of the posterior predictive distribution is #' very large, the variance ratio in the output makes no sense, e.g. because #' it is negative. In such cases, it might help to use `robust = TRUE`. #' #' @examplesIf require("lme4") #' model <- lme4::lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris) #' icc(model) #' #' # ICC for specific group-levels #' data(sleepstudy, package = "lme4") #' set.seed(12345) #' sleepstudy$grp <- sample(1:5, size = 180, replace = TRUE) #' sleepstudy$subgrp <- NA #' for (i in 1:5) { #' filter_group <- sleepstudy$grp == i #' sleepstudy$subgrp[filter_group] <- #' sample(1:30, size = sum(filter_group), replace = TRUE) #' } #' model <- lme4::lmer( #' Reaction ~ Days + (1 | grp / subgrp) + (1 | Subject), #' data = sleepstudy #' ) #' icc(model, by_group = TRUE) #' @export icc <- function(model, by_group = FALSE, tolerance = 1e-05, ci = NULL, iterations = 100, ci_method = NULL, verbose = TRUE, ...) { # special handling for smicd::semLme() if (inherits(model, "sem") && inherits(model, "lme")) { return(model$icc) } if (insight::is_multivariate(model)) { if (inherits(model, "brmsfit")) { return(variance_decomposition(model)) } else { if (verbose) { insight::format_warning( "Multiple response models not yet supported. You may use `performance::variance_decomposition()`." ) } return(NULL) } } if (!insight::is_mixed_model(model)) { if (verbose) { insight::format_warning("`model` has no random effects.") } return(NULL) } # calculate random effect variances vars <- .compute_random_vars(model, tolerance) # return if ICC couldn't be computed if (is.null(vars) || all(is.na(vars))) { return(vars) } # Calculate ICC values by groups if (isTRUE(by_group)) { # with random slopes, icc is inaccurate if (!is.null(insight::find_random_slopes(model)) && verbose) { insight::format_alert( "Model contains random slopes. Cannot compute accurate ICCs by group factors." ) } if (!is.null(ci) && !is.na(ci) && verbose) { insight::format_alert("Confidence intervals are not yet supported for `by_group = TRUE`.") } # icc per group factor with reference to overall model icc_overall <- vars$var.intercept / (vars$var.random + vars$var.residual) out <- data.frame( Group = names(icc_overall), ICC = unname(icc_overall), stringsAsFactors = FALSE ) # iccs between groups # n_grps <- length(vars$var.intercept) # level_combinations <- utils::combn(1:n_grps, m = n_grps - 1, simplify = FALSE) # icc_grp <- sapply(level_combinations, function(v) vars$var.intercept[v[1]] / (vars$var.intercept[v[1]] + vars$var.intercept[v[2]])) # # out2 <- data.frame( # Group1 = group_names[sapply(level_combinations, function(i) i[1])], # Group2 = group_names[sapply(level_combinations, function(i) i[2])], # ICC = unname(icc_grp), # stringsAsFactors = FALSE # ) class(out) <- c("icc_by_group", class(out)) } else { # Calculate ICC values icc_adjusted <- vars$var.random / (vars$var.random + vars$var.residual) icc_unadjusted <- vars$var.random / (vars$var.fixed + vars$var.random + vars$var.residual) out <- data.frame( ICC_adjusted = icc_adjusted, ICC_conditional = icc_unadjusted, ICC_unadjusted = icc_unadjusted ) # check if CIs are requested, and compute bootstrapped CIs if (!is.null(ci) && !is.na(ci)) { # this is experimental! if (identical(ci_method, "analytical")) { result <- .safe(.analytical_icc_ci(model, ci)) if (!is.null(result)) { icc_ci_adjusted <- result$ICC_adjusted icc_ci_unadjusted <- result$ICC_unadjusted } else { icc_ci_adjusted <- icc_ci_unadjusted <- NA } } else { result <- .bootstrap_icc(model, iterations, tolerance, ci_method, ...) # CI for adjusted ICC icc_ci_adjusted <- as.vector(result$t[, 1]) icc_ci_adjusted <- icc_ci_adjusted[!is.na(icc_ci_adjusted)] # validation check if (length(icc_ci_adjusted) > 0) { icc_ci_adjusted <- bayestestR::eti(icc_ci_adjusted, ci = ci) } else { icc_ci_adjusted <- NA } # CI for unadjusted ICC icc_ci_unadjusted <- as.vector(result$t[, 2]) icc_ci_unadjusted <- icc_ci_unadjusted[!is.na(icc_ci_unadjusted)] # validation check if (length(icc_ci_unadjusted) > 0) { icc_ci_unadjusted <- bayestestR::eti(icc_ci_unadjusted, ci = ci) } else { icc_ci_unadjusted <- NA } if ((all(is.na(icc_ci_adjusted)) || all(is.na(icc_ci_unadjusted))) && verbose) { insight::format_warning( "Could not compute confidence intervals for ICC. Try `ci_method = \"simple\"." ) } } out_ci <- data.frame( ICC_adjusted = c(CI_low = icc_ci_adjusted$CI_low, CI_high = icc_ci_adjusted$CI_high), ICC_conditional = c(CI_low = icc_ci_unadjusted$CI_low, CI_high = icc_ci_unadjusted$CI_high), ICC_unadjusted = c(CI_low = icc_ci_unadjusted$CI_low, CI_high = icc_ci_unadjusted$CI_high) ) out <- rbind(out, out_ci) attr(out, "ci") <- ci } class(out) <- c("icc", "data.frame") } out } #' @param ... Arguments passed down to `brms::posterior_predict()`. #' @inheritParams icc #' @rdname icc #' @export variance_decomposition <- function(model, re_formula = NULL, robust = TRUE, ci = 0.95, ...) { if (!inherits(model, "brmsfit")) { insight::format_error("Only models from package `brms` are supported.") } mi <- insight::model_info(model) # for multivariate response models, we need a more complicated check... if (insight::is_multivariate(model)) { resp <- insight::find_response(model) is.mixed <- unlist(lapply(resp, function(i) mi[[i]]$is_mixed), use.names = FALSE) if (!any(is.mixed)) { insight::format_warning("`model` has no random effects.") return(NULL) } } else if (!insight::is_mixed_model(model)) { insight::format_warning("`model` has no random effects.") return(NULL) } insight::check_if_installed("brms") PPD <- brms::posterior_predict(model, re_formula = re_formula, summary = FALSE, ...) var_total <- apply(PPD, MARGIN = 1, FUN = stats::var) PPD_0 <- brms::posterior_predict(model, re_formula = NA, summary = FALSE, ...) var_rand_intercept <- apply(PPD_0, MARGIN = 1, FUN = stats::var) if (robust) { fun <- get("median", asNamespace("stats")) } else { fun <- get("mean", asNamespace("base")) } var_icc <- var_rand_intercept / var_total var_residual <- var_total - var_rand_intercept ci_icc <- rev(1 - stats::quantile(var_rand_intercept / var_total, probs = c((1 - ci) / 2, (1 + ci) / 2))) result <- structure( class = "icc_decomposed", list( ICC_decomposed = 1 - fun(var_icc), ICC_CI = ci_icc ) ) attr(result, "var_rand_intercept") <- fun(var_rand_intercept) attr(result, "var_residual") <- fun(var_residual) attr(result, "var_total") <- fun(var_total) attr(result, "ci.var_rand_intercept") <- bayestestR::ci(var_rand_intercept, ci = ci) attr(result, "ci.var_residual") <- bayestestR::ci(var_residual, ci = ci) attr(result, "ci.var_total") <- bayestestR::ci(var_total, ci = ci) attr(result, "ci") <- ci attr(result, "re.form") <- re_formula attr(result, "ranef") <- model$ranef$group[1] # remove data attr(attr(result, "ci.var_rand_intercept"), "data") <- NULL attr(attr(result, "ci.var_residual"), "data") <- NULL attr(attr(result, "ci.var_total"), "data") <- NULL result } # methods ------------------------------ #' @export as.data.frame.icc <- function(x, row.names = NULL, optional = FALSE, ...) { data.frame( ICC_adjusted = x$ICC_adjusted, ICC_unadjusted = x$ICC_unadjusted, stringsAsFactors = FALSE, row.names = row.names, optional = optional, ... ) } #' @export print.icc <- function(x, digits = 3, ...) { insight::print_color("# Intraclass Correlation Coefficient\n\n", "blue") out <- c( sprintf(" Adjusted ICC: %.*f", digits, x$ICC_adjusted[1]), sprintf(" Unadjusted ICC: %.*f", digits, x$ICC_unadjusted[1]) ) # add CI if (length(x$ICC_adjusted) == 3) { out[1] <- .add_r2_ci_to_print(out[1], x$ICC_adjusted[2], x$ICC_adjusted[3], digits = digits) } if (length(x$ICC_unadjusted) == 3) { out[2] <- .add_r2_ci_to_print(out[2], x$ICC_unadjusted[2], x$ICC_unadjusted[3], digits = digits) } # separate lines for multiple R2 out <- paste0(out, collapse = "\n") cat(out) cat("\n") invisible(x) } #' @export print.icc_by_group <- function(x, digits = 3, ...) { insight::print_color("# ICC by Group\n\n", "blue") cat(insight::export_table(x, digits = digits)) invisible(x) } #' @export print.icc_decomposed <- function(x, digits = 2, ...) { # print model information cat("# Random Effect Variances and ICC\n\n") reform <- attr(x, "re.form", exact = TRUE) if (is.null(reform)) { reform <- "all random effects" } else { reform <- insight::safe_deparse(reform) } cat(sprintf("Conditioned on: %s\n\n", reform)) prob <- attr(x, "ci", exact = TRUE) cat(insight::print_color("## Variance Ratio (comparable to ICC)\n", "blue")) icc.val <- sprintf("%.*f", digits, x$ICC_decomposed) ci.icc.lo <- sprintf("%.*f", digits, x$ICC_CI[1]) ci.icc.hi <- sprintf("%.*f", digits, x$ICC_CI[2]) # ICC cat(sprintf( "Ratio: %s CI %i%%: [%s %s]\n", icc.val, as.integer(round(prob * 100)), ci.icc.lo, ci.icc.hi )) cat(insight::print_color("\n## Variances of Posterior Predicted Distribution\n", "blue")) null.model <- sprintf("%.*f", digits, attr(x, "var_rand_intercept", exact = TRUE)) ci.null <- attr(x, "ci.var_rand_intercept", exact = TRUE) ci.null.lo <- sprintf("%.*f", digits, ci.null$CI_low) ci.null.hi <- sprintf("%.*f", digits, ci.null$CI_high) full.model <- sprintf("%.*f", digits, attr(x, "var_total", exact = TRUE)) ci.full <- attr(x, "ci.var_total", exact = TRUE) ci.full.lo <- sprintf("%.*f", digits, ci.full$CI_low) ci.full.hi <- sprintf("%.*f", digits, ci.full$CI_high) ml <- max(nchar(null.model), nchar(full.model)) ml.ci <- max(nchar(ci.full.lo), nchar(ci.null.lo)) mh.ci <- max(nchar(ci.full.hi), nchar(ci.null.hi)) # Conditioned on fixed effects cat(sprintf( "Conditioned on fixed effects: %*s CI %i%%: [%*s %*s]\n", ml, null.model, as.integer(round(prob * 100)), ml.ci, ci.null.lo, mh.ci, ci.null.hi )) # Conditioned on random effects cat(sprintf( "Conditioned on rand. effects: %*s CI %i%%: [%*s %*s]\n", ml, full.model, as.integer(round(prob * 100)), ml.ci, ci.full.lo, mh.ci, ci.full.hi )) cat(insight::print_color("\n## Difference in Variances\n", "red")) res <- sprintf("%.*f", digits, attr(x, "var_residual", exact = TRUE)) ci.res <- attr(x, "ci.var_residual", exact = TRUE) ci.res.lo <- sprintf("%.*f", digits, ci.res$CI_low) ci.res.hi <- sprintf("%.*f", digits, ci.res$CI_high) # ICC cat(sprintf( "Difference: %s CI %i%%: [%s %s]\n", res, as.integer(round(prob * 100)), ci.res.lo, ci.res.hi )) invisible(x) } # helper ----------------- .compute_random_vars <- function(model, tolerance, components = c("var.fixed", "var.random", "var.residual"), name_fun = "icc()", name_full = "ICC", verbose = TRUE) { vars <- tryCatch( { insight::get_variance(model, name_fun = name_fun, name_full = name_full, tolerance = tolerance, verbose = verbose ) }, error = function(e) { if (inherits(e, c("simpleError", "error")) && verbose) { insight::print_color(e$message, "red") cat("\n") } NULL } ) if (is.null(vars) || all(is.na(vars))) { return(NA) } # check if we have successfully computed all variance components... check_elements <- sapply(components, function(.i) !is.null(vars[[.i]])) if (!all(check_elements)) { return(NA) } vars } # bootstrapping ------------------ # bootstrapping using package "boot" .boot_icc_fun <- function(data, indices, model, tolerance) { d <- data[indices, ] # allows boot to select sample fit <- suppressWarnings(suppressMessages(stats::update(model, data = d))) vars <- .compute_random_vars(fit, tolerance, verbose = FALSE) if (is.null(vars) || all(is.na(vars))) { return(c(NA, NA)) } c( vars$var.random / (vars$var.random + vars$var.residual), vars$var.random / (vars$var.fixed + vars$var.random + vars$var.residual) ) } # bootstrapping using "lme4::bootMer" .boot_icc_fun_lme4 <- function(model) { vars <- .compute_random_vars(model, tolerance = 1e-05, verbose = FALSE) if (is.null(vars) || all(is.na(vars))) { return(c(NA, NA)) } c( vars$var.random / (vars$var.random + vars$var.residual), vars$var.random / (vars$var.fixed + vars$var.random + vars$var.residual) ) } # prepare arguments for "lme4::bootMer" .do_lme4_bootmer <- function(model, .boot_fun, iterations, dots) { insight::check_if_installed(c("lme4", "boot")) args <- list( model, .boot_fun, nsim = iterations, type = "parametric", parallel = "no", use.u = FALSE, ncpus = 1 ) # add/overwrite dot-args if (!is.null(dots[["use.u"]])) { args$use.u <- dots[["use.u"]] } if (!is.null(dots[["re.form"]])) { args$re.form <- dots[["re.form"]] } if (!is.null(dots[["type"]])) { args$type <- dots[["type"]] if (args$type == "semiparametric") { args$use.u <- TRUE } } if (!is.null(dots[["parallel"]])) { args$parallel <- dots[["parallel"]] } if (!is.null(dots[["ncpus"]])) { args$ncpus <- dots[["ncpus"]] } # bootsrap do.call(lme4::bootMer, args) } # main function for bootstrapping .bootstrap_icc <- function(model, iterations, tolerance, ci_method = NULL, ...) { if (inherits(model, c("merMod", "lmerMod", "glmmTMB")) && !identical(ci_method, "boot")) { result <- .do_lme4_bootmer( model, .boot_icc_fun_lme4, iterations, dots = list(...) ) } else { insight::check_if_installed("boot") result <- boot::boot( data = insight::get_data(model, verbose = FALSE), statistic = .boot_icc_fun, R = iterations, sim = "ordinary", model = model, tolerance = tolerance ) } result } .analytical_icc_ci <- function(model, ci = 0.95, fun = "icc", ...) { alpha <- 1 - ci n <- insight::n_obs(model) df_int <- if (insight::has_intercept(model)) { 1 } else { 0 } model_rank <- tryCatch( { if (!is.null(model$rank)) { model$rank - df_int } else { insight::n_parameters(model) - df_int } }, error = function(e) insight::n_parameters(model) - df_int ) if (identical(fun, "icc")) { model_icc <- icc(model, ci = NULL, verbose = FALSE, ...) } else { model_icc <- r2_nakagawa(model, ci = NULL, verbose = FALSE, ...) } out <- lapply(model_icc, function(.icc) { ci_low <- stats::uniroot( .pRsq, c(0.00001, 0.99999), R2_obs = as.vector(.icc), p = model_rank, nobs = n, alpha = 1 - alpha / 2 )$root ci_high <- stats::uniroot( .pRsq, c(0.00001, 0.99999), R2_obs = as.vector(.icc), p = model_rank, nobs = n, alpha = alpha / 2 )$root data.frame(CI_low = ci_low, CI_high = ci_high) }) names(out) <- names(model_icc) out } performance/R/check_htest.R0000644000176200001440000001467414325226352015403 0ustar liggesusers#' @export check_normality.htest <- function(x, ...) { data <- insight::get_data(x) if (is.null(data)) { insight::format_error( "Cannot check assumptions - Unable to retrieve data from `htest` object." ) } method <- x[["method"]] if (grepl("Welch", method, fixed = TRUE) || grepl("F test to compare two variances", method, fixed = TRUE)) { m1 <- stats::lm(data[[1]] ~ 1) m2 <- stats::lm(data[[2]] ~ 1) out <- check_normality(m1) out[2] <- check_normality(m2)[1] attr(out, "units") <- c("Group1", "Group2") } else if (grepl("Two Sample t-test", method, fixed = TRUE)) { m <- stats::lm( formula = Value ~ factor(Name), data = datawizard::data_to_long(data) ) out <- check_normality(m) } else if (grepl("One Sample t-test", method, fixed = TRUE)) { m <- stats::lm(data[[1]] ~ 1) out <- check_normality(m) } else if (grepl("Paired t-test", method, fixed = TRUE)) { d <- data[[1]] - data[[2]] m <- stats::lm(d ~ 1) out <- check_normality(m) } else if (grepl("One-way analysis of means (not assuming equal variances)", method, fixed = TRUE)) { data <- split(data, data[[2]]) outs <- lapply(data, function(d) { check_normality(stats::lm(d[[1]] ~ 1)) }) out <- unlist(outs) attributes(out) <- attributes(outs[[1]]) attr(out, "units") <- paste0("Group", seq_along(outs)) } else if (grepl("One-way analysis of means", method, fixed = TRUE)) { m <- stats::aov(data[[1]] ~ factor(data[[2]])) out <- check_normality(m) } else if (grepl("Pearson's product-moment correlation", method, fixed = TRUE)) { out <- .MVN_hz(data)[["p value"]] class(out) <- c("check_normality", "see_check_normality", "numeric") attr(out, "type") <- "residuals" } else if (grepl("Pearson's Chi-squared test", method, fixed = TRUE) || grepl("Chi-squared test for given probabilities", method, fixed = TRUE)) { out <- c( "5" = all(x$expected >= 5), "10" = all(x$expected >= 10) ) class(out) <- c("check_normality_binom", "logical") attr(out, "object_name") <- substitute(x) return(out) } else { insight::format_error( "This `htest` is not supported (or this assumption is not required for this test)." ) } attr(out, "object_name") <- substitute(x) attr(out, "data") <- NULL out } #' @export check_homogeneity.htest <- function(x, ...) { data <- insight::get_data(x) if (is.null(data)) { insight::format_error( "Cannot check assumptions - Unable to retrieve data from `htest` object." ) } method <- x[["method"]] if (grepl("(not assuming equal variances)", method, fixed = TRUE) || grepl("Welch", method, fixed = TRUE)) { insight::format_error("Test does not assume homogeneity. No need to test this assumption.") } if (grepl("Two Sample t-test", method, fixed = TRUE)) { m <- stats::lm( formula = Value ~ factor(Name), data = datawizard::data_to_long(data) ) } else if (grepl("One-way analysis of means", method, fixed = TRUE)) { m <- stats::aov(stats::reformulate(names(data)[2], response = names(data)[1]), data = data) } else { insight::format_error( "This `htest` is not supported (or this assumption is not required for this test)." ) } out <- check_homogeneity(m, ...) attr(out, "object_name") <- substitute(x) attr(out, "data") <- NULL out } #' @export check_symmetry.htest <- function(x, ...) { data <- insight::get_data(x) if (is.null(data)) { insight::format_error( "Cannot check assumptions - Unable to retrieve data from `htest` object." ) } method <- x[["method"]] if (grepl("signed rank", method, fixed = TRUE)) { if (ncol(data) > 1) { out <- check_symmetry(data[[1]] - data[[2]]) } else { out <- check_symmetry(data[[1]]) } } else { insight::format_error( "This `htest` is not supported (or this assumption is not required for this test)." ) } attr(out, "object_name") <- substitute(x) out } # check_model.htest <- function() { # # } # Print ------------------------------------------------------------------- #' @export print.check_normality_binom <- function(x, ...) { if (x["10"]) { insight::print_color(insight::format_message( "OK: All cells in the expected table have more than 10 observations.\n" ), "green") } else if (x["5"]) { insight::print_color(insight::format_message( "Warning: All cells in the expected table have more than 5 observations, but some have less than 10.\n" ), "yellow") } else { insight::print_color(insight::format_message( "Warning: Some cells in the expected table have less than 5 observations.\n" ), "red") } return(invisible(x)) } # Utils ------------------------------------------------------------------- .MVN_hz <- function(data, cov = TRUE, tol = 1e-25) { # from MVN:::hz dataframe <- as.data.frame(data) dname <- insight::safe_deparse_symbol(data) data <- data[stats::complete.cases(data), ] data <- as.matrix(data) n <- dim(data)[1] p <- dim(data)[2] data.org <- data if (cov) { S <- ((n - 1) / n) * cov(data) } else { S <- cov(data) } dif <- scale(data, scale = FALSE) Dj <- diag(dif %*% solve(S, tol = tol) %*% t(dif)) Y <- data %*% solve(S, tol = tol) %*% t(data) Djk <- -2 * t(Y) + matrix(diag(t(Y))) %*% matrix(c(rep(1, n)), 1, n) + matrix(c(rep(1, n)), n, 1) %*% diag(t(Y)) b <- 1 / (sqrt(2)) * ((2 * p + 1) / 4)^(1 / (p + 4)) * (n^(1 / (p + 4))) if (qr(S)$rank == p) { HZ <- n * (1 / (n^2) * sum(sum(exp(-(b^2) / 2 * Djk))) - 2 * ((1 + (b^2))^(-p / 2)) * (1 / n) * (sum(exp(-((b^2) / (2 * (1 + (b^2)))) * Dj))) + ((1 + (2 * (b^2)))^(-p / 2))) } else { HZ <- n * 4 } wb <- (1 + b^2) * (1 + 3 * b^2) a <- 1 + 2 * b^2 mu <- 1 - a^(-p / 2) * (1 + p * b^2 / a + (p * (p + 2) * (b^4)) / (2 * a^2)) si2 <- 2 * (1 + 4 * b^2)^(-p / 2) + 2 * a^(-p) * (1 + (2 * p * b^4) / a^2 + (3 * p * (p + 2) * b^8) / (4 * a^4)) - 4 * wb^(-p / 2) * (1 + (3 * p * b^4) / (2 * wb) + (p * (p + 2) * b^8) / (2 * wb^2)) pmu <- log(sqrt(mu^4 / (si2 + mu^2))) psi <- sqrt(log((si2 + mu^2) / mu^2)) pValue <- 1 - stats::plnorm(HZ, pmu, psi) MVN <- ifelse(pValue > 0.05, "YES", "NO") cbind.data.frame(Test = "Henze-Zirkler", HZ = HZ, `p value` = pValue, MVN = MVN) } performance/R/r2_zeroinflated.R0000644000176200001440000000451014327475467016213 0ustar liggesusers#' @title R2 for models with zero-inflation #' @name r2_zeroinflated #' #' @description #' Calculates R2 for models with zero-inflation component, including mixed #' effects models. #' #' @param model A model. #' @param method Indicates the method to calculate R2. See 'Details'. May be #' abbreviated. #' #' @return For the default-method, a list with the R2 and adjusted R2 values. #' For `method = "correlation"`, a named numeric vector with the #' correlation-based R2 value. #' #' @details #' The default-method calculates an R2 value based on the residual variance #' divided by the total variance. For `method = "correlation"`, R2 is a #' correlation-based measure, which is rather crude. It simply computes the #' squared correlation between the model's actual and predicted response. #' #' @examples #' \donttest{ #' if (require("pscl")) { #' data(bioChemists) #' model <- zeroinfl( #' art ~ fem + mar + kid5 + ment | kid5 + phd, #' data = bioChemists #' ) #' #' r2_zeroinflated(model) #' } #' } #' @export r2_zeroinflated <- function(model, method = c("default", "correlation")) { method <- match.arg(method) mi <- insight::model_info(model, verbose = FALSE) if (!mi$is_zero_inflated) { insight::format_warning("Model has no zero-inflation component.") } if (method == "default") { .r2_zi_default(model) } else { .r2_zi_correlation(model) } } .r2_zi_correlation <- function(model) { r2_zi <- stats::cor( insight::get_response(model, verbose = FALSE), stats::predict(model, type = "response") )^2 names(r2_zi) <- "R2 for ZI-models" r2_zi } .r2_zi_default <- function(model) { n <- insight::n_obs(model) k <- length(insight::find_parameters(model)[["conditional"]]) y <- insight::get_response(model, verbose = FALSE) # pred <- stats::predict(model, type = "response") var_fixed <- sum((stats::fitted(model) - mean(y))^2) var_resid <- sum(stats::residuals(model, type = "pearson")^2) r2_zi <- var_fixed / (var_resid + var_fixed) r2_zi_adj <- 1 - (1 - r2_zi) * (n - 1) / (n - k - 1) out <- list(R2 = r2_zi, R2_adjusted = r2_zi_adj) names(out$R2) <- "R2" names(out$R2_adjusted) <- "adjusted R2" attr(out, "model_type") <- "Zero-Inflated and Hurdle" structure(class = "r2_generic", out) } performance/R/performance_aicc.R0000644000176200001440000002273314401657351016374 0ustar liggesusers#' @title Compute the AIC or second-order AIC #' @name performance_aicc #' #' @description #' #' Compute the AIC or the second-order Akaike's information criterion (AICc). #' `performance_aic()` is a small wrapper that returns the AIC, however, for #' models with a transformed response variable, `performance_aic()` returns the #' corrected AIC value (see 'Examples'). It is a generic function that also #' works for some models that don't have a AIC method (like Tweedie models). #' `performance_aicc()` returns the second-order (or "small sample") AIC that #' incorporates a correction for small sample sizes. #' #' @param x A model object. #' @param estimator Only for linear models. Corresponds to the different #' estimators for the standard deviation of the errors. If `estimator = "ML"` #' (default), the scaling is done by n (the biased ML estimator), which is #' then equivalent to using `AIC(logLik())`. Setting it to `"REML"` will give #' the same results as `AIC(logLik(..., REML = TRUE))`. #' @param verbose Toggle warnings. #' @param ... Currently not used. #' #' @return Numeric, the AIC or AICc value. #' #' @details `performance_aic()` correctly detects transformed response and, #' unlike `stats::AIC()`, returns the "corrected" AIC value on the original #' scale. To get back to the original scale, the likelihood of the model is #' multiplied by the Jacobian/derivative of the transformation. #' #' @references #' - Akaike, H. (1973) Information theory as an extension of the maximum #' likelihood principle. In: Second International Symposium on Information #' Theory, pp. 267-281. Petrov, B.N., Csaki, F., Eds, Akademiai Kiado, Budapest. #' #' - Hurvich, C. M., Tsai, C.-L. (1991) Bias of the corrected AIC criterion #' for underfitted regression and time series models. Biometrika 78, 499–509. #' #' @examples #' m <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars) #' AIC(m) #' performance_aicc(m) #' #' # correct AIC for models with transformed response variable #' data("mtcars") #' mtcars$mpg <- floor(mtcars$mpg) #' model <- lm(log(mpg) ~ factor(cyl), mtcars) #' #' # wrong AIC, not corrected for log-transformation #' AIC(model) #' #' # performance_aic() correctly detects transformed response and #' # returns corrected AIC #' performance_aic(model) #' @export performance_aicc <- function(x, ...) { UseMethod("performance_aicc") } #' @rdname performance_aicc #' @export performance_aic <- function(x, ...) { UseMethod("performance_aic") } # default ------------------------------------------------- #' @rdname performance_aicc #' @export performance_aic.default <- function(x, estimator = "ML", verbose = TRUE, ...) { # check for valid input .is_model_valid(x) info <- list(...)$model_info if (is.null(info)) { info <- suppressWarnings(insight::model_info(x, verbose = FALSE)) } # check ML estimator REML <- identical(estimator, "REML") if (isTRUE(list(...)$REML)) REML <- TRUE # special handling for tweedie if (info$family == "Tweedie") { insight::check_if_installed("tweedie") aic <- suppressMessages(tweedie::AICtweedie(x)) } else { # all other models... aic <- .safe( stats::AIC(insight::get_loglikelihood(x, check_response = TRUE, REML = REML, verbose = verbose)) ) # when `get_loglikelihood()` does not work, `stats::AIC` sometimes still works (e.g., `fixest`) if (is.null(aic)) { aic <- .safe(stats::AIC(x)) } } aic } # mixed models ------------------------------------ #' @export performance_aic.lmerMod <- function(x, estimator = "REML", verbose = TRUE, ...) { REML <- identical(estimator, "REML") if (isFALSE(list(...)$REML)) REML <- FALSE .safe( stats::AIC(insight::get_loglikelihood(x, check_response = TRUE, REML = REML, verbose = verbose)) ) } # VGAM models ------------------------------------ #' @export performance_aic.vgam <- function(x, ...) { insight::check_if_installed("VGAM") VGAM::AIC(x) } #' @export performance_aic.vglm <- performance_aic.vgam # Survey models -------------------------------------- #' @export performance_aic.svyglm <- function(x, ...) { aic <- .safe(stats::AIC(x)[["AIC"]]) .adjust_ic_jacobian(x, aic) } #' @export performance_aic.svycoxph <- performance_aic.svyglm # mfx models -------------------------------------- #' @export performance_aic.logitor <- function(x, ...) { performance_aic(x$fit, ...) } # styler: off #' @export performance_aic.logitmfx <- performance_aic.logitor #' @export performance_aic.probitmfx <- performance_aic.logitor #' @export performance_aic.negbinirr <- performance_aic.logitor #' @export performance_aic.negbinmfx <- performance_aic.logitor #' @export performance_aic.betaor <- performance_aic.logitor #' @export performance_aic.betamfx <- performance_aic.logitor #' @export performance_aic.poissonirr <- performance_aic.logitor #' @export performance_aic.poissonmfx <- performance_aic.logitor #' @export # styler: on # Other models -------------------------------------- #' @export performance_aic.bayesx <- function(x, ...) { out <- stats::AIC(x)[["AIC"]] .adjust_ic_jacobian(x, out) } # methods ------------------------------------------ #' @export AIC.bife <- function(object, ..., k = 2) { -2 * as.numeric(insight::get_loglikelihood(object)) + k * insight::get_df(object, type = "model") } # AICc ------------------------------------------ #' @export performance_aicc.default <- function(x, estimator = "ML", ...) { # check for valid input .is_model_valid(x) # check ML estimator REML <- identical(estimator, "REML") if (isTRUE(list(...)$REML)) REML <- TRUE n <- suppressWarnings(insight::n_obs(x)) ll <- insight::get_loglikelihood(x, check_response = TRUE, REML = REML, verbose = TRUE) k <- attr(ll, "df") -2 * as.vector(ll) + 2 * k * (n / (n - k - 1)) } #' @export performance_aicc.lmerMod <- function(x, estimator = "REML", ...) { REML <- identical(estimator, "REML") if (isFALSE(list(...)$REML)) REML <- FALSE n <- suppressWarnings(insight::n_obs(x)) ll <- insight::get_loglikelihood(x, check_response = TRUE, REML = REML, verbose = TRUE) k <- attr(ll, "df") -2 * as.vector(ll) + 2 * k * (n / (n - k - 1)) } #' @export performance_aicc.bife <- function(x, ...) { n <- suppressWarnings(insight::n_obs(x)) ll <- insight::get_loglikelihood(x, check_response = TRUE) nparam <- length(insight::find_parameters(x, effects = "fixed", flatten = TRUE)) k <- n - nparam -2 * as.vector(ll) + 2 * k * (n / (n - k - 1)) } #' @export performance_aicc.Arima <- performance_aicc.bife #' @export performance_aicc.vglm <- function(x, ...) { insight::check_if_installed("VGAM") VGAM::AICc(x) } #' @export performance_aicc.rma <- function(x, ...) { stats::AIC(x, correct = TRUE) } # jacobian / derivate for log models and other transformations ---------------- # this function adjusts any IC for models with transformed response variables .adjust_ic_jacobian <- function(model, ic) { response_transform <- insight::find_transformation(model) if (!is.null(ic) && !is.null(response_transform) && !identical(response_transform, "identity")) { adjustment <- .safe(.ll_analytic_adjustment(model, insight::get_weights(model, na_rm = TRUE))) if (!is.null(adjustment)) { ic <- ic - 2 * adjustment } } ic } # copied from `insight` .ll_analytic_adjustment <- function(x, model_weights = NULL) { tryCatch( { trans <- insight::find_transformation(x) if (trans == "identity") { .weighted_sum(log(insight::get_response(x)), w = model_weights) } else if (trans == "log") { .weighted_sum(log(1 / insight::get_response(x)), w = model_weights) } else if (trans == "log1p") { .weighted_sum(log(1 / (insight::get_response(x) + 1)), w = model_weights) } else if (trans == "log2") { .weighted_sum(log(1 / (insight::get_response(x) * log(2))), w = model_weights) } else if (trans == "log10") { .weighted_sum(log(1 / (insight::get_response(x) * log(10))), w = model_weights) } else if (trans == "exp") { .weighted_sum(insight::get_response(x), w = model_weights) } else if (trans == "expm1") { .weighted_sum((insight::get_response(x) - 1), w = model_weights) } else if (trans == "sqrt") { .weighted_sum(log(0.5 / sqrt(insight::get_response(x))), w = model_weights) } else { .ll_jacobian_adjustment(x, model_weights) } }, error = function(e) { NULL } ) } # this function calculates the adjustment for the log-likelihood of a model # with transformed response .ll_jacobian_adjustment <- function(model, weights = NULL) { tryCatch( { trans <- insight::get_transformation(model)$transformation .weighted_sum(log( diag(attr(with( insight::get_data(model, verbose = FALSE), stats::numericDeriv( expr = quote(trans( get(insight::find_response(model)) )), theta = insight::find_response(model) ) ), "gradient")) ), weights) }, error = function(e) { NULL } ) } .weighted_sum <- function(x, w = NULL, ...) { if (is.null(w)) { mean(x) * length(x) } else { stats::weighted.mean(x, w) * length(x) } } performance/R/r2_xu.R0000644000176200001440000000206614406527371014153 0ustar liggesusers#' @title Xu' R2 (Omega-squared) #' @name r2_xu #' #' @description Calculates Xu' Omega-squared value, a simple R2 equivalent for #' linear mixed models. #' #' @param model A linear (mixed) model. #' #' @return The R2 value. #' #' @details `r2_xu()` is a crude measure for the explained variance from #' linear (mixed) effects models, which is originally denoted as #' \ifelse{html}{\out{Ω2}}{\eqn{\Omega^2}}. #' #' @references #' Xu, R. (2003). Measuring explained variation in linear mixed effects models. #' Statistics in Medicine, 22(22), 3527–3541. \doi{10.1002/sim.1572} #' #' @examples #' model <- lm(Sepal.Length ~ Petal.Length + Species, data = iris) #' r2_xu(model) #' @export r2_xu <- function(model) { mi <- insight::model_info(model) if (!mi$is_linear) { insight::format_error("Xu's R2 is only applicable for linear models.") } .r2_xu <- 1 - stats::var(stats::residuals(model, verbose = FALSE)) / stats::var(insight::get_response(model, verbose = FALSE)) names(.r2_xu) <- "Xu's R2" .r2_xu } performance/R/format.R0000644000176200001440000000154214321210723014364 0ustar liggesusers#' @export format.compare_performance <- function(x, digits = 2, ...) { # if we have ranking, add score and remove incomplete indices in print if ("Performance_Score" %in% colnames(x)) { x$Performance_Score <- insight::format_value(x$Performance_Score, as_percent = TRUE) x <- x[!sapply(x, anyNA)] } # format weighted ICs weighted_ics <- endsWith(colnames(x), "_wt") if (any(weighted_ics)) { x[weighted_ics] <- lapply(x[weighted_ics], insight::format_bf, name = NULL, exact = TRUE) } if ("BF" %in% colnames(x)) { x$BF[is.na(x$BF)] <- 1 # x$BF <- insight::format_bf(x$BF, exact = TRUE) } insight::format_table(x, digits = digits, ...) } #' @export format.performance_model <- function(x, digits = 2, ...) { # format p-values for meta-analysis insight::format_table(x, digits = digits, ...) } performance/NEWS.md0000644000176200001440000006051114517473614013670 0ustar liggesusers# performance 0.10.8 ## Changes * Changed behaviour of `check_predictions()` for models from binomial family, to get comparable plots for different ways of outcome specification. Now, if the outcome is a proportion, or defined as matrix of trials and successes, the produced plots are the same (because the models should be the same, too). ## Bug fixes * Fixed CRAN check errors. * Fixed issue with `binned_residuals()` for models with binomial family, where the outcome was a proportion. # performance 0.10.7 ## Breaking changes * `binned_residuals()` gains a few new arguments to control the residuals used for the test, as well as different options to calculate confidence intervals (namely, `ci_type`, `residuals`, `ci` and `iterations`). The default values to compute binned residuals have changed. Default residuals are now "deviance" residuals (and no longer "response" residuals). Default confidence intervals are now "exact" intervals (and no longer based on Gaussian approximation). Use `ci_type = "gaussian"` and `residuals = "response"` to get the old defaults. ## Changes to functions * `binned_residuals()` - like `check_model()` - gains a `show_dots` argument to show or hide data points that lie inside error bounds. This is particular useful for models with many observations, where generating the plot would be very slow. # performance 0.10.6 ## General * Support for `nestedLogit` models. ## Changes to functions * `check_outliers()` for method `"ics"` now detects number of available cores for parallel computing via the `"mc.cores"` option. This is more robust than the previous method, which used `parallel::detectCores()`. Now you should set the number of cores via `options(mc.cores = 4)`. ## Bug fixes * Fixed issues is `check_model()` for models that used data sets with variables of class `"haven_labelled"`. # performance 0.10.5 ## Changes to functions * More informative message for `test_*()` functions that "nesting" only refers to fixed effects parameters and currently ignores random effects when detecting nested models. * `check_outliers()` for `"ICS"` method is now more stable and less likely to fail. * `check_convergence()` now works for *parsnip* `_glm` models. ## Bug fixes * `check_collinearity()` did not work for hurdle- or zero-inflated models of package *pscl* when model had no explicitly defined formula for the zero-inflation model. # performance 0.10.4 ## Changes to functions * `icc()` and `r2_nakagawa()` gain a `ci_method` argument, to either calculate confidence intervals using `boot::boot()` (instead of `lmer::bootMer()`) when `ci_method = "boot"` or analytical confidence intervals (`ci_method = "analytical"`). Use `ci_method = "boot"` when the default method fails to compute confidence intervals and use `ci_method = "analytical"` if bootstrapped intervals cannot be calculated at all. Note that the default computation method is preferred. * `check_predictions()` accepts a `bandwidth` argument (smoothing bandwidth), which is passed down to the `plot()` methods density-estimation. * `check_predictions()` gains a `type` argument, which is passed down to the `plot()` method to change plot-type (density or discrete dots/intervals). By default, `type` is set to `"default"` for models without discrete outcomes, and else `type = "discrete_interval"`. * `performance_accuracy()` now includes confidence intervals, and reports those by default (the standard error is no longer reported, but still included). ## Bug fixes * Fixed issue in `check_collinearity()` for _fixest_ models that used `i()` to create interactions in formulas. # performance 0.10.3 ## New functions * `item_discrimination()`, to calculate the discrimination of a scale's items. ## Support for new models * `model_performance()`, `check_overdispersion()`, `check_outliers()` and `r2()` now work with objects of class `fixest_multi` (@etiennebacher, #554). * `model_performance()` can now return the "Weak instruments" statistic and p-value for models of class `ivreg` with `metrics = "weak_instruments"` (@etiennebacher, #560). * Support for `mclogit` models. ## Changes to functions * `test_*()` functions now automatically fit a null-model when only one model objects was provided for testing multiple models. * Warnings in `model_performance()` for unsupported objects of class `BFBayesFactor` can now be suppressed with `verbose = FALSE`. * `check_predictions()` no longer fails with issues when `re_formula = NULL` for mixed models, but instead gives a warning and tries to compute posterior predictive checks with `re_formuka = NA`. * `check_outliers()` now also works for meta-analysis models from packages *metafor* and *meta*. * `plot()` for `performance::check_model()` no longer produces a normal QQ plot for GLMs. Instead, it now shows a half-normal QQ plot of the absolute value of the standardized deviance residuals. ## Bug fixes * Fixed issue in `print()` method for `check_collinearity()`, which could mix up the correct order of parameters. # performance 0.10.2 ## General * Revised usage of `insight::get_data()` to meet forthcoming changes in the _insight_ package. ## Changes to functions * `check_collinearity()` now accepts `NULL` for the `ci` argument. ## Bug fixes * Fixed issue in `item_difficulty()` with detecting the maximum values of an item set. Furthermore, `item_difficulty()` gets a `maximum_value` argument in case no item contains the maximum value due to missings. # performance 0.10.1 ## General * Minor improvements to the documentation. ## Changes to functions * `icc()` and `r2_nakagawa()` get `ci` and `iterations` arguments, to compute confidence intervals for the ICC resp. R2, based on bootstrapped sampling. * `r2()` gets `ci`, to compute (analytical) confidence intervals for the R2. * The model underlying `check_distribution()` was now also trained to detect cauchy, half-cauchy and inverse-gamma distributions. * `model_performance()` now allows to include the ICC for Bayesian models. ## Bug fixes * `verbose` didn't work for `r2_bayes()` with `BFBayesFactor` objects. * Fixed issues in `check_model()` for models with convergence issues that lead to `NA` values in residuals. * Fixed bug in `check_outliers` whereby passing multiple elements to the threshold list generated an error (#496). * `test_wald()` now warns the user about inappropriate F test and calls `test_likelihoodratio()` for binomial models. * Fixed edge case for usage of `parellel::detectCores()` in `check_outliers()`. # performance 0.10.0 ## Breaking Change * The minimum needed R version has been bumped to `3.6`. * The alias `performance_lrt()` was removed. Use `test_lrt()` resp. `test_likelihoodratio()`. ## New functions * Following functions were moved from package *parameters* to *performance*: `check_sphericity_bartlett()`, `check_kmo()`, `check_factorstructure()` and `check_clusterstructure()`. ## Changes to functions * `check_normality()`, `check_homogeneity()` and `check_symmetry()` now works for `htest` objects. * Print method for `check_outliers()` changed significantly: now states the methods, thresholds, and variables used, reports outliers per variable (for univariate methods) as well as any observation flagged for several variables/methods. Includes a new optional ID argument to add along the row number in the output (@rempsyc #443). * `check_outliers()` now uses more conventional outlier thresholds. The `IQR` and confidence interval methods now gain improved distance scores that are continuous instead of discrete. ## Bug Fixes * Fixed wrong *z*-score values when using a vector instead of a data frame in `check_outliers()` (#476). * Fixed `cronbachs_alpha()` for objects from `parameters::principal_component()`. # performance 0.9.2 ## General * `print()` methods for `model_performance()` and `compare_performance()` get a `layout` argument, which can be `"horizontal"` (default) or `"vertical"`, to switch the layout of the printed table. * Improved speed performance for `check_model()` and some other `performance_*()` functions. * Improved support for models of class `geeglm`. ## Changes to functions * `check_model()` gains a `show_dots` argument, to show or hide data points. This is particular useful for models with many observations, where generating the plot would be very slow. ## Bug Fixes * Fixes wrong column names in `model_performance()` output for `kmeans` objects (#453) # performance 0.9.1 ## Breaking * The formerly "conditional" ICC in `icc()` is now named "unadjusted" ICC. ## New functions * `performance_cv()` for cross-validated model performance. ## Support for new models * Added support for models from package *estimator*. ## Changes to functions * `check_overdispersion()` gets a `plot()` method. * `check_outliers()` now also works for models of classes `gls` and `lme`. As a consequence, `check_model()` will no longer fail for these models. * `check_collinearity()` now includes the confidence intervals for the VIFs and tolerance values. * `model_performance()` now also includes within-subject R2 measures, where applicable. * Improved handling of random effects in `check_normality()` (i.e. when argument `effects = "random"`). ## Bug fixes * `check_predictions()` did not work for GLMs with matrix-response. * `check_predictions()` did not work for logistic regression models (i.e. models with binary response) from package *glmmTMB* * `item_split_half()` did not work when the input data frame or matrix only contained two columns. * Fixed wrong computation of `BIC` in `model_performance()` when models had transformed response values. * Fixed issues in `check_model()` for GLMs with matrix-response. # performance 0.9.0 ## New functions * `check_concurvity()`, which returns GAM concurvity measures (comparable to collinearity checks). ## Changes to functions ### Check functions * `check_predictions()`, `check_collinearity()` and `check_outliers()` now support (mixed) regression models from `BayesFactor`. * `check_zeroinflation()` now also works for `lme4::glmer.nb()` models. * `check_collinearity()` better supports GAM models. ### Test functions * `test_performance()` now calls `test_lrt()` or `test_wald()` instead of `test_vuong()` when package *CompQuadForm* is missing. * `test_performance()` and `test_lrt()` now compute the corrected log-likelihood when models with transformed response variables (such as log- or sqrt-transformations) are passed to the functions. ### Model performance functions * `performance_aic()` now corrects the AIC value for models with transformed response variables. This also means that comparing models using `compare_performance()` allows comparisons of AIC values for models with and without transformed response variables. * Also, `model_performance()` now corrects both AIC and BIC values for models with transformed response variables. ### Plotting and printing * The `print()` method for `binned_residuals()` now prints a short summary of the results (and no longer generates a plot). A `plot()` method was added to generate plots. * The `plot()` output for `check_model()` was revised: - For binomial models, the constant variance plot was omitted, and a binned residuals plot included. - The density-plot that showed normality of residuals was replaced by the posterior predictive check plot. ## Bug fixes * `model_performance()` for models from *lme4* did not report AICc when requested. * `r2_nakagawa()` messed up order of group levels when `by_group` was `TRUE`. # performance 0.8.0 ## Breaking Changes * The `ci`-level in `r2()` for Bayesian models now defaults to `0.95`, to be in line with the latest changes in the *bayestestR* package. * S3-method dispatch for `pp_check()` was revised, to avoid problems with the _bayesplot_ package, where the generic is located. ## General * Minor revisions to wording for messages from some of the check-functions. * `posterior_predictive_check()` and `check_predictions()` were added as aliases for `pp_check()`. ## New functions * `check_multimodal()` and `check_heterogeneity_bias()`. These functions will be removed from the _parameters_ packages in the future. ## Changes to functions * `r2()` for linear models can now compute confidence intervals, via the `ci` argument. ## Bug fixes * Fixed issues in `check_model()` for Bayesian models. * Fixed issue in `pp_check()` for models with transformed response variables, so now predictions and observed response values are on the same (transformed) scale. # performance 0.7.3 ## Changes to functions * `check_outliers()` has new `ci` (or `hdi`, `eti`) method to filter based on Confidence/Credible intervals. * `compare_performance()` now also accepts a list of model objects. * `performance_roc()` now also works for binomial models from other classes than *glm*. * Several functions, like `icc()` or `r2_nakagawa()`, now have an `as.data.frame()` method. * `check_collinearity()` now correctly handles objects from forthcoming *afex* update. # performance 0.7.2 ## New functions * `performance_mae()` to calculate the mean absolute error. ## Bug fixes * Fixed issue with `"data length differs from size of matrix"` warnings in examples in forthcoming R 4.2. * Fixed issue in `check_normality()` for models with sample size larger than 5.000 observations. * Fixed issue in `check_model()` for *glmmTMB* models. * Fixed issue in `check_collinearity()` for *glmmTMB* models with zero-inflation, where the zero-inflated model was an intercept-only model. # performance 0.7.1 ## New supported models * Add support for `model_fit` (*tidymodels*). * `model_performance` supports *kmeans* models. ## General * Give more informative warning when `r2_bayes()` for *BFBayesFactor* objects can't be calculated. * Several `check_*()` functions now return informative messages for invalid model types as input. * `r2()` supports `mhurdle` (*mhurdle*) models. * Added `print()` methods for more classes of `r2()`. * The `performance_roc()` and `performance_accuracy()` functions unfortunately had spelling mistakes in the output columns: *Sensitivity* was called *Sensivity* and *Specificity* was called *Specifity*. We think these are understandable mistakes :-) ## Changes to functions ### `check_model()` * `check_model()` gains more arguments, to customize plot appearance. * Added option to detrend QQ/PP plots in `check_model()`. ### `model_performance()` * The `metrics` argument from `model_performance()` and `compare_performance()` gains a `"AICc"` option, to also compute the 2nd order AIC. * `"R2_adj"` is now an explicit option in the `metrics` argument from `model_performance()` and `compare_performance()`. ### Other functions * The default-method for `r2()` now tries to compute an r-squared for all models that have no specific `r2()`-method yet, by using following formula: `1-sum((y-y_hat)^2)/sum((y-y_bar)^2))` * The column name `Parameter` in `check_collinearity()` is now more appropriately named `Term`. ## Bug fixes * `test_likelihoodratio()` now correctly sorts models with identical fixed effects part, but different other model parts (like zero-inflation). * Fixed incorrect computation of models from inverse-Gaussian families, or Gaussian families fitted with `glm()`. * Fixed issue in `performance_roc()` for models where outcome was not 0/1 coded. * Fixed issue in `performance_accuracy()` for logistic regression models when `method = "boot"`. * `cronbachs_alpha()` did not work for `matrix`-objects, as stated in the docs. It now does. # performance 0.7.0 ## General * Roll-back R dependency to R >= 3.4. ## Breaking Changes * `compare_performance()` doesn't return the models' Bayes Factors, now returned by `test_performance()` and `test_bf()`. ## New functions to test or compare models * `test_vuong()`, to compare models using Vuong's (1989) Test. * `test_bf()`, to compare models using Bayes factors. * `test_likelihoodratio()` as an alias for `performance_lrt()`. * `test_wald()`, as a rough approximation for the LRT. * `test_performance()`, to run the most relevant and appropriate tests based on the input. ## Changes to functions ### `performance_lrt()` * `performance_lrt()` get an alias `test_likelihoodratio()`. * Does not return AIC/BIC now (as they are not related to LRT *per se* and can be easily obtained with other functions). * Now contains a column with the difference in degrees of freedom between models. * Fixed column names for consistency. ### `model_performance()` * Added more diagnostics to models of class `ivreg`. ### Other functions * Revised computation of `performance_mse()`, to ensure that it's always based on response residuals. * `performance_aic()` is now more robust. ## Bug fixes * Fixed issue in `icc()` and `variance_decomposition()` for multivariate response models, where not all model parts contained random effects. * Fixed issue in `compare_performance()` with duplicated rows. * `check_collinearity()` no longer breaks for models with rank deficient model matrix, but gives a warning instead. * Fixed issue in `check_homogeneity()` for `method = "auto"`, which wrongly tested the response variable, not the residuals. * Fixed issue in `check_homogeneity()` for edge cases where predictor had non-syntactic names. # performance 0.6.1 ## General * `check_collinearity()` gains a `verbose` argument, to toggle warnings and messages. ## Bug fixes * Fixed examples, now using suggested packages only conditionally. # performance 0.6.0 ## General * `model_performance()` now supports `margins`, `gamlss`, `stanmvreg` and `semLme`. ## New functions * `r2_somers()`, to compute Somers' Dxy rank-correlation as R2-measure for logistic regression models. * `display()`, to print output from package-functions into different formats. `print_md()` is an alias for `display(format = "markdown")`. ## Changes to functions ### `model_performance()` * `model_performance()` is now more robust and doesn't fail if an index could not be computed. Instead, it returns all indices that were possible to calculate. * `model_performance()` gains a default-method that catches all model objects not previously supported. If model object is also not supported by the default-method, a warning is given. * `model_performance()` for metafor-models now includes the degrees of freedom for Cochran's Q. ### Other functions * `performance_mse()` and `performance_rmse()` now always try to return the (R)MSE on the response scale. * `performance_accuracy()` now accepts all types of linear or logistic regression models, even if these are not of class `lm` or `glm`. * `performance_roc()` now accepts all types of logistic regression models, even if these are not of class `glm`. * `r2()` for mixed models and `r2_nakagawa()` gain a `tolerance`-argument, to set the tolerance level for singularity checks when computing random effect variances for the conditional r-squared. ## Bug fixes * Fixed issue in `icc()` introduced in the last update that make `lme`-models fail. * Fixed issue in `performance_roc()` for models with factors as response. # performance 0.5.1 ## Breaking changes * Column names for `model_performance()` and `compare_performance()` were changed to be in line with the _easystats_ naming convention: `LOGLOSS` is now `Log_loss`, `SCORE_LOG` is `Score_log` and `SCORE_SPHERICAL` is now `Score_spherical`. ## New functions * `r2_posterior()` for Bayesian models to obtain posterior distributions of R-squared. ## Changes to functions * `r2_bayes()` works with Bayesian models from `BayesFactor` ( #143 ). * `model_performance()` works with Bayesian models from `BayesFactor` ( #150 ). * `model_performance()` now also includes the residual standard deviation. * Improved formatting for Bayes factors in `compare_performance()`. * `compare_performance()` with `rank = TRUE` doesn't use the `BF` values when `BIC` are present, to prevent "double-dipping" of the BIC values (#144). * The `method` argument in `check_homogeneity()` gains a `"levene"` option, to use Levene's Test for homogeneity. ## Bug fixes * Fix bug in `compare_performance()` when `...` arguments were function calls to regression objects, instead of direct function calls. # performance 0.5.0 ## General * `r2()` and `icc()` support `semLME` models (package *smicd*). * `check_heteroscedasticity()` should now also work with zero-inflated mixed models from *glmmTMB* and *GLMMadpative*. * `check_outliers()` now returns a logical vector. Original numerical vector is still accessible via `as.numeric()`. ## New functions * `pp_check()` to compute posterior predictive checks for frequentist models. ## Bug fixes * Fixed issue with incorrect labeling of groups from `icc()` when `by_group = TRUE`. * Fixed issue in `check_heteroscedasticity()` for mixed models where sigma could not be calculated in a straightforward way. * Fixed issues in `check_zeroinflation()` for `MASS::glm.nb()`. * Fixed CRAN check issues. # performance 0.4.8 ## General * Removed suggested packages that have been removed from CRAN. ## Changes to functions * `icc()` now also computes a "classical" ICC for `brmsfit` models. The former way of calculating an "ICC" for `brmsfit` models is now available as new function called `variance_decomposition()`. ## Bug fixes * Fix issue with new version of *bigutilsr* for `check_outliers()`. * Fix issue with model order in `performance_lrt()`. # performance 0.4.7 ## General * Support for models from package *mfx*. ## Changes to functions * `model_performance.rma()` now includes results from heterogeneity test for meta-analysis objects. * `check_normality()` now also works for mixed models (with the limitation that studentized residuals are used). * `check_normality()` gets an `effects`-argument for mixed models, to check random effects for normality. ## Bug fixes * Fixed issue in `performance_accuracy()` for binomial models when response variable had non-numeric factor levels. * Fixed issues in `performance_roc()`, which printed 1 - AUC instead of AUC. # performance 0.4.6 ## General * Minor revisions to `model_performance()` to meet changes in *mlogit* package. * Support for `bayesx` models. ## Changes to functions * `icc()` gains a `by_group` argument, to compute ICCs per different group factors in mixed models with multiple levels or cross-classified design. * `r2_nakagawa()` gains a `by_group` argument, to compute explained variance at different levels (following the variance-reduction approach by Hox 2010). * `performance_lrt()` now works on *lavaan* objects. ## Bug fixes * Fix issues in some functions for models with logical dependent variable. * Fix bug in `check_itemscale()`, which caused multiple computations of skewness statistics. * Fix issues in `r2()` for *gam* models. # performance 0.4.5 ## General * `model_performance()` and `r2()` now support *rma*-objects from package *metafor*, *mlm* and *bife* models. ## Changes to functions * `compare_performance()` gets a `bayesfactor` argument, to include or exclude the Bayes factor for model comparisons in the output. * Added `r2.aov()`. ## Bug fixes * Fixed issue in `performance_aic()` for models from package *survey*, which returned three different AIC values. Now only the AIC value is returned. * Fixed issue in `check_collinearity()` for *glmmTMB* models when zero-inflated formula only had one predictor. * Fixed issue in `check_model()` for *lme* models. * Fixed issue in `check_distribution()` for *brmsfit* models. * Fixed issue in `check_heteroscedasticity()` for *aov* objects. * Fixed issues for *lmrob* and *glmrob* objects. performance/MD50000644000176200001440000003371314517665742013113 0ustar liggesusers7443b338b42090b850669ec126ebe0b5 *DESCRIPTION d426118d4a109fa49f341254b7f27460 *NAMESPACE 0356c09e79103401b924d35b18f0a683 *NEWS.md 0675ede34cfd497125665bc61309c372 *R/binned_residuals.R 44500ed0715c2df2c4d51556e2bf3873 *R/check_autocorrelation.R 6aae85426b928d09ab250439ada1ca5b *R/check_clusterstructure.R f58d411137d9efee12af227465409d79 *R/check_collinearity.R b1d22ddf4cb980ba18385c06eef944f7 *R/check_concurvity.R 228a2bac821b3bbde5c540d4295ee635 *R/check_convergence.R 65bb8d6fb26916b5a8e07dcd9426dc72 *R/check_distribution.R 14b780fc1b346c6e040b853167fe5ad5 *R/check_factorstructure.R 54708b9e9f4599ce27238337e6e04aa7 *R/check_heterogeneity_bias.R cb5da88a843284a9227fcf47f061e29f *R/check_heteroscedasticity.R 36ea3694d0faaf968cd1e57b669ae799 *R/check_homogeneity.R 9a8a9392f6d9559edb603fff72c07c7d *R/check_htest.R 1c2133ca9e5de71aa344ec7e9d610bdb *R/check_itemscale.R f971824ea81f5fd1e255dfa540137d02 *R/check_model.R f7ab914558efdaba292e772272ff7843 *R/check_model_diagnostics.R aa159b9a89b497a86b83459c8042af44 *R/check_multimodal.R fc98445632e8a00e11123b49231ce84c *R/check_normality.R 2499801add396369627781c87a1053cd *R/check_outliers.R a609b71484bdba5d47ed2349666e8050 *R/check_overdispersion.R a1e9c443e74099171f98d636975578d5 *R/check_predictions.R 69076aa029b6ace30293f0056f1e0a5c *R/check_singularity.R e270dc3b851159d9a475f27f3ed6f33a *R/check_sphericity.R 3714afa9a6503032e296bdd1098ae1b0 *R/check_symmetry.R d2e26c1115e0eb2137cf5a93cc9c0a6f *R/check_zeroinflation.R 6745905803462d4b5d2176c9dad2e705 *R/compare_performance.R ac7ebfeca69f640476733241c771add1 *R/cronbachs_alpha.R 333fd12b98aea2a8af9e7da67bb639e7 *R/display.R 4940ef9e3bf7a1292ed815d1620cf49a *R/format.R fb1164079224e604c0181b17c7dd9178 *R/get_gradients.R 8361b05e66fa3e030c11c8d55df37c27 *R/helpers.R 7cc47ff2b386b0be4492bff57f151cce *R/icc.R 5371434201b90ae300f87e647f6cb5eb *R/item_difficulty.R e083c9715ff8911d70c9642c1a8dd05e *R/item_discrimination.R f7fe4c594d25facd0b3dbbc3fcf5671f *R/item_intercor.R 94e50e184d9325b5805a0f3b372ef610 *R/item_reliability.R 9d2f9f180fdb5b5761390ab007ed7e81 *R/item_split_half.R d75df9a97d67629029e78ad66942a2f3 *R/logLik.R ebb85fd0aa312d0e9be1c00f29703ee6 *R/looic.R 917d86b7aad5244d8e236e36b034a7ed *R/model_performance.R 71323e2f4f3530285bdb4e03908e92d7 *R/model_performance.bayesian.R 39170b9247ce8056d0b857a81a1a2998 *R/model_performance.bife.R 6e746ce660e7f9b32843b6d123ab0ae1 *R/model_performance.ivreg.R 99666c4e9faa55054908f6b961271c9e *R/model_performance.kmeans.R 4e22304088f32dcb2cf1ee5f6e0d6e0f *R/model_performance.lavaan.R 62a3a27920f5b4afbea42643977aaf72 *R/model_performance.lm.R b6564f540279d34992746b69f930c03c *R/model_performance.mixed.R 2cc0a9eb73f7d6bcd5e61469f991a784 *R/model_performance.rma.R 3307833c9cc582f72835845fe76dd455 *R/model_performance_default.R 7a213a37a887cab95ccc7e7d88b6847d *R/performance-package.R 86cba28040c7ef53c25d927906af795c *R/performance_accuracy.R 0761bb63a93bf81b0e72fd3949e8f4e6 *R/performance_aicc.R 7d49e74f1791caae2d1a10f4748868b7 *R/performance_cv.R 208b21e0d51abb0fe5b0515c45d564ab *R/performance_hosmer.R 6f36258082be2221e8c3583623724227 *R/performance_logloss.R a4037424ed1d0dde88e08a4f453e1a72 *R/performance_mae.R 1a1fd18108f35e67435e2fe001d7f556 *R/performance_mse.R eacad37615c29fe0cfefc51575e77698 *R/performance_pcp.R 3588d25e88aa6f03c7546a941c3116e4 *R/performance_rmse.R b0e67634b67d3c506f8a36e31bee706a *R/performance_roc.R 2c7e55fbc18fbf1278e54f24321689a9 *R/performance_rse.R a954bd965169a50d842dbb0aed072fbe *R/performance_score.R 885060af8ceac3007b17d8aff3aad3a1 *R/print-methods.R 173c813b7a74a2cd7c1bd67fbb189d43 *R/print_md.R f9c2a24296935e0e0599203690b1906f *R/r2.R 778043e446ed0a9f78d6755372dd5098 *R/r2_bayes.R 1ff01a0a70b50d0eeec318f411c1152d *R/r2_ci.R ec0c2b5bee2dfbc18661e2eee9706b8e *R/r2_coxsnell.R 328c2bc1fed0f6f9eb8af1510e8f59cc *R/r2_efron.R a09eb8a21a9721020774515f9921269e *R/r2_kl.R 17d2a4baa4944a17c7fdd5f39a3f4b09 *R/r2_loo.R 09dd641ad703747860c3969d0670107e *R/r2_mcfadden.R 5d85009b89659fa3716b45867d954881 *R/r2_mckelvey.R ffe2871ba65c699f5602c068dc4c8ece *R/r2_nagelkerke.R d3e126c464a9dc98a107b8f93c247076 *R/r2_nakagawa.R c6dfd8f5b20f83a86f407ffe34a0dfeb *R/r2_somers.R f6fdac3aa7f8acc9b759db0c39196592 *R/r2_tjur.R 5434ec23d24ecfef1aaa52f814aa1419 *R/r2_xu.R 059893c9907a623a143b5476df808af5 *R/r2_zeroinflated.R 7ff6356deeadd7e217392afa3a39b0d0 *R/residuals.R 1101cb3feb58384028a2734fec7ca7e0 *R/skewness_kurtosis.R 51a2a3ab9af9f09cc0425195f6ffd65b *R/sysdata.rda bf9d80f20a9605a8df008b5546f39226 *R/test_bf.R e1c4201b7005a3c4eeba92fc3f648136 *R/test_likelihoodratio.R 0c85111feac1fb7da30084a374608ebb *R/test_performance.R c69a431e6f5e14a0bc636ffc33685cd1 *R/test_vuong.R f20389ebee5fdac1b9cb18acb14e59be *R/test_wald.R bd9b090ff20235cc853a20edf47bf873 *README.md 2836b2c5db38c9819380bd093383d89d *build/partial.rdb b3f9f88d249c4b33a27a9567252871b1 *inst/CITATION e10b060019e696cd3bb5a22bb64a157a *inst/WORDLIST 0b60d7ac86bae74b686686c61bfcc7d2 *man/binned_residuals.Rd 3e94293df7678e054618d18abf9c2442 *man/check_autocorrelation.Rd 7258429db6fd09d078942adc47fbaab2 *man/check_clusterstructure.Rd 948fba25aa6bc867a0eb16ae2f833f36 *man/check_collinearity.Rd 35d938bb14962f9bfe74013f1c9d4875 *man/check_convergence.Rd 7c4175b9c202d4001393cdf04e5572a3 *man/check_distribution.Rd 4e7cbeffb68715c019ec9388b68f783d *man/check_factorstructure.Rd 3103aaaa9ac4b507a806d925a2ace773 *man/check_heterogeneity_bias.Rd 0b32ac39a0910f6228a976b826fc52f9 *man/check_heteroscedasticity.Rd d8c2d4ec5a57fbfdbc111c8ddafe66c7 *man/check_homogeneity.Rd 7d19466e4a44d1228ab7e0bfbb07530f *man/check_itemscale.Rd dafb979cc346316bb69d8c1e5d0da044 *man/check_model.Rd c7c2d3ab709befe97e7c3dc6890d467d *man/check_multimodal.Rd 230972eac799bb556db7e969561ba519 *man/check_normality.Rd c1f9dea3961b830cd9c71ccd7c8a36f3 *man/check_outliers.Rd d50cc74fd01567cafc35a208520ebfa7 *man/check_overdispersion.Rd 53cbd7a154ba47b73c3e554c1c048c0c *man/check_predictions.Rd 61df4e2ac375af999ed49b84ab919fd3 *man/check_singularity.Rd a5aa676bf803829497c0a306389ca897 *man/check_sphericity.Rd 9ea3fb91182f94bab263a8db44e97524 *man/check_symmetry.Rd ee87e5fb0a7998063ae14a3d8f2cdf9b *man/check_zeroinflation.Rd 66bc416b58e3e63a19e70d06c8a41072 *man/classify_distribution.Rd c7a9fe151b9a403f33e4ab97f2d4c89d *man/compare_performance.Rd c639d91d01c9b918678b199f276c8550 *man/cronbachs_alpha.Rd f71bd9e688099b16abad850600ecf0a0 *man/display.performance_model.Rd d0145b99b577e763a3ee5d0863665b76 *man/figures/card.png 3c5fef75dbf3fc529506455b847cfd56 *man/figures/figure_workflow.png 1c7a7648e019e82f9c2e2558193a5dd2 *man/figures/logo.png 899848437d58da611299750568a41d8b *man/figures/pp_check.png afbfa5fedb32d91812a5f40e7f7797bb *man/figures/unnamed-chunk-14-1.png 33eed1a6f21d8f5b18dc641794252afc *man/figures/unnamed-chunk-15-1.png 26b51725a48f8a9e08047bd549d3e2e9 *man/figures/unnamed-chunk-20-1.png 0da25d332ce85011d1964f50874e8e49 *man/figures/unnamed-chunk-21-1.png 579b7df7d9070b93d5358b19f1c36d0d *man/icc.Rd 10ea4717a2cccfcd3413f68539b55d73 *man/item_difficulty.Rd fd141fd10ad3012e06bdb9e56de1bb67 *man/item_discrimination.Rd 9199c63650610d7712a14bbfce22f1ff *man/item_intercor.Rd 731bb41be7ebe4898c7c47bb31985a42 *man/item_reliability.Rd cd02bfeced4129437acb197389afa68a *man/item_split_half.Rd 8aedd82a320ccce57af5da40579138ea *man/looic.Rd 0f9178c4670e947ecfe620efcf04fe3e *man/model_performance.Rd 0f8154803ea449ec73677f74ac58df52 *man/model_performance.ivreg.Rd 22a996e9543ade69ed83021baf4fc64f *man/model_performance.kmeans.Rd d3291d3f203defa6a38fc7259b3decf8 *man/model_performance.lavaan.Rd 8fb6be3bfd21643b889e72233430e374 *man/model_performance.lm.Rd 69328273c61c6fe0835c79075f3ee7ae *man/model_performance.merMod.Rd af2964671964bc70826e91e2e52b836c *man/model_performance.rma.Rd 215910c45a5e6821164d00176e58a7a9 *man/model_performance.stanreg.Rd 936354c6bc634f41f5883785738c2a8e *man/performance-package.Rd a7cf38d14b1a9530664f7b5c0531f961 *man/performance_accuracy.Rd 8ab4badd7daa095da5a65a857e002de6 *man/performance_aicc.Rd c73b998501eeb037dbcb816b4a9fd555 *man/performance_cv.Rd b0606732318c712d8fd3da8d0d115b0c *man/performance_hosmer.Rd 8f76ca962283233b71567559624ba5aa *man/performance_logloss.Rd 9e6a786b50de3722168f1245614bbd4d *man/performance_mae.Rd 3e944b4bbb7a6c5d6f4dca18c95212ab *man/performance_mse.Rd dbf8f55a6a8576573dc6759b5ce6bf92 *man/performance_pcp.Rd 25553feacb40df80e8ae928da6a567b8 *man/performance_rmse.Rd 532bc018b320a6d3766768a8183a83ec *man/performance_roc.Rd c286a0eb42a42e8f6120fa9f2069f67a *man/performance_rse.Rd cd85a42bdc370a4932414581c705b1e4 *man/performance_score.Rd 1d06344f9513012ffcc9d20035ca2362 *man/r2.Rd 9dac9a89e33ed8cb835eb32ea6b90b40 *man/r2_bayes.Rd 5558126a43c3d12cbd5e73f0555639eb *man/r2_coxsnell.Rd c8a9a8e0d67ec7a482a5a8188da92bb3 *man/r2_efron.Rd 94a566d84512af3dae4cd847dab7409d *man/r2_kullback.Rd 37875fa13f9e369a4b8ccf775ad4747b *man/r2_loo.Rd 34821aa9e67990acb2ae85e3fa31e69a *man/r2_mcfadden.Rd 3007656b0dc3cf2ed5b4375cf45fede7 *man/r2_mckelvey.Rd 844aac6a9207091f02503c6eeb2f705f *man/r2_nagelkerke.Rd 43d4656288439f974a5d7ea003eae1ba *man/r2_nakagawa.Rd be55217b4daf40e292aa8f83e0afe413 *man/r2_somers.Rd 938adfb78f1ebcf16a283b1f552542b6 *man/r2_tjur.Rd d999be4ed1f5c8489dcb6ddfafb3dc73 *man/r2_xu.Rd 197b1f10b81538365808915b9b1bebd2 *man/r2_zeroinflated.Rd 3ff6e13c0c325215f0124a75d40db1bc *man/reexports.Rd 7f9c11cad940c3fc6d980ced46576aec *man/test_performance.Rd cb60cbf3577412c0bc6256424ce45d55 *tests/testthat.R c06eed005d9dc7b9cd6cba0bb1530356 *tests/testthat/_snaps/bootstrapped_icc_ci.md 3803f5facaba400e1a24f3a70f3eb322 *tests/testthat/_snaps/check_collinearity.md 5cf8562c41816aeba67c93b0d274599a *tests/testthat/_snaps/check_distribution.md 380e85797f95ed441e0a6e5268f5fdf1 *tests/testthat/_snaps/mclogit.md b4ad974eb8a31371747749a7553fb6c9 *tests/testthat/_snaps/model_performance.rma.md 5ea3535b333a95e35e1adbb74e25a966 *tests/testthat/_snaps/nestedLogit.md 09036d0d2a86fc548a0c8d724d4f9240 *tests/testthat/_snaps/pkg-ivreg.md 09d81b66ba81dd6f52bec56c7533b59a *tests/testthat/test-backticks.R 15d092a1b64caf78d41515db58f0e766 *tests/testthat/test-binned_residuals.R afb2dbaa7a0fcc3a643fb4ed37786787 *tests/testthat/test-bootstrapped_icc_ci.R 7bb8f65c452cae6077fcc6a7044a3bbe *tests/testthat/test-check_autocorrelation.R 02a932f6c352d8ea07d19ccc0a24bfe9 *tests/testthat/test-check_collinearity.R f36ab7f5e1fc65bb06102b046aa757d6 *tests/testthat/test-check_convergence.R df20e44a9bd172a661b02e151f132171 *tests/testthat/test-check_distribution.R da0a56f9246f46be9b4a77d43348b83d *tests/testthat/test-check_heterogeneity_bias.R 0375bb291d2d711074f791d7518db6c9 *tests/testthat/test-check_homogeneity.R 2fdf489b29d1319826a97c779b4c2f62 *tests/testthat/test-check_itemscale.R b149ffd97c2a931dc75c1b9a48aba0e0 *tests/testthat/test-check_model.R 310364d94d2624fdb84978f552bc24c7 *tests/testthat/test-check_normality.R 5f24e4182b28097ee82ce8bd136c388c *tests/testthat/test-check_outliers.R 6117da0e1061d9a83314e2ca82d8e1ab *tests/testthat/test-check_overdispersion.R 8f6157bdfb408e9bc426707e9c109f83 *tests/testthat/test-check_predictions.R 5d0588443d9dad7766e9460513478e64 *tests/testthat/test-check_singularity.R f5a4c9c082cb07dd37b16deeadf095c9 *tests/testthat/test-check_sphericity.R 4adf8c26271b067a7c13836cc5d55d51 *tests/testthat/test-check_zeroinflation.R 4ff32b5b99664d3949ff3fd92903e31e *tests/testthat/test-checks.R 2568c832fec4446ca741019d74e0ff33 *tests/testthat/test-compare_performance.R d1196e664ed5271a4dbc4b12d7882564 *tests/testthat/test-coxph.R b91557b7fdacd470feb5fa426c09f930 *tests/testthat/test-cronbachs_alpha.R 3359bba7ceaebe95b633d99c8ac98c24 *tests/testthat/test-icc.R 643e75d61d3989bbd3f8a70ba4eb5086 *tests/testthat/test-item_difficulty.R 9eec2c5c8c17f0243a43c1e30fc4f952 *tests/testthat/test-item_discrimination.R a946e64120f2668e03d3b5ef9a1b5c8a *tests/testthat/test-item_intercor.R 005ac9d2bb4e70a2673aa3dd5efe2954 *tests/testthat/test-item_reliability.R a00a601bde42cbbf059ddf8cd1a45400 *tests/testthat/test-item_splithalf.R dec4c4bd0aaefa3c700f9b54d3c5bcc9 *tests/testthat/test-logLik.R e5040b6fb32d7b2ff4b662bd6fc7bf55 *tests/testthat/test-mclogit.R 6f7954b701ca5d0eba73be10d909ae66 *tests/testthat/test-model_performance-various.R 32b4cc4ba046b9e635cd93f1f9b74f46 *tests/testthat/test-model_performance.bayesian.R 9d0600c522298797d4c23fa43d89346d *tests/testthat/test-model_performance.gam.R e08cd027c79d379966973b2de26e5d05 *tests/testthat/test-model_performance.kmeans.R 8cd14ee14a0c15e7d24ea02e72892117 *tests/testthat/test-model_performance.lm.R 1d462f4ae4583f91ca2344d41d5df46d *tests/testthat/test-model_performance.merMod.R 7c29bcd0792c25e316e25a1b8c265d30 *tests/testthat/test-model_performance.rma.R 1fd9e0385d3c2f141b7cf3fd6353b3f5 *tests/testthat/test-nestedLogit.R 73ba8c153d08c6421c681dbc73608c5e *tests/testthat/test-performance_aic.R 48d913f8db209bf6b562d6764e38872d *tests/testthat/test-performance_auc.R df68b7c71e73c9dd3740f2f669d51df7 *tests/testthat/test-performance_cv.R acf035ee309f00bc3b6f63c073ffbc06 *tests/testthat/test-performance_roc.R e903a4c2b93c8693534f9411453aa0a4 *tests/testthat/test-pkg-estimatr.R 42d5ab49a9bfcfa8dfa0b094430267c7 *tests/testthat/test-pkg-fixest.R 938038c1a560beb4cde9d38093cd7d6d *tests/testthat/test-pkg-ivreg.R 32e03d082d7bfd04c094f0f8852f407b *tests/testthat/test-r2.R 7058e0c95ac4032d5571b730fd68530f *tests/testthat/test-r2_bayes.R 2dddc26ccd2a4728b72a43f2d014af82 *tests/testthat/test-r2_coxsnell.R 1cace7166eb7fa2d9e4e9b63a0ba83ca *tests/testthat/test-r2_kullback.R e5990a11a4096c5c45ba368ca341234b *tests/testthat/test-r2_mcfadden.R 03187f4c5344f398c8d2f106a631415f *tests/testthat/test-r2_nagelkerke.R c390df69883f5c42feb2c1274dfb46ef *tests/testthat/test-r2_nakagawa.R 4e32117bfd50a3da8f4285edc418f8a0 *tests/testthat/test-r2_tjur.R cbcf28b07a7cd10712fd0fac1ed3bb85 *tests/testthat/test-r2_zeroinflated.R 6d6824bbb33177c89fd9041b16f922e7 *tests/testthat/test-rmse.R 43de587053804a18f350baccbfd729e9 *tests/testthat/test-roc.R 6a338f43e5739c7ebef8c33e0195f684 *tests/testthat/test-test_likelihoodratio.R 518b3ecfca4105f46dd0030ee740e38c *tests/testthat/test-test_performance.R e5c0894f8038582b66d9b25ce2678ffc *tests/testthat/test-test_vuong.R 3f140ce84000c0f16a84fb839973b0b3 *tests/testthat/test-test_wald.R performance/inst/0000755000176200001440000000000014512471542013535 5ustar liggesusersperformance/inst/CITATION0000644000176200001440000000122614257247716014705 0ustar liggesusersbibentry( "Article", title = "{performance}: An {R} Package for Assessment, Comparison and Testing of Statistical Models", author = c(person("Daniel", "Lüdecke"), person("Mattan S.", "Ben-Shachar"), person("Indrajeet", "Patil"), person("Philip", "Waggoner"), person("Dominique", "Makowski")), year = 2021, journal = "Journal of Open Source Software", volume = 6, number = 60, pages = 3139, doi = "10.21105/joss.03139", textVersion = "Lüdecke et al., (2021). performance: An R Package for Assessment, Comparison and Testing of Statistical Models. Journal of Open Source Software, 6(60), 3139. https://doi.org/10.21105/joss.03139" )performance/inst/WORDLIST0000644000176200001440000000570014512471542014731 0ustar liggesusersACM AGFI AICc Agresti Akademiai Alonso Ameijeiras Ankerst Archimbaud Arel Asq BCI BFBayesFactor BMJ Baayen BayesFactor Benthem Betancourt Bezdek Biometrics Biometrika Bolker Bollen Bollen's Bortz Breunig Breusch Bryk Bundock Burnham Byrne CFA CFI CRC Carvalho Casal Chisq CochransQ CompQuadForm Concurvity Cronbach's Crujeiras Csaki DBSCAN DOI Datenerhebung Delacre Deskriptivstatistische Distinguishability Dom Dominicy Dordrecht Dunson Durbin Dxy Döring ELPD EQS Econometrica Efron Efron's Elphick Erlbaum Fligner Forschungsmethoden Fragebogenkonstruktion Francoeur GFI GL GLMM GLMMadaptive GLMMadpative GLMMs Gabry Gazen Gelman Gnanadesikan Guilford HDI HJ Hastie Herron Hesketh Hoaglin Hoboken Holger Hosmer Hotelling Hox Hurvich IC ICCs ICS ICSOutlier IFI IJCNN Ieno Iglewicz Intra Intraclass Itemanalyse JB JM Jackman Jurs KJ KMO Kelava Kettenring Kiado Killeen Kliegl Kristensen Kullback LOF LOGLOSS LOOIC Lakens Laniado Leibler Lemeshow Levene's Ley Leys Lillo Liu Lomax MADs MSA Maddala Magee Magnusson Mahwah Marcoulides Mattan Matuschek McElreath McKelvey Merkle Methoden Michalos Moosbrugger Mora Multicollinearity NFI NNFI Nagelkerke Nagelkerke's Nakagawa Nakagawa's Nordhausen Normed ORCID OSF Olkin PNFI Pek Petrov Postestimation Pre Psychol Psychometrika QE RFI RL RMR RMSEA Rabe Raudenbush Raykov Revelle Rodríguez Rousseeuw Routledge SEM SRMR Scheepers Schielzeth Schielzeth’s Schumacker Sensivity Shachar Shinichi Skrondal Solomons Somers Specifity Sphericity Springer Stata Subscales TLI Technometrics Testtheorie Testwertbestimmung Tibshirani Tily Tjur Tjur's Tsai Tweedie VIF VIFs VPC Vanhove Vasishth Vehtari Verlag Visualisation Vuong Vuong's WAIC Weisberg Windmeijer Winsorization Witten Xu YL Zavoina Zavoinas Zhou Zomeren Zuur afex al analyse aov arXiv autocorrelated bartlett bayesplot bayestestR behaviour bife bigutilsr bmj bmwiernik brms brmsfit cauchy clusterable concurvity datawizard dbscan der detrend difficutly discriminations doi easystats et explicitely favour fixest fpsyg gam geoms ggplot gjo glm glmmTMB glmrob grey heteroskedasticity homoscedasticity homoskedasticity https intra intraclass joss kmeans lavaan lm lme lmrob lmtest mattansb metafor mfx mhurdle mis mlm mlogit modelfit modelling models’ multicollinearity multimodel multiresponse multivariable nd nonnest overfitted patilindrajeets poisson preprint priori pscl quared quartile quartiles rOpenSci recoding rempsyc reproducibility rescaling rma rmarkdown rmse rsif rssa rstanarm se smicd sphericity strengejacke suboptimal subscale subscales theoreritcal tidymodels unadjusted und underfitted underfitting visualisation winsorization winsorize winsorized xy youtube