glmnet/0000755000176200001440000000000015036100372011535 5ustar liggesusersglmnet/MD50000644000176200001440000006776115036100372012066 0ustar liggesusersf7b69033937119431164b94efe9a99d3 *DESCRIPTION b3a2e443b697130de588b50a907b6d5a *NAMESPACE 3f3f1e7718f85012ac201ff1121cab52 *NEWS.md b7e403cbac1975dfabbd5b1e6ec68cfc *R/Cindex.R 45e88cae53c8601bb4ad315d6779d458 *R/RcppExports.R 4bd3eb09b5b5e4d5dd4a6d885c734b0d *R/assess.coxnet.R 7172891b9097b44ef3d8951153eee111 *R/assess.glmnet.R 6d3a93c6972ccbfee9aa0c264cb08ad3 *R/auc.R 8cd96999dce298c1d81ce51ea2f6d2a3 *R/auc.mat.R 4e064fb1e6aa6396369a08b60eea1ad4 *R/bigGlm.R d8808544bfbafb423ce60e359ade4b64 *R/blend.relaxed.R 04a38d922c4c78910aee28eb063fd474 *R/buildPredmat.array.R 66e8a7ccb8a590a2add53fa043f6ff39 *R/buildPredmat.coxnetlist.R 019453d01483ecda68866eaa73e1df3c *R/buildPredmat.default.R 885a478709d197d973cdc621cd3e5225 *R/check.dots.R 612fef55db8dfaf923f5b986d8dad11e *R/check.exclude.R f596fb839a1e3042a81df9590e2cc3bd *R/coef.cv.glmnet.R da1e68b0c4ae43a6ffcaa2ea3d7c287a *R/coef.cv.relaxed.R f288cf974491d93b56e5c4d6d204d658 *R/coef.glmnet.R a42ad691868ee94b3eae743299af81bc *R/coef.relaxed.R ab05dba77ad585b2ac3a465c26fc2b00 *R/coefnorm.R ee4cc296f6a922b28ba89fe64fa5ce56 *R/confusion.glmnet.R 0b5afc5cfb075810d2bf5f79d5b0f50b *R/coxgrad.R 2c74381753c2cbf20799789a98f1da7d *R/coxnet.R 836fa1cdc1092e7a00f781fff99c89a7 *R/coxnet.deviance.R b2d91e31dcc18510577125a301ab8221 *R/coxpath.R 07016f000442c65ed8cba9d99bd7f570 *R/cv.coxnet.R b3593fdbb51ba45fa9581d246850de4f *R/cv.elnet.R b2f4b2ab04489c3378cc4532551720ba *R/cv.fishnet.R 679adf26e8eb6fe235c016b03006b7d6 *R/cv.glmnet.R 08a70e2aff835d57fb60fbbf1aa539bf *R/cv.glmnet.raw.R 1500e23337c4de6276f9745adfbcefcf *R/cv.glmnetfit.R 86747e59ed9762208d848cf84d815095 *R/cv.lognet.R 5f5234bbe3dc2fbc77015609ad7094d7 *R/cv.mrelnet.R ece778c00ca6b58e088f6a700d23e15b *R/cv.multnet.R 54bb7948621814784ce66b4efa3b97d9 *R/cv.relaxed.raw.R c739878e7fc617dab75e8cd65cf9b356 *R/cvcompute.R 2b98d1871792cda71bd9323e9ee2a0b0 *R/cvstats.R 90e2fb9130f89ddaef65e43202dc4261 *R/cvtype.R 9a25662a16138900203c201bb4bd057b *R/data.R 959eaac0e190795f3ee1ced251d60a90 *R/deviance.glmnet.R 73741eabd56bb9e084c8cc859538698a *R/elnet.R 0c6c0b1dfa5c98b55f2e9e097df3747d *R/error.bars.R 9cf716424fdcf017725b7941fed3727c *R/family.glmnet.R 90d73f437e5e342b9cbe9f5f4e822746 *R/fishnet.R ebce52c8995ee16c058c2aa93bdcf582 *R/fix.lam.R c65547cba8e3d5ad16b28a84881e7fca *R/getOptcv.glmnet.R b0325f5e584fbe646aedb73d02f6b86d *R/getOptcv.relaxed.R dd14d7acb21ae8f1bb87a54ea763950b *R/getcoef.R c1a8bceef71c915555f8bffc7298137e *R/getcoef.multinomial.R 6deacc652715f9cec2d2456b6a57853d *R/glmnet-package.R cfc5facdd45cf70dcf8019882db4dd00 *R/glmnet.R e3af5ef4ce582ce08d2824f63930638a *R/glmnet.control.R 741a587449cd2f3613c2e52f25bc0280 *R/glmnet.measures.R a1d90fd743701499c9971480076bd625 *R/glmnetFlex.R a6224dfa92ac162a19e455b90ec64108 *R/glmnet_softmax.R 45e70c6598a06eab929bb46a32ac7fec *R/jerr.R 65abc981c18160e0a229da5225aeb812 *R/jerr.coxnet.R 5acd474cede565ec9bff39674d9cdac0 *R/jerr.elnet.R 0ee642ef97444c8b0c05b43face38094 *R/jerr.fishnet.R cb426164b68fd511d50afddd54af550f *R/jerr.lognet.R 955ddc9c91f5cb11e10bce2feb17b4aa *R/jerr.mrelnet.R 2448cfc1a8d2d38e7e3289b2af7b5600 *R/lambda.interp.R d3b336182624ec13abf5232b16f60f55 *R/lognet.R dca4e022c62f90ac14272ddf8d4a1214 *R/makeX.R f592404f1a0c942773d88cf99ad9494d *R/mrelnet.R 17d20a46471df38f1d1c6bb7cb16421a *R/na.mean.R 874f190461e3637bb4fe16c7da03ea6c *R/nonzeroCoef.R 47c7b014ce112b5eae37781f6a8c2ee4 *R/onAttach.R c63389262e77051b913d9bb3d9b5e5a1 *R/pb.R 95223aa2e6017b34994f9c8b2e0a339a *R/plot.cv.glmnet.R 02071fdcb15f4af0ea0b15d66fd07e6a *R/plot.cv.relaxed.R 82efd434c7bdd04ddb38aeb45305e171 *R/plot.glmnet.R 90717a0dcaa8aebf56def963138f0aa2 *R/plot.mrelnet.R 9a7b40a45d986ba0ad218cdb8fbec84e *R/plot.multnet.R 16cd799e2f0ccc810fe4e8f0d0e2768b *R/plot.relaxed.R 89ab229593725acc8f5573ecfcd75bd7 *R/plotCoef.R fa0986bb58c46a8481b78b877a6e7636 *R/predict.coxnet.R 8ebf91d9c99794830d1b902ed3907677 *R/predict.cv.glmnet.R 46ef747bea2ff68cef5ef2ffbb5bb466 *R/predict.cv.relaxed.R 459ca7b37d845f842e8b5681a2e3a5aa *R/predict.elnet.R 0f470237229a0f3b973d29ef3683d73b *R/predict.fishnet.R a8df4be6783b23ff12c673269dce31c2 *R/predict.glmnet.R b25e31f1a03f1752df2e1608b7d6817d *R/predict.lognet.R 1bc0c68ce624df57b07bdabfd1e84597 *R/predict.mrelnet.R 527281caaebab2d24176f258f7ccf5ee *R/predict.multnet.R ed58f90aa0b7d7a5ead21c0838d5b330 *R/predict.relaxed.R 70cd43e9955641d2041c50030491a921 *R/print.bigGlm.R db093ef96748c43424e48993e2c23b0c *R/print.confusion.table.R 33d0f53e0210a76bcc6d6372b7a7577b *R/print.cv.glmnet.R f57e0561181a529df64e8b15133a0f2b *R/print.cv.relaxed.R 85eea47cfd8403a66297ea317bad0be3 *R/print.glmnet.R a5e64ca8661f9b618a0e59872956c921 *R/relax.glmnet.R 617e805573b640bf01d93e19104438f3 *R/response.coxnet.R b012181c241a4f6699d73f63bec2bd1d *R/rmult.R 533da5bd46d7fed918af5a04b1539d6c *R/roc.glmnet.R 732890f5e88bddcd5b331928863c8d27 *R/stratifySurv.R e44a2d10d5135f6931a13542d8996d56 *R/survfit.coxnet.R e2f22c34e46e1ec2964d1968e7116342 *R/survfit.cv.glmnet.R 0d040824da1ffcd1edb57b252f6b1f6e *R/zeromat.R b7139e38ec4eb9a38549130e2e53b2d0 *README.md b52aabe9a2757fc86742763db9dafc9b *build/partial.rdb 1d2c90f62d6513cd1c374984076ecf46 *build/vignette.rds 0814c5a080c9ba7874362051b6cbd89f *data/BinomialExample.rda 7a404bc6a255ac95a6cc06cf4fe6ddbf *data/CVXResults.RData 9497636bb0edb7f76c792f33c47ba681 *data/CoxExample.rda a72ec47b364e0eb3a85fc2d402c7ac16 *data/MultiGaussianExample.rda 892fa8ad5b2ff24f9c989ebcec41bfb8 *data/MultinomialExample.rda cac6b8e217715098a5ee94e4066c1a4b *data/PoissonExample.rda 35754bd4878bc234696cc2d9b880d90e *data/QuickStartExample.rda 54067bd791ff172cff97ff9d26b6de12 *data/SparseExample.rda fd5aa84f9a0b2bcdec1a75ca13a03b2b *inst/CITATION 78ae5b1a7a52c0a9124050bb6e5996dd *inst/doc/Coxnet.R 0bb3a929eff4b5695d75d5c08ae8360c *inst/doc/Coxnet.Rmd 134531efad44ba42fdbcc0af50284800 *inst/doc/Coxnet.pdf e990c66e09a2c894a8170cc516fe9b15 *inst/doc/glmnet.R cf5043400bda8634df2235a543cea7b7 *inst/doc/glmnet.Rmd 62c5c8c09c37e2835a6dff670c5be80d *inst/doc/glmnet.pdf e5fd2535a1532558306d7b4b9d3062c5 *inst/doc/glmnetFamily.R cab72afa072399ca5ae1906987ef89f4 *inst/doc/glmnetFamily.Rmd 479c1f5c19f4680bf4d4ca85153082b4 *inst/doc/glmnetFamily.pdf f3b0466d566df6079e63fe164a809f82 *inst/doc/relax.R e1dc532562ac69525a0b9c3c095be562 *inst/doc/relax.Rmd baa76491f1a2cb4cacb0f5eb3f58cdc3 *inst/doc/relax.pdf 64c471277309951b4697ffdd1ee15fb8 *inst/mortran/README.Rmd 105f4c45761aea898c3ecb428b4f2d88 *inst/mortran/coxnet5dpclean.m 52e95162e7dc0e62ec329602b05cd001 *inst/testscripts/save_results.R 6e03129049a39674c7ea15de8339511d *man/BinomialExample.Rd 5a4389a6279bf8f6db41b6c7c5862bf9 *man/Cindex.Rd 9f14f46f2d349831ddf8fd8958bf69ef *man/CoxExample.Rd e472e3fbbaa3c1286891a59a561123ad *man/MultiGaussianExample.Rd 2023e16a435a534ce184ddbb01a04bb7 *man/MultinomialExample.Rd 287fe75c09580f4475f97e6a4653a2ca *man/PoissonExample.Rd 81a89d362e387093991343cbbe045fce *man/QuickStartExample.Rd d9cb26ef685c853112acfa17afee001f *man/SparseExample.Rd db803cacf2e2783af427a53ae29000de *man/assess.glmnet.Rd 404ddf86d813ed00f2ddfaf0cc88bf5f *man/beta_CVX.Rd 413f29637810f0c84718ca2f5bb00ab1 *man/bigGlm.Rd 04489a85284bec2540774e387978bb2b *man/cox.fit.Rd e6388e65131a54875a8f44c9e536e17e *man/cox.path.Rd 02d8b57b5fe0bb24c5a4577fdbeb8649 *man/cox_obj_function.Rd 46f6b21620d2ef64e75df227bb2a662f *man/coxgrad.Rd 14afe7c0215649ac50246ef46b7e0b93 *man/coxnet.deviance.Rd 2db92206db249ae6183c7b9a5b5259e2 *man/cv.glmnet.Rd 18d78ba828a20778f74374075a832d81 *man/dev_function.Rd 9ade2a133f3c6e4049a766a561a05145 *man/deviance.glmnet.Rd 612d2db4f0536e76cfebac45ba7e259e *man/elnet.fit.Rd 2604c132d7a0c60ba0bb2842687b9aaf *man/fid.Rd 0cb75faa99bbe1ccf8b63d7618f1d6a6 *man/figures/logo.png 3c5ba6e37b05e27f1f70179ebc5176c4 *man/get_cox_lambda_max.Rd 282c6f7db8fc51844dc28629a8b1e261 *man/get_eta.Rd 1e9b7d5537b29ef0a4c097e26e0fb2a7 *man/get_start.Rd b52f7e8516900daa988d250db6b8507b *man/glmnet-internal.Rd ed53eeaff465ba88ad87e207bdd27a5a *man/glmnet-package.Rd 711b09bcc4d6c26f9980beb79474e6df *man/glmnet.Rd 5cc46f5cf2cc5389a89709d6ae129d0c *man/glmnet.control.Rd 044d3028ad7c3ed6d4c27e0b6ef9b025 *man/glmnet.fit.Rd 5100041a8bdf7a926cc199587f99d2e5 *man/glmnet.measures.Rd 93b09ae713424336b982280c0e54d44f *man/glmnet.path.Rd a58741a0f8c88395ad8a12d3afc84cae *man/makeX.Rd 450ff2e96f274536ed5c1c7ae2b15478 *man/mycoxph.Rd 751f3230c6220d30f9e428ff985dc9c9 *man/mycoxpred.Rd 8e5d2c806cb13cc2b06207f68a31eba9 *man/na.replace.Rd 8ac2ff867e5e3c5fed650e9ba7fae90f *man/obj_function.Rd 64f275140d08ca77bde537001a99564d *man/pen_function.Rd 70fa12f348b7b710a3ce7c0486fc5458 *man/plot.cv.glmnet.Rd 83381d0d734624b62205264376636bc7 *man/plot.glmnet.Rd 6b05f3475ab9229e756ed2b9912ad553 *man/predict.cv.glmnet.Rd 48071c7377f8c310ae48c44a27df5893 *man/predict.glmnet.Rd c94db387bc9bcc16d607294a3a3f50b6 *man/predict.glmnetfit.Rd 8e4be7a110c2b05437a16f7282d01de0 *man/print.cv.glmnet.Rd 3f6f703e63011a228505e5db088aa645 *man/print.glmnet.Rd e4c08beafea3fe0967fe62702d6df665 *man/response.coxnet.Rd 3adbd56c4685f732227a9845b470aeb8 *man/rmult.Rd a62678b3f19900ec74d299d7eebafbd7 *man/stratifySurv.Rd 25bf7abec92edfb4312fa50c0a1ebc66 *man/survfit.coxnet.Rd f2447246ed1bc0682526b694b2ff1daa *man/survfit.cv.glmnet.Rd 24b1289dbc6e8d8bcc0a90fe57286599 *man/use.cox.path.Rd ef3f52f020e0348152d26890bb7e717e *man/weighted_mean_sd.Rd 03ab2a8dbe838fdfbb90c14f5b11f8cb *src/Makevars 98dc9f16f8a07a0c184f47d323657410 *src/RcppExports.cpp d4e7f544c62a393a1b42628dbc97aa83 *src/coxnet5dpclean.f c659bb7fe2fc3c5bfc097e99d1109ffa *src/driver.h 5825c20fcc04a7cbe1df9a449ac355b0 *src/elnet_exp.cpp 363f191b5db62163b85f4895bfe94e25 *src/glmnet_init.cpp e680f08d0a19b294a130a3a718484290 *src/glmnetpp/BUILD.bazel eb84814744119b7f61f2d92356db5fea *src/glmnetpp/CMakeLists.txt 372934e9e6a43172414976dbefb6db60 *src/glmnetpp/README.md 0d1a7309fa9b323d6bab492553e8cbb6 *src/glmnetpp/WORKSPACE 5b000b02b2dc7664c207009a823e5fce *src/glmnetpp/benchmark/BUILD.bazel 246f78e4af0cb8a2fc2335f674208764 *src/glmnetpp/benchmark/analyze/analyze.py 8fc6f936c0747a7518cff8f9eb8805ae *src/glmnetpp/benchmark/analyze/analyze_binomial_benchmark.py 47dbf7dc88f0de4f54dd735607c12a38 *src/glmnetpp/benchmark/analyze/analyze_binomial_two_class_benchmark.py 029a178669520f199151067c2fda069c *src/glmnetpp/benchmark/analyze/analyze_gaussian_benchmark.py e89670200d433a995669fafc7dfeedaa *src/glmnetpp/benchmark/analyze/path_names.py adc31425282fd0f7311f171c09c8ffcd *src/glmnetpp/benchmark/binomial_benchmark.cpp b37801d95c948e807582c2c4ca0c69f5 *src/glmnetpp/benchmark/binomial_two_class_benchmark.cpp b688662a159d0abc468db177fdd6a9be *src/glmnetpp/benchmark/gaussian_benchmark.cpp 292fc8cde4588f03ad255ebe40a7459c *src/glmnetpp/benchmark/gaussian_cov_benchmark.cpp 4cca8901aea308d598e034d759e4e93b *src/glmnetpp/benchmark/gaussian_naive_benchmark.cpp 2b6ce2c0607435c830a3031ff50d43aa *src/glmnetpp/benchmark/poisson_benchmark.cpp 756a32a5fd89c24adb27eebaaf129c4d *src/glmnetpp/bug_reports/2022_11_07.cpp b7d67ff129dbb3995a2f295726875a0d *src/glmnetpp/bug_reports/BUILD.bazel b74af9dca6cebbba6e1e0c5b8cfddf79 *src/glmnetpp/bug_reports/data/2022_11_07/generate_data.R 53e85391d6525de0df8ee89c2be8804a *src/glmnetpp/bug_reports/data/BUILD.bazel aa3de52fbfd22a11ae086767d813421d *src/glmnetpp/bug_reports/tools/bazel_data_util.cpp b244788ede39e7f76a80945ae1352ebb *src/glmnetpp/bug_reports/tools/bazel_data_util.hpp 5f31de38a2ab72d8b4ffd070958b6fec *src/glmnetpp/docs/data/binomial_benchmark.csv b06a2cebd22b0ecbfbd592a25645718d *src/glmnetpp/docs/data/binomial_two_class_benchmark.csv eadf96c9fbb382fb23bb11ad3868c4e1 *src/glmnetpp/docs/data/gaussian_benchmark.csv 23147220d7669559d3228878bd6b7ec1 *src/glmnetpp/docs/design/README.md 6b2114aa4370a8be3d50f97df777a57e *src/glmnetpp/docs/figs/binomial_benchmark_fig.png 80e393a88d064d993b4c70ba8e4eb685 *src/glmnetpp/docs/figs/binomial_two_class_benchmark_fig.png d17454fe42f00d2f94cd700c4bb784d0 *src/glmnetpp/docs/figs/gaussian_benchmark_fig.png 56ef8279f00d4e7d08ddd500cae54fcf *src/glmnetpp/environment.yml d7fa8f35aa5ac519bf35b4ff4f58aac6 *src/glmnetpp/generate_bazelrc 6a0773b65da6e07f8a3e6938347d3fdd *src/glmnetpp/include/glmnetpp be95e1bacdad999ba99636525f983723 *src/glmnetpp/include/glmnetpp_bits/elnet_driver.hpp ad3045077221b078f7cc776b6a73cbae *src/glmnetpp/include/glmnetpp_bits/elnet_driver/base.hpp 5ce01db3315712c2bac63aef6096bc1f *src/glmnetpp/include/glmnetpp_bits/elnet_driver/binomial.hpp 053b4b6434235b59f4da7810d23b1a3a *src/glmnetpp/include/glmnetpp_bits/elnet_driver/chkvars.hpp 6e4b77e5ee6bca73740cc5d08d0f0d49 *src/glmnetpp/include/glmnetpp_bits/elnet_driver/decl.hpp ef9e8f1469bac9839008be1b8d196b34 *src/glmnetpp/include/glmnetpp_bits/elnet_driver/gaussian.hpp b449db430973b549218cf34b0ac7b1b2 *src/glmnetpp/include/glmnetpp_bits/elnet_driver/poisson.hpp a8abe7597ab2f395499c3d099526258b *src/glmnetpp/include/glmnetpp_bits/elnet_driver/standardize.hpp cb37d7a32d228b4ea2e7f4658cf9beb7 *src/glmnetpp/include/glmnetpp_bits/elnet_path.hpp 6188c58fc930a1b688ac2a981de34f03 *src/glmnetpp/include/glmnetpp_bits/elnet_path/base.hpp 67fbbade20bafda83b7c32a1fb16f1df *src/glmnetpp/include/glmnetpp_bits/elnet_path/binomial_base.hpp 130ac2f957c06f476c8b44f6e05f7221 *src/glmnetpp/include/glmnetpp_bits/elnet_path/binomial_multi_class.hpp 170b8a1afc445cd2df3492a1affb07c9 *src/glmnetpp/include/glmnetpp_bits/elnet_path/binomial_multi_class_group.hpp bbb04cb2bed107f3073e6825ce3fed3e *src/glmnetpp/include/glmnetpp_bits/elnet_path/binomial_two_class.hpp 6568fe66ff1929a5e8c890d590e270da *src/glmnetpp/include/glmnetpp_bits/elnet_path/decl.hpp d1b95b53c4e7c9970da914cf3c7c3aa1 *src/glmnetpp/include/glmnetpp_bits/elnet_path/gaussian_base.hpp 612be914a470b47a70198c2c02270e4b *src/glmnetpp/include/glmnetpp_bits/elnet_path/gaussian_cov.hpp af8f9fc3c5c37873fadd865ed63fce22 *src/glmnetpp/include/glmnetpp_bits/elnet_path/gaussian_multi.hpp 7975c1b3756970c9a6cc8d436bb873b8 *src/glmnetpp/include/glmnetpp_bits/elnet_path/gaussian_naive.hpp 1f132b71a52b59fa34e85e27541a9dfa *src/glmnetpp/include/glmnetpp_bits/elnet_path/poisson_base.hpp a55d5f55541fa8312672eda576621612 *src/glmnetpp/include/glmnetpp_bits/elnet_path/poisson_naive.hpp 3c4952935f025081f762122384ea94fa *src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_binomial_multi_class.hpp d06802688d2e21d49a771f41f0aa818f *src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_binomial_multi_class_group.hpp 939a351213b819797ed7db9a0b4d165b *src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_binomial_two_class.hpp 8b3bf095b16b4d1bd31468ddae83790d *src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_gaussian_cov.hpp d3ef65b1cf50ffabe8440852b131d70b *src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_gaussian_multi.hpp 46cf9d84fdb98dd13b1a103f1ac4bcd0 *src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_gaussian_naive.hpp 27325604b8a4880e4b50fde699fa944b *src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_poisson_naive.hpp 1db7ad017149ce569edd7dd254527a51 *src/glmnetpp/include/glmnetpp_bits/elnet_point.hpp a2200ac93f34e286e6dcdb46659815f8 *src/glmnetpp/include/glmnetpp_bits/elnet_point/base.hpp 80766ce65a343bdf1b88e14d59b30de2 *src/glmnetpp/include/glmnetpp_bits/elnet_point/binomial_base.hpp 9540cc2436b3b9d073f3d81bba3cb374 *src/glmnetpp/include/glmnetpp_bits/elnet_point/binomial_multi_class.hpp 61b3d89118f696da703c4e0115886849 *src/glmnetpp/include/glmnetpp_bits/elnet_point/binomial_multi_class_group.hpp d6d83d29ca60f1c3446e00afe5c82b90 *src/glmnetpp/include/glmnetpp_bits/elnet_point/binomial_two_class.hpp 382e81f1a3a5547c1279ac6582364f11 *src/glmnetpp/include/glmnetpp_bits/elnet_point/decl.hpp 02850d5432085c64bfc0b778efc6955d *src/glmnetpp/include/glmnetpp_bits/elnet_point/gaussian_base.hpp db90543bcd0931aefaba6a676536d936 *src/glmnetpp/include/glmnetpp_bits/elnet_point/gaussian_cov.hpp a2a3772e65baac85b08183894467c6b4 *src/glmnetpp/include/glmnetpp_bits/elnet_point/gaussian_multi.hpp 67ec74ea051e704e99e1a46fcbeceb63 *src/glmnetpp/include/glmnetpp_bits/elnet_point/gaussian_naive.hpp baa7c36b660221c82368581cbe4ed16b *src/glmnetpp/include/glmnetpp_bits/elnet_point/gaussian_wls.hpp 08d9ef10a8bbe673fce6ea85df7a9b9a *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/base.hpp d71dfdc549e6a186c612df22d7d4b6cf *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/binomial_base.hpp 99773272461b3bff5cd92568936b4b7b *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/binomial_multi_class.hpp 05d155b7a42b323e2183843a0edef220 *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/binomial_multi_class_group.hpp cae3824a6fad9ab7a06a91c0ea52eeba *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/binomial_two_class.hpp 1c48d0adc50fd53fe4d973e0782dba3f *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/decl.hpp 81c8439c51bbc223af6b684e3de19c64 *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/gaussian_base.hpp 0e6a4dd472d07807d2953a3f78ea172b *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/gaussian_cov.hpp 1eabf1c1b0cf66d5a02127db436dd38b *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/gaussian_multi.hpp 8c68d49420a3f23692e60b3f9a93e845 *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/gaussian_naive.hpp c8c13b0a5c59eb8576e676321fa4c155 *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/gaussian_wls.hpp 4e1b07b0959d8096cb358a94fffe2e85 *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/poisson_base.hpp 48b30430397b16362bdde135b01b26fd *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/poisson_naive.hpp 0d3726acbb964ea6d5cfae7b90c2e485 *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/sp_binomial_multi_class.hpp eff69fea7785262a2e332d14fc5adbd6 *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/sp_binomial_multi_class_group.hpp 4e06ca74aa3351d391cc348096f1c799 *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/sp_binomial_two_class.hpp 3728222f860f98914309dd34a30cce21 *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/sp_gaussian_cov.hpp fa3067feb74aa534f59f0fba5b41c9ce *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/sp_gaussian_multi.hpp b7791ea7535cb2a93d9d042f9bf59ba3 *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/sp_gaussian_naive.hpp cea10b877f23103bb7b146adfbab50ab *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/sp_gaussian_wls.hpp 56094ba28047d7f053d3282b17e2183e *src/glmnetpp/include/glmnetpp_bits/elnet_point/internal/sp_poisson_naive.hpp d2aa972171f301e8a59bfd475c6fcb05 *src/glmnetpp/include/glmnetpp_bits/elnet_point/poisson_base.hpp 7d0bcdf41582371752807e4f8db8d523 *src/glmnetpp/include/glmnetpp_bits/elnet_point/poisson_naive.hpp f0e371ff51d115d9d432c924461d146e *src/glmnetpp/include/glmnetpp_bits/elnet_point/sp_binomial_multi_class.hpp 1e332d30886c5eebd6e7e018bba0a910 *src/glmnetpp/include/glmnetpp_bits/elnet_point/sp_binomial_multi_class_group.hpp abb05bf9a6cbb7149aa2c21cccdf8c66 *src/glmnetpp/include/glmnetpp_bits/elnet_point/sp_binomial_two_class.hpp b4713c8bb0ca27925feecaee4ae527ea *src/glmnetpp/include/glmnetpp_bits/elnet_point/sp_gaussian_cov.hpp e91bb7db0c829f949b3413c9ab37ff66 *src/glmnetpp/include/glmnetpp_bits/elnet_point/sp_gaussian_multi.hpp 7f8640e135084920f01d96e151fdc145 *src/glmnetpp/include/glmnetpp_bits/elnet_point/sp_gaussian_naive.hpp 430662b9b3a44cb7fa031f97e238228c *src/glmnetpp/include/glmnetpp_bits/elnet_point/sp_gaussian_wls.hpp 767c21def28cfc2e8ce1032cd63843c6 *src/glmnetpp/include/glmnetpp_bits/elnet_point/sp_poisson_naive.hpp 618d9d3027e19071fe91348ce0d0632d *src/glmnetpp/include/glmnetpp_bits/elnet_point/traits.hpp d2a0d65e62b184b88327dab0e60f3d4f *src/glmnetpp/include/glmnetpp_bits/util/exceptions.hpp fdd947ec7759a09dae82cff1c37add65 *src/glmnetpp/include/glmnetpp_bits/util/functional.hpp 85da5a391ec883f0965e2e4b31faf457 *src/glmnetpp/include/glmnetpp_bits/util/iterator/counting_iterator.hpp dd231d06581099fb1e6dfb250b6c4772 *src/glmnetpp/include/glmnetpp_bits/util/iterator/one_to_zero_iterator.hpp c68fcd6ea8bd80024c0ac06224946fec *src/glmnetpp/include/glmnetpp_bits/util/macros.hpp 81dfb8df3d43cbba6e2af02957f50766 *src/glmnetpp/include/glmnetpp_bits/util/type_traits.hpp f2db6bab97c8ae65055089179bd2ad62 *src/glmnetpp/include/glmnetpp_bits/util/types.hpp ee950f9cf36b9344502d89bc44dbc1f7 *src/glmnetpp/src/BUILD.bazel df1527bce45036b9b3b532e9c376f645 *src/glmnetpp/src/legacy/glmnet5dpclean.f fede0b4bf08739f61b59a22df5e1db6f *src/glmnetpp/src/legacy/legacy.h f6954e7f68ed31625f35c8c30f8ce670 *src/glmnetpp/src/legacy/pb.c f2fefcc9ad61b762fa701181df5ab618 *src/glmnetpp/src/legacy/wls.f 831f8471b6d1e390e28ec07b795baa87 *src/glmnetpp/test/BUILD.bazel 60bd9d8e7d622e848e590a0afabb00b8 *src/glmnetpp/test/elnet_driver/binomial_unittest.cpp 1a1109f6370ff67fed110d64263ee0be *src/glmnetpp/test/elnet_driver/chkvars_unittest.cpp 635eb0bb38e1403e460eba7b904c2e31 *src/glmnetpp/test/elnet_driver/gaussian_unittest.cpp 04560174d9e390e416864b55e71a3b39 *src/glmnetpp/test/elnet_driver/poisson_unittest.cpp 235327ec89ba6f73aae7e996ee782100 *src/glmnetpp/test/elnet_driver/standardize_unittest.cpp 92a9d3ab5e68c8107ba93b8aa7e35961 *src/glmnetpp/test/elnet_path/binomial_base.hpp f78729e797c40b2acb502e88a83bb6e7 *src/glmnetpp/test/elnet_path/binomial_multi_class_group_unittest.cpp 9cbe29ec5fb11333c45cdbf4d5de90de *src/glmnetpp/test/elnet_path/binomial_multi_class_unittest.cpp a70a1b878ab9a2bef17a4f967c2b1953 *src/glmnetpp/test/elnet_path/binomial_two_class_unittest.cpp 07d5a1e89548f3ffe29297114b6fb4c4 *src/glmnetpp/test/elnet_path/gaussian_base.hpp 41626b2a759cb9144d5b15c8d39d3f7f *src/glmnetpp/test/elnet_path/gaussian_cov_unittest.cpp ffbfd7f527c3c7c9713ee8bb9c21f079 *src/glmnetpp/test/elnet_path/gaussian_multi_unittest.cpp ce7aa4c6164da04d3d03f7c35ddb9f3a *src/glmnetpp/test/elnet_path/gaussian_naive_unittest.cpp cedb5b0c98c92af937486953a0a0ed2a *src/glmnetpp/test/elnet_path/poisson_naive_unittest.cpp 522f814b6cc48813a91736d99c1f9742 *src/glmnetpp/test/elnet_path/sp_binomial_multi_class_group_unittest.cpp e5fb0a09445197f4941b1b39a0bc8c01 *src/glmnetpp/test/elnet_path/sp_binomial_multi_class_unittest.cpp c9a484b8529bc518a0fd31c683733e83 *src/glmnetpp/test/elnet_path/sp_binomial_two_class_unittest.cpp 2c8af45ffbc9b10a5e05d3ecbd1d464b *src/glmnetpp/test/elnet_path/sp_gaussian_cov_unittest.cpp 20dec649f6a8e45ad8dcc5adc2769de7 *src/glmnetpp/test/elnet_path/sp_gaussian_multi_unittest.cpp 0f6f0d172dd16be5f0df984d728bc185 *src/glmnetpp/test/elnet_path/sp_gaussian_naive_unittest.cpp 88935481f549a14d38109d85d255b677 *src/glmnetpp/test/elnet_path/sp_poisson_naive_unittest.cpp ce0800e81b081a12708037db7478bcc1 *src/glmnetpp/test/elnet_point/gaussian_wls_unittest.cpp c4a66c616ad5aeecb54adf741a9190d3 *src/glmnetpp/test/elnet_point/sp_gaussian_wls_unittest.cpp 49c95e432342d4d6f713017265e5b8a2 *src/glmnetpp/test/testutil/base_fixture.hpp 21f42e507a7d92f700a7d01ccbdfce49 *src/glmnetpp/test/testutil/data_util.hpp 0e3eb72fc68ca81d2ff2121b6d1eae77 *src/glmnetpp/test/testutil/internal.cpp b0e171d26af0ea33f9f66e560958ff4f *src/glmnetpp/test/testutil/internal.hpp 61093ed030690cf1e09f08f878cc390f *src/glmnetpp/test/testutil/mapped_sparse_matrix_wrapper.hpp 4c5d7ffa51d9bcd1c282d0c0f57e6b67 *src/glmnetpp/test/testutil/mock_pb.hpp 3004faccd7ac9151af09042c300a780a *src/glmnetpp/test/testutil/thread.hpp 0f00c5a594d5682dcff33b723f49416d *src/glmnetpp/test/testutil/translation/elnet.hpp bf75d81f520bb463ba8ba05bbbbb2eb0 *src/glmnetpp/test/testutil/translation/elnet1.hpp 4f67f144a985104e087d131c0b34cd7e *src/glmnetpp/test/testutil/translation/elnet2.hpp 58a41d3aab21fa2729e3888933073c1e *src/glmnetpp/test/testutil/translation/fishnet.hpp 73bd8c0f6d4751e96efa27791e3cca2e *src/glmnetpp/test/testutil/translation/fishnet1.hpp 9b8d4c4247aa3261b76b3a39d32fe301 *src/glmnetpp/test/testutil/translation/lognet.hpp 20a6e3e7864706ebee529641050a2418 *src/glmnetpp/test/testutil/translation/lognet2n.hpp 495cc8e33e6d950c0f9b5d88e8064e92 *src/glmnetpp/test/testutil/translation/lognetn.hpp e8d6c499a36ed0c9db7cf3c89440811a *src/glmnetpp/test/testutil/translation/multelnet.hpp 26da8c06a2ed9a61693d19b984de06b8 *src/glmnetpp/test/testutil/translation/multelnet2.hpp c7666b63ab50eb45689b875b68ed3c08 *src/glmnetpp/test/testutil/translation/multlognetn.hpp d6181928438eb2e637eb0357eda5fb83 *src/glmnetpp/test/testutil/translation/multspelnet.hpp 69c3fb49b54f8ff6e96ca9c2737124ed *src/glmnetpp/test/testutil/translation/multspelnet2.hpp 4a2ab2e0c14b5495e7ca9347de3fba4a *src/glmnetpp/test/testutil/translation/multsplognetn.hpp cd1ab227681260e56ad22bb0feb8d35f *src/glmnetpp/test/testutil/translation/spelnet.hpp 56f3af18ead99b825402328155920e99 *src/glmnetpp/test/testutil/translation/spelnet1.hpp de5060bbcdbeee3896acd6afcfe11ae9 *src/glmnetpp/test/testutil/translation/spelnet2.hpp 24f436eb4e0244d64e878864e32267cc *src/glmnetpp/test/testutil/translation/spfishnet.hpp 3ef96711bf3084d3781d4efe7bb84c8b *src/glmnetpp/test/testutil/translation/spfishnet1.hpp e785825aa545c883af23ed7a370e0cc1 *src/glmnetpp/test/testutil/translation/splognet.hpp c554ef50d8be38da6e91d1570229faa3 *src/glmnetpp/test/testutil/translation/splognet2n.hpp 21bfe4c9a84f1077be78550278874f11 *src/glmnetpp/test/testutil/translation/splognetn.hpp a30f7f9c65a1b66da39ccc7d9f813b62 *src/glmnetpp/test/testutil/translation/wls.hpp 104e7f2fd158a3b381b46d169c464d2b *src/glmnetpp/test/translation/elnet1_unittest.cpp 2c1cb2f756c01dfb88b61d98e5eeb151 *src/glmnetpp/test/translation/elnet2_unittest.cpp 76363d4bbbb412342ae49d841d988211 *src/glmnetpp/test/translation/elnet_base_fixture.hpp 27424311ba6bfa41fa95a5f395adc8ce *src/glmnetpp/test/translation/elnet_dscheck_unittest.cpp 413e4c9e363432a2a9a3ee0dbb933c0a *src/glmnetpp/test/translation/elnet_unittest.cpp da9e21f4668a70b80a4b6c330b21b0b5 *src/glmnetpp/test/translation/fishnet1_unittest.cpp 520f35808daed9449be6effdb7148524 *src/glmnetpp/test/translation/fishnet_dscheck_unittest.cpp 7f5c5f53f624938b797be8ea77e4d449 *src/glmnetpp/test/translation/fishnet_unittest.cpp 7065f1dad9f6b3f39a58e833386545b6 *src/glmnetpp/test/translation/lognet2n_unittest.cpp 3f2c54ac45d50219a6289bf01c8b7800 *src/glmnetpp/test/translation/lognet_base_fixture.hpp adcd45d63244f23da2b534293a9640d9 *src/glmnetpp/test/translation/lognet_dscheck_unittest.cpp ebc813f6be1373d62574c084851724d7 *src/glmnetpp/test/translation/lognet_unittest.cpp 650bea70752e7561d673c7f6fd953abd *src/glmnetpp/test/translation/lognetn_unittest.cpp 59311937b041af4288d71282fabce73b *src/glmnetpp/test/translation/multelnet2_unittest.cpp 09c952906609bc80275a710094a8a28d *src/glmnetpp/test/translation/multelnet_dscheck_unittest.cpp a8b53fe4aec0ab81fa15b533f6697f0c *src/glmnetpp/test/translation/multelnet_unittest.cpp afa86af18fbd97a9097b428a8dd3ae61 *src/glmnetpp/test/translation/multlognetn_unittest.cpp 94efef051e8f2e3b37e1fb1c0f6067dc *src/glmnetpp/test/translation/multspelnet2_unittest.cpp 71ccf072ee5ee667522c6bf28afcfd0e *src/glmnetpp/test/translation/multspelnet_unittest.cpp fc355dae1693e7078b50f8fde7e52d75 *src/glmnetpp/test/translation/multsplognetn_unittest.cpp 98f93fd688357cc23e3071270067fffc *src/glmnetpp/test/translation/spelnet1_unittest.cpp e90ec0af1d740d320606fdc039c70175 *src/glmnetpp/test/translation/spelnet2_unittest.cpp b25b4558d9d36fd509af29d384ca87dc *src/glmnetpp/test/translation/spelnet_unittest.cpp 06d7f1d7c96b785592ead49d66cb574c *src/glmnetpp/test/translation/spfishnet1_unittest.cpp bf5761abd6e927ec8040822e418f870e *src/glmnetpp/test/translation/spfishnet_unittest.cpp 42d00328affdaca6aac915eea81bb669 *src/glmnetpp/test/translation/splognet2n_unittest.cpp 0d39ab79bcef0b71731ef61cf179a966 *src/glmnetpp/test/translation/splognet_unittest.cpp 805e90934c3e271d409978c0fbde0a52 *src/glmnetpp/test/translation/splognetn_unittest.cpp 59ac198743ab556e7ad2470e2dc7cae3 *src/glmnetpp/test/translation/wls_dscheck_unittest.cpp d661f98ae53881ad1d675b4bb8fca1a3 *src/glmnetpp/test/translation/wls_unittest.cpp b047cb04f0ce8cdd6646c63b15aaa28d *src/glmnetpp/test/util/type_traits_unittest.cpp 77b770bcd28bda0a4494523b25923bd7 *src/internal.cpp 8ea99330919d21eed89d729d36fecfda *src/internal.h f6954e7f68ed31625f35c8c30f8ce670 *src/pb.c 42d9e05de8b2fed45944fd8299dc77c5 *src/pb_exp.cpp 60635a7ab6c6a6a83b3e52160fbaeba7 *src/wls_exp.cpp 0bb3a929eff4b5695d75d5c08ae8360c *vignettes/Coxnet.Rmd 789121c8d4e2c1681d05f19d7a69a054 *vignettes/assets/coxnet.RDS f1cd70c3262b90738c0ea506d72ebd6c *vignettes/assets/glmnet_refs.bib 6b485f932628ec1755201811c3e05f49 *vignettes/assets/vignette_binomial.png 3f2e5f9cf200b832dd68492f66f63f9e *vignettes/assets/vignette_gaussian.png cf5043400bda8634df2235a543cea7b7 *vignettes/glmnet.Rmd cab72afa072399ca5ae1906987ef89f4 *vignettes/glmnetFamily.Rmd e1dc532562ac69525a0b9c3c095be562 *vignettes/relax.Rmd glmnet/R/0000755000176200001440000000000015035572362011751 5ustar liggesusersglmnet/R/print.bigGlm.R0000644000176200001440000000054114325602475014430 0ustar liggesusers#' @method print bigGlm #' @export print.bigGlm <- function (x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall: ", deparse(x$call), "\n\n") out=data.frame(Df = x$df, `%Dev` = round(x$dev.ratio*100, 2), Lambda = 0,check.names=FALSE,row.names=seq(along=x$df)) class(out)=c("anova",class(out)) print(out) } glmnet/R/jerr.fishnet.R0000644000176200001440000000046114325602475014476 0ustar liggesusersjerr.fishnet=function(n,maxit,pmax){ outlist=jerr.elnet(n,maxit,pmax) if(outlist$msg!="Unknown error")return(outlist) if(n==8888)msg="Negative response values - should be counts" else if(n==9999)msg="No positive observation weights" else msg="Unknown error" list(n=n,fatal=TRUE,msg=msg) } glmnet/R/coxnet.R0000644000176200001440000000323714657241602013400 0ustar liggesuserscoxnet=function(x,is.sparse,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,vnames,maxit){ y <- response.coxnet(y) if(!is.matrix(y)||!all(match(c("time","status"),dimnames(y)[[2]],0)))stop("Cox model requires a matrix with columns 'time' (>0) and 'status' (binary) as a response; a 'Surv' object suffices",call.=FALSE) ty=as.double(y[,"time"]) tevent=as.double(y[,"status"]) ty=ty+(1-tevent)*100*.Machine$double.eps## ties issue if(any(ty<=0))stop("negative event times encountered; not permitted for Cox family") maxit=as.integer(maxit) weights=as.double(weights) if(is.null(offset)){ offset=ty*0 is.offset=FALSE} else{ storage.mode(offset)="double" is.offset=TRUE } fit=if(is.sparse)stop("Cox model mot implemented for sparse x in glmnet",call.=FALSE) else .Fortran("coxnet", parm=alpha,nobs,nvars,x,ty,tevent,offset,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh, maxit,isd,# need to get JHF to reverse these lmu=integer(1), ca=double(nx*nlam), ia=integer(nx), nin=integer(nlam), nulldev=double(1), dev=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1),PACKAGE="glmnet" ) if(fit$jerr!=0){ errmsg=jerr(fit$jerr,maxit,pmax=nx,family="cox") if(errmsg$fatal)stop(errmsg$msg,call.=FALSE) else warning(errmsg$msg,call.=FALSE) } outlist=getcoef(fit,nvars,nx,vnames) dev=fit$dev[seq(fit$lmu)] outlist=c(outlist,list(dev.ratio=dev,nulldev=fit$nulldev,npasses=fit$nlp,jerr=fit$jerr,offset=is.offset)) class(outlist)="coxnet" outlist } glmnet/R/predict.glmnet.R0000644000176200001440000001540615033044600015004 0ustar liggesusers#' make predictions from a "glmnet" object. #' #' Similar to other predict methods, this functions predicts fitted values, #' logits, coefficients and more from a fitted \code{"glmnet"} object. #' #' The shape of the objects returned are different for \code{"multinomial"} #' objects. This function actually calls \code{NextMethod()}, and the #' appropriate predict method is invoked for each of the three model types. #' \code{coef(...)} is equivalent to \code{predict(type="coefficients",...)} #' #' @aliases coef.glmnet coef.relaxed predict.glmnet predict.relaxed #' predict.elnet predict.lognet predict.multnet predict.mrelnet predict.fishnet #' predict.coxnet #' @param object Fitted \code{"glmnet"} model object or a \code{"relaxed"} #' model (which inherits from class "glmnet"). #' @param newx Matrix of new values for \code{x} at which predictions are to be #' made. Must be a matrix; can be sparse as in \code{Matrix} package. This #' argument is not used for \code{type=c("coefficients","nonzero")} #' @param s Value(s) of the penalty parameter \code{lambda} at which #' predictions are required. Default is the entire sequence used to create the #' model. #' @param type Type of prediction required. Type \code{"link"} gives the linear #' predictors for \code{"binomial"}, \code{"multinomial"}, \code{"poisson"} or #' \code{"cox"} models; for \code{"gaussian"} models it gives the fitted #' values. Type \code{"response"} gives the fitted probabilities for #' \code{"binomial"} or \code{"multinomial"}, fitted mean for \code{"poisson"} #' and the fitted relative-risk for \code{"cox"}; for \code{"gaussian"} type #' \code{"response"} is equivalent to type \code{"link"}. Type #' \code{"coefficients"} computes the coefficients at the requested values for #' \code{s}. Note that for \code{"binomial"} models, results are returned only #' for the class corresponding to the second level of the factor response. #' Type \code{"class"} applies only to \code{"binomial"} or #' \code{"multinomial"} models, and produces the class label corresponding to #' the maximum probability. Type \code{"nonzero"} returns a list of the indices #' of the nonzero coefficients for each value of \code{s}. #' @param exact This argument is relevant only when predictions are made at #' values of \code{s} (lambda) \emph{different} from those used in the fitting #' of the original model. Not available for \code{"relaxed"} objects. If #' \code{exact=FALSE} (default), then the predict function uses linear #' interpolation to make predictions for values of \code{s} (lambda) that do #' not coincide with those used in the fitting algorithm. While this is often a #' good approximation, it can sometimes be a bit coarse. With #' \code{exact=TRUE}, these different values of \code{s} are merged (and #' sorted) with \code{object$lambda}, and the model is refit before predictions #' are made. In this case, it is required to supply the original data \code{x=} #' and \code{y=} as additional named arguments to \code{predict()} or #' \code{coef()}. The workhorse \code{predict.glmnet()} needs to \code{update} #' the model, and so needs the data used to create it. The same is true of #' \code{weights}, \code{offset}, \code{penalty.factor}, \code{lower.limits}, #' \code{upper.limits} if these were used in the original call. Failure to do #' so will result in an error. #' @param newoffset If an offset is used in the fit, then one must be supplied #' for making predictions (except for \code{type="coefficients"} or #' \code{type="nonzero"}) #' @param \dots This is the mechanism for passing arguments like \code{x=} when #' \code{exact=TRUE}; see\code{exact} argument. #' @return The object returned depends on type. #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet}, and \code{print}, and \code{coef} methods, and #' \code{cv.glmnet}. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent (2010), Journal of Statistical Software, Vol. 33(1), 1-22}, #' \doi{10.18637/jss.v033.i01}.\cr #' Simon, N., Friedman, J., Hastie, T. and Tibshirani, R. (2011) #' \emph{Regularization Paths for Cox's Proportional #' Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. #' 39(5), 1-13}, #' \doi{10.18637/jss.v039.i05}.\cr #' Glmnet webpage with four vignettes, \url{https://glmnet.stanford.edu}. #' @keywords models regression #' #' @examples #' x=matrix(rnorm(100*20),100,20) #' y=rnorm(100) #' g2=sample(1:2,100,replace=TRUE) #' g4=sample(1:4,100,replace=TRUE) #' fit1=glmnet(x,y) #' predict(fit1,newx=x[1:5,],s=c(0.01,0.005)) #' predict(fit1,type="coef") #' fit2=glmnet(x,g2,family="binomial") #' predict(fit2,type="response",newx=x[2:5,]) #' predict(fit2,type="nonzero") #' fit3=glmnet(x,g4,family="multinomial") #' predict(fit3,newx=x[1:3,],type="response",s=0.01) #' @method predict glmnet #' @export #' @export predict.glmnet predict.glmnet=function(object,newx,s=NULL,type=c("link","response","coefficients","nonzero","class"),exact=FALSE,newoffset,...){ type=match.arg(type) if(missing(newx)){ if(!match(type,c("coefficients","nonzero"),FALSE))stop("You need to supply a value for 'newx'") } if(exact&&(!is.null(s))){ ###we augment the lambda sequence with the new values, if they are different,and refit the model using update lambda=object$lambda which=match(s,lambda,FALSE) if(!all(which>0)){ lambda=unique(rev(sort(c(s,lambda)))) check_dots(object,...)# This fails if you don't supply the crucial arguments object=update(object,lambda=lambda,...) } } a0=t(as.matrix(object$a0)) rownames(a0)="(Intercept)" nbeta=methods::rbind2(a0,object$beta)#was rbind2 if(!is.null(s)){ vnames=dimnames(nbeta)[[1]] dimnames(nbeta)=list(NULL,NULL) lambda=object$lambda lamlist=lambda.interp(lambda,s) nbeta=nbeta[,lamlist$left,drop=FALSE]%*%Diagonal(x=lamlist$frac) +nbeta[,lamlist$right,drop=FALSE]%*%Diagonal(x=1-lamlist$frac) namess=names(s) if(is.null(namess))namess=paste0("s=",format(s)) dimnames(nbeta)=list(vnames,namess) } if(type=="coefficients")return(nbeta) if(type=="nonzero")return(nonzeroCoef(nbeta[-1,,drop=FALSE],bystep=TRUE)) ###Check on newx if(inherits(newx, "sparseMatrix"))newx=as(newx,"dMatrix") dx=dim(newx); p = object$dim[1] if(is.null(dx))newx=matrix(newx,1,byrow=TRUE) if(ncol(newx) != p)stop(paste0("The number of variables in newx must be ",p)) nfit=as.matrix(cbind2(1,newx)%*%nbeta) if(object$offset){ if(missing(newoffset))stop("No newoffset provided for prediction, yet offset used in fit of glmnet",call.=FALSE) if(is.matrix(newoffset)&&inherits(object,"lognet")&&dim(newoffset)[[2]]==2)newoffset=newoffset[,2] nfit=nfit+array(newoffset,dim=dim(nfit)) } nfit } glmnet/R/assess.glmnet.R0000644000176200001440000001363414325602475014671 0ustar liggesusers#' assess performance of a 'glmnet' object using test data. #' #' Given a test set, produce summary performance measures for the glmnet #' model(s) #' #' \code{assess.glmnet} produces all the different performance measures #' provided by \code{cv.glmnet} for each of the families. A single vector, or a #' matrix of predictions can be provided, or fitted model objects or CV #' objects. In the case when the predictions are still to be made, the #' \code{...} arguments allow, for example, 'offsets' and other prediction #' parameters such as values for 'gamma' for 'relaxed' fits. \code{roc.glmnet} #' produces for a single vector a two column matrix with columns TPR and FPR #' (true positive rate and false positive rate). This object can be plotted to #' produce an ROC curve. If more than one predictions are called for, then a #' list of such matrices is produced. \code{confusion.glmnet} produces a #' confusion matrix tabulating the classification results. Again, a single #' table or a list, with a print method. #' #' @aliases assess.glmnet confusion.glmnet roc.glmnet #' @param object Fitted \code{"glmnet"} or \code{"cv.glmnet"}, \code{"relaxed"} #' or \code{"cv.relaxed"} object, OR a matrix of predictions (for #' \code{roc.glmnet} or \code{assess.glmnet}). For \code{roc.glmnet} the model #' must be a 'binomial', and for \code{confusion.glmnet} must be either #' 'binomial' or 'multinomial' #' @param newx If predictions are to made, these are the 'x' values. Required #' for \code{confusion.glmnet} #' @param newy required argument for all functions; the new response values #' @param weights For observation weights for the test observations #' @param family The family of the model, in case predictions are passed in as #' 'object' #' @param ... additional arguments to \code{predict.glmnet} when "object" is a #' "glmnet" fit, and predictions must be made to produce the statistics. #' @return \code{assess.glmnet} produces a list of vectors of measures. #' \code{roc.glmnet} a list of 'roc' two-column matrices, and #' \code{confusion.glmnet} a list of tables. If a single prediction is #' provided, or predictions are made from a CV object, the latter two drop the #' list status and produce a single matrix or table. #' @author Trevor Hastie and Rob Tibshirani\cr Maintainer: Trevor Hastie #' #' @seealso \code{cv.glmnet}, \code{glmnet.measures} and \code{vignette("relax",package="glmnet")} #' @keywords models classification #' @examples #' #' data(QuickStartExample) #' x <- QuickStartExample$x; y <- QuickStartExample$y #' set.seed(11) #' train = sample(seq(length(y)),70,replace=FALSE) #' fit1 = glmnet(x[train,], y[train]) #' assess.glmnet(fit1, newx = x[-train,], newy = y[-train]) #' preds = predict(fit1, newx = x[-train, ], s = c(1, 0.25)) #' assess.glmnet(preds, newy = y[-train], family = "gaussian") #' fit1c = cv.glmnet(x, y, keep = TRUE) #' fit1a = assess.glmnet(fit1c$fit.preval, newy=y,family="gaussian") #' plot(fit1c$lambda, log="x",fit1a$mae,xlab="Log Lambda",ylab="Mean Absolute Error") #' abline(v=fit1c$lambda.min, lty=2, col="red") #' data(BinomialExample) #' x <- BinomialExample$x; y <- BinomialExample$y #' fit2 = glmnet(x[train,], y[train], family = "binomial") #' assess.glmnet(fit2,newx = x[-train,], newy=y[-train], s=0.1) #' plot(roc.glmnet(fit2, newx = x[-train,], newy=y[-train])[[10]]) #' fit2c = cv.glmnet(x, y, family = "binomial", keep=TRUE) #' idmin = match(fit2c$lambda.min, fit2c$lambda) #' plot(roc.glmnet(fit2c$fit.preval, newy = y)[[idmin]]) #' data(MultinomialExample) #' x <- MultinomialExample$x; y <- MultinomialExample$y #' set.seed(103) #' train = sample(seq(length(y)),100,replace=FALSE) #' fit3 = glmnet(x[train,], y[train], family = "multinomial") #' confusion.glmnet(fit3, newx = x[-train, ], newy = y[-train], s = 0.01) #' fit3c = cv.glmnet(x, y, family = "multinomial", type.measure="class", keep=TRUE) #' idmin = match(fit3c$lambda.min, fit3c$lambda) #' confusion.glmnet(fit3c$fit.preval, newy = y, family="multinomial")[[idmin]] #' #' @export assess.glmnet assess.glmnet=function(object,newx=NULL,newy,weights=NULL, family=c("gaussian","binomial","poisson","multinomial","cox","mgaussian"), ...){ ### object must be either a glmnet or cv.glmnet object, or else a matrix/vector of predictions of a glmnet model (not on the mean scale, but natural parameter scale) ### It must either be a matrix or an array. The last dimension can be 1. oclass=grep("glmnet",class(object)) if(length(oclass)){# either a glmnet or cv.glmnet predmat=predict(object,newx=newx,...) fam=family(object) } else{ if(is.character(family))fam=match.arg(family) else { if(is.function(family))family=family() if(!inherits(family,"family")) stop("Invalid family argument; must be either character, function or family object") fam=family } predmat=object if(is.vector(predmat))predmat=as.matrix(predmat) } famtype=fam attr(predmat,"family")=fam if(inherits(fam,"family"))famtype="GLM" type.measures = glmnet.measures(famtype) y = drop(newy) dimy=dim(y) nrowy=ifelse(is.null(dimy),length(y),dimy[1]) if (is.null(weights)) weights = rep(1, nrowy) subclass=switch(famtype,gaussian="elnet",binomial="lognet",poisson="fishnet",multinomial="multnet", cox="coxnet",mgaussian="mrelnet",GLM="glmnetfit") fun = paste("cv", subclass, sep = ".") if(subclass=="coxnet")fun="assess.coxnet" outlist=as.list(type.measures) names(outlist)=type.measures for(type.measure in type.measures){ type.measure=cvtype(type.measure,subclass) teststuff = do.call(fun, list(predmat,y,type.measure,weights,foldid=rep(1,nrowy),grouped=FALSE)) out=drop(with(teststuff, apply(cvraw, 2, weighted.mean, w = weights, na.rm = TRUE))) attr(out,"measure")=names(type.measure) outlist[[type.measure]]=out } outlist } glmnet/R/cv.glmnet.R0000644000176200001440000003251014760371700013767 0ustar liggesusers#' Cross-validation for glmnet #' #' Does k-fold cross-validation for glmnet, produces a plot, and returns a #' value for \code{lambda} (and \code{gamma} if \code{relax=TRUE}) #' #' The function runs \code{glmnet} \code{nfolds}+1 times; the first to get the #' \code{lambda} sequence, and then the remainder to compute the fit with each #' of the folds omitted. The error is accumulated, and the average error and #' standard deviation over the folds is computed. Note that \code{cv.glmnet} #' does NOT search for values for \code{alpha}. A specific value should be #' supplied, else \code{alpha=1} is assumed by default. If users would like to #' cross-validate \code{alpha} as well, they should call \code{cv.glmnet} with #' a pre-computed vector \code{foldid}, and then use this same fold vector in #' separate calls to \code{cv.glmnet} with different values of \code{alpha}. #' Note also that the results of \code{cv.glmnet} are random, since the folds #' are selected at random. Users can reduce this randomness by running #' \code{cv.glmnet} many times, and averaging the error curves. #' #' If \code{relax=TRUE} then the values of \code{gamma} are used to mix the #' fits. If \eqn{\eta} is the fit for lasso/elastic net, and \eqn{\eta_R} is #' the relaxed fit (with unpenalized coefficients), then a relaxed fit mixed by #' \eqn{\gamma} is \deqn{\eta(\gamma)=(1-\gamma)\eta_R+\gamma\eta.} There is #' practically no extra cost for having a lot of values for \code{gamma}. #' However, 5 seems sufficient for most purposes. CV then selects both #' \code{gamma} and \code{lambda}. #' #' @param x \code{x} matrix as in \code{glmnet}. #' @param y response \code{y} as in \code{glmnet}. #' @param weights Observation weights; defaults to 1 per observation #' @param offset Offset vector (matrix) as in \code{glmnet} #' @param lambda Optional user-supplied lambda sequence; default is #' \code{NULL}, and \code{glmnet} chooses its own sequence. Note that this is done #' for the full model (master sequence), and separately for each fold. #' The fits are then alligned using the master sequence (see the \code{allignment} #' argument for additional details). Adapting \code{lambda} for each fold #' leads to better convergence. When \code{lambda} is supplied, the same sequence #' is used everywhere, but in some GLMs can lead to convergence issues. #' @param type.measure loss to use for cross-validation. Currently five #' options, not all available for all models. The default is #' \code{type.measure="deviance"}, which uses squared-error for gaussian models #' (a.k.a \code{type.measure="mse"} there), deviance for logistic and poisson #' regression, and partial-likelihood for the Cox model. #' \code{type.measure="class"} applies to binomial and multinomial logistic #' regression only, and gives misclassification error. #' \code{type.measure="auc"} is for two-class logistic regression only, and #' gives area under the ROC curve. \code{type.measure="mse"} or #' \code{type.measure="mae"} (mean absolute error) can be used by all models #' except the \code{"cox"}; they measure the deviation from the fitted mean to #' the response. For binomial model and binary data, \code{type.measure="mse"} amounts to the "Brier" score. #' \code{type.measure="C"} is Harrel's concordance measure, only available for \code{cox} models. #' @param nfolds number of folds - default is 10. Although \code{nfolds} can be #' as large as the sample size (leave-one-out CV), it is not recommended for #' large datasets. Smallest value allowable is \code{nfolds=3} #' @param foldid an optional vector of values between 1 and \code{nfolds} #' identifying what fold each observation is in. If supplied, \code{nfolds} can #' be missing. #' @param alignment This is an experimental argument, designed to fix the #' problems users were having with CV, with possible values \code{"lambda"} #' (the default) else \code{"fraction"}. With \code{"lambda"} the \code{lambda} #' values from the master fit (on all the data) are used to line up the #' predictions from each of the folds. In some cases this can give strange #' values, since the effective \code{lambda} values in each fold could be quite #' different. With \code{"fraction"} we line up the predictions in each fold #' according to the fraction of progress along the regularization. If in the #' call a \code{lambda} argument is also provided, \code{alignment="fraction"} #' is ignored (with a warning). #' @param grouped This is an experimental argument, with default \code{TRUE}, #' and can be ignored by most users. For all models except the \code{"cox"}, #' this refers to computing \code{nfolds} separate statistics, and then using #' their mean and estimated standard error to describe the CV curve. If #' \code{grouped=FALSE}, an error matrix is built up at the observation level #' from the predictions from the \code{nfolds} fits, and then summarized (does #' not apply to \code{type.measure="auc"}). For the \code{"cox"} family, #' \code{grouped=TRUE} obtains the CV partial likelihood for the Kth fold by #' \emph{subtraction}; by subtracting the log partial likelihood evaluated on #' the full dataset from that evaluated on the on the (K-1)/K dataset. This #' makes more efficient use of risk sets. With \code{grouped=FALSE} the log #' partial likelihood is computed only on the Kth fold #' @param keep If \code{keep=TRUE}, a \emph{prevalidated} array is returned #' containing fitted values for each observation and each value of #' \code{lambda}. This means these fits are computed with this observation and #' the rest of its fold omitted. The \code{foldid} vector is also returned. #' Default is keep=FALSE. If \code{relax=TRUE}, then a list of such arrays is #' returned, one for each value of 'gamma'. Note: if the value 'gamma=1' is #' omitted, this case is included in the list since it corresponds to the #' original 'glmnet' fit. #' @param parallel If \code{TRUE}, use parallel \code{foreach} to fit each #' fold. Must register parallel before hand, such as \code{doMC} or others. #' See the example below. #' @param gamma The values of the parameter for mixing the relaxed fit with the #' regularized fit, between 0 and 1; default is \code{gamma = c(0, 0.25, 0.5, #' 0.75, 1)} #' @param relax If \code{TRUE}, then CV is done with respect to the mixing #' parameter \code{gamma} as well as \code{lambda}. Default is #' \code{relax=FALSE} #' @param trace.it If \code{trace.it=1}, then progress bars are displayed; #' useful for big models that take a long time to fit. Limited tracing if #' \code{parallel=TRUE} #' @param \dots Other arguments that can be passed to glmnet, for example \code{alpha}, \code{nlambda}, etc. See `glmnet` for details. #' @return an object of class \code{"cv.glmnet"} is returned, which is a list #' with the ingredients of the cross-validation fit. If the object was created #' with \code{relax=TRUE} then this class has a prefix class of #' \code{"cv.relaxed"}. \item{lambda}{the values of \code{lambda} used in the #' fits.} \item{cvm}{The mean cross-validated error - a vector of length #' \code{length(lambda)}.} \item{cvsd}{estimate of standard error of #' \code{cvm}.} \item{cvup}{upper curve = \code{cvm+cvsd}.} \item{cvlo}{lower #' curve = \code{cvm-cvsd}.} \item{nzero}{number of non-zero coefficients at #' each \code{lambda}.} \item{name}{a text string indicating type of measure #' (for plotting purposes).} \item{glmnet.fit}{a fitted glmnet object for the #' full data.} \item{lambda.min}{value of \code{lambda} that gives minimum #' \code{cvm}.} \item{lambda.1se}{largest value of \code{lambda} such that #' error is within 1 standard error of the minimum.} \item{fit.preval}{if #' \code{keep=TRUE}, this is the array of prevalidated fits. Some entries can #' be \code{NA}, if that and subsequent values of \code{lambda} are not reached #' for that fold} \item{foldid}{if \code{keep=TRUE}, the fold assignments used} #' \item{index}{a one column matrix with the indices of \code{lambda.min} and \code{lambda.1se} in the sequence of coefficients, fits etc.} #' \item{relaxed}{if \code{relax=TRUE}, this additional item has the CV info #' for each of the mixed fits. In particular it also selects \code{lambda, #' gamma} pairs corresponding to the 1se rule, as well as the minimum error. It also has a component \code{index}, a two-column matrix which contains the \code{lambda} and \code{gamma} indices corresponding to the "min" and "1se" solutions.} #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Noah Simon #' helped develop the 'coxnet' function.\cr Jeffrey Wong and B. Narasimhan #' helped with the parallel option\cr Maintainer: Trevor Hastie #' \email{hastie@@stanford.edu} #' @seealso \code{glmnet} and \code{plot}, \code{predict}, and \code{coef} #' methods for \code{"cv.glmnet"} and \code{"cv.relaxed"} objects. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent (2010), Journal of Statistical Software, Vol. 33(1), 1-22}, #' \doi{10.18637/jss.v033.i01}.\cr #' Simon, N., Friedman, J., Hastie, T. and Tibshirani, R. (2011) #' \emph{Regularization Paths for Cox's Proportional #' Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. #' 39(5), 1-13}, #' \doi{10.18637/jss.v039.i05}. #' @keywords models regression #' @examples #' #' set.seed(1010) #' n = 1000 #' p = 100 #' nzc = trunc(p/10) #' x = matrix(rnorm(n * p), n, p) #' beta = rnorm(nzc) #' fx = x[, seq(nzc)] %*% beta #' eps = rnorm(n) * 5 #' y = drop(fx + eps) #' px = exp(fx) #' px = px/(1 + px) #' ly = rbinom(n = length(px), prob = px, size = 1) #' set.seed(1011) #' cvob1 = cv.glmnet(x, y) #' plot(cvob1) #' coef(cvob1) #' predict(cvob1, newx = x[1:5, ], s = "lambda.min") #' title("Gaussian Family", line = 2.5) #' set.seed(1011) #' cvob1a = cv.glmnet(x, y, type.measure = "mae") #' plot(cvob1a) #' title("Gaussian Family", line = 2.5) #' set.seed(1011) #' par(mfrow = c(2, 2), mar = c(4.5, 4.5, 4, 1)) #' cvob2 = cv.glmnet(x, ly, family = "binomial") #' plot(cvob2) #' title("Binomial Family", line = 2.5) #' frame() #' set.seed(1011) #' cvob3 = cv.glmnet(x, ly, family = "binomial", type.measure = "class") #' plot(cvob3) #' title("Binomial Family", line = 2.5) #' \dontrun{ #' cvob1r = cv.glmnet(x, y, relax = TRUE) #' plot(cvob1r) #' predict(cvob1r, newx = x[, 1:5]) #' set.seed(1011) #' cvob3a = cv.glmnet(x, ly, family = "binomial", type.measure = "auc") #' plot(cvob3a) #' title("Binomial Family", line = 2.5) #' set.seed(1011) #' mu = exp(fx/10) #' y = rpois(n, mu) #' cvob4 = cv.glmnet(x, y, family = "poisson") #' plot(cvob4) #' title("Poisson Family", line = 2.5) #' #' # Multinomial #' n = 500 #' p = 30 #' nzc = trunc(p/10) #' x = matrix(rnorm(n * p), n, p) #' beta3 = matrix(rnorm(30), 10, 3) #' beta3 = rbind(beta3, matrix(0, p - 10, 3)) #' f3 = x %*% beta3 #' p3 = exp(f3) #' p3 = p3/apply(p3, 1, sum) #' g3 = glmnet:::rmult(p3) #' set.seed(10101) #' cvfit = cv.glmnet(x, g3, family = "multinomial") #' plot(cvfit) #' title("Multinomial Family", line = 2.5) #' # Cox #' beta = rnorm(nzc) #' fx = x[, seq(nzc)] %*% beta/3 #' hx = exp(fx) #' ty = rexp(n, hx) #' tcens = rbinom(n = n, prob = 0.3, size = 1) # censoring indicator #' y = cbind(time = ty, status = 1 - tcens) # y=Surv(ty,1-tcens) with library(survival) #' foldid = sample(rep(seq(10), length = n)) #' fit1_cv = cv.glmnet(x, y, family = "cox", foldid = foldid) #' plot(fit1_cv) #' title("Cox Family", line = 2.5) #' # Parallel #' require(doMC) #' registerDoMC(cores = 4) #' x = matrix(rnorm(1e+05 * 100), 1e+05, 100) #' y = rnorm(1e+05) #' system.time(cv.glmnet(x, y)) #' system.time(cv.glmnet(x, y, parallel = TRUE)) #' } #' #' @export cv.glmnet cv.glmnet <- function (x, y, weights=NULL, offset = NULL, lambda = NULL, type.measure = c("default","mse", "deviance", "class", "auc", "mae","C"), nfolds = 10, foldid=NULL, alignment=c("lambda","fraction"),grouped = TRUE, keep = FALSE, parallel = FALSE, gamma=c(0,.25,.5,.75,1),relax=FALSE,trace.it=0, ...) { type.measure = match.arg(type.measure) alignment=match.arg(alignment) if (!is.null(lambda) && length(lambda) < 2) stop("Need more than one value of lambda for cv.glmnet") if (!is.null(lambda) && alignment=="fraction"){ warning("fraction of path alignment not available if lambda given as argument; switched to alignment=`lambda`") alignment="lambda" } N = nrow(x) if (is.null(weights)) weights = rep(1, N) else weights = as.double(weights) y = drop(y) cv.call=glmnet.call = match.call(expand.dots = TRUE) which = match(c("type.measure", "nfolds", "foldid", "grouped", "keep"), names(glmnet.call), FALSE) if (any(which)) glmnet.call = glmnet.call[-which] glmnet.call[[1]] = as.name("glmnet") if(glmnet.control()$itrace)trace.it=1 else{ if(trace.it){ glmnet.control(itrace=1) on.exit(glmnet.control(itrace=0)) } } if (is.null(foldid)) foldid = sample(rep(seq(nfolds), length = N)) else nfolds = max(foldid) if (nfolds < 3) stop("nfolds must be bigger than 3; nfolds=10 recommended") ### Now we switch depending on relax if(relax) cv.relaxed.raw(x,y,weights,offset,lambda,type.measure,nfolds,foldid, alignment,grouped,keep,parallel,trace.it,glmnet.call,cv.call,gamma,...) else cv.glmnet.raw(x,y,weights,offset,lambda,type.measure,nfolds,foldid, alignment,grouped,keep,parallel,trace.it,glmnet.call,cv.call,...) } glmnet/R/na.mean.R0000644000176200001440000000030114325602475013403 0ustar liggesusersna.mean=function(x){ ### replace missing entries with mean for that column. namean=function(x){ nas=is.na(x) if(any(nas)) x[nas]=mean(x,na.rm=TRUE) x } apply(x,2,namean) } glmnet/R/buildPredmat.array.R0000644000176200001440000000424514325602475015632 0ustar liggesusers#' @method buildPredmat array #' @export buildPredmat.array=function(outlist, lambda, x, offset, foldid, alignment,...){ if (!is.null(offset)) is.offset = TRUE else is.offset = FALSE nc=dim(outlist[[1]]$a0)[1] nobs=nrow(x) predmat = array(NA, c(nobs, nc, length(lambda))) nfolds = max(foldid) nlams = double(nfolds) nlambda = length(lambda) for (i in seq(nfolds)) { which = foldid == i fitobj = outlist[[i]] if (is.offset) off_sub = offset[which, , drop = FALSE] preds = switch(alignment, fraction = predict(fitobj, x[which, , drop = FALSE], newoffset = off_sub,...), lambda = predict(fitobj, x[which, , drop = FALSE], s = lambda, newoffset = off_sub,...)) nlami = min(dim(preds)[3], nlambda) predmat[which, , seq(nlami)] = preds[, , seq(nlami)] if (nlami < nlambda) predmat[which, , seq(from = nlami, to = nlambda)] = preds[,, nlami] } ### fix up dimnames rn=rownames(x) sn=paste("s",seq(0,length=nlambda),sep="") cn=dimnames(preds)[[2]] dimnames(predmat)=list(rn,cn,sn) predmat } #' @method buildPredmat multnetlist #' @export buildPredmat.multnetlist=function(outlist, lambda, x, offset, foldid, alignment,...){ mat=buildPredmat.array(outlist, lambda, x, offset, foldid, alignment,...) attr(mat,"classnames")=outlist[[1]]$classnames mat } #' @method buildPredmat mrelnetlist #' @export buildPredmat.mrelnetlist=function(outlist, lambda, x, offset, foldid, alignment,...){ buildPredmat.array(outlist, lambda, x, offset, foldid, alignment,...) } #' @method buildPredmat lognetlist #' @export buildPredmat.lognetlist=function(outlist, lambda, x, offset, foldid, alignment,...){ mat=buildPredmat.default(outlist, lambda, x, offset, foldid, alignment,...) attr(mat,"classnames")=outlist[[1]]$classnames mat } #' @method buildPredmat glmnetfitlist #' @export buildPredmat.glmnetfitlist=function(outlist, lambda, x, offset, foldid, alignment,family,...){ mat=buildPredmat.default(outlist, lambda, x, offset, foldid, alignment,...) attr(mat,"family")=family mat } glmnet/R/RcppExports.R0000644000176200001440000001205215035556062014364 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 elnet_exp <- function(ka, parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr) { .Call('_glmnet_elnet_exp', PACKAGE = 'glmnet', ka, parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr) } spelnet_exp <- function(ka, parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr) { .Call('_glmnet_spelnet_exp', PACKAGE = 'glmnet', ka, parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr) } lognet_exp <- function(parm, x, y, g, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, kopt, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr) { .Call('_glmnet_lognet_exp', PACKAGE = 'glmnet', parm, x, y, g, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, kopt, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr) } splognet_exp <- function(parm, x, y, g, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, kopt, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr) { .Call('_glmnet_splognet_exp', PACKAGE = 'glmnet', parm, x, y, g, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, kopt, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr) } fishnet_exp <- function(parm, x, y, g, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr) { .Call('_glmnet_fishnet_exp', PACKAGE = 'glmnet', parm, x, y, g, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr) } spfishnet_exp <- function(parm, x, y, g, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr) { .Call('_glmnet_spfishnet_exp', PACKAGE = 'glmnet', parm, x, y, g, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr) } multelnet_exp <- function(parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, jsd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr) { .Call('_glmnet_multelnet_exp', PACKAGE = 'glmnet', parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, jsd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr) } multspelnet_exp <- function(parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, jsd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr) { .Call('_glmnet_multspelnet_exp', PACKAGE = 'glmnet', parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, jsd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr) } get_int_parms <- function(fdev, eps, big, mnlam, devmax, pmin, exmx, itrace) { .Call('_glmnet_get_int_parms', PACKAGE = 'glmnet', fdev, eps, big, mnlam, devmax, pmin, exmx, itrace) } get_int_parms2 <- function(epsnr, mxitnr) { .Call('_glmnet_get_int_parms2', PACKAGE = 'glmnet', epsnr, mxitnr) } chg_fract_dev <- function(arg) { invisible(.Call('_glmnet_chg_fract_dev', PACKAGE = 'glmnet', arg)) } chg_dev_max <- function(arg) { invisible(.Call('_glmnet_chg_dev_max', PACKAGE = 'glmnet', arg)) } chg_min_flmin <- function(arg) { invisible(.Call('_glmnet_chg_min_flmin', PACKAGE = 'glmnet', arg)) } chg_big <- function(arg) { invisible(.Call('_glmnet_chg_big', PACKAGE = 'glmnet', arg)) } chg_min_lambdas <- function(irg) { invisible(.Call('_glmnet_chg_min_lambdas', PACKAGE = 'glmnet', irg)) } chg_min_null_prob <- function(arg) { invisible(.Call('_glmnet_chg_min_null_prob', PACKAGE = 'glmnet', arg)) } chg_max_exp <- function(arg) { invisible(.Call('_glmnet_chg_max_exp', PACKAGE = 'glmnet', arg)) } chg_itrace <- function(irg) { invisible(.Call('_glmnet_chg_itrace', PACKAGE = 'glmnet', irg)) } chg_bnorm <- function(arg, irg) { invisible(.Call('_glmnet_chg_bnorm', PACKAGE = 'glmnet', arg, irg)) } get_bnorm <- function(prec, mxit) { .Call('_glmnet_get_bnorm', PACKAGE = 'glmnet', prec, mxit) } chg_epsnr <- function(arg) { invisible(.Call('_glmnet_chg_epsnr', PACKAGE = 'glmnet', arg)) } chg_mxitnr <- function(irg) { invisible(.Call('_glmnet_chg_mxitnr', PACKAGE = 'glmnet', irg)) } wls_exp <- function(alm0, almc, alpha, m, no, ni, x, r, xv, v, intr, ju, vp, cl, nx, thr, maxit, a, aint, g, ia, iy, iz, mm, nino, rsqc, nlp, jerr) { .Call('_glmnet_wls_exp', PACKAGE = 'glmnet', alm0, almc, alpha, m, no, ni, x, r, xv, v, intr, ju, vp, cl, nx, thr, maxit, a, aint, g, ia, iy, iz, mm, nino, rsqc, nlp, jerr) } spwls_exp <- function(alm0, almc, alpha, m, no, ni, x, xm, xs, r, xv, v, intr, ju, vp, cl, nx, thr, maxit, a, aint, g, ia, iy, iz, mm, nino, rsqc, nlp, jerr) { .Call('_glmnet_spwls_exp', PACKAGE = 'glmnet', alm0, almc, alpha, m, no, ni, x, xm, xs, r, xv, v, intr, ju, vp, cl, nx, thr, maxit, a, aint, g, ia, iy, iz, mm, nino, rsqc, nlp, jerr) } glmnet/R/jerr.R0000644000176200001440000000115214325602475013035 0ustar liggesusersjerr=function(n,maxit,pmax,family){ if(n==0) list(n=0,fatal=FALSE,msg="") else { errlist=switch(family, "gaussian"=jerr.elnet(n,maxit,pmax), "binomial"=jerr.lognet(n,maxit,pmax), "multinomial"=jerr.lognet(n,maxit,pmax), "poisson"=jerr.fishnet(n,maxit,pmax), "cox"=jerr.coxnet(n,maxit,pmax), "mrelnet"=jerr.mrelnet(n,maxit,pmax) ) names(errlist)=c("n","fatal","msg") errlist$msg=paste("from glmnet C++ code (error code ",n, "); ",errlist$msg,sep="") errlist } } glmnet/R/glmnet.R0000644000176200001440000006626014657241017013373 0ustar liggesusers#' fit a GLM with lasso or elasticnet regularization #' #' Fit a generalized linear model via penalized maximum likelihood. The #' regularization path is computed for the lasso or elasticnet penalty at a #' grid of values for the regularization parameter lambda. Can deal with all #' shapes of data, including very large sparse data matrices. Fits linear, #' logistic and multinomial, poisson, and Cox regression models. #' #' The sequence of models implied by \code{lambda} is fit by coordinate #' descent. For \code{family="gaussian"} this is the lasso sequence if #' \code{alpha=1}, else it is the elasticnet sequence. #' #' The objective function for \code{"gaussian"} is \deqn{1/2 RSS/nobs + #' \lambda*penalty,} and for the other models it is \deqn{-loglik/nobs + #' \lambda*penalty.} Note also that for \code{"gaussian"}, \code{glmnet} #' standardizes y to have unit variance (using 1/n rather than 1/(n-1) formula) #' before computing its lambda sequence (and then unstandardizes the resulting #' coefficients); if you wish to reproduce/compare results with other software, #' best to supply a standardized y. The coefficients for any predictor #' variables with zero variance are set to zero for all values of lambda. #' #' ## Details on `family` option #' #' From version 4.0 onwards, glmnet supports both the original built-in families, #' as well as \emph{any} family object as used by `stats:glm()`. #' This opens the door to a wide variety of additional models. For example #' `family=binomial(link=cloglog)` or `family=negative.binomial(theta=1.5)` (from the MASS library). #' Note that the code runs faster for the built-in families. #' #' The built in families are specifed via a character string. For all families, #' the object produced is a lasso or elasticnet regularization path for fitting the #' generalized linear regression paths, by maximizing the appropriate penalized #' log-likelihood (partial likelihood for the "cox" model). Sometimes the #' sequence is truncated before \code{nlambda} values of \code{lambda} have #' been used, because of instabilities in the inverse link functions near a #' saturated fit. \code{glmnet(...,family="binomial")} fits a traditional #' logistic regression model for the log-odds. #' \code{glmnet(...,family="multinomial")} fits a symmetric multinomial model, #' where each class is represented by a linear model (on the log-scale). The #' penalties take care of redundancies. A two-class \code{"multinomial"} model #' will produce the same fit as the corresponding \code{"binomial"} model, #' except the pair of coefficient matrices will be equal in magnitude and #' opposite in sign, and half the \code{"binomial"} values. #' Two useful additional families are the \code{family="mgaussian"} family and #' the \code{type.multinomial="grouped"} option for multinomial fitting. The #' former allows a multi-response gaussian model to be fit, using a "group #' -lasso" penalty on the coefficients for each variable. Tying the responses #' together like this is called "multi-task" learning in some domains. The #' grouped multinomial allows the same penalty for the #' \code{family="multinomial"} model, which is also multi-responsed. For both #' of these the penalty on the coefficient vector for variable j is #' \deqn{(1-\alpha)/2||\beta_j||_2^2+\alpha||\beta_j||_2.} When \code{alpha=1} #' this is a group-lasso penalty, and otherwise it mixes with quadratic just #' like elasticnet. A small detail in the Cox model: if death times are tied #' with censored times, we assume the censored times occurred just #' \emph{before} the death times in computing the Breslow approximation; if #' users prefer the usual convention of \emph{after}, they can add a small #' number to all censoring times to achieve this effect. #' #' ## Details on response for `family="cox"` #' #' For Cox models, the response should preferably be a \code{Surv} object, #' created by the \code{Surv()} function in \pkg{survival} package. For #' right-censored data, this object should have type "right", and for #' (start, stop] data, it should have type "counting". To fit stratified Cox #' models, strata should be added to the response via the \code{stratifySurv()} #' function before passing the response to \code{glmnet()}. (For backward #' compatibility, right-censored data can also be passed as a #' two-column matrix with columns named 'time' and 'status'. The #' latter is a binary variable, with '1' indicating death, and '0' indicating #' right censored.) #' #' ## Details on `relax` option #' #' If \code{relax=TRUE} #' a duplicate sequence of models is produced, where each active set in the #' elastic-net path is refit without regularization. The result of this is a #' matching \code{"glmnet"} object which is stored on the original object in a #' component named \code{"relaxed"}, and is part of the glmnet output. #' Generally users will not call \code{relax.glmnet} directly, unless the #' original 'glmnet' object took a long time to fit. But if they do, they must #' supply the fit, and all the original arguments used to create that fit. They #' can limit the length of the relaxed path via 'maxp'. #' #' @param x input matrix, of dimension nobs x nvars; each row is an observation #' vector. Can be in sparse matrix format (inherit from class #' \code{"sparseMatrix"} as in package \code{Matrix}). #' Requirement: \code{nvars >1}; in other words, \code{x} should have 2 or more columns. #' @param y response variable. Quantitative for \code{family="gaussian"}, or #' \code{family="poisson"} (non-negative counts). For \code{family="binomial"} #' should be either a factor with two levels, or a two-column matrix of counts #' or proportions (the second column is treated as the target class; for a #' factor, the last level in alphabetical order is the target class). For #' \code{family="multinomial"}, can be a \code{nc>=2} level factor, or a matrix #' with \code{nc} columns of counts or proportions. For either #' \code{"binomial"} or \code{"multinomial"}, if \code{y} is presented as a #' vector, it will be coerced into a factor. For \code{family="cox"}, preferably #' a \code{Surv} object from the survival package: see Details section for #' more information. For \code{family="mgaussian"}, \code{y} is a matrix #' of quantitative responses. #' @param family Either a character string representing #' one of the built-in families, or else a `glm()` family object. For more #' information, see Details section below or the documentation for response #' type (above). #' @param weights observation weights. Can be total counts if responses are #' proportion matrices. Default is 1 for each observation #' @param offset A vector of length \code{nobs} that is included in the linear #' predictor (a \code{nobs x nc} matrix for the \code{"multinomial"} family). #' Useful for the \code{"poisson"} family (e.g. log of exposure time), or for #' refining a model by starting at a current fit. Default is \code{NULL}. If #' supplied, then values must also be supplied to the \code{predict} function. #' @param alpha The elasticnet mixing parameter, with \eqn{0\le\alpha\le 1}. #' The penalty is defined as #' \deqn{(1-\alpha)/2||\beta||_2^2+\alpha||\beta||_1.} \code{alpha=1} is the #' lasso penalty, and \code{alpha=0} the ridge penalty. #' @param nlambda The number of \code{lambda} values - default is 100. #' @param lambda.min.ratio Smallest value for \code{lambda}, as a fraction of #' \code{lambda.max}, the (data derived) entry value (i.e. the smallest value #' for which all coefficients are zero). The default depends on the sample size #' \code{nobs} relative to the number of variables \code{nvars}. If \code{nobs #' > nvars}, the default is \code{0.0001}, close to zero. If \code{nobs < #' nvars}, the default is \code{0.01}. A very small value of #' \code{lambda.min.ratio} will lead to a saturated fit in the \code{nobs < #' nvars} case. This is undefined for \code{"binomial"} and #' \code{"multinomial"} models, and \code{glmnet} will exit gracefully when the #' percentage deviance explained is almost 1. #' @param lambda A user supplied \code{lambda} sequence. Typical usage is to #' have the program compute its own \code{lambda} sequence based on #' \code{nlambda} and \code{lambda.min.ratio}. Supplying a value of #' \code{lambda} overrides this. WARNING: use with care. Avoid supplying a #' single value for \code{lambda} (for predictions after CV use #' \code{predict()} instead). Supply instead a decreasing sequence of #' \code{lambda} values. \code{glmnet} relies on its warms starts for speed, #' and its often faster to fit a whole path than compute a single fit. #' @param standardize Logical flag for x variable standardization, prior to #' fitting the model sequence. The coefficients are always returned on the #' original scale. Default is \code{standardize=TRUE}. If variables are in the #' same units already, you might not wish to standardize. See details below for #' y standardization with \code{family="gaussian"}. #' @param intercept Should intercept(s) be fitted (default=TRUE) or set to zero #' (FALSE) #' @param thresh Convergence threshold for coordinate descent. Each inner #' coordinate-descent loop continues until the maximum change in the objective #' after any coefficient update is less than \code{thresh} times the null #' deviance. Defaults value is \code{1E-7}. #' @param dfmax Limit the maximum number of variables in the model. Useful for #' very large \code{nvars}, if a partial path is desired. #' @param pmax Limit the maximum number of variables ever to be nonzero #' @param exclude Indices of variables to be excluded from the model. Default #' is none. Equivalent to an infinite penalty factor for the variables excluded (next item). #' Users can supply instead an \code{exclude} function that generates the list of indices. #' This function is most generally defined as \code{function(x, y, weights, ...)}, #' and is called inside \code{glmnet} to generate the indices for excluded variables. #' The \code{...} argument is required, the others are optional. #' This is useful for filtering wide data, and works correctly with \code{cv.glmnet}. #' See the vignette 'Introduction' for examples. #' @param penalty.factor Separate penalty factors can be applied to each #' coefficient. This is a number that multiplies \code{lambda} to allow #' differential shrinkage. Can be 0 for some variables, which implies no #' shrinkage, and that variable is always included in the model. Default is 1 #' for all variables (and implicitly infinity for variables listed in #' \code{exclude}). Also, any \code{penalty.factor} that is set to \code{inf} is #' converted to an \code{exclude}, and then internally reset to 1. #' Note: the penalty factors are internally rescaled to sum to #' nvars, and the lambda sequence will reflect this change. #' @param lower.limits Vector of lower limits for each coefficient; default #' \code{-Inf}. Each of these must be non-positive. Can be presented as a #' single value (which will then be replicated), else a vector of length #' \code{nvars} #' @param upper.limits Vector of upper limits for each coefficient; default #' \code{Inf}. See \code{lower.limits} #' @param maxit Maximum number of passes over the data for all lambda values; #' default is 10^5. #' @param type.gaussian Two algorithm types are supported for (only) #' \code{family="gaussian"}. The default when \code{nvar<500} is #' \code{type.gaussian="covariance"}, and saves all inner-products ever #' computed. This can be much faster than \code{type.gaussian="naive"}, which #' loops through \code{nobs} every time an inner-product is computed. The #' latter can be far more efficient for \code{nvar >> nobs} situations, or when #' \code{nvar > 500}. #' @param type.logistic If \code{"Newton"} then the exact hessian is used #' (default), while \code{"modified.Newton"} uses an upper-bound on the #' hessian, and can be faster. #' @param standardize.response This is for the \code{family="mgaussian"} #' family, and allows the user to standardize the response variables #' @param type.multinomial If \code{"grouped"} then a grouped lasso penalty is #' used on the multinomial coefficients for a variable. This ensures they are #' all in our out together. The default is \code{"ungrouped"} #' @param relax If \code{TRUE} then for each \emph{active set} in the path of #' solutions, the model is refit without any regularization. See \code{details} #' for more information. This argument is new, and users may experience convergence issues #' with small datasets, especially with non-gaussian families. Limiting the #' value of 'maxp' can alleviate these issues in some cases. #' @param trace.it If \code{trace.it=1}, then a progress bar is displayed; #' useful for big models that take a long time to fit. #' @param ... Additional argument used in \code{relax.glmnet}. These include #' some of the original arguments to 'glmnet', and each must be named if used. #' @return An object with S3 class \code{"glmnet","*" }, where \code{"*"} is #' \code{"elnet"}, \code{"lognet"}, \code{"multnet"}, \code{"fishnet"} #' (poisson), \code{"coxnet"} or \code{"mrelnet"} for the various types of #' models. If the model was created with \code{relax=TRUE} then this class has #' a prefix class of \code{"relaxed"}. \item{call}{the call that produced this #' object} \item{a0}{Intercept sequence of length \code{length(lambda)}} #' \item{beta}{For \code{"elnet"}, \code{"lognet"}, \code{"fishnet"} and #' \code{"coxnet"} models, a \code{nvars x length(lambda)} matrix of #' coefficients, stored in sparse column format (\code{"CsparseMatrix"}). For #' \code{"multnet"} and \code{"mgaussian"}, a list of \code{nc} such matrices, #' one for each class.} \item{lambda}{The actual sequence of \code{lambda} #' values used. When \code{alpha=0}, the largest lambda reported does not quite #' give the zero coefficients reported (\code{lambda=inf} would in principle). #' Instead, the largest \code{lambda} for \code{alpha=0.001} is used, and the #' sequence of \code{lambda} values is derived from this.} \item{dev.ratio}{The #' fraction of (null) deviance explained (for \code{"elnet"}, this is the #' R-square). The deviance calculations incorporate weights if present in the #' model. The deviance is defined to be 2*(loglike_sat - loglike), where #' loglike_sat is the log-likelihood for the saturated model (a model with a #' free parameter per observation). Hence dev.ratio=1-dev/nulldev.} #' \item{nulldev}{Null deviance (per observation). This is defined to be #' 2*(loglike_sat -loglike(Null)); The NULL model refers to the intercept #' model, except for the Cox, where it is the 0 model.} \item{df}{The number of #' nonzero coefficients for each value of \code{lambda}. For \code{"multnet"}, #' this is the number of variables with a nonzero coefficient for \emph{any} #' class.} \item{dfmat}{For \code{"multnet"} and \code{"mrelnet"} only. A #' matrix consisting of the number of nonzero coefficients per class} #' \item{dim}{dimension of coefficient matrix (ices)} \item{nobs}{number of #' observations} \item{npasses}{total passes over the data summed over all #' lambda values} \item{offset}{a logical variable indicating whether an offset #' was included in the model} \item{jerr}{error flag, for warnings and errors #' (largely for internal debugging).} \item{relaxed}{If \code{relax=TRUE}, this #' additional item is another glmnet object with different values for #' \code{beta} and \code{dev.ratio}} #' @author Jerome Friedman, Trevor Hastie, Balasubramanian Narasimhan, Noah #' Simon, Kenneth Tay and Rob Tibshirani\cr Maintainer: Trevor Hastie #' \email{hastie@@stanford.edu} #' @seealso \code{print}, \code{predict}, \code{coef} and \code{plot} methods, #' and the \code{cv.glmnet} function. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent (2010), Journal of Statistical Software, Vol. 33(1), 1-22}, #' \doi{10.18637/jss.v033.i01}.\cr #' Simon, N., Friedman, J., Hastie, T. and Tibshirani, R. (2011) #' \emph{Regularization Paths for Cox's Proportional #' Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. #' 39(5), 1-13}, #' \doi{10.18637/jss.v039.i05}.\cr #' Tibshirani,Robert, Bien, J., Friedman, J., Hastie, T.,Simon, N.,Taylor, J. and #' Tibshirani, Ryan. (2012) \emph{Strong Rules for Discarding Predictors in #' Lasso-type Problems, JRSSB, Vol. 74(2), 245-266}, #' \url{https://arxiv.org/abs/1011.2234}.\cr #' Hastie, T., Tibshirani, Robert and Tibshirani, Ryan (2020) \emph{Best Subset, #' Forward Stepwise or Lasso? Analysis and Recommendations Based on Extensive Comparisons, #' Statist. Sc. Vol. 35(4), 579-592}, #' \url{https://arxiv.org/abs/1707.08692}.\cr #' Glmnet webpage with four vignettes: \url{https://glmnet.stanford.edu}. #' @keywords models regression #' @examples #' #' # Gaussian #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' fit1 = glmnet(x, y) #' print(fit1) #' coef(fit1, s = 0.01) # extract coefficients at a single value of lambda #' predict(fit1, newx = x[1:10, ], s = c(0.01, 0.005)) # make predictions #' #' # Relaxed #' fit1r = glmnet(x, y, relax = TRUE) # can be used with any model #' #' # multivariate gaussian #' y = matrix(rnorm(100 * 3), 100, 3) #' fit1m = glmnet(x, y, family = "mgaussian") #' plot(fit1m, type.coef = "2norm") #' #' # binomial #' g2 = sample(c(0,1), 100, replace = TRUE) #' fit2 = glmnet(x, g2, family = "binomial") #' fit2n = glmnet(x, g2, family = binomial(link=cloglog)) #' fit2r = glmnet(x,g2, family = "binomial", relax=TRUE) #' fit2rp = glmnet(x,g2, family = "binomial", relax=TRUE, path=TRUE) #' #' # multinomial #' g4 = sample(1:4, 100, replace = TRUE) #' fit3 = glmnet(x, g4, family = "multinomial") #' fit3a = glmnet(x, g4, family = "multinomial", type.multinomial = "grouped") #' # poisson #' N = 500 #' p = 20 #' nzc = 5 #' x = matrix(rnorm(N * p), N, p) #' beta = rnorm(nzc) #' f = x[, seq(nzc)] %*% beta #' mu = exp(f) #' y = rpois(N, mu) #' fit = glmnet(x, y, family = "poisson") #' plot(fit) #' pfit = predict(fit, x, s = 0.001, type = "response") #' plot(pfit, y) #' #' # Cox #' set.seed(10101) #' N = 1000 #' p = 30 #' nzc = p/3 #' x = matrix(rnorm(N * p), N, p) #' beta = rnorm(nzc) #' fx = x[, seq(nzc)] %*% beta/3 #' hx = exp(fx) #' ty = rexp(N, hx) #' tcens = rbinom(n = N, prob = 0.3, size = 1) # censoring indicator #' y = cbind(time = ty, status = 1 - tcens) # y=Surv(ty,1-tcens) with library(survival) #' fit = glmnet(x, y, family = "cox") #' plot(fit) #' #' # Cox example with (start, stop] data #' set.seed(2) #' nobs <- 100; nvars <- 15 #' xvec <- rnorm(nobs * nvars) #' xvec[sample.int(nobs * nvars, size = 0.4 * nobs * nvars)] <- 0 #' x <- matrix(xvec, nrow = nobs) #' start_time <- runif(100, min = 0, max = 5) #' stop_time <- start_time + runif(100, min = 0.1, max = 3) #' status <- rbinom(n = nobs, prob = 0.3, size = 1) #' jsurv_ss <- survival::Surv(start_time, stop_time, status) #' fit <- glmnet(x, jsurv_ss, family = "cox") #' #' # Cox example with strata #' jsurv_ss2 <- stratifySurv(jsurv_ss, rep(1:2, each = 50)) #' fit <- glmnet(x, jsurv_ss2, family = "cox") #' #' # Sparse #' n = 10000 #' p = 200 #' nzc = trunc(p/10) #' x = matrix(rnorm(n * p), n, p) #' iz = sample(1:(n * p), size = n * p * 0.85, replace = FALSE) #' x[iz] = 0 #' sx = Matrix(x, sparse = TRUE) #' inherits(sx, "sparseMatrix") #confirm that it is sparse #' beta = rnorm(nzc) #' fx = x[, seq(nzc)] %*% beta #' eps = rnorm(n) #' y = fx + eps #' px = exp(fx) #' px = px/(1 + px) #' ly = rbinom(n = length(px), prob = px, size = 1) #' system.time(fit1 <- glmnet(sx, y)) #' system.time(fit2n <- glmnet(x, y)) #' #' @export glmnet glmnet=function(x,y,family=c("gaussian","binomial","poisson","multinomial","cox","mgaussian"),weights=NULL,offset=NULL,alpha=1.0,nlambda=100,lambda.min.ratio=ifelse(nobs1){ warning("alpha >1; set to 1") alpha=1 } if(alpha<0){ warning("alpha<0; set to 0") alpha=0 } alpha=as.double(alpha) nlam=as.integer(nlambda) y=drop(y) # we dont like matrix responses unless we need them dimy=dim(y) nrowy=ifelse(is.null(dimy),length(y),dimy[1]) if(nrowy!=nobs)stop(paste("number of observations in y (",nrowy,") not equal to the number of rows of x (",nobs,")",sep="")) vnames=colnames(x) if(is.null(vnames))vnames=paste("V",seq(nvars),sep="") ne=as.integer(dfmax) nx=as.integer(pmax) if(is.null(exclude))exclude=integer(0) if(any(penalty.factor==Inf)){ exclude=c(exclude,seq(nvars)[penalty.factor==Inf]) exclude=sort(unique(exclude)) } if(length(exclude)>0){ jd=match(exclude,seq(nvars),0) if(!all(jd>0))stop("Some excluded variables out of range") penalty.factor[jd]=1 #ow can change lambda sequence jd=as.integer(c(length(jd),jd)) }else jd=as.integer(0) vp=as.double(penalty.factor) internal.parms=glmnet.control() if(internal.parms$itrace)trace.it=1 else{ if(trace.it){ glmnet.control(itrace=1) on.exit(glmnet.control(itrace=0)) } } ###check on limits if(any(lower.limits>0)){stop("Lower limits should be non-positive")} if(any(upper.limits<0)){stop("Upper limits should be non-negative")} lower.limits[lower.limits==-Inf]=-internal.parms$big upper.limits[upper.limits==Inf]=internal.parms$big if(length(lower.limits)=1)stop("lambda.min.ratio should be less than 1") flmin=as.double(lambda.min.ratio) ulam=double(1) } else{ flmin=as.double(1) if(any(lambda<0))stop("lambdas should be non-negative") ulam=as.double(rev(sort(lambda))) nlam=as.integer(length(lambda)) } is.sparse=FALSE if(inherits(x,"sparseMatrix")){##Sparse case is.sparse=TRUE if(!inherits(x,"dgCMatrix")) x=as(as(as(x, "generalMatrix"), "CsparseMatrix"), "dMatrix") # TODO: changed everything except cox to C++ implementation. } else if (!inherits(x, "matrix")) { x <- data.matrix(x) } else { x <- x } # TODO: only coerce if xd is not sparse if(!inherits(x,"sparseMatrix")) { storage.mode(x) <- "double" } if (trace.it) { if (relax) cat("Training Fit\n") pb <- createPB(min = 0, max = nlam, initial = 0, style = 3) } else { pb <- NULL # dummy initialize (won't be used, but still need to pass) } kopt=switch(match.arg(type.logistic), "Newton"=0,#This means to use the exact Hessian "modified.Newton"=1 # Use the upper bound ) if(family=="multinomial"){ type.multinomial=match.arg(type.multinomial) if(type.multinomial=="grouped")kopt=2 #overrules previous kopt } kopt=as.integer(kopt) fit=switch(family, "gaussian"=elnet(x,is.sparse,y,weights,offset,type.gaussian,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit,pb), "poisson"=fishnet(x,is.sparse,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit,pb), "binomial"=lognet(x,is.sparse,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit,kopt,family,pb), "multinomial"=lognet(x,is.sparse,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit,kopt,family,pb), "cox"=coxnet(x,is.sparse,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,vnames,maxit), "mgaussian"=mrelnet(x,is.sparse,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,jsd,intr,vnames,maxit,pb) ) if (trace.it) { utils::setTxtProgressBar(pb, nlam) close(pb) } if(is.null(lambda))fit$lambda=fix.lam(fit$lambda)##first lambda is infinity; changed to entry point fit$call=this.call fit$nobs=nobs class(fit)=c(class(fit),"glmnet") } } if(relax) relax.glmnet(fit, x=x,y=y,weights=weights,offset=offset, lower.limits=lower.limits,upper.limits=upper.limits,penalty.factor=penalty.factor, check.args=FALSE,...) else fit } glmnet/R/predict.coxnet.R0000644000176200001440000000260314325602475015026 0ustar liggesusers#' @method predict coxnet #' @export predict.coxnet=function(object,newx,s=NULL,type=c("link","response","coefficients","nonzero"),exact=FALSE,newoffset,...){ type=match.arg(type) ###coxnet has no intercept, so we treat it separately if(missing(newx)){ if(!match(type,c("coefficients","nonzero"),FALSE))stop("You need to supply a value for 'newx'") } if(exact&&(!is.null(s))){ lambda=object$lambda which=match(s,lambda,FALSE) if(!all(which>0)){ lambda=unique(rev(sort(c(s,lambda)))) check_dots(object,...)# This fails if you don't supply the crucial arguments object=update(object,lambda=lambda,...) } } nbeta=object$beta if(!is.null(s)){ vnames=dimnames(nbeta)[[1]] dimnames(nbeta)=list(NULL,NULL) lambda=object$lambda lamlist=lambda.interp(lambda,s) nbeta=nbeta[,lamlist$left,drop=FALSE]%*%Diagonal(x=lamlist$frac) +nbeta[,lamlist$right,drop=FALSE]%*%Diagonal(x=1-lamlist$frac) dimnames(nbeta)=list(vnames,paste(seq(along=s))) } if(type=="coefficients")return(nbeta) if(type=="nonzero")return(nonzeroCoef(nbeta,bystep=TRUE)) nfit=as.matrix(newx%*%nbeta) if(object$offset){ if(missing(newoffset))stop("No newoffset provided for prediction, yet offset used in fit of glmnet",call.=FALSE) nfit=nfit+array(newoffset,dim=dim(nfit)) } switch(type, response=exp(nfit), link=nfit ) } glmnet/R/coef.glmnet.R0000644000176200001440000000036114325602475014275 0ustar liggesusers#' Extract coefficients from a glmnet object #' #' @method coef glmnet #' @rdname predict.glmnet #' @export #' @export coef.glmnet coef.glmnet=function(object,s=NULL,exact=FALSE,...) predict(object,s=s,type="coefficients",exact=exact,...) glmnet/R/plot.glmnet.R0000644000176200001440000000407515035277016014343 0ustar liggesusers#' plot coefficients from a "glmnet" object #' #' Produces a coefficient profile plot of the coefficient paths for a fitted #' \code{"glmnet"} object. #' #' A coefficient profile plot is produced. If \code{x} is a multinomial model, #' a coefficient plot is produced for each class. #' #' @aliases plot.glmnet plot.multnet plot.mrelnet plot.relaxed #' @param x fitted \code{"glmnet"} model #' @param xvar What is on the X-axis. \code{"lambda"} plots against the log-lambda sequence, #' \code{"norm"} against the L1-norm of the coefficients, and #' \code{"dev"} against the percent deviance explained. Warning: "norm" is the L1 norm of the coefficients on the glmnet object. There are many reasons why this might not be appropriate, such as automatic standardization, penalty factors, and values of `alpha` less than 1, which can lead to unusual looking plots. #' @param label If \code{TRUE}, label the curves with variable sequence #' numbers. #' @param sign.lambda If \code{xvar="lambda"} and \code{sign.lambda=1} then we plot against \code{log(lambda)}; if \code{sign.lambda=-1} (default) we plot against \code{-log(lambda)}. #' @param \dots Other graphical parameters to plot #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet}, and \code{print}, \code{predict} and \code{coef} #' methods. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent} #' @keywords models regression #' #' @examples #' x=matrix(rnorm(100*20),100,20) #' y=rnorm(100) #' g2=sample(1:2,100,replace=TRUE) #' g4=sample(1:4,100,replace=TRUE) #' fit1=glmnet(x,y) #' plot(fit1) #' plot(fit1,xvar="lambda",label=TRUE) #' fit3=glmnet(x,g4,family="multinomial") #' plot(fit3,pch=19) #' @method plot glmnet #' @export plot.glmnet=function(x, xvar=c("lambda","norm","dev"), label=FALSE, sign.lambda=-1,...){ xvar=match.arg(xvar) plotCoef(x$beta,lambda=x$lambda,df=x$df,dev=x$dev.ratio,label=label,xvar=xvar, sign.lambda=sign.lambda,...) } glmnet/R/coxpath.R0000644000176200001440000007516114341220705013542 0ustar liggesusers#' Check if glmnet should call cox.path #' #' Helper function to check if glmnet() should call cox.path(). #' #' For \code{family="cox"}, we only call the original coxnet() function if #' (i) x is not sparse, (ii) y is right-censored data, and (iii) we are #' not fitting a stratified Cox model. This function also throws an error #' if y has a "strata" attribute but is not of type "stratifySurv". #' #' @param x Design matrix. #' @param y Response variable. #' #' @return TRUE if cox.path() should be called, FALSE otherwise. use.cox.path <- function(x, y) { y <- response.coxnet(y) use_cox_path <- TRUE # We only return FALSE if: # x is not sparse AND y is right-censored data AND no strata # (strata variable being all equal counts as no strata) if (!inherits(x, "sparseMatrix") && ncol(y) == 2) { if (!("strata" %in% names(attributes(y))) || length(unique(attr(y, "strata"))) == 1) use_cox_path <- FALSE } # if strata provided in y but y not of class stratifySurv, throw error if ("strata" %in% names(attributes(y)) && !inherits(y, "stratifySurv")) stop(paste0("For fitting stratified Cox models, y must be of class ", "stratifySurv, see ?stratifySurv for more details")) return(use_cox_path) } #' Fit a Cox regression model with elastic net regularization for a path of #' lambda values #' #' Fit a Cox regression model via penalized maximum likelihood for a path of #' lambda values. Can deal with (start, stop] data and strata, as well as #' sparse design matrices. #' #' Sometimes the sequence is truncated before \code{nlambda} values of lambda #' have been used. This happens when \code{cox.path} detects that the #' decrease in deviance is marginal (i.e. we are near a saturated fit). #' #' @param x See glmnet help file #' @param y Survival response variable, must be a \code{Surv} or #' \code{stratifySurv} object. #' @param weights See glmnet help file #' @param offset See glmnet help file #' @param alpha See glmnet help file #' @param nlambda See glmnet help file #' @param lambda.min.ratio See glmnet help file #' @param lambda See glmnet help file #' @param standardize See glmnet help file #' @param thresh Convergence threshold for coordinate descent. Each inner #' coordinate-descent loop continues until the maximum change in the objective #' after any coefficient update is less than thresh times the null deviance. #' Default value is \code{1e-10}. #' @param exclude See glmnet help file #' @param penalty.factor See glmnet help file #' @param lower.limits See glmnet help file #' @param upper.limits See glmnet help file #' @param maxit See glmnet help file #' @param trace.it Controls how much information is printed to screen. Default is #' \code{trace.it=0} (no information printed). If \code{trace.it=1}, a progress #' bar is displayed. If \code{trace.it=2}, some information about the fitting #' procedure is printed to the console as the model is being fitted. #' @param ... Other arguments passed from glmnet (not used right now). #' #' @return An object of class "coxnet" and "glmnet". #' \item{a0}{Intercept value, \code{NULL} for "cox" family.} #' \item{beta}{A \code{nvars x length(lambda)} matrix of coefficients, stored in #' sparse matrix format.} #' \item{df}{The number of nonzero coefficients for each value of lambda.} #' \item{dim}{Dimension of coefficient matrix.} #' \item{lambda}{The actual sequence of lambda values used. When alpha=0, the #' largest lambda reported does not quite give the zero coefficients reported #' (lambda=inf would in principle). Instead, the largest lambda for alpha=0.001 #' is used, and the sequence of lambda values is derived from this.} #' \item{dev.ratio}{The fraction of (null) deviance explained. The deviance #' calculations incorporate weights if present in the model. The deviance is #' defined to be 2*(loglike_sat - loglike), where loglike_sat is the log-likelihood #' for the saturated model (a model with a free parameter per observation). #' Hence dev.ratio=1-dev/nulldev.} #' \item{nulldev}{Null deviance (per observation). This is defined to be #' 2*(loglike_sat -loglike(Null)). The null model refers to the 0 model.} #' \item{npasses}{Total passes over the data summed over all lambda values.} #' \item{jerr}{Error flag, for warnings and errors (largely for internal #' debugging).} #' \item{offset}{A logical variable indicating whether an offset was included #' in the model.} #' \item{call}{The call that produced this object.} #' \item{nobs}{Number of observations.} #' #' @examples #' set.seed(2) #' nobs <- 100; nvars <- 15 #' xvec <- rnorm(nobs * nvars) #' xvec[sample.int(nobs * nvars, size = 0.4 * nobs * nvars)] <- 0 #' x <- matrix(xvec, nrow = nobs) #' beta <- rnorm(nvars / 3) #' fx <- x[, seq(nvars / 3)] %*% beta / 3 #' ty <- rexp(nobs, exp(fx)) #' tcens <- rbinom(n = nobs, prob = 0.3, size = 1) #' jsurv <- survival::Surv(ty, tcens) #' fit1 <- glmnet:::cox.path(x, jsurv) #' #' # works with sparse x matrix #' x_sparse <- Matrix::Matrix(x, sparse = TRUE) #' fit2 <- glmnet:::cox.path(x_sparse, jsurv) #' #' # example with (start, stop] data #' set.seed(2) #' start_time <- runif(100, min = 0, max = 5) #' stop_time <- start_time + runif(100, min = 0.1, max = 3) #' status <- rbinom(n = nobs, prob = 0.3, size = 1) #' jsurv_ss <- survival::Surv(start_time, stop_time, status) #' fit3 <- glmnet:::cox.path(x, jsurv_ss) #' #' # example with strata #' jsurv_ss2 <- stratifySurv(jsurv_ss, rep(1:2, each = 50)) #' fit4 <- glmnet:::cox.path(x, jsurv_ss2) cox.path <- function(x, y, weights=NULL, offset=NULL, alpha=1.0, nlambda=100, lambda.min.ratio=ifelse(nobs 1) { warning("alpha > 1; set to 1") alpha = 1 } else if (alpha < 0) { warning("alpha < 0; set to 0") alpha = 0 } alpha = as.double(alpha) this.call <- match.call() np = dim(x) if (is.null(np) || (np[2] <= 1)) stop("x should be a matrix with 2 or more columns") nobs = as.integer(np[1]); nvars = as.integer(np[2]) # get feature variable names vnames <- colnames(x) if(is.null(vnames)) vnames <- paste("V",seq(nvars),sep="") # check weights if(is.null(weights)) weights = rep(1,nobs) else if (length(weights) != nobs) stop(paste("Number of elements in weights (",length(weights), ") not equal to the number of rows of x (",nobs,")",sep="")) weights <- as.double(weights) # check that response y is a Surv object of the correct length y <- response.coxnet(y) if (nrow(y) != nobs) stop(paste0("number of observations in y (" , nrow(y), ") not equal to the number of rows of x (", nobs, ")")) # check offset option is.offset <- !(is.null(offset)) if (is.offset == FALSE) { offset <- rep(0, times = nrow(y)) } # check and standardize penalty factors (to sum to nvars) if(any(penalty.factor == Inf)) { exclude = c(exclude, seq(nvars)[penalty.factor == Inf]) exclude = sort(unique(exclude)) } ## Compute weighted mean and variance of columns of x, sensitive to sparse matrix ## needed to detect constant columns below, and later if standarization meansd <- weighted_mean_sd(x, weights) ## look for constant variables, and if any, then add to exclude const_vars <- meansd$sd == 0 nzvar <- setdiff(which(!const_vars), exclude) # if all the non-excluded variables have zero variance, throw error if (length(nzvar) == 0) stop("All used predictors have zero variance") ## if any constant vars, add to exclude if(any(const_vars)) { exclude <- sort(unique(c(which(const_vars),exclude))) meansd$sd[const_vars] <- 1.0 ## we divide later, and do not want bad numbers } if(length(exclude) > 0) { jd = match(exclude, seq(nvars), 0) if(!all(jd > 0)) stop ("Some excluded variables out of range") penalty.factor[jd] = 1 # ow can change lambda sequence } # check and standardize penalty factors (to sum to nvars) vp = pmax(0, penalty.factor) if (max(vp) <= 0) stop("All penalty factors are <= 0") vp = as.double(vp * nvars / sum(vp)) ### check on limits control <- glmnet.control() if (thresh >= control$epsnr) warning("thresh should be smaller than glmnet.control()$epsnr", call. = FALSE) if(any(lower.limits > 0)){ stop("Lower limits should be non-positive") } if(any(upper.limits < 0)){ stop("Upper limits should be non-negative") } lower.limits[lower.limits == -Inf] = -control$big upper.limits[upper.limits == Inf] = control$big if (length(lower.limits) < nvars) { if(length(lower.limits) == 1) lower.limits = rep(lower.limits, nvars) else stop("Require length 1 or nvars lower.limits") } else lower.limits = lower.limits[seq(nvars)] if (length(upper.limits) < nvars) { if(length(upper.limits) == 1) upper.limits = rep(upper.limits, nvars) else stop("Require length 1 or nvars upper.limits") } else upper.limits = upper.limits[seq(nvars)] if (any(lower.limits == 0) || any(upper.limits == 0)) { ###Bounds of zero can mess with the lambda sequence and fdev; ###ie nothing happens and if fdev is not zero, the path can stop fdev <- glmnet.control()$fdev if(fdev!= 0) { glmnet.control(fdev = 0) on.exit(glmnet.control(fdev = fdev)) } } ### end check on limits ### end preparation of generic arguments # standardize x if necessary xm <- rep(0.0, times = nvars) if (standardize) { xs <- meansd$sd } else { xs <- rep(1.0, times = nvars) } if (!inherits(x, "sparseMatrix")) { x <- scale(x,FALSE,xs) } else { attr(x, "xm") <- xm attr(x, "xs") <- xs } lower.limits <- lower.limits * xs upper.limits <- upper.limits * xs if (!("strata" %in% names(attributes(y)))) y <- stratifySurv(y, rep(1, nobs)) # Pre-compute and cache some important information: ordering by stop time # (ascending, deaths before censored), and for (start, stop] data: ordering # by start time and some match information. # Information is computed at the strata level if (ncol(y) == 2) { stop_o <- numeric(nobs) for (i in unique(attr(y, "strata"))) { ii <- which(attr(y, "strata") == i) stop_o[ii] <- order(y[ii, "time"], y[ii, "status"], decreasing = c(FALSE, TRUE)) } attr(y, "stop_time") <- stop_o } else { stop_o <- numeric(nobs) start_o <- numeric(nobs) ss_match <- numeric(nobs) for (i in unique(attr(y, "strata"))) { ii <- which(attr(y, "strata") == i) stop_o[ii] <- order(y[ii, "stop"], y[ii, "status"], decreasing = c(FALSE, TRUE)) start_o[ii] <- order(y[ii, "start"], decreasing = c(FALSE)) ss_match[ii] <- match(start_o[ii], stop_o[ii]) } attr(y, "stop_time") <- stop_o attr(y, "start_time") <- start_o attr(y, "ss_match") <- ss_match } # compute null deviance # currently using std.weights = FALSE in order to match glmnet output nulldev <- coxnet.deviance(y = y, offset = offset, weights = weights, std.weights = FALSE) # compute lambda_max and lambda values nlam = as.integer(nlambda) user_lambda = FALSE # did user provide their own lambda values? if (is.null(lambda)) { if (lambda.min.ratio >= 1) stop("lambda.min.ratio should be less than 1") lambda_max <- get_cox_lambda_max(x, y, alpha, weights, offset, exclude, vp) ulam <- exp(seq(log(lambda_max), log(lambda_max * lambda.min.ratio), length.out = nlam)) } else { # user provided lambda values user_lambda = TRUE if (any(lambda < 0)) stop("lambdas should be non-negative") ulam <- as.double(rev(sort(lambda))) nlam <- as.integer(length(lambda)) } # start progress bar if (trace.it == 1) pb <- createPB(min = 0, max = nlam, style = 3) beta <- matrix(0, nrow = nvars, ncol = nlam) dev.ratio <- rep(NA, length = nlam) fit <- NULL mnl <- min(nlam, control$mnlam) for (k in 1:nlam) { # get the correct lambda value to fit if (k > 1) { cur_lambda <- ulam[k] } else { cur_lambda <- ifelse(user_lambda, ulam[k], control$big) } if (trace.it == 2) cat("Fitting lambda index", k, ":", ulam[k], fill = TRUE) fit <- cox.fit(x, y, weights / sum(weights), lambda = cur_lambda, alpha = alpha, offset = offset, thresh = thresh, maxit = maxit, penalty.factor = vp, exclude = exclude, lower.limits = lower.limits, upper.limits = upper.limits, warm = fit, from.cox.path = TRUE, save.fit = TRUE, trace.it = trace.it) if (trace.it == 1) utils::setTxtProgressBar(pb, k) # if error code non-zero, a non-fatal error must have occurred # print warning, ignore this lambda value and return result # for all previous lambda values if (fit$jerr != 0) { errmsg <- jerr.glmnetfit(fit$jerr, maxit, k) warning(errmsg$msg, call. = FALSE) k <- k - 1 break } beta[, k] <- as.vector(fit$beta) dev.ratio[k] <- fit$dev.ratio # early stopping if dev.ratio almost 1 or no improvement if (k >= mnl && user_lambda == FALSE) { if (dev.ratio[k] > control$devmax * 0.99 / 0.999) break if (k > 1 && dev.ratio[k] - dev.ratio[k - mnl + 1] < control$fdev * 100 * dev.ratio[k]) break } } if (trace.it == 1) { utils::setTxtProgressBar(pb, nlam) cat("", fill = TRUE) } # truncate beta, dev.ratio, lambda if necessary if (k < nlam) { beta <- beta[, 1:k, drop = FALSE] dev.ratio <- dev.ratio[1:k] ulam <- ulam[1:k] } # return coefficients to original scale (because of x standardization) beta <- beta / xs # output stepnames <- paste0("s", 0:(length(ulam) - 1)) out <- list(a0 = NULL) out$beta <- Matrix::Matrix(beta, sparse = TRUE, dimnames = list(vnames, stepnames)) out$df <- as.vector(colSums(abs(beta) > 0)) # as.vector to remove names out$dim <- dim(beta) out$lambda <- ulam out$dev.ratio <- dev.ratio out$nulldev <- nulldev out$npasses <- fit$npasses out$jerr <- fit$jerr out$offset <- is.offset out$call <- this.call out$nobs <- nobs class(out) <- c("coxnet", "glmnet") out } #' Fit a Cox regression model with elastic net regularization for a single #' value of lambda #' #' Fit a Cox regression model via penalized maximum likelihood for a single #' value of lambda. Can deal with (start, stop] data and strata, as well as #' sparse design matrices. #' #' WARNING: Users should not call \code{cox.fit} directly. Higher-level #' functions in this package call \code{cox.fit} as a subroutine. If a #' warm start object is provided, some of the other arguments in the function #' may be overriden. #' #' \code{cox.fit} solves the elastic net problem for a single, user-specified #' value of lambda. \code{cox.fit} works for Cox regression models, including #' (start, stop] data and strata. It solves the problem using iteratively #' reweighted least squares (IRLS). For each IRLS iteration, \code{cox.fit} #' makes a quadratic (Newton) approximation of the log-likelihood, then calls #' \code{elnet.fit} to minimize the resulting approximation. #' #' In terms of standardization: \code{cox.fit} does not standardize \code{x} #' and \code{weights}. \code{penalty.factor} is standardized so that they sum #' up to \code{nvars}. #' #' @param x Input matrix, of dimension \code{nobs x nvars}; each row is an #' observation vector. If it is a sparse matrix, it is assumed to be unstandardized. #' It should have attributes \code{xm} and \code{xs}, where \code{xm(j)} and #' \code{xs(j)} are the centering and scaling factors for variable j respsectively. #' If it is not a sparse matrix, it is assumed that any standardization needed #' has already been done. #' @param y Survival response variable, must be a Surv or stratifySurv object. #' @param weights Observation weights. \code{cox.fit} does NOT standardize #' these weights. #' @param lambda A single value for the \code{lambda} hyperparameter. #' @param alpha See glmnet help file #' @param offset See glmnet help file #' @param thresh Convergence threshold for coordinate descent. Each inner #' coordinate-descent loop continues until the maximum change in the objective #' after any coefficient update is less than thresh times the null deviance. #' Default value is \code{1e-10}. #' @param maxit Maximum number of passes over the data; default is \code{10^5}. #' (If a warm start object is provided, the number of passes the warm start object #' performed is included.) #' @param penalty.factor See glmnet help file #' @param exclude See glmnet help file #' @param lower.limits See glmnet help file #' @param upper.limits See glmnet help file #' @param warm Either a \code{glmnetfit} object or a list (with name \code{beta} #' containing coefficients) which can be used as a warm start. Default is #' \code{NULL}, indicating no warm start. For internal use only. #' @param from.cox.path Was \code{cox.fit()} called from \code{cox.path()}? #' Default is FALSE.This has implications for computation of the penalty factors. #' @param save.fit Return the warm start object? Default is FALSE. #' @param trace.it Controls how much information is printed to screen. If #' \code{trace.it=2}, some information about the fitting procedure is printed to #' the console as the model is being fitted. Default is \code{trace.it=0} #' (no information printed). (\code{trace.it=1} not used for compatibility with #' \code{glmnet.path}.) #' #' @return An object with class "coxnet", "glmnetfit" and "glmnet". The list #' returned contains more keys than that of a "glmnet" object. #' \item{a0}{Intercept value, \code{NULL} for "cox" family.} #' \item{beta}{A \code{nvars x 1} matrix of coefficients, stored in sparse matrix #' format.} #' \item{df}{The number of nonzero coefficients.} #' \item{dim}{Dimension of coefficient matrix.} #' \item{lambda}{Lambda value used.} #' \item{dev.ratio}{The fraction of (null) deviance explained. The deviance #' calculations incorporate weights if present in the model. The deviance is #' defined to be 2*(loglike_sat - loglike), where loglike_sat is the log-likelihood #' for the saturated model (a model with a free parameter per observation). #' Hence dev.ratio=1-dev/nulldev.} #' \item{nulldev}{Null deviance (per observation). This is defined to be #' 2*(loglike_sat -loglike(Null)). The null model refers to the 0 model.} #' \item{npasses}{Total passes over the data.} #' \item{jerr}{Error flag, for warnings and errors (largely for internal #' debugging).} #' \item{offset}{A logical variable indicating whether an offset was included #' in the model.} #' \item{call}{The call that produced this object.} #' \item{nobs}{Number of observations.} #' \item{warm_fit}{If \code{save.fit=TRUE}, output of C++ routine, used for #' warm starts. For internal use only.} #' \item{family}{Family used for the model, always "cox".} #' \item{converged}{A logical variable: was the algorithm judged to have #' converged?} #' \item{boundary}{A logical variable: is the fitted value on the boundary of #' the attainable values?} #' \item{obj_function}{Objective function value at the solution.} cox.fit <- function(x, y, weights, lambda, alpha = 1.0, offset = rep(0, nobs), thresh = 1e-10, maxit = 100000, penalty.factor = rep(1.0, nvars), exclude = c(), lower.limits = -Inf, upper.limits = Inf, warm = NULL, from.cox.path = FALSE, save.fit = FALSE, trace.it = 0) { this.call <- match.call() control <- glmnet.control() ### Prepare all generic arguments nobs <- nrow(x) nvars <- ncol(x) is.offset <- !(missing(offset)) if (is.offset == FALSE) { offset <- as.double(rep(0, nobs)) } # add xm and xs attributes if they are missing for sparse x # glmnet.fit assumes that x is already standardized. Any standardization # the user wants should be done beforehand. if (inherits(x, "sparseMatrix")) { if ("xm" %in% names(attributes(x)) == FALSE) attr(x, "xm") <- rep(0.0, times = nvars) if ("xs" %in% names(attributes(x)) == FALSE) attr(x, "xs") <- rep(1.0, times = nvars) } # if calling from cox.path(), we do not need to check on exclude # and penalty.factor arguments as they have been prepared by cox.path() if (!from.cox.path) { # check and standardize penalty factors (to sum to nvars) if(any(penalty.factor == Inf)) { exclude = c(exclude, seq(nvars)[penalty.factor == Inf]) exclude = sort(unique(exclude)) } if(length(exclude) > 0) { jd = match(exclude, seq(nvars), 0) if(!all(jd > 0)) stop ("Some excluded variables out of range") penalty.factor[jd] = 1 # ow can change lambda sequence } vp = pmax(0, penalty.factor) vp = as.double(vp * nvars / sum(vp)) } else { vp <- as.double(penalty.factor) } ### check on limits lower.limits[lower.limits == -Inf] = -control$big upper.limits[upper.limits == Inf] = control$big if (length(lower.limits) < nvars) lower.limits = rep(lower.limits, nvars) else lower.limits = lower.limits[seq(nvars)] if (length(upper.limits) < nvars) upper.limits = rep(upper.limits, nvars) else upper.limits = upper.limits[seq(nvars)] ### end check on limits ### end preparation of generic arguments # compute null deviance if (is.null(warm)) { nulldev <- coxnet.deviance(y = y, offset = offset, weights = weights, std.weights = FALSE) fit <- NULL coefold <- rep(0, nvars) # initial coefs = 0 eta <- offset } else { if (inherits(warm,"glmnetfit")) { if (!is(warm$warm_fit,"warmfit")) stop("Invalid warm start object") fit <- warm nulldev <- fit$nulldev coefold <- fit$warm_fit$a # prev value for coefficients eta <- get_eta(x, coefold, 0) + offset } else if (inherits(warm,"list") && "beta" %in% names(warm)) { fit <- warm nulldev <- coxnet.deviance(y = y, offset = offset, weights = weights, std.weights = FALSE) coefold <- fit$beta # prev value for coefficients eta <- get_eta(x, coefold, 0) + offset fit$a0 <- 0 # needed for compatibility with elnet.fit() } else { stop("Invalid warm start object") } } start <- NULL # current value for coefficients obj_val_old <- cox_obj_function(y, eta, weights, lambda, alpha, coefold, vp) if (trace.it == 2) { cat("Warm Start Objective:", obj_val_old, fill = TRUE) } conv <- FALSE # converged? # IRLS loop for (iter in 1L:control$mxitnr) { # compute working response and weights coxgrad_results <- coxgrad(eta, y, weights, std.weights = FALSE, diag.hessian = TRUE) w <- -attributes(coxgrad_results)$diag_hessian z <- (eta - offset) - ifelse(w != 0, -coxgrad_results / w, 0) # have to update the weighted residual in our fit object # (in theory g and iy should be updated too, but we actually recompute g # and iy anyway in wls.f) if (!is.null(fit)) { fit$warm_fit$r <- w * (z - eta + offset) } # do WLS with warmstart from previous iteration fit <- elnet.fit(x, z, w, lambda, alpha, intercept = FALSE, thresh = thresh, maxit = maxit, penalty.factor = vp, exclude = exclude, lower.limits = lower.limits, upper.limits = upper.limits, warm = fit, from.glmnet.fit = TRUE, save.fit = TRUE) if (fit$jerr != 0) return(list(jerr = fit$jerr)) # update coefficients, eta, mu and obj_val start <- fit$warm_fit$a eta <- get_eta(x, start, 0) + offset obj_val <- cox_obj_function(y, eta, weights, lambda, alpha, start, vp) if (trace.it == 2) cat("Iteration", iter, "Objective:", obj_val, fill = TRUE) boundary <- FALSE halved <- FALSE # did we have to halve the step size? # if objective function is not finite, keep halving the stepsize until it is finite # for the halving step, we probably have to adjust fit$g as well? if (!is.finite(obj_val) || obj_val > control$big) { warning("Infinite objective function!", call. = FALSE) if (is.null(coefold)) stop("no valid set of coefficients has been found: please supply starting values", call. = FALSE) warning("step size truncated due to divergence", call. = FALSE) ii <- 1 while (!is.finite(obj_val) || obj_val > control$big) { if (ii > control$mxitnr) stop("inner loop 1; cannot correct step size", call. = FALSE) ii <- ii + 1 start <- (start + coefold)/2 eta <- get_eta(x, start, 0) + offset obj_val <- cox_obj_function(y, eta, weights, lambda, alpha, start, vp) if (trace.it == 2) cat("Iteration", iter, " Halved step 1, Objective:", obj_val, fill = TRUE) } boundary <- TRUE halved <- TRUE } # if we did any halving, we have to update the coefficients, intercept # and weighted residual in the warm_fit object if (halved) { fit$warm_fit$a <- start fit$warm_fit$r <- w * (z - eta) } # test for convergence if (abs(obj_val - obj_val_old)/(0.1 + abs(obj_val)) < control$epsnr) { conv <- TRUE break } else { coefold <- start obj_val_old <- obj_val } } # end of IRLS loop # checks on convergence and fitted values if (!conv) warning("cox.fit: algorithm did not converge", call. = FALSE) # prepare output object if (save.fit == FALSE) { fit$warm_fit <- NULL } # overwrite values from elnet.fit object fit$a0 <- list(NULL) fit$call <- this.call fit$offset <- is.offset fit$nulldev <- nulldev fit$dev.ratio <- 1 - coxnet.deviance(y = y, pred = eta, weights = weights, std.weights = FALSE) / nulldev # add new key-value pairs to list fit$family <- "cox" fit$converged <- conv fit$boundary <- boundary fit$obj_function <- obj_val class(fit) <- c("coxnet", "glmnetfit", "glmnet") fit } #' Elastic net objective function value for Cox regression model #' #' Returns the elastic net objective function value for Cox regression model. #' #' @param y Survival response variable, must be a \code{Surv} or #' \code{stratifySurv} object. #' @param pred Model's predictions for \code{y}. #' @param weights Observation weights. #' @param lambda A single value for the \code{lambda} hyperparameter. #' @param alpha The elasticnet mixing parameter, with \eqn{0 \le \alpha \le 1}. #' @param coefficients The model's coefficients. #' @param vp Penalty factors for each of the coefficients. cox_obj_function <- function(y, pred, weights, lambda, alpha, coefficients, vp) { coxnet.deviance(y = y, pred = pred, weights = weights, std.weights = FALSE) + lambda * pen_function(coefficients, alpha, vp) } #' Get lambda max for Cox regression model #' #' Return the lambda max value for Cox regression model, used for computing #' initial lambda values. For internal use only. #' #' This function is called by \code{cox.path} for the value of lambda max. #' #' When \code{x} is not sparse, it is expected to already by centered and scaled. #' When \code{x} is sparse, the function will get its attributes \code{xm} and #' \code{xs} for its centering and scaling factors. The value of #' \code{lambda_max} changes depending on whether \code{x} is centered and #' scaled or not, so we need \code{xm} and \code{xs} to get the correct value. #' #' @param x Input matrix, of dimension \code{nobs x nvars}; each row is an #' observation vector. If it is a sparse matrix, it is assumed to be unstandardized. #' It should have attributes \code{xm} and \code{xs}, where \code{xm(j)} and #' \code{xs(j)} are the centering and scaling factors for variable j respsectively. #' If it is not a sparse matrix, it is assumed to be standardized. #' @param y Survival response variable, must be a \code{Surv} or #' \code{stratifySurv} object. #' @param alpha The elasticnet mixing parameter, with \eqn{0 \le \alpha \le 1}. #' @param weights Observation weights. #' @param offset Offset for the model. Default is a zero vector of length #' \code{nrow(y)}. #' @param exclude Indices of variables to be excluded from the model. #' @param vp Separate penalty factors can be applied to each coefficient. get_cox_lambda_max <- function(x, y, alpha, weights = rep(1, nrow(x)), offset = rep(0, nrow(x)), exclude = c(), vp = rep(1, ncol(x))) { nobs <- nrow(x); nvars <- ncol(x) # extract strata (if any) if ("strata" %in% names(attributes(y))) { strata <- attr(y, "strata") } else { strata <- rep(1, nobs) } if (length(strata) != nobs) stop("length of strata != nobs") # if some penalty factors are zero, we need to compute eta vp_zero <- setdiff(which(vp == 0), exclude) if (length(vp_zero) > 0) { tempx <- x[, vp_zero, drop = FALSE] if(inherits(tempx, "sparseMatrix")) { attr(tempx, "xm") <- rep(0.0, length(vp_zero)) attr(tempx, "xs") <- attr(x,"xs")[vp_zero] ## coxph cannot handle sparse x. Strata not needed because y is expected to be stratified fit <- cox.fit(x = tempx, y = y, offset = offset, weights = weights/sum(weights), lambda = 0) fit$beta <- fit$beta/attr(tempx,"xs")# need to put beta on the correct scale for next line to work eta <- as.numeric(predict(fit, newx = tempx, newoffset = offset, newstrata = strata)) } else { eps <- glmnet.control()$epsnr if (length(unique(strata)) == 1) { fit <- survival::coxph(y ~ offset(offset) + tempx, weights = weights, eps = eps) } else { fit <- survival::coxph(y ~ offset(offset) + tempx + strata(strata), weights = weights, eps = eps) } eta <- predict(fit, reference="sample") ## Coxph can do strata-specific centering } } else { eta <- offset } eta <- eta - mean(eta) ## keep numbers small; partial likelihood independent of centering ju <- rep(1, nvars) ju[exclude] <- 0 # we have already included constant variables in exclude # get cox gradient at "null" point # note that coxgrad already includes weights, so no need to include them # in subsequent computations null_grad <- coxgrad(eta, y, weights) if (inherits(x, "sparseMatrix")) { xm <- attr(x, "xm") xs <- attr(x, "xs") g <- abs((drop(t(null_grad) %*% x) - sum(null_grad) * xm) / xs) } else { g <- abs(drop(t(null_grad) %*% x)) } g <- g / ifelse(vp > 0, vp, 1) g[ju == 0] <- 0 lambda_max <- max(g) / max(alpha, 1e-3) return(lambda_max) } glmnet/R/nonzeroCoef.R0000644000176200001440000000200714325602475014362 0ustar liggesusersnonzeroCoef = function (beta, bystep = FALSE) { ### bystep = FALSE means which variables were ever nonzero ### bystep = TRUE means which variables are nonzero for each step nr=nrow(beta) if (nr == 1) {#degenerate case if (bystep) apply(beta, 2, function(x) if (abs(x) > 0) 1 else NULL) else { if (any(abs(beta) > 0)) 1 else NULL } } else { beta=abs(beta)>0 # this is sparse which=seq(nr) ones=rep(1,ncol(beta)) nz=as.vector((beta%*%ones)>0) which=which[nz] if (bystep) { if(length(which)>0){ beta=as.matrix(beta[which,,drop=FALSE]) nzel = function(x, which) if (any(x)) which[x] else NULL which=apply(beta, 2, nzel, which) if(!is.list(which))which=data.frame(which)# apply can return a matrix!! which } else{ dn=dimnames(beta)[[2]] which=vector("list",length(dn)) names(which)=dn which } } else which } } glmnet/R/survfit.coxnet.R0000644000176200001440000001621614325602475015103 0ustar liggesusers#' Compute a survival curve from a coxnet object #' #' Computes the predicted survivor function for a Cox proportional hazards #' model with elastic net penalty. #' #' To be consistent with other functions in \code{glmnet}, if \code{s} #' is not specified, survival curves are returned for the entire lambda #' sequence. This is not recommended usage: it is best to call #' \code{survfit.coxnet} with a single value of the penalty parameter #' for the \code{s} option. #' #' @param formula A class \code{coxnet} object. #' @param s Value(s) of the penalty parameter lambda at which the survival #' curve is required. Default is the entire sequence used to create the model. #' However, it is recommended that \code{survfit.coxnet} is called for #' a single penalty parameter. #' @param ... This is the mechanism for passing additional arguments like #' (i) x= and y= for the x and y used to fit the model, #' (ii) weights= and offset= when the model was fit with these options, #' (iii) arguments for new data (newx, newoffset, newstrata), and #' (iv) arguments to be passed to survfit.coxph(). #' #' @return If \code{s} is a single value, an object of class "survfitcox" #' and "survfit" containing one or more survival curves. Otherwise, a list #' of such objects, one element for each value in \code{s}. #' Methods defined for survfit objects are print, summary and plot. #' #' @examples #' set.seed(2) #' nobs <- 100; nvars <- 15 #' xvec <- rnorm(nobs * nvars) #' xvec[sample.int(nobs * nvars, size = 0.4 * nobs * nvars)] <- 0 #' x <- matrix(xvec, nrow = nobs) #' beta <- rnorm(nvars / 3) #' fx <- x[, seq(nvars / 3)] %*% beta / 3 #' ty <- rexp(nobs, exp(fx)) #' tcens <- rbinom(n = nobs, prob = 0.3, size = 1) #' y <- survival::Surv(ty, tcens) #' fit1 <- glmnet(x, y, family = "cox") #' #' # survfit object for Cox model where lambda = 0.1 #' sf1 <- survival::survfit(fit1, s = 0.1, x = x, y = y) #' plot(sf1) #' #' # example with new data #' sf2 <- survival::survfit(fit1, s = 0.1, x = x, y = y, newx = x[1:3, ]) #' plot(sf2) #' #' # example with strata #' y2 <- stratifySurv(y, rep(1:2, length.out = nobs)) #' fit2 <- glmnet(x, y2, family = "cox") #' sf3 <- survival::survfit(fit2, s = 0.1, x = x, y = y2) #' sf4 <- survival::survfit(fit2, s = 0.1, x = x, y = y2, #' newx = x[1:3, ], newstrata = c(1, 1, 1)) #' #' @importFrom survival coxph survfit #' @method survfit coxnet #' @export survfit.coxnet <- function(formula, s = NULL, ...) { this.call <- match.call() object <- formula args <- list(...) if (!("x" %in% names(args)) || !("y" %in% names(args))) stop(paste0("the design matrix x and response y used to fit the model ", "need to be passed")) y <- args$y # if s is NULL, get the whole lambda sequence if (is.null(s)) s <- object$lambda # check that the required arguments are passed for running coxph check_dots(object, ..., need = c("offset", "weights"), error_start = "used survfit.coxnet()", error_end = "in order to run survfit.coxnet") # if user wants to run survfit on new data, make sure the arguments required # for making new predictions are provided if ("newx" %in% names(args)) { check_dots(object, ..., need = c("offset"), error_start = "used survfit.coxnet() with newx argument", prefix = "new", error_end = "in order to predict on new data") if ("strata" %in% names(attributes(y)) && !("newstrata" %in% names(args))) stop(paste0("used survfit.coxnet() with newx argument and ", "stratified Cox model was fit, need newstrata argument ", "in order to predict on new data")) } res <- list() for (i in seq_along(s)) { # "hack": run coxph with 0 iterations coxphmod <- mycoxph(object, s = s[i], ...) # If newx is provided, we need to compute the predections at these # observations and pass it as an argument to the eventual survfit call # as `newdata`. In addition, we have to handle additional options that # could have been passed: offset if ("newx" %in% names(args)) { current_args <- mycoxpred(object, s = s[i], ...) } else { current_args <- args } # make the call to survfit.coxph current_args$formula <- coxphmod current_args$se.fit <- FALSE # doesn't make sense to compute SEs sf <- do.call(survfit, current_args) sf$call <- this.call res[[i]] <- sf } if (length(s) > 1) { return(res) } else { return(res[[1]]) } } #' Helper function to fit coxph model for survfit.coxnet #' #' This function constructs the coxph call needed to run the "hack" of #' coxph with 0 iterations. It's a separate function as we have to deal with #' function options like strata, offset and observation weights. #' #' @param object A class \code{coxnet} object. #' @param s The value of the penalty parameter lambda at which the survival #' curve is required. #' @param ... The same ... that was passed to survfit.coxnet. #' #' @importFrom survival coxph strata #' @importFrom stats as.formula mycoxph <- function(object, s, ...) { args <- list(...) x <- args$x y <- args$y glmnet_call_names <- names(object$call)[-1] # predict from coxnet model for original data frame x with s, gives fitted # linear predictor args$object <- object args$newx <- x args$s <- s if ("offset" %in% glmnet_call_names) { args$newoffset <- rep(0, length.out = nrow(x)) } eta <- do.call(predict, args) # construct list of arguments for coxph() call based on which special # arguments were used in the original glmnet() call coxphargs <- list(formula = "y ~ X1", data = data.frame(y, eta), init = 1, iter = 0) if ("strata" %in% names(attributes(y))) { coxphargs$data$strata <- attr(y, "strata") coxphargs$formula <- paste(coxphargs$formula, "+ strata(strata)") } if ("weights" %in% glmnet_call_names) { coxphargs$weights <- args$weights } if ("offset" %in% glmnet_call_names) { coxphargs$data$offset <- args$offset coxphargs$formula <- paste(coxphargs$formula, "+ offset(offset)") } coxphargs$formula <- as.formula(coxphargs$formula) coxphmod <- do.call(coxph, coxphargs) return(coxphmod) } #' Helper function to amend ... for new data in survfit.coxnet #' #' This function amends the function arguments passed to survfit.coxnet #' via ... if new data was passed to survfit.coxnet. It's a separate #' function as we have to deal with function options like newstrata #' and newoffset. #' #' @param object A class \code{coxnet} object. #' @param s The response for the fitted model. #' @param ... The same ... that was passed to survfit.coxnet. #' #' @importFrom stats predict mycoxpred <- function(object, s, ...) { args <- list(...) if ("newoffset" %in% names(args)) { new_eta <- predict(object, newx = args$newx, s = s, newoffset = rep(0, nrow(args$newx))) } else { new_eta <- predict(object, newx = args$newx, s = s) } new_df <- data.frame(new_eta) if ("newoffset" %in% names(args)) new_df$offset <- args$newoffset if ("newstrata" %in% names(args)) { new_df$strata <- args$newstrata args$newstrata <- NULL } args$newdata <- new_df return(args) } glmnet/R/plot.mrelnet.R0000644000176200001440000000210715035277050014513 0ustar liggesusers#' @method plot mrelnet #' @param type.coef If \code{type.coef="2norm"} then a single curve per #' variable, else if \code{type.coef="coef"}, a coefficient plot per response #' @rdname plot.glmnet #' @export plot.mrelnet <- function(x, xvar=c("lambda","norm","dev"),label=FALSE,sign.lambda=-1,type.coef=c("coef","2norm"),...){ type.coef=match.arg(type.coef) xvar=match.arg(xvar) beta=x$beta if(xvar=="norm") { cnorm1=function(beta){ which=nonzeroCoef(beta) beta=as.matrix(beta[which,]) apply(abs(beta),2,sum) } norm=apply(sapply(x$beta,cnorm1),1,sum) } else norm = NULL dfmat=x$dfmat if(type.coef=="coef"){ ncl=nrow(dfmat) clnames=rownames(dfmat) for( i in seq(ncl)){ plotCoef(beta[[i]],norm,x$lambda,dfmat[i,],x$dev.ratio,label=label,xvar=xvar,sign.lambda=sign.lambda,ylab=paste("Coefficients: Response",clnames[i]),...) } } else plotCoef(coefnorm(beta,2),norm,x$lambda,dfmat[1,],x$dev.ratio,label=label,xvar=xvar,sign.lambda=sign.lambda,ylab="Coefficient 2Norms",...) } glmnet/R/predict.lognet.R0000644000176200001440000000136514325602475015022 0ustar liggesusers#' @method predict lognet #' @export predict.lognet=function(object,newx,s=NULL,type=c("link","response","coefficients","class","nonzero"),exact=FALSE,newoffset,...){ type=match.arg(type) ### remember that although the C++ lognet makes predictions ### for the first class, we make predictions for the second class ### to avoid confusion with 0/1 responses. ### glmnet flipped the signs of the coefficients nfit=NextMethod("predict") switch(type, response={ pp=exp(-nfit) 1/(1+pp) }, class={ cnum=ifelse(nfit>0,2,1) clet=object$classnames[cnum] if(is.matrix(cnum))clet=array(clet,dim(cnum),dimnames(cnum)) clet }, nfit ) } glmnet/R/predict.multnet.R0000644000176200001440000000602115035310524015202 0ustar liggesusers#' @method predict multnet #' @export predict.multnet <- function (object, newx, s = NULL, type = c("link", "response", "coefficients", "class", "nonzero"), exact = FALSE, newoffset, ...) { type = match.arg(type) ###multnet is very different, so we treat it separately if(missing(newx)){ if(!match(type,c("coefficients","nonzero"),FALSE))stop("You need to supply a value for 'newx'") } if(exact&&(!is.null(s))){ lambda=object$lambda which=match(s,lambda,FALSE) if(!all(which>0)){ lambda=unique(rev(sort(c(s,lambda)))) check_dots(object,...)# This fails if you don't supply the crucial arguments object=update(object,lambda=lambda,...) } } a0 = object$a0 rownames(a0) = rep("(Intercept)", nrow(a0)) nbeta = object$beta klam = dim(a0) nclass = klam[[1]] nlambda = length(s) if (!is.null(s)) { lambda = object$lambda lamlist = lambda.interp(lambda, s) namess=names(s) if(is.null(namess))namess=paste0("s=",format(s)) for (i in seq(nclass)) { kbeta = methods::rbind2(a0[i, , drop = FALSE], nbeta[[i]])#was rbind2 vnames = dimnames(kbeta)[[1]] dimnames(kbeta) = list(NULL, NULL) kbeta = kbeta[, lamlist$left, drop = FALSE] %*% Diagonal(x=lamlist$frac) + kbeta[, lamlist$right, drop = FALSE] %*% Diagonal(x=1 - lamlist$frac) dimnames(kbeta) = list(vnames, namess) nbeta[[i]] = kbeta } } else { for (i in seq(nclass)) nbeta[[i]] = methods::rbind2(a0[i,,drop=FALSE ], nbeta[[i]])#was rbind2 nlambda=length(object$lambda) } if (type == "coefficients") return(nbeta) if (type == "nonzero") # if(object$grouped)return(nonzeroCoef(object$beta[[1]],bystep=TRUE)) if(object$grouped)return(nonzeroCoef(nbeta[[1]],bystep=TRUE)) else return(lapply(nbeta, function(x) nonzeroCoef(x[-1, , drop = FALSE], bystep = TRUE))) dd = dim(newx) if (inherits(newx, "sparseMatrix")) newx = as(newx, "dMatrix") npred = dd[[1]] dn = list(names(nbeta), dimnames(nbeta[[1]])[[2]], dimnames(newx)[[1]]) dp = array(0, c(nclass, nlambda, npred), dimnames = dn) for (i in seq(nclass)) { fitk = cbind2(1, newx) %*% (nbeta[[i]]) dp[i, , ] = dp[i, , ] + t(as.matrix(fitk)) } if (object$offset) { if (missing(newoffset)) stop("No newoffset provided for prediction, yet offset used in fit of glmnet", call. = FALSE) if (!is.matrix(newoffset) || dim(newoffset)[[2]] != nclass) stop(paste("Dimension of newoffset should be", npred, "x", nclass), call. = FALSE) toff = t(newoffset) for (i in seq(nlambda)) { dp[, i, ] = dp[, i, ] + toff } } switch(type, response = { pp = exp(dp) psum = apply(pp, c(2, 3), sum) aperm(pp/rep(psum, rep(nclass, nlambda * npred)), c(3, 1, 2)) }, link = aperm(dp, c(3, 1, 2)), class = { dp = aperm(dp, c(3, 1, 2)) apply(dp, 3, glmnet_softmax) }) } glmnet/R/plot.relaxed.R0000644000176200001440000000244015035277115014473 0ustar liggesusers#' @method plot relaxed #' @param gamma Value of the mixing parameter for a "relaxed" fit #' @rdname plot.glmnet #' @export plot.relaxed <- function(x,xvar = c("lambda", "dev"), label = FALSE, sign.lambda=-1, gamma=1, ...) { xvar=match.arg(xvar) if(any(wh<-gamma<0)){ warning("negative gamma values ignored") gamma=gamma[!wh] } if(any(wh<-gamma>1)){ warning("gamma values larger than 1 ignored") gamma=gamma[!wh] } if(!length(gamma))stop("no valid values of gamma") for(g in gamma){ bfit=blend.relaxed(x,gamma=g,extend=FALSE) plot(bfit,xvar=xvar,label=label,sign.lambda=sign.lambda,...) } } #' @method print relaxed #' @export print.relaxed <- function (x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall: ", deparse(x$call), "\n") cat("Relaxed\n\n") which=match(x$relaxed$lambda,x$lambda,0) rdev=rep(NA,length(x$lambda)) rdev[which]=round(x$relaxed$dev.ratio*100, 2) out=data.frame(Df = x$df, `%Dev` = round(x$dev.ratio*100, 2), `%Dev R`=rdev, Lambda = signif(x$lambda, digits),check.names=FALSE,row.names=seq(along=rdev)) class(out)=c("anova",class(out)) print(out) } glmnet/R/plot.multnet.R0000644000176200001440000000172615035277063014547 0ustar liggesusers#' @method plot multnet #' @rdname plot.glmnet #' @export plot.multnet=function(x, xvar=c("lambda","norm","dev"), label=FALSE, sign.lambda=-1, type.coef=c("coef","2norm"),...){ xvar=match.arg(xvar) type.coef=match.arg(type.coef) beta=x$beta if(xvar=="norm"){ cnorm1=function(beta){ which=nonzeroCoef(beta) beta=as.matrix(beta[which,]) apply(abs(beta),2,sum) } norm=apply(sapply(x$beta,cnorm1),1,sum) } else norm = NULL dfmat=x$dfmat if(type.coef=="coef"){ ncl=nrow(dfmat) clnames=rownames(dfmat) for( i in seq(ncl)){ plotCoef(beta[[i]],norm,x$lambda,dfmat[i,],x$dev.ratio,label=label,xvar=xvar,sign.lambda=sign.lambda,ylab=paste("Coefficients: Response",clnames[i]),...) } } else { dfseq=round(apply(dfmat,2,mean),1) plotCoef(coefnorm(beta,2),norm,x$lambda,dfseq,x$dev.ratio,label=label,xvar=xvar,sign.lambda=sign.lambda, ylab="Coefficient 2Norms",...) } } glmnet/R/getcoef.multinomial.R0000644000176200001440000000242314325602475016042 0ustar liggesusersgetcoef.multinomial=function(fit,nvars,nx,vnames,nc,classnames,center.intercept=TRUE){ lmu=fit$lmu nin=fit$nin[seq(lmu)] ninmax=max(nin) lam=fit$alm[seq(lmu)] stepnames=paste("s",seq(lmu)-1,sep="") beta.list=as.list(seq(nc)) names(beta.list)=classnames a0=matrix(fit$a0[seq(lmu*nc)],nc,lmu,dimnames=list(classnames,stepnames)) if(center.intercept){ a0=scale(a0,TRUE,FALSE) attr(a0,"scaled:center")=NULL } dfmat=a0 dd=c(nvars,lmu) if(ninmax>0){ ca=array(fit$ca[seq(nx*lmu*nc)],c(nx,nc,lmu))[seq(ninmax),,,drop=FALSE] ja=fit$ia[seq(ninmax)]#confusing but too hard to change oja=order(ja) ja=rep(ja[oja],lmu) ia=cumsum(c(1,rep(ninmax,lmu))) df=apply(abs(ca)>0,c(1,3),any) df=apply(df,2,sum) for(k in seq(nc)){ cak=ca[oja,k, ,drop=FALSE] dfmat[k,]=apply(abs(cak)>0,3,sum) beta=new("dgCMatrix",Dim=dd,Dimnames=list(vnames,stepnames),x=as.vector(cak),p=as.integer(ia-1),i=as.integer(ja-1)) beta.list[[k]]=drop0(beta) } } else{ for (k in seq(nc)) { dfmat[k, ] = rep(0,lmu) beta.list[[k]] = zeromat(nvars,lmu,vnames,stepnames) } } list(a0=a0,beta=beta.list,dfmat=dfmat,df=df,dim=dd,lambda=lam) } glmnet/R/coxgrad.R0000644000176200001440000003377714470255745013551 0ustar liggesusers#' Compute gradient for Cox model #' #' Compute the gradient of the log partial likelihood at a particular fit for Cox #' model. #' #' Compute a gradient vector at the fitted vector for the log partial likelihood. #' This is like a residual vector, and useful for manual screening of #' predictors for \code{glmnet} in applications where \code{p} is very large #' (as in GWAS). Uses the Breslow approach to ties. #' #' This function is essentially a wrapper: it checks whether the response #' provided is right-censored or (start, stop] survival data, and calls the #' appropriate internal routine. #' #' @aliases coxgrad #' @param eta Fit vector (usually from glmnet at a particular lambda). #' @param y Survival response variable, must be a \code{Surv} or #' \code{stratifySurv} object. #' @param w Observation weights (default is all equal to 1). #' @param std.weights If TRUE (default), observation weights are standardized #' to sum to 1. #' @param diag.hessian If \code{TRUE}, compute the diagonal of the Hessian #' of the log partial likelihood as well. Default is \code{FALSE}. #' #' @return A single gradient vector the same length as \code{eta}. If #' \code{diag.hessian=TRUE}, the diagonal of the Hessian is #' included as an attribute "diag_hessian". #' #' @examples #' set.seed(1) #' eta <- rnorm(10) #' time <- runif(10, min = 1, max = 10) #' d <- ifelse(rnorm(10) > 0, 1, 0) #' y <- survival::Surv(time, d) #' coxgrad(eta, y) #' #' # return diagonal of Hessian as well #' coxgrad(eta, y, diag.hessian = TRUE) #' #' # example with (start, stop] data #' y2 <- survival::Surv(time, time + runif(10), d) #' coxgrad(eta, y2) #' #' # example with strata #' y2 <- stratifySurv(y, rep(1:2, length.out = 10)) #' coxgrad(eta, y2) #' #' @seealso \code{coxnet.deviance} #' @keywords Cox model #' #' @export coxgrad <- function(eta, y, w, std.weights = TRUE, diag.hessian = FALSE) { # if y has 2 columns, it is right-censored data # if y has 3 columns, it is (start, stop] data # otherwise, throw errors if (ncol(y) == 2) { return(coxgrad2(eta, y, w, std.weights, diag.hessian)) } else if (ncol(y) == 3) { return(coxgrad3(eta, y, w, std.weights, diag.hessian)) } else { stop("Response y should have 2 or 3 columns") } } # coxgrad routine for right-censored data coxgrad2 <- function(eta, y, w, std.weights = TRUE, diag.hessian = FALSE) { if (missing(w)) w=rep(1,length(eta)) if (std.weights) w=w/sum(w) nobs <- nrow(y) # extract strata (if any) if ("strata" %in% names(attributes(y))) { strata <- attr(y, "strata") } else { strata <- rep(1, nobs) } if (length(strata) != nobs) stop("length of strata != nobs") # if all in same strata, do the computations # if not, do strata-level computations and concatenate if (length(unique(strata)) == 1) { time <- y[, "time"] d <- y[, "status"] eta <- scale(eta, TRUE, FALSE) # center eta so exponents are not too large # order exp(eta), time, d and w in ascending time order # for tied times, all deaths come before censored observations if ("stop_time" %in% names(attributes(y))) { o <- attr(y, "stop_time") } else { o <- order(time, d, decreasing = c(FALSE, TRUE)) } exp_eta <- exp(eta)[o] time <- time[o] d <- d[o] w <- w[o] rskden <- rev(cumsum(rev(exp_eta*w))) ##reverse order inside;last guy is in all the risk sets ### See if there are dups in death times dups <- fid(time[d == 1],seq(length(d))[d == 1]) dd <- d ww <- w ### next code replaces each sequence of tied death indicators by a new ### sequence where only the first is a 1 and the rest are zero. This ### makes the accounting in the following step work properly we also ### sums the weights in each of the tied death sets, and assign that ### weight to the first if(!is.null(ties<-dups$index_ties)){ dd[unlist(ties)]=0 dd[dups$index_first]=1 wsum=sapply(ties,function(i,w)sum(w[i]),ww) tie1=sapply(ties,function(i)i[1]) ww[tie1]=wsum } ### Get counts over risk sets at each death time rskcount=cumsum(dd)#this says how many of the risk sets each observation is in; 0 is none ### We now form partial sums of the 1/den just at the risk sets rskdeninv=cumsum((ww/rskden)[dd==1]) ### pad with a zero, so we can index it rskdeninv=c(0,rskdeninv) ### compute gradient for each obs grad <- w * (d - exp_eta * rskdeninv[rskcount+1]) grad[o] <- grad # if diag.hessian = TRUE, return the diagonal of the hessian too if (diag.hessian) { rskdeninv2 <- cumsum((ww/(rskden^2))[dd==1]) rskdeninv2 <- c(0, rskdeninv2) w_exp_eta <- w * exp_eta diag_hessian <- w_exp_eta^2 * rskdeninv2[rskcount+1] - w_exp_eta * rskdeninv[rskcount+1] diag_hessian[o] <- diag_hessian attr(grad, "diag_hessian") <- diag_hessian } return(grad) } else { # more than one strata provided: compute strata-level values and # concatenate overall_grad <- rep(NA, nobs) if (diag.hessian) overall_diag_hessian <- rep(NA, nobs) for (i in unique(strata)) { ii <- which(strata == i) strata_res <- coxgrad2(eta[ii], y[ii, , drop = FALSE], w[ii], std.weights = FALSE, diag.hessian = diag.hessian) overall_grad[ii] <- strata_res if (diag.hessian) { overall_diag_hessian[ii] <- attr(strata_res, "diag_hessian") } } if (diag.hessian) { attr(overall_grad, "diag_hessian") <- overall_diag_hessian } return(overall_grad) } } # coxgrad routine for (start, stop] data coxgrad3 <- function(eta, y, w, std.weights = TRUE, diag.hessian = FALSE) { if (missing(w)) w=rep(1,length(eta)) if (std.weights) w=w/sum(w) nobs <- nrow(y) # extract strata (if any) if ("strata" %in% names(attributes(y))) { strata <- attr(y, "strata") } else { strata <- rep(1, nobs) } if (length(strata) != nobs) stop("length of strata != nobs") # if all in same strata, do the computations # if not, do strata-level computations and concatenate if (length(unique(strata)) == 1) { start_time <- y[, "start"] stop_time <- y[, "stop"] d <- y[, "status"] eta <- scale(eta, TRUE, FALSE) # center eta so exponents are not too large # get ordering for stop time (ascending, deaths before censored), # start time (ascending), and match info if cached if ("stop_time" %in% names(attributes(y))) { stop_o <- attr(y, "stop_time") } else { stop_o <- order(stop_time, d, decreasing = c(FALSE, TRUE)) } if ("start_time" %in% names(attributes(y))) { start_o <- attr(y, "start_time") } else { start_o <- order(start_time, decreasing = c(FALSE)) } if ("ss_match" %in% names(attributes(y))) { ss_match <- attr(y, "ss_match") } else { ss_match <- match(start_o, stop_o) } ## set weights to zero for any observation with start time greater than largest death time last_death <- max(stop_time[d==1]) w[start_time >= last_death] <- 0 ## # keep a set of values which are ordered by start time w_exp_eta_start <- (w * exp(eta))[start_o] start_time_start <- start_time[start_o] # reorder everything by stop time exp_eta <- exp(eta)[stop_o] start_time <- start_time[stop_o] stop_time <- stop_time[stop_o] d <- d[stop_o] w <- w[stop_o] ### See if there are dups in death times dups <- fid(stop_time[d == 1],seq(length(d))[d == 1]) dd <- d ww <- w ### next code replaces each sequence of tied death indicators by a new ### sequence where only the first is a 1 and the rest are zero. This ### makes the accounting in the following step work properly we also ### sums the weights in each of the tied death sets, and assign that ### weight to the first if(!is.null(ties<-dups$index_ties)){ dd[unlist(ties)]=0 dd[dups$index_first]=1 wsum=sapply(ties,function(i,w)sum(w[i]),ww) tie1=sapply(ties,function(i)i[1]) ww[tie1]=wsum } # compute risk set sums rskden[i] = \sum_{j in R_i} w_j exp(eta_j) # where i indexes the observations. (In the end, we will only care # about the indices i which have actual death times.) rskden <- rev(cumsum(rev(exp_eta*w))) current_sum <- 0 death_time <- stop_time[dups$index_first] ndeaths <- length(death_time) death_idx <- ndeaths; start_idx <- nobs while (death_idx > 0 && start_idx > 0) { if (start_time_start[start_idx] < death_time[death_idx]) { # current start time belongs in risk set ending in stop time, # so we should remove the current cumulative sum and consider # the next risk set stop_idx <- dups$index_first[death_idx] rskden[stop_idx] <- rskden[stop_idx] - current_sum death_idx <- death_idx - 1 } else { # current start time does not belong in risk set ending in stop # time, so we should add it to current_sum and check if the # start time before it should also be added current_sum <- current_sum + w_exp_eta_start[start_idx] start_idx <- start_idx - 1 } } # compute the terms rskterm[k] = \sum_{i in C_k} d[i] / rskden[i] and # rskterm2[k] = \sum_{i in C_k} d[i] / rskden[i]^2. # Here, k indexes the observations, index i runs over the unique death # times. rskfactor <- (ww / rskden)[dd == 1] rskfactor2 <- (ww / rskden^2)[dd == 1] rskdeninv <- c(0, cumsum(rskfactor)) # pad with 0 so that we can index rskdeninv2 <- c(0, cumsum(rskfactor2)) # this says how many of the risk sets each observation is in; 0 is none # (however, if start time is not zero, then we could be including an # observation in too many risk sets: we will remove that later.) rskcount <- cumsum(dd) rskterm <- rskdeninv[rskcount+1] rskterm2 <- rskdeninv2[rskcount+1] current_sum <- 0; current_sum2 <- 0 death_idx <- 1; start_idx <- 1 while (death_idx <= ndeaths && start_idx <= nobs) { if (start_time_start[start_idx] < death_time[death_idx]) { # current observation belongs in risk set ending in death time, # so we should remove the current cumulative sum and consider # the next observation stop_idx <- ss_match[start_idx] # match(start_o[start_idx], stop_o) rskterm[stop_idx] <- rskterm[stop_idx] - current_sum rskterm2[stop_idx] <- rskterm2[stop_idx] - current_sum2 start_idx <- start_idx + 1 } else { # current observation doesn't belong in risk set ending in death # time, so we should add the rskfactor associated with this # death time to current_sum and check if the term assoc. with # the death time after it should also be added current_sum <- current_sum + rskfactor[death_idx] current_sum2 <- current_sum2 + rskfactor2[death_idx] death_idx <- death_idx + 1 } } grad <- w * (d - exp_eta * rskterm) grad[stop_o] <- grad # if diag.hessian = TRUE, return the diagonal of the hessian too if (diag.hessian) { w_exp_eta <- w * exp_eta diag_hessian <- w_exp_eta^2 * rskterm2 - w_exp_eta * rskterm diag_hessian[stop_o] <- diag_hessian attr(grad, "diag_hessian") <- diag_hessian } return(grad) } else { # more than one strata provided: compute strata-level values and # concatenate overall_grad <- rep(NA, nobs) if (diag.hessian) overall_diag_hessian <- rep(NA, nobs) for (i in unique(strata)) { ii <- which(strata == i) strata_res <- coxgrad3(eta[ii], y[ii, , drop = FALSE], w[ii], std.weights = FALSE, diag.hessian = diag.hessian) overall_grad[ii] <- strata_res if (diag.hessian) { overall_diag_hessian[ii] <- attr(strata_res, "diag_hessian") } } if (diag.hessian) { attr(overall_grad, "diag_hessian") <- overall_diag_hessian } return(overall_grad) } } #' Helper function for Cox deviance and gradient #' #' Helps to find ties in death times of data. #' #' @param x Sorted vector of death times. #' @param index Vector of indices for the death times. #' #' @return A list with two arguments. #' \item{index_first}{A vector of indices for the first observation at each #' death time as they appear in the sorted list.} #' \item{index_ties}{If there are no ties at all, this is NULL. If not, this is #' a list with length equal to the number of unique times with ties. For each #' time with ties, index_ties gives the indices of the observations with a #' death at that time.} #' #' @examples #' # Example with no ties #' glmnet:::fid(c(1, 4, 5, 6), 1:5) #' #' # Example with ties #' glmnet:::fid(c(1, 1, 1, 2, 3, 3, 4, 4, 4), 1:9) fid <- function(x,index) { idup=duplicated(x) if(!any(idup)) list(index_first=index,index_ties=NULL) else { ndup=!idup xu=x[ndup]# first death times index_first=index[ndup] ities=match(x,xu) index_ties=split(index,ities) nties=sapply(index_ties,length) list(index_first=index_first,index_ties=index_ties[nties>1]) } } glmnet/R/check.dots.R0000644000176200001440000000212214325602475014116 0ustar liggesuserscheck_dots <- function(object, ..., need = c("x", "y", "weights", "offset", "penalty.factor", "lower.limits", "upper.limits"), error_start = "used coef.glmnet() or predict.glmnet() with `exact=TRUE`", error_end = " in order to safely rerun glmnet", prefix = NULL) { if (is.null(need)) return(invisible()) # extract the function options we need from the object's call thiscall = object$call ncall = names(thiscall)[-1] w = match(ncall, need, 0) need = need[w] if (length(need) == 0) return(invisible()) # check that ... indeed has those function options if (!is.null(prefix)) need <- paste0(prefix, need) nargs = names(list(...)) w = match(need, nargs, 0) > 0 if(!all(w)) { margs = need[!w] stop(paste(error_start, "so must in addition supply original argument(s) ", paste(margs,collapse=" and "), error_end), call.=FALSE) } invisible() } glmnet/R/assess.coxnet.R0000644000176200001440000000074614325602475014703 0ustar liggesusersassess.coxnet <- function(predmat,y,type.measure,weights,foldid,grouped){ ### This is a hack, because CV for coxnet is complex if(type.measure=="C")return(cv.coxnet(predmat,y,type.measure,weights,foldid,grouped)) nlambda=ncol(predmat) N=nrow(predmat) cvraw = matrix(NA, 1, nlambda) for (j in seq(nlambda)) { cvraw[1, j] = coxnet.deviance(predmat[,j],y, weights=weights) } list(cvraw=cvraw,weights=N,N=N,type.measure=type.measure,grouped=FALSE) } glmnet/R/predict.cv.relaxed.R0000644000176200001440000000164514325602475015566 0ustar liggesusers#' @method predict cv.relaxed #' @param gamma Value (single) of 'gamma' at which predictions are to be made #' @rdname predict.cv.glmnet #' @export predict.cv.relaxed <- function (object, newx, s = c("lambda.1se", "lambda.min"), gamma=c("gamma.1se","gamma.min"),...) { relaxed=object$relaxed if (is.numeric(s)) lambda = s else if (is.character(s)) { s = match.arg(s) lambda = relaxed[[s]] names(lambda)=s if(missing(gamma)){ gamma=switch(s, lambda.1se=relaxed[["gamma.1se"]], lambda.min=relaxed[["gamma.min"]] ) } } else stop("Invalid form for s") if (is.character(gamma)) { gamma = match.arg(gamma) gamma = relaxed[[gamma]] } if(!is.numeric(gamma))stop("Invalid form for gamma") predict(object$glmnet.fit, newx, s = lambda,gamma=gamma, ...) } glmnet/R/plot.cv.relaxed.R0000644000176200001440000000350315035277173015107 0ustar liggesusers#' method plot cv.relaxed #' @importFrom shape colorlegend #' @param se.bands Should shading be produced to show standard-error bands; #' default is \code{TRUE} #' @rdname plot.cv.glmnet #' @export plot.cv.relaxed <- function (x, se.bands=TRUE, sign.lambda=-1,...) { xr=x$relaxed oldpar = par(mar = c(4, 4, 3, 4)) on.exit(par(oldpar)) statlist=xr$statlist gamma=xr$gamma ngamma=length(gamma) xlab = if(sign.lambda<0) expression(-Log(lambda)) else expression(Log(lambda)) ylim=range(unlist(lapply(statlist,"[[","cvm"))) if(se.bands){ cvup=lapply(statlist,"[[","cvup") cvlo=lapply(statlist,"[[","cvlo") ylim=range(ylim,unlist(cvup),unlist(cvlo)) } xlim= range(log(unlist(lapply(statlist,"[[","lambda"))+0.00001)*sign.lambda) cvcolors = rainbow(ngamma, start = .1, end = 1) with(statlist[[ngamma]],plot(sign.lambda*log(lambda), cvm, type = "n", xlab=xlab, ylab = x$name,ylim=ylim,xlim=xlim)) if(se.bands){ for (i in seq(ngamma)) with(statlist[[i]],polygon(c(sign.lambda*log(lambda),rev(sign.lambda*log(lambda))),c(cvup,rev(cvlo)), col="floralwhite",border="antiquewhite")) } for (i in seq(ngamma)) with(statlist[[i]],lines(sign.lambda*log(lambda), cvm, lwd = 2, col = cvcolors[i])) mins=log(c(xr$lambda.min,xr$lambda.1se))*sign.lambda abline(v=mins,lty=3) dof= statlist[[1]]$nzero lambda=statlist[[1]]$lambda axis(side = 3, at = sign.lambda*log(lambda), labels = paste(dof), tick = FALSE, line = 0) colorlegend(posy = c(0.2, 0.8), posx = c(0.93, 0.945)-.03, col = rainbow(ngamma, start = 0.1, end = 1), zlim = c(0, 1), zval = gamma , main = expression(gamma),digit=2) invisible() } glmnet/R/cvcompute.R0000644000176200001440000000115714325602475014105 0ustar liggesuserscvcompute <- function (cvstuff, foldid, nlams) { weights=cvstuff$weights mat=cvstuff$cvraw wisum = tapply(weights, foldid, sum) nfolds = max(foldid) outmat = matrix(NA, nfolds, ncol(mat)) good = matrix(0, nfolds, ncol(mat)) mat[is.infinite(mat)] = NA for (i in seq(nfolds)) { mati = mat[foldid == i, , drop = FALSE] wi = weights[foldid == i] outmat[i, ] = apply(mati, 2, weighted.mean, w = wi, na.rm = TRUE) good[i, seq(nlams[i])] = 1 } N = apply(good, 2, sum) list(cvraw = outmat, weights = wisum, N = N, type.measure=cvstuff$type.measure) } glmnet/R/predict.cv.glmnet.R0000644000176200001440000000631314325602475015425 0ustar liggesusers## CHECK WITH TREVOR: why alias here for predict.cv.relaxed as well as in plot.cv.relaxed? ## #' make predictions from a "cv.glmnet" object. #' #' This function makes predictions from a cross-validated glmnet model, using #' the stored \code{"glmnet.fit"} object, and the optimal value chosen for #' \code{lambda} (and \code{gamma} for a 'relaxed' fit. #' #' This function makes it easier to use the results of cross-validation to make #' a prediction. #' #' @aliases coef.cv.glmnet coef.cv.relaxed predict.cv.glmnet #' @param object Fitted \code{"cv.glmnet"} or \code{"cv.relaxed"} object. #' @param newx Matrix of new values for \code{x} at which predictions are to be #' made. Must be a matrix; can be sparse as in \code{Matrix} package. See #' documentation for \code{predict.glmnet}. #' @param s Value(s) of the penalty parameter \code{lambda} at which #' predictions are required. Default is the value \code{s="lambda.1se"} stored #' on the CV \code{object}. Alternatively \code{s="lambda.min"} can be used. If #' \code{s} is numeric, it is taken as the value(s) of \code{lambda} to be #' used. (For historical reasons we use the symbol 's' rather than 'lambda' to #' reference this parameter) #' @param \dots Not used. Other arguments to predict. #' @return The object returned depends on the \dots{} argument which is passed #' on to the \code{predict} method for \code{glmnet} objects. #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet}, and \code{print}, and \code{coef} methods, and #' \code{cv.glmnet}. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent (2010), Journal of Statistical Software, Vol. 33(1), 1-22}, #' \doi{10.18637/jss.v033.i01}.\cr #' Simon, N., Friedman, J., Hastie, T. and Tibshirani, R. (2011) #' \emph{Regularization Paths for Cox's Proportional #' Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. #' 39(5), 1-13}, #' \doi{10.18637/jss.v039.i05}.\cr #' Hastie, T., Tibshirani, Robert and Tibshirani, Ryan (2020) \emph{Best Subset, #' Forward Stepwise or Lasso? Analysis and Recommendations Based on Extensive Comparisons, #' Statist. Sc. Vol. 35(4), 579-592}, #' \url{https://arxiv.org/abs/1707.08692}.\cr #' Glmnet webpage with four vignettes, \url{https://glmnet.stanford.edu}. #' @keywords models regression #' @examples #' #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' cv.fit = cv.glmnet(x, y) #' predict(cv.fit, newx = x[1:5, ]) #' coef(cv.fit) #' coef(cv.fit, s = "lambda.min") #' predict(cv.fit, newx = x[1:5, ], s = c(0.001, 0.002)) #' cv.fitr = cv.glmnet(x, y, relax = TRUE) #' predict(cv.fit, newx = x[1:5, ]) #' coef(cv.fit) #' coef(cv.fit, s = "lambda.min", gamma = "gamma.min") #' predict(cv.fit, newx = x[1:5, ], s = c(0.001, 0.002), gamma = "gamma.min") #' #' @method predict cv.glmnet #' @export predict.cv.glmnet=function(object,newx,s=c("lambda.1se","lambda.min"),...){ if(is.numeric(s))lambda=s else if(is.character(s)){ s=match.arg(s) lambda=object[[s]] names(lambda)=s } else stop("Invalid form for s") predict(object$glmnet.fit,newx,s=lambda,...) } glmnet/R/glmnet_softmax.R0000644000176200001440000000130714325602475015124 0ustar liggesusersglmnet_softmax <- function (x,ignore_labels=FALSE) { d <- dim(x) dd <- dimnames(x)[[2]] if(is.null(dd) || !length(dd)) ignore_labels=TRUE nas=apply(is.na(x),1,any) if(any(nas)){ pclass=rep(NA,d[1]) if(sum(nas) maxdist pclass[l] <- i maxdist[l] <- x[l, i] } dd <- dimnames(x)[[2]] if(!ignore_labels) pclass=factor(pclass, levels = seq(d[2]), labels = dd) } pclass } glmnet/R/lognet.R0000644000176200001440000001010714657241402013360 0ustar liggesuserslognet=function(x,is.sparse,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit,kopt,family,pb){ nc=dim(y) maxit=as.integer(maxit) if(is.null(nc)){ ## Need to construct a y matrix, and include the weights y=as.factor(y) ntab=table(y) minclass=min(ntab) if(minclass<=1)stop("one multinomial or binomial class has 1 or 0 observations; not allowed") if(minclass<8)warning("one multinomial or binomial class has fewer than 8 observations; dangerous ground") classnames=names(ntab) nc=as.integer(length(ntab)) y=diag(nc)[as.numeric(y),] } else{ noo=nc[1] if(noo!=nobs)stop("x and y have different number of rows in call to glmnet",call.=FALSE) nc=as.integer(nc[2]) classnames=colnames(y) } #Check for size limitations maxvars=.Machine$integer.max/(nlam*nc) if(nx>maxvars)stop(paste("Integer overflow; num_classes*num_lambda*pmax should not exceed .Machine$integer.max. Reduce pmax to be below", trunc(maxvars))) if(!missing(weights)) y=y*weights ### check if any rows of y sum to zero, and if so deal with them weights=drop(y%*%rep(1,nc)) o=weights>0 if(!all(o)){ #subset the data y=y[o,] x=x[o,,drop=FALSE] nobs=sum(o) }else o=NULL if(family=="binomial"){ if(nc>2)stop("More than two classes; use multinomial family instead in call to glmnet",call.=FALSE) nc=as.integer(1) # for calling lognet y=y[,c(2,1)]#C++ lognet models the first column; we prefer the second (for 0/1 data) } storage.mode(y)="double" if(is.null(offset)){ offset=y*0 #keeps the shape of y is.offset=FALSE } else{ offset=as.matrix(offset) if(!is.null(o))offset=offset[o,,drop=FALSE]# we might have zero weights do=dim(offset) if(do[[1]]!=nobs)stop("offset should have the same number of values as observations in binomial/multinomial call to glmnet",call.=FALSE) if((do[[2]]==1)&(nc==1))offset=cbind(offset,-offset) if((family=="multinomial")&(do[[2]]!=nc))stop("offset should have same shape as y in multinomial call to glmnet",call.=FALSE) storage.mode(offset)="double" is.offset=TRUE } # C++ expects offset to have nc number of columns, as documented in Fortran. # We do a final modification of offset to take only the first column, since we favor this when fitting. if (nc == 1) offset=as.matrix(offset[,1], ncol=1) fit=if(is.sparse) splognet_exp( parm=alpha,x,y,offset,jd,vp,cl,ne=ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit,kopt,pb, lmu=integer(1), a0=matrix(0.0, nc, nlam), ca=double(nx*nlam*nc), ia=integer(nx), nin=integer(nlam), nulldev=double(1), dev=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1) ) else lognet_exp( parm=alpha,x,y,offset,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit,kopt,pb, lmu=integer(1), a0=matrix(0.0, nc, nlam), ca=double(nx*nlam*nc), ia=integer(nx), nin=integer(nlam), nulldev=double(1), dev=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1) ) if(fit$jerr!=0){ errmsg=jerr(fit$jerr,maxit,pmax=nx,family) if(errmsg$fatal)stop(errmsg$msg,call.=FALSE) else warning(errmsg$msg,call.=FALSE) } if(family=="binomial"){ outlist=getcoef(fit,nvars,nx,vnames) # outlist$a0=-outlist$a0#sign flips make 2 target class # outlist$beta=-outlist$beta#sign flips make 2 target class } else outlist=getcoef.multinomial(fit,nvars,nx,vnames,nc,classnames) dev=fit$dev[seq(fit$lmu)] outlist=c(outlist,list(dev.ratio=dev,nulldev=fit$nulldev,npasses=fit$nlp,jerr=fit$jerr,offset=is.offset,classnames=classnames)) if(family=="multinomial"){ if(kopt==2)grouped=TRUE else grouped =FALSE outlist$grouped=grouped } class(outlist)=switch(family, "binomial"="lognet", "multinomial"="multnet" ) outlist } glmnet/R/blend.relaxed.R0000644000176200001440000000221214325602475014600 0ustar liggesusersblend.relaxed=function(fit,gamma,extend=TRUE,epsilon=0.00001){ ### ###gamma must be a single value if(gamma==1){ class(fit)=class(fit)[-1] #drop the relaxed status fit$relaxed=NULL return(fit) } gamma=max(gamma,epsilon) ### We do the above so that even of gamma=0, and extend=TRUE, we fill in the coefficients ### First see which if any of glmnet coefficients are missing on relaxed which=match(fit$lambda,fit$relaxed$lambda,0) if(extend)which[which==0]=max(which) beta=fit$beta a0=fit$a0 fitr=fit$relaxed betar=fitr$beta a0r=fitr$a0 islistbeta=is.list(beta) if(!islistbeta){ fitr$beta=gamma*beta[,which>0] +(1-gamma)*betar[,which] fitr$a0=gamma*a0[which>0]+(1-gamma)*a0r[which] } else{ ngroups=length(beta) for(i in 1:ngroups) beta[[i]]=gamma*beta[[i]][,which>0]+(1-gamma)*betar[[i]][,which] fitr$beta=beta fitr$a0=gamma*a0[,which>0]+(1-gamma)*a0r[,which] } fitr$dev.ratio=gamma*fit$dev.ratio[which>0]+(1-gamma)*fitr$dev.ratio[which] fitr$df=fit$df[which>0] fitr$lambda=fit$lambda[which>0] fitr } glmnet/R/cv.glmnet.raw.R0000644000176200001440000000627514325602475014573 0ustar liggesuserscv.glmnet.raw <- function (x, y, weights, offset, lambda, type.measure, nfolds, foldid, alignment,grouped, keep, parallel, trace.it, glmnet.call, cv.call, ...) { if (trace.it) cat("Training\n") glmnet.object = glmnet(x, y, weights = weights, offset = offset, lambda = lambda, trace.it=trace.it,...) glmnet.object$call = glmnet.call subclass=class(glmnet.object)[[1]] type.measure=cvtype(type.measure,subclass) is.offset = glmnet.object$offset ###Next line is commented out so each call generates its own lambda sequence # lambda=glmnet.object$lambda if (inherits(glmnet.object, "multnet") && !glmnet.object$grouped) { nz = predict(glmnet.object, type = "nonzero") nz = sapply(nz, function(x) sapply(x, length)) nz = ceiling(apply(nz, 1, median)) } else nz = sapply(predict(glmnet.object, type = "nonzero"), length) outlist = as.list(seq(nfolds)) N=nrow(x) if (parallel) { # if (parallel && require(foreach)) { outlist = foreach(i = seq(nfolds), .packages = c("glmnet")) %dopar% { which = foldid == i # if (is.matrix(y)) if (length(dim(y))>1) y_sub = y[!which, ] else y_sub = y[!which] if (is.offset) offset_sub = as.matrix(offset)[!which, ] else offset_sub = NULL glmnet(x[!which, , drop = FALSE], y_sub, lambda = lambda, offset = offset_sub, weights = weights[!which], ...) } } else { for (i in seq(nfolds)) { if (trace.it) cat(sprintf("Fold: %d/%d\n", i, nfolds)) which = foldid == i if (length(dim(y))>1) y_sub = y[!which, ] else y_sub = y[!which] if (is.offset) offset_sub = as.matrix(offset)[!which, ] else offset_sub = NULL outlist[[i]] = glmnet(x[!which, , drop = FALSE], y_sub, lambda = lambda, offset = offset_sub, weights = weights[!which],trace.it=trace.it, ...) } } lambda = glmnet.object$lambda class(outlist)=paste0(subclass,"list") predmat=buildPredmat(outlist,lambda,x,offset,foldid,alignment,y=y,weights=weights, grouped=grouped,type.measure=type.measure,family=family(glmnet.object)) ### we include type.measure for the special case of coxnet with the deviance vs C-index discrepancy ### family is included for the new GLM crowd ### Next we compute the measures # if(subclass=="glmnetfit") attr(predmat,"family")=glmnet.object$family fun = paste("cv", subclass, sep = ".") cvstuff = do.call(fun, list(predmat,y,type.measure,weights,foldid,grouped)) grouped=cvstuff$grouped if ((N/nfolds < 3) && grouped) { warning("Option grouped=FALSE enforced in cv.glmnet, since < 3 observations per fold", call. = FALSE) grouped = FALSE } out=cvstats(cvstuff,foldid,nfolds,lambda,nz,grouped) cvname = names(cvstuff$type.measure) names(cvname)=cvstuff$type.measure# to be compatible with earlier version; silly, I know out = c(out,list(call=cv.call,name = cvname, glmnet.fit = glmnet.object)) if (keep) out = c(out, list(fit.preval = predmat, foldid = foldid)) lamin=with(out,getOptcv.glmnet(lambda, cvm, cvsd, cvname)) obj = c(out, as.list(lamin)) class(obj) = "cv.glmnet" obj } glmnet/R/family.glmnet.R0000644000176200001440000000106414325602475014643 0ustar liggesusers#' @method family glmnet #' @export family.glmnet=function(object,...){ families=c(elnet = "gaussian", lognet = "binomial", fishnet = "poisson", multnet = "multinomial", coxnet = "cox", mrelnet = "mgaussian") cl=class(object)[1] families[cl] } #' @method family glmnetfit #' @export family.glmnetfit=function(object,...) object$family #' @method family relaxed #' @export family.relaxed=function(object,...)family(object$relaxed) #' @method family cv.glmnet #' @export family.cv.glmnet=function(object,...)family(object$glmnet.fit) glmnet/R/makeX.R0000644000176200001440000001736014325602475013150 0ustar liggesusers#' convert a data frame to a data matrix with one-hot encoding #' #' Converts a data frame to a data matrix suitable for input to \code{glmnet}. #' Factors are converted to dummy matrices via "one-hot" encoding. Options deal #' with missing values and sparsity. #' #' The main function is to convert factors to dummy matrices via "one-hot" #' encoding. Having the 'train' and 'test' data present is useful if some #' factor levels are missing in either. Since a factor with k levels leads to a #' submatrix with 1/k entries zero, with large k the \code{sparse=TRUE} option #' can be helpful; a large matrix will be returned, but stored in sparse matrix #' format. Finally, the function can deal with missing data. The current #' version has the option to replace missing observations with the mean from #' the training data. For dummy submatrices, these are the mean proportions at #' each level. #' #' @param train Required argument. A dataframe consisting of vectors, matrices #' and factors #' @param test Optional argument. A dataframe matching 'train' for use as #' testing data #' @param na.impute Logical, default \code{FALSE}. If \code{TRUE}, missing #' values for any column in the resultant 'x' matrix are replaced by the means #' of the nonmissing values derived from 'train' #' @param sparse Logical, default \code{FALSE}. If \code{TRUE} then the #' returned matrice(s) are converted to matrices of class "CsparseMatrix". #' Useful if some factors have a large number of levels, resulting in very big #' matrices, mostly zero #' @param ... additional arguments, currently unused #' @return If only 'train' was provided, the function returns a matrix 'x'. If #' missing values were imputed, this matrix has an attribute containing its #' column means (before imputation). If 'test' was provided as well, a list #' with two components is returned: 'x' and 'xtest'. #' @author Trevor Hastie\cr Maintainer: Trevor Hastie #' @seealso \code{glmnet} #' @keywords models #' @examples #' #' set.seed(101) #' ### Single data frame #' X = matrix(rnorm(20), 10, 2) #' X3 = sample(letters[1:3], 10, replace = TRUE) #' X4 = sample(LETTERS[1:3], 10, replace = TRUE) #' df = data.frame(X, X3, X4) #' makeX(df) #' makeX(df, sparse = TRUE) #' #' ### Single data freame with missing values #' Xn = X #' Xn[3, 1] = NA #' Xn[5, 2] = NA #' X3n = X3 #' X3n[6] = NA #' X4n = X4 #' X4n[9] = NA #' dfn = data.frame(Xn, X3n, X4n) #' #' makeX(dfn) #' makeX(dfn, sparse = TRUE) #' makeX(dfn, na.impute = TRUE) #' makeX(dfn, na.impute = TRUE, sparse = TRUE) #' #' ### Test data as well #' X = matrix(rnorm(10), 5, 2) #' X3 = sample(letters[1:3], 5, replace = TRUE) #' X4 = sample(LETTERS[1:3], 5, replace = TRUE) #' dft = data.frame(X, X3, X4) #' #' makeX(df, dft) #' makeX(df, dft, sparse = TRUE) #' #' ### Missing data in test as well #' Xn = X #' Xn[3, 1] = NA #' Xn[5, 2] = NA #' X3n = X3 #' X3n[1] = NA #' X4n = X4 #' X4n[2] = NA #' dftn = data.frame(Xn, X3n, X4n) #' #' makeX(dfn, dftn) #' makeX(dfn, dftn, sparse = TRUE) #' makeX(dfn, dftn, na.impute = TRUE) #' makeX(dfn, dftn, sparse = TRUE, na.impute = TRUE) #' #' @export makeX makeX=function(train,test=NULL, na.impute=FALSE,sparse=FALSE,...){ df=train istest=!is.null(test) ntr=nrow(train) if(istest){ nte=nrow(test) df=rbind(df,test) } ### bug fix because of change of default behavior of data.frame ## check if any character columns classes = sapply(df,class) if (any(classes == "character")) df <- as.data.frame(unclass(df), stringsAsFactors = TRUE) ### x=prepareX(df,sparse=sparse) if(na.impute){ xbar=colMeans(x[seq(ntr),],na.rm=TRUE) x=na.replace(x,xbar) } if(istest){ xt=x[seq(ntr+1,ntr+nte),] x=x[seq(ntr),] } if(na.impute)attr(x,"means")=xbar if(istest)list(x=x,xtest=xt) else x } #' @importFrom stats contrasts model.matrix na.pass #' @importFrom Matrix sparse.model.matrix #' @export prepareX prepareX <- function(df,sparse=FALSE,...){ if(!inherits(df,"data.frame"))stop("first argument must be of class `data.frame`") whichfac=sapply(df,inherits,"factor") ### bug fix if factor has one level only ## Cannot get contrasts to do the job here, so do it manually df_level <- lapply(df[,whichfac,drop = FALSE], levels) nlevels <- sapply(df_level,length) which <- nlevels == 1 if(any(which)){ whichfac1 = whichfac whichfac1[whichfac] = which dn <- names(df) cx <- as.matrix(df[,whichfac1],drop=FALSE) unimat <- array(1,dim=dim(cx)) cnames <- paste0(dn[whichfac1],unlist(df_level[which])) unimat[is.na(cx)] <- NA df[,whichfac1] <- data.frame(unimat) dn[whichfac1] <- cnames names(df) <- dn whichfac[whichfac] = !which warning(call. = FALSE,paste("Column(s) ",paste(cnames,collapse=", "), "are all 1, due to factors with a single level")) } ### oldna=options()$na.action cna=as.character(substitute(na.action)) options(na.action=na.pass) on.exit(options(na.action=oldna)) if(any(whichfac)) ctr=lapply(df[,whichfac,drop=FALSE], contrasts,contrast=FALSE) else ctr=NULL if(sparse){ m=sparse.model.matrix(~.-1,data=df,contrasts.arg=ctr,...) m=na_sparse_fix(m,names(df)) # sparse.model.matrix is faulty } else m = model.matrix(~.-1,data=df,contrasts.arg=ctr,...) if(any(whichfac))attr(m,"contrasts")=NULL attr(m,"assign")=NULL m } #' @export na_sparse_fix na_sparse_fix=function(x,dfnames){ a=attributes(x) ac=a$contrasts as=a$assign if(is.null(ac))return(x) acn=names(ac) whichn=match(acn,dfnames) for(i in whichn){ xi=x[,as==i] rowtot=rowSums(xi) if(sum(rowtot) #' @seealso \code{makeX} and \code{glmnet} #' @keywords models #' @examples #' #' set.seed(101) #' ### Single data frame #' X = matrix(rnorm(20), 10, 2) #' X[3, 1] = NA #' X[5, 2] = NA #' X3 = sample(letters[1:3], 10, replace = TRUE) #' X3[6] = NA #' X4 = sample(LETTERS[1:3], 10, replace = TRUE) #' X4[9] = NA #' dfn = data.frame(X, X3, X4) #' #' x = makeX(dfn) #' m = rowSums(x, na.rm = TRUE) #' na.replace(x, m) #' #' x = makeX(dfn, sparse = TRUE) #' na.replace(x, m) #' #' @export na.replace na.replace=function(x,m=rowSums(x,na.rm=TRUE)){ if(inherits(x,"sparseMatrix")){ x=as(x,"CsparseMatrix") ccount=diff(x@p) cindex=rep(1:length(ccount),ccount) nas=is.na(x@x) if(any(nas))x@x[nas]=m[cindex[nas]] } else{ d=dim(x) cols=rep(1:d[2],rep(d[1],d[2])) nas=is.na(x) if(any(nas))x[nas]=m[cols[nas]] } x } glmnet/R/plot.cv.glmnet.R0000644000176200001440000000502615035277252014751 0ustar liggesusers#' plot the cross-validation curve produced by cv.glmnet #' #' Plots the cross-validation curve, and upper and lower standard deviation #' curves, as a function of the \code{lambda} values used. If the object has #' class \code{"cv.relaxed"} a different plot is produced, showing both #' \code{lambda} and \code{gamma} #' #' A plot is produced, and nothing is returned. #' #' @aliases plot.cv.glmnet #' @param x fitted \code{"cv.glmnet"} object #' @param sign.lambda Either plot against \code{log(lambda)} or its #' negative if \code{sign.lambda=-1} (default). #' @param \dots Other graphical parameters to plot #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet} and \code{cv.glmnet}. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent} #' @keywords models regression #' @examples #' #' set.seed(1010) #' n = 1000 #' p = 100 #' nzc = trunc(p/10) #' x = matrix(rnorm(n * p), n, p) #' beta = rnorm(nzc) #' fx = (x[, seq(nzc)] %*% beta) #' eps = rnorm(n) * 5 #' y = drop(fx + eps) #' px = exp(fx) #' px = px/(1 + px) #' ly = rbinom(n = length(px), prob = px, size = 1) #' cvob1 = cv.glmnet(x, y) #' plot(cvob1) #' title("Gaussian Family", line = 2.5) #' cvob1r = cv.glmnet(x, y, relax = TRUE) #' plot(cvob1r) #' frame() #' set.seed(1011) #' par(mfrow = c(2, 2), mar = c(4.5, 4.5, 4, 1)) #' cvob2 = cv.glmnet(x, ly, family = "binomial") #' plot(cvob2) #' title("Binomial Family", line = 2.5) #' ## set.seed(1011) #' ## cvob3 = cv.glmnet(x, ly, family = "binomial", type = "class") #' ## plot(cvob3) #' ## title("Binomial Family", line = 2.5) #' #' @method plot cv.glmnet #' @export plot.cv.glmnet=function(x,sign.lambda=-1,...){ cvobj=x xlab = if(sign.lambda<0) expression(-Log(lambda)) else expression(Log(lambda)) plot.args=list(x=sign.lambda*log(cvobj$lambda),y=cvobj$cvm,ylim=range(cvobj$cvup,cvobj$cvlo),xlab=xlab,ylab=cvobj$name,type="n") new.args=list(...) if(length(new.args))plot.args[names(new.args)]=new.args do.call("plot",plot.args) error.bars(sign.lambda*log(cvobj$lambda),cvobj$cvup,cvobj$cvlo,width=0.01, col="darkgrey") points(sign.lambda*log(cvobj$lambda),cvobj$cvm,pch=20, col="red") axis(side=3,at=sign.lambda*log(cvobj$lambda),labels=paste(cvobj$nz),tick=FALSE,line=0) abline(v=sign.lambda*log(cvobj$lambda.min),lty=3) abline(v=sign.lambda*log(cvobj$lambda.1se),lty=3) invisible() } glmnet/R/cv.mrelnet.R0000644000176200001440000000113414325602475014150 0ustar liggesuserscv.mrelnet <- function(predmat,y,type.measure,weights,foldid,grouped){ ndim = dim(y) nc = ndim[2] nobs = ndim[1] N = nobs - apply(is.na(predmat[, 1,,drop=FALSE ]), 2, sum)# dimensions could be lost if third dim=1 bigY = array(y, dim(predmat)) cvraw = switch(type.measure, mse = apply((bigY - predmat)^2,c(1, 3), sum), deviance = apply((bigY - predmat)^2, c(1,3), sum), mae = apply(abs(bigY - predmat), c(1, 3), sum) ) list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=grouped) } glmnet/R/relax.glmnet.R0000644000176200001440000000770614325602475014506 0ustar liggesusers#' Fit a relaxed glmnet model #' #' @param fit For \code{relax.glmnet} a fitted 'glmnet' object #' @param maxp a limit on how many relaxed coefficients are allowed. Default is #' 'n-3', where 'n' is the sample size. This may not be sufficient for #' non-gaussian familes, in which case users should supply a smaller value. #' This argument can be supplied directly to 'glmnet'. #' @param path Since \code{glmnet} does not do stepsize optimization, the Newton #' algorithm can get stuck and not converge, especially with relaxed fits. With \code{path=TRUE}, #' each relaxed fit on a particular set of variables is computed pathwise using the original sequence #' of lambda values (with a zero attached to the end). Not needed for Gaussian models, and should not #' be used unless needed, since will lead to longer compute times. Default is \code{path=FALSE}. #' appropriate subset of variables #' @param check.args Should \code{relax.glmnet} make sure that all the data #' dependent arguments used in creating 'fit' have been resupplied. Default is #' 'TRUE'. #' @rdname glmnet #' @export relax.glmnet relax.glmnet=function(fit,x,..., maxp = n-3, path=FALSE, check.args=TRUE){ ## maxp could be a sensitive parameter, especially for glms ## This next call fails if you don't supply the crucial arguments ## that were used in the creation of "fit". Not needed if called relax.glmnet if(check.args)check_dots(fit,..., need=c("y","weights","offset","lower.limits","upper.limits"), error="used relax.glmnet(),") d=dim(x) n=d[1];p=d[2] ## extract coefs, and find out who is nonzero at each lambda a0=fit$a0 beta=fit$beta islistbeta=is.list(beta) if(islistbeta){ ngroups=length(beta) nzmat=abs(beta[[1]]) for(k in 2:ngroups)nzmat=nzmat+abs(beta[[k]]) } else nzmat=abs(beta) nzmat=nzmat>0 ## Here we go to some trouble to make sure we dont fit the same model more than once rgauss=sort(abs(rnorm(p))) undex=colSums(rgauss*nzmat)#a unique number for each distinct set of nonzeros sundex=sort(unique(undex[undex>0])) nzindex=match(sundex,undex)# get a match for each unique alldex=match(undex,sundex,0)# for putting them back ## dev=fit$dev.ratio nulldev=fit$nulldev excluders=seq(p) lam0 = if(path)c(fit$lambda,0)else 0 ### Fit a coefficient for each non null model internal.parms <- glmnet.control() if (internal.parms$itrace) { glmnet.control(itrace = 0) ## disable glmnet reporting cat("Relaxed Fits\n") pb <- utils::txtProgressBar(min = 0, max = length(sundex), initial = 0, style = 3) on.exit(glmnet.control(itrace = internal.parms$itrace)) on.exit(close(pb), add = TRUE) } for(i in seq(along=sundex)){ ind=nzmat[,nzindex[i]] wh=alldex==i pi=sum(ind) if(pi>maxp)next #can only fit maxp coefficients exclude=excluders[!ind] ifit=update(fit,x=x,lambda=lam0,exclude=exclude,...,relax=FALSE) nlam=ifit$dim[2] if (islistbeta) { a0[, wh] = ifit$a0[,nlam] for (i in 1:ngroups) beta[[i]][, wh] = ifit$beta[[i]][,nlam] } else { a0[wh] = ifit$a0[nlam] beta[, wh] = ifit$beta[,nlam] } dev[wh] = ifit$dev.ratio[nlam] if (internal.parms$itrace) utils::setTxtProgressBar(pb, i) } if (internal.parms$itrace) { utils::setTxtProgressBar(pb = pb, value = length(sundex)) } fitg=fit omit=colSums(nzmat)>maxp if(any(omit)){ if(islistbeta){ a0=a0[,!omit] for(i in 1:ngroups)beta[[i]]=beta[[i]][,!omit] } else{ beta=beta[,!omit] a0=a0[!omit] } dev=dev[!omit] fit$lambda=fit$lambda[!omit] fit$df=fit$df[!omit] } fit$beta=beta fit$a0=a0 fit$dev.ratio=dev class(fitg)=c("relaxed",class(fitg)) fitg$relaxed=fit fitg } glmnet/R/jerr.lognet.R0000644000176200001440000000100014325602475014314 0ustar liggesusersjerr.lognet=function(n,maxit,pmax){ outlist=jerr.elnet(n,maxit,pmax) if(n< -20000)outlist$msg=paste("Max(p(1-p),1.0e-6 at ",-n-20000,"th value of lambda; solutions for larger values of lambda returned") if(outlist$msg!="Unknown error")return(outlist) if((8000 1.0 - 1.0e-5") else msg="Unknown error" list(n=n,fatal=TRUE,msg=msg) } glmnet/R/mrelnet.R0000644000176200001440000000374414325602475013552 0ustar liggesusersmrelnet=function(x,is.sparse,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,jsd,intr,vnames,maxit,pb){ maxit=as.integer(maxit) weights=as.double(weights) ### compute the null deviance y=as.matrix(y) nr=ncol(y) if(nr>1){ responseNames=dimnames(y)[[2]] if(is.null(responseNames))responseNames=paste("y",seq(nr),sep="") } storage.mode(y)="double" if(is.null(offset)){ is.offset=FALSE} else{ offset=as.matrix(offset) storage.mode(offset)="double" if(!all.equal(dim(offset),dim(y)))stop("Offset must match dimension of y") y=y-offset is.offset=TRUE } nulldev=0 for(i in seq(nr)){ ybar=weighted.mean(y[,i],weights) nulldev=nulldev+sum(weights* (y[,i]-ybar)^2) } storage.mode(nr)="integer" fit=if(is.sparse) multspelnet_exp( parm=alpha,x,y,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,jsd,intr,maxit,pb, lmu=integer(1), a0=matrix(0.0,nr,nlam), ca=double(nx*nlam*nr), ia=integer(nx), nin=integer(nlam), rsq=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1) ) else multelnet_exp( parm=alpha,x,y,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,jsd,intr,maxit,pb, lmu=integer(1), a0=matrix(0.0,nr,nlam), ca=double(nx*nlam*nr), ia=integer(nx), nin=integer(nlam), rsq=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1) ) if(fit$jerr!=0){ errmsg=jerr(fit$jerr,maxit,pmax=nx,family="mrelnet") if(errmsg$fatal)stop(errmsg$msg,call.=FALSE) else warning(errmsg$msg,call.=FALSE) } if(nr>1) outlist=getcoef.multinomial(fit,nvars,nx,vnames,nr,responseNames,center.intercept=FALSE) else outlist=getcoef(fit,nvars,nx,vnames) dev=fit$rsq[seq(fit$lmu)] outlist=c(outlist,list(dev.ratio=dev,nulldev=nulldev,npasses=fit$nlp,jerr=fit$jerr,offset=is.offset)) class(outlist)="mrelnet" outlist } glmnet/R/auc.R0000644000176200001440000000021414325602475012641 0ustar liggesusersauc=function(y,prob,w){ if(missing(w)) concordance(y~prob)$concordance else concordance(y~prob,weights=w)$concordance } glmnet/R/getOptcv.relaxed.R0000644000176200001440000000265414325602475015321 0ustar liggesusersgetOptcv.relaxed <- function (statlist,cvname,gamma) { index=matrix(NA,2,2,dimnames=list(c("min","1se"),c("Lambda","Gamma"))) cvm=lapply(statlist,"[[","cvm") nlams=sapply(cvm,length) index.lambda=unlist(lapply(nlams,seq)) cvm=unlist(cvm) lambdas=unlist(lapply(statlist,"[[","lambda")) cvsd=unlist(lapply(statlist,"[[","cvsd")) nzero=unlist(lapply(statlist,"[[","nzero")) gammas=rep(gamma,nlams) index.gamma = rep(seq(along=gamma),nlams) names(lambdas)=NULL names(gammas)=NULL if(match(cvname,c("AUC","C-index"),0))cvm=-cvm cvmin = min(cvm, na.rm = TRUE) idmin = cvm <= cvmin which=order(lambdas[idmin],gammas[idmin],decreasing=TRUE)[1] lambda.min = lambdas[idmin][which] gamma.min= gammas[idmin][which] index["min","Lambda"]=index.lambda[idmin][which] index["min","Gamma"]=index.gamma[idmin][which] nzero.min=nzero[idmin][which] idmin=seq(along=lambdas)[idmin][which] semin = (cvm + cvsd)[idmin] idmin = cvm <= semin which=order(lambdas[idmin],gammas[idmin],decreasing=TRUE)[1] lambda.1se = lambdas[idmin][which] gamma.1se= gammas[idmin][which] index["1se","Lambda"]=index.lambda[idmin][which] index["1se","Gamma"]=index.gamma[idmin][which] nzero.1se=nzero[idmin][which] list(lambda.min = lambda.min, lambda.1se = lambda.1se, gamma.min=gamma.min, gamma.1se=gamma.1se,nzero.min=nzero.min,nzero.1se=nzero.1se, index=index) } glmnet/R/glmnet.control.R0000644000176200001440000000746314325602475015053 0ustar liggesusers#' internal glmnet parameters #' #' View and/or change the factory default parameters in glmnet #' #' If called with no arguments, \code{glmnet.control()} returns a list with the #' current settings of these parameters. Any arguments included in the call #' sets those parameters to the new values, and then silently returns. The #' values set are persistent for the duration of the R session. #' #' @param fdev minimum fractional change in deviance for stopping path; factory #' default = 1.0e-5 #' @param devmax maximum fraction of explained deviance for stopping path; #' factory default = 0.999 #' @param eps minimum value of lambda.min.ratio (see glmnet); factory default= #' 1.0e-6 #' @param big large floating point number; factory default = 9.9e35. Inf in #' definition of upper.limit is set to big #' @param mnlam minimum number of path points (lambda values) allowed; factory #' default = 5 #' @param pmin minimum probability for any class. factory default = 1.0e-9. #' Note that this implies a pmax of 1-pmin. #' @param exmx maximum allowed exponent. factory default = 250.0 #' @param prec convergence threshold for multi response bounds adjustment #' solution. factory default = 1.0e-10 #' @param mxit maximum iterations for multiresponse bounds adjustment solution. #' factory default = 100 #' @param itrace If 1 then progress bar is displayed when running \code{glmnet} #' and \code{cv.glmnet}. factory default = 0 #' @param epsnr convergence threshold for \code{glmnet.fit}. factory default = #' 1.0e-6 #' @param mxitnr maximum iterations for the IRLS loop in \code{glmnet.fit}. factory #' default = 25 #' @param factory If \code{TRUE}, reset all the parameters to the factory #' default; default is \code{FALSE} #' @return A list with named elements as in the argument list #' @author Jerome Friedman, Kenneth Tay, Trevor Hastie\cr Maintainer: Trevor Hastie #' \email{hastie@@stanford.edu} #' @seealso \code{glmnet} #' @keywords models regression #' @examples #' #' glmnet.control(fdev = 0) #continue along path even though not much changes #' glmnet.control() # view current settings #' glmnet.control(factory = TRUE) # reset all the parameters to their default #' #' @export glmnet.control glmnet.control <- function (fdev = 1e-05, devmax = 0.999, eps = 1e-06, big = 9.9e+35, mnlam = 5, pmin = 1e-09, exmx = 250, prec = 1e-10, mxit = 100, itrace = 0, epsnr = 1e-06, mxitnr = 25, factory = FALSE) { inquiry=!nargs() if (factory) invisible(glmnet.control(fdev = 1e-05, devmax = 0.999, eps = 1e-06, big = 9.9e+35, mnlam = 5, pmin = 1e-09, exmx = 250, prec = 1e-10, mxit = 100, itrace = 0, epsnr = 1e-06, mxitnr = 25)) else { if (!missing(fdev)) chg_fract_dev(as.double(fdev)) if (!missing(devmax)) chg_dev_max(as.double(devmax)) if (!missing(eps)) chg_min_flmin(as.double(eps)) if (!missing(big)) chg_big(as.double(big)) if (!missing(mnlam)) chg_min_lambdas(as.integer(mnlam)) if (!missing(pmin)) chg_min_null_prob(as.double(pmin)) if (!missing(exmx)) chg_max_exp(as.double(exmx)) if (!missing(prec) | !missing(mxit)) chg_bnorm(as.double(prec), as.integer(mxit)) if (!missing(itrace)) chg_itrace(as.integer(itrace)) if (!missing(epsnr)) chg_epsnr(as.double(epsnr)) if (!missing(mxitnr)) chg_mxitnr(as.integer(mxitnr)) value=c(get_int_parms(fdev = double(1), eps = double(1), big = double(1), mnlam = integer(1), devmax = double(1), pmin = double(1), exmx = double(1), itrace = integer(1)), get_bnorm(prec = double(1), mxit = integer(1)), get_int_parms2(epsnr = double(1), mxitnr = integer(1))) if(inquiry)value else invisible(value) } } glmnet/R/buildPredmat.coxnetlist.R0000644000176200001440000000433614656736715016725 0ustar liggesusers#' @method buildPredmat coxnetlist #' @export buildPredmat.coxnetlist <- function(outlist, lambda, x, offset, foldid, alignment,y,weights,grouped,type.measure="deviance",...){ nfolds = max(foldid) if ((length(weights)/nfolds < 10) && !grouped) grouped = TRUE devtrue=type.measure=="deviance" cvraw = if(devtrue) matrix(NA, nfolds, length(lambda)) else NULL nlambda = length(lambda) predmat=matrix(NA, nrow(x), length(lambda)) rn=rownames(x) sn=paste("s",seq(0,length=nlambda),sep="") dimnames(predmat)=list(rn,sn) for (i in seq(nfolds)) { which = foldid == i fitobj = outlist[[i]] coefmat = switch(alignment, fraction = predict(fitobj,type = "coefficients",...), lambda = predict(fitobj, type = "coefficients",s = lambda,...) ) nlami = min(ncol(coefmat), nlambda) if(devtrue){ if (grouped) { plfull = coxnet.deviance(x = x, y = y, offset = offset, weights = weights, beta = coefmat, std.weights = FALSE) plminusk = coxnet.deviance(x = x[!which, ], y = y[!which, ], offset = offset[!which], weights = weights[!which], beta = coefmat, std.weights = FALSE) cvraw[i, seq(nlami)] = (plfull - plminusk)[seq(nlami)] } else { plk = coxnet.deviance(x = x[which, ], y = y[which, ], offset = offset[which], weights = weights[which], beta = coefmat, std.weights = FALSE) cvraw[i, seq(nlami)] = plk[seq(nlami)] } } predmat[which, seq(nlami)] = as.matrix(x[which,]%*% coefmat[,seq(nlami)]) if (nlami < nlambda){ if(devtrue)cvraw[i, seq(from = nlami, to = nlambda)] = cvraw[i, nlami] predmat[which,seq(from=nlami,to=nlambda)]=predmat[which,nlami] } } if(devtrue) attr(predmat,"cvraw")=cvraw predmat } glmnet/R/fix.lam.R0000644000176200001440000000015414325602475013432 0ustar liggesusersfix.lam=function(lam){ if(length(lam)>2){ llam=log(lam) lam[1]=exp(2*llam[2]-llam[3]) } lam } glmnet/R/deviance.glmnet.R0000644000176200001440000000274014325602475015142 0ustar liggesusers#' Extract the deviance from a glmnet object #' #' Compute the deviance sequence from the glmnet object #' #' A glmnet object has components \code{dev.ratio} and \code{nulldev}. The #' former is the fraction of (null) deviance explained. The deviance #' calculations incorporate weights if present in the model. The deviance is #' defined to be 2*(loglike_sat - loglike), where loglike_sat is the #' log-likelihood for the saturated model (a model with a free parameter per #' observation). Null deviance is defined to be 2*(loglike_sat #' -loglike(Null)); The NULL model refers to the intercept model, except for #' the Cox, where it is the 0 model. Hence dev.ratio=1-deviance/nulldev, and #' this \code{deviance} method returns (1-dev.ratio)*nulldev. #' #' @param object fitted glmnet object #' @param \dots additional print arguments #' @return (1-dev.ratio)*nulldev #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet}, \code{predict}, \code{print}, and \code{coef} #' methods. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent} #' @keywords models regression #' @examples #' #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' fit1 = glmnet(x, y) #' deviance(fit1) #' @method deviance glmnet #' @export deviance.glmnet=function(object,...){ dev=object$dev nulldev=object$nulldev (1-dev)*nulldev } glmnet/R/cv.elnet.R0000644000176200001440000000056314325602475013616 0ustar liggesuserscv.elnet <-function(predmat,y,type.measure,weights,foldid,grouped){ N = length(y) - apply(is.na(predmat), 2, sum) cvraw = switch(type.measure, mse = (y - predmat)^2, deviance = (y - predmat)^2, mae = abs(y - predmat)) list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=grouped) } glmnet/R/plotCoef.R0000644000176200001440000000341415035277145013652 0ustar liggesusersplotCoef=function(beta,norm,lambda,df,dev,label=FALSE,xvar=c("norm","lambda","dev"), xlab=iname,ylab="Coefficients",sign.lambda=-1,...){ ##beta should be in "dgCMatrix" format which=nonzeroCoef(beta) nwhich=length(which) switch(nwhich+1,#we add one to make switch work "0"={ warning("No plot produced since all coefficients zero") return() }, "1"=warning("1 or less nonzero coefficients; glmnet plot is not meaningful") ) beta=as.matrix(beta[which,,drop=FALSE]) xvar=match.arg(xvar) switch(xvar, "norm"={ index=if(missing(norm))apply(abs(beta),2,sum)else norm iname="L1 Norm" approx.f=1 }, "lambda"={ if(sign.lambda<0){ index=-log(lambda) iname= expression(-Log(lambda)) approx.f=1 } else{ index=log(lambda) iname= expression(Log(lambda)) approx.f=0 } }, "dev"= { index=dev iname="Fraction Deviance Explained" approx.f=1 } ) dotlist=list(...) type=dotlist$type if(is.null(type)) matplot(index,t(beta),lty=1,xlab=xlab,ylab=ylab,type="l",...) else matplot(index,t(beta),lty=1,xlab=xlab,ylab=ylab,...) atdf=pretty(index) ### compute df by interpolating to df at next smaller lambda ### thanks to Yunyang Qian prettydf=approx(x=index,y=df,xout=atdf,rule=2,method="constant",f=approx.f)$y # prettydf=ceiling(approx(x=index,y=df,xout=atdf,rule=2)$y) axis(3,at=atdf,labels=prettydf,tcl=NA) if(label){ nnz=length(which) xpos=max(index) pos=4 if(xvar=="lambda"&sign.lambda==1){ xpos=min(index) pos=2 } xpos=rep(xpos,nnz) ypos=beta[,ncol(beta)] text(xpos,ypos,paste(which),cex=.5,pos=pos) } } glmnet/R/fishnet.R0000644000176200001440000000307714325602475013543 0ustar liggesusersfishnet=function(x,is.sparse,y,weights,offset,alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit,pb){ if(any(y<0))stop("negative responses encountered; not permitted for Poisson family") maxit=as.integer(maxit) weights=as.double(weights) storage.mode(y)="double" if(is.null(offset)){ offset=y*0 #keeps the shape of y is.offset=FALSE} else{ storage.mode(offset)="double" is.offset=TRUE } fit=if(is.sparse) spfishnet_exp( parm=alpha,x,y,offset,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit,pb, lmu=integer(1), a0=double(nlam), ca=matrix(0.0, nx, nlam), ia=integer(nx), nin=integer(nlam), nulldev=double(1), dev=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1) ) else fishnet_exp( parm=alpha,x,y,offset,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit,pb, lmu=integer(1), a0=double(nlam), ca=matrix(0.0,nx,nlam), ia=integer(nx), nin=integer(nlam), nulldev=double(1), dev=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1) ) if(fit$jerr!=0){ errmsg=jerr(fit$jerr,maxit,pmax=nx,family="poisson") if(errmsg$fatal)stop(errmsg$msg,call.=FALSE) else warning(errmsg$msg,call.=FALSE) } outlist=getcoef(fit,nvars,nx,vnames) dev=fit$dev[seq(fit$lmu)] outlist=c(outlist,list(dev.ratio=dev,nulldev=fit$nulldev,npasses=fit$nlp,jerr=fit$jerr,offset=is.offset)) class(outlist)="fishnet" outlist } glmnet/R/confusion.glmnet.R0000644000176200001440000000402114325602475015361 0ustar liggesusers#' Compute a confusion matrix (or many) for a binomial or multinomial glmnet model #' #' @rdname assess.glmnet #' @export confusion.glmnet confusion.glmnet=function(object,newx=NULL,newy,family=c("binomial","multinomial"),...){ ### object must be either a glmnet or cv.glmnet object fit with family binomial or multinomial ### or else a matrix/array of predictions of a glmnet model of these families ### (the last dimension can be 1) ### (not on the mean scale, but natural parameter scale) oclass=grep("glmnet",class(object)) if(length(oclass)){# either a glmnet or cv.glmnet if(!match(family(object),c("binomial","multinomial"),FALSE)) stop("confusion available only for binomial or multinomial family") classmat=predict(object,newx=newx,type="class",...) } else{ fam=match.arg(family) predmat=object if(fam=="binomial"){ classnames=attr(predmat,"classnames")#if it was created by cv with keep if(is.null(classnames))classnames=c("1","2") if(is.vector(predmat))predmat=as.matrix(predmat) cnum=ifelse(predmat>0,2,1) classmat=classnames[cnum] if(is.matrix(predmat))classmat=array(classmat,dim(predmat),dimnames(predmat)) } else{ classmat=apply(predmat, 3, glmnet_softmax) } } ### newy can be a matrix or a factor nc = dim(newy) if (is.null(nc)) { newy = as.factor(newy) } else { nc = nc[2] yc=newy%*%(1:nc) cn=colnames(newy) if(!is.null(cn)) newy=factor(yc,labels=cn) else newy=factor(yc) } ctable=function(...){ tab=table(...) class(tab)=c("confusion.table",class(tab)) tab } if(ncol(classmat)>1) ## convert to a dataframe, to prevent apply simplifying lapply(data.frame(classmat,stringsAsFactors=FALSE,check.names=FALSE), function(x,y)ctable(Predicted=x,True=y),y=newy) else(ctable(Predicted=classmat,True=newy)) } glmnet/R/jerr.mrelnet.R0000644000176200001440000000033314325602475014502 0ustar liggesusersjerr.mrelnet=function(n,maxit,pmax){ if(n==90000){ msg=paste("Newton stepping for bounded multivariate response did not converge") list(n=n,fatal=FALSE,msg=msg) } else jerr.elnet(n,maxit,pmax) } glmnet/R/jerr.elnet.R0000644000176200001440000000133414325602475014145 0ustar liggesusersjerr.elnet=function(n,maxit,pmax){ if(n>0){#fatal error if(n<7777)msg="Memory allocation error; contact package maintainer" else if(n==7777)msg="All used predictors have zero variance" else if(n==10000)msg="All penalty factors are <= 0" else msg="Unknown error" list(n=n,fatal=TRUE,msg=msg) } else if(n<0){# non-fatal error if(n>-10000)msg=paste("Convergence for ",-n,"th lambda value not reached after maxit=",maxit," iterations; solutions for larger lambdas returned",sep="") if(n < -10000)msg=paste("Number of nonzero coefficients along the path exceeds pmax=",pmax, " at ",-n-10000,"th lambda value; solutions for larger lambdas returned",sep="") list(n=n,fatal=FALSE,msg=msg) } } glmnet/R/glmnet-package.R0000644000176200001440000001161515012065446014752 0ustar liggesusers #' Simulated data for the glmnet vignette #' #' Simple simulated data, used to demonstrate the features of glmnet #' #' These datasets are artificial, and are used to test out some of the #' features of glmnet. #' @name beta_CVX #' @aliases x y beta_CVX #' @format Data objects used to demonstrate features in the glmnet vignette #' @keywords datasets #' @useDynLib glmnet #' @import methods #' @import Matrix #' @import foreach #' @importFrom utils packageDescription #' @importFrom graphics abline axis matplot points segments text par plot #' @importFrom stats approx coef median predict rmultinom runif weighted.mean family rnorm gaussian binomial glm glm.fit #' @importFrom survival concordance Surv is.Surv #' @importFrom grDevices rainbow #' @importFrom Rcpp sourceCpp #' #' @examples #' #' data(QuickStartExample) #' x <- QuickStartExample$x; y <- QuickStartExample$y #' glmnet(x, y) #' NULL #' Internal glmnet functions #' #' @description #' These are not intended for use by users. \code{lambda.interp} does linear #' interpolation of the lambdas to obtain a prediction at a new point s. #' \code{glmnet_softmax} does the classification for multinomial models. #' \code{nonzeroCoef} determines in an efficient manner which variables are #' nonzero in each fit. \code{jerr} prints out error messages from the C++ routines. #' \code{plotCoef} is called by the \code{plot} method for \code{glmnet} #' objects. \code{check_dots} is used in \code{coef} and \code{predict} with #' argument \code{exact=TRUE}, to make sure user supplies original data used to #' fit the \code{"glmnet"} object. #' #' @name glmnet-internal #' @aliases auc assess.coxnet auc.mat cvtype cvstats #' cvcompute getcoef getcoef.multinomial fix.lam error.bars #' getmin elnet mrelnet lognet fishnet coefnorm coxnet cv.lognet cv.elnet #' cv.multnet cv.mrelnet cv.coxnet cv.fishnet cv.glmnet.raw cv.relaxed.raw #' blend.relaxed checkgamma.relax buildPredmat buildPredmat.mrelnetlist #' buildPredmat.multnetlist buildPredmat.lognetlist buildPredmat.array #' buildPredmat.coxnetlist buildPredmat.default lambda.interp nonzeroCoef #' glmnet_softmax getOptcv.glmnet getOptcv.relaxed jerr jerr.elnet jerr.lognet #' jerr.fishnet jerr.coxnet jerr.mrelnet plotCoef zeromat na.mean check_dots #' na_sparse_fix prepareX #' #' @author Trevor Hastie #' @keywords internal NULL #' Elastic net model paths for some generalized linear models #' #' This package fits lasso and elastic-net model paths for regression, logistic #' and multinomial regression using coordinate descent. The algorithm is #' extremely fast, and exploits sparsity in the input x matrix where it exists. #' A variety of predictions can be made from the fitted models. #' #' \tabular{ll}{ Package: \tab glmnet\cr Type: \tab Package\cr Version: \tab #' 1.0\cr Date: \tab 2008-05-14\cr License: \tab What license is it under?\cr } #' Very simple to use. Accepts \code{x,y} data for regression models, and #' produces the regularization path over a grid of values for the tuning #' parameter \code{lambda}. Only 5 functions: \code{glmnet}\cr #' \code{predict.glmnet}\cr \code{plot.glmnet}\cr \code{print.glmnet}\cr #' \code{coef.glmnet} #' #' @name glmnet-package #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent (2010), Journal of Statistical Software, Vol. 33(1), 1-22}, #' \doi{10.18637/jss.v033.i01}.\cr #' Simon, N., Friedman, J., Hastie, T. and Tibshirani, R. (2011) #' \emph{Regularization Paths for Cox's Proportional #' Hazards Model via Coordinate Descent, Journal of Statistical Software, Vol. #' 39(5), 1-13}, #' \doi{10.18637/jss.v039.i05}.\cr #' Tibshirani,Robert, Bien, J., Friedman, J., Hastie, T.,Simon, N.,Taylor, J. and #' Tibshirani, Ryan. (2012) \emph{Strong Rules for Discarding Predictors in #' Lasso-type Problems, JRSSB, Vol. 74(2), 245-266}, #' \url{https://arxiv.org/abs/1011.2234}.\cr #' Hastie, T., Tibshirani, Robert and Tibshirani, Ryan (2020) \emph{Best Subset, #' Forward Stepwise or Lasso? Analysis and Recommendations Based on Extensive Comparisons, #' Statist. Sc. Vol. 35(4), 579-592}, #' \url{https://arxiv.org/abs/1707.08692}.\cr #' Glmnet webpage with four vignettes: \url{https://glmnet.stanford.edu}. #' @keywords models regression package #' @examples #' #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' g2 = sample(1:2, 100, replace = TRUE) #' g4 = sample(1:4, 100, replace = TRUE) #' fit1 = glmnet(x, y) #' predict(fit1, newx = x[1:5, ], s = c(0.01, 0.005)) #' predict(fit1, type = "coef") #' plot(fit1, xvar = "lambda") #' fit2 = glmnet(x, g2, family = "binomial") #' predict(fit2, type = "response", newx = x[2:5, ]) #' predict(fit2, type = "nonzero") #' fit3 = glmnet(x, g4, family = "multinomial") #' predict(fit3, newx = x[1:3, ], type = "response", s = 0.01) #' "_PACKAGE" glmnet/R/predict.fishnet.R0000644000176200001440000000043214325602475015164 0ustar liggesusers#' @method predict fishnet #' @export predict.fishnet=function(object,newx,s=NULL,type=c("link","response","coefficients","nonzero"),exact=FALSE,newoffset,...){ type=match.arg(type) nfit=NextMethod("predict") switch(type, response=exp(nfit), nfit ) } glmnet/R/rmult.R0000644000176200001440000000110114325602475013230 0ustar liggesusers#' Generate multinomial samples from a probability matrix #' #' Generate multinomial samples #' #' Simple function that calls the \code{rmultinom} function. It generates a class label #' for each row of its input matrix of class probabilities. #' #' @param p matrix of probabilities, with number of columns the number of classes #' @return a vector of class memberships #' @author Trevor Hastie \cr Maintainer: Trevor Hastie #' @export rmult rmult <- function(p){ x=t(apply(p,1,function(x)rmultinom(1,1,x))) x=x%*%seq(ncol(p)) drop(x) } glmnet/R/cv.lognet.R0000644000176200001440000000426214325602475013777 0ustar liggesuserscv.lognet <- function(predmat,y,type.measure,weights,foldid,grouped){ prob_min = 1e-05 prob_max = 1 - prob_min nc = dim(y) if (is.null(nc)) { y = as.factor(y) ntab = table(y) nc = as.integer(length(ntab)) y = diag(nc)[as.numeric(y), , drop=FALSE] } N = nrow(y) nfolds = max(foldid) if ((N/nfolds < 10) && type.measure == "auc") { warning("Too few (< 10) observations per fold for type.measure='auc' in cv.lognet; changed to type.measure='deviance'. Alternatively, use smaller value for nfolds", call. = FALSE) type.measure = cvtype("deviance", "lognet") } predmat=1/(1+exp(-predmat)) nlambda=ncol(predmat) nlams=rep(nlambda,nfolds) if (type.measure == "auc") { cvraw = matrix(NA, nfolds, nlambda) good = matrix(0, nfolds, nlambda) for (i in seq(nfolds)) { good[i, seq(nlams[i])] = 1 which = foldid == i for (j in seq(nlams[i])) { cvraw[i, j] = auc.mat(y[which, ], predmat[which, j], weights[which]) } } N = apply(good, 2, sum) weights = tapply(weights, foldid, sum) grouped=FALSE } else { ywt = apply(y, 1, sum) y = y/ywt weights = weights * ywt N = nrow(y) - apply(is.na(predmat), 2, sum) cvraw = switch(type.measure, mse = (y[, 1] - (1 - predmat))^2 + (y[, 2] - predmat)^2, mae = abs(y[, 1] - (1 - predmat)) + abs(y[, 2] - predmat), deviance = { predmat = pmin(pmax(predmat, prob_min), prob_max) lp = y[, 1] * log(1 - predmat) + y[, 2] * log(predmat) ly = log(y) ly[y == 0] = 0 ly = drop((y * ly) %*% c(1, 1)) 2 * (ly - lp) }, class = y[, 1] * (predmat > 0.5) + y[, 2] * (predmat <= 0.5) ) } list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=grouped) } glmnet/R/coefnorm.R0000644000176200001440000000031514325602475013703 0ustar liggesuserscoefnorm=function(coeflist,q=1){ ###coeflist comes from mrelnet or multnet nmat=coeflist[[1]]*0 nclass=length(coeflist) for(i in seq(nclass)){ nmat=nmat+abs(coeflist[[i]])^q } nmat^(1/q) } glmnet/R/auc.mat.R0000644000176200001440000000026214325602475013424 0ustar liggesusersauc.mat=function(y,prob,weights=rep(1,nrow(y))){ Weights=as.vector(weights*y) ny=nrow(y) Y=rep(c(0,1),c(ny,ny)) Prob=c(prob,prob) auc(Y,Prob,Weights) } glmnet/R/zeromat.R0000644000176200001440000000040714325602475013556 0ustar liggesuserszeromat=function(nvars,lmu,vnames,stepnames){ ca=rep(0,lmu) ia=seq(lmu+1) ja=rep(1,lmu) dd=c(nvars,lmu) new("dgCMatrix", Dim = dd, Dimnames = list(vnames,stepnames), x = as.vector(ca), p = as.integer(ia - 1), i = as.integer(ja - 1)) } glmnet/R/getOptcv.glmnet.R0000644000176200001440000000105514325602475015155 0ustar liggesusersgetOptcv.glmnet <- function (lambda, cvm, cvsd,cvname) { if(match(cvname,c("AUC","C-index"),0))cvm=-cvm cvmin = min(cvm, na.rm = TRUE) idmin = cvm <= cvmin lambda.min = max(lambda[idmin], na.rm = TRUE) idmin = match(lambda.min, lambda) semin = (cvm + cvsd)[idmin] id1se = cvm <= semin lambda.1se = max(lambda[id1se], na.rm = TRUE) id1se = match(lambda.1se, lambda) index=matrix(c(idmin,id1se),2,1,dimnames=list(c("min","1se"),"Lambda")) list(lambda.min = lambda.min, lambda.1se = lambda.1se, index = index) } glmnet/R/cv.glmnetfit.R0000644000176200001440000000174114325602475014477 0ustar liggesuserscv.glmnetfit <-function(predmat,y,type.measure,weights,foldid,grouped){ family=attr(predmat,"family") mumat=family$linkinv(predmat) nobs=nrow(predmat)# was nrow(mumat), which failed for tweedie instance ## initialize from family function. Makes y a vector in case of binomial, and possibly changes weights ## Expects nobs to be defined, and creates n and mustart (neither used here) ## Some cases expect to see things, so we set it up just to make it work etastart=0;mustart=NULL;start=NULL eval(family$initialize) ## ## Just in case this was not done in initialize() y <- drop(y) # we don't like matrix responses N = nobs - apply(is.na(predmat), 2, sum) cvraw = switch(type.measure, mse = (y - mumat)^2, mae = abs(y - mumat), deviance = family$dev.resids(array(y,dim(mumat)), mumat,1) ) list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=grouped) } glmnet/R/cv.relaxed.raw.R0000644000176200001440000001052414325602475014721 0ustar liggesuserscv.relaxed.raw <- function (x, y, weights, offset, lambda, type.measure, nfolds, foldid, alignment,grouped, keep, parallel, trace.it, glmnet.call, cv.call, gamma, ...) { ###This next function may be redundant relaxglmnet=function(x,...){ fit=glmnet(x,...) relax.glmnet(fit,x,...,check.args=FALSE) } gamma=sort(checkgamma.relax(gamma)) ### The next bit is to make sure we always include lasso in CV, as well as the gamma series lengamma=length(gamma) if(max(gamma)<1.0){ gamma=c(gamma,1.0) } glmnet.call$relax=TRUE if (trace.it) cat("Training\n") glmnet.object = relaxglmnet(x=x, y=y, weights = weights, offset = offset, lambda = lambda, trace.it=trace.it,...) glmnet.object$call = glmnet.call subclass=class(glmnet.object)[[2]]# it is of class c("relaxed","subtype","glmnet") type.measure=cvtype(type.measure,subclass) is.offset = glmnet.object$offset ###Next line is commented out so each call generates its own lambda sequence # lambda=glmnet.object$lambda if (inherits(glmnet.object, "multnet") && !glmnet.object$grouped) { nz = predict(glmnet.object, type = "nonzero") nz = sapply(nz, function(x) sapply(x, length)) nz = ceiling(apply(nz, 1, median)) } else nz = sapply(predict(glmnet.object, type = "nonzero"), length) outlist = as.list(seq(nfolds)) N=nrow(x) if (parallel) { # if (parallel && require(foreach)) { outlist = foreach(i = seq(nfolds), .packages = c("glmnet")) %dopar% { which = foldid == i # if (is.matrix(y)) if (length(dim(y))>1) y_sub = y[!which, ] else y_sub = y[!which] if (is.offset) offset_sub = as.matrix(offset)[!which, ] else offset_sub = NULL relaxglmnet(x=x[!which, , drop = FALSE], y=y_sub, lambda = lambda, offset = offset_sub, weights = weights[!which], ...) } } else { for (i in seq(nfolds)) { if (trace.it) cat(sprintf("Fold: %d/%d\n", i, nfolds)) which = foldid == i if (is.matrix(y)) y_sub = y[!which, ] else y_sub = y[!which] if (is.offset) offset_sub = as.matrix(offset)[!which, ] else offset_sub = NULL outlist[[i]] = relaxglmnet(x=x[!which, , drop = FALSE], y=y_sub, lambda = lambda, offset = offset_sub, weights = weights[!which],trace.it=trace.it, ...) } } lambda = glmnet.object$lambda class(outlist)=paste0(subclass,"list") predmatlist=as.list(gamma) names(predmatlist)=paste("g",gamma,sep=":") outstuff=cvstufflist=predmatlist ### Even though the following is innefficient, It makes the code more modular ### fun = paste("cv", subclass, sep = ".") for(i in seq(along=gamma)){ predob=buildPredmat(outlist, lambda=lambda,x=x,offset=offset,foldid=foldid,alignment=alignment, y=y,weights=weights,grouped=grouped, gamma=gamma[i],family=family(glmnet.object) ) # if(subclass=="glmnetfit")attr{predob,"family")=glmnet.object$family #special case predmatlist[[i]]=predob fun = paste("cv", subclass, sep = ".") cvstufflist[[i]] = do.call(fun, list(predmatlist[[i]],y,type.measure,weights,foldid,grouped)) } grouped=all(sapply(cvstufflist,"[[","grouped")) if ((N/nfolds < 3) && grouped) { warning("Option grouped=FALSE enforced in cv.relaxed, since < 3 observations per fold", call. = FALSE) grouped = FALSE } for(i in seq(along=gamma)) outstuff[[i]]=cvstats(cvstufflist[[i]],foldid,nfolds,lambda,nz,grouped) cvn = cvstufflist[[1]]$type.measure cvname=names(cvn);names(cvname)=cvn# to be compatible with earlier version; silly, I know out=outstuff[[length(gamma)]] # lasso stats out = c(out,list(call=cv.call,name = cvname, glmnet.fit = glmnet.object)) if(lengamma= y[, 2])) stop("Some rows have start time >= stop time; not permitted") colnames(y) <- c("start","stop","status") return(y) } else { stop("cox.path() only supports 'Surv' objects of type 'right' or 'counting'") } } # if two-column matrix passed, make it into a Surv object if (!is.matrix(y) || !all(match(c("time","status"),dimnames(y)[[2]],0))) stop(paste0("Cox model requires a matrix with columns 'time' (>0) and ", "'status' (binary) as a response; a 'Surv' object suffices"), call. = FALSE) ty <- as.double(y[,"time"]) tevent <- as.double(y[,"status"]) if (any(ty <= 0)) stop("negative event times encountered; not permitted for Cox family") yob <- Surv(ty, tevent) colnames(yob) <- c("time","status") return(yob) } glmnet/R/glmnet.measures.R0000644000176200001440000000234014325602475015204 0ustar liggesusers#' Display the names of the measures used in CV for different "glmnet" families #' #' Produces a list of names of measures #' #' Try it and see. A very simple function to provide information #' #' @param family If a "glmnet" family is supplied, a list of the names of #' measures available for that family are produced. Default is "all", in which #' case the names of measures for all families are produced. #' @author Trevor Hastie\cr Maintainer: Trevor Hastie #' \email{hastie@@stanford.edu} #' @seealso \code{cv.glmnet} and \code{assess.glmnet}. #' @keywords models #' @export glmnet.measures glmnet.measures=function(family=c("all","gaussian", "binomial", "poisson", "multinomial", "cox", "mgaussian","GLM")){ family=match.arg(family) type.measures = c("mse", "deviance", "class", "auc", "mae", "C") family.ch = list( gaussian = c(1, 5), binomial = c(2, 3, 4, 1, 5), poisson = c(2, 1, 5), cox = c(2, 6), multinomial = c(2, 3, 1, 5), mgaussian = c(1, 5),GLM=c(2,1,5)) if(family=="all")lapply(family.ch,function(x)type.measures[x]) else type.measures[family.ch[[family]]] } glmnet/R/glmnetFlex.R0000644000176200001440000015703214341220705014177 0ustar liggesusers#' Fit a GLM with elastic net regularization for a path of lambda values #' #' Fit a generalized linear model via penalized maximum likelihood for a path of #' lambda values. Can deal with any GLM family. #' #' \code{glmnet.path} solves the elastic net problem for a path of lambda values. #' It generalizes \code{glmnet::glmnet} in that it works for any GLM family. #' #' Sometimes the sequence is truncated before \code{nlambda} values of lambda #' have been used. This happens when \code{glmnet.path} detects that the decrease #' in deviance is marginal (i.e. we are near a saturated fit). #' #' @param x Input matrix, of dimension \code{nobs x nvars}; each row is an #' observation vector. Can be a sparse matrix. #' @param y Quantitative response variable. #' @param weights Observation weights. Default is 1 for each observation. #' @param lambda A user supplied lambda sequence. Typical usage is to have the #' program compute its own lambda sequence based on \code{nlambda} and #' \code{lambda.min.ratio}. Supplying a value of lambda overrides this. #' @param nlambda The number of lambda values, default is 100. #' @param lambda.min.ratio Smallest value for lambda as a fraction of lambda.max, #' the (data derived) entry value (i.e. the smallest value for which all #' coefficients are zero). The default depends on the sample size \code{nobs} #' relative to the number of variables \code{nvars}. If \code{nobs >= nvars}, the #' default is 0.0001, close to zero. If \code{nobs < nvars}, the default is 0.01. #' A very small value of \code{lambda.min.ratio} will lead to a saturated fit #' in the \code{nobs < nvars} case. This is undefined for some families of #' models, and the function will exit gracefully when the percentage deviance #' explained is almost 1. #' @param alpha The elasticnet mixing parameter, with \eqn{0 \le \alpha \le 1}. #' The penalty is defined as \deqn{(1-\alpha)/2||\beta||_2^2+\alpha||\beta||_1.} #' \code{alpha=1} is the lasso penalty, and \code{alpha=0} the ridge penalty. #' @param offset A vector of length \code{nobs} that is included in the linear #' predictor. Useful for the "poisson" family (e.g. log of exposure time), or #' for refining a model by starting at a current fit. Default is NULL. If #' supplied, then values must also be supplied to the \code{predict} function. #' @param family A description of the error distribution and link function to be #' used in the model. This is the result of a call to a family function. Default #' is \code{gaussian()}. (See \code{\link[stats:family]{family}} for details on #' family functions.) #' @param standardize Logical flag for x variable standardization, prior to #' fitting the model sequence. The coefficients are always returned on the #' original scale. Default is \code{standardize=TRUE}. If variables are in the #' same units already, you might not wish to standardize. #' @param intercept Should intercept be fitted (default=TRUE) or set to zero (FALSE)? #' @param thresh Convergence threshold for coordinate descent. Each inner #' coordinate-descent loop continues until the maximum change in the objective #' after any coefficient update is less than thresh times the null deviance. #' Default value is \code{1e-10}. #' @param maxit Maximum number of passes over the data; default is \code{10^5}. #' @param penalty.factor Separate penalty factors can be applied to each #' coefficient. This is a number that multiplies \code{lambda} to allow differential #' shrinkage. Can be 0 for some variables, which implies no shrinkage, and that #' variable is always included in the model. Default is 1 for all variables (and #' implicitly infinity for variables listed in exclude). Note: the penalty #' factors are internally rescaled to sum to \code{nvars}. #' @param exclude Indices of variables to be excluded from the model. Default is #' none. Equivalent to an infinite penalty factor. #' @param lower.limits Vector of lower limits for each coefficient; default #' \code{-Inf}. Each of these must be non-positive. Can be presented as a single #' value (which will then be replicated), else a vector of length \code{nvars}. #' @param upper.limits Vector of upper limits for each coefficient; default #' \code{Inf}. See \code{lower.limits}. #' @param trace.it Controls how much information is printed to screen. Default is #' \code{trace.it=0} (no information printed). If \code{trace.it=1}, a progress #' bar is displayed. If \code{trace.it=2}, some information about the fitting #' procedure is printed to the console as the model is being fitted. #' #' @return An object with class "glmnetfit" and "glmnet". #' \item{a0}{Intercept sequence of length \code{length(lambda)}.} #' \item{beta}{A \code{nvars x length(lambda)} matrix of coefficients, stored in #' sparse matrix format.} #' \item{df}{The number of nonzero coefficients for each value of lambda.} #' \item{dim}{Dimension of coefficient matrix.} #' \item{lambda}{The actual sequence of lambda values used. When alpha=0, the #' largest lambda reported does not quite give the zero coefficients reported #' (lambda=inf would in principle). Instead, the largest lambda for alpha=0.001 #' is used, and the sequence of lambda values is derived from this.} #' \item{dev.ratio}{The fraction of (null) deviance explained. The deviance #' calculations incorporate weights if present in the model. The deviance is #' defined to be 2*(loglike_sat - loglike), where loglike_sat is the log-likelihood #' for the saturated model (a model with a free parameter per observation). #' Hence dev.ratio=1-dev/nulldev.} #' \item{nulldev}{Null deviance (per observation). This is defined to be #' 2*(loglike_sat -loglike(Null)). The null model refers to the intercept model.} #' \item{npasses}{Total passes over the data summed over all lambda values.} #' \item{jerr}{Error flag, for warnings and errors (largely for internal #' debugging).} #' \item{offset}{A logical variable indicating whether an offset was included #' in the model.} #' \item{call}{The call that produced this object.} #' \item{family}{Family used for the model.} #' \item{nobs}{Number of observations.} #' #' @examples #' set.seed(1) #' x <- matrix(rnorm(100 * 20), nrow = 100) #' y <- ifelse(rnorm(100) > 0, 1, 0) #' #' # binomial with probit link #' fit1 <- glmnet:::glmnet.path(x, y, family = binomial(link = "probit")) glmnet.path <- function(x, y, weights=NULL, lambda = NULL, nlambda = 100, lambda.min.ratio = ifelse(nobs 1) { warning("alpha > 1; set to 1") alpha = 1 } else if (alpha < 0) { warning("alpha < 0; set to 0") alpha = 0 } alpha = as.double(alpha) this.call <- match.call() np = dim(x) if(is.null(np) || (np[2] <= 1)) stop("x should be a matrix with 2 or more columns") nobs = as.integer(np[1]); nvars = as.integer(np[2]) # get feature variable names vnames=colnames(x) if(is.null(vnames))vnames=paste("V",seq(nvars),sep="") # check weights if(is.null(weights)) weights = rep(1,nobs) else if (length(weights) != nobs) stop(paste("Number of elements in weights (",length(weights), ") not equal to the number of rows of x (",nobs,")",sep="")) weights <- as.double(weights) ## initialize from family function. Makes y a vector in case of binomial, and possibly changes weights ## Expects nobs to be defined, and creates n and mustart (neither used here) ## Some cases expect to see things, so we set it up just to make it work etastart=0;mustart=NULL;start=NULL eval(family$initialize) ## ## Just in case this was not done in initialize() y <- drop(y) # we don't like matrix responses is.offset <- !(is.null(offset)) if (is.offset == FALSE) { offset <- as.double(y * 0) #keeps the shape of y } # infinite penalty factor vars are excluded if(any(penalty.factor == Inf)) { exclude = c(exclude, seq(nvars)[penalty.factor == Inf]) exclude = sort(unique(exclude)) } ## Compute weighted mean and variance of columns of x, sensitive to sparse matrix ## needed to detect constant columns below, and later if standarization meansd <- weighted_mean_sd(x, weights) ## look for constant variables, and if any, then add to exclude const_vars <- meansd$sd == 0 nzvar <- setdiff(which(!const_vars), exclude) # if all the non-excluded variables have zero variance, throw error if (length(nzvar) == 0) stop("All used predictors have zero variance") ## if any constant vars, add to exclude if(any(const_vars)) { exclude <- sort(unique(c(which(const_vars),exclude))) meansd$sd[const_vars] <- 1.0 ## we divide later, and do not want bad numbers } if(length(exclude) > 0) { jd = match(exclude, seq(nvars), 0) if(!all(jd > 0)) stop ("Some excluded variables out of range") penalty.factor[jd] = 1 # ow can change lambda sequence } # check and standardize penalty factors (to sum to nvars) vp = pmax(0, penalty.factor) if (max(vp) <= 0) stop("All penalty factors are <= 0") vp = as.double(vp * nvars / sum(vp)) ### check on limits control <- glmnet.control() if (thresh >= control$epsnr) warning("thresh should be smaller than glmnet.control()$epsnr", call. = FALSE) if(any(lower.limits > 0)){ stop("Lower limits should be non-positive") } if(any(upper.limits < 0)){ stop("Upper limits should be non-negative") } lower.limits[lower.limits == -Inf] = -control$big upper.limits[upper.limits == Inf] = control$big if (length(lower.limits) < nvars) { if(length(lower.limits) == 1) lower.limits = rep(lower.limits, nvars) else stop("Require length 1 or nvars lower.limits") } else lower.limits = lower.limits[seq(nvars)] if (length(upper.limits) < nvars) { if(length(upper.limits) == 1) upper.limits = rep(upper.limits, nvars) else stop("Require length 1 or nvars upper.limits") } else upper.limits = upper.limits[seq(nvars)] if (any(lower.limits == 0) || any(upper.limits == 0)) { ###Bounds of zero can mess with the lambda sequence and fdev; ###ie nothing happens and if fdev is not zero, the path can stop fdev <- glmnet.control()$fdev if(fdev!= 0) { glmnet.control(fdev = 0) on.exit(glmnet.control(fdev = fdev)) } } ### end check on limits ### end preparation of generic arguments # standardize x if necessary if (intercept) { xm <- meansd$mean } else { xm <- rep(0.0, times = nvars) } if (standardize) { xs <- meansd$sd } else { xs <- rep(1.0, times = nvars) } if (!inherits(x, "sparseMatrix")) { x <- scale(x, xm, xs) } else { attr(x, "xm") <- xm attr(x, "xs") <- xs } lower.limits <- lower.limits * xs upper.limits <- upper.limits * xs # get null deviance and lambda max start_val <- get_start(x, y, weights, family, intercept, is.offset, offset, exclude, vp, alpha) # work out lambda values nlam = as.integer(nlambda) user_lambda = FALSE # did user provide their own lambda values? if (is.null(lambda)) { if (lambda.min.ratio >= 1) stop("lambda.min.ratio should be less than 1") # compute lambda max: to add code here lambda_max <- start_val$lambda_max # compute lambda sequence ulam <- exp(seq(log(lambda_max), log(lambda_max * lambda.min.ratio), length.out = nlam)) } else { # user provided lambda values user_lambda = TRUE if (any(lambda < 0)) stop("lambdas should be non-negative") ulam = as.double(rev(sort(lambda))) nlam = as.integer(length(lambda)) } # start progress bar if (trace.it == 1) pb <- utils::txtProgressBar(min = 0, max = nlam, style = 3) a0 <- rep(NA, length = nlam) beta <- matrix(0, nrow = nvars, ncol = nlam) dev.ratio <- rep(NA, length = nlam) fit <- NULL mnl <- min(nlam, control$mnlam) for (k in 1:nlam) { # get the correct lambda value to fit if (k > 1) { cur_lambda <- ulam[k] } else { cur_lambda <- ifelse(user_lambda, ulam[k], control$big) } if (trace.it == 2) cat("Fitting lambda index", k, ":", ulam[k], fill = TRUE) fit <- glmnet.fit(x, y, weights / sum(weights), cur_lambda, alpha = alpha, offset = offset, family = family, intercept = intercept, thresh = thresh, maxit = maxit, penalty.factor = vp, exclude = exclude, lower.limits = lower.limits, upper.limits = upper.limits, warm = fit, from.glmnet.path = TRUE, save.fit = TRUE, trace.it = trace.it) if (trace.it == 1) utils::setTxtProgressBar(pb, k) # if error code non-zero, a non-fatal error must have occurred # print warning, ignore this lambda value and return result # for all previous lambda values if (fit$jerr != 0) { errmsg <- jerr.glmnetfit(fit$jerr, maxit, k) warning(errmsg$msg, call. = FALSE) k <- k - 1 break } a0[k] <- fit$a0 beta[, k] <- as.matrix(fit$beta) dev.ratio[k] <- fit$dev.ratio # early stopping if dev.ratio almost 1 or no improvement if (k >= mnl && user_lambda == FALSE) { if (dev.ratio[k] > control$devmax) break else if (k > 1) { if (family$family == "gaussian") { if (dev.ratio[k] - dev.ratio[k-1] < control$fdev * dev.ratio[k]) break } else if (family$family == "poisson") { if (dev.ratio[k] - dev.ratio[k - mnl + 1] < 10 * control$fdev * dev.ratio[k]) break } else if (dev.ratio[k] - dev.ratio[k-1] < control$fdev) break } } } if (trace.it == 1) { utils::setTxtProgressBar(pb, nlam) cat("", fill = TRUE) } # truncate a0, beta, dev.ratio, lambda if necessary if (k < nlam) { a0 <- a0[1:k] beta <- beta[, 1:k, drop = FALSE] dev.ratio <- dev.ratio[1:k] ulam <- ulam[1:k] } # return coefficients to original scale (because of x standardization) beta <- beta / xs a0 <- a0 - colSums(beta * xm) # output stepnames <- paste0("s", 0:(length(ulam) - 1)) out <- list() out$a0 <- a0 names(out$a0) <- stepnames out$beta <- Matrix::Matrix(beta, sparse = TRUE, dimnames = list(vnames, stepnames)) out$df <- colSums(abs(beta) > 0) out$dim <- dim(beta) out$lambda <- ulam out$dev.ratio <- dev.ratio out$nulldev <- start_val$nulldev out$npasses <- fit$npasses out$jerr <- fit$jerr out$offset <- is.offset out$call <- this.call out$family <- family out$nobs <- nobs class(out) <- c("glmnetfit", "glmnet") return(out) } #' Fit a GLM with elastic net regularization for a single value of lambda #' #' Fit a generalized linear model via penalized maximum likelihood for a single #' value of lambda. Can deal with any GLM family. #' #' WARNING: Users should not call \code{glmnet.fit} directly. Higher-level functions #' in this package call \code{glmnet.fit} as a subroutine. If a warm start object #' is provided, some of the other arguments in the function may be overriden. #' #' \code{glmnet.fit} solves the elastic net problem for a single, user-specified #' value of lambda. \code{glmnet.fit} works for any GLM family. It solves the #' problem using iteratively reweighted least squares (IRLS). For each IRLS #' iteration, \code{glmnet.fit} makes a quadratic (Newton) approximation of the #' log-likelihood, then calls \code{elnet.fit} to minimize the resulting #' approximation. #' #' In terms of standardization: \code{glmnet.fit} does not standardize \code{x} #' and \code{weights}. \code{penalty.factor} is standardized so that they sum up #' to \code{nvars}. #' #' @param x Input matrix, of dimension \code{nobs x nvars}; each row is an #' observation vector. If it is a sparse matrix, it is assumed to be unstandardized. #' It should have attributes \code{xm} and \code{xs}, where \code{xm(j)} and #' \code{xs(j)} are the centering and scaling factors for variable j respsectively. #' If it is not a sparse matrix, it is assumed that any standardization needed #' has already been done. #' @param y Quantitative response variable. #' @param weights Observation weights. \code{glmnet.fit} does NOT standardize #' these weights. #' @param lambda A single value for the \code{lambda} hyperparameter. #' @param alpha The elasticnet mixing parameter, with \eqn{0 \le \alpha \le 1}. #' The penalty is defined as \deqn{(1-\alpha)/2||\beta||_2^2+\alpha||\beta||_1.} #' \code{alpha=1} is the lasso penalty, and \code{alpha=0} the ridge penalty. #' @param offset A vector of length \code{nobs} that is included in the linear #' predictor. Useful for the "poisson" family (e.g. log of exposure time), or #' for refining a model by starting at a current fit. Default is NULL. If #' supplied, then values must also be supplied to the \code{predict} function. #' @param family A description of the error distribution and link function to be #' used in the model. This is the result of a call to a family function. Default #' is \code{gaussian()}. (See \code{\link[stats:family]{family}} for details on #' family functions.) #' @param intercept Should intercept be fitted (default=TRUE) or set to zero (FALSE)? #' @param thresh Convergence threshold for coordinate descent. Each inner #' coordinate-descent loop continues until the maximum change in the objective #' after any coefficient update is less than thresh times the null deviance. #' Default value is \code{1e-10}. #' @param maxit Maximum number of passes over the data; default is \code{10^5}. #' (If a warm start object is provided, the number of passes the warm start object #' performed is included.) #' @param penalty.factor Separate penalty factors can be applied to each #' coefficient. This is a number that multiplies \code{lambda} to allow differential #' shrinkage. Can be 0 for some variables, which implies no shrinkage, and that #' variable is always included in the model. Default is 1 for all variables (and #' implicitly infinity for variables listed in exclude). Note: the penalty #' factors are internally rescaled to sum to \code{nvars}. #' @param exclude Indices of variables to be excluded from the model. Default is #' none. Equivalent to an infinite penalty factor. #' @param lower.limits Vector of lower limits for each coefficient; default #' \code{-Inf}. Each of these must be non-positive. Can be presented as a single #' value (which will then be replicated), else a vector of length \code{nvars}. #' @param upper.limits Vector of upper limits for each coefficient; default #' \code{Inf}. See \code{lower.limits}. #' @param warm Either a \code{glmnetfit} object or a list (with names \code{beta} #' and \code{a0} containing coefficients and intercept respectively) which can #' be used as a warm start. Default is \code{NULL}, indicating no warm start. #' For internal use only. #' @param from.glmnet.path Was \code{glmnet.fit()} called from \code{glmnet.path()}? #' Default is FALSE.This has implications for computation of the penalty factors. #' @param save.fit Return the warm start object? Default is FALSE. #' @param trace.it Controls how much information is printed to screen. If #' \code{trace.it=2}, some information about the fitting procedure is printed to #' the console as the model is being fitted. Default is \code{trace.it=0} #' (no information printed). (\code{trace.it=1} not used for compatibility with #' \code{glmnet.path}.) #' #' @return An object with class "glmnetfit" and "glmnet". The list #' returned contains more keys than that of a "glmnet" object. #' \item{a0}{Intercept value.} #' \item{beta}{A \code{nvars x 1} matrix of coefficients, stored in sparse matrix #' format.} #' \item{df}{The number of nonzero coefficients.} #' \item{dim}{Dimension of coefficient matrix.} #' \item{lambda}{Lambda value used.} #' \item{dev.ratio}{The fraction of (null) deviance explained. The deviance #' calculations incorporate weights if present in the model. The deviance is #' defined to be 2*(loglike_sat - loglike), where loglike_sat is the log-likelihood #' for the saturated model (a model with a free parameter per observation). #' Hence dev.ratio=1-dev/nulldev.} #' \item{nulldev}{Null deviance (per observation). This is defined to be #' 2*(loglike_sat -loglike(Null)). The null model refers to the intercept model.} #' \item{npasses}{Total passes over the data.} #' \item{jerr}{Error flag, for warnings and errors (largely for internal #' debugging).} #' \item{offset}{A logical variable indicating whether an offset was included #' in the model.} #' \item{call}{The call that produced this object.} #' \item{nobs}{Number of observations.} #' \item{warm_fit}{If \code{save.fit=TRUE}, output of C++ routine, used for #' warm starts. For internal use only.} #' \item{family}{Family used for the model.} #' \item{converged}{A logical variable: was the algorithm judged to have #' converged?} #' \item{boundary}{A logical variable: is the fitted value on the boundary of #' the attainable values?} #' \item{obj_function}{Objective function value at the solution.} #' glmnet.fit <- function(x, y, weights, lambda, alpha = 1.0, offset = rep(0, nobs), family = gaussian(), intercept = TRUE, thresh = 1e-10, maxit = 100000, penalty.factor = rep(1.0, nvars), exclude = c(), lower.limits = -Inf, upper.limits = Inf, warm = NULL, from.glmnet.path = FALSE, save.fit = FALSE, trace.it = 0) { this.call <- match.call() control <- glmnet.control() ### Prepare all the generic arguments nobs <- nrow(x) nvars <- ncol(x) is.offset <- !(missing(offset)) if (is.offset == FALSE) { offset <- as.double(y * 0) #keeps the shape of y } else if (is.null(offset)) { offset <- rep(0, nobs) is.offset = FALSE } # add xm and xs attributes if they are missing for sparse x # glmnet.fit assumes that x is already standardized. Any standardization # the user wants should be done beforehand. if (inherits(x, "sparseMatrix")) { if ("xm" %in% names(attributes(x)) == FALSE) attr(x, "xm") <- rep(0.0, times = nvars) if ("xs" %in% names(attributes(x)) == FALSE) attr(x, "xs") <- rep(1.0, times = nvars) } # if calling from glmnet.path(), we do not need to check on exclude # and penalty.factor arguments as they have been prepared by glmnet.path() if (!from.glmnet.path) { # check and standardize penalty factors (to sum to nvars) if(any(penalty.factor == Inf)) { exclude = c(exclude, seq(nvars)[penalty.factor == Inf]) exclude = sort(unique(exclude)) } if(length(exclude) > 0) { jd = match(exclude, seq(nvars), 0) if(!all(jd > 0)) stop ("Some excluded variables out of range") penalty.factor[jd] = 1 # ow can change lambda sequence } vp = pmax(0, penalty.factor) vp = as.double(vp * nvars / sum(vp)) } else { vp <- as.double(penalty.factor) } ### check on limits lower.limits[lower.limits == -Inf] = -control$big upper.limits[upper.limits == Inf] = control$big if (length(lower.limits) < nvars) lower.limits = rep(lower.limits, nvars) else lower.limits = lower.limits[seq(nvars)] if (length(upper.limits) < nvars) upper.limits = rep(upper.limits, nvars) else upper.limits = upper.limits[seq(nvars)] ### end check on limits ### end preparation of generic arguments # get the relevant family functions variance <- family$variance linkinv <- family$linkinv if (!is.function(variance) || !is.function(linkinv)) stop("'family' argument seems not to be a valid family object", call. = FALSE) mu.eta <- family$mu.eta unless.null <- function(x, if.null) if (is.null(x)) if.null else x valideta <- unless.null(family$valideta, function(eta) TRUE) validmu <- unless.null(family$validmu, function(mu) TRUE) # computation of null deviance (get mu in the process) if (is.null(warm)) { start_val <- get_start(x, y, weights, family, intercept, is.offset, offset, exclude, vp, alpha) nulldev <- start_val$nulldev mu <- start_val$mu fit <- NULL coefold <- rep(0, nvars) # initial coefs = 0 eta <- family$linkfun(mu) intold <- (eta - offset)[1] } else { if (inherits(warm,"glmnetfit")) { if (!is(warm$warm_fit,"warmfit")) stop("Invalid warm start object") fit <- warm nulldev <- fit$nulldev coefold <- fit$warm_fit$a # prev value for coefficients intold <- fit$warm_fit$aint # prev value for intercept eta <- get_eta(x, coefold, intold) mu <- linkinv(eta <- eta + offset) } else if (inherits(warm,"list") && "a0" %in% names(warm) && "beta" %in% names(warm)) { nulldev <- get_start(x, y, weights, family, intercept, is.offset, offset, exclude, vp, alpha)$nulldev fit <- warm coefold <- fit$beta # prev value for coefficients intold <- fit$a0 # prev value for intercept eta <- get_eta(x, coefold, intold) mu <- linkinv(eta <- eta + offset) } else { stop("Invalid warm start object") } } if (!(validmu(mu) && valideta(eta))) stop("cannot find valid starting values: please specify some", call. = FALSE) start <- NULL # current value for coefficients start_int <- NULL # current value for intercept obj_val_old <- obj_function(y, mu, weights, family, lambda, alpha, coefold, vp) if (trace.it == 2) { cat("Warm Start Objective:", obj_val_old, fill = TRUE) } conv <- FALSE # converged? # IRLS loop for (iter in 1L:control$mxitnr) { # some checks for NAs/zeros varmu <- variance(mu) if (anyNA(varmu)) stop("NAs in V(mu)") if (any(varmu == 0)) stop("0s in V(mu)") mu.eta.val <- mu.eta(eta) if (any(is.na(mu.eta.val))) stop("NAs in d(mu)/d(eta)") # compute working response and weights z <- (eta - offset) + (y - mu)/mu.eta.val w <- (weights * mu.eta.val^2)/variance(mu) # have to update the weighted residual in our fit object # (in theory g and iy should be updated too, but we actually recompute g # and iy anyway in wls.f) if (!is.null(fit)) { fit$warm_fit$r <- w * (z - eta + offset) } # do WLS with warmstart from previous iteration fit <- elnet.fit(x, z, w, lambda, alpha, intercept, thresh = thresh, maxit = maxit, penalty.factor = vp, exclude = exclude, lower.limits = lower.limits, upper.limits = upper.limits, warm = fit, from.glmnet.fit = TRUE, save.fit = TRUE) if (fit$jerr != 0) return(list(jerr = fit$jerr)) # update coefficients, eta, mu and obj_val start <- fit$warm_fit$a start_int <- fit$warm_fit$aint eta <- get_eta(x, start, start_int) mu <- linkinv(eta <- eta + offset) obj_val <- obj_function(y, mu, weights, family, lambda, alpha, start, vp) if (trace.it == 2) cat("Iteration", iter, "Objective:", obj_val, fill = TRUE) boundary <- FALSE halved <- FALSE # did we have to halve the step size? # if objective function is not finite, keep halving the stepsize until it is finite # for the halving step, we probably have to adjust fit$g as well? if (!is.finite(obj_val) || obj_val > control$big) { warning("Infinite objective function!", call. = FALSE) if (is.null(coefold) || is.null(intold)) stop("no valid set of coefficients has been found: please supply starting values", call. = FALSE) warning("step size truncated due to divergence", call. = FALSE) ii <- 1 while (!is.finite(obj_val) || obj_val > control$big) { if (ii > control$mxitnr) stop("inner loop 1; cannot correct step size", call. = FALSE) ii <- ii + 1 start <- (start + coefold)/2 start_int <- (start_int + intold)/2 eta <- get_eta(x, start, start_int) mu <- linkinv(eta <- eta + offset) obj_val <- obj_function(y, mu, weights, family, lambda, alpha, start, vp) if (trace.it == 2) cat("Iteration", iter, " Halved step 1, Objective:", obj_val, fill = TRUE) } boundary <- TRUE halved <- TRUE } # if some of the new eta or mu are invalid, keep halving stepsize until valid if (!(valideta(eta) && validmu(mu))) { warning("Invalid eta/mu!", call. = FALSE) if (is.null(coefold) || is.null(intold)) stop("no valid set of coefficients has been found: please supply starting values", call. = FALSE) warning("step size truncated: out of bounds", call. = FALSE) ii <- 1 while (!(valideta(eta) && validmu(mu))) { if (ii > control$mxitnr) stop("inner loop 2; cannot correct step size", call. = FALSE) ii <- ii + 1 start <- (start + coefold)/2 start_int <- (start_int + intold)/2 eta <- get_eta(x, start, start_int) mu <- linkinv(eta <- eta + offset) } boundary <- TRUE halved <- TRUE obj_val <- obj_function(y, mu, weights, family, lambda, alpha, start, vp) if (trace.it == 2) cat("Iteration", iter, " Halved step 2, Objective:", obj_val, fill = TRUE) } # extra halving step if objective function value actually increased if (obj_val > obj_val_old + 1e-7) { ii <- 1 while (obj_val > obj_val_old + 1e-7) { if (ii > control$mxitnr) stop("inner loop 3; cannot correct step size", call. = FALSE) ii <- ii + 1 start <- (start + coefold)/2 start_int <- (start_int + intold)/2 eta <- get_eta(x, start, start_int) mu <- linkinv(eta <- eta + offset) obj_val <- obj_function(y, mu, weights, family, lambda, alpha, start, vp) if (trace.it == 2) cat("Iteration", iter, " Halved step 3, Objective:", obj_val, fill = TRUE) } halved <- TRUE } # if we did any halving, we have to update the coefficients, intercept # and weighted residual in the warm_fit object if (halved) { fit$warm_fit$a <- start fit$warm_fit$aint <- start_int fit$warm_fit$r <- w * (z - eta) } # test for convergence if (abs(obj_val - obj_val_old)/(0.1 + abs(obj_val)) < control$epsnr) { conv <- TRUE break } else { coefold <- start intold <- start_int obj_val_old <- obj_val } } # end of IRLS loop # checks on convergence and fitted values if (!conv) warning("glmnet.fit: algorithm did not converge", call. = FALSE) if (boundary) warning("glmnet.fit: algorithm stopped at boundary value", call. = FALSE) # some extra warnings, printed only if trace.it == 2 if (trace.it == 2) { eps <- 10 * .Machine$double.eps if ((family$family == "binomial") && (any(mu > 1 - eps) || any(mu < eps))) warning("glm.fit: fitted probabilities numerically 0 or 1 occurred", call. = FALSE) if ((family$family == "poisson") && (any(mu < eps))) warning("glm.fit: fitted rates numerically 0 occurred", call. = FALSE) } # prepare output object if (save.fit == FALSE) { fit$warm_fit <- NULL } # overwrite values from elnet.fit object fit$call <- this.call fit$offset <- is.offset fit$nulldev <- nulldev fit$dev.ratio <- 1 - dev_function(y, mu, weights, family) / nulldev # add new key-value pairs to list fit$family <- family fit$converged <- conv fit$boundary <- boundary fit$obj_function <- obj_val class(fit) <- c("glmnetfit", "glmnet") fit } #' Solve weighted least squares (WLS) problem for a single lambda value #' #' Solves the weighted least squares (WLS) problem for a single lambda value. Internal #' function that users should not call directly. #' #' WARNING: Users should not call \code{elnet.fit} directly. Higher-level functions #' in this package call \code{elnet.fit} as a subroutine. If a warm start object #' is provided, some of the other arguments in the function may be overriden. #' #' \code{elnet.fit} is essentially a wrapper around a C++ subroutine which #' minimizes #' #' \deqn{1/2 \sum w_i (y_i - X_i^T \beta)^2 + \sum \lambda \gamma_j #' [(1-\alpha)/2 \beta^2+\alpha|\beta|],} #' #' over \eqn{\beta}, where \eqn{\gamma_j} is the relative penalty factor on the #' jth variable. If \code{intercept = TRUE}, then the term in the first sum is #' \eqn{w_i (y_i - \beta_0 - X_i^T \beta)^2}, and we are minimizing over both #' \eqn{\beta_0} and \eqn{\beta}. #' #' None of the inputs are standardized except for \code{penalty.factor}, which #' is standardized so that they sum up to \code{nvars}. #' #' @param x Input matrix, of dimension \code{nobs x nvars}; each row is an #' observation vector. If it is a sparse matrix, it is assumed to be unstandardized. #' It should have attributes \code{xm} and \code{xs}, where \code{xm(j)} and #' \code{xs(j)} are the centering and scaling factors for variable j respsectively. #' If it is not a sparse matrix, it is assumed that any standardization needed #' has already been done. #' @param y Quantitative response variable. #' @param weights Observation weights. \code{elnet.fit} does NOT standardize #' these weights. #' @param lambda A single value for the \code{lambda} hyperparameter. #' @param alpha The elasticnet mixing parameter, with \eqn{0 \le \alpha \le 1}. #' The penalty is defined as \deqn{(1-\alpha)/2||\beta||_2^2+\alpha||\beta||_1.} #' \code{alpha=1} is the lasso penalty, and \code{alpha=0} the ridge penalty. #' @param intercept Should intercept be fitted (default=TRUE) or set to zero (FALSE)? #' @param thresh Convergence threshold for coordinate descent. Each inner #' coordinate-descent loop continues until the maximum change in the objective #' after any coefficient update is less than thresh times the null deviance. #' Default value is \code{1e-7}. #' @param maxit Maximum number of passes over the data; default is \code{10^5}. #' (If a warm start object is provided, the number of passes the warm start object #' performed is included.) #' @param penalty.factor Separate penalty factors can be applied to each #' coefficient. This is a number that multiplies \code{lambda} to allow differential #' shrinkage. Can be 0 for some variables, which implies no shrinkage, and that #' variable is always included in the model. Default is 1 for all variables (and #' implicitly infinity for variables listed in exclude). Note: the penalty #' factors are internally rescaled to sum to \code{nvars}. #' @param exclude Indices of variables to be excluded from the model. Default is #' none. Equivalent to an infinite penalty factor. #' @param lower.limits Vector of lower limits for each coefficient; default #' \code{-Inf}. Each of these must be non-positive. Can be presented as a single #' value (which will then be replicated), else a vector of length \code{nvars}. #' @param upper.limits Vector of upper limits for each coefficient; default #' \code{Inf}. See \code{lower.limits}. #' @param warm Either a \code{glmnetfit} object or a list (with names \code{beta} #' and \code{a0} containing coefficients and intercept respectively) which can #' be used as a warm start. Default is \code{NULL}, indicating no warm start. #' For internal use only. #' @param from.glmnet.fit Was \code{elnet.fit()} called from \code{glmnet.fit()}? #' Default is FALSE.This has implications for computation of the penalty factors. #' @param save.fit Return the warm start object? Default is FALSE. #' #' @return An object with class "glmnetfit" and "glmnet". The list returned has #' the same keys as that of a \code{glmnet} object, except that it might have an #' additional \code{warm_fit} key. #' \item{a0}{Intercept value.} #' \item{beta}{A \code{nvars x 1} matrix of coefficients, stored in sparse matrix #' format.} #' \item{df}{The number of nonzero coefficients.} #' \item{dim}{Dimension of coefficient matrix.} #' \item{lambda}{Lambda value used.} #' \item{dev.ratio}{The fraction of (null) deviance explained. The deviance #' calculations incorporate weights if present in the model. The deviance is #' defined to be 2*(loglike_sat - loglike), where loglike_sat is the log-likelihood #' for the saturated model (a model with a free parameter per observation). #' Hence dev.ratio=1-dev/nulldev.} #' \item{nulldev}{Null deviance (per observation). This is defined to be #' 2*(loglike_sat -loglike(Null)). The null model refers to the intercept model.} #' \item{npasses}{Total passes over the data.} #' \item{jerr}{Error flag, for warnings and errors (largely for internal #' debugging).} #' \item{offset}{Always FALSE, since offsets do not appear in the WLS problem. #' Included for compability with glmnet output.} #' \item{call}{The call that produced this object.} #' \item{nobs}{Number of observations.} #' \item{warm_fit}{If \code{save.fit=TRUE}, output of C++ routine, used for #' warm starts. For internal use only.} #' elnet.fit <- function(x, y, weights, lambda, alpha = 1.0, intercept = TRUE, thresh = 1e-7, maxit = 100000, penalty.factor = rep(1.0, nvars), exclude = c(), lower.limits = -Inf, upper.limits = Inf, warm = NULL, from.glmnet.fit = FALSE, save.fit = FALSE) { this.call <- match.call() internal.parms <- glmnet.control() # compute null deviance ybar <- weighted.mean(y, weights) nulldev <- sum(weights * (y - ybar)^2) # if class "glmnetfit" warmstart object provided, pull whatever we want out of it # else, prepare arguments, then check if coefs provided as warmstart # (if only coefs are given as warmstart, we prepare the other arguments # as if no warmstart was provided) if (!is.null(warm) && "glmnetfit" %in% class(warm)) { warm <- warm$warm_fit if (!is(warm,"warmfit")) stop("Invalid warm start object") a <- warm$a aint <- warm$aint alm0 <- warm$almc cl <- warm$cl g <- warm$g ia <- warm$ia iy <- warm$iy iz <- warm$iz ju <- warm$ju m <- warm$m mm <- warm$mm nino <- warm$nino nobs <- warm$no nvars <- warm$ni nlp <- warm$nlp nx <- warm$nx r <- warm$r rsqc <- warm$rsqc xv <- warm$xv vp <- warm$vp } else { nobs <- as.integer(nrow(x)) nvars <- as.integer(ncol(x)) # if calling from glmnet.fit(), we do not need to check on exclude # and penalty.factor arguments as they have been prepared by glmnet.fit() # Also exclude will include variance 0 columns if (!from.glmnet.fit) { # check and standardize penalty factors (to sum to nvars) if(any(penalty.factor == Inf)) { exclude = c(exclude, seq(nvars)[penalty.factor == Inf]) exclude = sort(unique(exclude)) } if(length(exclude) > 0) { jd = match(exclude, seq(nvars), 0) if(!all(jd > 0)) stop ("Some excluded variables out of range") penalty.factor[jd] = 1 # ow can change lambda sequence } vp = pmax(0, penalty.factor) vp = as.double(vp * nvars / sum(vp)) } else { vp <- as.double(penalty.factor) } # compute ju # assume that there are no constant variables ju <- rep(1, nvars) ju[exclude] <- 0 ju <- as.integer(ju) # compute cl from lower.limits and upper.limits lower.limits[lower.limits == -Inf] <- -internal.parms$big upper.limits[upper.limits == Inf] <- internal.parms$big if (length(lower.limits) < nvars) lower.limits = rep(lower.limits, nvars) else lower.limits = lower.limits[seq(nvars)] if (length(upper.limits) < nvars) upper.limits = rep(upper.limits, nvars) else upper.limits = upper.limits[seq(nvars)] cl <- rbind(lower.limits, upper.limits) storage.mode(cl) = "double" nx <- as.integer(nvars) a <- double(nvars) aint <- double(1) alm0 <- double(1) g <- double(nvars) ia <- integer(nx) iy <- integer(nvars) iz <- integer(1) m <- as.integer(1) mm <- integer(nvars) nino <- integer(1) nlp <- integer(1) r <- weights * y rsqc <- double(1) xv <- double(nvars) # check if coefs were provided as warmstart: if so, use them if (!is.null(warm)) { if (inherits(warm,"list") && "a0" %in% names(warm) && "beta" %in% names(warm)) { a <- as.double(warm$beta) aint <- as.double(warm$a0) mu <- drop(x %*% a + aint) r <- weights * (y - mu) rsqc <- 1 - sum(weights * (y - mu)^2) / nulldev } else { stop("Invalid warm start object") } } } # for the parameters here, we are overriding the values provided by the # warmstart object alpha <- as.double(alpha) almc <- as.double(lambda) intr <- as.integer(intercept) jerr <- integer(1) maxit <- as.integer(maxit) thr <- as.double(thresh) v <- as.double(weights) a.new <- a a.new[0] <- a.new[0] # induce a copy # take out components of x and run C++ subroutine if (inherits(x, "sparseMatrix")) { xm <- as.double(attr(x, "xm")) xs <- as.double(attr(x, "xs")) wls_fit <- spwls_exp(alm0=alm0,almc=almc,alpha=alpha,m=m,no=nobs,ni=nvars, x=x,xm=xm,xs=xs,r=r,xv=xv,v=v,intr=intr,ju=ju,vp=vp,cl=cl,nx=nx,thr=thr, maxit=maxit,a=a.new,aint=aint,g=g,ia=ia,iy=iy,iz=iz,mm=mm, nino=nino,rsqc=rsqc,nlp=nlp,jerr=jerr) } else { wls_fit <- wls_exp(alm0=alm0,almc=almc,alpha=alpha,m=m,no=nobs,ni=nvars, x=x,r=r,xv=xv,v=v,intr=intr,ju=ju,vp=vp,cl=cl,nx=nx,thr=thr, maxit=maxit,a=a.new,aint=aint,g=g,ia=ia,iy=iy,iz=iz,mm=mm, nino=nino,rsqc=rsqc,nlp=nlp,jerr=jerr) } # if error code > 0, fatal error occurred: stop immediately # if error code < 0, non-fatal error occurred: return error code if (wls_fit$jerr > 0) { errmsg <- jerr.glmnetfit(wls_fit$jerr, maxit) stop(errmsg$msg, call. = FALSE) } else if (wls_fit$jerr < 0) return(list(jerr = wls_fit$jerr)) warm_fit <- wls_fit[c("almc", "r", "xv", "ju", "vp", "cl", "nx", "a", "aint", "g", "ia", "iy", "iz", "mm", "nino", "rsqc", "nlp")] warm_fit[['m']] <- m warm_fit[['no']] <- nobs warm_fit[['ni']] <- nvars class(warm_fit) <- "warmfit" beta <- Matrix::Matrix(wls_fit$a, sparse = TRUE) out <- list(a0 = wls_fit$aint, beta = beta, df = sum(abs(beta) > 0), dim = dim(beta), lambda = lambda, dev.ratio = wls_fit$rsqc, nulldev = nulldev, npasses = wls_fit$nlp, jerr = wls_fit$jerr, offset = FALSE, call = this.call, nobs = nobs, warm_fit = warm_fit) if (save.fit == FALSE) { out$warm_fit <- NULL } class(out) <- c("glmnetfit", "glmnet") out } #' Get null deviance, starting mu and lambda max #' #' Return the null deviance, starting mu and lambda max values for #' initialization. For internal use only. #' #' This function is called by \code{glmnet.path} for null deviance, starting mu #' and lambda max values. It is also called by \code{glmnet.fit} when used #' without warmstart, but they only use the null deviance and starting mu values. #' #' When \code{x} is not sparse, it is expected to already by centered and scaled. #' When \code{x} is sparse, the function will get its attributes \code{xm} and #' \code{xs} for its centering and scaling factors. #' #' Note that whether \code{x} is centered & scaled or not, the values of \code{mu} #' and \code{nulldev} don't change. However, the value of \code{lambda_max} does #' change, and we need \code{xm} and \code{xs} to get the correct value. #' #' @param x Input matrix, of dimension \code{nobs x nvars}; each row is an #' observation vector. If it is a sparse matrix, it is assumed to be unstandardized. #' It should have attributes \code{xm} and \code{xs}, where \code{xm(j)} and #' \code{xs(j)} are the centering and scaling factors for variable j respsectively. #' If it is not a sparse matrix, it is assumed to be standardized. #' @param y Quantitative response variable. #' @param weights Observation weights. #' @param family A description of the error distribution and link function to be #' used in the model. This is the result of a call to a family function. #' (See \code{\link[stats:family]{family}} for details on family functions.) #' @param intercept Does the model we are fitting have an intercept term or not? #' @param is.offset Is the model being fit with an offset or not? #' @param offset Offset for the model. If \code{is.offset=FALSE}, this should be #' a zero vector of the same length as \code{y}. #' @param exclude Indices of variables to be excluded from the model. #' @param vp Separate penalty factors can be applied to each coefficient. #' @param alpha The elasticnet mixing parameter, with \eqn{0 \le \alpha \le 1}. get_start <- function(x, y, weights, family, intercept, is.offset, offset, exclude, vp, alpha) { nobs <- nrow(x); nvars <- ncol(x) # compute mu and null deviance # family = binomial() gives us warnings due to non-integer weights # to avoid, suppress warnings if (intercept) { if (is.offset) { suppressWarnings(tempfit <- glm(y ~ 1, family = family, weights = weights, offset = offset)) mu <- tempfit$fitted.values } else { mu <- rep(weighted.mean(y,weights), times = nobs) } } else { mu <- family$linkinv(offset) } nulldev <- dev_function(y, mu, weights, family) # if some penalty factors are zero, we have to recompute mu vp_zero <- setdiff(which(vp == 0), exclude) if (length(vp_zero) > 0) { tempx <- x[, vp_zero, drop = FALSE] if (inherits(tempx, "sparseMatrix")) { tempfit <- glmnet.fit(tempx, y, intercept = intercept, family = family, weights = weights/sum(weights), offset = offset, lambda = 0) mu <- predict(tempfit, newx=tempx, newoffset=offset, type = "response") } else { if (intercept) { tempx <- cbind(1,tempx) } tempfit <- glm.fit(tempx, y, family = family, weights = weights, offset = offset) mu <- tempfit$fitted.values } } # compute lambda max ju <- rep(1, nvars) ju[exclude] <- 0 # we have already included constant variables in exclude r <- y - mu eta <- family$linkfun(mu) v <- family$variance(mu) m.e <- family$mu.eta(eta) weights <- weights / sum(weights) rv <- r / v * m.e * weights if (inherits(x, "sparseMatrix")) { xm <- attr(x, "xm") xs <- attr(x, "xs") g <- abs((drop(t(rv) %*% x) - sum(rv) * xm) / xs) } else { g <- abs(drop(t(rv) %*% x)) } g <- g * ju / ifelse(vp > 0, vp, 1) lambda_max <- max(g) / max(alpha, 1e-3) list(nulldev = nulldev, mu = mu, lambda_max = lambda_max) } #' Elastic net objective function value #' #' Returns the elastic net objective function value. #' #' @param y Quantitative response variable. #' @param mu Model's predictions for \code{y}. #' @param weights Observation weights. #' @param family A description of the error distribution and link function to be #' used in the model. This is the result of a call to a family function. #' @param lambda A single value for the \code{lambda} hyperparameter. #' @param alpha The elasticnet mixing parameter, with \eqn{0 \le \alpha \le 1}. #' @param coefficients The model's coefficients (excluding intercept). #' @param vp Penalty factors for each of the coefficients. obj_function <- function(y, mu, weights, family, lambda, alpha, coefficients, vp) { dev_function(y, mu, weights, family) / 2 + lambda * pen_function(coefficients, alpha, vp) } #' Elastic net penalty value #' #' Returns the elastic net penalty value without the \code{lambda} factor. #' #' The penalty is defined as #' \deqn{(1-\alpha)/2 \sum vp_j \beta_j^2 + \alpha \sum vp_j |\beta|.} #' Note the omission of the multiplicative \code{lambda} factor. #' #' @param alpha The elasticnet mixing parameter, with \eqn{0 \le \alpha \le 1}. #' @param coefficients The model's coefficients (excluding intercept). #' @param vp Penalty factors for each of the coefficients. pen_function <- function(coefficients, alpha = 1.0, vp = 1.0) { sum(vp * (alpha * abs(coefficients) + (1-alpha)/2 * coefficients^2)) } #' Elastic net deviance value #' #' Returns the elastic net deviance value. #' #' @param y Quantitative response variable. #' @param mu Model's predictions for \code{y}. #' @param weights Observation weights. #' @param family A description of the error distribution and link function to be #' used in the model. This is the result of a call to a family function. dev_function <- function(y, mu, weights, family) { sum(family$dev.resids(y, mu, weights)) } jerr.glmnetfit <- function (n, maxit, k = NULL) { if (n == 0) { list(n = 0, fatal = FALSE, msg = "") } else if (n > 0) { # fatal error fatal <- TRUE msg <- ifelse(n < 7777, "Memory allocation error; contact package maintainer", "Unknown error") } else { # non-fatal error fatal <- FALSE msg <- paste("Convergence for ", k, "th lambda value not reached after maxit=", maxit, " iterations; solutions for larger lambdas returned", sep = "") } list(n = n, fatal = fatal, msg = msg) } #' Get predictions from a \code{glmnetfit} fit object #' #' Gives fitted values, linear predictors, coefficients and number of non-zero #' coefficients from a fitted \code{glmnetfit} object. #' #' @param object Fitted "glmnetfit" object. #' @param newx Matrix of new values for \code{x} at which predictions are to be #' made. Must be a matrix. This argument is not used for \code{type = #' c("coefficients","nonzero")}. #' @param s Value(s) of the penalty parameter lambda at which predictions are #' required. Default is the entire sequence used to create the model. #' @param type Type of prediction required. Type "link" gives the linear #' predictors (eta scale); Type "response" gives the fitted values (mu scale). #' Type "coefficients" computes the coefficients at the requested values for s. #' Type "nonzero" returns a list of the indices of the nonzero coefficients for #' each value of s. #' @param exact This argument is relevant only when predictions are made at values #' of \code{s} (lambda) \emph{different} from those used in the fitting of the #' original model. If \code{exact=FALSE} (default), then the predict function #' uses linear interpolation to make predictions for values of \code{s} (lambda) #' that do not coincide with those used in the fitting algorithm. While this is #' often a good approximation, it can sometimes be a bit coarse. With #' \code{exact=TRUE}, these different values of \code{s} are merged (and sorted) #' with \code{object$lambda}, and the model is refit before predictions are made. #' In this case, it is required to supply the original data x= and y= as additional #' named arguments to predict() or coef(). The workhorse \code{predict.glmnet()} #' needs to update the model, and so needs the data used to create it. The same #' is true of weights, offset, penalty.factor, lower.limits, upper.limits if #' these were used in the original call. Failure to do so will result in an error. #' @param newoffset If an offset is used in the fit, then one must be supplied for #' making predictions (except for type="coefficients" or type="nonzero"). #' @param ... This is the mechanism for passing arguments like \code{x=} when #' \code{exact=TRUE}; see \code{exact} argument. #' #' @return The object returned depends on type. #' #' @method predict glmnetfit #' @export predict.glmnetfit <- function(object, newx, s = NULL, type = c("link", "response", "coefficients", "nonzero"), exact = FALSE, newoffset, ...) { type = match.arg(type) nfit <- NextMethod("predict") if (type == "response") { object$family$linkinv(nfit) } else { nfit } } #' Helper function to get etas (linear predictions) #' #' Given x, coefficients and intercept, return linear predictions. Wrapper that #' works with both regular and sparse x. Only works for single set of coefficients #' and intercept. #' #' @param x Input matrix, of dimension \code{nobs x nvars}; each row is an #' observation vector. If it is a sparse matrix, it is assumed to be unstandardized. #' It should have attributes \code{xm} and \code{xs}, where \code{xm(j)} and #' \code{xs(j)} are the centering and scaling factors for variable j respsectively. #' If it is not a sparse matrix, it is assumed to be standardized. #' @param beta Feature coefficients. #' @param a0 Intercept. get_eta <- function(x, beta, a0) { if (inherits(x, "sparseMatrix")) { beta <- drop(beta)/attr(x, "xs") drop(x %*% beta - sum(beta * attr(x, "xm") ) + a0) } else { drop(x %*% beta + a0) } } #' Helper function to compute weighted mean and standard deviation #' #' Helper function to compute weighted mean and standard deviation. #' Deals gracefully whether x is sparse matrix or not. #' #' @param x Observation matrix. #' @param weights Optional weight vector. #' #' @return A list with components. #' \item{mean}{vector of weighted means of columns of x} #' \item{sd}{vector of weighted standard deviations of columns of x} weighted_mean_sd <- function(x, weights=rep(1,nrow(x))){ weights <- weights/sum(weights) xm <- drop(t(weights)%*%x) xv <- drop(t(weights)%*%scale(x,xm,FALSE)^2) xv[xv < 10*.Machine$double.eps] <- 0 list(mean = xm, sd = sqrt(xv)) } glmnet/R/cvstats.R0000644000176200001440000000127414325602475013567 0ustar liggesuserscvstats=function(cvstuff,foldid,nfolds,lambda,nz,grouped,...){ if (grouped){ nlams=rep(dim(cvstuff$cvraw)[2],nfolds) ## All the same - this should go cvstuff= cvcompute(cvstuff, foldid, nlams) } cvm=with(cvstuff,apply(cvraw, 2, weighted.mean, w = weights, na.rm = TRUE)) cvsd=with(cvstuff, sqrt(apply(scale(cvraw, cvm, FALSE)^2, 2, weighted.mean, w = weights, na.rm = TRUE)/(N - 1))) nas=is.na(cvsd) if(any(nas)){ lambda=lambda[!nas] cvm=cvm[!nas] cvsd=cvsd[!nas] nz=nz[!nas] } list(lambda = lambda, cvm = cvm, cvsd = cvsd, cvup = cvm + cvsd, cvlo = cvm - cvsd, nzero = nz) } glmnet/R/coef.relaxed.R0000644000176200001440000000025514325602475014435 0ustar liggesusers#' @method coef relaxed #' @export #' @export coef.relaxed coef.relaxed=function(object,s=NULL, gamma=1,...) predict(object, s=s, gamma= gamma, type="coefficients",...) glmnet/R/print.confusion.table.R0000644000176200001440000000077214325602475016326 0ustar liggesusers#' @method print confusion.table #' @export print.confusion.table=function(x,digits = max(3, getOption("digits") - 3), ...){ ndn=names(dimnames(x)) rowtot=rowSums(x) coltot=colSums(x) tot=sum(coltot) ncorrect=sum(diag(x)) correct=(ncorrect)/tot x=cbind(x,Total=rowtot) x=rbind(x,Total=c(coltot,tot)) dn=dimnames(x) names(dn)=ndn dimnames(x)=dn print(x,digits=digits,...) cat("\n Percent Correct: ",format(round(correct,digits)),"\n") invisible() } glmnet/R/onAttach.R0000644000176200001440000000021314325602475013631 0ustar liggesusers.onAttach=function(libname,pkgname){ packageStartupMessage("Loaded glmnet ", as.character(packageDescription("glmnet")[["Version"]])) } glmnet/R/jerr.coxnet.R0000644000176200001440000000131214325602475014332 0ustar liggesusersjerr.coxnet=function(n,maxit,pmax){ if(n>0){#fatal error outlist=jerr.elnet(n) if(outlist$msg!="Unknown error")return(outlist) if(n==8888)msg="All observations censored - cannot proceed" else if(n==9999)msg="No positive observation weights" else if(match(n,c(20000,30000),FALSE)) msg="Inititialization numerical error; probably too many censored observations" else msg="Unknown error" list(n=n,fatal=TRUE,msg=msg) } else if(n<0){ # non-fatal error if(n<= -30000){ msg=paste("Numerical error at ",-n-30000,"th lambda value; solutions for larger values of lambda returned",sep="") list(n=n,fatal=FALSE,msg=msg) } else jerr.elnet(n,maxit,pmax) } } glmnet/R/cv.multnet.R0000644000176200001440000000316014325602475014173 0ustar liggesuserscv.multnet <-function(predmat,y,type.measure,weights,foldid,grouped){ prob_min = 1e-05 prob_max = 1 - prob_min nc = dim(y) if (is.null(nc)) { y = as.factor(y) ntab = table(y) nc = as.integer(length(ntab)) y = diag(nc)[as.numeric(y), ,drop=FALSE] } else nc = nc[2] ywt = apply(y, 1, sum) y = y/ywt weights = weights * ywt N = nrow(y) - apply(is.na(predmat[, 1, ,drop=FALSE]), 2, sum)## dimensions could be lost if third dim=1 bigY = array(y, dim(predmat)) predmat=exp(predmat) predtot=apply(predmat,c(1,3),sum) for(i in 1:nc)predmat[,i,]=predmat[,i,]/predtot cvraw = switch(type.measure, mse = apply((bigY - predmat)^2,c(1, 3), sum), mae = apply(abs(bigY - predmat), c(1,3), sum), deviance = { predmat = pmin(pmax(predmat, prob_min), prob_max) lp = bigY * log(predmat) ly = bigY * log(bigY) ly[bigY == 0] = 0 apply(2 * (ly - lp), c(1, 3), sum) }, class = { classid = as.numeric(apply(predmat, 3, glmnet_softmax,ignore_labels=TRUE)) yperm = matrix(aperm(bigY, c(1, 3, 2)), ncol = nc) matrix(1 - yperm[cbind(seq(classid), classid)], ncol = ncol(predtot)) } ) list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=grouped) } glmnet/R/print.cv.glmnet.R0000644000176200001440000000377714325602475015142 0ustar liggesusers#' print a cross-validated glmnet object #' #' Print a summary of the results of cross-validation for a glmnet model. #' #' A summary of the cross-validated fit is produced, slightly different for a #' 'cv.relaxed' object than for a 'cv.glmnet' object. Note that a 'cv.relaxed' #' object inherits from class 'cv.glmnet', so by directly invoking #' \code{print.cv.glmnet(object)} will print the summary as if #' \code{relax=TRUE} had not been used. #' #' @aliases print.cv.glmnet print.cv.relaxed #' @param x fitted 'cv.glmnet' object #' @param digits significant digits in printout #' @param \dots additional print arguments #' @author Jerome Friedman, Trevor Hastie and Rob Tibshirani\cr Maintainer: #' Trevor Hastie #' @seealso \code{glmnet}, \code{predict} and \code{coef} methods. #' @references Friedman, J., Hastie, T. and Tibshirani, R. (2008) #' \emph{Regularization Paths for Generalized Linear Models via Coordinate #' Descent}\cr \url{https://arxiv.org/abs/1707.08692}\cr Hastie, T., #' Tibshirani, Robert, Tibshirani, Ryan (2019) \emph{Extended Comparisons of #' Best Subset Selection, Forward Stepwise Selection, and the Lasso} #' @keywords models regression #' @examples #' #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' fit1 = cv.glmnet(x, y) #' print(fit1) #' fit1r = cv.glmnet(x, y, relax = TRUE) #' print(fit1r) #' ## print.cv.glmnet(fit1r) ## CHECK WITH TREVOR #' @method print cv.glmnet #' @export #' @export print.cv.glmnet print.cv.glmnet <- function(x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall: ", deparse(x$call), "\n\n") optlams=c(x$lambda.min,x$lambda.1se) which=match(optlams,x$lambda) mat = with(x, cbind(optlams, which, cvm[which], cvsd[which], nzero[which])) dimnames(mat) = list(c("min", "1se"), c("Lambda", "Index","Measure", "SE", "Nonzero")) cat("Measure:", x$name,"\n\n") mat=data.frame(mat,check.names=FALSE) class(mat)=c("anova",class(mat)) print(mat,digits=digits) } glmnet/R/cv.coxnet.R0000644000176200001440000000231014656736715014013 0ustar liggesuserscv.coxnet <- function(predmat,y,type.measure,weights,foldid,grouped){ ## Note, all the work got done in buildPredmat.coxnetlist for deviance; a special case devtrue=type.measure=="deviance" nfolds = max(foldid) if ((length(weights)/nfolds < 10) && !grouped) { warning("Option grouped=TRUE enforced for cv.coxnet, since < 10 observations per fold", call. = FALSE) } if(devtrue){ cvraw=attr(predmat,"cvraw") status = y[, "status"] N = nfolds - apply(is.na(cvraw), 2, sum) weights = as.vector(tapply(weights, foldid, sum)) cvraw = cvraw / weights } else { nlambda=ncol(predmat) nlams=rep(nlambda,nfolds) cvraw = matrix(NA, nfolds, nlambda) good = matrix(0, nfolds, nlambda) for (i in seq(nfolds)) { good[i, seq(nlams[i])] = 1 which = foldid == i for (j in seq(nlams[i])) { cvraw[i, j] = Cindex(predmat[which,j],y[which, ], weights[which]) } } N = apply(good, 2, sum) weights = tapply(weights, foldid, sum) } list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=FALSE) } glmnet/R/print.cv.relaxed.R0000644000176200001440000000165214325602475015266 0ustar liggesusers#' @method print cv.relaxed #' @export print.cv.relaxed <- function(x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall: ", deparse(x$call), "\n\n") cat("Measure:", x$name, "\n\n") x = x$relaxed optlams = c(x$lambda.min, x$lambda.1se) wg1 = match(x$gamma.min, x$gamma) wl1 = match(x$lambda.min, x$statlist[[wg1]]$lambda) s1 = with(x$statlist[[wg1]], c(x$gamma.min,wg1, x$lambda.min,wl1, cvm[wl1], cvsd[wl1], x$nzero.min)) wg2 = match(x$gamma.1se, x$gamma) wl2 = match(x$lambda.1se, x$statlist[[wg2]]$lambda) s2 = with(x$statlist[[wg2]], c(x$gamma.1se,wg2, x$lambda.1se,wl2, cvm[wl2], cvsd[wl2], x$nzero.1se)) mat = rbind(s1, s2) dimnames(mat) = list(c("min", "1se"), c("Gamma","Index", "Lambda","Index", "Measure", "SE", "Nonzero")) mat = data.frame(mat, check.names = FALSE) class(mat) = c("anova", class(mat)) print(mat, digits = digits) } glmnet/R/survfit.cv.glmnet.R0000644000176200001440000000424614325602475015500 0ustar liggesusers#' Compute a survival curve from a cv.glmnet object #' #' Computes the predicted survivor function for a Cox proportional hazards #' model with elastic net penalty from a cross-validated glmnet model. #' #' This function makes it easier to use the results of cross-validation #' to compute a survival curve. #' #' @param formula A class \code{cv.glmnet} object. The object should have #' been fit with \code{family = "cox"}. #' @param s Value(s) of the penalty parameter lambda at which predictions #' are required. Default is the value s="lambda.1se" stored on the CV object. #' Alternatively s="lambda.min" can be used. If s is numeric, it is taken #' as the value(s) of lambda to be used. #' @param ... Other arguments to be passed to \code{survfit.coxnet}. #' #' @return If \code{s} is a single value, an object of class "survfitcox" #' and "survfit" containing one or more survival curves. Otherwise, a list #' of such objects, one element for each value in \code{s}. #' Methods defined for survfit objects are print, summary and plot. #' #' @examples #' set.seed(2) #' nobs <- 100; nvars <- 15 #' xvec <- rnorm(nobs * nvars) #' x <- matrix(xvec, nrow = nobs) #' beta <- rnorm(nvars / 3) #' fx <- x[, seq(nvars / 3)] %*% beta / 3 #' ty <- rexp(nobs, exp(fx)) #' tcens <- rbinom(n = nobs, prob = 0.3, size = 1) #' y <- survival::Surv(ty, tcens) #' cvfit <- cv.glmnet(x, y, family = "cox") #' # default: s = "lambda.1se" #' survival::survfit(cvfit, x = x, y = y) #' #' # s = "lambda.min" #' survival::survfit(cvfit, s = "lambda.min", x = x, y = y) #' @importFrom survival survfit #' @method survfit cv.glmnet #' @export survfit.cv.glmnet <- function(formula, s = c("lambda.1se", "lambda.min"), ...) { this.call <- match.call() object <- formula # check that a coxnet model was fit if (!("coxnet" %in% class(object$glmnet.fit))) stop("survfit only available for Cox models") # if user didn't specify s, pick it out from its lambda sequence if (is.numeric(s)) lambda <- s else if (is.character(s)) { s <- match.arg(s) lambda <- object[[s]] } else stop("Invalid form for s") sf <- survfit.coxnet(object$glmnet.fit, s = lambda, ...) sf$call <- this.call return(sf) } glmnet/R/bigGlm.R0000644000176200001440000000666414341220705013277 0ustar liggesusers#' fit a glm with all the options in \code{glmnet} #' #' Fit a generalized linear model as in \code{glmnet} but unpenalized. This #' allows all the features of \code{glmnet} such as sparse x, bounds on #' coefficients, offsets, and so on. #' #' This is essentially the same as fitting a "glmnet" model with a single value #' \code{lambda=0}, but it avoids some edge cases. CAVEAT: If the user tries a #' problem with N smaller than or close to p for some models, it is likely to #' fail (and maybe not gracefully!) If so, use the \code{path=TRUE} argument. #' #' @param x input matrix #' @param ... Most other arguments to glmnet that make sense #' @param path Since \code{glmnet} does not do stepsize optimization, the Newton #' algorithm can get stuck and not converge, especially with unpenalized fits. With \code{path=TRUE}, #' the fit computed with pathwise lasso regularization. The current implementation does this twice: #' the first time to get the lambda sequence, and the second time with a zero attached to the end). #' Default is \code{path=FALSE}. #' @return It returns an object of class "bigGlm" that inherits from class #' "glmnet". That means it can be predicted from, coefficients extracted via #' \code{coef}. It has its own print method. #' @author Trevor Hastie\cr Maintainer: Trevor Hastie #' \email{hastie@@stanford.edu} #' @seealso \code{print}, \code{predict}, and \code{coef} methods. #' @keywords models regression #' @examples #' #' # Gaussian #' x = matrix(rnorm(100 * 20), 100, 20) #' y = rnorm(100) #' fit1 = bigGlm(x, y) #' print(fit1) #' #' fit2=bigGlm(x,y>0,family="binomial") #' print(fit2) #' fit2p=bigGlm(x,y>0,family="binomial",path=TRUE) #' print(fit2p) #' #' @export bigGlm bigGlm=function (x,..., path=FALSE){ ### fit a model using x, y and the other glmnet specs in ... unpenalized thiscall = match.call(glmnet) ### Next few lines simply in case x is a vector, in which case glmnet complains bx=cbind(x,1) d=dim(bx) n=d[1] p=d[2]-1 bx[1,p+1]=0 # so its not a constant arglist = list(...) arglist$x = bx arglist$exclude=p+1 fixbeta <- function(beta,p,nlam=1){ beta <- beta[1:p, nlam , drop = FALSE] dn <- dimnames(beta) dn <- list(dn[[1]],NULL) dimnames(beta) <- dn return(beta) } if(!path){ arglist$lambda=0 fit = do.call("glmnet", arglist) if (is.list(fit$beta)){ fit$beta = lapply(fit$beta, fixbeta, p=p) dimnames(fit$a0) <- NULL } else { fit$beta = fixbeta(fit$beta, p=p) names(fit$a0) <- NULL } } else { fit = do.call("glmnet", arglist)# get the lambda sequence lam0=c(fit$lambda,0) arglist$lambda=lam0 fit = do.call("glmnet", arglist) nlam=length(fit$lambda)#may have stopped early if (is.list(fit$beta)){ fit$a0=fit$a0[,nlam,drop=FALSE] dimnames(fit$a0) <- NULL fit$beta = lapply(fit$beta, fixbeta, p=p, nlam=nlam) dfmat=fit$dfmat if(!is.null(dfmat))fit$dfmat=dfmat[,nlam,drop=FALSE] } else { fit$a0=fit$a0[nlam] names(fit$a0) <- NULL fit$beta = fixbeta(fit$beta, p=p, nlam=nlam) } fit$df=p fit$lambda=0 fit$dev.ratio=fit$dev.ratio[nlam] } fit$dim=c(p,1) fit$call = thiscall class(fit) = c("bigGlm", class(fit)) fit } glmnet/R/data.R0000644000176200001440000000630614325602475013012 0ustar liggesusers#' Synthetic dataset with binary response #' #' Randomly generated data for binomial regression example. #' #' @name BinomialExample #' @docType data #' @usage data(BinomialExample) #' @keywords data #' @format List containing the following elements: #' \describe{ #' \item{x}{100 by 30 matrix of numeric values.} #' \item{y}{Numeric vector of length 100 containing 44 zeros and 56 ones.} #' } "BinomialExample" #' Synthetic dataset with right-censored survival response #' #' Randomly generated data for Cox regression example. #' #' @name CoxExample #' @docType data #' @usage data(CoxExample) #' @keywords data #' @format List containing the following elements: #' \describe{ #' \item{x}{1,000 by 30 matrix of numeric values.} #' \item{y}{1,000 by 2 matrix with column names "time" and "status". The #' first column consists of positive numbers representing time to event, #' while the second column represents the status indicator #' (0=right-censored, 1=observed).} #' } "CoxExample" #' Synthetic dataset with multiple Gaussian responses #' #' Randomly generated data for multi-response Gaussian regression example. #' #' @name MultiGaussianExample #' @docType data #' @usage data(MultiGaussianExample) #' @keywords data #' @format List containing the following elements: #' \describe{ #' \item{x}{100 by 20 matrix of numeric values.} #' \item{y}{100 by 4 matrix of numeric values, each column representing #' one response vector.} #' } "MultiGaussianExample" #' Synthetic dataset with multinomial response #' #' Randomly generated data for multinomial regression example. #' #' @name MultinomialExample #' @docType data #' @usage data(MultinomialExample) #' @keywords data #' @format List containing the following elements: #' \describe{ #' \item{x}{500 by 30 matrix of numeric values.} #' \item{y}{Numeric vector of length 500 containing 142 ones, 174 twos #' and 184 threes.} #' } "MultinomialExample" #' Synthetic dataset with count response #' #' Randomly generated data for Poisson regression example. #' #' @name PoissonExample #' @docType data #' @usage data(PoissonExample) #' @keywords data #' @format List containing the following elements: #' \describe{ #' \item{x}{500 by 20 matrix of numeric values.} #' \item{y}{Numeric vector of length 500 consisting of non-negative #' integers.} #' } "PoissonExample" #' Synthetic dataset with Gaussian response #' #' Randomly generated data for Gaussian regression example. #' #' @name QuickStartExample #' @docType data #' @usage data(QuickStartExample) #' @keywords data #' @format List containing the following elements: #' \describe{ #' \item{x}{100 by 20 matrix of numeric values.} #' \item{y}{Numeric vector of length 100.} #' } "QuickStartExample" #' Synthetic dataset with sparse design matrix #' #' Randomly generated data for Gaussian regression example with the #' design matrix x being in sparse matrix format. #' #' @name SparseExample #' @docType data #' @usage data(SparseExample) #' @keywords data #' @format List containing the following elements: #' \describe{ #' \item{x}{100 by 20 matrix of numeric values. x is in sparse matrix #' format, having class "dgCMatrix".} #' \item{y}{Numeric vector of length 100.} #' } "SparseExample" glmnet/R/error.bars.R0000644000176200001440000000041014664202342014141 0ustar liggesuserserror.bars <- function(x, upper, lower, width = 0.02, ...) { xlim <- range(x) barw <- diff(xlim) * width segments(x, upper, x, lower, ...) segments(x - barw, upper, x + barw, upper, ...) segments(x - barw, lower, x + barw, lower, ...) range(upper, lower) } glmnet/R/elnet.R0000644000176200001440000000340114325602475013201 0ustar liggesuserselnet=function(x,is.sparse,y,weights,offset,type.gaussian=c("covariance","naive"),alpha,nobs,nvars,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,vnames,maxit,pb){ maxit=as.integer(maxit) weights=as.double(weights) type.gaussian=match.arg(type.gaussian) ka=as.integer(switch(type.gaussian, covariance=1, naive=2, )) storage.mode(y)="double" if(is.null(offset)){ is.offset=FALSE} else{ storage.mode(offset)="double" is.offset=TRUE y=y-offset } ### compute the null deviance ybar=if(intr)weighted.mean(y,weights)else 0 nulldev=sum(weights* (y-ybar)^2) if(nulldev==0)stop("y is constant; gaussian glmnet fails at standardization step") fit=if(is.sparse) spelnet_exp( ka,parm=alpha,x,y,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit,pb, lmu=integer(1), a0=double(nlam), ca=matrix(0.0, nrow=nx, ncol=nlam), ia=integer(nx), nin=integer(nlam), rsq=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1) ) else elnet_exp( ka,parm=alpha,x,y,weights,jd,vp,cl,ne,nx,nlam,flmin,ulam,thresh,isd,intr,maxit,pb, lmu=integer(1), a0=double(nlam), ca=matrix(0.0, nrow=nx, ncol=nlam), ia=integer(nx), nin=integer(nlam), rsq=double(nlam), alm=double(nlam), nlp=integer(1), jerr=integer(1) ) if(fit$jerr!=0){ errmsg=jerr(fit$jerr,maxit,pmax=nx,family="gaussian") if(errmsg$fatal)stop(errmsg$msg,call.=FALSE) else warning(errmsg$msg,call.=FALSE) } outlist=getcoef(fit,nvars,nx,vnames) dev=fit$rsq[seq(fit$lmu)] outlist=c(outlist,list(dev.ratio=dev,nulldev=nulldev,npasses=fit$nlp,jerr=fit$jerr,offset=is.offset)) class(outlist)="elnet" outlist } glmnet/R/lambda.interp.R0000644000176200001440000000221014325602475014607 0ustar liggesuserslambda.interp=function(lambda,s){ ### lambda is the index sequence that is produced by the model ### s is the new vector at which evaluations are required. ### the value is a vector of left and right indices, and a vector of fractions. ### the new values are interpolated bewteen the two using the fraction ### Note: lambda decreases. you take: ### sfrac*left+(1-sfrac*right) if(length(lambda)==1){# degenerate case of only one lambda nums=length(s) left=rep(1,nums) right=left sfrac=rep(1,nums) } else{ ## s[s > max(lambda)] = max(lambda) ## s[s < min(lambda)] = min(lambda) k=length(lambda) sfrac <- (lambda[1]-s)/(lambda[1] - lambda[k]) lambda <- (lambda[1] - lambda)/(lambda[1] - lambda[k]) sfrac[sfrac < min(lambda)] <- min(lambda) sfrac[sfrac > max(lambda)] <- max(lambda) coord <- approx(lambda, seq(lambda), sfrac)$y left <- floor(coord) right <- ceiling(coord) sfrac=(sfrac-lambda[right])/(lambda[left] - lambda[right]) sfrac[left==right]=1 sfrac[abs(lambda[left]-lambda[right])<.Machine$double.eps]=1 } list(left=left,right=right,frac=sfrac) } glmnet/R/coxnet.deviance.R0000644000176200001440000004002114325602475015146 0ustar liggesusers#' Compute deviance for Cox model #' #' Compute the deviance (-2 log partial likelihood) for Cox model. #' #' Computes the deviance for a single set of predictions, or for a matrix #' of predictions. The user can either supply the predictions #' directly through the \code{pred} option, or by supplying the \code{x} matrix #' and \code{beta} coefficients. Uses the Breslow approach to ties. #' #' The function first checks if \code{pred} is passed: if so, it is used as #' the predictions. If \code{pred} is not passed but \code{x} and \code{beta} #' are passed, then these values are used to compute the predictions. If #' neither \code{x} nor \code{beta} are passed, then the predictions are all #' taken to be 0. #' #' \code{coxnet.deviance()} is a wrapper: it calls the appropriate internal #' routine based on whether the response is right-censored data or #' (start, stop] survival data. #' #' @aliases coxnet.deviance #' @param pred Fit vector or matrix (usually from glmnet at a particular #' lambda or a sequence of lambdas). #' @param y Survival response variable, must be a \code{Surv} or #' \code{stratifySurv} object. #' @param x Optional \code{x} matrix, to be supplied if \code{pred = NULL}. #' @param offset Optional offset vector. #' @param weights Observation weights (default is all equal to 1). #' @param std.weights If TRUE (default), observation weights are standardized #' to sum to 1. #' @param beta Optional coefficient vector/matrix, to be supplied if #' \code{pred = NULL}. #' #' @return A vector of deviances, one for each column of predictions. #' #' @examples #' set.seed(1) #' eta <- rnorm(10) #' time <- runif(10, min = 1, max = 10) #' d <- ifelse(rnorm(10) > 0, 1, 0) #' y <- survival::Surv(time, d) #' coxnet.deviance(pred = eta, y = y) #' #' # if pred not provided, it is set to zero vector #' coxnet.deviance(y = y) #' #' # example with x and beta #' x <- matrix(rnorm(10 * 3), nrow = 10) #' beta <- matrix(1:3, ncol = 1) #' coxnet.deviance(y = y, x = x, beta = beta) #' #' # example with (start, stop] data #' y2 <- survival::Surv(time, time + runif(10), d) #' coxnet.deviance(pred = eta, y = y2) #' #' # example with strata #' y2 <- stratifySurv(y, rep(1:2, length.out = 10)) #' coxnet.deviance(pred = eta, y = y2) #' #' @seealso \code{coxgrad} #' @keywords Cox model #' #' @export coxnet.deviance <- function(pred = NULL, y, x = NULL, offset = NULL, weights = NULL, std.weights = TRUE, beta = NULL) { y <- response.coxnet(y) # if y has 2 columns, it is right-censored data # if y has 3 columns, it is (start, stop] data # otherwise, throw error if (ncol(y) == 2) { return(coxnet.deviance0(pred = pred, y = y, x = x, offset = offset, weights = weights, std.weights = std.weights, beta = beta)) } else if (ncol(y) == 3) { return(coxnet.deviance3(pred = pred, y = y, x = x, offset = offset, weights = weights, std.weights = std.weights, beta = beta)) } else { stop("Response y should have 2 or 3 columns") } } # coxnet.deviance routine for right-censored data coxnet.deviance0 <- function(pred = NULL, y, x = NULL, offset = NULL, weights = NULL, std.weights = TRUE, beta = NULL) { ty <- y[, "time"] tevent <- y[, "status"] ty <- ty + (1 - tevent) * 100 * .Machine$double.eps nobs <- as.integer(length(ty)) # hack for the case where user passes in x as sparse matrix if (!is.null(x) && inherits(x, "sparseMatrix")) { if (is.null(beta)) stop("if x is passed, beta must also be passed") pred <- as.matrix(x %*% beta) return(coxnet.deviance0(pred = pred, y = y, offset = offset, weights = weights, std.weights = std.weights)) } # Sort out the pred, x and beta options. # If user provided `pred`, we let x = pred and beta = identity matrix. # This allows us to use the loglike Fortran routine to compute the # partial log likelihood. # In the end, only x and beta are passed to the Fortran routine. if (!is.null(pred)) { x <- as.matrix(pred) nvec <- ncol(x) beta <- diag(nvec) nvars <- as.integer(nvec) } else if (is.null(x) && is.null(beta)) { x <- matrix(0, nrow = nobs, ncol = 1) beta <- double(0) nvec <- 1 nvars <- as.integer(0) } else if (!is.null(x) && !is.null(beta)) { x <- as.matrix(x) beta <- as.matrix(beta) nvec <- ncol(beta) nvars <- nrow(beta) } else { stop("user must pass either `pred`, or both `x` and `beta`") } storage.mode(x) <- "double" storage.mode(beta) <- "double" nvec <- as.integer(nvec) nvars <- as.integer(nvars) # normalize weights to sum to nobs if (is.null(weights)) weights <- rep(1, nobs) else { if (std.weights) weights <- nobs * weights / sum(weights) weights <- as.double(weights) } if (is.null(offset)) offset <- rep(0, nobs) else offset <- as.double(offset) # extract strata (if any) if ("strata" %in% names(attributes(y))) { strata <- attr(y, "strata") } else { strata <- rep(1, nobs) } if (length(strata) != nobs) stop("length of strata != nobs") # if all in same strata, do the deviance computation # if not, take the sum of the strata-level deviances if (length(unique(strata)) == 1) { ### Compute saturated loglikelihood wd <- weights[tevent == 1] tyd <- ty[tevent == 1] if (any(duplicated(tyd))) { wd <- tapply(wd, tyd, sum) } wd <- wd[wd > 0] lsat <- -sum(wd * log(wd)) #### fit <- .Fortran("loglike", nobs, nvars, x, ty, tevent, offset, weights, nvec, beta, flog = double(nvec), jerr = integer(1), PACKAGE = "glmnet") if (fit$jerr != 0) { errmsg <- jerr(fit$jerr, maxit = 0, pmax = 0, family = "cox") if (errmsg$fatal) stop(errmsg$msg, call. = FALSE) else warning(errmsg$msg, call. = FALSE) } return(2 * (lsat - fit$flog)) } else { # more than one strata provided: return the sum of strata-level deviances tot_dev <- 0 for (i in unique(strata)) { ii <- which(strata == i) tot_dev <- tot_dev + coxnet.deviance0(y = y[ii, , drop = FALSE], x = x[ii, , drop = FALSE], beta = beta, offset = offset[ii], weights = weights[ii], std.weights = FALSE) } return(tot_dev) } } # coxnet.deviance2 gives the same output as coxnet.deviance0() # but is written completely in R. It is not called by # coxnet.deviance(), and is kept in the package for completeness. coxnet.deviance2 <- function(pred = NULL, y, x = NULL, offset = NULL, weights = NULL, std.weights = TRUE, beta = NULL) { if (!is.Surv(y)) stop("y must be a Surv object") nobs <- nrow(y) # if pred is NULL, use beta and x to compute pred # if beta is NULL too, set pred to all zeros if (is.null(pred)) { if ((!is.null(x) && is.null(beta)) || (is.null(x) && !is.null(beta))) stop("user must pass either `pred`, or both `x` and `beta`") if (is.null(beta)) { pred <- rep(0, times = nobs) } else { pred <- x %*% beta } } # if more than one column of predictions is passed, run coxnet.deviance2() # for each column if (!is.null(ncol(pred)) && ncol(pred) > 1) { return(sapply(seq(ncol(pred)), function(j) coxnet.deviance2( pred = pred[, j], y = y, offset = offset, weights = weights, std.weights = std.weights))) } else { # check that pred is of the right length if(length(pred) != nobs) stop("pred and y must have the same length") # normalize weights to sum to nobs if (is.null(weights)) w <- rep(1, nobs) else { if (length(weights) != nobs) stop("weights and y must have the same length") if (std.weights) { w <- nobs * weights / sum(weights) } else { w <- weights } } # if there's an offset, add it to the pred vector if (is.null(offset)) { offset <- rep(0, nobs) } else { if (length(offset) != nobs) stop("offset and y must have the same length") pred <- pred + offset } # extract strata (if any) if ("strata" %in% names(attributes(y))) { strata <- attr(y, "strata") } else { strata <- rep(1, nobs) } if (length(strata) != nobs) stop("length of strata != nobs") # if all in same strata, do the deviance computation # if not, take the sum of the strata-level deviances if (length(unique(strata)) == 1) { time <- y[, "time"] d <- y[, "status"] ### Compute saturated loglikelihood wd <- w[d == 1] tyd <- time[d == 1] if (any(duplicated(tyd))) { wd <- tapply(wd, tyd, sum) } wd <- wd[wd > 0] lsat <- -sum(wd * log(wd)) #### # order time, d, pred and w in ascending time order # for tied times, all deaths come before censored observations if ("stop_time" %in% names(attributes(y))) { o <- attr(y, "stop_time") } else { o <- order(time, d, decreasing = c(FALSE, TRUE)) } time <- time[o] d <- d[o] pred <- pred[o] w <- w[o] ### See if there are dups in death times dups <- fid(time[d==1],seq(length(d))[d==1]) dd <- d ww <- w ### next code replaces each sequence of tied death indicators by a new ### sequence where only the first is a 1 and the rest are zero. This ### makes the accounting in the following step work properly we also ### sums the weights in each of the tied death sets, and assign that ### weight to the first if(!is.null(ties<-dups$index_ties)){ dd[unlist(ties)]=0 dd[dups$index_first]=1 wsum=sapply(ties,function(i,w)sum(w[i]),ww) tie1=sapply(ties,function(i)i[1]) ww[tie1]=wsum } # compute the sum inside the log term of the partial likelihood w_exp_pred <- w * exp(pred) rsk <- rev(cumsum(rev(w_exp_pred))) # take just the terms related to actual death times log_terms <- (ww * log(rsk))[dd > 0] loglik <- sum((w * pred)[d > 0]) - sum(log_terms) return(2 * (lsat -loglik)) } else { # more than one strata provided: return the sum of strata-level # deviances tot_dev <- 0 for (i in unique(strata)) { ii <- which(strata == i) tot_dev <- tot_dev + coxnet.deviance2(pred = pred[ii], y = y[ii, , drop = FALSE], offset = NULL, weights = w[ii], std.weights = FALSE) } return(tot_dev) } } } # coxnet.deviance routine for (start, stop] data coxnet.deviance3 <- function(pred = NULL, y, x = NULL, offset = NULL, weights = NULL, std.weights = TRUE, beta = NULL) { if (!is.Surv(y)) stop("y must be a Surv object") nobs <- nrow(y) # if pred is NULL, use beta and x to compute pred # if beta is NULL too, set pred to all zeros if (is.null(pred)) { if ((!is.null(x) && is.null(beta)) || (is.null(x) && !is.null(beta))) stop("user must pass either `pred`, or both `x` and `beta`") if (is.null(beta)) { pred <- rep(0, times = nobs) } else { pred <- x %*% beta } } # if more than one column of predictions is passed, run coxnet.deviance3() # for each column if (!is.null(ncol(pred)) && ncol(pred) > 1) { return(sapply(seq(ncol(pred)), function(j) coxnet.deviance3( pred = pred[, j], y = y, offset = offset, weights = weights, std.weights = std.weights))) } else { # check that pred is of the right length if(length(pred) != nobs) stop("pred and y must have the same length") # normalize weights to sum to nobs if (is.null(weights)) w <- rep(1, nobs) else { if (length(weights) != nobs) stop("weights and y must have the same length") if (std.weights) { w <- nobs * weights / sum(weights) } else { w <- weights } } # if there's an offset, add it to the pred vector if (is.null(offset)) { offset <- rep(0, nobs) } else { if (length(offset) != nobs) stop("offset and y must have the same length") pred <- pred + offset } # extract strata (if any) if ("strata" %in% names(attributes(y))) { strata <- attr(y, "strata") } else { strata <- rep(1, nobs) } if (length(strata) != nobs) stop("length of strata != nobs") # if all in same strata, do the deviance computation # if not, take the sum of the strata-level deviances if (length(unique(strata)) == 1) { start_time <- y[, "start"] stop_time <- y[, "stop"] d <- y[, "status"] ### Compute saturated loglikelihood wd <- w[d == 1] tyd <- stop_time[d == 1] if (any(duplicated(tyd))) { wd <- tapply(wd, tyd, sum) } wd <- wd[wd > 0] lsat <- -sum(wd * log(wd)) #### # get ordering for stop time (ascending, deaths before censored), and # start time (ascending) if ("stop_time" %in% names(attributes(y))) { stop_o <- attr(y, "stop_time") } else { stop_o <- order(stop_time, d, decreasing = c(FALSE, TRUE)) } if ("start_time" %in% names(attributes(y))) { start_o <- attr(y, "start_time") } else { start_o <- order(start_time, decreasing = c(FALSE)) } # keep a set of values which are ordered by start time w_exp_pred_start <- (w * exp(pred))[start_o] start_time_start <- start_time[start_o] # reorder everything by stop time start_time <- start_time[stop_o] stop_time <- stop_time[stop_o] d <- d[stop_o] pred <- pred[stop_o] w <- w[stop_o] ### See if there are dups in death times dups <- fid(stop_time[d == 1], seq(length(d))[d == 1]) dd <- d ww <- w ### next code replaces each sequence of tied death indicators by a new ### sequence where only the first is a 1 and the rest are zero. This ### makes the accounting in the following step work properly we also ### sums the weights in each of the tied death sets, and assign that ### weight to the first if(!is.null(ties<-dups$index_ties)){ dd[unlist(ties)]=0 dd[dups$index_first]=1 wsum=sapply(ties,function(i,w)sum(w[i]),ww) tie1=sapply(ties,function(i)i[1]) ww[tie1]=wsum } # compute risk set sums rsk[i] = \sum_{j in R_i} w_j exp(eta_j) # where i indexes the observations. (In the end, we will only care # about the indices i which have actual death times.) rsk <- rev(cumsum(rev(w * exp(pred)))) current_sum <- 0 stop_idx <- nobs; start_idx <- nobs while (stop_idx > 0 && start_idx > 0) { if (start_time_start[start_idx] < stop_time[stop_idx]) { # current start time belongs in risk set ending in stop time, # so we should remove the current cumulative sum and consider # the next risk set rsk[stop_idx] <- rsk[stop_idx] - current_sum stop_idx <- stop_idx - 1 } else { # current start time does not belong in risk set ending in stop # time, so we should add it to current_sum and check if the # start time before it should also be added current_sum <- current_sum + w_exp_pred_start[start_idx] start_idx <- start_idx - 1 } } log_terms <- ww[dups$index_first] * (log(rsk[dd == 1])) loglik <- sum((w * pred)[d > 0]) - sum(log_terms) return(2 * (lsat -loglik)) } else { # more than one strata provided: return the sum of strata-level # deviances tot_dev <- 0 for (i in unique(strata)) { ii <- which(strata == i) tot_dev <- tot_dev + coxnet.deviance3(pred = pred[ii], y = y[ii, , drop = FALSE], offset = NULL, weights = w[ii], std.weights = FALSE) } return(tot_dev) } } }glmnet/R/stratifySurv.R0000644000176200001440000000422014325602475014617 0ustar liggesusers#' @export `[.stratifySurv` <- function(x, i, j, drop = FALSE) { strata <- attr(x, "strata") stop_time <- NULL; start_time <- NULL; ss_match <- NULL if ("stop_time" %in% names(attributes(x))) stop_time <- attr(x, "stop_time") if ("start_time" %in% names(attributes(x))) start_time <- attr(x, "start_time") if ("ss_match" %in% names(attributes(x))) ss_match <- attr(x, "ss_match") obj <- NextMethod(`[`) # !missing(i) && missing(j)? if (!missing(i) && is.matrix(obj)) { attr(obj, "strata") <- strata[i] if (!is.null(stop_time)) attr(obj, "stop_time") <- stop_time[i] if (!is.null(start_time)) attr(obj, "start_time") <- start_time[i] if (!is.null(ss_match)) attr(obj, "ss_match") <- ss_match[i] class(obj) <- class(x) } return(obj) } #' Add strata to a Surv object #' #' Helper function to add strata as an attribute to a Surv object. The #' output of this function can be used as the response in \code{glmnet()} #' for fitting stratified Cox models. #' #' When fitting a stratified Cox model with \code{glmnet()}, strata should #' be added to a \code{Surv} response with this helper function. Note that #' it is not sufficient to add strata as an attribute to the \code{Surv} #' response manually: if the result does not have class \code{stratifySurv}, #' subsetting of the response will not work properly. #' #' @param y A Surv object. #' @param strata A vector of length equal to the number of observations in #' y, indicating strata membership. Default is all belong to same strata. #' #' @return An object of class \code{stratifySurv} (in addition to all the #' classes \code{y} belonged to). #' #' @examples #' y <- survival::Surv(1:10, rep(0:1, length.out = 10)) #' strata <- rep(1:3, length.out = 10) #' y2 <- stratifySurv(y, strata) # returns stratifySurv object #' #' @importFrom survival is.Surv #' @export stratifySurv <- function(y, strata = rep(1, length(y))) { y <- response.coxnet(y) if (length(y) != length(strata)) stop("y and strata must have the same length (=nobs)") attr(y, "strata") <- strata y_class <- class(y) if (!("stratifySurv" %in% y_class)) class(y) <- c("stratifySurv", y_class) return(y) } glmnet/R/predict.mrelnet.R0000644000176200001440000000054514325602475015177 0ustar liggesusers#' @method predict mrelnet #' @export predict.mrelnet=function(object, newx, s = NULL, type = c("link", "response", "coefficients", "nonzero"), exact = FALSE, newoffset, ...) { type=match.arg(type) if(type=="response")type="link" object$grouped=TRUE predict.multnet(object,newx,s,type,exact,newoffset,...) } glmnet/R/coef.cv.relaxed.R0000644000176200001440000000141714325602475015045 0ustar liggesusers#' @method coef cv.relaxed #' @export coef.cv.relaxed <- function (object, s = c("lambda.1se", "lambda.min"), gamma=c("gamma.1se","gamma.min"),...) { relaxed=object$relaxed if (is.numeric(s)) lambda = s else if (is.character(s)) { s = match.arg(s) lambda = relaxed[[s]] if(missing(gamma)){ gamma=switch(s, lambda.1se=relaxed[["gamma.1se"]], lambda.min=relaxed[["gamma.min"]] ) } } else stop("Invalid form for s") if (is.character(gamma)) { gamma = match.arg(gamma) gamma = relaxed[[gamma]] } if(!is.numeric(gamma))stop("Invalid form for gamma") coef(object$glmnet.fit, s = lambda, gamma=gamma, ...) } glmnet/R/predict.elnet.R0000644000176200001440000000026614325602475014640 0ustar liggesusers#' @method predict elnet #' @export predict.elnet=function(object,newx,s=NULL,type=c("link","response","coefficients","nonzero"),exact=FALSE,newoffset,...){ NextMethod("predict") } glmnet/R/cvtype.R0000644000176200001440000000333414325602475013411 0ustar liggesuserscvtype <- function(type.measure="mse",subclass="elnet"){ type.measures = c("mse","deviance", "class", "auc", "mae","C") devname=switch(subclass, elnet="Mean-squared Error", lognet="Binomial Deviance", fishnet="Poisson Deviance", coxnet="Partial Likelihood Deviance", multnet="Multinomial Deviance", mrelnet="Mean-squared Error", glmnetfit="GLM Deviance" ) typenames = c(deviance = devname, mse = "Mean-Squared Error", mae = "Mean Absolute Error",auc = "AUC", class = "Misclassification Error",C="C-index") subclass.ch=switch(subclass, elnet=c(1,2,5), lognet=c(2,3,4,1,5), fishnet=c(2,1,5), coxnet=c(2,6), multnet=c(2,3,1,5), mrelnet=c(1,2,5), glmnetfit=c(2,1,5) ) subclass.type=type.measures[subclass.ch] if(type.measure=="default")type.measure=subclass.type[1] model.name=switch(subclass, elnet="Gaussian", lognet="Binomial", fishnet="Poisson", coxnet="Cox", multnet="Multinomial", mrelnet="Multi-response Gaussian", glmnetfit="GLM" ) if(!match(type.measure,subclass.type,FALSE)){ type.measure=subclass.type[1] warning(paste("Only ",paste(subclass.type,collapse=", ")," available as type.measure for ",model.name," models; ", type.measure," used instead",sep=""),call.=FALSE) } names(type.measure)=typenames[type.measure] type.measure } glmnet/R/check.exclude.R0000644000176200001440000000033314325602475014600 0ustar liggesuserscheck.exclude <- function(exclude,nvars){ exclude <- unique(exclude) if(length(exclude)> (nvars-2))stop("cannot retain 1 or less variables") if(length(exclude)==0)exclude <- NULL exclude } glmnet/R/cv.fishnet.R0000644000176200001440000000102514325602475014141 0ustar liggesuserscv.fishnet <-function(predmat,y,type.measure,weights,foldid,grouped){ devi = function(y, eta) { deveta = y * eta - exp(eta) devy = y * log(y) - y devy[y == 0] = 0 2 * (devy - deveta) } N = length(y) - apply(is.na(predmat), 2, sum) cvraw = switch(type.measure, mse = (y - exp(predmat))^2, mae = abs(y - exp(predmat)), deviance = devi(y, predmat) ) list(cvraw=cvraw,weights=weights,N=N,type.measure=type.measure,grouped=grouped) } glmnet/R/getcoef.R0000644000176200001440000000252514325602475013514 0ustar liggesusersgetcoef=function(fit,nvars,nx,vnames){ lmu=fit$lmu if(lmu<1){ ## changed this to a warning message, and return an empty model warning("an empty model has been returned; probably a convergence issue") coefob=list(a0=fit$a0,beta=zeromat(nvars,as.integer(1),vnames,"s0"),df=0,dim=c(nvars,1),lambda=Inf) return(coefob) } nin=fit$nin[seq(lmu)] ninmax=max(nin) lam=fit$alm[seq(lmu)] stepnames=paste("s",seq(lmu)-1,sep="") dd=c(nvars,lmu) if(ninmax>0){ ca=matrix(fit$ca[seq(nx*lmu)],nx,lmu)[seq(ninmax),,drop=FALSE] df=apply(abs(ca)>0,2,sum) ja=fit$ia[seq(ninmax)] ####confusing but too hard to change ###glmnet builds a list of ever active variables which is nondecreasing ###Since ca was initialized to zero, no harm is done in passing a square matrix ###to new(); then when we do a drop0 it makes it really sparse oja=order(ja) ja=rep(ja[oja],lmu) ia=cumsum(c(1,rep(ninmax,lmu))) beta=drop0(new("dgCMatrix",Dim=dd,Dimnames=list(vnames,stepnames),x=as.vector(ca[oja,]),p=as.integer(ia-1),i=as.integer(ja-1))) }else { beta = zeromat(nvars,lmu,vnames,stepnames) df=rep(0,lmu) } a0=fit$a0 if(!is.null(a0)){#for Cox model a0=a0[seq(lmu)] names(a0)=stepnames } list(a0=a0,beta=beta,df=df,dim=dd,lambda=lam) } glmnet/R/Cindex.R0000644000176200001440000000320214325602475013303 0ustar liggesusers#' compute C index for a Cox model #' #' Computes Harrel's C index for predictions from a \code{"coxnet"} object. #' #' Computes the concordance index, taking into account censoring. #' #' @param pred Predictions from a \code{"coxnet"} object #' @param y a survival response object - a matrix with two columns "time" and #' "status"; see documentation for "glmnet" #' @param weights optional observation weights #' @author Trevor Hastie #' @seealso \code{cv.glmnet} #' @references Harrel Jr, F. E. and Lee, K. L. and Mark, D. B. (1996) #' \emph{Tutorial in biostatistics: multivariable prognostic models: issues in #' developing models, evaluating assumptions and adequacy, and measuring and #' reducing error}, Statistics in Medicine, 15, pages 361--387. #' @keywords Cox models cross-validation #' @examples #' #' set.seed(10101) #' N = 1000 #' p = 30 #' nzc = p/3 #' x = matrix(rnorm(N * p), N, p) #' beta = rnorm(nzc) #' fx = x[, seq(nzc)] %*% beta/3 #' hx = exp(fx) #' ty = rexp(N, hx) #' tcens = rbinom(n = N, prob = 0.3, size = 1) # censoring indicator #' y = cbind(time = ty, status = 1 - tcens) # y=Surv(ty,1-tcens) with library(survival) #' fit = glmnet(x, y, family = "cox") #' pred = predict(fit, newx = x) #' apply(pred, 2, Cindex, y=y) #' cv.glmnet(x, y, family = "cox", type.measure = "C") #' #' @export Cindex Cindex=function(pred,y,weights=rep(1,nrow(y))){ ### This function links to the concordance function in the survival package if(!is.Surv(y))y=Surv(y[,"time"],y[,"status"]) f=-pred if(missing(weights)) concordance(y~f)$concordance else concordance(y~f,weights=weights)$concordance } glmnet/R/buildPredmat.default.R0000644000176200001440000000217114325602475016134 0ustar liggesusers#' @export buildPredmat.default=function(outlist, lambda, x, offset, foldid, alignment,...){ if (!is.null(offset)) { is.offset = TRUE offset = drop(offset) } else is.offset = FALSE predmat = matrix(NA, nrow(x), length(lambda)) nfolds = max(foldid) nlams = double(nfolds) nlambda=length(lambda) for (i in seq(nfolds)) { which = foldid == i fitobj = outlist[[i]] if (is.offset) off_sub = offset[which] preds = switch(alignment, fraction=predict(fitobj, x[which, , drop = FALSE], newoffset = off_sub,...), lambda=predict(fitobj, x[which, , drop = FALSE], s=lambda, newoffset = off_sub,...) ) nlami = min(ncol(preds),nlambda) predmat[which, seq(nlami)] = preds[,seq(nlami)] if(nlami1){ ng=length(gamma) outlist=as.list(length(ng)) names(outlist(format(round(gamma,2)))) for( i in 1:ng)outlist[[i]]=predict(object, newx, s, gamma=gamma[i], exact, newoffset, ...) return(outlist) } if(gamma==1)return(NextMethod("predict")) predict(blend.relaxed(object,gamma),newx, s,type, exact, newoffset, ...) } checkgamma.relax=function(gamma){ if(any(wh<-gamma<0)){ warning("negative gamma values ignored") gamma=gamma[!wh] } if(any(wh<-gamma>1)){ warning("gamma values larger than 1 ignored") gamma=gamma[!wh] } if(!length(gamma))stop("no valid values of gamma") gamma } glmnet/vignettes/0000755000176200001440000000000015035572362013560 5ustar liggesusersglmnet/vignettes/assets/0000755000176200001440000000000014664706500015062 5ustar liggesusersglmnet/vignettes/assets/vignette_binomial.png0000644000176200001440000072707713752553007021312 0ustar liggesusersPNG  IHDR kiCCPkCGColorSpaceGenericRGB8U]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\ 8eXIfMM*i sK@IDATxTҤ+"EA(.,KQ)u XE(TE)4 UAwnINMn|<9oI>$7'2B0!           @{@@@@@@@@@@@,9@@@@@@@@@@@ b7           $s           d ܳn`%@@@@@@@@@@@Hp@@@@@@@@@@@$gJ           1           -Hp@@@@@@@@@@@ c@@@@@@@@@@@ [-v+           @;           @ =[V@@@@@@@@@@@w@@@@@@@@@@@l!@{                       BlX @@@@@@@@@@@9@@@@@@@@@@@ b7           $s           d ܳn`%@@@@@@@@@@@ B        ;~79vX*TH-r,e:S`A)VXL9   @:HpO2}   y%Kga:a/.Kإs 5jԐˇgsw r dc8aӐeʕFM6|e9rDygum˶mdӦMvMHI&1~W0+ǣWۙ]wn1yCk`l^]]+[Kv]Vׯ/٘!C=ܓ'|2K~VZ%e˖@@[ _FhG@@@ ?w(CFDM{2e$,7nt=s>%JDei;@ECV9suFK6jB^ʕ]lR.6##C g@@@7L    Z`Æ ??ϣ*Tv}-*=mV6h1&`S\Yo/ښh&XH,'x(P@; @Nصk;vuJxNˌ5J9oQ@@@Hp@@@@@RIRoܸ㊓HDI]@ [ :,Qmhڴ| 駟d @@@(E#    ཀfM6͛EGgPtIr˩} ZԾWZ%۶mg ' UVj֬):*SV^m?7n^[_Jѯ38ڇnѣV6lmSpժUҥKm2x]~:x_+U$+VN;Mʖ-T9y!$Deӕn:Y~lٲEkS=U^=罸P>f}&Z϶#W.Uȶv! ,ܺuk[cWX!Ǐ &X1+ַr(.rMxeܹrرMU\Yu&j׮%R=sEY]|NCٹsgj^hwѓ>/<[ԩS/NhBɤ nuԑ?_nF{- z;o#^O۶mg˸qBxZΤIdʔ)xbپ}cPH{WGФI}hp.zO3!  ~YgB@@@B#jƠWhW$q<O!$ЈF˛8hL蟵vf'D}#HFW]urцLhHp]wܑJR/tlo߾~}ȉP(֮\rYB#gtvcGC k3Q}3Bad]i;o 7P]F!r[ Luύaҥv򡇌2Bi'\Ѓ v'(JOx+V,=<nz 8pulYOfj?DC-2Bgm\^%/ Y$:7^۩ٝoCobCwE&@@@/ @@@Z@GIёu4L3ψJpxx]yJTH?s$vQSjU]w?oކudޟ9x>rѣ y7PmiY7y#/N\'|q ~}| T{gˤoH+1sLz*@@@THpOEe@@@@H.]RJbX|\pgϞJ5)YRV\)m۶}=ֵkWٵkWҝFAMI.☤w7h&k[L׭6>dYFѹuKRפJ)eڍWqFiݺuCrW+M@D;tv?t Q<(^zKn7l ڵ۷]1^ЈC99+eئkQ_1.Q&>;QVyhuKD^O]>}n;;507t;5P$;b 3fȾ}lܝիeͩv   @\qK)D@@@Hzmg}Hu:J]uVkMBF{{\Ǝk%a=^/~o5~L+zDG5}HB4YPnuEz|(^{mQFpaϞ=%Qҧ:z&y1:B&q]rW};BΝ/KNѷC|RV-Oɭ>mf=#x9=SҰaÄ?ֶs.>v]w9>\2~x+.Q;vƍڴi#gqF8MjСgHn69v옧e\ Σs sd?*Oy4z*۸RL{ݻ#  1$ǐP   G`޼yȜ^$'G|w&,EkimHn&#N@G[gĈK/ݭMUg5W믾j_ëGY?|(|$vDDI^&'GGM*=܇٭[7aeˆrp?fK/T.\(ʕ =RBZXTvڨRf-\sHr.>`?Nס%KX,ׯ_?QSq NN}VjHݮs;Oga?gk\^5즒%KifbTok$Q  IObA@@@̙#^~_ާ5Y/uޚo*TԮ][>lNtLt2d̜94<3N5`c($E<3>~>~xL(Q:vI(Mܮ ժUyd+WgzRNɟϝ/BZ|6L=4bŊelb4>q|۬Ӷz/ҵkWktf/:ͭ>/l WL'Ǩ[4iD\ZHE8ݿ ,p LjBGqw;[K.]͚5K0IڵAGO>i|#:ԩ\]5yG(k4\mTN/+f]Bw@}];!  ^y@@@\ .֭[{5rH1Q::X34i$e"?p vf'C[M2D5Mb՜:uQ=x`X W_}UtTޝ;wo#=6ٸ1 fD߿:v~g뻛}MIO=?+zlݺ5yM{cԪUK}]mܰa[,Ӈn&9tPd1[/݇˖-('NoMWkʔ)9&6{5\t{ヲRpai޼'d;m4yᇥ}RLv!|8M`n8^XM4M+VFsu;C"ڜ?]5u A6m$x„ }o@OxKY|7ʦMO>gyFY#kNӘ1cdNakA5G'kW4h fqYgFu@cB@@<Ä   > 2Bԧ{1޲P2Fd4j3wB#W^[q#PQF(q0zṠ2ʖ-kn()1#4:|̈́u 3B, %gF4nS `|>ce˖ƎQ3BϸYf͌PBvCI'|QD+ڶmk_׌Px%z`#fDz|m쾇5˟~i#_3PnƕW^inn^ gy._.@G"+WYgtd믿޶!CXoL =L!f͒*UDfzHE 0j7}7v1Z#G[ĆDGuLGvJ*%͚5s2ir{W_Yo֒%Ko-~]Xf\cǎ!|H&CI uQ u)Iۉ}ۓ/RN:$f5j$C W9TGwLF^ҥTPqC:ƄL[j%u /]7oSYoqرcdr';^zI-Zd%(p LcG{;&}9/]C(9r9@D@#{z&@@@kܽ=@@@@@ݥ]vFK]~r:%&iBի%M6Mb:S$4ʛcx#P^=ӤN:9ƅ(/K.)Īleж^+׿xgm5Nׯ_^{ƍ믿v |iK4h`W!O?1^8uW M5 a*5n6K '&[}"@C˞={dΜ9եEB>ϓt98Fu! &9tM+#JCo먆|IĒ?ޞ=M]Ltݣ>*?EGu8F!^F7f͉\hO\õt 4$&x+mA@@H#5   Y@yWH&ofI&u]'j2 ͌Ѥ3z?ٟLu4L5t؂ ::%}駎mSL, CGQ+ǘa-j<-[^G7WyǸ޽{Kڵc=*oVLy2ܗ̶;-Sti9E>5j=YF4d4Il8=t&?;&LcǎEuVGhꫳFk7i|۶mxb:M`^}kQj2f{ܫy:?{$#]T^:%5E^Mʕsl*=q @@@l-`l     s4YNsիW7wJ83M} ?> 4mԸJ*+K*e+Vtݻwo˜7ʦMև+;G͛7w]hc  r-Fok1zb޼yы>^GN?r䈣}h?6 s >Ǎ0@!']HNB>DpEDQ5n8ǘc:uL^FLTj/SN8M->' /3f̐JW Fx@߾}̙#ׯOkiӧSUŅ~G=W}rwȤIǰ߹fH4<\dyNNIBS& #  ^ $    I]0clhͶZyꩧ:$ HeDmRU@GDOөXbF&I NSFFFo6a]d>vR#[vRo TV-qCM"D?.;vpKg@{M{n&C@@ E   i駟Dyt 'x$ n'/ZGsRIR/^5]>IMT@O<(.&>LwcDGk"޲e$UcQ sKڵ׀={ť+(6lpd nFEqS} X #ϛ7OLVN^/T|SO2h#<L81nݺ2|+Yh}}'Æ 3A\p 4>7"+Vs`{<<D@@#@{U(   Fdp#M͛7%Q_I J}\`|Iס$&KzUsΝI/uVeMsFyrFkn:8 6*Vh׌c]n99nh;vv_":륗^*O>,YD؎I䑀;Ϭ&HϜ93Sdԩȹ+g}v2n?TPAMfW:uhѢd1p Lry +i\ySz>vf߾}NJrc@@@tL,    A%|ӦMIoC䧟~Jzy;&ȚzI'W¬o+ַC$ez^29^GtJv2M̳33m$9ˮ 9rDt"6lTڴi#^xjJի'ŋ,(2>k snA[nE{1E5CV4)ĨYfo[ox77ސ1ިPÇ뮓oVJ(aX]p Lw=k=ԁ<{ul|1   nHpwE,    K)"JLI(C I"&'F,2&uYIq`r\%9p!v͚5kvZzכ%pQy8_s: ]vo]td|%\F&rrW߫W/y' |wdV_|0N+~Oƽʖ-+4O??P>㔯z.m˼\lr 4y@_|7C&Fpw@@ w    CvM77:y ԨQ#nydeƍE|K.MzM܋-**UJܶ&9M@~d$}7h nX6YM>]Ə/:]r.u?N$Y|ꩧ_ۥw)s̑>@;f{KmcR*yE#z8n8D:u$t*׈:LBl@;k{D^fkMN<&Yg@@H] i@@@2&3Nrs9h }Y M}8xPzu޽3FV\):Z&wzn#;޽50ADo8`W~s|{;׬,  $    LFLԫm'37ȭ&&lٲ$43fѲ~c({%K^qMoСCe/_.wȑ#EGwLoNzd?!& ںE䝦;PLΝ;e$@jժN}Qbڽ{y4Y0~JŊ~[fΜi*}Q\N =50A׮z^~'ju{q\|1   nHpw+F<    $>|ب ?ێ+7wq7~O?1Ŏ;\7a ǐ4IwliС vnoJ8 k|P^ubw7]G1`25o$,ĴnZU渽s9E|Wɫ&ӕW^iFKqRJSR\d#VBsdYk? ( zПWkX޽mۈW/Ȼk tZje7e˖-ZHϞ=婧dF!o۶4m4^yk`v9YS^VPZGpɽTڵc@@@ t    @…LF׈m/(QJD_iԨQrqd;sJ׮]eNMZo K /ww=z ܹSz!QM&M`[]f;d.IW\qL:5,})SUgp ( ?L0A.b}o21dɒ1./˗Oufѐ!CDG75ԷuLjS0y߾}Iv L6MLF FKo<<<(W_}9rvQ]zu3i… mRm&ۂK.DԩH=s LuP=k>t7ynmܸѮڪID   @    @bt$1.:϶}5ț-GfYNt46mڈ&gc(!M-Xy<Mh3I2ׄK[M@V^-wu֭[#HDAN(ҏ<Fdz,i;SVu14I.x1V7n,˗/7iZ{18 4hh^z(N߿Q(F#Id뮻.s)"ӤvmNaY5y~Y8ڎx6e\ӷ+:u- . I ]6a }hi"Iz@@HFdX@@@J.@&\R^ykTO?4~\ZѺukkjѰ6m*x#U^JN|7m7qCwRJҽ{w@MHבe5)~#$aÆҥKP迀&:{O:&\uUovW<PV-ٳњCRVDGΟ7oC#OZ=~xsβg6ۍ jԨr_?3XLX39׶C* y1޽{G}FAkMF6I7Zl50};k`)]wxIGpjrJpׇG&@@@k!@@@@ O|F۹b cb/Ri׮]Lvsys='~9rxK5dN1fp4RGg߻wT7}tMj93ew/,slC,3%?M֯5kZhe:cBy(xȑ[8-[f՚خ_:iRѢEFF~՟Y&U&eʔEKdN,YDy{0^z=|.\8^5e)o^tmذU+ֹj`].3gF߼ysk}uy=WCʄ DG^wS楉k`z68K^֩SG`&M,^MN gu!ͫ@@;$}͖"   Vׄ'Z͛7'?Ni. 5O>neڵ=hcVCmO>믿n}%-ZM2m&j2lIqMȩZu..ep 2yd+ym2k%dڴiV5_/X&M؉&_J*e%%95lڴIN?tP] ϟ_t$zՒ'pIp~}Ȣ>=:esB\S\OGy=]iܹ\&VZeLflD@@ȟ,    s9VR]]]RmۭSnDAy:BG}$841z6ǐ^ n׷n}b b:SB&E;VN<Zꨟ:z:ν:o!ooPз]o 7|f5o4 O ŋ's q@w^9):]5nZvlܸ.ĨN߸9M1Į]@@@9@@@@ W_tv ~ ~iٳg[RL+!N3jKS=q []?5ḅ6l(LQuБ^ /ЋD_̘1CN9߶Wt5k\veAY*U$/ZV@IDATbZl)7tc+'Nt! 9Y+ktv\pk/ u\ߍ\~A^iwR.]Dc@@@HYKA@@@)CIѢEZwwm϶Z\+X ,Y2-jӦ?5t*մpPX"{~5j{ョF5̙R|ypb|hܸ|LzyE՘ kN{ڵ 4i" ,F48DM^Lg}&rcsg8[ӧqIB c=&/F? /]mTe˖e"ᄈOuP  $+@{r,   w}7$ww?vܰ\УGobŊmmժU_8LA%s KՑ~P贆UT!CX#J;%8E74l2jϗ JǎZDoL0A<̔IU&ƍ1#0rHk&;B_z+RhB*T`1L264WGv4Qדo7l 7>tCe^Xr s%\bKEW_}eUW]e[O%   ,   8 \|VW_m ?dy+^>i&4dd޽{VK*%5k[o%w^R}uXΝ+-r֟: q ;k`^E^L즍7ڵkBlgL얧@@ȗC@@@d>@͛'?ڵKJ.m%i2&Okq2ٶW۟|v&Л$mٵEǐMHzٱcl߾ '|yXWn}$ ^6L:UV^m=8WjБk֬):u}_GZ?gi&<8`]bEݨQ#]dIWSؽ{\Jxפ}G=oq֛jժR?,Ie%/=7lP4i" Es 4@JC4 | 4vG1cX$+PCv&@@@/]@@@@+rΝ&L9 @@@{94hP믿z3[ }kǰaFw}SO%@@HUTY@@@ FՑ_+WUرcm-X@6mjC%   )?[o;|M-[n(1oxI4:CC`B@@ /YE@@@r@%_Ͳ INxu֕뮻.KܹsϷ Ӿ/E@@@ (oFˆ+WJ:u"J?~ҠAW^yL6-a=   h6@@@@r@JdݺuYVȑ#~z+\#kNʗ/.r>dǘzD   }MpO]'O:5o=b   ?kڟU@@@@4TRŨǏˈ#b5^0ѭiӦm    iFjժgAԧW_}5y7LL   $-L    @6⋍˚5k.~7nč.ѣGt    `(`7 dٲe-|嗲rʄ<˗/a=   W2BW    @du퟈ʔ)#+WRJɮ]dǎgW߬Y3]-C0   )pa93eڵF|ЇQc%ѨחKJX@@Jw$i@@@ȡ}1cƤ}}]/"   M&;wIʕ-[H"Eև wm=~СpQSL.]d)c@@KGk]@@@@  04   38CfϞ--[m ( ?d$L   yQ@{w5}̙qp oFQ  ~ 0_   @ ג?~zO@Gjҥ&Mx&    @V;v>o߾.Lr-/^SWtiYjTT)@@@Oԥm@@@@  ,\P&M$s̑+VbŊҬY3kDݻKʕ%@@@2dy哕+WJڵT} Gh1b~YA@@!P0    @hڴWxڴi^Z#_*V*UJtd7:ӤZj   i;EvwSvayc .,)@@H#C>@@@@@@@@@@@;F           @HpO2]           8 lD           @HpO2]           8 lD           @HpO2]           8 lD           @HpO2]           8 lD           @HpO2]           8 lD           @HpO2]           8 lD           @HpO2]           8 lD           @HpO2]           8 lD           @HpO2]           8 lD           @HpO2]           8 t!쳴%mV7oJ  QLK{~E@@@@@@@@@@@ aS@@@@@@@@@@@hܣEG@@@@@@@@@@D@@@@@@@@@@@@ Zh@@@@@@@@@@@ =v:E@@@@@@@@@@ =Zy@@@@@@@@@@@@HpN@@@@@@@@@@@Hpa@@@@@@@@@@@ aS@@@@@@@@@@@hܣEG@@@@@@@@@@D@@@@@@@@@@@@ Zh@@@@@@@@@@@ =v:E@@@@@@@@@@ =Zy@@@@@@@@@@@@HpN@@@@@@@@@@@Hpa@@@@@@@@@@@ aS@@@@@@@@@@@hܣEG@@@@@@@@@@D@@@@@@@@@@@@ Z`t  @v6m5iD5j;vLm&[l͛7\rRB93tҞX}G@@{JܸqlݺU/n_VTIj֬)3DAޣ5@@ owWU 1~qԲ  uTAns^?~ y`@!͓#FdmѢE=Kp߽{2}t9zhf ( {tAZhY NiY@@ eƌ2aD0E]$۷jժ% sUe}B"@@ SϿj'A#oۜS R AcoۜKa6 \ p@Hdذaw|8qL4I:d۾> ѯVZw-%K]Ʈ2Ⱦ֋:@@.]*d͚5 ڵ˺}뭷믗nݺI. vD&@@ _wG 9@EAU 9l x ;=X1@@T2x`/ ydΙ3G+۷o2o$@@ )7|St!;F3e}  _joA#oR .AcoۜZ E@@_=*?eɒ%?f{ꩧJ+oڱc]&My'w}.]:Kk{w|ݺu2l0ٷzQ  ֭[{WU'rX_ZhYl}޷o5Jf̘nŊ2rH0`@D3A_w"@@=bP{Z@@ wW 3~ #J  m䮻sN8JL#$k`rb9s^:<^A}[@@xY^Kq5TR2h ;,3۷ǔGyd#  wW]7m6D! 9[ ZPA6죔G?HpS@@y_~In;eYkݺ5r{G|ңG 1A >! .eQ#B Yo)VXdqW\q4m4KwRo& gA  wރG ~oS | zAcoۜV /YE@Wt>tPycFtՐMcdҤIY"/7tS2SN`ٴiS ^@@/bkF1 zS6 /;@@[tUW {Ġ rmw8  @.=fP͹pe3@'}Y@08t萼kҭ[7b*Rm6<MDFNwTZ5~u̞=;, Ⱦ#׃   ̚5+VZŔT^]駟~Y9 43  @btU"{Ġ ruj@@#]U0{̠ rs˖ YsG  ݻW]<222G2vXDO+VaÆI˖-_lYr͚5)s*hѢELH'#;r= dp_~ *z'J͚53M>.\X*Uٻ6_y3N +()Phe,G$,-(M@pرx۲GTAҝI>t{g|}깐]l=w) ^_l;؀  <}U+Fծ13?@@HLuŘ9H0 ȁ@ [Ng>2g{O}]ټy;fxTI0 N:I=XӬJQ˔)Sd„ ŶZ"%|r%Hqql۶͖WZegĉKyy]7nKϞ=vp?x $J@g\Ƥ#ҥ" @ 8- zUկ+ծ1z>' ;@ yygM=-,,cJCC6Yo?)n~Ĉriq'1U;{GDJpvxYG@)स6^׏>HQ˙g^]g|A@pR|Tusq^ (6}WՎSW:yp@g9|0Z@?pG!{ >\c*˗/ٳg=xLpyʒ<)ݪ7ӯ_?SYV !Pζ}'  C)qm<ꑳ|))) /z{}Le@gۖ@H@2Z5$VʢuVyΓ3gJ[[[H&O,^{mHYRg#  *bD]*mGwV @2] SkFW]cQƇ`R   .]Ȍ3䦛n/rj'|RneoTztF0]mnnNgۖ@H@Z5TmlJϗj )4\.9SK.o/u{@@3NO;cguQW@gV2@p@c['wUW8OW:ZF V@p@3όjrI4 ,s^^^$l;r   `qիe׮]UlzWKAAuƗ:> ;  QF.bD]*mxz@2X鱭]ե+ծ1g&CCHp j@[`ף]ƌ#'O6fd(@-@\+RYYiPO_'wQg|@F4#jWl;  Nm类]qvu97#@=Ԃ  N8!:Mf:IL6h UIVζC  ,Z ۷O^XX(}oii~[ ;w>Bζ'  ir+Fծvg  Ƕ*vty9f2N_ 'C9@%pG4{{tP/#99ov7 Q..VYVmQ $Ikh53{YY_>شi,X@^y|J}Y/\S/ul{@@ x|QWJDg># N 1类]qvu :'`sq4  зo߸jQt=X5xmmmHW LÎ4iGc,ٶe(D@$@\u,8q^Ňcƌ;Oq=z錼koLJoOnu,m$-@@ OstծRvb"" @ 8=U]5+ծ1E |sZD@1*:w|U"iVFJvS $E*6ac312d}vʹ?FMoծv'@@ #m|ZcjjW|.@ӯƏ cG1ՙʜVPXXh}LeXkՆϪDm $B6z1cȉ'h:`…2ζM  1 bD]*mGyZ @2\6}WU8OW:d/p N>@ e<O}82fČw:Ȳ:m[vB@@ IĵA;t@EELg|m  @ħ1EQWEgQvC@  G{Uը+ծ1G*@S)CtňU@:ێq dbdwU8OW:ǜ lj*C@xԣMjjjBvUI=z)s }ƍRʕ+CvU#G ) l;~" :2=]`TԂ2 }…,ZHTr|2f̘U{m:C  $LkLbϥTM5kL7T tƗ:۶Ġ@R (QW Qg 9T i%ɱ"jWꗎ"@HpO:9 " p`}믿~ضm̛7/Gu̩&M.] ޒ{hW^1r'ʂ t# vСҳgR뢞> _":Km "i,v+Fծٶ@@ 29yU] <]scH Ԧ-@bP755E}ܹsM?zucNN{!lnn^x!%uօ2uT1bDHYζ:  LLk'Ol3gٳT}gD8tƗ:۶Ġ@A (lUW]m[O! @ drl뾫ty9 ܓL# .f;8땧~4ۣ+vyLe˖ux\:o6m W_5kʬYLuY2m[2@@ Ɉk8tŶ~Zܨb-KЮݮ>를<ġV?YȌ3k׮V#l;b؀ $HIqUW]%;v'sX~…Wpy@Kv )_l;@@ J'ŧQؾQW Pg۶@*D@pJl뾫ty9ţ TO (o[9ãQ;~_Z>Ω;Cf͚%vXcǎ'7c:ێ )सV>p ҽ{rrr䬳Ǚ*^e_l;#E@Sg\W]em皶@@@Sb[]jW623ꙡ_ (**K^|E&uuu&yyy~W~ˀ,Z@Qx=,/[zE]$GuTEQg}@@׺\.9餓>+?tH|;89%/PtƗ:  S'HW]XB@pJl:<]sJ.@S@@,fe?s. ,͛7KUUQX 84zhҥKJ:v_W{&^Z9Q;w… e׮]RSSo.~Ivvٶ2@@DǵTm+_}vٲevMz)ƍ:Sg|mʂ D+4Kﻪvuň9Hr@lDǶwcjW\g*@S@@@@@@@@@@HST@@@@@@@@@@@$;3z@@@@@@@@@@@ eHpOSAG@@@@@@@@@@@g @@@@@@@@@@@I@*+!w!   ĵ~  ,SgoF dm&]Ɔ IH2# $?^ԋ@@t MG@@ >ͼsʈ@@ :3n@Y>G@@@@@@@@@@HSL@@@@@@@@@@@$;`        DK@IDAT   @*g~            G@@@@@@@@@@RET9@@@@@@@@@@p >           *$ʙ           Hpw@@@@@@@@@@@TI$PYY)X@@({V^^Nl4mB@'АAYFnwڣ!@@g 'mK,GC  hmmM`IpO 3 *qFQ/@@]`ٲe^,  EX@@Hw{Oԋ@@t =]NKnݺӲt@@ ={&L@@‹l[ׯ466V!  Б@NNRuJKK%;@@'A'.jNXhnn=G@H+D>6: @{{{PSSCl0]*F@|EرCvi[}T  @Gm:jm           $Kܓ%M; tI2s̠ļU3vهqEGS(^zu.F \`ֶX=Gyv+ݻw|;---R[[ѳgO )Kʥ^*ODզ:9Lv455޽{Cݻ$g!dR3XSJg.,,]u9\@͒?0#YYCN77_L>=a*u_~G'wTAAt֭QR\\@'<TWWkO' 9R <s\ҷo_}.<ꨣj-;6; FP+ `E}Ba*u)uVݷ ^=[uc*s7TӪ6 ~,?$rNxjD;~ T{2kg2ZoXpJp:㺰[@]g*]][o9K@WΒD "xG@}^o&bx9#g'u<Ϫk? G?,qgpۉzbd۬?P1Gv} 7p}eN1G]uq4i2pk?vRG@ p'3߰dRX!=Y]~LnU}9TX@vqm!J?2u%: +v"~&~zD:@@@@@@@@@@@2N; @@@@@@@@@@HOk@@@@@@@@@@@ HpϸSʀ@@@@@@@@@@@ ==F@@@@@@@@@@2N; @@@@@@@@@@HOk@@@@@@@@@@@ HpϸSʀ@@@@@@@@@@@ ==F@@@@@@@@@@2N; @@@@@@@@@@HOk@@@@@@@@@@@ HpϸSʀ@@@@@@@@@@@ ==F@@@@@@@@@@2N; @@@@@@@@@@HO6F@@@@@@@@m^̫7n{v].''56A=@@@ )$'F@@@@@@@@-掝r5Vlj>l4ztw@@+h @@@@@@@@ x}>cj`ї{}+*sY[W   Aw 4        8]Fش9,_(;c:@@@^6@@@@@@@@oU9=]--rD@@ $k@I@@@@@@@@ڼ^Qwfv^Qٙ*8@@:!@{'8@@@@@@@@ uUUNw坮 @@@ >(@@@@@@@@RK흻lЂZimۖ@@;45RCu풟%C '.fE6zF@@@@@@@S`}T5jYNӖ@@ z-–T]GU#K& K        @: Զ6"@@:#|>pїRVyrSݲMf2N~4}S}CVw!        ;˾T,W4M   zٿ;Ln@C{\ytzo_TVæ        &0ж! ..:EE   37I.wZ+oa)? )q        @gݻWg/?OFR   W6OˍVH'nI@G@@@@@@@H +6t岡&@@@ >/jke^Uu|VyfNա`u&        $Erň @@EՊXv6l =T        \[O,6S =`靗ש:8@@ |/۷Oji!=}E@@@@@@@ 3׬떮N&_3b]:(~V@@!ɶfXmꠢ @@@@@@@@hnoZ&4ĝ+W՛egp@@t tDnyWS= )         @V9wbYgO&U\$s"FE<\]S+i=C ς  @/lVҝ\-$ܓ%M;        i Iyc{3S&J\ '굵F-{<q\2Hn?zP   uwvUu+ݍxpQaIf$'S@@@@@@@@:%9Ųcҁreڦ{v)_2Y@@HU=ooNؗT*        @U/,6/\\?je@  i$I]\>4>drѐvT:HpO*7!       #0gw:ӡ,̙ph`Ӷ={${Zq54䈯g/#.Cc@@$ eܶb4Ȅl+LmB@@@@@@@I`Jrs幩䰒mgSi;"6Ja^ Œ3pqC*U@@#Ov]dƸ1՗̊HpO6m!       D-Mb|^Sk:fXQ=l -*2mSު*i~dx7oowYU_/y瓏}O}‰V{Q  @B|>5fm}ji0kwvu{}8Gwyf$)2\Kz:3        @ dCCÍ۟2Qzݦm}iyH]vSa[v풼N7m@@O*4¬C}z>wo{)7f{t1گ1L.6DYYvKrSA@@@@@@@@Y_. i #&D@oIV~'@@Ԭϗo;W8kO ,]rI~~}1J#3f}/0KK;}{K\:oF4        @@JʘF_z?jSTe-̕ɓ%{g'@@dYFY/_fUson*٥e1  (YV/tZ-甕ʯnj"K,@@@@@@@@(I/X$MNMod6mTiS>U 1q  Ⱥzex^K=aٳr Ipw@@@@@@@@ Kd IUKSG=DM:,w9vS  >lE@@@@@@@@#.^"24 ?_6YŴ-ւ'2CC=uV@@P?aZ^ڌ/r/j%&Y;$\H>]Huy@@@@@@@@ *eEܘ2|ߵx$k$۲m\.1E_{AKΤ)  Xa֮fmob5kxܣ.%_Iۼ%{R)jk_ψG#c-NO?-A@@@@@D x%( %ԋ  ]`>mԗ&M"o|t 3YƻJJ$W{8! d@1k#6k7b,c?6Dn=J՚}VZZTx׭֛$HxOׅt=s@@@@@ ԶK[ɛHJ tLn,پm4l;зk4{ 9iN{Z&:     @ܸYf]/<SuFr?*w_u +SKz@@ϗo_-[)0Ȼ, %U޽Ҭ۷o3U㌙,Ynۿsnp#q/   Ƭsm7JŬ꩗8z익]/r6?tϘqo٘xBQ:N3@@@@@-{WՊQA6f+:2qҁQN  -3~YV~aiӀ4ANǴ-Zi0ǰ?wN綯^%M?Mjh_^R40ɞ4Y= dW{5KjԥX6fm?$OjyEUW[52cRx}2tZҫ$K_@@@@@H3_-_ur{`hmFW[O@1?@@(dyyalM:}] .c&͜1cEJˤ$1f~»:  Zڽ1k7Hhr8Ç FHnfmo&? ӷkx>Hr;>ud\FB      wTʋ[u8_.=mqA  /PUr򭣏7J~s“ۍd /ٟܞ@@ kw>TfGHn۵oJhrgg"#]:$9Q:)ɦ^^"<\Og}fQYe9="2:Vmdv5_M@d6l] z _Fp@qo7vj{<2Gw'wǪ 2Y\_u>Sq4:K3}J󸶮^-\$ۚMvC8'Ƕ/vI߈Ϙ=dQ\r<:20;rt5NiP@ )} 0l#ɨ'?a#7E|sbψĆ@3d+}+>P/)w^Q/!P% rRk>@R*# ded-;*Ė;F[jx t׃?Jd; >UT     @z |749(zeyCR\o  FUƗ=0b@?_[Gk'VվeAN_TPk}ό5xo@p^b;:W͍O;ky`2Z9>`ҽqp6???)YIa> $%F%j;c͵s'w30fuS,OunīdF/TG X=K]g%gg" ԝዲ $|x#     J=i(U>" +A~`lnl4U|TyfDf,ׯ&5s{L ^/91@@<w:yzSy&z^V\?j\>|di=Y%%q=u`J%Dz˟_HǢR>ڸqӟ$^{|Dk}@@@@@TUʝ 4٘@@ ]S럹43 'FRK5}"͡Ku7Jѡ!  `!Invr;Gwc>h}E|SZ_y7^rmўஒ?< _~eBVZ%5sLիr)rUWĉ"     k#vK͉Mv@@b z2iL^;r8zU+Y"-UH 7I!  &fm{Zy|KؖW*tؐg|'}~R2fϻXI}%SO=%gϖ[& Z{9K%zr'}B@@@@@@#}HR2'uWrĂ  9(^kP%s/ `e<⋊_IСm@@2\࣪jvr42{8jĘx+wHӜW-#_ YIOp߱cxo\(f7@@Thz+ќX݈2QYbsi>։q}5M\FKUO?-7p?^ƍ'a$+ǚN͛7˧~*|geeǬ_:cd֬Yra     0f(R/m&'t*7)G*})_ǁި{:߁ve;  @5x_'kLRX(/6Y?ӥg"i~diVJ1 bJnTj  /iVDH>CECRrikWjٟ/.[O~8iҼ"۷Q[Lÿ%YҒeX 6_,͋8~g!SL߁6dS:u\s5CTTG}$_E|rG_K3̈́     ;q~~1SiF~阮]~}ꅩeMb|Rj<}u1r|6@@4PO`o0xjIRb$ؽx.1'w.7ݒ :vQ  /h1k-,I ⛍Y/Rrqpv=M9)d*kz45}3ۻʟ֧OȾ鼒wq{rmIGP2bBJl4iRf[ׇ.L}Q_">5|`Q3Ϙ1Cx yeɁMD@@@@@ [Z-Ar(cS3}e<#ezYU3}W%_tEr뭷JSY~=]w%/yw})g:     P}HlbfDNl/+,_.gORUO} ^,  ';V6 ,HhoXD,m}`$}kYYrRr0靗qx7w=|qU nu  hloK/wv2u_~̝:YvjfWAˋ'mm.%ŕoF  }iCfm?__iڞviǥ*].qvOy%2*}Νn:پ}OFql@@@@@@@FbLc"er؞z\l<;nh_R|ƣw]~   i$؜p,ݻTخ]E#Ab՗8[V<3=v_sl~! @@R^`WsܰlmLcߌ;X~4p@JŻB-~Iqq0Kl)n|x2vGh";70f#[nEN>`#     xW4fl_blh?ǘҁˑe`AA8a?Ub-+kWKΤ)TG%   2@9}"n$/'-OL E9I`˳G7-هL+!$C  :zk7dV/ ;(@ P_`I!<{/j@IDATl^3KOv{۷ Cmz?7}.a(@ PhXir-d6 D֎rۮP[*ykj%2vq[o]233el5 nwO駟vU(@ P(@ P(-ŧ0[&2WW7tLEǘV hI_۠# P(PyYTf^&)Q Prl$ۥqP@ P(@)p҈w1ېR ׶9RgSg˅q\8 U0LMjx L%KۥJ׮]?ãNZ0 +~Q֯_'Nx /`„ HMM(@ P(@ P(@ P;N4>NLеqN^bZ`L~7pFQ(@3 E)wcuG~ ۶-.D=B%Y(@ PGyPf)lu. ޲~Lo,cQwc"Y' "$-~ꩧdZ\r RRRdm~.!!?zl?={vպ&q^ r뭷(@ P(@ P(p{ObȜq+"!޳ov8ĵy˚0(-Y-&CݼYmˍ(@ Pj'Ph2c¦rlNX24a6+!ۥKq nɰ(@ 4 Õxhncv˄У+LCvJK?owJYuξ2$ܿ{deyNչsgZ iiTR@eG=o޼vQ-~UK]`T*UUP(@ P(@ PF`i^W)dtE0Sdl^ 0 'ڿ?(@ P@Y l܂J y~XK-ۥ+1a"c2d2(@ P_pC{\\T*[3ݺ"VU~Ϧ.&5*7wݠ6֜@H?׮]bm1zh:̙3˝UǎƍqyV+(@ P(@ P(@ PVYex)=ɇ-/h~~լ&mF>]c~P_(@ PS`Ȃym(X=-mZaNnЊ*ƹ"}^Y!W! zVP(@  <(+RNd=cHbxiHwXP1I<Ӡ3ZF $W^qt3f.4Æ tÇ\^7(@ P(@ P(PS\qfL,;|j6/2?*2K4XwlYr}Q#h{?|E)ӘӇ)@ P:vE<]قu벣/́=l"zVP(@ o)y֭teȟʖ{hzPEEKK $3220Θm_w~/+){}ic (@ P(@ P(@I""QCT#[ۋ a^ֵ"{b ]u͸W7mnU|MÄ (@ P9efdWrؾy%^\K`J_{(@ PS.;.ufmֶdΈyxr?7_몚a^bksxu(q\}:L&X~毾*Ui]uk1c_u(@ P!*zFf?(Nd|YdۺBT>'2ܵCĻ2z.Q(@ K2烗[O(_RYhPZiݲ-!ۥ0uem@HwyXbEՑ/X&L@ZOZ K,Zfܸq;yݻ=H@ P(@ P(@ Pm6,=DPzg`" V|O oJRWDGv`D (@ P@xXECGdn~}08v nAE n^.ȣ (@ PO&IALtvmިWMCsW~+bHua*** A={?˴0tPYTQYY~?0,^wx ^WTc%(@ P(@ P(@+`נ+Y8!2*Mu:!w$ 馋aS8 | 8臏VdTM% P(ЀNl"QY1?Ѳ6W؏+jD>.Y% P(@z'Ӷӊǖ5SlJFo:lwɇ(o!WXSg!޺ukL8 .(,,ԩS<{=)I&a w:v3e}ކ(@ P(@ P($Td|9=GF"eƼ} Qں|.MktGY<"*A'n0P P(@8TQ[7np]b񀾈|Iѣ NyC9 ځys(@ P^ H3 !x0ݻHYMa`Ö㫯(&QsnÔiФy2Xٳm6lݺF$zC=$[W-ꫯdR:_W`%(@ P(@ P(@ i*E`LY?}hHio"{{]0/_ {v ]5k*B P(OM[P`28E^ Q n?핥S n<ھec(@ P@w؅>w¼_"nŲ~LĬIEݱ8}&M!ެY3~m4R> Z :R6h15W111quUo6R(@ P(@ P@x E`ʣxAd.y0D])-Fle,2݋]vGB%{P(@ ǎ;P)2ezŬB*'3Ŗ+2? dّ0Lmޞ\(@ P7R2 Bő+<)-(^a¼cX~Nq!WBmPR!.T L_j}Q[(//8HsmAW͓ :u–-[MII_~nݺU (@ P(@ P(@ /l2F7m׵ec^t1#GAݴ(@ P#vVw?^Cֈݻ6^-Yeg 3<;U=m\(@ P7{D"k]EG^=/.V9N<)DLAm ) pd/|IY999Dڷo#>>]tAFFUWAw8p@ P(@ P(@ Pg%Ȁ9@:zetۛ^mmH0D[0 ?~Dpx>BkS(@ Mk>,͓6Z;gm| T8Htޕ ςP(@xyYx%=VkRviG:!B#-Wf4 "ݻ'YA6ٻ!(r.1#\z5kyDD Z +S(@ P(@ P@V(p|Ȅys֘-# V ZU+`fٯg/.>@ PGj?nA/]Qa;x/+=w/#tY% P(@z!l3IHhgޱMx-kVôd5WM07<8 p?#9OW(@ P(@ P(y}CՈq[:6js`58Ja+X~X|vER`{ZG밁(@ P |+u9]*t&d@0dۿ/vs,|QhRKUxG‹q}2(@ {9yx|^Y0Z~WJrЎ˺m+V>U1a۴(@ P@x l)>i;v!\@knM+C`^ pȆ+%1}/T#wKJJ ,ٳ1f̘Qv'w ps(@ P(@ PӘs0?Q IhG;G܌'[7 g8~UC7ltJ>g(@ P@}0?+GI# U @UX7o,&M9 EfK P(@!`|/k3eZJGYۧ00a|{l7?4q|1㠿~5a'+YYY;v,YfK/ Y"|MԱ,6eʔ)tv|r479ζH|W:|D)y7onݺaСhܟV?uq8>(@ P(@ P2(n|C$3o\lѺc;˗~(wAu]=f  P(vc4#"d`>isL vPU\_I-<@ P(NYH2Odm0Vٞ!^eEm&V@@###O;\ׯe] p'q%Ν;;`8}Ǹ`ˣ. 1vUk)Ʉe˖?Dbg֭[/vfo"̮m V?e\=O P(@ P(@&)˕WGuWG5k l?i\He=+aPEE^-(@ Pa+P ߶q Kh|8?ZF!Gu0̖bzᨚ6+=1ѣ (@ P) =dt/;G^ƒi!%lKuf'oJ.Ӡn/kcE $]%_¨Q6l_A;wvfvѣ=Xo@v)|…شI>UFL 㩧Bx:e۶mxwϹ )|~Þ={0w\TG[ : P(@ P(@ P WL,?|Dq\NiPdnbɆYv=qYw  ulhd=XP(@ 4 q(evވ$U-Z Q=.N P(@$؅܊JŁ C.-7W_C\.*0e4iM\GpwYয়~¢E۳]MR`*5 [nHHH@ƍѤIRd2{W}^bj &`̙h>_0ŋw߭ 2wl^K.ȑ#=\ Ç:k,ē, ]U3]eO_StI 5fYG P(<x%#S֩A${OO\"I w.ԭZ 8  P(@(ɝYS<}|V2dU 竖~ϴ:ӸN P(@ P(@ plxWL[YM`{(g`I!qQ^_wRwH~vs6P(@ ͎vʣd/-bem0%?unVdnY+(@ PG`maܱDBh2@ҫ:DG)5MC~+Y7Jo *FK Fr7o9+d3#{p'%i)] &-^Oә=ݻ&"|rUjRnF,[ F1%T6l |JQ껺PWucf(@ P(@ P@:?3og砼ɍ"PZ*Fn MdrL/rMGo?밁(@ P~ 7شO,M}8ڊԃY_Oe]ۥ PEGXA P(e"=)8Rdmٹ#II!a)_{AA҈wC7h5VN5/bH?믿iܷ9m͆aÆ9.2DDDnjizn Om?|pL>^{,]BѣGqĉHݻj77F^:WL֭5\#,X:>CE f3(@ P(@ P@ jRqWiiu+hō.Rv ?C r*!FC{ B @@ P(W̲r߸9bzraXؿtM]6}U+e}w@ÏB%fIb(@ PO_ 8\Wc8i)&ڥvr. 0LMd&.s:pwv.-b͚5U?RsmZ߿UP]WE pnOHH#j(Hϵٳc:uX>ӂ999Ϋ qU3d6Q(@ P(@ P^ TsZFs7%N/7/kegpM0Ld2(@ P/xdqB^ѶQgm> )׀2هj L:ve;bE DpcyyGRi\"*>܃Տk 5} q-^vq&йE O1}݁fky8f-w&n;۴Blws_ ;{Dd>r%k ^KlW

l8U^|iN W~? {v?P.}`Wt.+]睮WeѵoG0B0=ƝV7aAEõCVW VuVoX8%f\!*(qufv/qY?~|B-?>vT552׿`?]c+YrE?@ziw鋎w V?i95{lCTݘlVjڤ@,t_Wׁ834ghpTp?~/ \E6\:>n8~e678P9]l) L'D[q{bs42D usOGUTqDc;TJ7MĪҭk0]5̖ut;r67J\}H7 9B糨# xW X:"&gd#GQ+bmA+} maVZuR~Z6:sӺ^k3ƚڷt#X>6} |_xQ?P:2)nN)v.ȱ);BTo$A ~j2°|)twסR|50_z9č~dk&=_w_2aP/x_,:w#^V?cPWMu(@ P(@ P(R`%X ۳|\7U<w$% N l*)~Om*)ۥb&qޢ5XM P(PvcZf}x24.Ok}g>:,=zx-SFz(@ PA3N,@8T>D,怘ht3(CG Eڣ5jLcou|=hīw7j-e 468+lp^~jqp} P(@ P(@ "ЛG!R>ۣkzYgtfSt}7"~A5=LC=(@ P XSwvL %w'LJYG@w[K0 vl$(@ P O$j||/P|8Rig-qxPuF$qrp;5vnlD*1Swj&e 8ƿj/4-W]nFW5} qt\(@ P(@ P&3}EϡiE` MqwR"!.կM %nHm;J P(;W"m`8 zAOKCkK0v +(@ P@rF<y5ݐ+u}R(@36mUpkJMtZcETl90 =~l*)IMs{ `Oh2o-(eXV?{)@ P(@ P(LM"]ؾp1-pTẕ%eng1**[7|$t]HB P(@1[ffi>Mh.f vq{/uW_[nճ(@ P 8fd!OG\ztC!}X֯iBV*Na4jl+ao^m-M6ӧ*MՖR|7tQܥ`#U1p] P(@ P(@ K`۩?+dtõIxDwi:S[oes{1롻z(Tu9.Q(@ Nq֍[qBdJ.9}z"Rn /΁=#]֗aw(@ Pfy';;ӨzĨV-y_ ' z񰦪γʰ`{|TsrrWj%77k  7~Տj6TUs% P(@ P(@ Pٌ EŐM@/."&ewi9vcF4toҸhۿK}ơJqD(@ P.Ź}[wfsUU};K'T"(Q^=;Kֳ4+Q豲zVP(@ O0ܡtS:`O?(?,w m@ ^P^]vX>ѣG=VڵDzk!Xkz(@ P(@ PNxI.^ntqC$/- 2KQ'_m"cRv=Gw Vb (@ PhR',j\ֳ!HKRT9@?Y=+(@ P+ ]WC$1i[ä%3Pvk(9%B<ӡi[7ٲ",߃2;w/ݺuS&X(v^Me!(@ P(@ Pg0옱k>RJ0iN,smZ"^sQVf⋣ n>i{uϗöiq̚AB?j4} P(@-`w8=NN!J<,v޸\bTqnCd䜝H P(@ 3gAŎ,k~iH`$δySaԿhoػw/L&"5)۶mXW`1,j0tB P(@ P(@E7n&l,gQ@Tn/+s)mXL1kb*\)cf:sX׭D 7cBݲUXO P(@[op@G1`TOBg8*U˭_}M0>(@ Pj `6H vඊf8 {º^\U(a#DR1PX(pn-:7::&&bw}W\)>##j8~S7:Q(@ P(@ P@&= nw6xY5}ccC&^RS1!X3]ӭ;"c@IDATȩJ P((p\dF" /bT>7K1=;ܮ(@ ԝ@b dAp-RYO)GF"18f{~(_|R:xZ7nzGBq&Cu\5;ס(@ P(@ P"|z{_hoD ϥs݉OtR4D>/Dx sS(@ s}Kqͺ uHLh/$A {Q*p˗u1.许RV P(@(0p l}sGݻP#Vݪ=4}XAsО64 ?999?~SL/MiD֭[ڢ0rȪe7gѢE8ydڴi)W ָ|z P(@ P(@ K`΁tʹ1ј1 $%@Rug3)$ (.=>}} P(@ |lݎ2ͽvmt.y@d|^dn/,O‹=D P(PgwsQa[REfZtlZۘKg8y.H\'|Z> NZYff&&OI&wސإ={͛֕s=>`zjVOuWՀ(@ P(@ P8f4bS)칅];cD lJZ~Y˪p=pxIz)qn<ꃹ`InޜK9E P(C\\|[?˔]娬`۲Iޗ8ՏXC? 0Ou>};{W5C3hÇ;ܫV7RѣՏbT긪2(@ P(@ P(!Y =bl,&üSyJTqqЏŗ@%iP(@ P&>kA!KZ}{ahRwSЖGEp3pzUpdh# P(@ex`r^F&DvQ0uK6`sΛ 8H0i*]ɚXA ]{K)..)PVwС&Rr^Q.g0E`7\&fee=^ Qy`saȚCu\(@ P(@ P EFFvuNnӧ˕o,nWBJ P(P{Jq/|*lz,bڂUa?r`$t P(@j&3o E΁s zV%txC;Ek80o> f.v)0Lux&.S!^ZZ? ֯_<)dYsw <.}РA?>liu"e<ѹsg33kP0H P(@ P(@ǵ<ي59NQu./=GE3B/~TU|C P(@8 bcd`?Lm, bEYd9Yj\4(nL P(@ P(@3ċ *Ve;mN]>#[(@ P(C ]$)̂tq|3,1 =+<y86< =zzs(@ P h;8UbCo{Ox*bnz&̓ٮ8N=Eb!&ȊsZ{͚5?~<;V-Z=77j;v… 1a„&N12$TOm?PWmS(@ P(@ 4 ~;оqMHNill۷^]KqM^-(@ PF`]aܼ VZ۶]uUl"!_"sbvzͳK(@ PA?%})#NIƤ++fnV.) O`s)PAfMqщ}EwaJ{~-7W_@ֹJĠ&?Mj@ϟ?'O]Lwp6EpQMm6&N'Obm\(@ P(@ P( =47@ 8\i<\pǏik?uծ=G:1H P(@:v!ϔx玘ھfK?(JϾ""#tY% P(@ yؾA*z~[6Ź[MJ>Bdh~µX֯iBbSg&MIpŠ+R+WʚR~PR?FN]+(@ PY vGeha'k fu=JF"}&4:xTs(@ P pK0`:?^m'#3:}tTշFS0>v1n.,kb-2=*+=K`tܹV.{Ƨ~ua(.{jO>kOL P(@ P(@ P JN֍[:] .-DF}q70>nخ:l(@ P@Mܵm<=׶~Hj䪪W뮝0{YhT4"gvqB P(x܊ t0U 1sGtmAX6n|m%d#S5Oat)aE] D]tR;/@l˅^_C 'vOoZd3b(@ P(@ P(PNb܆M8-=%fծ .=J:DJ˚` LigEKD 퀁>a(@ P$Ár3 IHjD?6"K*y aQXoB11"qþ)@ Ph0DB00\WYS<&Z^[VӇ685={IPr @Hѐ%ݵ=zgwСCHNN P(@ P(@ Pu!!NJbţZ-لZ >9?lBOXWTFD_]-5CC`l9'vtFBwP@| P(@ 2? ou_5%"'sA,b;pTH?u]q"g JOE|j1 (@ P@`J-V[Y9(WFk씆\U ^X㫯#?Hq}XC;;wK(诽B%Y(@ P(PEOܼ ?(n6)Uˮ7: s{u8nc=Lo͇x5<竪iS/=@ P( nvsVS^a!* tJňIPȆZwx(LFn B$kcBEKJJ`2}G-Oz>=T> (@ P(@ Ph" qh8`>4Σ> `Zt#DP"z " P(@ D]{kk:5J-~Ƀ no` Rk] VE eV%$,8(@ S1g#x`!Jsq8-nKnH ҐƷ߂m&9׏XCh/'nL,{]ll2(@ P(@ P(@ ZlXܞY^ѕV\x_\G`l9lnrF%ƣ|7:>cruW P(@#|0Dn_#L';UR qI6VP(@z&a΁ uTCf!w$HЋQT:r k4ڮm@ yY] fڥRQQttɯd۶m_sN  P(@ P(@ P % nK<:R} W'&x{^Xa]VqjZW1z-[J P(@Z dcgZm>,>:J9(uᅤ%T-[!ǡfr= +(@ P x;K}"J};>1:9`6XE2 <ӽ] SA,>Cb_8g:[#ش7J>\u06mkIL\P(@ P(@ P@Ŋ܌^7fTzİI>w aۻ'!@դ 4iURU+ay5`\Wӽcn&%:l(ٻ8s-[wl SL&4$ @Bh_ bS{-ٲҶ{Fdڝ+V<|g̜hs@@&]j·4Z{PK/ڎ٭2-[  ^={Ukuaa@Wu}z]ZZ5 q+ףv;~Ur)45FOpƍ9s|g_Jsb]wݥ}֍J夓N[@@@@@ >|>]WZXXdCCܮGJ~`_S}K՚1?zƏlmR[o޻Ry>pDLb  K`㡒zm_y漶1Jk4B/vg*Gv [@@ |P?1 UCw[VGw}TF2ƃ<6KeK3O_zRO:^G&" ?7lؠ1cF?#M6-CcǪGD [@@@@@f˿F_5tq̘ Q z| #%+ЭfFw߮HnWIՉENn2|w@@XxX4SFi ۪AvIp,ΞqIn`} 4fK+5x38~}#3c&yf>=;ڴ3* Є"3Pݕ#<\yrIR>C]ve aO0!l@@@@@ e&窯곽KZ͠FgH{7'ołfgc]H2{h[vx=V3@@X 63 ŪI][59^_oVuc#*@@5jaG;ڿȮvXyZ2Dgr8IV"XF $D{zz?T$KΝcvmzmZ'N     "}۞3sc^yQw4y^PC3Z|'BWGJ;uT(@@ i"Jn-cᎠ5!E+Q(p#XF@RM3ۺ]+o}5,>_g /oTMQ !-K.D>{/?_|Ai;vlW$֭[pᆲ8ZhDӧOWZZ       G^5|UU|?S`횪Vڙg)h @@VVb5WP\jb3I9ja-+nIz߶k L GA@2XAWyã۶1tyfOϬѯkW_Ա7$@Hwk*ܗ_~Yw,YFj1bŊ6S+T*֭[HosΩzj@@@@@z̵̛-ћ;mػn7WWxչ3vJ=rddn[F@@7/\RvkguVuжk'ʃ6  @^=aܰIfʪʰV-Ss PcUǐq  mɑ)run#@SHw Ezwtj1Nu]1k@@@@@VbmKm_ oW +hbQ\Cnh@@ Ӝ ߾t}_JnCwz궭i]$[I>g5lIE8'vL@h|>=q]IJ3&rZ*볒~~:\Q,HJJp;uy<@5Oi۶yy5Yu@@@@@: l em˺w#ի#Cu^v$י @@j)̼~LFl]]8QErϾgkr8IK"  @B xL[4sz5WUzdf~}.4S u,C}usΕZOdHȿR{&NӧkΜ9*..w.]4yd]wujٲeee@@@@@6\RϘ8傮]tAѦb Bt5،U@@v˴,c۶ї;7K5NwuqmZWp)h-ZM}ү7#a\:  ^3fЏ֮OAkNtM[w#w3a7GԘE2bI& !^zi̙{4|}gZ`vء}iZ[_ݺuqW5zh2UXW@@@@=֘iw7I,GDGqi@@%&I:~*ʹJG4cء_C ٺ~=y˫]>AOGlͤ}ү0m2@@p@0W5k_R^Yi]Z&+zt+D[ԜΒvAݓncE :=dqU|b"    -uf A\>V:ڴS׀ÌIA@@ ^ߘ-цC%QwaO:XMBU4}X۽GoةfDV" 3 ͨ(AWY3_|ʱ+ډ$d  o}ju= ;f˔];O{)˼^UKyx T24#XF iɑ-C@@@@x 2V{d994rXu T]cV @@NhfuGI2HtV%X^.̇_ĶiٗlC@HHvֽ&}qс*/ӌ~mWvre**<'3Зv3;h*g $'L@@@@@ Onܤ߯Zck#tp٭[j&(eס@@Z />T1j¢[׮f7dLɿbSN:Y_IrM  f{̵P뵪t5o/uHOj5U:s5fE oY)A >d    xvb*[c۶#}r{-왡::M#3N۲  Ew/[R3{dI7wѿO(3dǣi(~ziJD;d@HFkvx\u[>꒑QzT|_}iFn\2竑řSISl.e 棦     P_m٦ۗG}\7o֖-[c7.fm    $?Km֪^8HerkٳsUpgqC!@@;tڶiI<|@?R)aRp6ڎ'svmq  @s((Vɫ<]ۊGi\;XV"U+UcFY1jo &GVr[qĪgJ@@ZzhhsKKմujZZF6i]bA{D@LI~l&=aUfʟq9U*޷ޔ5Ivw\Z_7ߐ df_DR%i^, Y !ܭ'N$9'w@@@@L/Qy <ŧ{Fas>m*1M[onW_!   !AݰpV,vzh`uHo(03`AŴKPڸSlq  @s(1 ޸YoTaCtG>Qr8p |*{QFӣ:D4 J{Lb%@B$ϙ3G͋ꟗ#Gm۶6`ߨ;"    W+s_4bjn^;Z3 9ʸv9  @lf LV׼,f_+GV%r`^$i;+QO  E\|vM_^ʫv73ǭz]"T'6p䘙;MСC,     X^t@~f+f4143ؼ.TeL*gn8K  Pmu*?i"$ҷ0jg`.{aJn{\X@@9Mbk;tp(|ocGػCfJt˳W"]nsCPc, ^Wׯ =\DX@@@@@x >X?Rey$k]9\es,ۛkWq@@rM]\ožY=bj>т* $ 56A@.]$8p}edz^="SHԖ$J2տ-ZX 55WPʰ5݂hޡCpqLfC!    q\Rs|]eeagMrֱ'j>3~q@@@߯?\7Gm;]3 GOĠKJiϷ   P_oLӍh㡒M)WiQ1߼I&]/5UIS2tXx%@@ IV8{͈z*NS1kg֯zdfV x<[l{eM@'[j{x/^a;     @v |-&ɽrI7sGvm+bə%3zfO]/A  @|YAY/0hk!tNζD7nPJ%3-M[nS,! I(XVnQm﬇WZdWp3RMȈa[5'!DtL81}ݰe@@@@@X )+Hn2$?}С}Lv03Wzz@';:vRIq&)  JJx:oǷoO<%[kFnǞܞ =V@  + 1eR'&dk1z\$=6k4dZqv][1;(B A"OנA#zo@@@@@ Vuނ/$T..đurn:3~ kѲ2!G6'  P/g7o>ӢvY~5^:j:gm^3/Ɍ1N L@@z e+4yza6hml6z9Ҫekklf<ɹU TUѐq˥^zIcƌQIIIŮ'L>H}mCa_     ^]WZy8H G su]|̜-M}rv   @vzT۶Zߘ`A׮Uppi+ݑrZgy|XVƝ&{0   @Sg6k g*yf&9]:iԠOyz;_-Z'޹yh $T՝>ZǏHju/*B^_AG@@@@iX7-طv?b.kS:G'l@@@٫Iju v=*뿳G]}5M#0YzYT$;"-[}]r(  @xe]*ɝ[Ef5W%^As}Urwas=g-ohf okۛ@wa PCE''9,,CgF8T6mС{S|4x@eqqJKKc, P1 r.UOm+J65EK7{Qj~zY9/z|oΧ/6:h۽7NRyV/ۡDYK5ԹXaNա}:tA[Cy @:?$;A'@gf*1Yn7vѬmZ>s];뢎J39_1JLOwo|vȐ 'D9 Ơ]j"9e~qeffdzcG0I7DSuں@bؕfi 뤫ls@,sQ)%e?i=t5C綩 rn:IZc}y.\[W F dڵ;JB](יi|'usrD ,Qׁ/*\GKK 4X3E_C?'uoiY7FCB X_X#{>cFlf۽}d4٫.1:jy6m4EGV@\,tzSQm†8ǴW~?!Q]k=c՚ #PzZhx3ooޢ?qhߡ s~wyN֌ޒ!.Y$s2PIg/ wuC/@IDATVVߩW|UXfgg~+UqCn]s] * ; si޽Q7|p 2D]tQnn.Q6dU_xqdd{vv67\.d[k֍n͵E E ϚwC(e%1~ͱe<,ڹXC =::sʥ)!_9{*pLnpQWAN "cCκ:iR~'Ab<>JÌ.ylD7+Se˖ f3Zb>Զ7aC\w(.. 4 Š8hWS;wuA@3iR-0P65kPȊZwg*[pU[zջuD6?m$: %^CPV]CȖm%@(9: P0"ԦN<ݧ?^ϫ8t5O/u`GנW}Q򽓔~ra`fR9ߑфG t'Ԇu!*ߣ! SOt1JA@@@@j"`%z߾tum &Y<3Vp}Pno𝳄  /ٟ.[b֝{k޺|9D-އ}3*  !"{ܽ˜]еn[]L=K<ϖbNMB{eW*{߷AHUVu6//Ooڶmg@@@@N+\V*w{˞|\U+Û0#oEyq@@^3K;/;KG ӐV-'Jпy6ܵKV[_Fu@@V,}fSu)5U2֫5شEA@)ˌ~W¢j[s #tLгU'Ƈ양Lby]Eb{Q^|}_Q:T]t1uG@ ~)hZlYEG>SyW玱!    $[ko%V֭Q˞A3SQPyWYzf [   =QWҲf~-7InwvM:t/Ir  k嗖ָ^&wh9䘑ާKw鬒Ux~D+'(cuD@ bwr'_x3F%r嗫M6:2"    @2 X7&-Z`DLr{v,hM'S`Q}ܓյ[x%@@Xw,](;7;Uo %h{U@Vg(H 4@\Z%gYYѣ6-rzSw߶vJ=x[  >ݳW-63[rQ.!cuk>M컵F4hs_zѥVK @uj~u+͌;h֨Y~^ h3B֖@i\$G̘T$@B$$?4tڧvYٽre+fKP\QFƟ'7_˿zWmRFC|>in[s@@ |T~gs=*y¿q<3Vp>r4Emu@i$D{Ӡ(@@@@@!_?J%fʥ;]8zfdT}`>mIg27@׬ # @sRRs#AfĠnj҈֭bNSk~ݴ/Ucmq  Wϧ߮\DEvk!:}M94}/ir9^G@h@#&&偼=]ZZ}`:T>7W>ug)``>h$7OG@@5:Ͽo Є^y5چ@HfR]E<$67&2zƴl)'SO  4_ƅK$*fƾVQr0hcy.n8ڴ{Tz   %TmԳ[qbA[n  3sMgx=Ye T$'Ig@@@1 j:>kJ_ۘw  @mFlK*4CsFqqӿzʞx*޻FTeW@@/kW|Yr"KԔ;wJN{@;mq4I@@1A3foب&v~bzb&صMͽFj`aq+U\}rdd @ -}ɒ%zmb&LPnnnX?֧~w]>  4߯\`=i]xoZ1) MOܫMP4 Sss*c>PT҇SdC2.tbL#  @?ټE13y$LN5C(G*˜IE?! ,Loؤ7nzgϬLMKwR0<7H}\VkYMMD3iFp4@57;L;J5_zhqKp_h~_x8 [￯{Ƕn<$S@@hKJ}w eOz#  K^.+-?p0Y+=zM)%Xg tV2)G˖q@@G-տZj9_훝&}_k&(uD@@8 X@$?iJ<ڵ5⺕~arU :w Φ|m7hVmMX3 ;U}hN o=h6Ȑ'7(eH{Hj's   Owl Cj{8$n# |>]lv=m`Lb%xfT`hLSncw  @ @w.]B3rddf$KޯRX&,-wE eL"W:"  @'hVr{_^&=jCrڇ۪U+D_R3Xy$קE@ J͍˿F_/콃"s*l,oڌd/<  @8`l^޶=j23+Fm?M #*e;IENC  "s~IllF&mB˺wKڇHmed~ב9LA)@{5  @VmºJA@ ]B}w4@Wuc(?C[Si]Qclq  G={5yRm7G+(;bR:yfLS>Òko$GFf4b  @L{eޔ&ѝ{=+#W˞yZ> LJ=,9{ 4_%~ '^b\p b@@@M  jaaݹKK1C!@&+5#Lz>ibknSO  4?^7lii6lNMQ˽Wٓ rJ 9H=B@b'PlٿMlߠjIO tUJw9cwԠ͜ff}J:^G@ܭDhф*닂  $L8όIjg.1 ĺΊu @Ba/\vm}{kR^x,U\F+ mq  C`YݸpVGi&>=-j}__y1˕v):"  @ u?w]Y^oۯ + Xl=>"sz-VlT]gf~`2IlҩT_|^2}F1G)ډr#XFf,@{3:   l:T(f{~y%|X-Am@I hn[Ll+uڞ=tx,y~49GnGeLM~熹 4%%ٌ¨Ӧ1T=23'K0PT$όi _g뒣CNKr':N@L1v}%Hl=Bzc}@qѷX>i}A/Pg @H;w*{VVVVhޯ㏵bŊ5khr:q)   \ĻfZjkw$F*-5E ݞW6q l@0 4y.[l{32f%7kJ MFWjf8\е2(2IX̚I +fvr䄅Y@@Hn=ejfE+5ی>UhI-Z(c$֯cS fC@'Pof֮OՉ-y5&yjiFo$o2yf?"0CIS!9:K/@ . Uj477ҷoIp@@@ 9 ˽Ќ`%kJUUϳ\.}?Ijոjo r}GUDO٣b@hZ'6G9s'=[/s&Z=]?w$3adI;|0  @&5m:m]qyuc^jm$@[o}yZ9ӓ",Oe;6.4  /_RvZI;5~ī(;5ΌzZ߾ҜL1-7h^p M/ݻVu@hV3m'3^/$ߧlM i@@HNC>~bͷ&dۭ8s'ً5Q_]f9zc# Qg@5-Uiۯ Smy %ye=|_|n6vEJ;:" @f[oٺ@6  4uE*ڭ8XXRjOш֭4M}z]z`* ;!-[Nu"Ha+ @eۭWe\Ni0Yţx[7^5zYJq8@@j~ݸp6DO:(tߐAjevd :$ϬXn뚣uko*WϞ:  @]AiXs1 s}4oo#. M`Nyf>(')e K 7o7|s^:ly)ڨa+fL7W\\>Ls̱k@@@%`Mq8>Y o k;3qEK@d|b*[iVόtW|FnoR&rq ?l,=  @ 5Y/1E+3QGs9*5fʌY\G ,e@fNݿzE95tn]5Ō؞LB}oNo_EdI98_yI2@ m͓wJírgUV C  VZv6I;IU;萞q99#ؾ}ܒ?q@Y-[u.jZϚ pY%%&> 0ZdLCs@A@H^R&/^y{Fu>:{PΎZlI/}M{W_NA@j(`%gkW:=$ߵnG]22j:5E*1MlhR&5` Petk=zyXxUvرݻw  Ngn-ط_VB5RVsaVFOUljjz E_;tӢtvPQ"5>><3V`[čto]A@h"n/НKD&魩z+ŌJ̌أ/]1i\  5̰|5ZfL~.Vb{ou̬j5I"[PgKfKom*@Z NSa1BsՆ "j]4o޼ꮹھnhMfIp5jڷo_ۦX@@(Pl>ڵ$\ӒanTߡNѩ&]ZZM7e=@aY,rg0{$NK{k$msfDq@@Fϖ+ )Fm? \J`^y~HͶ.;:uVhN  PvYk@[ӥW=Hl*I*_U+/GQ'*H;%I- %\R% Kp+tW>   tvkwv'f*ioDr\u=koOP1R&=LLA@=Een`|Og{Au62l-N@@ 9G-Q,j.U4@Y) v;q4dпa<ӧ)XThۭr4YFO@@ X^\FU5Y>̪\RrUKKg2k/L3.:Mo@_N   |V .]s{~RKڜhWcM+Fs5L    h,v;&⪗vj=)G2oOf[ī_ B5 I|'v}a:jgm࡞=%ŝNQX6.=ݵУg 4 ܛ:I$@$@$@$@-].9tӢ"쩬 jrlpFK~q֜  @X*X!fahdJmJT6KSqę0]u& $@$@$@$@͟{jl9^3j-"x2a}m!_tE< @eOylQ^%3`ZZm2vXk`>33[Z !)ScSMDu'$@$@$@$@$Ќ TlLE*Pz>Z(sl60HHH?U}FWMOk-=U+䈞we3l4CHmgIHHHZݾPPu/Ym[5-v-^ʒ!q{F GFSxNݚ'?]Ry|IHHHC=5Qd!Wݵ3q6d߷iOYuGK,:R>HH7)Q\#)HZ-k9c*\sCnY& F!@{`JF{] |w r|G)݋ %%۷/."GH+ @   zxsPOe2cx g%hWv/ ˒ @qeFJĕ mtgMCS晼̜A     KڊkaaQNM3 @8j,U6g S #F]Ompl w_㌀mX^~0gg vM?7vں:ET_/c޼y.+0g}x衇;b]^xA$@$@$@̀@l\$ ?I"jO"j3g @-!hq{<-YϾuP h95_Uplh@m ށwCxE$@$@$@$)J>y:Zǝ ;)n^Y9\tUqÂ%  Gg#[>L"/Ⓚ~ě~ 8? @4 N4i7V\YfEJD>i$/|_ӦMCΝmP^A$@$@$@$E%2Sa EnɌP-=[犠=O^s Pѱ UU8`ғcSo̅mb [oo?M:HHHH ڰ ,aƠ8Cƛ9D`Km[_8TmSHHHHGa8ɩ"hO;-~ 8űg`_:2L{ :.'$@$MGv=k͚5.5޹Ӕ)S4<2 8ݺu۱|r= ?0^z%d4BXmW @~3ްcRFt3F$@$@$| Y,F{EiOk.OQgv gIg @#aܳj vWz9=}[_&%.94]ץg9dߴU3*k.1>h0HHHJ}n t$& y:-|_ iM ~H$@$@{4iGYSdɒ>Qyd?9'l2FΝ;믻\nI$@$WUB}۫,rؑ7Gr+\Ҿh͉}'8$B/J\ĆÓ(RF`t^F-5?B8m`UBKUIH˯@4  hJGkjpe(#Os6y?T$ 4{&r! IHHH (Gsڊ210=uhd)cSrʮxlTגĭ |fרO0M.n & @|-Jo݁EnqIFEeVG73yǏ2Y76T"*%r;8S h"TS4x+!+kދ pyNMWo:_b.|jjj[Jv & pPlڊٻwhqCQM[pgθ_~<L❀Zd\XTaA5j/. S[ 8J(,:TgXۢo`x?YYA3HHq 7}=M`>w\VՓLyUʆyũO/     P*bmڌjذUK:Id?KဤMXU_'geC@N@IDATe->M-?Ue& gc @'N┰ͽ` "lݻҶm;%`߽ ,-dsdr 4yL  $@{Sҏ$ 7܀~B]~4i.=&xRR Tw$Mv8/vxo_춐b]!5HHʂKcQoqWUm}Yfl_1@'ƀDJؾ N-Z 8 /ʐ+qډ??G }Ff D\%˱H';פG2)f= gqw"Jz!~7zS 4 2_ml̋ܺ|DGP.w_Sryˋþ|/ 9IWomSHHH⒀ZGfݳW"x;+5EXpl6  ;TzYES{Z2' H=4.%nn> N;lÆ ^u <F 9ngjBr$@$@, [DI~)N?4B#Ow㳃.Q{Quuȝ6dYPYc(zTtNng )';\lt٭飮M[$y  CE%l߉D?=%ٵyvm)ls8eY_ /FIb@ Xh- 7z$l^dwu[Bʏvx" #uoV'*q,B TG5vWI:|;du6zBUUʐE+~< 3{65"}s~W H) )/g"hW7=VSz`taPzZ78.l_O 5gY)vЩ m+' hfWq3|{0[LoOm%]!q}c<|.o2IHHHr* {L"oƻ]96kLcni< CA8'%abC;*n>voP,Fs_}t))<& @,=ߕz9^R1ն$h)aT BHA>b#nP gD١eZ猟~6E/H¢"<ԣk$bqF=E A<.8` ](FE"j- [TrqT]ztEk JkhT#'"h}c=9dlpߚuAM\{tkq}fT(+}L?p~qs?-7Lu)ƶ-*;UGN7>s5ƫ6D9/iv/?g\!e3# Ჶގ2[fu+𝶧;Ww a~hx2Q2bJ #=kyGlk)_l3Mn GDxE)Dsgcp1:}ӫ{<b]#F[~ 2UDHMajq@@?hum]<"?q\{d'i4"KL9ws&)  c\畋tu4Ix9o" $p8=-#3pxiOϵˎC0(DB[?#4F>U>qj}`*++l PZZZ8)YXXݻ4(w+i g7xU qfNǴvóW9V<UM\6P!_PsZ+WTr['l[۴9Y.a(oL#GBt2a:-ל &X9 )slK2_P V iL&*<$/HH8jlPKD~23 :{q ^(>!e~XkO<_-;~ЂjΖ"h?7#t3Ce$ ?ۘe$@$@$._% c>.WZJGT?U#3%|Q $@$@$@$@'y#P_tI΂v]U<ΔF$@$@$R.Ώ{Εuq"l6'낍F:{ iΫ;Qqp4 h(pooZoc$ R @s&`nWVu:[^^2ߊC+\ǫMru6't/[1o8xE7n 0nlV9"Y"  LWJ..;4Z-žj=Τ$Tz;E= @HЋY9k0lٌ$;]c͠\{=s   KRj%8*LI+a%bbjc@H|\zB 72K# J &1}Fe/~%VGjj*ڴivڡO>:t( BP|7=ص Ei #IHax|T|G+6RL"Wx%xϐ#[Ε'xuDu׵)j(>++$+O}fThk@JxiO9(;-6$qF7aDjSHUzHHH3oP%dcJ˸QMIo̅A"xSUco3g2IHHHb@D iZՐvDބCC'󄞦.t<'  hDt< #A"uyuA\~Zh$JRGƞeZ a1!p?.SNNƎ)S 99IkOjjO)))ayCKmpLTyÊ+\)Ef{6F" jӉ@D#p þo6ce"*.1a98fg6#SM ȑvY`r]Z!fz4Zt0co5(Rq+hU[kSZ {qF|! S WTgTՖP? 8\PiTfRسܛIm C 'MۺWcx, oWno ^Cرcoqp T]{bM(sz)ώ~/ZS\Oxꩧ`̝;0 P56( XiW\q_uUD1~,ĂtY1L-p:1i$Og`ӎȼZq]TGiO' .7Ѷj/TP<l|#?q#*MfkR դK;wm;Dpn`Qs=)j.I"h2p^ =@<0\$ {gM&;eíMU+a[ @X6nJ ˯DBn{1!m thmԘ$[s/-pضy_ 5<:?O IƓmúkcLcn̳5L 5u 9ś{]2Wq5;ZB`+pأ1Sus7ݖ% RFLѪG+tN5X=tWwj#R O-H4yFmnoPks Y,@!;Ν,!ZP 1JSj߶O"r5]H8 v}x<{jbD||UDk,=t!uVqp%讀8NBHxËvƒeHHj eP' -v_q=Cn .?zR<_|\ƣǰP~vB۳.ɭDОڴ 3Okz`SիزYWH& ={0p0C@?NPw9#s+!  /vƔcgfgaQ a0]Ĺ6 & @ ]QmڂhknT-XiOY_M1I@ES $@$@$@͞@݁7[H4Y_K'ٹR( ĉ |%( Kb._6&hb3ɓ]$mªԩrssq޽{x< TծcbʕСɊE~VVI(VRRΝ;w=S nĎXmW`XH\ g'm0I0Svc8c>)A!׉^5Zś|$B]Rrb)F O^K[, [9$~quۻM6TI.S*%hLS7+ ]ڻ+޴&'MkZlnǔ-À0|B`&7ybDc#mT StÍt& 4-r/QQ_ܱ+(GJ2&H(^8L>oT?hbl @C"l&;E뮝.k4Z㬞*l_m W^ AH$@Q /ؼy3;ϫp\(1]z؅c[ Pv5_HS[ 9bjÆUw"K-!t¡"rW^Ke~Z[|ݹ)a9n㸭 Cħ{ċGx\?bxׇ֐zs힏xl>H*߳LD闊$Fn9Ǽ8}jvZ -1}~Ԃqt @߾ZixzJ<6Vt\NXHHYᆲ{y"noT*:e4!}n=nqXa D@9{+aؼ5&&EgH`ΰS"s-j]Y/kƾEߖγO$@$@$PK@ޖi[aDdjNKgW@N8噧ر][D CyL! B ff|ȑ8xw۷#<[nƓL(x㍸1g׽{N|.ᅬ4ס2dƏ SBgu;)n_|OSñB}E}$@$gkZ@"N Cxj򄮎'bxk J%ŽIu쪬 jSBGx0>G9" w]y)PҲௐMx|6dQyHƠf#$UeZd MٔiU+|gx}k]WP*ҷkV 5} g_WeW Qs Z! B`AALXF3Q7OQTV>&=h$@$@$@$@Ai&lؠ30O/KOs'c?-dv۶Dj||@Ao #1HHHEP/-ۃ:Rq[gYXx͛`yv:GjkIʉV<& @K"3'zەa6¸q.a)h}x饗pwj=z4bԨQ8$kQ.0tO[fI}P$,V hdWe{x^"~sP6'1~,9t9?]Hnڵ Mfyj(ԅ q;x?-_^ck.GE  3DD"v %k1UKЮ<ʄA'ZpZ,oXW]DN LÀA>}k`hH]+B¥v *Щ'8ӑ"^LЋW(oː 땫&5~Q y-O=!͆H0tJ#   hzˏ mO렾ꚜKyeXpP,ӌ21BmRU%SrZ^zeKn{&(sK4   G@þ~qXۭW#Ea}c߈ASp mḪEM!dy/ WysDQ lM56,*ޡ2Nwݳ۳ vxp 4-"?.b7$ve]q[Gī:߹dPEELy!sOOhgÇay)uymt=M$[O$@$@$!"nPۃFI/;bە37 ԗS_wUk]QurN# x seǑ{P#aW]uKo;r[o[cرcmq8Ts >?5"4pWo۶\ff&"=VUY 쫪˜˰U34s@$YHhVu鉲XB Lͮ8W ^\bxOonQz=&^ڛ:)ф"lWhMK)?Ƕ'c*~a4FRR»IHH ,*--VGީU+a!Gjhguk]еw:HHHHJ@9 yy.L߶@d6VDV2_yܖj];]v} Ql2 Ns@۷bmwO՚M;bb.h16r!(+e4*!_Z N% N &f}/_|uC/F ]L: |Ic Ϋ+śJS"@fqۋ/}ud2y5"VՐ>^ hI6=1KᠥZӭ[e䱾c XKHA urƪ>bx%|WHnRDw{7#Dr ^kjơ>y8lkz%l 2ҵm+<]vC^ HHaDFuH2~J@6(= SȩY0]X?wҲlc`RmSHHH-"l7@fqu]6-Lo9 ?yCCS8C[so9T %nY~kPѣG]du ܽp]ߏ &ԥm߾sn 4Jׯ믿e˖ՕU'ǏGJJWŗ_~ݻw%z ܣծHH $ݫV{^hO RE, zPXD^*c%Ruֈp(,"m8kj`߼ vV$^$@cǰ0 @"c/DM4Qi[ճ^3?_Ig @qݴ0+yuA9'jkn@b"w#sQCyL!  hSTؾ<A}mv.a{AVͲltpZwa{m3gz~v6)$@$G\ў`.bHٺu뼪R`)WNV>X]--o7n^}պݻo`طoK^Wĉ_s5vEsH!܍?oi;J+^>eo {&|]=RS0uvTna׬vyj]+êA_P]]pA6,z,L$@$\ lQ GEliY xa=Y&={`4MGߣ'5# u @XkxEcmگ͉d (܏OYR)f#M& D ۰ȑS+ڵŃ=EͱD0P2-3*kIrZ $@qIzΝf͚7O>?[ob׮]^I{p]/#F?˗YB^IjNr 6YTf=޷_Ӣ|֩C%J%5 `B'pHQۢ|Vi 'ଶ.36W<$s`8HDEޗ9F$@$vUTTzZ a藞hJXzÇKKC䇡+/.    $n؄2V dgfg/}{wZt6CjGsI[ ˳Ӂ*͜SOCwBg25$@$@$@~|WZؾo۶"lWi$iO>u[ji#%rsH@LܕS>c =]tQߘ^z W=^x׵޽{_{&뺹^ ڏ=z`ڴi8,J^"Sˡwuk.̝;7{$@$@*l6_ _Ɏw_'(o=?|:bݯt;vիqti՟ g[rl߅MkZAw ;U%(BJ׼9|(g{7օS-< Ǿޏ(+oB"   hkd CQVwq0H^cP߄/@ a5$\qV   CDzC.a.i (12[K-Q[ŗjB$@qN &&Lk sM7݄e˖}UkU]s5IuO<j'| l9ĨQ4mRi$@$yVb2*?l:)ƘrhDŽE{b |^\VR zL 97۶ҾºZد? "h7v] =IHZ2U\Xi1g Jő ޏE=`4    %Ɔؼo~r)wø0ʘvrjn\g8H$>B   fA`l ||6,lt^k<$F)Rb0ep2c*tWc))0=FhM#  ِ!C\/jʣ,>}tTxЭ[7U=9sWߎĠ h 쮬 {U1?깠⬶@/aM N!a2`0jͯ.ɭ0s b8`Ί ֮/+`[pLצO^{Ns.- ЭoIHH OqjzvÀDI|6㇀ZW<,P]Sty}H$33SL_=>K#F@N]3'ǫvسg>s\ZzzY|vᕣW3(lh2̭Z5ڪqęH6: & ++믿nI#0R'ֽG$BTDh4b֬Y*Dۻ?Sm-HHH |#;oY~W]: IBW!_V`0,s▀zԡ8bwee.V爧A≁a4̾ixi_;K\ ޯ?taDbSHHH nqu?.ǽ60d .p2U~mqg kҙ@$@$@$@$YN豀y?텡0?->8k8_ù,J$@$@F@{(} TqD#z rCȷN) g%QC5[ɊOpZ,"Kh0pL/1HH@C fe7pDt=hPQQ{&=7L?> M-[hTB?oIHH {!&Z W޻*-cGa`td\0%Ҷm׬v $4s`>.]_L#  @`Oe%>Ct=L$  x%ŽxtfM :gKHmΛ}0S `Aű{W+ر#Xqml 5 0 ==i1HH 7mŜ={5CC쐌7"5!+4̦쇫빁TSY X>o 4    8$N_w"Ak  brUsʕ+s'޽{tV޽1qD? =Ǎ7ވI&!11L%  8$ŝ4M4C?=MJSџ*ߒvJ[|\^22`tZyHHHH"Rv%:ǣYaV.-۩lKko a'4   PkwXO@c]{R8=43VolAf %>j3+Z񬳑8V HH <1)pW]0@MyqWNJ+`|Gضm}T2dF/#GT'[n7pڴi֭[< @P-V4] o: a m},:ۏ? 3}xMqMQRU `HKZA Ԟ(3HHH~"PZm\}U-5]v}6= y ԟ'M'sr羽35ŝ0 8pF.!o6ZYHHH!IpϚ_Ry9E~n\MH8`yyW,>B7 _c @HbVz%\Wǣ>JX,8x JKK,סDZýIHH nA㖮e4},szq-[>  C$NِضKc'U vAХw?K Uk$nP)j$_c&gJDD=e[w:HHHHE`r<~#U͎#ss TK{,Ӟv^ЫxnO潸y  &Bq1}vYC0P? Դ,yx,iQ.=vnG*ei  /Bb0N:<^ D@7.YuGi* v坚FqHYQ5ZۚՀ\c60dE'h$@$@$@#H "x:*ȡ>ϵ&lܚx0Ig @xW۴-ǣq"Y,Dգ՟m2XVk*1=coښ@$@$@$pR/܅jq)뗖>M^d=$2xl<`ܣ͵Rc @xJ Y,M$@$@$L8^/Y|;S(jÇ/k}v6M32)ލlV]Vn gBP솞jvi$@$@$@!0{מWtX "njl?ccLW_Ѥ3HHHH t*:;\2:s)]7@I':-휳l0]wL,L&  hl,#Re~D:n SV: ޻=797JtH$@=|fHHZ4@IDAT1Kk|mB.]݂j8dC%l^nŻΓ4hR*ځ}Z/+WYRV{ti0  UyXXHHB!Pmw@yp-,*nt2T=5Msg Wiҙ@$@$@$@$yw?i Jր7]Ѷ ا':p& P3Y`[S"̿!hB$@$@$%RX>7z2@D (݂:8sVVs^}8K8${6)$@$@&@{F  hy(*+Vn ~qk^ZExˏR2غI>Kyπ.[2'(/ U$}Z qg }~ABыEXXHH&UDU Gmx}vXVЯ?o` $@$@$@$7bӱ >0D^i '<~U3!!|M`y2 @(TGe!kzzox&5K#YauGϕU+8d]fpO]b c>TMgA .0{ ݺk@$@$07&  C୽0yz(CfY#%{=ٴUUҞ=2͒u^NDz^CF!`߽Km 8v }a<%j< @3Vj)[GbX= W1{&B'] @x6}ʆM*HDVIWk^,@!> gqs h$@$@$@MK@9SEHu>Ν~}VZޣzҎkP-t .Dk=\ss5 D@ ܏;sbٲe(,,D|XeFv9}wA|{HHHEu;yoiF#^6hpʰ ÆC:β28JUÇ5^)n,-qjKI^:z^yWiJ Fo[S&B֋]yHX %f7 CЉȝF$@$@$4'   hk630=8i=ȇJ k^xDR^!!@eΊZ"x-w7Gm6W\й./:/rK /~Z 6Z8o;}%ph7%h7v4 D@xpKLDP6ֹX^|N;6'LC3HHHH' /7coUO>g}zDzEZߜ?VF%a< DS}^T<"kKE6V/&22d>>!HH Č7,;@$@$@E\Bn]?: v 2L HVhƃ瞇s d䀈Sxw(yH7HQ;w]OE~\3ZߕS$uk`_ի ڈvЮHHH v |U\߮qDJd_TSgwا& $@$@$@$@ZƟoŠ "> sVpʆsF|L}ЭO/IHHI@E_p K[ =$e|X?ZzO87I34YL  h1!pW'NHq{ǬHH`̒egRat^k0d $?j_8 ^ӵׅsKeH\׺5r2cp=<;yBIyr2]F˃}]+/J+a8KK٬/;yio7Dr@УgACoYQ[2HHHA el獛x]Ӿ-zE0bOz4I$zԻzHHHZ2=ۦ2 <Z.;@ӵdM7Y=72}'=}nd 5IGP  hję 1c쨨l^(WPt±Vmٕ(@5nx'%rr Β5 @bB`ݺu&c8ѳgO!U Qi  h6}e(X4=e~G_>0DiEΛikW8E(,ܯs';u11mR'JԹ^N%F{T^Zu:Tn9۷ZjJ.w{u"ߘȦ:*Eȵ% _II0 Gе[7oҾj%、} C*YHHHdQd=*qCٌGg̶t o8<~v& $@$@$@$@?8Vc3w;au88KqGN bdqA<<=c 2f^WK% @4Xd^ͽ1SLd}7jIݻbxm`E=31px.f[]"Q  @L̴zP"P{l+1XO P? DDg}cY7 R(@ge[V4ټ( ${{kFXE[nܮ ]Y} ]a;N $ P^x%{3K&x%#~Y-C}Pe5)͒cw )Y\N<"eL >MUJ%=q2`~ڵYd.$p0`di l׋ (@ P)PkK-x<N膙*R#[o]rw2RΙ99A<鮬@㏩,7JKN;G(@ ĩr PC@ttYug(34j%!w=uSr.kbN=M5(@ T^۾s^(مTY1\ xIQ޷2_r{HkfA__Xdf[+)xD0 ^(@wkEwrB P@^UnP]P2K>?rlAZقKmt=z {l : 8@ P :$z(@ P f%) r7{[ sLf3W" jKPx'kۧjW߯?o &IQᰂ(] Ucuyw@u DA%\k-O Pmݻ 7\.5JvQ PO@9sUzop{[gΫjCGg=  NKHqƴO|foxɚyzیGl$GK&g * P]Vdi!Aa(]BO P@>mDUs]M m~LRERVdz=7qT[XA PO#Z6n9?CC;2 ȅ;o=_E.9y /_%] ~?h@dHFx4襅l},9OUٕv%]/3Y(@ P]C o,!+&A t$AT翾Tu42$=AU P(KoĪ?XV>?k,Z4t0snx:£PX`޶WlJ|f\_X+rDPq;/moHL^ ?f(@ tx2_x珎zڵ8쳏 P-Pv.6ɰ_O A)d= afUWJVs]F&TޠQ"CX/Odj<ĤwF P_*+ =}&ݭJ t9xFtqv|-oWitU(@ P&0i >z3dC#DWEa̰\w#G(@ |/kZl3717&;ō Д)MU Fx`5v(@ P~?쳸曑('H,(@ [`Á*Md҇ƌ'ڸASa>BUϊХ  }ߏ<ݛ~dU`(=`z}(f(@ DW{qdm/ɢZ%U&]WV_\669&È0]6QU P(Ocݱ%I{>A8NL P ~I'a믽cܹs'f̘ӧbl(S+_{fp\:7W 3U.ЙLu<S{$ݹ89r[t))mٝR({a>h!y ҟ#SyFbqٍُ&{rMc$~l(@ PapJWJm/AZE'iŢ B$ƿ>OUzIaN;uVmc(@ PؾV lWV g;ōhAYeY$8/lȪ-p0R8E*n(*pW{W1d`%̚5 cǎΥC] P~TUaw{|c߭_fԇW\Xu(Ӆ̳T@[sG]z:< lN p7巵;ܟ(@(P^Y˥s%3Ռ0[WP鮫C㣳 >ef"Q]*Y(@ P@< |!A[ذ|ϓ[ka@ JOk^apnX듳Uʡ xWVl>J->۶CY2S:n[32[ڍ(Qڮvir ʽe) Nq08eKٵ[?PQH8,賴ݗO(@ P ஌0??o&.b4E'Պs=SN-܂Bq P@ (K>~|C]JőpjfF؇d{m8\u܄;WճgeAף'<{ݜav(@ PL޵!Z$͒Jy"8GYOh4j(@ Pq!o’}ǫLd|gu 7N_2ИhpyP(-X(@ PN J`{$'| [%oWù;a%|dm?$v]bLٿ@]$'5iy0'% P@+C?쳱ds9ؽ{7rsy5j2*Y.Bq6H PGf?i ܾCZWS^3 dv}_2U5p"LWLRճH8`5CwS(qv;q (+طetLڞ7.< d}zYۙQ(G (@ Ĩ@L),,ۭJ4rtGQ!&؎{Mg_xtqo(@ P J7nFáٹlT$mpY;riF+ P(^s)y(ϵJ'M.ÝE}.A,>SpA}T$r; EXC P@NZZgDz)?kaJ\ 0 7D@{G) PhQ "ܕvdb(@ P rQbʊUXF41v$2fնPW8%³5/E|ytI5=E@$ h3)@ P2upXYWs;]+다(f=8H5o.qhU=+(@ P@, ({"+\VZ_R,Xd1JK7.xUZgetpk$0FwA١c)@ P p@;/ľIqz={>Q CL|ls #G<*ÿڽfXI Pv Pb\fe˖cv늗G Gn',I|Aq7t&Sű!/wލ9l8j `;n]N0]|)$܁BO)@ PhTw7\L]q&D8;\W8z,LFU P(k%MCi}qQvO$%x矃k-7*IP,9/)N鲉u;ϭ(@ZxuW[(o/ {GjzZ =k%kuڮJ P1#]t$(@u}jȕ]]f#nظ`}tt} "ƉWvL~׺p+7֜ХB߫#a3*}f(@ P zK}6ZA(M;'$hRXi2A<:oE~Q(rM۽YIfId#$p+QWpqpo5eˉ+WLBv'(@ P>vrFR\U ն}"jZ >YۣCeG)@ @D>ʃ(@Ua`e?菩]WA-÷(AޅP,(@ ĦUΓlUsmxSoHzfᝢo{>X>{$v瑉z>[(@ ĆC2YGnCé9(e=Ks%k{2f}X~ۂym n:db",7!Z[YG P1:'p4Y;\+SmIAq&^/`89\ P3VRX{pL n  {tY3ੑl͋DJs9(@ PB"U^/YK7,h=E}7rmxֿ΂g>Ґx=Х(@ PVV6cʑwr. @RWy\תɄC3}(@8XW%Jd}ZeHkb,VfmO(:لΖ-SKBǍUU7j (͂{we_˭wPLپ0|E P(l=V~&|$7{tǟGm&O pd去+ P(yp4E)xNP@ na[߲ۡP(zB==:^R@x5(l(6'&/_ #:Udj[A6eӦK& ? (@ P~Цxl~NQAӮWspizVP(@hp*oÛZ*JִK_R޿?hC f[A(@ trNIEضl7~mጬLޢ7F@벶O'FǀK P@׬Y?PkYYY>-’%K|Bbڴi>ۧ(@ Sjńe+Aixa0$ l'T;&h_ο_(@ PhGn)AڸuFf[,ˠbSU0~ƽՀ]2a&&BW IKNs(Kaj(@ PQ)uM-~aЦ) ?8?FuTş.(@ 8eT`dlbtds$x`@8-yAJڞƬs#UVPsQx衇Te(ma(klT>!7 ^ dt|pSNWYA P(@ ?{׮ʺzͦ^_9Ju;JZW`8͛ټ|͵)@ PJrO6+ۿ/.pn> 8Y!|D P*`seru^@u[] -ܟ(3kr.ZeƐtfnNYۣ#c)@ DEGP@|QU+V/CRÃʂp~ y/`4nʫ: P(@pO%߈7LV\Kssb ޲>5+NH蒓|(@ Ph\|I&.>u;8QB/Ž2O7j2ܮ̂gwyj5m P@ (^޹ /؉Z#`s_f2/:7P@C@n}e\YRR`|Ɲ(@;@0 (7R2q842k(uMV 8w-7-vvWU4>gѡ z)?>:أ/Gg[(_{Y(;RSP 8Zbv^[tw(vG*zN m*g#<_x`,ٷ_o =qdJh{pgp;8RR!ta% 4nVO %@W]ǹXwg>yS8&gv(4]ٚ?K`{iJ]`ZQ(gc7ۆocۏ-^=\:n.wZZjI~Ϛky03e ׹wZSi:?C~'c…. S}׺J$IV]vʱݝz%+ٔ_YK߯`EwH8g@vw$B` (K֭p|`0k8vNl8mS2FyS?TdCd W[));O`? jRebd9_4"M BSKrς';XYyd0^O>(@ D1{v|XQb D+̉~Q- 8-uː1Fydj값%JLT ,77UY -† -[ Kv`P@t ibج3𡰄0nk<} x}d,MnZ (@ Pwp %-}{H^?FOpK af' CzۛGPɪNgYb.f***S(@`l% Mܤ\<h_k5m=^%h]u(@ P8^e#[]eph$Mo[{fLT+IOo-5ǣ`o!+{jJ+X.[*SSpk2ɯ ଥ~r!>Pۂyp-^'^㴷(FpQg(++øq w(@>?{G/yd \»ó#AGõfcSE P(@V ?{׮ʺzw^_$ɪAXtu v(@ P X].ݱ m!K%kb^..&>W.Xy =2r*̗]?KMVR@|wqc@IDAT(Q?%X{@wfV&t loъcCYGcc(@ D@\*l٬c(@ Px,6@d-z~0!7"_]wUutᯑpizVP(@ P%r,@N]'vH2ZrQnfsɒv8rt`(@ PxS?ˊ<րo?=3}$C#Kd (zJv*\=a#TXA P|owwrC -.dtkq?n@0k{|(@i]rcl޼gŋC+Nxae:oS흕{Ka P[KsB^3#;w!m{P;tzVP(@ P%$ikkM?>PfknJUp:رƭ/ac(@ P eo "ri>?wcd5ZVAa:;EkN(Bݘ[<~{Bw ċcw"1wU F2*Ҵ6(nʬS9X}ڴiXK X, Q)k:, %71 ǎ,F 'wƟ ŗYA P(@@}k7`I>]tR{y^.!]&}zP{e|"n$[(@ P/ʀȔUEZU+a}Aug . ??jP@UM^UKvjkqgwm} 1Szq#bIuY'#a 4l"P ]t̙31eʔ瞋t|FԇP2ǵ+V꽪+J,P űkxUÈ0O71T2(@ Phs'xUa'7=\7hq|ŕ0k P(V'ضswݭ}n(+셛l -Ŷv e%?Cף',7C^vVRbY@9K`{pzr~ooĞ,'fmOc(!5ydo#Bk׮xG#/(@ D>Ipk5 !*<$zxȸ:IB P(@c |QU߭ۈF$yUA^dtm3O#A"7?}^jfd7Oq'jnf%(@ PPV-f. >7 GV4"SVylb`9=~EI+99~@Xfm?kOwZ&NqX(@ @ w:9|1zh$WGqy:<6(@ Dd+A5{tǓÇ!AM7V͋,ѰP(@ P%%hIeU.Vfs}biG| 42y'eeC m8.L}XK P KV\Xφfݒ ,~3+ڋ7a!ͦCnWBn"Xb,$(@ P XVl vAY;PrpZ-Y(oo8K P zBP > ,@Iy_~%/^|Tmʔ)?złdQ,5 ݺu;z >(@ U`}L6;(k4>]^Oף:^}(@ P+IJVGl xoJ2f uqcC`}YVl:̳adt`、0OpWUKj9GI0Anj`(@ PW@xx˪vRIcLNxMgi7lZ*@~ypC x3m}55;g0kSg(@ Ģ@7=m(+/X&+e5zMs 0k;(a pW.첀V'}ҤI?~|(n+K{Z"$KEJqWA3kOt]"X(@ P(H[ ol`n(Yn[%UB^`׹o9֨ k S/'Y ap5(@ V2IQcr(U0=?K+jx/=;d sQUI6 n<. 1IYԝd (@ P %J͜m%=pjt4|\ӫL\Ʌ?K[Fed (@[{D(@ A=5p]1J'E9=Zhwu֢q{^Y(@ P(%Pc7Zugf!ڞ_5ۿ7^Dl|+m(@ PhW:xuN'nݾrmSXz3KY[p|~aX(@ P V3{v|2>š֮. Q-jP@ -r?"@xP/IQqJF7M#A퍏< >e-H> (@ P2ryf;s-_AY\8-t1r*̗O.پ4XI P@^6[iYrN`q?NIn^Q */٧./q0_q%tfvVRbIY扭VRiY$=^ ī'qS^p>}:x&5B PHi_G8D'OlJ P(L] ps`~Ֆs>*’闿B9AǤ^*VP@l(nOlێ5Zr/>8{&'(ō GۂZ\{L 㘱YK PpCVV pW@| pٲGN膗FC1r~u*tlJV>8eW ᤟YA P(}k7`,U\sEHKH%ܕ>eeqfXC PB $⨴ڂrU+DFȊKwކhvX'>-CޚYI Pv}_4VrM2s'޷?hi7n@8֛ GyХō J P)9Qz!Q^&7+Ǎg(@ ħ\t9vnT\˂c58Z_ӅtYzVP(@ ħ@˅[K8VQ2\<C;km:粥4edr-0y(@8,p,J<܃){v{Wtj(M̓&sU!MVR@ ew{۵6Oum>k|N`9p P1+~4ͪ:VP@| 咹F {ad|SlPit/U(@ POϫ1mF64L~_2?; '@/[ 5ϭFKJ Gwx P(pT@Ym2%+/\m9]Ua<1cUXA Pv%A X̬Lo`8M5VemW&Il(ڵ +W xמ㟑ٞ!p_z5&5(/Ͽ jNP"A@RZJlvY/ W/I+_ܱ /܅z3ఌr✞7z5- PGfmт(@ P 6BޥK̜9SL(s='v+ԶyASF5?yp |XnVfBP (@ P1!m>ܻv=jOַ7BBxdw}M#A\w#tiiYI P%[Vy|J]լf;Ѭge x$8#͎db庛`(,J P@GUfA3?rPVy]д {m6<'Jv$Or79O/$&6{cemץ|A P(?ʍ?m܌ITrFf2hrϳOqI)Y1M3cuXC P@rmUl[u%" 9I %ǰNLt~zb<w.CǝSUY(@ P"꽸rI{k7lBLNܟ޾$Iue~wL5>++kL@njydRSʅ(@yNn>=z兛tܸq`pǣ(@ܸyR铜 nĀh|\&g9>eer%i/3_P(@ Ĝ2y5Y /2Qs%՟̬̘[ڴ@䩯SMn(Yۍ(@ A`U]{3hEzv׳;.\|pg6%nWwL͓ a86P:P`8uuo]xI-ŧ'1 Gg& D8&\+Wh*0k& +)@ P B > ,@II&ח_~ŋ6e}'JPE2$KbeIQЭ[6)@ P FHpQ࿵T#٩^3]"bGf[׹34f_ P('kqϚXU@s rmDɌuGQ$JTLp|1 E߷nKM|M P% ,Mtlۣ;%s{Sy}(\VW ެc<\V,@(@~#b^N n&g5 \B ]m P^veEVOI0~s(@ P-{fبq# Wk~x1=Sn]oI%CyWQoN 7$tIqKMA]]ޜC{$ӭw#t"Y }vHxP P@k>ln'_&\}&NjwO#YCnjydRS6( p(@- e+_F} qoȼiY,wIJv' }(@ P I݀%4ǩLל/BZB>T ^pTrӭgf(@ E^9oJ`uz4oP=~m}dOyx$*Y-kE|:ɝ&஬٧޹CM`|5tYI Pkj֕ƎFAUkv6D(pDUۂZBs4'Mq(@ Ē@DO>`nIHwzk(@ P(P.\U*V ĜGQ@;""(i (@ P 5{IYCe߬`&mx䆘ZNնa5ZU P(@\&lnF&QJv=uU^듳ᩬP!LfɌ9 '2H PZ#0*ߍ$}e230!7O\dOC^e u7B(@Hp/O_8O[|bE}dm2A8Yc38(@ Pu*o(@(m%`īGbL"mK7>L '1dG(@ PB'dĚ&@À0WGcΓvոu=z"۠ P(В@IEޔkiףl\ӓjGUkFX}py0"8!~)(@PA5>dMAiP V~۫ (UcNyy5(c(i pO(@plnݿXp(LZlo-?TK8(@ P%|/ىdf<*E)ɘ1x NEksy$h8Dovw60(@ P/l~YVTŭ`xcbO#FVZ]n\{ Ebo(@ ąweE>qaARX~,!n(@ Ƚ>"P]*7[Z3˥5iQA-߇ӏUg,}X(@ Pb[@zrH;KOdx]f{~U>9RCn/  P(!Phۻ`h8vvR1[WLݳ`14ZeU<`})KJ4k3V&]^ ]RvVRA,]=-+F^j#~Vem$YSR(@ P! p_f >CU׮doh",YyUȟO6-(@ P uv~_: ]:cHOHPm Ǣ۪xo|Lg(@ P@Ǎv:#+ *FNbb}msRX_ XUCedr-0Rmc(@ Ph.`sYU7[|c|InO\P#@Yd7K`[2 "'^ƫ6(mguD~R"vV_iXUЖݹ/bNYc#(@ P ! p_jxU9U_|zHo(+J]M P <1arLI  AQT4  ,Yc +(@ P@,=ZZl܂Nr%/خp|OM\s-t\ZӇ(@ X[d!s8ɒ$鑅Ksspb.ܟ;ľA 4/u7BsyM VR@ (+ NW.~iN6vJ?vfmO(@Y{G Ǥ(@x &,[J:;|A P($;[1og)|88HFPf_ߔ+ ի`}YAn(@ PƿHND>;EKv Ua#r禍((.]%k 0F8(@ ľo"fmH@`uØ!c[o`{m\lq 0OT(@ ĻS2+*qaw$;ΣCͧ쾙u}/tqџ;G PG{M̡Z%lœZ#Aii! ,G,(@ PI`dh|7&6}&geeIl *d~y85Wnnj)GwQUy?'tt)bE"UWw}|c]uEv]W. EN ! )7d$S>5sm'$g(Ёw1norByf33em>. Iýaf뙖H5׳(@_">n8,YDܳgOUݥ^!CYA Ph,`^mI)ّ1>/QS^֥g {Ȍ6A(@ PQ[?oފe"ڛ%7i&& [穮}K!29l6ue&NWtu(@ ıX pﴱXUl'ypՊ z8n5X]k(tړ'OYl :? P@Sm yju|HP %@ )ٗ]Me[(@ P P/7c' 7p!ag!04=__۷wqn]pi.։c@."vK/Z={:g.YI P(XڞX7{K P/wL=ώ Pɀ91w/ݢξU] '23a~2(@ P@ }t)) .S"+1c`ƍ_yGaa!:u[_l裏bɒ%u^x'}HWd^[sN_믿4yZ=Kuu5V^ݻwc())A &srr0x`wy޽{{6!Ԯ?Hc\Nj]4V(:W^V50r,Vճ(@ P}vl9j;z%'ՒI;}|N >J;_~OE㘱2f:Us=+)@ Pm$Oy/2U Y,ֵЗ,-!ֵTs—Zr,È^;[R[zhnO P(gg(C P1)9s駟V(ʿc+VkuX1=,QNؼyuޠlGWD].]ŋ. _-¸qpw#===`;.P'~wۏxjIeWF?Z=a X LB P(svz\zS$ ^eQm\8bƽlCS=}3JV﯄u(@ P vb/B\o(✓ j?37Yf@8_ ɵhesLa (@ PHHk$Y";1|:ɬ~R"$N8W^y/8BmaP`Æ X`AL nՐ> [lc=^ԁ ڗ(@ 8e[ߌꇞz%w«'Byڶ'A{dn(@ P m#Mmk`Y(@ P@D>󨪪ªU"6mˈۻx$P{UAyآO>عs'֭[;t?gAFFz"+ XSqHuaixY۳%f,ݰ wI:56R(@X'T352 Tx-0&5I`+E1g!bf!+6  KN\J PbK@þU +b̤3[W/Y(nރe6s̗΀Nfb(@ PHlfmOϟ(@\\r%-[Gyׯe%;/M2atDYh֬Ypkf Sɿh[WRRzwj[VP(J5GT?3'ώ).Fltt=2%Y(@ P@QCf~>-l钩 +w^k  xargAkdQyڥ0_0A5(@ Ĝw-_Wâ\Qf9#7ussa -, Dz X㇄<(@ P@ /x4[Sϒ#](@ D4)S@p8PZZ#GN)㩧‹/ǰaÎ.M (Ag`zN^ 8wމI&."t Vmۆ7+(] oӼ5k!z<1rSK ix~6@J nges(@ PK2W5peׁbfp5qmSOudXLXo~[shC P@eX" 9vzˬ-vKe\ŵmTÖ2]8#`zRD(@ P =>lvbR]2fݻw/}]jʛc̘1u\>% o)ٕ&eM?~MƝp }ۻ%vڵ8CڟQ &Yq1uxb (7bx4<<{6Yu7 C\(@ PhwTT%6;j%3iFҴ{6؞ouz#yzM0^ PV)3|$ +u=%qEu=wMb_*{tꤵ (k-e>W2πNP(@ $'gϞS@ DEaZ*;|6:A(뮻0f̘vWغ50;a4clpWn:Ƴ;vw*O_l^C PX/IvkF P -z$p8 (XbK ##×}P2wDٲeKiB{in@IDATBHmن{ηZQZaf4U=+(@ P:Fږ8${)Z[W޸ARjLKLAs=+)@ P* d_^\"Z=sVKGd2 jTX4f"b]_kz)G.] slk7X̅A^Y(@ PWk"au-#Fjg%(@ P#,b%ܮeP˷(}I sJ`(d_]Lnkl?R霼\<=$ u\8Wjq)0_q(@ P($S{I)>+k .f]d_j< X dd(@ P \.iB%C>E2gKv t{σD)ΆCcU4;J P(@V 0k{#(@ P * @p{k}}Kʜ9s$y%.A-ڧ5{<n555P2P * VyCyojũ;?Bé:4z=J,*뾃 jg`O$6b\rqq,9>/kkkQ__fM=bKhq{leUUUIVI()?7O{vS2gD]I1 A^ rOQ'zV S~% ^Zo=~_)kXnSm[NcJ}j`r_QzbiœΘsjQY%cEGDEfi WBqƛ׌+kur]ߟBp x?Rqc1-c1_?gp,ϡh~{*}kÊLjVh{1.]-oj*\gq+cv񟛯-ٸJ,ZKchw#uV࿋5kw_cN@|5栌-|!ߐ1bYE\TK#sF@|{JV'cdo0{Pqᆂ<(۸xam`ؾ I,Rza%Z;F;yB~J"e%ਣƶ*N;}PC ԅԞ,󞚞$y]!-g)tx~[pg>+AC3ɅMf5C8 JjwErL0P9wpWaqաX)MGEǤΙ8C?_-~[v@9t*AJƟwh"meP8$jJڀv=1O5HLvIǝM6$ +PWQ nO@ka\-ނd#`8 ԉHkDD-xS (Kce̡+*/+h'ŗV4_\PP \}Rx'\<_@kl1|_u~?Gƶ9׷gs} UZw2rs0.gZeKaضU4_ !)`c:m| @{.U/Qc15;"ʻhq#.|!S.h4|A-FөSPv;… oa͚5Ȕ;wnn6WvС㤧G&MIvO(7ݽ .=SYg[{$s)HCjaz.@dm{^gIp )PVV*X9SC8iXʃ7qhu!\771mLUU333y=\hK)-R|_]ٲo9yXq9ْ]VDZ7[{]ѯ/>,+;8]Hɝp|](ϑiGA$Q[~kX*→yRξd MQO;: %ܐ+-%(¥Q-Yy$Ǜsǝ<ʵp߱3v׽6;ٶzQXڗ;=%R(cu-Čn]S;,)|RG)#Z|%/%=fJR"u7(cR()) h   (A咘H)6 { ?v?? ^e9{/{}_yk (?;W$`KK>RAnWadlkyK&XW~^ (r#0?A.P(@PU2>\]R5+A\O }+ڃۨ_T.ї=P³g52شKa,I,(@ \`M!㎖({f[%Q!L+}~~..qaC5wN@[<o)جy(C`-QpVR(@ 4)`|z yh*M'3[DXA P}~؃P4 PիW}W&n ȧBq$d GL O*DPPL#[4Eaz `)@ P@쐇,obڐەoHP{.&clgO6m':g "[a?u P@u{ {I{s4_P.HYhX(+7ӐiMa:BD2 Ĭ(@ PZLccOW1k{3N\M PU'v`={([RWgh<}BKm)_WKd58)+3,NjAٵ+4Le (@ Pv HQU\=R(3(YF12~dJrm+vep\y0àasiYI P@_-5f3,u낁in (M^8?@YX CYI P(j8|=,g0 (@`{Dlz$`M  $@i٠B(5Y*cEj;%6[PrlGRճ(@ P7ʗ[̻nII8O'JP jo+I'e,mi0_2:^5(@ ,^fL %]y5o1$޿OSt@π+X4׳(@ P v m-$뒓z(O P@ 0=? 6JeӦM},7K|uǾyVuaw(@ Pj[2INI ?>RY:Nv؞UFz\ Uc (@ P-([W3/r.R~ _Nٓe,z-aXC PGq5gHPbN1F޺u+쒉 64>= q.P)ST0f]/LFW?6.yYA PYjej/Ѓ{%w:>,#= ^wVR@V}νQ^6(ʵp1Y n&}M5m4@(@ P/=rޒtDIB P@b0=1>ejj*N:$|嗾>:%{g/>+?2)38A>,;7Jr%%%Y89>-- +߂ݷU4q,SYA PM@ ^kPbAЧU' I1a}uu=3;=Kg@'cy P'`vp+l(K>oƌ24OӅ¼!tP(@ h xWjַ[U$Ѕ;Wk}(@ P#o3DX3<ஜjѢEPO?z0u\@<ݚCxoA rT9;/Cnޅe2OUjH PG#AWfY)K[0O vO꒏8S]{ފ uÒ`G^ P,]n9()),A(^^IFX*yJ]^>7 C^YI P(gaNg:(@ PM0 Vw… QYӛݺu|T?~</^={6)++-܂G}YYY257_d ʘ4ie@ 3oYT咭Rn(D(9vn;ҧi]| T 9|[% P]@ j0VJPA=.OI< j/@_yΏ?}K=`6l(@ P N{2b[KɄ8;N[; y߯yVrŕYYI P(̰uJa(@ P-G/Ũ M%peݺum={=aÎn4qw[o=Ν;q7cܹPWؕ-[ॗ^\X̞=) hL1*`ohM s1:+lފzޚ\ Jkz3~ SO@xNߧ/:B PA-㡯UWIP{|G LMEǥ$g+ͳO?C3i(.z_l3TKA~1}/{rːy}5 B'ױ(@ P i@$8X~ h1x PbC mۆ'xP Çc֬Yxn_`@=p@(AE?eʔj.S fH R~ێԆnɅ8[^M$˔ %%e>Xu 丧?tr{ k&؟} jy%)0]8:Da (@ Ps\txwVf\oM׽90Zc}(@ P(5qUW&"(ܱJcbXnMdV2tM0Su'ƳD^ˊ}7\M|s)MRI؞BS;cᱟvW(OSQuBkv33t=gds(@ ĺCTejWk\4"#hP{$P %*7/קh8dX:"B P@ Lx7(B;Vk sz:&\Gw;z\,@(@ Pq.ں{`Xzꛃ~t4<(@ PQ'JnQѺ}׽^~6߯_?S%Gr3ov6 $PjSu KYLF_[_ߺ Tmײ Nɰgsr@ PbUӊ *){q$Ġveޝ ^X6۫J^ PMoJ ?u,[42\ĬA .FOhCSrL>dUC PG+_kP>d~8|i\(@ Ĺ@T[T={6ƍ#-- 0Ȕ,hN 33F~sN\WM j_Q\CgH,Z|JJ$ g8U~ߞE޺:)pIwCnnO P"* Z^51Np#Y jCyܲo`{AvLk6zRc(@ P/P(},k}ޫn2Q/,?C'<;VwJN&P(93NKO h 8e-?|L8T Vx/X)ʚP(@ DX՗ֵa _v}PS0)-SZ buJ[7N}F/:4(@ Pspv `P P"p;eX&ڿlM%w)ٝ%S+#῾Civl`/{&,3t*VP(%bPQOԮɠh.wmO=OE'7zso_U\(@ P@|-{wVkCK0bGs=+)@ PWskާ:) itDK|9cnÕ(@ $@GHʓxeҤIU\(nd,Ǜ]zC0L[|X,!h_mV,q(@ P jN| U%OhD Ԟ.Sħ@c28WA2Y̅>-]s=+)@ P(OI1lgݍcOYI (@ P@x%ɿau/V COgfjf(@ PI܍Y{R(@hpI ZЮ,J{(oJ2..,4 l)]vU7]0 YA PA}~8]2+AKP{ÿGg\SS nQSr0MK@'?,(@ P?xఫdu-LcNVc (@ P@\ x!³'~R`r&Lhg%(@ Ph@ ϗf ܍?ZnK P ,/w$x)o" TR`PꕪM˥3T(@ P)Pp_?8>V \]N6&X\h<$ޑ#'q;lO ު*IRR`q.Cױ(@ PJspVdz9YI P(^ryǛo.f''%Us=+)@ P@K:<] n/((~@nݎ. (@hH-V`فb !tɸydTOd`d MS8ȔgA0D캠Z.R(@+AeX%ڕ}!fjO3ss|A2;젳*S:}2+Tp [(@ PhKf ?+ǐk/Iq 5k(@ P@< gٿO:NiZ(@ P4 /O?}7oto(@ D@,.ś}sMMHMT2p%J\eeu :g.odXA P@{ xG jqԮOnM'y{A%]YfI<o]l̇ 7{>/=h(@ P^dtx(W'ڕyВ(@ P q2+c_fU'*3΄ˡZ=(@ P"+p?>n$%%OD P %N XR?P~Jvg_PĂ|0%6m,B'Ѣ?8Xo:Is?VR(@H l12|)cDo'K1*AX{ʠs3]{ފ u`uzk(@ P(JOi)l#Y9qXXf] ]R'լ(@ PSm-x޲2 `v6 kg%(@ P@Tr)8Ӱf_كx{o8cPh@ۍ%,O2,=M qdkϱXWs$P+삤;SQ(@ 7(A_W|9]yX 'd8GH5U֛o>//5 P(@p~)/,TbMe0=E(@ P+m㍥p~v'ez,S1k)@ P@Tt:,ZCEMM{=F . (@ & 5|AJRR$'cOjY(xɎڸ:g#?Cڸ)@ P@D72*)wB>GɈsL8='f BE+[KMgrUЙ͚YI P(@ xd <\~wX̅>'Ws=+)@ PS_Xa=z¢dmW P(QtGxW1m458q"zz8p`{x@ @7JGHV .`%%[F xUڀtiH賲@ P)o%}}Uuȇ4p^/AewA!%ʆ`xKJ]vˬk`:4:P(@ P`{Ix+5$i0_2:~i0w(@ P'=r%/Z˵nE`pljB(@ P BQڵk1a੧֭F5==ɒ%Y߆ lwuWHyX P ~:Rо$+g(%hąyS:gA/Y/Y=_xRw G(@ P vC,>JMտ2 JgԞ{Q#5qp~Ɨ  `0td)@ P".)-䚶 }^>trTxeRep^)yU(3eZo ~UXA P(ίdsټ/+(@ P*_[.CpI8Mޒv%[f X$@LRrafR(lP?oܤi\ ȩ=(@ P 6ɦ^t(K0yF`Fk)~bL+%}K͑c1j OɧkE9];k8zt-t:5[ P(@xT%po^$Ni9񚷶k)@ P@T+e=O@ $@ÉK$ҘUCC/uJҔ SMQkSU4<<{vLnXow&p(@ PW0|| ݞndVCaR|VK@Ծ]އZ,\ ڕ1Y'TSVۼٷW-!3DY~Lg^ P(@ Ou`w. Ɲ;aXݿoPʙ0::(@ Pk%/6f_ '  >zVR(@`f{I<@44c||& qdkϑ&P˵=Ox~ܮ:a6\U PO^woڂ7dT) }pww6=ZM+AOuG{S`‚|L'ef0kMs`\ ؞{hhWt90:N(@ PPr2U(#3"F z*zz\e6* P(@¶Y>XfHSOK (@`{Dl (R8 j uJ靜Isdk%Y_@yb.?7NnV 5ZW+(@ Pei_}55!u&AG쨭ţCWo2_PκЃڻJV ey> n uX*P_0 ? _)@ P<2U㏆]ܮ4"/ߔ(@ Pq,qr}ұuѰ̼T(@ P!SNE~:<'(GW(*AR$;EԮdk>(rŋbSa(@ ğ߇X`"tMJ`Su5V+˰',ʱ$KR(i᭒,;PrfOdH<+7\X 5Gj\8Ʊ|zVP(w Pok %wr/KD j?>= (:d\\a`X̅>Gp(@ P@-sue+jS'߁X(@ P_ӏIvoifguyy^33h값(@h`{4}l (Ф@ÉK$[{1>?T uzW%}dhܥP2r#_yjqM/b6뮇U6(@ īZ^pD{R|p`Zj'Ou@ƴ|[ P(@ "}(5kf(@ P-XԳz\<*+ǛžWFD 8K khmº(p}gRFso`Pc(@ P+IyE;7 5Ю%8dzk(@ P(Єޚ&ֶZ<əZ)@ P@6m}Vl[w_r9C^YI PQ !sR(@ ĩ7ܳ[#7[V~(@ Pzo_}5ihYfTfdr9m"R( ^[[+V`裏t:Sa(WI/Y,0ߗ}xFzn{᱿C~tB? N\(@ P 1lA'ee2-ܷYo]l2{zmMˠH,(@ Ph.)s{Ӈ+)@ P@ {D{}~^3XK P|Q{uƍx7PTT!JPM(?D%㳲nǑ#GP%S7XG D^`x.Lj ݯ~<%Iw} I P@$OOʒo(m;E#1EGpT=`6TXA P(@}TWd&5:(@ Pgrm2(!CaZw(@;=XLZZf_X]R&ڋJhY^ yH c63qG<Պ?Sp(?93Fd8< xm6>W_6>x`b&|6 (@ PZ&>p_{֖^iMe5(@ P@,x|&#&'r0;=6R(@&W^iΝ;Í(@ n|XV7:C%k jT< |f%ᑇ-. mwz.Q(SSprV&<ܦѝSI; (AFyWfRtiU(@ P@޺:8ZO50tv܀(@ P 2.TƇ_% 4<YWCƤ/@(@ P f"-_#ػwo\}8s0rȈ@ %CXVTKKQrDq\r'\RX l?.%9}Qx勶Gٵ+ђ9: (@ P -Ap/p<sІ|xá:֛C׮u(@ P@(JВk9.E"$2χwʴU|O P(#`Yxvg Iq5#FHL P(2p_r%vܩjp7O>ٳ$`ԨQrOe˖_@IDATA Ç{n{O`ۏfB.] ( U^KPnW}h%W.,%[ >Ieu'޺E˵e[ PK_no1YÂQÑ,İP^`_[Pc`f6tyJӇ(@ P ٳɍ'qEp@5k74\9 V gJmʈ(@ P .ނCI@fWBשzVR(@xR laѣGc͚5YYYȗ m݆])[UQQ/ʹ Cq-P/_xʝ._sM/sm-ޔLʿ=!Jyfw^:[U3.U(@ P&ݿ'xC$I#adfF{pDýa=<[_}~ COqIKƣ xD{`J:hP(@ P%Ix5|nna* mcX&ȬMnUƟoQM(@ P*<i"vrsa:ΒJ PM |ѮmOٻx'Ϥ_ʥW(VQ *Eu-nq[]~]"(ED콡`EM9qs7LIn^!3̜3睐;|;H5SXG@B+ggcE#aD&Aus r}T<*(&aC#VSXG@@`8zC=+bs@}4n8w=P7hz:g HH?5aM\=zACPARQcb@@05͌*ʒA I  @)E_&O=?AjFW^׿yluGŋ˒%Kb+`bxljod.-ݹKVס ;*v`^^AԾVlZ46/TP͚HW6B Bl9~W{|2@@;5wN?UٸY^Gtv٢Ob~SuWOԥN+qSxQ h}z%I.9&o)xC@؏@x L~RTs\RA*hVmmTCl9#F  @X x?bnl{̎Ï5׉Qd" *P@ܳ:+1Tp¤ԕ2ySNmݺU^A$I Ւ짪JPX~t,S1jҷ6nzFmN㧕.j*fDC*Mлu[::dҒO  / 8I#9l#&j ә"<_F vu粁VADz?@@8ƍD|v7GvHq26  g:OTA7lx 醫ûlL@@ ~,nٲe>7TӁ׫WOmfժUk.];h=t;we˖y'pO+LA 7UnO߯F^i{ټEԾN^Z^v#]nUF,R5ZQjݎ}Xܧg  Pau]ܱöڈO8pr2@@RwߟܤIg˼y?fQ.]Z9B{Re +C+Vw}'[N؂E W`mrt[yt-R: b5JjVNap|{TD}.'&=o*ODa@@ k޽|CߡF6q1@(1%d1m}N_\_ /# @TRx 5'xsesE'"@JGN\]n׮]e` po۶mR]I"_|uȇZ.\д 8l@jqģGn$8)WGo|S@@Ȫ@x\= C݀Op!3R  PRի%0yD` Rla#ѤiMG@(BЇ%d{l{|xVٖ @S/*PVĮc:/]#'%K$.h")͚5I P߫ o۞8 9q#мiH|NgVڡП֭bh0iT!:b4nF5k&峂  @6‹d`DM*A@[ܽ;6P7-3\{nvzl%M=^}kɩ ꫑ڛ˅͚HyfUPYDԨ졷ޔȢbR7 9ڵI=ѩ[%CQvđ2KGF   誕_!v`~I   Ѩg'"f\tϻ'C@T@+ \1qy5ꐉ .P޽[o!Æ \O]hӦMRҥK%OVL;2pG e?})ɃݻJS`vg"0~ L|Bs>]O:"yRR#~[5uZg@@ 33,F$@@"_%I%{XS3 T/6  @d5j]m:u;Jqm9  "yޫWq3]v*ҡb* ܵk|Gri}M/_T֪UuV(T=pMZgL0+!%VWzhzIyѣ?r˄ +//'层@ ݤQF]n0#uQI wI՗ _Bj#  )h!#ͻNz@@pKſ=sc@J^9;t)Wf &! @x2{o%k7MKǍI$#,d  p/m_~ /X/J>ԦMʰaÒMu8k֬RIB.5Ș b! 4wΦ͇ԍMH}574 >y9Bs>%p/6G@@ 3K$0C̬S'6!WD  )`SR$b~} BiC&  P޽6EcMS_Hw߁\@@TO6M9Z?<)Ovm2c ٱc,]F˖-e̘1G бܣy.5%;=Ƚ٭‹gz#=C݄DB@@ W $ܳ#%qQh1@@(9۷wsj䙆w @@ ?Ӟ/:Z5׉m \ }j$^{MN?)@ ҪU+q8vٳo߾n:Kyj/SiX/pNO:ȟyP=MZ/;~m:Uu1N*B@؏{~@"jCM:=pq1:v:Ԫ@@"VJ`D~M#wv.ޡѨqm(@@(N?gA5`! 'E@H'W kԨ!wq\}2a5kTK]tsʹ+_}Uͤ{2eA$Q-e{($fuw#sЊpc7ek+C  +Y'NxIԜڵEPVI-c@@h]$3~͚wq}L:1@@9J'Eȩ^u84-'@@.=ޅ֭[ctGʂ bO?t,}˖-ҡC֭tIyӋX+~_6lؐ[.JY Z.keX8y's{ęڡ#Yxgh]+%'mWSj^0MRY0D,ǐx{gMr)3ɬk\Rԭ'Ҷ.׼ġݍц %8 vz7UqΑ׋Dq Ȕ@ʭ[72SH|I6nܘY3s4~x9g.̈́UQա;sD믊QQa5}~: <]v;?S1ٶd"jf=i2P=U@J ]N|zj;v_}򌷙gcV!]_i|HdJ owΝXLO=!>+/#Gs}8=?L=m{bkQj֬)^{m챟M)FLTo~jyye6ygYkoh-CQ Ϫ[GΫ_WjZlGC=6m&uk3XqS1S3R1 _>x+dK@}wz K W\mlΕgaJhUgŽhmg'%'a@L[ ٠Qxu}KCYiKFVz鵙n'WIU]nlo,q_o{h]V珁.3U_e2A\M!SU *V>UW݌}e1;LjN%p1T^L݆ +,ԘA=2IU>,$ddA \i "= !U"P-N=‹Jz6zHYLW7h C!wVwD2վaĥ=H$DO8Ai6bReoTQ@BvQ@&Ba2)K]%JK01?R'1[)&綺zDԩ>fˎz^T# Ey@YWJOҟr#HW*ztK=TVD6z ~^5"li߭659>Չ?ωٜ֭ )~ެ?sqn7yGbE격f8O'hJ\wR~/ߟ(}C_ !Im۶%UWVV& L Q:q'S_\iωǐ=-gL5@Fd"߭p "e'To|CwȔ^&&}m@_%!) 3uS?չXbkr<#UL..,I&&/i^*7C{{%n.b,ϰĤ?r&/>` W޹a/M>'gzY^dw j+^wmԤ/0RX/> B?:^ğ {j4k&eoaR):qqHF /g=_ o%uoЉl<;lC䖋7vm⳩C"ws@q+ߥlBB'9K\}~Z&hVrh_jXOyf1dY_EE2lC$Y3t>a۪]=Nﰑb0 O2o.zMu)W^x*Կ9Gsl<%=@dŷ߇mX\,QE  -Rp؏KvmԈk-xC@J^ p$Ma}21H}$@@\) %jkեm9  (͛7~:o߾I2)2YAf/ݲC SFq ٔl@@,ݾM'ѯ==2r@@J^ v lR"/MktxGnC  @ ~zv5ݯmG]! aC&  =pߵkL2E{=3g^|n7uʣkVv-cƌ38#{zԌ@ļ'K7jT#h@@+ ?x;vXLzwlRF  @i {%, ZY+ ;xN8=  P돏=* Ff:qko[N&  @v6}ӦMrwˣ>*;l~ˊ+䣏>{Nv*wue}O PΝRq8~2ؗωTTXIq}D/,WJ  PW_)&9;vGNatD@ȉF PG>-mr}EQC DB@(=}Cd`T }qx. :$! T@^#;2tPY~A|-^X.B0a92@"߯{ܺ}IS)j:ޟFbwvBE %r_lwC;޽{E݉d @@TTGƂ.(  @\ L(Q.9?AW G6!@@Ÿ-mmO-[5j{#mD@ȝ@?C2j(F eڵIF"ꪫd֭r뭷&@h LxT$t٥n%FeF9<P ENnTn  ^-ƊfJ`uFqu랩@@;wHpt ^8;\GnѢ,ZH9s%\~jbg* CS}I?xD}nmu7ēe   S.9ݷm[s<]#-'@@Zg`bѾjJigw`1j׶߆\@@n"Idg}]g" d[ oߩA6G83:ñ+3f̐?P'۶mSСC+X@Q GM-36--,ed   MDW6Rܧ  P10)|I;j#WUP  PiJX 6Ek7^y87-'@@"}ҥ2mڴ$v?/uI?={/g}lϿo2dq8R"#d}X$ijY@@@ a5jE4g4j,cydKK  '`zE Qxש1y  @DׯG%W=V{)ڗ  7y>s$ZRJp{c9FNkYGq#c(3sJYq{x_!7  ]IhVuxcŨY33  @ <OOs{S(+߆\@@0# Jt7EN!a#Ũ]=   P y/'YΝ;'ȑ#cA}]e5zJ@̊A,^d-ޫ=e   s.uzD}nm032q_t1#nZuA@JN  N~R"_,Owgjh,6  @UУgdԫ/+\  P8ydɒ$SOT@.K#i@LӔЋKgl,5E1,$@@r-`x?7׶iws3X  @DF&Jtʴ]vxx ȴB  !`VTHpƴfT|T n @@ DڣkժDn:5dTHL˖-KnݺI $`D|b=lS#gZA@@ ѵk⾱bښ+ko׉'YA@(m>Ms>Hg-;|8L$@@/LO<&-G5j{Vd" @u0ji޽7H3*hѢ5j  P( ?rFqik)#@@\>' EKsFäl-hRF  @iᰄ|]fh{@~G+H/@K@{,v&[RF  ЁJS%MN!ޫ-'@@KK`bnXoYWl)3@.  @1 4&km7mۉOhƀ@d" ,PڮO>W2OKM5BG&.[nMwI .|e N"bCuK#CݝNB@@ Qkvϐs@@гRLȢih^GE@(}1^\>XgC$IB@(> ܿ;/ƍ;dw}W瞤zt"M6McW37z`a*Xk9  @ |,Cv(oqنH  '`| ;Dcz3h{jWL  @ jJ`"=wv*+Gd" @^_xҢE Yzu}'M47Ty>|8y뮻`c@ -?ҶQ\ ,-ed   m];K1v!gw(1jP?  @ >+)O-yCUQ=O<_"W  @i fyQ|=@Zb{f_N.  @Q EWM=?~ĉC>_^~_O;:SSrYEO r?pȮ]sl%oUw7  @={?!|ȶ)Egeb8d" @D 4Q_ή;t8@G$@@0Q }F$pxxGyr2@@O /5СCeҤIo$)ϟ?_:u$;v=zI5kȢE*z;wn&aرcX@I |z2\*ޫϲT@@r ~'榍j ?Wce  {gΐ;o;o4i*a#եkQ[9@@ DV]vn]Z\ݏ-'@@x&]Ϙ1Cz)K,Iף/_<0aBRY0#8")/7߿b@j0遉IcQACs2r@@ȁ@hxqۑb #Frp$4  /z{H`t5ӏmq{iPD@ȾK$"m3zwP1j԰-'@@*bڵ^K/TΝ1yK  %)wUp).eرݻ:d̘1r 7Hyy @.Bz^5kNu׋h @@@xBRLM7qhR*  @ ^U 컩f^:P\g߆\@@0+*$0I8/||1pAhqgK$17o{ul}m9  'urʝw)sΕ9sȼydUm۶ئzv8#gϞ 'f?bj% f8,;o[Nݝpx]b-#@@, j6g$ -9;^| FY r2@@O Bu=sjۤݽR5Ո5knB&  @ Y|?J3BVOlV"˗t~w_O 5& @@@A֪UK{g@j6}c%nQz@@,ݹC//[[7b^6H<^d-#@@(#Kퟳc' !N5& @@@@cUJP0mp6S;;rs@@ D{`yFA ;۶Zc4k&eRMY@@@ u{չO3%gԩ#g,# YQ!fIWE"^wPqxm9  !9C߯Lg<^5@q9G 5  @@;TC$ <1A$]|7(FY K  d[ km]{4Zue0@@LӔGs$8m;-.EoC.  @QDn[od/GkѨQF@@ x_[zy$`F`hG6wx\&aؔ  @L_KxǶ=OR\jM  @D,Hg͍ܳG53R  ;f?17oѸBn)#@@l ~$# Xr~F"M-ed  y2[޽++%\f"@(j3?u#et:q&3Q   @Q d->|0oLƁ!@q>+WCAKG#t   0t)OI7lrSW^-m  P$8IѳKN(n@@\3L֕"@@Zʕ+eԩyi}PKÁ!Pzԣ7}qwAG!-'@@l Dl$ k.x.ζ  P4-%8i 8m[wl}Tm(@@( Cc@Lu]$@@"46 @ {%tkx^'  @Ÿ/ݖ 7z8[  Pi2|yPȶSFyx.,zv0l!@@!j8Gf^5  %2Iȅʷb=bn`i.04VqRF  0MSB*)8sZNMcg7QVj  E"^$=r:}9?@ې  PcID qپ皇  @ ^B/6]E -8;vM7Q @@)`<(%ͨ9%*9>  E ]&?)e퍳6BK   +:d N& ^?;# @wA,Z*-mzE' sL ]r9W M*JG)Uٔm@@ TK_~)O!CiӦ$ @A j4̇$hn^y{n-#@@, {G&Ö[o-hRF  @a 9̖3SܹӾ3x.'.C-@@؟碋%r~6רf<,Vr@@!N:)6J/({=y~zrgƶK^zۓ@tz/1׭>|7*GY@@@ f0('&Hx·͸z%ޡ#permd" d_ b&?!Kۘ넓b3NrcZ" @@lIJoQ#o"MVZR6h,d#  `/_۷o/SL Sk&@r$Q5=o{tMrFvׯԬYӲ= @u &ٻr7ZY @@)ݰ^?Xx{5>Tk9  -ݱ#6b=]r~xWN6!@@} jKooz5Hd;;&hxQ  @;E{.6Shs: ^?jit!Co߾a8+ PM^}a5ojr-# 3u@@ ?DyDҖFG7a:?RF  @ 7[oH"~y`g5jg>Gv#G@ =wKP]5빡)Zx&pse^b  PYpOF4+c͛7ˌ3bgV`ѽjtd=~ԭ[W.Xg)N3j@ 3^?>ïe   ESp|f^yɶ '(+-'@@0Ÿ/'\C@IDATTD0uz/^>Hڵm7!@@p4j$_Hw.5w+Ml  @@N+[U 6gڵke@? Uo߾]&L{4Q'ޣGjYF2.ݴQ?X6ԍ;Qcٮ @@)Uߓ'ѯ6F "[A@(X}20),4mmftlv @@Ș62IE  ? T[{ мys[b+WVھdɒ*7l w_ѲeبC .]Tn }"{v[sn-ѷ~}K  dS ycC̀fn´Ȑ T[]g?O|#=h98j#y._zAB, m"F&:gzlw$@@@@3pO4iժw=`:qUV]w{tԩ2ؽM6۰@W%FCӴ:4^un @@)| N"Zqv$GC4DB@-9C};ZśfL*'?nnJ~VAsXC@@@@ P  ;v(_bEłݧM&}f˗/?/zTAaV  `POǦԍKCsn@@ȪYWȂOlqx. e!  9H/]sf ubT'?)/٥xGӦi@@@@(4pO֭}ܹ`gyF֯_Y~*_ZN;Xe]& 4܆CرcKrJdݺuRV-iԨtY+-Z82PC$ѣGˊ+bOyyyjb#)DWvK}7,Ne   EX17lRV&oWe  T@^Y"Xdb_ٝv?q>L\vOW      @ L{\0 9Sbc{ v9slQ)lcQF9#Çn>}ll񊊊MY>="_Kp{5Z`׮]M6b Y`l޼%=o~?~ԭ[2? K, R!$RLuK%{E"jsE2r@@Ȣ@tBU+6Bܽz[A@ %dqFE>Rg>*A@@@@]hЦiʧ~ pLf'M$|ARe\s\yIyz^_֭['w}y睱\ ~\4G&ݾMoG^~>J\t  @*"{XZ161lY=cY @@[ȂOm8S Q     @ EU|Μ92c 9sYP_>{ʴiӒ\r%Iy~I5;H$_|t1YVuPĉ JCTZbnn7hRF  0wIhL&]ŨYӶL@@|ufF]뎮Z%Gg>jA@@@@ @`uj>}<쳲v*q|>9-% wU٭[>lYrӯׁP(t<]t+E/`OO[oRq_ܟ![2@@%YBskQbN 9  @ LTMԃ    @>HA?c`].up%\"u֭~ld/o&ظqceaYY{챕Z(//],?C9eΝM zkl~-<%aF ~Ͼ2ZF  YR3^IqT#SXG@s:Q6@@@@(* ps΍=c u jANSz j0`4hР^˓֭wς 2޸qc-'|rUT jvDLIS)h޼H{O@@Q % g#!C8]  P-%Cogj@@@@@ HYj7o^eP5kԢᐞ={Ƃ/2Aͤ ,[,'o%uUVo.ףMzyRi ΑGEB! jĨQRF  [+JfnW\'zdyE@ȁ$8c!<    @ǃڟy#U7 #6*A/挼\%C諯JڽYfI[I`բ_Zf*կ__ "\r|LUK=*`F>UBlE3r1M2$@@r%'-M͚Kͷم  PXzH 'Jt~    @uP,:]?Ԯq?H-ZwmےiӦI[iҤI&eiذaRO.^F9X¢ܽ['e[uI2r@@ȒHp m N׉ͺ>d" (4DQ9w[ZԾ    @uP@#ѻv jףnͅܪez={/$2сT_u«v,'YTe߃FDTpM&5}~͛]T7T8n%P{Ѻ!9" bE @}N7` c3l=@@odb>;GK&;u;WhjQͮ%"+)el#SF9̉6%Ts3\}~㹴Oitb3]O㟟tJ~n}j%.!m'Kfxغp=_9~H9 įm O49?z`F<;6d,K_1,*{-*L<U5)ܦT\1\F QJP'֎xN?ﳜTc;%y:3]v-}݅L@˲;wf;Yǩ}S&<'>yd>\V1kN l?裫B@{+U}?=òpB|ҸqwON۷oOj^zR 7D>[$I+vRRFFl v) 4|X۶mP(Tixnݺ, M6Q7G,58(N}cǎW#3T@KI}V]CDs[:۹sgRwG8 i%l vrF#{RQ#K#{nٻwo;DB 7oěڵkg *q}}Jꤿ7JgH ~' (db9~,'u?ԟ˹8տΜvSzq O{=kbWC6L?HdJ ֭[cLzO \Lg659m9 stG.1B _(jEXzagΰml!Fl.E\K+g !WK̆ u9Wg}o#Ws~ic;mrl OJwmsKïYl})3>:αd_ oY\L $/#37~#3m29ɺu-k<@LšF/V@9vzg' yL/Waωǐ\}6%W6r_ ,X.KSrl F&c2,zbzԏMpW wKd'V u#wU>@@$ݴQ-9igXA@@@@@@@[mYL_ IOwܪU~wؑ w(y6Ȉ@tG?gi}og22@@Ȗ@a{,MtHK        ^ k>O5jeJ J@Z7`I7h@^T%,^Do88nEu땰]G@ȥJp mnljQm9        ^ k @˖-:nݺ]6iN:%@:+/IpTӴl:xG^%+ke6@@(mSl~,_f0 \6H\(Z&!       zf%=1-Y$qu˩wyAi &VSC>2r@@Ȓ@o81m`Ցy-8d       c^#&$DؐHx6-(#mM;*6*ø[d2k<|_ 62:Q#˄HH3@ @ @ @MulYM'pB===}t4',]2s̰{Nmxo8$|5}'3 @ꊮ}eN=-  @ @ @ @LpoPk~y沴z{{˒<(Ks@ U1#l~ǔ]Κ5 @7풿ޟ/Ƀ_h+ @ @ @ @{6ȥǿ˿įBs'>]vY㳟ls{WɟIxn!6nX:uAEok\_q{ߏ7%:0 @Yb3bǎa%p`L>:I @ @ @ @&&` /;/>Gi{#WXbEڴs9{]wk֬)%|Mp/q4N<~zxO?~~ysR @T@``WףgׅF/ uh4 @ @ @ @`&On_xq}q75u&.4IvNv}OjprSh\FvN @Jo|)"zrxtt;B @ @ @d&`{f͓ч>dn!K 닧GZ{cav^Ŏ1yk?-yGWŜ) @*"Ȫ߲͛﬘|vaI @ @ @ @0=[Ϧ-~'Ƶ^/c```Ķ?ł FYQ``{twvVmo? @@GוϮ{GGto~N  @ @ @ r+@s]]pY ܲ1F;' @@%z_]ۇe߲|'@ @ @ @/`{J$=??){X;.=/Zk9  @oF̺c?-Sx^" @ @ @ +@C iФ- ~"@-W_\}=:bcҎ3> @ @ @ @&W_C``{ U1'esR @R``h{hٲ9bpz>3c`}#چǣ+bWkOL'I @ @ @ @/`{@ Ե@o,^x~X;Zfώ\mvN @~D[LFǻΈ-woD]Z'O:cưs @ @ @ @06A-ԥ@/WD?]5mo䡖iӆ@ @`O۶E?^}۷GO?S/}+~1GǟE n#@ @ @ @jW5#PoD࿑I=+ZF:- @n_}5_ذ~וN{wKe;O>h?d @ @ @ @@m ^VjV``pJ+^IƤsR @B`7|wgAO|2Z"@ @ @ @jIZ u!P61a5moL>vaI @ 0Z |b_ZeKG.q @ @ @=kOԈ@M >@t]{U ;oʘ3f|1 @Q twGm–9wW @ @ @ @5,`{ wn5b``X}w 'p$ @Io[tH_̧eF:- @ @ @a3RksT@vtŎO J[[t48F @ "{h?l  @ @ @ Q+@} Bte*2cFL'mI @ 0^4j!| @ @ @ @= g#Wh:GVEWFl2:8?G;' @zz't{ͽ}e @ @ @ @0>I- &Fz2yeҤa$ @@˴'EiJv @ @ @ @0~JM TT`;vӟ /5:Yq;B @ #CLrk}!# @ @ @ @ _Vl+sCѺiS3oћceJu3{.7^) @J/>w&4[fm>AF @ @ @ @^vd[o~;I'#:xwf]t]1w^:|ٯl @@EZ̉&w2L @ @ @TO+@}O=]pY E}?v}$:?hyK% @L/Sl_H˚ɴe˙qxnu @ @ @ P5PU @ g{>mۆOnoi4hG3}} @\gp|euvхƱs @ @ @ +D7 l:rXFS;/.X>&@ 0IpRDooWF{mMd @ @ @ @0=|tx 2mZLEO(7 @B`=Z~Cע'v//}u @ @ @ @u!`{]tJص@ww]_03+d̚5ʫ]F @m1%įgˣguhi}o^'0%9 @ @ @ @\LpυY!*'Ȫ/`{h?% @ ?=wOoGo֍XփEǻ$Oxˈ% @ @ @ @ @ PW& Ĥ%_ٵ違ѺiS3b1DV&@ @ @ @ @ 0>.u!в=̚Uv @ @ @ @ @@JEԃ @ @ @ @ @['@ @ @ @ @ @@^3]" @ @ @ @ @hnܛ @ @ @ @ @5#`{t @ @ @ @ @ @Lpoz @ @ @ @ @Ԍ 5*B @ @ @ @ @hok=| ĦM*^x__߰2n]]]%@z>-=x^OXooY}veMz``Pm۶EwwwMUK Ŭ4kmeǟ;#bMcb}͹x-~c _mպb,W,R4~?CMcI/ϡ *7cl[s mG-~ yDjR,] }>ygjc4k,VG[\W{cqqm} ?رcG"Oil[|J=գ{kQbj??{RyTc+QR?&cGsbs^y2jKQkAInA3 }I88ضwSmͣQ]c7K齁?TokgSyc%Ky8ǝJY;]X1f*VR'`Q{}҈5q#jkdE$X^ ިTIFiΊ1}&Me囫4'}Hx@`F\*,l(Njooo,W Ts,V\%8DWHoCےlв7@צ皱mswޭ,9%!P|,6󘿗ƀyliCY]8i.XwIjKeL>= VVHzW Bx^74 o[Ef0& x N6-&OH;d)~R{@,/D$;@4 (XqyqYC2R\Σ]s+xQnf}YKeʔ)>ϳJ }?o;tk"om:kdV) )5:8,!,3 @ @ @ @ @ s @ @ @ @ @d*`{2#@ @ @ @ @ @ F 0~_կ~uغuk{W_`Bݱ}hkk{By[lRr_)d)ySƤIZ^M.0X,VJoׯt}\ƶ===m۶Rigڴi{e(&$;v(d1!J7 PsOuttĔ)S LX``` 6mT?N&O>=ZZZ&UdW_H#ebŊ\iC3f =O`=טc”2A`H?3t׮Hc4cKymsO/8(ޯMomH^g.i6Y ψCm;F +{'+U5Ko汙嚇2$zHl @]` @Իw韍 @@ r- @ԫ s]㨣ʭ`[:C:m-~c oiuϭj.;toW'K]ꃍuCja,~ R|pc۴Ϋ\ii6}fƶM(@Zi*=NJ[Z*E Y GڌmOQ`Xu<9sf:?vae?d^N;r2NH',Pۦ4aN$VN4eQcUl6 Qy H㰡+ɼɯ+/X ^ mrEk yM?3hJC4~?Qcvu'ryzﶸTVw̟?,/d5e; @XvݺuwW:CZH)~3)bzﱒs ke˖Z&?cc;u/Z @ pUWŕW^YHV\Y:36/| |tSZ.!@@- lܸ1,YRV/~qg9 @@ \|zq} @ @ @ @ @ &7F?j @ @ @ @ @^B @ @ @ @ @ @@c @ @ @ @ @{ 5 @ @ @ @ @!`{cV @ @ @ @ @ @Lp.X@IDAT @ @ @ @ @4 яZA @ @ @ @ @0P @ @ @ @ @ &7F?j @ @ @ @ @^e`pVh# lݺ5zꩲsϏ)S9 @@ bYq1cF|Ci-[O?]V#8":;;NW^kז]{{^*ǎ;J՛={v̝;tl,qXn]Y^ו @H[Ӧm|i\Ʒŭ#,XPı'$@`d1ldqVzB=@İงx㦛nUV :ujz衱t8餓bܹYy"@İ PX]3[O ^@Δevr"@:XuܕJ@6bX6\x%< PXz 1 nؼys\zq}!---=>7onuy ayI+J cSn+ 4Dz3e8Vw c1E ԫ8V=$fa&?@֮]7֭uKZ[[}os9F B22'!9 cقSn+ 4Dz3e8Vw c1E ԫ8V=$fa&@m7MY+>2eJtttK/4|#8">ATLHİܨD@ılayf)7V cٙRNTG@R F@ Ʊ ϢGU@מSoa Xs\?, Ml'?w\)-Wo1޲t&_zvd, e *;rDz%癭W@ [id/ eg2;K9 Pq:J%@ 1,b.< Wq^{N HbXD%'p]wu]WG_җ,wf͚'|ry䑱r·{z{{;49C)&{$@@Eİʜılyf)7V cٙRNTG@R F@ Ʊ ϢGU@מSo ?S4}͚5ڷDzeb̙mM~)ģ>6l(]w}wᄆ`RTJ@ | K@Vgr#@ _1,_o 8),D@uı+lİl,Jx$@^ız9&@ a{:)LhOSO??UKLRiӦxOiwX 1]@˖gr#@ _1,_o 8),D@uı+lİl,Jx$@^ız9&@ a=Z_۵G@<3}RughvҊ^xa}..Y aYIʇj cSn+ 4Dz3e8Vw c1E ԫ8V=$1 Y#P7euMgЇ>n~jժtJ@ JR>TK@Vgr#@ _1,_o 8),D@uı+lİl,Jx$@^ız9&@ a=Lpkϖ}o|(;o&֮][YaY(ʃj cSn+ 4Dz3e8Vw c1E ԫ8V=$1 Y#P7ӧOI&$Ҥngyf_U6mۿ޲t6QA Pmq,W@ [id/ eg2;K9 Pq:J%@ 1,b.< Wq^{N HbkσK PmmmOĚ5k 鉽;.\8/^86oW./&}ѥ4;6QA Pmq,W@ [id/ eg2;K9 Pq:J%@ 1,b.< Wq^{N Hbk_GG?QΏ,YR9bm˖-bҘӷҏ:{]vYòPDz癭W@ [id/ eg2;K9 Pq:J%@ 1,b.< Wq^{N HbVp@ 3f̈']6:;;cѢEL<9?K_>N9唲 v 01lhn!@ılgr#@ _1,_o 8),D@uı+lİl,Jx$@^ız9&@ a{:HxذaCuQqƺ3gΜXn]<ӥ[O/.!@Dİ j cl=F@bXJ#@ {q,;SYʉcqW*a8sYH@ csM@"Z=-رcǨ+O::::Jg>Xzu)m<;n;ʎ @`$1l$iԓ8moSn+ 4k K{q}0VOtcqW*a8sYH@ csM@ģ>Z{Vߋ)!@ y" PX=3[O V`1,D=YficqW*a8sYH@ csM@￿P=gyftvv= bX?4@cv"l=F@bXJ#@ [bX#d\n^@+ =1,>᙭_@\d' Mʁ֮]\pAad&ۿ[g*/^d)۷ǝwٳKk֬)]~gDZF1szDzAzʍ|İ|F@YǰTf~1kf.7F+ VuԢmSn/ oDò4=Gm΋7e|׿>ΝՂ^000?p,_<$Ws_dI83zqWƎ;3gNa"|`uw7o.];}c/!@9İw&HX3[O V1,QggZfLF+:jQ@ ˶Wxf)77W" aYs{Q#z꩸K%vK+/Y$Rxۖ/_Ϗy敥j=Plܸܖ-[G+Vʕ+cժU]3>GQJC@ aZNQıl{gr#@ _1,_o @5bXjAX F.7F+ VuԢmSn/ oDò,d{Q#҄[nT '/.vcS/~-i{l~>V2eJcΜ9K @yİ{-'(X=3[O V1,ggYfLF+:jQ@ ˶Wxf)77W" aYsj\yx tww;)Vaۢc_q 7衇u]e;lڴ)~ضm[aox ;_b. eۃ< az+lj-Yϖ>FhıJZòzʍı͕H@vbXvŜ^H "O<k֬)&U.\8/^7oիWH+O4)>RH;1o޼4)~̙&%@@ c l=F@bXJ#@ [Zau>cyֳet 0ZqlR#@İl{gr#@ q,s% e1'܋ $VUя~T*GO?=LRJV{tkZN}٧f&*~- e< az+l0 ȍzP=[@ ˶yf)77W" aYZNnI`ɒ%1}e۶me˖@)m;?\rI[]vYòPDz癭W@ [id+ V@nԻׅzA'bX3[O 8 N@ 2dl=F`i23'?Iڵk~wѢEL<9?K_>N9唲 v 01lhn!@ılgr#@ _1,_o 3[ P^՟@s a?l=F@XJ$@ ;1,;˔ zʍDx 6lP:*8RXw̙֭~tkZ-~ťc;6QA Pmq,W@ [id+ V@nԻׅzA'bX3[O 8 N@ β5Dq5ӟttttM|3իWƳ;F;vtj41lDTQ@8 @@mxM~P ' m]ƵC5 P^՟@s acۉʁP;}&]@ Yw nYd$&VI N(LLomEoDzeMW_}ur!ec9G>>h{'SRvhH`oy[b̙syYkFoO?rwkw=b0 TX@6{S9 ׄ|B@eİ]k7# x]ZId/ eojl OB~J"@ {1,{ӉhDozӛ?I +pӦMqʕ+&j)SٳGuhlm۶E7֭+k ,EPv.U"ǹ[X} İE P)qRƶ3PW V9gʙ x] V9ccʙ x] Vy㱖v6֛\O@ģ>=PSO==\,]4ZZZ };ݓL4Q=M>}IGkv~|㪫©%K)e hBK/4|R4 Hw+N?x{o}[_ġ[u~x4w)1Da c6 ׄʸʕ|İ9VVTNBlL@İVVTNBlL@İ*z.M-¤Iׯ/L$I&'\Xg)f|Bw\v}_'|tYg/!@9뮸J?K_RxάY #,Dbq;3C9\MbX*:$Kc!v y 5E*Hnİdpʸ6DY ׅ\F@bXƠ;eglCj^Bw  1l78U=KivhN'N?ؾ}{N+ĦjUۯַ5O}Sqg KÆH @`Fy(\F@&T T aƵr5!u&A%6N1fl;, Pu U @`b*|+ ,H7!q=S@Z>ޕӽiU䴚C=7nLIm˖-#Ċ+ ȯZ*K;;;|q4;4@E7|s ㏏o[Β%K"}'.m17od1L&*ml jCkBmZ 0>1l|nc˸v,Z%@^'@`"bDFw\E@mx]~P ' -LpCY )}4o|c}O<1IiU)S'=Z~qǢEx h[nN8!/^\:1SN_[Ҥ{7=Hg& հODı^c9 xM~o7;kG+:jAB-: 0^1lrvV$@^j@İUN+-,+[h_Z yҥ1cƌ'&iӦ&տ\D|qǜ9s@@ XuM7fϞ]Rv:HZtWi{1N aC5 0^qlrvtN"@6&F?6ڻkG+:jEBz 01lnᆲ=и뢽,}1lgI@ۓN+5!_o ι,ZP=~N@ ۝NP+u!_o gY=KMy5>`irܹsKǕXɽNggg̛70=M(9sC P&VQ'b͚54=¾p²rxؼys^t[uI&G]JiG IEv3sƶ7 xMZId/ eo:4Gڡ  KHİ]dnl\OB~J"@ {1,{Ӭr2YB>Lg?YSL7ͥN~WĬYIq饗FYTRSN)o7΋;/˥e' @`wsnp"@&&dF 5ˌkǁ.u]L@@ n5Ԥׅ"@`b(r 9+1o? 9xLj J#*#_ַ;v(M[.N>qDkkk,Y$غuk!_qiP I86~=il'! 5 #CXİhZڱyPO@ h2k5 #CXİhw Y+:k =Hj3}W2 S NG?OJŮ]6:;;cѢEL<9?K_>7O^JC cƶqPVN@ x2{ׅj 6kl{g M /jEİ9} y+aaUw;K MDbÆ "H(ugΜ9~ҭirŋKv 8yێ"P}fY@ ۳x0ׅj+ aƶqP}fY@ ۳QWJ =Mn/6$G&*&O:5ZZZƜ… n½8=x^77̟??o㷿m=)!@ 1}Wcef)3F)`l;J( PƵEƵjBmǵ@ NN_ f0m^+`l[}k{}יIuaK*"=.]t̓3gΌ='xb\vM˗//LlOmڴ)>1o E:xk|%nBlJc֬YH86JuҌmT$`lH-S1ݸ1Q+T[ض=|&*`l;Qڸض6A-Իm `l8/NQY'jP0iW^z*{qMr?# %?VvwwVr[2Ia}13<3:;;  7oK.$BزeKI'^xXbE|!i&,Rcc+@ {?0m7m>"y 橭,0ZVԀ@= s;ƶhm&i7o^\qI~\z饑6,Z~0q9iVVK/w^}ݷG;\{~ibMYzƶճW2z0Sw-`\۸o\۸}e*-`l[ia P)cJV?_cWcz9&@ض1&7fjU:I ԠZMd?H+6m\pA\rhNp2eJ̞={Tضm[nݺ|`XhQpeA׿8s +|8Hmgd,`l[ϽSݸX TJضR%@Rƶ|mk/Ԅ@ [/ƶhdpkiσ-]4ZZZjjG@>hSsXcFu'/niz8?}5;?>qUWE___Ԓ%KSN24@|4=~5]zW~'ַ/C w 1iܹSX&vmkT@] Uw,Ƶ40m~JY f-*?*-`l[iض6A-ԛm `l۸oNvG1S'PMx&Mׯ__:/L4)N>J8zqEx&zqWƎ;Ls)LOS{zzb֭|'6o\vq_JC@ Xq vZ!>V$~Wķa|S38cX86j ƶUW00RQM/`\O'0ZcJj V[muN^m륧ԓcXX H }s*y ŕ{k{)MMJ޴"rZ7Ҷe˖xGbŊUWZݥ󝝝>8R[ ţopG7-}Qgɒ%~q|?~̛7oh8VQc+@=C/#IƵZO`ƶr0vT|c+@KO'ƶ0X  @&o}q'f:= V\2eJ<յG/.Xhu#s-| 'ŋKǣ9cbԩ_tK~Ʊ) ı  Pƶ7jF@qm#.`l;D )`l[V%cZ u!@`wƶis&7F?j4@___aBk*K.B֓ wǴi _~ai>cΜ9K @R馛Jg.JD)a ;Wn/W?/ݕb^;P =c5"@`Ƶq"m= 'cz-u%@@ƶ+ ێ߮^l\p^* @VZGK{nuYk/R)-zqEEkkkYX6m?pl۶-ZZZ7 zC;wFOOOin-::: p 7Pv]w]| ,0 qAf0mV/`l[}m%uM@ƶY^~Vp>Q# 0>`\>wq%Vr/e>+LlOIgΜirP  H?f͚¹4=¾pa׎6aűyXzu &M>6Ҏ864TGض:J%@`|ƵssEضYzZ; 4mcV @Rƶ/0jm9\k-jCZg?Y}SL7ͥN~WĬYIq饗FYTZSN)+o7΋;/˥e' @@M d0 Shrc&h>:0NSe$`lbL63ʚ"@w?jť!;&K@,YӧO/c۶mlٲ(u'}K.ZN}eldBXɀª  A2Lă"*"bgDqQ!D5.첆IL$@@mo9խUu& ɥqu.,)!@0mhkۛ8B0J @ mi @v涵$zGܶw.-m!4j㴋ivm0o޼;FfΜ,Y6nܘT[lYXfM5kVhjjJ!@@_ d8&Hjժ0x0}X;C {wXhQri' ꓓv @m*C@ B~*`nOR,`ni:Xܶݞ^0u҆  @_(GuThnX$wm,w_Xvm{'1mwNU3q㏇˗'<0)!@0mh v(ܿqw[$`nhi+j+mki\ܶ熍z "@ĉY~ 1A}ذa8 ? l۶- zի¸qݼ+\O?tx׻ޕ @@c 6v|@VkY"@@}mm~ @om Xܶc|T{ @@/¬\ ~gVK?êNr+=:zI[l,YfΜ;bgo1=nׯs̩}U @RK,]ۇ*s9g)SOW\.Wof< @@ 6jd @ZsjO- @@;:4̘1#)wIcƌI\rIغukq @0 @m_ɺ/ @@mk-IpOO @@]9|p8p`R.ܑ^a @k-"C ]sʹ @m-"Ӟ ڶi @ hӦM m];üyBLdl9rd9sfXdIظqcRmٲea͚5a֬Y)9n @@kk%9 @}-`nO P+sZI93-&@ Ps &:*47wEPk$@PB( @^ܶC @ VϪIpg] @{&-=/' @@ 6ZD @ݕs @@ 6ZD  @Ȥ$LU @N߅\  @0lhu mr ُ @T֍ރ  @zQ1݊ @up @^0E & @ȒTf)B7zNȚm"? @+`nKpnl @@KeÄBC @z `^< @4mCCc @z `nT{G @dI_*;Ԕ.  @@k3T]"@Ss~x&@dP6{Am^ @Fdҥc ^{m" @ @{ }o  @ @ @@/ w}Nׯ[n ~zxᇫ @ @  @ @ @^hmm oy[K/qv 7VZ֭[<;6߉+E?  @ @ @m M!@ @ @$\sM3gNR.2dHG>>яCJ׮]?pw$O57onw @ @{: @ @ P@GEKKK*۶mkw @ @{: @ @ Po_ @ @ @@Z$%RI @ @H @ @ @@F$g4E @ @ @ @ @ HpO[Ĵ @ @ @ @ @ @ @ @ @ @& =m^ @ @ @ @ @dT@{F[ @ @ @ @ @HEL{  @ @ @ @ @ Q  n @ @ @ @ @ @ m1%@ @ @ @ @ @@F$g4E @ @ @ @ @ HpO[Ĵ @ @ @ @ @ @ @ @ @ @& =m^ @ @ @ @ @dT@{F[ @ @ @ @ @HEL{  @ @ @ @ @ Qmm[F[ @ @ @ @ @ "+(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, Hprt @ @ @ @ @)`i* @ @ @ @ @, =7 @ @ @ @ @H@{ @ @ @ @ @Ȳ,GW @ @ @ @ @ " )  @ @ @ @ @ @ ܳ]}#@ @ @ @ @ @@$(XJ @ @ @ @ @, r @ @@5=XxSO=ƌvy0iҤ0|jn. @%q}mΘ1#?^ 7pC8nܸ7)O @ @ 4mkau @ @@"p>,]49V.̚5P?Cƍ~7 #FHqg#L 2$zI ̞=;[.#_~y|',X 9wn馰;;蠃wqG8p`ѱ(T^GyFEco˨FZaIcz͍Jǯr߼ysxի^|0hРC=ܳ7 BSSSh`#@ @g @ @~⋻o<N!߶lْM~{7)6,ٷC''WNn1yd',z6mJw _X_R{%&?VbQUuz b kL鹍Jǯrvgs%^ziغukx{?0i#@ @@s @ @@\]\r{\zv@F @@7j91c'>2cƌ0wܹG}4\xs @Ⱦܳc=$@ @D+hwo{8رcO?ڮ @ȯƞvO~aԨQ^xEoN8pvZ  @ @ ܳW"@ @@஻*u.qƄ%ٷC?WiQ=w#,VhUz|N_{xo[ɷ}km-Wo4#ۏ5V+j1u>s5\~|1p ~%;zh8qbXvm% C @2" =#  @ @W\qEscOu0k֬C w^ѱX]w]O~,Y֭[׮N<=O=W,9#sGe]{/O'N;͛m;1A6;N.\__s}/^6o\d//O{nʼnߕW O}SgUj,X{L~2eJ8蠃»}q.>1%3b0w𖷼%¾},d[|WFօ񾰡[+:k#/5fYL1ǯu4n~oGWyk~=ztK\8o*wuWo?J.W @H@S+?y) @ @L &_ts ?Їr+=(SÍ7ޘKPA$Mׯ_եDWt~p駇g}j?iK/sݘdW/6lX5^p'}# |["w[Ly-bb5kBLʶ-^/Dswi0c燖="_1q/~0#j^uYf\R` Z'>.*J6G&MTz]J'\{s9=@LQ%׿O~2i%[\9[Vg}V/Kƭ^>qoc/U^mc-^~ÙدֈW ^_a:~~WX7n}5U:~ol;PW_+o~:ꨤ[Lv @ @ tř @ @^ W\|y?Cԗ_~ko0{$3uJq\r{_\9&6z)J<7~H XIo3}t/=v-*lFbh#2<7]Scw<tA ^/MnPx7{ٽ* ʭaSO[ir{|f\:&W OU#xwF>vKm K{ֶFjX8~EFb[; 'PT?>hѢ>\` @HS: '@ @V஻%sjqekSL 3gd &yVJj+Vqbr\pꪫCE+^aʕaӦM:qE"{6lxpe咿 o+_JN<~G䒂g̘^|_"|lkW,4)yX%!&wG?+|aaժU!?OBL,F7/ibj1W2>v۟/Zd{=u*5~\H7HW֨W1;W'|2v#5*7W8p`\\;Ο[>?' @  و^ @ @T)mD\{g-)o(IDATw}wrzzkɟm1i4&>IXymVwp'%?xpa꓃6lX.*=K=Cºus~sIɁJ*M:SgqFַ;Yvm4iRp׿5tvIꎿa&w-S C?^:KpW^$z-ր>,|^S{%^{ӟt?;_zG~wm?OKʥI`l7\dG-X GQ"}>w֗4[Ѡ{cG1O}k'L)|_>tZa4~EZa:~Wê.]Zm*C6hG^z @ @@F$g4E @ е@5 qy~>hc=:dɒ ʅJͻkdDoE=I|k_ 1ItKT-=/gϞ/ѣGg}6)TdUi/ܪ92!Cu3V}(9pc빵}{ ۞{.-+]jCMr0 _޹YQrh%?DŽ!J+E]mc\rI[lO6~._ԧ:=qy畽s-؞e˖//Jn6qс C4Yli9Wbu6n Ƈ,R{M>/6\(i +bk Kq +]}ڴioo>IN\ɳJvt! &V},d (yE8jԩSNn/.:DZ1c~hZrʮ.IΥiܪ! Fz{4~EFyشdi{7eʔ~۶m ӟ @ @ -"@ @ {1&&Sw7zEٴiSQ̙3:8qb_K%;o}ёkR9sE]bRnlJ;CQ{\=8?S)pꩧVqºurZ*nߣ\J߳>G.]㏇{N|U͘1#x{I.I3MV=n4Vɸb+֫+Z5]Shu4iRgTw7  @ @4HpOC @ @ 51I;*_7MXvmQIE;).)><`@?:)&wR~aɒ%{a޼yx\ONi9* |㱽քwsWmGhQpAs[bY~rlXP罙뮻VܜÇݼysQ9~D6pn%ia{\c˿޳:n^ݰpv/=F NT %=.Æ^ư"V=ǰ_ѵcX~ȑ#{ޣqnb @ @aW6S @ @4@LZC=?cO?ݫ -MǏj͝;7IpXpa /Ú5kvotRvnj O|%rjj[{+W& _+ o|cUr5]*<3Ec]St? 2+>nj|IJL1<|fbew]ǧ4 m +s K9yp9K?XVz[O @L@{ @ @;??a֭}ޘ#FtMMMݺ] /bzkXbE(Mw[Ԭ9sTpaaO^Qn\d]JWlmԨQv76+:nz|IJ'{u@'[w}9V1,Wtk1te߾žn )L @_e^?= @ @ +O yk__6=&}aѢEaڴinCLwAup˙Wk^x!?NM0!{I9k;#GAo~KC]G8;贈=4ٮd ga/Y޺3c[Z#a-[w=~7K' @ +g'zB @ Ї ?я=aСaӧO1cF;>);wn꫓ . ~R&ذaCR>S€ǵo;>>кߕ4}`{ϬzOW+W]{PڶҶWƍW饩g|op}fK׿Pu52?u絛Kư"f uĉEY~}ؼys(EQ \  @ fl4GF  @ @F/]ԞSx  *:WZx\tf͚kcz裏? ?Ag?sfgSss2_ >Pq?w9 9á)+W EH2eJO*J< u_z㻪s ۰C^Npo[{!G_}Pv}7cXe6~?W/\a=^{^*{E @Sl @ @i_#<2~ae>l܋8œǹ /BT>蠃4tXA'B۷t% |O|:4gt.ߍ֭ [lDUҫYWu]Ʀ^z)>W9 j_?~;$aHۇ~چ?w)cwsưʢe +~9jsqB۷n*/J#@ @_/-'@ @ +1cѽ>я#F?9_֭[pi rKشiSpDDFwJְݗOZM;!iмϾaЉ'a_4 >T.>NV|]?һ;& ><4rw\=ww/ߢE Oupч 76vL0xpخĶ#?5#WT{{4gVu\*G  @ @4 Hs㵝 @ @@_ ĕ[[[D#8")۹U)Lnw4iR8cŋsIq՟'ƠA'NۇG!?zuׅ;|S*w׾6τ_~9 =Ф{:8C=cܟt64ul '9ĉvڢrЧzgT @ @2!e2 @ @ лcǎ-aLYzuѱ ˖- 1t^*ܹs^oNoHN! GWU+㎢b>ջ…^ 4cŊ뿒rW;˗/W_}uQwEߴPt21@f:1sx~yo^C(_,;v R2тʠ2 " JbC 4% KA >_ ? %A e.yߝY3ٹ癝ߵr=0?8z{{oK7FN0!@ @)u @ @!>}z \ӫoݺ5tnwwcu?p_2X"v].\X!p(Ϗmذ![ZZ3h8`ɱlٲЖ.]mmm 6os̉}/}Wc~J%뙇9l躛Q͛P{aW ߒ>_ @ @ hp~eH @ j͗_~yVZU4O 믿.Vm?#5ڵkõ>vGĂ JF'N|C%n@I[GŁKܹ3|wߕ?.CwRSzf{wM77n_~H!?x\r%cǎajj_>0sXQgI&o-[ ygyŸ lO7 @ @ VeH @ @ Ι3gƏ?X^hʕz8쳣9Ҫ_|E|믿wy ˗//}徝?nxg8Ԍ{a9Ɓ-pFjNMw{{キI'G.nTx#<2^x8xرEi۔g_z_M6-ꆝQF7p }Zʕ a}9aMMMSۋ0_Tw G}O5} @   @ @iz14DB*/r[ }~x,Y$6lP}7xh/q,\p1qśogyfej) o' ̞=:묁iEj:L7 ܞr~}_߫TbWaQ<]#ϨkxCvvv6v_7?wHO @ @^ː @ @̟??>XhQpL͒v[tuuEkkk3&&L{n-믗c;Uof*V>C!pꩧ͛%ҊCmiKK/tSFıFZwH'Msg}W^ye*o~li+9lF gGzI߶vھݿuݺu F @C[=R% @ @C#k׮}۶m}}ƌq9U{뮻WZU4 twwcǎ?ĤIbڴiqeEzCն"nZM7X{89Li.f~sGn0sXooNsw2&j @ @袋bƍEncǎo&N8J*) @@UTƩ}) t`\ط=cq }%@ @*.0I @ @"U6z#v$@8[n)uttDOOO9tŋ˱ @ @ܫ_c @ @O?tC~{؀ @`<1z"9^}Ճ ;^z{'ƍW @ @^ː @ @@s֬YqWc; @#K`ʔ)q7A8PYfM&{2ܩ @ @hW&/- @ @k׮۷ԩScΝiӦxW~+ c; @#O }֛1cF/64(Xdӌ  @ @ hpxG @ @ 7+WƲeˆ kΜ9~hjj/ @ >"O?=ncƌ2˗#s  @?H70?ȣ>{t~8z{{+VS: @ @M~ꑪ,  @ @A`޽;Ė-[b۶mq)_\ԔCb @8Z[7W]uUzzzbű8qbzOc @O@{j.c @ @ @ @ @d)0*˨E @ @ @ @ @^K @ @ @ @ @y hpϳ."@ @ @ @ @ @@4׮&@ @ @ @ @ @@󬋨 @ @ @ @ @ P; +  @ @ @ @ @ <"* @ @ @ @ @N@{J.a @ @ @ @ @)=Ϻ @ @ @ @ @^K @ @ @ @ @y hpϳ."@ @ @ @ @ @@4׮&@ @ @ @ @ @@󬋨 @ @ @ @ @ P; +  @ @ @ @ @ <"* @ @ @ @ @N@{J.a @ @ @ @ @)=Ϻ @ @ @ @ @^K @ @ @ @ @y hpϳ."@ @ @ @ @ @@4׮&@ @ @ @ @ @@󬋨 @ @ @ @ @ P; +  @ @ @ @ @ <"* @ @ @ @ @N@{J.a @ @ @ @ @)=Ϻ @ @ @ @ @^K @ @ @ @ @y hpϳ."@ @ @ @ @ @@4׮&@ @ @ @ @ @@󬋨 @ @ @ @ @ P; +  @ @ @ @ @ <"* @ @ @ @ @N@{J.a @ @ @ @ @)=Ϻ @ @ @ @ @^K @ @ @ @ @y hpϳ."@ @ @ @ @ @@4׮&@ @ @ @ @ @@󬋨 @ @ @ @ @ P; +  @ @ @ @ @ <"* @ @ @ @ @N@{J.a @ @ @ @ @)=Ϻ @ @ @ @ @^K @ @ @ @ @y hpϳ."@ @ @ @ @ @@4׮&@ @ @ @ @ @@󬋨 @ @ @ @ @ P; +  @ @ @ @ @ <"* @ @ @ @ @N@{J.a @ @ @ @ @)=Ϻ @ @ @ @ @^K @ @ @ @ @y hpϳ."@ @ @ @ @ @@4׮&@ @ @ @ @ @@󬋨 @ @ @ @ @ P; +  @ @ @ @ @  K:IENDB`glmnet/vignettes/assets/glmnet_refs.bib0000644000176200001440000001135514664706500020052 0ustar liggesusers@article{glmnet, author = {Jerome Friedman and Trevor Hastie and Robert Tibshirani}, title = {Regularization Paths for Generalized Linear Models via Coordinate Descent}, journal = {Journal of Statistical Software, Articles}, volume = {33}, number = {1}, year = {2010}, keywords = {}, abstract = {We develop fast algorithms for estimation of generalized linear models with convex penalties. The models include linear regression, two-class logistic regression, and multi- nomial regression problems while the penalties include ℓ1 (the lasso), ℓ2 (ridge regression) and mixtures of the two (the elastic net). The algorithms use cyclical coordinate descent, computed along a regularization path. The methods can handle large problems and can also deal efficiently with sparse features. In comparative timings we find that the new algorithms are considerably faster than competing methods.}, issn = {1548-7660}, pages = {1--22}, doi = {10.18637/jss.v033.i01}, url = {https://www.jstatsoft.org/v033/i01} } @article{coxnet, author = {Noah Simon and Jerome Friedman and Trevor Hastie and Robert Tibshirani}, title = {Regularization Paths for Cox's Proportional Hazards Model via Coordinate Descent}, journal = {Journal of Statistical Software, Articles}, volume = {39}, number = {5}, year = {2011}, keywords = {}, abstract = {We introduce a pathwise algorithm for the Cox proportional hazards model, regularized by convex combinations of l1 and l2 penalties (elastic net). Our algorithm fits via cyclical coordinate descent, and employs warm starts to find a solution along a regularization path. We demonstrate the efficacy of our algorithm on real and simulated data sets, and find considerable speedup between our algorithm and competing methods.}, issn = {1548-7660}, pages = {1--13}, doi = {10.18637/jss.v039.i05}, url = {https://www.jstatsoft.org/v039/i05} } @article{strongrules, author = {Robert Tibshirani and Jacob Bien and Jerome Friedman and Trevor Hastie and Noah Simon and Jonathan Taylor and Ryan Tibshirani}, title = {Strong rules for discarding predictors in lasso-type problems}, journal = {Journal of the Royal Statistical Society: Series B (Statistical Methodology)}, volume = {74}, number = {2}, pages = {245-266}, keywords = {Convex optimization, Lasso, l1-regularization, Screening, Sparsity}, doi = {10.1111/j.1467-9868.2011.01004.x}, url = {https://rss.onlinelibrary.wiley.com/doi/abs/10.1111/j.1467-9868.2011.01004.x}, eprint = {https://rss.onlinelibrary.wiley.com/doi/pdf/10.1111/j.1467-9868.2011.01004.x}, abstract = {Summary.  We consider rules for discarding predictors in lasso regression and related problems, for computational efficiency. El Ghaoui and his colleagues have proposed ‘SAFE’ rules, based on univariate inner products between each predictor and the outcome, which guarantee that a coefficient will be 0 in the solution vector. This provides a reduction in the number of variables that need to be entered into the optimization. We propose strong rules that are very simple and yet screen out far more predictors than the SAFE rules. This great practical improvement comes at a price: the strong rules are not foolproof and can mistakenly discard active predictors, i.e. predictors that have non-zero coefficients in the solution. We therefore combine them with simple checks of the Karush–Kuhn–Tucker conditions to ensure that the exact solution to the convex problem is delivered. Of course, any (approximate) screening method can be combined with the Karush–Kuhn–Tucker conditions to ensure the exact solution; the strength of the strong rules lies in the fact that, in practice, they discard a very large number of the inactive predictors and almost never commit mistakes. We also derive conditions under which they are foolproof. Strong rules provide substantial savings in computational time for a variety of statistical optimization problems.}, year = {2012} } @misc{block, Author = {Noah Simon and Jerome Friedman and Trevor Hastie}, Title = {A Blockwise Descent Algorithm for Group-penalized Multiresponse and Multinomial Regression}, Year = {2013}, Eprint = {arXiv:1311.6529}, doi = {10.48550/arXiv.1311.6529} } @misc{best_subset, Author = {Trevor Hastie and Robert Tibshirani and Ryan Tibshirani}, Title = {Extended Comparisons of Best Subset Selection, Forward Stepwise Selection, and the Lasso}, Year = {2017}, Eprint = {arXiv:1707.08692}, } @book{Therneau2000, author = {Therneau, Terry M. and Grambsch, Patricia M.}, file = {:Users/kjytay/Dropbox/Macbook/Documents/Mendeley/Therneau and Grambsch{\_}Modeling Survival Data- Extending the Cox Model.pdf:pdf}, isbn = {9781441931610}, pages = {1--346}, publisher = {Springer}, title = {{Modeling survival data: extending the Cox model}}, year = {2000} }glmnet/vignettes/assets/vignette_gaussian.png0000644000176200001440000065667613752553007021340 0ustar liggesusersPNG  IHDR kiCCPkCGColorSpaceGenericRGB8U]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\ 8eXIfMM*i sK@IDATxҥ EEHQ QbC#RJD |` QQA@:w}'ݩwgw<͙Ι3EBEX@@@@@@@@@@@H@4#           `΁                                  =N           1                                  =N           1                                  =N           1                                  =N           1                                  =N           @@@@@@@@ 'Gۨ%JHҥc/GI7ŋ2eĥ  RT6   @`,X`OpٲeiӦ@Ο?2?ѠAZjmV vgZ6c(-4,{nYt+6mH"E>|Xv/N?tMCB9W28C`L\R5k&[a䮻IGI7Ӳe㏏#@@H@PxIU㴋   @Pr۷oOkZl)hoرC*Wl>~xٳgd^ٳGʕ+Lui;@F8Ҿ ?\?|W5t7m$jrUwŶ7KjB+ VӭT0uEMcÆ qk֬D!///N~dرq$   (i@@@2GСCOJN|t*4H@:   Pɓ'kw暸vM[hPsܹsͲHC@@R"@{JXi@@@xGV{イk._;ʶ}(Vc(!  P`޽2h ˞r-Bh=-#@@HB$   @& ,[L~_e]&˗/uSRٶ p v1@@@ u֙UVҶm[F^ 79|o=Ne۾u-1C@@@2@`TTIz7t*Uʴ܎;{1#@@Sw?5i @@@ qҧO̴ʶLJ|@@@rN`Μ9駟Znw^㎳̏dTZU۸&Lyť  )@   @vܙޥu%1Ag@@@2L`ذa=0`m~t]P($#F.k@@@w⾷H   d5kh^D [ҥK<`[F37oX&S `{.8 ξȵ謇nATR1E+U$ŊGƤ\Y2i THٜ+ > 0~fVX!SLl}riY8sqƲt҂Y7xC4f͚$"    @@@ZN:RHlN˺R '2C2 6 ^߷ohHqL2ҨQ#mj |Zlː.ʹY gr~=|p˳\En,2UCdر2x`#  I f De@@@@@ t38q#6mjZe˖щVu  )۶mqv/7t3f9|YU@@@pO@@@@@xd[j` 2RseF6:  O:ӥA{ܦM9,OoX擁  $#P}\%Kd„ ꫯq?of#Ҫ\4xe֬YrQӦjժ%7p~:bCŤ|sP0x Y-Lko'N4n0_\9 s9ǬHL/+FPyLM\rW~H~x!ywSf4 m׮X*ZշJWGy*;?}СzJdn6[hankPbUת|L8lܸQ&OlgI,ӨQ#9=kec9V{ꩧOt,]モ<:aD^4i[2|ټy&J*%:yCǮ_k O)>n1]a+o$]Qofo;vh&_?ޱ}j qVa 1;6mo$mj]s#:]g{gA@@|@@@R?Y+fֱ >gvUߍ 4=l;%D?:z3J(Oo[z ;wƴءl ؞rmA/߿~Tc(xnkWJLnݺ)xp0nh޽1mEބgou=[~з~i&PW]uUH?.~>,\0U%T?|Qdɒ} góv&ԯL8[o o̰>^n:G}j}j;|#;#UNv:toA뗟7(o\\YpZ]veVMN߄踮,Bl Ѷd3C%c(G w\Fs8}8ҿ[֡   ~ sF    "l:Eg'Dg9{S^uYT-뢏*?3%*x7G#>)@g;_jULٳgKe̘10&鍶u;Eg!+W+j>7/Ŷeۍ[M4UnV /RfM-3ᜢOJğy ZnyI8]~ TjF'.e|̙3 j |'J]׋fOS*XPgݺukd׭['KJ(aY.> d0~fDP?AW#*}w={DDdiTӹs[3f0M'@@HFd   Y)Jݓ BRrȎ;rZb,K.;JxdK kd۶m.k k^tEqA5S4UӵDLM|I"=#N>- vAi$S׬L8YF:u$7o6ۄ4Xx vZ9<˺\|ŢU_~ 6^jn|']2uW7eOq,^{ͱU_~ `۷UKGK2?{C"+mĿ;?Hveׇ.Nm,_\֯_j  y@@@@ t[o7Ng5j67nh̘WgQƬkO=~P؛q P3o?F^*3+)M~|,ZHt\7Ilٲm4ON3.]uL)x}W_m G{-V^goτsʦM',ũ\qiѢ~ISնwŷY[nE=z j̶/ٴL>~pseǁ@v;6a\"?~c:ȩjZ.> &2~S.+c|w4{OKvqӆݳgdWE}@@@ _| ^    @ ̙3ǘYӏhKeQtY} i_gTs3h< L7|մ.=zhydօ<,[L|I׳Xk`W^HקO.-55)jc5k Y[rNW\i OJtlX,;N=ڵԩSDZɠ˱ 7(>A8W& Zzr,X f͚uB>:-vm>gTAl_GEr)~^;YKz슸'OuܭdHG@@DpOTz   9!Vvm_~NeFc%JA޽۪h\vT<8.,aذa2c ,۴*U ' ȑ#e@ڴQ VKrO6۾m6bV`pI'-,]ԘUٴD0ɉO8p~|u3 F9Rwn< *>d9EXA1n=uL-[qtAeժU2w\i׮:A-8sLћDEʯ~+ժUȆ dڵ2ydW7>|X~99%oP}qZ~9~.:he'8-UV5Qry4D?iԭ g#?"Ka݁>K["vewݺueՖŽ\[6B   -%    9'Prev.۷owտpiM4 텃Gן}YzRvJ/5n+fD.]B_|E(0\gtf1ܹ3f_E$ˡ+V7q;-;TX1}o+U/2:sc8; 2S[}72+eϞ=鍼vAꖿM溟 6 [$駟ZnSN9%ϯB۶H… L9վ ?M L7_ٍCv[(|s7UGjᅬ~%Kض~2c;_}3PxА^ D>;Vu Ued"#o\DI6СVZqוvۮbŊ۽;- y²`[10POL݁~'auIo.q}p    -)@@@rN  ^z93qz RJLboCsdɒ4`$hxc:իWwݦ,-!/ŋg7x/o4|ݺum|Y]cǎ~`vСC{U[zÆۅwgL8g_9w;op+ؖK>LkРPoҲLm#`[nWVjSJ$dW+?ޘ9MaxrNm}ݻ }+,GK P0~~2~9}wu|1¯J*Mmٲű @@@5!   .իWV t qLs{i=%TM6ըQUY},4zꑷuleڵn:s=7nf7o(g#  A4O:Ɉڵk;SGmʮcրߖ۷;M@P$R/St^$:zͅ^;7ncwƍ.v<1~ƛDdFP}5㧈w?޽v7+W5]nݺu]!  @@@@ 7oy);r\׸qcrft_ ,Yӌ?,-[tS,ήxx/oY ws.Z`5' KRӧ;8r>|8Uկ~%+VpݱիW˘1c hڷo/1{j\eW0s}']^oI(Z zג%Kگ_?2|b 0~pĽɖS7,+`HsB.zC& ݩH|^^^trkc8x  I $ @@@@ ޮ[GZ~mftIe $SתMctfd rw)SUQ @NK(,ZEg^5rJ5%ql=hP? ϗZfϞ-|9rY=5^{%?ZygDޛ5kf>}A:_ AX)o:}| TS 7ol/q3{9:>Ė4FF} g#J^Z?cfonm^' vO` A+Wn@@@.(   ?wq~5E;)HdZ?#XgsZ R/[۶msZ x .V5UTUH!/A:ѿ#guVBH@d [xh, d9EύsXgi3g qssj'|L]tSzfZVw?#FN8Aj[aÆu/*=t]<(QBn&ymc~!8qm]۷c-Q*1y?EJ9G,ߌ{/;]Wmkŝw`A@@dpOV   Y-Pz7%7bŊxbY,kZmP&V@o" 8%/[UD zH{V'){e~/鞁^_͛˖-[Ts,i&9r5Ju&C &M8֋j"KL;~u*C ]b̚5K=ܘn4oz%W?n}"?#ֿ=~jCSNcS3~KgS/z덑Nm  )P477F@@@(k+n;veUZ5u"/NܾgtsԵ1gKu lv<7sC"   VwRC@@@Hd6v<젓՚6&% >~w.T p/ St&;OnǙtJ,Tė"+IwpqW__<(ӟdĈj\o˂|.d;kҤIȲuV6mZo!+G.gLDͼcgz'SLd_t鸴 zx  /@{c@@@<$yˢ*ŰX~}[ϯW^ jF%J%˗/C+5A{r~vNٲetI˄6\gK ȨQDfc߿cVL2p+Muhy r7oA p(o}X"K/Zjn>cƌ2'O#G7{Ѷm[93̲ӲPpOe6f?]NK*ڵkjJ*e(  (e@@@@\3ыLJ[K1e8 ?SLo0pܥ5k4KZnsH&S>,ݻw5kָ:ȯ~+i߾4mTwl+ca ^={x|v6f?)̞=1h :$^{|R\9$r&`BIz7,?w(3;-s*☟GǍvQpO%.pl2~VZsΝV]OZjk^   u@@@@J*%*Tђ pCO=lpஏOlmˤsk&fr$ȯ[Eg/.Re vZ"؝Nwˀ Heڴi+ʕ+>7nS&7pT%(ЧOyG%//ϲwyGƎkܔ+El  ( @@@@R+pg8@"GrfKdhРA\Zݻwڵk &>@rN5jN:U&L``jܮ s}9nCD <7KX2~xF잫 .tUήPPel8~ tI_ڶY>sѣe{!e˖-hf? ľsԖCc},㧗=_63.]:ecT)   gf@@@ `7fLmf`gO>rхC NʸCZnjeK,qUBȄsŋe@#G /б\+ "_"v;7ԯ__z)=,]T6ol_qGo`?}Џ_>;x[o9ׯc dѯmv?5݌cc.dž\|={e{ӛQ{tC@@{<   *&iHMOeVvڹڬ^zI6llرceժU1]6};l2oR@&SxptM2>"8 &߲ei]y۾};tvWn2c W_hrZ(r&~t4 tEԩc7xC>#2xݪU+2n2fݖat+e_1'POcm^-~?-hǎv3VX   [n R@@@2[MCTP2ҥ^j¦3-yygiॖ1͚53f'eRreb1y7t̞=[t7h@6mӨQ#)UTL$& իW;n\ )'P(dxGv3 н,3gΔ+WzWVg/DĢnSV?OIszӱcGiӦ|NEگׇM +&}, D۷CaO{ 7㧶ju$1~ZxKVY ]hܹ.;P@@p+@[)!   %Kt܂ݻw;1+ʶ֗iʕ+B^{5M3fɨQ֬Yr5͛Lgm+3Rz%w}mYxyglE2.\h{=~WXa;"A]vɓ'Y'[V]wlpNٻwo~zk.#x^zVEbҧLb|$q7o:Gaܤd#G]wț˕W^)3T?[^ Pr p]v\AW\G}H&҄zא!C$'&9]3/K&|<(!/ 0O{e7㧶jc(gmxO5+}ڵ]s dž(     !PL ݾ}|w Heוzβ;o<рEgr{ǥCAA_8n)^y~ JsdPsP i˗qFWecS7o^pUNo8pTgf͚NDgM:tc9t],XX֩'(^{S1Yjr- hP$f/2݀$Ͷ߬tf}!-}̪3'|gQ7nszd 3~Z ?6c昍!*wfnVLX\pūdݬެ$D>  x ݋e@@@`+ϼK.^zɘU?ʶ-W1{͛={iFt?5pJgh_w}qn-rC-5jHϞ= j@"`3-3MpZ-`ӆH,sJ˖-]mް'ؖ|M=nfvv̇~X׿Uߌ3D{;UzC=#nY?zY:/WX eas(Z^ vo߾\ϕϣ+ ?܌%ڌ߹<2~yiZVZ:A@@y &@@@@ +N8W۱d^r%A~l;#9SOɴiîV̶B.1T.WA:;Ν;khԩS^ ZiҤl޼Y-Z$/ڵ˱ -0d)Rr'sJݺurMUv[7R\|2h cv/b̆OݍXfmy!)YYv~J{=S u& 4bŊOꫯdvUB.ByEiMg?묳D uF={7ꫢ3*;-9̖ˬɤeQΝ;5kxj\?Sm۶T'R8W>7㧹Sk3i~\xMmԨMZF~-N~y2_@@~ܳ   nnŵ~z,ǫ[6ɰkۤx'5lPyׯzi;ǧ9֘> [oՖk?*(tg`So= rEɤIJܟ~iB F]@SPH֭[''|mQ @u]eӦMMQ)W`EG}T̙cj:;z]hQ#߮rPeD~&MI~vt&xJ=\   W^+P@@@2S34]Pt*N^O6CgH>}hPӒٳ9Jo;Rށf͚ɔ)SR\]A)'ժUkGV7D^Z־}ݖf\{?.LOO([lM[i$ϯA?~NOছn?uq_TrEeOs7d c gH-+WkqO;rmD4b(   g@@@rI@iʄ7.=m',8tPݻw[Rre#^zY {*lqof8뭖-ZO?Ttx RF y}s9GnF6'NXF - Jg] #@Ҭ/Cf*I3f{~fu{ƌRjU7)@)O c>dǎJ*%ԩSDZS]VPdIuiӦIJ㏷GElq'z3D@@ =gv5   wM()=mի|7ңG)S+ |駍a prkVHgL[q3SSGk׮-Æ 3g:e8E7Sy#OA+Ox׌4ϖjժٶuAy뭷lD27o. ,.(1i$YolwYF naN4eܹlu jn]v}':u$ 4p\.%>~zEyLCC=?c=벋/ضg϶]oZ ]@IDAT[|2@@@DpOD:   d-^XJq8}Gny*۶]qdjnnڴIƎ+W]u#5HX9O:$р%Xg]zy睢AK^^^[ pp @%6mJכe4Z_J?]w%<[ȝ 9ke˖O p;yƍz7E(cӢVӧO &H]UkҤhĈ%??nO   Q@@@HAuVOZhѢImR|y9zm[sΕ6mؖ!2CsJf'z ,`z[n5w!ӂd79%Sfק\©@@@{<    Br޽{cPD Ցwݸqckc95kwyt]wRJٖ#2CsJf'z ,`z:K믿nYpҥҨQ#|N7one]~2e|2@@@d'S     ԨQC~ǘF>,V2~":{Njժ$Æ s,ӴiS(@pNɜ}EO@#}AO@@m?c'O]jO&   @϶NfE@@@]v{7yyy2zh#GYM6quI@#O3}С4lв/lg*כY@@@T *YE@@@袋\zeb :w34ȴL^zL=d yt@ mig ݌sΕŋn/KZH"d     d>    ?yʦrRV-Pl۶Ml";vԩvɗ_~@ S @0?_ :tH4i"+W4-7>4`bϞ=jf͚… hQS,{@@Ow,i @@@E_~sҖF}]˼T,d It@ p%t\L2EufZJ*a)Ui~$q $~뭷{1iA@@ZEi@@@HR'ڵk'ي~;(@pNɘ]EG@$AW@W\!;v4-O{8qi^t/(VZ n   @ @@@@,_\:t 7nLAM^|Hc3xY#9%kv% Pͪ@7EI˖-%///͛… # GO>Y֮]I駟U$@@H3&@@@@dN=T-sNMY/VZʗuݻw-[MA^"K3X -[DoٵkW\7ǥk~G0+ʲeˤFqy$    =   @믿I&.K,ݻw^Kե]vƌ={ZjKAN)ٹ_*@ 0~֗@?aÆ7lH"tR9b>3G-zkLy    =   P`ݺu|rٱcٳGk)SF*T :ÚԫWO֭ž4dl؋l @a 0~8C#GJ^^^\ .@:묘>H,XoJ,)~-Z4.@@@ UJv@@@@@@@@@@@< p'. #          JT.           '=qQ@@@@@@@@@@@ UJv@@@@@@@@@@@<             =U           IwO\F@@@@@@@@@@H]@@@@@@@@@@@O{0           @pO,"          x @@@@@@@@@@@R%@{di@@@@@@@@@@@(           *S%K           pEa@@@@@@@@@@@T *YE@@@@@@@@@@$@'. #          JT.           '=qQ@@@@@@@@@@@ UJv@@@@@@@@@@@< Td;ҭc@@2IgϞrYgO&  g>L^"4i"K*u@@HX`Ųvڄ{Xzuiݺ*E@@ i~I,Xt;n(Z\r%nR@@9"~oY5 V2@nݤv9l8  @zB po۶t%=Z@@rV^(N:)ed@@Ν[h|2R@@ g_(EsV G@@@@@@@@@@t@@@@@@@@@@]sw߳           @p3           @ -G@@@@@@@@@@%@{vA@@@@@@@@@@rWl9           (;            g@@@@@@@@@@@@ Ag@@@@@@@@@@@ =w=[          J@:          r@@@@@@@@@@@ Pjw@@@@@@@@@@@ wp}ϖ#           =P           +@{{@@@@@@@@@@t@@@@@@@@@@]sw߳           @p3           @ Mg@@ SL[MnZZlj=*6m 6eRJVzRbEi0  'ךz͹vZٸq-[ָQr)RhjHug:]x{5! !ky혮ukqIJ  a}t(@{6U @4 ̙3GFҥK}vyeԩrȑD(VmVt"g}vtVRӹ:Ne@@yyyʫjXiՀdyJΝnݺV<3Da@@W6׎ZwjgS@R%6"Km6 \"  ,g1bsJ>|X&N(&Mض?n}rwJmesv"@@ 5 .g}VVXḂm۶רoCn)^ĴN:It"]v}mlٲEͲmҹnێ  _-?iz١Cٳ\qҢE )[l\Y}3P8!6i  ذaK%)S&:u׮]M61yyyy;ĤIug:mfA  @6׎Zw֛Q@M@@ >$6@ wp}ϖ# Y@·._fܘMGʤIbJ-ZTnƘ47:'Sdܹnݺoҹ}=  @>쳸\uUҠAt޽{e9=(ם\w    vL׺ӵބ*" Y"wݑFdf @'MH dW^nA> .Ut1.= DGF/{ԩS':~ƕuG  #0s̸o>..~t^~'%ם\   t^;kZ#  @v ]+y|U ] ?oS@Lv)N-& W^2n8\W.#Fs9`V/^W]vqiN g}v\ s5  tlݽ{荑%JTr)ݼ(YԨQ#o۶-&-M:;ӹh^# ! ׭N}m:ӵt7z?@*׽|W{lq̂W s{z@ ,_\ ݻwo#F[?g̘!}^Z>l48jKڵsr֭[gQ0.]H~\r~zֻtҸZl攠Iu֕5kRJ~Zt;F@ [ y˗//>1ƍEH":$[n[-L纭$ʄzr9 *e Q 觢bu].L+&0 bb<{oA ]]UfVWTs=wO~N8!ٓ[Jzk.(.k /}i<ώA7;#]=']c*K\mwm @@-4ҜH_EGux;ygm PaFVzmsǬΪ $TGԩ@{{z]Զ@Gն @@ |S*ӟx_ϏYijii?OO|"ۧ_1k֬1kukZv]֔)SQ*וe>x&@Ԓ@y 2md9̲v^ @**Hj^rUY[ @hyoONkjɻFY@I}$@(v[{nۿ[s1ӝMMMq'g?x||76lovԣӃtiܸq=f̘EyiFmL @@漅' ;ի~+28PPSNK/ F,` P)JI֓1jP @@5罥bҼZI &rVpO  @^+_N{2rȸ+.xpt/| |p^i|zFH{-f:#Mݷo_ldd @jDHocHOO~E/zQo;3˶{yM FV4˹cVmgnϝ @yo-'V[-6=MZUkhpS-E]TTe.PhGfZ!gGѓ_l@ @@/ F3ygm PiJ>Z_sǬΪ9j%@M\͵jm!@o k g٣=>/?\[ũ͑Rzҕg͚ǏeHY|ys=q7O՗غukoחrޙe퍼&@TRו1jqu @{#wMjKGFvK@( [ @ LttjK/I/EfF+dv7y#@TU{]wG~ ظqcvmyF,.Ayk ;T1jM @@Iޒ,p p7-tE@m pW DZcp׮]Ey1lذaܹ(-FZ_RFݭS9 @@5y}sܢޢ,Y]! P! Av&˹cVmgnz @%Y2]}6[*_ln^ Pk<A#uGqӁSN-N呦Rǖ WmGMsޞp E](/ygmA @THBrUYہ& @yoI>"6C&}D@{9QI'P*p,uq{x]3gNJy*QYf,e%;$ @TwTzΛ7gݺuqС,Y]` PARsV_zv&˹cVmgnwωr @@c vWԱ%P=֧ @ [RAсb֭EӀc5FSSSL6`˖-悼n/)(Z/\ /e>x&@Ԓ@y瞸k`\|(#>k֬):v6Y;lG @B>oSrUY @!yZoi 6hp/#t%vڮܿjժN:)QN8-?ugcݱdɒȆ R~#˶k @@-wʕo;Ծ|طo_׿>bSE~u̎,Y]! PzV舫rUY{'Ɂ @@׵Gb#ltC@{7!@~ӟѪ7;39YzVޢ2Hl?El32 @ )OyJw,NƢExEyiF,.! p>o=J:<˹cVmgQ( @ !P^j x+[@{c'@عsgr-=GEǜqEyq'ȑ# nرcGA^W7|sQ>(}Fm @Z9ܹsc] A:rs,Y6 @>oё֑1jHϑ @ykF~W4=FNo}k,]dwq7_f*y7=9}ҤIcJHW,nKcӕO:餂rY]O  @Y w޼y񶷽m.]|o|cY2݃/^:ygmA @TH":j;fvV r p=*>·؈B[4 @ _>7G  .5kğXhQ5zǖ .*/{?y,_@ᦛnGqYgٳcРAv/+V((n̜93(,_ @9 ^H<7˧_fMoӹ޽{cɒ%/ ~O~^["ygm@ @TPdqUYj;v{|r@4@{]ѐh&@,2  @@g}vOUV ]`駟{ ? \G?z׻bʕ۶mo}[y6ƍW\qE5yY]Sv @,Hs޷nݺ\{{t˽N~rذag9̲ @hyQRYj;v$9{FV+6?H@^F[(DO`O:N=n>]΋}C1dȐnǎW]uUC @E6o-hk;fvV;^ @r=ﭥjF и9TX hOW ĪZU(qev&( @@y/M_Lgyf;3˶{_V  @@#4ڼ5s1j7m @6iZm߃7" 7m @ @ @ @ @ @lgU @ @ @ @ @ M @ @ @ @ @F@{6Z%@ @ @ @ @ @;$@ @ @ @ @ @lgU @ @ @ @ @ M @ @ @ @ @F@{6Z%@ @ @ @ @ @;l$@J 4(FQ` @,`ۗϞ @Gqε @YϾ @@* tC9yN @@ 5. @@} 4 @潥] @@o) @ @ @ @ @ԲZ>;F @ @ @ @ @@'P  @ @ @ @ @ Pk @ @ @ @ @H@{lC%@ @ @ @ @ @@- p峣o @ @ @ @ @h  t  @ @ @ @ @, ώ @ @ @ @ @ @76T @ @ @ @ @ԲZB஻cfѴ6  @X`Ϟ=UEbРAUkOC @RիWW bƍӟji @@*|AVM[C @y^}ޫ*b @@H @zXjU\wu:<"@  @u+ nOD_~1{, @^={Į] ڙ٫/yK{^OZyyM?رcc&PM6c1tЊԩ|ސ!Cb̘1M*&{HMMM1nܸի"y,K^~o~3ߕ^}~3ԧz|uwb>|x923 ر#st+@wD>?&MLb---i0MSLX*"h|^;||o;#.n&W:Uiko߾mUFht{Ӹ4A"PiۧokJ _>WVZV}yK8|7zY{Ѫ V#"G> po/u% 85{L{%T^ ,j_os19iz|,U?W+Uk\,3B{tcHh^!6jȷ1G=ڣd5XEJ&p3i/ Ho=8#Mn^O鵊j_oscx=ڣl|{-s\5S>CUs5-U;7镞ԋ@:M>VEo#}h}FDz.Aoz9 u @ @ @ @ @ @@O @ @ @ @ @ @>y4  @ @ @ @ @y} @ @ @ @ @C@{}G @ @ @ @ @ @@O @ @ @ @ @ @>y4  @ @ @ @ @y} @ @ @ @ @C@{}G @ @ @ @ @ @@O @ @ @ @ @ @>y4  @ @ @ @ @y} @ @ @ @ @C@{}G @ @ @ @ @ @@O @ @ @ @ @ @>0 @ @ @ @ @+~߾uGUCm1j8qxьw&}s62 @ @ @ @ @ָ%+Phǁxy_M1}ȐxNVPmpkgL  @ @ @ @ @h{ƫ?x$+-[#'wy @ @ @ @ @ @@u7V57W=m5'=GJ_+zA @ @ @ @ @^x[{O5qG}Y{:]:K @ @ @ @ @@ b#yMCcGSE& pτ] @ @ @ @ @(-+KAuzpDm^A/ @ @ @ @ @ ɪڼ"?ڰ"T @ @ @ @ @:xxIzpǎkD @ @ @ @ @8P1m-b"]M @ @ @ @ @j 4\w%+7jX; @ @ @ @ @S9ÆUldsWuvn @ @ @ @ @;vUT8buU"Ւ @ @ @ @ @Ju箸fҸu{<뜩Sf  @ @ @ @ @hl$K׬C8w8f p}c- @ @ @ @ @ @ʽ{Ɋ7^ms+b㏫\UI{5E @ @ @ @ @@ m^,nX:Z_1cƃ;vćp Sb=:V p3 @ @ @ @ @ԥ3KǗWO5*uxI9gL3wO@k6O=*;oba]k @ @ @ @ @}Z`kKK\lE\<ʎ帑# ċM)*sN$s˖w׬e%[=+Ν>5Ksnwϝ @ @ @ @ @ P;떯-]{,yÇťI`Ki;w+VƊ$}C1jcN_/I{I @ @ @ @ @ @ S=3KŎe2kxc@'*3tHtx$z:B @ @ @ @ @@Uo\:>dili9PC̋W͚/[wpoo @ @ @ @ @@K[[ܴᥱqLhjK̍fώJvpL> @ @ @ @ @thMۿfm\hIٷ7wޜ8y 0^^ @ @ @ @ @<.vP|2 l_w;:9p`\_xc!Cʖܻo$ @ @ @ @ @u.pqEbn+;I`˦Ow f Z=s3G @ @ @ @ @ Pgm{xIb#yɴqٱ caeq܏Α @ @ @ @ @q?ؙ lɆ)snji9;N@9 @ @ @ @ @>(Ю]qKu;Y&KVl?aNYqT  @ @ @ @ @}@`=q5kP'=sxqctRʮJ p @ @ @ @ @9{I`7Ym?mxobӓwܫoE @ @ @ @ @$~߾Ԓeqqnjw =ibzRK#@ @ @ @ @ @O lڿ?>ty|yŪVv,' lޔeQ=ճ @ @ @ @ @,%sي;bD3YS'G~ʖܫ5 @ @ @ @ @zA`ָׁnܲ屻|`҅Ӣ^8GWs4 @ @ @ @ @ im/XY<8P'3J_1sF ^)ܳ>'@ @ @ @ @ @VO.^[Z?exy3 q @ @ @ @ @nhkV?,^/{ĄxqќY1d-u> @ @ @ @ @o=&~xinn.QѬ1ś͉7̝ . U;=1E @ @ @ @ @@D[/{%1p@\W3gY+yF^ Iszoȿڏt۶mbiڃx]q=:_m^&\$e&ӧA5~hTmGӪu]2m'sv%WRS]u!N;ѺZKaNx5ιz$*>i|h=7_uj+}~{K{dQ ?5K;v} xyQUQs:Myiox3e۽asR=2[c5ZY~lZV{,[FjZEX 5)loݳsW|fǃ;j`cSĤAݍZ׌e,;v 1"F >W9ro|5N+Xo+6{GN:x1dȐhrަoӕ ={U q_$0>|x<3:ϯsjyk;z 6,h%ϫH#dС1(YA"PiN/KOTZ ͨJA}-SKP@5iqsn@һ t+@!9O]ӟJ +UuǠ(u]Z׌?{j}:^;Oߞ%H<Ҳ ҿ$H:&Ɋ,_$Rzoʤx1eu]Zg*( ߰/ beaOW\  S~T| *Y4ȧc{|,اfOYXzA+0 Tu Ej89̷QPz!c{TZHtklt1Z?#[F9;qj] -?/1 /S:N?#+)>/yURV]y[wﵼJ |X%eՕH.Y/!K}j}mk՜ozkS >ڔЫH!6%|{G ;o{xI|Kdڔx1 cވ,TW35#W{ t @ @ @ @ @@# yh ; {8Ν:u}.}ǎiӦc͹[M:5ѣ  @ @ @ @@&wY9'ٙaiI<ɐԡ( @@ Z[[{˖-=oť^Oxr/~sAQ  @ @ @ @Ԟ@[bg.tRiqk:hx!** @I{?xiܼzM9[{]'Rc d߈:x^9_#}\y1a„xы^oO~rR @ @ @ @H_G6vEv710n[A @@_ذo_|jɲ@/#zrrw uG" d]kyŅ^kO͛+_J|ɑc @ @ @ @5.?Gܿ}G?ġNe= @\`׿<~ŪǏ_yʓ3Os>_E]n]|/| cǎn:4ѣcԨQ޻woAۻ ~HguV|g> @ @ @ @ܳu[.XH[M5ke3i#@ @\lE|a{`o.1<ޙS_~cU pO/~1ww>k֬8SO|bx≹t^p`غukX"~į˞g>gUW]O{ʖ @ @ @ @ [+->|tђ8w/-U@4ָ. j+y].6,.]8?ΛaVHU p_ti\|{~y^xSR\W; 'N=ԧ??IWt;O?=}(ܱm @ @ @ @ 6wmz=XmO7R @Uڿbe|fv@YC?%9=vc0'@ݻu4O._ɌGxk^g;N\_")]+[o5կ) @ @ @ @ c_lR|fT ( V'/--e=)Yh ūgό&e(?׽.瞂V$¸袋MozStI .=ҕ@4}ڵOz\ve @ @ @ @F`EE'H8 @@_8,|}5q%n4(:^\4gV 0l9;}ɭ[}+# SN-ן秫_~8n\V\Gkkk{>Vi @ @ @ @P ]1RuUO!@ԚCۏ^voys⹳c^ Q.۶%п7Ӗ|C}p_㳟lM"^xa,Z(7niD @ @ @ $pRilD PZ- lu_Obpq9ϊ\8_p{iN=|zj}o|#͛Ϯ;Xti=!Ctu @ @ @ [ZZd\b}QKE @zmxί~?IJ={Kmhd{Yqq c _, %Jk& .~w^3&ʸK;S @ @ @ @@ u箸~#kc[[EGɓ*Z @}]E;xլ'& KK*-+MMMqV7sH @ @ @ @@u:?ߴ9|e"y)bʐ!Q:  @}NכGZm^E_1sz\pALjUʎ  @ @ @ @N`G痭{UG1V  @}Er+ߵek.O7cZ1{ذ P)T @ @ @ @ m_Y*1'`@|x91{N.1"v]*Yt}ˁhC1qР8uxqz, @M`垽q%G&d[=$PG=Cq 'tq}ſۿŭ:ܮOqgwZ @ @ @ @X{O|iŪzܾ7,:4.3+^5kfԳO1<^7pѱI֐!C:k> @@ in/^|pMw)c%Sz[g vo{+"n\Ν;˶}/^WK뮻/|aq 7DSSSr2  @ @ @ @*'[ WƏջJOI8wNpЯ_W'@=H`bsrG4MNCoL{TjY`%V'InZ5@MH~p?6m?@wyU7[lɭ>4D @ @ @ PY{kŵ˖_wI N7ϛ$&I/\5U bsϣAlii.Y9ge+~Ϗ #G_0er>3tF1-](PrK.[/?L @ @ @ pZ:bUlN:Kcs/5#^?wvL2 @#4봎E;k O=%fiy; Ԛ.[O ʥÇ;Ygڔ9׈@x%S4Ozٝww}wA^1$N1co~ظ6W5yM,XX @ @ @ @]qCẍṠgLBnRv @ /wvl{yZ&Ƚؓ|9[kw|5 8&%UKƦ-e6qpS}xY1x/jj"?iҔ)S1c7ضm[~30`@Q~}svYa @ @ @ @@ qθnnj$t$d!]atV} @v'~}#;ٷWcP1cܣ;lo9;2;vʊٙe{vYorx.4~b~uym7CMŁ雓sK_]:N52>|bN&o찧py'{]'HY&O=w{<\{׼&.\x8[nov矟Y(w' Hl @ @ @ @u "  W]ʢ]Lo7'6y @@- lHٯOFޑ$ , N'+IzZgLcXp;]}> ޔ[>YD| ۟W{uTnc:}NV/ OV,/lb4_T[3eҹ՛C9x>) d?{3?LB']}\, l1lC P\pA}~lٲ%N??Ozғ'?Ig4iR00׻/ Dkwi? [6~u{1Y1Z1~\.iƶk /'13fE]_yx~xԋK/4ڧUV[ָsA9j&@ @ @ @Ԣʽ{KWVݭ*:- {YY3s+x-]?ݸ)UyP[i`#_>3OW{<w'+NI福]1-˖Vߔ_$o>• )WwҐi0|z^&n%ç_Tڑ|Y ,}H˥Sƌˎ[Ϙ0\Z&3pW<NI'|;Os~Pf.s2  @ @ @ @}@Vm7t*h:=*ZNhW`EcY!>tYaN{?* ~ƹcr%iְag_]*>oHKYÆ?-/1Wn/~`eE?iZA9fڗ?Ҽ/Nc j:A⛒ë7ŨlgSK.՗{R2/{1 *j?/v['%];N ,qt5#F݅ߺ9rdtMӺ$@ @ @ @Ԣ$u$.$m/2)yv IRRMMDZIvWiؔ|,~K2yte4(>}h`|:9P۟{t5i񉓞Xw8@MOWeCPqbŊhK૮3nv$@&{Zk u[ZWAQ'omju{U[.TUd d݌nMY7M:}=sp9?U         W6WhQv^1mM섷im6z:@zB`kE5׸"~x|۱=1v~Р@Yܵ&;3 )ǎM5*5J 0k( ~ pw1@IDAT=::ZsCr-ZGc@@@@@@@@7M&O lܷUYYU) %{Pfu5&=Cɲժ?Uɺn;9ˆ;3[Yۺ;:Aw~Ԯα        @ T&=G[*y=wH`NLJ҂4JQ  ⭥;w,[uHQA:39-[Dn)&{Vp|aMxm[鴝mX) 1~1Z#       #PPU%yz&w#(BBtNjMKQ<{@^޾Cd(눆|"Y)dymK%˺GFyx(Y6ٶ= "#ӌ6 L[ SII㛝>,((Pbbbߝ#G@@@@@@@d'L2qP#$=4 ެC}Z='srU\k:QHr$Y)@P@~M{td|z @טeƌ K/UhjxŊk4qD=l@@@@@@@@V6Х;w鱬}g׾Lx7A ږJ@A g_5mU=,pT2uQ`Y90IaQdV'I. Dn p KKK>r)}7;;/|)        @gvmej[U."t&=U鑑^R ?0m= vۚ$ÇCg xnܘ._e.䰞@;7:Ct-#pV}qqc?j2)@@@@@@@@V&E9z>o*v326@@@@@@@@O_kLkDvOOG#_߭yV|h榥 -XTcìFqrd@wȍ8%=uI'9ÿk'8Ǐnew2eJS}O=_x-^X~m?oVhhhzv        Nچ@eh]Ys{+a&mf̠@]`o]O\zH]`2bB1M㢣tLm3GҸXoˊz< tKd'N… UYYƍT>sؗ_~{Nxf7NO=:y       &o`MKf)u @{?]^!|X$|bh<"In;;w#*8HutMQAAA>@W5ݚQ/?_}Q v?D'OVzzVc`;nWV]]#u%[oUxxvT        `?afטHKOթ&gYQ [Gry{9|.2A b|tI %"B:IOʯVI !c{|9<jɒ%*{+ 0w ~ҤIJHHРAcn[UUZrrrξ!!!:stu)##ù{@@@@@@@@IQ.c&7T tTBl=!@.ÙM i­ 2ҕ-7@ hn pwg^{Mwu[gJw}縹mЅaaa\sFم8@@@@@@@>Z+ lWu&FГW)*@E֬DY䑬lm,:!6ߧ($  =nM",uꩧ:n˗/w[tmY`* >'N9@@@@@@@@ 0/3yTj:PsLPZQ ev5\:tsi#G(Q@N^ po>;LmƍztReff6o:cYf)|        -V٫'L7 vd}S :dm1) uٹz&w{~ctѨt3|@_ zs"Ǐw[۹ZlY-??٬C>mڴvKC@@@@@@@Xu z{.={KN ;zXLږJ@E`]i1sxzy$v q   pon;qgee r/,,l޽[ŊRbb6|Æ fk-@@@@@@@@R]m-Kwk)᚛3G*'B-·J@/`L򟂝z/+:!&9).E^R @O'9       g&{Y9`wa9p`-H1Ç)0 4@@*\v=f^Z$%"\tY$¬RBA@_p@@@@@@@@noп~+#4\11^R 쬮b2STnܽ1Qupq7*@zI^        н55z*'OO`Z'dMKѰ0mD@_6#_FÚ?          SuezdW;EEi^zN @./HV>]6I㢣@ _@@@@@@@:-`~k#6&}fKA@/ԛ׺ vl1sy+uYĺIIQ _^\r233#zW4hРNTom6(\uI&RRR:gquv>       л¶Zd2TVzLx`>B3R5NA@/8_3۷UUy0:ߥT r  x /k6\mיRSS_~Y=Ş={+W3<;L\sbbb\udž;J       /Jsr\v woexXKM&퐐oMC@o M,<=vqM G 6tQ@_oժUz'<++p ˵n:{JOOִKu:.M@@@@@@@zEے=z,;GRC#3ȑXg#د -@E`kE1_پC 7Te@. e®ufGu{Wصu|ͭۇ iӦiԊ+TTT]qqZ=k?.56꾂m֪mWw븺:/G@@@@@@~=z&o'#5/=U^R 4wwr[uXQA]J槧)):JHI#e ږJ@=״Э`^{MoLNȞr{+4=]=mvizU]]h_;壣=ҡ:M       UV߭ڲ2m&݅ܔC\[l_۞'L[' i3y@kk`EamN2\utsbp t%۬FaOWw lެ {pӛ=4hMfK?\sUji       Ц/QD޲8o6Qie=i2> q!!:;5Y祥(>4 .b^=wvRX8\)\E*@ @{ uAuiׯw9~ƌ nj p:ZbOu\.Xl       tJ̬\~+;;M\JLLtnk$߼ɺ0,yӕʜ8@@@@@@@@*6ן9ԑI:?=M"}?" ]{kӹ۴(;MƘ׸ 2u tן~@=G /Pm%lޡs 6̥}UU粿:΃       ڭם]J2I~oמL.8r( @ VVꉬ\=m*!pTUJ|뉨D@CnR6Vk\۝곫0]y9ҼtEu>vsČ?ǜVqY=[V9YA@Oݙqy;6xp>yyS+X>}%|Y<|J?ϱZO|/<|' OOn1;9c9\sJpN`yaݝwqF;Z&qUx)Fj&9S;waO9t#|N꽥z$;Go쒷(#ty>8Ǵg(=/|5?s_x5/s{3a.SkX p/**u2ݻ/~ MY%$$e_hHޙ@z]q=S{52GGG8_7ڽ{?\?)@YYu v]v8=6x8 )ԥ'y1~W=u PRM ֜!5=D Ɇ" @}up @ gwK:۳]ZdHpN4<  @U\]O:%~zZ]oޭFϳg py 5p>ǚghFA.}ײh]g{_~oܞ*9Ae]yJLL駟޲On[OKzY:.gq;V֭=nA{i='[[u~mOA=V3z~=j鈀uEw SO_ڑqҶX_hY_LP?8 Yw+8?stA9ziJw+ǺQ3C#>[k 3w,۵[O)5E6#U>Y3ckwm/E}gsY<:1i?#7TUBLQ<|"I'}/!:t/m>xSO[cSzpOrs"=&cj~7:u|a.Ң=3z}p~g|?誀3G*Z~/S4w@O:3Zen7oyY;vxB>%%EV'6P#(]kyEˀ1Pjm@@@@@,PokܲaS-R Kmuا,}RDNԿ  @3w=_G.B;CWG;N"( @_믿^Ux~AO<9 6yӧO׫˗kȐ!.6mڤ_|e__ވu~aaǮj~ՙ/q`    CKb_gL.A  L|._Mfl_fœ{F+Ь@A@'*k٣Y:pr]/+xs1m'h#t1 ؖ @_]V/Ǝ?~l̜9S~\_*SK>2]vlѲСC\2c븼:@@@@@?kOc6W/:A@'hVgn }VTv'&/$##J퓝 tjլv6Oo=c~լTEyj~@&nC_ri%k_LLlL2Ev͛t}۶mJMMmW e|&'Nt솿8@@@@@x>93FGu0# @޷OW_q;as$|Ԭ<4qaΰ@H)#UcV  Gr9 Ь0򳡱ޚQ = oT:M4e_W69G{VVVS72S5k؞-_     }Y`/ @@L\ݺaܞ7#t d1Az8VYjVYgkkp&hp^k׸홝 NsÙZ+l*$'H2ҹw @"e!5 88Xsc=ִ;33Sfj8epSX~jjjjoOYjK3_epqL @@@@@ pt_ J`sy._V+Ϯ>2Ǭlg 4˒Mݏ=ڥ]*FttN@@?֗jm,w<4?'@@I(;WO^bʠApTM` -QQQ.Bj0W[}Y֭[~ٳs)''1]vK.=ܣ_4Ԛ9n&\$22R'pBӶK,QIIISurr#0iG=9f!     0ʞsrl܏OGG  ?v[tϖL56i)Z8a"Zճ@ X֭`ڹD[**Hf^ݱC _ǚmV| lOסqC1 @[խ`v+*ڲeƍSUVݗ7uWK/mFff.b]tE>}v+ ?Wˋ \G}ܦ*o+ғrw~!    Y x:w5Luu7_1fTG= khGߖ>Y ⶞ tT {>=]KwVy,&~Ç9w{Dߵc"\}D] @S܃IIIھ}{з~MԦ3fй瞫zi:۶mu]'ؚel,V'rOu\>      Pm?mٜ"7:f&;gۖ2QZf@@M}ؾՑ\'c #M׍ ߮z&@sMZvŐrs;1qc4]z83[+EZJTpNIJ 37+@w^p̙%K4YtM:YǛvv… URRÑG6Νf,y՛;Ncudzw[飝:.Mn@@@@@P_ޞ;7o Efu+[Y߬ڲ2mU\3vNO鮊}  G۳G6˚|*㣣iS4mpL֔V54VU&m;hVr+jtVJm~uT" @~_% ƾ?=jԩ>|˾aeq?#hŊj4W1+Vf /PǏwW}:.O@@@@@ ԛyQ;6mQ^l&j+¬iS]v^ھQŚo3OHJl- @@oT;{GrDžq47:s߷;9*s59:\ZY~@Bs91DD@ Eka x 6L^{#+ySE,[LguV ?Lg';v^1W[A*--U\\ >li՝rs:v!    }ZJ`Yo(CUksRuV@L&ٹzn%+ ฤᚗx }Kb]Yo }&kA}kb@%/4ޭf%{kF ap խFwZZ_/\POw(Ν;uUWwvtoϟ?i??2dfϞwSqB@@@@+Bݲq6Wx4NMe34$$c;bjL>UeZo쩫5)Ħ&1JyLA@!Pa.fZc3 GR"ix =z 3=vd>8ܑ}H [/-3Eف     @|fݺa/mVPڙ&(ʱotXaaJAE@>#IaZvTW~cYǚ\( t;f% sQuq)# #M#}-  MW_̙3f6+ŋ՚)_u')m@@@@@1oK&={=ʸIf%ylG  nСL@[~n%&&juwKzꩧtvF@@@@@WJtLYK{+>L7QQޚQ PĬv~ze{Gz>b^Zp@zBge_>! @]5`~?>-YDoĈ˴` 4G09      ٜ 5Q qZ8~&ڎJ@6YۋLrXP=u#U@n nt6 m<8@:.222tnW_}/B_vܩٳ1c+KuKNN̙3'l@@@@@|,RmԋvK߇ Սi/B@*PXSX ܯmiX2P7 @/ R 26*Ɔ5lݢ5P^f!&F   u*,:g͹{@@@@@] Zg򶫾sh;2@@; t ncx9eֳ@ww aauh;?@TcYB[yKuCr >h& @oހ     tVʮPfUmv+SuΞ@@ 쬮5k݅ng:جltzHD@'||z6 w԰c6fbٗˮTNA]{ן#    #=z4+G[YS8(ZW_%Ԅ  ^ڶC7۠:GK]S')>e.Rى @ ԙwlڢ]-#CCtVjrW.аk*rTQṋ)n5"#@{+     (iQN#k{E]Ǚ& ؎ @۫tiQ[6yKb9@DQj_ݳ 5eO 4CΉZܫW x:YGz\'     E`ɦt6ݿ5K{vJeGZb=vNT  0lvݴ~*_4wY)k) 'Ehj׶Ll3浭%"(PjRTd{nKQcAۺlغEu}*Ӝ6  f9\m۶M>weΜ99c@@@@@PM}3[߳9SE{lO%1,TY)ɲ@@꫒=n=BCu l?z0D@'L}[2ur~X?}ej>cpn7Zͅ"hԾvWp[eE:@:/o|Amݺz8Һ     @Gꗷ[TP]8Q"Rj2Q@@OV9yu&UymIula? =&PXS?\ϋKܞbyc+yx %Kw}M؂5+>N'$%*ݻtF~:'Sgu9P9 JMs @U5ktWhٲe=3{΂     @;M; tǦ-#`t #Ԏi Y`KE.7",LwMY #W&} nm[!3C3[[z !f!p ߴg]o@4蘀oڴIxjܼؔh     o@6n߸E[eeQAk_<*C&@&`]qEG Oޱ@@@@@Q]u&m(xpqe3#SuvnX& ;~d-_ܭ@ZZo?***J!,M։     XmܬU{K=v3uQ ؎ @@)`ohЃY{sK'Sml#={uﵣH*#6EL֪@yhfe  @EVٟ}Y؁     *.훶%oF&c! S5d2̨H;mO @_X?¬)iӕƘ@ce?X~L9h1 >7L%>>^~N겟lzH@IDAT @@@@@|-`ekV-+,صIn~D oн[2^&kc~F=FY[ K:]f*vg$&OThJFAe_~"v &A|~ @]n7Kdff O&E @@@@@_ /+םݝvt1cV  Xa.|ZmQ&k㶞 2]rLF%\uI:iDR*1Fs`ke׬#F*t1֫ri5Gke@WnMCћo4իWkڴiM<@@@@@@55zpk檶EfM?Z8ڬ@@ t\T78F㢣U@^xm{^NV%=2BΪ#-aVFUR5^ɴ4u#[{)n%(▿2-&{ȯmю .RAjܳ>OkY\B_ϟ?%g      S[GrU54xdDZP x( ĸkf2zZ5.@EA@_jt z*w!k>'3um~Zv_ vɾC?X>ffG(Sr 6+X2ɼ?kQ 1`?趿T'԰e*tBNF\Wo9]G@ |k#jY@;DwJK@z@ g_X[f>#8adc!P~U+FϫYH!Qe;pvx8!! 6]&{*Y`~~3<U7<־B͗1 p /c|ف Q/ܭM4I/Yg:&jǎe2Ypwi9TQ`B=TгU^q5zfT7&ֳ ! pF}+ 7QIIjw}qM0A? 9RV tpE@@@@%y+k](Jyi) wOB {Z]zi޺+QAӄq:'5]5@UUU:Z8K5+XY+vF~~W|'56z4`xlG͖#moU[*wZͩa6U'~kpS@ U5:Hr#9r}7s_W p #    =+`~}}G0yUO>fi:?=U~5qS 'F~nX^%v;LVR`4;@G u5ulXho2+P@Il[&]5fA6hM'.CO?CT5&{9o:6oƌmӀ ~ᆱy)??ul!     XF;w[u>&K<~ Eoc@S`Wu6v1nى @o ԛwmު{dơqC7A|)P\$d#w8s T(pp_ ܪhW}˹wֿ+SE.@l ^>L't@@@@@,LP6mr ၁:'-űz,>{t@'qչ=)FP[ v"]j,.i5vX[|#Py￧ムJa9[g) <[>Q`V =7 dsvݲYJ\Bp+: nw'b'     0>+*m7kR Йɺr(yT@+J\N=dhMLG$g' -,}*m5utx|\:v FdB8KQQ?@!7nts7Tll~6@@@@@rݹyݹ~iʮ7Fc+  .ɜ<ݺa<h2"IL!vI#@zZ={tUP]1`?}ЪWnW7wՐaA&6hO k!;@5O> [}XгUg N!_+XT(#"O~Hw}^ZZrnv6@@@@@%Bwo^'vTB7VcymG%  ^}з{=$),LwNֳ@x"+G7 E[-4+efnivO2}; QV(pHm`m`B®Au^]MdpuŸԳ8Ts ɼ9+}@yXW^T'`7K6mZ}@@@@@oK^ڶC94V׏ f  &1 xǦ-䑺yxE@QdiZJhg$2g߮/>3S:d5܎NV 6C5K~V=Z֭SYgCZճ@Rs8dk=[ 0 JU}V|H_.OfrpEA|| 5x0Yy@x    Qš=5[Oy̔jMZ>c4{X|)F@Lef[e7ݕRStㄱ } 8ݦ֫ل(-FEE@Uݧj,s`Sg6lG䔦<蜀4ejD+kITy =wvDzv ~;uaR_+~ }̙zכV^'6m@@@@@o 쭵둬l=J/KZ7?_=v~8oM" 5/3YכJFd6E?%3;!>]5F~:2IwLp@{곳e`#K|gc;TYGvQ jOi@I~+(@ Ph@dm@͇GvԸo:2(IIkqfr++vp]^^8.Fcϔ,g^biA0I_ㄉg%|IS`!A¾e׎ٻQ;au0͞h^BA-`[XQ/Z݈Q>o]a2W_{eVEKƑnf D{B m po^zy[8q"eh Un&t siJ܆(@ P(@ P" `u8Fab/N\@ P@ֱj#Șy.4dnE PP~{~]ѣxcT5FlyǡZρ#쩖$F4s6L@ZqX 7`lWC9Qu]0_0gPm 8ɹ8 5g:*e˰pBjG<^KJZq1*c[[Oi]N>M.ori GGa}-׬j3?] 7.:xqZNDŽ̖PUz"mZϿv8s /_l3ܛM (@ P(@ P(@v$|\TG(KƯ[%]emO4(@ PY;vwђ#0CfS-P+#=w?ak~jW<-:7vߊVW!VdTt:xLfρ>%YE2]L bǤɨyEJ7O:o[N 8E+`ߓ !;]n!+REE hZ'R(@ P(@ P(@ XY\K`{r+JVԅ}ɐ9e (@ Ph6zos_Hg;dpg(@ D@AUdf!Yfcwl \!±-Sño{g}~0͝H3÷__`2q=j.l+H"yK2:vh5*7}Z*, i#GHT8P(@ P(@ P'2>/NY÷{Gט7̩ PN`uI)~s7 kGW) O Qv6()\:$k'H-]~_0v4&t么T%cmi|]'OV&4.$BͲ:~~ۥVĨl_) P ja_68qrh'(@ P(@ P(@(r~/_QKԞV| P(lӵ6QyT_s54hP8uR(@ P(@ P@$Scr}Mi-tq] (@ P@(>)*ƯveZ볺]:#3>I P%PTS%Yi۪2B| ,;Kpzt f 3FE8`6s rͷLVO`ߞE}z9A OeD QA., (E_1c@=X(@ P(@ P(@ P {ϖ㱜$/햪p=.(@ P({E>fO!Τ(@hX/ɿ}N$%Ye(LO⹈HUY gj2492K`0)P sCo?Gp8k6,ߺ:XχK:Kի% K\r8z2@'ܬ, i}M Kp{jLL[Uy(jW}z5ޡL3f4{:W@'w%'Fes°Y-d[a1k9gPpUTqlkNE߻7L8m:tn1]8.ɰ.+\'O]!c,}Ď> po H P(@ P(@ P UUxRns֥32:%X(@ P@hJjծl2F#{ Y (@ P jD>}q6t>sfp9pܡekw@4GLd >Wh{o`[ j`?Z <(/ڌFC]:.}wq] C^0π'`[ ͛8g.UWH5Mtfa{w)@ P(@ P(@ a)7o=0$1CO(]={aSØ֧gR@4 l9y K2Plz5/I:=u|L3fjNbcDX{Zw߆gu4j$&rur egQlmZ2ʈ-a}. @\36}TޖM (@ P(@ P(@:kmx. <*Β/tHݻ_) P(F7oCyrnH0$[al(@ N@IN()Y>Ͱ!0Ie/:;8vmrɘ#{y0^0*C/ #g$AW^c.[6þ'[4irΠ| $^^٠wH'Ӵ u\J-U-} czqHMM7ݺuذaCyី{ý O P(@ P(@ PE*vx;ry/%ݡon;| P(!p ؍ 'Nz,97,]K׿seΤ(@ Dg$3 GZ`4Q#p;{ٴ. 6|&8!lc4w>Æ^K)ql֛a~->g7m[OT9(@3g`l߳W$[H%cµMXVV>/.+}ʕxᇽ SuS(@ P(@ P-!P-Y_9Tgrqfۄ2 ǵ{vN\@ P@hTӗ\wr.suĬgm(V[콰:2<^7ɜm 8GOӅ3$}]˥FؾͫFLT ߁iE^9Y{@We`Tlq$] Cc[{[ (@ P(@ P(@ PA2$뇏_-^{tޅ{a9:emWq(쟮AF$2Qc`=#.J [(@ P(@ P(Tjt4~}o⍼ (@ P -kg|;6O S}.L P@ u(޵gA xq g!,)m |\T&B2_yЧpfs0ß>KX_{3L+IEKOM C+X%C%#8z{6J~=jdƅ^z˫^Z1k>gP(@ P(@ Pj돋d@ͩzǫxo:~?P=l8I P@(39rsZo7t0;< PZ*wƻGl=k'OiGۊIvu{,AiӡĸgQ)`7!Ca}o˨Ź h$c5 ڊIإÒm*N>R?hn0:^@v_gȑP P(@ P(@ PmU`יXY\ɴ\2¨JV9]S0S:]CW>*et%Fn0ݜ?]fq>(@ Pn9َ]~Y%铣20K簵S!p3O~{hܔs[j󍨕vcDFB$G̒K6 `}e\[֢7ab bnl=z[ 6=Kv_X\G[{(@ P(@ P({cٳ>|=aFxuY$7Qӧ7~6Rc _R(!Z<<#6vYMUW%}qאe+ (@ Jcql EuZ6n42:&z.t+p¶z%l>_\ |LMmGfSq(~ w5^,μ\TwW\ӥ1gDMa[ M Yws67f=wݑ?Ŀywns"nn{}p-Wӑ'[S>'ų6`eo•)G7%Q~S~7ȵ2/$c{Xm=~6rq:GSH\t;5oL$='^g}Z{ܟ1q4泖%~++| 1LFr|}>5xjk8Fwս,vD]VKkG}Ԯ7n8:Sq3nn ¾j۷ Ys`v!tl%D붟 ?cu׌߈2*ƛ?W_K:|+22e?ޅM> ~|Dp!إÒ FHglq0̜ ÐڪZgI #Y]&6jp/..zK/9BUN>uaϞ=#''7o^bIbsvDK=O"W= 屶@yy9ԃBp l/zǠ{2jKg,YɎ,U'nprR`XvYTԋ;'{ݻO# %(k@KVWWk;u~݂нrݒUUUP KBp ``VIvEx]aS;in]q[TmA 1EU#b u^wyCCyluKpc{{Tܑk`?ߑէN{kuc}^)kL?(`S AQ;u@zC.H{ܒ Y@Ŋ ,& y$ sF̓V2\Jg"ǁ,m@Uwۏm3lSǤp%t8~ ŐmlW55{QksfWꣂVyo1}}+^5ٳgy(@ Pڷ@>\cES@|Vٵ޼PLJIƯLjuS.V>/ [[}OG::n8 T,HenW꼗u,~6R]-f>? t;\|* `k)t;e^4K1} y19RTfz5J%1h&߹yx#3IYB/wy?Q9a_/!?B'CFLm~x;UkYXz>r3yP?_Rw Ǹ*?ϘK:Wٷlmr8 |w^{40͛è1|´XC߈l%xpL 벿)P홈YC-nwöa=lVUVt't$8ejϚҠo@Vh(KNR(@ PQ$Y2ݸud Լ<͍[ј(@ PnOC@"9q%w I}(@ C{sܓ z^WZUy]eyg(@ 65ґGw⤌$YJǎu 8eTFۚU] Hңlq4] }WB gCz_淰C~;>$..F4g. KXݑUo2n}L0NtR~ҨkÇm۶z_[)ȄNBNL6n܈W^yk=q(@ P(`ÕU nwW\#Û:Øg P<l2swCjOI{޲oT dm-~}'}_嶾o %1KhI&UplτKF=_aP'Oqڅg{?㶕3?jydk;*4 (^+jTv/±'kMKVݰt3'y-'ٯeko"h%X,7c ?-apWcƌk|?'V[/ZiiiB}QHƀxqT?~\(@ PmIF:Pj[$u1K(4Y(@ P 9[GYИGjP(r\(=^,&=י׆睏(ю>p(@gm*;D.:.ZXup/s;}(@ P@SjΦlw0B P@8\U?ᝣ/7FɈn&\(@V.P%J%`]e\?.Uuwv5hfF6&nL PywnX%尾$e2Ǫ,m_CXw?2*g1/4IZSyQ8iPŮ"|kkm|V,}˦Y}u;4kKР}r% P `9W_cG[Qo,߾j3GF:,m{7`Q|hs`pU.l po|<* P(@ P5 $Gܰpݔh65e3nC P@(=-DuYIOCdc(@ P t-@]KuW_gaW*쭫#}(@V/`[iÃ}*`zA|lَoQCI:?4|(,t n?'[(C;r/B?p.Auz8-%'6@eETVo-ܥrNzǶLVcޠǣ Fm4k6IڮGF P(@ xf8TTz,id ͍ߐ[P(Ъ*b nWYV t$dnUο{*.Nw9P(ve*pݝ]] ^Ⱦռptki &ķt3 P 8KK`}&+>ƌ0 :a :sfnjFIF'FfʞݽqFhj3?I$y W'_Ӽ07i?܈i4oV;v@wr 0Θ Ef8Oӵ] ٳAo2Tυaxo5 "}ҥοf P(@ P 45 ISVB P@ 7 8QkQ2CczLC;Q ]IF@?\g P",: Z2-*D=C-?!-y :O)9Ei򺰦n-FT4H+Q{tBnN_ڜ*m qރZ_!lh ,p=ORk5KL >X)(>}ǎ`\S /E/Z } džO.ؓ-WI/``i<OXkwUv[퇈 (@ P@ |"ÏޗGkBTr ]B P@p/Hw7@?%A$[KYyx1Tؽ(3u_ NTWQ1L{'|(@ P'% ]Zк;][䝆`\W*ȮֻJbcc0k V6u9wрMޞRK~g^.ǏCߣo[FR:<ܱ+:VXfYνBYHa0Y}C ˺(Ba0XojcTs >7Kt *+a8hc}`9F noZ w_ < P(@ P:}F lzts>\P(жJҽ ,~n,g aC)=[r鮆D(.HVmGG Pʬ2SVeR1SYգ@uMZۂe8E_˹ʼe:_uyPI9:iJQzJ= P-)۳w7G}/o܎^Ǡ:?2bkg^#+dƍ+`u!CeE\O"Y_-%fܺٽD͔A j_ OL0y0 5Dܣa(@ P(@& pśG֠nm5|#B P@*_I`:ɩOmp7PE{]=(@ 4V`}iqcթ:7U-k\V۪WWl*x] V2wZ~6+:-H]wZzvwк dOv"~ xa(,rjFReр~چ+SkݟرnL=1W;Q-<qqc04"NIYxs*"Β֭ZZc$ٜaxL 1!"oQ 2[(@ P@g1|S.f/aǞ xw)7RW68C6p>(@ P' (u0Kꉻ|}.}GQ@k&ܴu$YC %YFېM"M Kʬe]*XZWv rH&uQ]˶ɸ櫠u5/`f;u3Y.#>?F J%h3߆ԟQpJ#{7w.AQN:1>X=g˽Fp X7kgD@ NWϜ͎74Z(@F 6<{Ծs=硃~^/?c&OO];a[YOi0͙ }Js `{.(@ P_`3O2|)7qIIxh$X)T6ǎ#G.W:3O.^*Co{w*(>8(@'pB =e?n~jW7t$$d)@ P TUƭ8QkkTێJ?t@Rlʕv[KpʲkRyhZk꤮ֵuwLdyjY< ދh{vf'&DGi?ZBUU=ZP}.Cx={zt |$s*#/I(n ^XzX (zT3ˍ a45^>;j?_nͽospgat-lku,h>΃qd2Whĵ(@ P(@((ri_!7bMk{AnjL.WvܜwNNNvO(@6"S(,jlt믤HOi}`< P@8juiiHΩzD$_`uZ X]%LVMH7(@(pY2gp[)#x qxL:,߾ֿze Kz17CΟO߅]ܘQڈ0>Ẅ dd!˚2[`f$)@QU8^$F}rطmE SKFKwlτm*8dUuu82͚}.A Cɺ(@ P(@ crS25d w.(@ P r*c'gL0~}~鈗$,(@p hdvG8wѤU׮.*z:U6-b$Ȑ(O@ehwv#vÐ!fυ|-0Nu7ZyQ"P,Nmہ'OyHrs4//{5 2JCwnR5nI iC>)l|u*+Eͣ8c,]]l\h9O}:֬頛lsa0s ZBP>)@ P(@UsCx@%ۇ'7տ'h**o< P@8PQ!rQa_^F/Ggz\@ P@c$ʲ2kֿ Z `Ovf]ڗSݱ{7{v򛬱E1IڇԞ}RFUzu&HVl,W/yF+GVೲ(%Y~e(L,#nbO@ /-K?L Y}(O%m:raײ^CU$\u@ЅjNF(1ϻYsPZTK;u 3Ez2k-~}>=C 'P矅-^2^0߃NFuiKes@sy%0/±wWu7H缝,m5C LN,qa=W`G&P(@ P= l?w=+6w{hTm$TSvƶz%rΝa1 Fy Ym(@ Ph*(' Jm5NnB@H1(@ ᝣǤ\.J Lw RF P*,:r,`'6J,]ЫgS7v(@/3̞}.]]NztF\< C!#X(Ȩlݗh/q DP@ ni8ez8"X{v 8@t2ʇilF՗عëf-Ɇƛ`2kyk,+m׭lf ?}8~? "hy' P(@ \x3!cq3(@ PX@CX}P>} =-(bwӲZ%!~uWIґ(TWm-9-ڳwYpUIB2go?K5^]oqfÏvaEqOE}!0>sf h<GvF/ -LY(@ K+67*Q*+`}97mB/Y[CQ֮}t"MӦI`s'<4|FrH6)aQ/Aܻ;C$? pn1(@ TPH$c{~Xg$]+Ɩ~ i݌S@;PP*] h  .nly.C}(tV) d>%Y(I0p`K;j~gVdٰ,Q> 9Ӵ e{/X;_ra:Z\Z lwVtd? B'Y(ZZ9(@ PH\DZ~[=d :\@ P@P7'Ô&Jd \/?F^(ZJro9J#`*H^=(= u%vwf̳~H;ONS2-; jKvH`TcNgC32O*>9#:GZ6vs&9EZp^0͙ ˍ7{ P--OJBO~ۖͰ*P^^Ir27o廷BRy N9k7h28adkB w|yO ^,X,ڣC&C.Æ 1qD?9 (@ P(:Jd|!<g*(`1pQHI Phg4X|pd @YhBq(@ L@e]]Rek_[Z" +c"O;vtzW04!nІr Ph*8т풥UT C$]U`{>[PB߿os3!FDwgL*+V.`9J՞[*?p#Fk(++O<?oѽ P(@ ?/}23cOҹ>#$c (@ P8#z 2Ku(:ǩ ? P@W jWϫu(*S47Ծ:H}^H(@ Ogq]Mtj.9EnTY%.!r= 4I#GqZkׁ xqh CpYkPG n߷׫K/s(@h0Zc}MU@GqGսw|50]|)t] 벍}pzp_/P8v+;xdk_ #Ň 㭪#m8W(@V!2dkO*ud-#qxdjπ>5p&[P@[>z Wls:1%hx *ӳ.&, i PF@[>Y e.IYjyKٷ6z=KX_ S>z`>ji1~_M9Ϟ}:֮H90Nܬ,>Ùbp6mnv)77W .g4#Ez8rj;~c…ؾ};z (@ P(_@eSW,~<߯/,{K(@ Ph~lX s@\=:\@ PZޒ좯*@Auu*կڹ]qk4LOp].(@ 4F@eu9.Y<uZ~G@߷_[P53 dDb0"NGKΉvN,%{phڨ6? f_ -C:6wh훯#f`R3n[J ?_f SH`\hQ~%@=ߏY2 z=$#9&//vFdp,irl蹈Q$મB3/׫U+s(@,1 ocdԼ"\%G58ΖpYpk${wf΁iH<,hQP>c ?zxr AuTA*n^_]۶@oŊZ|D;v,/^˗k۝9s7l>}y|A P(@ O{a癳~9v p^k(@$~/N};IerONS@H"ˋJ6X!Atu,(@8O-ngH]ǎ0 CKPSV)TF^m,8<Ի5={!lBt?{/^=;xn]Q#(YW%u㿇XYW/Wx4(@6#`2q=jl?Asy&8H1Øq}6 OuH jӟ nҥ 6n܈Fx7kƍ;h? /nͫcڵ3gNbkw/-Π(@ PhUUxx ,!(@ #!9X]Rzޭ}c)5, (@ Pu ^@c55B/K/}@:pP*2!;v h,"Vla>}S83+9Sa !( +:KEXGA\e{ PmM@'] IY\Ǐu`1kafŭV *mٲ#Gʛo٤ȋW^UW}=4]wݥejOJJz̘1;{{ggyjmg P(@'Pirټ|⻧zѠ}_圞(@g>>fRHB:% B* + XbU]ˮeumk O׮`Ǯj:$!d2{d3d&y<{dΝ'v45xwvtR"gO P&[-Q|Oj̢Jd='k8daGu(C!Y۶ghotѕ|Vf>ܮb{>XAn |\Qy~BWM۬˚ECM&fC`]z(@ ˜Uv,iRR? 7b V`Sn\瀃<DŽ&Aix+(@ xz_эZݤunlM({=b :ujH"SLqoӦMn˝233ݪ P(@.P܌7>4G|il>N̫,(@ D@͎$^^c%J; (@ P ?"fY9,vS$Y o[(@ (56 h_adȼ=K@hU(0 CfhdOFvՌ@^_Ψp1ap< P{Ojέn'K`aCbfwuw7..P(@ Dnm&YW $S-+ȁ_D3I P.`{zᎍQj}?/6KYC90λ$k)@ Pmv;- j׮.OfHfϴ]j(@P1 *ݶn힠Ig@/-a>:}Xh8@2Io952K Q^qQspQ(iStNׁ!dG$c E=zvZt Wj/(@ P@ ഥ%MWK&"oE:3s8&YWSޚ(@X^Qɵæݻ}SC)}:q(@ /Pinb<_XV=H>vqn6-WR@d kj$}3*hl D/>A%]~A7@+huh-Vo] a{Գ@$ h i;@ OIIAvɶ?cB7͏?v&C q[PX>XNNN&\(@ P߈u [ǍAy(@ t_໚Zܶ+|gM0qD M2ܒ<V3; dmJZTΓAVdg!M]P: 8Za۰ny坛tl4B?=]6lA0ɵUIق9d4.miA^\\0m kkdn.C]4џnx`L>OOߤU\rss믿˗ 6mŽ;ܪ P(@ P N{1yh?$}1O(@lpU>jq/uӟ($Fz[ڟ޾?7t l$kAޛX(@ P.do 5P[>TPmvʇ"d B_g{j gJ*`8t{=(@ DF_HB ]&BG@XO4-Č30sQ|I{n{n_tBvv2(@ P(_۬xh6ru=f i=5ʌGQv(@ hS5wZz.Î@\[P Eӧ?n?ZL:_= @@K]]><hmmul֬Yss-u]xG\_|1 R̈́ (@ PKܲn64yKNmb f(@hZĶxDf{iM];ydl,1n4 gF\A P̨nނf7|$&~XL PDϋSav]oFICb l G,(^]u X2X7IHqp|h!E*ݶnOv[&HAi .ucAc27@8}PS 2E =0's w.B݊ 1]>Sܪ@ Pǟh}98|7Tk;树;q-w /s΁]PXTUW]^+/*}d,--u wEcѢEȒi*;D{+X:֎u(@ P'B-ۜW| O0񧼑C&(@vVPsظEdQ=4W3S(pFsapxAN$ѳk(@ PO@IDAT` X%@scqBB9IPH h_j_hzj'*}Dh:72"^`\k%?m31zP` 7 H^^&c.*ʫz.Q@}{`KXW (,f0Ï&&(/O6| M:3<5+}IJI2Q[o+rtRtI 3$ a(D PCO*dMи^ӢpͨΠB=t PZEQZ}qtp`̓leC}e(@ b:6 Gt8d UkN`֮=F' h`]ڬ#rn."pܘZIo J׻J &sk `W?jv!4C5q=ِU:+df͚@o)S੧¾뵝<;Ȕ,(@ P_VuOڴd6~,?((Ћ+eZn(u>/7/ vda(@ tW㥢h"CqqN6ה(@ P U0?PPVW!oCAٷm-}-[ߧ fH0.A w P xQ:-^+) x%'6뭆 Dӂ{{c.Q@ NU`{ نZ ~駟裏Fqqq'6vX\uUK32cĉqgꫯFdb(@ P@ l݄n܄vV<ԼXCLOOن+(@ Pd  ^7D} spUY(@ PPl**!h\)3e"`DX\I P ,KmE_ oLhIN`v h?Y3{,܎ nWAIҜ;6nF%Jдp̼Ù:E[qZhlt߻ n'^% P(a஼t2SeqW?Wow}[lA})tA.r!8qGn,^x!Cj+l2゚ugDL4Hb8e ؊ w?YM#(@ PAL~8O,Cw܉jlIIIl5jT=(@ PM_XZS$(༬^Ԙyuc P^XЖmxfG!,vAΔcT\^?f(@ O¦f,QWK AJ$8:}PA|guYzeghG>#Z PT6w5q̲bu\E礤{/ w nojr?cLzB P@pj2鼎(@ P_TU7bc,x˔?AI(@  >m݆V-7} P/ ^Q]# QeYB\BaaF"W?M P!`+( '}ƌFbX(@ Pm6u)=* \+c}o5(@ P e{{(@ P(rpMXVQQqX8n JKن+(@ Pmv;^̹lAUɎI`Ѽni([` ZZREۋsH/"ڳ0]w42 (@ Ǯ6'@7~"2{; (@ &`ۺ-f dpP.{=(@ P@?`{?cP)@ P"K mjxJd,xzN덈u(@/2UXGaC`S+(@ P6|hG!Dmadj2 @-;i@$(@mٌ̝}꽝g P( pd(@ P$HŢbܱq3$[Hdg: RK45a(@ P EU5)3mhy)F#q˵|:q(@ x AT{3 =[׌u>S ]Kʴn)i3k{( (!Mh]nv?h~t#D P.?(@ P` m@dU9~ |5a=(@ P\`u.K2]SL:qD.0" 2()fŒ<#w47{6TstZ3[ aFN"(@ n8XG$==Pۦ{[[8&Ip{z.Q(@~*xrJYnZ,IK1eժU=S(@ P d[vo'>̗io?GH (@ P)شW0jL/YdmO,(@@6̢Ex6)}^N6rbcJ PxI/<Ӎ yؑP!`ݰ{,e& ]Nnd@,)@ P p߰ay PA,(@ P,mwgV< 9?9ͻӁF P)Pb=rJQ >ZiCqQ.SRPgя*Br5" j?]s8CH\l@ P`@ 8$k%!97ÉC;(0| njlz.Q(@~.V/.غ y(@ Pnb PS2Yϕ׎CP(yj0[i :4rlZ*66c Մ(@7z,Jq (BQsۺ j1i8' qV<\(Q;a~>KKz|mMBdpg(@ֵk`?@>P.3\K P@8aE]?!S(@ PCjܼn6nX8:-(@h*-`:87)I} P@G Π+)EK$8;ssF1(@ Du0?`?0*LO=#lC P X9]3(nnS(0p"]elꪫ>pg<3 P(@(h܍߈O%W3( Ǎ̈狈(@-fyYR\ 繪k ɦB PJp`yEs5]5A0/'l@ P[!S,z aS꼮\4>କiL PMO0?t?)&!ܮ:̭=(@ P@z k׮pM K.vFx uta P(@X[L $2/pAvt5; (@ P$kw+M3qm~NC-|:q(@ PG_**sE(i1eڙ؞CSJ P{}=̏<'-0a=} h>s63 SN}>@Mg(@vOKЎEJp(@ 8p7=`<@tu螀ʔ?|lݺk4н޺Uyw}vqqqHMM1sLdeeusnE PL@e`}wlF}%0B PjXՈ(@.eu n۰ 7+9YÝ1e  (@ P%`+QU[3x0LW,nTNc2!Sa(@ P B~U7 pUb$#rp\VCe=(@ e5j<$[{6N6&ya(@ t,%/^JƎCWB}FSꇅ̏= =L)7(@ P oTseee]FoB~',ZdC7݂b [wrss5: P(vw7j6fP9~,qwF\A Pv7MVNiY^գF"5*g;(@ TZRQ1+,B/N_HŹ80i߶\I P)hiA3O^ ǟsR^}XI P'm\INA_o65's[ P(ЯzΝ_͞=_!PP2…*;4tt.۳(@ D@w:39636=#rxzQ풱ݙ]2P(@Hɗ6UZd3 -jYo܌W_}m?ODd&ڟ*8~Æ ;v[?\(@ P qE~#65Ee^u.7}"q(@ P [˚Q[B<%?sm" mxR]Wɏ_㸌t_MXO P.ZloDo"I2LtS0s(0쵵0?[x|:<5(uӞ2cF_oVCN(@ P{=]O<.fwq| &W᯿::eg};sZknn˾̙Kl6;|w@A8=/3S(75 ٴc)y8W 5(@'ˮz.33sϒR޵ /8kpl{tx\/!:^/'@/ Xv#OK`OU?1r1khZmW͹(_GCD#قMnHu(@})Z{ƣ3$ Fh9+(@ P(p?s{1̟?:$s˙g'x"j=٧mPYYD-oew6t_}=C: PzUM Q{ AV vqn6Av(@ P *T`J/a_ey#p!Fˉ7EU$$8 b ?]Ϡ' y9tPP]m 1X0?^Mjvhcf'(@ D@XDz衘6mK`ǎ;pˆtՍiiikqAuno~zm'MotڻUUV1݇)@ P]. 4,7ٱ1(@~"5]:_1:.+F"^Y(@ P T-VY9Z; ڲ&cnNl]Oo/Ļʽ~%=* dgp(@ PG*|SS=s2KA!eG+%q4죾/ xJ0 9DxSQ_mWeDg2ҡgaW\\O P^lE0?t?fno eCo`3ro(e6,D_7hq VP(ad~hjjY5k.R,Xcǎ?R': gφd t^ii&~ Ղ>߱AeW!X(@ P@o TK潻 6cL o7%`L|>`5(@ Pa(4dG5{h\/{4l]6[z<=o'!e-f|ʰ=xsu55Fa' =^5gE]v ٰwj:>HGu_7C]j?K]:*˾woUxMe1OhQ}yYs#c7Gzu<,C3tl'SgǸx]BM`OGs{w6D0>ý&jFWٽ{7]}OǝE@ccc4x{ - 6R gV;FK@Cq8g`{=}Z J_]\q OWΫyty=)Sic)P.*mT)E`P }yx\ץ:V_r4h T㍒`L jϏRv>qG">"緗]N%u(_KwM%h^}bd-^a?p}XGꞑk?{oN3k`JO>BG<2|=àbo>y},bX(Л~7uwGuuc}yCo"Aq In4j(,(@P Jãe;Fu-< سdW IIЪ,(@ HV V7`Ym]O/F^?̓Q嵻BzC̑)IHϟ,(@HFeCTj̾j;-gJ;$c'([(Qzܹز< y)@ P:i > Gpg&} (@ P  +Ty䱷IOi5a(@ P\`}S3>KFÞ^ {)@ @qk+JC4WN[spxB<S_B P`47; 6yC>XˑGC>xg(@ V}D}G֜\\xGyc(@ P@Xviw?2.[TT !S(@>U{KP"YZ} zP 2jz Pjw>O姪ګgq-P92سp|d(@ R@[R_vTX:Q%(@Cy掐y2=pXA PEI~X@),n*Yq:]>;w.̙e;ՠY2yζHOOh4RwEZZ3p!V555ήRRRc6Pj@RUUU >>^f8n(\z=Sk V kh-7Z/w\#;BvڅסjeRRRhޣ  1hР>mkkCmm'&&JrwCBH.uHH8D'YU5WT*4uc}w T.G!}Pp1/n30"uߨ/C$ʗ趺K8.u;-VלцQBvPl6$$$pDU}UԬD=%Divqq#abP_EH@G]}I{tou~:b+X,K^z]\caU ;x,l PCYA z=Sk,@EE˾ p}?:RuUvQaԵ|e&r 7| fqw凫Ϯ~/0 x.{æ븽C?kYkqȒz-s/#g_@cUrsMrQ >zcFÈ׳r️xU签ΙFXͽiqsWÝ6ϭSeivt1͙0#q_LT\Ms歾cPǺb czy{ƾgd O_rCe2[:ol`(@ VOm߁6o5J>@^6"W@l~30< P@oX&Ak$S0e33# 30yp33uڧo16g; P'cdVV=SNm_fEz PB. {qVFIv0|:P@.~mѷnD$s;=hXA P`{Dl$NM*j*\bVfpr'l@ Px|'n؄"ꫜ8$7̘h_MXO P@ Xv|_['Y+[>Z<@UPȕ%;6X sexՎ=-%TV{ (@ P'ի`~q٣M =ֱB/[_xO?\Ͼ0-+a(@ PD(M*}ǎUH`JɈ 4 R(w2 Noِh4`T\u.`dne|+nʾ 4WS(hYUWJ>%,*0)'YkjcxKـ9=pϒO# P@w2kh{mLiޥ (@ 3E~tMr8paVP(@@%־m2&ƍs[(@ PGj ߲rllvb&࢜,!;JzǦR\ _ŧ ÇBt(@ @ zHٗIP 2JF@KjRA5)sΊOXZI)>D}473#gg ~ 72(@ 0#}(yOT[nČ9(Cf6?l{n*-3΄{c (@ t3ܣݤ`rA P(@xm\r ?W_}V 7tSo"W;|tn?~`6g[ P2 dFXYn.6Gߚ5 e/ڲ lފ&?\Y(@ Pu2+ˇ2`X-K!ئAOuu5*$^]HfKw P'탙_}"y?\e P@-a~8~Gެ`{o'ON~ 8[~=Z[[%T)?[3fpw(@ P`@<}nYg'ΑSRFHv_e x9/"SBMſ | Aefsǥ/3%Cґ+] v+S@F~T*l4/Ǎׄ(pȵPD26-yޱP+`h9,A+AC豎(;=vr x4ݘIУ3VP(@ I+ ԩS:okkÇ~N:`-[SИ(@ PB@,r~gq&%&qc0%T}"q(@ P`/ 4=dQe%v[=5|b2MiHf/*S@/ dDC2S 3{Ո"gfj=#S@I)Զq `n?&W(0f.z| 3qY e P( nQB$]]P(@ Fqd/^:wzPu*WZx'Vq0 k7.P@c6acqڰh4!훝Q(s|TQuM-G=i#$,X۱!(@ @^%p9X&>()A2jw Axi)3wW[QZg$m>ϙ{cRE^^L&. )S=ױzM!3i6{C! na(@ P{q[?쳨m?Ltoex饗cꊊ ̟?{/<6HFֿXzuX^||@ P@x|v(& |d.}PB&VTb*)*tgP R@ FELc2JeV%ȝCVٷl?wA{<`T~{=PK@Ny0=NL;lL 6c:VP@ 8$Qa[NQ2=hXA Pz,kv^y3g&NQϊOPXX~`wdk`[nŕW^+j[u_[/V\V=KV Pe!9)0,::$ Pz&&}d^2|AͿrHO31".WSS(@~/`+)]'iڍ~ @b)@ 2[^}m>z6$;E2y]J Pgp#¶z! P(^ pWނٽ>2&Msk?bp Il*ȽsQO=\(@ P 65c$ n$(@ @AfeǕUhVheZJ2fH@ lO2)Q(@~+p8@k`;vw#TL]ΫL S: <@O5u.빎5(Ыvhi~(YGQiX(@ PzC{`g7o3gu&mf͚u%+)@ PۚBv # P@࣊*|XQk` @KшiSS-,(@ P l?{vZضl.oTmQ_q0I0]2(I`~~~cg#F2C(@ P  p'{!0Wr!xǰj* %ފ~c̘1V(@~.`Cv+dŎ(@ PT`}CdipZYqfh)ڧ Ncc P@7_䄬|͠אH =t $CAMW@ﱎ(лmͯ;2} ]vVP(@ E{EEԏ9޵k>s_SPPZ ;{|/b}݇:g{UU%AJJ 233?Cvܐ(@hlbuݮd!,.eCv>(Nm`]m^j6|xjbYڏqA!(@ PC\c֮ ɑYQ!鉝P}-hi'`[ NӠﲽb@ 8l2cNb8v9s5)@ PzI ,|A~b L6}TO>٭r 6̭ }#0x`L>ovƽP(W2k5x**ʬ㙽hms Pxj0gUՒUTj $%bZJ2fdItDޖ )@ P@8jj^⫾;@$J%+pT<ݘ.#﹎5(VUpu28QgQ P(@^jRTT(\(@ P!غ RT (*(@ 8?h_U*-)F#NKufj?"5:](@ PLK`yGsg/ھ> X,ǯʆiM=OVPG{m?Qsg(@ P@ DD{uubqq1>`zVP(@ tOFyl'^.. $$nF: (@ Pnef |<3#S'BѸ P(@?~VJfATT9(7l _D'yݽ~a:Bh' (@ lF` 'xԳ(@ P""M?VP(@`v|VU]5NQEm&7Ybc=(@ DUޯ P'&B͜r-R@x 8dP{nMS>x0Z^ͣp CYol\cgB?n|c@kj`~~طm`@ԹpđXC P}" l5{{Ա(@ P 0U j2MNÇa TZ0oPc,! )@ P ۬AhJUhd,YpdkOe@؎@ }%,Kk%"A XMBj@aߴ1 O~Æ0x:Guka~!ȗǢIIiX PGK3Z[9(@ PhͲrR\ݒ/S ŜaȐk0WɌƫN?FLh/ P<J_Uנl&h4̐#R2P@pH'm4/+@/,@k~7`߲gu<%/pt< .j PY흷ay52>+C`(ЅCfj3lO=gwWS(@ @'%%;ļyz<֬YHHHj6(@ P(J@IDAT"WTbdk%Ժ' p08'ۄx,v0߄Kb4ѣ036mdS(@ 0 PYUP/2J0%'&ƙ}OM F͹B PI倃ϻ].ʶP_~ؾc{[j}pLFsvC "&O<|h/TF`I'C_<(WZxO8(@ P#Ыj^x!~i|~V%''{rO(@ P /bW«r4I{WE/_3s45* O FLw47U 61QU&#Vzf ;J P@?{wuX&TP{qKKg'%&{u:HèeC P֟Vm;pXl~~q742ZؾG_؋n {U%PW緝1w_等3cU֫mV6 3wk$) ({0?x?U;W@?qu(@>pލ;oc9gx (@ P;F?#2e lG& ݰo P(/v45 ɤEˍ9~HAC8eP/x(@m:LWVL2lZJs jWX(@ P` 8d@T뫯D5hx9ԙue.١5Y0{Ve2eעJ$S~zb% ={φ2ewޞ8(зz쥞D?内(@ P ,=NGD P"K`XZ\*e1mugɃ1GO6q2ԙ(@ Xeu^▖SC&%&8gfsVؐ@d؋ Cv"Lg6u~fv!x)34S֦gH?m࣑F'OuJJ{ytqSmh}aX`~, xl P5 l_^g@"utS(@ L=(@ P j׷v)Y18E=+k% (@ P-??vfjmր;i)ɘ)Ygd!5**mِ"KlmP{Ih{8$ϢA!>*`}o]|gO?AgQ[yY^ 7߀Ca8ft9^۲.ʖJ. ,(wuu{w{Hԅpđ(@ Pp_p!nvLB P(=|Ye3Srku8(N32p8TX(@ PN=Ým7d0`zz3Si) P?_E~}p`l=P2Nۧ{@cR; O6%wF<6 `{-_ޏF^?_phF8x`] A{6Z`Ylz`?wFݖ,Y;2ŕb:% !idwI6&@X`lƸqdK{,if4#4|gs=;w >T4ú(SZ {5bƍ0I3 P(]vK7Jvq .zṪOB*}A|;Xِ)@ PWQidi_r;/7%\>O_fB PhIs8µ~m-5d)w5|H-f@pXffCzm0ed<&Ĭzp7od`E=[h={չjrBs̄p>|4$|qXF (^A2eFE?(  P(@~O=TիQX۶mÝwY߾si7Z(@ P ;%Z)jk& c7»(@ U-3lpQOJ֔q=ҍ>Cc] Pq-x lSHNiȷ)zU%KQg9[7-aJO3iK~a~1|w}1 ;|wކE3gܷ_к\I*fsp2 4-!Ca7a ,(. n?) P(@hɓ pP P@\HYz o*ƪtd-/Iq={P(В@dXދ򊲳 *6$ ̓,Tl{o)@ P N'۷I5|Vl!7Z&MB,\K?4p>U{mn\edy7 p-_ ﱣ 䳮{Jc1Kjy0׈Z\MtyMp p_s¶hԀ+)@ Ēl/\ynw1M |D P(qmɇWaʔ)a(@ P@. *+ExW2WT_d!; aYД)@ P8SWeeX*˚spz*)fdIP{6D2 Z(@ īN=t޴ f#wvl~5R x%323IɰΚ ۼ%'w;uB w޺%hjU߳oh2%}.u[u,)=su W%Prr6(@N𖖢g ǗkcǾ˵# P(@>  ?yB$K BVnxj'"ib|op,gH0.WR+ uceZ<$~[0wSb_)@ tk5(gBvg5 (@ P@wj'}8Шի,zJ-ٶەz-Sm[Uz8rK|"AmM]a PY[R.ፊ|~Q}-c5Z(@ P]K ~8Tϟ;C P@| 쫨%eGXaߑ)# (@ P |vZoC0d}n(@ P,PR[u~l!:><5wI`{H)@ P |&؟;zyCfO O2,P*=[uFv,ITeOSzz[(W*cs?=6`?*AKtL2`^e G-.~PZqΑ#F˵K9^3 SA ܦ:Ysj߁<|D'(@ PFZQ(5)Ծ0z٬=}L0A*(Cc8))} r1W v u(@ P ^[FmMhiiLf}FS{@? ;o{pl4$cqhl2E\˖#Ѓj&<۷)?_oǩPmP R|Uy.. ڤdyT+)@ tg^Ӹ#2bw# P(@n!ngIP(\|x:U%g[*V )b듏9YL-(@`ϖG\ǤI#}DZjT)@ P 2[=x ۶.W'-`[|hhNزkP@o0;|ۏk4d(l 4[;N@-Y-TK2C+*ۻx5Xog”*Q l{ix lFq (@ tG^k@]D$~0}d(@ P#?O m6[}ޡ(@ P&p?U7e) q1i:~w~og<|L Pq* x28q$ͤaz^Ԟ9=W:P+9U j_a5g BX&O>D H`Hm+ofI#Fv]0l=n<Sv6 lUp};TS =X&\+Y2;kp)mA38~ ʊZF/恃q(@ tdDe P(@+ja(@ P*P!wOE|!ܕ 1$%%VO(@ DL@ea/w:r{!]s~&/Q(lVlU1;!l@ x+.q=q<$e4Xπ)''}X vp.ZYd7ۙYXڨSۜyΞ Ϯp-_ ϞOwQl2SA_X˵1Dp/P3?ο_cu5}Z g@, x;%0x=Q(@ t;Fw?)O(@H x'gˍL) +lL/?/7GẬL4-Ra;(@pJP% @WFzun_Z?+ A'vơyL PFzvkjxv™iĞD4<aá;a7zFT:B@xް^Z!cvdl0z52fx%sp[ 4 d| *㵿z,Xo SFF {izM <;;`nh[. (@ Ğ{^Ip{r/??_=(@ P`{M"(@ P]\`_E%:U)2zJP{>n`f u(@ P$ T7/gPo^$`=21rl@ xkؾnY@4WE-'2pbA]>e0sׯP&L;al,GZ1\+W@/+ ~UUpIv{$$X%yu6<'OwOA2ikw.V@/=in ][M:&ɾK,A|/ro`,&jw̢1 O劇k>ܴOtS@|*u<5U2#*v(@ t@wލE#d)@ Pq oJeg K d{A{q {@'z j:zn y@ P}Zev]-[BJ6jX:njuZ!̣@wF<|@%V}YzW^xlo)ٖCC5c+@_ X ϕ=y]fft6<bu^y.;xFОaq]6(@p no0EKOG~ S^~(@ P8w)H(@ Pebvi!G[Aj OM~o~> aJUdM nYTm>M w]Q)V|Y}Fjw傿??z/ VWV RWFu+Š>'RE-H!ڴ/w(@-$S{Z.uAv]KNkV [k2 liwljL[$=3׌ߵv|Xo\Cj5CZ75}ܟFkYٰ?wPeoynXHk)@ PHJ P7j 0Lܰa% P ^U %p-[ ՆhK%}>L hr$c<<ܛ6!fj9 gΚ#(n!-`t׻yX}bQpoۊg nS2?d|P(@8`{?x(@&.nl8oJEϠIƇ`k`Y9YX'`d,(KOb_e`p[Pܟ9r ?>4]z5B3}A.,`uu_߫*wL@:`WVF% \g\bu-;I2a{س'ඌMbT@;$[xdYvna^15+h]@{\K>DXg΂[-!`G~p\+eAk/7h>ٽJJ u=x][d,>9|YB^ÐƮ3!p=(@ Msdj_#-7"pWA %$kP- x/\$ٴFa=71r aNXo ͛Z*s{"ܫWip̃yx,-9v uzyy`G9`\5*pP@L 6mg&iCܞSeg(@ P:G j)))뮻` #XkZX(@ P@k.I`㢒3xSڷ\֮yX (@ O`K(m.#cͫ7F, .RTCKz|UT PW}:v]lt3jO$p`YiVCQM1A 3$ӈ4_ϲٱ( sp_ gNդP{M,g CC-Fv-1)d5n@[4e2XT0kF{=NPCom~U+Kc4o|S{El/ڰ8a23}۳} P(@8Zw:t(F{sOS)@ PԻl9,* vk.xIrak^n6ɇjL},(M/DNnEWgWq]Uzk|?鐿򾿠ty Pi]fpobdkh<i0 WRmJ`"dbղ뼛a9KfL`܋0?}-KA[ϟߍ=ܧ h]X]fxsάz`ٰ=h]z\(@ ֭|Ӳ%saF(@ P@7SNz7k,!I#.UY(@ P_`oEJP.5)S2z>~[\$G8dC PuVTvMnUՍ@u_UգWa(@ 2mg>#ֽe3 ^3+%}{R t ߕY(5A֛nn tIX$ul p-[ c"3F?^i,摣`3>bR4Y:Z[Vޓ'mK@Wlq (@ ĜK*9SgG-;Y8boQ(@Z{qqqsSʯkٻjQYeZxN=x:{v@MMik9_$~m\A P'Z <Q'IdP$ (@ P tX{ZZZc1(@ P]\dR_v%iu *`bF8<^,?h;#Q:[@e]ޣG&A-:}LyyaJ@<ڹ]xmivGvK &f@ Z.2V} TO-W|- r9|V[p-^( aG%2IP (cU+x^i{#?p(@ P!_n7BDrԩy(@.,P!SQ<riYus8nOF ÈԦUopԾ4.ۛP_/Wy9`cS!>(1S$(=RApcvVc;(@ t]~O{vnI`7BGfRY(@H x݅lZ8-gV@f V,h99ΙŃQsyhi瀀\A P1)AcW^ )?Li n P(@FQ pWGo~zK`yfnۺL(9ի碗ח|MX` Z+C Ata0n(@p.] CKmy瀝(@ P >ydڵc<35j򐔔dlߴiSzk5Z#$ۣ(@ tkd+ no]bXS~5OMALfgg㾂|ʄAA@,,׊Na˅mДd|u`6˝(@ P}{V׭3"n3INeXjZ!\˖f4K~n/A80dl? ʶeF tGMf8X2PK{v >`Ka,Z^>l3h ݑ]=]F ne:w(@ Ȁ.M~mdf |Ue 3 (@ PѣG_"iQ(;<4O.X'O08%=Mq_ P$,Xagr"^u(@ xϜK[ \yX-`˴NƩc% O@zٺE^TlcW#Ǎ]-޳e5!z%p8znulⅪtoބt)?ǿSfF Pϱcpېz ɬ>i{sѻpf@L"{?`p{ WP(@ $wu^xŋ[S(Ǫq:=L|1Ode(@-N5o}a3I(@ @MZ#zEڭ a>D O@7m K抚MAel7\5n@ /vϽUkj}| ͙x4{z< P@lp)bgaG ǭܞ#ʆ(@ ĊY,}ocqf 5(޲2g-~vw,hp LBKLW-(@ PZ%wOntLQ[YYjl!t;* wnh)7 _lOZzYZHh2g.؝|uH泀2 Ǿ---`WP@8^}m? jN,',(@ Ph@ܗ(@ 8<^ _Fv_f*U:0[_Gx(@ PZ-d۶½n <{>t6a4nY(@up} %7f3,S6vrrW(Y-1 7:g<;wl)<{?7o4SΝ˵Yw$Q{l5K@IDAT[o{1!JP(j@{Z^=2f\(@ Pq/ WNG}N0B`fvߩv;(@ P(5]7zk ԅ1-A0ץˆ)eDh9K>䷠bplTʙB*q".=R-ޒb8-d#豼'|UXn ,=֍ՕSPB/=Ť$ؿk(@ P3\2sWX[kj`(@ P- DY`__~-5(@ Pq.PZWȾuAzmUՂA8#+ ~%0+SӇz(@ P:B[Z o aԷ,n2a% P ZΥKff n0edDlh)//= ccp^^ w߁E]fHL恃֍ A߂);;̾Pe5H$gnrtDBmP(@nja(@ P P%L$܎5|>(%SSeIݦObꎋp 8Ձumsg P(@ P1$HFvaLKiF`OAX(yR(˚i`d~|+L[@4I(by7ó}{`=77@wkɬ Tt+F~~Y@C_fu(ƌ^K" D?W-"V(@ P@| /7YS *p B jWNgD2%n`NM푎 Or曃6[)@ P(@ P z*Fvm$ex j󨫙e1֠@.<"hfa56 $ (*eDckR d_={= ku,Xn1&fR?g@l OC^c6(@PePU^[(@ P@ 0=N^28rRdv dwV١Y(@%`. Ï@_pݵrt.ùh!,ui23aƷ`0&>(@X0#%c  P(@.&.cw)@ P%3މ+ĮIHL|#]_0?~"Ǥ/O ˋ(@ P(@ DB@ezV`k+a)Zv6SKB8|8dC xbW!$7ͽٳ9 %$7Ph)Ϳ֛o{/' E N͞ "pEh 5ak5b_@lcgdCln(@ P@K poI)@ P-O4{*x]eb?p9]ݺBsn!|엃%4Z;-]O~u0V-z {I~c(@ P(@ N';AnOw 6 Abdildk7K` (R8[5fa'3gAK`˱ RNhY<Ǐl ܛ6=xuh0믗԰;f K8v Zm qYL ӠPWWg+Rv]~g}T= PU p\=ZgU(@ P:.ύG(@ D\aﯨľˁ*R,f 6*H|Xjq3l=N{#v<.9X*=J#3 ի=s_ P(@ PN@ <*j$pLڙz<|4[ۿ6]Je7 <3_}2v|XW[RweC՛o׏[ tss01x%~bг%Pp.|dv^7h][R Ǜ#L'ˠI{a<ޓ'PB?[f*a,(Ӧ%-,YY gSu(@ P(ЬܛF PW PUu}VvľW/\%K)ɗUP{ߤ'i.Y(@ P(@ P'WThK6f޴$$ 3 WԮ˂5=<6HP XLI2?Pн^dЊYɪ삞( Hp$\$}˦fLn , X(@0zܛ7| G߲ݟ2󈑰Α@1eu_hvո^~~@/>4i@^õ(j^}U-ǴyH P(@KRd?PYuz%;^ ZWER0(9&B P(@ PS-P$ udVw:^  ${`X`٪vB kVZ^2s&$VVPӯ?3gRx]`҆=Ǐ_<۶6\p_΁mmL+f6l P  .a-A2C{ZT&vٰ@׆upV'oF$|AhVk\I P]G Af NJ[i-5 _V(@ P(LTSi12W5^5Q@7 d&ACeIv P(@ PjɊ?7 ^}6 [M*;gϧ} *6$2v|5!k(@\| +dpJ P_ӥ[0WUw߁guhA6v2q(` o p}WB2FUV؝ o%c̑at,(=4iP_@?]Ii2K_Ǚ<cE P(@ޒǝ@mm-~Gu\noʅpiM<ڣ(Atw[UΣ%"sibd`da)H I%-6ZżiQq7h5tvuk]_4: φw4_?CM=y-{,>Gl/ײzo{nop ˗™*yM@ť[;p0y 0~Q 4P]uyF4߫v4^E %4% {5? A Y̻ؐ TqoyN?n+KsH[sVv }l`@Qt2x 畵={=g>pvu+ =S`sh@5d;R8?ֈ욨w|'ڑS |O8[k1*84)7h9ĿEŊĿhWhSvA}-#6@UU**툓q,ݩ %,`tTnAs> юvYv,CeIi`h]ٛksՇsx6 U@/,B  է^;꼚ݦP?DPB:4# 2ƃZӲEaÙkxc{eq`2WVY):wIbh@Vs":mVן\shMo|Ǔ/A7΂{UL(@7-qVg@Cb>~ uk`lp"q>KKx xn#lso^~3.@6&MȺe3,t\=75 ;5Z'oDH/Hw`bh͍{^@ {GG=##kR[ %$h5'./Vfwo#%ty`s$P,j|KMOX%p}L78)6|Rs_Ig +o;V?ϱuLְtgÆNjAPG#ey?|0?5U}b@0]09lSD3z <'« 1"-x%?F߶g^Ij`WX n9i 7mDY9$ؑ:CVŋ@M5Ȳ֞XE g0 3u܊ě 4|uug^q}C2#;K!Q]];Mr|;kԟE˳,9G骱46v:sHJg?woFϙ,o)pY ##YYYQPV_zxPodgϞ5ηW^1Q!*eY VTBGL&'cxj*FȭZRW `iiiS3)):>@$ˍ e8%%%M 48|V+23/gBmT3_ytg^QPmXz c@ʌiA0Q,P !vkYO56 ɡ٢د#Guhh?OH~u|\b6EoP eI݊a ^C@ @p>]CUdv r4  V@em4룑e{~Ejk.U f61 UI PTJ d7ɏ)0A{OV7*ȮnKH4?9 .$ì2˰P(@ P ٻ7bjyJPi0ࠊ! Ric+]mr;}N Q xK@/͐S "?lo3ܟ@dӈ%(@ P(@ Pq+c|ZxPmV]ݏ{CD/u[kAM侤X~u0k0D;Wnm~nɒ)AƭHMEr\IE P(@ P)W\lL/ن(ldۍUU{X֣(gKb(@ P(@ P`{4T&<}({V`Ċxyx KM WūG{'"8&ҿuSڧJe0JYT/F{p ^ݦ`dZ*2$(@ P(K޳epmѮimQm*zۊT(_#=~'v(@ P(@ P&`*\G N۟֔ p $&fW?;p(v?WOQ zH[='\`_ dW(S1}y (@ P(@<϶pooQQTBKNJl_@ ** @g X&L } P(@ P( GCmRs[߽\NW6Ns2X;^9 * XS8PUg[t?<Ey#=J0{$h|~5J P(@ P.A[B?.ꝳc@>}pZB -f P0QͰ2sO P(@ P(Ђ@WVVW^VXTRR8%%? iy۶m-Wb S@=Wc~R..}s߁vCOq~^oX]ݞkWMwVC1Iк?p f!Xoa6\|L P(@ P1,SUP@MuVجtx P ``Ыٵ3t0Xƍ&Q@7hAlo)+ctD P(@ P@\ \}_ rg@Wr"vKz{˟`{{*}K>egH dO̞$J P(@ P@W^$A;޶n|nzy8Vr8_z1]ynS^빂yp2׈9S~k{淀{eC,'z]ad P(@ P(v pzA`ə WٻS%sW03~9O| opۯߦZӰFkߖVmAB_i4X];ZWzp{G5x?Uvא{W`UKoL<<-#$x]3nSff(@ P(@ tqoi/K{jsr{`46p0[H0- (;QW|hxvjs|Zxw(NܫÛ:&vvS(@ P(@eV阕+Wă>(IZ%czǣPm$W3GE)C)3HF4 fWY ! P(@ P@WPǏY[@?])Hi _P0I{PUEwf2l Ps~ 5? '6QAk'u XF^_ E*I C󈑰s̃Ε(@ P(@ P 12? n_u9P @\$ldcd>s(@ P(@ P n7<A[_9IeYƎYejOOk_M'HSd~vTFPEΖ㠓gr G@ h))HQ_7[`@Lh&/S2h55 Y9uL=zD_ P(@ PG &}]ٳ'@=].=#1c 4l6 Ģ3m_}~aj0e:U(@ P(@ PQ@{nvΝ!=dX #A"j;{ z훆 I֡:I+O%%@3IN޽3zR_@}Lξw2gs(@ P(@ P( . 8I&Al tI}""ݵ5_S|w.?4V6$pG MMc5~eO[zjK㺾- 7<z;hoXv. /X[ iײL]N9'gd0zܑ(@ Pb]{<<;w-Aힽ2{dEevxiNa0ja`G̸`{ZSe3s]ǘC)j (@ P(@ P(@ N &ܗ.]ڨיPA no]Pzy.w=O{+/۲6 f}oQ3z6@ P(@ P%oId޶ޣGZ5S~_$|`ee P 4qz p  [,3@Ȍ,(@ P(@ P(6Npw8(++kG}l賽pzvuK|uz`eUN榜liFY(@ P(@ P]X@@RȮ۶@/mER4d(,2a"LY]X](@ P(@ P(@ POӣϜ9zw tE<ܿpxo2s#|B ސmޟ;R(@ P:S@w:ٷjl"l0_5.ZJj&(@ P(@ P(@ P@ tz%H&w(Fh |[6Æ_rRNK`fvԯwM'| sMv܉(@ P:G@Sܻv½}+]^5].,, <;ee6W(@ P(@ P1!-? 7~iYٰdi7d {_V(@ P(@ P(@ P NpW{ƩSEكǼC.00%{Gu-pwn0ƘB'X;uOVUj%Ej@@@@@@a Dsĉ;x7n=ܣar!1/Oi2`*1!P @j&YZo+XyGq]x9(_  ':%^=b ѴrZ(/2LN0v_"     4\HCڪ֏= uN{Əӧ7\]@@rZ zJ_ELNf(IszAʿ;6,  @@tNSTi_\k%Mnbxvߙ͝*tNљM      B 'VgϞzꩧtȑ#:n$_~/_ (9 @@ ֭:_ݷ/UޏT߷_Z}h @Sl`/RĆڷn}}(0҄nj[@@@@@@ L^r%3g.2}NJF_=w1c>iF-ZWn@@kuwN;?ے7jӟבJqf@+v /2bӻ`̃4ث=Z횜'      P@NNWe$fl"D=[  @8S7!W  T=vLHf9@2ڇc@@@@@@L '6^VVV@@Ȫ@dzE.81#W)l~a4@uTi_Ȫܞk'QMv'E{C@@@@@'TO@@G <睬83!  oU+E 7GTMSi(0~@@~-w[ޝU׺M}@SlXj/^ [c䷕Q_#      9pַ/\8@@a Ȳ`!Im}wTOP8u-Oc@@rW m^}TV{MYgzL @i ."B{ړc+ǎ*듺EwPx"(VA=Bқ]5I6pmtֿozIB>}4{lr-zǼv?v}{'g  ԟ+=Zt-[կ~%[u1A@@p( ܃Rcd9-[lF@j"z&]?c 2T;ϽGHfͪB@@@@@@@>֘8]tEIÆ KZ^xqrŅ/gmڷo?Ȇ@@@~۷"ߙ-B)׽S/Qs*L Ԗ@xQm -}{h-1$ﯵ}10       Y!$WitGzҴcǎj׮[Fiƍ*))QVUWp0a +Wz}y   Pի*zITcBMW`hEv FKK=*;*1o5:j6\rHYGWj;c3      UǏOܹUs[h޼y^?˗+' pM7G?fݺuZ~ЂY@@ ܱ)<lnޔzW=}NOݖ Ф#GݻGDnmawHq xtQyXy@݄mH]޳O'm3uj7)z*wVog      4Tzm6.h-MmۥKVp?35k$@@Ȯ{BTWVsS=ٰjpd/W+ngkΡ_Sx|E7nHBpڴ(MXHB Ѩn'˫{+n^EAz gCשs6a @@@@@@@۵kU\*s;vxNUVpO-[X|=oݺ5i@@Ȏ@ԼZ;oKee)Lsqk؈J `JܒC{"o)pEҔe>`-+6t^L?Zzrv6'.~W@@@@@@@}6o> BvޭN:UyFpX~׮]U@@\ fʊ^VV +|G@F/P*{T}_IS\z4V^8OTB*'=j%VR/_#7&3 " 4Ӽ7Wtf7FN@@@@@@l {ݞШQW_g?rř~%Z|"lXiÆ[USIqX   +KnɆ&gQY ! ͙~=˿i o|;amÙӽI=z 'nBGCjJtOjf&njnB6= l=Ƕ8ʞYqu1c3C@@@@@@(ȉ\p2޿2Ѩw%%%z4q*VJֻwe@@@ }fkݿ?uV4YSk&u["@دGArgϒ.cԤk.Wr TID`6n X%'uRo֬V=8yw7[վtƎiw!      r">iҤ/ĢE|G{dOhZhAiʕM#&|?)T@@T sB)4m,u.˫th       LVd+/t{f.]賟zjT|G|e%3wq;oJ @@ܣGWݷ/5H˖ Ni-[@Rlmg^Ws+I7#p;䔕mLv[Β߬;'      $Sf揃EEEdjC5{;ٳgkڴiھ}I+UxW2  MV *+zIEWM^E[q0d&(z˖*}\l8T? 'WKX!=zn 5FP(~s,qf@@@@@@Ț@NY57x/~C=^zUSaaΝ/Xk׮F'|R6τ  @SpQ.P?_W =Se+ P@{Ϻj/bjW.|J@@@@@@= Lj_ޣTuK5S^t߻w#Gj^`>///0lC@@ ǎ*,^)oomRIh`0>Fݮc/H$.ݙs&pDi       s!!  P1fR"{E /k.u["@p7 Jy|V2d45o! l#k߾3m$Vٮ *rT2       @hp=&csrq4mڴ$2[3!  {P+ zK:~,);;+8uϗ-@ DTd /^T*) 3w@{p|Δ=F`(yJkפikсjT=lD@@@@@@s??䓚5k}]m޼9 K+Tt[ua~:ڳ  @cH^8_2SM7G(djL!@paEׯSVh7 Ӷ_hBÆi21;?? \}gz|V L8\Lڵ+;        T gwֽޫAS9.iݺuzsi{Nx 5 6h˖-ھ}Zpi!Cx=zȉSD"dnvzպu86@5;#ۣ~~ƎWꝺ-[@ ػ?DL=̄W.7w8c+ RTl)0d#6{77&@@@@@@@)7|S7tvQ#M6-]T]vz!}󟏯o33Oȑ#I~/xb=c:}Oms/7a +0! $ &x=KWL+.5or|W24Q`W=};3xډ &>d_的뜜"      u*sx@_TVVm۶%¿/h߾}71-p=İx={V\O{OE%Ko[d  Ф{*+ zS:v,өS)x&t,e[6"@nTh_UjY-Ù *|aB@@@@@@@6r*Wn֭ID [ vݷ-uU7pCbF1o/뮻N wYÇW~n:kϞ=skS׿Um۶e˖yCP]}   J ~ \}gW޴-Kٖ и\s'Ȫ /_f**N^N3{v0S}@9 ӡ=       @șRoذAgNW]uF%Nu;=zV/~g}OS]{6;3tJ_u-$ /~mo߮{Ww}ImkkŢEtw㵵 E@k%UVM}&;NK.wmيV~߈nUhGl!&>\#k&F@@@@@@@ 9pcǎ%矯/8p`F3gjΜ9+?bڵkSO馛nnѣ?tuW&-X͛{D"o ǯ^Z 5g[IGxVvĠ  @pK+4{B,w׮G^Pr|:nVhQ;nd j_Ujڞd. cBy@@@@@@@6r"| /6P9soɓ'kWBP?nFd+OeȑUc= s=lJr =4!  R oB[oHTsZ'/<9͚j6hdn8ȇxU#JMӾCyvlwEL       @Nܟ}$vݩc6Lw}n**[lQϞ=O?t璖Z5c ?~k2o}I@hn4KTVkפ>Q`8]*߾۲k.YW wIwuYg{C@[Z*{e;w>f OCmي Z^ 5wXȲ|;:tg ;cI@@@@@@@@h'kOG-f_~Ic%VsOV['L HX~b7Vߩ-ڶmUsꪫd+3! Y B[oHGݯc2!MDṽ&.cyru|?ȶ@} =|茶9{wVmN/Pt 5;Zp}X?+#w?-ۇ.Ϋs))).lx;wʷf5| \S4Xс wⲿ5kbv{}!ں6dbCb.u4?@}5tuy}Z]|.]{Zb=<~xnznhz_8ؾ7^k1 )X6e+&;|pR.">v?vgWll\WbCbPs.e4d9˘@5[6+f 2!P[ø$P}o]}.[7='*)S'?>OEu2swh߾}ICL4)i!._*Q{^^^Ȑ._^6ΔZ חatZ9^cGLϨ`E @}|۶)K9F8#{V(Hy3BUqzX]7{ P]W,mrn Hk0}g|N?@a+%\dkGkaK  {iphY!Y3!SD KTWK>+/MxmITW>'-Xsxn:όx5y]i5o]}fTWIjR],_򥊬Z)?aVX3U]UV暣/՝3x^fbB %"*_(۾'璱ѱsb&<[!ȶt1w{&-`neN&=s޻wwƚ׼2}g͚5-s}`}im()uhO>OkÐ1sWߵ{u] 6'T$0-۷{Cl @}}.:޴6r&nOr̙:slٲsW׮Z{"       r&nam"]}՚;wn֬mx㎬+o> ܻwIyۑi@k. Lvwǩ"/_Sp%u-[@ds!)1X*$E"B G֮ '4  GgL        Pw9pݵkW͞=[?_:鶞5aGyD_~yM|f߸qc8-2*=v@@5$;+8yNӢEʶlDd72Qh|\VNk 'gx‘lTCwͭlvlwͭr3|{WhV(rq2!       @_&Lp=_~=:|pFB~nvZnQ߆ԸW^I}mۖdI,  AVtj6pp8)zVK7kJ)6"P@xqJܽ{NB3sMU2nLLhQ*aW=lIJ|&S˖ *p׶m&i       (Gtwkܹzw5o<رClv޽=\1vXPVpO-[X|C  @@"`+:^Rdԇ8i8(u["@e/gfT=q{JEo9qIQ_dn~ 4M&O>}QYDŽ       'WKS]oʔ)#r1c+x+VZREdɒvTpO`@P5okPHNVw!'ûؾ`x)O!/OsS%eS6"@j[onO)jRyt|k*G>XkK`{t˖tgsXB09͛ەv        P "^>9VZiܸq^{{!***ҧ>j݆?xvډ qf@@lKs垸CO|צߙ ^4E&WW6c B&PeM뜶mI:*L  @] 6G+ߥ*5Ы/KY2趏UfߛcKtҼGO] r> Pl Jհwy?!N׮ 0p3@@@@@@@\ Փk_ɓOhƍ^;wn~;oD/okѢrU3?ܽ{w`<  @s(iw_ȭ-s%+W(T"˖V;`!նd&9p:մuAq Mk:@@@@@@@@ G& ַ=mݺu׾~1blW\Z(9/}I-[j7ЦM  @w(9|X}@jZw숭Tr3QybK۰NY b)WoOu^MBRߙrTن        \{ȑ[#Vi˖-~ S[nB'fl@ꫯe@@V%*};zT*&M['OQpErZ@ [ѭ[57c.`-,&̄       MG?O>V~aE0HDׯ/'\~^u# )PcDz _ j큳ΖcpÄu$p<{&;ߗ8ut@@@@@@@rM֒?6lSO=k?p'g}zT\\,u8c+y@@fu&>]!C:.!@ lX}3C3@@@@@@@F-PkF'׿w}ڿr߽{<;{ޣ[n5:FRuzWSmf 4"r9m۪wW5Y9Au;Q@@@@@@@h ]vCN @@t׮r `mhZaU82:yc0       4l_>|@@A C;P8{c1XiRj?׷|]yF@@@@@@@&*P/nA{n6  д"7)p=Z& k%O{u7p        Pp_f~ӟꬳҍ7ި뮻N]tWv  =uݸA)\P=H^\,uTDP QٓOhॗ?pP @@@@@@@@ǏUi׿#GT6o<7M]x^Zڵ=+@@rWF]N󽇻_l`Z@ 3i:Qy(TgB@@@@@@@@ '| ېSO="$5a7x{|__Uv+ԢEڳ@@ 7Pk^<=xnCG}H[ ]ex ؼM=xє؈       MK1FPAxz缰 XsYYl > x㍚6mA@׼]MYܫvNJ ZNV+ @p9 Ь72D}$u׳)8"9-[1"M@@@@@@@@) i*M6[Ǟ={4sL/>{l'Gm۶W_/BĦ# Ԣj_<ԾhtH{՜c+0~|]xO,w߾lj5,;\[rPiLyӦ1!p/}r[RΝG!!       @.i=;v쨯|+c۶m1cf?~bCy&quy'Lo   @\sg&>_bUj?K:g.|,:von~V'K.J䠀ۂ۶]       (PoDnݺذaCjewܩ?ޣW^^UoQ6  d.WdJKeiۯ<>΄;ts5T3 TYߠHP؀         [ '{Czx>Hl߸q1xxؽ_~6  T-;𲥊,\&Ԟnq;PxjP)hnVTe/];cpZg/FhSZ{T}"lA@@@@@@@@/sDA鮻K,?iӦfUV;cƌ~Oa@@@r1a% /Z +N@j۝֭WM+_ʛ2U&@@@@@@@@h9pO9Raϝ; ?ڱTdZh&NݯuС֬B@[R˥H$4<>f-G+@@@@@@@@@ Cp8:쳽߯Yfyag}V{5?GQk_NnA7|s 3  @c륗^Oa 4} /^ȢY~=/Oa r5k$"        4pOD6mxogOc =3ڶm[Z͚5jK#@@ "Ȣ ͟'wiӪF+0vKC@@@@@@@@@>T=j駽jtW\VZՇ5D@E ;m{">^|i!         P9p{OPW4h^+T[bB ܝ;XZ#Rhr۵Ӭ cA#'q N{N Uj qKC@@@@@@@@@ r2n^sՌ3J~./~UWCdͱ 7QY*{HھMGTUw @#B>Rx|l/w߾IQv3GC@@@@@@@@@ r&n^͋ڷnݚӹگu2a/&rQ j*}nRB/Աŋr]}gBh<n4k+jiӹcƙJ;~4D@@@@@@@@@c~ګԾeKo8:묳P^nݺ%lelެcB:r$3|];?ɾ@GdPRII't;݄*0,v?"         Q6>|P}jcƌB]wz9&(.6p{Qx|9]*TrgBhXn8Ȫvsw/r2ݫ7^\װ-        @m}ƌ^ͦuýP_>}ۍv@ٳݳ N8[>S @ ܲ2EV0 /.K}zP8Ɲ%_Ni!         Иj5`/n+gj`͹41} zکCo@ZpKKYRŒYNww"n*wn7!        V?n뮻 :4~4D "KLH1ln($'<@\S=}/Yd*59|g/5vF#@@@@@@@@@Z=Vkػwx}ȑն M rEvTH3 d,9KCb0Є?v|ۤ׏V         @{U-Z_UjkB^djm۶UեVw֭VeP={Oi>jtFT=\&>_{Rw4 ƌӲU=         $<~T?}ꩧG}[gME di  DT<Ծz]i}q -\DŽ         @3;K{*l/zEC" @ @ @ @N@Yxݢ[ā=Yf)+DvtD5MxF֓p*4Iy*Xz}lSK Px\ޑ޹(;ymK$_z)3JD^CR)j_{_T_~yȡKXhY @ @ @ @P^Np3ϊyq Ep(\ ;/ZROk= *[Y!i#kRά=6 @.P=?sgtg_es}q:kv\2&_(/X。Կzj]{Tϗ(eKw^rYt%o f= @ @ @ @7E&F׊{X'z[ JV8OΕYhV^>H&@{`+F;==#GzjrT;Nc챜}W0X" @ @ @ @h+Z #(|JL~Uo_d{ z7>qР?ߺ6ѹbݗ,RהA&#pkE?}uh'Tzyݼ9mW埞u{/LԋO;mUG @ @ @ @-"Eah@)+Rgmlf&nXݻe*1&M%KbUѱ|yg|[ вYC.ns#~ߏHEo8S#s^jOFŽ @ @ @ @K@{{!0bRV޹XTԓ{UR=ֳ{*x/Uyp;h! /ġ/iGܻ8pʎ-N).Ƭ}ܡmg- @ @ @ @hI-l@sJrtdizoDeY{_g|jTx<~%J/8Rz(/Zտ޻[Z9柝x,Ot\paSeёgUY @ @ @ @!=Yh@yw/Gﺵzv}lSDOϠf=5wX}Rt\*:.|C:AI` T=yGQ s(͜ټ}L @ @ @ @V@umF`| O:)ʿ+1)FCbw5=߽6Ɣ)ѹޙ;.nM~! /t\4:/4:W @ @ @ @-)%AT~ir6V{{wӣGzvp]T_|q̊{Im6*n SqƇkchqt^2:Rg w MQlnoonHOI!ט @ @ @ @ @@{(povtƝ@GV76*?U=Wx,C#gZT^z)+vzvO=ozE8>(͙S+tO\Nio|>;^y6덽lTwȾP:餬x==+f?3{zYQ6mȻ*MSHn8ctѹz2 @ @ @ @ PPB @` "z`lY=o8p`fwYc\<}UVd,JS^;NI`Y!=oziߕ!{k9s/̊ڳ/L(V)p_G>4 ӿ׼{[ @ @ @ @&Κ@ IXޓ޻~}T_zq:x zx#:pQֻ{ֳ̘ZzG Ysߕ @ @ @ @ @.6Q;/&ʕXݿ?z6?һCE<0P;wz|=+v_,JSD}^yngZ+fϊw< FbV=OYo쩘3 @ @ @ @ @go@)+RjcQGFuQ}"ˏkcttDEKX ޭ~%+_O=W^(EDžoeowÇkWg鑽G:3*9s/ =BM  @ @ @ @ @P>,JV$bwPz[ \ +4_ҖQ~Xm/fg.*KF%=N? ;fIQIQy/E/_QEx9nLCsٸ#JY/쥬=Ƌ/xpLeGNu􈮮C<ŸǸۗ1s Y@?K3y tg*wHX<}f iT*foh,XgϞH ޽{u)}71!M"cK:qZz.qMv333]kcQcCtt,t}NY\_@g=}殔\k!CT}{sh4gy;տsH=c]ߧ׉!Pm>gy{D+c}(7}t56VK{ٴb@GpA^:(=|dctf=wd*<-}gQQ9~ÒzxyVV~玧t`J;(e=DS/=x ʻvEGV^ ˯^~)F*dΝi{iʩMGV̡< 0}5!6Y }Uɻ~ g_A_rX'0Z!P҇EҡZ[`,CZ[!0VK?\DZQ]d[|E^yx_3oV?BX`X}fTXBEnY@Q7'oW]cc->q7VK '̏#0mڴ1cqoqG>ǤB~yݢuĞQzvxlS"G_3gF^ݗ-8O<qDi=_x>}Ǵ5zYݹ#bG6WK y%ρاuMґֿ>VJ-:Zq*,\Zߟ׉#~6}f4!Gי&"?L_VNC6cST:yGܰb% ט) ,pw5CZ[5zh@_,pOՋϛzRfտdY^H9\Ʊ>Ʒ@Z;Vh\oQK};E#@RWKKkc5+}]V^znt8|(z_o?DAW͎]Eo**/#G cߑogel)"z1(So @ @ @ @ @ ] CTyjc{~3zlΊݳXlzaF?YEf= k=虽t) S @ @ @ @n^'Gx8H_|WTئ܇gq#|_yA¬}k=杜u22o @ @ @ @ @P@lFY_}KD6V틞 fk 彻Ǜ>H{=gc*l;Z @ @ @ @ 0#@ -P>=&jc;E駚YRWWSQMٟ @ @ @ @ @ (p?'I4gNnGS^8&HY!{iƌb D @ @ @ @ٖc$Pwr洯IrLz/M @ @ @ @ @@~BD b D @ @ @ @S@{b @I-:uKgSOu @ @ @ @ @P U1  @iNzǯ: @ @ @ @ @f (poY`[g8j.+G  @ @ @ @ @Pla  @}G?JOv aog @ @ @ @ @X (pKm"@(ʧSd-rrkC]]CƊ @ @ @ @ @":ة} @so>ʋw3bɲXH @ @ @ @O Sk8 QT.Ǥ7Rm<-z|2Q*Gi Q7gQF @ @ @ @(V@{NQ i4 @ @ @ @ @Z]'  @ @ @ @ @ @=G;:  @ @ @ @ @oB'@ @ @ @ @ @P, @ @ @ @ @  [  @ @ @ @ @C@{{ @ @ @ @ @ @@ (po&t @ @ @ @ @hю΂ @ @ @ @ @-/  @ @ @ @ @ @=G;:  @ @ @ @ @oB'@ @ @ @ @ @P, @ @ @ @ @  [  @ @ @ @ @C@{{ @ @ @ @ @ @@ t89 |_SO=5G;tPZJooZx, @ |ߎ4 @O>g֮ @ = @U@{@ޒ%KhWN &^0Fjc ޵ӷӐup,%F#`^:UO tͥ^",@l`/4c;9sFs n{9 RoCeP}EL%PGxKT)*w;P|(Ҙ]Qy1PXK33wơ\24M O6ozӛ-3CV_xG-yh/O~>Ñ #Xzu⋍>֘7AVo6wܹ//yhgy&~~o~sef.{{o~A*& *sONý ZA`͚5k׮ơovac'ʭ~ @ @ @ @ @C@{{ @ @ @ @ @ @@ (po&t @ @ @ @ @hю΂ @ @ @ @ @-/  @ @ @ @ @ @=G;:  @ @ @ @ @oB'@ @ @ @ @ @P, @ @ @ @ @  [  @ @ @ @ @C@{{ @ @ @ @ @ @@ g?۷ow˖-7o =9Ƽ  @ @ @ @ @E@{ @ @ @ @ @ @@ (pot @ @ @ @ @hҒ΃ @ @ @ @ @-. @ @ @ @ @ @]KK: @ @ @ @ @o@zCށ;bC@N;E|1TDϊqWϘ/ "".-<HrZ|=E#@X9X{'@ ?:# k&sG@>;(3M WٸjC(Q؜ #0Y } L ={n{ШR)~W~%Yg5$@@QrZQK@YޢL7bb3 H@GKK:u3_O(V@N+ O`"3]G"'e˖?ضm[͔x^{mtvG icmo4O@>ߖi" P|V |4 hviIA@x) i; L|=kI$ ij>X&>:ujL<9^xᅣޯ|ǟɟęgY_ i19 g9fo*"gŸ+ gLvpht$9-g PV |=I$ ??|;Tя~4VZX&x?я-O3n8jVMӚ ,<c& O4S (F@>+^ _@>c{D @ i^<bb䳈!?RrKb}.8Ʋļy+.(֯__y뮻j/Z+T@NSn;#@YL7bb3 H@GKK:u3_O(V@N+ O@>;b=kJ$5Tܾytgggx1gΜAuRW^6m;w6֭T*?Ν\pAc 6VC@o*"gŸ+ gLvpht$9-g PV |vR{~הHVОz_O[x6$S֊w=Xm~G]{?34Y@Nk2|?5ME$@w{%@ i" .Ғ΃$ {S4ӊw^,6i ?4œtIL~/?Zn% 5KV\Z@>_i" P|V |4 hviIA@x) i; gY*pQ tuuze}C6T*''q~ @YrZd%@`řo*"gŸ+ gLvpht$9-g PV |,Lغuk̼sM>[l ! 5CULWg# n/ 1_@DE=]Zy |zF@rZN@~k _0E`f͊I&5s=G:\s5ۿ6߽{w_r3[@N[T<g# n/ 1_@DE=]Zy |zF@rZN@~kgk@GGG<䓱yZ1cF,]taWX{G}㥗^/_o*"gŸ+ gLvpht$9-g PV |,LE36b=#qWԩSˆ;q%ƍcM~㤓Nj,3A䴼E#@(,yH@1Y1J@D$@]#ڥ%I@N:h+ o' ,G*I`յFk߿?nƨVE~MI?pi5Mӟn̛ @@3fI@YL7bb3 H@GKK:u3_O(V@N+ O@>;b)R1ٳ{ilٲ%bٲeeÝ2eJwyqw46ݱcG\y o @@rZB 0.i" P|V |4 hviIA@x) i; gG,wMD! |عsgcٺubɒ%pƲN̟??m+^ _@>c{D @ i^<bb䳈r~"hoơC|cɍ+JQ<裍e#~y @`(rPC@+gME$@w{%@ i" .Ғ΃$ {S4ӊwφgYf66#ǭ7n;vN|ڴixXfM\~`|߈o3gΌo9-Zopf>ĦM?rU &8vL hA,Fc# n/ 1_@DE=]Zy |zF@rZN@~-;φonK)gϞH4nxgb޽]vڵkn[֊gϞX>qGooolذ(>?.9s4gbݺuos5DWWW}+ i8 Y4S (F@>+^ _@>c {D @ i^<bb[*pm&e˖G>R}( i+V8'+WΝ;㩧j;p@u];ˇ:|'6oXxG ( 1O@ gME$@w{%@ iYoׁA=Z9 PQƇ6>Q 0zl)|Eiu]>l3:O Dggg}WVǽ}`oW{_CՊܗ,YR7މozOM:58f'@` i.6o\H@1Y1J@$ {D;s @. %y噏(9m| @` JYan>D?HׇTя~4VZU_T{}'_bG?<ͤ?Bp Gmzm'>k׮M*L?of{x{@> k֬x[N&n;s& ߢL7bb3Ig_"hvhE@@]@NK3GQrhGA#.u |{ߋ[n|>gqFcY}b޼yqWE]ׯS=/Z8&MTf֭ӟ<}$cǎZQ|Zo//⩧j=Ƽ $9u@@g$ME$@w{%@ i]gu #^ h9-V䙯h+ o' g")pSH7oAgggx1gΜA(_y啱iӦعsgcJcܹq47ݻk4&RwxsVm:ms7֩tҸ\.y%@@M@Ns! .Y-4S (F@>+^ _@>c|֛u "vphVt䴺D>aj LDӿꪫĐ)Rgk_Q|cwG-׿W: S}:}%\@IDAT7سgOcYf?8L @ iE@>˿%o*"gŸ+ gLzD$Њ΁Vg> 0> g7AEOH~:nƹ_r%ơիWGȃ>o{7=8묳-O=zxwxGbڵ~ظqc>|NWWW|򓟌?rZ]+. ߂L7bb3>@GKK:u3_O(V@N+ O@>ϲI{]H_W^ziX1?ԉ/8McT(V\zjcy8餓j=O:5z8x`5b_e,[Xo[F\|K2TDϊqWϘ7k@D".-<HrZ|=E#@X9X{'@ ?,?z$u Z'nֆ'\]`K,3f}تVf͚={vcy3gzs饗fR1ooz䴺WZ]@>˿o*"gŸ+ gL}֛5 "vpht$9-g PV |e=R)]ZJ` >|8ַFwww ~ɓGL>/~q-Dggggv?p߿?JRs9׽6=p]( 1O@ gME$@w{%@ i" .Ғ΃$ {S4ӊwG҃{]H?䓱yC*tO/]t.+V={ģ>ڈzf4iR,_X]]]qYg SQ9s 2) BZP@>˿јo*"gŸ+ gLvpht$9-g PV |e= /zUwpxGꫯS6 wK.7/8餓L @ o9-oQ(J@>_i" P|V |4 hviIA@x) i; gYH|ÉFuV^fjojX6܉믿>N;ƦwOӍyh U1 (B@>_i" P|V |4 hviIA@x) i; gYHzpSHgώ{q[lXlYcp'Lw^qMwW^yeƛ&  ,f`# n/ 1_@DE=]Zy |zF@rZN@~Y~)|=EkqTΝ;gnݺXdI,\lϏm۶3<4bŊƼ - -*E g3TDϊqWϘ/ "".-<HrZ|=E#@X9X{'@ ?,?r~D"0~RzR}ɓ'7Mq(}ƲLn~f 0ơCjm9mTV$@`|=( K=b|!@`n陷iE=]Zy _yGo(S=b|"@`آT͆<A`^?ĥ^Z+L/=o|q7;3g7-|83bӦMM~HB[o56n;v쨝ibűf͚cǵӎK X@>so P{DN@~Y~)g|=E#@Xb|<=g)C=b| @` Glm//O?۷oJaaÆvqeŜ9sˇ3nݺe\s5UJ~{t馛jc޽c׮]vڸb֭/̞=N}BNKx%@(,yϽH@1Ÿ+ gzTDp(^ hg|=E#@Xb,Gi][v'Dzi>|ߎO}Spõ^W]uU^xᅸ|3 зXrزeK_}O~;}~6zzzFN;H@>k渊J G <9y**c+1F@s}=o*"Gn/ o: Ggq)p;7ݻ#H_!M-p:uj|CJL,G?۶mwg}v\plٲXpaL2W?X} r@4[@>kN@s#+:c' 53os}E'@Ӛ홷y" 06cl/4_@>kpq}6 w#6mz!>ӱ}XfMJ~ 61I1!Yfᬯ3瞋n)z{{ko^:ʁ'@@p aÆD*lO oꫯw]K/E`!??ӂ oi |\hϽ G4WtN@>kgN@s#+:c+ 53olE&@`l#^h||ApŬ?|~NE;v}ҤIqWzCOZj5ZUVEZo//⩧j'=Ƽ $}{q-40/_3h,Ơ7.گJoև뮻"/Z ( 5О{ol4G=9 0Y=6h{Ds\E%@9y+:ph|6vٓhY%Rׯ?汎Ƚ#7ݻk HsN߷jioNͥKzbN) W o޼3nƘ3gNUN!R;wl_T~̝;7.r9Aa& gM}5ph||sϼ7#WQ (F@NkgN@s#+:c' pTzg8̓N:)^~|x['b$_СCb S1jwww۷/oƞ={Κ5+>iXfI 卫:8Pꪫjj:|3}M>;񎣖iGX@@YCwHV!@` G&q@P@>!07;L0 0.#E38rr$gApEp|6 1^Uc nwHŚޏg̘g?A`4H{rOۦ^So=PiQcػwo<#vZ/7nÇ7O~q7 @@] n>\rIml,8Dի#}w-a{s=7:묾~fK@>Kr8{.S=b|"@`Fgޑن#n'@ O9-Oc{lK 㿍!CφTZ ܋PϦ |_n7)"+|eyԩSOOxNzj_e,[Z)$կ~q^ziX1?ԉ/8McT(V\)䴾 C@>C1<?& g#sVy+f}ƃ{xh@@^rZ^Ǐ6!@`| Gqt ]@>X}{zzjIY&fϞ{{GGGX|g̜9VTK/u~p77cGo)wz8kX0%KDUʑȽodrZ_ V@>{b#k 0>#g8*/ l[x /%yiy(?gx/1 04lhNEUztc$ 7`=ioٲ%> /X&'>(wfT*9{jÍe}&Ço}ktwwN>~ɓG>/~q-Dgggg䴁" |6Twv$@Xb,3d,'@` Gr| G@N;|3[ 0~#O[8F' ί[b׿ذaCc}fMtuuYgU+lOsQ4 ^ԟ|ؼysmTza_t +bϞ=裏6VK61iҤX|ycٱ&cXFP䳡(nϽ5 Ggo+ yhyb   6Twdn"@`|Gvp^@>a"fF(ԩSo|cc> ?ļyjַnJoW^ow__l3]w]Zf_җ0C䳜 sq`,&@%#Z$Cφ4U<Ϧ.Qx8rr3{D5&@8q` ^8p@w}ozӛWWf~̝ZH!_׾zq߶m[\q#ErW+W,!U 0|lfspKxpo-x|6RmwhN"@`| GvqTL@NP;% 0#s86# GkU>v4K,ӧ׊?Fx"XN@goR~{e˖e˖5 wbʔ)qywtǎ8k֬2K@>Kq<RZC=5Q pbFY3hlK@E fXy{#@#Z1ώRRE.'N__k`"tG@Q;w6aݺu… ˆ;1Zo?|]j̛ @_mhL4ϼŝ/#wyO[8YsDn}N}gΜ܈?MozSØ9sf{オݻo*m __7\{[k9*yE/csoqL}ҙR4*Jh_~:o>"?K >\.quj\sMtuug @!gϞ㦛n卽{6]vڵkn[ƢE"=S 䳁"{- gviIAg .e˖… fҗ?ZW;ﹷX{'yۡ+wbgމΒ@3<6SWlBsX(ϼ;v.-<LLϼgC3#02ך5kT*,6mz߹>ӱ}nIߘNۤi SYbpsM7V^w/vT @KA%BTEQ!X44PTPEڂ'K-R@T*p**DL  $\as>}Ξ9=^xHoCWn&n4~,hަ ȥ9o.æIw*X)F6BUyo_j߳yޓ E(Sq^Y/:KQGx`/kw;ExCMIK.-%vE-"7VD~'ŦM.yGK.'x"3όI&ev , oxC\y啱.deѣGƦ)SQ"]֯_zk=أ\\gGS6E4@.ys6&@Uw1z KR=yo3yޓ AQSq^]/%p̙q9V 0 .찫=Mr0s~9o@V7p^ؿ-+n*v@,Y ,38!=d}n_̎Ό3 .$_կ~5^}ժ:qJ)!uݺujժ㥗^ʮ9rd\}1vجҘq'ǚ5kJ'xbiU&>wv|SN9]I+ȝ9oB 50;@@wyZIm1{sO$w޼GP Ls ŏA ֡&U 0PRfym&⊘?~4z{7Vs衇OE/ǣ>iGy$֮]:th|3ɓ'gev ҸtuerH?n酝?<; +;&M&L,6Uiyo@ I7OVeӜw^ D'j!@{! sdy0k䴛0-~%?zH 0o޼,|=1mڴ&UJÇ'x"^yt̘1qeԩS7{ x:~衇׺sV[mw_vKJz;⠃4UnƳJ ȏ9o~b&`=ؼ9\A@s 6g\*`۬.0J$#zAM$aÆҊׯ/*~|GFZ-I.%o#F_xv)y}{_\x1nܸv @ q{^;-"+N {ovWS{yLN*5 @y?FZH@(%@M JK  '@=}-+)nOs4#<ЇΚ5+<츼ΝG.~r-qƍ @N8ᄪG]s5Wu`qWvfU' @@.ys&$@sN` @@9or(`ޛài2A= ֍)+ޔa(ȳ5C)RTHrK@~1rȬ=WK/46mڔuw'9}Eرc[_җc; /s|Kk 0pD v좔'VZJ0O}&@漽l&\M: /}7z{c֬Y;۶vۘ6mZ̟??֬Y]hѢXtiL>=ZZZr;h@JFOcӝwޙ=jɒ%1tИ:ujVݝaÆ{7|svkՕ I; M#@`3漛rJ~Ȼyo#޾q#`fU{DB; @P/ic=6 S$*:C)e˖eily睳7.zo~ݚ8G7?R 7QByۛ(!@ _ @{Ks 9o= "@ ݔ^z ڪG~ 76l(5iӦMqA;c9iҤ~si!@| +^ZKE> @y+ZC` 7N=y;vȥrJ@{SCc^ ZG$Qbc1mڴҹD7vFw}w\2>nt)49oCS@APA%,`xPCPpM{{ / W@ lܸ4/ƢEg$O<>uuڵ;'?/%ޗ+};C-I0-xu@  @@y{&:0E4yoӄBCZ7kh5v @0aB̝;7F]u-_|q] 4(J?q|sqƉ'XsŊ1{/YU^u.}嗫 @@yc=$hsF z+`[A { @@ 6{@ 6Ks  @@S$>T]כ$??Ҋʕ+oob…5W&>}-6lP:u '2 0@yHu@yZ9o]9UF`@ Ȱ4r'`ޛi00mp4Mc4 ^7Ǐ/=*\qnJHcƍְVZK㎫:%_ve}.V^]u/<^}ӳ}; 00yf@=y롨 s޾P 0-nlE0-ZD@ udu0~gfK,9sĊ+3cƌ bР}ʕ+իW'N{ @@9o] @ 6:F 's^ r @)p]wU5|U&LsKr[J6}ȑqGT= @z SS] @*`۬. @z Kxniy @ s=Yv\)'=\T/ظqcU @$`L @F 6JV @"`,hvHpoh @^ rHlq$J  @y0S @=s @@^yoZ' @ (}7z{c֬Y;۶vۘ6mZ̟??֬Y]hѢXtiL>=ZZZr; @A  @0m  @[#мϗ޼2 @=H ;vl{1hP_$ɽn$@Gs~h @>03j"@'s~oJpoi @ ޛMn/-ɽ,' @@y-m%@詀yoOG s޼D)= @@S Hroh @@y뀨  @0mi  @@/y{ % HH @%= @yKs  @R/= @?yC)= @@.%0aH @^ϭ @0M4 @=ms$M$@ G }-y @!`I З}wϒw֞D @ WKG--- @0԰O PTޢFV @eT  @0aB̝;7F]U%W8 @ȫ9o^# @0펖k  @(`ΛǨuf 8C @@@ۿΜ9396 @ #`[P @@]8E PsBԉM[q' @4J`ɒ%`83 @Ws~p @>0#h!@7s~ۃ%׍RE @ @ @ @ @ Aٽ @ @ @ @ @ @^% @ @ @ @ @蕀^ @ @ @ @ @% ^!@ @ @ @ @ @^ Hp  @ @ @ @ @ @^% @ @ @ @ @蕀^ @ @ @ @ @% ^!@ @ @ @ @ @^ Hp  @ @ @ @ @ @^% @ @ @ @ @蕀^ @ @ @ @ @% ^!@ @ @ @ @ @^ Hp  @ @ @ @ @ @^% @ @ @ @ @蕀^ @ @ @ @ @% ^!@ @ @ @ @ @^ Hp  @ @ @ @ @ @^% @ @ @ @ @蕀^ @ @ @ @ @% ^!@ @ @ @ @ @^ Hp  @ @ @ @ @ @^% @ @ @ @ @蕀^ @ @ @ @ @% ^!@ @ @ @ @ @^ Hp  @ @ @ @ @ @^% @ @ @ @ @蕀^ @ @ @ @ @% ^!@ @ @ @ @ @^ Hp  @ @ @ @ @ @^% @ @ @ @ @蕀^ @ @ @ @ @% ^!@ @ @ @ @ @^ Hp  @ @ @ @ @ @^% @ @ @ @ @蕀^ @ @ @ @ @% ^!@ @ @ @ @ @^ n&@ @ @4H`Æ lٲX~};6 ֠' @ @E@{DB; @ @ @@.\?^<8>OgǛ6m;3͛7xc,]4R{y3fL̘1#N=8S"o#@ @ @b M @ @ @(pg5m-W_}txx{wqGv}7qe @ @ @@嬽K @ @LoS֜ܞ# ; @ @v @ @<~z\ظqcuYcu^7 @ @ @@s Hpoθh @ @( -oyKZ*_⦛n%K;dוwR_~yO @ @ȹ@˦-}| @ @ @ ^{m}tذaq>>|x,[,N=Ը{Ώ1"~H?m @ @ o+;~ZO @ @r/0hРSTƍ믿>v۪>K1o޼2 @ @ O V @ @ @|N:;6=v @ @ @@$/fZL @ @ %0gΜn稣jw3<ӮL @ @O@{b @ @ @0k>ɓ]zve  @ @ @ 3-&@ @ @8ݗ#Ggڵ @ @ @@$/fZL @ @ #0a„neĈYn]2 @ @ ? e}AH@IDAT @ @ @t:7xvlڴ] @ @ȟL  @ @ @@afEG @ @ @{o @ @ @---=m @ @ PD E> @ @ @ @ @ @ s4M&@ @ @ @ @ @@$1D @ @ @ @ @ Hpa4 @ @ @ @ @E^Ĩ @ @ @ @ @r( =Ad @ @ @ @ @Q@{O @ @ @ @ @ȡM  @ @ @ @ @ PD E> @ @ @ @ @ @ s4M&@ @ @ @ @ @@$1D @ @ @ @ @ Hpa4 @ @ @ @ @E^Ĩ @ @ @ @ @r( =Ad @ @ @ @ @QeSVĎ @ @ @ @ @K  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @ Z#@ @ @ @ @ @@$+^ZK @ @ @ @ @ Hp/lhu @ @ @ @ @xi- @ @ @ @ @ + 1 @ @ @ @ @K@{⥵ @ @ @ @ @(†V @ @ @ @ @ /  @ @ @ @ @ @C 3#@ @(?O=TѣG;K10} @EHs?ҟjժJ;cxS~ @ @PeS6 @ @97o^| _Gyq1} #8"֬Yun#Gf坕+W1S>aÆł c;z"0cƌX|yvG]vYksf΍7;SU#PxUDR?L`ySZn]tAǖ[n>h^UMo[o5ZZZ"󓡍 @Vpqk @ @@ \x}v@8FZ񲼭_[sÆ p¬l@zgn0aBVΥk׮xWE(J$@ژ9tٳ%/~qƍ<29 @ 0 - @ @@KnO@oy6 @i~OOZ1sҹ_WO @ @{c @ @ |_nSN9%;a瞋ÇF @#P^-.'b봁gn.8z' @ @b Hp/f\ @ kGK_RU? L2%֬Yq <8۷Cf0^5S4F (|%.7n\|ܾ~x{o kw $ @(P @ @˗/ƹ[u5rk%[lQ䳶҅UUmjQ_o#N`yZ Ҝ /N?c :4;l΋/o3eʔhii*s@>{s+'5m^{;Ź{#)!/5k֔Va/SOi|;|ɸxG @ @@‚X @ @Y SOŊD'%ov{ϫK,w1lذu]cwն~}/mZ_ň#Ź&X??uܚ_wśN-xw )M >n^zTfj)>~f٪֗D=ݶi[hQEѣG#ȺӶUwF2}Kcȑ57џvmǏUqɯmMdxN:'bKv}YjT565ޞ8ez;ߵ^=\V|gq1nܸXlY^ k @ @@AT  @ @ $/S$ӧWI'\pAUY %};߉1XdD}{i%s1N[_Ɨ3_nMjRrYKRd5\SJ<˿RZyivM7u+|߳>Q>,7QZup3]tQ?ͮ o~svM~Xׂں'-aw^l&Ug_^o=:ꨚw @ opV '@ @ȡ@J׾Vs>ַJmwQSL믿Rі[nٺXW.?;-rn+oҊ %R"o:.[Z>Pv{ʷj~x}٭~| _Ȏ7JetHIME^wcݍ7;C=,՜۬7;ҋi`|,?.%ZWoVj?S⡇j{qJN/߱O>9;կ~5fϞi8Qm{*gGɊ8蠃ʝRP8Rg-(%_r%F]xUns#cQ9oۥ̙o()21ޟeZdžyw>裥 _yZoG1cƌ,So{"5~-IiuV-=rKyvzIܞI,9yE=NnO}\=?f>o%Pd^/%sOW/jSbGQSr{WUo Ú'jjT.JNqg4O/t*]m=+Kcn-i% #TG[_'>Уڵync^jP|QōUoݪcU13*7UWyĘ1co @ @{nC @ @w}ӶaÆRaw---qזK?'NӦMҪ2pر1k֬Ҋie鴪yZ'W\iuF|,+W4iR,^8).%{Xzu)A7%O;iutMڎ>RR/r'?)$Y/&׺:h-v)JV,wNxTnHeE\kk_-cV|15gSO"% O*{,;[/ƉZ>g^-+wSƋ/UpaEZu oxC3>lzllvoɖi^7!U~sKO @ @X܋O!@ @^ %V& 4U9䐸KL ,#Gfemw,YRJH|DzS)1g*R5\z׻Eϧ~:]WGz"}AziV-p%G;czpgc^}?K}1~4jljTiuK6:V}5o'֖c=PjCOgݚ/~ٱ @ @C-"@ @(=PUr!C?af„ c9&]Jmݲvj%{vyG?WIm$O:5:쾎vwKpkbΜ9]oիKei_|1nFwq}?V&NI]moVurͪ}xi}wƻ:lPWO;I鳕VgܖY-0_ГmaS /^L<k['~{@JkpF]k_3Vŧ .`MG>]tQ[tƍ#Kϴ^4յukDbKR}565bը1 K߮ڴVXG.  @ @ HpQ4 @ @@Z%KɅ)#hQ'%---{/~WJ5lo{ۺ\59U;DZ<%[;V>O+UۓO>p@a? TJg>=c޼yU?>`vSLɎJ }B~g퓟d6q>t4񠼥ܯ~c7\ӟӇ9џ:sK/iRb>SJ,L/""c^jG~jq5UowX5j/YEv517Uҷ.~5 @ @ 9&@ @( LӄCVIk٦MVe1nܸo]kڮ\$_&~6+CG?[WB~;Woﰡ N'Dś۹뮻a~{8ezx2=˿K)Doh;u1vgjS_FUեZQu'Wc^RۨQvFy˗/"H/mve]TWg~ @ @' bE @ @ HIiLJz(~m˖-zZ9X[6dHs=kWI5=R:ꨘ?~骔?f͚ 6ķG}t%O<1&M]SN#ݽޱm?#Fjne|x@>8&LiRmuUk,+m-fֺ7&N7v;wt;\]ZyMy6_cKk?,Z@К+I3!@ @#d* @ @@<@\|qM7|vN߿ХK5vaSWXQ矏`⫯:ӵI&eңG^nԐ#`ygoFhDt4(D~/˱fŔ)S_\m>l\z饅!CӧO7K4o ϶ߧjo\IԩP` U>֫MeoLi*]k^w)֦]SjUk^4ӭΦt} @ @'v-_="@ @ Bߏ?<>Oܹs nO;VдN;ٮk#X@j` 6(v/~Q>/_+ <88RzN<$o5VSWÏ\޽{gFlٲL?+ ]D%_:'N,k-| ZOHoZ1cF>ηy]xm*s=ƀqN md [vZk^w}Zj#{2WizEi~O @ @@}>( @ @ -pI' 7 Oα#Gw޹3zJuMV:v8'?Iks9OZ?Tq==Ҵk)oMM݆NknL /WuNC:* /e8Oz8cn-.\Xcܸqq]wG?̹R03o޼B˗gfǎF^\~"LFtavGصi_=8ݺX! 魷ފ7xsu;7ZD=eR|м+=NuVabԩ]{6lXzF&϶5Wm ϩ,Уkט9z^:d!qŘ7jzwZk^wּ4֦M}Nsw]ܨ<8=sLy+S @u @ @@ |0pgv&`XlYl8sF V*b{Nmm=L;'ztjM; ] +z_gc#땡ѣGcA+v}Ѹ۬_uW+-{6ǒ㎸KSN9sYxrȑqUW+VīZ*˳M9\s8rqOťcv[wM{Mo7<챣cp9`7Y5/Zߥ׼4֦M}H\uO[|;(Ggw= @ P{djzD @ @`iq1@=ܳmolQyv X0tw}n+E-RٳguQ|#tqDi<̛.8c h'{[NBܷ~{. Pʯ[T09JUR߽1cƔ+?WY͹j/#з ݢjռ׼$PRk^K^^^>w$Uk:ҧ|3M˙|G3W^y%sY=2'e @ @Ku1 @ @h$6,3dɒL2>l̘1i-HΝ;7~ߖ>D\N: Ў.i֯ںEfİa2ݩd^z)R`{Co'hz(S/o馥<.ݤjU;q@.yy.楱6nsGR5#L]v%sS:`4[s*Uj:HvZ>vFmd=Wmt) 楎W皗ƒڔWI՜3u}ܙZ @ @^sl @ @ٳgޙ]r%1mڴVE_|®#.]ZqC;<ȒAsAŁX:|=?F"IDAT3s7o}!. 1"=B{K.3^'&Oe=;/-ZTwzS?guVn}Bbȟ}ٙ~B0k /hދn)>OFӃA)϶ZsZ@k^5Kyyi'@ @|W]Fڥxu^ѣGǛoҿ>lM]S'x"رcCӧMs))w-fcѯ_R~um],Xt+ Vsn}W:;He)yPk >0`@yx72}\₲/뮻FaW۶DiOӑ~*Mgyfa_ץKR'Xʧjśs1q5ϴu.D<ムޖp)׿ƸqJA ?䓋gzd-^{-,YYR@@uLmW^Ust]OVin"[\% >TƓڔWϕy^檚kW^ye^!q7+L'6`¿oK @o; @ @zꪫb 7̌5뮻.~Rg ?{N:)t XLRV 9rlaSnҤI-XPʝwgqFt֭&R 7|^z_^oё{{yp{ ;wnfg֮-M2%9@sJaŋּM6٤^.=˳b?\)皗]Rk^O^kS^>W9W:LsO&_i&[V nO~!R= @ @- }?'@ @h8qb<31y6cSQQ򩧞3gFr.WZկJy8i:3fLaL NY\pA?FQx.+i  @ @:Z3< @ @ւSO=U nOz!}-j"R;tPqhѢU|Lp{ڵ#H׫Hj X-~J`/}Kϙ3~+T#9eʔR @ P @ @@g82yk*۟~[c̙q5TԬY2ucҥKL$`ͫЗ>֭[6˗/n[X"RݩSF~Jy @ @@ p96B @ @HF_~y1cĄ Jy:#0jԨ]vY˙2W_}u\qS&Me PkּZS`qQGnK?RSO]]U @ @@ ti_:a @ @ ;wn<ƢE믿>>R9sđGY; 7|3FK,)5~O^޽{<,X ҹ>8͛W; @@- XjqV)Odz#/L{SꫯN~  @ @:^lx @ @:"o}+MKg]tYm'tT =H{;3_~6СC#.^8^znfm^(`ͫYѧ<~ʼn'XŰa'={zی3 ƏwuWtb)$@ @u, ' @ @tT yGzِ!C{-ZA!N?ɓ'oݡV{آTEWf7n)nBO=Hʕ+cʔ){ŠAb̙,$@ @ ( 'ݐ  @ @ @ @ @ P]kSD @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ PkrZt @ @ @ @ @' ܈  @ @ @ @ @ P֮oIENDB`glmnet/vignettes/assets/coxnet.RDS0000644000176200001440000117540313552126664016751 0ustar liggesusers\wuB&" DJNDP"  {d $M;{>;[Ny>~ͽ$|>rN2e)۔??]p/Lzp7L=`nԦ߭i,n检~'na͕~/Wcw>׏:ex<$+Kœk7h[w ~Au7k}?vK㥷z5k|#щ>/{W̫QA3e~*wmczѓ2~U{}Z{/Ԗ]u3Hz/fH@ғ0%)oTk׋- Yu*kĚ7e|WWO/>̲!yb,ҊEߑ܏KnMidsG|@FTqOҽO9!>w{#cum!tLi֓Ps߿p~wZ&=sʭ~.ߋ-ZI _>̽d|!htdܱ<:"Os_:C2VyO<~܅jtn=l~;.L+y=.~Y0P'?n%w}!u+K{=a/;ddf ]s) z#%za}c]CgDE *]7^Ջh|,=J<q9=I;:~zt\wӋ|W=?V"ν;oͿ4-ߑĵoyfY0{SҒ{K_KsO׭wM{>du Hz8;zk8IO~AӻrE>8C>\3?^9e,ݼ Y_-'vRGw?xJI?Ο$}嶖C_9}Ͼk$}m?y5u2M܋$sQXF_lsKF&2gK#?Aޛ+CSgW5V=RS~CGz]xϛ|[kEyӋ% ?]Ր{H}Oo˽_~W{2y+OIxn{ P6xKcva~i4wrܔ9nꂭ?-vnW3IOt2{8ˤs≑o<2vf>1r='ozQ퍯|i\];cr&9|ÿо Y=Ed~Grހ}zMOsqFL~ajgQ<:e߯x^Oovܕd[~Y=b˽^x)|us%ԗkf-I>Ss'^'mc%4wS\U87vu4w}1!o t0OzF?%)_<[?Ԏ?[{&?ϵ/%;F_-ܱZY5/prRIuùܒO?*?_ܯljqx kI~yTe..=niڃzCNm uiGLp/PnUlX_OUK>~m3y ݺ|3ݖ[%׋78ٴ}]uq4o䯙,w)nJn[n Vgȸ[o:>ŲWlsD&w釧܋h<1ȑ/CKe}/&pU!:/*w <7o=䤗9I;e­?T_xOr ;P)!C2ܺ1.orSN~% /]p:cq4N{܃nIyq wjlr;O^52^DeA#c rNgFD8ƽ_wi=uTߣuDrL:QFYO ni_p8?JksRh&/ɿ@7۝ϚN*ʡ/h=#k7gYpEJ;ԑ1viq_ss!kU%=v\ۇk5dm֭/XOٯeԗw ߣOo ~Gխ/I%?|#Gxr*:}yj>Gܹ'|]Re\=k|#ycsJ{?tA;N{ls ~R?rt^寫uƩ{ʈu KؔWOrl FΗk]}c~VX=Y<|K>Rg%1yi`֮iZùhyV{^<;pƵL8J6[WNG^wj+KZ}Kݗ)] iwhj똬h'(s[nt}rԲ|rGVul安'd}Ǝ+^{X}ۤ`jZAjrꄼGܲ=--ə{Oϝ7Vô,׾-{zv^M<+7j޹q.Σr/{ι͗S>Wgi$/篑Zι[.nhOlyfV}77QTuRwpEi wjj}BMc%,)((=*^wNJ=8EVVN-ΗU~K\k/3d(AcΏܧZoOԹͺ@};ݥ3ׇj|ãͮZu%WJ3]<x s?2/#o.rnd+lΝ{ '}Bm/ծaW'Is9h/qNm;}_6)#k[3/N4o{68Q;\_|֑|[-cLPgai6iϼZک3{ZwHC1w|u~ C-s"ԓnw}tL͟i7] tn4ȳ4E\vxtvq2BQ)眦n]\ahӦ^+s?J}.I𞬏=4]+ԛrn,m7z,SI w_zT~@^:Mz]K_5_7V$si eq@O_亢Γk қ~+[XoAؓg1p!9ߺ=:ɷa7H a%;nr 1^V7o?H3sl {/X[g/˦޲QN/ &4DOhǍW%ncΡwJ/=:|## o}+ؑ׿p 9dy[;}b0ߎ\ovUCv=jdWY'_cnj5m+v`n*<,|fWғQl*}^sn^̍C76DnRoܳ{ww5E]Tƹf}Z6p; c w8g[y`E[BqNuoǝ7:$2Wj}ep1ןW}6[۔:cmetrM97׀m^"-s{aη \9'KiS^o}/8\Sonz#7ZӵKeSYjo \_\ܯpjf: N\`3so$ʿgsq֋{x;uiySc+(4楪W;K\Wgݫeqx]$Yx+Q|ECkz-De^쯵9d(W}R֩rVIsΛ,y:{:p"RG]Qv=5}ӳON\t;2> cGSqGӭgT_si[9~+sYYwrLu)_p7[5Bߕ0.ù%C OlɗA'i6|!l \ᚢ^dv_~Chcb }M6Kg|w},#_2#hw˭u;MuuvFٻsi2 Gxe lgn\{IbmQ/rs+v^A u27 Ob3dW7̗k8'ot9>I_[Ysvs͡gM~_H In8}r /XQhåesGySN2I թH_~\XԻ6ol#RY?}p5x솓% Ng<9m%_E~/4N>\΅ϙj;%}Bezi}e뛥z+uw<;@{b$sgwJ@|ʹ0\oL|>G<͝ MYGR>鞗|tW}{S7sItso rG:3i~\ NpJQ</NnFg n?ay/ǛQIe~%+^8ub>s&r.7p.r%LR̭ԑ7ŹB4ʜMc咏  ~9&%sKb#;s_ ,<}JY?]{ee4W^W(2_?b;W?p+OQu3(;o8,}j|]/P/Qb/\E5X}yݎU3 eO-׺<}@7ݲw'~Y}\c}䉚gt{cl/|[hc~KH #{$n1ĺ'72j6R6~U;:Ks󩊤VMٵIW~$LjUm:^=j調vXWgvUogwke*!Kv1\;ɜͳsm\jNCG=????6!ɻj*?6NAiq֚\ut3_:2|㫛ZNٵHB9LmRrdb?F3m>ۤKQm e+Ot)[{ۢ?i|OXǧnkR.rZNP|tQHss6œo麎syPWmSsC yԱ/HMu3[@"ԉrG;^жkήz~ :z'0I2'|-V\75OlIkBš5p<@tLʣu :|-}ݦŹ]xHq#8'̯?鯓GuxړyD{sxD]ϵo>++wMٸϽ _%;|O׿nsu\D|6Oz7u+%Z}aF< B1w/UzGj#6zVsst,uJ/S ߓ6/zpyg>ӝRPɎ||*G 'm목'Z[ԗ6/ް:1F1y}KG{AOSW' ׸:H4~O1e brt󒗯MwsiwJH]Mzx'4y C$0+x%p_y.U3 :\oO%*Os>U\@~d+_9H]-k59'?hT v| 7I,g_}&&E媵W25 w+3nBp潬E塯,C}ov'n΍.rN֝Z7  j_w3o*xz31ǧPӃH>w[l;Ea^6<%['O?Ck$ ݟax~o gS^`~?^ܭ+y ]&Jbsef}Aܿ-5v_RK=v׶4s&wf9;NdU!p{sI}* mʭ}7H;ch YK=K//-FzOkd=spG<궲!>Yݥ:|rsdsIͭtyt2W>]T87cx$|nxչnFn4o22Ǎyށ!iA''CVy{;C4*ݜG4cZC}!s~[~k ~d;#u#p:\8a٠duЫuT<\y }ٶŏ?|4ls;G+:3󌮦{BysCU&l=FA:e;| &RW_y}7isYϿデp+u=uf4\&nh"Njf-|c/cnB'0n]M-C_+x8b g28Ecs}t<}^Q[7^:Jk]Sn--U9];Y}N5R6 >Fck7~d1xux'꣎c)A7 oST;ޛ='cyd^j67rG&j?؅=Z;xKRFN U {}%CP^>%)qo\{cAqx\sp1OKI7|!9pi:?luUӯe[ 3J;JsmdHOx۝}e }x?ZI~W3sg'~T3Hи$Ysc5C1xOpw{^#%mw> й{X5}{^لěNO*|i{2?g96mǏ{/sz7Ә;W ^\J[pOoI/ׯ>xNsҞK{51zX;~Ru+/Z5}4v×~jj=mjɈ֟Ow.2Q-I+z4U i}M9BD+?sci GON3̋tIZbn}Q WۣJɧ{zm)nz-Go /˲}ɯ&weOPt>ia][s8i:F93V7~ p\ݎ>|ޣkzP^k]ϿaA7 ƐE_IcN;|c_Pχw,u|>I:1;Ox;jT=74?h/x-շmJƏ?iʆ7 i5E=3`酷&>xn]KŜ; x,6neW%P73܉*x67ev*\1׎sc6f>aΒxun|VG]fmnX?v:ԁ^;xD!2^IjγEc'鄇b8\,-ȿו񐻘_w~xD1EG]-'-}i .Ƈs)7kFm*s:{D̀6_W^9K7EHHZ:yǧ|cTK] 5׭ 7][t!39M7ۦ_yw|OAw\۶˥;?(hߨsgpPГY9~<7S[>9cLэfnGwOxݽ!xBzE4]ϡ?a1=s0<#/> qV-.7= KeۚܦA>9[;L=OJr^t7axGmb=zܲi_/oS.:P}[WO=}qCu2}_ˣn=B_F'ߎS.3?t|cgd?^|ycSӗn-vG'1]FgysN/#/ l#i͚D2F]~rԁj}@37L/ߗ=]2>щ |okt C >`7fn_IWN_{fӮ#CnR'>̽tϴH8>8 9F}䄫d{u?!% Khg ů SW [~]|3AБx#vpTt #|.lw,L>1m7t= qyC7~p̠?p:kߕf+4x^zf鷻9/ 4oي%pik>/w0'iw?$?^JͯAIcy?.'i(RRd}8eyGŸrΙ]9KRWx~YΣ0xQ>:q[H7u;9WkP7ljy'2@O~ ysi5z z2|p׏3s .OyMsBͣoSo2_f8Dd{,ÓW0ɀg <> >t I:z-eã8V6؜@`%NnQmoDZKmz>xR.qBb1X{mެrP?:]xo7}DV/zY Ry~WX~n ?5ݙ}sMoͣ: M9py1Z1tx>iǹ_'lzY̷'[WK |0зK J uI\+LW ^7# >LJ>bk,>ut|m{Vbb3EЇlb?;_9m<6]׈Hs6ZGN |y7^E:FKջ똿Rᇪ/ܷ{v?.w]蒅%MW|*|2I#2%>pGCM?uZWK_Kq2\}s4X^9IOn a׵1$|>#79F\^Y pqȧ{$5O-#."tVgu#^۾~m?O?C߅Op$(s0]~!7g>1O9W!\}.}^?GH*nn%>mԵh7=%G- RNMqW<4/F}ЋOh?a,"xM~ ׂ8dgG9x/zT]I%0?sϛ Y%73f:<)]<"trmw 83݂ܿm%fqL0a-9#u1QKguVQ79]TˆDVLc9 P'['s z>:#:C/)e}/t}i4o goU.b]}s|"+=o-Ru1 1o,W>Sַk)f/>5u&6>棽pf,h9$ ~TOu>F' sMΡWEoV9Z$Mzn[%9WxRd.*Y>[߮ |g3h/EzY10)j&[;U!emzzt'૥5s̏%ym5fw @/?S$gRG)b!,^7Ĺa=A|C|/?~@KݟrF7#=xB+ΘsE] ?Aoz S._GuEApJt6Z NҊ0xS9|9' ]dsZ5Ù~O; xvg\Y rs}7};ճ3/'#|4yO0~]ixk {²zoͧ l r/${yN2mOt1x^ xM9$34ݝk7;?椖?a C}a:R QyBtQW5u')M4ަjaqdk@ rOs]XW{E/xe1p*rlſ9S1?~dl󼦓3ᵬxkXtaAcՎ_˳j=D/~$ap!,s~(]uc;W?$˷ϼz?v6u>#|G4Dӏ_:Dxw˶>;-O E:_S/$:jER۴d^W%v.w=v{? wwM1h䃢fWRk;wlœmCb)bD"?xI;5.!'uyVԩ #>o\&ХO?adOۤ5p}ҲB>w컟?QoVl{ |o<˕9' al>R^U t9V8?SxY` )]>Gl<oͯƘk"V\/sar*Ǜ"gۗS ,k##ȁ*1''ikO|VPoengzuvsxdPKڧ xPsm{N]} u\>C&x=ԝA>w6 "ϴ,/?;DW߹سYNO|A>s^5q|eSWv{|N]bf`ް~%p~Cs]QUøMW\  O|eL$l t,~}Ml>3&eL߉>]VF?w\P~o.z芜t;\!-W|K꘧UNWx#æ >܆?f㏗.~|@W)Gxym?ޢAa6/F99.G33N}>xU޼쫧 KO :A ~=;}J"oq6qXg}d駗[lyj59=uab9]v7\Y1P;zi%_PyCL6vG+~ ix[}2t}ゟw_vv|t̏Õ0 DzB5t_CtA) Ŋ >@ W33=/E3~ugXwgn\Y/i|,Sm#ekG; o*cbyG 'vާLv@GRG| VO}֣Yzg[N|01=~;̟GQ>w:v]3'v̆s]r|GcyяZ^F;y1A*7_ӈ,L,w4oUB9CS˗~sk>Jn7 ga`qi!o+b2]Eiig96}l2(xg"^Nr}\>1nʝ"rq\>xƖy3O7[(:Jx~˹oї&?^k7rCoRt+w 6(>#ql7rF9zK/^򗫊vI 4i~~xrfd1z2Q>EZ]|| "^cNog0w%JYoVg~mp:Ͳ)W9^~eq~=gzu\qlj7'[>-C?fMWoK_vzr 1}Fxlk1:3ɼ(pI#h`n~WZs6sC^?\I|9'\rez69?|컏4 {|RץW=37.JY5ko1Hk%lx 'h={sW@WMs|}u3>~9-O"c=̦J1&xe5y 7ZtȹZx9B.B= 'k*eY}_%{}/-vr.>o _xL紃sUK1 ?\!)LO%~M1_23&OݜQ[ ޿)gSZzZ/yaNh*[664vdSw9df[>o-疇\%IދckA3-MxQ{?;^6*%ӇX>ZOz Ⱥ@PQ7ϔ3`xy 綰 # NM | Ϸ &E6}Q 0i/ &x(C}GXx/^.AkD3,4|_uA9יK*JeSM ޒ`~$]2aq| a~p4t5ڏ/Ep5O~~FG+hAO,'2K_y(V<9.f^̾.o;C7?a"}7‡0`m4_BZr\:;H o|sGCЁp%w{S'W$7-+wh)}e3~ $WC0.o>DpI14{ܥ[J:y(Re8&ȩ#at3(|.Ƿ0k8 ' ;/ *'xr'ntMߎv>z-fݘ.57́dq9w$AlG2u:e59c+z;e>|'tZo 9C "V]T͵zz]wZyw* d;mR@?r4'k#O׍063n]8{ ZTtwoWU}u7\_M|/0_1@~B >5B}7g# UﴺC-.`ntQ׷1g^4=s윟o+)˕skɿ_r+|2GKm꡷6~-ׯSߩ_ly_̛egmCq<"ίWE7&q'P;ˬ&ǣc>x%NkחymjڇvEZ38{o:ͯJ .-+Wo$sUibt+ 5':a~9oۻ1ЏV3O鳿9az]Y.Mf_F_a~k 2lpՐۇ DDzg:y5|dz?(Q/sY /у\^J|#LsoUm_O< ~P_J#8_{au/~ z˿ Vxy|/f^{MwA|+jϡ:=.\sDߩU/czXù5@򓛓_zuD3|/x\5;gubqxX,_Gᓬ䱔F/ͷ=r9ǜy,ryҏY.O@G)<1C\$],<~Iw$ ҇gb~¼|T8,sg:w>7e˫]Л3tAr0,/>e_PO_|:k,X}xGd^qчבu-U2e?tf ' [evU-7}3, ~E'n/An_Z]n}J Q(~ٝ̋k£Nn4FxNu9 WNOu83_sx]w Ng4{ ý9 3Bk/|Ξ#>e/n?s/D'`-禙9r3'l ݅DC~H际sя>:?|^SߩsLc->Nۋ7z|rV︚9SNnd^UޏD9o켌̘J|uTA9^@'';xkYn^.^ޥ~< }B]9L!x1|?nuk;^Ƈ71Їg8GMxϿQ36oAA:3s<RON@9r'| >a~q<- /뷕f00qCS:n_ <]R<9g_/Qx[Y+ \V,<_mfmB)= 6f.bφfk0~<멿;8O90<>E7_CEO̡8)5Gk<u0u |Ks>O{#I~4#}e.ͬ(JB֥jf·PL +k~l |<Ӆ?/U3:r|=:Q43A|Eƒr:B%J9 <Ĝ)$ ?f{ah|1x۫?9\ۏ{rYgE~̷exuqyn}9K=d=f}`~sNGIzxϖ9,7 |RN*K;vr?80҈M%~شƣ`^W:?BQDd=Z\d y#A?W:y+z oߙϋQs2wߦ'(c{rpbҟi^~>ONpZ˧'&>pPkq/5~}".qw_E1I(al)\14VћgsRCsO֓yf{&s߃n]GM!oT̯TɺY.m}N<.|8'k0^:= 56j1v{6˦ߓ,as?Sft3?vꏐ#3ᅾ?ҺY ۩|,YB._|rת-dM5ޡNIF?Yt+eӏpu ?|G5y Ee~+Y^]jzc| ox |eT%-|>VI8pzG?vgH=+O,3K_yY3[N>ssޅ5V,#Ԍ8b/{i6~~E>w_xɟoz4o$zRǻyW[s|s8&gqK-b9 oװ7^,#_'%Ow.<:}˅#s3 075塠s'9oԱU:lw|>e4}k:k:92xoj|w ЫtV4|E5=П/-G=OjsoWp S2? <h0u 9rú֘Z!)7}<ϙUOZ{F=Lm~e&\/L0O+p|I'-Zx-.eע۩<'B,{ 7~: oS]P5{?F}5 ^zg\`KR~|@ts ]yܵ+a㻝WޕOsO 'w1M+Cw܃/.~YZ1Qp;|YǼxXu99e=.CR! ‡履M傰r@ʼsk3MnIs>>*qUe.46wZzG+9:HIƻ9:I.%Tn2E=+q;&y|66˟rgdy|"Yiw345旤Ap$T\'d#Nq>_) Ȝ8HNY1<ӯ5S?| _7/S/]."9G߱v >̜*  _75v@wx /0߀㕫њ%lyF߱,pb70`4ҏmxh9~ԑ]<Z]+w۟?$| ~TQ?$0>֖;? fyǍ-6[kMJ,ws-C[NLOHxz|hV|:G5RtSw~V˺B >eROdA>ՏOV'Ggq2OZ 2t%ia|}> w{Bg,WSN?v|B_qO: IM n/y8Y+<ȹ10G2rصCѳܛA$|rkC ";Ǚ#t2-v>H[߂bs!s>Sxik x,r sﺠCOy8zXɳ\u̧lߙ.wчd/gUmOgy~?;qǴ\򽋘WSݺ8ӰQ-f~z7߂3 shIYKj?{_&y_,GjzFkod~q**H_e| =O[ks{]N̟;JƩmݙOI6/M!IR&$?OC_?&3j7 _cα3vxz~C}Xn<%MNϕ#7NNZȏjS:˘73!>J_xRCъwjXzk6S19bvxz4|:።Q_=8\-w+z x X>RC;I'n#̗7?Mo-6m2^?_Mou<=/R#!^|TA-Ϟn':0K'Ke̿~ r9 |qH;*9e_~'r$ o`/iHO?`~ 6}>S[۝GǗG^ Ot/i 1ɼg3~XƟ0^dN0_ P/Is^,1Ig[  N6R&Ax2?ճChBӗv'oU >I+3=v;:iV8])1.Ixys_umO._'oAm^ .#o_z=65ZnpK'|^e WP}4{ MEs{{ɡ2~tIΝ/`eMzU֯K#:4kgzNzC_n#t1|Q.}_,N?Hߞ`l>G/`ٞ.* x%oatpo3go`b~Yr,/q#:7y?:D}ԣ^`^JR/w=HAU>}~ ._,VZޞp{ kX)ts'o !A}߁olqxQ|^ >'@9=N .$~}^pUE$??FOW}6S!g}?KUg]\Jh%ԡK1r8KHzx!@LOJC}#~Zg"Gk Nցn xZIg $ ㋶_XoZWSh7lx[u򸵉}e*rGMaE/uܗ<:qD\SB"TG|]3Font)A+Yo1Yk xAKtjcwu=7| >Z=<-/xG3^Uiη;#-7Zon-n|RM}˥ 7{3|nW^Qu~Z¼ýBߑ`8[ӖD79en ь<5tG~L^iKM-0~|/PF_|huQesNDQ﭂{>.NA68%Ӥ[{4:>I8?z[韲-Qv3y=?qu9X[Ӧk蓮Yf1~3ܫq'ZdFux@+NK$YOJ(8f܋:NSכ=צּK u.G>a%t }ZvfyJ e r/j.珩Z^y+~ྲྀ{@c ϱ0,h0"gP|̋ד5{7m\|$YQG|<)imI׵['I}ڃ~ ?@_67>N/2tY-K/[iI}f>uVm b~yJ~G}[Y5s88V : kp^9dԫY >n;o'xW&ȹ7Qrh3gsցYn{|^.o O<3x)oQonru6/zIzJ_Ooͥ?K.F8o,_7o52ς'?t0oߔ?fh3i@\O,䞴. #%oXZ3 OP?qN?R7ټ|WoK ; KЇgkq{#p?OA}f-|ayY# Ituq~~?$MܛookH#%~څ{o!Ɯ&V3_+sݛ;x>Zoz? sSL1|L$0#o4*Ƿ'X43.c_ Q~7_"&Hdn۔ܵ X7JԐUC+YX7<6pY4~ ?s'ǼZ}?z~4NDk vc@mď}/8<}g>SJvX=g8'+QY? _Lܟ1ڜ--B!^f%99ݴ0ǒv^Q>^? hci=~8|Uw'}^z|93V⯄.F37=twD}+f7rp(t%EIp賃&v:Eצ7#6ϐgcYAnZ,m+wOY/S\MYN5}sAjr;GoxzR>$\t!P3swm OvǯMӒ')Yr}cb5\co/ 꾯kz9[nPىeM> "Ǭs|{x^sxbyvxٗܛ[wJ9>8i#{~"|_YMnIZp ,0~GuJFȑx] +GϾB=[g~~J=/,7[!}m% ysmMp>J? ̑'Ax$i{s\kUONC^)|[JI^Vk&ypi4Mh>=T3#C֗ gyn~tp~9ݥDnQ.W 9C`xg,kb| R}u>9s#&ӃYvǂW R̠k<Ӹs<-_KN liwY}r^ ._c3^66oa>Ytƃ89R볼 B9Zwso^Nݐa??ZKv7?46x鯘o"܏Io2^ޔOoPo7pN ӗOj~IxHϯ4sd72 |[#?i ũ+ dzj΍vn|aޖ]Y?jf q|SRxvce8*2Rm 缑>5<|J'5O`IiQ5fm|!9@MԒWe9QPG'C\6p$o)uGk.JFHI9}?UaBh}~?ឨ_/nbcy Yt(ցv??aXA5^aygߏrTr^v)o2sz~|tgmP|^rg6=ػuH zOrSt3}K=c9qq+_0N%]4@ V+]H4>/Y/L?%oKF^y6_ӧ$G5 >Prow?Oy1QpB+<&Ueqo1_@SgA oϦM{H+:&cZΤ_H4^棖c )^躽C'(i|Qχi67wEu.Ss$>_ipf~Ǭ&w@\1J>H>zp)v]5\<^?ؾLJ_gޱaW|rg99jz^>e}B'3G9ߵs:_?jlA\#PxO>aai>egR&tq~_ 1g>z&MgQ*Qmz=pVt;iC/ht\!h~VJf7gj9={{o<| qC*Gi,uo#\KBq|[7H+C8(G_ȿha~1t@P*п5̜q> 8po&oboR;ݸ߱ͨZFΔe^&A g0Z9<AwT|xc7CXk+NOYu^:o_?}zqڀjM_  s+r`d0< {6tu2ox)<'Н9*AێoE1\1}/r S̅O8@ }F6rN&G* ߎχ'?nFާh5鷣ܟ;zOr"f PO1?sW< :cqQr-G|_Zƒ@*!xI9w£ŗ.?Rk\8Rs ፵*rwolOe/841SYhb}< ?%=8,' ,rmeᱯ7:r뻩ϊnT[x0$}D7zP& :8bnWB-󡯅\#~+Ѧ+69T &:ynQ'uI#> Fxߚ'I`p}r}2}5TNXEo5ƽK6_tu0#3Vg'E ~i8x9p@#Q[l#璄;澧x,pIKV ?÷u>Wz Ckֽ&:}fphPԁ>a1tJj ^'.z /dkhtY/?:6ϐ*o߫Nc˛ˀI0gGQ,'+11(:XYJ}G98gsQT |lDϷ d9क़H}x7݃˰yԹZ6]_z~|IGLv!e^/j-t響{ƘS8o'3wK!w=Lksy&_Ǵ`/߇9'<'O#<}5:/z~|C_</7dY/,GfrBzm9:}52l <-9y_Nf=/f_BeN7#|=MlZUc={"ePUC:Wc񼹷O=I>zo:Mzפ%<OGj >7|Z"/X6o)ks3W7|")B&K๭m5Mrw5Ir|-o6G4ӟPt42Q-8ü=W;vgAcx//u% ti>N昺~u߳T޶fr*㚮sރ[2W*OG?gmu.Nwt3ߥ=Ģ7/7#PY7~b3A􆫹 /oJykuZZy\)sEa/:6Q᫙5S9`>.Ի^ pmWdCO>yZm7)-H?ݎ+9HOWME+zB-ؚӷ%M^~xA ٴ xXOYgkUyUQ/|5!MԱ [K:x zt eu>$N3w<|&NNۗ{!}@-ޠre_Uvr/;kRdz\^$͖SpqwSďFzߨwݢ_(wJ?lRu:_fr7|f{W |C r W׉gx~;@2*x-̑Чieh#$hAF;ˍo潖q^Cn*ﴜ0e.|o̝lM$j&pp1޺; 1hω|yyrNf_Vr%>-9V=isD|:$I9#|uDAӡM'_1_ժSJjuKg xW?K,˳=|$>1G)l> 9b6 w&t~b~ 5ru |Hgt5N5ߧ=;б;;:EjLG~lrƹׇ79X_[ OSgs0_դ{~vcogӦYnZ u*~DREɺ"iv3UbƇ&+M60s-Eݚ2I0w KyE<Vp~jQ ۘH>jm>Ocޯa]~YAW[૗ey![WhH<{9U ~du {Iϊ&|z~8Ej,sQpu}OO~u,rЃI)~ |ݾ2tӦ169[2j9"K&\=Vwߤ˱ :.nq878O&0|B{_9j['X!>|)J3_?M?:bdp/Ui/zSn,lcƥdӾyx~#7>xC[`=@}\^cs-p8J?֊_=t\[*M^ܵ.C(k}o$|}ӧ_v1:̞ȇ◢=haYRw\Wm]?,\òqr 'G)GRkm0!hQ(|n}!-FN02-kxs+50=n!L5oo9N3JX紩&|J=р fjɅgۦl| yo+rzs8'c9g?,<ߍT]Rc?yݎxYp!psYn$JrhatS}];Qg<_Q2N o=N s/.?wlE#O>Lp߿u/ ݘֿAӑcS_B)#ԝkkѕ>< ro3#Z.-Gj+So8ͧ*ua1>p6jsn|`۸?dҪK+{,?H._9dZ= 9ib=,d}$EMW| = >k sm~zEЕ O}0Wܟ~K6,I$/c^=(}1j~ܜFhȡ{-;Ǘp 1o{I>/OreϹjWbX澤vCg0sC]`~_+s>p %W\3VO uQ :'^O<:0:eAKGsߚ'eO-׆?~SG/n_#o?tpϷ.e=n☴ҚS`hYpJ ٘r7+}]G\˲3}RN6ffmAW*o{rR:s== }Q1h~E>ikNM7vmm5-rG^۸,ⲻF.J-WLy\}gY>%RCלpێW'1, EO/e!ksxu8}z/t_vCChyrq?1|2y8gr&e8C7C~|v'?Vkd9bG54FӉ>& ":2{| o}>rF?`Շdw[Ӧ ̵߰y088!xpuvFl''Zͧa~+2ދ0}9~ Ɠ.tu{)w9ܩlw|YWk& S;[q}5Y5z%ɠmg_ZM^:/Wls6GnVl3}*A&rl;GMuНY |d]^өxar@oB~V7N?(1Lt~>x)ϴ?j'zr:6YlEږsN*oYZ|vkPO[]쇯N2.sΚ:o|xtzç:?jLiZ.;%]|m^ϼ?sV 18S X_mcZ=<%kJ܆0M;6k$܏%|K_XpbՏ}Uٖ/OF=i`]є.Cz|`V]}1MM)-= 7sT7 p7uilה1Y'qv\uZG UJLg|Θjڵ]?]~4ʱп}\?R7߸G:FN~G`\6^8ٲJ곮\Z'xkOq{gW=LJgW[᷎n?4Ia0wTNvſ Cj9)i<4_"MLGE?nL>ɪ{c cUBW_=G*R 5|#44yyOd \ƸB|U>:H}UvNEBc}Ŝɺݶ]G>s xy DTw?JԽ]oɂZw͛i=M\x5|GǛI?rۛNvWG?V&N|6+X9/[BN_=g!1k7%W󅩧ߞ ?^dOOf^oSx8XnV0nůˑatA+SvEqx3;Kr-7Qe Mu :kdCkY(/2,tcǸ4$#4v_]y'W:ޡ,OunB*~azvS'57E܀݃& ïp:1|{vGu:zu~kCleV#|Jp:j~Q^t!'Ϟptj3Ug]CYn  7.fQ1Zq7gV؁ENtkyky:}cƓ s_I?x[흱7at}!=Cf+<| ʝe^r$,R5NۨC@&S}NNe}$H} K{5–{as(x6G |BF՘?{hM)e!XYOt0s.} z]74<%[Yɜ -Ϻ4A!U5R_rBr.[z'  ,q` qlg_GBKW_ 6*;!}OI,spXM_g_/u|ˍ _{OwP~wwLpύqn\W}y: ć=|qtçqrmZ38a]Bl P _2< ^cI}ُ^9S?8'חVe跦q5>˘_ܤ=+6y:4zM:wץlMCcRy %>Ӌ1ůl*~//Z꾙^6P_xtQͲbuZ\}-GGh~"R: 27+ C9"mg?9}빡ɷB~kD2YǫI_LwIm-9ںy]w:uxv~A?00?A7V|Y 3_}yV#zڙ?;Ę÷r/ǥ*UU;a5C%c1|v|C^[VZnzxm7r~5@q 2OIZ^%kəEg)J}x^pzXŷWsUgw@b&I2ɿJ1`^'~tΣ1N ;?TP7t Ol-#*8J'+*?twG+ޏ/E[{^}N_:)n9/Ͽ]}{J\ _? CLQzȣkkpzm~rY+w`U7RBzǝt&^9Bf~󯟆ke uCQ7 RlDuy?Z|Oi Ry~zxk/x[V|nco^#|KyϪ?qߺw+Mc҇XnJ%܌S/w3D`'PIމ r>Q~MxׂJ˲\b΍`}vo\Իe{g~S?Vo_x : < 8T7ztmƯ"GG! Y7;&8] A΄j:B~h'z7l߉n64EՆe/zWUYp_4u=öqXn|Y1 ykoDgUV8F(~5?tߐs/F;b&և36kRw'i޽cס-ד)X5Fugmr<}n|Q0eOнwe 8xgg:fΡ x.i1j| ߻\Ƚ h_|̅OR }EvR/la.8ssy垏CiG'%D|Z8~}WV/|bm/bs~x۲L5 VA776zrD rX_R<Kxᩋ;'ߢ?6빺77KWh7J^{yLSJn0>lO3&4x̜k#c |e2w ëiO9[?c3\9/(ʫXQ_{!X[) oww7OZv\O߄ssq>^sW{3p}/ynYk5,?  ~OD#w&n{vD:>Ғ/Η*#iяk}y^7rw yѡ PdVO>|A)hwE:gm^>v M`ݰ=o姹N / $~M^.gLCXki3;1 hOyO@w&̡˂F ˕Z~ZԴnȫe?ܰz+jme/ѧYsW^EO|B݄)ןڋٓNӗ<UXcbjrl UJfRp*rfyJLwcOzi8/O<6,/f_ fGX]Z}rt? >S1mYܻ߁&? BG>Nr\3 +sm?o 773"Gql.Fo+=m֞ΧB2a>p Ǚop|=8Zy?c[Nψ*ȇmNc{dƎ'cZei_K,ߖ.xGO._<ϹYe^M{-}K|#_)c;⨳̿)ГcLrvrwJ6?^yO+t,1,Y /?P_$MoZBiS9s:7?\׾п⠣o*ucNzsBP~&X%$~12O zi3#^+Ƚuyo:Ёf"yÜk;Mez*}!v8?a*?!|7szĥvHsD/viD4{?'z_T#p7{.۷W7}y~ .~/^kN:{h;?t8&&Ǔ_woFvm6_<#‡m'E +<%J@]!Թ#~|~SsY9%b8xj/Ւ3~ugXC_7sӛnYBN9'frV jb%ꝨÂs2÷=_Ln/ QNwPȩϥC<|FE^>.J^˒g9KW4ūJRo#ܫk :=|"oFa;/x?1\zs&'#O^W߬.3w:p9]om%r%X10u]yNeUk ' *yC]es\ܥ8]uy йMU$_B,zËbsFȂ/>>K\ ݑNte=~}`S2`{෮Ədx)9,ז&N9Ge> Z͟>݇o8~b ]tXOގN#~2 ߕ \9z3ԸˡR~5QUpεKˇ[kv n(2_+:FN[>܁&En~*CnY )|^nEڏd,K4P/W xJS__%e~ax}Н')v1x"ɉ2\_@a#Qjs|/b: BG'xs <0uYE~%iQwJc 1<%ˁ,úq 7_v%9]0Ӆpy}מ"BAi締K(J~&3k^!J3F;kԉq{H-\=GNg_ycw/n?M>mIjyЖ?yO[|g]2pr?o2tٲ_mvCEh8qjTmϏOH%ʯ|?_p/jK5ofo]y覚#Z;U9?P㭎ҷ 1enėsxhef97ol*A집'?nYΛk u:xNW" ?'߰9nW>uG5yl%3 t>F4Xg˳! ]ƛY~7M.)ga4~i3@n7S\:}Ք?Ư`)-+~|w$&y@[+|Lgf: B'~^ȑ'bx݂JP[ç]W8gݺOO^?nS#7$*2=}"vY.ͣ'flSzxn_^Fp_⋡AN&rH$bBѢm:xۖ _Ig&XC*TQ_e ɮ?3r/u5T19aK/hŇ9]@:vz7's980\Ym.whs:ߘi}WtM2~_)}t-xYWo=Oe6'lJm~#7K{:H;NA$!1_lϧU|#''~}K5<~NCk?~.M,!/ |ւ<=I5ٜsi:oB9ɵI5@`O2pڙ_- -(zO;=ݯ_%nJ^|S;.89qMnNV3.rsߪd-l'Plrb~GWem׽Wgaw8t!oɋ4s$#)Iϣ\K1>?xU BH\ 7s߄tW;jxw Er_|6!/h S~~~H9zMg۟K=aI=ÇZ~\-W fm㊞='څ^1O?4Suӆ=wW#iW/1X=$F,rrp~@]^R͹GI> ~CyuV1__}^w;y&-Ǻ:?7 ZpcsMn(2{'HyBlvJ2 gEױ䗴tv!?w{kso_{sy/hͳ$N" aw^)b*>n*O* .yF+EϏWyj9b su%:```gH/S?5W&r4.ϾX$Yat\}D$4o;v+O?1[ſ+l@%ID6{5_>挖CZ^颬.?IsZAh8Stu~/yAfzӈ؏yNm4}n0;/U?3 0_~'g$W\- ?8]_$v9^Kφ3stO̭Vqvu[JK+O1dd]z?=4 _.̋*񋨇t<};<| a#LKW> z,wϓN't> DCltC?\` !xS5f挮, ;9W>zOd駻<0<;/YL-9a-υ6~||Hd?xS:}3<NdѷV_1͏6%i4}Bks@| =oKR-d? KVsuGS-?2PZ\Kѐ&tdga4`oUM!Ot&#u>%/8~t^ủ:)FϺKDȓ1SsX֎?&ܓ29ov6|z_ 8|mI7YM+%1ƇrB); 7N]1H.^7-ʹʦJMG7MTNŽi~2AG)Aj%H&GjE~_fK>Pb{2F׃9mC̫Sȣ|4y1ƺNsY5qOs_yꇈ'}ڹo2l.TsGmr;+yw7e 96I|./gz#eЩs5l~0Y9B_L#nEw|i|y6m*sz0z G"\+.x_P Cd._Y+s']ޑPGR?eE7.̾px=nK9_RK=b |~zn{̹?Y9_ޱi W0D?¯cS='1=%߭܌^?Ek;||!xmlu(0ku8 5C?TfQ|o|$UYNr}2zYYs/-xKC8&Pƙvw$7a}Z|jkE7\IbZ+|Es*}};PUט9~݂Usfx[-nGc˃]Gy08]y;zȔsrIsi㵞 =^$ r\W'$CYX՟l[O'C}bn ~YG.qx3qO2g=/Bw[̜zF_ 7H/X NDtp;))Jsvu9yVc>x?/T 9:HV/^l潟4z$we|g1N׃nm俅H t~m2y\HiruHTjY|5^a:|L f1]և$RJus`կУp˗b"RRy$_8<c>Ǜ^t҃=Ncy;Bق.rU=Irw௥,aVM3f*])s5mus r%H4H@i|h?杲Pz^ '%J9'o:$Y+{7mC/|C+o@]4NMe1\OAOJ3aj~bCM9^~$rѻp^ \w]gusz3Ek?f׺jwQC̹Gg UaS~-w9"/C/w:ԍ#e7sE6zBb.8ߏѕ.\:N^n[e($#/?2;a=|/W*O?u_"G"ηsEt-ǘS'MBKz[bل@~-{ d8VVVw.ȟ//Eȅ? F.U>N$Et6`?^ԙȕjK\>~ ؇9!G;o\Ά[$92:Xi+ArtW m3rm~T=}%_=%Ng+㭁t-yzgζk9q^ך@?y}2x >u*Vqnm#q~7_O>m#'5ȧ|EoU7],*I^/yRA76^^cegxYY՘?o}y|ϮY\1ŸT%ANXi@䒴g蠣Lp_~w?zP_鋳ŋʷ5kgS ٖgo/>@Os[){R)o!ArA}G(mҳ*W=_a.DGZB?}ޣ {%Vǿ7O OOoV~Jv+#;{'&/J硓jﻇo~ϩs.+3|;lL2xN-ETfsJAkJVW? ;MW_W~y=pB'"'/MSG9st3y;~ُ+aywYU|}˜+@RqFuUп"Wc/-qi.9^~y"  lp^" ^"{-;/4?Gϵ?gkKh$F=?{͂ |~<IZNrbAWE:f.撃c`qAr6+o1Qyxx#x%<-G}*½ s]'oAswFGI(~,7ѥ_n:KI`yc?mZpC~P<|5՛`z7mKoʭͼ2??a'W?1tm18K[m0`ܶQqu<φdzw+>H"{Pܸ^|']NrcUb0w^G t_na _5Iy1oɅĥ_&#o{'C_7M^sWk?sxS{b?| 'N*}B0O{j }39y sZb7_,5O.2k;x|]mO?Pls΂}ųLRGM+_&H0YH{Ko{7T=y\hsFgۥOꠗa^P^]y1m| Q\xrEg=3 &ޡ><IokoO9J9 Bz7l< >oR5J?yI# x^z |=|Yv2>C9_*lɡp^&37NG:A(];s(_u/C){/y<=NN 9ҫZS@_0 oK#~~sO½xup;'F̫A^}{!}b??BП9f> 9oS/9[^;T1"Z xzL|$| >Rӟȗ'gŹ[ `_=W8ɼ/(zߏ\na#GߑOD/_'ŕSɯ4Wπaުs+_O&x29_!~ xI+xd^8|7ǹ7+O|uϰ'=80^8-4}ICVINf*c6 >,=GwG NtAfJv>b^ⷲ2tU48#|.s#CoJ]Gަ'K:aUx x=̕KA͑YpAsu6LC>m>9tv>8= 6DǬE7M{Q>{^t 14 /̼5^TD6Ut>~Ÿ'\I>E|H鶌u8|Yx*,8ոwᐗfCeo0qG<ɲ%t&DsLssw~rE¹.k>IvN@e~ճ<7ڗ]6^aK'DNA'ž0|'ߞeΪTkVbH:Vk+yS|VI=yQt %7ļ!˹0ܜ#Փɫ1sTH"Jz)%rLwG~Lnt\<)*oWn;_>̻l xAO:d[ ߳.mp"^·k?ž1Y>?~̹˶}_Erȉ?,7y~ t#CA^7,>+}#Q!xۚWj/M781īsEP' _UO8nb7>ǂ#r!2>-3NKs) y5z R؏78B|9I({,%dtt>ސ \1[r>IӁGxa_7Q rK%{D9j>El&*|s"OezD. Wƥ:c_ E7_]*1?z H |-^o|f^"kS2Zrk|$xOXbrr,0OKg<{}#at!"S6=EjbG h ߉{U*s)X^@7#\kVعc[<:ouA.OKY,s9?x޽g?6KKq>{ѝmO}4roZU !@t!p!t%i;IWGf7~K5z\:2ULJxW9xT {|r)W95B9@߀rx'!q#rע_A@,sz Q~9qy#G7|N>\{ }~<"P 0{U%9ϩ{S:}!Y\7 / ΪqSLzqSa.O׶)d6m[mc!~>Ş2Ʃ@bӋT*"eNX 0؇,-+/\Ip&tI *tsJ48m|ErgvS(p]\FnΕd:89g<e[QNUCxWV<3WqQy|k􊬹P%9ҟr^yw Q'{UzgZ9~^k㾺9^e-@W~#GGkX ϝ}JaϹ >ۭk;of=WzI뺌\ '=μ#݋k tsHyv7ɍB?(?5'ft{@m`=>NQRP]̇ YQR|^>+L0G%" F[.gN<~#29|Uz(I7;n!opG2\^×V 7BA$ /6[e~}+|UsW ns)Q#?NFy\>y;gWF$7pd{^ۆ>|>&n.zGoS|k.COg'm=R No_ԫ> xO yf^,pN-9L?%FNw: nUC( rf&Cr^29Nqo6ٟŸLp/M؛{:xt >0zyl߼=|c!b ;c ^ܘ0<\U^ NٚMg|^W' جrJ! Η0N=Nѕ?c?.3wϵ\~m 7x %>S|*y{=y~1O/E&<\9c8wn'c/} yu~C/zx{-/y㯽w=-uċa8srM3oRWЧDNI9F{@;!Nsr'ؿ娟:ye. p0''Ke='ޚNKkߊ>0d>`~{O2^8|܋G,)=r /w?'K}?Gz(7ԯGߴ 4X'3m+oѿO:_TcoI',}.Sm} o0GW.yrW8.{m)?Ŀ ^q=|@-!tYۣ۞Go4z3އ>^i9ƽ OXzG'~2l)ΓAprp~>Z]e~YC TRzgO5ȏ"2􃢗%B%|ݻ-:ac|(7h\!͏?u ތ\Dtw{o$k[s!z3q~>_ru+JZ|m/d=Ęn_2ѧ7YYHSVTD9ʓ υ<[+cQ)i)eM|4˼\Xz{b<\z, rer hj1%Ӗҳ'/rZmY^&'7o^:258ON5WǏp={|Qӳ71/%<ά[rG[_/p |0z}:yJ{/nqפ2{Hiz)} }-{aꦞ]=?Qt/`=ܷ+W6E5;f{ix+(7"A~&wg?/d s蝀tF'}<J/^<9R(_2ބEa:??XwM|wݠj)z?IM(Z~=k72Ջn^7نb~9\'7|ߞ/r%zg7[b}-_>,c~ l@ć4}V/=.tؽ'wgr_eM 2f+'};,rwk6]ܫ;{¹='0KB|lqoWބ3/#ZA -/K]}myl|v??G]Gc~ HE9n_X'z}wz&{l}t|?ЁUySyH7.*Oo)Uyt!EH~n5x_C\sCI@ HǧNޓ7vE#'żȺС'\1|:GB\>?Y9 B-:џ(f||yJ Pgܒ?*OD1ٓßDe5޻6VrN8#ȜP>}={ ]W[!mӁݧN;D'ޡI^g"[=}>IsqtlpLx"~*0s*󉑓꽜wGG4{eQz/~'dw ܬ|ys9W䞨vr@S?9z8~m&Gz-C>obH0/B+u4DrA}T7DߧwW8zE>:=|mxK?yV.r}5;O'6Kۋ7!IS'KqEG>z`P:pϝ'“sqgetb} #謊^ù廾O=;sɩWI@G8|a5C!;ywY_ ra+!/l'޻]^ Njk{wNxYVC$r_4f}W:לQ 6_nog_usxI[D |?{0>dpX J^$V_Gݜ#={azO$pOG9oF_ EF;9['lvuEї;u߄z>Iz;JgWG;ѧGȡ%_ùArm-&O =iU.tZ[{5é$}!M.V疾\ >/=p"9r[/zþVaP\$y?s\G|a\)|tIrrcUr-#&c]O';{qp2y=m;ۦ>?݁~-ɀޯWsNp?yבO:^7I21,:?ʅFn?zmϿ_>u!zjv ۬qn9?_?i\|r_欕>sy~Go N<\4Mr~O{0=¯k;Q^euqsɇ }[kk>;{Ȇ໅̦),!_u\?앟||}ހj챽7370({~E_|3_c tCךÖX[~==gg9_7!_c}63zy?iVFF_\1w5]bϏxw>q+<bwc7yzy+W~ /IRC|t_uEPNzܣm#6Ïħ䵐+_#0I{qQzч:Y6*z&ϩw\gzQr,s79B~4&C59,~0FyrW/Eo秗^F,]EUʗN:|9wu"#UbsXD9g-ȉʻ1W$6:7r>E>N%rS8@N?mv=xv6y䵦C$žϷls7?Nd?2:*OP:p<~BOV|[7}Ӷcuo[rSm9tC.>__$(9t&3U/i# ˫/Y^_!>\g! DSEarkѣ8IApCW>q|=?޶3zk#o{_>['*ᕙ?ք_=H1kE_>Cr@y}z߾ĥ 2K@zO*"y/ k'iz ]nCxz 3W2OI>|io;įfݎBMo{ç^|?\|=Cazn#SLrJNhC>GAk؏}w_I8QyLTW%aJOU{a<={3.GgWG}Sg ^&zΗyʜ'OqOtm_,Osٿ;ѣKK?M<˗]p/:P'%?ac|_ Ǻqf+^r| yWtɯ|}U7? Y MUr<%r|?{%9n_z%7xA"o/kNu*&Cڪ!zz{ȹ(+N]EΥ48u/zjO37jx ~j=1ԘG+ۋAC' q~l0*Wb=S9w=Ioϵg}OS~~N(ݎWقq< nGc1 twYQ2'Nx ƠP'oh'><罊o<óRԼmˏ.}\#2ޛ?>͠K28+:w iOe7~ug*蘕ö^[ ]H!: jۂsV%ʫ~kA/tysyw7š{ѳ8w[ p>%³GyЃIO> W zCСTqe Ky)?7j;Gɭ_8Oz[JWQz+gˬ;e>~/m[]Skuɳ!9O湬$DO,D<"z77Z< K 1-]""={bQ-P4z%{?_%`{~7=9e5 i?Mcz=7l=\Mܦ92xr"CUfQͭoȧ u9v Ž%hpyZڵѻD~= {{?~ tv9,~sm~Nge|{'wy|(9>l |MIp+-N9YG+h^bNQsMM=>3 n眡=_JpphJK90OO^ÝKA|]{顣?RS[R0g,ϓARB﫜uKu!=C{s9~m獓 'Dߺ :1N^ @[&[|}z0L 1#kW|?H~_[J~3p ^{ӝh5xcm]V5"2=.W!Mn<7X7sr;9 Cگ'e)n~X[o}a"qSt'.E#z<Q^sw@#CSz ?=JOzzևjx}o+enYi{4$p~|oK~WYxIp V΂;f?澬Ca&зY s_󰑠\z4W{.>o5G7nBw z |7:$ϣ/&wDxn̓mW'-q/OЇ&ycf ]4M2w'_}kUޟ::!~}Zm"*J8<": ~?O2yzm\ݪ_V ao'KŗS"<||ax$6>wSb/ zҔk pK ~Xwn0빽y6^̹Npi,r˧sx^*6 on{a+gsл{6}+k>N OA_ p˟A>w_-)dž}w.}nN :2smsB鼘?$NnFI/' ?|y<_ϻԿ]_Cq}u=SCKߕ?_x?b9yjR>-;-Y re.5_|'铒Q>tڶ֙f*GN[^A/RĿ'b/(g ^=C)*97X!P^Y&|"A?ntԻsT16oڋW?[愣~Uqz2 >I`ט#Ot c>S 6gʋ\z]{]o}|-| ^߼{.-/= [UGo*:]S >!{%ש칑,s܋ꡬGQ[f%NTtv 9}pDkOϒKIߕB'97l4 >&7}I$gQ: s.vK!8MN,:SGL“ŷ>sJ|·TZp[b~쁧9?0|dmg/ZkqREgj |`er|R ʩNzw Oqe?w<s+TAa[2 GcS/?Fg7ޚ{w V?L>t*?@.rOK/^ lN.#dȻ܊Byb4~j[6[߾2}Yk)|i>rI1gx߇4wݥ[ju޵7ѿO~GO}(,cvM~/?7atȋCЋBytm=ED{s0z'x>GCX/g'ur|{ {x;'ѯfg#^IpB:z:0<"Gvpf#蟜rK Gț]/y+ķW=D8~ir9ZOy(-Mo^3 ī(8r~A>c}EH-Ig=cO^RƹO-)/]:zF K)}^ u]䁋}ĿC}kMQ`z})?;os>|__[%y yO0w N ||U?)qxMk~,{ƣp'*Ą8ofNoSyx\W{{A qֳQb2ً|_u]}¯]]#UnxUe^߰Egi@p[hSˇ#ğy~J/f8%}|><əPoO3؏9mWГuxϖ񡍡^z{7~_2+`I>yEg.-(/|'zĹ5z]_5>q>G_x^?u olUxx Ig|>Q*WgZ"o_$}v?IBo5ҧSNvY p^Qp*zA4us#?NWvOMϪ_[| G=xן/%rCOmD/D|hC1F_떟l^fνBwA= {~?^M^8;Ly'' Y_~Nǣ7? uoOtDў}?'%,C{/W5d"i^_>o߉=W?o?iMx&]y60y<>oZ&:NtOFg*zt;x՚7"ز[{܎W+s/ҦϼMW}xߐ_7/.?o?fSVd>ïyKA̒[(\ٯl`\{}.)t\գH?}kկG;O(3N!t[M9@xp_ۿs''^&.yٙOx?UU3nӱ.~1chf~zzV潑_(]Ud_s{p5*JX !pY|ŧѫIZ?3˓VayMϾvfEϞ?j-~Z~3>2g} z_F/`@'?sw,>&>0~9o:'W=y< 'kg?3τ9t;Υ~qš-b㜛M|_aNn,{z} u3{$:̞sW|Yr8*S'_i>&8|F] C;ĹO1>U{2ЭY/T{=/.G~I.rC)̽> p#}p; ! .5~NOG7<1ЭyuuB\U~G ݫWyve;[Ep2<=q bf- ,_T\8ʽVފ| >L'NBг`o_YəR>=+ tq/<}jwXM &*O` ~="w\YAG/}/%}q<=q'G}okS{wVEDZsCܕE9/AY1:(S[-zq}(gE==]/W-݁ВK/4*s/q?4;ƇKSrtc#/&ȣЃ~ۏ36.ҢwgI]|^"s(xm^ۈkT-*.OiɊyίƳ//Jg÷"5ks̹H^K86LdRd>Ҿk+Gq>-莔^ɛO~=UtH'|d>UC;Z=oP ~L|aEۢh?8DX ުoo<3AڜgUp 7Dxs<2,9 ZO$> jG/KC 24=9ý?|ޯ]eRJAOiom|~}<Gg7jrϓYkcs蒛G[x.+}+%t/K"̭aTsO]|Co>˞WAb:&ȁ-}2S|:E =Z_,OHǦ\&9o6{7V.s^/a(G'؏^F=4|H._:yHoѭ}8Υ@^*zp0Q1F??IZ\|<<;\y=9t+?۷~NtS{oCߕsoqL{GGuX@p.z8X%xN||̻_is+WDUyӫH7u5: > 6cOA5ɽ97'#:RQ295gz9s+WIe~;sE:tAnxxU9=骼+'2i@/=N_x9YmEt >d(1AXmRIC8tK;8_w#3׽ > rO]x4̗{gE3˰TOz(uY?tle'oZlз iyk_>6Jsּzod=~Hϔw_|6ha3<ɿmYu|Is9g5O/C'Ss;O[Z~ r! ?9WZCyoC<ޟÏ]=88ww)?~0- [y~:Hc݄O~i'Jgnxy2w=E],\}o8ף8yqn^l~aW:9'x&{I xX8l~]9ۂNW/tg6=w t!5@?MuI| 8}P&[=]Ue_h"}X|͟itcs _Arqz?QO2{%+3|H:xr27ex ~.'oS_jc՘ k^wK}rl!L ']=y$}tZ!S_M'SE^/t]NGWyi?)ϠI}9䍕Fs:sCϬ|@=gerZC_#_A!Z`=10r-M ~p ss9QPEșNN\,e2N kK[Tgޭ\X\=dV7smў'^?$K^IpEzDUn;F/#gޟQp4,{ktKʡg̓#&c_+>Tly%gM1lCX2G8{2fS2\>ʣnR.Ip)eyriku3 Gq ݨo8 =4Vs(OD~Gg95Jg9} yB&ݺr+IB9d-t`(-0A2|o t)i(<7žCݫ8hp:ȇq|^`$*}yzsSiޭ .{2S5JVY_b;gv,sy΂v{|?uDEEW~ :^~WTg]srJ+ADr&s>r:)% |p+Џ[g&Ԛ|8}8N>/}\cU&iOVd}I1W᫘CO^|'n.yj|E}OuW]ܙ%S:_c^`OV>Wy3BܷUx3oR;Z(g0zKufmJJ7Va?F08P|W'SON=@?W* ax~?xſ|asygVI˪OyIy7VgjpZrV镞 pt/sًϫߢ]:.6 kW9#"g?.;O =^'gucy[`fƇ~OjXs+zs ߹ihC[V}/k9GS&xP1p6`PC7D'b^;TA2͹O^ЗEkr?MWȒ}m ՚Л;1=*=jF} 'RtavQY+}|?l4:NV 8>`βE^+^'UM|C)t;:5?Ow%٧|`|zཱུw.]dOjsΏ7S6΃Os'~*#?%7}*-z\:<(|^ËLÃȹROޏoYC]I9*zȷ%n tV?μ-GOK"b/ZDV&7)Tc= 7 ̒mQc ?_|>F>f=8sȒAT|Y\WG<pqn݈sɹo(;B^ ~r/],-9|v] zZƞ <Ko%]ϢI z~8s<~ =nrZX=Qiљ.]]x߉\DN}A.1eELp>[q$ʟ\h.9/RPJ'W [= 5fu y8mKEz-7? Т$>>ڍ=!4yO:}:0`Jo)OsGo??jpc﫟gNB9AA*y~F\9sa=Ȏ}i<,rN(~p|/TA]&;|v }=P௴><:c{, . Nנ[Uǘ Eʚ AF\ocC4vmO}MSm>8Y4bzNăP÷0Urr#A=DM \!tszGxVWO8'_G_Ui˭pY|{\9ꋖkrt$y#}+a_@6=so:yK+>jV{nWz-"_v.?1\-*(ࡪYo]IRY,9!~8uJIަp4z,E* ~+&kW YI9+/Hnb<+ n<ϕO?\4/;;=+Ϩ>~> O^̕zo`_FyNQ(c6þYif]=C E9-+F!PeQO~yevŨOw擣B?P#{-{-,Vb^]Sb p.WгPg pihyo]_Q?tybr|{>\u|(C\A^]{n3zXoCV^u"96=$wg;8#y/goҫdޓ8\ L>]{@y$W#p7M^_b|If'2˂@υ?ܛIa\qqsdrqu]NO?jw-+'۞_w|>Jn-y> ?G7|(]^3aϛcX0FNd!9Z>I0yAsKyQxpMs5-xYr/- z&ݏ[F^KdX|?o/_8#=BOL?z?${2x5`>7#oZ/uy(we{gy0Dk1\C~ W55З,{Ͷ).ec P Aw8n=>zk!ϧCס9iZ7dq?\ӟ?vsUp'W&?y/(zrNMmr]~Xs~}r}[{;$"5~=~(KunR׉##aAe{ԿGe\>Zbd#{{R\~p<::R6`p򅡇}/:If$-_}Ľi\-|FyXOl"SKZ{_:B*>k&'=}į㜽*=XE9{'8,s࿫<ѐx/ }N΁=8EGg'^H>?7y?5s}&}$yhϪ?wYs=5&%Gmܱ}0gzߘ¯rl-Z9ҫ|y.S88{{\_|s4[cNI{ϡn6}^<]{>iJ]ļ]{-E6_[qs|V?:ΆÜI}[0b-7zm9O5i|QW^:n8G>޳cT \X}~rh| 8ٛ4 ~K*?W̅QηQ,{s-;a%ػ9>4SCŽ@^a|<IӗQ!]F~GؓՃ~@墐1O~mO}sR 翝^9{s(o֗;c>"r Vt Wsw@4N>C9=?RpYt ?\{A~:89D>~1ySu ̅izvrK 97'  :_> =O{ww>lѩGx?*3sge^y%Yy G$<^}38M=Zˍd~@t81ocEM^53GK|jY8VS̾\?{G/..fc텿/\Y9&,V9h۫"{(jMGy. cﯣsCn|GaaFQJVpcK]psfn^> oй:S~c""'~%zR|-'r>$=*K::E>]/o|7sc;rԚu΂optK?N{?nrLc;C&Q~ߚwsW֞{-{"s$ UpnX?KU-> 2RcG?Sj3q>Nȁ#=o;S7}S\@^7'DOG 8~K?EˢY_-o&{se>ͩOZjǪ59˺9'['">ޟ$ xgm>> *C?97=^8- o{;&=e3_Y97NI =o'>ZCi|Νm#ExSczt{c}w.#wc)IN,=6{8y`oY~/5*Vaj^UTX,_p2erpeb'B_UD}GD>py Ky2ysscϿVО Uc\Hn$GT'}-zl/_LѳL_ InjYyʓAE{3:Iރt3cWn} O8O&,s(/xW[6QᛝG#=.HJ?~*зN |iOeRBiy<6[* c-~QϏ< |:;|˫^4N#ޅ7ntKsP%zRZ_r^/wT_0^ls8/09_O O Ow ƟKoMØA׽̻[{|~"yWlK#`tGsȃ|HO+D\-9wI8>hU+99C:I3]@&/,xlIyC|aroy/z|xuVx_0 WȃGd33Z! hVK߳Y37HG\DGS<vܿdns'=='P.G}>ϊѓgا.'/4Ͻr'guoqȷɂJ/ 8osf zci>zlr F>G C12*WzSʑ}yW F)צMJb?<ݺՁ=ZxZOSszgy]NxY΃<|lŏ EC yr@ :0&z%fPezz]5U'85cO b&皣#go 駳88JH iV":&84g{n?m^ htf_$g{gK{dc=}%DZO@>n ,(=ckk6u葎 |w|g-[y;#5t6UYt ftܗ78þϣWBBZ`ޘbL%3t 6| >bUx"se}vpACo,|8s9:xq]5ffrc/ԫ{h j1M笏y ;rn&# o/8čg~)?}}P'wo3H^9 D{J"x$ω>R^WȠ:>elgj lGBsm;jeNR?mWw嗧ѻe|]|Y'M>wNηھ?|v6F)*JOW&>Jo#0'y)AoP%,dz)` ]Ǚ7z0v t0~":s^弪ӽ\U"N(>C$隆CmD}W FQ4-"{>tRS3'*0 ߙA?|3'W>S"s/KEG|X>hyp{΃3 XW0zy_e=&C3MJCW /u Ntv\R9xN.rУЋ@= |KZ)Y+07y6ԟ!kzR>L O|E/}K"n 5/c&o^ 7 So?;=r1|LzkV<Y9>[l}k=s Ŀ ףK[8{7|\`޶A^2?r5n{ Wv+:ttOGwh1r@ *+X?= oz-|N)ӻt_(#'wrD<Ⱦ.>XWןMP"8mRR‡;T|o+b}6ߋ*Z/yetVf/H$M(x0}~78 N:>uvaI%>g6 OP t@35%Ϗ597=_:5 :@~˓c0K/Yaz|Nmx(U˕D*z ~,qA,y@2^ A #WnY͠]AUE'CidSBW=3E|&1|;1p4KJ,M?i9zؼHΩ|ǟmr'[E=L SMOnv2Γ3G_cdҧ&}wS a< l,#z:l0P:yϪ_1+yK{*ҟ 2+xuKG@_Q(|VxBGKcK|m|lZa-ۀnxݾzfٷy޼f[c(>2zo;5~/sS_ tN鱷!{q0+f/1r@FOϣO#ׂo$G'j sHW>eq74~8[E~):aWBrxKd )P9 8GȽ2__΢ZIzL{YM ,tZaϺrY5wgM9SS>tHO.^o| V~7%|HU+ߨνzUr:nN/F"~ޥ`Tp:rׂ됏+S/%x})]S{Z`. "|x>^9.fི ۂG!qg6Bn"zX,qNvKK 36mxr OWw9( {/b䯐[a5tC:zއu b?l=&!z^,5~Vkϋ}s'Þ,}X=gGn]_}:!Gqd \_\W9Yϐ¹OHV8D䥇rg{tGp'{p5y~}cs:sכ|}"C`NN;QO0_n?܌)Aη{1Q0OV;;_G ›سwONއn#w4{Snoy>?"g"?[ ?x{埴ؖ{I߀CƗdxO?q&[ɛ _poM~A56>VCjॾ x qrZ *)}/pnwɳ0z _ޯKGW9 G >=` n_c~ȃlns6|g1a4[y:gVO[ ׫bjɟه[{`c_ʃnWT&o*8~qqCF8[FW湳Ske1 {++G\U[镧˜a&/疿B>t66}K"UrZp8܌,WѥU g :rD,M^,q3_*.m⼣%/C̐3I]纈Az`IE?26Z8_6rN_> yT CJ 7 |鱿Zp|}S/yw 6);}XqeXH\S=D#cɟ?KQOa^(r$˕ysVzu|xO=ϼ CkihΝ@yJ=3<'+AOU[t3tC+ z+) p4W#AgY!I[xy+i+r9tUc{+ SZg_$Wë5Dq[zq yе/WWfr=̳=u iù',K>-4Y~R S3ߪ7;G?Ko=}^d}C^m/J9C#W_z3褺W|Yvyt'|\(Yx4=|=W?zg~?qsc5 F/ciirߊ|5-)y gw8+;Ew'W?QrrL{VW>>>/Ei.qɿU,z ͓~G}U#Kq{IK%Mp.T9ȟW/V8W[g+Hd嫂 [^6%XYsk3sU;t׾Kѣco^`;g+һ@=*8pKSߩ@/GH2O<%}(>_? Y/Ϟ_8oqߗWiW76Я.]Z P%Q) ?.Dy?GE^CozOIW7܅/,_N)̝Rb_8E]J ?8| M|!qYUrU>yA#y MG8%ǔ 0W<[wv |M=U GeOz}oܻ*}#;?أuO*C-Ibo'A?} GGmQx}_ t5x/zx9Ji _G\[9#/rP_Y2sK.ȃ SA28Nʜ{C虥O%g%M=`-@g&3 1/Jοt"!^.XQr H[(xlw }sgioF#߀?H++ e:~!<\cyzRbV*g1- ?E/{~vS}ǚ'-?U]z8HyN=`!Ɲ ^r3z#H'dY*K ]?p9u7 GHNNGֳh{߫cAŽkߍOl;<4]ɿDo祂.Q߱r],]1Fo/n>z|?Bݺ1A\g!֣qpE,/"4:<ٳoʢ{>9<Ο']y7Oԡ=>8tK{|bȣ%y~뜣Ӯ~Hס9s@Mo /fY tab a,+smy<8S JU ]I ݆zR5/jaR_{ r#7I#b̀۵ёs*:| zg; LfHoxer9%׌9;*]jZgyOk{?I> V虐̟;EGAEoW_GSn3mc 7HfT{̵Aނߋ~r=:Oş 'sy<z(hz?'/R}`Q~y&Oc/8ersCK 0g 9́ʳ'7fʣm D//?g/`8yG ѳAodoR!xϳwH| xU/+?m>4S{qD9N||~%i^ɞ=;x|.Җ#YD9 Sz]~?X׃r!AnxX_s47G?gZ~^ Yބ_ڭ̓%t3vC9Hn GV[U_T}s{Ĺx >΄o)8/_˞^a{Q\=(m%eW^eWR_᳊% uqs/uG8/QA&دc?_trȺ)@|Nz\Lݓ~(]SP2χ*of̑S_#^Zߑ>y!8|X} zbOtR4\* ?gr,s䷑%'>!9(ꗕKo-寣ck^{Rׄ:|8UCT_7<]ׁ{ =#\H'O*W}Sa^U}E5ߪsọ˝qWwSoD#s܉}~ye/ڤ^0[d^Fob B?niV~[ON7Gꜟ'ɛs?m<"C>@g-S^hm rS}߸uq/ccWQߞBÇ /h7RO e)]np:*,z9#|=8{l'Kk|T}:9s- ;9϶ާ{ (~L01&5m"ePGX|mx3=7"t*7ү\A20*A&&3"eqr6{{r =隆$US,# /^(4"GKK%?>,9p?7/G tm_EЍNO΁}rpn:,b9tBC)wG{dOნqt@I`,ZD"|]Sxyp],:J37:aUR+,.<S_>4u99?{9Po0>? |?K3Shޏetb65s;OՁn&s|eIXvkXAqQx6D(9qu_4pNiH(e<,Μw_$|Mp~+6D _Jo5{Vpur%U0g鶟D&}A8}>zQ9CF;>*:]=rwMz+|/\[Qiz!x > +vQЫm;Z~}6~>ȓ,9-x,itE߶U)Jd9|3+Gy|sb.8^%Λ82r*{0|5$R9etKohW-υѧc8O4$O)þ79<ECo!TD(#PEK7h >og >ۦ'\ἠZ>9U%!ItOw| _*:Rz<c 7jRekyO܎Dz Y8|TyBC#O{#75X^!2|bg/W,\ιs_D=yoӁ/@d1r=O3oL&>WהGy.gY7g? UGGu+4ߎ@H1rsj^wgb+|]{{~~3/rȉelzۓB4 gTbxPϟ}+ {ѕA/GL,G\G^s4ы#^sC{`9~ =I?^AΏV>EZ ?ϑO\yq5=V@'_=׾e wo]:|WYe.Bǃ/jܛ|C&':h9eO=tr4mW틟vO>Iz}kg| 9ȳ{v{kȯ.2c{?/޴Cw:=Na tyҙx]>twBft3+! O~s5;9W?ۇm/q3csI=K͂OY~X{G^2Y/}]##|@s /f=r#|8YpȟZ t*}v|Fߨ"krϨW ^<ƫYk[G7@ol]}|(sFkߌS9x;Bo =_u#5r?W}C>+ݐ..a7{ow<9؊Β}U`bM|X ލ1NX!1 KINUSȱρ/o0z!z!/jb~> = GGIΆ͠SLND?m| 3\yRw·NNUoG^v/iqi<w/^Cs^Wϧx/gaS:*cbux1$gG}up{.YX9)l[幘V_,h?yW_&>s04E:}ly;h.\|h<*MO6+UF9HgO%μ9$_W̰+~g,~聜 >_[K>} ~z|W|p_yscE~><~?0S]=s|1:pG:-3N?N[ydyGuc%Seο"y,Y@[}Mm)޷ߡKB">u~,UWk~#C߄/[y?6@~8< %~t._=at^$9h^u<Ue'<>% '\oDOHooS~5*zTÿXg=&jSp?!xAt&)X{x#W^u-sx#xχo޲׿OCjn%WIOuއc{S~S[a:?ewE vKr/ῪIw(mCK-i_}D[ ?6Ŝ?X}x/zP_ԹgL>) Lt{kc_9gw}d>2~}c?|zs|>碷v{}չy -h^zLׄӔOnl|M^tpBT}=W::򲬆n5}\$6?Np<"6 _^~;P!w 瞓δ~+tr}~, <ts#|nqdYG/X>)>Exc3ר 璅ZFW_FyNHR0~7-#c|NNrb> x_ cfNFfӜ!mΜ<eߚ&Gz3yl&Iz߁sgU4yNO:O?|r/yV}SN?r؍ȓB;+ Y| }i]>yYׇ}=6Cc[fȹß1˥SCwTrO©8tx9gyu=z==֤@x@NUzUBc- /K^QQe2x0}^{?B^c,t> ~N 8G?GNer"ANe[wD߽Cu7Z}8 O" 9tf qwߘߌ?w#GŚ=/(s{,&~N=گpߤsΖsnuΩr>1q̣aNk9 ?={yQǓ܏{OϗySMz\|B/uoh2ro٩7s{;/qK}t o>sb'sv^(|hAz,wa?߫E};?P$d_َяAy#UUCᣂ \8yu[N+#`.]YYz!:z+8AQpZw>K,#<9s!sbý(#ыWGxryX_9ga8OPUЧ #^/<<%{ꅧGU(~5GL砣|[>0זK}yp3}{2׃7߯|l?.*xP#~t_f=]:00'g]!N$U/,^dl.rms6k__~[@ϤK9kSU 򇽄+ü9AOrJst zϲϨA?۠ ੑ YɡWn3C)//bq\Wп4bbXE^Q$k'N,O_.\E`(`nar 2L/<iN | tP9~;go:=Q.a7m<6W8 [%|F_uko<UIsI}aVA_\@xᡭx̭%l?9u˚9GrdP_x ~`ܢo~˹SW. M+Ms$|MDߒxPSW;XrC&VGVOBIy7^7+Aؓױqx1|v{&ȵE>1ל@fuƘSo\J#/,_'hЙ;zY9$|C}J2&y~& |~̫,QW< t{^"D k nrCQDНO?,!4n~x ~ su.~v⽨ṣ+O =kr>6Cxj˶28p_z'/54OK/wGo\8?NJyn!'9P?\]:DuSпuzN)'oDO0ʏ7-ГCi^=R~Wp?yhzE$*3=5j__SXx@姪h Mg&Dɋ~oyZヶ<8|<]MI`6|Fg^ |'=-~|L}_z>9LCjex_ dOj[O3 ue{K/Dӝ]Uony~[?'V$o yQ!ck#)vֽC) ݺql;T{O}ٿz'g/\k}G~~tжN^2ln wx?߶#&]~5|?O |}W'#~|>yҡ|}͗D^*O{MOq}+uǻ:׭WJo<ޢ~|2kp@^nr2C/R/>>l r\5oe4O /\`.o(y+s ~Míܒ3g;yoP7<8{kg_6z|eoIrkπ;78b)o#xR.GV%O+bu>qbr3(8CW#e\ ^Ds~3c:}6\st=xN=Ir;5_h^%w Ɏ\؇R1L]g[D WJ~yND:”CLi>Ymt9qKO]w*ەQF50l~5yK現>I>~| xP o26!a}WQ~#/͎Gv=}դ's|ȪB9K}GI,>@{n2g=笆>Vxp}hpV9_ɏf}e!)&O/GkUG_MO9\x08}ޠ ktuyC迼Hrۤ&k &ysSzN1LxF>#ǀO#* \XW0Ww'0}"b}t|'OɃ;ѧ4}s(H] \\ef_:|!'Ljc^oEO&N6eFOǔg9:1^y^czd,y=\O'~}V^m^9A29Ic]MGgO]{G#?yuCro> x!Գ ~kC8 =f|K d}7W"^cOm'ˢ;,ϻ`G}s~za\`OokGE3s s?:ykqM|wk>C^z_ExtZݤҒFk b#̣{=Uі?zPG#Px+R _^MsLثSf> $>ꑻ^9QM.qn FϨ+kM_$zP$>"%{ =r{o` Wh9|/g Oan7A?t@Ic";=, EC杭u~ϒP)2P3g5]Bw:8Bb<\U{|Ii53q|Lg5~aFq;dΦGE'ȩ P;+ϯG_q7R?y0z^_s!y y+W}.~-cWp?sea["y=g$tν^X T2H'{? v=> cux zm*A~2>WO2{A}^8D=3KÔ>a|/n1p"d C'Au,*C;'}Ϡ:ƽu z$+^Z99"fΨsŧ1 .%]l`~&PE.P{A(8q}xQo1ׂr|VǬ \}ѷW}p?r%J}K陴gZ;f旓WGi༳]9pz\}I=-w'yA1O%[m3"+ݾoz7cF^wϿ_~$/fvE|t }|_+7x\J\s)oHJ;H W3 |b%j=綐Ys֭CU}Ü_o`m@K>i.[L?e3_G:|c 6N. #q{vpT|?= Nvx~cu|ߓ_8Cﻇ|'~y~B yt`({4>3o_yuUDt~ 3]^EAG8|]vUv޽ȾۀWiK@_Σs}2< g)79raZsA{P^e\#WzCw!{ӕs+]jEauk8Vyq2l\WIlj3;'jkkᯇ&zs^!rߓw&Ϭ?W׾`)}}=kڃ_wyJ9V{͞^n;E}}h6}+7 s+_$ |cߥszd96U8tf?.>:X3#soE2"LC+^H={W!l PF|$:pn@SǷXԣ!*5OBON, V_DYt}[>JʷHנ\}. x̟~(~,= ~O"^GΒK2 /c ln|1y@^d^$gx[|nM<߹.{n} 0q|M ͰaK:OSSBw#'n?wtE>pķPM=72޻_󾴹s [.c;y}+?*=_0X}yC~>a[bRIp>ί$<=g|̕қ 9&ɍPq ${ִGi%<9%๾GK?w稁!>Fr6/?a!a]rxu>8WOlSpП{1ƽ)]@=Ws&\x/m[fϼ,Oyr_V_WJU!88igNp4/P>} }jin_n~#ݗ<&VYtoyl3Ao'A!߄GG=e\9{GޅP?HEW NKnBךS>&s@J^-< 8[{~OSoE-#3sɕ^ʙXO@*=߉ߙ`7baN|5 U]lI'ѥɗUEhz{ނZ(Y^ < e ܤ~Q-QгNΎ~c<7=dnn]ɐp,|7{̻-??W&'>~|]^RCM21rl}'- ({/؆_xz)#;!7T,>k&Z}z'CRRLi:yy+;:sL~lK3ȐC 03yX~b^􂷳 r/Q\>:W=%d])fJ1%}(}Z>/9Қ3_{7=/u s|^DžW kL0i%)x,9IOW3}E9E8z῅ӐeiaE)pCOQ} B>'%c~m4@t r]vH'MOv~}0+\y>~Iy?3˝d?_,CVo6辻Gٯ-a9OWǔyjZEx::@O+6J&!ɜbΏ3'O):3_|htUr4Okޔ7CM-%?11r|f߮pދ?PI*e|?\0''k΁+drWp?̉ЅzF~ &c'Y29&s&o+A?P;|6FM鞃wHgWk{9vvWSz-}X!zD/*V_=9RZIpxɑ1gMoP}GerSۄce@C>hFcMp﮲9Ui]4KNQ·H3߀ iV*&s#Vg}Inow~Qx28x*@I]{?K p~5W%^a|[O1t; z,26`g3._Ksߕ $ʼg4..Bo#&xM3\BJ$m_{|Ks=\9W WXY=|/Eфᙣ˔^ۋ~$;Y9"C%ҍP[a\631ờ^anqLw2::qtt]s]Y!X=+qI'e%p*Ct,Qz|-]P)|I0Uc9>*'=},;#0 2 Ճ; .Bb$!Iw;vuʽWriR?^tWu+y)6@}MG<֐8ovF`I7ks(gY=cY1B>%'Ϗ6Kr/-{<QU=x:(/\Z7m9Dc&ѱ(|  9~J|N8Z =6sDrjbp/O N4>`? \AR&o=D?:N7v=Z Jc>:Z`%8ūG;#;"GM})}5e p6:0g>)zGU&kfM[~>#]מȾgiK+/}{;9qʅ'e{1iglF\~\¹MY{߼> Z?96|x|)r9W[ 1/&f ?oc{~n|rsu5ɛУܻ1xHpA./e}g*.R?t:zvoSZRO=<7i!]˔STϣE ʵsb$G SGA-Z>!y .Q>nO ' g|uzCQJuaty>/ ~4~L_ wT9z^~+=U|e}}| 0~EtГNm:i9regt6m&y5v ݣzG^9?ϙaܪXS ^OA@8&8q t3}/@N/qq%x xۅ(!MN4} q|xwG#O>Y+k{ջg+Wr-n>⯭^O-}_/KT~|/t G9Y( Kڙ{,6f}|)􎑓*n_K/ut+Ar$[YYOǧn=7/PO=8Npc'H˒S?GOL^px(\|\)@G3JgoZU:PEx7'Б5eQJ<$(o#z[L=H(aݓL%|' vMhs9Ϝ}x1U Y8&qS>3INz>oqr<#GsZd'bg_kSBp>|;$~ʾW¯'zn'cO˿lG9ѧ[jQp|w=>BU <zpN8}s8MS*s3 4ѝ{<>s)g|Ês&_^}ϛhe}jU>?:ˢ\G$8ZBq A'{fRHy<?]rt|if9w|]zN4I]r J7=p. z%r`1E9xp+= }JA[$<Յ'A KƸ_1o_>w \VAD=ϥ0>ҋd!x &_o܋֣ry;)^By]5D\E["tQˊr.+҇G[i쥑~ok窮}r9C{AA/%R0 k/Cqm6&/&nNC/Oq;R|Ӿ/~͡ >"=K~}gћq}wP}="|N璼pͧw׽{Lj|Y5~ __OÇo!/}].O.׊WQ~nrKD@?{_zW(/a*}V%/-Jû=yO{6?ΧZxG]n?E!^46twvDM%_.=IORG92zyn5H/vX==I^ܻCɣ;Jɥ[!?S !^oU/|uYt臭^R%e49m=9m6~S.S5?{WVNrc%$eںatʓ'_!lU'M5[v'G|<:eC D"1` {]礏\x sc'Vu߄uOӓ?\$/os纰2za| 7C| t^o\3kSZ_g|yKkfQ{ge>A?9Q F1@OcG+}?]1 K7@ 8uxvΓޟ `GеWs0zN쟋[E'yb'%}l>ip(:OzH_}Z_cPFi1qΝ F(*OF~|iiF jwhp[yJ^Kg/7iyA:y"E`-rlk}@i8g㻕2 <ޗ&[Yq޵_~wKy1u|z̽.W ds붎B W!RD{Mj3lg;7rT۾7Gu!tO_ /އ._q?.CiثG{vϕF}ɣ7W2|I= {ւ x.gFz "PC=~{S.KgklΓ}{s}'({i=b}t&^h\!A]"+7 G!9ϻș,+/%|o%| /[&A-zÙ'[^&9^>Lz2;zR kkto^P %< Vn/OǸG<ϗ2/9Y5Ѕ[< mt> |(.OJy(s'~sε{#9Wϵ|fye9z%4z&6)1x&b :D>0wD|5gxN( /OPМOz<*zo'J{)od8<^#{R-C^63eak$C{=%ާ=~@5{M]BG9/U֏|ťon[Qm:Uӏ\v^U/v9M9u9C(7^&i\}+(CgO?"v*ؿ~|2:})tFz܎fÝ$Ċ'!-C`Olr/*]AȾqrs"?Qߝ@qDutK?N >kAysicB+}zI3w/_(x:MC܂#/}lN0yӧ^$>O~N;{9KzD>j}^kț;K.)>O)_z>&Fyܶ^J:f?9󀷂7t&}# @%pq_,iXxzIlcV_͂g{̧,;kτYz3jc{o|>O{6pxG,Ve/*({Sp {SL% w ( !Bs8y@r//ߝ!rJGG9$9{S\ɮy`+g|;o`KUto]!*r'CzRF?8).=$'2_YvOOVkH;q3<6sdz=[w\kߴ(`#9٫ķ N+җY,~zt̽rS?Ǫ3c39|aUxЁtUn6Cc]~Tfn燅ɭ'_t ~SDw!X 87MI嵝d?+;_OO9FϜMNrt֡+TzOZ ۍ/h"IYzRХ8ωz:IS7Sq\9&m7}/q7Й8~#7x'xu\]2ȱ o.rΠb/_zo=֞_z[]r<20e`o_}k6K7~> ~IY??ggW:A&{oA2)}3I܆Gge4o^oKRp·&['+K(Ey",0_ >fsNy:rJN07y[{[m+`_O?~V=0s_y껕n/Ms^'2C9?x* +W.x=>LH_>Ijy_34w9@9yCgX'Ox}@88g񗿞|w<}>+>nq$Jk]GQ9ܫH( ?l˻i4{6'=>N}V}1{[x x ~V=<1_U/2Fc< O_wѵf!gїH!}:& zc3c+a=x^pYtCW+q\{shP>vcNJc:3 n&=ۀ;ڹ;nOC^zyt٫y!o']<'["0FB=P~[o~Yu)#Ԛ S }A޴9?}[=0wy>Dtd5rފ I>o'8o:$:%x2 pL0'YKz/?GZІyO'&"͹%0#-bl_W(>ɯʣC [)wd^SY7?1ea [ lK˶~{78vFtWwy(2+׿^]rŔm;s뙄٫|ukC>?hv> T9|='9˂Ó3:=!K0{:#O=3D?&>pQ :K//g?s=Mto+A}̞酧 #7+uiua4&Jԅ^{ȶK,s?.wGG7 fėݪܜ&i{cG2Ws^{CxL~RB3'j{VS7ƻ۹Qqt`tE}R2ɍ\K/CG޲_կE~&/\%_d\q^<~=W9:(yL>&Qz=N-NB%}l[K_G>@GS1%^  eY[`^}~8:9g= F 1Ou8@>_;g_`ö0/;[T'fxΔkv]܏M부xAЯb{\!~FïZT^!I*@(&?~BG;l.睯fn(?5ws7rB<tɯJZ${fGS| X t^~_2zat e:48VžPs;#>6AyRI0|yM=/c[?9h-][?w%tvAwI9=Kjmx(.'?;?%p?Bxģ[!0{Zy=J y:牰/ ΂Gy|ol}.9|Q* f.Ire? :lZ KοM:4Q8G\O}mM̛Ёz:x{F>hT|[Q.ax[vʿSg~)~:>;џ{+ykO#6^aNA7#do"d?6NrGR@Wj=oeO}}3w.*/_ۮ?{r[ē7giWD|'ᣣ uGߵͺѯ~W.~!w3>R8b[Cؽo¡oo+܆iIׇNF#PSԋ5Il px?|zeJot=C>8}}AѷH*?}a_W$|" = a"G?i ԯ^GRo5_y|(y*E63O}aN=ǧ:pK;oYy>7>=dWs/gG'/Sꗖgm'{ƶ=wr#ν`|*sɡ|g.w﷤IK܅~hlﳟip sB`>8֯W_̽z)1WK?/i41?>Gw{:DhMzlp^`~i圌jKa/?_}:/<ܹ׬>1'Qu[rn` tfaG}'ݬNϮݏNYZM>Rӯ~f8Ϭ~oƷqtng_=[qrQ}=gkҵ'_ߝhyď*l}ʖ'.\`qty)N~`})P>W9~<^^9RA*N^Qp$ϸԧyLxs;/<kQx2k^,aip[z=}Ex6|h+W3k+ќwSߣb^|c.t= .ހ~[z^wpz=[t9/[W} wDN+߬G8ؿ՟T93潽_,8&arN sy/5c><} r5sP>yܛ(z gG"_y$xG:N|mBOЄ݊N\j6J.sG0/潚 : >Gk=[ٔ/sZ?wAw: &-O#&͟3˟Gfur':gѯxϳ(AS/9:7/.ԋy3y&OwL*^t̽x.Ѝ迕%<.+> /sm/”˧ɭUUQ>m_ wT~]RFE!c$cZ܀(~:+3yRO/}ݏ'^z@=#[rT|N L㇮݅} y, OR` G;0g$$37'@YCǐ>2{K*Oo|pq{.r>6 $CݬR!ztu/`^ x6U/L紗1w3?w.n^'_p Z<3|&܏ɍo&O=;UxG/|ש3|c Ww(>z-\crzאG0?:e9B {YI| Hq{~Yu<*7c#>ֆG獡ϟT.Mz+Ū>r/b>Uo1^}wbjWWe.ۄă=ݿF?OE}C]zE5NN0=#+z;˯OAС'RC:X⍯nUOb#O-k^ Os 6sh/gO3wFϣ3O_9Ľ< W60ߋ'ap ޷ե?.X:_GڇoMy>a%x}ȑ+ѳu'>NA0rwe+ OwzI~^it 9?rr+G8G]})99k'Db:7Ѕ*$93 r0o;̞|,͕yѥwi9szK|Wy;%KO s#r1W_yco'+_p}\AߍoJ‡onP*~-z,w9z_joʇ|K|Q{㧿=;<=/N.cvCۋOѵx3ynC>1HqyJ9c{axNKwH:@9RfӞUdr9{:o'A79 cn؎O~?>rMħS FGbhcO<-7xõ>r|Mo1[.[RkھrCk|] yW'Wz_v:or ~>zm3ϛ|@OmEiE7Na#% [ŹsloY_:"z ѯ2/y;zA}zÚYGП%%9A^b()rK?o0}ŏk!}8xϿʷ{b~QrΣi|T88>r#R^WbJQ?0lEэoE+@ nUOV ݨtd>{U陻,xD<\ܾul Tyq~$yK-z%(rSu߶0(Wo}>=o_܋_k7x6\KFU{ׯe9=NCݰ΁arJ<3g <'4.F.9E4yf^=|轜5m|G|c' g r/ }%uY 8.Υntv}$V +_V~IkKh3B?`qS6p%˞ÕO?s\e7|/r~*oZ.ΉG/zK$gK؅H7/]ǽɄ9?x'0|O}݆zvz ,Io`>Sn|?C|}o!H(y߇ǖ2A ~n4ߓ|1z(c z S\}ss~5aydk]Yt_G/t>&l^&|.W[5}uzx?"K!t? zk=ܟm8sFY<2s#Ofb-~{_J =-?ϣ?(1α˾C/:f·=hVOth1t.ʾs2x`upS!J#1+[ H;^Iz"e9^i9)B+8?ղeM܉c`^x'^KVw/JO{q QrZ*?GoWGGs$8~_FnFA~NGR~G-_]ct"?rwΓaob0.)ޒc~\T z8Lϳz֢SoMRK+=@.J~k.碞SMr{@sɹ?:{nI3Glbo?K}W>M=v ǞPyY$AWVC')e;  x]=&~>'?9SGO<-o12W_FJ;{빟O;;_sM9񶈯i{Z:O/kE:|rRo#xY羂NQ9B3+9~AsFɩOWk}Viܻ/K_ɪaxgR̍^lC+Ӌ7GJGWEQtgɕ|7sH}^X7N ߭]?0^+<71WoB^s.xckc74՟+?! #gw+tX:56yx,Ns?{eWz[L&=/[SQW_JGmm.Nn^|U3IL]R=/:N~_#eRO} +pRpwe6~K_q8,Oza}+{6vyk״n8w +yty;E.OnsrM~Fwy!Oqw]֫'ч?c2kŤ#ʒܓv@'}p|ګxaοK>k=1\[?1ӳC_|[֕g^/#c652V8ȥۋvJz8z胴-+9Wz˃]93WM1KU?A"8OS(2>ꗭ{[FW=@RȿM5dU)|ye&S5L1׬%c^MKS` 2NwxR'ȏʠoŧfʁGge'{p p`WH x~[?\g~Cg򹏠T/0{ υx$#y#U}|{+\Ud?A/o9 N_(w{MA #":#?>_*?ϯMW8'^Z28{M>s׳A_N)Ã]\# 8 ~xr" ])KE\ &0Fz0k=?=Ws&5SfwOqziK:v-Q'^&n@NɑvdcW?6M 6G߱=}۷X G_=/k<W0~4,=#} ^x /ۊxU_ y"&{~_}>qc=)/n{eFy\N K6rn->y>)Ws'pN䟟F^BG{3?쉂mdn[q7nETG[y(zWf(ワ[]>wSys9Nw|Sѻw[Uum]e~F~* ȃI˂cK{: ^| V~U58_alt> x?#‹ũG^^ 3W/])]܏+t:+?ϳv~F;D{㦼;hiD_:EOO[&G=9/zԕ+c=<3E79bʫ&oΤJg6Ȟ{i+FWiZ>lw܂/D`|\۹GЋQoFψ_"O{=2í#^Zy zv.F }\(xTExކųT ;?"Mxk bO㶓0yPYI[EoNs^Ѕ/J~ qp\]$%LR4'm3߻ncD/RE?_ \24^E/]} aK:":(~y.t%!|)iZun+'sʹsŶqO(wC~vt>E uM ʊg9  dnKGe,(r̀)?k| :ld٥҃(ݏFq?}s!~C?zO|:z8G`'oA~(Ex3鴔w=|f 7cPV8B qt%\l3%;89GȝKA;yK8?SW~> ~^\$96}N>k'VpPr%!3܈>G~E-+[L0Ǖ4wZSɡv4Vr|& ||᭗mZ[<|Bk{x.o<#//h7}| pꇾ9u^DH937÷iC|O6Yh=}y>>9FOy8ceqMc sArHnynt[qg_yw_<yH;7+"gyrMsU><8~9) ~rxdƼL.8da?Nhғ>]e"՗;|>Bϐ#1Sgj=% OS$9/GY"7(X%߆Mqg{@C/`VU|EyJ ҝ\C_^,y/'[>2=sAZx<96b|a#Iw(?Z xT.~ a_|3gS/ҢWʫv?3`VElS̝c14=#?OYztk2𙐣o3Wpk r?k_Slxo3A= pY\ *8>~̥ݳr'C[eNË{#=+|C'އNT=?i3%"oҊp+b丩y}cXL!0\ڦ-Ϣ9Rz 9| ̿!/ЯyI/N ҫ"䕢>n4ߢ?ySC|k|޹Aε{=\Gya`U"a'T't%}H ~e)|luGSR? ޒ4s|Ot J\x~/}W;t23|P>ϣ >>{+ oCr޼Źpz\*|[+>[M`{>/m9g>m7xA݀zV3[eVطY<8wa~N}W:o?S||B^Nރ|v5xw2W:;FL.+/y+'E?x}ڲpoų̡pWF|(E˗_CWFyzqtaro㹨(ߒ>xrJ9|$V^I@7ȣmfJgYb? q~t~\YK|óķw}>\m}~ApQJA<7>~-;=&}S,K> v0xr"v1=SV1YY̳9NzOWފ>a:cZ#J|+2LrfԓXEB_\x|ϰ*x0xi[½%|*_Jk筑sz_[ !tE;P-3g@A{ k7{@8}d~_}5*FXUx&|5p\]?=6|S}?ƹW?r?|W_}IrOPR/WeB#D9tE_7V=}i.?z> ?/C~&Ox|}1yDvt`y0Ytc>8m=x0=k%7أ%xe%ɒ Nw Zw.V8W.:1y!{z]n{ɀxVq49T>;A~_޳vn| u|t҅rոWR;: G [?pxo}w"{ =9x'Ozɳ9$O,s9A3#&?+~^s)N/0yM#tGhAA_VyK͡Ӓ_ gs{uc|NU|Ѕzq:vNy=}BE<re?閂܍~/Y |4K ?4k3 |wQɁ8zR۞鶓[%erj쓛QVK2Wy"r$bUV .~ k㯣c/4<O CSDw_{j-e8(8};UTn<߻|V_G-t1-!Ԙ蚔 ^L'l 8oɹseGl ǫϟz^,|}%~a+x?У5| )ws}oYʷ.^(48휸y]TxAv'|R묿7$=3usK-yEnG8W_[!|Ez:89aM^{@ГAtʿ(p[\/Inx~gmPxf*>^v|˷_dWo_koOVG}|N_|+(r/=>0 )DG.}K!^Rt<H{Bx.)^d%2'y/9bqtlɉ?>S"g>: 'n{$)zz]䜻sN*7I|$UsK߽}Y%nzaΛ(D-.YWyJKI 8+AOh5B.Sܥ<弯SIteyt[z^Հ't{k(7_u +ρ4}pqB yz9^]ۂ<[ߺw;?7չos^zW-P :y g.\~y%{r@"Ʀ fM$99gv,0OY=h-h錔K>A<5뷒#yَD[{Sscɢ?ՙ7`>ro v^[Ny/c-RrW*x8wPͳ*ֆ@dUEWWO! yNQ@^~ S~p^MΟ%HܢG Jyg芶qT5i8П/7G75k8z\(IME79j{] zn|=hrL^2 CoibLѳU3cbF_iVU{_9y)7G{GW&_m ܻ$:BtߏM /K҉]p0gs3te /܅)>?}ソ=Ν sOfs|63/w[H/}W HuryoYU줇.R=A=<_򛔂W35iYer-+^Yz40K){'2f}7MKx_'b1x&+%"&ߌ3~qip(>y"ٛWi[I#) ?_{;ߓ">8~n˰G+~9v{w+>]{W m[)sf@n)#[ɇ<ޞ FI\"HC+|L_+޴ͷJ'zUb[==V<׾4Хc|uttE:s{d O}91nnE#lo#'Wy9L]EgvK!Ix`kg/Sw۟x8"iݏ:䧬7hM"tvul$>COꕩ-ѣfΟeI KǥS}E5l\7 Nq[}t~bޛ5|~MΡ4ft?˳} z0kn|{\KM,F~a/.<*yKশE+{K+'\ԏ1^QQ_epQ \D=zy~x0 Dyt VfNo:ğ9ʕ~ ӶH.p &\-$蓵ysyUE|?_R3b_w)=6^C7Ofw?m89)g`WSG.0S:y^ >^߹/_o΂S/8_}xA1NJ0 ogn|kQ3+oʋ;d8[>Q?ż:^)ί^E1g^*2 ᫳s%H}?g2z~]'1'LU?ds;ZM=]UrA̷ ;gjTʫJ9aO!o O~tMVF~Am{C;K(~}}S4>.N(]9Wp}J{9;1 QyE3GN˽O|AҋkY][eӻ?=t_ ~@8Z̆ϼH~(;:wt6 Wmݯ}5M#[:N_.%݋ւP^|qYM(jܕ9ַyCOW_H o0OV}" k}/n%nx0>$V|Ul]9Гk/7=ˆ~>NpEp>B/}rG~`3Qx[#t>f-Wow4ÄO/-Ve;޼/lFrpNemzޠΓ\#+s85>=KM3/S;V >USP}wz Iz! =w_IsoҧѹsVݳ ;rts+ڧ3)OlkB< Y xo/cl9B*Gg?&gg> y_Nϑ$~,, y46۳ErOc!^zABEu}G\{}#y-޶\o^ WTn|Nށ^7y> ox|~ W=.S$}eIH*fХE=8߄uzyxT<~{ CODž@gYzmJ5 2~~:{ߢcOTO9 ǃϫݟw!t _z(0ˮqxN <<$Ip1ˡ0kX\9ʫP+Wd/yŖ&,^mpkx [= [Çg+~wsOГ2$}Hm>^).|rϔ'0vtfms|P>q$~@Jp ~{9-!r K/fyJpExS?5'0 ~`ޘ-2K lۏ/ӕy~Y]yt =d<zu}'W2Qp- v zC飺nGgĜN3Kgh/W=a/ȑP'sm?D%M8N8p=VxΝ:9Cȗt?}Qp8:F3:7XB߆ryMy\ t[[_qΗg$Og&^n8~ ::q~tZ^R $I*<8r"uT']Y^qzW ֫\BkgfI4Ϣ|ۇLJN6/)z!lr^Ds=^NÇe_Z+?f}(}ss=eϵ\ͳfۣ}G߆ީ9gO6~weȒkcm\i ϺCO=6_7p^3Bya>|pEiA];:IrJ>jxWr 'Kݔ+X1k6O'& >@>z%2o_߂ׯU.zw*W Mw.q8!EbqTcJ|K9|VA9{@;>]g_ _Eg=։`0y߷Bf΃gM{"ӓ|NS'vs#{]+&#Ζ}9ztCw.(xex-Ww 3_.k;}7N·cԼяN/@At"eyxI+|k ;+W`?{'>J[IsӷrؿLY =~ h$ Ǹ/س75tI-? >969O$q/b^CW9Hq>]?'w=n|N]rB*хɿ0zaW~^0zd< 6}'b}BWC &{ٻ鋔se9.ePoA+q?"GξNix!|5((ג.+7{O'M["{{^o.^ޢƟg繍JP sI57~{sO:S0rsK C=_ i\c!|Ut8G՗EOcx t@?WF޿C]rrqzo"ϝupD3/\MqB$z9ޟvWi%_9g(erkGL%=(w=E}7 q s^wSx<*Eϙ!g@f; Fνu=qICKl"e Wӑ>KQ򉷳7_Ы7osxMjrH?wiO:nb/c%R\~ C| M#SqɣsGW\뀇Plܷ%p N~#k{`Hs rɔYg6xp&pkXV;Ke{ Z=?!mU!79ܥ41ѷ)''c?L}Cq{z&4K]D߸ ~wd ]zn>? E>2K~^k^n{x_|" t ~~waOϐ~awKv^K^껤'}\0 >!'!?ovO';O3 n)}8]ʹ" \>P>|?}k~ ?d‹coyn{ɗY^1G{Wlù}2 ?s}'}ϣca /@!>!ƞ};HGo{ߎk'/'fn#T Ͽtq>9M>/daYV="-aE^G>.w̒X> |5XF\ErA2կ>M_~9WX |[C?҉yc:.~0~s(/{zpex{~. sr ã$/64㻽ܦ⃕ p}c|^:KD{enlgʫ#t-ؔ >%?K3x NoOGS΂E7+nW8{X߁_rxtYKrn9OMBe˔E/r'\,PkieSar&N:2/x^\3ni#8=cv'vϐuʙkyԋvracNQ)=SsVn?}ۿ)^$ʽb/;>>%?{'N,Km?빓>佟yb?>.NYemÿ.k~ii\?oˮ9/﷎wثO~/ꉷ/vӾz_uI7.5?'Z7{c#ušy%Ѿ؁O[}&KȯȞpּٚr6JҞC/{7ȷt߻w3W?_q!|U97]M}C]8C=+_qg¾/&~vy|_佝/\;zs/l3/η_xoO.~;-W˦  ݑ7_wß8q_駽oo<'0|t=;6=+G/*U,l1/*OpW ~O|C~rs|2M8sݾݳb#=ayG}=;8I7p/kGǗTb߬ a*/бAFɹGG[ 6ϟAgu7pu3xnf]qx܏=܋e|޾vY2gHh=y=G 2dW)Fp_6kťs>⋞҇)8iŷb!o9o:*y ?V_aw'_*^yi1ת_Wxw6|џ3r ^/•{W"O}ͯ x5<~-r_F=eͭZ|{ ^ؙ?~7W>4$ ^~?]g3g >}B{(xWO캴o<_n{?wC2O[w՟ %KS-Wvnハ?A&>sJH_ JC|0ڒE;-y;\ϯ:5%};- N~^BZm~g_>`a$}=h{kS}E_Y+:=u(wus}2ˉm#NK#G-O:-Yc]%΢PP%[=j3;| >^DɫԁopVux"WL!*.HhGA y$0?` AqչvRozyxޭet;ѓklkoC)ksd/~C\s?~4;JN_;<vUs乔Oq[V\9gQ Ps?>|'ɓNЄg_ɣUu O>*<`8r ΅ttO==>/Jz~$\~swu=wY>ʗh/N33Ku= sKN|<.4(9xiӉOyG_or _.WU(Oc|?+48ȣ+Enx{gpNWDZV"|r =0꩎^.Im4G/zEz8m}c ޠ ^=>DwD|-{g]%;G,elW~@EN lUm/:Rǣ,orzs/g95m!|yG>"ySC褴˧V'SB^-0W6A.r|r3|QzH'L~ i. ^Co*7IyxVm۽M|!)) ~sLgΒ3(Q2$KVȁOe/g.Gn@vc@Zs^—Tomr4EkH=S_;+Bo"r :GtϯyNKV>4y9=pI]o*3'9|>ܗ×>n6_WW.6pAY=ri|W ս͎yW{s!Vp^m i?{7EPqٻnZ& ^iʗ7 |.ۀ~"As eo8ab.H7m,ZC7wK\y|AG["$.Mw[GJOÿϖOo #8:pitutEr{x?BMhECݭSK;szCUda_)>h缿q7oz#'>0ݗW[ |+_;򩜞0/ {0g<LÓ_Btl(Е{O4Ѕ9 09NNȃǧ%L.?`{>ؿ=o948=6lOb/?_+癋{8߷1H|< n=9:νOQL>22myV=~Jڿ7 >=|oɋ?o@9‰? gyY@}׸sٕEeN>MS>aίQzN8yM-9rgSQrKVמk8ˇ3x+_= | sjח },?zW/m%CN#=^y< Υ$QNqV˜wb?g R}5Vhm?v@$?|ezmBã̙yH$871s rI-#1{v'Vggi^ތ/ >}Z((myyaGJwwoZmDN?tiA5wGs,ukF|c)e/& ȓtX߫ç]|c.'xѳd5ȻpTOU28|*:ļ\&zVCFޙusu2naHuأ䅤g x{q]/)xAw^܎_tE%y!=釰:HЧYBM[At5 lc?D>n߽B|9ttqn t_E'{.AN>{7'r C.[?WCz<5rV6/ ~lDw9Nww3_{EΣ98N?˩xˁ[_\GONsO9HJ^T)xo}ѩNy]/cu)48eߺUj73?yۊD zfF>pOur Y. 'E79 ~o$Ͼ76~s3{'yqzAW>[z~xb#BmkN +a"xs6Ǟ}Z9DZ{ܧ'lWt.0%ko z8}۹S9Qيo^ ~C:{|AQo Ypa9yt }N ͟' ,[w6|#ps N8lA*bp;9rScYz ?܃:|}I &#Sᑳc`;ɛQ.A]zz2?/N߉}]y Etk+Z>j)_徰|98g6;>oѻ,7I]:b|ʝRΛrC\Sa4Cn0Eᣗҟry;o}]"t]G ̽ig|!(Ipgsqxra#UKcT.0|T_qz/ԫ:p _7~;{}:>)JjxŜ=[9&cu>环!9 <ʳwM2ܫg}[v r+OIu9O *jssN 3ġ=I>? D|w̡Wgh /ʁNӬ8߰Mx;"etE!r+''0sh!w<7Rzl! Xm WG8Sl~'oϵsu. O? I-Z<9 =ۥu|#Sw`;#/ˮ13.7`oV<;ܫ@GpZ=n-QX~Gw?W~{>;:pɟvsMD9gq7_yo$zF8oNj~{lFz/eϴ ݳ!>cK=`;/3JT̓ƘWVSbܷl_=cM~d/ǯ+/nڹL/K'l<.7=R/ZˁճU']M x?BU*禎[1.yuA8%xS[ooԷu+ߏ҃gWx oKY(}t㾀_a iz./y~t'+ ͕gOO[5={?tx᷷+6Nh|dV^ Ϭ}.$7]|m)1V>=9 D^t =qT/;Sx|Ms弟GOu_rѠZ<߾8zknrLë%p^ti׭jk7ُa;ߨ>y5Y{+r8GoĿguItE?J_WZ6|<.o{gOϫ|IF>; C O> /{sPD?TAopa8 .{> 4_x =6_w~ 5侑rIrq7-ϿxCϝ<]W%9:^0[Ÿ~ހ(YYpS>%zɗh7ÊsMe\?Ö?mM_ȼ}'A??DKy"@bE9##a_k҇yWzc#G=t8jx)r3U \FG@PUKX=Z#aSpE~^==7ZӶ_u?gy"iy.&x>_)xAoc_}GGГ4M:!属4:Mo͟x'AVi[r{}?߳CD}ְ/9MO ەgOOApxY𡵁ų~n}/&>{S|"<ɼyt{wI|*y^kg[Bg'?8E-4xY ރO^kKY|XcF[ߺ} 9k<EJg| ac-pZ#:O]`µ;_!rzNǭe\]_ uLO_9e]_o9>a*rL|pYVz,;)ϳSA?fΚo//k-uچkj?|굏米V ~=b |=uw%`ls'/K\0zeGWM@7L)xýVRLO\f#rO\x䗀;T[?]s_|pUa˱YarBEuz}r3bΰ}P8Z!> ߞ>Z/Ztuq"?)G-0v}?]>ci1YOs|}hxCO'ltO -MzS?k) +W/KzZG>?gj}؎ێtO.| 2ZRSd{d?l'^,^yeŕgv2ݼd`:r/ʿtat1ǨoRI[׿l|ͣ)_ ~Ճ9ؚ 6~}$?򙕟M =\W9UM{_ 2!NAS:G<<498"q+s 'kGwP3z?o忿\)_þwt}w0w6@#^*t;Ё⼚?C|E;vr2rN4|2< pQ3kg?C XyzfIyQ'?ڥ\GXg/+5S |s]fףX#UC|+7{=W^5gI'yY _Koyq!7؏N?˔O§O0@76˽0^@/1ϳwT!G<S,S]?&g+է/4>i7Ho޿o~ {c[g_ 77wGxЅ$y2zKa3`V1AN]ss}$O/?:OM#k"}Y$W* .'v G}s=7/,k""B$7s㽙Y%d_0oVש 傽C[y{Vß*Gߘ=QWa7|ߎJ//~d"8}|/2w_5[Ky/S?׋,ǃ^~kiqu9M|.?^sZk倿]I9|!/}7O=?{2x {`\f\mB s ~gcЃޠwҋ\yV_7\A95\}r}"l}@ _PLcyN!~-+'p*qE#KG4WWDW - 4x`ޱ,[nuəQ6=~sYpǿG?q'#_̝m3)WI/w>ޓ8rr'+NW {=7<ߡ3r)cUV{v9p|9xZ.rN>FW-໛y~ş>OnO3=ZꑡU+~㳨kʳ}n h~HrҭB~jR){ _gDT}??_7ts } sIxȞ N{4/H%_"vz_ }< nI8s ەgo4@?~x+2F*~r{OӗdG{P@_2=TG;]8 z}Urbvemz)| /7ܮu Hfг}E|{7QNrZ&[|~;ސ)9_DCn(m?{L4?ܓ5 |?G|yӆG1᳣X׷u azFm |63/|L_Q{~Yt-x /x6/*~)v{/|nEx ̵/~6ar=N37 e$K niO$}}hg?a'u9F>E}҄g߈Ù 79oJ|Z9gܫ~<|$YF>zo"/[kqzp~9򜔏:\x >G~q)~#zyS xVZᆟF/6Ue. x D;IӃ~!\/Y 7Z*9\޺W{[Ug\8Al|YurɯE^.s:T)->Io=d]b:JϸUEǘ3G΍/yp^xj߿Ηn|;o*7R%'j-=[FZH DkSGd#ķ%o_= V$W7?O*S$|[se FZ\3`?ϰo'7^8K^$8J -1>\KX`?UNi3W<+?C~1^rx?pZ~ߏ<rlr:}<) ڧn@6I~0DjtaF㛟{NލSJܿ;K Sjpr2kKa>joapk(|Cws|p3וY5=uѷKN%!4i|᥿ћ|^y&k%3oޏ=N>Kn_^ dD^ GkM'kznAN][oWSIۧZ큇Zm={ޫFRԽfs":̝{/2gX;3j,n8?ȍ~8$9nեcnl%7~ 5ϴ#oJ-I3wûUщ6~GEz* qOwEtK"֒?I)-rm}'{{@)pW>L>AfZ_S q_q\B.o!3Oߋk] :yԻ0sOR^WIO=|vM\)N^LnXo?$g{9دSwgK^G{#I/_縂ysQ?*u|~ç|߶ATS\rΗQzvzlF/PeJ$`)tcKcy<țy42h^W'`}t>&9X &|$`3f?g 3e{g~Dbl0KQ> y98h<~wgoF/7_{ r _SW3|EGLuꇧԓ'Ыf|x1ЇeXwSǿ?LI'8wg$: :COn{qNU񙶘?Ng߭q9tKG<ê›=W1:zXx:{xt"h_7pK("O|{ztגy|b$JWoqp>ƍߖEELJPWŜȾ'& ۖ-~I|뤇OOQn:1wڍ? O W=F>rbQUWD(FVr"2;Va+ëUoF/I΂镫Ag^(0|\ߡ\8g8&~踦ܧQ8E \M9M.ZT3 ?K?R_>I8\$47};t^21Lӛf}'ѳ%\n k=?f{vC?w_GE-|xo{]o2MCζ9=>qpc&>6y~п7|1pHGt|t#6V^j[gC򺕧ytP?}v};?F:O^.fw뇸 z;7Xm#x~| ;lȑ#t٫WX/[se;^ȻL7d'g<#bQp"8W#~JO1Йvg{ ?ăvU?Su/+![N'fܻ('ϻ` C qDz+<6MևbS:% Wk)?dž9O ѥ˿]'%Sr%tV%~x5̓{5nrU<1QO}dW*o&rm;txYLeθ׿5忦OaYɟS_OϹ 9u=9=K)m_QgcP$f;Ͽvs)zAfTU&wՋG--~z5|Gxa ˔re=y~DCt=NqNΒG]tCW:YbMseNyiæ$!v r6EN=ˀӧZ60G= ~_󳩯f?|AkXA朲g3Dna~ D+,O4 O'ЀϪqN&'r̡ ܓnǑ~Oˡ8]~{es[7? /het z*ܩ1F^r? =N|<^gsH/~o]pKwƸ'|>%x^<$4)(76,=ZgKϐoſpfϻohU& %;Vzy}oҡ׾_IfsY|rosß]u6=?auu:́8|&p 2+9M|S<}YϽre7ʵ ׺[=>.~~DnaxWy!7Ί乏07n}IЙ|sWO}axJ=wrMv܂ &OWC9#߄oItOx72y,kʉߡ*G"zcy+;O==s}+݀e:}^_}'WvB問u/=0 ݄IW_w}EwOF9wjS5y>7U}m:oCgZឡ׻ϱS `g)6x^! z@᧛%4'Wq?4xgc z-}ee+o:rd^L/ո 3gLJMr29gY-+j=#uNws(|6FrüAycN3&Oֹ]kHs/n9ۅQ}$ໆ=W߿9Syfxfyo%="GrpZUz Ypۯ |3 U..>?~B?%=4Kfyr7Gk/7/6sv8N8}5x6g_ Z=谍kW?]y%xo*AVr7L%U# w#SKjj5(Y|:~+2 ?ʂ 8X<0[]$9H,'ߴu p=%S1_ԘC.E*G@5q:\y,hE:%]cΕo 8U9=|:^̲^?-,}d tB":9~~L߹|[7E/d³:s}7hBJ٢t}'W7E?9>x Q{LAtoH۲qW|1>t/1L|[L:YxUpf3b_t?qt_^C')׊ȟ xrmq_U/s7 ѻ:>.{|;Ӿ3v3eD٣e㒜τ/^} Я΃[Tt:r%iS_]`Sj}tMt><\1q4:\2y҃pLtCm}d_E3cKOo_:[cLpOW*Ӂ&:<݇iݧmO,ߋr#/jpF>2=+c6ls9-]U)C9I6qgȒ?: z0x4z*]U|)Wxѻ+MW>&9w2OmI;97i^/ ͒g։Gom>q}FQ^^2C=߿ t ^oW_'ۓ-|8Ofy0c) oQUk]|bstNȯ-m? s^6r~r$*wvѣ|\2H=VD?JAG1^Q}4偢'w'/9 _*7qsY\%ws-2F$xn#C3 k{0c퉏mA?ȽPދ~y{0{[|#쌳w?KWyf1&[{qx$sc~+ȏ>@0.qc{%|:+w%^=H?.U\0/uNs;L;Z7G⼐n:އS趚W^SFO=78&8E絃}xr:C4 {|cƇch/V2]r"K6K.f ѱ_ ~QR.y"|_eJQt5h# Ƨ>r_į[ڊC9_N APxϋL31I]̇uY~/qdMME.%gNGVgٕ8[}4?#V|m>/l4!Ojho #'_0r1>*.,cV_|ᄉoz?OdN``ϷCW臫\!JExؾy߾zm%%{!_:LWK ˖ڷsSwY/_T;=oF/aj7;cA$ +⯟Fga, zyX{\9zmRr,櫥ͧq>`YU|Zmˏ,P<L?`-pmC_C[??㞜T79JՀ9xG N93h,^S9_?csNJ;T:88n)?:In\Z}:v;^H=2nev > 'bitD{AΖs^{} .'9]n06a?o゚Zˣw'z:~/5 [ܲ$>O)mzcϹC~|ۏFs_w}JJ <?qM,Nscjz7b=,pމCCW"=@UO>|#8O9.9f>^A/GnMr]ȝVo0U )^-oBo`yoзk8#qt\Q WҩeD.;wzRC?vF utC zgr¾o>}toGfek3Z9x~-1/gĖQ}oM@KFˬ PIw*y3, .]b.e^(J>q5dyn^+dq{ki| ysn>/'^X|bS EsL^|) UrHs/O~n|Zǽy~rϦc+|,G7׏XyjxC:DFsQ;M8Ik#=8͹*G 6G=ʟw#89Yr-B.xxwJO?!?*;&|{|X`U=#e; ֭|n Q9@>~5 nJ_˧EϨsN6;ўlMBg+WF& 9m)6Ansr^$DU Irek'/3y-GgKnUoƱ?[\X= 7=?TG%9h#qwX_qxw+}?y1W}G֟m9\ >k?yM$?>3Sn}y?xķVg7Vܒk>6P'P<%7F5C? ^~atLJЙ)g[{oUnpr[A9~*3K1ޢ52sD]~|{/>!2O| tfdﭝk!>yA,zl#E3/OޕxyťWw/?G[^'|_/Fe\X|8< ~!q:VWx>c Ps#Ы`aIeA %,z f .{? 179×?H>3ު%tGp15.j@"~)ϭ^F?PbΪb~WNzTIDk7 y&s8gᛈ3,;Mƙq>8GI1Wϐ__erSԄǘ`~qQoܯ3kha#`%n|Qd[GɱFxcCܛwJ:\bpxw?9D35so{'W8_Zɼeiu{_ alV}]g sExw޺( ysΞ&wR9z,?Oi49TaitmK }09o䮚t\M|MX́ "U+.wهB| ~9tz-BTͪ(g)YMrΦ]Κ>d~+4 _I.S]G ΜQW~"_r|z#[t֤_<_5G;]]8S|YZzB! B7/[we؇|N଎Ѣ- 9޿},w)F01k;`b!4H3;;5י9qc{q~^x|9}_+gIb෻ﭿCdu4ˬיps?p ]u .Cg%BKy.ZyѽJ޳X3!y,O >{n>,~LmCžRG)ӓMǚE!o.7ɹ9 d>-s#?}}fhs!}CO$'b͵gMgay_Cg 2|i w:eWrgo / ~,:[˙)c >/Sh.X^8M|abM◾ 66ϥm$Ǿ?%a].}1[n5qCYDG?nR}(e]gZks'[&|;0<4|]}MS/AZQHWܘ4j>/K<'rn?#tpj(Rϫ6*=Z[[<=9zAtͶw!0} g,0΃OYV=y-_ _ęd/՚<@^!4yW{ʭ> Ggo<8ђVk鸖-!@udY]`g߈_=*o0I;yI+3Ov MWc/wlռ'tOU6v#r90i,[&; RbL_19GAzE0oTi&E JPeXK|~I O^Ir]O_}~'w=G1+r8_~YD+t m(#Rah ^L4DλD^0%|֗'FNiпr!Ilz m@_9 ?~^uo?HO?/f eN ^o/:E2輘G=lqJq^<{y"8|',q;~f|#J_{yh> zcc-d-_sYFrgs ~|<=kyCM z^US)|y o;{b-䘓X?.|$5j1I.&Lei@g-Gweأ)I赬DpnE{CAZ#%C?5ܖj^^PHɋ&_r!GG2=kD-+Ҝou}C#N'y tI =}_M.}ъ?E/9pz(Y+y ^>x}a2}&9pSfߵޓ=% ޜ/*;/i]po#}[3!g~?.?zK=>`haꏷ~Zz8r試G"z 49xΤ9ϜMߦ&S;ax[Ӎ4}͟}D癫&Y^ #,猠/f%#2~tsj\4o e1Ytt#>(F^]y={i? ޲LSiȓ ~rMY@O4s㹣?ZB}丙9y$/у[ GS7, :K9D sIV _] O|EkI}3KGx/ cVH=Gwiz(l{EA=WWG?ސ wSd+T϶frd,ɵM7?,o#M._+mU^rLOs矬W]_z/!s:r4.= >*EWc?Z tQ&:ȯX[N$YJn";xqQtqrI90{i/U-Βr߲wy\9^qg,9Mj jUm/Qt>_YtYt>|;|r(#y}! SzriBK >{ח}r?-K[2y{.C-#Lgql'w_MJZyC AS490 NWQb=|Gh^ȥ,:,,`{}'Nj%Jt;Ou_ϜD{ S$C*&_z>paU?W{ڹWh]OjΫ0' s.e3לG2y2a!-{n^r2Ohs->xާ{߯ S5}ùv'7,;<4{z/ʊ䙯k4WFκKQYBzv.";J{,S7]3Et eOK9<.iOy99u 9'+ǜI7ė< .f:GWVbN׋=GlpO93CvY|wG p?@es^}vW4Wϔ z=,|trr*L$}lKtm,k{ \s :<~^'͞i^s2OgЏ#Ls;d6Y>8U }09 R/00dz9K]&oH l~)sKýBg#.udQ#>tz]>.U+ '^SYp˿EW׌'gƘ+KӪ}9tL4Z8>(8b;r ':̡̏keO葂üF^9sEo7sF;r^zn] 6zM#gSGis%Ssܟ ף'iUgdZ^X/!K,8Y&'v;wsoc_nVSS79?vn/μ?K;Zp-ۧYnw~"X wSN,NӿׂuQX c-k=InMSd>74{rae:pu5BΈ:{3]}_! zx4}TZ@n看ËyݛƿoϋDbcZ6\<`=V=%spf}bns;{ާA!,~ZKs7ro=Tٳ >o Xz {]ϵ=많|<)9"GruD&\~=-l'< }EO[4#@/ǿZB> LZA4OcxI9>LM?oY'Π?7_(:$otMQt[' mt#">5}n=3i$~#89sd=u4-7Eg׌W~u26g1L1cﶽ/9R1A/Nkc1yѷOKwq=H_oXΞ'EG_Z6M|ES?9jIzt?>g7yugPoy>p|[Z=g.gKLٰ{=Mz޶{챞gѤYwtϿ[ JoW]V^桴lz}!X3 M|Okdj<-iz^|#`8(jy)փ#.G8/`~0=IJ>>pi]uv)\γMkEx>-5/ lXwx2W˫b>+0o֯ e{&t{d>Ξ^BOSya~ '-?Ix67E'vWTG%{~Ő s(GsY~e]iG,"n-'ty}g8h-xRMy1u5-gf$/r%?L_Ћ7_Nz8KnnǙ4l>ߌo3=Y:C@"7O~R_J \ g ;icۋwe,7Ktn9댏O3q?<)| %o4~a͆Ӗ9c=XݼE2tzDzGWˇH.9z"r394-c_f9%?~4o=HR6w^+3WC t?{>8]UDޜ࣒.kSv)3O8 ~Gq4 |gKϖ7<5y]ANK "Vۏ}j ?xl19V/H]dd'j7=E c9k_Gڿ棵ܱ&64=s. )5y%byI6Ls *ӗN\c?9]u='g)shM{,soD}>t_^4|`%̝sGe_Coa0 b~$zޓ[䜥˵޽ixuGb>6d e6 Wxjns4Ua"!eN;?3Y Ju_{z⋒2oN~7h $({ks.y׺."oa|OOU \H0WJ>z0o\.^ >F/=j zʇe9cyL07 xύ-M~Q*ž%祑~ 9]{5fхyC<<rmWҧML5W4^qyN#/oXCkɩFx>{=zaY_Bt&zg|\%g#[Nt+˷C,o}?'O 9D O^ ԃWvXfuIc޷{Gg0M?ͯo|_z'_x}׫t͟'LL'ܶ.$\η6rn[@}ߧS9Qp:]3"_bIMw^NMsM8D/EA\K}99 ~~XU'ч?7=г;a8s|AFۘ C,{ȺCѠWeG<|~/)*[~|E^Ws{69HbD>%<^8^QDO·ޑߣM|Oe2 ѧa yj=ɅfΠ4o< ks\IXoZ {$9O-n{9w1ZGЃ^1iFBS|i+}oa紝<9cYw,'< wWD7'|+Їtu_{ޣg~h$̭;OF! Ë߉o_=3l)|I96Orֵ63;O/-/Я~Uo僒hSN[y~^~/O5{?e巗7q~Ogt?y 竐=;c\ ~IpGIy _m4z|ir3awFr9Ḩt~p,9u |s'ɐ8pn,/Y'ӡ[Kl‹Wjߠ5}v͛wUi ~Z Y8吂Oky-;X{ՑBףn<cHǃ79y{ْ6>K6F{aʡK0z ЛNzĒ} 2/i]g!^ЕJBG8ϻׇE$g9x m%|;U/}ϸ=H[\/V>v|1$7&;ی'Ɵ1~l|C"|Ynwg.xϫ#O}RGqrD1['Jdϵb[_ϻ&Y I.*?g \c> <8Yr+4sk>]~}j{y{n3#;ɳx*ɗ~H^t:. #O|8{:DΌL>&i٦'J:_Ww=+P9.Sa'HZ˰frJ!y]0a"t&Я|OyW>. st: Z,*9_:ξVv>L]y#Bޏ_^'z_zVvG!zE-kwh:|mp5r-͋9/_WBj=c ryWܻG:pFyz)_Bk<ݗ%424[o=EZ/ٺ[3;]knTs̻ֆա :LC۰>~ct$>{t^eS0x"NY0=MG!;w>50W/gB 8_{a=q C3k#>caYdjÃ5vDnWo>m/MJ>pAtyCݾl>w yK.ItK&#m' Dѝ~jۧoXj8pfϳxщKo{NO]˾\|L3T-E1fɁK.z"ۓa:EMѩsՆ\z籜}!l =o'\#oZo|ΕMW wtJ.\q7x|=ϽG|7ϵ_~Ejz]Xh ={LuM~9d_MYDwGrC#xw_EV7i'oh=yJ >_ç$ Am6]Vri,Gj_\z/- Y VA?j>zΉ"9HW~a] ޓVz4$<:{b[^3zzfkk =O£㟣MɲAiwR$W*@?`cc 1tsV [w'5i x[,㫸3K%pQC{ɭI㧰~`}~F/:$[8U◻ѓc 9a,;n+\]IfQ*Iz '5d/{2>z7?.e\`7<}_,X;<KD-΂߳=,W;BG( cjxoCMaN&d@nܥ]g ?N[? >DoWi6~XuJ{,yy7^̒n' 4 X7O=!^~lȟ3̞dnB!ErME8445Z-jjq|F Ϲר JW=&A?1)WԒo8'a֋ս4=[exޚߩk]o_Y!?vmߛI =^ 7?ݰ}fůG_3 .>7v\:K6Hc̱wZ>JxGnDڬ_w1:˟JfgȁgXo +9R2bc[wR|R3oi2Wv OXwω-<')cpjO`<[Βfޝ{Ѐھϫ=x'e%,JC$\tQd/<9A˥>6jk/vs;"[wS}c>2{t}7~!9mA72}q|;OߙC9cW>(>U-\O$9s Y'|z71ϙyL{љcwL_v=zC9-oտO[fjr5M z: y#jMQmSkt-+f97rՕsQ{Q!pjb~͕.?A[ɗ?ZalArFÕ:~rW|%i:c>*W~Z${>M>Ԣ'g.it%p zƬ&c`U\e< $i0< nz6ބ(MapF'!l9|J\[n|7n/A6f,m$(zԊ"OCcaf_a|9)p/y| \I c8?< L^Iu?s؆J%ua.}>OtO L9GIqIy|sA橢?o&7@gOME}=p|'/[OdEIrMSlm8D}kޝ1B)c‡ mxλї/pYT!/.%E_'Ec4Z"qA^t9#{'px g眗xB{9w ༳;3{zU4߆~G$1>{Y࿇H{1k f\}:X.i!U 9 |9g\Isv{ƙ'4KMAWݍܤ/z{j9rJl?[[<>Zo✬wgO Ѓ##w7&Yݰǚ/>dUz/89l==w,>PiDG'b|Lf=>wq^Ws'y{>tz:VFN ?}蹟7:?w>Zjx<{ 9: oEcd?kj<?Q t:fӜ3Et/Q?w[or_s }S;^0p-Y^v ({M-p?# b=h9mb%_?ѳ[ih=])׀K /}ؿ}J" ;Ƽb zxJ}߅v^EGqy6_0xV=Lvҁ~os _|ŋn 'd~(T{Cw+QG\esz#v4WYF)t{m^ZFޢQFy}LOVdl-ggF!]zFɅY`2o$r"76{ bNj\ _g(Z4%:G?~-gF9ia|`~AIw ]a{8éw'GR^|Zc[o'[$^MeRnkEs=&t(5 fy3ә/m5e?Zط3#-EkTg9.֓`~a{m(#ClW[N/@^L>P7?_4~\7ڸhj(=jl$ގNr '[ϑay [oѓbqY{VjI> a$brBMɏ#~ߎ\ix2=@.L0 vgT/s@'|tz8_WEKy<i`,:$=#[Y_博N]ʗOU)P;񹭿Ch!Dz~.x)|soW qr|_w]s9t/w__~3YݵwhӾJdzU9SóZxe)nWRP~=Y GOCї]  ˏN(zT{tm}uU]<ŘK/34^/9ܷ ej?xܲUwܐM+|vկպ㻏,~fPnA*V\'^͟}-j19B$SRx=I\xÅoR{gmiÒw_^hs1:s5ߖ1t ;[tԢûʟ~v^ti8*Atɺ 92o_^,z}ߪm|Og~ƄN f{;Ɵkڭ`$7Pi&g9!M&m/(ռ;?%xrͳ[3}jpJJvWso}e-Hç-JP$,Ls GBa'._C8|,b/?o|Dyέ _;ͩ82pI' ʓ!r#%ToP ꧟h|jβؿs_~Ӷ/Lǧ}XN|im߿l)s-WbIZՕ1/Z Wze4: 9j~Їo}?)G,צ۳[{~?-;`PzB߫ \mogmo|Ù/H| }]sr͢ʃ%>Ww5BGpϝ$<5f9%{q~ٛNR[N g=>֗quON_ʉ$ zn~9MLJ;"Y4r)9}u=̼?;.6ך[2`^?}G;Ʉӕ&*O)I`ɚ?;ޓt^At Sn-r5sr+PpFl/#WreG诜ϱO5/#S\x C^|) c$_JZLOX9C8om⽲sdz5gN]נdja~h&'R  ዕ{_B+v,<&AOdtI!M[-:̿WF>OFw>>]CwR-qO{.˺|$ rlFg`m9n\>y0yjyևGx)ǟo׵^rSN`h)3AߑïZgJN8]>3܇e:K7-gL[LDBφ M0^1cZSC9<}^b$rLOe-*w /%IKgisnx}c3"IΝ߮,C_CA3o+ńK(gȑoxr݃B%y&~mxuHs.7m9m77aW +"lڇ~Id-?MHΓ+V׵|y|#'_4\Q3,}nMVS?]yoZ R֣[ёKTR:r혏enzy^(绝g$ OU5_6KO(:L˃%_9=@> } j>WEGXߒ'Z?s|*ti| 5zbp-zM%O^J{,գs3zd[z{?u\%d~/B&4 oVh0b]NVa~H:\Fg_>GP} q~,pS#'FӜ6Ǘry$paw8I/\;{.}6jyӇrigП%J[<9^}4=cw$6?gُbiH=}9f$d{-7{x |IS`=#8%7QŽ,e8"DT;5R/ztbCuܦ>+3=AL0njsxyR#6?wݍ'/u~<^~t{xCOgy7Eu_g>'y|j=IO?Ve婰/A&Fk_G78FE&jx,ˑ4xne3VЫCwFR77o}9}Zna0yb4י㼢QrQcWceY k+y=Z%|2Ld;:Qi =cjS p.x,ˉDМxUK5'f~(:|vɗ`n~ܠ| >3q]vӵ?8ΖJj]~ɏ~|so~sG#9yzm01npֲ{:s):f"x(oh?Wu!?==b.|RpA{osNBu~r‹4؏$r_祇_~rl!o< 3X5?gLaϑ:w }|?uF/-4+$xd#C4DRO`Q!=Ȑ@M5= x0Fw!tyz=/?xseG[ |We5a>GÌ\~>{Bv=3>t')U\hLGz [n)_$M}~`ګyQn)6'k{t87x^ di;o=蓭O5I?_ zp/ } rΝI$_+|?+?OI <}{~ק!j9R@h}#Dj xZփ-sFeN&`~ +MMZ/gw'2FnCiYnXa+RüT&&ntr׉5|>(yt#s>sl:}n y̕ M_a7L&WsھA;uy+$ R>$r1Mgd1|zG"ܗ\MB9#EB"kb[1Et^ gYw")tr)>Ae/>a 2ߟGONUas0W[{O4H_zS5Wl 9| ~f o$|~t݋>B{]>{l3Wz]?2!m7} ic>gG}BO0箾?..y"$OQb5/mN%J/unv1]/m۾O?ُ-U˿|վz$]}Fs}Ћ%O%qx֣cC3 yk4|}܃)At*W4|ikCY{/wJ{Ϭhj;0Tj?~DbIGCWfMVϟ>Cȿ~-y.dVO-p.eS>䅋s:zY_~Li{d+>4cyA^_ؑZ^k;_$~ol0?GM_-'J+xj^rg5:$߳޸nu!z7Fz`!m[^ S/)@]=89ˍ<>|bO9ݞo{^K'޻:n#Gˆ"'`<v ?XV7Ga ./;YBs:DN_o{wO mYL'i|pN.㻴~KC*s|:6} .d/)-ы3~^縷-/|0>왖`=[[M'|B7Dy:Niέ:Blݳµ' IYS|7OzF Ey.E48~8wk̺<25e ^ vux%y6:%{ YZB!{~79Mp*`yVXO8yq2Omں/qWS)7G}Fy+ǻ/0gG=ϼ#'G7 tF9x|`O<})yp٘ķZGy1 1z>?R'mG\p 'Z\#u3[:=9 ^z'C4(Q'}q/o7T+͵1?8Qcu.^kkG?ac-E]ܾ&ޏ Q#/I^n$5rn_lCm#)sױ\:Itf#[Uu{1o39ө/$'V'm+cqײ}"ڷϨ +1 1>;nwz򞴲p)t/IZwMߔzM.eNsyD: _|X~s7f.A7%gfjCG_{6߶lY>w}Gf&} ?NgDBI)qna zrk5s!Ƌ|wo_d媯 y~APAֿx1 y:zyawU}*?}=>_|]DQ<y\Is ;yB?#Se3E>9J"z;^2 ]=Wv óqjpzmW?7->HW=ϽRQyM]'H{REz΢ϊ #O#-㖿m7yrc,ga" lyг-聞g%N{ױ^kw%NS2sj8*sm^ۇ/6a FH I`{:<ϛ1k|L1nct>޻㛔hy=c}yx|zïܽNG*Et+«XzgkG38Q_< '7!p#w-^sc?eɣDHs$G>>X0ج;7GWz g'G{6ŜQ ;_`|ïb8ÿпxș)p;5R o^`eۇt±l~G=5nT,r9?.oȃi J e>Ht-㜫~8X/fNt\}FS o^0:8"D+9)sxqjq_R2mzGf3Lųb~znLd W=n5VG$oY¯N& wc]rvM5/QGfk{7kFq/WCQ`1~Lކ\fr+ЁJ= Mߗ^+aCJ(|2)CSN9Hd铴 i_<մ:&׬\;dV{_C#EMn"e%͇6@N,MH^vOJy}ط2U^+gھ;9ޟ a]^{ɹw'fH {9d=1O s~3ѭg|VpOR`N,HyOiwgًl#*oMZr'E{f9~Fe#LI{~v GM w$y^t`:5JK'UbȒsM$~g'듴~ |j8i'>xz4_%?+yޅuɑE^'ާK 2M_gHr s&@_?^{_F 7rܹ{6Uu~#z>:E#qr,u/~` !qxr-O<1{G-/|c|@EgZt޽OmM~+N2=n~ $ػ̃U82'<>=U$($>Ji磙7` ^ϒ'?藞;[^^駪I>tfz+% 4{d7irr?_ˮ?O0yp933^@3OA|Co&r3{n酏kɒqE͵)񢿶^iyZ%Bo9=bZ ~ :!՟z߾2W޹lWI:߸ZVs?%ᵀg4/_U8) -ZDyN{z#Tަfu[u{ Q*)]hk7_%Wlc^[ʗ)peoߧ]y}<(ԔVks -ar", b/;DN+tuNC1>}%{uPz_zu ]l_?*0k>_H38^%18G1}(k92ʐ uDG~4 sAϔ>  zfA7X:tR/|󶌯v\{l|ɡk˺3=Sj74[6v-_+GէR̛Ip/<>vc:=D ~<ƒ#Z|Pq'U_ϹيBTZC$ξ`=q~|u3t{OwWT{xo}}'{;VmdAgUۼ|7 92ocW'_^wLÓmߴ~E7Qsi-iS=pb/BE>Z^tqe":2?qȸg v|{'H#3x;^]ۃپbϥEGK݇> ?T zghڅ_JwUyzH7=:Wt2<. t^t1miEg孇oXcd󃶓@jy@GKWc<ϻEgG %'|GG>?~|}gϭu7~{c$0֟v~@X9&>ַCnOZ$ |s{ؓj n x2cG*;'n1K~2UIp(>z;I,}> v~rB=Co(Ju=kjN0Q~_|}>OTw3[v4y{L^j5w3ٟO K2AMTۚvy eLf8 xdjrG0x(E./9t(oX d * 'X []I=e20[<_.i^ӵW\V\ 8A)_k/]U}equ:96aS{'ҷNsB')rz tyu':01Y>ɏ2_O^?Xy!GY^'_\1M;Nn== ^}bwmc/Ay+Y+|N蠆EV?j} 9Gx+xxԃ7K.p#/b !XsQ6%s >j,Lyl2 ĤaDHwtN(){} hu-mCd sooώ>G&[|W>]N'Fә7h5v]Rb/^LsggEJO(ÜDM/ XW9プmX,/sL<9/Dx΁Q򮚘{]Bs8x$Fn6e̝oZRBGBNxVz8Ws}X5,rxǑC7(!tvYf3u_KuaWrR'O}̣OJidﷻJ-[ZOaLGunr{g=i[ bth=t` |MMޛA̟sjyvwVj*Uu%%ݖz/$=ݏĜ>E'&,y)~|ѹT*}Ys%B|͑5 'w<=apu$zcyv2|Ⱦw+jZ7dz:x,yWiROz]yj| YU<Aa>&ЕKC?7s$[l!z{-}%r&ɿ5p3zwuK`lJߠ{5뮼zWNZu-[uǍ\$/ Iӻ+=%EM@e~Gdy.>Pe{IM}iGg?}7w]^âY6YA'x,^rH;䖇t3oϣ0: -/?9呟RGG{=RwKgAًu|ky{]b Uy߇w^{ͧ_ t&|~smsz?tw8h>i+J~m#N7S65\ %'-|rKLHoq% # !ѭwc_Gi`8r tX;`s^!I9xxk!1\sy)'#z_I=51 &]}GF|e4ZɣHȱ_py{,Rpo>K /{hRt' rz0IOo%g|奒y~.D[ uX]:?y30v%c9 "yqGOλsFS'x}ceX<Ԧy.Atܣ׶~$~tgkR E7)V`[t93U~ #M+^v#!Oi9{7zcT:Gx~\SW^''C߁K/cß4}aY;ɇBh~NRџY>s,Ojdw=2E̓23wY>}|d g&n<ͼ{d<>^t ~ivWs_A|iq޿P䫿>kIYaz#-cw{Yu}m]3,S{|nM8$m|ڀ?'[V/i|O Dڣ5w}d!~:6:S9t}EBhLkVdW%=$9h\7q߫--K)9!f5D/YZ5c t0~2}t 9nK7玗ZC#scvp;녌;@^۹?^vy v<Ê 7o.eU?RE:|e9ܓ QYzx*w'.ū1}\N\c-GnO;y>H笯pnj~k g[ܷGp}q:CS/8ݧc}ϩlԇ? ת}!=ވ8~iIO0lQFY_}}9[a=6po;½sG}͏=7A.zIɑa? '& #{w({|5\3*ח\75'W+?PL04^u|6Ӌ9Oϧ[_N q7_}>z4^_pu?<~/u_cqt8?~X^''LGNt-< Y]5}2߯FjN !1dhUmO9 vϗn濿j0w=f|";ydzH j6XkgK9_0a|c9:>U[ʂ3᧵-9Tɕ3S;_p \ kg'8ά"zSu=:Fprᵄ=^Y}䫚Ok$OHwg]޷Nje8}ZIsf4Vɐo3 ?K~U'O/2'=wͯ,ΫHH.̓C< \3G}|ɢpR;V/ PrXdzyU}|f \j rNGN?>|w|+=OQr΂ɭ";_힄 ̇~r.ß[?r?|O>^b1xMӲ!z6?~YeߠB} ŗ^o9I}7>Uie>gq0ޛ$͟o\`(Ss=|ts{[ñm0$׷AB4BoX~N g=s{yW6~N$?'b~.ϼӫar?͇;F^{o*Ic|DTj4ݓը=(0mc.1y MFq9OFIWї̃;-9*'ܜsy\ Wܳo+V8Vl u:˽e>Y:Q)GY1|Ç< `^\K/I2˹Ƿ^\mn]# n}&g\{i,w+|FWd2}"ia}U~!Ϯ y}e͞\{bKC~U2=OjßMgF:/eGUds}a;puV;L :|fg'@'ޚAW@ay~ȿ~pe |ZzKVZ-|Z/|^Њ_g*{eZovzL:}TY|C贛ә^]fiAߝŵws.0ǭghoZoncz~oRol)8n `5z~U=Uo|yoNj:$4y0p[ougR}wQѿk{>tx̐#rჭP;{A;;,{71}*;e/G!pp獋Z|2?y_-}}62 ϲ޻5|a1 顣Ol?NKϋwib)Ywix0GFkd7?=+oI^RhNdsp/=x^޶k{>* ^ھė=9|-j;>y['f{WF`]Ԣ?z{Sr x_,CU\C3>,L/Z~|n^nrǭ9l%=x0'ohxZɡRӗ^(=,!70>??C `):{ݜ9,W2`|<o)X/oϳy;_5Z.d=|dW7AW|j'o k|g6h}|쯯b0x~Gn}o/"4|3^t9Uo_B'NpoF-^gW# m܃k}ir_|O1c3sW)7Iwe˸[G~vsA] Ͽ\xfdN}n{=mX%I%{zar|g3Q9g| ?x Ep.Irӆy6K>pW(md2 gMyѹZNEAϒ=W\!t\==t-x|*?i&V[WbnZ_e}:G\(qpW|;sI :Qx/Yp @ė=50 (3wFJ}18fN=9=OϘ"'- d ,[/r^'O|vN<3_|{ͻKtxlZ7-b΃"E;>:7˼0ṗkxw2tAr2Eü嫠/Sr GɅ7nݟz?Y]4  e_Psʐo һ!Ǿ'VUyv9TӵN\L³Ys_ɷ 3YQo_}.s9s>7hݳk㷯8]:]^Nn[P*DD-6K 7ӕ@MdRpFT'E:n3F-q7/~|JbUFn#zq%rڏ<9Zw2f=$_ʮ̯Z^^xxZ!{Zv ǯ[Cy ]dQ_K'wiZ< r|n\/[_P~?|W;=Oދa7D( J¿+=1|  řx"zd/y?}g}>Anc>5w?=Sd =at1w -;c/_#-ֿSW_aAyE׸ɱIԽڅEGȍ-gi2 <ʠhb)^8*cJ9ݯӜW xs/J;_((B}}0=)z^-eJ|ժ>$S p.w8rMCWު_..ŧc|,DnWGs-܋ϖ^}ܾHX1ln|` tc)}C r}|[WH 􎿾F3V?[x=un$|^2}xț4sC+8sTaSZf :| l>F)xG>-'2wQ}u~i|AC@+Jo]ooc؞#³[&iK5{ҳ5 D˝ #=??kz?;˞fɇѾO_-2<7^ؽ > и'!Oz m >5nWI/G)t"yUyh_捉S%HQ|&?$WsK|zX-z+ߗDɕCaM{48[/^疎.s7f祁aXg^77H9V=<U{/NQi䜰~atCZ}ny X_% ;gAb< 7^[a/tc͖7IjK%[ Ad2: zDԇΎ=\OEZ `nowTbu+91c:roߪjp5Ë/,i˵w>4w Z;7{ӝG'?j=s~.W>=@_d}:orRG[bSI%S5Jrb79^TՃB̿B||Y x @׼ }Uz~zyߓ6j؋B5/ &}Yi}.Pȫ&Q<=ytKTǴ}}wk)}:Qxu>6j7魓zQȁ?Ј$xSܣMdA7i;쩖#|I7z72%5e|x'yFjOmlz7xܷ??[?,߸gMZzgOяzv{(~|SmAX |n:{&̯,.GObal> )˲%~;-g-рn 2B>u{>1vA5[rrB=A !̐#){4TV-'AGVЩZt+PH3`rak}\oӯJM;19˷KiEf9^z=kiJMY_|/gC\o?>Y|1tTs_<=_ྡྷgKpNon81x?J4Xl͓+!(|q"Ϯ^'¼V&0k&j6')gL7G+7%'/8:x~[K9Lk{i\G̀/Zf%/ZΊ\Yվ9|Ϛb^p?ࣜ2}N>:=EnrJn>K3DߠVt9_ȍY tt:J_&9~\z&x 9uIa={Wr?tMS\q >pQ+at}Ҝ@Ҿ8~ֿ|f?G9#S[Qw/HȪ?^^"ޘ<KJnO[GQBy+ ]5m [n=4 Ss)m9JqDW /Uf+:aȹh=zAͅг̒?$O_X~r ЕO~n,V8rއ# }̧-k;_{L1O?Ix,{62~9=OG3߿b4YƗ0t8Wbu#SsU/<*=rZF?<^}XMesY}'}.dcG9vr6GUI#Yʜ65 ɛa;+P+f^_a:Mf_w璇E8-=oZKF+bOjǽ{ ?ECxN'9_q7׬͔2W~s(%rt߰xVMܿ{[@{{ ]nr^`/&E;? 9Q2myn{xI ⃉[j.az\9= 3=|"߈VF;-0+yZ.W<:);?ٚna_q;<3OtȃGgbDzOؼ:D>)<潲,zt&: ϗ,@e7qU{­4`aM3[(9%CIѳT$9oM1އ?o ɽGOȡ>Y"Ϟj/0I'ЏPŵ/si1]D#G1J)}4:s_3>k5y浇)2LgDO=zIQWϴ$:KOm*9:_W(,zLwSп-̯tE<|6xO.h >9|ca0,sb*S\$ϱdC;O0bz:t,mp1؃ I4U5ErgG]g N"1t[@kӜwc<҂xq=ӫC}G0'xf&K~֛yiğ'r2AYptۗ{蛢oy(؞^0iݜYzcl }C7>Fר}owb>ݟj:|Kq~lt~MbXx}5mǟcJb:MߴG~X><>Z)pH>&qyqE8r崄Nk5|GN)rZ_嚭r͹zyI{{;WBʧ|3Of/g }.fޛ3%z"OYo{/9O: AfEyz<~,>2k3'+|YYMSG\)Xߞ>%Zz|c3= ŝnWߗzoyj3 Ms&tg>ߣ U,zhy9cdiާ>>jX_“!#GUf?=a_Ö/M.?S{$y{Z6t) DZWZOj{G.J4G䯗CynCb}?=ßsb~~nG^6G>1>uRiVr'(Er7PSCK Su,φUx;yW/a~(4tӥϙb?M/{eZߣG<[ȫ%^?k?*7!"6z ҙ3~ދ ,qx{skG]p?W^'# &'2e5h?zzrq'R^a[ E|I:tj97(8+[ǸƸ&=gjzP K}i+tEɉ@_~Q ǘ\W-c'"{6kJ3ѻ+ tIzv^ S9R{"o܊8k=l](= i9g59J'Kz.l}̏_ۏc=K{5^̹Wɸ}]ѿZon$[.ǡy0?_=^E'?|s< ~ iw^"UF zi0^zEu9p)LsoXvrJ:Z_ 0w@'!|'N@$729ܷ\pzG)]دɱ>o=rg>t]͢Jˍg# ߻~4lg8ܲʿOI| h{/M@߷;8Gg0` 7I9p$(~qʅEpNJ0D$]Zu.[ַn@ϲsGׅG;ٯ/M+Il\|+יn=Q6׃QV_*Jz 0N4Ok5I?y^tiu7_8o?H~$K/ù-5sW`n|'cǖkaxz==JF^Y9#Ϧ%ϼދ_r/W@'O_vmGAk,A$z3#?Z%t5GQ룷v_gTytCX'}@߰d។0y;b>BˍzG)'[L?'"?/~.նkB^5?{~M|:Ĝ Lc~cyxi3njws]#;?>4A+}'CcE-YCkQ{(1>c"/\E~(^.B#8 3s Ymg8w}0Or#72?~9lN‹ZϘ彅_O1gF9#D-=ιy~Сp/xƜB7c?sc~3/|jߵ؛(xH>cW>53XL P3gS85oW#S̥}X$7G3?'oDuZ9FN$4|,\??/~7l,|&~|^uGSF{\rusmkui^'n ?Gщ-+0]|p_ɽk ]-|sGw0~p o}?)>1Et|1+#5>>d>^IKWOd=h!|2ǐ*3w`n'Q3} {${yx_%~|3Vɜg?2nÏ4|^wR)^D_^ϝD@k\#|;}J3]G_̓ߐ)x(?9+8OѨ.jJp:F\t60y Js ߼p_̳ݗ/:Ǫ+HO^u"LG<7jgwRĿA+Iby?V{{KYFSnYt}e|]tDp֒B>̲_3SZMT}uIN9/5>8I2/5NݔӇٞ*skOvof?{ROWs&#n|gnҏI9O2]T/xN_hWoˎGlɣ_8dN8vyZ>׾e~F?$go9>stc37)aXAeL#b*xG9h3[Τ }=wL7O`C?f/:]៰8:y0i~,I'y+惻Y _{eï>t03"svC{/$ ϷU |g S2K/j>suȟ/= ~t+kI=:qr'xIgb@A5߳pJ |O[ MGgj2;hY: {%u1q}Z`K脻ිR  z;tO\b?Όs>&+.U$2Go$䔵37}Wژs2,!m =h9vzq|er,< ܃#nNSȵidoԣwLG2/CS2F/0m-w٫$ϼw?܋FP f^WFG'lo,/<=3{̯zp*%q{3guEvWO?i>艞|a93oY\ EJÓ4xn9ry@}{Wo9 ~S :>QXjoʿOC.b+5^"~sTisrw"%rer&+ q%g|1ߕ)b_ 0wdkvKe靝m3.s'a'_-YpE;_7TkJ<=dNy0~c̙ :@7{.qtS + iÏr}0y/ձ!|^5zt9ٛN_g6z#:6n9Kd_1:e'ѹ [gqz譪V$[ONaɃOZ,[>+rJdK|)ra-/by3POהŚ?~YCu<<^=L^v#rke`ۯM nl48%?SJH)% 5=7kϱ{xh?zwY)A^zC}_7cT>N Zӓ'Ч{)sgf~L]Q&),vZeΝT8ү&D6p2?OãéZ>}πk&wwKNW.^G/N&F6 BgijqjI9;cW>#yѯ?}*_<> tzxti֏Z ,!7'H|~z7m.֖g|T} rݷGljҋ0fz4ͷ|A/9g|ݛL{_s{:~WO]W?/1z*rɢ?r;= ?hynsomc07 ;< {} c5`Yy=SsFp{ˠ&)po=$c|ۓ&E9{EZЍXy32}Dz.TJ=:np;pYnWZQK=D?gyHK@H a-(jQ>;,6']FЕWiy>7HS͏=Bc u|?('?Y ~}L }u9w?gxPߜ:~%CJMEC"n9Os׬6x+11+[&2;Κ/׷o7W^1t1;9{oR\!|L{W~|C[;Х{n&O@9u՗&ϠdR"O} ۜ{9bᘌ+aN4{?Ug Pgj}g$s6 k:IQߣ/=\Oõ#O_?p=2Ne${Jr 5n}Ư&A- ?LϏ75?|;_v[9YOd@1罗[^=+ܳ3̏c^.??ϛ`~DwOgo,/_~S>r%͹Թr"sr88سdy7nxp169qoiy1g]gHg\ si}Vlny9!&tM}WYz.wS5|y/:bphVq>'WgX y2~0bs|zz>sT= ǰ_mC7f:-ˎGoz$ߦJï˟ql\[*Ir?|[{/,i溛}7 w$/DY׎2ZG܅/0}=u7~?ؓW;<}׫~vcg +#zrcs2ێ?5z&͗wjם{_Vz{P #S$NN0ɽ3_J"zHX@|뱵GgJϽLn. <>jYRd^ }/0w%m>Q/w?P̵1MZdd^T:Nӳɇ!KӮH_^ ݱ MT̥#x/Y0nty\vDKezr\*j:90[ x!51Ԃx9r=-owmo{Xnܭ3o[yZmC7Us7r|rNşc m9_e::t==AzQ~*pGy+]ÌF/̏c 0X>/wwO9穣豔FWУՁc=t? 4_Ku7y<'ks.)эK]sOZTW.^^N~tEUz3%pD_/i^-]|C-v `sRYKDSI' mDD/ % C?oĽT_(E_@P,:^tD2{Ἥ/f!QgR֫g|ս̃c7_AY$Nn“衼X_T XwxKzt'R9{y79Y|yt{wM>У6t@'}\8yx>wz[ѷR`Icb0]a 2"R˟tRFtyYH =p_#{-w[_-7=vbN˳WP0[{CJ%һ"wr ̱e*O¯73kx.qzr䝙.f;s_Dk*)_gRtR(+$4Vl>rmCܧk(onGn9M7L3;t^at[(˗=E9擛dϴ^ob:t&vC2?d78I7sh Gqz;#g(BiE ONn,0y,1=sJxOw1yK^uyQ{ޭ'm` ܳTap1.o= ~|Go8\qThQncS棲>81tMq9ȏ _z$7b |u?:^g=\b~ ˷0Wq_mb?sӵ>Z^~{j9~#0C=n-"Şܚ/NW-IѧeЃcژ;R[ٷ޸qgSG_wA8% A>34πj~X˞9އuOkjkXC^ ^G^raރ2ۿ{㩁ϤpF/6Fb\1;x;WvOsCW1|7#F.a3GZ3gpsz#_G&[y9 a5CNfs|Π9uzsK(q.݊ιqr}& 1O鷬k9%W|ntr,O8 2?ptɉ9ko).@Np\{yŞGfsay_i9}mHIw_yN§@ocZN T+}/S`T4!:}E/;/fuQG F}YOr9/ns: w9 CsS(VͿ3<ޠa>{so=JE+ay@jGc1pӑȰá=h9#O,5aInr >7aayr7܏tkr>x,/wUEU)xmsusmGϑA ٫-r8c=:qwYtfqwy3U}+{`z1z qxڞ㾎s"FW7Jn&ɹ`\Bl!ẇ^zR/'1ѫkir]iMngG^=kMsn>?{ Cl'%w@_$_& hW9W^c s/'msBjy:׼)zJܧ|.2x񗿺w-3XC}uyr6ǵ|y e,8­EΩQf9o: ♂FE%_K | ܯ#|~=);E##7q7n9Ouy)rφ6 jo)Xfg6<q?W>޷$:~j rb3KjO?cYO9rn>Yu ǵX s9vx%=Mw >wX ?O_O7`$G >/z~=Wwf/a9"=X+fMM{w$c/~ߏ7d<9U>x4s#롃KxCe*|~~9x~xjru}_ļb\ᣟ"΍"$w[?cM{G^!\+9j354z:j^&Θ|xvta%qΫg&K⻉/L$y.ʿ9=?R͵Ɵ=_FL>ϯ'~Sء[WGnPs -;g~I9r|*6)~-L}["Qε,C]8+ǷsCQXUB8=_ϐA^ysJ<6׫-Y| >G=u;ιY]GHcc?~ztnm' ]6;]ɍ6? sԃ[~jS[~6rƭP?ot܅~msƣgZH7p?}9z{o#- ( brV@"6DDAz]Kg{_6n-g{2d2usy<}^z#WR!?[rQ&KYO%~_ӣkR뻵\ztIyYx06/p.07+_Ћu[]ϖDLüO\{?wU+8oHI~s^?yot:1hwzx˂Z@$ 3svN1]na[N]G[W%oAv][فtEW r3^|O|Iryg [86p9/~xZ#^_?VߖY<`6ߍn$ b(9,Yp{6~yxk[3ϟokx97wjO5="72LNyW]-Ϸ| ~{ݬەEWamF뇑}niy]_xN5מ{rAc]G9zYCy+uMOOlSS:O!VYNbxz~yZɉQ˵b.7ys;s::W K#iǸ |9|WW&_|K2 aס +^~DO݉_!'@{94P.>h~u쏳?Z Nhp:tG$x}>j y2i/X,BΞ+0Oukw=/jޯيnu#.<M:R ɒC7Ⱥ>4)1Y'7NWwG dxA'c&Ha4>;u/?S0HG|8Y+$usKL>Qz|fme/aw3L$xG"_oKi~R}yeyEL2)z] ZSDֺ=Yo~d ޚjH ݺ2YN|m~p0nIUo|t1-bA[y/})|o[:@YH<3Ne{tJ|#e~bbne帹G<3dzy;yz2<*0"yӉ#\"S7v3QGpUG=_&O3;V}H9b0/E`ΦgWyyu QlfZ1u|r: p~o>apd=yWȗ#rV<%Fneyice-gi^߼/Ç-]gqoXt^!gyS7m7X<l'=INeog?"pYKCVJsf2ߤF/%^BN@nc XjΠ׬^=Wz8]9m|j=~R+VkYs't>'4nde}oi9Q)|u=ϥJփgO^9G`}lH߰{^Vy=n2Dż~x*<vfRa_|XH;=Ip_б]`cG˜Mϳe{?Vs%ؗ9|:p6= a#8o,,Ab(1[\-ξj+A5|4f޲{gI?A$˹bESKrozq,O>:kyPvۇm^ 7Ld{|(=~g~f kG"!t:̡w sKyZyϐeMtrv9t:ЋN0F'8_z4LK ]@|~i7w;9{/gn`]L?h3x>H7$N 'Lc=#cLU6 WXf.QK8P֐ayr%LUzKF/-7K=7x;pay㲽??)i kkt2n2Z>ѱ5w Sz^sق^\=Nѳ#^-!ݜXͧbΐzZ\kGZmB7,synFG1=ƛr?onD/[ř|}|Yɬm Ƈ@ΐ<x0{_ O$E.i9ltsߍS/OW~X?C&O=l衋$|ϟ;~41y _mAȳ[·3^=9QmˁN)؇ჭLqހ _F?3ZU\|˥$ߨ3d6t[a]YqT{mr-,W28ts6zGθꉗIùɑ,1lOOyFs/ \h}If.l'^ ? ZcO1h܎$Y/5?3$=E;xNw7s^ފޕu1`.?pzf>ˍGE^SCO>[ޗܰgg4ks WGW*8GPH/—WqCer~W符of?7ιjp9T=+$~H ˑ#Jߨ^?hM_} hLfO0L/\.Oqy[Z/wlopҤ@-)px@khH90:r@WsW3z4|Ths?];փ'5> zW뻒6t)$5ۏ7{I,\.cz9%.2h~{O]ar韰t}"D^]trI/xQ|wx؏O-ys SN29E_Ǻ{}ӮVF}$Mo->1Zi޶rm$:=}oǚ>&~fzaOF`9RB_2GΑ ipz],ȒGoo7zW3TI \n~-}:֗jyC; %`}̕ocߢN!4p%}>~j-˧ꃏ)\8\NjK{;ܬ_W =z̢g.0s<,:5=)R)1t .0~'e\Z#Jr]ޙ0?|t;xn|-Wmn=9{iO59DG^]ŏ7Yݬ ۔#z{9lc,o9 Y5=N>FGVw]7_Ox'U 8}]gG"#k=# #~{^y-ϻEY?4=C_K~XޖyYO\þzЛ⟛0ިHp|d+"eo^an 3̀'m/Gކ,18؃V}+[ˉ>|Tɇ?Múo,?K؋%I>Wu5}זzs+ybZ?+ ,XՏ67[?I4^5ǜAZUa}ҥ=87͟htz5g=n)&s ?<.t~[O4D+aH?Oܧ.͈yCɱw$~zmQ!k&QiKƈZoM/fh~gmHNyls1z!IGWa~ ;ؓ=k5oį8Kϝ~zс4qr-sM3ESO=Ͻj!tǦ3!W<#co e~A%Usjߖ9V C۝W2Gn jsi>6p(z8}GSk{eF`nNDyU2d|_~+Vsu3z |.?^I0tE["ǰz%^g9Kaz-9aj.|e[[dn%F'mOKeO: oI3&Ʌ|>p X^(iU_5"F@ <?`pa:\?~]s1䳛oL]ݎzr.@_y|aIrm0u&)@ i|}%,^|inޔ:CfYƞ ΩQdzX߱{m%(u;9C5m-z}N|.!tTaJ̗KQ3ӖnAџY]y1|XǘjMxzz{r/487T{~MWF^8~WW) ǰ2aC_{Ҋ\_Jx,@MuȌo O~„9?:&Y4~ /:0+uUXos?_]̣3lK'GIb#ѢcᏖ=]ދ/w'.r F?o|K[z+M'f0Dž́Ws^)t)rӆȳI/nI;S5B&b'5k/y;rUV^9g[3|?Ij Æ;މ&$c_Tӹnpfe/mj~oۃ$a9qpgѡk￈8o0/w%(^0P Nj96{s(yFF`Rx.2=tvu@|O|OIO%RUj7y^K̻e DFX^ vo~g~ϝ>Iisg ׼LsNq_tQ<Lg+iUv5HGxs*k r4]\n饭'}4\EZucl4^Yֻ\OGѿ6w\;9v/r#!O5DY=7zRxyn#2XB)t0M 2XOK~s\i}_YF+rt@6ׂ<_rl|IərRv0/D|yp5_\Ze|IzE%{Cj>Tc1=s3V{>94{N_֞ ^GE4z*aί9xN=IM—g:R}N-_+ vxB5 I}{?q7ȑc^~<0z:atKGc^Wf(9ye%f`׺ٸ8qpI4ʼ1gI){ o?˳蕊Y T~yCCS9|>HW?\`<R46飒A|~prn|A7`nrA#(IP%;9ot].pb|F:A@s/z=^'i|P^p|t;q gc2\j=rrn-w.~:$>_ sn0zt_>O7m:3o?srD.ynZiݛ8~ԳZ흸;{[QynOHh{o|ڗ/x/;3)ϫsT GqM.ArK}[0>2w;o2.|2bBw>hǶDܾT ik5|KN5~2͸{:m=[ʮZ#k|z~7Ojε'>_}Hc"|?6?,%o]0>浝A_G- 9gAp~p1p0k9[Fy|֦Eufznxא>O@7?sw-)Gă6L`oR)x%TMYm%x'bo+|O퓥Z͍K뺮L5'w,eqMz5D u|L U DMU,x'5悇K~A?f_{j=A<:"yI 3h:)˳!GJ/-|lm~Md:ʞYtIxט[OzA;*YXAoHםG|5a0omۙkfaKqx")k}Bij:Z~ݵ2vX zn~Ļ<2~I_lsC5ow=cC,kiz7o[Y9 ɕG$ LdO/26z0!ǒe)H_ wigT ߬ϝ\_M$Μ^:TRs:鋏|igLoR3=8{ߐN_܇֪N,\{~-8TO~yGk˻o֞G>?X[ͷl}5~I 8}o^#I]d}k?ʃ߮c}H/F*1=k]ߌfV1O%3:~ֺxVz [zVtԍA㹏rk)9IF.d/-gxEMgl_!/^$%w|Y2F7.䵅 o+l)O#QաO7o;Yލ69 O^ &;+6]o\~9)l|^-rȷoQ^Lؿ-6G9}`kk/jxWӭ3>~I߿/=Dmz&'v麪ׇu7n30yUw?b}0980蹗OW \BxC৖1rs<ρsПϢK%@''C}t蟅S 2FΜ/o~b߳A^񆖛%|v[]OYr`PNy|:)У68[k̓qũ2-VW,W- AFx?]ffLjutQ뚹ПhHsZӿϮM~Q[:r /DYzߤ,@^m%|L?8:\fœt =CWP/zz%@~%1>U Y$˜Aln>ord%s9w+YwOAzJS9z$ǟ"74ÞF>]'UI\,fxjnFt^nt~']7&sy墢h4D< EhGc#o/ӄI=J/xI? s}RH׽}ct ^l:i뗤?N֡)5|~1am$eriy?lkpeΣsTt=GgMgBo6+˒~)s}D8_|w_G]:rdrnNs 3X~ ejIWIGpMG{aYdϾ|D>>Zrc^${>|CO ?Z S)wt}gL4Ň1I^G\!/Ga _mfkW>Ωs_\I[>Lǭ|yw<=|!sу_~ I g/ɵQKn~OcwE kMsy>sIŊK^?ZK;?'!ivoG9!>seoOI5ޤJ_-Wt٪(y|'}L?W {H^|uG\W[H+ B7[D8epXr4%%֧D}xX]wwY?- ܇Op*#~rss1|k4upyٵZ|$-.j6>ݵgnGg8dȝJߞ4ߚ4>1~ 1LHN0gቒ䭒XڿPNp:9eObEH?Ji\-t5|ڋ/rgY~#f֏b9",gx9Glz'8OmdދjN^rUz#giH)ߚ?FK6i_{sZNv2>M-"h-^ 0h\rBqUoc%|| 'w3J>xQSrd`Ec yb]DNVN[{g^?/*dsw9B>^R=0:<34bMJBIzGթS>K=e&|1+=s\%-H|./rS0hX}7>j, Z+ݗSe>1Ĝyras+Wy4 s݋'7yԀ65l' pN?(@ks ۍ snSp$ӥXp}囓irύbǩϓ3仫 5|5El_>3Fr$e]N'o~wdrF9]2?b>t#$zPgiSsw9_ 7ct}WoJҶnܲ=ݻK۞_2߾.+>~/1F1y^Oc#4|L˛$nSk8-'nK7SyFa?MMWHΗA}5Z?H [ޔQ7ᳰܩM>%ܙZC~Üw>t$hy^IVt#)xzV/qu~gY-}LCE)۷^!/K:}9^0c{Y՞H F|}y}ie@i.| 0?n2hV7!gm3{9g">?etosbuGܙ #N"^}􌻘Y6ɟS7I+P~x5h?eEE~p!_YcC9WH%8<=rjBӛo.x#Mׄ/kU?2_Љ4`|Xsaz7D/=>!R{ɕ KG~ fmx'Ts G 9"{S[xRW[Ge;~I )GL0?ugxb?A4OK왖9|ZC(i=&x?m$S 7{eqLs.ZOqHæc/ߎq>!p *MY:,{M ?zާWfCz{x5۵RU7A#9x.E74{E73!=kI}^v?#s[-cO?~)rxErI[{˴9Ŝf/-Q1r{ yq>~3ˠ]i9joϟV紞榾m}3ϽSVIޡ4:ԭ/W߃(JN#k} Y= v/#d|jsj=oD?3ub9mu} IC_>[/>i)ce-ך7D1I?b-@j;{ %Ij=uWa2ީc\ߗ9 47=7?}#6bV՗i԰G75\˃͒8N~}ww":/m =7>o s>$ sty'co;tv[y+׳>I,v=| _\b ?%w|F]~x3νȳL/7J/u ~4>ؾPK&'9+J,L~j~8y-'mIGG|sn?'嵎%UT>d"ǹ{LCo7,w݆37d_#=|NI/{ku ֓r]i;Bl]g௧L{/_%`Izt~98íɹ >!H̍n[?z"t5^^YAtGD+!wYl1vCـu1ɻGYZ9̞CIrF -K$a?$G\+XA@wjy@ZϜ6k+JꎫX`% Y9skx赔NuaFGtH2ΰ0yqÂJߟ iwzaɑ-k=:൨r.ϳ^9Y{'=`^O}Y Ih[KWLO;_.gNw ыb#ai&G=/@˘㗵)};u}&K}農dk_枢gCC1u=<*p_|a(wZGC_/f|a4ˇ$O^^KnWWAd=S+(pnaDg*-K~/slo/GZ0tPynn)G9ty/Z5Ǖ$1]nrt{ʇΟ$w 3bA2INLg^poBaL?UwOKQ;g{+oICfq2&_x=h)b;׵9;qtWI+as6~ 2D>(lCNiWR\|DogsGw_]͑7\m}zOd,p4kORcR vSӛ܍ކ)iI}L/;뙥q?p֘&CɮXŠxŧM 뺩/^itO\j"~:i$g~p-kj::SYzW3wtbIKO} %߽F4!'j#y?y٨9tvɝ'q >A.Or'z+I)o%`u軡NLs{q?rͅyI"Mm9 {tċ>;5<$6يf'˜- >38bF~Q~mG:^J>3ZNf>,W7g.pZ[ A#r$?Ӟb~slP:oL?_gȳ<ʜs4Z`{D~H=z+ |ujJNE3-zN}"r-؏(Ĝo<9jnIdO?~C?&\O;c 650g:Ad_# ^G7$ \xC{_7s\>&zw< G\)3Iwq'i_ЏV6o4^v rOXL r`q&U»T <]w='>!>8~)۫WCMWsz: Zc̓ǽ9KyQЧ=U^=QxrKobHXt?l}p&_qͪ#/Cn6 2ZŽθ__N+qnv/GakW#W߫;J)X/%|f6rg7W{fK>{Q}:7XL7Fp7ϙ%+b_E׷}Ѓ-DGz <;҉犯_X/>* C#bC/ߏ*|[UC4.-=;q:YacW;tB,A}ԑ9_&? /HMizKS٣7;:WoSpNw{=QLrDbzܭ'Gގ|W3UWM?/CW90 :Dn|ß#5ݧSddNx!RCoþ+5-;L̻3n.{p+QxIAc?jwϜЩۯ>k]Ep}NBa\^$ܹzhZ>.NK GH$wN|UOZ^ޖӻ ~蚛n~8![ɩ m6e~Ɗ?WWy~Wi|ghv麣?]f$9maْJ~ 3v9l侱wθꉗ5/b> 9>WһB<{#VzPަ?[s_p᣽?ОЋwDPsWc#Qν.i{}IRn{(?K ܷ uu:*/ŘGg޺b_FO?˃f.+4N= 7ٟ? {y;xM?>ur ZD*r'cRDC襷} =gWEf֣R`.͑)i7##ogb~auӜ߭s?r,Ng'L+^t"տ'l:Ty +ny|H8 :sQ\I^ :G?`xi7>ϑѯ$Y&mrȀ8 !"Gd~n֟w: ͸g 2l g 苻`I5SGyߛ'`(:Dws)5s={`J TZɯ2P~ҋ^|dS0x(.7S ? w2=}֌__:qަO1VP1v7_=ig*[e m 1m>axWg/ha^2~-7n?Ou#x}wws_b믑v8^Α.z,#s!r,/zVFo>aq/ް}m}\K=%Ǫ;IQtfz$HOG^&~,71.3 W>X> ]3/c |?7Oown:+˹1z=;uD1wr ?yOݵƇj W~G~0$xDsE_"KHE]rXzN4~/ ~tE<\>?\+`צփ-|A_~rsb3}걼:|?%xML\w-wJ`G-~H5jb|-g-0< 2$|GY TǍjScw؃#μ4s_,{r<Ͻ |=Pׯx._Mb[J zN7趖8}|V?~\[y5|^g]zߵ^W' /˂Wn^u8zsoUVAg6e#6+z~?zo s[?:ϱ-y˸}SR+[_u|Q-G" iwy>Y"Y?R3c#Z6WYn:^Z7I2[A+kjg盎J{gƧ>DS%^xƼ&EfҍKjD>eatUWW>K?f/ipFDfC<<} Tx->Nm_}$6@'}ԲM{^C??%]Jl $x;QmyYp Y?O x`yMW4籵"߼v_sEQхKeٖVp8d l?%:a2&]%ٖIN.vu56&Mn3E#z% o{{~3?ztQy3>tC1Ie$^'kBlo؀~w; D"HE%yǁ澏{93C`{ =[̓i:2=n{tP%6Jmw |{>̧c^ezW7=.ۧi>{?Kh+ y%$=O'we\eΊ d >{VfWbM<9g0ruOrM1LD$-za'{ORr9b $Ϥ.,nF.w=%пD٧yV{.Y%^Zzv-cDXQ#y0j𕲊;?ev ?Q jT=9OJM;_NnJ}a^l޾؝kNu|1 ;Oy}m6_q׬at5/]\qHi#$eJ3o%ն(mzMVoyc5.qAc0xٳyDX/ ]]4P+<}" ^a"Wva>9#*xa~+swGγy ؉|@j=0{rдdS u{G_zٔ&tz֠-Y j9)r3R [0yMO_^f.kgI}9FR k=%' ܣC W]B0=~/6J,9< _+g9mO$z߮wbŭ1?[L{;AGxϏM_ws\UW[Giͷq/㇔ ~NB?Ŝa"!voa=+vRtˈD`p~SZAw#/}=5>rYz(y>ռ^T'pD^>rA.tH]o尩lyO+ߗ ?9{GASuo_)2$5w;Gh:{>ztP3sgڽsΟ_ů.~LJ/r;g/^O M\}V9Wm y~damgMNca$97p.FM 9q/(VzY4}tm+{d'zxF\lҷȯ|%=4O/><GfxCًN(93H>(9eϣ:y #]cGo4y)99|{=ϗ<<˼WX؄u 1}e~h~IKaps Nԏo]$" )? IrMBwT k$/p7$75z2:}z̥Ѕ%faˤ,ʿ9.ÜCjeu譙7xe8b#9QFR/[<%ȝ׌^{]&ǘ,klb4 spgz[.YsQ5m|ܯU|L%wi'9H-·V7o{)K4t(yO- jnzlZI?l}sr6OEalyQWk\Uk!ii58G)ɡ0^}}JO؇tF`j ?-'ފ<̓g)s#GVUB'-%5}०BwG?u@j%2byT}RHU^[Z n}z=߶mzSUu6Ѕz~EQqp[bgOW+%y yh{Yy5}%5 ~5\$g{O B ݢx#iwNװ(=M,qbYoi;;nŵգ_iӼ/ %wRdoEg f9]rnN9LHzNxAQdu0ݧ7o?/$W6:e0? axo߿}!#}˦gnd~Gz֯=S^("4Lk;EO͓f./db;.7>Uxb2$oH w(>w)e\t9rٜ\y;m>׻Y j"|4yXmnyUņ Oqe:0~vm#'3>$wj5?-qx\.~a7/h\5L.DN?I3Xo#sNDY$=7QA-w.uD a#] m{uֈ u/hpsGy>'q}|~-9FTs%k9e}eA^oyqz9lo %`}0O7:E6_a܁_\]no] [q2one/+d1y) S1Y|!z.{]_E}z'1' H0q=+/zr Ood=[/Iy){Gϴ},IV$ZG#+|492_%a6U{KƟ scfCE:&*e{D<Td̏[w't 7^y{_v]}:}}(5>rn~c['2{rx,yRfZkd>>4r\J%p×J!"FK|XCg8|s}cl>(;}:+r L]Vu_Ї oZx$ßg\QF {{s)^v޳}O?1zZVnh-> ~הÕ_^,W<7|m|~rc7_>32=DU_Z7#DUL23#Q/}h; G.WRu+q֭*-(B_b~Psby qOzZLHOsL?QGɀKn můHν8Sulo 7zYd9>z<y>.#@>=@գg;߷ %S(Qx-Cϯ郴^R*%k9L/3}tϖ[&%p5pMçNN_N\-e<˃[K9Cܷ1[i~rЕ}f|$ co*g;?j=(ƙl_a!9یgXˇ,d_ް<.{o k8w,s10'Jy?W1 /؇^A99_.~(?Ęce,$'z<Sm\(S }Gxy7K/H N31b)8` gM59U]?b2JtF2>-9BbDzGbbƙ W ^ NBo4ʰÑ, ,S|?HO/OC>erV=؃.x1>ߢG!@}<'i2_/_ Ng&1pq&y3be?^>xSt݇b'ῚM_Inkc%n~o?u9hs-x:e}}>~Kk=mX5O*;zbna1x}Y,/y[I˳˝} g˭.Eg-nG%1/z7:9J/xf7s9~*[۷,W׋f>rɚK%뗀cj[ӏI}%k>'|<r:ژFɫsm}Zz+xˁ&0&Jv))p]s25޻8\!?D: w yS7}𼋪Q֟[E/O7;}+n_*r6Z}ϒY#7?_@m ~?^:VXlyZm3{$jM=U9zeG_{a(~j$1i|Dy7,Y77r$>({.yN}[{72<@joЇ0}4;L3BfD/c ^ ߚFs+Y 3XN4>6 M>L>pN৫1kbŸ3ιSCBwsl뗒Zѿ{E5jַ'/rl3C~9^i| Q -~AcL^.2ng`v +2^C3uzV |7FR7Tu37*~̥SAJ42ް\0s/oxho{eSt!r_`S6vXstqw.{cNw>98ߤ>#z:4FH n=(Oz=Uh{κhPXp 1?דkJ+;F*ia$y_5Y pqs8)t3ۼ)8 دd9u\lrZ]=*?2}aeq 3B{'ɇ wo)p93[^=_?. :_{ϗ40g4!lgx}N+O 0>dz1sI eYr; {fI ,{a'IwɋFI_Që9[M *>=Rͮ#U褴HIȾO3q E}iC{ ^Lؾ`xuse'Q,CwMChSI?U[`S他.AS+^{(C rnɽOg=輲نۇ3³^r2w'Zȅo2W48:QCWJ-{g>gRF< 3 %,\鍇/OKl1|ap5=Ggu<}rNz;#8$9+k6\c`Eşo zf^o˼49ɳȞ6|oH~ϟBD߅3{'.l s;[=A2};z?l%'>}WH{6l}2}>վ<(sV흍9lw֓@OHN?zk4 q|6Y_oُ5ϙO.x|W$}K_9OP2LoVp"Ko<_ 7j=UYy|9Q[)yN&]~5:[b#Z)?d? ·u JJ%g0(w/._XGw;o&%kCkZFSv:i&Ϥ\88XY+y{,>S/7 3&g@6m|Y,ߏ兤wkؗZе |ny|y]G.ߕsVy Wz)t{}-Vݭ˖Sɉx48~:I&蟚DOf/m6̟ͽaN9a^P?1_ o1B~BX-M:(K[๝_xx|@C${\xXkD4ַSd~}q7:z>#ԃ/|Ǥ<9:?qdwJLqMz#zf%&` C?cxm}Zty!RǹW1)9j=KEx{$r9NC?$=8 ~ZF "ߵ\?N6>HbWOr—6ݠ+֤o?Tw,טyS?i|>q|n߽ҟκJYуޑ$#gO\ѹOWe(}OqyOxxvOs_NrM䏒t^;e|)=Gixq gq~}Zfg:ù你[[ GMNKlAϽ"'s{fnAWrnK2Ld:j95?) O)c>C% dao^٥5z/%qjLB/o%HF5~{  >tͱxIc O30WhvϘZ^ܱ!(}Sm=VieǪ!b3|}gR' M{Byx rEQ{-7].xȌm4uIyĽVM?D8H?9%q˥q~.Q!9" fc/9z4[v~D[軉~׎ ;G_l|v^j}I'=doI('ɗ?Qzms]+1oȰ&)6y;1|拚FIGgt.}L4 #< 0iey}ȍ[ĘW{}r[oSZ_<ߦщ4q_s/z_?g \6p DC|'@D<Y¯.+ChW`:et%C^AWMo:t=cG6+KX^l/o8m7 σK>,O޶=|q]$w\mb|{O;K ޲ u!՜hJi/jѡ,y+M㼈G2bΉ_6v@G=ۃ8ߊz$]_&4@_Yգ0K$|7ډ﬙?d92J4߷,zr̹9τ*7dmi&q:3f 9IJO~Ηޠ|W ma/GiG|䧅y_N7gtZoH?9 |}ѱ<:1FW#$\ky=}ZΚ ￱os} vsFsW=զ{U)x66 sh9X>ggc@0)95p/_fdctm_~Zl]yaզ'ߟ;|iqK< rwJ}z``ӹ3?Z&9Ӈن>=Bbu??.sBNx2׿#1 u:X!t^N/>׫ygDރ\sWLbNX#4`qN[3)›yxZxa${3Wq$t]iòml}a&rt}\=9w3""[}w?b |Im&\f5D ;B{sYs+yU嘤ɍ K؅?exgz2O6/F}ܿ*/9߶&q\{AOیߕVNzmX\k ^ 2!EGC?a_=޾HoR}aSX.n&Y;S6>1T{ /[L~F}Bۖj=RZjkg삗j5^*½`=~W9td6 N:ߜ@OcXu<Ե+Gi4 s >ꟍ.1JDqZQcA =/]|ax/YzSiwfQU{r}y6.Da6_FSgiɫ7>Y-um##7(M2"CMg-sx%wg9ފ0-ךu'8 |qENw /fNn \R [n羋ʥWSEuk $g=GnQ/:OO5WJk5 Ngy ?tkhz{hYX;ͬ7}\ ?uL7¼*D}Y,1 N [{/EϔEC8<:sVoوONYߛBD5ݡD+:5|~<9L/~ :%I#ƿ!7WG3%Ng]<(t\QBS᭳ o,s/֟:?"J|Napw ;O 0珃{s>Y?$SdN =vm_M8U[fo|l~ ixz,?m-xq!'ng~]O$xQ73:5W4$2/2gWsMsf4i|}3cS mI^kӷqO~\&iףh_z >g0<|s2Uz ۅMrm׿$.i-S)NF:U OwC[jO5:GG,'߽{#@Gwd~< 'DN?WկoEr׿5ɏOCO:{woGC[ޞT{/9EKIg#& ';t{Ǯycע wj=?ne3np{2~~p;|.N :{'˾V*o7Ú#? Cgu.Twgv^ty6 [%']|&)|ܑ3:'|j_0~ ʙxRHgIds,kݷߖ?y>¼__g!<+omEh}YcFo (eT7O֟#rm,ct %<%xK|!GwXZjރm\zu@Cu =(m{쳖>G.iyso  a~C7:< և${8fi9L| ȥV/zro Z})j# Oȹ#fbQ}e4(OJlq<Խ'deأJRxQL|ҷVՈסx <^/`&G~/0?>4v`9$| ާ缗ܞxH -dᅣ8/hAs7/rxp/N/7x|B%ou9gN?"#37y=0(so<@^cy)mUf̓w[Omٜ?܋^%ϗ^j?=Yx"7|xW{}w~PE4CK~e-o}"îGUF449EtQ6:$OS⹷>S*Fe7Xr}<( x9l sy$~,Ә'g?,9YInT \ ^̳}}`yek9 >.KL3'ods =ϫUKL0ҏܩHoȒOXbo0>yqx0{[eZόEqz1M_o:,eW:\)rS5~v(Ku<܃O8b~k/a:#_Ϝ}+9w/78_4# !Jk9MgIqw>yó雍:#,0nz:t~na收=_%w3SY[4O^y m'?j^7ymu&wROӒ/oH=+ߤ߹ʑ~:rI?<:p ic9݆~YI#}ѵzSQ_!Ւ#~1ѫ+Fj>RshѵfYokcW?:UCWJ<=!\t{O+ &o!BACk[X8/=yOǜ#6=|nz kxó M}c4N?cN~wrtܦ8kMZ;\~ӽ뉉ch$j"Go9n&}?nXsq|{h;Pb)}UAzW=m:9?t.qpt-O;N"8A{p]St+nUa<!Sx<1=t;st uӋdX{;MGH39xnyJڍSqv|Mk+/JMffn^Ah}% 3={18)&%W"qx2X_/1-390G(|vc>t[̷gg9sey֏2+z)?_oj?0rtdC׺`73?>>͓؃_-z~%.mY>0}[%.AV ߅Jn?ٞB}{-ju~(<>G7S+3A7mGHw o5ySw\W<-i& ^Yb~7X^=WRƇ8s6sx~ whEw$;N n޻=xG+GyrN^35@~~9<j>ϼ#ZC?2+S»?tB%%oG_I /k{{J9\^í RM]|XHѳiV |UzNK>__6^F?۽.U ̒:Zj{V9\'3̉sT'[*}_ߤt9Y sydзHNK>ͳ$; = of4K} 9I]W}L:?y3E'~927}4-M|t?/>uyq+Ej:Pp>3ŋIuG$j{re3j 8MҮ7V2>>|atS?yJ 6JnFGSƦн/. |lm7ȻVl! ՟Wй'`.֚~Pt pW_o>#|Yx{\,*nΡC [4ԍǔ z$e?z HQ'ͣS|_e$}F=9ޏ9$|tIV >?{ӑ+W/=;߸Ycne.1zJ6#IgXdiVax{&_욫_.{B T{߮|V 3gK/<${ʕ p=5Ѕk2}:|kv.Ynd{4nW^7!?W[u#O}|wOyeˡ& .E_̜6L.%e~zR)̅87"{}1eÆGN0M[殭-y䥷5}f׷-5Yce~= M->Ϝ*}$3}R{S֑ixCu); %;!/s0_y _cΝג3K_; 7_६z'McvrҜ>ϫgf9OYoɠ40[]˽~t{[.R ?_H}\ib@B﬿,ދj>5N]Esj}S^5ӻC{0W9arUwfo;ARQMr?NGefY9ݧ昗N{ztA̓\o$FfFl7~n~+֟D; g'Kѿ6 HZF\0V/#'20&;ƼR"Gm5y~}s߽gNr[Y|t#Y=))aoJ?"{BYOBϳ֒G5BL9|~2`d l=Q s^h7N9\IֈYV1ET{GytWZ|ޜϯ;M3!?L.&mWY8XO{^/2vfq%f%yg>ver Mnq:s0ZsΟ_`?ӕcɈz8W:סqd "/hQyZz?4AwOW #Z.ss<yk!tA ܫnO_%/K#.[%rdR{sOF?~ܧ7s':?󫍑'd^/5O>k7~}|׳ї}i5. '=m{|"53~ ^GxOc|^Xߍ>HWX}-9x}/sWr_34x:^ |k>^7L+ɲ>Y#-1*gݽww&΃4zz^x_/SzOfv">xJ3LE6׎/_끧NCM:^G&OG2M&U [7J3wmi y? ˓;˷O8M Ƨ`KO~s=?v8-tbN_枋,m$wn${kmW{^8TٿzBuyoynKms#AF!Gi2BnGk}~q^Ѝuя=L_ zS'4k9s=9{=䝵K1F+'"w'Z\G+Xh8N}Czp&o{.*i"|[,?N/׃D Wwr&;g6 |Q?4ЯՂoe oȻ-ϐ#Ltɽ|!tOݟڰgJ}T,9L1dk;a|sS[<%3ؗ Ce >qVz'?Ո;g%t9|3[Ư%s9rWwϓ̾ϋ a).+ϓA"}S9N.ܓ=/}J+zY|4}k>ٖ# R4)/K3Lwފȥ. C-S/wq[~zMIq/{}1BH4߰;{/gTR~C9p|m j^2fphg8ǽ~,+CZ_$s>>Wɝ#?q|ZA Td*qe"wZ+i?^']iyx]UZ_75]1V0UKșe`B?8S?MG?|dB/GrC<2}\Ln87!l읳֦ zU#:]uLfޠg}<]˞y\}cHji5x?zm|]]w}>'֫{%.rA]ͪw6=jE1HNItk&MZ~ƔK-hWF.F3FAeq>5g\!%ޓu0wE?;ȟa]O;u%ǏO=kys9|暁)Np&3?[O.$nt#[#%fkWxѵ4(_2~1ځ/ yi=1od(*c׿9-| Ch" <^yOl{8#ѽSއ?_e)Kg4f9nrh>>MJ|QH _0fe,Ívew;r,;Ӝx?Iq?D'c WΐO70Ozwֲ 9مFׂӮɫ=>4n~ <׍GoN/ "^Yh_ҭQ}!Ite!vfl1:j-t[wr/r%=5i rzR(۞7[ t󵏜5' [N%q 2wNOàkzK>زAˎ 9fW+f?y YJs!fk; 8K&ُ va܃;Ȑu-{k80 ? 򶬯g=\6O2?Bp-50z)+{n#u%oW2smxו$k1G߰mˏ?9)]o}/e_/墟T?}s!X.N³{ZNg?crΔY^s]rA?'qMd8|>F^X/#x/O)[UpEdz<:~aԇ|{1;青wτ~^Y|0]bֵ+d/Z4^^zp߽tْ/}r⷇Ir?ﯿFܾi萻מ^KCr]׵6&5J~kM!z^_M~r+){SFpmUu=$O.n+yǓ9} y=ZɃ0BOË3G>sc\/A-0x`+1{{PQBE< 1RuxP8 ӳ|û4xxw"lyG/Dט!IRgfKz0a|Az}?ͼ]GJOϠ cE3&'O(*6)O6W~ .i"+9 &ou>yM!<=OV Ms_GuM[emE郧&GJCZ} p5uϖ};^r#ㄾvӫ}5~spȿx#DyInO.*n)ΟsFv.ߢ#ԥ^/~RӢ.ų[xj{ w2ksد,糕ky3Mv) {jeS%rɣ:.QD_E!I?O<7{4\z|0γj/9az/R2>__Akcɿ\vEm'0&O i'" È#g 0']^tr[vwS|+̇tz)|L˵ 2ȱ&|N?6;ݒy/+䫄7Hҗv ~?j`ΌsX9@ fj^ޓ({j:}\`?-HO9Q_ë5̴cޫzr+m5:Zw;sUgh6?A'3vd|Og_F8e\ִ;O;ȃnP7S&p9! NWx r?>i|BΑZ Bg#پ߻,~"2ƺl/{-Gy1.zGZ7葭gfS7NBQzߜ,VMZo.')tg }JOns}R^] {c={F?!z[/ԏ? ӫFI÷~qWц҇ߦ E^N2,E֗/kbR{9OHУDWQe=y3#EUd g?AVF=B罖\!MrG+VWX{Y0#פ|-m6Y8}&?C?IE#@P/etWؐ/ H];|N~cp"Ы`:yi>y^]wZo=ko>\ KoFOG&\zE͑:76I,g΀ ɂk,W(/zZ/~6hכ΋zpv4דQp> _[NH{CSњyV2/U{C}J?Jk~מWOv,|A7x7?;V&ry,GJF~%ﴝq/ y9 穗nqsh- <IY^H=<@6'Y N=p_y:'^'Qy/@3 2fm@?VKG7r:Z؏9%}Al~vzֻ}er{sjJro9UK?;_N7܎s\@?&-}S=#S“ỳ[2V_Iޠ8WZm[Vg䧏2A.=$D} ~\/9OE l~Q-7>N}4}G#1~gPw_.7(:ENܑ#"Qt9Cay1*Q zۥ~"e\z$1YNfq 0~@ Sƫ;WsH_c~M}l W/y s` |Mr0?>'?;ü\I>OK>c%OVZ9,qVtU~`=]` &]u$8 ?0(s[Ac uy+s爀<=͟^F_>f>O΋^wxPy(yNtZⷒDˌ74y{W:&wI +OC1.1ͯasT!C^4<>ރA$yvg97|SՌ^xيzXs. yZHoO|>1/vi"w)1DިSN_IrsV߳%~Or/WÏ<ωэܣ/1וd{|Ftvy/1ѱeX_/>$|Wkq>Jo\z便' y܆r6tJ=ϻ\l ˗ |Ug:{xvAEN^t87h9~EJGIo3# ;Z{/<@;޺+bܶ?þմ\]<C._ opa|14ϽR̷eG3sS ?$NH/N'gsE VgyxKb}A\\ND/4#$߹|^#Ny.S,w]oBǏ_*{@O`㯗8eɵ1ex.G~<>c1u(S>!/1XuQkAq{oeycEa-4=KϾ LDIUy.9چ|3 S/Ds:x$:e7O \!GLc'.Kx|lAoK_"f#'CK$ /cY+*3t=p-opdV>٫snI>'7VrrΉ6x=yW=-nөm&i!'oyatI|cA-]#yMSY("{7?}(f 7^ԇ$T7HFN|^b~\}88o = M&:t2^S?i;+ 'WApﻚ~,@ Gs#C3Fq^ . ~`O|T1tj}:fO=}/q8vn;i}QO4zB:@-o>~YGѻ+/i+3a)ߠ{X^k7M9<;|zū}Gf*SzБПĘK; ?arc-݃Z3%ɡ/Wuh_7o4!yuϣ&b 9r$yg=xj>9z(hap7@gc> ?! ̓>Ai^,gQp̦xJ }\j>j?~=m+˶}[/Q?m~Oy⧗ ϭ]󽣥|Xx4I3_Y O, a<>SܳOey94x?]&/Y@_m^ݤiUvn@Dz_ёC gCY}h 4k6oE6yY@doK{Q)j9I?OpnXRmMt^b |'z޴l'ߚ[oվ$D_˪M=~9 ?{C^uY{ljerSzmNqU7(XEEA"rEAQQ@HS#Mzn%ɦILI2'mw'y߿Gd澯_WýWs>+7\.tG{0=q9 Rro2'ts1&Y`6:>fނIrhw1[89I> n~;Ӓ;&e؃YoQFN[U5v7y 7J /'d NG8}γӇ !7Y^/qǬ quvf)tMࡓJ̓+< >})kKƾg.LGwC7|D/E?RG=V۹NzғaĸWzCu|}6|\' =@> vzGyMs?ϰ7) rpOQ+ ŗs@4Z<|,SrNwԳ;*rMsq (1>XV^+Xa{^z$hR*<yY"kV}cKd Pً֧2cws:l=ۃnORWa5@}nz h G[2{NsH:`= 9U_b{]S|b(yhqb}GӘm޳x2xsC'yf¼Eiy=/B^rsѷ5B :6O#v1{j9? ӆ~eM;?}ӆū*+E;Ys>zY˜!@n[AVY_Gc#_,^N!RcspR#ϧ =i+O]v-e4V:ݖzv^, oK3vY|=\79 Ns=V,yCpl\IX:OFoB^{tϸŇ&IttxY\hů&)>WC^jz5k-ik%UMAhx}>x #g /<ec9-CO{/c<:͠#4QϾ,QwUcOsc'O(:4|x > ׈;^1<|)Ӄ^%A$r 9Xg 륯0@Υ%B'Bo|Roo4{v zuō  'p?V|+ zbOpʽ5!cY-l3|!|:~e AԨ.,g=_HBu=x{X])w21_YF菞*n}d6jJSE7n]F~-C\wZK;lEDtߦXN<t箏QǛH-s7sB]pL-^It̳ pKu$ _>xʅCo8 N3[ѣv6У.WA;9wu R@7i}b*AsVr)=Ό-6ߝP r1LXQ 'љIx?h8su?A)t߰|$Ұ߿$6ރ)gMۇ7JxJD,p}賡'O_. D@J RztV}䲚/6:ybJ\>kYÜwYyе%!s 8crtCm=Soe^=t'D0(dnKț767xy_ <Ϣ3yRUrd_{<{/t wzm<-y Dr4s&-5{o|$]2ο9=7v9ǖ>h<4t+^hZϋ9pNCC/0a p/caDuug}>1왓8g͒5e}f1ۖG-Rt [ ǵ1G}c%;|;%)3'9OpϼC/ xq㽂̇iR&!SBQ!x0tZ:y`;E0{mbIr  Ǚx@FG Gdgy2ۜvp7Nn,+s7f: Õϥ!7结9?rz~^~:,$I<нyW{)'̷K*㜣'/Z]^b_W"צ~(jytһӛ/2\!$6 r>j9a~<s_=T!rJP"ut|\,u%E%sSZü!Й\k90J ˥r<3yC-'x-WzDul+ HuK|13:򄵟7e5@?}r _yA'oO[E gp*|t&q8@i/:W}Ϩuv)kO-4Hzlm*OT˫ɂŘfGWp ]P_qL|N-_Ԇ~ wU>Ά{ ڶ{q }b/4 ݄?j~g/pC S#Xg1-fzF~)M܊4~9zzjo7._?h2i? 5]ue#6#ȃ 1kRe/TѣFy>5>Kً|>yמN?, {V^DNn.7"<]h~8e2?{:kt:i%L=|; rO?yΣF撠ij-neP\y >S?AQΣ;{_9?ȅ 8g8Isi}i ]w={KMlS<_-'wK%|QXAD^ cd'L2f ?hs9~Q&DȀkGh{{Z¿\=^{^Ys-J 2AN咽vOdg5ك 8Kf٣wǑ۫i[\y[e,ȅ^r/LuGH=$͟^77Sd@%CkxoyT%/cA>ޓ9r q`ApjMfV =?&u||1IzTUtvjB _:zkrY~+4 hKxjpYf.G^t˘Syr#Oya =zy|8=I,_H1.ؼz%.}8: 87z>@W%;}G%mׅ<ʇ4Ag:t4&'c=9Km{:kVϭϜ^vw|ߞWVϛV<1|5$ lS~Ϧeo(QapAQ^KZW9~lQYGE#o?΃٣#Xq?fd5}.w[b]WǻC_T3gl)Ԫ}t2G#DDOޝ?UsjpVɥݠUe.ڇ{a=,΃wg'8g__p;{^ϱ'=G-}iCvm쾗4<lyCʿz÷G>AG'Ip]TP| 7\2#^>YI| /Oyc5{>j o \&>D>\  xc`X.Y|?U@P]| }m9R|ywU.{l'Cb$tS/Ř x3`t U9e + kass>Mi>_n9AOGat".:^zm$7dzY'usky~Rzd,mkR9į7`zs}ȏG=hߙC~ܿiy_<ښ;>c˲{w{.C倛Vb|MFnݻ^s0RyIާP o+a\EؽT>'#$c[G/6tږ?*9|=/@p IZ)Ovkȸӷhț.-)1[x7t2O eze;b(!q4:/>|D3I rڈ/AMx)̧Ƌ K^|^]>2vy}3MpZ/8z,<< σ!1?`9' >=n}oZ^_ʣ֮V]ߕ9(GKʁ\ cX"g!iRK&gP@Oi~Fmw|35hZVS3jr:p@/CߴPZ?{̪yuK#>d/~`ӼX/)8)萼<'7_G= M͗CcG S|/Ń_9D;֌,>J$݆>k6dJ n !xmtyjw:8[<0{b>:ՐcWkz~g#M;yO@?: %?•~M<ar(/&_9_ͷ7B˜;}< tٗ)=NQ| [U"oLg;CSg73x'1 1p8>%z JɣOp^'i;B~ )N-[,0 ?Kv[#zCkdbÉK8xjq+5ϽowBZO/.1i ,>:>w~gt.%Z-=L^匭G+'wg;~17o_LWև>M1yş#ߓcn">!|qՒS9잟o0?Vו+.}oTIӨ:鳏?p229Ձ?RAoL_?8o74?&[yd}+?7$}/8uyp2| @w/V4yI17/h'U`;o~MZߣ E̻dm{sCNH򭋾 s]XhB#׷]^2ȹhm#2og}ݳ OFkfOA-򢥋 |zfM&AJw__TߥxzfCוׯx3?!tyŜb}O3t1|{|bd~.a7~şsMs;sߒ9()mtGӈ)y2ߟ\gd1|Ϣ۲Jӳ3yxk9z>Q 69wz]S]Noh_tvۼby̷7pg֡J_E=x >n:(=f ҋ3/χ{'ڄ_<-$>Z:|HgEϩcy`/ cWÛeJ3yYtqc𗖯ݏ~ޥë _=_Ǔ>|~tsv8z1[Go0a[>4yG=K/~=Q~~u͖E [ɒƷS! K7syFٛϡoMܓ6$swja`Β!ӟ'/G{"_-yǢN%WryT<,>Vܛ~x^,QpVLf^7KKn W1gwrosl)ڗ uUoK}7!A~xr&遍n_'so$$|Vqi'YA.}a=˯C?W뗵^%!S||?i}wssxC]?:ً闑FF/˿MSzqgoaG}]~: Of}OK9Ɂ_akMX|x |Z$ QtQt#t)˝6}+|BixFy*sw\?oq9s<^('lN7gI71~>ri M૜>|o Xû|UmFA7'Kcu s)NޓZ=@^46<tsasIr#3sxX@qrX>Nc}m/Icz֊ws'Ւُ.K >E!O3ISo} 0[xMӃܷi\cM{W=Čk>tO1ME7?~ s\WUFA?6r=^rܢ]x`)r/x^=bD#m"jЕ֯Knq#woy WϠ;4ms~Ӟ:瑺>|yB2?ʃru)7$RX9֟u>Il7bm J畼rdOA_C]}?w+Iivx >iNg6ǜa=㔺o:%AUV]$Yk> ] wh 7+_3^\rEOi Syb{G$k>QwL߃~ط.4Ř}p/Thε#7o!ە r{߫؏P̋ϡKm}[ Iwk3q>T/Ww[eO&E~xt^='Rd5~ Ufq9-Odgq&Ηf_<~љ3eFmt?\݂v]S ѫtρ}y 'b|hn9{>:oȯ2x/CN8{b_a/w'l`i;`TSMK.Ab#yLW[0-J寶?lypGgln\)r }q8- ~߫07S^w^Z(ˆgriy'r o;Lot&KKb~jpWo w=zb%_wo|˶hIY|;S5!Y gV|d 0:C[co0?iyiA83Io9>.g*}|fwţIM'p<|>ycW7>2Y_mo x ru=nޕyva$Aۈ9"^>d/챚9g_aƒ(tb/Zo8zAt7'O{?~iT'$}6}F6~/ 9=LF;˚8V9y(֛F2w}zդI|!K+es)cz{7%W 0s J{^e)ug>ha,u]:s\.MKK6A *:u+FM2◞t3jt2rW4z-o9^!JO}e$ pXy?Br}χ<3}Iic .`蚺x}{\U[D%:uD O;/=bZ-j> t̏'|'bJŤˠ;wfѳ<7IY U )z)wJӇ'ϐ7^uC{w'f{.xb}՞'wȮMG37%h_x~8sE-YN?@o9:*xz=?9B;[ u yKUz߬zoѯ_R-׶<2l{?{̪;NK6 ΐ0${CwO^QOe^i 7Jz ~?bܽ\tw)%]E`>$|9xs *BlhmNSg\zV|0l{T8O.++o(< Rs6.K4xTЗzc ucܿ8N`L%{O66? ŅAajvAԍna9cH/6y(s^`έr}3X=onEx.M{:Ӿ>rQIZ΅$|^R#{ +8UbgPW*#ÂRa0<_Zb~>{Yzxor5|gcˑM^w0Gxef`K_(z Rt5ZK!gUPj n9iE0ym1Vplz=W<|qo`IF67. |zG9 EWp~m?z%,%csn4?gޱ~4/Iᛍ?3;~$>OD_5)ΑQ(c|_9}'/v|RfF~>UoB8\Q .+Y k9iQBs%W9va-AG)g9G"o<ߖྲྀ<<|l)c ?SY.7>I?2plsÒw=uύܛ>.a&J~{~ ,'?k$9qd}- zы3o)s{rF5ד!i=Iv|^8G%Q&dw"ٳܧA1;2$:.zy೵;?s[oeKCH5Yǟ+!trQj~8>= } lu$#7crk/S1_JO?\|g !O.$i?m/Er_%z^0=\s? Nۍg$2_ y'W`8*E7A_sx d5? +zxCC'z7`N%h9rQ>s^뜫<˱C ܏OoW7~z͞HNW5>j\zzcZ__JR Eo[j%=gOJ>ȜùNv:=V/ sNS|Ws*3a",q]j~o_۫a1!)QpJ %I=UG˯^h ^~rb_Ty .myr &GsG/2xL'No=bJ/2P%~,%H'ǭ<5a>ir̿K2O eROGqEjV5},ܯ ͏t!p!BH1WtFyp2ϙ/aߓ?L]Dr92.}?R\hEpkxyS0GɻD_ yUO=~mmC?49D7lyv=R6B~8{֋Amj#}qI| >rv0ѿ?1D_7~ay _ܗ8zbt҂_<<{d?#]S<͐_2yOjеx )<'JO:^HKMJ8?$Q7'ap%~0~sJsvRtSuϓY >3节oWYt^kvoOcᯚ|/(SK?w9$:/:;'W4~WL /_*@isg/<~8}Tѧc u|w[x`F,G(\ b? Y6W>r= ! m2+ӳHo./jd/ߊrw/(=Z|OY^V b=s 8$u~_&ξ^Ïmk5Q)=c2xYC7~_ 积Hy;(ӑ/A̵ kGc3Ef>V|^%˫GR=~=e}b<mٳ+Oeܶo>CڞQF+$N{2|gRBOV3.fЙM=_ s͟~^/5>p1_igW˗tK[/JճW'o| =J%3<ݧI6399wSM8~Cѷqb$tBnϽ^/v4}p>y֟9]̕ kgz\ 2>ݫ`^=z=u;Q17ѧ YEWny#ZNj/DcSłgS^WiWH'n/CW㝆yW_|* >Qrx\}rr{y_4̽.XwSSŜν 9 v|xrsO[K͎$b ~ʐ3J~}s|z^%_!O>GߞCR^ tn/iu{e+k㧒FU'}m.OϬӊ~N{,_5ɿt !BB`=|z~3$O=azN耧7?ekbk'A;t)踒=3茳 oy!x*΅ =h}WOn4: ?Aw*S+|}rftU-<_ϣxݨhǶt{{sy{ػoi7['A k9#1 Ωz$ϲ3O2/ :5hfNdn2ޗ{c%Џl r]/`<}< ={t#葟G=]c 7YýX sI?K>$yKd/`1r_9|y-7ir`e{5<@(Z֛Elΰ_5ӏjseQx9rvd)Bu ^W/:ȼg|<%+it֒ =:b_tG3g?ɥ$Yd5fZF?wNNK=Yp0xIy2l?1 YJ9U%H~1z]7S8^}A\ xQxog[ߨ3?ir٫l%gR0}% y*Lpbr,&k9Ra}rdOg݄\\3oZ' o,su]ߕEl߶(ILS70/ &Ws?,EݘC+$k"<'>>UtZO= y(2Źf!x}rHpGn=xV|ǷW{E?< k7H1MCc~$ <\%ι0^NO3ߚj<^;f_麅F<R7x{"'e= /5h:ˡh%{y6!^q{."k,f8qrCYz6EW{cu\o?ΐm=<ד@^VOHOze=?9aVG:^|[^ߦ=򟍯,;tߧ]KϹs Ls+bI3G!!|)I3iyঅ _ ?{$Dn-/dz0x[tϯ'a|;~\>GzB熟]/D|؟j)уfHvJ5K?ob>?D?:} MTu$L>Bчaji/GmUτaeO}Z6+B"KB}{罅"O^n2ž?c{!:3B}?dIٟ.<7w~x,rn }#勮վMc4sܺ9tcd[Jo-wS!- ֜yߣ(3ͅSZc&z˒K?>K醟Ϭ/[C~ʽ/{JzgƘ36w/Oryu{n<*18f} K;JBWϛƮ}[>^yooޏ%/tY{k,~b SNj ^rZ+;k.ysi۳yF_b~ mmF#%ॊw;/之|KЗz7'][Msg|eh٠[on湭/˶wY6oZ/]sǪoJq- %o8HSexj y}U1YK9zCSjB;?{:?_-Nw}2rCýb9˹SZJ>y/VQn?+[ 8]|\8;]#_] qo6"{~Jycg6S0܏<ܥi'n9ĽNnYrv^_K| iE0:~AzY*+}J<GMu \E%l\B~j;}.g"GKˁϑ~$Ȗ{spz[niuޠs5;=bڷJå\xYLCЍ* ~cOt}ƭ= cO)/ye]}dGgQLk=)Gcr֡Sߥ$ϯg+<?g3p >˿o_ls6z!- B/vl|iՒO_vGq~y".֧cyzF`8z+ 4j8{`4xl8 &3A@]mGst1d xz?<:Z|_ȐK32Gy~3++1t*c9cYD7Z/C̏mznw{87YHӋ6M  |K G8c jrs״[oTlm虢&zagY5eבghe}/>|#eȃi>_=>݋O} ]a>f;{vseUƗy#G ^ m ۚyhZes?[,82j+pX)|AWh:hwX";=dnŏ&FO:8{~<}.p}NfaLWя4\a!&̡8c-AEǰ=S~ LdOmkot9tr|N3pmuB~K]^cFwSlf#oY b>qK8'j:='uk5Gu{?qmqt"o=nr_MٿMӁ‡>-t5ݜg3ѻi}ϞMR['A X?c{꯽"ڭmL+#ns;jTDZf~貢~JM:Vwi!o%/j}%G>ݛ/uݧSN>o[\$^,j|&/=D/f-⬯73[~P|aw ?Hsl]|qW.K=|څo\Lfȗ5f\ ؆??^zg;4s%<ԏΦҽ:̕C_ .l~FxBv󽍾=s]@|y%\EV?m>\?ySZǼ^XFݹA/ιP!\o[Y9@ <꺙\eIC|2zd?ɸsD9d :2˷gwBϱ׿?ir}܃o] ޗe?ja>%n%߫~{t2R jy?ɟwu7#%!ZAϓ̣I ?i/sq{گ5\M,!KD[nL=5=m}F{yfE'5g-Ǽb. CK]}k;j 9< {Y<yڎ2}!Gj=Kϱ2r_oaosH{k=sn0;y#b%/3Dwցcl$Žj!z0F7N!#˹݇ϝb~NͅZf?{]4]?X>WxA`eɷ} XI1WHXNs1d}q1Q7֓p=dCr| rm-Cý#Y^vs Ys;pчX??YO OPe_c>r^/p9mf}?e U'KމNGwKi^r>*rKh793i: h眫DZ~Yɠs_w4͑O5e{x>0ya+sE?m 䉶r~DcZ\ __o=毲b9M[Ћm$7ŜpC叢'oTˆ&%En ky>LWdW- l90m=[Xڭ S?:hPʟx])Q'w"GQ|N;-Z|d|W(c× tIgB+oz3z $ ~6u2 g4^ۿ}E?wsaR_s9v0F7OH-I;zutN2;/zn k>2}ݧ*=eyϲBП^s{ot#dzY|!tCXmg漧oK sΜT0K^VOeS| [| ȵ?GܻC{zOkGB.I PϿS <3Ow\pj#sj"Mo v+)piz|&yXn4 :8g<, iA/;'"e֓UFqQp xӷrnJ||#\nri90Ir>[䑫{Yɳ?0]>g=4^fE.,7gtz쏚9tw\j טE?zF4v_8GYF|y C#PeF,eœ?9 ^9Μod;6T#))^6f}cYXzl39g)x|[%L/I92^C~>4]_c|y~;a'xQ=m4t V}1gKboq92q K j>cC$Q9C~f:Jŷ$C+E5dy6:{2 _OwjUk9;gOmy\P/O}7n`aˍ0zz{QȖ{҄n7w1r+Ю{X󅧿(!5W}I,7Jeǂz|*>r|o!}QpbPs{<|E\A)eףyɃwE?S( Pfny<2?t>np* ȇ[^dGsi'8g\`W\=pCV&ɻA3b96CsX-_^=b8,Ew~?:|1aWÉk}G?t2i9 ~><εinV{3+e5 N'mXoVz>c E9 aA. ˿*Yϫc<~8}i{z7^T{w"w8s}(y%zx].es Uy=e <]c+Zh:r ~h ~U]>}2/Ne8l/E"?Ed(9^s؏{?N<-?'m8;?Z) `_z>CA?8_76(scvp,{V#vIPsx~ s/ߛ\yAO̐G">'k ou䝏19V<GZ_p&yf-ysrA_lo¯e}^d?xz?y!r{-?5d)b7eCQ jLGO/a a\9"hp&t:m!jJ+(;(kN# x%}40n=ʼ@O˙Gϛf =~}K|f zzGS#\e2^<֟8OoM{;ȿ7 $ <ߛ~7]b9sb'ird^{x}4f=Ƴ˟.!N1@7r^8/SoYXXX?W2_xbbݖG+At3'Wgَ^4D@nғ#MXM"9mlWϳjM9-=;콧7LG3A/ct(Z;DD/<t  NwZE^`3y>ItF>Uǜ^yT[f*s}/s;xɦ|)!ElOfk{g<_$xj M <iO/\7'=>x-q7'H|I3qOQԳ5o{Aw2789e/_UgwCgù}r%kw6we厇 ̀ZNZ_6q/X==c }̽P'aRXG@I6s.uOb=Ȗ>Jt QC7}Y_=pD[n0#z}m ڝ́ļ]Jf'@zs/Aݏ/y;({ |8ys&8h5E4^b>Jq%,ڏQps9c7]E')o8¬{1J||QIKyrx/usiyEvx1d?{'0OYo' +W}?{\~o\Ow<t5gY| r zCR?_~yj%7X%~yh|^Kxyksw{%֋\$).Uziy+CH01S.GG<|_^o2Qî~j5'3yr/_ 1i9`s[ެ}~?BD%8(N&]oe0Yg(PU~5H~>=JL.#G#_INIr#&bO;y:~(C! ~$H"{I#xUJ_a_~=e-{W-帙̝嶴˶܎yqIK'ط[d.A?lC9]V O3ou V?@^;ryt9^<I+)8|~'FWc OHw &.Ç"۷2OH Uo'緊yl KT}0 }mxa5B ;b߷ &˳g!z. nkxs37QY'W(F)<}}>EJq}u9{bΦ3j"߹܉q]h ~?!?fa{_?eKlDO{@sE~J.w(ImN(IAvAC"p0Өӹ+A8m\A||]/v${Kϰ$9B܃>naㆭgx+c[x޼A۟Qt y4?u0]gϖq:Irލu@ZBG_w˕usl~#Wiw >]˭mv.BAw1n3h|<I SŘo\ݟ={6hZӨZ0z<i_;R|)sۯojp ]uk~X$J㽋;=]u?eT;/_Zyob0E}.~yELπIY,w 2@`m'Tws8Fߙ?ۍxyvIbr&%'תr7X;H*"[W}H=A0?Fɹ>.-?wx ߦi;_L3<4:hsg|Odn/|WLpzn!';\ۖ_4}'9PW8}L{x},zuW[W@'_X?D=zG\ׅS^`ocW433Mw_^z5rЭ( Cn&yQM-ևN5ײ/y|kfPpeM'R&Zȅm?,1r5[Ux(Yhoǿ.b{XiO|>~kݵ>r,ܰ8-~`ߞK7k/ޚ$F[ȿ":C#e>HŷIr'/rHy2Gm:o'#Ƞ[:S|)ejV˙: rp}_?_R,RNQ_ۄ^#A?i50s򰌟rCo/fx0m?Bfxwgw#1Dj^K ŵ/Hz o??^: /xM%x{<$҃Mj}8JfD'&q|)~?߯=*2#v9=HO&Hfz?]Yvo{g.u}G/ zmL/xyM?řGנφϔ7EEV p?t`_/"Xbλ|rՒO͈crrar[աjW׮}d~UxǙf|\ü5/s~5wO /GGv~Ni\WomGFC?b>C%|f7z{TnrtR/SZIOƇ.<#[G \>Hu:YPlsv(5?*~yH/h^K%O;Ƽ*ԊjBȭEW`Lǵx!Vp0M岡g/%85~H_;ȾeP?>l0s%=#!OC~УK?>(:ne~tw5%ܗcO^o!'.rYrKOg:2Ytyx7t0ڇ_ 9 mjxx2^t;y G%!]{o> < qic/[B|oc:A~|ac3}4 >=ʜ\dBOiTO\xQ?=r XX#Oq2w&? p}v?d޽'>e'sZ}5{x)I(5} oTYp/]\2x{g :[jEo}n~?gOMfxFyA.~SWK.{h>yw@Vti%zXx~ Ë'? =w쵾򾉗޷7O^$*L1]fs~yO7Rß oךF⫭Iޝذ&oOᏢw*Wf߿S=V5S&&8w[b p/|\к^[ޯ-_7oQW8B$inhZʏHk?S-!z]Oj}7Sw%%'L'(LLp O5|}=*޲}t;Ϡ޷ yPul5> vwl=]Gx?˓%{튍lMMOq~Ft0hp>ݓuG;r$ ?~%r i.郗 ?NGkk/Õ%?ݽ^ik鏗k|itkkGZdMDsC7]6r/ӣՓzpXӑ|j{]w'3ǘ :;ɭGGHN "%?IK^N׋oJs[y񩓟2w)n1ӫin̬s}:< ?0=9v%ַs;4O7IVRX98>85|9,O\ Upm?q) GwBf-s88ߣg_o~I[py }}#ÎW?Fx_=jdkm9KE/:!x@żf618u+49+8K I7[gM}M/ޑV`W3N_[sʼl~I0ІCd9WM"7ϙ>sz72hxiݍ#'s.┏[zO?Nx9bߖ$;qpro_w^߉G\ #WCû[_φO{|hw⒫dOr-Ӂُ_mˇ GF T.zG80OwۼLN/uϲOFm}3tCGm)B /u=ӓ+:ϧCa_pXs\mJU9,I]/P?Hś,<1tZ qeNr/Qΐol e?)AJ9z+) ^LNP4sYg}\R?*jr!FEV++ )'PKڥ9iz[>T?ԻI{_a^묮^~7*!W t9$S]{vOr^K̿v^/6=%Yt}{?Su*uH]3}I+UFҿ.˦'j>fp?ݚxƺu.BX?*d"do&OHto[7ɓ郟͡tx?rrCoR! cr׀$q/mgB;n'O[ ]͹oXw|o7*|Wb/R= kwqHť]K" On sO~9&EF1d90 |, <̫ӮIc.lⷢ7p`!ǰ"sz mAtz' s%h^^?:_E*V2)أY{~dN>][r?/YF-g=DMea-'[^0g[t i4K{rbDe>maNlCgy d ? 0'x> wqxcSyv/-穎%[`DH ({ZtcNuϝx]AτXV:O3?=N/ˑSf9ZO鸻r_R뉰~*rgL ny-bWl)p_z󧣯.V+wd229pU8?bp՛ -A_exA2|;6_o+yvx.03v'~}Bs b=S7gCg\]_Yթca2HߙdS/?wèQ-py-Yx8zGijE!t(at^d{܋}|UvZ)a]`ue?\e)֏)S#9~|u'a98%Cr7ѳTr9 uy7xr݋a^DI* ޿!zY&k~ { 5M2g݁_|`q߇y[?7,t%gex?}Gք)!!>ϐ-76t#w.rWk*S-ל/jqQeOg%=n&/Ͻ ܏CoǸ'R̓1=sȡ[ I'vEgo nn:.;6Cm=2I.o/t=i{IߕV9چzM,o(fhjX(1t}>Q~cg6vx$|P7Gw`N?x.4]::aMքsy|&) |e}~=?:rV t_لѽ9\!g1I9n;IyWxZI|F'm8-K^1s}/ g>mEoOtbGcDGo|n~;_r<|+ȑ.|%/-˘m^Sc=e֋PgGg >nzgHv&lD-On;#>z?ܻ§Hӏj /~y}ڊ^7>~)8grc-V<8'e˳~`MpCs7,kKo 3/wCߛi"O}ZF~] ~$yWij3o5 e ϟ{t_n=2OYM|$:=xW uCџ$/ F.G1gxQw\9v]*r?wz^/>5DO02OJ}0 0GiU?{Iܵ"6q昃2 v?{neO1&:}KV?,V#dRſq䘋߶r4Î8E4~,b?~$ELcܾ>R5!>?ɹ5zS˭J]"sc^-Qϥz+G 9vt7_=NtqAϙ=A,-]-ws$GoC{M-O/V W-r^Mt'F2EomNCEn-ϐkeΥ9ρ״s72g> wF%Źw6׿Y*5Ir1(rޟQroxZ݁>ZoE".еYx/j?W+U-Oy<:?g pxk |.>mov#8@9#sIп0-9Q >9QpT?{Y\&WH{ḾKyjy2'~Iz[ɱr ŋ}z^o'gpۻ hURzZoSSI 9Mɻϲݖn?Gwna=d7_Z =E?]6畣G#^{Ƀ!f{"@Aޓ ;=0ݷТ;_#!@{Ϲtط!#iD8Gg9y3MfZ ^. 79 8\nt#K3{6ע Zz_t=0Uv9|+Mh70g.C_2p N_9AZUA菗.[gy ~A+D2?7na} ݿ^ZV'=5c}f=X> y gV1.&hJsHt7}<a(I| k. 0 <}k-{)a9(eIwohtu|gQb+坷~V^!ȳ9ao4|G芚?];?[aH~+Fϧ2M]g_/>Ue5J#Ѵӵ-=%s)JqO4tFo%>'ZOcR@=||W4GDϛ >)ﯭǸW3z_pe)dZG/^=^]$%0=U=al}|JG‹o~6r oQQPzB> Ksp #7)r>g?`Wi<d~;g9G ^Nlݨ-_N1~+~}*y~6K_ܗvɽ9XWsO2_!p)>;>ڶ/. qt.~g.Y}?12ξQeYyi {M{|^!g]1'ЧwQW6V'bzcࣗ7|Nr~\oQt啟~Γ㉴J<z3ot/F&=0 O֛7# |CoGLqb~G|O]Vx߃[_z2LΉ\ w+]޷3sI#c^;wYY}u>Kc+R|>·,=Z{Y/U1t Y6,EW^OjE =NZFC#97\zӛ<>MNch3:MNr>rgK[ȳ z|)^ܙ9Ǐ"Orr_)G>V Y#sW}=BJuoSo]bbsZ['? _Gbޖ 7tgAA'3 O^?3yl',RHqp/+qK: 7uL=ۿ/l5Xɿݣٓ-Gd3kh!Z>ն_$;u}V<S6Yo?scR).<|ȵb1_jy0Y!#||6ʽ~Ow^r#F,9I.DO>>|brat S?}R0R>;=vН4maCvȿ~F/d>Wr'>oKzesf|P}{绗|gsI%/gx,u[{sO8YQ]ߖQ@k_<r$rZ=z1z nn9FM)Zɏ?zlFo\ ~Rg'0/O 53Xt5:.3< z@WZRr{<G/Xn<}pl[Kмo]7NLɳg{yr.%|Cgߝo~Hȗ?F7[k= 2i?ȦB̉?$|mkoWXIcg铼o9Z ^}v}Ei0h MdɊ?d)۟6M`Ͻyz=|=h1wb7Egwh.>:a˯k)oPY<ܐ}͚!h5=;AoDOӏ>|:_swWo6v-A/~C֟*A(_פV;UWW0(p^u|J?u5Y ágH`H$V-ǯvcFG/X󅧿(ŜJQx돆~z?-rɩ$ݺ [ٱ;~ yG{ s.9ݶq^YJ3У־UWN83dN5n:YU#l2\}S񗋺>rG =Wԅ7`|o6cͽZ >`d/ϋZc;\Z-I08 dͮeݷAy扵Ma+ǘ{E[E^XþiuII )%ǟSwH0zomy>/s=<Izd̗Շbi 5/ǧ2WC ͗x@Ohhi'isVpJPznE|eifdz 9Z >cιm:fж7Αo>/}|Vft}qu|@t~\͛߼?>/: Zzi ֬YHkOuiL}Mw#i% a4j;~Azn?=Mz 0+\ߊ0Ȟ}g4RUxLEW1yO"G~9m,>[ >S A7?UuTp8_^)m\|jKO˸wK7!X3֍'$:+z-]^[.>mN O^GnxUF=wIze'U yc=t 8QC.>ym‚7_YaG7V|+^]^}z {~ 082ݗlo'>0{ӝ֋ k}ϯ_Smg"t񜗢S qC3k=y9z~6҇=:jp>'=̯Xhm~"~KGΒsVL[As9>`zF7"pRNo}g?9|RDNWs|slF\u9 'L#\.cÃCJ:~cߜ'Sw<[ˏy|K֏3<7p=M7F$~" `yn;o׌n_8Yߡw{n$x/g$'R</+15Ho602G|u?&=I1t].+Z$txrrr5ȣ^&9zMsq y>IT5F =xaQ|;(BWj2H?B-}8-oN W)>x6>˳^} >{C.?_!ăt ̏'n}WqeGǿί/QU,?pRh!|N[Ϣ@w,,\$az"޴] $}]gc:\Jڻ➾Vxe-Mξ\B?.}`2rt{쫫{/i%[s.^RKeCB c=v|E?9Onp#8z]%YFk =3:>ly hyKO4?g3}?_>`f]?Qh5eZpY~;w^*%ቷ&3͡93{gǿN;:jV-3M>V}i`I8e^$Ϟ5`~B :μ5Ts7x|Xy` |+ 6N+ƽkJ֟}o5h_QסGn ro5U/s_O1ܫj 'jjyz _LC\.~?3~taZ$}MWpo^{R ggI-k5BOאW?b,Gs2y!6橅T>4߃NACOϹǛ^&xB9mcmt%1.e,'ikp|T=.Drjs"ۆl,o]9S</7,)t駷yGilOP}Nm9}ǔ 'ǝst~?|^<ZFo}o^]w+<7ant+vܹ t <$AnORڸNW gn}ϧ?qg7ku9'}]K*Ϻ~nѻT:Z([// >EUS t)Wt~Y݋DehG^> ǿm]6>ksAx:55=]4z#Ga,}1~MOg.ȢƏpX-q|/_i(_wev{νWǞ5^SIٳ]qD1g9ε_9}6#JmIX^U\+p/NXۋ=YYa8K<re|t܃ޫn0 @'.k_4w {z}3?p0uknφTR*̹@oԝ2|LFq%VC;U"g\b|}zszOJ^>~f6^ӳvl|Y.$|g͵қ/W^yX+%BaCći!yEd[g~'zlчߝb_L\ Mt9c.ћJ|BÎOzpx]os߸Dk7xα%[O6-7={l~-G>H/͎qs!{ gl5 t.SOs9~{..Q>9Bzڏ^\T,!W59#>/N~UH)|92ccׁ?3Fqxthؗn<͝=??&ɽÅߐ ]{qO[o|t}~}O6$,Z?K3~%q㜴<4wρtc1kce-< [P{ToPr_d6N,E˟/JoFk[I{t^A.JJy~1O/cfo{d1x>~zuQ3z$˜2BuAFcz6әIrTO|?ŋ>Seys8Z%Xak˃0>r:8Oow\xm炱I<+FNx5Ѕ[N>̜3`Y"=H>=B39>2?]:og\ᡭdQj={o[W\ط$H w-e~h7~rDoi~]?=Z 9zmBet]YWΚ\a0g>zK}UكcGK.rr'|# 5+Mj]o'T.Ati~gC~ (~UЅ>`;sBvݞ\<9(yѦE\N}&a@-B;3Mry(2rAbc1&#e{XRj|L,b:vc:lA(~xl'?{ SWKѷ[iw{(|,v6քO//ME+,_U0E zo#LMrx]ہXS-ywn\̵~S3 ^.^ƽ驙%5Ϲ=%gpSx+K[" 7(w:/>1g֡C^:x~aYS=YoQ;atk'Cߍg970tb4 9ɽߓ'Lݡqy,[[N#m3:޷4}3Z؏uB^ޕOPz3sv5p^. >$"ƜF_3e{̽WN?:Q띮Şb~?+[^-*Mr< ~6;x~v1OYO=sbyB>Q^Kśs^k/x{ы+G,ŗ9d |-ytJ'}d1̳WqZq|}!]WKesyg\Ue9|^}_'0oV0&&?;^pE}]~~8sT]tR.wo>$)LwyXD~ ϓA`3=飗(~1NNGsI⫵|q ^Mola a |U? §{j/ܘh )|ixz{S%7O|[F0hG=coZtA6=-C^^?Y:MB }]x?(dO7*1|#irAӱUq:khϳ9&8W3{zo,J(k꼄uS!zƘ϶<5[^gOOvb CwҌ ~>/У zsMS^m˛9?9~y"}'ϫ=W>'d_lB&֓vFmA8{Q 8x<|LI>$p{r2Lsy_Z àP3'X<_!zYлԣ{i}^:%1 S˵JpTJ|yz^؏}%ӡE_Ʒ?//yuϾ!}_FKн&) pbw;f;|Qg B#ܗgKs;poh~ߺkÁG9񳧔/\I?Fn%J$y4b=q~:r7|x~ ;mǏn߮oٻ?{$t뺜6O=<~UwgkUaїY09F>m7>1|pQk)90{A 򯴍?V_|/h9=y-R/ՀÓfe2MIp!L$|R=.WXAXc<2X.:b^F _wW%}ҁ. _uMEt:6U2?W:&?s/I.rNu_o;۪/_Z֫[ L'W>Ktg N⍽?K7zȩ7=.y݅j{>wO V뛰17_Ț?|eҼ]C;}cEm?xnAoVFn1aӥ,JΗ,վ/}w׎1rAWcD)Mpt95 Y\8}~_pxؾ䥈\ zȋ@)}.OmnMqO '1NkQBQ-mo8L.\]/Γ};ч/_&Q'dp᱾K^ev^V_\//{.cun >7k8:1N{-栘y~)㱓 _|c/xg/S!{~. _(QN[] _{Y]<~ -ys᧧xZ&<.\N{݅$`_zz_YsN}F7g~H;]ԝ+NW"ηo+\jtN!ry_._̉zN^UbkFΟ1o~w8GMi<d}CKIz?{_%G I%=}$&SαFgB5y{n3.HO&6xs>ywT͢xJ qtY Jy.t3Iϩ欧>]_助`|~pI3>C/&tyr?G+)I %4q s xug3gZvziWfdɳX/V; |Iot҉>^r .Q!2_i~GD~n;;{v3} łnR g.gzUt-]}NlwW׊D[QqQ|_r7|01 {7;_5ݾ,{ش'F%ϒO>NsYΣ8ϩ$87zsdz2>i= |"h &2sh=.6o_'s1;M~|c1=nqk>_:]"/5AsDbsI{ |}/+7>y彑g>SFsc^էyo?vyk?|9q-(kiZk @ ո) Hwda^ЁyN/]}^58|B!ַ4{hثc\z| yd9`[\3i_oH뭅 ,ȉ-җn` ^ߙ gYz k8j} sG/lsAvWO\فN`n|zϭ_C$[PiQ 13ϗzź?-GLnoSF^~˧7}>62ߑߦ#3[A.לD_%3C}r 4{3^F]'a&_Ku!VOڰ Zyƛ'M v֌t̷$W,zDt?¾!k8yS8S9G{5bNy\c,u9X7kK|VO M>r/ϳO,I-NK<곎8ygVX*z+\LЇ%')Q?|$3N[6q;O@W&:1N:Ot#e 囅rcuSz@%zD` KN!;"r(R ҫJ" a^2$ӳOzON?9INrz$>0o~s]1C&9w",oF6:/DNN9t]躔B^7P-W>Xk=X5։v4sG? X ;OI:OƯ^ߌE#8k5:ˡ/?gHw};>u+ms3R}'0nq睎QWI0O9&ot7wԷ1;=<0|H-*3MKf~ <.xϘFu|%j~># rV#.xN毅tӯ)ɛS F(!ֿ:y޸:=YԻo@'q+8Q%_O~MWVyb9yw3>NqߖV|hݲRrs/4zG2(1έU;ϺhKh5!m!|"̥8Cs o\z wR|{4M#$z/{Y$o02-}5/,l ub#/".e Bsy:K[7ߐuܳ_*~F`?_e_~`bl_O_On-t c@Yd:x <0Uc!dj9<%G`ClJggwD$o"6?xPmۯ%b.u[oxRxP/?k]+o\3L. SW{jsȌۿWxd!XZ^ԇL-OB+y<{Ƒڅ_bmG,7`$l^i8&x]Sz\jC~z\~gK~SV}S୭v)⧎[x_;8WwAћm*|,OW |r_o[J[Յo󝔳胛G[N@10mV&iڎOd'x5^l  GBe P3nFG=-EmsWg}-{}d/0ת4џxus,xB/.{j+xiֺ)OSgωxbvmYƺпC5G07H=nQ£7>cwi~\ױc۬~rj3,Y쒓__V._2آ1|4tJNQcCsI'6es^CܺVxK5)lV?nxK[#SeaB}.~N]:~\a`*] 6EK=0|jSYr= X3x_#d>aeR9g:hgp\^LSҏ֡3?^+I:|(?FSs&5BQ _]Ghir*U^6LB3{3?}'+QmLG®>n~[m7UoɌJ ƮΏ5* F<.`S0*_*W(l~1?րsGH#v^@эH|it>|iߔo!|d猿ղQAC/\K%^@{Џ})!g,x/sX Eat{M|6j7҇ODGhiaI`ۡs?/NxK|ņ&b+? r+:'RAٍ_fh'u u6|H7>|೟oF?tvsN%}MS#yȣԾ|_M ~T \b_j$YQ|'m>8J_.e1_ranѺmutĒߵ]1_-n7yZ/ʓ$/`EG!MBb~s!犼`ǧapoR\;S޳0*NYCN~y;,VũGgn:Y}5d1c9j<(ӡ"xߒa>nyi):-B~+^9噗.WbqgԿRk9j' \I`vR:\*/4ϩP=3'yc -1%7-C35gz]Rg^MW.q89oEs>y;28fW=.cWMh5ZqgwgSSwi_zk4J?t2:>h9;jx(?+{V}#B^R4S's8Gw.RZqB?]sB=xO3?Oh~Due9jk?3;eK]O+M\t,#ќ}'kf-,ЉZY|?Vҟ++O+R\ޕp?\уK=p邭YO7R_^x뇶]Q5wk?J(\'sF#ݔٛrR⛓=vā'\xGĦ/J/}n>WJgm*=9cy<;}]7~$^4'-c{4B\D73KQ/\ 9FoC8f[Я7P[rKu>iMl(ȲȺ nrȽc^c̓4Jx ~9-ڇr zcuNIp-y9He&NdpG ,rMA+y  mN˜ˋ r9c,yVYyO?S2O'4o|dZ +GgB_s',7y|zbO6~>J~Fk2e@(<.ۿeYy% oMr~Z'zL% N;ԵҰSnwO g'?P|-Y=oiy)<,Pѐ4VX"kk1\{ 7b|z2^vIЕůu|VJ)x>p&/[l- { s~ ҄y-I^W:|T|O%2[~gdA㑤?a|1E޽J?sAtWMg|R\|[k-#8ѯW ̸9vtwhQ0-ݦĊ85}T7~ eių7&Ja‰3MRӻy;Hs/C)C2g7|LIR['_sLoaU~ 酘s's3c9I\ۊ/(srXA2ט oN7>0yb'9MQF]) αBv19t803>YuJr52>zxQevyp5KvPg{G=Z\KM7ͽw+5Z^ĖUy8m'ܧYW0w3;p-nΉϤuc?8b> o 7u]fʧh蠾774źRe^WOe~'e-j}zx}?u_ğ;Ob.уi:a`ޚ;j~at!xOE.ouu}QGa|y\n|9"ko GTyRr^ Ǘc_]'8s3MVuI0_4^'_)M.q<!gOgVyl ZY7{׿=ZOiʽs gaĸ\.~rsInƏyGK }Pu}ld5*?r<$Y,V}Qt|&\^oǚ9U\qkU_^*.>x:Zϖ $C)MwWɺ]KP@mJFi2҈_8|h sO,k0}b] :?ˋ1p |S#_O~_|,sx6?<'nEdeiW0?%m`{dH!1r(rsnd%9~j:o<*6p8YHr4I^a!ucS?oU&v,tuMc84);dڑe<1<^8~ڻ Q>a>y^U,7LΊ1&CױsGcK;f!wWs 7˂vXCe;=wOй>M.M90SO^۵/v﴿Eͽ$u=T x-}39iStr{ز;ɊBp6=QO~{|,g r}j~Rw %ɧr-_ucb*Kޔ9a|d𒻩%W8%瞃#Q[ϡN*7?KᩬG/|%8 Pܒ9F#_fd$GUs{?3?H]̟=RVZ?B߿S=>}:% c szf罝1x0O,.i",myos?w3.uO~~l}g.N sun#ݻ DN)/kNߑ<>~7qMKa Co\>ϭ\SwyΨZi_ZEe!ѓJ cq("Ql^yit:Mn'^p*27_M3N q1tX`p!:oh2yoE}h<]װ-i͟0J=꺩ED>tsj_&ÞwW+:ozT\p62׳|(~Ŝgɯ^˜f7m }.㚂w_f-Ornc\[Y;ڂdgy噠Dgd|ؖ{[~§L9'tJctnpQ73WC9>tk'Wg?ty1F2Qϖ\ ucuykKvKdq$\֫H0jMl?, ?k=<$jOj 0›D;y;A-G)M/Ci1C)&؏?rcjt4rA ] A"Խ^tZcI!FYn/TRǨ;km_k)|Ǚ{gO/ļl*B=\[9/$ d~ ~謥 j7.r(˾ @_'v me/tE4~x̅d ӽ3Lٵ_]b }jiڝ3.+I ~)w(v9z 2L[YrɃk/Qus lۇ<>3 ·F_'YܽBcxG'}8e/|`m]8iy)yvRo@ϖM9o{(\19(jW-uϪvA`>t}<.[:?0N=z}?νx+>}a*;ĜRԇL7_M[WE/V#vx,Y3Y'n`?bC%1s%f z&8Ӵ\n02} zg'tyVyM}/sλT۾TL͙}/˫Ig.aZtWߚCn~hfG_'>ׁ+ knR)vo%g<~az䚊:]8֧S1$ ~O8x93ъ߈|ޣqxܟ+tX9Kʑ0>FIoJ<>;BY|G17t7x^(OEss|kKdc9꡿1ޢ:>'9V7{ Jo>l3.LT%ApAgI/x~sW~4ߦŮ/(1_g.buxWͿ4l9D?W '+]s0V1w@>\~(΅:x^S cu3ë Ɵ5 1 6|_I9?4I1.~f桵|^eߙ:颯y:r`,%a}w?@:-C3'8>r16r~!{e|~<& @h~HyKq9]W_{ d'׺'O}nwۊAtK3SS/9 "̜zq0oi<xYyןI9V-<5俳ݿku? >F4|~t?nzw'ଚs|[Nx>k'1Y͜ǜ,,u7I?\ιdEu_?A+s/xR\axLrM9^+d!:86,>w?(u KE˝)V~(%ov|j|m^%\gp n|d'Wkt'ʀk?9g=s%'M=YlO-7{3ÜhX$7o"S9>[Ws^4_v/A\np0s734.+MoaѐNέ(~6Jn%9g}cuK%^wFƸ??3Q{o6y)|:_~9x_|~x(-[wi 3DWZ~)~R* *MПD[ߊ=ǹ9i!X 81k 6]%M#(s7wӜ;c>}_جi+ߌ~NA̕qKuy}>|܃2j~2]o>v>%o 6r3ISR׼x`Rrڵ݋ν#c#=JMrk,Axm3Zb_\xg@6kjpXiww}t/D7l)|<6xSocé_ g-/ ?{OD;5\j}u}Hg @?K:Qꨃj}n>r2 /ߔ=W 4>K;p~j9׎|A"Zgv>Z6?ҦeduH~4< ?~6\g;؇O}!6u>o!|HK8^/:FQryۅ^0̜, ͼѯ?E~$#Os߄Oκ} \"_j|F3j|Y޻?;{c |~\rw3?N2ba%8ߟr.<핑%֥>agr= 4 0{*Q~2#>+cfgٷGw̔Jǘ$F>֝&`қ|#1AoHY;^#WhG0_mV Ww^!m,?| MA)琯ſ܇ ~Z:郿 PQ'"!Ert / ܖWu|:_!on~^~[\]-i/[ߔ`S]cmVS7 |%|Ձ/'ip4S1$Ax&S'2%+S^762Wԙ)Ûob]:+<[QU3[Ook;=G%W|h}מS\* _n#GcSi}j|OڏNf$ _z|Lo>F <xk'R!ځT{cIs|v?s/S/0K_5//랫/ (}Gr㎟{Gw3ɃEQ2Su3RJX+ b9w?/͍үn9H'~Ӭ1F,˙0_? ̄ /ډ1yOO}%u2_Vp7޲%O:w :: o:r xІn~G|O%ooqu2=X?zsuW Wdzn]U[s]hAC=׭Vu~OuOx b.Ч4Ke[̵v2?uO>nPvr/Z&}Z}[us6~Q}_d_2N1 ozu,~jqIjcpovp(}I}.~v|gGlU?K$)żrGЇyjƫ k9C~M̉^Bm>o92r^Ǩ_hy3}LMȜ5?|Nn<םzŬy:,wWoYv nI-?}:@gI2_;5@%هXLM.<}ļf"vZ/&-飲Xއqж? }7i%~hdXxTcm_ \|kKx_Oo~R}z<:!|59:n IХi 8ӀW޷l4Ft.v/|U[_.vwЇM)wOK uS}D c#41్M˅hVtu!Vfu |tVy|O?yh!F3Q2Wj篭?_%1_{r-e@++c Nz_}\L"qNAL߇R\p/.8}=2Ţ`+x>bz_|֛9߭H7Ef_jm$96sZ=56rQ ߭<|hy ϩr pC,w?|]wc3[oPƮ oNwG%U?t ;F,uL '~JZGU ՟|=}*VW4j 8܏.sY7Ce*F\_Tw:$}c|{ʍPR䴧 _%Kȓ= \c~x%́gmeq7X<7|7wsY#L[.^=x_;}LO:=)S4|\&[ZPG]0t_~}O}HɫH~|pm>ꢮBXگF,MY~|H͛ N][H]IN._ۼ?D(w'XccSxE_OV{i__}Fy?`^Y^PUO0\}͕S_Iu'u {˹l}v ?|,ނ޸tb9|WK:Fcd 0gg-QTy7i];'O}4aUm.AGg'EɩgP|yEvr8#ǽӅηP'|SOc-# xOz|;>M-xRШ)G)J/y,w27?e>^*nj}!/K'gz:sJE X;XG<WWRԃ5w/̾i^M|a1֛!o+W˥_ JSƟBk?K󾥋zu=U?2c'LmqdV '=p,> 'UM_ڼAQw3WOwywlg=P/|?~<Ȼk>8?_tKn,R'b$j|N/v>zh6qROtp{wss~0o||? =lä\<#%$J>x>tĩ\t>vh&5d)|#߯wp0-c=ớgy|٧b_<+=rs {sMQG./>4,s?p9^{cӽ[*u9(znt+~qtI o;Gpw 0G0w #_Oj|lxWE*ﺬ)*wj~m{slj'hxx-b+5 |#t'Zzko9 CSjds&]kgo0>1=8\VZvͯON5U䒆N22a2n5,aylyG'ȃߙOB| RC5O 9 ßvZ9g`_+&c^9IydË'`vsnֵxW:Z\&MAC_Qkp=c8^D;u/CEgwza-NA\~_/Ȓz:9:'Gc9[Sg?8s-8g?F'?LFy,s( s.b`:d;Gx}|҃&qt_C}ay/XW˹Ə%YC/uT:?%_33韾xj'.~/35{lVKܩOa d5U%p9 , \`&xӏ'K {[O0{ }&?Ӯ|vN;)5>r':vxiҲmm;| FG3Ż)Yf~|^JX 񳘇Xum| " r.gzW,#>\ =Uk^x+s͍{NL:@}[W?u+e=2>|Fw~i>Ud σC8/.oI7ŝ5Gڇ/GrÅe=ʭ % <";ZW0lՖ?WV7M}AM/P2 Sڊ@ y1α-3ϫF_qZj?V⯰)|<Ԩoj i}O<=`1)E_\ۤѽj5}^j؝+ozG.~4|l+=O.nJ |?>ز?HIv_)4rc*[Qo:yzE 3OEWCe;yJ3}J6󩫌7o%9Z~11O]}Z½m^jՁeRB9G2uj~#~{tK?:}9+t|2ܑrv+wO4;rPd v\+V{ίtF<ˇuoxV3`O$Qȏz>eF]Z&OZjluW'c/{.q?5e:3H-ǽ\4N_JYPبgZlsO㏋}~|%$?dZ~]K AW{u7(ֿ\ϰxf }_~aP m1_:/2WSM^D 9QїYy| Vjcy- 93Y72 R(9mrwi h椲_ywxlxFj>&=:=nTl>t3ß!+dS<$k:ȹf9z ez?2ѕNx'YAs.Z.mky:pWgˋ-?1݋g=7eH|h_tԸ S$ѭDkoϜ,s 6>`)g? >>+U G>L:kx!xqfo^fap$_O%e>Rc_ x1 N?E^ǠSdz <MćvpLި[up%CRW|Lm9X/~AWv 7[_ÏÇ1_$נsR/y =Dxq?k |bz 7gi;姉nouϕ uBbc=ѥ7<|d K-/s<ofWo37I$JD?Iڜ|=}/ivc|tk_:DMC#lv3yBtsJ8'Ws_mğ+3|X|0PxZI=x1c#y&$z_|ȃlBc}H:+oN|?y߃O9[>zwxIN3=ȺW?{w&* vu1&VEo ݯ.$K?-`[ȣɢrx_›\qߑ\E &[kyRG`=eS-RLׂ_7,? ~6<ƟvfgL#Iv7~uV=~@^5R,r?Vm #^ā"Jn$Oޟ{ J~g켾{k06=>F/ƹg'26667lqyCź ĞwonP u?<(o(YGo癗=qK\U 2d KS!o\#wһt7>$]o+r"Ag9&C e-@Oέ\Zˍ0.9R=oN3|9pZsVמ].ۘrW7`-ĸi:M?ո>Fs9Qr>qtOU^Wd -{ݕ_y氍?_uQ?:.–#YW|{y 0wG1t8ktaw>QKq ީ`BQ37? ]p19nl^o{{2_ +<垙Wg!R#w~YZq+Ǐ~oL{|M֐^EB:Q*؏עȖcs= isjy2ƓB^bx6_ SwWr"bLU"t'$J_b^|rxV/x`k>~Ŋ7 +<;O4(yE֠徃^XOߘ݇~|᪀vM; P<"yV'yh|4n FߑGؽd|ح7.]rLmcb׫IߴR9rEjl߯eY謣 ^ ugoqj9zx9^WEY@g >C_^Yn,m˫ŧߡ{ _c 2;my21͑߰>摟G1<|\ևmd'z>[osS*?QGFW{uKH| 7/F{F$T!:@77vs0|G! |y/M\=UE#l>G>7:J ?}F}ao烧o}9|8,i+g2jWםSħRU;%ܪv: v :>|k#x|6at Ʒ-x5M.S|Cwuԝ= O΃YX9WQ < O5ysorDw=i"=$:_G!W.lk7QT_lY4tJ9 \ 9yZ||L])a8b9\Cc l+y<7fkϙIKK1qɋ4ͼ ~U >oKJ8L KSgЇ<7F:&Տp߯=,9]pD.\f9EVxQp:>*t p >hyu8g99/q~O[~UwB$tK3_o|w#ɺ )8{)n? W>H|KZM@6q*ɋ(x1ZzaUu^d| 㷓ķs/X3vQ5R9_lecyQ|GM_S77~{+ARw<~?GpGr}J ޤQM7Q >M=Vn1 e'/6/6|%.wUP/?s/o<{'A1|XISE.k|}C<@MΊ$э_(~q#|!W{ .<.;SN/sPi\]Y-W|Cҿ:#_Ƌ:avMAcƣ1:xc^k#5lf?$4Ek|O_~eN4>^z̓ƒ߳Dї%UNI†4_TAAL?ky +RZg{]'U:-'glj:7DM$<'ՇwwgtSYrCW:1j?&|y\V?Z֚#~ZQ c$I| O2?%A!؀x7_+elu>cf5k/%p [~ UW>uϲjeeʃ%K5{>I揾-f/yc3#>f3x溉w?<~]k!s8G;G 8O1p[\ׇCBy3s5uυ~r N)u3?T;4“:7|>TR <1gKkkX .# t: _*|n7}kBE貘;KFu.|3J6[.9cO6uW  O s^K+A,>,srdqZm?uP px}q2r*t&sѡ71O{UKzpC&Ibvo%Ǥ# o#:=:H gU/zɹZ g~^S(!75!DgycLDZ ܰBynӊMPlO+uVѿMW 6o[ +'k s7ã4.)Z_ſtr// ?YN#7W+i3Óy9CRԳ//Pw1PauKPo x%{ZƝoR=Bp%T~itWj:~(EzXS3?H?xi^n2Fm<:)!ߦ \Ƒ_"1Q#N)Η I. ; ' l9,:po.EN_&bA#nOu\b:*(|9ePx4Z,gr¤n=N,DH\%&֏.=ف?U?kE|AP^mcf[o%xExg n}L63qPXJyv֝:Qne}v|GJ0Í0w<8LitϨ;%0d>y#d*>nIq}wu^J KɑߋNV;ke;)y}訬!Bx rLf',ޗr%w> uW ~7@2tΦc݊iSF?rkw+CKGǯ=e-f;W!D6y2p6߇yY+9g#Cѫ#U˹dbCN7o:`|洶SޭM_?"{ϓ&Y'c9g߆Νu#D?3,AQ OCw;< .a.sqwe%p\#7 ϟ5_$HLH>x%ֻ>Qz 2>|8:!#=>̡|6ۘTGF NZCKus oz`u!|}Aù|@ҔzAa/K uU7usQ(|&pV6&ふ7}3$3 XaO>?m_.β~fz 3 O5–3/'G/:|̳_ 5m)I^]஖9/_k{/WýՏrzjpnu4pY~xWqp.Ų|^%4ގ:_MSz3Q?G;>>n' }tp$R\ÜSt'/o:¼ts ~5wɋ}I\ ?vx);K~§k_`QI}5J~g AǩZ|V$n`.燗EObook6wsOz#BW7s%k]eG9+̣$ r3%e.E7tm%'QKgy`Ӈ;֏3w"pWyA|byG]yܱCY!zb>[sY扁xӕjPrյ?.Ωa>g[SIg~ԅw'ɠ<~*Dk!wMo;]< ~9_;V$%,^jhxb2,}&tT?|}rtm>X}ɺyE=># - e5<)r4s/~~[w' /| +7],8*y:2mԿv^U`i~A ]x qY|\FSg.??"/3M9? ?΀v9zv>Mr5 ^4/`Ѫ%SL Iq.[<>йr"q~_Bl't}.,aI tyH.:{?^R_<*piA%{$]yM{Z:=6,'Mglcֿْͻit3UGl괮}`#7L]'X&qj| j^ Z4|ן;-.'[XnG >fs/`c~=2˽3\Ax2zw$}  %ۉB3Rݿ-;}bA6T2nqȢO]r#z*o`j϶ Z͟~Dso]RctV.MRivww]Ə ^8YrWKq)2 Ns|P zČʺHc|T~qH.TN=~֯ty'Cj?}k[wÛO&QC?G^fCwGבI̖-OoxO2IÜOG'WKܝjJ)g2RGC~z5/2t`xk?N@{$I [[ED?&]k|`L{lAky/l.xҁP|$b3xO7}Hy.=f6G]\P,Ǯ_O{cx͝+\/E4WR/N-j~jX_̧J pI|)y&Q3ŕ ķ/zYnS׿)J?@6 a|—S4ꞏVGm|`_q=#e§mcƧtJs}dw0mFϺxlv&+ 3SnL/n^V?i&Stk3_zP;tk5߶ƻG>`#-r!W~5y)$Gs13{f+)=Gg@kexDr4?a)|S9^Fܹ"QxǕ8^0u:~6O~#}y9WHC|>7(yeSuols8H:Jp޷ɏWVG[n#uun=屶s5nCmJo3*-{xEV ~-qxaNg.n9)|z,GtgǢk>ER61.[͜ Mxo`si۳7(Rp8gx=GP{W1-~yG{,ӧj8xNJ|cB 9r׹zF;|KgRdTƿC(Cj ~ O*@A!xIy #[G[q`Ij"mɖ7 <|]ٿcrtRWp. Ο<`e,~p2L3Ow xlYߣyae!;euAw/eqg>^zÒ7iurɖKzl D%A/:<(xWGxziIX.\71WN7?Vt],auK9\, ?J#(n?fqLoD'jiz5ƜΣD{ue <[{51z)r4翈t`jػmkev;}TЗϥ1 (ii\JZj~J,ws+ ?Oqf7ȣ7zMH.dRg e& UۈkoK$x>%72/-μt)tMsgW|o{b9IpX絹ߢ172[/pVt>G\ᙬ( :| WHf786NO> u?ZOyml\q?9%#kg|duóYg_dfJ rȋqˣFw'ml> t s*y]=oj_5)o3 Q7K&}Nxe*<1qA]n]&̇~|?s5p/Xs=u B|NַB Ar[leNcn/_SaޅyrN8sVyu#iJOCۘ›ppglᗨٳGl%|qX  5ݠ>/9}GMr?ijG< ?cΟ!o\6Ic 錴n~<#Go1yf.Gࣚ_N7Zڅƃ'OϷYn~o|tXG [O?g1&ooFͧ<W㬧G!Ek% y: ߻fk>O!o% = Nh>X Uo{berVbABg|bMr)O9lσn?>6_07?Gx_O=m穟qϺbװw }}_/cܿ+~}OWؤL=?Cşşs2~ wN= `~>~Q|'}E>{z?Ɵg;?}SuOO޷ߩ4~i|=;ün{' )~_??}߾s߮\;~m73?|ͷ=^}޷; glmnet/vignettes/Coxnet.Rmd0000644000176200001440000003207614431021716015463 0ustar liggesusers--- title: "Regularized Cox Regression" author: - Kenneth Tay - Noah Simon - Jerome Friedman - Trevor Hastie - Rob Tibshirani - Balasubramanian Narasimhan date: "`r format(Sys.time(), '%B %d, %Y')`" bibliography: assets/glmnet_refs.bib link-citations: true output: pdf_document: fig_caption: yes toc: yes toc_depth: 3 vignette: > %\VignetteIndexEntry{Regularized Cox Regression} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ```{r include=FALSE} # the code in this chunk enables us to truncate the print output for each # chunk using the `out.lines` option # save the built-in output hook hook_output <- knitr::knit_hooks$get("output") # set a new output hook to truncate text output knitr::knit_hooks$set(output = function(x, options) { if (!is.null(n <- options$out.lines)) { x <- xfun::split_lines(x) if (length(x) > n) { # truncate the output x <- c(head(x, n), "....\n") } x <- paste(x, collapse = "\n") } hook_output(x, options) }) ``` ## Introduction This vignette describes how one can use the `glmnet` package to fit regularized Cox models. The Cox proportional hazards model is commonly used for the study of the relationship beteween predictor variables and survival time. In the usual survival analysis framework, we have data of the form $(y_1, x_1, \delta_1), \ldots, (y_n, x_n, \delta_n)$ where $y_i$, the observed time, is a time of failure if $\delta_i$ is 1 or a right-censored time if $\delta_i$ is 0. We also let $t_1 < t_2 < \ldots < t_m$ be the increasing list of unique failure times, and let $j(i)$ denote the index of the observation failing at time $t_i$. The Cox model assumes a semi-parametric form for the hazard $$ h_i(t) = h_0(t) e^{x_i^T \beta}, $$ where $h_i(t)$ is the hazard for patient $i$ at time $t$, $h_0(t)$ is a shared baseline hazard, and $\beta$ is a fixed, length $p$ vector. In the classic setting $n \geq p$, inference is made via the partial likelihood $$ L(\beta) = \prod_{i=1}^m \frac{e^{x_{j(i)}^T \beta}}{\sum_{j \in R_i} e^{x_j^T \beta}}, $$ where $R_i$ is the set of indices $j$ with $y_j \geq t_i$ (those at risk at time $t_i$). Note there is no intercept in the Cox model as it is built into the baseline hazard, and like it, would cancel in the partial likelihood. In `glmnet`, we penalize the negative log of the partial likelihood with an elastic net penalty. (Credits: The original `"coxnet"` algorithm for right-censored data was developed by Noah Simon, Jerome Friedman, Trevor Hastie and Rob Tibshirani: see @coxnet for details. The other features for Cox models, introduced in v4.1, were developed by Kenneth Tay, Trevor Hastie, Balasubramanian Narasimhan and Rob Tibshirani.) ## Basic usage for right-censored data We use a pre-generated set of sample data and response. `x` must be an $n\times p$ matrix of covariate values --- each row corresponds to a patient and each column a covariate. `y` is an $n \times 2$ matrix, with a column `"time"` of failure/censoring times, and `"status"` a 0/1 indicator, with 1 meaning the time is a failure time, and 0 a censoring time. The `Surv` function in the `survival` package creates such a response matrix, and it is recommended that the user uses the output of a call to `Surv` for the response to `glmnet`. (For backward compatibility, `glmnet` can accept a two-column matrix with column names `"time"` and `"status"` for right-censored data.) ```{r} library(glmnet) library(survival) data(CoxExample) x <- CoxExample$x y <- CoxExample$y y[1:5, ] ``` We apply the `glmnet` function to compute the solution path under default settings: ```{r} fit <- glmnet(x, y, family = "cox") ``` All the standard options such as `alpha`, `weights`, `nlambda` and `standardize` package, and their usage is similar as in the Gaussian case. (See the vignette ["An Introduction to `glmnet`"](https://glmnet.stanford.edu/articles/glmnet.html) for details, or refer to the help file `help(glmnet)`.) We can plot the coefficients with the `plot` method: ```{r} plot(fit) ``` As before, we can extract the coefficients at certain values of $\lambda$: ```{r out.lines = 10} coef(fit, s = 0.05) ``` Since the Cox Model is not commonly used for prediction, we do not give an illustrative example on prediction. If needed, users can refer to the help file by typing `help(predict.glmnet)`. ### Cross-validation The function `cv.glmnet` can be used to compute $K$-fold cross-validation (CV) for the Cox model. The usage is similar to that for other families except for two main differences. First, `type.measure` only supports `"deviance"` (also default) which gives the partial-likelihood, and `"C"`, which gives the Harrell *C index*. This is like the area under the curve (AUC) measure of concordance for survival data, but only considers comparable pairs. Pure concordance would record the fraction of pairs for which the order of the death times agree with the order of the predicted risk. However, with survival data, if an observation is right censored at a time *before* another observation's death time, they are not comparable. The code below illustrates how one can perform cross-validation using the Harell C index. Note that unlike most error measures, a higher C index means better prediction performance. ```{r} set.seed(1) cvfit <- cv.glmnet(x, y, family = "cox", type.measure = "C") ``` Once fit, we can view the optimal $\lambda$ value and a cross validated error plot to help evaluate our model. ```{r} plot(cvfit) ``` As with other families, the left vertical line in our plot shows us where the CV-error curve hits its minimum. The right vertical line shows us the most regularized model with CV-error within 1 standard deviation of the minimum. We also extract such optimal $\lambda$'s: ```{r} cvfit$lambda.min cvfit$lambda.1se ``` Second, the option `grouped = TRUE` (default) obtains the CV partial likelihood for the Kth fold by subtraction, i.e. by subtracting the log partial likelihood evaluated on the full dataset from that evaluated on the $(K-1)/K$ dataset. This makes more efficient use of risk sets. With `grouped = FALSE` the log partial likelihood is computed only on the $K$th fold, which is only reasonable if each fold has a large number of observations. ### Handling of ties `glmnet` handles ties in survival time with the Breslow approximation. This is different from `survival` package's `coxph` function, whose default tie-handling method is the Efron approximation. ```{r} # create x matrix set.seed(1) nobs <- 100; nvars <- 15 x <- matrix(rnorm(nobs * nvars), nrow = nobs) # create response ty <- rep(rexp(nobs / 5), each = 5) tcens <- rbinom(n = nobs, prob = 0.3, size = 1) y <- Surv(ty, tcens) # coefficients from these two models will not line up because # of different tie handling methods glmnet_fit <- glmnet(x, y, family = "cox", lambda = 0) coxph_fit <- coxph(y ~ x) plot(coef(glmnet_fit), coef(coxph_fit)) abline(0, 1) ``` `glmnet` is not able to perform the Efron approximation at the moment. `survival`'s `coxph` can perform the Breslow approximation by specifying `ties = "breslow"`: ```{r} # coefficients from these two models will line up glmnet_fit <- glmnet(x, y, family = "cox", lambda = 0) coxph_fit <- coxph(y ~ x, ties = "breslow") plot(coef(glmnet_fit), coef(coxph_fit)) abline(0, 1) ``` ## Cox models for start-stop data Since version 4.1 `glmnet` can fit models where the response is a (start, stop] time interval. As explained in @Therneau2000, the ability to work with start-stop responses opens the door to fitting regularized Cox models with * time-dependent covariates, * time-dependent strata, * left truncation, * multiple time scales, * multiple events per subject, * independent increment, marginal, and conditional models for correlated data, and * various forms of case-cohort models. The code below shows how to create a response of this type (using `survival` package's `Surv` function) and how to fit such a model with `glmnet`. ```{r} # create x matrix set.seed(2) nobs <- 100; nvars <- 15 xvec <- rnorm(nobs * nvars) xvec[sample.int(nobs * nvars, size = 0.4 * nobs * nvars)] <- 0 x <- matrix(xvec, nrow = nobs) # non-sparse x x_sparse <- Matrix::Matrix(xvec, nrow = nobs, sparse = TRUE) # sparse x # create start-stop data response beta <- rnorm(5) fx <- x_sparse[, 1:5] %*% beta / 3 ty <- rexp(nobs, drop(exp(fx))) tcens <- rbinom(n = nobs, prob = 0.3, size = 1) starty <- runif(nobs) yss <- Surv(starty, starty + ty, tcens) # fit regularized Cox model with start-stop data fit <- glmnet(x, yss, family = "cox") ``` (Note that the call above would have worked as well if `x` was replaced by `x_sparse`.) `cv.glmnet` works with start-stop data too: ```{r} cv.fit <- cv.glmnet(x, yss, family = "cox", nfolds = 5) plot(cv.fit) ``` As a sanity check, the code below shows that fitting start-stop responses using `glmnet` with `lambda = 0` matches up with `coxph`'s result: ```{r} glmnet_fit <- glmnet(x, yss, family = "cox", lambda = 0) coxph_fit <- coxph(yss ~ x) plot(coef(glmnet_fit), coef(coxph_fit)) abline(0, 1) ``` ## Stratified Cox models One extension of the Cox regression model is to allow for strata that divide the observations into disjoint groups. Each group has its own baseline hazard function, but the groups share the same coefficient vector for the covariates provided by the design matrix `x`. `glmnet` can fit stratified Cox models with the elastic net penalty. With `coxph` one can specify strata in the model formula. Since `glmnet` does not use a model formula, we achieve this by adding a strata attribute to the `Surv` response object. We achieve this via the function `stratifySurv`: ```{r} strata <- rep(1:5, length.out = nobs) y2 <- stratifySurv(y, strata) str(y2[1:6]) ``` `stratifySurv` returns an object of class `stratifySurv`. We can then pass this `stratifySurv` object as the response to a `glmnet` call. `glmnet` will fit a stratified Cox model if it detects that the response has class `stratifySurv`. ```{r} fit <- glmnet(x, y2, family = "cox") ``` This `stratifySurv` object can also be passed to `cv.glmnet` to fit stratified Cox models with cross-validation: ```{r} cv.fit <- cv.glmnet(x, y2, family = "cox", nfolds = 5) plot(cv.fit) ``` Note that simply giving the response a `"strata"` attribute is not enough! The response needs to be of class `stratifySurv` in order for subsetting to work correctly. To protect against this, an error will be thrown if the response has a `"strata"` attribute but is not of class `stratifySurv`. Add strata via the `stratifySurv` function. ```{r} y3 <- y attr(y3, "strata") <- strata str(y3[1:6]) # note that the strata attribute is no longer there ``` ```{r error=TRUE} fit <- glmnet(x, y3, family = "cox") ``` ## Plotting survival curves Fitting a regularized Cox model using `glmnet` with `family = "cox"` returns an object of class `"coxnet"`. Class `"coxnet"` objects have a `survfit` method which allows the user to visualize the survival curves from the model. In addition to the `"coxnet"` object, the user must pass the `x` and `y` objects used to fit the model (for computation of the baseline hazard), as well as the lambda value for which the survival curve is desired: ```{r} fit <- glmnet(x, y, family = "cox") survival::survfit(fit, s = 0.05, x = x, y = y) ``` We are unable to provide standard errors for these survival curves, so we do not present the confidence bounds for them. To plot the survival curve, pass the result of the `survfit` call to `plot`: ```{r} plot(survival::survfit(fit, s = 0.05, x = x, y = y)) ``` As noted in the documentation for `survival::survfit.coxph`, without new data, a curve is produced for a single "pseudo" subject with covariate values equal to the means of the data set, and this resulting curve(s) almost never make sense. We can get survival curves for individual observations by passing a `newx` argument: ```{r} survival::survfit(fit, s = 0.05, x = x, y = y, newx = x[1:3, ]) plot(survival::survfit(fit, s = 0.05, x = x, y = y, newx = x[1:3, ])) ``` If the original model was fit with strata, then the `strata` option needs to be specified as well. If `newx` is being passed for such a model, the strata for these new observations need to be passed via `newstrata`. ```{r} y2 <- stratifySurv(y, rep(1:2, length.out = nobs)) fit <- glmnet(x, y2, family = "cox") survival::survfit(fit, s = 0.01, x = x, y = y2) # survival curve plot for first two individuals in dataset plot(survival::survfit(fit, s = 0.01, x = x, y = y2, newx = x[1:2, ], newstrata = strata[1:2])) ``` To be consistent with other methods in `glmnet`, if the `s` parameter is not specified, survival curves are returned for the entire `lambda` sequence. The survival curves are returned as a list, one element for each `lambda` value. ```{r} sf <- survival::survfit(fit, x = x, y = y2) length(sf) length(fit$lambda) ``` The `survfit` method is available for `cv.glmnet` objects as well. By default, the `s` value chosen is the "lambda.1se" value stored in the CV object. The `s` value can also be set to the `"lambda.min"` value stored in the CV object. ```{r} cv.fit <- cv.glmnet(x, y2, family = "cox", nfolds = 5) survival::survfit(cv.fit, x = x, y = y2) survival::survfit(cv.fit, s = "lambda.min", x = x, y = y2) ``` ## References glmnet/vignettes/relax.Rmd0000644000176200001440000002047614046050560015340 0ustar liggesusers--- title: "The Relaxed Lasso" author: - Trevor Hastie - Balasubramanian Narasimhan - Rob Tibshirani date: "`r format(Sys.time(), '%B %d, %Y')`" bibliography: assets/glmnet_refs.bib link-citations: true output: pdf_document: fig_caption: yes toc: yes toc_depth: 3 vignette: > %\VignetteIndexEntry{The Relaxed Lasso} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ```{r include=FALSE} # the code in this chunk enables us to truncate the print output for each # chunk using the `out.lines` option # save the built-in output hook hook_output <- knitr::knit_hooks$get("output") # set a new output hook to truncate text output knitr::knit_hooks$set(output = function(x, options) { if (!is.null(n <- options$out.lines)) { x <- xfun::split_lines(x) if (length(x) > n) { # truncate the output x <- c(head(x, n), "....\n") } x <- paste(x, collapse = "\n") } hook_output(x, options) }) ``` ## Introduction In this vignette, we describe how the `glmnet` package can be used to fit the *relaxed lasso*. The idea of the relaxed lasso is to take a `glmnet` fitted object, and then for each lambda, refit the variables in the active set without any penalization. This gives the "relaxed" fit. (We note that there have been other definitions of a relaxed fit, but this is the one we prefer.) This could of course be done for elastic net fits as well as lasso. However, if the number of variables gets too close to the sample size $N$, the relaxed path will be truncated. Furthermore, for binomial and other nonlinear generalized linear models (GLMs) convergence can be an issue with our current implementation if the number of variables is too large, and perversely if the relaxed fit is too strong. Suppose the `glmnet` fitted linear predictor at $\lambda$ is $\hat\eta_\lambda(x)$ and the relaxed version is $\tilde\eta_\lambda(x)$. We also allow for shrinkage between the two: $$\tilde \eta_{\lambda,\gamma}=(1-\gamma)\tilde \eta_\lambda(x)+\gamma\hat\eta_\lambda(x).$$ $\gamma\in[0,1]$ is an additional tuning parameter which can be selected by cross-validation (CV). The debiasing will potentially improve prediction performance, and CV will typically select a model with a smaller number of variables. This procedure is very competitive with forward-stepwise and best-subset regression, and has a considerable speed advantage when the number of variables is large. This is especially true for best-subset, but even so for forward stepwise. The latter has to plod through the variables one-at-a-time, while `glmnet` will just plunge in and find a good active set. Further details on this form of relaxed fitting can be found in @best_subset; more information on glmnet and elastic-net model in general is given in @glmnet, @coxnet, @strongrules, and @block. ## Simple relaxed fitting We demonstrate the most basic relaxed lasso fit as a first example. We load some pre-generated data and fit the relaxed lasso on it by calling `glmnet` with `relax = TRUE`: ```{r out.lines = 15} library(glmnet) data(QuickStartExample) x <- QuickStartExample$x y <- QuickStartExample$y fit <- glmnet(x, y, relax = TRUE) print(fit) ``` In addition to the three columns usually printed for `glmnet` objects (`Df`, `%Dev` and `Lambda`), there is an extra column `%Dev R` (`R` stands for "relaxed") which is the percent deviance explained by the relaxed fit. This is always higher than its neighboring column, which is the percent deviance exaplined for the penalized fit (on the training data). Notice that when the `Df` stays the same, the `%Dev R` does not change, since this typically means the active set is the same. (The code is also smart enough to only fit such models once, so in the truncated display shown, 9 lasso models are fit, but only 4 relaxed fits are computed). The fit object is of class `"relaxed"`, which inherits from class `"glmnet"`. Hence, the usual `plot` method for `"glmnet"` objects can be used. The code below demonstrates some additional flexibility that `"relaxed"` objects have for plotting. ```{r} par(mfrow = c(1, 3), mar=c(4,4,5.5,1)) plot(fit, main = "gamma = 1") plot(fit, gamma = 0.5, main = "gamma = 0.5") plot(fit, gamma = 0, main = "gamma = 0") ``` `gamma = 1` is the traditional `glmnet` fit (also `relax = FALSE`, the default), `gamma = 0` is the unpenalized fit, and `gamma = 0.5` is a mixture of the two (at the coefficient level, and hence also the linear predictors). We can also select `gamma` using `cv.glmnet`, which by default uses the 5 values `c(0, 0.25, 0.5, 0.75, 1)`. This returns an object of class `"cv.relaxed"`. ```{r} set.seed(1) cfit <- cv.glmnet(x, y, relax = TRUE) plot(cfit) ``` To remove the shading of the standard error bands, pass `se.bands = FALSE`: ```{r} plot(cfit, se.bands = FALSE) ``` As with regular `"cv.glmnet"` objects, you can make predictions from a relaxed CV object. Just as the `s` option (for `lambda`) admits two special strings `"lambda.1se"` and `"lambda.min"` for special values of `lambda`, the `gamma` option admits two special strings `"gamma.1se"` and `"gamma.min"` for special values of `gamma`. For example, the code below makes predictions for `newx` at the `lambda` and `gamma` values that has the smallest CV error: ```{r} predict(cfit, newx = x[1:5, ], s = "lambda.min", gamma = "gamma.min") ``` Printing class `"cv.relaxed"` objects gives some basic information on the cross-validation: ```{r} print(cfit) ``` ## More details on relaxed fitting While we only demonstrate relaxed fits for the default Gaussian family, *any* of the families fit by `glmnet` can also be fit with the `relaxed` option. Although `glmnet` has a `relax` option, you can also fit relaxed lasso models by post-processing a `glmnet` object with the `relax.glmnet` function. ```{r `relaxed`} fit <- glmnet(x,y) fitr <- relax.glmnet(fit, x = x, y = y) ``` This will rarely need to be done; one use case is if the original fit took a long time, and the user wants to avoid refitting it. Note that the arguments are named in the call in order for them to be passed correctly via the `...` argument in `relax.glmnet`. As mentioned, a `"relaxed"` object inherits from class `"glmnet"`. Apart from the class modification, it has an additional component named `relaxed` which is itself a `glmnet` object, but with the relaxed coefficients. The default behavior of extractor functions like `predict` and `coef`, as well as `plot` will be to present results from the `glmnet` fit, unless a value of `gamma` is given different from the default value `gamma = 1` (see the plots above). The `print` method gives additional info on the relaxed fit. Likewise, a `cv.relaxed` object inherits from class `cv.glmnet`. Here the `predict` method by default uses the optimal relaxed fit; if predictions from the CV-optimal *original* `glmnet` fit are desired, one can directly use `predict.cv.glmnet`. Similarly, use `print` to print information for cross-validation on the relaxed fit, and `print.cv.glmnet` for information on the cross-validation for the original `glmnet` fit. ```{r} print(cfit) print.cv.glmnet(cfit) ``` ### Possible convergence issues for relaxed fits `glmnet` itself is used to fit the relaxed fits by using a single value of zero for `lambda`. However, for nonlinear models such as `family = "binomial"`, `family = "multinomial"` and `family="poisson"`, there can be convergence issues. This is because `glmnet` does not do step size optimization, rather relying on the pathwise fit to stay in the "quadratic" zone of the log-likelihood. We have an optional `path = TRUE` option for `relax.glmnet`, which actually fits a regurized path toward the `lambda = 0` solution, and thus avoids the issue. The default is `path = FALSE` since this option adds to the computing time. ## Application to forward stepwise regression One use case for a relaxed fit is as a faster version of forward stepwise regression. With a large number `p` of variables, forward stepwise regression can be tedious. On the other hand, because the lasso solves a convex problem, it can plunge in and identify good candidate sets of variables over 100 values of `lambda`, even though `p` could be in the tens of thousands. In a case like this, one can have `cv.glmnet` do the selection of variables. ```{r} fitr <- cv.glmnet(x, y, gamma = 0, relax = TRUE) plot(fitr) ``` Notice that we only allow `gamma = 0`, so in this case we are not considering the blended fits. ## References glmnet/vignettes/glmnet.Rmd0000644000176200001440000017750514755627521015537 0ustar liggesusers--- title: "An Introduction to `glmnet`" author: - Trevor Hastie - Junyang Qian - Kenneth Tay date: "`r format(Sys.time(), '%B %d, %Y')`" bibliography: assets/glmnet_refs.bib link-citations: true output: pdf_document: fig_caption: yes toc: yes toc_depth: 3 vignette: > %\VignetteIndexEntry{An Introduction to glmnet} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ```{r include=FALSE} # the code in this chunk enables us to truncate the print output for each # chunk using the `out.lines` option # save the built-in output hook hook_output <- knitr::knit_hooks$get("output") # set a new output hook to truncate text output knitr::knit_hooks$set(output = function(x, options) { if (!is.null(n <- options$out.lines)) { x <- xfun::split_lines(x) if (length(x) > n) { # truncate the output x <- c(head(x, n), "....\n") } x <- paste(x, collapse = "\n") } hook_output(x, options) }) ``` ## Introduction Glmnet is a package that fits generalized linear and similar models via penalized maximum likelihood. The regularization path is computed for the lasso or elastic net penalty at a grid of values (on the log scale) for the regularization parameter lambda. The algorithm is extremely fast, and can exploit sparsity in the input matrix `x`. It fits linear, logistic and multinomial, poisson, and Cox regression models. It can also fit multi-response linear regression, generalized linear models for custom families, and relaxed lasso regression models. The package includes methods for prediction and plotting, and functions for cross-validation. The authors of glmnet are Jerome Friedman, Trevor Hastie, Rob Tibshirani, Balasubramanian Narasimhan, Kenneth Tay and Noah Simon, with contribution from Junyang Qian, and the R package is maintained by Trevor Hastie. A MATLAB version of glmnet is maintained by Junyang Qian, and a Python version by B. Balakumar (although both are a few versions behind). This vignette describes basic usage of glmnet in R. There are additional vignettes that should be useful: * ["Regularized Cox Regression"](https://glmnet.stanford.edu/articles/Coxnet.html) describes how to fit regularized Cox models for survival data with `glmnet`. * ["GLM `family` functions in `glmnet`"](https://glmnet.stanford.edu/articles/glmnetFamily.html) describes how to fit custom generalized linear models (GLMs) with the elastic net penalty via the `family` argument. * ["The Relaxed Lasso"](https://glmnet.stanford.edu/articles/relax.html) describes how to fit relaxed lasso regression models using the `relax` argument. `glmnet` solves the problem $$ \min_{\beta_0,\beta} \frac{1}{N} \sum_{i=1}^{N} w_i l(y_i,\beta_0+\beta^T x_i) + \lambda\left[(1-\alpha)\|\beta\|_2^2/2 + \alpha \|\beta\|_1\right], $$ over a grid of values of $\lambda$ covering the entire range of possible solutions. Here $l(y_i,\eta_i)$ is the negative log-likelihood contribution for observation $i$; e.g. for the Gaussian case it is $\frac{1}{2}(y_i-\eta_i)^2$. The _elastic net_ penalty is controlled by $\alpha$, and bridges the gap between lasso regression ($\alpha=1$, the default) and ridge regression ($\alpha=0$). The tuning parameter $\lambda$ controls the overall strength of the penalty. It is known that the ridge penalty shrinks the coefficients of correlated predictors towards each other while the lasso tends to pick one of them and discard the others. The elastic net penalty mixes these two: if predictors are correlated in groups, an $\alpha=0.5$ tends to either select or leave out the entire group of features. This is a higher level parameter, and users might pick a value upfront or experiment with a few different values. One use of $\alpha$ is for numerical stability; for example, the elastic net with $\alpha = 1 - \epsilon$ for some small $\epsilon > 0$ performs much like the lasso, but removes any degeneracies and wild behavior caused by extreme correlations. The `glmnet` algorithms use cyclical coordinate descent, which successively optimizes the objective function over each parameter with others fixed, and cycles repeatedly until convergence. The package also makes use of the strong rules for efficient restriction of the active set. Due to highly efficient updates and techniques such as warm starts and active-set convergence, our algorithms can compute the solution path very quickly. The code can handle sparse input-matrix formats, as well as range constraints on coefficients. The core of `glmnet` is a set of Fortran subroutines, which make for very fast execution. The theory and algorithms in this implementation are described in @glmnet, @coxnet, @strongrules and @block. ## Installation Like many other R packages, the simplest way to obtain `glmnet` is to install it directly from CRAN. Type the following command in R console: ```{r, eval=FALSE} install.packages("glmnet", repos = "https://cran.us.r-project.org") ``` Users may change the `repos` argument depending on their locations and preferences. Other arguments such as the directories to install the packages at can be altered in the command. For more details, see `help(install.packages)`. Alternatively, users can download the package source from [CRAN](https://cran.r-project.org/package=glmnet) and type Unix commands to install it to the desired location. ## Quick Start The purpose of this section is to give users a general sense of the package. We will briefly go over the main functions, basic operations and outputs. After this section, users may have a better idea of what functions are available, which ones to use, or at least where to seek help. First, we load the `glmnet` package: ```{r} library(glmnet) ``` The default model used in the package is the Guassian linear model or "least squares", which we will demonstrate in this section. We load a set of data created beforehand for illustration: ```{r} data(QuickStartExample) x <- QuickStartExample$x y <- QuickStartExample$y ``` The command loads an input matrix `x` and a response vector `y` from this saved R data archive. We fit the model using the most basic call to `glmnet`. ```{r} fit <- glmnet(x, y) ``` `fit` is an object of class `glmnet` that contains all the relevant information of the fitted model for further use. We do not encourage users to extract the components directly. Instead, various methods are provided for the object such as `plot`, `print`, `coef` and `predict` that enable us to execute those tasks more elegantly. We can visualize the coefficients by executing the `plot` method: ```{r} plot(fit) ``` Each curve corresponds to a variable. It shows the path of its coefficient against the $\ell_1$-norm of the whole coefficient vector as $\lambda$ varies. The axis above indicates the number of nonzero coefficients at the current $\lambda$, which is the effective degrees of freedom (_df_) for the lasso. Users may also wish to annotate the curves: this can be done by setting `label = TRUE` in the plot command. A summary of the `glmnet` path at each step is displayed if we just enter the object name or use the `print` function: ```{r out.lines = 10} print(fit) ``` It shows from left to right the number of nonzero coefficients (`Df`), the percent (of null) deviance explained (`%dev`) and the value of $\lambda$ (`Lambda`). Although `glmnet` fits the model for 100 values of `lambda` by default, it stops early if `%dev` does not change sufficently from one lambda to the next (typically near the end of the path.) Here we have truncated the prinout for brevity. We can obtain the model coefficients at one or more $\lambda$'s within the range of the sequence: ```{r out.lines = 10} coef(fit, s = 0.1) ``` (Why `s` and not `lambda`? In case we want to allow one to specify the model size in other ways in the future.) Users can also make predictions at specific $\lambda$'s with new input data: ```{r} set.seed(29) nx <- matrix(rnorm(5 * 20), 5, 20) predict(fit, newx = nx, s = c(0.1, 0.05)) ``` The function `glmnet` returns a sequence of models for the users to choose from. In many cases, users may prefer the software to select one of them. Cross-validation is perhaps the simplest and most widely used method for that task. `cv.glmnet` is the main function to do cross-validation here, along with various supporting methods such as plotting and prediction. ```{r} cvfit <- cv.glmnet(x, y) ``` `cv.glmnet` returns a `cv.glmnet` object, a list with all the ingredients of the cross-validated fit. As with `glmnet`, we do not encourage users to extract the components directly except for viewing the selected values of $\lambda$. The package provides well-designed functions for potential tasks. For example, we can plot the object: ```{r} plot(cvfit) ``` This plots the cross-validation curve (red dotted line) along with upper and lower standard deviation curves along the $\lambda$ sequence (error bars). Two special values along the $\lambda$ sequence are indicated by the vertical dotted lines. `lambda.min` is the value of $\lambda$ that gives minimum mean cross-validated error, while `lambda.1se` is the value of $\lambda$ that gives the most regularized model such that the cross-validated error is within one standard error of the minimum. We can use the following code to get the value of `lambda.min` and the model coefficients at that value of $\lambda$: ```{r out.lines = 10} cvfit$lambda.min coef(cvfit, s = "lambda.min") ``` To get the corresponding values at `lambda.1se`, simply replace `lambda.min` with `lambda.1se` above, or omit the `s` argument, since `lambda.1se` is the default. Note that the coefficients are represented in the sparse matrix format. This is because the solutions along the regularization path are often sparse, and hence it is more efficient in time and space to use a sparse format. If you prefer non-sparse format, pipe the output through `as.matrix()`. Predictions can be made based on the fitted `cv.glmnet` object as well. The code below gives predictions for the new input matrix `newx` at `lambda.min`: ```{r} predict(cvfit, newx = x[1:5,], s = "lambda.min") ``` This concludes `glmnet` 101. With the tools introduced so far, users are able to fit the entire elastic net family, including ridge regression, using squared-error loss. There are many more arguments in the package that give users a great deal of flexibility. To learn more, move on to later sections. ## Linear Regression: `family = "gaussian"` (default) `"gaussian"` is the default `family` argument for the function `glmnet`. Suppose we have observations $x_i \in \mathbb{R}^p$ and the responses $y_i \in \mathbb{R}, i = 1, \ldots, N$. The objective function for the Gaussian family is $$ \min_{(\beta_0, \beta) \in \mathbb{R}^{p+1}}\frac{1}{2N} \sum_{i=1}^N (y_i -\beta_0-x_i^T \beta)^2+\lambda \left[ (1-\alpha)\|\beta\|_2^2/2 + \alpha\|\beta\|_1\right], $$ where $\lambda \geq 0$ is a complexity parameter and $0 \leq \alpha \leq 1$ is a compromise between ridge regression ($\alpha = 0$) and lasso regression ($\alpha = 1$). `glmnet` applies coordinate descent to solve the problem. Specifically, suppose we have current estimates $\tilde{\beta_0}$ and $\tilde{\beta}_\ell$ $\forall \ell\in 1,\ldots,p$. By computing the gradient at $\beta_j = \tilde{\beta}_j$ and simple calculus, the update is $$ \tilde{\beta}_j \leftarrow \frac{S(\frac{1}{N}\sum_{i=1}^N x_{ij}(y_i-\tilde{y}_i^{(j)}),\lambda \alpha)}{1+\lambda(1-\alpha)}, $$ where $\tilde{y}_i^{(j)} = \tilde{\beta}_0 + \sum_{\ell \neq j} x_{i\ell} \tilde{\beta}_\ell$, and $S(z, \gamma)$ is the soft-thresholding operator with value $\text{sign}(z)(|z|-\gamma)_+$. This formula above applies when the `x` variables are standardized to have unit variance (the default); it is slightly more complicated when they are not. Note that for `family = "gaussian"`, `glmnet` standardizes $y$ to have unit variance before computing its `lambda` sequence (and then unstandardizes the resulting coefficients). If you wish to reproduce or compare results with other software, it is best to supply a standardized $y$ first (Using the "1/N" variance formula). ### Commonly used function arguments `glmnet` provides various arguments for users to customize the fit: we introduce some commonly used arguments here. (For more information, type `?glmnet`.) * `alpha` is for the elastic net mixing parameter $\alpha$, with range $\alpha \in [0,1]$. $\alpha = 1$ is lasso regression (default) and $\alpha = 0$ is ridge regression. * `weights` is for the observation weights, default is 1 for each observation. (Note: `glmnet` rescales the weights internally to sum to N, the sample size.) * `nlambda` is the number of $\lambda$ values in the sequence (default is 100). * `lambda` can be provided if the user wants to specify the lambda sequence, but typical usage is for the program to construct the lambda sequence on its own. When automatically generated, the $\lambda$ sequence is determined by `lambda.max` and `lambda.min.ratio`. The latter is the ratio of smallest value of the generated $\lambda$ sequence (say `lambda.min`) to `lambda.max`. The program generates `nlambda` values linear on the log scale from `lambda.max` down to `lambda.min`. `lambda.max` is not user-specified but is computed from the input $x$ and $y$: it is the smallest value for `lambda` such that all the coefficients are zero. For `alpha = 0` (ridge) `lambda.max` would be $\infty$: in this case we pick a value corresponding to a small value for `alpha` close to zero.) * `standardize` is a logical flag for `x` variable standardization prior to fitting the model sequence. The coefficients are always returned on the original scale. Default is `standardize = TRUE`. As an example, we set $\alpha = 0.2$ (more like a ridge regression), and give double weight to the latter half of the observations. We set `nlambda` to 20 so that the model fit is only compute for 20 values of $\lambda$. In practice, we recommend `nlambda` to be 100 (default) or more. In most cases, it does not come with extra cost because of the warm-starts used in the algorithm, and for nonlinear models leads to better convergence properties. ```{r} wts <- c(rep(1,50), rep(2,50)) fit <- glmnet(x, y, alpha = 0.2, weights = wts, nlambda = 20) ``` We can then print the `glmnet` object: ```{r} print(fit) ``` This displays the call that produced the object `fit` and a three-column matrix with columns `Df` (the number of nonzero coefficients), `%dev` (the percent deviance explained) and `Lambda` (the corresponding value of $\lambda$). (The `digits` argument can used to specify significant digits in the printout.) Here the actual number of $\lambda$'s is less than that specified in the call. This is because of the algorithm's stopping criteria. According to the default internal settings, the computations stop if either the fractional change in deviance down the path is less than $10^{-5}$ or the fraction of explained deviance reaches $0.999$. From the last few lines of the output, we see the fraction of deviance does not change much and therefore the computation ends before the all 20 models are fit. The internal parameters governing the stopping criteria can be changed. For details, see the Appendix section or type `help(glmnet.control)`. ### Predicting and plotting with `glmnet` objects We can extract the coefficients and make predictions for a `glmnet` object at certain values of $\lambda$. Two commonly used arguments are: * `s` for specifiying the value(s) of $\lambda$ at which to extract coefficients/predictions. * `exact` for indicating whether the exact values of coefficients are desired or not. If `exact = TRUE` and predictions are to be made at values of `s` not included in the original fit, these values of `s` are merged with `object$lambda` and the model is refit before predictions are made. If `exact = FALSE` (default), then the `predict` function uses linear interpolation to make predictions for values of `s` that do not coincide with lambdas used in the fitting algorithm. Here is a simple example illustrating the use of both these function arguments: ```{r} fit <- glmnet(x, y) any(fit$lambda == 0.5) # 0.5 not in original lambda sequence coef.apprx <- coef(fit, s = 0.5, exact = FALSE) coef.exact <- coef(fit, s = 0.5, exact = TRUE, x=x, y=y) cbind2(coef.exact[which(coef.exact != 0)], coef.apprx[which(coef.apprx != 0)]) ``` The left and right columns show the coefficients for `exact = TRUE` and `exact = FALSE` respectively. (For brevity we only show the non-zero coefficients.) We see from the above that 0.5 is not in the sequence and that hence there are some small differences in coefficient values. Linear interpolation is usually accurate enough if there are no special requirements. Notice that with `exact = TRUE` we have to supply by named argument any data that was used in creating the original fit, in this case `x` and `y`. Users can make predictions from the fitted `glmnet` object. In addition to the arguments in `coef`, the primary argument is `newx`, a matrix of new values for `x` at which predictions are desired. The `type` argument allows users to choose the type of prediction returned: * "link" returns the fitted values (i.e. $\hat\beta_0 + x_i^T\hat\beta$) * "response" gives the same output as "link" for "gaussian" family. * "coefficients" returns the model codfficients. * "nonzero" retuns a list of the indices of the nonzero coefficients for each value of `s`. For example, the following code gives the fitted values for the first 5 observations at $\lambda = 0.05$: ```{r} predict(fit, newx = x[1:5,], type = "response", s = 0.05) ``` If multiple values of `s` are supplied, a matrix of predictions is produced. If no value of `s` is supplied, a matrix of predictions is supplied, with columns corresponding to all the lambdas used in the fit. We can plot the fitted object as in the Quick Start section. Here we walk through more arguments for the `plot` function. The `xvar` argument allows users to decide what is plotted on the `x`-axis. `xvar` allows three measures: "norm" for the $\ell_1$-norm of the coefficients (default), "lambda" for the log-lambda value and "dev" for %deviance explained. Users can also label the curves with the variable index numbers simply by setting `label = TRUE`. For example, let's plot `fit` against the log-lambda value and with each curve labeled: ```{r} plot(fit, xvar = "lambda", label = TRUE) ``` Now when we plot against %deviance we get a very different picture. This is percent deviance explained on the training data, and is a measure of complexity of the model. We see that toward the end of the path, %deviance is not changing much but the coefficients are "blowing up" a bit. This enables us focus attention on the parts of the fit that matter. This will especially be true for other models, such as logistic regression. ```{r} plot(fit, xvar = "dev", label = TRUE) ``` ### Cross-validation K-fold cross-validation can be performed using the `cv.glmnet` function. In addition to all the `glmnet` parameters, `cv.glmnet` has its special parameters including `nfolds` (the number of folds), `foldid` (user-supplied folds), and `type.measure`(the loss used for cross-validation): * "deviance" or "mse" for squared loss, and * "mae" uses mean absolute error. As an example, ```{r} cvfit <- cv.glmnet(x, y, type.measure = "mse", nfolds = 20) ``` does 20-fold cross-validation based on mean squared error criterion (the default for "gaussian" family). Printing the resulting object gives some basic information on the cross-validation performed: ```{r} print(cvfit) ``` `cv.glmnet` also supports parallel computing. To make it work, users must register parallel beforehand. We give a simple example of comparison here. Unfortunately, the package `doMC` is not available on Windows platforms (it is on others), so we cannot run the code here, but we present timing information recorded during one of our test runs. ```{r, eval=FALSE} library(doMC) registerDoMC(cores = 2) X <- matrix(rnorm(1e4 * 200), 1e4, 200) Y <- rnorm(1e4) ``` ```{r, eval=FALSE} system.time(cv.glmnet(X, Y)) ``` ```{r, echo=FALSE} structure(c(2.44, 0.08, 2.518, 0, 0), class = "proc_time", .Names = c("user.self", "sys.self", "elapsed", "user.child", "sys.child")) ``` ```{r, eval=FALSE} system.time(cv.glmnet(X, Y, parallel = TRUE)) ``` ```{r, echo=FALSE} structure(c(0.508999999999999, 0.057, 1.56699999999999, 1.941, 0.1), class = "proc_time", .Names = c("user.self", "sys.self", "elapsed", "user.child", "sys.child")) ``` As suggested from the above, parallel computing can significantly speed up the computation process especially for large-scale problems. The `coef` and `predict` methods for `cv.glmnet` objects are similar to those for a `glmnet` object, except that two special strings are also supported by `s` (the values of $\lambda$ requested): * "lambda.min": the $\lambda$ at which the smallest MSE is achieved. * "lambda.1se": the largest $\lambda$ at which the MSE is within one standard error of the smallest MSE (default). ```{r out.lines = 10} cvfit$lambda.min predict(cvfit, newx = x[1:5,], s = "lambda.min") coef(cvfit, s = "lambda.min") ``` Users can explicitly control the fold that each observation is assigned to via the `foldid` argument. This is useful, for example, in using cross-validation to select a value for $\alpha$: ```{r} foldid <- sample(1:10, size = length(y), replace = TRUE) cv1 <- cv.glmnet(x, y, foldid = foldid, alpha = 1) cv.5 <- cv.glmnet(x, y, foldid = foldid, alpha = 0.5) cv0 <- cv.glmnet(x, y, foldid = foldid, alpha = 0) ``` There are no built-in plot functions to put them all on the same plot, so we are on our own here: ```{r} par(mfrow = c(2,2)) plot(cv1); plot(cv.5); plot(cv0) plot(log(cv1$lambda) , cv1$cvm , pch = 19, col = "red", xlab = "log(Lambda)", ylab = cv1$name) points(log(cv.5$lambda), cv.5$cvm, pch = 19, col = "grey") points(log(cv0$lambda) , cv0$cvm , pch = 19, col = "blue") legend("topleft", legend = c("alpha= 1", "alpha= .5", "alpha 0"), pch = 19, col = c("red","grey","blue")) ``` We see that the lasso (`alpha=1`) does about the best here. We also see that the range of lambdas used differs with `alpha`. ### Other function arguments In this section we breifly describe some other useful arguments when calling `glmnet`: `upper.limits`, `lower.limits`, `penalty.factor`, `exclude` and `intercept`. Suppose we want to fit our model but limit the coefficients to be bigger than -0.7 and less than 0.5. This can be achieved by specifying the `upper.limits` and `lower.limits` arguments: ```{r} tfit <- glmnet(x, y, lower.limits = -0.7, upper.limits = 0.5) plot(tfit) ``` Often we want the coefficients to be positive: to do so, we just need to specify `lower.limits = 0`. (Note, the lower limit must be no bigger than zero, and the upper limit no smaller than zero.) These bounds can be a vector, with different values for each coefficient. If given as a scalar, the same number gets recycled for all. The `penalty.factor` argument allows users to apply separate penalty factors to each coefficient. This is very useful when we have prior knowledge or preference over the variables. Specifically, if $v_j$ denotes the penalty factor for the $j$th variable, the penalty term becomes $$ \lambda \sum_{j=1}^p \boldsymbol{v_j} P_\alpha(\beta_j) = \lambda \sum_{j=1}^p \boldsymbol{v_j} \left[ (1-\alpha)\frac{1}{2} \beta_j^2 + \alpha |\beta_j| \right]. $$ The default is 1 for each coefficient, i.e. coefficients are penalized equally. Note that any variable with `penalty.factor` equal to zero is not penalized at all! This is useful in the case where some variables are always to be included unpenalized in the model, such as the demographic variables sex and age in medical studies. Note the penalty factors are internally rescaled to sum to `nvars`, the number of variables in the given `x` matrix. Here is an example where we set the penalty factors for variables 1, 3 and 5 to be zero: ```{r} p.fac <- rep(1, 20) p.fac[c(1, 3, 5)] <- 0 pfit <- glmnet(x, y, penalty.factor = p.fac) plot(pfit, label = TRUE) ``` We see from the labels that the three variables with zero penalty factors always stay in the model, while the others follow typical regularization paths and shrunk to zero eventually. `exclude` allows one to block certain variables from being the model at all. Of course, one could simply subset these out of `x`, but sometimes `exclude` is more useful, since it returns a full vector of coefficients, just with the excluded ones set to zero. The `intercept` argument allows the user to decide if an intercept should be included in the model or not (it is never penalized). The default is `intercept = TRUE`. If `intercept = FALSE` the intercept is forced to be zero. ## Linear Regression: `family = "mgaussian"` (multi-response) The multi-response Gaussian family is useful when there are a number of (correlated) responses, also known as the "multi-task learning" problem. Here, a variable is either included in the model for all the responses, or excluded for all the responses. Most of the arguments for this family are the same as that for `family = "gaussian"`, so we focus on the differences with the single response model. As the name suggests, the response $y$ is not a vector but a matrix of quantitative responses. As a result, the coefficients at each value of lambda are also a matrix. `glmnet` solves the problem $$ \min_{(\beta_0, \beta) \in \mathbb{R}^{(p+1)\times K}}\frac{1}{2N} \sum_{i=1}^N \|y_i -\beta_0-\beta^T x_i\|^2_F+\lambda \left[ (1-\alpha)\|\beta\|_F^2/2 + \alpha\sum_{j=1}^p\|\beta_j\|_2\right]. $$ Here $\beta_j$ is the $j$th row of the $p\times K$ coefficient matrix $\beta$, and we replace the absolute penalty on each single coefficient by a group-lasso penalty on each coefficient $K$-vector $\beta_j$ for a single predictor (i.e. column of the `x` matrix). The group lasso penalty behaves like the lasso, but on the whole group of coefficients for each response: they are either all zero, or else none are zero, but are shrunk by an amount depending on $\lambda$. We use a set of data generated beforehand for illustration. We fit a regularized multi-response Gaussian model to the data, with an object `mfit` returned. ```{r} data(MultiGaussianExample) x <- MultiGaussianExample$x y <- MultiGaussianExample$y mfit <- glmnet(x, y, family = "mgaussian") ``` The `standardize.response` argument is only for `mgaussian` family. If `standardize.response = TRUE`, the response variables are standardized (default is `FALSE`). As before, we can use the `plot` method to visualize the coefficients: ```{r} plot(mfit, xvar = "lambda", label = TRUE, type.coef = "2norm") ``` Note that we set `type.coef = "2norm"`. Under this setting, a single curve is plotted per variable, with value equal to the $\ell_2$ norm of the variable's coefficient vector. The default setting is `type.coef = "coef"`, where a coefficient plot is created for each response (multiple figures). `xvar` and `label` are two other arguments which have the same functionality as in the single-response case. We can extract the coefficients and make predictions at requested values of $\lambda$ by using the `coef` and `predict` methods respectively, as before. Here is an example of a `predict` call: ```{r} predict(mfit, newx = x[1:5,], s = c(0.1, 0.01)) ``` The prediction result is saved in a three-dimensional array with the first two dimensions being the prediction matrix for each response variable and the third corresponding to the response variables. ## Logistic Regression: `family = "binomial"` Logistic regression is a widely-used model when the response is binary. Suppose the response variable takes values in $\mathcal{G}=\{1,2\}$. Denote $y_i = I(g_i=1)$. We model $$\mbox{Pr}(G=2|X=x)=\frac{e^{\beta_0+\beta^Tx}}{1+e^{\beta_0+\beta^Tx}},$$ which can be written in the following form: $$\log\frac{\mbox{Pr}(G=2|X=x)}{\mbox{Pr}(G=1|X=x)}=\beta_0+\beta^Tx,$$ the so-called "logistic" or log-odds transformation. The objective function for logistic regression is the penalized negative binomial log-likelihood, and is $$ \min_{(\beta_0, \beta) \in \mathbb{R}^{p+1}} -\left[\frac{1}{N} \sum_{i=1}^N y_i \cdot (\beta_0 + x_i^T \beta) - \log (1+e^{(\beta_0+x_i^T \beta)})\right] + \lambda \big[ (1-\alpha)\|\beta\|_2^2/2 + \alpha\|\beta\|_1\big]. $$ Logistic regression is often plagued with degeneracies when $p > N$ and exhibits wild behavior even when $N$ is close to $p$; the elastic net penalty alleviates these issues, and regularizes and selects variables as well. We use a "proximal Newton" algorithm for optimizing this criterion. This makes repeated use of a quadratic approximation to the log-likelihood, and then weighted coordinate descent on the resulting penalized weighted least-squares problem. These constitute an outer and inner loop, also known as iteratively reweighted penalized least squares. For illustration purposes, we load the pre-generated input matrix `x` and the response vector `y` from the data file. The input matrix $x$ is the same as for other families. For binomial logistic regression, the response variable $y$ should be either a binary vector, a factor with two levels, or a two-column matrix of counts or proportions. The latter is useful for grouped binomial data, or in applications where we have "soft" class membership, such as occurs in the EM algorithm. ```{r} data(BinomialExample) x <- BinomialExample$x y <- BinomialExample$y ``` Other optional arguments of `glmnet` for binomial regression are almost same as those for Gaussian family. Don't forget to set `family` option to "binomial": ```{r} fit <- glmnet(x, y, family = "binomial") ``` As before, we can print and plot the fitted object, extract the coefficients at specific $\lambda$'s and also make predictions. For plotting, the optional arguments such as `xvar` and `label` work in the same way as for `family = "gaussian"`. Prediction is a little different for `family = "binomial"`, mainly in the function argument `type`: * "link" gives the linear predictors. * "response" gives the fitted probabilities. * "class" produces the class label corresponding to the maximum probability. As with `family = "gaussian"`, "coefficients" computes the coefficients at values of `s` and "nonzero" retuns a list of the indices of the nonzero coefficients for each value of `s`. Note that the results ("link", "response", "coefficients", "nonzero") are returned only for the class corresponding to the second level of the factor response. In the following example, we make prediction of the class labels at $\lambda = 0.05, 0.01$. ```{r} predict(fit, newx = x[1:5,], type = "class", s = c(0.05, 0.01)) ``` For logistic regression, `cv.glmnet` has similar arguments and usage as Gaussian. `nfolds`, `weights`, `lambda`, `parallel` are all available to users. There are some differences in `type.measure`: "deviance" and "mse" do not both mean squared loss. Rather, * "mse" uses squared loss. * "deviance" uses actual deviance. * "mae" uses mean absolute error. * "class" gives misclassification error. * "auc" (for two-class logistic regression ONLY) gives area under the ROC curve. For example, the code below uses misclassification error as the criterion for 10-fold cross-validation: ```{r} cvfit <- cv.glmnet(x, y, family = "binomial", type.measure = "class") ``` As before, we can plot the object and show the optimal values of $\lambda$. ```{r} plot(cvfit) cvfit$lambda.min cvfit$lambda.1se ``` `coef` and `predict` for the `cv.glmnet` object for `family = "binomial"` are simliar to the Gaussian case and we omit the details. Like other generalized linear models, `glmnet` allows for an "offset". This is a fixed vector of $N$ numbers that is added into the linear predictor. For example, you may have fitted some other logistic regression using other variables (and data), and now you want to see if the present variables can add further predictive power. To do this, you can use the predicted logit from the other model as an offset in the `glmnet` call. Offsets are also useful in Poisson models, which we discuss later. ## Multinomial Regression: `family = "multinomial"` The multinomial model extends the binomial when the number of classes is more than two. Suppose the response variable has $K$ levels ${\cal G}=\{1,2,\ldots,K\}$. Here we model $$\mbox{Pr}(G=k|X=x)=\frac{e^{\beta_{0k}+\beta_k^Tx}}{\sum_{\ell=1}^Ke^{\beta_{0\ell}+\beta_\ell^Tx}}.$$ There is a linear predictor for each class! Let ${Y}$ be the $N \times K$ indicator response matrix, with elements $y_{i\ell} = I(g_i=\ell)$. Then the elastic net penalized negative log-likelihood function becomes $$ \ell(\{\beta_{0k},\beta_{k}\}_1^K) = -\left[\frac{1}{N} \sum_{i=1}^N \Big(\sum_{k=1}^Ky_{il} (\beta_{0k} + x_i^T \beta_k)- \log \big(\sum_{\ell=1}^K e^{\beta_{0\ell}+x_i^T \beta_\ell}\big)\Big)\right] +\lambda \left[ (1-\alpha)\|\beta\|_F^2/2 + \alpha\sum_{j=1}^p\|\beta_j\|_q\right]. $$ Here we really abuse notation! $\beta$ is a $p\times K$ matrix of coefficients. $\beta_k$ refers to the $k$th column (for outcome category $k$), and $\beta_j$ the $j$th row (vector of $K$ coefficients for variable $j$). The last penalty term is $\|\beta_j\|_q$. We support two options for $q$: $q\in \{1,2\}$. When $q=1$, this is a lasso penalty on each of the parameters. When $q=2$, this is a grouped-lasso penalty on all the $K$ coefficients for a particular variable, which makes them all be zero or nonzero together. The standard Newton algorithm can be tedious here. Instead, for $q=1$ we use a so-called partial Newton algorithm by making a partial quadratic approximation to the log-likelihood, allowing only $(\beta_{0k}, \beta_k)$ to vary for a single class at a time. For each value of $\lambda$, we first cycle over all classes indexed by $k$, computing each time a partial quadratic approximation about the parameters of the current class. Then, the inner procedure is almost the same as for the binomial case. When $q=2$, we use a different approach that we will not explain here. For the `family = "multinomial"` case, usage is similar to that for `family = "binomial"`. In this section we describe the differences. First, we load a set of generated data: ```{r} data(MultinomialExample) x <- MultinomialExample$x y <- MultinomialExample$y ``` The response variable can be a `nc >= 2` level factor, or an `nc`-column matrix of counts or proportions. Internally glmnet will make the rows of this matrix sum to 1, and absorb the total mass into the weight for that observation. `offset` should be a `nobs x nc` matrix if one is provided. A special option for multinomial regression is `type.multinomial`, which allows the usage of a grouped lasso penalty ($q = 2$) if `type.multinomial = "grouped"`. The default is `type.multinomial = "ungrouped"` ($q = 1$). ```{r} fit <- glmnet(x, y, family = "multinomial", type.multinomial = "grouped") plot(fit, xvar = "lambda", label = TRUE, type.coef = "2norm") ``` For the `plot` method, the function arguments are `xvar`, `label` and `type.coef`, in addition to other ordinary graphical parameters. `xvar` and `label` are the same as other families while `type.coef` is only for multinomial regression and multi-response Gaussian model. It can produce a figure of coefficients for each response variable if `type.coef = "coef"` or a figure showing the $\ell_2$-norm in one figure if `type.coef = "2norm"`. We can also do cross-validation and plot the returned object. Note that although `type.multinomial` is not a named argument in `cv.glmnet`, in fact any argument that can be passed to `glmnet` is valid in the argument list of `cv.glmnet`. Such arguments are passed via the `...` argument directly to the calls to `glmnet` inside the `cv.glmnet` function. ```{r} cvfit <- cv.glmnet(x, y, family = "multinomial", type.multinomial = "grouped") plot(cvfit) ``` Users may wish to predict at the optimally selected $\lambda$: ```{r} predict(cvfit, newx = x[1:10,], s = "lambda.min", type = "class") ``` ## Poisson Regression: `family = "poisson"` Poisson regression is used to model count data under the assumption of Poisson error, or otherwise non-negative data where the mean and variance are proportional. Like the Gaussian and binomial models, the Poisson distribution is a member of the exponential family of distributions. We usually model its positive mean on the log scale: $\log \mu(x) = \beta_0+\beta' x$. The log-likelihood for observations $\{x_i,y_i\}_1^N$ is given by $$ l(\beta|X, Y) = \sum_{i=1}^N \left(y_i (\beta_0+\beta^T x_i) - e^{\beta_0+\beta^Tx_i}\right). $$ As before, we optimize the penalized log-likelihood: $$ \min_{\beta_0,\beta} -\frac1N l(\beta|X, Y) + \lambda \left((1-\alpha) \sum_{i=1}^N \beta_i^2/2 +\alpha \sum_{i=1}^N |\beta_i|\right). $$ `glmnet` uses an outer Newton loop and an inner weighted least-squares loop (as in logistic regression) to optimize this criterion. First, we load a pre-generated set of Poisson data: ```{r} data(PoissonExample) x <- PoissonExample$x y <- PoissonExample$y ``` We apply the function `glmnet` with `family = "poisson"`: ```{r} fit <- glmnet(x, y, family = "poisson") ``` The optional input arguments of `glmnet` for `"poisson"` family are similar to those for other families. `offset` is a particularly useful argument for Poisson models. When dealing with rate data in Poisson models, the counts collected are often based on different exposures such as length of time observed, area and years. A poisson rate $\mu(x)$ is relative to a unit exposure time, so if an observation $y_i$ was exposed for $E_i$ units of time, then the expected count would be $E_i\mu(x)$, and the log mean would be $\log(E_i)+\log(\mu(x))$. In a case like this, we would supply an *offset* $\log(E_i)$ for each observation. Hence `offset` is a vector of length $N$ that is included in the linear predictor. (_Warning_: if `offset` is supplied in `glmnet`, offsets must also also be supplied to `predict` via the `newoffset` argument to make reasonable predictions.) Again, we plot the coefficients to have a first sense of the result. ```{r} plot(fit) ``` As before, we can extract the coefficients and make predictions at certain $\lambda$'s using `coef` and `predict` respectively. The optional input arguments are similar to those for other families. For the `predict` method, the argument `type` has the same meaning as that for `family = "binomial"`, except that "response" gives the fitted mean (rather than fitted probabilities in the binomial case). For example, we can do the following: ```{r out.lines = 7} coef(fit, s = 1) predict(fit, newx = x[1:5,], type = "response", s = c(0.1,1)) ``` We may also use cross-validation to find the optimal $\lambda$'s and thus make inferences. ```{r} cvfit <- cv.glmnet(x, y, family = "poisson") ``` Options are almost the same as the Gaussian family except that for `type.measure`: * "deviance" (default) gives the deviance. * "mse" is for mean squared error. * "mae" is for mean absolute error. ## Cox Regression: `family = "cox"` The Cox proportional hazards model is commonly used for the study of the relationship beteween predictor variables and survival time. We have another vignette (["Regularized Cox Regression"](https://glmnet.stanford.edu/articles/Coxnet.html)) dedicated solely to fitting regularized Cox models with the `glmnet` package; please consult that vignette for details. ## Programmable GLM families: `family = family()` Since version 4.0, `glmnet` has the facility to fit any GLM family by specifying a `family` object, as used by `stats::glm`. For these more general families, the outer Newton loop is performed in R, while the inner elastic-net loop is performed in Fortran, for each value of lambda. The price for this generality is a small hit in speed. For details, see the vignette ["GLM `family` functions in `glmnet`"](https://glmnet.stanford.edu/articles/glmnetFamily.html) ## Assessing models on test data Once we have fit a series of models using `glmnet`, we often assess their performance on a set of evaluation or test data. We usually go through the process of building a prediction matrix, deciding on the performance measure, and computing these measures for a series of values for `lambda` (and `gamma` for relaxed fits). `glmnet` provides three functions (`assess.glmnet`, `roc.glmnet` and `confusion.glmnet`) that make these tasks easier. ### Performance measures The function `assess.glmnet` computes the same performance measures produced by `cv.glmnet`, but on a validation or test dataset. ```{r} data(BinomialExample) x <- BinomialExample$x y <- BinomialExample$y itrain <- 1:70 fit <- glmnet(x[itrain, ], y[itrain], family = "binomial", nlambda = 5) assess.glmnet(fit, newx = x[-itrain, ], newy = y[-itrain]) ``` This produces a list with *all* the measures suitable for a binomial model, computed for the entire sequence of lambdas in the fit object. Here the function identifies the model family from the `fit` object. A second use case builds the prediction matrix before calling `assess.glmnet`: ```{r, eval=FALSE} pred <- predict(fit, newx = x[-itrain, ]) assess.glmnet(pred, newy = y[-itrain], family = "binomial") ``` Here we have to provide the `family` as an argument; the results (not shown) are the same. Users can see the various measures suitable for each family via ```{r} glmnet.measures() ``` `assess.glmnet` can also take the result of `cv.glmnet` as input. In this case the predictions are made at the optimal values for the parameter(s). ```{r out.lines = 11} cfit <- cv.glmnet(x[itrain, ], y[itrain], family = "binomial", nlambda = 30) assess.glmnet(cfit, newx = x[-itrain, ], newy = y[-itrain]) ``` This uses the default value of `s = "lambda.1se"`, just like `predict` would have done. Users can provide additional arguments that get passed on to `predict`. For example, the code below shows the performance measures for `s = "lambda.min"`: ```{r out.lines = 11} assess.glmnet(cfit, newx = x[-itrain, ],newy = y[-itrain], s = "lambda.min") ``` ### Prevalidation One interesting use case for `assess.glmnet` is to get the results of cross-validation using other measures. By specifying `keep = TRUE` in the `cv.glmnet` call, a matrix of prevalidated predictions are stored in the returned output as the `fit.preval` component. We can then use this component in the call to `assess.glmnet`: ```{r out.lines = 11} cfit <- cv.glmnet(x, y, family = "binomial", keep = TRUE, nlambda = 30) assess.glmnet(cfit$fit.preval, newy = y, family = "binomial") ``` Users can verify that the first measure here `deviance` is identical to the component `cvm` on the `cfit` object. ### ROC curves for binomial data In the special case of binomial models, users often would like to see the ROC curve for validation or test data. Here the function `roc.glmnet` provides the goodies. Its first argument is as in `assess.glmnet`. Here we illustrate one use case, using the prevlidated CV fit. ```{r} cfit <- cv.glmnet(x, y, family = "binomial", type.measure = "auc", keep = TRUE) rocs <- roc.glmnet(cfit$fit.preval, newy = y) ``` `roc.glmnet` returns a list of cross-validated ROC data, one for each model along the path. The code below demonstrates how one can plot the output. The first line identifies the `lambda` value giving the best area under the curve (AUC). Then we plot all the ROC curves in grey and the "winner" in red. ```{r} best <- cvfit$index["min",] plot(rocs[[best]], type = "l") invisible(sapply(rocs, lines, col="grey")) lines(rocs[[best]], lwd = 2,col = "red") ``` ### Confusion matrices for classification For binomial and multinomial models, we often wish to examine the classification performance on new data. The function `confusion.glmnet` will do that for us. ```{r} data(MultinomialExample) x <- MultinomialExample$x y <- MultinomialExample$y set.seed(101) itrain <- sample(1:500, 400, replace = FALSE) cfit <- cv.glmnet(x[itrain, ], y[itrain], family = "multinomial") cnf <- confusion.glmnet(cfit, newx = x[-itrain, ], newy = y[-itrain]) ``` `confusion.glmnet` produces a table of class "confusion.table" which inherits from class "table", and we also provide a `print` method for it. ```{r} print(cnf) ``` The first argument to `confusion.glmnet` should be a `glmnet` or `cv.glmnet` object (from which predictions can be made), or a matrix/array of predictions, such as the *kept* `"fit.preval"` component in the output of a `cv.glmnet` call with `keep = TRUE`. When a matrix/array of predictions is provided, we need to specify the `family` option, otherwise *confusion* can exist between "binomial" and "multinomial" prediction matrices. When predictions for more than one model in the path is provided, `confusion.glmnet` returns a list of confusion tables. For example, the prevalidated predictions from `cv.glmnet` are for the whole `lambda` path, and so we are returned a list of confusion tables. In the code below, we identify and print the one achieving the smallest classification error. ```{r} cfit <- cv.glmnet(x, y, family = "multinomial", type = "class", keep = TRUE) cnf <- confusion.glmnet(cfit$fit.preval, newy = y, family = "multinomial") best <- cfit$index["min",] print(cnf[[best]]) ``` ## Filtering variables The `exclude` argument to `glmnet` accepts a vector of indices, indicating which variables should be excluded from the fit, i.e. get zeros for their coefficients. From version 4.1-2, the `exclude` argument can accept a *function*. The idea is that variables can be filtered based on some of their properties (e.g. too sparse) before any models are fit. When performing cross-validation (CV), this filtering should be done separately inside each fold of `cv.glmnet`. Here is a typical filter function: it excludes variables that are more than 80% sparse. ```{r} filter <- function(x, ...) which(colMeans(x == 0) > 0.8) ``` This function gets invoked inside the call to `glmnet`, and uses the supplied `x` to generate the indices. We give a simple example using this: ```{r} set.seed(101) n <-500; p <- 50 x <- matrix(rnorm(n * p), n, p) x[sample(seq(length(x)), 4 * n * p / 5)] <- 0 y <- rnorm(n) + x %*% (rnorm(p) / 5) > 0 excl <- filter(x) print(excl) fit.orig <- glmnet(x, y, family = "binomial", exclude = excl) fit.new <- glmnet(x, y, family = "binomial", exclude = filter) all.equal(fit.orig, fit.new) ``` The fits are the same (the `call` component is all that differs). The nice thing with this approach is that `cv.glmnet` does the right thing: it applies the filter function separately to each training-fold `x`, and hence accounts for any bias that may be incurred by the filtering. ```{r} cvfit.filt <- cv.glmnet(x, y, family = "binomial", exclude = filter) ``` The most general form of the filter function is ```{r, eval=FALSE} filter <- function(x, y, weights, ...) {} ``` Yes, users can use `y` as well in their filtering criterion, and the observation weights if that makes sense. As we did above, some of the arguments can be omitted, but the `...` must always be there. We will give some useful examples of filter functions a bit later. An important point to note is that any other arguments in a user's filter function are *ignored*. So, what we should if we want one or more additional parameters to guide the filtering, such as the choice of `0.8` in our filter function above? The safest way to achieve this is to write a filter *generator* function, that produces a filter function as its output. We give an example: ```{r} sparsity <- function(fraction = 0.7) { function(x, ...) which(colMeans(x == 0) > fraction) } sparsity(0.5) ``` Here, `sparsity()` is a function that produces a function. The argument `fraction` is found in the environment of that function, and hence is *built in*. We can now run `cv.glmnet` as follows: ```{r} foldid <- sample(rep(1:10,length.out = length(y))) cvfit.filt1 <- cv.glmnet(x, y, family = "binomial", foldid = foldid, exclude = filter) cvfit.filt2 <- cv.glmnet(x, y, family = "binomial", foldid = foldid, exclude = sparsity(0.8)) all.equal(cvfit.filt1, cvfit.filt2) ``` These agree in the important parts. We end this section with some useful filtering functions. In genomics, where the `x` matrix can be very wide, we often filter features based on variance. We will use expression arrays as an example. All else being equal, we expect the variance of the gene expression of a gene to be higher if there is something *going on* across the samples, and we guess that that *something* is related to the response. Here is a function that efficiently computes the column-wise variance for a wide matrix, followed by a filter function that uses it. ```{r} uvar <- function(x, means = FALSE) { # if means = TRUE, the means and variances are returned, # otherwise just the variances m <- colMeans(x) n <- nrow(x) x <- x - outer(rep(1,n),m) v <- colSums(x^2) / (n - 1) if (means) list(mean = m, var = v) else v } vfilter <- function(q = 0.3) { function(x,...) { v <- uvar(x) which(v < quantile(v, q)) } } ``` Here, our filter function `vfilter()` is a function generator as discussed above, and will exclude the fraction `q` of variables with the lowest variance. We can also use `y` as part of our filtering. This final example builds on the example above. Here the response `y` is binary, taking two values. We want to filter out variables with small absolute values for the two-sample t-statistic with groups defined by `y`. Again, we present an efficient function for computing the t-statistics, and then the filter. (Notice that for convenience, our function `uvar` above can optionally return a mean vector and a variance vector.) ```{r} ut.test <- function(x, y, s0 = 0) { ni <- table(y); n <- sum(ni) if(length(ni) != 2) stop("Only two-sample t-test here") index <- seq(n) mv <- tapply(index, y, function(i, x) uvar(x[i, ], means = TRUE), x = x) ss <- ((ni[1] - 1) * mv[[1]]$var + (ni[2] - 1) * mv[[2]]$var) sd <- sqrt(ss * (1 / ni[[1]] + 1 / ni[[2]]) / (n - 2)) numer <- mv[[1]]$mean - mv[[2]]$mean numer / (sd + s0) } tfilter <- function(q = 0.3, s0 = 0) { function(x, y, ...) { abs_tstats <- abs(ut.test(x, y, s0 = s0)) which(abs_tstats < quantile(abs_tstats, q)) } } ``` One might think that unsupervised filtering using just `x` before fitting the model is fair game, and perhaps need not be accounted for in cross-validation. This is an interesting issue, and one can argue that there could be some bias if it was not accounted for. But filtering using `x` and `y` *definitely* introduces potential bias. However, it can still give good results, as long as it it correctly accounted for when running CV. ```{r} cvfit.filt3 <- cv.glmnet(x, y, family = "binomial", foldid = foldid, exclude = tfilter(0.4)) ``` ## Other Package Features In this section, we describe other features in the `glmnet` package that might be of interest to users. ### Sparse matrix support Our package supports sparse input matrices, which allow the efficient storage and operation of large matrices having only a few nonzero entries. The usage of sparse matrices (inherits from class `"sparseMatrix"` as in the `Matrix` package) in `glmnet` is the same as if a regular matrix is provided. We load a set of sample data created beforehand. It loads `x`, a 100*20 sparse input matrix and `y`, the response vector. ```{r} data(SparseExample) x <- SparseExample$x y <- SparseExample$y class(x) ``` Users can create a sparse matrix with the function `sparseMatrix` by providing the locations and values of the nonzero entries. Alternatively, the `Matrix` function from the `Matrix` package can also be used to contruct a sparse matrix by setting `sparse = TRUE`, but this defeats the purpose somewhat if the matrix is large. We can fit the model the same way as before. ```{r} fit <- glmnet(x, y) ``` We can also do the cross-validation and plot the resulting object. ```{r} cvfit = cv.glmnet(x, y) plot(cvfit) ``` The usage of other functions are similar and we do not expand here. Note that sparse matrices can also be used for `newx`, the new input matrix in the `predict` function. For example, ```{r} i <- sample(1:5, size = 25, replace = TRUE) j <- sample(1:20, size = 25, replace = TRUE) x <- rnorm(25) nx <- sparseMatrix(i = i, j = j, x = x, dims = c(5, 20)) predict(cvfit, newx = nx, s = "lambda.min") ``` ### Fitting big and/or sparse unpenalized generalized linear models The `glmnet` package includes a function `bigGlm` for fitting a single _unpenalized_ generalized linear model (GLM), but allowing all the options of `glmnet`. In other words, the user can set coefficient upper and/or lower bounds, and can provide the `x` matrix in sparse matrix format. This is not too much more than fitting a model with a single value of `lambda = 0` (with some protection from edge cases). `predict` and `print` methods can be called on the output. ```{r} data(BinomialExample) x <- BinomialExample$x y <- BinomialExample$y fit <- bigGlm(x, y, family = "binomial", lower.limits = -1) print(fit) ``` ### Creating `x` from mixed variables and/or missing data The `glmnet` package includes a function `makeX` that makes it easy to create the model matrix `x` needed as input to `glmnet`. It takes as input a data frame, which can contain vectors, matrices and factors. Some of the features are: * Factors are *one-hot* encoded to form indicator matrices. * Missing values in the resultant matrix can be replaced by the column means. * The `sparse` option returns a matrix in column-sparse format. This is useful if the data are large, and factors have many levels. * Two data frames can be provided, `train` and `test`. This ensures the factor levels correspond, and also imputes missing data in the test data from means in the training data. Our first example demonstrates how `makeX` works with factors: ```{r} set.seed(101) X <- matrix(rnorm(5), nrow = 5) X2 <- sample(letters[1:3], 5, replace = TRUE) X3 <- sample(LETTERS[1:3], 5, replace = TRUE) df <- data.frame(X, X2, X3) makeX(df) ``` Include the option `sparse = TRUE` if a sparse output is desired: ```{r} makeX(df, sparse = TRUE) ``` Next, let us add some missing values to our data matrix. By default, `makeX` leaves `NA`s as is: ```{r} Xn <- X ; Xn[3,1] <- NA X2n <- X2; X2n[1] <- NA X3n <- X3; X3n[5] <- NA dfn <- data.frame(Xn, X2n, X3n) dfn makeX(dfn) ``` We can impute the missing values with column means by passing the option `na.impute = TRUE`: ```{r} makeX(dfn, na.impute = TRUE, sparse = TRUE) ``` Finally if a test set is available as well, both the training and test sets can be passed to `makeX` at the same time so that all the levels of factors present in the training and test sets will be represented correctly in the output matrix. In the example below, the third column of the training set only contains "B" and "C" while that of the training set only contains "A" and "C". By passing both data sets to `makeX` at the same time, this third column is correctly expanded into 3 feature columns for both the training and test sets. ```{r} set.seed(102) X <- matrix(rnorm(5), nrow = 5) X2 <- sample(letters[1:3], 5, replace = TRUE) X3 <- sample(LETTERS[1:3], 5, replace = TRUE) Xn <- X ; Xn[5,1] <- NA X2n <- X2; X2n[1] <- NA X3n <- X3; X3n[2] <- NA dftn <- data.frame(Xn, X2n, X3n) dftn makeX(dfn, dftn, sparse = TRUE) ``` ### Progress bar Ever run a job on a big dataset, and wonder how long it will take? `glmnet` and `cv.glmnet` come equipped with a progress bar, which can by displayed by passing `trace.it = TRUE` to these functions. ```{r, eval=FALSE} fit <- glmnet(x, y, trace.it = TRUE) ``` ``##`` `` |================================== |65%`` This display changes in place as the fit is produced. The progress bar is also very helpful with `cv.glmnet`: ```{r, eval=FALSE} fit <- cv.glmnet(x, y, trace.it = TRUE) ``` ``##`` `` Training`` `` |=============================================| 100%`` `` Fold: 1/10`` `` |=============================================| 100%`` `` Fold: 2/10`` `` |=============================================| 100%`` `` Fold: 3/10`` `` |============================= | 70%`` Tracing of the folds works a little differently when distributed computing is used. If the user wants `glmnet` and `cv.glmnet` to always print the progress bar, this can be achieved (for a session) via a call to `glmnet.control` with the `itrace` argument: ```{r, eval=FALSE} glmnet.control(itrace = 1) ``` To reset it, one makes a similar call and sets `itrace = 0`. ## Appendix 0: Convergence Criteria Glmnet uses a convergence criterion that focuses not on coefficient change but rather the impact of the change on the fitted values, and hence the loss part of the objective. The net result is a weighted norm of the coefficient change vector. For Gaussian models it uses the following. Suppose observation $i$ has weight $w_i$. Let $v_j$ be the (weighted) sum-of-squares for variable $x_j$: $$v_j=\sum_{i=1}^Nw_ix_{ij}^2.$$ If there is an intercept in the model, these $x_j$ will be centered by the weighted mean, and hence this would be a weighted variance. After $\hat\beta_j^o$ has been updated to $\hat\beta_j^n$, we compute $\Delta_j=v_j(\hat\beta_j^o-\hat\beta_j^n)^2$. After a complete cycle of coordinate descent, we look at $\Delta_{max}=\max_j\Delta_j$. Why this measure? We can write $$\Delta_j=\frac1N\sum_{i=1}^N w_i(x_{ij}\hat\beta_j^o-x_{ij}\hat\beta_j^n)^2,$$ which measures the weighted sum of squares of changes in fitted values for this term. This measures the impact of the change in this coefficient on the fit. If the largest such change is negligible, we stop. For logistic regression and other non-Gaussian models it is similar for the inner loop, only now the weights for each observation are more complex. For example, for logistic regression the weights are those that arise from the current Newton step, i.e. $w_i^*=w_i\hat p_i(1-\hat p_i)$, where the $\hat p_i$'s are the fitted probabilities as we entered the current inner loop. The intuition is the same: it measures the impact of the coefficient change on the current weighted least squares loss, or quadratic approximation to the log-likelihood loss. What about outer-loop convergence? * If the argument `family` was a character string, we use the same measure, except now $\hat\beta^o$ is the coefficient vector before we entered this inner loop, and $\hat\beta^n$ the converged solution for this inner loop. Hence if this Newton step had no impact, we declare outer-loop convergence. * If the argument `family` was a class "family" object, outer-loop convergence is determined by the change in the objective function value. If the fractional change in the objective function value is less than the `epsnr` control parameter, we declare outer-loop convergence. `epsnr` can be changed via a call to `glmnet.control`. ## Appendix 1: Internal Parameters Our package has a set of internal parameters which control some aspects of the computation of the path. The *factory default* settings are expected to serve in most cases, and users do not need to make changes unless there are special requirements. There are several parameters that users can change: * `fdev` - minimum fractional change in deviance for stopping path; factory default = 1.0e-5. * `devmax` - maximum fraction of explained deviance for stopping path; factory default = 0.999. * `eps` - minimum value of `lambda.min.ratio` (see `glmnet` documentation); factory default= 1.0e-6. * `big` - large floating point number; factory default = 9.9e35. Inf in definition of `upper.limits` is set to `big`. * `mnlam` - minimum number of path points (lambda values) allowed; factory default = 5. * `pmin` - minimum null probability for any class; factory default = 1.0e-5. * `exmx` - maximum allowed exponent; factory default = 250.0. * `prec` - convergence threshold for multi-response bounds adjustment solution; factory default = 1.0e-10. * `mxit` - maximum iterations for multi-response bounds adjustment solution; factory default = 100. * `epsnr`: convergence threshold for the iteratively reweighted least squares loop (see "The `family` Argument for `glmnet`" vignette); factory default = 1e-08. * `mxitnr`: maximum iterations for the iteratively reweighted least squares loop for each value of $\lambda$ (see "The `family` Argument for `glmnet`" vignette); factory default = 25. * `factory` - If `TRUE`, reset all the parameters to the factory default; default is `FALSE`. We illustrate how to change these control parameters through an example. Note that any changes made hold for the duration of the R session, or unless they are changed by the user with a subsequent call to `glmnet.control`. ```{r} data(QuickStartExample) x <- QuickStartExample$x y <- QuickStartExample$y fit <- glmnet(x, y) length(fit$lambda) # number of lambda values fit ``` We can change the minimum fractional change in deviance for stopping path and compare the results. By setting `fdev` to be larger than the default, we see that the computation stopped earlier in the path. ```{r} glmnet.control(fdev = 0.1) fit <- glmnet(x, y) length(fit$lambda) # number of lambda values fit ``` Users can reset to the default settings with the following code: ```{r} glmnet.control(factory = TRUE) ``` To view current settings, call `glmnet.control` without any arguments: ```{r out.lines = 8} glmnet.control() ``` ## Appendix 2: Comparison with Other Packages Some may want to use `glmnet` to solve the lasso or elastic net problem at a single $\lambda$. We compare here the solution by `glmnet` with other packages (such as CVX), and also as an illustration of parameter settings in this situation. (__Warning__: Though such problems can be solved by `glmnet`, it is __not recommended__ and is not the spirit of the package. `glmnet` fits the __entire__ solution path for the lasso or elastic net problems efficiently with various techniques such as using warm starts and strong rules. Those advantages will disappear if the $\lambda$ sequence is forced to be only one value.) We illustrate with a typical example in linear models for the purpose of comparison. Given $X$ and $Y$, we want to find $\beta$ such that $$ \min_{\beta} \|Y - X\beta\|_2^2 + \lambda_0 \|\beta\|_1, $$ where, say, $\lambda_0 = 8$. We first solve this using `glmnet`. Notice that there is no intercept term in the objective function, and the columns of $X$ are not necessarily standardized. Corresponding parameters have to be set to make it work correctly. In addition, there is a $1/(2n)$ factor before the quadratic term by default, so we need to adjust $\lambda$ accordingly. For the purpose of comparison, we set `thresh = 1e-20`. However, this is not necessary in many practical applications. ```{r, echo=FALSE} data(QuickStartExample) x <- QuickStartExample$x y <- QuickStartExample$y ``` ```{r} np <- dim(x); n <- np[1]; p <-np[2] fit <- glmnet(x, y, intercept = F, standardize = F, lambda = 8 / (2 * n), thresh = 1e-20) ``` We then extract the coefficients (with no intercept): ```{r,eval=FALSE} beta_glmnet <- as.matrix(predict(fit, type = "coefficients")[-1,]) ``` Alternatively, a more stable and __strongly recommended__ way to perform this task is to first fit the entire lasso or elastic net path without specifying `lambda`, but then provide the requested $\lambda_0$ to a `predict` call to extract the corresponding coefficients. (Remember to set `exact = TRUE` in the `predict` call to get the exact solution. Otherwise, it will be approximated by linear interpolation.) ```{r} fit <- glmnet(x, y, intercept = F, standardize = F, thresh = 1e-20) beta_glmnet <- as.matrix(predict(fit, s = 8 / (2 * n), type = "coefficients", exact = TRUE, x = x, y = y)[-1,]) ``` Next, we use CVX, a general convex optimization solver, to solve this specific lasso problem. CVX is implemented in the CVXR package on CRAN. ```{r, eval=FALSE} library(CVXR) beta <- Variable(p) loss <- sum((y-x%*%beta)^2)/(2*n) lassoPenalty <- function(beta,lambda)lambda*p_norm(beta,1) obj <- loss + lassoPenalty(beta, lambda = 8/(2*n)) prob <- Problem(Minimize(obj)) result <- solve(prob) beta_CVX <- result$getValue(beta) ``` For convenience, the results were saved in `CVXResult.RData`, and we simply load in the results. ```{r} data(CVXResults) ``` Finally, we solve the same problem with the `lars` package: ```{r, message=FALSE} library(lars) fit_lars <- lars(x, y, type = "lasso", intercept = F, normalize = F) beta_lars <- predict(fit_lars, s = 8 / 2, type = "coefficients", mode = "lambda")$coefficients ``` The results are listed below up to 6 decimal digits (due to convergence thresholds). We see that all three packages give the same result. ```{r} cmp <- round(cbind(beta_glmnet, beta_lars, beta_CVX), digits = 6) colnames(cmp) <- c("beta_glmnet", "beta_lars", "beta_CVX") cmp ``` ## References glmnet/vignettes/glmnetFamily.Rmd0000644000176200001440000003000113775432177016656 0ustar liggesusers--- title: "The `family` Argument for `glmnet`" author: - Trevor Hastie - Kenneth Tay date: "`r format(Sys.time(), '%B %d, %Y')`" bibliography: assets/glmnet_refs.bib link-citations: true output: pdf_document: fig_caption: yes toc: yes toc_depth: 3 vignette: > %\VignetteIndexEntry{The family Argument for glmnet} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ## Introduction The `glmnet` package fits a generalized linear model (GLM) via penalized maximum likelihood. Concretely, it solves the problem $$ \min_{\beta_0, \beta} \frac{1}{N}\sum_{i=1}^N w_i l_i(y_i, \beta_0 + \beta^T x_i) + \lambda \left[\frac{1 - \alpha}{2}\|\beta\|_2^2 + \alpha \|\beta\|_1 \right] $$ over a grid of values of $\lambda$ covering the entire range. In the equation above, $l_i(y_i, \eta_i)$ is the negative log-likelihood contribution for observation $i$. $\alpha \in [0,1]$ is a tuning parameter which bridges the gap between the lasso ($\alpha = 1$, the default) and ridge regression ($\alpha = 0$), while $\lambda$ controls the overall strength of the penalty. `glmnet` solves the minimization problem above very efficiently for a limited number of built-in (hardwired) families. To fit these model families, one should specify the `family` argument to `glmnet` as a character string. The families that can be fit efficiently this way are the penalized Gaussian (`"gaussian"`), binomial (`"binomial"`), and Poisson (`"poisson"`) GLMs, along with a few other special cases: the Cox model (`"cox"`), multinomial regression (`"multinomial"`), and multi-response Gaussian (`"mgaussian"`). Details for how to fit these models can be found in the vignette ["An Introduction to `glmnet`"](https://glmnet.stanford.edu/articles/glmnet.html). Apart from these built-in families, `glmnet` also allows the user to fit a penalized regression model for *any* GLM by allowing the `family` argument to be any legitimate GLM family object, as used by the `stats:glm` function. ### Using class "family" objects for the `family` argument The `family` argument to `glmnet` can be the result of a call to a `family` function. (To learn more about family functions in R, run `?family` in the R console.) All the functionality of `glmnet` applies to these new families, and hence their addition expands the scope of `glmnet` considerably. In particular, * All the methods, such as `plot` and `predict`, work as before; * Large and sparse `x` matrices can be taken as input; * The user can put upper and lower bound constraints on parameters; * `cv.glmnet` can be used for selecting the tuning parameters; * `relax = TRUE` can be specified for fitting unpenalized models to the active sets; * `offsets` can be provided; * Penalty strengths, standardization, and other options to `glmnet` work as before. When the `family` argument is a class `"family"` object, `glmnet` fits the model for each value of `lambda` with a proximal Newton algorithm, also known as iteratively reweighted least squares (IRLS). The outer loop of the IRLS algorithm is coded in R, while the inner loop solves the weighted least squares problem with the elastic net penalty, and is implemented in Fortran. The R code exploits warm starts as it iterates down the path, and so is reasonably efficient. ### More on GLM families A GLM is linear model for a response variable whose conditional distribution belongs to a one-dimensional exponential family. Apart from Gaussian, Poisson and binomial families, there are other interesting members of this family, e.g. Gamma, inverse Gaussian, negative binomial, to name a few. A GLM consists of 3 parts: 1. A linear predictor: $\eta_i = \sum_{j=1}^p \beta^T x_i$, 2. A link function: $\eta_i = g(\mu_i)$, and 3. A random component: $y_i \sim f(y \mid \mu_i)$. The user gets to specify the link function $g$ and the family of response distributions $f(\cdot \mid \mu)$, and fitting a GLM amounts to estimating the parameter $\beta$ by maximum likelihood. In R, these 3 parts of the GLM are encapsulated in an object of class `family` (run `?family` in the R console for more details). A `family` object is a list of GLM components which allows functions such as `stats:glm` to fit GLMs in R. As an example, the code below shows the constituent parts for the binomial GLM, which is what is used to fit linear logistic regression: ```{r} fam <- binomial() class(fam) names(fam) ``` This is a list of functions and expressions that get used in the *iteratively reweighted least squares* (IRLS) algorithm for fitting the GLM. `glmnet` can fit penalized GLMs for any family as long as the family can be expressed as a `family` object. In fact, users can make their own families, or customize existing families, just as they can for regular GLMs. Generally this option should be used only if the desired family is not included in the built-in list. The reason is that the entire path algorithm for the built-in families is implemented in Fortran, and so will be faster. ## Fitting Gaussian, binomial and Poisson GLMs First, we demonstrate how we can use this new version of `glmnet` to fit ordinary least squares with the elastic net penalty. We set up some fake data: ```{r} set.seed(1) x <- matrix(rnorm(500), ncol = 5) y <- rowSums(x[, 1:2]) + rnorm(100) ``` The function calls below demonstrate how we would fit the model with the old and new `family` parameter options. To fit a linear regression by least squares, we want to use the Gaussian family. There is a *hard-wired* option for this, specified via `family="gaussian"` (which is also the default for `glmnet`). Now we can also use `family = gaussian()` to fit the same model. ```{r message = FALSE} library(glmnet) oldfit <- glmnet(x, y, family = "gaussian") newfit <- glmnet(x, y, family = gaussian()) ``` `glmnet` distinguishes these two cases because the first is a character string, while the second is a GLM family object. Of course if we really wanted to fit this model, we would use the hard-wired version, because it is faster. Here we want to show that they are equivalent, up to machine precision. There are slight differences in the algorithms used to compute the solutions, so some of the equality tests run using `testthat::expect_equal` might fail. However, these same tests can be made to pass by decreasing the `thresh` option in both function calls: ```{r} thresh <- 1e-18 oldfit <- glmnet(x, y, family="gaussian", thresh = thresh) newfit <- glmnet(x, y, family = gaussian(), thresh = thresh) # tests for equality library(testthat) for (key in c("a0", "beta", "df", "dim", "lambda", "dev.ratio", "nulldev", "offset", "nobs")) { expect_equal(oldfit[[key]], newfit[[key]]) } ``` Next, we demonstrate the function calls for the binomial and Poisson GLM families. ```{r} biny <- ifelse(y > 0, 1, 0) # binary data cnty <- ceiling(exp(y)) # count data # fitting binomial GLMs the old and new way oldfit <- glmnet(x, biny, family = "binomial") newfit <- glmnet(x, biny, family = binomial()) # fitting Poisson GLMs the old and new way oldfit <- glmnet(x, cnty, family = "poisson") newfit <- glmnet(x, cnty, family = poisson()) ``` ### Timing comparisons In the examples above, the new version is simply replicating existing functionality in `glmnet`. For these GLMs, we recommend specifying the GLM family as a character string for computational efficiency. The figures below illustrate that existing code for these GLM families is more efficient than the new code, especially for the Gaussian case. (In the figures, `n` and `p` denote the number of observations and features respectively. Each point is the mean of 5 simulation runs. Note that both the `x` and `y` axes are on a log scale.) ![Timing comparisons for Gaussian family](assets/vignette_gaussian.png){width=90%} ![Timing comparisons for binomial family](assets/vignette_binomial.png){width=90%} ## Fitting other GLMs The real power of using class `"family"` objects for the `family` argument is in fitting GLMs other than the three in the previous section. For example, performing probit regression with the elastic net penalty is as simple as the code below: ```{r} newfit <- glmnet(x, biny, family = binomial(link = "probit")) ``` For the *complementary log-log* link we would specify `family = binomial(link = "cloglog")`. We can fit nonlinear least-squares models by using a different link with the Gaussian family; for example `family = gaussian(link = "log")`. For count data, we can fit a quasi-Poisson model that allows for overdispersion: ```{r} newfit <- glmnet(x, cnty, family = quasipoisson()) ``` The negative binomial is often used to model over-dispersed count data (instead of Poisson regression), and is also easy: ```{r, eval=FALSE} library(MASS) newfit <- glmnet(x, cnty, family = negative.binomial(theta = 5)) ``` There are many other families, including `quasi` where users can customize their own families. There are additional specialized families such as `statmod:tweedie` for overdispersed count data. ## Class `"glmnetfit"` objects If `glmnet` is called with a class `"family"` object as its argument, it returns an object with class ```{r} class(newfit) ``` This is similar to the hard-wired classes; for example a `family = "gaussian"` fit has class ```{r} fit <- glmnet(x, y, family = "gaussian") class(fit) ``` Importantly, both these inherit from class `"glmnet"`, and so all the S3 methods such as `plot`, `predict`, `coef`, and `print` will work out the box. ## Step size halving within iteratively reweighted least squares (IRLS) For the built-in families, `glmnet` solves the optimization problem for non-Gaussian families via iteratively reweighted least squares (IRLS). In each iteration a unit Newton step is taken, and the algorithm terminates when the unit Newton step fails to decrease the deviance sufficiently. Because the algorithm iss forced to take a unit step, this can result in non-convergence of the algorithm in some cases. Here is an example of the non-convergence for Poisson data. The `stats:glm` function converges and gives us coefficients that are reasonably close to the truth: ```{r} set.seed(2020) n <- 100 p <- 4 x <- matrix(runif(n * p, 5, 10), n) y <- rpois(n, exp(rowMeans(x))) # glm fit glmfit <- glm(y ~ x - 1, family = poisson) coef(glmfit) ``` Fitting `glmnet` with `lambda = 0` is equivalent to fitting an unregularized GLM. If we use `glmnet` with `family = "poisson"`, we encounter an issue with non-convergence: ```{r} oldfit <- glmnet(x, y, family = "poisson", standardize = FALSE, intercept = FALSE, lambda = 0) coef(oldfit) ``` This divergence happens because the unit Newton step was too large. However, if a `family` object is passed to the `family` argument of `glmnet`, the IRLS algorithm will perform step size halving. After computing the Newton step, the algorithm checks if the new solution has infinite (or astronomically large) objective function value or if it results in invalid $\eta$ or $\mu$. If so, the algorithm halves the step size repeatedly until these invalid conditions no longer hold. The code below shows that this step size halving avoids the divergence we were experiencing in our running example: ```{r} glmnet.control(mxitnr = 50) # increase maximum no. of IRLS iterations allowed newfit <- glmnet(x, y, family = poisson(), standardize = FALSE, intercept = FALSE, lambda = 0) coef(newfit) ``` In the process, `glmnet` warns the user that an infinite objective function value was encountered and that step size halving was done to address the issue. The coefficients are close to those obtained by `stats:glm`, and can be made to be numerically indistinguishable by tightening the convergence criteria in both function calls. ```{r} thresh <- 1e-15 glmfit <- glm(y ~ x-1, family = poisson, control = list(epsilon = thresh, maxit = 100)) newfit <- glmnet(x, y, family = poisson(), standardize = FALSE, intercept = FALSE, lambda = 0, thresh = thresh) # coef(glmfit) doesn't have intercept but coef(newfit does) expect_equal(as.numeric(coef(glmfit)), as.numeric(coef(newfit))[2:5]) ``` glmnet/data/0000755000176200001440000000000014046050560012451 5ustar liggesusersglmnet/data/CoxExample.rda0000644000176200001440000072651314046050560015224 0ustar liggesusersBZh91AY&SYBk_P@J⽞l{z7=׽몼KR{޽'WGwޮm{wuޥݵҥoN콚c;oyn ZܖλzZ6Okzo^f*롺z-w[kJ޷w׮U.wJ]ҭͶ^hݺzv헼;[.:tsowOw.{kjQ[yo{]Jnsm{.ۻ[(j.F39W[iNL]Owmzo:nvΝ۔`>)zoaq5v}w|zz ݀6}4>K4 >}(:}4=}(z@4}@l}=@@ 4zht@4P ( @݀Ra4fBO*!T@ S'*D*@h 2h*~LOSa2` 4ª!T M#F&L 01O)#0T:h#L&&M2id&L#&&i4&&&`#L5<4iLLM20 ʄSD C@hh D00HDIp 0ˠDdD?&00aY0]&a*4"a` S]L0a@`pQM6XyyK"3RC}& ՋVtMyeHfb6D"vFoܽ}Ȉh7 R~(,"c'Fiꞕ~TO> 79Z ;N{貴J6Y:"mC2?Iٸ/ѻ:&1"9ۊ-@u 0;\;7 \?]_*Uߎh)J1Zu?K}̳2qk'fs#+)Ѹ{2wa~tnq4z._Jr)U~yfYslX(LOnl8W6r_S|E]8{@b_x)j-y|R $Ip:kG_Ҽ%ŶZM)3f'K.ڝ ֿ<ٜGOC v,K1IVMz;[Q̫\ UsKݰ T% ."= P>+5ŵ U~0h_{Wܛm4+mAy:#2~AYWϓv9G,Ӟ U6 sSX1unOYNLpe /:6ɔX3xCnϧ!If-&079MjnYz|uW#Vm򮊗Ʀ~ג#@8h48ڿ0A)/Vyl?GMϒ/\꾰S6{1]*3QiIݲVwFaKGI"omm&MUVM:0~σ!Vm,9g'/}oc["9mwCzl];֖M7{i9UϚ댮 Pzo:m+xDPwWS>B~$3vûOO̓9@(/}dFJJT>y|% S4# L쵺w&\s #(bOp$goWGN$CNW0u^G`_ gR(yj)HGYp*_0ux3]Ţ{-܏{u͚[ԭ߄P4uvIND{J1/"}P9/B5M\;W[& N^*_4)z{hn!4So\44JU[g"ƒ=OG^rmSt[h㫅0&s4ܛk %nMj+>J)/!9R-\8ڠV6!߬)} S(eɰ2}{a5CQdglfӶO:to|ʺGz.ͼQ;)Sѱ?_E?7$ /̵$xvГp#قe+f!x6bkۼcPb| ln4]J?KtyRZo&a3}Fk>_V/ wFjghLD6S[1j:q[REF}SHѳ;RE$t 'R㑸hIg3B'Rj է,0} euE@x&DA&_g[G68ӮQל 3fT:Cc>gl۠"cmn].A g (,V4 5rޏOZ떏'Χe]vgR^mG;5M.λ̺Y.UW6T,:qUlݚlKO^? ACڤ$$Х0u~kZQ[7hLJK»3[ԥ]6dvus.MA8]$9p7T?rm m,.~` MX z?Mz\+_ /8dQhYu=u2'.et0O;zprˍ@Jx^H^ :+ tKRM M .2sPcVTYi'4n+|lO "eW8SW@XvoDKh:+ xabmQdz]Sۼ! Ъum긝* -5's7&ֳT_^paZf5#Czޤ=;ecG]%Hϥ|T]Lu36M~M)Vʑ m^u Mi#BMj| )¨شnhahF#Q5T'^6Y|(GU:N'؎!J)<S*P؉sV$ť=(neMo0)gº敼HzdS=Ƶ[Q bс57 g_z ns-Vb}u@U1 ~9BKIC"QYzik-lq Hz#3Ƙbdf BxJj F#Ao{} Y%[x0`U17`*pV?:t)zID(n| Gz'Zѷ  eaDrɳHD;Ky'"8]EBR}U5/pR[r: +>U~'F\'=$6 O[}*VAL!cGPKr ̈hQ3^d8ýU^|v 9 (ՒQNIL{(aP_ x㳤JeaٚB9ֵ,ί%C d?,vnhŤg? ®~  ]hyd? 6ޞ {IWҧh6wa12O|ZS%G}Ir"Ob՛tLA8`žƄ {IA~ MG lo(ﵾFd#xnٲ(_JKxg19R$*`%!ƬZ6p pn*>K=|]-XFrwpν|BqW3$5O+JS!{,6UeĹ ɵ9|x=XM3-ɍ?{my1:nnofM.؆1Z@ndCO5D-/^&Pd>K [j[g99Sixzy ڠ#tS}B kωØ9Btx=;"jjB*xi5P]k YvR X 6\Aa|VM*]+d)Ag{y>mEnC6d[/"]xat{y= @}(c% ?aGű 4Cl4{<8(pK+(:Αn^*f$~|廎>2J{NсLGq CQOfOZ u=jegnQ7_< ;2li2O{  k3 1#2HEe1|BxH@҇fe>#h[#DWz(~P`ΑQS~8{n+V)C%|^&D];§507!j+a!Ap T,`x"VdɌ_cΫ250(HCßH9`YA1:9ክJ=apkPEF%+qskT+ pYSgO:KqŨBPN>.=!P"WTJܟnn!C^g48|e*=ćA9z"H`1~o.j$yYCV~t;X)C[o6^pUr#wA(!9#18Bk<:;)(Lbns2ߴT [39J~k/)le&VEo[Bϭ܎Ut5Mb%P{o0Xwmv}/O+P2byxPe&~8r,HC]5CCud?2:a mGېːZB?O*{thf m%wd wO| Ą= fS{l2dR,u|g91s'o]ot`fiio+Sl98OlIQN)b06N4Hm5.waDHjw\lk|U\bٔelpQuA \* ױnOT[s;5\3 jM/ڣm&')ZzNF%W9C4v!9k158b Cjhڻ$prZMS#&d+PF&-mp1}&Qie'^ r{ص ųkʡ/ 2CXwWsÉ.~7EtN_Y_3=s"wðG/@YS>ϠRAdҰUEZqa, J y 3xd;]E/u 04|HYO>[qQjDYn>򋘐F@x2 a04Z[bUGۮNfDxv 2L&w{̬1tVyJj&:L*/) :3D# ˦Zf]ڽKo8§0A6dh}]bc1`[z]k"]q.=>|PD3-)?}gC0OhaZ)h2GAh-InƐq$`c"أ\NmBn^O. sݶWu.<D(Bv$U[-`ͼ1_HGmם4 ;A|ڹs@xۺ*/DX.=A:#]!Vf?1O+4|0 ͡pE86`Jĕx`< pWnl+XnkJ~@pN :u#?yYm+C|H`c[:_V๘t~HڿHf엪d'>׈YD(a;,\BV5qP3|J7d) Zr3͚ՕL6Xbz4/j`<{CfG񘧑($q`acSCٻ X'Sg]J(@@}z ^\yNW%>Nzv,߸1ɛ"|}U祸]-<*_R_>&+ QrSR=4"[̮tvH0Fb-h7q.%8+$CnhAn^NG4fO̘ @5[NUFRYhdY'yZֈyuyp*~`*M$QxD1fw>DAobeqLwEI"፺w ,@j^);Yd{gTY"7Ki6FH^g)-M2&!*Yzܼ ]#6-Cxd+ʺ~as5o|ZJ #:P#=[a ab3r 16 XHi#"&~CrR}j@͑ᛉh X{ɴwpuK'IXyx}ƶ쇹h%xu `@~]xD=3$zrPLf14S@/0,4 Ak,f/Q9VryhU{5IãbbS'O*e=i!}%E"Ġt'WS<$byi^Hݯ ] Ir~pTi>iNSKlKU02%gMu{FT +ѭg~ym v)m¸/)(ʔk(D_ tŬ.s$E|uy@=5,)\MnyA6 _Jo yr+6fˑEY*t󷂔f0qGߗ?)WN .O?x4}cg=p(I TvQZL=5&V+d{.-r|v.Dlԫ·TH%~Y Gp*;r;將|~\j'39;L\ޤZш -(yZ`T)A ePoK1!vfmA׌7|"-^o\U7UHٰQےT\g%u:h`l)X-JKe[5Vq(6ϗD%$inD &v6'=@n5jw[A~S.uBzf .AlΐH@ vwdo#7ÈLnOö (gY0NחG2S17; 0QVbܷwr+Que&6&dghrMzk;{n aVX3q]nU g[ $삵lΉ>@x7}_8$&;c[1=HfQdU2C̶~N /\t-~ӋVv`*\k @3tʆ٪y;ͮehj e#f> .`+xV`Qxՠ{ٰ۶I=& Tu9hɱ'&q~Y ʀZح5i۞6?'D|F( :e~Tel\%5?G8KtH!̊ [<إRlOv|)3 S9Qf9Ř2ܿkT1QCEAegZ&p*:4(vtz6_v/xyvW"ٍ g/hdϊWxKZd!K,ǼSm ʫc7sO  F,^o]麀h.1#LOHE_yatb߆%#vaH5-'ez9ddbDRT +so|RK^h=<XĴtw"sixV  q8 yUN'!~ż1*9%MoG! ܒ"}ih{7KL 1veh*s, # ܿoS&c^O{b+_t.0 `r{FK*8R۬;iMY3h))ݽޗQ9j_ QɁ^f= 71$I%Q0Jm@2zlh~8fGh W?G{-N`s!zO'b% mVtDѫ=Yy==oyS*UkPCǫ0qfjvgu4ƅcѱ؎Gojg: ,p5Gloe~ |}$3~eq'>ϭR#Q)v8i*2p9\f.c2J\#S ,pɕPom#SD7;ŶC[)"2am} ;.X;lRi ZfBuH:};-JT6Cߌ7~tWD:}nvQᓗ֩WoD OS[5Txd٦S {r\/ɞkz",Xtqs*)w}~cp_OxGTݰ=<$zSN>~,wKkv_ r.fKovc=F_ L TNRMѵ?Q:T;ѩ˃KGnv8uSDWL1E|Jėյu͸h 1!*>y2^sUgk$~3Sim$@:l֊Ld ՇRIS~أzYniy>Ekqr=d \.Ut AF(ֿ',Kf_tn{E䙝w/{e .(IR]SwDM.-gE+(#Q !?;oz%G?UI6 1|_UXy'R$Cr.rH\@Qǒw&O'nJOˠYk*v3`O:O1pc1"ܾ\Tz"4fn0&\?Ns;LOq./O'>dOx*ͦ#vQ[Mo?+Zoi7|R,?E3pTN.}C~}xPaӗcRhM=FEntn $(E2ƊGasXU}dk, |,jITP1e?"f"YuA*'uF`2!'x۸i|L̍|?в~'4e)j/sL<Һ:MxHH4!WVr ͑Jmu\ ]H" d MC/o B+\嫝 {βXW jY$ӷ Zqې"sO>%z ZWH:3/q T3-\Jq$u)o b t9o  Οו>- |@Dxfު{cpA2"M3`1;:DWxP5YFsD&[ko{P9$ѪjK >5Ű*߁#}WiUPHwl\&Vv6%m*QMhCfD?,[qr;.! E'/ =ʦ8P: 0dtL#1I+/;kȑy4ֲ߉#*f[;<Jrx"l/O5T{]+"vYYLc [U$}s=չ{6 IUd* 1fL`=9R ~{o0#TH%zdD`N yv+4MMnLJ|yL$!{SJT(~(g QU<"E{AB#zSFg %MZtCϋқ\a+EkҁI/#fI.MPpIN -ڡޑUpJr (jjǹPOgS-yb^1U"{kJ~ج_d˜*HTӑN8^Nr0Ρݻo-e(Rڔŧav 6\VȍetA<;_}dmt]FݷX7eHD?hV7"MxF JG0G J?@or􅃷Ij9iCJǂ?r:hɈz%h<qsd}g'k ?:.`Sl&a uHdgnt[tJCn]wG8,O(h*V.y1USOʁ<%U[3rɌDD꽂J}bΔZeV(I#\+n=q YҨ#G9UCzڱbvL$66-sZJl0 YՀMSr] [•1yuo9Mfc5[y@, MErsC~|%&ku!yw\=Fb些M#f1 zj> ݈!R01l|?oX'J!~R靸D+\ؿHObT;hB̀E3lz0Gk`  zz߯OL)Sʈ1Ih|k.{Ń 7k5ܒA@2?omiݕF?3G-z6(n6zruPEK51`:  V|/8U쨬KR*1-6T,$ʏj ^A"|pG}0vٜaS`BV9Yz ya嚑NC'L~= ɬ)]LehSXɆ?jmH_`vJ}aۙ? "ec^IHՂS <\T-"}ˆ]fegKyR-B`3X:YgJKw?q}v6 W=.d2WqR޵qS3Š"%=+SdZ7*Zᢅx>)~奁؇(K%zL?MDFB+;͛Mc-&EN0[xn`?JX7~h1W2B, 'IYóO~ƈ$wU$5J$/ƦarL7gG̀Sܿȋi0|^fy* -'Qh eClJQi]JFixrM1 _qHP'Ǡbbo+bix$ob8(*4yK*JnjTR^ûjn:<ƇFR!x% -3l=X{Դ4}@:0 a6 L ;..POH(0@ ׺5}lʐNh?)֝>:+nc{\i4dj^#"Q}]d*SQӬ,T}qHAnD>OoS$$&@AV>J'jS t//jXm#llw,R7\훽o#`d]$bzl)ϛVKubO4bϣ3Y*#"\_oioWwx-n duթM غVp;VHÃbai)}&Vyn(7Gw߆\[f*(QyٶH.ʟqJ9 &,7L,䖂[y2JFFyyqУ0LtMrfwW팙Z)sJ=e"ճă=Tڜp/E}=PI2 [A%TӰUJ}# 'gN\ԛ~sz)E`hHSV5^sQJ9Gȓ^{wL V$eڃ-ɟWo%!ǍA#t"Zi BJqчF+ .XL.LW ӎ˿Ȁˍ-|aw2z7LfE~A^FvcxsR@-0D* Po Xc<ݷl(-h0m ~0dR8YU`۠f_r1䓱U~Ԝ*7 x'(",_Af[!/DE2J'ݿdͬŠ Yo C}MϳWX$>Dm pdě/vCoz _sISJn>uYr;]`!1$>13fv:[}>/XhIJer4FSdv,Ri ElUƓs}" b&]{t|ϖ8%Sx9pQ苕Gaϒ]ƈ]IU1Ze!s;P7ٯPͱ f,{דU)7dpdFF@&TŚ%מ=JJ^Z\`pì@Hʙ60s4(tH?:b 굆d"_VvqMdRd^L>ZɎ+oU,%:!]eLI-z颕P$ݐZCPnpZf],sQ2ƱL\)RcՌp [ɾB`B"D{Pih5- ;M? )sV ,l ^.!:Z q2؞R2-maQ 6/yblXȭUzJIQ "Vg-ah_6'c"^Ҙ=Y&FM4?4*Ǫ <Ōk('F};p"ԚOy'%&Wm'([ ˜&_;G4?{MHZ󙔈4-p<,d3:*}OHj|֧3Z;$دWC,^K 5˟`HyvʉeUl6;s`9][JXn i+-Ls|H2Og3{Ȧw hmwROr63bn)4%L- ^'YbaioSAپry@+2ĩ`[kįTJurnk{4ȧ. t\ z >7"?ij9>C&q^^<\_'یyS_021b#(.ܾs ?!X|]YlaJ| ^vxJ͇7}J͝SY2|,w}gZ`/Eh<\m4tɔ%snYE艭e 羹# 1yVZ=UHUBGVz1 4 ؾb CbGGIhxFX\l3žG>#=W~5Ȩ%rHnS &O҆)qs@ .>j'D%fAdK {-yAQvy )!)Mba=U, ЂRZv_߅DT ej#IKllx4 dfJ]8D wNf=\;8jÜh`؁_"VYՠW\RG7 m2q64F@\I6ZsL2Mz|DG.ūzcDO TN샳u2fRJ  *(^C @o!ʀ!&'=?s_PFm+DNB,I_$D Qi/rЩum>qIT,&p2!T% |Uc=ؾ^)Qi!L%BMlԋz<&rOzlJzsZn!0|AX{ O0me}71+P_LiW>bn)&9'<37Ak4#_7l |ظ="܂'oŸ:mj;yUU~c@pKDP(nblFϩ#d@6eVҊhTttjC}bW-R=4$51@Y i%xCx~jXKP5#)ft`[]lr޻Ҝ(Y)CHtm%)߰A>w41͑w~"֚n>|)caTxn禈$cly& Nx!"s+lvB cUi w8J[y+trRSv5zGKR3wBv^?AeW>`5sǾXjO:71gFSbsQIvPB3_V&w b3)z9*R};?)_2|ЂE t^/QzYB8eHOf LDѶ 7KoKS^շ G܂+\gq6&hs-3`mspT P[r7͉_+sQi͓ۗ&Lj 1(E.dY Ό'VA ,KY:? I(S)es*4ٳv)( ޤ7Wm*Gmt ~~2!,uj(Ua[5;:~_)֭x4YSUgi 'VwɌuG9*-[Zv%I\FFDhY?}ʤn#W< }5ߟtiU!&',!2fiMs^Xy Ȅiݾmsbfܵ.+)_EKo g%MR 3MTzTKY,G2^Q ǣD/1rP2'NbGK&eo?pq)r}/~e}Oеu'u7wU h* H}t9F^R.UrM)9rA]C6+#2ܒ6(3ϝ->3VV<@1bwdQ`8ݼSGoUgjq}5F7wYne=hg>:QvNn!} B9dqspI&C7?`8sԷܴ_0S#\6o\'uk;Xt1AqgKNE25h(Gl\vJ;n  2OGwSHcPp8jf)B]8+ 5t`r('jܚ|,tﴔƟczZrmB2J;Dє]؊ҫxk'C@rKC4 LK%LumѨ҆ۼP '&mz{1F(To[7+>.#g35wI;AY"oRE>K@dua2AܝyyL#B,P | 9kWNE9@dC,&*{?g&}ov!=Lj#J՜XbUb"5nuo y`n93(Aq( Pt:Njt-xwLȨe&}XLfsK's?+F ՛1x %.#&psC@ ({#3Qaen<1pd)*rxaUzq_]bsF__;="m2xAPy5b Q!ق|MV q)rL=W岃sH %ѦpL(*R]Ρ3fXc |><'sD^rò>iې"Ҕ&#fp O7GUW 0wWt/۵mJ߲CIOG hn=ƢὭ๚OdK8A)K};6Lڗ[ ) H"H8նXx)YA ٹ5NNaIb2`HU [?2ؤeqO =e*-M#4`[ϫ%V=+(ݫ[EyE$erקSބv\|TAK~1 ',q/i` =zyIt(gP/T;9akd 26Mq kK{PsӐ!;񆝓Iћtf= X:CMxd|{Zw!:q蛎MI%ى_Y'^e,v:Mu>FwY=n;<=pDMr_߿_[ yko}}4}|bO;Z?NKo}$Ќ㷕ɩƎ]'.:JX*\:$|<а İ=t+'9UˣUe^|cT@Οܾ䜾g%& zxk,ACN&"_z2E=I|@xjLR]3 Ά!N@⚢>XCc130,_uQ2M~MoИ2Iҗ~/'rzNw8bXi (Q`tcN> L~,?e_B&vI^Mpe?\j\}C? Zs& g+\vp:L02Y+'K"$OweF5:iAr)'R:P;L΢nL yxӖO, ~<鑔葈?7·&șdno[[pJ;ynai[R-Zq& gDEi HTo+P` w|HHب NebK!&vg蜂O39և F%KX]-'io0cPUNT{H/㵴+n<OcY$;,P"7d䟶IBƉ-2b}`jZ/МvNa+lF$ 6?k7V"YpNi69å<]~εO|qHp"B^5|y`O],gVM5?5M Ҧm1I(Y䠑1y  :B`9Dri$D Vopi~I,/ljFSLeJ#n:`y媛C"N`0$)74~o .: ds(Da ǟou`Z6fŃ~[߳h,J젿/9HO_䫷q`JZfU ΧݾTJPLJ#`}~T3  3IGHT``d^sI.J/f'Lޛ ɈwdԸ4שm+0W 3WWKo[?&::*=9IU7«X0}&H{N+Pb 6m]ke=i5jp8W@;aePZ?»0"zr7yacJB E*kuU>6VUsE+VשU,:Ve&=8*4BҀ2$9fDy uoka7~ɇDb*K/O).7HSYj!A]|G?i/~XP?+KuQz-K's{1Z(8_R$Y#PZ.7oתYNy.bq"t4 <&%"q?q`o.ZuJpj2QL欔,#)1Ѝj箑m;|J$ebsD7kI˴$ABq蔛*BBdFe+ ڼb:| G`R^ۈJmtp!!'g/տ)-GIB1w,!fC%0R|;%1-Ֆ \D)5Di>KMԝa-B;\72`I+EOV}DQ̲{ӂw9@62ܠ"QlQ8NDOhO~ؠPRwIlݎ@NӣGں*ω]s UN[|o)h O];u 1 2`oݷPܨs iڒ]q}+kKn/~0,ߺ{=/p {yeƠ`Vל_Z6rנ>xRBiC-$3G;uf#5т$iY;x~0]tp'EOHQ%p3ߦ\[\B8f0^Mݝ>/d%{oeEYӟ%C 9?h4qsEϣ)~wexN{]~KlX0Ph/: {Yb,~ RCSl+ h-8z ~<0<{^ ] AXw[bĜPϪ,k HHO2T2ꣳj}n~+׊r 2[Z͜=NGuZ (Itpro]#ksga%Unj@5_+jY̞X9`[;RbQw>;&jhr]~!?]}~2i}^~2B9z~O$>!Le;< . pș7UԋϻFgyQTEe}qS ;+;ҷ- qnpnBvM0b.9"rݳ.9x0b^ɔ?$Ҥo ]Oq؆[KDсCS{.$)%J p+ /Gx϶b/c=ZMk(g`6/pS'$⫊WUa8NVF0wHs_t^9-ނFelR`R+K-G@J~TCo(ivZ9Ua؃V&1Or2ǀksޜ82$b)V4f OtϭGNIbs{v̔J9‡{nw ] >Ay:1D[u.:'pecȥXpb3zN6q(Hת q/kI2ng0ѰHQB\"gm݉h 9%)zX~^HmRm'BxT͓ڬ*6!l=GU} HU=#_P[Fΰu( "ЬGq"jyFd"pv9q@ "~ ?G*o!3(θj>QKRм%>P 3S}=P7CӺXnu ~ ;:PM-/qCH.Y&0::ѠNܛ?EĦ.;@#CHn ȥe K@1rDs\PWܜ`4z QݘIKI Y %50aX_JS%hC_+;zac-;'/eKSF3%ݔ#nOwzؗzuL> c8 a5zU+TK^}X iSaBb#t *L51%zL$xQZPuHK.,' TAkBb>Ѻ5 Gҝ o򣐶5^daY/xVh.w}kWUrOɴ$j|u Crmi=/d1SB:.OmS+zԭv;$, ^:T4/+sjBkL6[ L( FVHŦ{z ICqY~Z@k/dDm&95UؼycT!F!D2ojhmP5IdXPmLӆ=X}Qg:нG%-BK:JL] tas5>HUxub''ģ p)5?A `YF5+^,r$Y/2CWU 9yu*7ZH𡖥}c5睹#Z:v;MϋA3o]6H~U땟?֟)E9ӥ&s)K[t&};ߥg{4]2|+;Ϊ-fz+Di+ d9C Wjr.R]f- j!J7Zv#2;53BU܎Px]O88 Hr0,cj-MҠr^pK] P8qrEL|m[iyHV:Hj~ pwC9|X.bBWCLG{Њ(ˉXdcB>zv;zQ 2JQ%Bo``8nZ5F y=?4ES[tn=5^Xިo]t0gHw58M0$Ri]gme"yfa9xqoBk/Prju}T^LLĂUёNYg|"`SٯP:vMVLgvҔ RQ_=bJ\p?eN\<8PI.͛`N_Ph3Ջ]l\1RTF zv22[ܖE)+?hӪBXKa;IFh̞Fuj <#r:W`qk³@P_DZր~JɈXI ,pΥ? ;G o9(Ei.p󄡳;<HDҟ&KH|U0W? P `Ğ$F֎^mn:N𢘨SYKt^CTVncYmVeAvpgMh}5NX?{ Gb˳Rb.U`mcXeMOEUC 'j})'wYTHO$E 9|DdCr^%⊛ ݞ' 1Kxa^gajr^IxF7 k\2y9gzJd3qƱyЧP4>ӭ3%ll'ң!px+p+|9v2K(tc+HZ87 d~U G}!~+U(i14Ezu#|o^)]rUtuUk4S`i3׿U`UUM='<%‡^>45}s;ؠ܂qkѹV2q, kkFe>$$LQ(U¬>94/Vf ߉GN¯\" | ņYz.Tdu|[ZROꖺ@OX6Dfl1Eixc9XTY̒46+QN$˒]+A67GeD[<*c|Ûj*{@26# hƜN~܄sR[=Bb<)q($d87jY\_ݹPtHԬy" VBS'rf zKߠ1pmE[(Em?L@7)y(`Wh>5b>|/7 hV(-ΠH&4'k"Fx^+f Cs KPfFҨ6l'8m"=:&A&@M 7||~]SQ@,M (H|z(69TF(MJYT-V?\,mwTYm\ BE[>ԛBXD FQ/z󇪛W6|n\+gW Eud7󃙪k.Q,p{%Q~fON <(Kebn*OX.E!4xDN3N9#pl)ExZ0U;7L~pä*Hy•)A uC32/"=v;ƕeJIjJzϘ-N0^%Y ?~jP{c8O%S6,Xq:eFWhi/fս^zr6s^g4%(wxZxiAv#k tFsl4I_o 7O_M~`Tu06mTщW>K=?<_;9}nS}LkƄ Cf7 +}wᮒ87!X)7~}<~_8:l20^t 8]UQ6ܓ?%]qocy=6bC rhqJrj] p?lQī,CWGZwbDd2FArk2N8eˏ4p%&_zi4ST/< R,S\:a-0n7!Ppco%.X1imGCVZVCCg:}usU@t,R [v]@Mg'vm? bc%N8>e3hI [=*K*quzH뷇輰Bm5MjpW={5))$U{F^/|77*e4rEm -1iسh胛?ʯ RPNOs%PF%{K<"|?*겕M kU](e;zi/hFnBj7dPR;=teL5/G230۹;D'4U-Q?]"K2Ps!ij <&;-h\H߆Rxn6U:9DZSdoz zQ|7&N{cZewj儽uT3_Pe4[HsJ0,ų6"ae~X›LMbOkG͙yatWjHx#EHt1ԉ].J;u=ZD@6KRL."p:\8<+-r[&Eߛ˒c+gnũ2QNDlڪrYBr7^Hաށ%,F(k]k炓`hUy)NNaa|НDDG2t|?>OBHeFJ?iQZ6d`= [ Gm9;d3|iU͒mR܉6Q9+гkYI~bԬឋ0G5xayxCL2\PH$J>xۊ+>e-,lڧF 5ofe)9|J̜f$DFseQN1*-L⾆.m#~蘒r6~$(}ek0[hhB%}VjGC~9صmO+C\PR[0đf3; Hfc!DXO!jGu"S<>@b1Aca\eYa=m۵t{VIe*LHufn=$z?8fVo\y- g_+&,l= `4+Tf{gB4sbMiner\բe&i8+liL_kFK$vY} ixZr=P Ci_8- '9B iƂV(a+ޜ _EOtS}֤wI~-7MS(;Fo\i;F? AMB I֕>0ݾ7Wt[>9kIf[,>0DϡrYCK%峠)O}k й8h4PaAKS&SAiN. rl4 Հ/1hFQpll[J8g2Wơ@/>(/qVqOwzU!‡K4[73 m~}Ev։jaoȾap7;j9~C;@^F'gS0Q`n>K_F,`MgzքtO kjC}^S~b=œH.L[|נ-es p*`錿#ʂnk v/yOكʢX:2M튦i I SK&2f7P ˔ڊ3>8ngs{oaoqmgƚ;qV˝yg 눹MyDīr =>v5OMI! oHeRc_sT ?zj^+'9]q4N?iiҶ]GpHgoơŋ%ׯD}qGdvd21"WNBYkomxbZ@ƱmqPY:E ]: qAzXbő׿th\y48yé%U0/ !Kh=Zj9D3ӽ~{$ỳ8i?zU3~XSXcG\W#{'U.uNzZN&Ǡ'&WD@#t׫:/+*4y?vq2yD#ovߵ<81 QM>kR2sƉ Fsu<6覃63FTT;yL1]5Yѹ0'}ښP1HO,Iv2۸ ~+iSY7Gx?,̈́)aKL^E D 1bX XLMm$iD[az-w}V$m3;P5Zޜc,'S囁3["rzWF|/͒b֗GZ5Ip%pe ZӜ9\ZG(c!d$UɠD:tMtcAk5a[JsUz'bLy̝羙j$iqDk2^ aʅDwup@LjaR`'eQ4QVz\`DL0'#nvnwPv9*97:u%$A/X>\iqv򄞫3ew45`} SӢ6bCq\5 aiѬj1$4zKqQivٓJw#==Tmې=4؇;RmvhߏTlHP@g8ˑG\ ;G 7$GwmkWD薧ND~mUG;2|tOz?<}dh9?3_yxNy&`ǵ`_ 3 qᇜ, ]\Ŕs%43FPTR%0H v,+L>_d!uVd&0%[w穐r꾲; d{}+* Rwr;cM@(hl*`9y,畺_o*EA%T B\vP •U6٘څE|5$t6l ryz=1jFpZ,VEfPߝhNF \V=W=1 (/Rt3/7'؛Fȭk,ϟ88%&;UC|#5i-pӓm_*Ȥ}u>ȹ](xE6 Ȧ"no9啪8<‚hr%܈iE% T",Xf]d`G5(CY$u)fgGļ[սX3]gA9)7mrٹ'ʵ^:u,%fGII/R"B)(/:aL!"/<5a@M)/1SnM.~NoI1<ܬQ)NU'A.~ozB5 WyEHڷ2vՙaR?P 3[A檲RZQܿ1šaFضᄒSP2++藞Z.ǝHO<<ml halb@|OUg;b>?&fW#\tױҹĤ[:P`UQ .3?GT̊86Eժy,4yK9=fJ 3L`qɮ7Z k&7NKtGӄ _2׶.IIz'I4k)< 9DžPu\9f'dV]\pZ_7>4-=R;|t}S[c1ےhr#β]SQaKoϳEn3]2ABrˣ OQ@҅t^<Y+Qr<:[:?."5G߽@aj6e+H (:ן&!{T6Ep">Mu ̪f5{QRƺ Dx[e'(kd@!O3W˸+A()^3Ԭ}ch7;?x*IA ud;UOk BT'fR Gx~lDf;ⲫ/f!EE+ŷrbT63sVF@QPV?uoϨcZPƭ`K^Bov'zR\uthq;e `Ux.F<zz'53JX5 ZˆԍDs- Q//h}| w}3|:h@Sa7:'wDK<E#j& wac6P&!{#) wĭ~@yjz\I$=3>]N-AJZǸ0.v[?Cݫ"^@׭ј#no gK a0Ie l]6oCnHo=6=AͬQqhIyM)5[tf)]* #6aɧZE] O\>āAn:g/пpxHJ<QqP xs +1`#3zgo%Pt1?0_<-G7KH/UyJd]IeD@Y*2/:6^p`L&!v}R?V ԉnU>2x/TD鵰Y%+KhBㆶvX|Bl%!rjkC #]@̊9ۛlFoN .%&'8ү [x2U61^9 \ 'fiOyKt[ Cڮav5E!=vaՁqC.„.5)׼j'nlSmiZ2#Sa\#rZyvɏz-GԽ@\2$S1=K`pPBi |qH6}`!-ZZT0"Skš-O=:߭mLSjfGn6"qׅ| =3T V SSqX~+<+v\@vʒr{ZpQ*`1*ּM! gqɰ̈o0SNlї8ZT{ Uggs]z($ `9$彿]N'A.xe9ʒD/^({ `Ik͸AV̍iLJiRhkl*uސ"ͩ@PҾC{Gwn+qVff8/d@Kxƥ!ȘTT?w 6א0í(WbJ$\NkG:l5V8ɚF}%m>x_OiS$i\Fn-OFab%F&Ħ÷'.V#|! }y3,~h?=wnBi GVXwvIoWe̢nd!;=a@u15|l4[еC4Ï׉|'x՜=Ӯz 1N*0O5@G"8R4KRK$bV6oTj3) nѬ;5"kUZ` ~L5X$:?lr&1kQ+ Un 痑Ri[!uk5ls']FtN@x+^M]2hcqo m&އ9+6.hݵY+m^X8$phP 2L\ ^g*7:3}@ e7;ni" ܬh 4FӮS \(<3H||4|8;4Hi1+_REg&fmZc>$tj=^F8[m:bׇaIj Jl$K}%{h}H3l@r5X7y' *63 hSv9B:]a\32@#Rf`LΚ\#S%yQDHTlr}8,}3 +ɣ+Wyxx^m1meI5p\qPEH;<-4dͣzP4H = t]-|l>S_0`'>CJ.S>3L]Z1;f) V#~crA9ݼ:hBx%]cF.k MpkŸ-ٺlt $ Xkt͉< &ڙԗ'~s6,PDco!Ʃd9iݓKIS]FPHihS$Zޱ*t@㙻؇4w2B9&;7uȭVgiԱFUuGepi-, Y> ٦d7VZ81A3Xt+sffu Ћ0]Vi}/箕% ;mɘ:1UiGIyG|BX{#:#՚}[kأSwX T b&}ȔsTn߁&1)M31atJ~[]UN~B1s2uyk7ucB\?潮9DxmXC@%MzY*߻9r-p]TQCVH`-fCgu8 i<2.vڲ2i9gWu%d b|W&-Iai.OjZu\z<@8CQȢ/B?rc9MEI ҫGji)xm{; -/;C.aj(GL9&Wവ ;LOG$q!u|ޔ2fK\s0z|2/e2|(; $l=a))THt ܿ*q-\ۏЕ+'㻡mLh(+_^?跂ąw=p aU7ӊk +q8ޚWWY׆_bt;F2Vnډ,?)qU؇ޏyҊ]Ƒm?HpBM,#)w;ad~E :_#|k%'I׼tX!u o~YΤbSLI(|òFI̕O5{c!`pQi2 8 rYjYsșfN./Ӷ-˴06Ԟۯ+=j`xKGKfӒ߅c oNjF4xF:m9v?_A5[`;+8bRN?3k:C%di$vӂ mY*Loo"vaZYreqaգ.%ZJDi5[)d5/LNPo캉V)ɐHlPАχ٠X.?_"m$|wyf.'kf;@n)UyV5u&^]'yqrQVu8| vFpNcua7?mpѳZHbXoNzULa ^CuYo}q.GF&X{~m)#B;,J\ n?,d}CԄٌyFѝ82N`ʸJ + 'Clw؄Ruey3 )<r ?j;1/)P U.ȺJP0X]^2 k0׶h/YYEMiRoW926.ߒP.ZhUm9lM`Ľy@XBOjnN5^{B0{B2FM(YwqhMd53w#edOo99Ag֧iQPVOTe,Y ^Ei1ue:gA@8O%!ꃭgaE 0JY,Fk]ou.PTߣ'=U$üCb5룁 Ee`E( %0NZ-qRc{⶧!f R{mZ@oI_ɽ' 3伥F͕c˾V@I&\&#yp1;2%{5Y, )ȓxRb፣Adtkr^ÎϋRmԋ[]&~Ѕ+ @{}l9a<ȍe@aTevo+E!#w-XGy)4O}SK,rf=FA3r#XIV~?w0&x<Iy5ި.A2Za\pL6,y{70@bipw̌T0i3Oh&+уlk hlm8OpλG9@$$R9LwW$٩;׺TQ۰FoAOvP=Ɖ,85N u]@ĿZJ{rDyw+đa0N .Q;~NE3yq\N+#~Fi(#0t JTlEq{qi=.iaXGtY*|ubXuiOcsY`_2mc0UzF6_AfLNWΥ#Ik9 :$c>,ЈVAdJAnV"掵G,"MBgs:RY`MˏQ`}%F9eU/;aNzD4k7\>Qy':Ley!ViB,r~`Pߢ[rƢdY,,J0S9.|jpsVukb'PJ.@hg~4mŵeCWx_2LPH_J*V "Z8VJX׏tֆFK鐲؍e{#Mu'>)꧗'3S\xQx)|?OCѻ՜@~ p1ޙ|yPfZ wG-6_hIE;eo ПG#{a.+ $ eiz XN72qPZ:,wƁo׵INIX3 _P+kX00b.SEnQEf 0ϬU3Nhˆ'aE&^k@˽UG4WX1 XN )̎T TpHFBAŀf cv)WI#2APfNZkV#EEޒ:N7O JTP^4|1&%<'.*Մ!U4XR׆@o%@z#mQ'R)ܻ=Hc+rU 'NR%eNSH_uKZ$mitm^~xkKUQo^sRx-/jw t+PLzs|`hQUC%"vJO!2_%/[* =5C>226Oy-=m΁Vq8iU C(@!eF 8%plYL׍?o¹O|~jj;1k!e]\$[AE܀s!g N]`9_u w`Z#%}ϧ04kgNFKyuw^diɍIeotre QY]֋ί2hWe(JmdUyOLm"D4@ɘ}S(Q$X+NG"doSZainrp/pů=V]vX@:7C ns46rD.NGR+]x5e(?>vf".K |3h~5]ON~cs7 aK ~DCw2h+d2nCWI'T7~cg([(RE>֑ϣ 9rc=,ʾo&).ҎO!Mވ1Ѓ7?mp}Oh?}] +瘲ojp!!` R&ZEed&g:MGgl>zY5r]2G;-IﻐGQu3^XJ$blҨoJ-034P`\.g_t=L /Wv`eN {hQ8XʒJv(T׶G~_0RYӿv֘{H؍ (ПbЬvx'HN;F0(I=4D{&0 Aj`Sj3K*Cau6pɩ;br0nH;+wx\ tA͔b<ySoI#+kI]r9=8- I';~3S}.Y_ۨAs;̳ʝ/6k= Ō=!0j,hIK`c>OjQ}GB%E Ny2GwB@f<~,BezFaI}Jf&sw"~tcě )%`+ht!@p ÔL@ UvqA["?|uUY_W7H95u<RF R$K[H. ÿ͗2IR0\}ɏO(m]^<)]EJ{LD<&B"5،(9o7a4^ I89I`yx ,r$Xw31̑UYtVtqڹȁYDc!(]!(򟣊!d/dHeм: "sQLpJ_)V 0R)Ws-~e%`X]þe!̄SjM6hش*ɦ)oڦ?+aGHwL=>jǤۥOI[F֫t-<`+H4L$u*<0ꢢsg+̞@.3dɄ <[dNӶz98ZABb  R0 Ŕ&VhM:3eX@)iXw~atI\/Y}\%;q*z9fX.qrSg G *pq(T˜}s83++&8PiaaLpM1"4f(l x}[Y YcYKnU0ɹq96Oգޔ.6JRQ{wf>.WzXGFSLtw3翗q'2gH>瘼Wa,`.]-*UT9r3*ũ=*]Ibaᵶ?+^YݝգN`xygzB񼻇VEX4vGϚdrKb9(|Gi <,Ϧ 0gSzM jh" _?~gdf_ ,p|i3 NbxgYwU1,؂D4Q]zS?N>mgbE6wq ǀQt  1$4X $ͤtUR 4gq,U5Pvq{:m(;EFU˃ldANP#̸O \}HX%P t)t2:ZWuSq$'OCp@kWpYo%Ԥkk- TtwpRC]19ҪFCs]Ve hjwߗqV*8e`=#X -lot5"eA?_\$% ,-05yG ~_&*Nie]Clm2t?/J#@}FQ3P+}lܪZJ*) ,`]#'8X#>㈖Q OTXA0"-Kgy1v;pC;bUV,+[M^fPqW̐HoZ++u_\τdC ¥毾dgbD5Jbr{-oc$` V?9W;b5}EFn\є!=.eH+sZT#јvPc@_ CWndqNj\$V F&͹²a&nT\Xr<vyy:>E@HI)Յ}2E#؁! VkYmKi g){t!~?zb_7ܞa3u/-Oy_T_KgɚW;Ѝ}yr WCـ-۬l^5|iٓQ7_\W %u^Uk+6g*_bM/oj~e f6'2~Hţu@n,\|_IvMC/}`2Bolu+wgiqE3Vՠj0Fv .5fSK{_<<@ O#ޢ%׊f*B01Ϡc0#b !Lb1|G'Si^B`PFa;R" D :^u, ϟ{vd==@*ܹxylodpw;佉Hᚦ">ԥ2RNF{bcM]L4Zi%+y"_s"`_e"(Ўy>KQorA ^$8/hPg aL UM"ȞGV5 iBKN\6>#ѼJ4ZYςѕITeĮ5Eάtfc. =ȃ~&\-~9psy5m(py+nvtTrjWQA.xÍ؞|rP?|1q,(WQðܣǿ|>i^y6Ѿ %"!e\~z]O^H˝<? 6|2:>: E\Aټ6ZMV [~fܒ5UjSJĦ.%<6$;^ϣZeֆ}.XS4qRC/%p{*Rd>O%`5=,] :i|807X5sSac^{q*>ʿGPa C2*0(VxЃrg+[FݭZ]]Ai+pN5nUʷvI|s>[䋒1u,~l`.K_k_)(&IT+( L%+12o𠎀W A YD2$H#ctaܮq|&L8YW%ISTOPe^[hd8zcB'~Vj]h(gWrk=A>kV#YxL{Y`q럸Xݝy cǘ4d;=96΍;}qZP+-x$ Ikރh@ {p/Njgxt])H2v-@lh]T,A+|MUÊɾ?EqdkdD.O"hPzm VWb'ŻyM{؀{ʼnFb6ژxIA6 f_6:>qIT.Yc s 9&xU>b%MKq$@|([M49ĜXiry.N ~VTT׌mp&Hon:TmF|ys$'ZB"nQ@#ti5 5rAo޺PΙӧx ށ05v*JGp s57N>ufIy'a%DΰsKgxyy*;(;4&"BޕEugNgAF Ʃ"y/s &k&FyƟY\ckfuԐ4V;q{\gUж>c'Qa|82V1nEO 13T/XChF~;M\Hb,8`Փ֡VbOjԌ뛈ȍ!f3Y7:}Ѫ5]Z!!_GLڌiy sj]Nt{ 0Aጏj XiKQ`[䁼 :x@e(8bJ%lUᲷpI 8* %|I ^<~щɺ֝ϰ<?X:1>lx`1j2.SQ-0,Cq2q ED|C~hRcf3;wJl/lVC=lþ$U 1dL|OB\6ПٱԾ`5籥|-oqp7W{.ε3@}j(788) +Ly L4QIcRpٽ\< |Q^hC}T N,SOŷg_%bUoǂkR$&Qָ*;x$QR~~hKGЇdu,}8@:qP6t"уf/Vv YPnvJ=b!1vګsaF;_!k(-cyOS2 G>YG Ů1w>`կ}]ct&.SO3@iH̡>@[ *-({*B"P`{[|HTMgo:V.#:p8FWoU7ۭT>u7ÏA'%y:)hYVϥFw9 di،iÓŀP H~ Vt'!n]}RCt_vC=+m.ײnP`].͛1Jb| *sy\ڄ0VE /OpwsJ9n?o !P}5~H]%tJ.r25k앫JO+7>5M~'wV ʁ6Otr}!%,w˺Ð\uf3rQK[駎VT n|_ʐ\}TgQUzaOBz-zΨ/v t (okq#}F|2o`6]5wK1)?gY OI{vyv=1gӋ+c 1ױ4xB"M7[D{\iYx3{m`3 c~=|{MRbLZ[nؤkHKM{K(ʒ7^Q<( v![Yw*SqϰEjwP8mR!QTL(pGZQ=Q6+Kj7 |9׹ $xUfq'&KLiZD:]媨d(6Gz~ESC^s)2Qguؙfw*C<FńTD,))R@|9A[~wuJ%Do0FӢr}ߔ׶s Ao;;qC *G%P?`` PXpr#oβZo>9Iǎ2*{C1hy_8|$%<'#y@UiRab5Q.qX3Qt'}1uz8ILK@b{MW!&\4dzczMh[8f-vazYZ{,-E I~%g0S[u _axGh?_RUl Z_lZ42(W- ~EL8dK/iǑRx}[!Oۤ;5Iud/{5Ѧ3_5b^-03ʋLcD&d&vLjf H,lCEJ[%2c 9Fn9+S AsKIXS%^os.^!`dt'xV;ARǔ60a2L} N{҅LQ "F [+רڒz r"{V#׫aḫu(qqe| -@,}7Pr֨Nl. IΩIR^IPqNg$~^G u_N_By+ӫ=ٸ=*E=(\9Zd/ä5xf.lbI#l_2E[ud)jjaJ.t{f:U뼍nٽK ڥi'7}*V$vc2v`VYF5>/Ƴ;cdܭ,Wu+aTtCC-7nmpԱ MlȉW @\unA4߻ovrwgE\{&O.G xaןM}G)2bA4TfyąXvQvէRΝv2/+1[oڟxĤ"}$o2.0-IpJ- axЙSCfLXZφA#NC##*;&Y/ʻH.Fu։D; vWׂ0gODȸxqT[1if< CԻ1=:ݜ 3ю-Ӟ}ѱP I0T_5n.LSVr[ <A39,2"VDbg0\ D'( %2)p<_"d_a5[X>~1[Ŕ946oR?w+"Ϳ)u4|*ºd8pV5Ӏ[MA 7Qꪆu/**94:4lXXbZil*^ޠ -<}:E>|L#bHL6!VV>pemV]MӴtYLO kv6a쾆:XGSTVo~@;d( {6ʗ4PۏPB k'tkF 52'9Y=לUB~d$r(wl hOIO7C0ֱ dq/d$*,KAE>(lwM6 /`jW 0e'p>x"eI!3G4x=ɪ~T{hzAC[͆k) 'N>Pch1, c~D,Yޔ])$RpBٷq$zCLףt*v[^}T/{) 422Ƿ\4[?.SukH}H¬vSM_^fW%<_lȊ=E bJ' ~NZ-M V?kSd@̭!DtQ~80LKj"YM2hXµIg-VW)C#kcΠh>-U. ە媻Ol=IR5q}>wxXÑ6alv(k{] ǠdL{ M:VzPlxCr"P-BwIAVkp_I9}..]s8? -bդK -WtӨ4.k{sкTmpfhSm<"=dN>qsN#9ҿwMiOV+u1.j +XYq}3VrzR7WU iwgohiNN "]Z~UeZ &mW "}7[9'Ndj. :^P|Q)U(Lwf)y@c^ἌFy"(sB+/*hYփFd<=g\0g$AN*0,ͷE#\ gGYn4zZ]lx_4_yφ@uVe<_ͺ[(eמM%x ^TD> h+^_NS SdyFYaBBgׁ'} 01ԁ/B wEaΏ1.EX&Xh*,'';I7VFyK` >=, P{m|Sj!wj-{-_N&mwmG u(@f],G, )=nao_d/e{2}62\7!"eB Ǎػ,=t҅6rKD 9R? <"Quܬڲ`00OhSLEGT+ND(zMnh% ^ܚ됋}TdfOݗG}Mz(eԷ5:!?9SD p#g!ת炪" ٓZo4CZyKmҀ4*YMIt+A z?VՖ6 a)jO'Ty)T5A na"bӌ8ٔj\][wNAi X"'~Hi-ٻЧ6npYz&alUմf3}4GlN󬆱k`?$Y 43>7z;^_z-&XzeQsp/e2AH^fU/)UΡ9g+U*O^x{5~G 56K9HWL9'=T<ϐu9E/o*Ufpjʣq5('|8"^-:G o(6Rf6;SrEф_Ws _!=i(otR=(3g6.Řh0l+taQ2#I+|<ǧDP$EazKt;7zmEr8eY5= OECU:-J]-X&Q$J_'_8?oNn>-?8W|?>voۯ2>7R 0ctD D`0LD@0D` ̐0`X`r F fɀA2#Ȟ0d 3  fDaA D3a#0`& @FD`F D Fd"&a@%``  C`&0"*@L 0@0@(0Ff@#6 2``` Daȁ#0aC$ ` "`0` )st#"iM_N{1w0†GncO3g^"=gF+)cm3W@^ sBY`7$nGpMnAiyTaهKcک 71(J$%)K*ˤlU}%jѳ{XM>yrǬ- A["?c P~|g|V 3[Jq05&G 1oYu_~yu!Y)Gת|Ғ%-d6J=5CZ)P[$סY>eGW[1YDh35KZ B= {ƭФQNrےrL - nJf򻅌Ih ^EҌjI`vLzE`::58 4/%УaД({l$%ty B='}0>WXp 81Flvu[=ej]mdcBfjiV 3$oky6Lt{Jxޗc"hR%Lm̈f^L#m\}@5(o ~".6#| >;ehm6R/Bmk`'<5Q "liCUF,UL`H;˸8vso>wt4fOPy~\CFi^p5-d ܬ&S[B>Zә SH[VZO$hǛ='2qӐvM%V lR6PM>@w%PY>t s3̢ W~ FΜCk]xHu`ޱz٣su#(D=.JۄO^ 8r UjA|uzMt"z0ue 3OItsDY\N 2{ݲ|ɳѽĐs],K2E3|W }Pݏ3}-M2qt(>W"us+L~J .fU*$>mmY#hw H:DҺi6))4CJ`|i!Xg-e`&⩍Iߊz¸Sl^o/*Q` ho:o#,#HN@?dQ9BW0̓ GN!'T'e%;!WQ.cZ0d%sss6*cR3{7' oV%\X޹۸XIcGy\.8]DžNO{p1 CdK/t ԾfwJK$L&u-j-PbXB'T v7]vxo)Hr}tB 8?G:Yħy'@Nǥ##_ÙJ;t jh,jܮGr` +`TZ`wB[B">yŷ& |^J>޵`hI 5R O9k"z"ooZ)'T/.dnn4-Ŋlao+-%Pi&[ :|iu.gc4$DH^96)b&e_sEBR@ݻ9~fFݺK]՛a5lc ??mgA֘pf>_|D.N^Ԝ kG]Iw21@ƣ!z Iv-QZ{4[>9N΋fhSycʏSOΛQ5u wڃ {|}Cpbk6CoUX$DSCqQ3B r\ھӦ/ 'ޒCd95(e6iگ7}uF>ijϩ x`Ϲ`'Zl>NOFMD1a\L[m]B-\Q@HLInלH Be%-ʛ$pYkAi'ZX>1mkoj(^yAn$(  GٷuR֓E6VVUGd2pd8jSܝq֪-ݛ|d ))!m1O{Vq҅.QU#rF[kQ_~马:eNxgȻ6s4庴X*(p0;«!y3 YdLy {R6 c'D1uKzz6?27 q\ITԤXhȏ }8gΥxG?;MD)}ȍ,D.}2tL|zK%ҍIñ\D_."0 m8*xXSJ@6=|J'yduE0n~#k;&k[Oi dO0RZ_I+ɳkbfR_Gu0_";S*S}o:gږTI~i\TM>/2G .}+V fߎ?{۟zrH&M!{s #?(7pEU%hs)+vj qZ'\*#c2$Y@6eb]XFT Z^>y>LOxl+ e#їC8hyK ™{0W5Qd[Y#ַA7Q :s, 8Se7g!`7jƙs>h;oCȃFI%喛ҊTh/cwb |uGL%!lGqV>E ncL67h ۟cn$ x>yYk@:Pr X-J{KX:RvaIL+uM2Jp{ΎęnDž]pkPQ LN%49`ѹV'#*b]8J[M>Ǖ;Gl Bk0JR^]ns*q |6cՆ# ;O,;Sx #4ɥ~K:fodϲP>љbv)Q:i l5P7<7hBC.E`rm I5.4O^Q:`nHM߶ծ~(:"[JGo'/Qr9͉KkRQ]Dz*l8?1դѿk[VoYcq V!-Wm-W;%2~v>d%n׷ Y+w05t=^5`siޗ@DbN~ĉ<7* Єkɜq[vh &!wDiMʷ$#Y߶KÌaR M<Ò%=Il*w%ђvZUcn~p_9WLnKGbA jg5v?1 ]^cJ!1fbo^aBCkvfO$Ci]4Җ>wapNu(iJCe E'nkY#4{kuiT[z s)G⴩ڢy\zƺ̘w(&[3hii&(s S-n|M)5qK5'v$y0EZӬ@RU6' ?jP {DgG 6f # 21 Ca`;\hRK*/6/d~Z6c4NOeLK q!T9 7iHU BRqê;$}AӼOn`)0Lpq bG E*ҎqYyO&^Q@iwd:?`(VFrv^p+i쒻rT*8-)Iw Obo10}Z0I $:(tmkX$4G[Q;ta\=ӫa<,jH:x^*}fL=و0ˠX4փȍax*W_-p&5Q= q)&`_H:h *¿ }E? W*Ss4;jB X 6M JyC^~X 7@ gk}0Bu33J&P[0[A gR[å2Gf z1GzobKfoGL_9M2[>(mȂh~ X fBxPoq<5LaN~*P`H'%#i3a6lk;hIM͔TE`Y Es_NRI')חB9R-2rYsXL8~)z}-7?:{m6áhgFVw) :,9K4$nxaMHSaRY84 l7)7-{.\{F,> _c[*W&yS+nciE`^!1*.S瘈 -AأŅMKXx0.O6q c~?Y;Ng [,7@/**ꟴ<iqJfU(ݫ)Kmj#3"_Qf_+QNCr}L!MjUnpH LሦK3 Tf4{gJU0 pr67JKhOg45PYBXjy=*71U Wwnl׉9GOrv >0_$ĺ׵1^MPԹM`:+[m8դ)<>DN2n ]~ƥ} =BfOU7y:uwiN 0-y P)M óAinG!xmڑ,U د;ҕ9Џ ntlyBvG#ztQ7)6j* z:/hA*i9B.E~` DwzB-TbD3ZWggV?%Q$؏OE!6gn3=@' IEm̀罠QEMSWW"@eP{`Funl1tWM=랦Di u5I:aà>Xm\R֑s -5;sD9>_'VɏF5b8fe̗o]t^Umf2ڦ5Z\ӣ7~o7]/Җr P%}b^IB п;d<‡'dחHQEE7UٟA/y}6=1XQNꕄU v!?h9'cjj4`jn%aP=K˶cQAh=9LyYrLd6S($MG)׆S{DžeK8'5:2LjeņLCe-w\T,2 pjw(G-(!*Z]:3U~j9E(E.} pxl? dUȦqɏȠ3]λ TosùiV}%3CȋHL_~<h,Wa"0Ngְ'ά2gHDՇbѫ⡢ΘM4+8SmI\ӧ-Jw%ֽ iϐ5~Xuu_̀zw9bg?ГV{[jG*7jA}oezFPjhi%D~[Q{ఄ<Y(KRp=@ւlA%(2 ][Mֻw;D&d+ b92$H ;6 ]3x.48`Z3 /8ED_vP mGN!lK:":z9}Sp{.\oh#C6&õbVu#%q^I$-6֯Fg&%qG/^:vZS4#xt]2dDkEeyneL7V:X/+6, Ү59!d#g >&G'_Yv0,s犋\XMED^jN:+_V=\p yTẃnNPe8`w1:?sqn]in(P"a6,U3S!˳p[D)@ Y&45VeJƂ;^t3n/}` # ԊM ΁]>#eBq rR'J ֕*8($KWw+ky20 ^gR1V_+xA=X5) 6Ǚ-S,ASU^!&ijq1]b`*9oHZ 3u bQۿbDqrkuaoȿ*0%?D-!ZLy⒓gQ܉ U̶|EmWe7FdgPhcH0ev3}o~i}IvӢs] A.E 5F7|؋l-Q}r!~eȏ Br6!aZg;F|e)l֓uq<|XĕG+_N熤O;_X2P>os+˃xS^n|rJmtFJZc!v'e-q57.;]BX rfnӦ嚇͂UXA A( !>n@T<"5݃M[fM ި#G ȿ}>SYr-+Ѱ~^M5LLuF O8=55ĵ$ /-L> EI%[>V+[(L~okc*UO[{'x3kkܬvSW>N|3FʻBY ,f0Y1u:/ʧl Byb~ԋ N*Hh Wr5ujm ZLFXbٙV{!)-]Ѯ ܃>ڟD_1>IʵejQc|'}yj6p9㉙6Ab.&fLqS?&-׉͐xj9?5Bu݉[k$ux4#d !8g}G'epZn^9<Ī0uL@j%wowGM2%e,9j7 T5mנ4'ޞ'9%2.Y`=VFH5oImzt.]v`/5BR2(?."9 T%9b&1ak#e;R}_ZYw-qP)ˤZBJQLxtLiqB ܽA< +n9~ l X@,Ÿ5:,jYGGw?y\yfW׀Yc䲵\IBZWb%ug؋[͖8`/-:uHǥF+?(tn<Ge5z͍֧v $zI>tXˢ__6YNc3H5MGv|dD֕1h򯴱Au àA:ÅNXΑ;P4"^ʁ(!,{2 4Ύ.c eL lm~{j*ZUHBʊ B=WUMzzB򀖩{+qxtbiri xQbSǛ-f4ӈn]X5Q"hњx[9S#E*__AuJ0HojtOJA7dݺuG>PTɥu7zty+&(mO ٖ⌇!=eLrI`G,Fʡ[J+P!8=_n#i(Nׇ|%?k)ƗRs|br|Q2ucSZm?9~[1vO |mXh:$E@ |d ':bOY0CZUu[W/v;3̡+!$w ̎BfLFDVƅVAXlrPu mnmB !M[o) &gvewAۢ,ź'QNkSלD5g `"sa.=7"{7GK[*yi+BD/Q?_:MЉB&㯻$ВxQTy$˶7tL/MoYK 8V:dUO3"$٠n 0иp:':N&zTQA?ܲ?P[ijaaQ8P)Җ16Ⱥy;~ & qDL!ˇ&{2)w'a'eVM7GRAQAET2 ^דg(#meгûPV;'c9h Dnƒ0l^&F~5%rh!9:%hڶRClT$#nٕ7Tgr$Bz88 4ק3jAHP`_ݔ Q2 x\ۖ`!TN8s<?V/Fd|E[HD|fYO1Zk&HThe*ZG6n(ո,"35?ao}lFL8^Jp9Vư~4}'=a?"6g^k;}F^# 28g¿}2Hq6ǟ.?o355ő=kLxѱ@8T`jF8cc5;iHTS RBQ/:FVǓ9[yEI ֏]ӳ"_j0,EHˡãG4Zmr;CʮZtSHNĿӤyB<gzCztb@ n0Ϥ_.@2;0ĴB790͕B^Ld;{-2alG~jA7X5e!,j0\z2C`!go z{dReH%FSy $֩+,.2@U8tI*4YSTS)rXPHI[)tV x=k8>͈93ݚEͥx5q9mx|pHHÌT806osqe8'AV1ժC1/1hy4gs|}\ 0$޺ )&N TL#$fO~6NTxYtfKcJ%[֣6D[Ʊf:U;Jʴ_,/$)<ǼȔ=ߧYm0m)c o˖?\W &ίq-Enh=;BCP82|?ð6 woz|ގ?|PR +ZZ"GT EV;=VKm3cDM#| qɆX(7]7,ݿMG0?0W., j 3\G}E9/[+2fa;D"N8OuDe΢ʅyq>z6츱!]Y{ k4)#VN{]0q4`4S=f]_Ё:GF WlbN+`:#~GmbٚNj,SP%aALBR0[2I+ wp(7Nw ?swsɄ@j3.+TDCҨPXj21 4x5տ[Y<_Aǝ\>Zߋ2@s$jRb/VOl)uu@nkl髯^ ,gquڑhm^y B8VqY'oSHy+Q"kJ}"7HaިyEGuxBۏ%iDY|fZ {ƌxxv`SB 2 s\U-ĊM6{;57U=u-3GJk[ [u1S`A\Sr g<6`%Xk*A"Sk[ d-cX̋'>se$%"kB."<^aE7B=ZlcoO 𳏼 @k?4<yb>!nӄ-5Hم7Aۊ1u"'ϴFh͟N)Vj#GgR!;:ÎF C'd-24_թmdeo3d~ 濤}nNfv<\I4o@`7c0iZZxiI3AK+31ݜS.xH} ,_Nk|UtLŻk(;o )Vg3n,ehO^ v')Qk;NU^!G3蕊%_;*P^X2,OPYQw3 h NDA^ĮJJ;N׃;[5ijzoQ쿦XspzA5uݻ ")mEq2ްy߮8OvןD߈g&m"G!BAl}@ ^ 86vqõy!I-G7~n;oAa6N_hKkR4\M;02߰ fBiFՓ߳AvmnP}'J(/G }Ő'_nk=)̊P|56F{ed]lo%9tIߊEyR{[|~0:K.<3HB rh^-X,ӻ FN ^ ~E3`hr(&VnWmL䊷;iCn#gdb ymz|h-y2vuT6 v` :OgEMh2 !i֓܍X4Bq4;O2I8OIp2{8˛&y"/#bwaݘ].@si@tdKu˟}b/Ǣ~8Jsy;6ڪ8%"kDBi yꗀ@$dXC3967UH$b#%vo[ְٱLw?8Df^x[fʠ]Z VPfL~T-iZ:N`驨v5'>j'KxCw҃y7hZ֮"96U ]QJ5][muX{"V EtO`{x*q,sMz#WQlT$ {GWɑxUFۨԨAjڹ8 frSWd>N<F'-[.-=sQb mAef۠d%H#ǟ:{  K9E-f8gU%rѱ1V"\8[/  BÌrQ; Z%4f9@dSr!-|{jt`qHtUsKBաu A]gkQen|ɢ3"!!sPK.%aM2Y &M[@G 5kn+iVhz &@Hc?I'1) X+pZh.͠H xl)$ORfU[6Ҍ\jd ׬CEO]1 f%!㽋 gQirc.!K̃xۄmG{UO/*Q'5Gš?K?eguJ{.f4ycߟ:=plT}uWx"FWž}8gH_!aA k0]XI:en4e]Ŕ8-G+,AsՌȊF p$90._V;Ic%n鐆p7 e/߭:' ϗS?نO1Uȫd9rLFPo\/ " 7k*klɑX31vD(yqcJJ&fWdWN*.K41T eG4efozV&[r R[NV0G0cD7wz6%u UK'HU" \o/(Mm9[.¾Lޙu8zҿ~lg_$t)=<@D:8+nrmq .>%JD1 ȺGt]=rR vw67qRqE>ZӣDy=ꫧ$x.mzytC`ݫ~5Mkx .d9=ѿ(cډw9}+`Pi rqVm+0NZ= B9S#e4+Y H(wQMvSBMF< ׻%ѷ=ܦ 9A2mц,K{rH0=Ѐv\S>P @XID YrbnjwtS%ոqWcpdDΗWU!FO/>c`F,}޲2`.L4KĢWZ"xh7?Zodkˮ,Do'>zɋ z UN&K ݾBxux}P20R)rυ?8>XVcxMɥ`P=7 V7F#j${\zꠇw΢ Xk[8`0$kv N C*4&CO ea;tQfE a(H 0q9/JBp9۶Q`LJGTt̗A[*&dp9ipѲ}]4 <\5VZ?XeIc]ƹ>eY~6yS~ 68Nv/=Fclktd--(ziY]͜! l )(|ɐ1l14.3+Y0o׷-.m1ϺUCԈk1%YY"ž"J9.S,4/3}f\x߀GP/*-1#BʅX$YSzPgS8dKf鞎 j"Cp~*?SSͿd΂~LUhLkOliZ_GcEyc-:WAPdUjeESt+5A[vvP/8!!Ik? =fO ~zvW-f$⫫ᮟv::v k+U1G]tm_󴟔l_.cƪE½cu [!II<ӽ^;lZdSgL:}9j5^hǺ a-Y%T/dz:]k C{ 4F7$|}сPxb] ȳEVLF34܉jGsc:{-" ~)j1:aKz!à`Ϸmu}5sO4Q<Vv3pp38kZ3 )lCdR KJa;x6G7VЙ}u˰-J H9?ui1"D&ϰ2t~K֋ ]Q g%SM1/?äe=p{*! j-n" $_нj3nrxBnM)} &p6'^=b7:e2?ĸB ׼y1l 2WeȣkȉiݓhJxKR;;go`7۶]#fEny l0$74` owPs{:I8A:xM"Y~ G&5f=֦>cA,r oX4!pX5OmkB0ǘl(<2J%L6Bb≮Vƭ,_)^(>լ=Z8IWo@L=Ho_oLD4uX^sJDcBu-_KgIsѦSkKv.]1R8mY/NmY1X0Բ-_CB hC?Cr.Llof"`UmSE.tPH1}Z{q`4mlΈkʶϋ# pHhAdBkfbB3kLyfe[H.vX[M,)A2VTj|xmү*ugEEvPQpRn 0PSNj&WYӯ:G,(lz2,(4Uc@iC%9XasrEސKI8 xqt)8m ݭ\zp8bg>JPz姞A$M~Vf|7bҤX^f9>p+Ph^ޞ^vF&.wR\5ZԪ,Ä&3mɁHã~v ǩI :tUɆʌk`.R?iJIoa%VZe6{߭8Տ9^8B}ˈX)c%"2;KhEH;I, T@Ԭjpfe_)fpZI),>o.Ƹh,Cn{vrg%. vp*J!p&r~>f/|PZ|MϹ2_|oȋݼ"AKh H-x퉫Qx0 ʿGK 0'Oފ>b  F!d9϶}(#E`#%`K+ (lQ2]K![@M$ܚ9OyORa ?_1jmR)!NbQwmqCӱy T*r l 0M_( XB@E8M4W#YikA$.1lg~vzd#ޔRH}XƳ-7nsȆ/=?=8fw Ӓd:7}7t Im& H?sF/ExZۯ],fe0cYv !nFV*Y{paeu[| U/ucJIv.fF (~n~n( xǀ `OpbMoxeMxwLN37xmMCI7e6qcxY$L!ZpIzVtp$ ShT1Yֹl=,&pEI+ZWwI0h28>s|'`4 ֜A1XU?{ VxrvOϕ[X6swER⏹BHe쵑k&۠Y[|h$!o(pSAY3o-̩慈۲唝eTB@fHwwmSVǂyj/}xHw@r]NSaIuwͻtC_LB>U6_[{aNL"^7ɝnKDg9]a)N3e**mŶ?B|p >(`':{PV^e4v~F`KNFEr3a,(MǸؗ B > |Պ}|KI O#58sJ/2UQyF] ATw d.GƘ{e6@t1iЗ5g7VSLUObޛ6I6T-|䋿D.ܼbUΉ* zHר׻'1ܬPrkD 6Ѧ~o1ҷ>eD m%.'NޮBVqo>"2e6tyLQs6'A6/kn(Xȗ|jKze 2U$=0d)m6"Я6cbL0=҆ZS\[Xܱ`WJ3[e$D[U>{%N";-sWᥓrzҲ 2Qܒm\IzVfYOQLɬ4Iݖ%jeDŽ礯?(fpΗ>@|,-|9rq h +7I}`%kCܫo5ߡ-@䯁!IҔh,ܣ)LBW;.ˁ CeLKӆi5'Gf(qommrTm_M;kA@waڛ]6*N]uoķhkPfƚQcb=R [Yh^m lnbl{o"g `r+m /3Nd7qqqsx'Ø$c}chwԧPޫ'i |xӱ-pE,*^S"z^պ5')'ǘN!Sxќm ?PnՋv s뒸u8u#RjNU31fc$gF N{* 豒+Xw@gm iͦA:T7͖˗Cve+ $ fh(cBMPn}ș`hj;$B/0MFޒ HM<"aR?őeu$vԺ=&^5 M8m0ߪq%_,, 4ukP)3k l(-nY| PMŦFm,ޭۋheofF:K"[ t>YI`Tkf߷4#EPsks4Eja@j/ա@:RG H3 ; i0Kx!]Ud\W·mp J C˒#/'|ӥ:7 0k#S] 0E ! w# Zgf2Tgհp/z V\5 l2V` 4q2 5ANc`B'(96jQB /L\K^a1*B mU w>l֊hq׋x=ozI0)n}k7Fh^0B8#__~&My{1Q>Wܮ2eJ,ɀdl.?F+oƉ2q$*O~)!S"N[la]w6HgxQqf'`u+]I?9*;Qғ-WH-yFy>3ZS /[>A_-Qh{+WeŁ,RLŚd[hoL.0%r$4k +h|ߎZOjf|WRJ~ AlŤPJβ ڰZJ*ȼq&ѿZ82:HQHT;7Vpâ%ҁ.\6B&N.{Sub%AXQ롋(Uf/[MM;v;9 QY*TMh'zhfTmj5zKT<΂˘fIw~ea 4TA0K:-6I^ΚUaYXE)bȬ8aTQe!`39BԼC'RZKAۆF7 dgdl4C߷j?>ïP/|3fz?Vkb[4C݁D)/,ЧB)h5*NEf3nګt1fمx"B za,OkpM[sQ_wDה7r.>|?Јoy4qZq'"OGr+C)IdH+b5dR趺t}\-,ٶŹZ)/hhwl9#5{6;30?8^!Ha6uLN_\Ok̔#(Fi3aAX29uZtz&3 L̘R/0PBT ӵE3/ (s8q}kʍQCr($? DUn}qmbw7ei>gAbzמ;PB7Jf5wi1´QY|SH=:Yqw| Uk|VKF4|%;f|f92|YcsON؈ hBa YzO?Hs$[tx_MluHk%XIY9tI/6(}^'@ Y{e lgiκ*hP֠c6ÆT3"Q.ݾhQ]\\cX!rtR˃_OK9".'9vE>]çU[)kO_gׅatXe*~;Pǔݼ<{qF")s7#*-ϐZuNeToڵ0dvq:N L Я9N=ROQCB=RNvܵ/1Q0΋:,1- {c(ޝ' VC:D6'%F =XT5:Zb?"[P 㞍1_<^Vβռ-/|r@Vy5]D\$zl3btzd( l+yMǃ6Bax;apr1 x?7WKD4H'Ј1))߁&Ҹz_Xc@`')Ԉ+q;]5:9r aA[L{Ky@GA1b2-pnJ)oPK2VXnEM5EQWXH[21pcY=w(l8gVMt$hn/<!W'N&kDtwW9@zՍ!b@xwv6b@{xw-$ؓ7n-Rxnq~*s\V Xo+ܤ3Y6'(|tZI@gj64x0C s|2pGܪu7'dyT쩍LҧF=k d|gϛB2 OmviWöb.i\jLx_eQ q=cҵdf$)(''ߪe qZ+C:`rwGXJ_׉=QԈX‚٫HZJbc00D;N1' U$1ۅudwsEk*H#z+Ft'#@b^ؗ`,+m+/հEPAQICBH[ÊSyJ(FW,ZB Ӈ ^xN u xǃ{ٕy ㍒Uw"/b۹PA Xb̈́:/3ۘ%e"NFrlSrD53lpT6(6;Ҧӏ&F^qe Ot_2%,E! _8֎8רZ(ŧu/"Vu A N0b2ӄ1W60˧PMUAĢ1&џ Uj+Rn ZcsxcM|ĥ`0Y^[ӱTvʬc=6'! D3la0$9*ZWK*a -)YOq8wFXvn5F)%;dKb*Q3p $SjK߼|R$lWM'£ui8^R$uɸQ.{ڑf VX,=CoK]A^V&΅ebg5Ev3i6dBS"y&BxQx2`E\@PR@L9դgNGɇӏ ~s/YOud~<{(TE:{`WFSWMq:-^O 0 d27IvUƨAiΣ3t|&He&Az%T|5֜ɣHq[_@FSE4Hܒ˜?вr^\$Q;?3ޣ(EOWc<-nɋGl~cصc!3#KAI]'5D35aG|\W{<->3}4 u0\%hI~ V`wq 3fx+ܙz[І-Pq$~4ݥgX'Đ#Qj@2x3La?D˾B(Qa ~p> 0z@^5Yg8P;>Ic]IktG%,nz0JA0 qIevʲtt &u$ .-dDNg.k 7&XWEE1чg=Yiu *cH`+{HKWe9K ҷ/\FH zpL +ƀN&K1Z>P4uNy|_ Ha'z~w zNk. jo&}Iò"GNażAʣ Lvb: m|ϓL_6xx7Llh2@*:U孭Cgb⽑33DUNu%$E#D8 %ű̓5{&~&MSZ[_WM }K[mK?w]5_,J.|tۛ&&XdceHE9dYIc`#[z#URLc߯߃D0qPs!F6V:*V_{`W\5!w8;\W8MGMlf"s 15G45&h!l8O=}"YcѸG0>vs}WCp2XEMN=\DL4]J9xbᘲb(ƗѧuedRԚ É~CuQmq|bG=ԯқWR EV=%/SS z) @3:{)_]&&'$7D5jNOS_,:XAiz0/}%.:B ML;bo:}7A=E ,z(RC` 7oN@X7׏ pD+uR">5$諹B Ce7>Ly26\W?~#-ᖉMPDaDbhЩd-ׯlD[#;e|cK+[?,hgޔk=6d3K-8X1Y೔JKuOuYC-kB8Pj,g7~o5-k#JNs SGۮIRM$5HKgm8V-o uÐN=~R+fۊfT@%;U>wהxPەu`fV@]bvzR5O|뎸oHЛlD7~&2Ϋ9 mD{"DŽxyϗLolvC AQ1IF!fr <DL!ԉIoK9sw`{'(0jzBduZ ?kU=A,=Sq1*-)- HV=&))x'2ؕ5m|Dh]#u9ct}qNbi: vLx\- $ed%IaR/_iB,%,#4Qa=n(b:t{z-g X?EK}2G@\^1ࠉkSMBH/b%[D웧뎝kyHZ9*k0à,yX*kz`JH këOLV/*s9ݟO[ @v^O[wY|.7C)JrY2o1-X+ssO3D += )(S,=yOɿXTh̫ L>bGĥ\j:z/GfЪ1`%6z\l>S: ֪vM6mx˪A/2h`&G+rg,O2wq! #xg^ִ@2nPdm%~gO B$zoɄBmjDktO bz^c/G%g*wYtDۓ@۝܅L9`.[ 1ڑU 9=iŝJL$>" J I(Y A'(/bjmokHP u\[ >_&e=ҕcQl!n=0! O+JPFN2|-fHET dQI:sє+)ܼ˩oD@ű)6ioIY_NmK'E\~xc!q<ѪG8{kϨܕL<%H#{Snx(h/  Xʗ]Ibh}`Ҫ9KyXYm섓v)D cЃ]@ iS=F5w.2Dk`젬)b )& -rS7@-F΋)u|ņ41 =p.AD-WY^'v,XluT<^du}j e2܄0IՐnqW\ܚvX8 _rMn \a#q0?۔t尣btbYPy(֭d%/UW q(6 "S5Q32W:o&)W&r^b6fىRM/)HX"28$& h+.,%lFg bS\@ǨmZH/jū8T*ͬ>+jP.ؾ({{(8@Kԩ$?+)EmV0r˽-)"͡8FJs7 *J5ɥ>KdyBTA#P6 j87v'KTqXKP!t?"wbP3r HvP[A;ok.hT!h֚$[yGS~;!CBg7Q^|kja G[:H03#jyAy>-!1>AB0Bag!S1rt:XTEjiYʽϲ} [ 5*c:qV."Ra0O6hg2 .Xؓ~;pk짿Uën&W|S: 3[u6څᾷ`^`ZUj0nt х8ۛnkƳ?ӓ`tי7+'`ZP0.h7?=4~EۢbSD0FM5BMyR،ڼbv erpFJ\ ss8g"yYv)Vy{)={rixوd*({Z+s@zm_ƅH**Aag<o\i1W!v:A͉bv#u9r!ل hS2v_::-Qt-$qPErė&ŝQwj"{_ML'0(R]*¿3$l8' _g񘂩ҭM|xiߊ)+%$7V6fs#|h4^yzÜNu/R n:Өnj\U%+I5v嚒ˇzUm: %N &͎ĖF#_/>)<,dM%\}I/EC}@ňܿ._RI KfY"3Y*BfB0T0O~S#ZЩDJWe,h*F.dX^amI>B{}|Y[}Xn^ff̩mE.y6H#r5.P[T_{Jweq'avy$=fS/FL*,Orze8uY }FZܞl0!v%3yf /Ǿ@xzyI4~Gr.sp≢C2S۞K`a%:+ŕ!yF]q5rG[E1-ۮD04-W2 pDDR2͆e*EH{TC 1d!tڅ֌kDs@K)ZOGMe$mZg{.yA?JV䂖q5/z]|y1b֏WnWZ,9g6Lj]xs˓eX8[Y=S=MIm\D@#j_V3i$Ъg{&WH/uCNP9>Ҁ S̖"aW WN!f^?RA@汖, ĺ;({Vƪ®jut_Z(u_ċ\4 qbiC-Dy.1Sfyoh#m A^ a$)5j/\@B*h>'wCzwqT[+w9!&VY_iL" N’k}2Cd.V yry60L5 -19V #wl/kM|]2[JE:}{ۛ5MŽhA({ P:S^^Z Q%z3{rIucѵFXks ^FH/[0yp3onquU'yуtBOlF̅L*.)q)%Fe2`̷Q[M>`qd 7K2xXV9ocKG+-`$8]kěy@YzOatkBS3a9$fi::1kA69*:ec1i* J| XmZk[>c+3J+&zaغG'm_J!{]Ύ`WT SZ" /tnR"m*',@zZaB+nqBomYȧұu hs]|`a =/o+xI4MoY&#]*m*2M˥cbAtZeeTc3N5loqG*_||x :$ҠEp'_˷ơ! ,e!͆zaZi ~Ȭͻ`s6# \-G}֗}]Vi3::5Pn~?]CCӊ,X Uw^:V&CW%a,lO:=q,e`Y Dc74 1KVGFW#p:Tp޴=m n:&V 03H̤NRηu#aǀ7+Cb7ԙW n0$ZhlҨ3miNғ']RVf>WWH@.3~5?OP!glq$MLse6!SUǓ 'QO f&x1"'Pe wVz[IF2T)E\P[yI=Ldätz8ćOM\ږH]cq'I#q/f>gnrTۄ!8j1K_<5k' \2Pjt8V| ~!j DUZr ⏴WѝV0ʹIKQWFH8Pm{ypoFs4T)uE|8T^ `֠bnUCOV-_]C*0_wڽ ρޮANXx+AQ=TNMZܚKEe qj]u_\du#_*" gpF]^XկP=n^2v ^b3<{|֑bW1eecvtoJKףfM~鰌֙+jR -VLP fďm~2U\s6'ǜ{TlET>2d*Ժ-9Tq(Voa%t%sؾo))MV V{91cI P I>O qE82eLD;Ѩ&4u|{ +sg=gL]"² xDm+*]rmc̄_3ulcIQí؍>4)d3,ЙL{ya#7b2n=Ҹd:z Q5l N7#~ɋd.(sHm2E>rD`s;s Tn Qϖ+t=}՞G÷hgpuϙfv-8#4'abyOߘbϰ|&Vq\܂5V麷@0s- #ǫ5:,ÅDA}8wÚ>VXP9ʪCaAd8 xנNdpxT|z"iŖeHx F!LC8a!bB5!ˡcI܉:yD9?^rzEuBy, 3*^\K™$zRR[9׉H 4Rx:္%;wzhs\ n. $2)8D"ºĒW4;: `/kq'D oҝ=y*+~`ŗ纎Հdž}KjtZ Hq]oLw-Ss>.cçAv5A$= 1q0aǶhtJA*#Ӓ!a*yhxOQ6)GW3(QYY2*T^vOzzt٠F$/WJ$'W'glJ\eV^~(Su▐`7]DvbzO30JxP`tcJtY藺;5s| IP݃dwm@^{'b#[Eu-:zz-3Gю`}!$lP73$K:M$T#S%yy [yي* wlɽTqq>)ag)j3ÀuMjIut="/[g_v7k{nϮejOy:9pMUhņrBq eˆ# t"TZu\`V1٬;@]P+;܌!8QA=vd>Q?7/ 6^- {i?~t%ZCq ϩ-Eأ2Yξbg%D gDoċZڳ,P5qCqc\\o`6OC)A pzI3/nWkd"Ԗ9 aFR8hQIXq]y*%1Ahz1[[TDJ <0 :SrL)9bF`\0ۃP9}@*I-دL^X&aQ{-P;ow]E|S р>,8&jg|[k!zX!o{}n+T!3pu<\[,fD!p"2Xz%r@Xp6Y*Zn2 vS0e>h^'Xva=/Y\D Q/uoZz/`ȺRϛ8eeUlpQ*Rk}M7c; (/3wSD5t_y5‹( vSD+A:I2yphilo0;.$~DžfN0yIлsZ _T|ܥ6o46;0ӾQNrKeќpn1H@/Ғ햪%*jg ( )O\ev:qJ *{DJ7%&g2 Iś'd2;@qbEC@@󎼓U)qxorUxk?A2N &rYf: {@o-hѽ'7y3N5O@(FRS<04ģ@!g,H¸bHbޕ}Co\AƠ77,Be ۗ(f#T3wIh6rC^B} y>W +x}11T-\7" -t`}Y}f3Q%f;Dⲁ(>cmM|Z5l*\s&!Z|"\E#~HBTʜym͊ ţ,dg5ycGgՈ0!>eI! H 8`yiHIYG @M Ic#`- \R#] exs\I%E7ؠ'R,vW}l⾻I}CY-;;=gA,#ޏ-0=AjhE$:ʋ@"P;N>|"$g.=fx9<͵fmEظ΋7}kEg&?4+?Bfqrh ⇭LA}x+n|} J]"yg" x tF}vpGӶNӳPRB`r)gwGH_švϒ_Z.m`9xiTГ 'oFSiEg K5Kp)䅃OYi _oq3DJ8pZk"lvIeTBR c]۬z2SIۏJeeQVA\P'VA9_:VcLydIfR^{wC!yeR)\ @]]zPsu{F piDB9 &ws@Ɲ@ U&^=>:R"|rUO<pς+q'e+\>4]1*ZthAE5Qߌoȕd! %!FMAV Ls\3yl*xhY^h1I5k-/.Yij'tBeM4BBI^bǽW%;i:9y8`w%ZzOBus+ݴ~KўPGbQzLv7k o=Vĉ m:>3jvF?[ա0pRS="qqS~DO8NG(7fW%u2f@gN>PztS nP~on۪֬qχ:5?Ts: )ھ~V@2'[xKvDZ- .v?<IHuBν_; +y!gY'C&ZxipQ4r\)p](!6~QTBrKÌM;諏bG c(^ PgϪB?6&6a'~VQ%`Q<jU[a@umjY1`{݁.HR`-\䞢,n wR@Woݏw"q!Wտ?_=.^1hTnW7Дa?~Rms٘m#&Lf}Vⷄ#qkdǁa̕;6 1,y%+P5%"0?h 71Al Ruά鲤d}1MhxVi .\1EwqrCsO=bqVmcuPƎ/b>WpӁG%& 3[EDMٌH2e. ?|c9o˵ǦNU.TtR 0c7^mg;, Gz +T8Ke@ LlЃX~oQNJM_nK$y{ rdR⣞"e$ޔ&zW,vN aCݿ˧SAu Hϲ[4Sn0^eKASF\4 tF3LLVǼ rn$)= I-ڪ;>[iChw45F΄JNxO"+M9{wYDQ0s beq@+A 0@? L`4`dd95ru[lPC'Ah>/ =\C3=y2mb覌[>0L b ˼(lXaGϷ ݥ.>qE0tm2"4iHT9yQsARc#^p_:Lœ%Ճ8*S)(}Jв-Vx@dXs3~-!$90.=j$ 2^%[QlBwZago Kܜ5=!}=b T|݄<&V${9Gao"Mm1iRX'W-+3=HusOfIesuicTF0P 8.:mpp0lSH0X:1vb")AQܺ&aԥ~GÞHaz>>}z8ܘȮ]㧰ڃ{6O 28vۡtb*oAxBA'|IW=ČpNkx`41r':`@ QX22).LZc MP5 %,LQk$OvرX FP!qMng ?Ϡ~/$ᎽW#>< ji#^)iKw]Y^i#aPn/g 7uj@ªz#kh,C5=zE)Y)(YlU/j@OI/[L|W\=܍o*AW^YƵ߲~B[3WҙdoS*EO(Ki+<^R=W] !J d$pg<ى7NNOP18q'i{ɱq,thN9M>XMe!GqV@v-W噻^'Rd] _n=A1(vQ >.Qܾe-l!icj d:Rny=OmmM XBl4\wsß y׊> *OW0W{l2]`-H̏sm<̽,8#qOZ:MEC]z ]гdqz.kgY`>ډmnY62e;1 2N8ö 4 dƜ^ 9vV2V0Bj-0̥[yiӔBL 1kǢG vxI dNqfdVWg)Yw&b Z#@GyC^{e鼈4 is 4t H|$s+Q: 0>uEMp=4Kjfbw'5Rt( fPǡك7]b56y+.@j<:w3Oz]NFˆ6Á&-=a͠35u9Yk;ocqo Cpů1]_[Z'>ou֞.t17(n3ͧqZbm4D7\| v@[I6h +:]/YsN ZWy*D8D߫$2"kqXVA*EBl 1}_&2 W,WaޕaOB=@GE߄ItbXqX₤xn ڍ`9:귲y5?{l5rs# [>al5)a9W^pp[C7 e0!3FCFPaLqcWN]#ǐۈF<'Pq4g# Ws1ο_Pw)nN5ILeڴ[:g3rya+WNKpPM(|$8t,OR=_5őqZ6VYR }/GS^XB{z1DJQ]wC`Taj'rvݍiԝp-,"GHpUQ6W\u~J\gHgN:Pv’С.F`pnA\ C_b(y]s4h/tPgH#agBT ^&>Zc=[TPSJ}BsaiPݽeh$m 8%l9׶ @ ҾVn2M`)qU6,yC8OǡAЇ?ǰQ?)-ZGG ΦIR<2XU0Kx o%QH7k$8y"i&6[>}ʻԯ悧> 4W;Be3y%7⠏?\|0شtC_nilR3'Γd9*< -!iSd3g/BI]/8Egst{wxI oQh"'3+8;B@Q"%:bwx&=}ׄ )-A`u"ӕڼM9fUnYZN\+xF8[7A D%A] 7wב4Ù+UGVΑzj7R CERjX7R!mVBaǷ}Ĕ2A˾ 5)- *c͹iq#8gNBm"xpfEz6YZ!  I婾7@j0ҡ;<%"?}"lTӛs@|hJnfxonᷢٮ7] wJ(J]#W P|GFؘU>_2r"B"W5My""O'yʉ}bBWxЩT`nUc7CpX39!1砒yiίo(%o )c(Ps#qFK^R3ilk\oA͵[#'$pq f} jɱB" zӛ"2)PmH8mLոRE @F;XD[lI\Tgw4J>BTUip[L yx)2Y2D C؅sϩqSf`/\Ծ_<}Pq2.r96Q.tR\eg>Hn `)jlht;DRS P=ڔ[)pR-ڞ+rK~$L;1;TD )tr@&2^%gll<,F}#~kk&&wgѣ죽:Yo; Έ?ݝڕ5y޺fdٜbu̒A"(_YװzQ/pG=hl2Z箱 @8dȫfpF|40PcV66L_@`m+ /_ őf{PkEDTތE4aXXƯEv&tS\Od{p{\;)%^l`7߂fPFW4>jr͊H'>FvPHx#W^'7%e\@Gv 3Hr@CnbW<2껪}5C]`9!S4wY,GA]1K,C?CP|)a} ɩwH\NseiD4E+/%;\e!/V^B;xI t`Ln@^ZB) fLԋyR yo-F/x*n|*jKF,] v)rgkXF(-`1u´U MkWz bZWGSe%TpEQ|R͡h=o-{vf i!шj$ ]JEH9@{_w>'iY7k*+!dl\xNc.(NvGmqXbIj8XTm>zeJN!)ęo:^mOe5{oV;39A͖QӶK$;'],k k8lno VJkݱZRzea)&cLO~#v)j هf gu(vU((*2DlGK, MQm._ɘI ҝʼQ+~B];,M*}EKĿCpdUBDS_|HeG;`X?ŭB pQblgmo'$‡#^EqE]02YK~ ˗BN/q8Y[AQa>xJl?3Lrֈ)աip:`4>0SKc|q~qx`A܄`,-3Ru[Pӱlq" % ^OcW3vs>EPnf:J=(bA`3csRg I|5]t" jExbd\(ՌS yskVJZFNzрRF <$PR!:L!T]R}mqJ,{zM?LcC)$Bb ȶ}1gLe  0j 懭$SȊp^Q+ eY? ZЬ/`9bE7ui4[(h3dazE1]<\:4np'cV0##[kV N„;Q8 )=.M'0X-[wC{jUq0[ c?o<<|(Su4OVxP3&iCOȖS6,۸2Cs=ԴǶyg"m7o j@9z>%bu2K[L+TҚPCG!D&oTEr>ܾ졉$Cn5]FO%H>k7B4io*Ko+djZg?|ѿ_o!s+Sk`z^zݮ4ˏ"? 42}5r+3"Gz_խh 17fl&/7P87_g#K4#B2։ qύ$%-h[T'HP%q=^gހʁ+UC' "*fvh5 /#4/ $i2e‚i7`]޳/E ڗ1eie_'Vf̏ լT;;JZ6"΍K~q,Rj@5*EnJxt,Z c0nf 3w.N ?I.sJ4_-`e)90r1x+%|/d8):0BXS*4"*0Ίh ؐ2GX?[Z[j2c%UyJP'Άo5ZN{ X)U#nKŭW縿V$6D6fg6th'ѥ? {LBEarp['nYCIEgVf-iPa"ˏO7O %*BX0ѰptK B"w`Qi6עyT\/;k*&ME03jN N*jë́ŒzhBCnO=S(g@ZA}3k~2z8\3b:ː>ڳjq S=C a΀ oo*e/`Q-Ff"8 M"mz1I+@.T(餌 9XtaDayqqǸ6QWKLU,/:6O& <)bF#{J73D:gA+ &xܴ$ឳ@>i-Y`)D<}":i4BXwpz t^QQ&C?N/=yxwZBaQo*oPdfO *#"< LZbNmZ0MYqy@\NPY (㱽 EI8.ro_`~jBP7 *CV^Tlp3mRUfn[.$)|j]}^Mod [(P +㚱]ІtϞ܉HDC[]F[nVGIIˢʠyYkD(Y2<|~M=Pl,ҷb\-L;I;|xf/:s3zփ98|p4UnXT흴Љ#L[: 3 'dMD-j*e[11?V~7U.>>׾bf.|y3\jc 3S˹lhNh@kh{!q?/v;F 9o3eR|C|7q0* +5ߎ7+=ŃV* +i]VAv+sޑ_% -Fzk>nxZϟͨ_U=FN2W~icV x^ 9N'y~ ?@=r!HD.{T_mANHY]GMXX[o+V~Z#I(D ˽8T'.ԙ{ SUhYs3+W`1ͭ.lci5[~]\SRBw DR"/-R 4-M;>I럖'^o6zЪLH*S?ĢINa8G /ȵL}( ν a{PBp4=E)\AA)lr;eD4 ):j(v@;Aٵ;ux}.P d }{/F/l6|R<"= ?TsAqϯYMed,7ʳ9?F&**2њp'LjիٲO4wМqK]4B.Kʠ9q;bM^9Bk18Eljs.!HTB\`A6r9G@S $!Ѣh=drC ZenUyDg{.P/$ySnP^˛!r/qAFX@dl-Ϋ깥1}]Gٮ^Up(LhW9iHYq_׸n)h5WIZf`Sl>bf Rl6)e|g  c@}^Q7$ѱcךU@El,XC%j,A[3$'5>wɉ#M4@mmPpyApjN2+M&KŒK7y+@Ϻ}">"JEv) (_$t: # ғ“?:P^_ŪdjγJwFj M):nE^,B){iH>*f=$h2!ܘmp&9{g 6x~s4ng\{2MɶUH=ga8'ãO)Wnl{$Xrx^'RH{'pq'),zeB i pL@r tV &Ե9Vë} ksh Vӫ_'N+" p_R'kcބmL_|NGx_H$J'JO?5V*b^;XliQZ&u_hvB\eo?jweH!"˶@C>I?$ |ku}@^тHj\/З|˅4|Dw~ qq~/dC7ROBWW̿m4Ah*= 5}'ʐd8pz؊FxgYIJ ᫖LjT4RVeo039!u+W>Eۙn9I͵c2 #(JD]Nb~j'RhtF_d.lnK 6;:҂m0,nB6Cф\ma#]E5%'GܮNmGhv ]ȶ'4zw-C׶&ÄYM,%?"U:hRy2x5h%,P>abe>UĀ;&sʜlHm鎢JȔbHr; ?y0Nbx:oXDGI2%z;(Dw6ރw XsD`Ќ,MeaUO{'W%&5 ɥ!9 qdw$LAvƳ6[&mF*L,O&<ղn(<isSy'; d8߾Ma( 3Si;Æps^^ cIy1)K&E_=?OJq.qAjѧc ^`/M W]C< 4{Vx]|YۛW$$:+ tkcfIPc? Vھ.L={aQ\Ts3E@V6ؒ+Ij O1 X>!UJ H@?D7 \jF*"1uv #@o#S+ETMms}=z9st+,ܺ,uwl*-fI:[ X@4৚Z[-$ة\d5Dhjsσj&R $svc8~joҹH-\Q>Q*qˉVE]h$^aN<%쏧׶s(v-b^(iKY9тG,{ :)U+,LE˅r кt[N[Aэs@B7˝93u4g7aD9)Lo\9 K*@utp\px=)uDV{|ºQ8~jTsACrnP'l(}Pj2t̑g{Z;G9ة1"tr *fBqEBG 5=%Hm~e?(`Ի95]STGQgY9}jX;^G'VaJɐġICVrCv#& Xʿo7)ߙhe]J)ɡE>D7#̊0Zԩ&V*:uelE˞R"_;(ah[ye=XAoEpT\ z^ v!֜;}D@I@-xMБ8ih\p78oڵC sAC*i"Ia=c)5X˰/CkBZyamvMbr?b~Z&(TdvTCɚ%hy7;QaY(nl}v ?m `>F+) !i-x^$kIXoI`E0K l.Q/ˋb-!6OTQvY-0 b9p/JMO0␝jAG^$u(9Ȍ0/d4Ƶ@ ΰ֡W@b2 zV$As.rg2syrI)#"fFd4a/ (lC\Frt}Bt 6A&ۯ?EK )0#hJ."\-&^Tt3dW1|՞,ET.;sb9.NS"Z Q\>Sqؽ bb:qSgLJ)\?(gIr.p0B3=sryqD$iEHH͐g[^Asp]ҡV$zabRx4GLX#8i I4<4XD"<4s9*(z*΢SX+$G-/Da's+2wZC"*1oMu>,tbEGEJhV} s7 z{trքȭPD g뿤WR_86/8$|AsbFY}m9I m(Hy K6!@opql @XkffN23 nm1)|)k}˗sZLo GX)hJXЄ|9f o^rw ˆ%H`>lNŅ>3jj龖!1h ECK(LN\-N.PX,`oew>\NvbwE5 v1N%VvlTJw6ڏBgYof!h#'GaI`MRy{֍O~Bć#@$P,0KJiJYXv\[칈g7\4Lj\b''R-<;'kDz)t7s]!Aΐ?LX=NC.@CkDh4i( I/-OChr)ԭ]$l"㳙tn$qV,_2ƷufF(oY`c٭\,LB_v  ]i`|>v+ԩ!ľF8*5`,sk\8>wO<9p}^e@$y#7Uډ6Qt99D*+zյ+2[RXǞg?!yuܙ0Tx.?%B RfXt[7>?պnn040`d:5{AJ(2lDC9%Nv0qkc"ɐ*{ dp"7/CBm.jUҖ9,lN@4bv]v:pQ(]щrxY/4!+] ~ذBN?O<x(wrJEd1w:3/W1 =)%jkO]^k]D]q=jppnŜ߭I3Lϭxʸzֆ^ Bs; ҋ=`k/%ilYwO2= 9#|3#(muRk;OV]o>^'t!/{Ppon9p@q5ѯ%>6)` wBMwgU_yfԡ8r@c[iHR4#^5_'cM+Uwb:Yx8.p^A_>FaNFR)/w'Njs,a_ Jo/+&B]|꧄+DU树"TW $3-[) ~+[sVA~(r}nսRe1C!6};av|B4; sĊ53ů&VP:^ ;l3?**ᵇf`?إo~ .|@T<͹Awp"NwĀ0mOYs/ Bܘ}V<昫jE]:F5*޹kV^gGȍ,E ~ GݨCgl|Q_D wZWSVqw"K a4'heLiOn*x/6y@Eu$}TneͰ6 q&>E*K9eѷKUr͙0_d$[$Ҟ9y-`YlOg;?=UGK"}%MOZbg1rjo|D6&fng[YPRZTO$Våql=xa׏pXr^eW/tVC"̦wդψ~l.E=\+\oT "U#Х<̂|݊P\$imScwUNLq`T Ȧ>l-d={]PI09B"o?_1MeR`O=@T9o, PqwdWa|Rnzi&UIQ! Qmcs=DLsI?._Բo vM+T>yTVN.> g]g3UHP|u NYaΈd&N]IEN*rt3]]WlFZ6xgluR_ϥޜqc5!}!KE (\r e !9{gl~ 4#/qr^ BE9n'3Ђ~O49J1NLbĐlcj^$81D`*(]+421rp;Z\+1-!.MS@]=Ʒ)IBZ])c܌αM㈣Iȣ$g@8Y*FT >kDBY}q@lNuƊ=2zX52(z:W6wHGDvUE0?bsY9x&=firs Ej ~ ;QޚMx]\*V< {ՏONF0TD *$3'qn"YH| __bwEhH~8Y0דY||| }H}KѮjph^b C4ºyG{zX-#f;Ы S;ꉵˠ2WB mgJ-h0u6#V-]l&Gf}xM#H֢%I }YhXEI0D'7{q OT6^i٬qO+n\ Ji ȊeFSgȭ9c]1L\*g~: $=#Jn-$0<THAzr֦aمWMy.W@\y3brP^g^g/bv&U`)3]ؒCAf2ĺ(L{‡tEM{"WȗcFT:8>Z҅˃ 0& ">=t M-hޠb> -`BA%u/M;x[zmMV#ӝzWZ{Ҡtƒ!wr, sP UaIezE*w" rV $jDԯxiAyM'\`r;!x2=^g@`A6/CfU$ʾE{n q跧%A+`t*wՁ>NٝXR iOuwhqf(,ߟ{Ь0B&mzm4|E>nB:U0n4)U D˶hL0,|\*c3)|aj?a/#}$j)T}Q]Aj$&jf.4p;fβ?@P(3C_u$[jD6P-7jU\84U罂OTwcRR!kRSP B%|3A8,7W`l8 ٮ Gb;2#(i Fg$;( `DctPH8]VC>ԥ ʇ>^!ch~ x(%FC/+JMמKCxF @8'>NaC<@Ni31:H/`ND5:$ԙKsie(Q1[,lٙ+Z&X*~3{^J饟n}ٴyW-$EXYnmyYa$&4P D0`Na>T:EԾ,Z"ڰ!^Tk3qpe $>_]/ړ,S<>3TWn㥕B: Km)UnZyeX%Ȟ 4=!G٨ez*ٺnJ]8S%cnN8؎JjVӁf  _P}+EUpw b/`$NjgЇ+JRA5zONLٿXfu蟡Qzd vy*2/>tq,?2kfwZ9=$UHݭ!OO^We@4~ZR$`fVp:5W3TZդ"EYY?BLpBí%i/'/CW*2mg')FN#T%To+ZC :eIӎ{S9PéQP Tj 1Wx!Vb^ߒ7y bYK,@-]KL :1V\&oYߋhb#OX s3yaZ~,B ,bl1sguI \"y`MedP0:{,.U"]zz4 9:xF%Tkm}QX.SQJLxψr7c'Oa$L>毧:,5_3dtϭA Hȵt-05M(ȺxX'<_ل&ʶLNz!1{F61հZGK8rI֠QWOqG s Cns;JORl,}|`u\!I[55\Z0 g/ʋF  ֿR~cQ3%UڈYFS ^2@7Y[S؁C0ydxp]0$hźcB6:ξRJ_f+I1{P9v H"h?Ɠꚓ#2 %m6Ūb :ݮ@|dӜ܂',i[d 9)H0:tGUi2yC{ٗpZo9w}af?VSU-h(s֘ =2,փe W8}ʃv*YdXFI-nO]AU!4c,\lރa44Nk }+:k&Mk(s}UyK,&QN|ʤKy_,N=N\Da(ofQ̿rX*PJl{AP!kԗeZq9x0;lWڀowqTUW+ $E, Uldm_i+#H'}}9I; J8Cu<.BT[_EUҊLvfk.dx5sM#iIpEvr/Mõؽ"=${Dr[.I0"bNҎ B#yO`7w+j=kb=-"12dR-Zc;Y ꎡz^}Qi  Gm"[H2]&I\޻t/?cYX $<C'S)W>eJ>-'*IPs ^rH/Tɽ!ZQJ u3K"e^t)]3oGǿ0 T]3n$+K!b*O&TJ$_@opϢYӂ9 3G؅f/ڽ Kl.А=` 6o %e4%$ ~_D@J易Ŵͅ'vUqZw,;CGVϰU#}gv٦ߠ-NZV*q<v7"&َJ-QkfR2sqU qJ*w" { TrJEO½NԒQ3YEy6Or?TPDO&(u.>5m8(b B⮾EӽUK?3t'JFlH_K§/V79ڻibT0":n&2"AϽ6vQ]֎=Vfj?/_K=hS>t.@עXH^NL+U|0D;x:q' 'igARI])d%ZdG_wt9J㯮A tyoQQ/N s=lUrIHl ]a.Utqpi~}&dXRzq_<XL7P|=ܜgM-~}sb H/Xxٔ`a)x҃0R˵ك!5AɒeJ-&,E)T{*!$ 6y t=0XbA\x^i1&E@!?@w GL`g҉䲼j(tx_0/ItŭZ2F4;ĿM jFn4; Zec2{nduebc[6jOH/imnƒ>' 79vȬ8"$jzIvDy63rn{p ǁZN΄j v5v\bt. g!bΘ#-#kJd.Ju ݄KߴFtΈ (}O Tf`IO Ui־'O&Xfֿm? ߍBΧ`D1 tG. fV Sgg]6 `CM ]Njʼ&W~ i\<̹#=GRTa|W37Y#4G( 8f-D/=Ӆ%="o5}j3"#(O5*[§Q_uҟň14y6{*fh;}">:KdnI6:b\c3 ~6nChs_ata Q-VDМCYh(c.nL @[r*NWd,L6ж.d4biM K}ntcG2 p%qx P`no2ō=PtXJIؚ=(:7 l#,cm@,#!UP[ LހEL{1*?$ MF-/1#:I!i9Q SVZٳD|E;Y&S%e;' nl &+KH}}sNJק(?\ pC3@E Ufj0ݹnķ(K{TۋaһP9W512pmFSIȄF*k|hbu αrF4aO3R*rACN"lЍ!D^SK6M{3>p=Ḡ2Ǿ k%DЂѤjwUӶfǂJ̇HؤZpyK?WoetU3^`}h"j71 !\s@އu @谡1blq!mI3U|KiIB?k]\cmvbs_םxl}c;”@2ƻ=l-J|vV RUl鶾vGQ8rBcxp(;iq||ZƇ-(o>@Uwv!{ʀĒ;-C=EqYg^sw1r*q{7_R}[S!Xx~*_hq!M0Q"\|rv R 8wA\Wp10pNdf8 :E mPF8J&%x7D͎'~Lpe=ح`媞ptAnsHύ.GGhEQ+FJ0JP ص'ڸRƥTL҇Λ/ ݝp?qi"z#7}I!yCR 눆XoYӯru߭0n`vi/uR(ѱ=_67i;@ 諑ds 6ACNe:˽mPT?t#H@U*`MȟWyZ\=F.`+3? >|cXLZ_.1aMԼW؞T%mj 0# aRd:g QA#6f-BzF5kQ]>6ikFpB$< ~/ ifkB!ֲ$\ ~PsK)&geP"-7ZHa-gB@u`4i_lNd>d+C%EjVO8._odO<{5OoXt$-2u29wHC9w(!7,y n)S\7DFi 7Kir\7t2Y{zָnr$up(@U|@G:_m*C-+2x@W 8yD βYƒHCR3;W$m)#nm,-ʂ(嗽v;IE22$9DyƐT䡗4 FcW F e khSn|z2 r<ǾAw_%A[I; UؚуS^`AwV2˞ _qN ݐHIǥ.F_uUVi`~,Lvg 'R OztAϪ&^REzP S3]lGaAeM ^/4%!M,#sZ9Ub0'Y\v'8`XlN2䚧~OxU6Vf/XLqfqPB/G=5$ô{v]xftl=/㫍.@sZٙ!و=R' 5x)## zד!\{SL Ӵ1dB$okb9v0j/d iIJIŚ4Y\ʟ7)"t}⺋ 7^Oۇ--S?m g۵xkrzU1g5ѳ@8Hh܎^l,§f5rOq:E&m|@t `P܂po,ӥHUH^r1%`sliɂge1稆fSІ(jqYpG+I6أ /؊2t'Ble&Bx!OّH!l,o% vt(2@‹I̥BСrOfUu4yU`5 3Jlw>gTAݯtތD$lxR.┭Rw[L׶7?1bPh1WUVu{@yMƽVh"uUGN}dGp!C9VH!{/TRwg腀 )Dmx" ]ַuKk_3NN[X0v0ZR\#e$@!eTCԁy-E[Ce(B &0|os6] xʭKWuNjW&R ݾ6u!F?bRg\BB4g7@]EM̏O9JM;PB5rE)ȗ皭э<ݻ0DJ0ѺO| )mnws.,}\RFBͿUEӘ~9  Ғ )]|ZxZ9F)3]mHy{5ꬔ/L,^nz˟Hcd:;կ@̡o#GţN>2~%y 0A FeC>L}[:^DeFU&G[o= bOP:Tq>*cLf核NᠨJ|i~!"=P".WR8Ӿdaseqn)*eB/-MI/_[JvZrӿ*7yܶSi; jmRBiq<FQ:^%bΨ$ξX:*!āx[竴I'H.tYJ?3bhiT}U$lH KͶcNKa/&1M6wlm}lit;ʅ@L*,edgY(),&4#hJ}%N)w?ݥS&1,гۨڢA%< }"E~Tшx*6-өDŽ2vb`zI<z0VC@<ߐAP͚(&5ywxS Digq@> "P}.Ucv@)'"UJۅm5a< !\Q,$L:i>'::V M'ڪv[~{" #"y]q/`Ή)dt)٨q)OeŸ:zRB1JJRUf<_|uWc-G}p~) v_oqwBg|96+eR:$Շ'B !^O μԿ' Rg&ӫEIxt3m0#c8&(6 (N#n(UǨ߇'6!|TU*C=u(u1gWZ,C`y[S1 -Jn 'yf+ ;Aw MPmt?a|ikL:,:@ko:ʳ[+͓$?Y,IEW* ½Y ~ [=lOr8t!P+0+ۧlH;kE h0دBKDIt NJW!5MH0.@0LvrPC9g8-=C#j0"?siFUG85@lX~5 ZuT \s:0gxa$ʤmR@ǞG=)h@!u1e?5G,B†9m4Je(#,DjTUnSgqHXA!/22 sA/qKi1~,ΙQ feiHHWbZc^qfuIjUq3@E֢YE,Po<"iM5ڜ~Hy% 3͢WE=[pK$nU)XO0Tn(}$^XO<QAe ? 8* ʓ0ju`q$R[b#Uk5[r:ߒBPe(6˸UKlH_S&`NV[nQDvRݖ03d 1/s&F PmD S&C8rg)a wWRGc.9, w1f[zu8kqH`eߺiVABogGluV:M m3 R@(VϺ )՞aבo>yQi =K,/p.apzԁH,7`8910$Jp13+3F~*) xnހOY3f!w͘!1f03/$LveP&.[{HjIb 笶q5Ha8: v(CA]21_g7 HmO{l"UkuBI) =KM"aTk$ 2Ww=~ b?V:֝~[,`E6"%UIQ&̂̇1)3P ;7ͽlF7yCx4텺FGfSS[^4' Β[*9 ܺ{Z5m]+l]EQTAmiSc9pGzTv?Ȕ jݵx k` \EP1glc׌<%2A GHQK L?P _k}4As%Ō5 v9.ܧaFTSG2Na KC`=14v^2iE*ć1vQ5|۬K^)CYaAq|w4\;p@Ϊf<N5VB] cU])c9jFHQ\+4OM͟Mslrzwb#x6_Va$p"?HY ap%EyenjAo0x+jR{o.+û JVw;}AH>J6͉*g&" cb22ʴ.봖3d =_;NaioX6'u%ϣdb.R(rJFn}ID)%3IOq]<9 )o\C=α:I +bҘR:joC1ϋIe~#}H-T;f4ܑ|=$koV`N):f !#+A乣C)AIfsS| ɎI9-'bmr%o] /,F~rT#1ȯ|V&UfHWH huHSE nm5_~7:!u8wURT((/"c&Ȭz{>˦f QrAfખ ~BZ kwn[|ΟJ+d*y$|kN6p}SRdſzٸŌmpxHyAm~i1G\.[MQ>nsM$գyK WgiNH)m`@(lg|JP}YpxXZ?k@I^72FZ 0)fCthCBe kEUe{KDl{LjJϪ{c1ؓt 4/…\-mdSɰ+Um I{%@]NNS9 8`49sp/,@Kp'[ZcthNîI-^Rm,͉*(D,uD)_~1N.y-p00kAM2`(f eV6@jsȚ42Zu0<[@52JES"j| m,;,&eزUضԌ:>=KהgD"4p ᩊ->Y_x9W[xmǷ)cz_C~.neR5/G+ 1BD ex>؝+oߨ5-uW8pmuyW~ P09 гKýzI.QN װeit@ѐv|`yCVF=S65Z{(0m/7=O ;k|qt_+ w+r=V"@J<겠:*Bؚ%{H8" *O yu qVG3ͮ1ifLh =tAToZ|4'ZZPu͝w)ٱF[>VubNZ$k &^jƘpJenMk`2o|}InO Kuʱ4:^LkbNyhdJ%`]׋_7F}"HjF1r%YS'rXߚm5D&3PG(ebW*Rv$D:g /:==!C=sʰ?-pُsף#,eǁTENVojLˌ4%DesIg3YTH%Yyfc%` lԑDz?G\P=|3hmnT%cPF0uHrq/_$G{ tҀR;yh. EX4;.ȇ/[jv8mQ5a|(́>55Y3xC#ܧd{k_\վP;EDRop~eԈ8W[X;;*ޗ,Vx0$-.LQލxkh$QԲ/}%_oVmyI}F zK-S`<57:_g %]YɧSr'S(ƱN7㭶ybEmzlCD'׺.bM2/ ڱ5tG-X*d#K^ZGgThO;HH=D=`L+ wmqi28Ak_RLhBz^d%J@, ~253T7h[1?iqg3{qi ˋ;߅d'Uo'U9jz6Ԇ}DZ;>(;ńAB@nro6z[F5 7D 7lO$m|bps<'QL'eKRU®U$@r.dOB D"ֳqLf!ubu-+yj]gfD#d|(O< X@1VXNY;O$t)3|}ci98FVwq!_聃ܱk @W$#GFh0dk! TzO umƾU۳X\T""rȔjk[239rfC]2^?L%9~H!:!TyhŇ̥5{xby5ګp|k%/vVP&B:xw!#/peϥ@u<⯐I=Ls9ˡCJ'zv2FK+-ڣ_)3-#F ńX[e]j.עw65S P$?k1Jk@;@\ƀՃUl=3ݨ7^Uq_cV,2q8v?8r%5#_o#X롥Ё~O+߹y8x ~a8֥^fjA0^3GǶ:*# $FK= ~AELzss!dVCgw5JRl@Uz(Q0 x#v%໩Y&#˼v[D.dnS5uSǫsdoq+ b!wp By27_m~2c`%G!fRNDZj"$dfȰ7jHPb%W.?wQ:R"yVVil( ul޻fW7T0ΛxF{@a=& `NQ='QFky3ëDd8lC%.GDEya\5`W+ucEH $U. 00YDP, /0,] Y-E@!xz; =Dz "|Q٣:vh31L?gg⭒Pn4S7*ߚFxupҲ5(Pæ!eڤ~Əd^ɸD0Powx^b H'Ӈ0&e0?σhi fdv=H˛?K$y WkQ:C̞4 Ѳ]H-uYIY{6 0 \[Is"TSf1br1]H򏼈GT_AOoA %em1c fBu7L֙ZswfPi!J| :ڊuQ:%`13T4zt!t ,|L7l'N1NėUFTٱx^[pcR3dR= ?Fó)#@Jo濼>x񴺼m!RǬj! B6 :fh%6_{M6%d/ʴ'7nFwQ:̒z=e-W̰zk})١GP]_,tW=,sJJj;~x'"Rg}C :7K¿?%}wٱRYpNd0DP,dЯ:| 6x?ki%.BTfcHHV/zRA?{uĒogx晵/E(7:őiCŜbd'\9.'ڭH2lP Y֍":M@~zq`Qu;UEeaEsyj`F{6X;֖ @d qyֈ$X])*5S]#3 ?t$.ƕ|I(VʣFa"HxbLY; !sD(U^G-5(hDh65ɘ5RNu?Iւ,V1ďʺc{)`Dް3^2Bc|nY摍HG[5DCfRqKQyȞ[7kEbQ8/E }H*o>Ks=#]@kVNQ~,]I (:Fe͹:rS3RE12SI1a7}\ (I,f]dܮa\! 9yb!=!Qa[5ޘNt7+E,L+*"5X}TL9}34/ウZV N n \ȧlUr|$iu3LhRצTg-puZnQ$d!".gd I5[9Ue\R8L6NY~Eפ#ƓAHi6~Յi#b`[R `q̿Mp&$K]|B) Fvq_qБ.foD&PȀlnD# >*s{~|bg#;`H8EbИDyV Y:DB4(aI.uyf̘| bSaNd|OirCDT fG43q;䖾4G+vyWڂ%d]; Q*3k]RJB" H@DG܉X>\.hC$j;EY J݊(gt!8ҭ=h2b-W.v*$H@@z,eN @\z.A"]>՛ Lz(Br|NEl*gO'lh$Г oq/O7+ޅC;H!:2qP.WLw|'guuZ`,QR9G!;OYZky؊뉰ƈ +N D/9zv-R xKJꅯKo ?ܪ6й%l ~J{5zVt)#sFSG܀WFm$^T,mQb;(`C#6qx T U[-=ECnAUfOD,̈OZi>&*tgv]kUzԶqyۑ;\THBhOpRU @IWh.<2)KF >yVI "s[ 8dA3.AJ_ L7k> \k yaB9%t*\a"\&dm)YZr@C#y49c4dcPk6޿t$⦝]0ƣXg3C`k}\fBhr%jvqow!V}Akغ"1}ǐ3WwƂxTB_ >~^B={x(vޚX;B}zҖn :)ȏnٍ)1oV4 ]Y+B23o*M"+i |=}5N J)10htО4)raltH ?RЫǁ[$lNC-XD:1\uпb8Iid ܗE RjgW\ ~oitA]~K^#m\ՠwWY<MjW,23}>;2ϽhT\_om2lN($b lΟ>46=Kh.MvNޔ?;u>\A+{5]y4 !Q_ Oζ AGfHKSgVG( .ADmdeu;׮|Oz]SЬcl&~gl4t!Ak7?]R< 76\j@/9u#N) paʁd!dI@4}#񭡿|eQîcep)Y0.@Xzb)y_{/})1isHvѷxս<;0D0"DLfS_x1~*2nyZ.'ϙOV<vYl:}QI3ݘ=v%uýeNalab)PJ9J ;e\SW*r)RWtF/LE9[mBQ<11;?b< ًbV>./5h&8]oʇP0/{~oi) 4T"_̒-ϐUt юh].|8î "9B}RdTt .O1 ?[`'j~M"kdyJQv 2fcs? 6X\/Ƴ%3a,?=g =' =Wi#@.`}׶O9:_QkRw%<2;Od[䣹x3=?yWnGH\`@ɛm5c$❣v-µOV,ĹOa(u bNO,&c݉Dǽ ^U$0N792mMmuޛJ3Hi'y. nhnOx֭7ͶFFBGf P+ AJ"PDi}bP&_#wF2d߼@_!xtiiwI7,yP6~^GhWR(% ;N| EzAQ226ӡHL[|WE =o1Y>u X\,fka:,+uvІi.qjS~hڀGWzOj λ$-exTҩg/HQ_5v=CR72o 7vX[xi򎿹vO?s v/Pkmu 'Gĥ;w8Yȿk3`[&FY,UaN$Ǖ &29,`@p.U塃o[*@=_>򗺄ws ]jCH#u"i#x=q*}IKgw;m-Ɂʘ{iX?־6~p2`k|"^MD[rmMG):3$ꈦQjcS_uSB˞JdFx/ 3S q7OS)$ Cߣ -otKTnaҏӹc͚EB. -˿on˪2B<`;eE?*€y}+@:!-E)0WG\T>%O6smƇexqD60Đlcxd6bj%, MXaP+X͋Iغ<λ_hLACPFc O >r@8}B{H\D/x!&ɓ_߁6ɗZokBpf!v9v޾h+zѹ; 7 }F2h"օ)k\jo ?"W=X$c$ ӛ!^µ0_F/ E^ uwu@^F9+s_I" LgؚΚ9 Np1oud<=PZpLˎ' z7i)g*} !~|x%g Mͯ7yL @Ә[3c.ö!g'3Y*lŦ0Ĥd"P7Zj$ j~mDlFv4F[ &-Vw44a# RuŁ8>~l/qҁi9ڱ<4,F:*'wS~>3kT_!M6A$Y wZT㱸)$r}U =«1'|{|fi#u?].h WiBߗFJ]?u<,,.6ih:YΈuy߻ak)pw\q7}'!lu.hlYږ L8~eX\PZYjҿ}\9IoF=eJ;GT'Y#DuE$yߚrUrbEFd5ԉȈAg1q%Hb7S{9?ɜ3@kH,ok`F1Vs1!dۺkh5i<LOoMS@~4(L2$)E N:ɯfĐ>Rf ^HB QvdWJ{sZHګ;8q7UҀT*je9fedȟTUuٳނ9f @.;Jo` RyƂU-;*C9_%G<(g?)Ug ԖQqy@DDX.$#a=xEih鶝\tbgD Wg7m`/Df<)xB[DcwA̖h=t#o!4 ~ 4i~i@FcAq|@Ͷ:eS뛎 wl|89aPwXP.d+)^mz2#w#n+dn,zfcVޤ\!7jP=7p㚏o;̿f#$kdz6+B, +#j4Gî7/} )B:PHJ2TU_ aHι߲C2G!3.}p!)K &F!qW5v3U֕T’W oj=wolGQxd{Z*y1n}nYngw^[8~8X`j 42߰Qxjq.( 24"nu|}i'O| `@ g2k#ԝ|@V[ VI<  x`8Ajq\ހI}VߏУш(\;U ("D_{t_^53۰^ԙCY}H(ԥ%2.!PnMS_PГSrN WPBUA#Ev[Nj,3Kit}F"Ix;,1tLbƨ`1#~BxjNXef}scq{{Z۫f_h]%D+.XpH7-.3m卾*@]$5MSqppyTRhIv ¢{N7BqlB[h0G.[9:k*{^e n\e& zxSTct64Dt2802IQS[D yaFrхB;yHR7JpV/oBWrEE-8l%0ho;аfx+4+ 2 ajDzBx^RcxqC6 z(jA bOfKY *lRϪA\]ϣsXp [00LTu2 LmhMCRj!nkz>mSAlH:rw0Z1)54 ibP3Nq=:M->߀i{v#?^?g(^K2N?8$< jOR@+𱱟Onsv ,۴JK} mk[t,~p*u: ׼m.dYf2q?d'}L)*>pT8/ʏ{&z$vf 6Ιއ &U6|f:iXel~hx>@R!JG&H!jÏ(_)0* ]d-̒ful  Sy"x`(;긝"܊D4"j 1oKw xPB:Wn(s 8p=sp+YІ.Ba\ 7,arl8Wh GigBP@5 Y9 a[DEݶF}4bI1*#B`aG+;2lU:Qw)5Qk^0Dwt]yج^+?Buy{>9虼ڥf]w 4sJ^ o`|7 |$Zb >[_]eW-puHb`0 ⃰ ~cOXROf.`\a W xV.p~qRPq=`㛞)-@'NS}OMFP=ZAQ v(]*LG?4CO5:0^8"TBQOcRAOi3ڄ IեW%XgUJȸM0\'PWe]Pn 9,]Ȝz`Y?07hF0[ԏ{Ƿ@G AZ4V߿cuAyoۉo>!FZv6Pg+Lv hN ĸ*c Isb~¶]q X҆@ P+ᎊdΉe-NkV.A{@Z;󜬓l>8vLsr>OV| tڳxt=@Q ZJ~٪[*p\|Л΂=Ma(_O y;[@/03|H?nD*2Md!g'~o fm!L9zm%b Xz-'ܛsW<3A՝\{x@^M  *s`,?w"H6NM% /; EK.Elq#)!$:\LNH?U6'K" Z}`y/Zʫ:–{o]5j9`Ϻ/U)[OYv<44x:'Rs/1_U(D u{B}bS`nr\g]d/7g`]` l7[R4 :?u7_,-˃ (\'UuE〼wDY* ?QG~>qQ`NôiD==@ug!UDa՛i/Ngsy_k~ H} c츔X}$CIIG pɎQ{hg2W7 N_x(R0*a%' -j5ona;}+l9,0#>~I".d冂Sbg$}_=(y(&R)սʵ1rD+@~S2r.T׶GW:m=L$-CƏEG)șpEWs3Y E689Oxص۹9t6RPpHx¨(Pww=>$Fo1Y_q `R@ZIVuր/! b0 2a" fցfI=;EiÍTb-: {nt˵ jW궃@LWp}8 PC2C?)|~ ] `"c}pa{٦'7] IS(` cVG זYe&2Ly ~Ȏݩ%\1L`Շ!nhkM#.SE Ʈӛi r}1ͨwV)>|PO:!6Eaje^phY7@i~!~9q#?zac$r*ɰ*?wE95%酖u 'SPuf/z^]!W3U6<)8( պ(?=A^y>"L)iJjD]n3:΍6A<`U}a ;&@m_k2L#߳@OhL,xYBMmA'HQVrs:J%A11_5[bnzp !׶<$Ci*`F;:ٞކ薭C73h !:3 !߳ߔJ%c\!7؅|Y"A_%'V ۮ5VKIŒ4jk|,)`_ }VAdMy7R-+N2j`/lR& ߐa֥X4TsomP۔9agS2\Eti 0=BP`u+ȃXwPx3&@k1^dᚸ᭽n;lB'N)ly;0  ކz*%F,N`}(XW,߸aKZxxDC¦DX%QHq`nD‰k )g^rhօi`/cGeZ7c$ɉߥ4[-Uc:Ҹ:p:.2Cc ,㚴2p-3v@J1lI}}uBWTpl5xm#w.A!7)nA(3Ļ;XalIA@ !}`g;q^ sRk&553QIKjY}֥'ӣHJ=tettR4X.o(? }/~ϪH7 Ű|?Ys߱Jz\Ԯ/'LGMQ8~8-|n49x^zg+YL6}_?ƢA*T/ X˿iKB<'JKН7[[yF( >3?{="?p; &] ZÚc(Z 4w0m\m@*/dcYSoor26SQvHc}2/Tu^<WO+yOa"L@m{1EDSh7`-0y 4 F]B&WT㠢gYe9h%CD]z?7C@t=!Jy O^qϠވn:t4:e3η@mSylZ.T Aa?ZQ%Rcag+{~7CMƃQdFw3d4/ # cky ]7I(HZ6nT=M|6^"%_ɞBkYTF%N_j4ֶX SyP{j6Wrk"@ژQ9Ewu!cTm @**.+)sʋ .&pZ]1G't#x;Z%8Y>P; =KZeT`-;/+u{l  ? yS]*F#T#hT(?= ;/nb=PB.ⴤS:*d#x&H!p:4AtN_EMSEi}q+ ftl =;5ɔ <H0A{p+]ng9nUDŽRW0(o =1zLH2C(gg+=4D?U~ V^g{rΚzA8t@B62H} ]Qi))@o9-e_-\C; f~L!ïWnMQVbvLB/Xel3SUF)Ʊ`\Q_6.#t#Rw5Ok[`>;b:sIMɦKn`{* % Jw#7BlTo`6s>MW{X n9_ Js$ŜWR^ iHZ+|1}e2jB44Շ g5ײ9G[X["3h L[![ ޛ "7mɢmlZ\8&?D!^,dնp8e+-ߗKɵo؟ՒYL{Ս}pѹB"DڙV=tg;:I{$T̓5}7 *cp: Ƀ (5dg;AI !qZ}'o^,Yru5I\y۾?xЅ (& pB& b4yxK~޶_~KV,﮶ E;ꖬM## 68گ3_"O;\BH<7y0e*J9NçkKznrF!ڇ)0@@ᅵ~-%ݍ )h,VS C~]ɤI@ԯl-|L!-Zh▃I:'Ph#G%جBhTE p$}ʀ2ı):^ԶvҨJC50TMPo z6;gtVez!Ʈ6 XrR$\wS9Hd  ېR^BتN/YƒGn τ\%t·hڤDZK(B'V'o ^csfՕSs.Q+r4C*^Zs9KvLq;:5Qr!*T}pngqV+}NiTX8aKĿەhZ;^ PG0A/ʯu$QFaJЫ>NÈ` j }&)pY],DOZ:U !!)Bx>bGww631dQǪ*|ʟTjLr=s_tr9Hyp>"jݔsWnɋ .3M|x#+$GW@s_곀, Rp[2V@suҲRwl⁲JMsHg2UUg|6za+mA)ftRE3?Ӂ9{v = ؀>jqC@,yv`aI]qo4 .ٴK4>lE 8LFe^Tc6k zE'䫗:-`bfJ.N+=tQgfV-E\oF;/"W,9j."֎N0Z5wGDlI.ˋtbd,AHh=u)"TEw399 zn=_Bt4j,t&pc,O3亖GJT#SbwQpÓ6%(v .D 8&(pyFM/4ֵՆIjE#{M G+ZNJMm@yֶ%! 5B&o963F^7ۿ~zVw|."|[(k>]\Fީ0g-_#%%zftvŽXvF1Ɍ\"ӌJJ۠P'cgdn’" _VL rDpr,w[TE,Z^"P j*Ng^' Q29糓bbcCGM||!v2<&Yeo f:K6Q$RUYֲk[F\1YD N=8.< Hi1~~#GY"[}sem5߂X3-`'%Vumx \VǨQHwt]g) `tKS"9M&J 'uT#d uþ1Ї*0]np"*.taC{ !Zl& D>KFhKM0B7ľHűӮtZ!1ab%f6l$D3'zK"]s9 _g? J(m=8Zr~w³Դ.bʕp'.G-_\ 0D UR3MJ[p fJ˻iQ dP_i fm cӠ.S h-8|Q/y8DIQ*WnbF0M@XMi"{_H?8d<;~+YGEn2b`'z^1<.me֊ZF2߾^yw*/?Oo4Iz1&~iċET8lɆEu o@g:we\$m.|*cxE f*36e ]R=G*#4k ةnV,/h${`S}#ڮ"DJLhDIrsSt}ZFD%ڣ n3R "N뾐v,}Q_:Y&"N`&U7Ӭ{(&sӉPN4"Dg0+ޏz|yUW\H,nx䢊$'zG0CaaX52us=z/9Fl 3<5\X't+'O5d+w"A 4jcԡҚ`Ѕ,RKs^mi 1ؙqr{x=Zu?eAc V;$ q0-7U뵨?8eG# ~Zd5-!&ޔ2>}] 76{ w$(0p ?esbD}9үĬ }xZ=rl{lX\o"b'̉M21"$X2bӻzXDh9]iu~#.+}R Vm]@Z@@T,-`r%iG3鏑&f ;/,X:b8+7|6{` }9#-5[?n|YD&giPo|5,ٷe]%&mb ~}-ϨES$ؿ+p涊әx/XCmg-]R[}-:72+E` C^>U|kyH TΓgjGu9,FP' l >b=1dc1rW OOrR2,8q&ZxzG>xoK!CQ gA ~Yi;52:lh=tl WQvbQ ;j]P5m Sݺ!.! H:e!EGGxU6ujb>0K[US3cAzvKafTd/(bNUi g-g@枼ᆓ;Ԥ(U}]wÌɍ#g  žF99URD=fWs35R}L6_>YWta+wKGA?#N":N0O;m) aH[ӭO d$!D`t-ލϞBt ."}rAfץYX"f;rR8[SK\k9{}fd!|7}%ZVfv0UOy-EIsb-Xo^e 2n'|&` 0o.c=5.QK!S / MogQ;49akt%dޑ2ԟ \aʊ8+)ED8#sKEȍlmˬ?F s}5( /q2  IW>sȭTnB.ȶĹ*%FR7b"pЬҫ]Nnqn|qDH.`9Jf [9`ʤB,UXLo.dh.kQ.DYlcn+"bv9tXbo <'YӼX:LTѢ#g-ؐbTM}#B9^ōk}/.h*Fjcr`nFsgKU79[(If?{>(jBMZ]g]5|f3 ݬa[m? trRxV5 I萑ȟ)Is-wE`)'7(1n}I9iuxBT.*Rhñd΃g\G;x8õ}%Ms60vclZg]EvEB8K%zs$<3:*{J;}'%5dԛC6ebЯUbMzK2z!Jz)4|Ħx;\@U4' .,cV*amߜY;H4s<&iӅ ٙrvwf顿#lICQ$,WYjUE [F$ ;K29j2b_,ze_|ߍ. 7riXrJ':|I/gtG?I۾+2))T& *mG\+z &||%fH0 )O}9{BOݝILAz>պ>`@ޖuAU7i jthUdɢ`Fn#9VC5Nš;s44K U9͉n#M/S=+j>8q"_,RZ_C]+KoB0^zUzCTNmTeO}on:"/<~*|M8BI/{e~,SWV_$WfԠ {v[_ ޳`,^膸gwTL%_*c!~ K%_=(Ən94TbXIgL _zO}D6B{ۡ{yz Oi_nɩQftN;qäd37!o;,~plBX-SZ}LB*Nh.6j,Z6qE->M 9X'_9|*64Y&~6eסVϝo(Np#>2.Hs}ZnN,~ EC3V'mϨˎZ؛)ﻃ| AZꋺ<[(IAa6!b\OX>T.ZæK+|UDǶƩ Um~|yeug`mYv@n91RÙŹJ*%@;*jp〧wnpViDwD>7U}be Ҷs1q['z7AT2oN$3ao\n+vlh"F>!jK#UA#Tenh{HI&p%s=JW_9ALƽV1G@ƣ+ۇ$X&2nX+ 8@yCpܟJwK,EGxWDP{-`krld[5,Ȥ)6V77xG> &M܁8>mQ cbq/%K XF(R |j8Zqo:$$fpek_.s "zǴ߄vmN줹ó_4C9 uTB:r >1>ߜ>6 B'<;KAe[no҅LJ!;;FIQb‡D% Ot@ӲxEF,pbCoc-Hv"^Q*Yvo\|Sܺ(4N(͔CAӤ ƨ3JyPpKz#ḷm4}"tZՁBP93,ﮟYiahie%2l!V\  mNW^I0-x _ew0 lMϏU86o/ju9*uĹH.u+ vi5;mG9pלN~|.Өm7i!@#Q/˹)잾އQ= H&gf[ CcYp /KˮDOeI#^;i"[F;o@ zxė'eHB!ҳ kqV:ns,(O `V?(<AW7wo'g,ҥte &ع~leEʂڶR"%QQoƧwn&_+ص1%:uJjZ: y}v[~ۗ(3:K3]b(xkK0-%X1+)6M">wR·{ϔ;BAl- Sn Ms ;ͅPɯ߇#ʽT~j(MDH/ub^J4zjD~c;X.$/"š5]3=EKNH"=ŀU[6;kn#Xa1"}LȂnl=aR=SX5a|w1m^3}UGPdǫoAhhzR5_o]4$H`{F@VV<E螮슠"{_赐տ{42%]]'nf9;~"8*)JnNPGM/^`ҸbU6D Mʢ[ *@֨q_*iH1dH< aӆa0AQ$"59'؋.QDSߵQ$PŨ]_-LYЧB/KYlyp(?+іOt}NNtTL7) Ì,#ЗBsUDvu1wJθ,T'j<ۃ4y{e`Uc*OBNU]]y(~LUU $bW[*7lc89r%hrk͞u| #+)H+j\= S~n PZ֏l={k#+%*Q+sPwW\ڽMkxF!mh[7g}?_J$Yhۄ">f*"CRFNa~#u?y$gS S_! WoQ1V(!g 2 01r}`Pܯ$-,(ѽuM$(VR}3s#LLl2[{U Rn,EC?̸/(O2<° 琓B8;TpM4q+1Vx:1!|ѣZ=krV?erq FPH)vr[5=ߟ؞; ݆EYQ  3"5׸;Px}NKa4FVq(3$+'x:=&[cK'NQ?e}5<6`]tE)PTwF) ۸*CH !dﺌ K:ޚ^^݅lzl,NqMz?-X>Y iƃlBMʐ{M*+h"]_V]'*7Yգk%JnOTkj/-7 P7Rv0a3k~} ,8`bU#B_8P̯үW3½˽3б*jqlajKVp~1p}ds  wdS7J@hrPt/aٙ[Ɍk#=˕^͔>%Ǎ Yhcѹ|YzGWjwd|2_v%Lg/\ . _P iCͮƯ=PhGDZrp|֘fU7P}=x\nt〓ظmվ]Z{!gM $i=|$eZ?ܢd:\+7dK~'AJlrsE\.-Oh(ot }ov5EL#Wg$zyD1,:FAtF P\ hrP-W ͓40c->52P#]qB<1%_&ig7?AaӽUBZ$<-z<-RGP[5|$U&neVñ:R'Ż'4tzzՌ |o5`.|ɞ2-HiMyPn4ع6xT#E1:LJ>KZ>'h-)jxX { CG5,ȧ!`dwE/mXrxYMQ`9Ѷ:ɋ+T0bњ*,ҩa]suH +~ݕAYKx<ˮ)ېM8xr^|wԀYsATמ?DdHhZ쫎>LvZ`O9tt{ς=(E -PۈՌA^,ʈr%S_#':Yxt8n0JCF.!䙯c5!]?\t)qy2 հtTo#lCѠrIlw}buq ptYl=0NiCKJI8/ˏ)RM}c Ȼlw = 6:ŝ%D hs맂|wJ=gxi ԆS hdP6;w?6AkvײuL-c5S(n ǘiNIlJaz?ocZNS7űl~_a/W"u>9B1yضy+=b 0 !`h=Z4ߢ$BR983Ig!x_&H0 V6!LJCxeƎY_8_Ix!vF#|e7/[q#%̫eMa·n|t҅ȼDk =?ܧ7փLF|Yf@l1jz 7hI?o17V e"͂o^s5,ڸtnچ'S7c4 ”J67챮v-sQ&+٥dRO1 ]~Q%P.j]fXAw}WӠd ,&:e-b_e%OT7n9 OR[4:Z Z~@DDT6-0$2WjS9 &D~"JXթ98\*"[Lo"2's j /Zqt{[qi6d;`wCC)tha2eLڛF$^GAYRȌg/kx{.mb2LbN(LvNMD˭ǝgWKqW ͯ~뼵&w* )N?N^<Փid@f$0U{R c[m"Z Db1nGGyڥۯAc`.Y TǞ 8v1#K=A@ d~5an#DSO(&8ؽSl8O!:ywyQgt ^n&;;O7"uQ ^\i<ݫTcj? >R 2Qŧ_}Uƃ*8:U W%O?Dde6 Xqv z!ZgQDK}1 >?ίF=GAi`KX|;ѾdT;u^k&W?BψܱFlVuB|8qP4P0yp5IOTAPE3}X/[챰R+/W+Sg_|R2lc9 RrCб$ZJO{ "s,4h3<<ӆ3}+tmD[{r_?,ALH%\>^crY-}:RLI|iǵt5(iaC+ߍr/ifxʆn=,h5T>IR>a0O5ᕻ_]ތ TA3MxKk^YXI)P ^ u/ ˽ ^A~oܻtvY[Oa7s.*9 `F*k^~E7חSSgP>ۡԌ:q{pƿ*8zAyRPa DXG0t!Fj1בV wpX_t;R] ѯB^[a"ⲇqhR*ȡ͛EB :9ujhr(!L9kqNrqsp-hx+w oGqRv?IiK}X_;M_\߶(q9m+aTa^VlYyyW!g$OԌjm@ wIMajzى_ۂxjE[AE`HNfԒ!)ZUqtdIӍk#V^.ZdILx /AEw.cVpG?Ed챹]؂}9FKlU+nn}1-a8v7pX'(qy?gŒgBVh~*x%Nlgc'ʤVBbI|PFrՂ%H/*$aM8wA8 e;ɊL ܎)[1᧖!h:if|{f\C D_`1"{Ab )99$DSG"mG}x$0cmM`~Lq(0qtc pIbhN`Ta*.=Sƌ֥l9=Qܧwdc{ォ]CfC/|hOݧaؠQr?G E[ZA\;|E#C$ J}ԇLz&r"5 41r K/zOV2"HWm'W.YTx-"!~=I7J9L/4}q4{'3Z*ˬMc9uQOжCDDpy$7w ʬCWVd] þҠL64Q,J [ 9^9j0hő׋/.>11IBvn0if N̛G:>>'R8oa+Ru?z u&aV9̆aACb`KIpzޙyx[uL[OXiC!򍫲2cޘ'Гful9+ܢXc䪣^pS4 s~a`4U 4Bk;5s!I{l3Q+Ĩ&1LO1^BA:aB4giB۩ߖx]M`]0Nz"||v{ ^ ]Va:JDR]o٭e8z$Ʉ~= [vt[modZ߰n{#.A uv  "_B@)l`a:ǿ/ 6B nK1 uX fmןl|B?4ݿZi`W.!I'`,!:' &Qk>IUM LW̿C 9w;GjuQt?PV꼹AS?谈(=`)cB9|)~so$e:qX}'qcӁ dBLOe^mp[-% +m p  pD{,`uo2V?4TmbM}'y:ݭ6@KH$PsD(h:[-<.[FMk?p4snq>֠wMD rZ8ò+1IuԘqo/-@dYT&]}Na4-.R{Q%l7V:D8T#(Gz/VF1m" N^ʆ%\TGgHmSd x0jy$-vAYKpm5K%6N]i&&WDq+ˣ(>Q jEoɻ7B=GA$DoMͰh<z sT)9THNIfx Bs0`탳hU|8:#=0AmlxPLr'?[Ee9F ŝrnW҉J*+gA'qðּ`I~_>?ڝ'K6ǻ N0Z:+sN; ]P;oF[E6Jj! ѷ"RtI1!<ay<]Q^-U*҈_l&Ѭz"_ wZ\pD ٧Cx# 8JWi Ibm46dhS6| T)S9J5K0WlJ5 c@^~Nk/Bq=H5deG4>w%[MG*ΌJps|8m]z0vu#ǓMU9f %w}}QyKϲ{(FvZw;fA`%*f{C\zȅ ^i3q CJF'bm<{%F[GU0vZ1]N#E^i飓LΚ:DVWhRgch9U !xafny4ڛVbԡ\ң<H垾`@n>Ydl˪CK> PJ moACSmSG yXsv$4~k\PQįB+ocM^žFO/6J4Ap|߮d%D$Rf-<52е [bhxd * n6 QEK`R$bQB9ַ7GmHBy`ḠgG^5<1'٫+Oϐg\k(\J쉦@Ca(|&#y&Η4`fE.ɕɪض|9b1庖"eϛ7ny?6^Os:l')l˩ju`_0K'÷K$RΎ>|A@Lnu(:^/䌚%ݎ#I,w\xL-Uap ,Fy(Fpłڭd7HGJnRKS^ԜEmE`Wz3T:6?ݻNyL~N%-t}g=E9ӳ~Q/ UFyLc0.4;S%@\;$Q(M}1ЮS+t?* \l7wb w}Z*I,>c|x^vqke|[݋>dZiy[ @\#Ud~>ԎҳY ХР@oeU4,0K>&d&'O}st2ڋE 1#SUvd彙G/Js"L<]-58Ni#^1$s]N+rU;YknDծ ?kxQzM$.ƆZ֟Zq||.5=ѺQ9賶=?>KD<>hGk[Vf;qRvSv6|D{_3-  $eNӃ[-sk[;.7gkO|`?tj({ |k}$gl!SES*NQX;o^6?p= /W*.6 iI75()`M?h?J.kIC"̄(FO{.4L+c>2_ٳݢ< q]FCÄz#YWFYzK9(O?cV;t}J`|J"bͻ>K è45JQ\j^!5A~6HQ`hiؚ6O@WTQ@d;- 9D'Gp+;K BCv:Nf),-" CںFN (Zag|RRnm=)D!)L6a#ɦ{i1䨧 %=pRh\eX ^(۲\HPooAwzp }f6{%5aW/A8ۘ-?V>P1b-(Dy7@Ę=jtSqz #g;4_ l_6g-lt9y.al!AgB9@rc‹dSvҭ `_>o1ɬ E$g ]^ uKL8 &VV2E9^j]xfPwu;uO(?Zc΋?S704p@UF8*'slY[2lxRaO,YwV'#Zi]LͭdȲMI9JZ ̀fŌ7xav/7bv XMDZ5lhv.iHˡh32;/WfTwY EnQ^ `]@-{.Tc5*R~\VMoukȘreL^g% n.#d pֆ?kQk,/дK׭vw"iodS{mKa޴zDtӧۍ6Ekj<*ۤg$;Kj_$ElVOhedSB{R_5,l2>)~S䪃񻪵}`E հ@* {ad4vǗ. PJڼ8|(1(*|NЄ)@J1"'Tpr  Lok/ߓ[I^I:crqow]33Q{A$YihhZ80J9F*:ٺ_*Y>u&q~-&9?-mpg_X=iۍY֛O=Ws`âFQvͲNcɗwzb*rQc{z]}-gerveRP xڹ Rb!@U;,ݹs s) ys_ (GN'T7ğ-jnMɳz/ <Y;/ۚ7mNכuFqxoEX3rH6t_ `wF0B\*/\P/`` 9 ߣ0s;^=Bv]%odG ?Ρ?qV vv@3?ޠ߲'Mj;>ݵGG1;U[[=T'n/zz.g{UkOWu#F߶k9w6+SٻnCMj"tXgB&ɛ<|T?*aC%^YZ?.)ɏ9ͦz|D;2f)oW19 vKćYF /h(+P4_t À[Taù^3%&\'A&G9G&ab|y'A8WƭUl5XEbw з7M #>] 5A](] @`]]TeQZ`6oǠRD?fJaiAo?ńf;4D3Y2;\QΜOm(r{ *f4ԇQWkO0_l~؀=|OsOKJб*-dMd]L34X^ܹzdHmٙ֙N&TȺ>{4bVc܌}Lj+r^e&=Vsܥz_w5jxD+"z]/Y98|ű\ {%~Vz&Fp`x-yu@r.hk Mmz)b6ߺ&|z8\/. 0Z2ȧbpi"X6ƂK whSg\ώ n6U"';h)1 ޹3hzBsQh2d1ڙPkA] s)?5?vəmoUf] $BaJ̪8S. M\崋WDw!-ib_y KwGtN wp*^|BgCd?"eUYDz4t&UJeSt%ql)g5GZBG"ՄK`Jl[j hfz~ YwX O M{FlBv7s.4Џ-zUn]Qn@QdTr{";ͮb;gt[ў/v5{;[ JT⌱%Me '[LR6_ZtMF\ή<ϭ9Gh􈦤u45?>˜[ǥ@=tP B .b^ۗA5W~s?MszkI~-@]k¤KΫr5k9#_.$OF窂#[Ju@ςtX`a,L[&ozȏ:uIc=M! A 6~VPg;$<]R"#Y1KZT|  m5!HWD)ꟆK)ت.#}fc>Wy9$pRӠC BT99*U~%oy M(C֥M(txq]{}2<)&AC+ޮv:Cֿ?NTP@!Piՙ5ÔUpgo$(?*kU 5N=-,Λ)ijh=*ga̤ ^}8JҒvkYO Դh&_,0ܯⶠgMRPdBU~b0"I "щ $*([ז}bYlx?q.& [KXϧ -`kUɻMyCɊO.ghvbwmR#5뱳TSpβ[=xL{uz}<#qg>wث`Y 5HtN/ȠNu&J X<#j)}=4څ&<< QԌlk]\'tZ i :1bG?5k[M&v\glql>j6\J,_Tv}<ɚcOc~bG#>Zz7=sGiikӟ[87VO'ĜXMٴ ]w{@Yu5f8^롣m#ϧB 9; R\D;#R</ %_SÊJ59 (ZxKt]ޣ4;{Lr] 0LMvu_Ǒudb0$|FuNĐCiU0)ũhYzRL{or( Q2$ r})|~Y#&* $z*OR:|ŒzV`~x H'`qZ~F?ae|a+aY 8DP_7N =8MJ2x!yg\2bN}:jJG=#M_ŗZŪ6=L9VX-.-Gڱ[MLUq7;څp8*=ݯ+y]}ym.ϢӔ7Ya42OW=J'OծT :mWq[@Q ?.۷/=gao7:gpPw:<SCR?&fL ʡ ?XFqbXGmP˞b .ݶ O^I =(tΘN A 枻g_j-T7{Y P(eGXl,uѸO<=2v. 0l5 hg`{JZȰFOTX;M% #nŘuˌ _vD4[Q0u`t6Vjږ&nrؓip2Q{hqgg Էa u|`cO D T? bGR;99mW!HiR&qzZ|z|Sۺ3g+ i)4ۯ~Ƒ$Rx[K;ۧ-±8= $ >&`XڜRq]녊Q^zUGA@ѾIs=RܦRyal>_+܋\8 'HޛWF?Z25D=w7F1'٨+z!EG/Zx%vi0c8 [6瑱PEg?,_b4s+JlVᣓkV_uչ~X7oSIp8[N9P~kR[δDLf:;bO(e{w\!$W1,}#Ddoh_1]cj1&WL[:XɁ/7~5M*9~ G(/le'+*Z5?rcꮟ[z¸/l75&\<V Һ=Rkv7\]Gڥٷ6nj`|g?X5<=CCw/Ț_#k*{f,x&#AT%|`GiF#7\<Y0L QkaÆ79 ^ ۡ7a9 ,BQYHVB 5z(N\2b"hE`,)l\~!HwX|C0za'+:U_k՟pיt/0*?T#N7~"R.c>=wQRE¯UQdshgT g1vn!Fr=D8g,&؊P!SAȯ N }{n_!5P8_ʸq?"`=xUqQbޑ >0p#:‹D[sݒ[7~ 7j,{zVф0X-r YX/%ѧl)0׻kYde0'-O~M_5LM)ɷɸDaI}$O*W6{m3or} bPuvNB>h VD;hXlz3l-Ά'\)/3%X6$Ts.u^{ 3 _@. !y8k鹡'x?}v̨n`P(xB 8(aOVjxq&vר <նyW<6y? A@FCU @EWycgxL+BazHX!$A;䛭KE` nD)¯ uU:I__*bwJzy-97?tM PH(rL>i=ԧs(MǮdY"ݛHb7U·} Z^W>Ay5٢kh 􄱻s9t-pL{0o-(/ YJvf85Rמ_B.l:4YF&Vi䍐oJ_ 5o5y zIFE0Қ&ti\-י| NLt>-x00WAy9O:wN*Or\{˨`$_ф-K,߲ȻLU'A.(/mTAyz$`au9x@-}u' ~PiR+v^M74nOh<ı0ޱo A/`nA9z!//7W CtϘ''mQ*@'?SF4 QVxv/=~X·xrrG2 j$Ɉߌ}υ+vN/&+m# ۿ6dS;z]ffax<Y>kƣ27Yw&\⌭`9?~IHBv)6y~D3ێO_/9kl)Kg>UQCaelX>:׳d//&y{exi;X77`7|F1bM!*3g)o0Pѡ,:c7j*ЎÐ?(}>R +m"52~ 0=ztf$$۞gPsP-+)U^e`t(C0TP` /zH H9DP"#hz'>v|,̄.Kh;Ő/ny<˥! .ՋEJY4Ȝ3⭚m)$PD% YPm~"7ƍJrG Vӯ֌үC?͉|ʇg+ 1Rν\֟[ؽ Ƕ R~V;W3}*1g\+KZft9J;$mӜFjiPD3e^Dp]}H- 8F%0QOiJ6@]_zduPF{J@<($(/?˜wO|=ђڀxjTWր)XH&r?5xS\YL-;̷@zYWNJQ~`+q6!7ٱ'Yn`?hґ+ <wк"xO=?>ۯ!Y(CT5p9#), ?tInؗ t}H2O"D3naB rg/\<h(g@=)u_|(Ar ;xC;w3> =ڗ[EgΧuVt˗q&?z.}m3M"bmp:JkS'vqk^bXw9|G}8\:+7jJ}w4i7kU_;}/s%yPoOe#2{Yro A"0יY(5um0AO vH=ZP\.T6ol.'۴Bg?j (/7T4 ۈ"n" F/7xLvt FkF)C˷wfC}uqZZ2 {^ã' sG(/i]1T5}[s.K@qST/FNުW&Vn)r>EAp?dOfe· о7-qph*L7U\(e?KB( ӽx_ogn([C= 0 NwPp`y4d2Uxlýp~H- ,gR=>6A8{e+yNZ+A/@<U` @rb `fłG6zӁs U1FHg53ĺ>_$[ XY{8W֦W_NwWǂP.ź,ުnQ2 hvQwdfc27pk=mYLĖTT ?N~-[P̳z J|Y7}h*8<'@.>XfFh(nh&'1=rS4b.fo1nn,5\X}&>ҷHԸp85aO-X}G*PJVjNSNX@BDhNaO+X:։ ]%~ѪѫWyxߞ][׉aW(k߯S*SV~}"R4s``ApIƁMǮN -ۓe3BBl>ΐO2d>XӰ}vE֧ez%l)M~C7{8{罹NvJo04gPez&tٕ4„aiyN/^> [%3eKrrv-ߘ78l.@áiWS"ٟWW2S ˥HE[sKSeG>l)o DVî`o*T`̭xܾ* ݹ79\"=f4z5-֩5,S;;.Tyãf<'ElEMАTZVMt(V%?w٭ݨյsY(sDf&k%}渹 ZT^ Zݧ%0^Z*8=6OmxU?>FUf>*ߒt=yksY=D} ~E3KKKL ڶ}g[hx]n1]7|9d)Su '[BבMT"u`fc૓W;J= JV4~˟xq" Ϲ/~ywBoB/I5mN?EQZBDʿf;Iv87ȁB FroCL8ͯ(7Yd7/4\z[[Y2̝}+º-g+sY)z,qFRM ߎ,Z_`yWowˌhYg Z \/qOQ~*n-b3& J]nYl,(~Xis|?+𔩌`(~CϋxO ύnlFW j+qٔPz=.1a*Feɚ!%s ^9F%P巵ԋhHKW6:HyLnK7cKhx|‡~ڽ#~آRf,XUs :-i*2Wf|=Zul bgt i腠i[ʗq[Df5V_Gi^͇c ȓu$7UnX9.зwQZȷ&G43ƨ2(Ry6lp#W[k[m wjeSMGBQB),Lć_+' a2Lѯf9]F+{5To!)-i]_c/_ZGgD&ډsaCd'O>ӧUU1q)̵!ce2F]"㷡e [:s,Evwf=;{3/rt@`UͥRy,z_Y_~]vI~z}=O^ԽLF*@2 ;I/;ǣcǩ3۹A-HB'v!mcE+UܢΏݍ<,ٻ/'&K=͐gYfS\_2i*u,&| (X>> 2}mL'۝|yj^6AVsb%CaVl]2X*jP6YU V9e7\hi7Po:?EO^Y\ #`Gzbg&jD6OET<˥4jB:RoJNRnK#@k:/{!YQGoQLwACm{fK g&/P{#$Ys2Tn˾"{-5eʟ΍X$۹tj\A<ksºuk% ehϙjo+*^⎺ޢinHh/:me| yE\}ep|<\/g2`5'`- :LVy ~¡ W0/cZ_C-,EТ 6mLYsإy~4t΄n+L{ZV6zCC(l>̮*4MX5lӨoη* bXN:P󰋹D>tS_SD_6' p.}mlF,enZnq,4~VG(U&{Jgy5!(&u}O(f--qބɳ/<I֍K˳7C3 X/e2IOh֋ꍨCTZf}2Ѯ4_+꫌ʃ?l214gYeFxׇ2knYAm*cXa@ne^8^`X~hbXj-ᬣA7ɾZ{\,V}>6ZXUe tS(YX%xN׆_:B|NT]oئfªQSSA\|uTXUtGÜ, fx/RzO뱆7"[cWX7{/yyn[ܣYȟRAwԱRH Nrlz?ɳ6/dC[ !d|x 1o66V_%H󔫒^Xѝ֯Q1N2eSjGi4ujͭqo,><92.փ-tSYL3ʼe]LW9tvY-䦺ρxkyYY-l1#;_ 6Pm+aѨ4o^3ͣ4ZЬ#oTϥٔϨ,e_&x3~s*e`W;fz:ugYh2ʝEDQs\#Auvר L,2RP !q8_۲ҚLu6W6m߹VN<$DwAk\cMiش_Yybj4 X=ssXjfzX-Q\.Gw%~2;LW},J)T + yW,TwΑ'·w>#`=](óPG-xJ27[ LvCgJ%m$Hy8k$O`l )(nsԞיKfgPkZ/)MD86QWkTO>+H; mAG[}̸s}y&ԽhS<ԇf۱ymݗ㢯Ekʣ:a]kOc} !oTSzZ6kӓcq|*`'*M9c-s65,sg/U| k;KlfV͏)xwU^jU{(ѳ4ϼao)vSMa l[V6ZҖQSN|[f`dbfIRڅBô[7&\PMtrULsNk3C+:C,)-ei߼S&{f^E5wqw:`L*ցMp'[ޖ΅t;bo:x}Ϟ7#v.G~֍JgE"XW~wjvKDv)n-jTQu3I5) p|7O 8חsuv[ g*"pE v a8:/_URi_ n޽[Xs7r.sSc_KQFo.Fy?a9ZVbU>VJ(iAu^\3'ftuCRoNU6ey`Egߚkk%}VZO>7r]j϶on.fJC`*VuG+o&bwL{Hpl}IiJㅱXzJUuOvQ1|q'|Y]oνݟ.F֒c\nLO[Uܲ$1yDB[ʬ *о &^Vl8!T\Dz$@LDדsSon`)AB2o+=!ry>*Ar6{CO5ybN AfejjZ ;1e9)9AٙYVNaRNM0RͺYRR B4Q69f} @],W%Cp(O_> UPf׻x.!F?.O4JBppA뽡z^L/M\ %fk$2zklBYv/Z|TeiUuh4WxBK},n-ÐbbСMz+[*117wL5gilsn=n*CGL_γ&PC]QyN# YgVVHľIOtlE%cUu2MnVΛhXWMV@2W4z9uɳukNM[8Õ1-}Zy4| ĘSlTRmk2|aa79}ӱp3}^(o\5ts$;<ڋ)Ok/Y8_bYM}7s`x:{N7@[<ڗy/΄ˋi+~ٿzQM!~-H%)>VSvB-HS8IkOGN\n)QH"sSRh^X$; Gr._2t2K}FS2""UQ XumrC-ku*tN|_{="mv 2NK|^}2ū$sYQ;Β5\OɧYRUMO)4!Yf{1AVY=[6LppGﶽ«0+TV&AVRW+Sy8ݫI=2xg6Z74|APYM^ka#=:BwZgl}([o,I>i9-'O9=!LO?CV.CP5mD`j}Z ת5dTľGK!V 4 .h]Rk|a͓ްC&Jq}Un~n)mv>UD=_(_}f̙vveQWwsdrX{xոN;YӸoDq, _v_tin:܉VFQG1(㛮#peFpOh}|j߲JF1IMCbL;Ck %qh;C|&6Ͻ^¼EtQW#ڕ,i+'gewP*3Si3țww \a/sg3Uڞe:yӷ)YNtt ŸJ1fF/T;ӚTMbi9$Rs%UM6)h/aI!Ro|ǃ44P,i-i[曳/Yv~#y$l]ÎFJ;,0dJe@&m)n!Y]3V*2R |gA'c,_? P.fpX@],3FF@$+Җbfg j9\݃zs?R&T՛.A3]TIl(٦z*ew昕;|Q##Z'mO]JȲa0j 3ћ 5 &=n }*X,ïVEWkG̭ȓހC4ϥ8|?y%⛀5ڮMw#)% +n\2ZVm r'I%V@fBsW 4m0#'#dBz&^kn*׮AK] e*Ͻ)߫P\s0(ƷxKgT9{֌{ Qߩ<9Q^hT0iW^OiI0sJ.!yp%a[S۫P6K] KL}r&Ȫe+ȋQBXl=ZFiT[~2L:9=!҃t(ː2zj tGy4\23{9v^7+.W{GفaK~=>bVnh_e;Gtk=Q.6l[ۭm4Μ*xIA(\4Z{oF"' ʱ,8%%!Z.xz_H7|@KE $%Vsw}/)tqs!j\;|p 1ג^F!X AȖѿ"tTL%]E^$q]Q-R8$:[ewOFԦ7y˒Cc,mz؎dx6P(G0ߒ]|Nl>e̖xP7&t&#j,߁ zp.BX< XDIO*_뭨W^3pŅ\.ޤ4Aņ'!cZEeM}Sf3yLJސ1/NyRdGOl1 ?ZTp沥xhJibچ6XkڋLHY{ADo:)d!I&Bbh%btĕlQ_OBf^RI dPd?;K ^=eXZzKN22fB{nygR'~Z 7_2XkN?ˌh[sڙo'w"wӈRl~? \euD]2qㇾW S}L],K)>?z /UMBr@yPZ!=m}xJ1^$R>a}WeBhY]=Uqdj?x7><؛}njZA߲fQcuJR8-Ԩ{]8ʍcLfjs]{ uӗKzV 5vK9V2oO6m]#12jCf0a>>aw+CQ*}ƿkh[ZYwy)@Rl*eMwj,yN/ku.M@Rv]]-\T%2Wr:+D^oFVUI[\z aftvU!g&Sӿ-Vd>x*m`\&l{wW_6yx탴=s6eEB!p|Cl81RwYDV#Lƶ=HYA *N 7 >73N.;*$!c Ωu$>*_Na6?9. 59 fT gW4ȺYt2Uwme73dfz_P SoΎއqI`) !p t]UI19ej}s %RUwBf?s›VfQ/VO<4c>0;YS;j~*YcqD4-E^ ӢřMZ'!=SQ+2`1}j3eŻCz9.=;c4*yb|wޝixf.ط<S^ |K].yNjn Io[m@7oi=AFz+,|'O6o푛=?kCj1oU>iۧ&tE;r24-pw;I=x*D=_VwSj `֣VGgBQLnrr@ d'j?[`ցцAD x^ҰE޴vpqmSkWnMurY9tbvV^-my9ei[7dWtMF3uT!:8lWcM~L\]nDŽccspS}AdMlK{m7t#c/KImh=SkUW<\kޟjN5R8Y}:vC(j%OrvثQRq"\+Bލ5&/X̢ȉr6fJ#/`ӝjfq,ߞzճFHW,i`,h(Xdˎj31i4.%ᯠ%ݿA4e`8ξI+ 'w-DXx}SDŽ W2bײO`F bEj븆 7;0~g&6MC~(_(pFjV9](^㧍T)Ǡܢ1RmOiV8Sefzrպr9oH~ &Zo2-mONWS̕A:́RB6zϲBy]_+=:(D 3 e,5@- K 9h^3He0?t;%嚿O!ʣ@ƪΚr\I9 Gbwzx*!k vsa 0v{) wnM^m5TNz^]A(0VZ_)Z%TJ֩W^WelBzWg_5e?3_*ٗѩꙍϵsrL m% =BPQ:/l \<Տ#O~b+DKxN J$yqg%[٬n^}Chd^Շ]%AW ܺ(a..2:KHTqku!>n}-ނfz7n.y[PNMC)ߙ+UItsTJdE4qQt黇vMpT#.\Kd]ǵ;[Qo%l㜹 5F /FT '/W+_;'cb0L/Id)dJߠ  !fsuަ jޜwQ')'`qK6QIi7Yd 4u^A]TIT0xl So\3SO'GC6ڮV8e/uߤ~ߦtt(\,Βn߱(BiXH&y']Z[̞:ŃWcUi;a*e-gAL.~ :p }+ NËkaPI~N'ݹ`<7T95a3[h*IjS!;)UY[m\wnT1Vie*olwHrk2юr7BZϣ%:uwzM6,P}9Fc]1=n)\+;?/6Ȩبk[&k?:j3iCu;z\#T3=Mk7 r${o^ԱH%aJ'oƻ.*eScܳg<)C(Va/u,դ!b05.ljF TOrp /AYѕlמ+( Fc ̯1f8:3 4oyL(c'[g5k'F=.֙H/нs6{=ӹvXXǙA`oj-Lވh5{5\n.zo\~wg14 WyI8*RJ%yr7ɍ#/2LNL|;׷lsXJYKc;znvG:7_d/sW^=Uv4WM%X϶>]-V~;kpnQa5Ewb_=jB>#aeL{+.tx4k *g2|y2=#N ˏ:iShkMޙ7O?s_)(pΰ1=y90 tl/Ω[eGy=̛,]ZT5'_Q,BO6N۟5I$x)wi ":MdP8Rk!S5ۢ˩(xb¥?"vj<dH l\2?Azt'z6ZQILZf @Kg}+b;s[;)\k9!IѳN,̌l(ƈ Ыe-ǓQP|'fɢǞu0V;H`!<|rԢDP3U ºYnz;M .ӊ%rܦEgːRMԬ{ql;uzPOa6vtb:A+!$&h߃*}qsлi~ eL*EI3Sw7{C{g뵒{0w*piNgf wY{)GY'\0Rׂ*{ѮމӮc&Q0O?^ NsIK]:-QӄDQ}ӭߏ:͏C|l4UϛO7SI^r=U R 2wZ,pٕ+_%X݄GlP &t"WCѝj);ShJO}煭eE=_LnZ|aXokAk`p攫RBB#>F25LUn/z%Xpkg[us<|<|&|UU)lhau/Ԣy1rϭJdij_;zKIY3vj]Un\RwM_KWc%jx}в =Gaظ/lwFin0) N3wMu M̦˧`IQ,nyJ WwiWk=:XU\\Ah^{4e9SSˉgZƿ>Ne_cAN=>#Ӆ"4GM3PmF@/S[{I|i:yeyDRkjDqVp{8u$Af2YY+Od{pdW<~#LƊ D>`7[C "knpMgXt6r>-g#XSׇ5JK=yÂK>`L[ 7\.U[0k?򅐉hx)wn19bsdu o [&i7Bv:n+})5wKwt#/X[OUpr%{VwGX̣V-:LjK/秗ЙylE]A:2g nZQ;a:dHm`6Z#_:u^m8s[⥙%I_2SGJs7S2KT@Ŋ_+[.e+g|*F R($>`TuJ_D])ynTFa(Wߚ2 ^'Z w&IW*'omh!9djpc $x{Cݵg>peX\%sn~T[˘dR@ۙĜ݁Ԣ$r9L^Ish˵:Ղp /ԩN2Ģ9Aԭz?-+plLhtڋvZ+zXѕ(UfvОiN\`ϙoV9t[{d06$q)픨 lnXl: B=Np<5?g|_7z7 NӟmhEy{b+=6D߭?@bޚŃ`FQmF>2LrjQl/ڥFn~>'ojRѥlҡ+}ULtKM5a|@FaFBqx@`ED2i!sP?M<@um޵%M"`S9I Y;Rr=K;X|ƧԨq*~6bM {uh{zvE=nڸsdph(V"UWD_5„<[IcUu@w52 xj43wXjj=ԗ&VذfY5-`$BeR4Q9L%R>y՗XvS(\TtwYHuprRtF;ξ@]rdT^0[2W}WEqL0`Coqa,KW ƴ  Ps8mm5,{*0]MƮmdC^R&:лST2vzg ھM>d,zovO6~乓5j0\2%aܭ iƲ}հO:sgRj_<o3m~}IJ7L Q\FfOlYOhҲBu=xF9;R7*X#S2c-_{fM뉈L_Zj@skf)GEh=x^j*2{>Zpc;>ikZU͠5V{Xָھւ頉Rϳ|Sp 86Ʊ)6xo/ 6@ I0|:A߫Nl4Wy;EO}UO2Yăl>,81GUbA`tcX=_?h=|&TnH_Ob9Fix/!ÍE|<8 :x=o~4x?[  *B}dcU MZГgVU޽/h`HTN&Hg=ӻ_PN/$DiDsڰVj!fǟ#UBr2G~[8`0BL-D*'t(dLRqOMQfs[DT.ח[JD tFqG) J {d ?zoL0]"һ#/TWq~%h=+e_%L&d&6ZrmF3Ik+l &k>f -.S-8F8'H 6a=`ȡ&EyB67"d(!+,0cﵤa,sfX2J.z&+LZ=Cq>TNsq]<%LC7IO}5oUO(av91T϶AJ1&GՋ(orr6- y;ES/aO_ >jW62d $94=( !5XHne m]3&[P Ȝ00XhCKK*<2"m ,tbFjIer߲ND+eKM~p,Kϲ-WRA|Q{Jv,JAdl iޥBԳmIDvPC6-V̪T>Z`x0 ;OS/6mdGMYP&4hdjS:p"|0XL[SgY ߰wII7Z]`a8GHS̴Wwj჆2 䁰H/ʷc\vdgPM5슷IP PQ:P=VQyϙ<]ƯɞS]-B\+Ԁ{̷Bfb~ 52&ug=qe7DsQj^RF40̸{uQoeh\0QO 9Hc#:peSnզݴm ET+*alq,GP ˔L6Î WVPJv̮֫ +ݤ$"1hSzNݕ'рDN6L\NISr G[:NlSM2X,i 1< 5ļ0yF貣uٔ:jEX;F& Q3Cmm qpF8NS7QzCkZ[-jYdTZ5Td+MAg)?_Ur~1@ w$/p '>n(@dR H#}BB jMP6o7$ E20{ߤb*J:}W74m<npU6$挕8j9rQ7ޯ*kz#*{1lZ+)ܖr\?+}PY]e9e/MfhYqboմP̙8*'xDUoT`|M}D_S@U1֜?_N`|ꈹ͙Z~8]eb hTJA1ҚT\UĦ0;gAfe,lJ*77S:2s^7el,܌nA=i!( %fG<SaKZs+6yKOX5T!ˤ,3~f.EˁHN;`f;+m9UUc;o)U+[L4)@4Hd0cTxV/IB;CN ToYU ?ٍə8V EI$#@0ǞNaskVQ,+-Z1"Nqy~,E(2+s#Z7HVI+)8G"7 Sus2MФ/h+v5Xspn"[("~UTbbtfTs l?OKT*Ƣ:E?j?GCq ?7#u֋bZXϯ!U}u)ɩv wA%rswe|GfbyM읒f j1%1V{8l~LߣBQ!N^ d?)G/ U,)ad(0"4_N[Z9_h3U)>./yv==2[dعxJEkL7+~O1/^mv8Io7Qw0xHm/2A˼Oiٺ+La^”2I9M;Y,SAcP?ԃ%:nƨ.ȒY6ČPvCkf \7gnx.qw `x@. 3`87ٜ~w禭&;³pSI)z*!0a&dVW˪|׫-flzx6C{? }l.2;P.׌; T $` oTG"~&lMd˩6YG”7?+b V1Z|!MU c6W]"/G+ʅQh˼F}T #yVg= $/kc}U5 dDWtY/6GeDu&B@ ,8s%HOx8Do@q{+韐tʚȑ'BV;ub-Q6VmYl_ b}xa>ě ܘ+fŵP5siPdWj祻m#aumύE~>z,ר؟gu/YҊ4YE7yC *~橧-d(h-fIwY2t[팏F(Ewy<|xcn>_S{#!!=EU\eV)E 06c_Ii|J}m{&?BT(3#%,s:Ubh聴c-nAa*Ou%94!ӛZiZ{!NLt/fZ(QG3C|eOB:UOR휮ICX R(s޸@Ѷ:I B`K:կ{i5-5oeroЄ@:5Sn7e[%Kg5 h@FZNKVlqislmfJjUT`|rl:s/ֿxH;m 3-v}U L|*zp0UqhW,$5sʾYLLZba.W %nyT;$eՑ"3<-7@e=HF8soOEiU%uo4Gkh D G:l>]Jr ljW'gqеӸT4L5Բe˕li\SF4)Hթ,ӳiگ͍4;l|NՍrb,C3 pN3RoO XeΒZ0 sBNx,'@05ڬe礢8@/C0fz!&V=~.*}߷\< g], c1nHVשeQIn)(QF#QM#гfC1"uR̛`Z!odgeS^έgO ~7arV<!=_ yYZoۺ?N 35*yKm}u+SҺX .c 85[٥.7uV_OsRw?E2ձi~C +gJA{J R컥g5\EZ&jVofU;l[2G&f a;`[ T9h / 3f}ǟՑ)QZa!; h&y܉A5p?ɖi<,槗*k0*#¿ ʽg&.x|O_{SH\L)*#r)O d-J*oME[cSXT뒩PmjD=F 4zmEeϲi ,(Ϝ ]v*x}Uzҙz ?N_ȕ龧eeIAc& a2B=*,ͯ52t%L`.ǡZj%(\rA|9! bBSP2lĭxP>Gc7Z!pc96}^}[^݉2W/R`'~Qw#cu+ )}}SR9J7ȕi#IuVYOb5\jw=q9 o61Ƨ8(GUǨսD oR[#L۶ert3)PaILv)owghY_(4'u}{bNyg>&6ӻ6 #!z9mQWoX[UD_ Q"l/tneu:JS~NݩF !S:!Td>+̌m'djK>c `lOqHZaWoQ 0pqwEzǦ?&z1\šE< mf̛J(xGg63 Hwd!̰HѦsQVF.ݟ,~={7qY>UTݼk6y*EK$ •յ, bۥh`Zeg  E8 iLIvOZO7UߙjTT}c D ֭|eͧu32\c w^ڧ @d0Zw]Y*gh>{F`h$m/,ϯ9 FJ*^OV2捫t)Y`U<6JL851iV*'ex* 0)^mu0SGg ˇFP8fjVRxk6Dg뙥 .ͼeaj`S Q|LLU0}*l5kSZOQh|8UUhWW&񯜁:[{UpȈB:ߏ{9^f1?~MqYTOhV>Jȶ#",>eq.TOm!&>Z*|” 4 Skoa_[Ê^6z_O=\pWɞX{DeΙv̵P`;3,RFSB66P-ћᝣΉԞ|e{!} ]f hN@! ӭ:}iiɫ%aLʮ)8k/ x&]fЕ`>h`UL (i a?KjhN]ev\P:Mẖ[kP6WaVp{|q8b kseɈ `)Z`!$+rwTH+v`P"KgB*? |l+}X/6mR !Uz1<ęik/BheurԹ`e5BI+c!0e߃߭+? 2XΓ7& ׷a6A^ fcEJ@AHȢKdl@a`[KFfёaHp heeQ+dȝtF>^%œj!ʸ)RM$O+x*D%С.5 FHYoq[ x`#Tb`k5 =hIP(FW2N,:Jl E?A|v+-sQc`K=;.h[õ{JD{2![Npޭ ϠH ye_U:\Yfq(XMxTp+z ZG,CbN0zsg]<Ϟ'+26~wPΎt TydR:E63aUO̕k[5`[7Fv@cH`خxEtY^&J{ jgD/yy0[5(RAA>B([;C_1/9b2UbQ@m#*=D24Q!s tZ(<2-L3C* |k\É-eSFʲ*qZ5^31] `>m~G?AS8HlrW,Eΐg=-Nj:7ʼD!A\iPi5woGb~Y ԟuTy ZaTIyVyꕁMrcw2eLvCо̑SL9~ (3:@ޕ(OM xW͖1WWswS;lS|5*`g<qӝ^RS՞3ka7:ʬ惫L]a%fF0H Pf@V`9SLO-qo+lIJ>RrSIC8cy uo8T΅w7YS>,%;I GZzS,E Ȳ1~;l]("3MP TSqa8Y_AdqƶCd3 >Ȑ,eUbûOO}DOn+-nr vFmۆ-=N$ia_2eĴd'p`d\xz|vmvt3OCS$%WaO'Q3ڂY'p3޼bx i89<eP8j?( E _a]Yc6lﱆUA҂fBXUh3ӧ-$ 0~9d;k2ܜ¥mr^LSue߯?6^OtI+&Iqt|hio)ɒ+ kQj"Lse_sqvQQeH1F@U3 mY髏)H[C!zEڃ‚ޚ [Q,39VV%;9Ӯ)3ìIeI5%xM ɩ.=L,BdN|&U?TbmD-15[,b0*zjhJ=AGLgup,FcWM҂V_q3{aֻ,}z`(Xb]6^W| ю71?K*7+R )i>."ܻFǤr_YgnɿYW]lj|OHG:Ui 2Bah\ރ\֫#SxWDS3^Qd{C2Z~yb婲:kS|KM*CL.`p|F3%tgӓ~~'8̔A P y UwL?3-{LJ(͗j^uu 6.5GƊՅNg1ќ5hA}J5۶{7M>މDŨ#~皓q@<=,>e lHq}Tژdi%Nԍ=٨h]`Vyٺ5HBmV/r8Ws-W%BX`4r+Su˓2t.7-6<ٵ뎬& ULw~eMnT$ ;sK :5>Hl=l?Bh̆ʑݞM <(XkdTlV%uFVEӢΎ5W0P*Q`su (8šyF29r 0^}ʪ[ybB2+(aPjmi'dX9V|+Y_-9b2;+ y “#_=L\bɺf8Kul3 xL !ٳ<,VWMhH<8DWk󘲲}2CɌ4!5NY 5u3NTU'*S>s,eIɞlbRK.sPS݆ +֛^lNR^2i|6W~=8wq&N#s$5lB|d7meLO|-^ff e`=q]{l_ε~gYN7V,^n743p }"646|4g9;}msF. gLk@BQyeج@kv"/g_putO晣Й"gL-je=GFAWϹګ QޱGԼq`\ zlBN{٢;E&6z/QH'ij fwT9cTFZllҏK5糖DeeT)n}bb(M'\̪n |! *: ]- MiVP B)E&heU^}#S)Rs 𲷺_m^gЅ!at_{YIq"w|%U^#~ᨇ:Cb_; (|E+!Wu+{me;&>.=C;3u-[ǹN_w @g"Uk zŝk*kJ3k/Y^H{vIfelmɋ3A|(k}td ݵKY! rF?&Pkui@ Vh)ݨ}ab֜biLnڣ(E϶ Kz2юfgԩH/nz,hٞgfֿnYB;ID WCUt ?Oy^F  +i]z̈Nm{_nzڮPק^s{TYNx ݝ>Js'/70XaDH`%:屺|'M ,9$`O\= NDQӯV*ӎDdП'M^Bpke^r̦NUT&HW%a말R=\}(R4lMRe#vNizt¸GVn ӆLBeq5kFZ0HW*aUG&65ӣ,rlc*pl77uYP-[43%++|n}\z6 eeWieV8|:tȔmt@rZgLz\fS\Sarn[嬛~CT uO͍q2[>E"wz-EMLT.}Ϟ!?㸨4"yߛ+mg款=EtraΞ!mZŪ5UL-AٰخXסFR>l#mA欝cѐdqwӥ"Y_,ˢJ8R6[Pփ4T(TvLZiNfݙK: j{*`}xe1+*s3n]*@@#' doc' fjY4ZXX% |lfc&k.0@8=^ /M1*6DעQʸEҊbeMlx,Mug xFO~mz6sZAiԼZ(;AѕV,RTic*d'\ Ol:]7uє_d;OnتJX&U{&̉댴J8!AK6n5iU%$cP}}`*Ъ{#12̡=4KgQ8>e7 r돗*t_2(Q\_IOrEw=]:#T1ǞT~uݲБ̳S;$F r lR/xh`i1=u.y晴a}9\Eeo+7^YQ[9FCVHjG(a1C+)c(}4[Les(mI+E2tdeҡ *&< ٽaѻ#,U'':Tx,楴3P>fg-h1(Is d=A&k; GU+.4cvX/zkL-gਖ਼2)pmK!wڙ-<"hAВ{6W:a#*KTspc2H5-{#uٻU\NFZEƂ0e΢ ߊЊpRܱ跣7-L3c)=ᅕ{IF23a,`COEQB_z{CiE"1Cޢl{XT[nlJapJY&[ZJp/'fv&dSjJltm_Ỳv7kl R [/1ML蓑[7mstJuh7xrcNsMz&g&pXQOY]'RX$LwfJ=V|ZV3i ϝL/~_lª*h0;HrbFOH2#?_ֽ [b`~]sqU[\l8N8=޶Z"O [N&tP.p#>N:rZBh2N])wvE(CYXw 23&guUWʭ)O?ڥuSl *~L{ |7$Oi|6!)Siz\ 1YX_};ȼ<9nC=%# ]d`' gVr[~̔Z]J|Y/BAd-WQ-P̍^sYeiEVu3Q!t_k-* ࣶ/UdW QOBƙkf.Y\ϫ8O#fTj0MMI7[..)Y!_C=3̢yS7?-9O;NUudٽW bVvHUY*g3>Yx_y Nی; uT1;iDP1W>BW),ܳE?pX4=hhN [wZV#*.Py >zU%EC9x#0]#HuՏcx,upP (18DV 4f4v`>(&k,/fZ`xs:!gyKvFB1,2!&5E !rklΛ| KUԖDC\LPQ !Bۥ@Pˡ!zd;: )aIb E26S1ۤtKReF:iVvQнct{CI{ӋUO~xi͕ahy&k}M ,#<[o? @{*fz62,ST@]%H7ض2HS`'dc (\a\dQŞVLD@CD`z2G@ f jBÁp/˿|B)F,o#;ZI922FLuO&#τ B;'qmK"b!l+ @H3ۓ4o`;( &[SIBL6g3baMrB:#eGO:/=@vǁGp:ǬшY MYXTFיʕRdd$Nv9XE%Oha1M/6 Y{= ;y#43nqU,j6.6b)#"d;3L>Rw)Ad<0bVe B [+9!Q>D-7Zt"'/Sfc)?S!T@FFwf[$b뾃^oa|uy}uuJ2 ׉p 'ў>6J;cȯ4.<~y띶oLKpCDׇ8Κ#%ʌǺI }^ lwlu+{|lp'YAt (vO( GCJQ{x{-(1L&xuzsY=_~-QK}@6f4`p~[l;r1$ 6}:[?ӛZlaVh+9w*#"gUڍʭG:,ՖlYdtd X"YZ*="ğH@~yu0ymPhbQBG,CAAcj7μ5.1W1lq~!K9MSD+_g>!ZB[ABbo64 #W^ >M_Pag;sSP 0W2|CYո]*Gx)Ҍ&BQzx@颸zC1P+,w8ɅLrA0p_72w]էslLq~RЍܐ/2O$[n۪5koi׷d֓WYK“r\~^$ʢoRoh#qkEL#C /U\޴8I<2Ջ^EdP^(&5$r#W_jz{2%DvJIYQDTTVe1:#$pjt/^{/}_! Es">J(OE0s 2!JAhQ_&^Dd; 5XsM=>u6 !BLRxJ{-EʞJ'ڒbPR\ 8FI`Bjψh`ȽA-U2I Ř֩etXpu FV fߙ!q VϵIu @8['lJF%`2=!Ѱ|.d~pD`G^iL%SdIcO~.a q&,nzk]KVF\Q+ LI/l>+$=Mx0eW6vpx< ̏ VDP* yEyg8:O>m:^$;A"[CiVn)ܰWJE.pm#(7NPRK;4ElT]CZ3fX2;Ųִȭ=ti4P֤L#1VY-p})'mt0Z`w@}PjbHl.(c䗰I!%P7Pf2ޣWǰ~]"݅v)4YY,8 j,Vt{~.щYܐ&ЇfJ7vܾ9G;y8-t0P]_߰IRg<]JAUmJ9r\`(,@CfD|4U&ώB*UU%=<6 Zťnpd23"h Zt`[LjIR'D9U} J@;x:z (ML8J#"JВd?+lBBt촁e >EZ Ùr(bM54BQKA#L%tll:7-ZzW#ժcAdZ`akABLiC,K8Lc[V6@5V"-amxm𨚿(   m >FQpsSB߄֫[㹕IwAD-q1K+1[9GnEK 1\W:|Xeb.&T+:T%2ҪW(+dF#>Z2$kd2}eM|-g 5{t+c5Q/ |1C]!G'9l832f'k{ 4e?1cTܚPaޮl9?Ieh@ƢdIk̖7J6+IEm )WvYXf2,`r!\ƚlR,qncVf1B+3 b  @UWS>P o KBelP,O2<^B>BjpNW,g14QĹ$ɟ?``nSϠYRLeExKFDaj(J(mWT\c+,!gaQ :ʅv+mA-ZweQ?T)X+6/?JҼa6&d\F*FFXޗy[,g~հ.Tl\{6׬z'-Oce nbꆩqUԦ).'8[?epvؤͅ1J2*qPS˺HNw#ޚ  L`Gw78 S9ˌ3&u((f藮qjA'ʩ{)b|ږٝl$yWUQ%|d({~NGh4 vnwhu?Niݮ80^DM~HkA<aTcO}Q) yrCN@DJԑޅBRj͆g4T~VlҷJS~/5)5PpQXB,$b08zts#+MLs% xndlCJ(ZUZ*XHlӔb20@Y9Xލ"glIo^*lh9ti1$ C]H IJq;KxM΄NLᬸ O/v*ma)uVQ5[~ ˨`Qt3+60'Hlp-7,+'LK< ^¢@ r+fv3dRwB}gb'**\GGCķMT=ll\4e(<>\~(I`Q&@Yӷ5)W.SI2?p݉vrxq_"P^ԘqTH@)hᐕ[WY{ \d7k&|߬Q'_9AF8H@70V V&MRm7[N aATz+r*B ;@NW^o2쮨.QCfev),OeNVs"ݭuNQХŝs8>qǭ24km5K'JUO.2v/K{Eg-!北1x]Nc6KTfI{g:=-gFNW}:fVBh dz$۾=>0jDn(w:36Q+ɔXEPBZºȡJ>rf$,}UuԮCrv^ Li8p*lV%}YoŮ8 CVj|#݁_/1B b ,89\܉VڟiqU9N^jgYS۹狃5}Th(EO3e?^˞B$?ɡ1RwwͲ <ieyTkYWmR[cc?:s/TTv!j,t¿@V#g Ef=|m&/3m@ʲ05W!S᫧!TF$/Թ¢S!I͑\xuX/pPpdJ.60Ilr-'GYxzݻ?tlyLJD| @RjU'(tO7-E3B(1.}8j1ޅp^"'YLݡg\OZyfyo#g TeI^W hCKԨi~P7fldPY\ 1'rʛFgTJ(M8" ^.sT{wzxNvJaG>}AFn2- xGTxh:dTApem:,mE>:O"-zGaJ*aoT_7nHF&x@F~T.ףvِ_~Vr+J.o\iHo2pwN%GTR'>埣*/rųZ k!|5L'6.:Xf~ơI&Y{Jbhõ;Y>o͛e}SJŋ6=Ai/?`(Ez?d$h7a\O00Jdh)V)A@,cF)ކ9WQ 4*['+o3K?<Ъhh^1\Mi Tzb!u|.Ԃ0Wp^4M+nA/ jpNlb>zɥVx]yny:Rv!h̴FtF@RiJҨzaΝWIcT`2a ؚV̦9dKbKE.F6I;o*"im ~?] .gq͡}mk姁21TTdey_U Yg(=uVrq{(jVҨbnfg}+ZV_rSȭ`y#~deDǕCq,'Nߌ+LjhTXBe5oA`ʣs7Zk^vhyz`cHp)Z:M=x5n+lG iIg):ԭAVW)}u;Ĕl^ɊUsT%/ňhes^wmdc[ h7Wn N>WMTW=qNdM/ڞmU-4ZsK[YhJ2wCEw:Kp˵gdɣ u4GV23y[2,OVwJE K}M8 HbeH|̧2c ~݉2֚+܎`MߤRP$::cns%m;9rKVFTnΝ~V3ދ+;Rr|e"Lh0uZ8o+-F[ ^Ag53sш )zȵ$+mRs5ud*)(]ZXgU6:,ס#0 QDc E50'|R ɒT/( ~?Q\] A(El::`^`bG&| {8s^WռG-Z}s,F=gSUCSpzt0 kD'5Rב l&j7nn:ȸ9(SZRQ}`0(ɲ<:Y❭ˬݾ15s>}J,S.l}^5>ۥwcjO곢U;F12gM1>nYe_/U%ꝟ压l^b&o _4+A/E^/KQ@PI?[ĒoYR+>Bm~:_x9e9 ts ȱ5=('Vwl[ƷmLwnƞLkh:O)jvR}\EΏ)tjg!%ws˲`lwz~\ɓ(-_$ljľ4&Ke4KZyf1kcϬ`W+סH@vsNо!L, dYJ5Ų##\QAPLG-/EG͟GegZ  d[^I鍄co^8NR?VQ,f@R6X2ZLMwcveG$B^Ǿ[cƾxwV)ȿJEzb<3y,s&Υ=a1O m̻7d{Ks\sH ^$=NzXi"ص;w_^lkAy! *H^钂RZCp~wӃI ͦ-U%?4 ܁j6"0O+yEfFz+??]VD5sGߛSFp^Y. Hy1pxZyQXZr sg]QF"۰(!]UXBk2QIAu+̂b:4ƈhBkAh0*TեϵH6:/X.ΞUH֛^Py-jivXo%Su&]ksfewފ$]_'5Ah.{%|*EٙUsVVյ![br,0 x5DLH匽6t rP7ZyҿURh龕.kZzۦ#Ek3y̢56IKπ`~F^z6Kr /=^f ->^߃{bqz[w&R5yآ9`Z՝R-cjMh{}'bW ,Xt7Yn\.m7=6|2UE ge'V^f̸o򊬲R%nPUv8LkL:zyo:4:O4fׂ](]݋z^7]R%J&wS=n78Y۲9FEIBV VT΢ev䳖h~rLGi(VaeRk19"7wEʕ؉=wt4>ț pDlNYM66kPU9h)?a]8)k8/MY׌n %S䇯;7}B8=*{>sqGgqզ7Twɶ4dUku}6ȄN\HB2Gf|VW|VvDžߖ܄79P,6cQ'b램Z]\m0d13\Zsq_o>m9{;Jve)C>I^6cvhƵ! eudNLwT+ڡ^P|+ThMΖ5u}o{C]-M*Բ?ʗf-2R5Q_:uodHD0 C(|U6e7sr˔]od)~(P#*aw8x%Ql\{h>SAp#|=|B&{QY87ZUK\ ) ';@p=L¯9B<5ײжVSCs}J_,uɯcޅc%:mW63xX1B3E_ QH;A{Ujm}xIuܵ,UF82쬚=sT =ꇑ+|y 9 6^Q(UMgt}l>Ioy8 yR0?{-P,1W LDNЊaTS"=-JbcMrw`<5D`ްqf,\:9kVM*fVλsއ~+=m)b\-r~<õp,5ҝױ?E ij ,bZEÙ3dͰ~wN*5&ޖDApme'L| ?0a܆*&r 07w:TcL pfN?MͬԅS֐hOS;6߯}*iPQ`!e (L^x_ߜ3fSoo-/V![Ȅ˵*y:#"b}gӓuU;pt|]m_jOLR_;Vbd.l춎fq BiB6c_悠ڶ2l,sE 1Щ|v\[T A$C:f dȇ"y6". 'r Cl[~IudЦ,w½uޤtgΑ-dʷbVT 5PvKe##B[tdrq >e1~KO~p2nm._JW0fQ積ɭ^~!7 R#| fSS5.ܖ[yտŚg|l~LM*}\DNzנT(Ri vcN@εY`v.TM^}*  6lŎoZGuiPJn&NYuWVlRh)A/;\rʽeU;3gzumulO$7%{p Tg&l+2뛘q]8'xrC&_M抱lFj@n6qO#YPzOAlP_ LyB;XG ׽23ĺ cr&W4VFpI @!c0:Vr1vt_Q])`2 >J!i0ENV71Y5s^~ *JqB\#~í\9!Sgz?1AWIbvX>9 N@{s.U\ uAU 1t+⎐jLw~'} hEʜ)c&}Qо=/`\႓΄lꩇlҍzM1A zSs3YgR1.AK!XlymlzgMz1 :W5w!3LZshMGS_ sΛx|Ez˜Wu eJrbë Ͽ]Ek{r1.{#E\޳Վ޽F۽{݃fPKϿȐɃJ0[`x5= %Do4SL9y FZXQ,5KN}Hx.ъ9Jෑ }D]e(o#~Čj1pH >#PZp>fg&u4:+_liEbNX2&&al-ca2)TJkyog4rTUP~B 1VA;rVq[' 8@;C`mvXl$iˤS(n%Ǥlk#r[pn hZO*gmCך#i_X9>+7Ͽ*oҠܛ4|T7 7%Js?T{ŨR<]q_3;E̥1!,]7;c2خk?H{AI*jք`< :xlYlk˯vD2s{USsG=n MF;_uoV4Y봂|.#9^.O}V굊W֫q}35FPXC5v*MHQLk5f±<>o[=2,]ks{hT6M(g-72/ý WقQ,WA߫Vv'XeA=FD=3㻨'[TgcOMJz(:c_ٔJX\S6U*nS{u)MZl绊A8A.-/A 5n1ebL%wUߧVauP[pl\^9k~gV6@nX}?] ᔞ)Q;د˹4 ldti򡾴>oz=υ!׈ڡHݥ 1 sS.ڤ2pZ֡$8wOr`G}QQt-fۍ28vqX jXkKViEϝnfpZl9==eq?`y6{15y@/?$;_P.f2޻Z&c A1bzs̒є~^`ew#X32gw5 3 u0r@6GjBzl$ [4WhDl/+Ŕ9ۀ"}:/:aCQYUW0}?vT4dX CI`TR%(f85E[w6١42Rl\g oD79;cHZᱜҿz3J^.[ ?_Zӭ*ߦsE¿d$=61m0m6t{V\:)6JĭrQ >Ҁ:qo,%|zd0,V;#7t+fLf_m 4Vy:_pL uOPkӀ2l(4-0;[ Ot۶׸l٦Ҟٞ_+ׯ!8B #B}2!asB 9b7֣8?ya1ߨI|C8;pp ^4K0v &CSmco!q#F- }n 2oRB'mfsjRV_8?e!.83n56\ӫ ʻչޓTR=I ӷj6 c)xv<0]\S[1g*ek=N ?`K254Я9R!|<(1\?Z`<bN*lvSnNAbut'1aQ8|V^v˃YIY^YQ( V,ۂ˽̺&̽GԐkZ_8ezjraxp ~,WEqhJ1qa/k%22}HJE"Q6,ap@+dy}KT "or[^t:cŚ}]/Zaā ò%.qXss"*brpOT.jtMW$-;sy޴ iE :j#1 F@m65 @0g{g=ާg_#\Nm@C{xH#-dpK{Xz&106#fYFj"-9/H>-HcBv4iC.tOcخ e:Lip-3G#JhD®,  ٵ"8PK*ic>E31؈:!دOU~=!mD3b/_D*Ra x PU.?.p!gglmnet/data/QuickStartExample.rda0000644000176200001440000004070514046050560016555 0ustar liggesusersBZh91AY&SYd *_wm}3m0u\zwWww5c[۽*{ؽ{ܽޮm{yz{WJۻou̴jn_duQPA @)IOb&5<= m SL ?L2bdT$،L@&Ѣ`OcFL U?h Si1dɦ4ODi3BdL?Ԟ#̦ibm24&M1 M2m"Q hhO@ҞSxO zi)S#d&O&jm4z &212i&xLh)L&FI`#jm(uS2 #dd`ʧi=2eO4zi0LIdڄ#ɣL cH&SѦ d%<ɦ)PF 2h 2i"z`14O&L2aM`Ѫ~S44i<#m)4I#&&M10*O! Hɦdi=4hhL4@50@2jlh4Șh= 21Ipf 웎"s&]poV? H<$r x 0$-w\yNZY=s{ޒ C] MI=UmP <C &Ϩ]I9/[ݑVuWWI=|? u!%=`5LƾL0Vu㯇2ClI o_zU{ʆ;I֪P?(ON6:gYDf&H& ͐L~ .MQzI"linﶯ°^Bzgg:~;ͯzGEGBOt5|Pרjxs)(ܗ|TWЏ)ݩ*q4'l T?L)?7L{rtvsCՐ?}'wXtmvQѮJeҲE#-=m 3zsKIU6OUN^`Ri&i[l K%Р+CL ک|-Հs{V0h.YjO_ b(.MRyf*E9 d+ _,I-@jY}Fvr_!Zj\4OJe3I )@~&hl#XQe^n*Xfhc+D@=3o76&v5us2o1@,+/(2lܩr|#_Prs]a0[.0? Jqx9P#\uO:D^@Hl̵Em<X< R0h6w;/S̎Y^&N>\š Qyotwܢ)8=DPSB; ״U +~(}CL(GWua2/͕gI̪CUq綫E#4bf5sşY퍀Z֙B܈HӯL\@]&Y`Wz|%q2oJ2B]:VO)E:)/@٘i/Fd^Svb3fx.XBQe_g5WɉT m3K;i/0ՐjْL}j>v}엱G$ʜ }ҽ!ƅAr.4!Vq]ϔ5XJ@ƞy5ur\Cڵ4x/}g5ցxB֬ GC6_dlcLwVdǾ,m&,;)L&[+'#b OPD8so&^cP]8v.rF7G~!rI!Ao[ޱD{a;?zSs5ktSIK,5jg=% wB{"Va3Y:hP=F)GY_s{=DWT\[ĆvUHV3\  oW~"u|0% (#n^UW ֵkC}u;pYn&KOҎj4#;#Wu!8Y>NqbzB̎BrxCh5+koy+EK}{«QqDj4l3'ΫM;@Jq?W&Vc?H[ؽ1 SsOT6M7FSjNϝlYlUOD*ϼ $Hl (15 ჲwO1O2ڱX<?eѪ]ŧ̅=< ́횽Nc"6'm NtP4B ?qI(< ω_譌Z(ZĆSkL̨vݛ{ݰ.v-~F%K5JxlYz#⦛>O?ͥLqhz —>׫7_9UohѕreYeaGm}_(9!YԙDex2֛@~sο=弱!vz*|ԮVtԸxbu5;q}_VvGB2Y/rO J{:@;ڈ{cٙ*#En&s3W`@βo):0as˥֭}ݑSX`VI/SӪ]3RdkV"(03mSQVG1Wm7 ^$|[&IŴ̑ ~d|?+7Zv3]0LB^[IyhcJQ*)ۘ)ё'bT޼,~2)uЦٰH%Z}Cs-.jb;n0`"h{ϱ  `])6S! hg/sn[bh@@Rxýy|:Q2!jfgzSN ˝:dKY^Y#W' Q%VG>?'L:Γ' j3*=9&Xwvވ}`]ˬ4aB'd(ܵlov8IKnwoul&5Nu6& V~܊zNRZoכRdDXvkQ*:m!m{f<+-A<ȨAucV CrAE '᱇i9 7FU)m%vc&tY, Z9@_.a ުmk1dhWdRF~!{%] BZ֛MnsyNM?]A?Qj~9͛j< ɷe1u u!Z'ױIeIBKQ(u'U[S$9Q!KPrx}fէ-olMd)C4YR[:XklÆaO3sAd8h&##3;e[[l \uSናzAYYrpZ3f! 歟6:YaGk~LAR )AGґ ;R6E`|UoP6L2)oA|c<= Eo姍Mob xe;CdJ`$nE€k:qOny2Lp fk6gե9Բ]߁ Ӿz@AT?SϘp)709(C0*ngS@KVIqkCUf uQݞKꐂRX~ZWK9ȀIp( vi!j (4T-'}^m'S7tÔ*L;;a UXd7ˌeCU,g!)R)55$r[WӍ\))-dvo> d#.3u˷ :Bit{D1)D+we| 6XtT?Ӷ]5z_k|-v'L]q/oS4WH!Qa|?Ojuad*ш87yMEs^Z:w ov=7&MAi_gգڌL5I bµ((Xҹ/#ۀ?|[&Zn7 a;eB$P@>uY,'b4ְi'r#fY]CNe Y NxVA{J{!rZDl J O˘XDlg'{)yԑ/l>!+rap'qJrڕ|hTؚZkMʏ3Px[W љx -пC۶q1c }Y鎩 9/,xkB6( qq˟IhӦc2 *P*1tڸ6 Kkҙ\m']拾9*+{։!RВE^hu*zq?X6HXඣS7KJZv?oU ouv4gL)M~L<7J#d6H:{_ve+lQdvxpԯ ;Ah [>HϳUN-- -xQx$3YSxB@{ r]r¸ T 3>2/Ξ0oelŠhu٢m iT*U-%\~e6\L>_Hd}"OZ Vw<;7"5ՌyLcܻKao5@{j XyKDff$V/ogјKDVAeJѽq-=[G;^Cu_'NXw}rLQ3v[ #[G4Z 6gId/wtal~,fXi)-.*bϻU]D!ֈtR8R}uCjK{Ve?ײG.E~$Z! o)QD\b]C,}L: H.sD'5XH)wSFjфt6 SA}b y30j܌WaSn R-oaJM5Ni3$rwNw) dHh, WaգXy(_q)ڢzeXij$wWai'5g$h\z-Un۱5_Z(]{wSD 얜) ܤ9}ٔ@-$,2 ;Q)JZ?_(Sf\p(ҁWrSY\5ag !&=oiu&h2:;dW|TKYվ8IL!IZG.=4glEgxM܀RR(d2IVj{+dqn7~O5!g)`<.22R#N!^:H ,"_W+-keC7F\K$gրwy?\Q#w>R^P66Ojq5%l(5e>J~g3^;([W xFcimoiwLp=RL{3m}sb `g1ޝ0sDSfl{ /#%Coրj5eD`Wd'%icdG=μRJO霸9gJ'ֱ+$(kY͑(_6?rgsC.툆%𷀡Eőb6x "Wzn'⏈L٫*P)\yk!xqOO*;/ ̴`YBJjR35RkP]7) r`nqRE㩣}GԀ!E.IdZZ ]uaH] mޞrԘ!3|)5ѐƄ+z*{мI5jJWNj/?_XôNl.O`BۘъhHou%woz6FĬNvA[%L~,#n=; "S&gDB+FGd܆}<-͋9WEFsۨțd&fhS3Ha9Ϟ;2Z6)u|T7̠`0EظpgG]\*Q5@UO+{Uʷy".ji_ 4W*^UpGNgr͑Z|y"8ZxX$6k_]Cl)zQ0ϫ. ]Q~l8Ѷ2k 9S>k>Y6/N2[}Lv#VR4 Q0)?v`8DQ/e#Ǩ؃jKXQz6zZq|[GyԌ%v'`Wտ^sjx[.}j|)f1өwy$f(KDB x'k,=c^H?mckjBka0$TH]L9::*&-n;% QQt'cmxPiZ C ^1_/9:A ܷy)DsTΥ{-;jjdlU򒩂-LUݿ㯭Se;Ffer_*w/Ġs+!ȑfx^sD1S4W[ ;avd ..z@8|_c;F=hw=u2q#R@H7*uAc2y4m!77D{mߘA 1|Zj+RBu[S4Tz%7[R`EKu30Rz!ew)3~_JPwfViMabP~h-7 ҦfNufcFQDɿsH[RmU yЦ_uT~\ͿFT@'<7l/~o.Dim8<  ,O,(>=oB ֚b303`m} NoW@fʺA[9C:nnS9i,;]I.?N*AFVɉ-/nh5.l{␡{I}Zg}60鹗XLHk;h+5sI \CW4R}Gj6f *;H'voL(dˤ]^~iɾEƮǤ~Ωfw8?؊ F:k!-đ jV8b~TD]fU)?ڼX+#M-MAX@6 Q>ۜ}Yfˋ9,e6^u4gze+= +ꊱ\]Jt*2ͱ2X REN;ǝC'լUpRf8eXQUOxxILCj?YRLzW_US@|`ieI#_zG./n"7ٖ?}0Sw6ֲ6_rIY@մ|,` qgN` (=9(?fe,^>{$?\:j%٪CCw5hUcAr&IF8(e=8mn IR%q7i}u )'ZO5s8uU-*W7ݰGbTӹxZ%OB/Ց:HІbJ$b96uPKzGdS͆Xzm̀K&cDjyEl{:FE7M $9(h]@cTiۗdA՞eQ*P+zYlL: ? O#*OܼP_mhiT."$T(m6U1$FG/? )&BnR9=ȕqFd[IrgD| fr\skY}W/hf1ZbdSVjII`D]r@x-x0&'zU gd3^Bʼn\m`mɡu[ m C>U'TrK`f bg1@={0ڰb ) TвBE0r2?a)Sg7aLRmL[3́[>(lX]߆Unȼ@k3ٖǣ(GNڲ8nN| J%6dˣzKiF"e"NOIuһ\|PutQ8کvDڒ%v P't&lۓ)h༉/)h:fWnԇV';4޲0/4*ҬUL{,r8#v>9{Yzgzd;XE^eZ{P-*H:c. u0lU+y#N Y>Wih1T~1;ݤ+ESqP'nk*vSIW bpBrE];G}SwqgƈC#ZTg\n2|^vOщpOam|ݎ$bR}nA|c/H4YXGR&WH$DȖDZ#IsZVI pa덡'ZdV,FfST'k̲`hH6rY9c yo43'Ǥ ^oat[㘽>DlBz9p. "? }~`Zr3GW`U_Q 5vg,sbrכp x1rf=b䴋GY5?&k`O 7?Z" sGDͿP\&fduZ syߙL;q/ XO~CQ6vAI32>ؿ%GkAs mSnƁ,#g7r3A0~yo'݁C-@>;|t7#R^/5IҡȨ_vYҩRB,aתk x~:Շ`ٽBr٫?c0Ux'7{(f\2 {-Xy\i&aݽ⁚լONBCJATeW Hy},K~uey YY` G! C=zD0op`$gc.Cˤid[[dtGъN?|g} d`a*aeRO@s,7t F??GhZ@>ؓ@u%JS8Dafgx퐱`dtxoxs(=>~3XeĶgMtn|T]D:UQrc%.ւDr5RHMraAI0) 7@_ޒ 5,YO= ɵ~ jxN<{&&gA]e8ӨX4ɩ5Ѓu~o wµ8@vxbXd?U'M8$9Mf6Ƀ`CN{ɣ jdf[ԛPMK$m@GŜM<llCԪ#9 >!&<( &&Nژc+.l< ]Kk|ޗ7qh)'ܩ۰MBe:\PR]ުdr"q6n}5 maw'<2j] 57in@Zj÷Hj+1#rv؉DF>ǭ%j|k2^  FDԹqC: DpYNɐ-%ѥv̈́[B! tiSyOgI|^hB#i'rC~3__fA})zm>"wȼr^h:^ -OqCOdkvuTRkLn}ȅj/8Q\4 ' LX1^~R,@?RodhmN ).6k]ȴ?`VQN+__eikb@+s4|⌟I>lƁF̽3,)!.aC3k8(=ty˾-oJXQP/LVzƗ(/A˭G37gLse QUm8ЃW'hu2*jP˦!|xZ~hx^WM1`+(%A\>Im@wkTUdFd"$z;˓wz){ߘJ_x+ ;/}V/E>K{CB] V=&BT_ŶPK&n4zMК#0$~RE醹7ohbJV}2JfM=A"Se-sG>~/ݥ368?+48yoo“`iثW}禼0DeLa@G8RpQpTوwxD'7|?&% >gHEFc %n|vqz1[i +rJZvtt99]賗G N彝(m}O YezLd6sbcqJe:#s#4i:-z=r`櫩ެzxJʀ˺~۠15*&#\ _&5)4e@WI;)V,l=ًvFA\y_qR)1#&JNsCM)nSKWC'[XT6yC@lHvGeX*ݑAl6Am67>-цF`Ǘ5]0R=\l| 4Y`̑re_ZW S]]bh:ֲb;i.1SR5A'b0 VP)tp5d kYj qGֺ&򵉫bk6o%3GxC)~Rn3:޼E <7W\Msgnm?y?UD4ɇ_Hʽ: `4bƛ@"Q J7 k#%.jԑRg7s A-IP{|3d&O_BδIڮ͂6Lht|s\*#Ǒ@\}mЩsnR29DTh6p7SX}$$R=3}ŷ@7TP!;=QxxlMk")ኲy7 /V3%oiwRRZZ-8Q =`cҘk)6$ u-m?6Jصlɡ*WZCy?:#ew9`pLOğ :u:ɻs T=clqz=U >cevXX6z>[r幢󌚢3Yl6N- U. \ ,ǭsg?M j#cndS)Am#O*∄F<}";Aav"[IO ǛqBՁ'+r`m ?reW+9i.f v6HD![9R!F:Qڿ<)4ZW="hVh>UᰂewB763,yA'Er@yXルjEih^$cK#Tuy:,s"mͲԭ{:A&%D. Mmzf)շ69'[+=Pvدi&m VSYRge77Pov'H4j/L A1`.re}[e|5-|yYd1O7^RT.j7es*ҧaq eF\RFukm @R~ĺ'"KRdkR3htlԨkVlSk߃͢T.j, ⭠_H7Nc!! KpniL!G`jW :E*^y0ѕs',dkF^!d)L-LbOt,q.@ISI tŖN1O?3Q>0pc;$: FM!H%)S| U95#O3960+:Jk@vJ4ж @f\.puwuӖ'0Eu{tr;j !"^Q~cf["|{*2?69By. yyTX pȼ< Ӻ۟WNIxב<]yaS p87@nz\PwpNP"vm2 zIOU+إ4/bnnãݥCz!/@ W4F>r׃O)eG^u3-jEQ[L`lS=SU ;QnQ+E=nc h}od!;-27h*t-N{MZ[~5' k],OMH5W_iR)j ֎0F =Ӯ\#&SOU[" wc/'s@KjUBVtRAuk.aΟr;cíK%'J:_Nݲ BQ|y9Z[L:O֬^AY^cQ։πWSH%S7+$82l בc ~^"'gʷL}+F05L0s9$`L0_$&w"{cSkMS!=C6}Ur^l z}; V /fМL2y!N$2dA8@d Y KN2jח0Ѱ_jvZ V5@WH!+кش5|\N!:!H),:7봔sXb0 }F}|1WoV'%  ͷ2?JxeM捎k%UzCJFx '0} $&pr Py 3(8ż1ljXC0`j2'֯#ه2(bv%x"iP@1BYaP5cvP/~ 87-:)] .BJ#nt0J5:LkU#6~0l2%' [ @l>3ߦr6F K4{K 5dCn6zǘØGW)O WP*![{ %t-z 8LǨ?VW:t9䓾oH4G-YLE "(`cn;+&0!̗qsiM!ReϺt\4GZvq@&n~GEhK݄5O&$@Ǧ' j iH}#znTwr8)0[f-;tNG*p@,e,hFkMyM#߮ 's.̌Y{~m=AH3=l6{g_1Ӝ RE=oYMA 99G%,XZ~4: @G%˾!nݤ3ʺֆTBu. Cй+i$ gi6|ZdOcL `n)pJywy`:JjT -{8Z{s/ ~ RKƮ*-PJAOYviM:A3Oplp>[Ϫ~f>}\mqK6kf( ޶_]B@ |,glmnet/data/SparseExample.rda0000644000176200001440000001027214046050560015714 0ustar liggesusersBZh91AY&SY -S >}>rs׷Qܲ{d)&D0SciMԟ)SOқjL?M&b$cɿdG4R;0'/C7ёLFb83È&݂ 89  (1jԧ. N92NuK/A8 T-j^/qs$-5$%_"?<, :IJf GΦlxa=mN@U5YGu0ԫo:S8PKwcQ{# 2o$Ki$-xD%2|hNb*NN39T'N9o TI>- GY2w{ȃXyKyu*>!ܛ,qTp(%yҸ<@|VvPL.+YMuh% ac4I$4=GXpaN%y-qsenDHs50 @7tsZ~s "]$<[=ҳmXiR^Ҝ/0(9ϔ?8&C{۟/Nς( wHg^-ӢQDMqKVS գ`wC#ԑYoxz.DK*H-TzRGG[~nfc{Bs#L_6Ϲ=[h5[r1WȠDp%މ1 E}_ ˏ}'FuC;>tS@AgX@^KJxX,0y\d4;Nŭ]Z- jabLJ޵ ]ۓvZ`Bhp"w,"m}Μ樕0C.V>SLLМ&\)WoALWb.!>a%U[=Ơਲ਼1!̯dn^N/ `Ȥ,!]ߐzAGޞA$iT61n2g{7ѥd9Jn\@<E-$i:LBw nע׿1sȰv׌DE`7*"VǨ©ebٗCN˼ܩ(u3˞E~zA^:^:ᥕ]=OJE+xI4k]i8X+*t9(aU]dVIL';SĹ;J+Ѵ] gk̒!vZ+cl7%q.pTy+Ebя9J;& clV3WA '}FeɃaǥqSo&k"IX<\O3e%𭦳 +/&ڬ/(tY;éIWDg+G.ز2&.y\S> 7IicIf0ßj_[ssUlGw_b1Ҏ)+^fKLim) eɛF Tk/+Y6Hu 6*RGwNF_[yF%l,z.D?ja9,'8i(>a<i`g \Pvk6F|xN MrUpQa:J%^4 ddfiZ>riFJ"\)'bsȳYs0AqTwG051wt.$<>ٮ9Ѭˣ՟d_U$V5%)['P,Z<[XHAӑ}cG1$?aeu,{< tRtAk=[]Ƨ9` ymw !:ϔUCv%e->8[p֭:ݤmI8!m쮏3et5kd#6iB8)Bk7^@ib mY@,žאּheTj&m)?p{EZ23ְM~#r~3s3?Mԍ5b|ҫZK[[:F-`sU>hyU7kzlxT9vV2լy8'M;qRMB>E6kNwʱ ׮\\%1 +\*HxU#5nؗO|8 e}ﵘgEAslvK,yν~t3pdX>'_%u1aHWR~XA-O۽뻽Y}uz_v; x12`L40&#M0F4#`LM CCS4ҡO#'Mi&L&0H= L&ddiSS&'ha15D*~hLjidL #0O@jy !L& M2h?M )&$'lF&*U?di3Ba< 44& LMh4jixM14&GMFLd M4iFɉd @B;rwT/ "D W"!DR!0"1 IL]z٧obh[Z9#,8n^|'K2[8>,M2*qc}^j6>qOպ~4g&!'d\$d8, ?j;;'Ho>@ KH]OưE\K;|J6#St;_JaZ$Ը$rزq1\@h9Bz_UVrĪ;B3}3YKN5,qS 1Ǣq ٤ě 9 GJK6o0 +JE!tѕ󬟍>Gy @5GEj͕ws^=e+ZHj /烟`ٻ@|}c%|iڽmnE U%'} qó}%hW!T=%Ka&|[g8̮>[X< iYdVDMVC`m@жiwzxۤoOD&o`K,p| Weo^k!T`Ӥ+"Y@ٛ=賌j(B%.E!5gםJ&S?(,Cw WL涂:mY ץro{ qh851Ehez.p˭y"GPmTDIi@rQ.׷ CvVG>lAdU9hhO1h7lSBFC*K=܌J_!'Dcj%FA-鿽O_j}6Pdڜ{A\YpƏJP*b8cib)X@.[{ "Dz[h?>娵}`'= 1bqEzPhw3޹3t| r+Y QkL }ehSxH}\$87WWM9gă+Ŏ5~9Uk߸6"K irЩ#d+ڝs ٴi5B>4cF8w;KXWai*  uYOҗuaJ4=1H:9ho3a-"69[K 1WGfSJ26&ҁ|`)CmC C|1O-"V:_q*l㖫غMr6F3Pl>Sb=醈j˩=9VZci@p=ŀ0BVsġh-y}qD) 5q}"S&;+U4SD\ (Q7[)X\ˠhߧT݆H싺,10-[K”ru^{T`s} \O٭X0wj֮B9cFmrtTV K?yoሾh->rOd[720c/$.yW!l53TOVsBNA *9k!nkcx ];'jE^mP>/ܢnF/z>P I-zOBnI2 Yra꿅\փ *^g`s&9H@n8E~echqUٿiiƖisCKF?T @b@Ø6D_}>cY+MI7?%mcû%m(ڤਵl,ՊK{#8)f#S)9VTL֟<D чz"UzcTetsrmW鶎e!I\S GaoQb 9$dlcAo:zƚ/ ̆1'Ac[ނ JnmB,\$34HACqTǰDٮX/<߀i4iTݖIo W0G"9RXk7 8)^N7]!cU/Q"({ 8ޗN{g(K.'i>}fo߼D]U"S!wr/Vk<Nk߾%ٸ[voSI>*mʋ#=v9~FlFB,xv} ]])ـ@Wf7BWox:FW0qQ"ޞqCO.gX! HX3eHA_o{f^W;aq A61R>9 {-zxY8<ʋWr˚*l$6>Vo23DCqOzβ^"yisfy=L+C- ;K6J@QGc&&Dk\O2"6}_Ak#nYS$boQyCK6l2pn nX+7/*GׂҡB-QJFj T:9)%ʏv DKu3TSJLDN[["Nu1؇1mH?]OxK<ǰNN5^ԭn`_F?l1r$޲fK7u`} MRf,~84lwh+p쓉NINt+m#װpĹ@vFř֎Tc QpjTS⊷R3`ҭc}Zv- V}G\1Wim6zpw ^dSmǒ}P^ŔD%:ٽ?UuɱΓ׻(f_P@s䗒!yXP1U˷X1 eh.=kׅK.tFW"B1uн _X7so÷!D]mQh;ʞr4&FG~RJN\mfKvYZx6:f~z|ïݣ@E FR&1A0D:ol :{nX&c9Ĝ{/v3N<9#B*=&݄v现1U~"j_4ZɫભdF#?< cca%/ uCQԂ ,*РZJC"`x+C0BZhS3J<) _DfFud6uYz0.D)WP0IlwhΗMO/`|DKϰ<#^}/hߪ1*.x~Z8=MO| ٯ{k&2*˽$5kIALfq!{\2h' 3 e1h`RbYJ|">ϑNl|ַ>Ԁ?\7{D@CD<-esx92=K2qD4Y.*//nT7=@mՇ=3r|< VrUd:(pއwqާ$sKl$/ߡ/}} p`Ž*QMᔢFЋoeEwm e!)~`/.*= [H5b("6^l ʺ ھ.:$Er.qn!L<#B8 +j[!-gx?ٮ3=lveS'F+4*O5'_m2k[_ocۦo}T91dQoP)@Onr"<tѻ~o{!c 7Dy|Ҏ6 ;[O}vA'Ñ^LNkP̉ڀ)X^0riHPnq~!8ظ-_IP/rY\' } (ykCwTߣ \0)]͉"JRmX֎?e0Jp4 2Jd?ĪZv= KI24a4DiSkbo@t/wW}I:qtT﫼0vB=&LGt_iFC,4]̷){U`Nt|Q$'4SLdZ! \S"F?jޓl0'U"<١sW9[- V#VE<&!]֚OBwԜK,4ǫ/..,rQCP)qԚgH D_ b3$ XޛQzmuگk^67DR3mhК/ =ŬR_g9UF~2"C(Wxҵ3hPq#?[R. U: BC)NVQse:m{$T ~[=뺵=yn|+|yT{d]>AUhC )Z>ݘϲV:b{gEȼFcg<#J̟uB#MW,/;UaP]op+у~sU|qVCJ'2,MϺ5<0z_4!WP>F c_x[ArMnP+wxV+Xr=J lLUyLd&Do&9}&𽥸RJLH})!G33Jmn;ƉhǓyY1seG<|86U&Ջudmwd) QϽB%G1iz焨Iyߣm [_/#Uw&6g=U^H}U_}fX^KMVA:j{L"+1Ի?g˓UO@Ι0d%ګZÒn##0̜r`|U'ĝ9>Ny_R!(U;rDI&ijNdIg'XQdΜIVOS-}:f٠_Ƕ)P$'i 翞#?W+sCVߙf:6HiB>M 뢘ZҬwsF u 6RL֒76hn`])y0baxPc]f^#P+&|vphsu/atYҞEMR%o2c]Q-d u7щdž:>U\ ?f4b X;Gh!t*7"[`K!mai+a5s)RIcSbDnm&cSd5fE+sn%G_ UXCd֤kEDOhz(x_l3w\=>K Dkɏ;0|fd1rR --4 yTzY0It*8 }0v0mA<61Lo?K *׫tv vK!OЬCQixy>?3nÄ́e^>|+Δ1PCDvG^xvV)&˃N*d4GE `Wj 3\GN)%T-#|ʕPeŚ*ONLL^?7rIBɐ9 HoG۟~[᱒Po}ݸK"ābDTւ۟ptL^#]hBZT/$L SJCaA]qXQvɐU/-C-mz\: Ou6sv`e-y`g5]~B缐龱稛q%QtwWLnc5{oo/[[\M`B}b 2g?+fRfήsǣ`aVviA7C PoWkSlߑj[u[)EӄekiXЮj5F;6u":O\A~y~0{NWH)^Iȇ0-C/q$:p "0RG$'`&VKithzaۥ`syi44mʥ:z6ZlcCV~|?\~"Դ$|hOZ*dOk+>sO#)'߭jjyģ2"t '.k? f勽?]tAB ϕM@ġ6ϛ!G9]z -͖S j?BVW3q q; 0MjYn\3YkjF3~BĎaLN?>naю)?T+둍'xq1 I/X1ۣ''twG2lqO#v3]ϟ/G?[nq`/@7Tҹv}.׌r:H6}<#oR~⬵q;tUOa)<<+k֘Xu^A~)xpS2]6G&ך .K<}xCcЗ'u02Bm^hlFTť&*5ltqUѯ!@TEZvp+y!5&@C^P.=wA.%3̈zUD8NCKK?sP!s8޾\PpKfDbJW+קDfdXL<aSw֚so~6QR\)?}'4 5*G#*5ՄBԕosb?ʸntycB ɭ*P X&vZ[pmߊm@ i-khԝ(&d|MGpVPz_{a7yO$3~d"yy쁷["/:m0)1by7]ޤjC~4wF/eMj*C2~H)2Wk^Lg+y'\i̜S᪻۸r؛f}8w$[^A&Cr&<,k_sMR3J`l "kN ov;>| 5}U<- SJEDUS8.h# k*Ѽ-$ff!N}%zGdPX!ت+F|䑄mc8"qZEIؾxJ^ydv6) mkfu SQUWψu%oK7 yDz4.H~"#t-%V:F xR@ NΑYQDnK1`?"fͅzP0k8l{}tGZ[.jQ=ik|6-WθfͅÒX%8W}z` TG74sӗaШP {3,|| R׉П+#I 7z",%\9#yWF\{Snv=-f9dq`4'u+-6SfsYәD_r?޶wꉘ:2H L-mΞWϻfo$#ACӌnBX~W%`Nvq$Lmn])9#J 17po$u7kHla;L,3Z9<\1׊ȪbRB?w;fmM8 ŃՂljf-uk悕8oz&@`s<6 AI~p_L|U_Xjc :m}z4tz OP3XlD؉GJ2۩~KDn)LF/㣔@2,^:A6uˎ\EuFBwۿ{q*5TiYD`[l#pvw&N;8jIג!8VG!);x8G$H'&Ͼ0߅twa@ p 2 rS:_x4 ^o>a-Ϋ p]gOCd0Vx3H}1ٕ8k&>\J$T?MP0md@*?@*- C>!XM .D hNav9Gܐo. R[jayagd*4M,_ u<$:ae?ل<`byYL`ʗWjpx}\^D&J0C\Ⰱu"Q (d[DaſA{Cg+ hHNx[LuI=[oy,|ؖ! S'&zvTH&rvہ2ompp&LD$+Ҫ] e7vLF=Wjn[HB$!dd45nLfru;Jjtjr83Un+SeM:dpQ]ңzDZk9n¦l 4Nid[X.t#{Lp|փؓ(MJ- eD)s D9KAHMdtŽ‚0˼1ٻ95ZGTסAIyrT<Ґ]w>i Qn?.`GD8½V [/8Sx$Q6+ gZN/ur*2?;x'P\kZ  $j)}6&<~+ǝ\KjyD2u/؃ޛ¡>LH>7Ezo,{(+x8uEQJlYOߐdU1Gi_TIUAd{hHZZA1|nvjS_~-:gwۙ%uSa54y&LUhw: yD<۱SD4_y;PG==t*_[W'Qu][!RNQcxb} =ӏH+ՙek-54b85=deI7$~-!/C%S]m> N2miQq\~(:ΧC;}k*.5lA&8P˥[Qx0w9١ Tl-{\gއ4[o!{ayI[D{ A]SsZ sG54Bjmpܒ(-Oڄ®σRt'<5V(@ID<<`]̟*9J}fhkyX*TL7zjA? ڨEyW{{񽒿GpӆKA%e 49~*L STB@ұcp:bɄAn0[z)wW?>i~L_  W $.1w G*\:݇eۯ"F72fxRC.}@GbF x`q2/Ɋt:Rk{95&8Ҫi ? RG1ȩl,/Bٗ5*}g$vX}0{o?m$qPd1k@ˑ6l*l$Uԁw*))hIjnl:7uK9,-&IUYi{ڒ2kY \BV6 smFؐ}bE!o&lKZ&\E uQ}2r@h+.Yexcjrw+Z5Ph*Bg l`\s60{[I,-:+LCz$ \S&p,?ZS&mlEo;[`@z]uXXWyf}cPw@f bu&ڪ/J7ռ x']i nCOirF/H}n3u ޜLYHRmS+NJg(h%|x!;Xek^2_U7 (tgQ̀#kƏ<-6r)oW ,, B1bh()V\VA"3s ׭A. w <}]j| 9ʹ5]NӍèfP@4b#:8R5@.$- UXRFvE76*䣏_Tf~7i96?oIO+aL͑B UIyUS~uu|t n*{ t WW8tOF{"' "TWcQ\z;r>3CyBz_DzvWe]Ќ6gfEQոCB=r`ɛR3ڈVsJz] 1E8ٽSk_ocPH1]IZ|?G2lh6%1T䍒rr\BCR3QᶴQ<{Z}03P䛍ٮa_3`%~iճL#Wn_uƿ]f$zJ8AU7e~RXkxm.rȬ b qr5k7#s|z; w5J/&e1A9\.U:e:\k%8 Ǔ)d^uy=gx@Un> s.yYey&Y?}NR)~I 9v~eQcSG3k# /)~H @= ^P!b]x?G74Q=A#D @-31T྾0< kom׌~~jqidViS&qn>F1ڳY%|nxA\}Z_]LG?y7P湼{"Z:ew0 7`QK*ǩEԈAAvio0GmN@+dB`ǚ -h bkqQyǂO'˔t|rļ54yFu)fْ@<-)HK.i:3l}y4?h%4Yї7C pdPH CZOm"O^0@#9A?U{s ,"w&s{N<:[fx>f>϶؞0%sB~ !A0"Ht}08rzn\^1٫8^oN]{膪R *[S&HKFxJci|1=l^_,#>;>HG'qf >Fb%Qv+tn pyp,y,+Vd8X h4 W1q;O_VzYQ(א 8@*g0ˋ $髋ra`,D!{XDBuD#g9uQ躴ԧۮi}qHsͪ%c 19 R\\e^wkC,2#Z<+a`FL{[26|:ɯNW9V4-DmeW*v162಩mQ( +H艱٧qsaXbN^' YeȦPD"YZ@B#;JqJ,a3l8@3tq$8?;< @}js@Aùw:#f!@/cE=)lѫެj -㡂m4M? cZQiDA3^ y{"jN#[6=_4,-RphDd2,'qQk61L%R 1Ϟ V6ƌoߺ-jRH H*9U 3i5dnۛlc}^7mjpqwߦԦ~fx:Ȁn>i&{<E]ܗ &KY BBn[* [#孩;Mqp(2 s,ml0:[_;ڟ 8~c*OMb+)R vسY wͳӒ2J1HC8AYj03@ȆPc;HTe _CliM]\:]L  %$g[0{t>ZC11Éwc{Cŧ'2SRM`D?xvvfA6+[%*@ iyC5Ճy0GUL!(,_aζ'=82`DDE#RʳXSt&q|QMym4@#JPr\ۘh<` oC,Q{Gjb3ѣX@TQLF+̘& yByH %.d!+=[zk70! )Srɋ> |"<źWմB('sl;7íɘn_ɦ9Vk,$ňq&Q !`D)cwf`@~z;H)`f!576jgwڗ'̥qW ݍ Ӿ(VTQH!Sj hЀHѻ?f Fo O0nJLG>^gNʒG Elm=k_ wkN}Ւ}UۓI{,N'O+ȘWz*#BZWSHf{)RX!IZ214$2ͷKAeرHٚIk}+9X6Ged7Fogh isD#C !'._Q:! -c+5ol09֍ 8Vtba6J:ý.^eTxWg:P)}n]Ixch_"[jw_=#zq]͖"o>ɽJfAIkUHb;$iZ6%W&mOt1]'!hҊKvuFawx%\!}b~_G"40͍|B0nTrt)D,g'& N6i﵆_36lye+h`YQ|br-LFXj~u v" ²u:\l ]H,-wM*fgsKpKJurqb `%_K \9E$<cR~ +$0ZUć@j埯KԝD0JАݓu?EFݬY]= lCUm%ی}??϶]_FjyO4&0iTB0`&0C@hh&&F4`*!Th L 2@ @ #dɄ&4&Ѧ *~IC*&  =2 MS42d24`bhɠɉCFCM2O 2hɣ&hDe6 dɓLALM20CL##&4idѣB)!@& hh4@4 D" @A@4h D@i  @"4A@h4h Mh @ 4hD@4@D" A4DxOoNhio ?BD$2#DM5E_@M"h)h&N4 (ʅ}h69c<+M Jj}g&X[Y?^ ޾A4n_bō񱢭+u H`K vHWFEP^Vӱx:O+ToJY'FXhoMc"c_f&5c/ * Dlӊn]2w60⁕x*S7p226)XaUoO:7RSJX)zQȖwME.{z<]'wv. _-@^It~|MhYyZ*_6 (B@f+iC7rҎS"^h\9:x%}l?*BԨj`(0e `^! hDpI(;-N],[_3.wYG0*f3P6Ϛ#f,u@X՜0#?X[vRN]╉^r hAۆ% K9'R]GIf[1_A.e= `{ B<*Ё4>r!R;&߲ G!/'A neȃx &e&b{Ƅ%g>73&eV4Ue>vyU:2r'xeir 1MOJB5*үթT׉3_sxudxU֑BcŁb5 CC>ߛ؈><:)ɡ])2ӫ:y&⑩_jϡN"+ur?܏9F51lqrb VT_q}/s)arMjt3|}3_uT_^T 4C.௣Aܑc9La016De;_f6шP}Ћ"d5]rϺ wv[@dm{h>[RYpijK6i6RDro9ÉV%vS%aHҚ ˝oɬ,|usttI5$z"SKz&QޏȞ6 e@{W{ܛ {H~6WnMC*=e.*= dM HW>pLJbrZ ek϶l6B[,W}?)8v\T Rr+*fEMZ,ԓBpza 2$@}V%ytxht?7pG(͞I I}qk)o"⑐z5Cɏ{V~쿰j#uoKhg0 MsaVo{|(`'и,mϰg N"+L-b@^%" ث bA .4ljS+<+cuT{kռVPFYP( Dp3`wi᫞"fWj1mLDt}>o2)_լ='J}/th#.+oC;O g&MOA]^z=|Ys0AgJgCֶx8QsE3;oJ$P@۵qKWƈa$D:tJgP=cQ| &w-D;cz``_e S[S!:)\MP{:( Xل,SpvWuԩzA-j,J\cg9 'y 5H6b^a@>3̷8LSFX=Xt|.X$SĻ!j@̋ܓKFQRZ֒ k3 V&XA kԺx9l![)9Wllk@A@ɠ-]ϙԧ ȎR+hf/e7{,+'Fv|v֖);[!YݫLA浀pxi28{EZ(*PU .~4Kt!Nkk:pNlɡs] Bn_)|We*y@/HB:%ų|-;\F>J9԰B KЎ#1\2˷2מuޤ;2r0ahN)1:b;|x\gQN]+2bE`TV14Mz}эf̡ࣟU 7)W  $n DERڊ"F@#IlQuVXVK|a'NtᄓOV4&~qT 70gma/-[+JqRrHX`ş$a~@i# c~T&6hmQ7m?5/6%6VX;ƼFZ'&> q:My7<tKEbluhn-= 7*da:oV]5c/s`ޥ#-A rOhB+hFpRzKdlrK4~dtkE83M~J/GjqޘYB* ƩqXFrBfJ~N@-\(|Ydj-eȈʢ6c\8lK2d1M qemNj9z!S혞֬ԥ, 6Ռ/"uJtUf.M@UnS]mrPtl.j5|cB!q'ziɿ Na% D"Ө:w0P)C.[=dҹD;`dVRWb3^2Űi.M(k&Bњt/Nh} h)g}܀VJT͟Z\:1h>4lOw4_ 05>Ʒxmt.T#%S4~?M8Gf | \}#N%Ax屧w[žtC|8ve_2!rd?򐈂`F,٬SWX M)POȕ )je~fT0B1 _VǸ3V2giEb_"c.s.nл2<+*Q1 *shT=-aO"/SA +E (T J_nښuMYHnâZcqF LNlaӮ2yux}Q`_I+k"] ͳ4徵B"Fk{/;rKl~iֆ=ZMsq0$b}9_^Zo3ΛD-y1uZUy΁u/v~rt4osdwҗ'lbx#& a6I 9k~N+10/xʸ+7Evnt$xq_ Hl`UJh)05X\i(ǚڸ˥?.2Opli^gA+NOx9 m#c ڂfUX'poɋ{{qHiP6``֕oN;Xv6Pb~~iS3r["Jݻ1g_V'v.w&hYEDEq,̈́6aVGF %dU6:29#Y7D2*`o"L'Inzq2nu" /܄bc7,ըhagN9S-Ƶ|88 E>\Q}m- s. V _rzo}q _kGN9 ( ͦ/&er+_w ;́;^pu\19U79f-]lti+zqa\jWӆ"Ngku0s #϶E*!y/3|Y֮\8ILg&lHԸW Fǡnf]M0C}7+5 JG~T|[3ڗFy4Q'͠vGR켿kG{?0è͌OI\4qS @:&⌁t'Ae FCg-n+9hhu#6K7^YyA\ 6 AW@SZ+Sz񰦕YG=b@IcZ6 9PM޽%s /tc,&>srE*U"JQ͔tf`ͯyiZ05]M0hIȆy(1\jGէ1a Je[mQ,! A[HZ+ [Vr#kJ)o_c$' [Dƾ NJ;0=I'S[%zZ2=bbrҜJ-)ז/l#HV M^(++TEEF|mA!ueb55WS):Ƞ#0`Z:`FJ+^T(kO//f6jW.rs ӈӦa0/-`"Řm;J|W0qx4|Æ\$v13XQ1xfr@p-gO(xi-OPƅ?.[Ëut1LϊN6ԍaG5 P92Ya;{?{d%: DOgC7=` b?,jց⿪ 4'_^,M ӕ~{Bvd!DxS%L2cI#t@f76UF~ ro>D-s=^ 9MYdj}li t; U .V|},m8njrS? Ru͠K+7!Kv 絘_"i1#MR0ϼlq ^`l9ez*oz 8%(]|O-`v͟3w3'0إ}n[+托଀o]P>wBsO oj8^+O¥H(lMyi.( KՔ `TݺձGx7n.[i y,厮,|#%I*Px([\پ`p-LLvQɓ+J8Y.v؋@P~ۈ+`;@׸nL?\ >KGZbF ֑[K쎍\R˽Y W\UǶ== rGo` 1<;]u-mY$sprC#"5@L4VZi_8A7M3^clZ%tҙ;w80U/5{=fSk*1 ;W3-1_ov0>FHVG")R74yT},bnU_r=@Vx|@goR)M,g.*_,LԼr GHVֱM>lR ^*I(ꑸloSI4ȸ_2%n89[U*t7!G scE{˥}w''SRY|sB1SZKb.^.ҺG Ϝ=tHϻ'=сXjl!'Wj4:o۰S+ӅnP▐Պ6(~֎wa6̎)͋-q?[DpTVUVވB-ai`RKbɤՄ1 <v(E7fys̻ rE2Zv9wZVwHYT؈B|׹B}JA?lR,4=8|Jۡ!Jǐ!}cySSbq.U0{3^aG\7I]P .{8M7gf,4z~8Q>fۛsߙ) !9G2yz-҇Nl3QWY N_=2H;E#>q1 qvԶ s|!c̈Eyxp )tօ}KG=>pڽ;N{Ŕ=yL( d=p7}6'x>Iao)vY@pr%'\oXܳ9/mBH(d5q(EΞ^ТΝnJwg@_2_ZO6ٝUa9U2 НtD]fk 9T*j44_="x;UV0y@ q|f*=c(EK[?+MyKX>vLRŏ=8[0Cv)ǹ,ZGhb?\Z)۝njhp,}ڮXM觧!iKAU/whr+(Ov,ߝAжMJ.-zH8 xb7p*PyVKvj~?Ep"qYQ@G?C}Ďpi9 =N#&U:5N*c%Op-wso5~"aE{E)6۳5 oHoLkJ11ҚD`f{ :7&޽JhPRZ#=?,>Lb&=_ TJtA7-=zfi{ wo>eu бIqEpGǪR\OBwNӃxb]x/ ! ;C#. CGp]S|#Ec6x"U>d:'8?˭j1\^IEoMtH̀IH:ST}fsZ5g _,H Ga=;ٳjakB*bPrUPX6\nE nGh [^,7~vQK𽿔|`/#k⪄)1HT UT˗S``Xú Q76Xܞ 5h}&h@`3K$^tuV8wp,!>k0l4ob{rM8%9J7(^(<_9r&Qnvʫ{pv_cʈp|M)-%l䲼^ah,IN+3m"R#Qs&sOlrgVGJeWoSh^ʙ-C7ЦRv5kX4*h. tVO$#pO_at\7L^ YU"MAYs->cڃWW>|uW. 8IoWo|Fm"_AB-F  C9r!۾2@ѣn,_6H*Pq/uWF!.5h"TSh3W-=k5>_,۟14SKL2v܌I6AgL{E%7\%{A7 JfQuiET1MJg㍊:C]O1Y<;|̒abzΨ౑_E`$D8( ODj@ YGᬙVms=™1kYھi ٘"nȳc{"._eh"&W^)iJs%$yys QgrXuc̙O2+l{ [s|>gEq^Xlt݂@ oEo瞱eg%NR2mKRf} 9 кm'gmd= ~ºWM:{ʘ, QI{7L'-Gf%K%nˮ͊'3Lyqh찡w3(aH(n[0c͘sM[Џ@JC9EH._x ӻrY{䵺3zAk'zỴZm$ u@nSe1F76@&BţĀn'hDlJlr֗vhƜP#r*n%e 3f2w2M| v"`'pҖ/'__Fk;;( *_8n}˽JxȀS5O6xGLD\C]daz~Ԛb5m`k)%֒Z"w5dbva:D,m)Ro>ǵ/<+ax⽪3S%E 5X _T Om6 N-@^ɋL-зNcq/H))?mRV((;>k3q|e0dt󿏷7 &yf2MN8_EgS%q;@- 8|1>w-oe=0+g]t ycBfPml\3HF?XcS" yTbG)Kq:Vo#HmfD@\rmU+6PTCdSM]ͻ, q[Z/dCWƁt>7j+Y>_jNAo^~3hdlo~MNi]} 0'$6aU[_[VfiOתA*TyoTlDP8)smE>dI{*TZGTقQfu_tQ_/!HEd5w6x5Ӭ?4:_R, %X9|%:ИYOt#$m.iGunCD(weebE[R䢽,ՑL}*VgQ`j>ۍ3SDv 3m!:HZ!i#`㳂4!N$|A{aR#3OI|wAy4| D\>-2N]Uh|WR\"&n{LNkǺW( _BFn)StJ}Ztyr=Z=ɉGƳLOmq}KE椒ݸ9ư̤~zP\{U1G/? gCӖ 4{.aYSgwWT!3;}1nBw/pgc؆Pf!ccL=@Kq4^ƪL \=mZbeoˇ1?4ec Yg.:_ɕ8gw?OD}yۤͺ<[ũjl+N 8r~MyAC eNYoe>2sqE=dJa-ÐT('.g9+R(iіjgw6ag.+5j_ ]qo::"`n$ȓv5)C|Ց,fu* Sj'z>o'nS{K:ڰw'Q󲡂n"t&E ilI/Ky[h|JR+Q).!p} #t7mHR\A礐afW Y̚ߴZޞAa1P!l܋_Ï̽BČ[|!&CGށ{$nL ##E0>o')+J a ZbleV*NuK,1!aQyQddEG=w="&i3?mnɨ|񗤚I3 QFM p M %~ѧa2cd;_%w c6Z UW _Op~ˉj dbqotۘZh%3@+k]QbF@-ZyM+NBs|ўmxixm K` P?-<-ٱ`zfp* epVroVgpEBe*5P0E ϭP(-ΔmI>e+X}>Dc 4̼j]Q b6FNjNG7?QwF }yT9.?0=33-Nzcb}]G(l[ 'm""@.Gj@^[߻诧޷I\Mzq /\EIk{уDE.'{}Pzfe2͵#i]oxqk7xyǯ7ˣ3aދn&r:€ן$Ò&-FYpg[:k:`i{{;=Y5`\Q0 Y{6]"rLJ,XFaȁ#b*7]ERy: IǗ5]:dG;;eL24:V2P))moŃ?iN-=ЂXՅGMd "- T?d^&og;e>Tsi~jrbXw 'D#`b#;@ٔnVOkceyO!)\2]vqAk9 IK@;?\<5}mr&qs1\qA;8uF~rv>fJkEϳ]bNq}&,QVn1G(noUJya*<<DD ֋A#joizD+Ħ3v)ͷ};Oȩ헮..uWsAKY>),b[X L#lWRݯz q4jEnKw01qdORBܻfZ& }N'|7T_a ֘ⰬZ|=C֋=,\h BQ3#Y"f03N :oލyJVI['Σy2ܸb_ XڨbElGrqҬj055Kt F=D@W(`]ſ41{[BÖ+\ɧ3x6]F2⦤+"f%<ʤǝ?&]" 2B;rb*Wmӂ!a6EPlL"^ϕuDul2B:5 .aG^,v2tx X:v!tv?S3nQ|'}%jehOBk?qNOj́Bߟhܹ+j?Ό`$~qIW4Cra7j!İ{c(>;d_Tq]tNKe# H0z`FCL:B^RtћYo~VQ UΟ6g}CJ]բ!@ P$"FF|MdcpJ)y<@DB0U7,4of(eNKb,z71~bӺ9ͱjr^X_/%!ٌEFd@Q59@phCzOv<=oOL}Ʇј ç=,I#.bN9̿1[]b\Q_[Mn~/܆C!u*Gҁx"s6&ӀgO33ր;e~]*G;/;fod[-,=C= ǝ^؂ ?S"Ւ \f2;T]TC):gzȫ5<+hU`%xs$ ڣa gv"1*:)n :.`,Vq.ҏ,Q@UA~?C]ٖB?H Z&KL ?jWo6b?n0p5^(1o"JdDTU2iŸXhu¤>]xw:rE|ICP$<?򁔥87L@ͮL@=5 /gȭ3M/ȐGið `a1#0ν%&yn7Z2wPEɒ +%\yG[LWr",{~ZxZb3OTq) \r'+A{|{XeqeblM$d& ,hٳM=SBzZ" a)d'+ FGP/}na&#ZU -򟉠v.WDUWשL"u,?BX#Ӆ cEM6r+8X_I{jXwڞ%9M^x?!< uaKWif=YU VщOVxt_|^30&)] l=MdN[xb|K\ \ϔzulFOfFnSɋPNheV&$`i@b^&SKڠc@ɲQOmΊ<ُ3E+Tɘ:~ waz"@qR\Qj@x%,Vս,ɶr~%DjO9SFoi8ew[pZ?G dw %ծ}TJ1DRF蓞>4[]<{E-gxSJv%mCRAs-oJĻryW P&; jpjTQ8H5"9U \ }/NFNC=JKY֟tv,'Jţ=i pSv;ES l/Rj~T 7Щ 6WM74(ۘUpy+ֽX∻EmdoM=!xQO3;E!^UWmE8T{Wf%sW'UC*LVSS\b ]sj26䈮1lަ  x6FSj"};8mT(Z,7zѺ7BF(2[קU-ZZ%]tKm 804qg_%'?a+ʋIʠۼ8 ֪Ȫ՜ NtN>2t -CZfΰAl*R<`/;j X1ss?A 2I&g\s|(1Ӿ'?ĭҜ'UP B;E3Q15u%/0 [mT33Rԙ$}ԥ t,-5)]ѾpG#_`{v,׌$P3םaܹ '7%5 ^[L![S'V]CQpÏ0?Ea^\ J :V$w6YEojK^qma5(jnm@R @L1ٻ< °_5_aMj9 /Yt LOTbzA:iٸ>*zP[']~`s[qTǍՅ^?K+"]Mvh@!*H|&4s{;p3R}avf~Y=8hjΰv%'@%Ð [0KEhh܌])*qCg8ނ8.H[ u,;*`CV9-4FնĴWͯ4+n7c_{0'걞=2c .v~,҃?mbHP0\3kvms;2yFǔ:FsaVf% 5y}J8 :ڕn:Rxx,ד-B9I#ӼX4["/q) O1߶üBUUNjyZ/ ;4G].Td7Hs2 C~ǫ\ZE,;ҭ<R3N^iUשF9"xpSPtQUZ" #(M;r]wݔ91A(9Fi I,fUi~Qb 4R) 6P KAӲQʚʪ ޢC,;B}?76?T{eH.])>!9xq j\zpMh{6ccZ͈FisTLu?TęeP r>SɲJa ~&@êFUKdƂpAWVE.K݉pe!yeJ`e}/^=(&F_>(=RIs8x&mg芍1[g1+s<~b0j]\۾GNqv$~{즭X#=+\ݾY_hix|uHieENaIihOLI?9:IϬn`ePH4Ӡl7i@\sC:6ѫDG AiWhA*0 -˜5µ+op pW9W \^>cbSr.:f$akŗ2- 厨sc6vgt#tkK+dg%F=䓆.CƎ<^cgG F-N޳G^2=smAܜ5s^,煾ĮOԤkjeLrJ{:$ Pe''S` bq(]-4ƖEZ୪+m<.Z%-$v05bT6?M|4Gڱ.^r[h:U\_/ b˱E[ INnz&7ny K#af@.Z/uzUK*LC?M3NSXy+n\N4jeG9\ƺJG09 U3 f>JRFJ= 3 B9!7!DI6PB,l Q#~Ս@[nh+ԃ4*dЄ݆XQjs\3s_]h n:jn|~2Gn>npHf&D4[ɢP[9z<5^bۍ4W :c]%v= 6)%2po"+dP ]膧1#'Cnf?dWpvbǘb/$D]%m/Ob:De38睻C 3D{1 vi&/ֱHILTrm^&^PYMk]'4ep15^;ws~]2/'va\*Q*؆ܯ;]dyI?v˸Z)=Bۃ1k/dw~@ӍQdR!gikC=_fk OsMw[dr N1 {*Ӿvrsqs NV}lKG5QZضl dJ*l}AwflA0wK9d6 +߹5=^YX-ѱN %iQ@hCYoB\VkB3 CT[Ll+ ڸda/h[g A4WGwޤ&fa5]I`Jio5T&X@ZH!KSrlp$2;:XQt\, cy;2LX=mo_ʉ>!~Mnq \DVB7OYаT@>|SgpDX(t`є5D+@,e1#=F4s߬Kc諾 C%QsgagE߇ n ztzZF2G7SX $k=]$ ĬX E#i%;gAX6/S[ŅA PY=d(Jҿ܃*rWx$zN` lIgāԃ/LCU b,a~5@Pwۀg_{ؘw`xC9YR7>8j\k h=ńEʝfHݲx) a|s3B ^9*wG3t"%~jϪ a l5yKTfP2<\"JFFc%SPU^}SsWek߻~5e\6H!U|;pYXoP, ̂m+~RV:m-׊ϻy#JFy/|?Ǩ#lFei`s7~Ϟ*DSx5NMiȢcs$C% ϼ}jѡߝD[G` ^mR#d\sr  oOkkM$eMxsKz;kRvGPQ "|,iMD.zڎEfut)`?09N7wd'7AԲ&-@<=>ۼwGEՂqQ|Ѳ^dM1'f0ztR.~/g.#8CXV}ckw#{^Lz38 68TJ}C I[-ɇ3?(vrMwZY q-y lP&E^Ϋ>Se=^gvT#JT~+ol2=?T(d멪UڕMm2M@/cb&j}V^ˎºw8PT]K bx%e_dR+,À5m$}UY[WAf9vhYNҦbl-wςؿqa~}vT4 q 8I@ AhKջ6,qbG15B> w,l?8A,ya|Q۽5P!u׎w-fRf-|pqvDl¼%Ae 7Q q倸VY x-*6g&y']:=#Sh\@Qs! [4uZ`CWVzS A Q-Lq!tMD*'TsOrV0-S'sAq^@ȧy](h&)l&JV}3]obMAGb{ #PTOAo( ]vhhwrtn S$ELF=]0rkeallD-\M6*/_ݼHz$lW\Md˟Hl!; 7ԣ6օ>l8>* 囪 4ץM-٭1B5UEs1k 3z|L+bKI''+eԙs;C4i*qME' X0QB$g,>EIc(DŽ1Ҕsgk'J$]ˮUMx8Q#˔ 1  b l4iŠٵW(¾2ih b;ۂ5ZE  RQ@ XdTV7^M",ZS x'].g"rժcL^6t#1{ !6(=*: XyG?39v.g ]`q3lC?K[T44UN{s0URqwPXJ3AwAi.\Yۡ#{-PmٽFE]LUU5Ia>y m@1qnWU`55!{5I$ce=S藣kx13{TAy:B@j;{{ @J.*ZX@_?Tn1 Pa&@Hv 7fR/<}z ^L@ζ$*eeҵqEQ.۟)Mɑ5Iڜ%!>V&ЫnNlYr ABdxMvpvјUъ{:xQ<)y/o߇,L({ Y dy Nlgetcg;4۫9WPYr ۚ!R \{Kh=$'6Vx'*;hE[EIShŝ}{}9HrS0`R\z6Ne DZH d::mvL^q_jxmb=G&D=z?A!Z*>8M:aPFE9$(x"^d]f)£\LAꤠA| *ne2XGח JԳc~kVE'=) #[];9@q J .ܯ?ЌD1˂WP,mQ^.ƞ;Z>@|9/X*x=R:cj'P9&Vy+}H'b"mAm7W=+{~9iN($nܰ$DN`q;ߠ>dǪO.p$irmDyN\-Q!77 ET 8ɻFd|썐ЭuܹL1諘HGC'> bOqy;fA6<`fiңz 批o!*Y;Hm [ΐ5}Y+ΰ?xhؖYwנּDb@W;gե-_KWfz@IcK,F|:-L;5^4˴ i(̑wi$~ܮХzAϏ/y$" zT1Jw8Ymu4 NdYAJZ*/TaԎ7ڟk#9v?e$X2GWgHeGri$YaaDԷ,k\ovû>͜[wC-sҳF&OʉrPn>N0JCW[LN,{M r"BuF^DcuA^;Qx[^ =%}(؋.Or8ߪk<.*sc'6aU.uCk㵽z3,"*aI$XØ4͇&PM75Y?@3e7[]+?hC~ίdJut%R:e|YoF6fkzc軭bz֬ $L9?DY:U+p^OXp;dh" A"@hh@ "h Y3ydI$v>_UoF @K9c5K` Z* LU`Κ5J)g,r' u}dh@R9' ]0' ~HBs0-_{8u|ģB򱱽xp?-T1ԀiaV|8-,|h\4dUF')B&j0?䆣h"VRaj# db {G6g̴ YS}Mʷ:f&Y&*#kRƄ̦ړVx/ָ w-L|oxK^2pTA*ԟvi\=gօ(8(o^  ,a3ǯXH)~7K!JoD?Kk|j)[&G5zYxi<.AŹMY2ȴݷIW-ϸ#J:c wېRrpZX!j7a;Ñ[h9KU\4孲 2M {83AR{:11Q4!PNQl(0Y'']u9g'+eUiZA|DnmFCS>8O fusyָQ{IV\SxIzMˍ 4?CщmVoCKZՃ @@4   4D4 D@ @@  CͶ4uvKX28ݦ,a}ѵ6eƫ/訂 ޑ&r;!<5 '*%6Sؤ=uN_2&r<yM^We}n{'qIrl(ņWd$tWlTP;1NȥY): |k*mAۡ&hsTQsH;Hj.HJ)Ʋ䏱/*c/ ^b%G >]y2|ǯZ! e ,ޅrqJ,='O "   h@\m4D @ M FC?0n\oi^݂lqe`%B^AST24Ŀۀ ڊDz |i&Ra\8ܳXR`.O1+Y!IS释g)#wr1jBW\9+fƊ}<:۔nE=i҈K`Ozn."Dk 2tZl6!ڍ@Wʆp)Ryv!_$v# am/%Gzzd.4m O9[aP'c(Ӕ73q#gjHrUZ&e7_F842}e\pS])5Eh&6U"KٖTNEe8_.3徂'R b5+UkǒQ6TtU]cJsv|Kˢ2f}O_b u7IVإi)T}j,Oj(9-)8\F;X \RCb0!_B#pgb#^ܢX 齲w iClt~xSP S-^HX Q廾/QudD\`" ƺ܄9dfwiS8)z:Mqf3yF1LڇݸS;b\r Ȏv,(u^zPm:3ɚ q'fԱigTS}ێe,T`M0KbOȦHS _b|=S& Жҩuvh eYZ9Hf=LX-Ǻt\aZ+.xt(؂C*F41ǛoU|Ao/38 ~Lj+-F\>hР;u5?&AڠV}'f "qCWޜ+ g6H׊F^- 4%Jk˽FPK-zr1HW,$؈&;?ٞ[qu¶dCtw"8 }o*V 7%Zu5ȺBl^.N|WIJ(U 'rħ; 1q ^= nTW(%f0F:ZNe5ıV;l<5Fq$ ͒NaۅeޠL{jFFEnK b' $H&KQj \}VK t.:ɗ͂%b&4sxO61,kp5: V|º<6jsvkmZڵ1,g;-Ϛ'OEF T4xqyfl޺9b[z4CX 2lSyzX3rU쟔!-$ m"Qd+zE]b'=ccc|t;V?3 h2zKz`4{B PRvk+|==4茍|L @uvnWƛ8Z 5x*uӷK_j@_1)QI2!A$o_!Bzrz 7J4wc3ĪP8-D}vz?40:qOvb1 pnow{$Y|Hೇ%wTΌm[L$_2{Sl#Hqr1DAʴLe;{{=j.@jԀ9mc˥.gR f|=lWkw~}SD$rĴD-2d)%qĭ8ۊowJBj\r=>ȯfGR p YpVa1w =jH}|G Z9Ldz83 &(~@tOkڱwHmh&~˹4,J7W CqU8pSoFm)tTdaL~/(^T_ tƆUc$e&^;fRfjs\jZH]N+ߩ!Ӭ@6{cۚzg|۲5bkWɶvvٻ lM/w2(m4ӌ$"' E;h]/U^R&~ .xN58!:YOc,m;(o>Zp4^iyK(\%ؓWY]ЦZp%%_LYiW( EwnԱȧ ]f&o*ݱh#1~܇hӁ *$a<$(/]cC-^}45΃+)ξq]_ĉ:;# jݐrR/EtW91vN,y l"EUu0 ڎ"d[0r0]svQ R3P8 agxj0YiI=3~/Y9kJ]|6¦réU#o댣̿Z܌mg;E[$N)j a N`׎,8 Hn*Okrי'_ ܨ*2ܕGL5#Hn]2OMv‡==\lh iD֏k1RR D'k(!e\t*Z%ȸ@p^/'Vjr8mߙal?\NcocVm`4{1$tD`D{%r)/'[7$=CEm}ǽ!B,C5qhMhmIZ 6H]~W XTUƎC'jf‚V4tmZܺF H`߆HubELY_搌]` CG }cDq}T!vR!&_J {>I}=^`==gG8bo$(ҼꓶMvU!C0>:;tTT<ǝsr.o-cra6IG#ۇ6c-NـEi+DFL#74咁6Kr C3FnQ.QGżp!M,;6;7%Rʚ3B8ƪ]-Ϻ Dl^+/:3tD!2$߳)אQtVmuDN@ps鍭@ ^~q9c )ʩ̰zɫ^*Rm׫Zеm{&&!2X( @f:H(6OEܣ| Gr"n\cڝCɼ8&trȔy{;iƵ[Eú/|ƛ~,կܗo^ }#Ă=ǵz/|'LڪLi1&9Hۖc;Y[ҽ]IS&tv#V_)QA-_f?g+jߗtP>v3&sSF▹ iyn:97ֈY* | '!Cv({*,,c-{#̨W䳿Gr~jW=D)'hf;Ҁ lRoҘe"iY<?>֞YJs0b̟5;sFJ:* ;Ptҵ+WDDOe.goQsN!wl]Fg[L ao|¤`JL[ >XxGVeuc*:Fz-0".7wbgX&΁e^1^VWd yZQ z-h)yT59aH W(حUF&jh4u7Mm6.4WShl5u_k?'?tOG4g1Ve甓w92ɮRQfG=$^'@դ4|y`m)~}iAt(mŚ1*`[!qHDc|'~WTڪTD_T4H&vV܊a5 Ai*ۂ+UMʻ;q,.Kֆ?Cx>>0RV&Klvm˘{n@igsΞ6Z+mBg_oemܥyTNXlW3`;6oWtcx#Z^C7 !Ŗ)Hr:^,cbcj/}`HWqTtΠh2'b6 U'},1}}Mel<O\]:䅮u^5Wl2UDjF0x|) Ϩݦ Jta^[e_Y؝!vx7nFH! yFaR5t!3_2 tl`j(+&YH`]i\+U_h?LeCl3af{jǒYѧ VaLFv{-d(=7;Xk[ߕp}'"1JL@JJ*Z\YOaEVt5,kv"1G7nTK4pt[ 砓skf\yʭ^gweHYcm0իO~d)rhxĽlήOR 鱌WU;`f v_^=,2[a&NeͧI9&78?:H77Dr=r[uW pWw^ש"OJn,BgCLq/bftJԳOzִR .ic VB+2|ҶGU7)+3wg%@c?8G #g8Cn5?'Nd{{ϞKrm8Z.SM#|Y%C;2{0E[̥82¶O69IB }}n٥IRe#@{j=G#X6k#n)8 _5{̓e%1K9#[dE3!Cܘ8O>)pvy<ӬݘSg,;ejODTО&M9H ufnˤK7BxL.#.>ybtK PoPid(DRС ˟V_%WGv t;.R8RO7sr~r/.^k?UOPXnuB +6E0 I:θo_۶7̽MRTR̟/T(op%'^=d{2 g{θ6ɛ-L,Epne¡^4 v<[+D6n(vVc_3MR:Cc+B>0O\lN ZƊ'g"%!g]r&2B;xJmR"'ԖQ J oåSĤsY5HIEKpܹyP6mG.T&{h4o9 uc! /K%b㰗7`=6+2u?#NJvtR*/!?“u=lŹ#1$BUStZ=N괱~M[m6TCI}5*;sU"׍4:Wa Ѳ}dmG#G\`y_xzV.)ydY:VDB$cmL| \캒˜҂QSw d\S\yDe@1γ5K#Xn`wD5jӰd7wtx$Q= kDuqD^paDfwqZTLnk>lzRa;y}> fh<u1x''{xgZøIt,%嗚RqLїsuA$G#w+S+jBQj]r0gyҦl86VFY uQ8C9@@'" dž[C#aT@t h`.=淴k+RUfC;Vo猷U,reԙ^~#wTjb@F`lmMꤖ؍Ӏ_p,qD B){)Pˊ Lnj͉={$*nwh2vaW!G>矃=>X-y ȌJ щkw¬x|`[%>VcDc}aA ;WDO~d&!UlWg DֈA#鯦MKȧ}K( w_+ĚⱁVdUoܨ[Uc>-}R%h"㴭n"%ѩwؖ vZ#b| JTFo{y/ >ʃ,_' AgDeN_}U [ev~OSS42vɛBBF(cγN趾OF0I]dP7V4QA0tGfJ[tKݹ/3/zNxIС*O6˲9tOщa =: 8m$mtL{R_U168ath0Y'i`93=\i5˾4] zO*o ]E@7I ]yh~؅u }څ~ɜ jjGq堸DirƯtRcb8y?)6ڥ%. )c@t8A7/_Q/OvrRArC&X,3mʲvpJhnhv49z'M~w;Oi''t [7+Ls6L5JB;[QgmgpdC--XTWڄm/dK,-:@E8!?Y!69MM@d6u+tp˝ιP]ع`"Ukm?z?9 (QXV~WP|QY)DCexH[w\zwv[O8FgNN3ЗL[&6ַJބt~~TYo+3c1grX`;ϜM4LVWdmB ~^ޒéHpq"KI66QX6LoUFtY`1Y ܫ4+CU"ʎnjLzhA'х=N94YGTll~YE75]/,pW42SŴ-irbfݯhWS0@ffhO=z| G6 bW,#2'J%&9cEkK["lck̺3ZQ}yDIlenPj&p#XH:>K.>U3K@ ej{|Bz,ڬXϾ$l%N{xeM.c~_zF%Wf7Sj܎JŠp{&]^iSŮ4jIT#kB'H\baڟ kki_w!>_ƾMktC)zO=mu) w~pH1oE3_G,_Gѳ:kΝ~5τd%ck+B!ɿ!>Ca'^OXSmB!,ƠE)?ϊ" <*OQ!tR$s`5XbsLskUZ 9wFΖKU198rCZޘwK2mOPl]F;*%4319(=Hm~;h1EOA奜 9jQR/PR׭xl Bt{ًIύQc#xyaWT;gTH7E!S5@Bs 0%!=GtZe RϷy4WV^(Ew֤慕?DՕwf5mEӵm=51j%ighwitS=09"rc=uH:ݛqN>Ω`2^vZje.NDt'1#vV;ɅtpNv)ߏ߷IxDL4 _ vjrBhYzē%b+PӊZf^b Ht=mlCY{G O'J' 3`|^VB1ص|_88IW *s<Ѱ7؉D~b#`4If+XH~evWN ni6(IFIN!&bM6}"m@eSywƋ+V;Zdyh]6>1LArLx<raL0ZDkp⑼a`>G(,fּ~!gh / RYηw14d9@% YO Rw <yp21n:$}dƢlY7]^ҞĊj.'p?8p+4Qa~߬XiY \~+}$]ɍLN9tThe {)kbLWb1,φ mW*&Q&4)hǃ#C:9o5*tp/Tuv8,`krZOvx|w0$>'%e3yM]| \G\+,'yHE7}f-kD*I-GO|a39FŐR`MAc9y{=f+HK4ܨՄ=}`Wѹn&$[*Ƅ%L Sf&mf͌\6k'\#'<3ъ<ONgx M$300ےLΣl?e@ UxvCh3{ '*XYZz֦au K_I= PH8+Qkr)G8P:}=7ݦYָTэu|u)L?L[BKoy:4ZŠ=/nl 9ΑO"SȐOΝ%rZoZ4{ܦn@NDx3mܐ.`Z6MկU ^cU S-Gkm ~A_CA>Pd54> oK]0U١%0#oƮ X ^R jTӘ[+lz}0xQTjMAޥj ++tIcӏ]Х$8=r#teo%cnZyfW,%_9B'al%N1-{ai,C$H"{[lnPgO~-1M % %57f $WfהpH#S4InA>ckm(CU_1p@搳pw3>,=D6 ת$A$ Y< 3 D;!3c6X3i.]M+э:r&]QDgz]Yg>-,q67p/W_nf4Nm${˾]+IHɭ)}+c#(ν3s: UX 11rrLIk>P!' 墓:5CAbQ \W5YY[OFQ_oHU*hA&p6q_\qD,3h$p~WNNIRs+^9k#;N٦Wbm|`c<.mBοDW5tܧ?07 ` ;_k v)j!Iw$0,}Kqݩ\tMaw8u՗7I\[t^q4ЖbHNJ2lpY4>5#Mk'EP33lZ:ҊO$ ]B+ͥ{ s&͆.NЌL˃g<;DX.Ǻms#`NieĊ0δ]1wikys=Aoiw%GAB:).pvG3_e~B<4( rԢ1 <)[eBIid¨>ь؝IdkPGeO!@e-1qufR9k >):\YViKjdr9&s6ɦ*,$Je@2)%Qo |af{[B'HgsXz țWy556- ('=Vt6Gfbp{ݺ$*JE<$g6 |m%pb]: W(K$kMC `'u*G z v jimkw6Y=5F".& }霳O?Y8.@?$ަ:2MI#d<TQ n'nwɃ!F"o6D"D{t_/FI: 5=ٜ<{̙9ϵ2iFƐZۓ|⮷FO WG=Y*<]G5eD<,@Yk|t*aOR_M3/YnpOvЌHwD5F̿g0A tvPn{$ v~R) = i1uh쉼ߴF?7@^'CdA$I+_ 3}TL'$J)Gh"6Wn0D,ldAo)*A.]%KE5 ~>6c [\[d_FEQda]:o@ @#7F /ЯXd/erz3ߞZ|<)@)fugs{@~J {?b_,r|wB(1UB 9;R@ Qؗ&a7k(ک2樐yt.o iEU {e}j{MflEUj`vLHR,_;݆~e"k|sWqY>rlߏ3A-\qq!NT]/nAMCltrVN)ܰkZ 5Iٯ,3X #bs`t\5DaTRƀEBk61n8Z*x4 sIafaii9Hƚta D})v.IY";M?Hu: YSn-auϸ}ngpX|u%*ÁS@!\MJIk^UkJ kdM|SŮA;l=*lF8އaL*Ug8w~ߋ(Fq:gytk4//b \ii1,FX\ }ӛ܎­<C۪JYyqFeGa\⻥$j]/nZ]on B:%h;Y$Y8_eI.jB&3sQPO}Ěu?FXڸ~WlGFqBi>eN:nBz]*Ľ22u*)PZQJ<ȧs;թ( 1W'^L-/L֥SIq˸б[ 0)=yI~?J>xbHn=o [ )g[my&>¥tBTYjӠni&3L)[m>+}8XKj0>tȈc9@QJ&@\ ]hLy5"x/7՜Az+f ԟTrFۘ"bxQ5[s 0LK΢9 ;TpRzirRO|ۢK=>uD(ذ)E:a̾69/g/|l/4+H4Г GTHifn\U)--\$a PN䍞ʔz?-T}gܼ,؋:[VcL2ծ+e$T6j _68T{cx1hu,fo un|{$mydvvQV'_-joBv'Țp:搠>w~{Z%2gsȼ IdiK#hΥ-#޵^GU`Q{si`s XLCM5RBqiHP9^ez]lq:LE%Oz;y=u= jG[>?- 93C@_H*-7 l8*mٺm>'(l Ͳo3[SQj7Jr[e5H &>f kֳA 7sWI~~2VIv>ڕXu{ 5KU2 |u t#AI^ Lib[?Oΰx:!kVgnyjD.,"br>Z췽3=6;IܿQttz cn2;IMlH? dEro O:-q³ GLh}I(Ƹ\?;cf>3+UUʻ6yq(~Sw35 o~j70i-Ͷ=Wv jb+E4Kmw#*T0_ ?uP舽xGo]*ĶG 宏iM8|AxKe[,Ȏf~k˗:?Gn4ܹh\ ب}K>Z ;nddqh?r5|g(OkFuq[uc7Tf;5E7ҵ*n5O~I;<)rnH˪R# !ַh= 7zk Qa{&:DXHΓߔF&Q w\0ZnD5 d\oޢUJn~"4ʹ {J͗\F qlhܕ@n`MNϜxGlD}ɠ.S (Y{ {2wHOl&<[S`)@j5nhU$/ճN^/Qoku|iΌշCl_?bfƤb8n?KHj8[#6U߻d=bv$Q4f#~@oVu=Pvo\/>N#MV&$DUb,MZ47ƝؑTR:\nYTbB|x{?&S3o^!5@t\Ih%!W%^(HI5[y7ΐס~/}IHu[nϚ;E?޷)kU֟%I#?N>]Ym"ՏbXlU >L5rrʂqd;˲Ǻ67eq$@62%/K +M J@?^ ]`[6,}EO)q󥵎Ml?)[ܧX뵛"w\!4C7cjQ#xijYABGpiiXlcx gp hM?FOY?aBKy21ZÇ%%Cܽv74ooX^ q=*NjWڷg*;n>1j/_~94W㰅2ɥk M.6> NB宱yx~-yZR %n02+lW[t«Ys50. W\"_m U'$i:p J*sRuEׇ_+ y1Q%VvVhy1g_vPr )a,1'e)_3Z4jĩɭDM*eN@ӯw`$PmL>(Z$֕ Q,R6yM ؾ32LXIᢱut̅pRxʈRD2؜>yb-zanIXg)8l3XøQ?42LwWǨmJY2h) cω9[5nN ʢZ!pϸꝏ3ᤂT&~.Jhϊx塚 u"c3tȨ/t Pg)P퇺RYĔtYͷ鸒!t7͈_W:3a.EunZ"suɝ~(*|C)sQzG֫V{zÿ34~d$R#1]Iy@㰢Z,'saߣ 'VBz?2+ 4;-W%0q >(⸥(C /LV/8L8A2e9N⩎VD洭V6w/&]wy 2˯ U%dX&w17)2vLHBUN_dH{cD5A^20,ЌmSZ_ltCAnhϰj ֔BP[x,7']0]۬a3z#J&x T _{3SmY@%oT՚ 2hXheO>\h9{4$HR<`"[EFx=cH[{ ;XΣ'<BEY:isJ~ ,N-o%/p-MĆfWհh]l5He,7>54sͱ-rbh"&.`SJ@1v3y_3ZP"षcHD PUy#BW?$Sbi[uW83 # dJN,٤WEHzozC[ԇcxJ;_#dT݆ U+׈zbQ{}|;}jLuk9>$o] #nCyFcWz=x'yNg}cSmJLb*Q چ;Ƶi%*)U0 u]+aZm*!~]nu|aJ?$ji"Q:|f ]},:-$ ^ c~H4Xk~]1jYNȷ1|_.sE21 N{]?m}__dnSjE* VݧXfQ3˶Q@G8;4=Hx %R0?c,lLj jnTm#Z!˹ܮ'*a$Ipqf:`.T޴%x] h)CumAs!Μoy&bGiG30 D_l s;? ."aAWE^عNB2[-0kA@Mt /Fl8+]iJLJVoZH4%f^V[Iˢ[vu0G9):xkcRGGEک '4)#HQQ${XgJ櫘h ZY% 9ʃxd3 ~9 &o.K#q7z9]#F3/&`ґ9 6]t8HM('i}! A>Ҫs% ހr51lr}]Or}ʗ?X[zjT#˕&Bߵټa@yLLց,]쥏LOML;j"\=jp_Zag  S+$32V >l4zy.Di %HU߷me=/"8ߧhͺtX@Am' :t l;C(QPzӓ؝?!E@ogq7ٌS'@q{]<TV_t$Kn7j+)kVHj$:(B e4{-åT WAz?^)QxE%C&&ՒȥEnckyC.٪$iёhͫ-eyژW"OPcȎe6=X!7mbJfZ٫&$ah1KuS0uHM={B_-A ^V 7 P&S o}`y%<[ԣo3Dɮ#1 (.w#etuЉ8&!@gkY#,X{l%##LCA) /;J3_gf߶xG# |N'4XI.p\1I[:)\J$V\ׯ^UsIX\UW? l?{H& ];ĕ<:]f[Z:ܸǺp>%.Rk7b 7o7n6Ju%_û?6тrng0_fVj.)~ݒ\̆ QQw2tzXZ^v)6uS)6Tl8c^/mWPrLgMI߮~[+H%\\keNv7_kœoztedIFgkiWo^4fwJϋ;&)vr<[uKiϺ!Af֣wYE𽫙c {ȇ B7c[*fN>mv|ddG`^ UK[D^2Uw,D9S`p"G; 0.&krN ӯ/>SvvMqo%% ra>A"(_)Pϸ9߀d&7C9ׯ-u+GCOimGy1酽/и$"a_Y20{R1s.UnR#;7݊a5 (sV4 o};}SzI]F7ʹ}JZdP>&\"1bȎ<=7vR!1; nƴbaٮ k.7%XUclyۈ]+>)w(LEqaK\JjHZϟ M JR-hߔz(gcRXk*u#9 Y|T+$?fA;hz@ (6R;!OA!9ɖY=fqlz02Z^^DHrzҰ<25}=V.v-%FLфV[K .08_ X5LqɄ2qls/Br3KN<>l} h{P^ g*Y"5j@p ?5 R@hVtBJ427hpRm!ʫ֞&ĵnx٩jX/> 37m܇9(O{V0#&5d5a JYbPg؂sMt .wS&Y?]ϴ@Tym&R{.l5j~x *vpS 5^Gs#$7N% ,1ӿׄĻǪk@Dg~8b$hN>=JI=CSi yp[[xkV|QA7#{]|N~Xt)aHXYdwdiK]PȲ9 kPjՎK-`:RnAnZ(pO(^ځt&d 5xv a(‚m~lĝ/oL4TI<|#C䆝REq'88c&bH䀷 Cy{]SI*{ģ TSu{;3@NQ;׷`hU"-F!Gc3x{&cvZ%O"|a[EbZ~;6BMѹfto ia M!X r.)!(D=ï#11,Ǥ+gڇ5 }`[.]2h{R:;T86[iQ{JCZS1Ocѣk4J/C"ȗB㘃 ⅸy܁ YWL=HrVT݆$O_SYN Ҏᱠ,)V{F4ث6XҨ%&p8~to U 6V+)u!27G ޲6AFW p  JJ*ie߰IXi`!Qlߴ"NEi_98wD\KzcPSD+G#NTی%ϖmʃh"OeW/E#3 P+59bި L ^b8L;BS_4́շSjSOpmiJ .C}vUެRs!fb9"n`.5{c F3Fg/š51OH`QMGR@?i|٫J!;4P}mܸʜtraWIFJwN'I)Ӱ"8j]eG˦1cQ9U$:)U<}59>MVL(*7x%nj%-^B`ܕz(vFr w[96S~=mFQm0MNv$},3 b6m*4<%@F܉w&cdWGeScXZ0 N)}x^=Ȋ&*650/ 'ɦ> ,pw:ˉ#E\~ `MFwD$aTzIu5k#rWOqg&wa\'U;|DZ+ҍ&S`v ͘dtgb j-⊑Y4#lfNqvim9܏;_\3F)b0|0(ҧ̃)(هƜʼ9:´L=3(!S-9˽D֥t/u(M4<;-^Kތ;=!,b>:ԋLW+{ rbauqefȥ(~V m#<.6ye`MvQ?X7vy߼skoį% !4)}DMԁt)Q(FgX@)2bwl)^G=r^Fn 8`SL>B~RhZ&j#S 7Wd˧ a 6n?gl8xlGO|p^ %p?OGpEMsD(\Dr+T/wD55e=JLsB*pا6]ʋ!G'>>#V 8$JmUUGXkwLI܀H.h Kx "mʶ{'l%#5@X4lMQdwzԥ%i {ڬCȺQO3 L%ToZ |4G>4on 5XԝfBG{>M!HRμ$YpA&֭.dBqt˜+Y0J|&fzv )\zWL2Zξh3읰G󈥛\g`s< DmKƶ'>h6y ۀ E}vXeXo/!;2-$A|]D:-H 16 WȖ*^% rr !5ܱruN#=db,f-}%VILJmN>̩ rqʭnv&'aHKUe2ޔ {* $3̈́f `^>NFA'CkDc~ds 6w$Ho秌Cܩ셅0k-c{mcrL1ɖVrp22w6FgRhV?gY /Ŭe]>34 UNhW|%;.8qy: ƏV̓YCÿ_C#sԶ+QjJK<>IQAܯz p$eBa4i1 <8`Rseǔl.riSԂ -aM4ԑڋEIn -?~We[m/0ODFBa8/jndm~ozFuXӎU+"/IwOgLpF)р{42CaKkbdmK71ʓ$t (+9Q<ܳe^#4ISzp|Ș˽(oե?ݐ Xf׃ⱪ$f@cN\?7"ʭ<ӣvb:j['bQ= /XUswӑA_mt?0+4wBGGl>oW-~C=YxQ,p QgB24GŔȗT5ߒ( E g:e.qUq+/J >$pi} 6h9Y_z]dYtޡ3If wϢRJ|EOs_vijv 3_wc%b;C^o`?ȉb]]$ _o,#mbn/8+n]5QnxI 3N`j%vr%*ԭkmysT+e@.?a.zQfC tWEŃRmy-6V"5Pz5G9Vŧ=&MuޯAI-E(ynC˴eGZ#QeXDs jNEK!W+j!iQ(U*۾bHu5,Wu!}-1pוCb֝BuaƏl0 ȏGfn plFu'$4yυƖԷC_pEP#eelP Z5,)Mއu;v),|$I ۜlY[c~l#RdO{P ڞ/ gAW cYGur]<:FL9-R`MnkS.K gݥt_}zZ8O֊8-| k@*WM ޸NTZvM!°Ϟ>On>D␺n nU|6^<[Xn߭ E@%ㇺ@PS 9 @-ĹvOŠܫ9 "Qz4مŃ;+R^Gtoen/RA\(X }EXrlpvQ9Ȱ'j\^e՝4*Llx9}sH# s-W@|m\){Vt3jN!NʬsH[3#dS5*X5PwrsjJZǢ5BÌ{3vn~jL*His+ yP p,`ЃE_ 4o:`/I9EAw-P}x2RJ:}i"ܝ"8rd; j_8q_̞)v2mzώ$FAuHk@TؓK8BSA"Y^%yZ4noe+yn4*Pמ ڜ`4ë_Ao/u/AٝuS5HIk5!libG9_SRx!ldRFXT^ǐHYm'Љ_ce!=Bst%5 o 3#2:X)^Id䅏3Md5hZ J,\>?) gmu1%#o?eqj0,6< cq)mZy Xش.oN"{0QcpayGl2,:էf.kD(vP'n1ADF;A؋Co=ՙoWnk7ivK]}x:cSnqOo]VUlun*5h}1BÔv%i%,5IhI7b˷^Jz$8 Yy?CyC]ůop ߮ J"Y F*zU%ުbԱiݨJ5|!m}[f opҞEMy/Qkq]T:B(UϯJ7ҥkoQxVe SueP:kf59D=-6J-*7ň~;si Ū-U8"j2<,3 vJ`X)K I>mpY`8D<άBDjB؁F|؍ksgM[Eibnp[,'E BJ '" {9U!X~\Af R(hd"odV|]`=~pnFÍݎ_ā" rBv3 =U ,)seaQK ?~I-Bu]\hK)W̨'=.d! ڔ} ޳I3(^2ph{|YiNx0q.ϥ'3\hz)`Y:]v#*Q7[Do&aauOMr;]z"UT]rX׏/ra牳Be3hW3F|6HSk"J#y`^8Od&lȲNqTymP`Q)ݐ~n.ɒ'Pjy'?%Qv,N83_IPORc}48LAwe~BZTwvxTu'겔㟖*2vubUzJid˓D2W'Ǥ q=ܹl?綵pK!wt&A$JLx„)%G6wAx7%zF^ 68.!pwO#G%{V.uX < zID`;Ɂ']QV n^uuI{]fr/oPk5V3wͣClxbK;zS}QqmZ WC'@<eDNE$9$VI20n1 @\HӀ壗%`{rT3&^Z߂0KTmۚ l7A>K[R'gJζC@  "+ JrҎ83xEsn#[\VMҩsalG*r'lبQ h$XnEt"+R=n/%/}t*P7xà\\id4 jhdjx_{#ir(73ͬzv)0ƪ\2YͮL#h`~;0u)o(̉<};^Z>6E z/T3R+N{oG&˅m0 %L#3V(PaDJ;]gLz RAlёݵ޷l6lqh6=)=AJ34Â],D!oG5L2X4Ձ EAnd<-Q+)c.DZ8&ۤa%XVbDpP'HC߹ hvhV5IGlX~ L;[_@gx:s뮼ϥHJVDѺ4#Ҁ}y矍dw{Ff+iB;5i wA&OcC/,6(0֘S~a˷rtV@C4IRu3^H K# V6ߎQuп"G'q )6TIV0ue>zR;W{Dbojܬ WV{ p6d*k8^bC,-~[CWIǟeq"Q4TώכFCW//jFV@N%'zK0AQf_ei;H^pp8 tʉ4z(p/s ؆%pIyrroi:hcv@@I̾niM_.L_4chj$5f[b5{V$K* SC(oձ3 [A 5}f1ecG SʷtqVi}vY>X\4H?*e! /*Fle6n0Ћ΀ Ce鞠%Xb G*˓dmyZr#A{_N1ZATLӬjI'ˎEi1_Q늲d}v7ͷ ~VQ'z߃d:'ϹˋV(U~ŀ{>اs§A!q!L/y+(+(|6PqARc () \1Y0+&\[ W؃uU R!X̽K |_}۝A֢m_QXex6[a4?S+ACC0\,Nnd;/XGr¨xl2SUǷq*S8o9x-@az[69;-s4Sv@({dܯ-Ә%\L1tn\= =;Hӧ6oϿ"ha:3{P?E">ijrHC,Dnd^{@ʞd9KAϣocD ƄT0 {frgQ>t-AC/lbڻxY=*5hzXHQ?[_3ECT :e gKأ7=g*pV݅[(ٮJL<> =zn 7M(PK>!Wl\R ᨬ(+lr@ ZnvBpޮz 1ɔe4SDŎm^fwշhBr15xI_ Q ,yDi,K~DAvb6mZYWyUT7Oc"(_5%lɤ  ^>Ļx,[޾lg2ǃn(̙Q%"uf={/Gd7~LtArz'- ͔7*}f`f\L$cB|p-mx>zρ} #9m& d4մ: hȠ-Uvr)MB$\a)\d_&lKqk+T'._ɴV=QDӾZ%zF \A M#7\ [,fpB*Q'7dyyC'S!, ;D{e'zlμ CG/Cb#yܿfu%OzZOR>f)ZSJ6t3 YҧEEK\RlyGWs[ rV0>WGۯ?H|/9 RAAc#30j$" TMsuNF+פXxg/(^JF"0V]U5NIUxAy_X"G֍i\y;JfuK`G~M3P4|MVppsr qc^{+ZzT'b9@&`IAjH͗Lecͭ &v/AnSTȋ[x7Q~8 M3©1N(bJvFjtpIٳ^suA!?|H&!$Z|Pֶrǝ8>EœaA WF/0V8~ó5*C_.}I>ĉXsk#Guڅlnj&}*r* cYMH==Z̠"37&bOGg\q MR" 1Cw4#S_je̐d_m7qO҄^k|ǡM*qYtN1(K90MIҕTc}$}trTa}6Rl6 Dn+=2pV "Ug*.[9͉Pydq]=|=oN?4gh')AQ^NIG]\7fA|znL#+gCp>9 *o %)ܒĕR~B#G??֏^ RoSֽN/NN*G՝a{a?N2Ln0/VN=J'9E{$b" LGqae:nJvoܘ̙bTu"c95HT[K6IV:x[gaN%7&Dll9~LJ<Ǵ')-2/79eĽV]P/EG5TAᮃLWD[}lv2Yiv]C W.%][hDPb9 1:3Fg(8Ku $Vp!wg˺ԺtOܤ±ew1֝AsTFEJ93~ J^JD\gr+BZ 1ݐ*o.;K'VRAS&#M^bd2ձ%y=,5u`y#zo4Vh@ xW lHq,d'@~|8* QV* kom+b0^ӵɷ6kO@0G}*&0$$'p3?&*wWb(K;,Dglt+to?M FTs[لo,ӟ >F5;֤xnBcrssr՟wx d:rMp6?2Q &pPD_nzkduB*oޤߺU35%u(%KQXƯԤ{7zezlԒæ"eHc]#ED#܋h;MGM\8:#~$4\u#vޔ%  |p&oFeaѷ6 G/TdRǝpBJ#hKM tSJQQ@[?Sɬz4T!<5H.,@ 1'MB= O wCN~s{|D]ry!IE|sg]Z\_]BeF?Q~H*D ~%._[CB+CwS?=MMFs  m.oVMbY9S9oNT}teW1G >VUg "$w>(@GvH5E=#@drJ7\h"Sx)3N 0) r' jy?<4CG :\ixP5Jw iС+1hibԦ-_r(a}ޒ R{t VSLn [0ԻoxX^,4\d6M mRBp>b ;ϖfj*Jń7/l+7aHNwȗ࢚/qJ ]dC;4ʶ RG$ܑt]T}0uJ^7R_h}A}S>%;0 A#jG8D]bu_2ZNFRt\H bĞ+L(s[߁nnǶ#8c{xU)9(#Wӭ8Tat:" xz.62j$VNTWaihH~ .Ꞗ-5>a#z1(wY2:(\8>fRW`pq2\4 gS׽F)<,OZS}/7W,ߑPB4CiALs5~1D3z#T`Ш >##nș-]cࢭE,z($?Og5'Ĺw, %HWSA}*"wgyxQ8R2p2+ `39?'/?o9;ԤdB.rtLwLVt݃Ne꽐 F{um;Jm隬@(|cUtReS ~3n`R}O2ڱ%t  XfYIoĤr'C^eݹ09Txd Iu+Coc]wXXbi.2cܿQNGdA@@D-+hp1ً|ۍyN^VP&,I4\cr "yE,-tUNr=&k-IF\0z vď a4B%M9;"xw&N`GM9gREqFn\WN%ULVHqɎrX @9VcQ'<ńIF ͳz7Km径TgMiiy=Ap<ߊ$#큐yBգ_*^?]9p)΂g%yF} ?r&-m`+>4S+?d6"F>$0x+^¤}l#^ ^'w!*]MV@ۙ*z8S:eݗM$=.cѬEᐎ_JDgmE-YϥR oVImv @yi;U_=~-ށJ8 rVڜJ/ɲ8|~b?Qvt0@5+5IpHiX߀Zf>FLʰc53[wv9q/e!8NJ&F`. p|]۶cBByf~e)KIe&8aҚ wc]mJ.Kzd0*mN3HQ8rO`m?vdu,-;G!y(%YS{#۬"Hn :u4YZzyhfy`cǟxWAbce x`e$@ 39CqONO6֧}ķ}}VʈP(2 jH>|TztQF35r+ϵhWcuATrB^cРʔ0B]a?7=HkyGUZY[v7+8 zcd<?Ua!-i"<)ȃ*kQv5" ؛ѓx,CUg\K`Z@al B7iʟ4VPC+6tf |#(,D,t#A;)5 Ss9jY b{bAKnmE3 @P*G]f[&wPfL f ,W(3*G>~d0G ycxo,?>2RͽS}A.KLvcp*dfz֗!Ń{FߨH4TR(-~Ѐܧyxi+fGGi؞Kz6RCy~YE,#  ێɌTi\<5{T2dUQh.É1`:MM5F5Pck(w.$z1uwZ$vQutz@5mOs@IrBgp#̔-yEBq~hH5 LY Z,5Z>o {^[<+zGe$ J:q 0>$AYŕur , Z鑽nu[!lAM>`HsbTbzKCbD8aٔNK.dc_Hc~驲jz՛y23$C5(M0z"J2]Uu`V;j NSNS+O㼊umtM[Uo|Ye$pNykϋN4, Pf Z|Ov;'aKTni5y +/y#E) J~ps(N<(Jv1LNUA6ԱܟC)[KbX`0N -A_3tBghr!vhYб6Q^L2o`1xZ˵ U# œ3䣿$_Y]j <: 8tA.M䪟YHVnN FSbZ΍=nrc#:.&`G}j۫ 5E ى\d:su?0$tn4BͰwc lDmwl]8GU@~u."Ӝqy=hcri ,&W)v0ps4 .c.6SR;vL4Ww!^~ndp_T, w0=N8Z'x@0,aGٗd*a'Ce8b kؕ+$(~AԒCM^;LF3T>Gu;t!s`] trx`-0u}XTz>pX2ꄜC4r4fX&f0ud=SYF.2oA`N2CD8Wj_ Jf_)U+D(ȇ=' !E Zj328ߴSL4q(I)'9P%5!e9A]udq[ňuP!Xdp40+巰mHJ.C+ |R˻@#3Zю}'~Y*NoE/!h)2.bD ֐)kc't، y7Xlkk&?O46C@  0Mt=&W1A `h?UY,An'1㨤AVBU+U^i ˴Oh_,J[WZAƪ@>()ytuLg2g|bDibt<:t[2nG")e6Y_7 d~Wk҃v!{A,~ lx g^cбĦ`CB1g0]uRaĈF7Ls%=l+w$`>v~}BNd? ;[aκ)rfGb6Q L7/XpS1m}Ů򊣄2Nt B>fC we V¯U~Lu8eu "oor ҳ7!A«!jraf%7S*6Emd81!2 *BHHѺi6s1 K:ͧ&3w-EL#2HQ 0&Cc2\OSOi:h?2f+ϋ\bQ>tәtVkmڳs3֣pꢡ!HCXjEx*0ݟNǑ; / v5aS fcVs#/@64͂V™9 Ob0\rpa d`ZM,qiD8+@IXvQn4Lr|nC t>1U;}KQ.aƀР9eViT)!IJ`ZZw9T4Bw|_5-Om|1ۥJ' )rhӥAbwP{fL1ϝ$ߨU IZ5Acch*ӧ3۰ /hTHF(0:a@g+7 J/ 0>aA̕ phj1|v؝){"#5zMk5VduEc6Ҡc3Ģa5C7on{c(b :;K1 TfԨl )_ЪHoAes4Xlt@i.#Uo,ͷLtpF\zkm cmJ0YR+~n =_J!v5"]=@ ꊟ.N g/QiܫuN+rp&)10o(6+ wRᵘ)!geQ_8ےl7N݆QdI7OMd= ObAOUb @G7Q }Kt7D ~4?c39]#ؾSFqeTrE5(tNaϛ\S%COŔ\vJY\dA㮸Slkn*?uDi $Ԅę(Za ϊk9@^jF DIt@Q ,{zE%zڲ+UgXUXvsdإln_c %l|냯<`e#%R*Ax${J?8;Ѩ8@avw2nK/sb{x4_ -TEBX ʼnH/60=϶/CQo'JVL GN"~Vh8JYg7t 6Q3IޗREW#Y Dŭ%d`M%}z~ =0vea?#銈2ZM[p6Y#6IauFE95Ǯ`I8V#uoը+~Ee^/6ViXj12&v! ,+% 0sZC(~r=TCqycZ7Eo\}yUHI|LIJ?7+󠣠(>&~&ܘm䝑cԭ{a?4$F균A Yb`J@cVI-RsAC_UF.=`#Q[&z CZ=JbqT Ҟ[Vhn§.$cc/1ިb;|0N#*e]]p(lw55U;+a ~w/y!+ pg*%|0S=+U:ݯ6d1`N9#~eW4CюֶV b.$?oFpoΦM= r͗{l:QA'Iow1*(nۆ@qIKK bAA"p3~{B`v0VtY%~6Ml 1zS/+jS?o[To)yБYm>k6tUa炧UI(kxKN3OP>buI{cHsyܦ}==}BÔAT6k)hD=ݜ^R\c_nLtbܦ\'w:_^n"/%妅gtPbk?}7 6(ۢ;V#iES4KQ|MK8OX!HFw;c]oW,̓=6Qݫb!Tc3D=Fɯq*q^*ѻQͭİH2D͜ǵj_5筊qW &T(amƊN3մclZ4%KzP[WWO}o+}$nsjhke'QUgBmxnYIp׆/mdi~鹱ǸF ta? &4 a.MOtZ4CgPy4;+5XW&zh:k9ޝ4el((C_+k6҉j3Mτ" UL ~$- :-rӯfdy:%;4AIr#yI|+,`zGĬnEciBgVN3Muyl N*?'PǷ5 KԴm~7ϼbk;db) > bbRSHvKr-Ϳ.Dfكmhh+yi[H٥|oUl?*|e9{RՍ"*WQ\ūFY%)@vU uX( #lnU (;1dM\ XrWսH)70etf5=E2k .™Nl:2M̖f6䩍m۠/=A:u-ի޻+7Xm;wYX.7}.jjveEgPI-O07[W̃;KfN-{⛂Rzu} mCow>*{3|Nٱ_ΓTGϴL!Bqk0zI.c:oʾB6۹]p,i,mFݘD<6"5M6TQ:E?,I{cϴվ< so_ѵ8E %J\ j߭9i- ۈ)tTl->'xk*L6ڙQSt?N.5qDK[)tL=J_'g ӄx hBÔ tWoH&+LPaJN[8ZcX>5])u&{aU95S}E۶.yD3 ?aѭSb+7OzO"nEuxqhHeQ:&>Jȍw-+F".Q|m;[e aM8?@G %hȨf^N=u^35-B 7 2/mV&]m$ uCh+qzΣ[,<1c$\ P]dD=۸z+Ur;ٷ>S~H:!] 5C,dyٕ gw .oR Yj%xA=锾w jsuW'KYîF:n=c<~=[ʎ~+9jοz:ڝRHur]ߒk z&sw,VĎ4qKrwagd'% V&5ʈʴkeݶ`_9Ƶ8C!FwcGW=&P>B]`̨&U$oLsCMIɣaA[s$8ݶ)WT:o%"-c4"\|9a\'S0g?#z<5:|ZH/GC(ѷOϷ$͖9q G ggcSjzeK'S;oh@r"+(DD\K=JLS80sSS%nI;wY ߅xș OGSpoDsݝ&̎8ʾ?.X'0f߮5ʟhXƊW`|ɐ _*O~ߟ kzs OOKܪݙ; m5C'X7Ga[n1<0y 't <8Rmn̛5U_r"@9.uejFohb]tZvn &bLnAS ;.;c.F3YeM044]xfo[1 ܿ$` sHuMA$~lzev]cZg),ME*xբ<㫇Óި}ߌ2%̫XH+,r]W_j˓`M-!cNLQ_D^elvAP~tJνms{YHC1=fgܿ* ~*.KWFM6;f jnZZU]s7}GCb:/lC +Hzt@4Q"Auw?PvHضFv *錻3tZyjVq |=G 'ؘh*FwYÖRVK'^qqZKK~ NcG]u˴o ZԮtx@ ]\da SQW7|`hNpZӎ{aUl~EtE\ZWfd(bxO5Mы]@ȉ~ˡgtUsc=&rq ďp.N*'L;AB3tsZ@$+@F~Ai} ˾ث|88)mWSD~]⑉dn]39Z yS ĉ?J+rYPEΉ^[c;A݌-'K_޺ 4t 6hG?Z&;Ǧ2F^\wB[ctL_~dȻWg+wZ خzI_?S-`[cRQqZvԆ, d[7ȰWC(_ۓXMl&tm# AB C.m3_ι9*rd8|ƨ#s4!|S=[lPjF$ψeYZ B?W/NyƦ._ixuk0L,YW rǡ鬷S&ЃXs!:٢`XB-"M<'I$xq>mi^3d)e`PŰ=Ɖ%:rE%$VL7'hn xzM2TV"^{dp{;1j^h hFyAwmTǖu? ?aZw1{5~:#j_nӒGܭd}-1kdzm'|;yndEFͦBdXjsD#!|xM̟X`j8B;,oJat N^U B( }:@|g%d9C*~fu{2_g/G x'cbrn2e4T (ނ4ХKuq3e!Lzr='UFwM,+Vcd q`B"Rc2r$nRd[W*ɄPAf؝'E GJ@K l؇X+K&cw v_bA[xQ<|>@qIzߎX{5WMaɏO똾9w Y\6Nn\&TLDO([:;EbЭ`~RG.:%_`| 1 Fx C^ʪ[ Dˤv$$BR](b3t6\Y:+l5yJcqDR!A^.y+ mJtg2468 ;1[)vGV ܛsW"nM*@C1L 6O8ںXK JQF 7C1=S 1xpTwӹ;U0mf64DqKQ<1! .;Q)-q^[d^ǫǝF垪hG5G]!BUQU+bhҁ JfajvU2nWN͇mT'{dsGcSʱ0!S@ \kjףxKL`pK-(K1LE xKEߐ@=zy\w*6TڍHVWv>,T`Glj͉3[C:׊_qliQ+?`65k7|բ| 'ooD R' d0@Ln MR"։T)݉=ރX="d/CMZ @p޻ IR!$p2R̀LXfwk4$`O&x*dрl>5nhT P y\~rrq6V#5>Rp<(do| SW@bHo.aW:FI/x5Hx0_ /^ͭI[z."aK!@HosɁA3EtyłL kQQ#u/Cq):%ɥ 4&*[t4h"+g?, zz鐈1k^QF: ·Zח +hPʹ V dƩi REn MuSUG| a4UƟQ-UiV~H_ UnYnw {d^(E\Pp?,M\vtɱH<ĽP~mIƹ'ɦ]1vN4x!{?pCl9RxlfpXsDp3HHA iuƏ7~lcwϜ<ԞIvS/CD@p#0=G XޡC=BVwKHjvm vUWJ^0uas ׁD*T"/3Ԗw)" Hn&@)^¡\9N>}Uvͨ,E'%yviTHoLb<=8uy##BQ?CX.bsEqI0fijql#3|M_'sTNz_yA5^5p9Q;f3bwvD9ԳB@4!;Jf |Pѡ _bI8M\&GY.~gT*K1?l(B%GiaD.țdzS@>W\a3y.tWg!:O94)sP9Þ:Fs)ڃZEK7 eGa/L< |@w=Eq#CvnyN_/iYۇ=b\T'6!8A<+I (-~`>0@tb Daҁg3~qxc 1 P|ܪ?ctXwJHR *wBD"h+8W2>М#څ/ 8`]ӊ_^}l4ʿq(Y]†|(+e4sG>N4ܟROZ$W)CCq4L__mz} ReTX;#&c C6*<.SXwRNXlewN_4mm]A1< P/Aco-31QBtc~cg9>ڼGvB*G~]&c٭l8*X)Ӧħ4v(@!mV@d`@%(͡~\ *lG*e6T L!=_@>NԆwc?ރB76|8`.@{Af$8&| Cz-{J=,  A8}"xt:פb/4E{{{jj#/BsLce5=R X

uz7Q *5);Qs1%ONs9}!O:eG r$QFCh1V?!_0ƧIC㎄^ 0`)?p|R*0.,P|1;Y~+)tmvP ZJٌ!)ݠG+!zfu/%َ[:4x5Wi|5{JND sEwD..`0M`$iτIu.yqΌR/Zfc<ɝgY*J7*yF-ᴰ!ױG,'܇р#l>/8չ2*QE*m7؜߯PH9C[_Ӳ@80ē8V&rVV͇h'TI,{̙D #GZ띪'= `A"m2L y%Hi_~movs8t]+u?^~MR ;beApiŁEARۛ sc8,v2)gR%?7 #$!f"Rm&B b>&I6N >tB7|8kxɂKLxa/`Bk@ub>,Q?I9lmI9 *_RZB7p8 l$7(1IWJPn t* )2B *2X#G;U?"=D&;Sy 1T!b!hb} d@*P]"a&n .>:KS !AhҰPC !ccz<pk:2EQ$VE`. M  ho i#WXL8P$Z_^s66.Tw/C+O h2" k-A}! D[|* U 7z h?8ub?¬V%n'Pyz{f)Z4ZX X]+Vr1'cQWqKp|ū;q[sk}9aL ~'FS&!d y6@-}@FSMz6Do:*}JA.D`NZ{+ȿRCCTt@sH .B+~8Xam!16ݸ7aO;yi@3{ly gO0B'ΝՕ-#T l"Ć+`A_$6Ertל]6CSr=BAv-d$JW]%jE͟ hOl:=m5`x>D-w@9E PUoqL{#NUbk``tmf]K;Dz,^%w[D(1^);DY(-=mT´L B:)վ@Ljwog?/0GM.3qeQS'>mJ٪RSJa6,_o&z}eq,*%Sߏrﻊ̮{Дx}ࣰ݁Lʿ[4KvB[.Z[Ƚh,2%ljG o!@by8+xT?SQw;Fx!N?QƲNEo;gF)5V< ~.*VOK߿_3;|gSGcU:2KطI&zp}82r|YCU{vRB)w~Fm r;S->Oe鿤~ _11w) 7n|Hڜi-49%̻O>!TbHz  ckB^{yKq`N;|qf^Euwb2](Q:jZUrd%߅xNUK^`x7aؓ@7 :ެIc60l^% D?{E%*gY%}꽑sq.+ ur:vm#@՝Lᰅc -G&pA&;~Z!L9 In%eo\.Ň嶹'cTfZG F0X1iz!L@I+b7hG1a@zߜWm<зEBfzh711>|=S<._6@Mⁱ8e|]XGn 4>5^{wo=j%(D0\8 z؎F1J=89J&l\s?⩣іz x5_m3ߟw4xi(zw|T` b [ޘ3)eߺ>!Mm=F .A2 MpKZnvG;'MVgo~Z+\g[+10BiޗXVϒ+IZuRͥrPБ >XSe k%d^5A'-lo ؀AK[A]n⮟T@֪یa$4B9 *; GMoYTb_*m=!F"HsKǀH~/|wn-ĎU?ڲ/B5G ֱ':;bo$q{Nx܀]?po7/z`G`O '(-UqR ˔r%̳E#U :X| pTi Q&{]isLqwxu:e~zh$Ta>*E~9L> 1}k!|Sc9UT^ؠ,r|$Lyn0LP|hfPl!`Qoq\PprLw% s5Ռ(tl)˪ɵsܓcŬQoh*r`#Z#NJ~jnۇLy7+(aYY|&Rmm4͡?nUVſ+4Eۤ;7׸J6P-jU -=L,S,'pTqiK/۵ܺlNa-CϙU*a"қ5L|i4-#t.1+&q]=oKO!ͱ/n;][ :-@LJ@8•Ds$|p ’L]SnJʡRAV6d]N u umuWUe3-ȧv8Jq̖YCU1~*Z$t371`$0*J.>=s!2Zvld Wzs5WݿYtZ Z!ߚ)()iPZ3*}[su5ӷe$,NqrQ6)#mH>>/&xo=r QkXJS*l! vɛ *-SN42/(}(+mj%|ɸ1 QJy }gkQ,tsb=%AQ3Wr6־c,loTJ`M|@9ϙu) (`ׅĂtt0òSQe+e%ڷٿS_噖" Ƃ4t`i6pz$ &!re=ǧKw(Sn;f"YpU{6N5.#r@g;}~{\W2kK/׋nx}ۨ(3ݯ?U=^sԖntGaM0S>ЭR9%`shTKiknm(>[UƯ*~~/eGNO Xs \*,.J]źQwyd0X̨~+"oePKO-)G '|7\Ǚ6!,8g`O V>i¤Rժ9dz9v k,udaίMHg1!+<#4 ` @r݃T`2K0z?)exnjcc&ޔ DiEǙ8WujhNsV]̽'BOs-VUĞ91 25k` ?9CLJ0[%3;f*DSU 2s3Iz|mmN# &JdIhP!Qigm$G=E WѯWץnӝ 7)U ,߹լڔ::䯾G#HԬV 6ʉbuvY5צZr܍\R\+Nsg6.Mz㵊$y.szebp?>]킢⥙.G/ !{&ʵ vaz(BƌGmox8jl]_Ek︾IB.묋S39y8!Umw9ZLUz4=vwD]s[Vw{Tkxj+j#V3߻/?IH='s`^IPunV4%M+<`-yop@kl {s bUczE|)O0dIc"XqPYmV2Xy:T^g(44bYRUR$J1'[NnFNjN Cfk3{exadbV%U-YaOr[Q<#}/Ҡ^RQ)rX1z# Vv?# FmoTvZCXScqd_}gƖ#"L;zYLλO+uuw3V%;#/RoGgWdMg!ju.2\l]=H\1SfdՀүwm5kҬ+Oeq,K[F,(t= &ly T5rɏeDɻwABesnjSRO̺`/╾rn*i3hn 2$/=ПZV]2$.PXZ?0hS'3K?*Sfosu_M'6Y/w<"jm-ܴm_&ۙI$B$ =5HIG)ߋ爃 >I7KkL7m + ;sEƞd(-b-Z}"-JSm*eNƪջ,g]; "_;K3.h+Zg1ȗ Ic}*k[rGJ|Iv׆1G!y եpqoC='?RCfOρA,cp6xUW>ĢVowj@l_sjΨa BcoH TTnY|[Em0Mz ?fn <7ta4XSrت}bX4&-ޱi**)y$S1?d>m*_GmG1&!֪D607\ 8 uɺkcm!rt}/ gb`{5JMa[=T y6.g303ڟ{Y9>-2jV^wsAtzRL-dk% 뭔F9=o3^YwC2^gwJ4xD}~IN6{Μ-;EB☧eS떭?ps# 1j8ck J ;=2o{irgumsvkʜbmS$2RJdq(dsˡt'y m/~?3h:2. eTlFy`=dTʃh^{7wjA&{U(afm5fۅ >xs w]>k0>Vy Z!fF*`;1@[R_X{' 7 R!NRd:(4 -8 W)d_Ƣyt[0VQUizZ4!M{3KeuC^-~mp17W־ixΞ` >1|~t2lyxD냌ͽZj ]F]Ag"\fE>Dv u^T:YۣΟ[Üf ל 1&_8oQnAs[/Πabzk_BdJL4Cvf@?•mJxsiK^(c)9#5FP5pоcݧLcINɌ˦x-ϻ -A?[RaE3S$qV{2^I"8:ä ?_吼N.3'sկEt:_pƒT~7^V>wĞ~QQtלHZ;\jVԜmMJ߀\2WupvrD|)K"XD9Hk,}Gv_p꼮t릒"?Sru`]T-8=Fm뻷ym%xԮ.yF] $Q.tkKje(]tl(6wYӭ055k)xX̼\Ss̨]?|"b<0Lc `khګ5K3eӬnh\M'p3Ʌy,GU >|x=^x;?{nY|عz )${:xD*z2M Gs6苩gDLz< Ls>ff>SNUT5bM}"һwY6m:$#-sz}z5\},gvg}P B"{;㷳Z8u/U\ɒį)y*DLVɢ<7H\-1?jT2izb AJb27./9F@|RYzE粫l>ߜQ>uýyX`s8oaJ~.=ߟI\؇muϛ4>(H߮fr~RVA!:CeTZލ&Du+oWRL'^{;uh<.~}h* yӽү4URP\囚6y4ؗG>G%V_eб; 62]9]r^%6I%{_av>`iu2_͍SDTڸw]Υ3,Hɬd7:tzR4^|ֽ];h|+qt`~"5! ,˕גqENݛdջ]E!| =`,wf/;Q8W+|Hbj]8TPI\UZ|6||mnΕXܬ28e;ěJaO=-:kv^3$^ۜN63`S"~mS&p9ILɫ|O?,qu ^·%q&>֫?f/ WV u"2jP;MitVg;j*zNBqb层Ӓ[LThb|5BAW΅K<3\SXPa9}IJ&"={xgN c\ΛZJl2G9G8947 [߫Zej³jFU%V0Uc#Gnׅoi+0&QfytsN߭lKO8'4dk*?$v#\~>qIH,$" h/LC"Xg<@ UY%o&Pgf=ˢ%:V= fYggYc\"Wqlʄgr}9/m'pEd ^ׇհ q0 yu%Ձ&H6&C]9Z .m/NRHžPIFN4^A)Uw5AHN6N=sұbLu0[Zs^=NPnE#w&JuؼŠ>L-"ӎS-Wʹ$rS"UxX57hJԙvqDD`cU(]no,g6_hVZ5CiU9j:¾> &`#ɶ{H6@$Dr0k^/wad_O!er$f0S_N˞sf*1ԒqM>Ao?zߍ,!B_knrbi+ WR@a͟,jcJcx9p2W )5CL!ƙgphجrru6)tF2xA2'%PT>}ʰ(ʥyY 1\f@5GϗFъ[YkDɼ!*X$ߴnpkbfc&T?1&>-뜞1fnѳ R斲숴$k%{yY8=֗:fmZIxjUk~ wG{D+\\1m {UqR^Yf$W-ʖw (HLXt.,x<@(yƼhżJe(V5kѪ],־J vFu`}*q9fG`LnYOdZn%(f2Y:@+@T6Vg-L$DwFE^jo#_e:Α6JrօFݚ+^}pa"Au?|&zv)ђӜm'^rqT`H3󺗅73)j%uԴ+x_ٹKkۨViwl h):JwcwO57uTHe{zGaɇCZF@SdNq%p%5]ڈY#:љ~GdWjq (\F ERTeZC9F˒H,uy%BeB0[@~(NZ!e8|]mmMq,s{.,x[$ z2+Ԏ2l h{u x-q Hd M4Փ J0n]>eDaLMZi՝ƭ]\zc}LN_r^0T(cueW6ܝ ks7& ̎7TpL)b %2d'MEyC Q}[-ϜC~6|S^$iP:]xJbܸouwAsS3ۥ: wR !,ַipScy1s0:6|iZBYJjl<0 ΔƅHd)j/73RSoHi"֠@GU'YsFR-ϑ& ]yKem(jE'bd(#LV4b"w 5N*JP.Q׶:})\NLjMc^| lOWQUM.=u*JW%*fXs&*YjT'O<{!Es܅kB-HcҺ[L p8-hմ}~e7-ǚba| ;"T `_~ _Q=sWs:%AOJ=DS*<*WqY7.; heC  ]Ђfjqڦ'+H]LRU$`O3+!]RMGK˝!jvFV-Q,lVՍ`ׂr _Y {%g0VKE6P c}e v rN sjt¤PiYnDPO,,gGW|g( 1|ds=kוlLajG!r`M~$hQ&)H*wYNˏIXX2vc+k7qhB?E: K 0 pI2ViOs\ݶ. V\ 03'?Ѱ~lYŬ,>beuTQZ$&T)H:wb7rI˒n,K/v|-*B V֭WEi9J2M _ k7HI</1Ȟf9<&2 ^*o/Տc`[N: @p"LjbS0 eW2e]Zˍ(e-uht_p"=Eto>̫XpQc9+R W}-ǩ\`a%Cl6.^bSWGsD-ϑe:g޶"q&.HҾhBԌpoc.~sǹJPR' {1̀LݐȃH~i,< mc݅YRE,=; 0JעnKkI`!Kw\|2M {%:͹ZpŜ˃Tg6\a km{:DkxI~1dm'f_IdQ\AnxF}_Gؕs0᥊ﲦ|3/})g%R;I+ٽgNp3Ad<;jX~_\#ϥqVHoQnY,,ij*eԒ f!HSAedec20 mBut"TD?vu=:45 6O0ԉƆ'o]qjwtX.NV5)^^oIdzE0O|`,n`+.^\tDQ?d.VdgMBR8OhCuW |χܵa}zĘ\Ī\6]xp]15+ ڊK젨 G|&L,ܳl3<ͪׯR;ӲQ.x[mUuur MR5%=2]. il#e'r&P`r)YX;#؛Z);-|[{7+p,)R vJ`U\HTWXMdC7 <=SiJ}zwû3~:.'e36P8 [Zã!s6XO%/ ,pOxa4ВB6G!M-6ʛgk%h2enbp6mLm# 9e1l&"P]{#TexS섰iZ4c9m5iIealY¯ÖF׌5b|]4%Lap#YAJ@ hi|W]6'YÓShK d \.r2:{cf\zmHhHVJzq"W-h{ʭ:tӖ󭏠P֞{$>Gt -ّXFI¿?menoemԜCHx{ְ`o}XsZ%VFPv| ;݃ςgoz=-71[rꅲ͠VAԳpX{%[]fſfl,D jfUQK g3g/D](-PkYB ~ z3/ 1w#$|Bz~ Yp͏JKiuM;GiE/JMY͟[]g$*23>*\ xQgF wƦ"L#L.VD`7q=ȟORE\6~_]Աu=/Z` 'Ce~]8L=mEp2՗x3="j B)Bưs6'xoAtF7E$'W_1FvS(ъ"%:i˩H2ˋ|V+l[SZrmpO>4%e&lsN]vx-).߱[DTf )D y*AhU/f!X4܊ >SvF&gP\gG5y;b<ӱbUt,VvBVXJPOƳcv:5^cn!^lAIz!rGrnM f>L Cuޕ}ǵ@yzxT$6yH yvJBtS\V-xTy&NTܻjp3_|27 C|,0j_XK5EWn~jf%- pE}/L}_;9lW.^\@;R>-\r֊=B5` $59ɴaupf:uq=9 RA< *E#10[C2;z=EmQѫ8t }"P"n~̢s0\eB8ʚiʛ|;+Ӻ[D!:5e/t6Guü G"_xqH Ț/DSaꓟu@0%bka\&*v/;ͯˑ BV/3368eTs~dLV}u3 =|d-K:B;9RLi*g|䇴1=nX)`kʷkdkz5u1ئ5iH iжA: Ew Y%kmdѧviYd taʽ$TdUțmլ[VuqJkPßoBN^u5 R,]K$OѨߧ6Z:@/i&T>PǂfOqY |<3q%ijhYC>0 L(f@FFA e뎧UxP VOҕmauY^<_GV|ykg֎E/jʡ+3jJ'n}z{ >Vaw\BMj߆VhS-GQe 3-qV6KMUƓ:eEnMiNx,JDu*\>WW:Pu&_]g}38Sw Юt.A# a%w'hswݎ;aTP`+{P [퀻V_q?&_4_2ӹjnF5Q+Q7pX: /7D,H5^E8 rU=b|gӹmRD?;NY'f)v|/r<\E%v;t0+01.bER%0٘b֨$k3NP(΂5W9=yz *eb~p+ce6V[mV+śg"R4'.r0h0r55G\RT/^k겚/}9|?Ƀb&؏N YKG _[{`%C*x1VTW$g!~21!x8fӊVuGeesWTE]]5ӾF|6]#;evTl}Վ{or[Nc\q+J{ _ܼlɭ +'=y¤8>T&̻u|Y%!}fO EHv+kV]/0ͳV/k o8 hqmF_+&O* 1sx֨#ָ7#*uufۯp#;\n5ܿW)ݍ -9ls 2]& E}dn΢/ \z °旻6ywS3/f#/-tV&t xGhy~OIďݲ?~:) ҤU~ ($Q4Aj @o#/8f2ȝ8P7IiEM =E;^&5z)pja.q|]0t;Ǿ}I)`rJuRH1efxeIƾ`t%-JuYJ.rfvf>d|ۛ`xg.'d7nN_KvY|=I+&ik&g.(ur}ۛ>Jc-^Br~L3\̬ClTU&KX,Vp-9yrIꯋ p~%ɁBW޸UIn̫qw%/J&]_H.F$gwBFni.Zns-w 1O ϧ5esr?3 |5^ qjW.t%+,L-_VITT 2g:y'A\l}䑷xҁf?9t-[eC~Ӣp5}?o0wPMt@!7w%(mʉbRbnkCO5ڼ=1 LO&6T/.C՝|z ͫGm=x̔iNfjA Í*nGQ ђS"2Ct%=-[l"[3Jɮ2EjrwjmG2>e gCQRD3bL'3(1IfkVbQh7F>& &wk|y,d(huz!%'tQ&T8VhK0ػh_|Hq*I!Zy,C}LFR;%mr(A/@@`>*J|ξ^Gf*s>~SV&w#Ƣڧz0k%S[zi{20unvj2,֓UiAY4m( ]!M0+r2 1`f _)if дgSaS=v{oWs)ǃ>JxV{]l*,$Q@HF $eUYF3YRC,\MHH=jCSdq!4 xfQg`*-SYwo81лZl72/  x J: c0-|=ߔ;2(Ndrd*f`wMPbT-QX{ ?F2)\@tԶ(-6F@-(F@9WhB\ɧ e{+5s+j? \.Yg$=A|rwEs\}wrHL&D,^inō$@Ua=* 9x?f/9]P+=(@TǷed][Ä۲*4z@m {MQf2fCMh֥4(WMNйP:vALЈ́ )_G.ߟMZ +@_AX;B3eh(ԡdBF+`:Jh0 |0Zh /ބm4 *cjoڄ{3\rSu.EKļTɮ9Bcqso՞-sx N w WVQfWwיHF@M_faȧ/ʟq"n*4 #HYEGYCO[$bd9X"4?F; KeWin\(h4u,ac8= 5U^ q1Hs*HIqrQEvxez5l1怟f؅;=LLi9-'dRQd>p@`~52iGSVZ:Ш(HUԂSj^CJfcNƣGIϲx\FHFY2>ttNv6ga`22T,>9kfV8ڟਨL3!|5񷾳̦~@iN3yٜ3^ aq~)l2Wh&u`J3ҟԽ{-Z0#u[k%2l0'd]էT|%]F F udž\j" -zc+SzP15?ԿfE~ }{> 2k4ɌsΡ R,/k έi"?ѱٷtD`LC5aߐC[ qr<)IЛg߫,Phd\A:}^)MneDV\dL,QGT$CD f҅S_`I2\`\)M؍q[Z $:kҨfPutL%Vn%NA!D(1ޡtb~ %{!)տ:krX04BШe8R޼i/q rm*mrJkdyV˱j_H M(*EQ: Qs+Å9`LYFxm7%Bx8(`A\))ƂS稿1@U {B)j׻Ndº9 !NQxU 4GS(AN򯷿29[3SE6h@\!i2K8 eڽӓ֭QwS/ܓ49m^uJV#2 }PʁwZXa̋f6kYї;Y#ROʑ~wڋ!J Ϗ |G>!k,A]f_#y&o#ܜ i7ݩ-MƮϻ?:6{D-Rm'b jR~B?їN/6_T]?h*zVp6Rt,XMUiwT ?&++Y!Iٗ>1yK jWS+zEt2cϛ2% T,@huEP,+*ݠ~1eɧTLdާg̺ b>!:e0 u{n?-x*7zzn)…Apr loc2* uP3,Əw-G2~O5bjwoֻ4'HĜz]S3A^PFT,,];~U?l,zBQ0IPnvjBۆ!K9e7X'˚I|Wx/4g} Ͼ65CꢩT^Xk2kj{ii}i;+!ӾQ9t7q~h$9zW,b\}󼶟#xOw`|;Ȭ> )/GT wRd\R~Rܕ%#9EVQ(DaQc?6!@J̷bqfS ݶ&?Ws?@#_8O͘Z(H ܂Te_ؓsSڦi7zVtFU<H vS_aEY!*h3h=|S6-vz_譗]gFޫ;W,^+o nìPV=*TP6f(z#ѕ}?j誜m;1i7Wʮ/gcJ+O'7?ͮ`%xLa0wh10 c GݍNc -|f39; lֻܹe5iQc+/jܲWk,e\0JqwtOރ؅d t- /|$^;u9𤰋1;Q S+,xԜ58"!MBpJxxC:_PWv]"ozm]RG@(YeUI͢1^l骲Ãp!X:rLqG"Av ,ea60C:?9Yݣ#W=JiQe-w6:ׇ}I.O&[)EB.!rY~M?-ŽVm]tp n8}I.B[oPs`js kFgx[L 'G&0ٕO-`ʛtd,TZ;qg{7^sʸ$]sJ")rB|=DZ^%D3*5Mf|є_+VPBj+Fd{xc0"~6Aq6,lsgʅAtkiSu԰y :G<jQW7${|P2(O-Ѱ|,jŧOy *r}l"/VFHR&:d:l-;Ke*GX f{-/6Au|Mu"gշ&#g.ԯM IN[,zU;f"pT2 s^yF_i":^FZst*q ]<3$mfˤe|d% ^]rhgYYrꐧ1˒gn6;Q8x 7.N cϽj+ Iwy岟 ,a3zU?l U哘${JmRr#e5C³_׾~' $Mr)gJ'}ݫ V9$_Z>6=XJ-}{xV1=ؚGOcZx.ٵHnl9(Cw' p _ A˾(i;T%(OsL̶,TuT!vX D_:*/ -A#[ߤún8Wrgp}[nC;:6DDH@x}W!icC5j63blZ,?/Jpѓ9?:Kh {J'^oyYk8`乵[&]rz";]8K០;Nc{_}(&Ո"HR98Mk~]Imn;/ e֪Y$2VYaB?3a<39bйltHeF@ZC$92U;fQ/#5R--Bi~F΀$(euUN~_,& M[e*kb [-J!NT4J -~ҥFpjڍ㿠kX3u3iuKKY˻|y.Y}!|Uh<򟩙wDm_E  By٤480+J9@d?B8pÃ6sئbHElg7S{DC^뤿6XG*KT[Րs:(QD{ϑN8.μI=`.|`E?%idO s@ L;BZ a.p]YPni_P ]X|A}$rcSG޿MQc?ʺ.܎)%Ppˡ J)˜Sw~΀^BQwL&dW gϤ2ĩ{p)b^[s$bB%KQpX[ٷ-+rN-IN$`B3_Y#=͖A>MQ}w2㔙N|a%+AVG%k^:_h=ԗZl+?c}y٬'7{T2]Ƅg3޶aS.]Q9 ڤ{v>ԭVmYcVB ob/XD|/ҵfojJh@Փ7vd'/ :u辷WeEb\=(O辒yBuf U| 3Gw L`83FգcڹH#͗#o\%-S@=Y@|nm1:̵^2Oaf= WªE}:W80ASs ڜb(n}}.z?׏% m`O2[կ{7eԞA `dK iGbr\^k :9XD@ɸm7cθnZ ]Y-|V?uqXd߮ 53uh{Ze2\:_oaϜ!vZK`t}<. x8tj?"piaR缗uUkg(T7ڰJhшlD.b vxcW[۪[|~P%ςBL *3[LzȢ8o:.s[r ݑ!)DxesbKAQfґ7Ozq(K(7O9Bq/T-_>Sj7x.$~}srR-Эk+&f(!5CڀM&~o/5z{k\/޸Zx_o*o`g%RQYܤ\gn%8qNʟ]IkS,]w1:%Vև0B߈eW}iS9$"2:6}&}jD'#A܀R),ؕ?Dqi떢34_yoCX֎=@R {u4{-Lg*N'w!"g0ϔ7w'Ehk!)0O%% "Eh}gxCjaQ{?*S'} *3;.r&HzsFOxsحɥ6R7ſ`(+o>.Wě9eVu$oBҺ+ >U!ѯ ޳߃8י-ԏZ2S2+=)\s{21"|{ Wn>W@N0z܋7x;j69<6 !%mtl7TIw$S G<glmnet/data/CVXResults.RData0000644000176200001440000000031212464072752015415 0ustar liggesusers r0b```b`f@& `d`aI%a@6"H߾!6O\ʽ6.w9_9"pu7^+^{Yһ ~@Wu/쏙L7bdo glmnet/data/PoissonExample.rda0000644000176200001440000023117114046050560016114 0ustar liggesusersBZh91AY&SYq3_E_}ϼZ}󷵚tK>ӽeByz물hEOƀL L4 TB4dS` h!M0L5Od2? 10FF 40 0M2da0&=IM&F$BLC 4Ad4Sbahɂ2d0&iL&LOFl4ɄSFF ѩ20M2a4ɂ`ɉ0&&&` xL&CLL`P~ #@ɡ24`h O 'Spဲw3z9k,)haBܢ)BB f Z %kkn_Y ;:l6n_>ϖl1< ٛ2jpcG&/;_h&d-AAw;̥ɳ @c Zے&"~ -Mdv7Q0L̄pOJ[ZtxpQ}:Y?DD ЮQ!u6`&aU @h0a`0m ށEk6#2&0ah6 ȆTS"&+NYX j3iʊ}b[v?e O*}6I`;X/AYW2i1(jS_׈EYnFL=[Bvw)/"鿡%;rR~YjpWpd>fZrk<5b:R9#vvwWxmczMO~Ƽ'^[Ȱ](|=꼾PJ(lIDV^8ahn%GvNeuk g߽U8-⪓:x`,T䀸0@+rh(}_K爫m ~1`d6D3}ǯ=V(t)͓(MN?]UL92/Ibq-J4aaH@E0 hZw`* fg$n>-?>HVkt\'i(}(kjARy6jxmB'㡝&,FF9A-t+vSM*3{,AoGWZvo]hl* A|A7>.Jhz:^. bFqw)<ȥ G, V/哋祑]JT>lcTy<q[_*&J#.A r <9en.ԂEcaO"  rC_LbAr`:d*7ҋp/MDnqf=v`a/56:@slܠ\60cIrp:x=A嶹|&?jD\J6zypwpQ ktnyiCR9lG*aܦQ>k= :mhr`Ot-Dמ;54}d&zh'β/a_V@mJ{;Q;1$o]16>D$a a=-P%86 &`xh8MyKԸ3 [2>,?6<ثe.^ DO)!YЂyAC{?-/'4ՌgkNr np0P ЭF+BhQm cf쮒t }TX2x4 yxcha JtqX "Wp=T\u$Y SULTs&iN,A d<В@*߹ߛYVe r<dzJ%&s=p c&tϥBmZ6V`:Lok%Û|B%h iӝ?f/˞ &FIbM?jC5GZYBL,H<ǏTԟ9EIb5 8GmĮ[ԍǗPJz$12ܳOdlK @3ho"H7MN J/iE wVUyɾSL'\.^J#s- @+ݟv!58vAf B-NIv7%xoZ-yQr2L!8WDħ'-jgGD7J?[eүh< OϓR=Q U=FTIV\aj\YWGSOP&0r Iu4ˠFB0g"{$V֖nbrd'zkj/Vx6[={(Htȇ%XY CҦ7_v[?DMc~9ev;+|MBgfm},WӑĉXsխ?3T͑]=ڢ,n..ϏA `& bh=0(.Ś%S/7LuX}z{ێ|MVfs-m^7}4klze i1&8glmIEeJ ShiAi4Ț Q+=q1yҚw܍D!8ky^)ss_ HWr(Qo{?c ]MtktI fܻv>3 7~|Bf)DXBJxq'ʚZX &i(+PBb_@@b((Eyinx{HM,xFvנoV_&ʳ3AEOӹ֘pt<P+ǝ"M?ɝ\7Ma1L? ?F;51e({Gԥ|3*>7#e/|USƎ]d+0f}C>#Kr[]=$WC{}&{56C2p^Y/iPӊdt+5WkTi? SF۝BV 䇹)oudu4vwM[ssԴhC`q%c/r&4ꪨ%M~H*%ؾ[!] Dt5+tm"{ַPu7ׂ,"ƙ..q=F1CyO{Z@w!!~o3[rIDGoA^t)(I:Ԣ^1A7(hH ?SN $FW&O |?L`Ie'5 EL@PVi/-߿6c3C+J%ReyY;Bԥp`S*C /dwqt9W;ƜUxB0&Om ڎq\vbxon` Į̸h"/6Uy?47@; qs5"^BMu@o~HFqfJ+92@:9c[:禮m">T-O2(<^o"zC~ڶfVx_4xO1ul:#qPZh.`ꬽB:I,M0 gdz 0469c5OR`"1HzgrMeE=8+Шz( 6 m7 1-UfKWUMz EG>mvh18r~-2ih =J8;Sq 2ӔL4:wrN?ba4Wb C Uxg #ӕ fHBa\^c!AO0꓃oU .ל"fl0Qc&6wJ"T^xЊ$ׂS>(oj 1Rٚ +2 *΃OVutBI׊qX3{4[Z@xTЬ% -:rrrZ,/fTG}/_Vgˉ@|D . Ro_^=\z{2geqv$p(-Ja h JϻC.?WI ҼpO_2골Ϣf^5%DGgΉO۫WoJw&OZVBW=i5`SYm̔g<\А0'Rv )[Ih/|#z9ܔ$rwrhmWD]2R[?- ?@6ϻ*}CkCӡBn;1ks0Q赝H#[C3;㹌$X{X~/[ZF&V@s'F?"/p~C}M,s;; Q'U0^sz[}{7:*A*c'҃bLNpw Nm,)2 `eS< ^n󊙫YYק " IyM&seLIw}~HY+t߱s]^7_g'@-~cbqh29]PT<L|LCܕZ 5Rk "JpȞxwfc:(Y{ZJ݌Z\;s7(k3e2g%l RJ CCP+XrMI(!A͘ZpL \/{=2<$"`CW_%ARO$ZyC K{Jb]u*]yיo8"̹2 \{ʣPO\o|`x( i9i e.8k1:<1$`E"2Ҥ 19nMYtv]'q'G Udר쇤Sz,w_{r`:P7@mM׫zk6 JW^n[U1[_A6e`"3j]%ɓI$#P]N.teB2b\̎S!uWΗw檸PΪ&S~ qt&|${] FHT(Z^+\2K3 3$EךU˟՞|$Y ?kMt ~]w'x6d+6>XyYLA]6?y()?uX?*gmxM*5 yuYGS[vy mܵ,4G33XW?4;i(^lLo+L! j|ڗL{7~ҼoNFf3UI |~i>hwQQxU/'ks{YGM+_:_nDގ>/UP+O~wqQ5/ifšU\aNln/HZShqRmvjI_DrnHuO0fv%LSMX?&@"1~TjғNP'a vw>rmlE%_hmI RRg=e%y ڳZ'ʯ+ " 'W{-idCKdlҕ { EDp TH1MAڑ@$L-GFz<& $Iꌂe>C7լbq(P֧2EE\;QpG#_,'"} dzN6S̜+N9CĊK m]Sڒx2vi雏 &wχRZotZ&+pCRٟ܂,~K{]jݕ R̼ͪD,dV$YYukǒ2i! k3lX]k(x_7*?Oc:epVͿ_]QG*2Jxԓ:peVi \"}9? 61aFc/NZ״ɿ.*Z8C_E5=fm#qdK-Re5[%|fńPcQ̵Z^GWZ{,0>ylJލ$}_RJI4 Y452Q{9W5>a OB$geg4K5_YSb6SuQERLÎ o#n2O͜6no:Zvڔhfyⳟ,L7b"E)w]ЮH1|U%)l(Cd6긻 ﺔ LP?e3Ύ{PHYI$I ^i_jAVpU!0Mk>^-&hd4aVCx/PMzMFlc,V<:V/Ll#.e(ԪוF~?} pb4y('4_Ƿp fBp׊ t ǐueZ(bO Qjr{OC^Xk̮b1pHX0 ,܁Ih牍sx˕7"b-j8Kd\p&hBы5& < eSW#X㪐<{U=IGqxVGV&9Faw򹤼Ħ+} #v)S 0!Xన<-YY.Űjnz= 75A$@@UG˒ݶy[&l'43I]nWAy6Q:bB8S"tⴧUL;LY2$n#RJWr9duψ * *%KVqv;gX>]t\O+ ͈BOxI89FKC^GXco/TXu7eNア=2=Dɔ8yBy/mOrκ6/mEA:%w#)[jPFR٬^F;`(P TtsB{e^z.gS>ނЀXwVn siSTl{{h"v#L]c0JEkIrY0ZWOfj5$%]n no!먼܆`lIocЗاދW "Cꅆ,V; }S#V: M5jƱRfadw.k≺mϱFʳjQձX/C9XԗfMIh7"NnˁK0:?aװH<"zir O˩R"hI2 fnaFcS@j @ #j7KT?zCXa9 𻅅 voE.RkX;0,-hN t>wI *ϱ=Y/9u=frv= FM'ܛ:şy}Bͪ(w!Gkb͚ S/ --vIw?ȟYS5Od \Q۟RȊ^tZm]79S;jJ|S:F/J8h8"pp+&>`?_aԵ^U3>Qyb\W(`L;{Gnu߁\w-% yRVb2/x#r& C˨m4/Y k{X(ݝ\)D4D:6G0fa].]V*^0Y$}5d Hu,Go09Uq>1@ܺht.$yNgܹ"/HUcP:Vy+VG ?yخvwt3-##[uEylk"ǡ7 yiH;=.o)QA|D1toeHr"|ޘϪo76+w>*8H2)U~5CńaXr]JCk3Ef۲#syR]$i EዻgQ"Iw!24 ]hܿM3 rKVH~86Ce@ZDSKޕW057ohMy94Sgm!Dy)[^g׃p=2*Q~؊ķs_=1W//* R=};<$Dp*3XuO=>Y6ԸDw,Rd>vтtՁSS/<ͨ G|EJsg7Gg%h`OmleF? dƏ k:2lL.u?*O|Ⳇ@~Z(b 4^^}rg_u* 4,ImޖPss^<|/bLoJQED_wE?fxv[e&OgÚ]- 봁H^j 1yûû]~p-z3}[m\Sh8e㽽yy޾|f*|}-7 &;}&O386j?TFo,)"L~ -5(3 O+"͍t9jHT6!T_4="ֿ{gޖ[yA|s~ s_iyR݃dO NayX @؈7ߺ?p+nXEۚ ye})# h+[9I_ -яubHF 2XЬM1ZUk> qd.sL9pk*$v9QڡX 6wimQUT cB&5g\^o ֹwz1!v>*Q}˲Emlk"y.P\s"! ->Oe7 ʳ fR"mzČjwÏ+"le`ZZ^#\HG`I+ zaFחa=D;:\1Օ0=uwpir9Kcf?y^ovНO9!e|b!S%2;~ s%Uٔ7&u P}Zu($Nc֭~0~a|6YC]2#`:ڤs&?+Yɼ 23ePdG:֣FՂf˖m`9dEhP Omw6}gJ.OQ E0Bģe vrxzMn1j ʔ02I2zVyuoIs L_]" Tg Yi[dcTPw<ݗ{57eq|ANC*b Zu},UrN Qc>Ry"=V}'JBBYf<3Ȅ ӾrB*5[h)ݵ~$t[VP^T9JSڳ\wk *;qW`ϔ>G50]vIM{(`Wג@N_jm;f1s ΄׌Eq5UϺuur$,|H6/hG  wJ>iT[uOy%" Ӑ7"vYt#0o4eŏ~Zc &A>E˟0Z tY~HKdNP_ȏTiO9&G iy|qC#wL=5 SX4KrZ٬-E3)$)1W" 'Y!rYpFk= BV BM[ǷPZ{!6TQ#cC؁@ߛV!2RWK׋:YkW{$"|7ջ*).)Y^"+gUTJdc f/d!3wޯ6Rn1~e\&EC=kqft*VWeIO*}P2tY& I.]RJSWCe6DTLst]IL][ xkdwm00ZKڨqثl`(,N6ZC,dJzZkTmZnC(T1oaNϕ;m΋q93o܄5w~.i *:T=\{mJ '~R!#/-NqfU0M(TP *4ӗS[u)єȐ .ԧ6[wPn¡+W9@iQ |pWgBMulueC-n c{WIeť_aᵞӲHw%۱t;*]=jI-w*)E]`H\6_Z np7jn^?ê'&70>#.xGi`fM:mNAGg'Ij@#0VlPĖRY[si5N=Y)a6Q1:WB 3mq?vb@;-WF9 dWyor~h10n _m :X'EP+yK'!92O8<i%mW5͆ G|v_)7rݮCQǹᴗi3gE{'GZ_ r%P Cxbi"lyMϝ}#ϯu>ܦ/P`ws1j,6l/վ~Xw6c/O# tpe..v.!ǭ-i&O͕Tb}hhXDjKˤ8/Gi(H Z> ේX\Wo-yn.(^Q*ksh\n6ԅ\| қT16h+3CVU ښYP%mˆhg t*F7jF@F6=;bq=2cJƻ`+,W_,*uY?K>ՁCK/~%޲㤲7ȵ;YBt3Om9]eh^[H')Ѩ鹣Y,NM;B%2Y ؾ<ƹdܚ~,gqd n*cp(*i)8]Z8w-0KYgT;qJ?ַ4﷫B:dtr8>4CUcwK#IH`83Qsh-\ "I(kժ'1)=}lDRO1JՍZQ 0;x)"ߏQ6~uTUT¨4^+wpsilϖ_)8o'*>V ŕ|x 㣯! GZ2kz{B%ЦUHEBE&]@ j<uaTUpN#+2Q^]9k&RKRT '~qTW-F~E! 4lxLޝ,rLDHY9gbmuS>; 3|0>ɱ:o3*͌GMHѠ ʉaؔcV<]n拖ŊO_MoK9(Tw5Hi^7]eAUYCp^շAFA02dR-(qRG\d˱ς0]uwa?k 0? { &T ,ZΥt\nj_[_u\7tolk0*3VRmΧ++𘑶58c4RUk~? Z)`U5党EyupZ%^{#ڠ9}e+_>&==|#>n .?\ayuۅw1t@_'7ESc{=cIWu.s1<^{Ws2 ])FsƯ3?=5Joud5MN9_G:.^Nh= ;5-KD_2 ބųK|6KFdqL|9LI q˜rn2nz(y%]€W' Pn`Rs7ٯxLԃJ̱Ԓ#jBq6Ƴ@yY\qSs3L o@6\闌E紶tUrN/'}8l$tzbMN?Uj3 ^|Te ?3Fo`r[zS)̬315M\.) {r!8EA1#(#rLI+gxkgcm_JNs8072M k*+'!QxcS=ɷ-7G>g̞Vz|J-aړ>UCauxO;uʵW)-e+8ЧCpcCUc/A۾x^AEcf`OT4@Y2'-խwQ_P{BY)Wb4FyPܔ wwӪ_(Hf"B1vA_V3tL!$&Zr⃦{\JS\*g·n'k5u D`5co+xwăv?jIST?@.UC;ZQdjݕvyL=N\vBWrN4"vXN$i>lHš1|zrIH9yړ ) K\5aj?KgNE&7C>K$Hqy*}kT~ l)눝s( ɩ;YvmW枏XDş H%2s= =C \dZ gK4(4I>phtpqgz 6q4'(G78h$ DT 2ϙx?wC=LbPfjrMM*y t+ϿJj0EOXo`x=:ou xYUj&^_KWUcwM4h€#s:"sQ0g2E 0C%5NgЪlW$7C/$|×_J.]ZU-z)e}$,)}8"dS@؎0Zik']{& ]VB3`qhCi~nw|Bmh5k}NɈ@Ѷ{©E*I>\Twߡ9`Zkz|r&LRY0z̒;)',:h:(+Z"iS∎l{Z,O*|+Ǟj=Jr7}ZXV"VLiTz̹Ukv4_ }_{)V~YG%W_A-؎YJ|z2ÈIhT-4dKZqJ7wKN=ڹQݻRsQcsj s,@ "7 CgϤ`A|z&4ل6wXyJƗSmInq4Z A\KG%(r> MsYߍw}\?бԞĆ#t2</eg[UV>yA/B3kItCkIq7iPWi-ѷa!_/EKk,(m3R}>oqŋH :T"_+?\yؚGw7Xq!!v"ƾu}jA xny>}K4$Xj(PkrH{|0ؠܝz>-;T{%aY53O`qF=A]b}z,Qu5D3\YeD6i\Mwx|~sHl#9cI,fDǣ/[2JZ庹x}rf0%p7i2UoNғW^`n"( q`:|(-X nZogV|(ҶhZuĭv#:wZgtSR؍%9HڵjGV}@_7׵f28bD %|j6ku?Z?+[Ǫ'E47-4H ғ[嘉YK5Bt%9>9 *i2>UApT#_p0`t|yEqjK.Zh?KǸ}d=`2[~QUKKgY[}g8aM=.ӯ)I9 juhBTMCB%T6+d@f-(뗬6O:'+2T0jQ]CLi*)y.9XzK|{=8=}tLQVyd6!!`xH!RA" ˸'0Ui$oљٰG̻2ÞFz< FǸeJ`0phv,C/ XK)-ydbK~8:OCp[/)j_> Tg2OU*]rŅ݇-8?K)^ -¥c5u9[U?NH+T")IPGB'wUk 2q" x8:%r(rW/2iPZgeonݮ1‡|*r;^LS}:edbmjWW}4Q L9&B%*o)u~6QGI{/w:+z!HEEP돏hXZz+۴NR YA?&iwo#V9j&lې=:0oR0(⨪61uȜVZ܇pb0g1ʷ)Kvd1Tӹmv<#4xMU_b4Z%F) `[ps0{Pj~ um^Į&H0v+i̇m2t d8l@3$$^_˟5X:WE5k:dA͝pP"Ec^_9¹rmF9ACgQ{>wjEao<%Jj)EPfoSkY[P MOIdΗM,0llMi~^D`yZG/r3+E4_[2sΕS=L){]AT}e#d ؑe)e*m .b411MWƟP,*ŨjT);\cK͢⍪mmu=N続^وW_%Q9[Q!q>4_m1߹e]P=_4 mGwOb,f$^g!ӿ$a}q1g\|G( 9tC_kb:.ϘC;f_zhOuU`pSo2 >q(Yz/gh )mW 93Ι9mR9 bi=L(U>5 bW`̮!`^#Ӱ>* N#lJ;X%Mb+0?lLtIiM%X3~0Ogc(oŠU)7[<ʵqzE)4Lo=yOBM ǫ>3NW INj7ã IA102z(w~|jĻHX;` wc Jv4I|on EUTv_d:oQV^nE܌eD͔T8hV=P6^I9]'fG9q`10_+w ovXڊ.%ldrzj,Q(KVS ˴N{4g6xfi"z'$`FWP"E"vj\*w2ű- f$k 2f߭r/.Rz[\o+p`]3 Q)w2ya̼Nx1-h c^eDĩ{yU&KwM¤ftc 'T騬[,1 ?;>l;7"HwdKwLLVg$Lt `7CM\ÛCh_Zw9qph4!2`jՐ., <\cߓ{DW"z{cRJa &$7v;0#P!#0s1G#MgJo ;_|_h`H$yX4FwRM8Υ2~5@5cpܪ#T`RG ^ȹxwԓƆQej:88,ȯ]!$ی}lq\y`'K?\9:5Jl;WKrDݿ R8 . 69n;8ZҔNz܅2 ciT;/n>7be [EOj+ w$ud du0.n0>jQ*`Fྫ]{hEGC?'9z/`?ސ,hZo[x1.Y|HFg2q.OfH m{.lЊ@zrT5eTZ贃A勒' ja ~ea7**q :qԊ;θ('&WOʣG/˭uMl(;evhKRꞇyNyN+Қ]GmYK~WBLܙ~/M]ž4sZcˈ԰O toBc/wuIoLne㬔'xF Ahwv俤SʠS&*nLEMU̿ Z-0%X?xķ9Hf[ b<8w-ߎB@:.W o1C&pCodKp2*P ^,g%8]w=LHjC`'C*~9 ¤?$UՊGu ?33vyh &ezy!<_ p1.TۺMwПvh?wV9B-QIj0(I_9IG?Ь@R=<<~DSI -X@~,.'R^geϙk"GF.:h.*k{5<]`̗'pvd;\`QvCic"_]ůEA{+D]wXQ:}Gg!ďOzTevw0u!+DV* ϐҳ$n $+>Kȶ)%WGgnVDKo+g$S>Y@I?zAMa|Iǹ0I0ZU٢E6H٢qGAXٍN's^a(*.NT;=`s@PEg_O[e14+Pv/%12֯J\`o[J8A炀u@o͔_q@¹{Z,*+Z9Βg#RjԊ.yOjxQNbo#;?s*V[嬀.C.Q4\b ?Xs 7 61pDLjMb2e,YRu'XWUgIL"߿yT!k7>[86?`Z?ҪrSbnf_ԥׂZb~Rm*#wY'/?}&7 ;^SK zEVrδ|kb*36V9s\*]M[nV;}Q.dR=%@xgH:7xvR.ji*-"f]?v5̶]cLϻC™U詀3LRfč+}*(%>k ,Rr⅑Pvއ1 c:hֹET=%zn0>ef>TSt ZMr78:_l덷,]B XL,6 kU^|Kj`LVWtěp'15ϑ23c,LJm'Bn7$qtTqsI.7ːN5un 9Zӧ9x!z~'Xc -oj+5M]lL<&gZa:})}J;L'9fٽ ӦVja*FD^?>7[,S+Q1t7L7z6"Ȼ[k-MuFWK}W Uݠ mt;*wۋhuzBāY34I!#&ˢ~uý a-b{yRJnmOIr\_\Z,wU^&9wp z Vs9S'JΘ.D2Ll@/! g&qSvi8jfx G ʍIwDGo#lv?3 Mte8!TDzR^s~Db0wc؎7T066 xTElg jo2+ã?޴~y)Z'7B粞т3XqL.jOûUH(t}}έ74̡ zx\|(Y1x= h:!q~<Ǎpvm"V|5Q𑇜Z+5d,*3MmC;0.ͼR[JuQ{XY|nBMmf׳dg^LCJ .KBE)a ǙJa *Ƽ^#fRtz3YCTWr("*8Иu8L/ao;tiܡo55o!-pM5%ׅQh-{GÝvN:4Q49kQx419Dok6|˟[Ѫ7'rV4&QZDXzoǂ^I=A&V/iM6ύ#006y(`[`VdcR_g>IKLr&7vYLt"68s?+GA݈кJ8v*#fzHjaW\QA .=2dhbFXj.o%ye2;)elnU4-!kK,o{,6 >]iceyO!~\?X3 $k_`}Ɣ.w9?՜"N0TH #W1[serVVm޷9X)>0}`Vmn 6i:~kq+ou}tK݉VxQW1eϷV+qNy߃]i࿤@/7}IUW&)Yqg ,6W@;l)e(][Â]ƑL95xsYQեX1ٓo矾FDἘL&J>oZW8rf ~c:d)]{`]p3hۤQGFv&4PHu4pu=]/Ko 1zkf4*H4YW'jmr~> >}ܝf^{g_HvG P|-BFbF{^Rg:Nǜ#TS}T )2uÞq :DHvùR8[SwW 17o8Y3 kf|8`i[XxT%rb-+Qy3sۮҐ:I牍QBRlYܫT':C#k0wiw:lQ^ HʝO`ӔqWKpISmՐbz+[P9 YIK-1yi!6K!p!$QϬ,*P fO} afj'{93r]S|>_zFpŶN־ 衢d HeR{wdF| (cSÁѴL-G..qqa?S0%O.i iHCw :gx*FK1bbd+^!]e1)%':7X4UmOR$N& 8| C*_ -, H%iX xV.D`?1c۫uNj p95&:p GgemEZ¬Ԥ2}c~Կ%H!&H{6p{R"č\ -7GO5fu;(Աp l=Ws{se CWЗU/<Όc+%,P鍏Q]-Oant|ZMul0 !.4d|zX+u)d+A.İ!iIE!7IA{K: -_"lݧ1t*ΧK BhCs*NG ?y Q8ӈס~ρ~ȝ '֋ Z4E;sh֣,TLoER$z9?z\m/ka'Isb˜> %|(^vڜFگ75f+[ =zhk)2k.mχoѭ-ByLKD8| wyn~&4&.9~|ԉ$Jguay.TvKEwoO//Mlb YNJ}g"D3o>'Gr)a HC>p,'l$A82 ZZ)21O7fMS(/M+N2gi;g,([Iñ @Q+H'Ů<17o#rcx/0cBNh A#5e{͵Ol2>PVNtMoue~nU:`e̅e2Ր=7L/\ 4$rr8-=ki,/'kB-#g=:F@߯foyjS4x;Vg66 楓aFPp'$R~fk˃Mq1F`#[1) Y: >;5o1iuCe:GD>* !Jsw>ua#K!< L`ϢΈ&Z@tR bQL }MՒ %1$D}M_~;ritF+IjZUjvFgQZH7X,Jhmīc˓V3 YI|R^6<׍d ESVi\F| ql1b4Wh*b+3)`Dedˋ۪?F`]D*HOY?阳 ${+$r6ȧiW!橗]kڗ,cKoŐ6G=Sy%E\ 짅ա[J3Ӳ|2rƧfO=IHQAhjiv攺hNy4h)ԛ@pV/7Q΍. UˊXGvbɑ |?>?E7G #:u]oUcm[Lqn >T 1=K//;T{-B Q뽷N$BUl_ b(zf7_"]Z1t7;ŏI5C &ƥ>>O|4_gy5^EۅD_BtRw4G ;lM+`X-|Fc]?47m`^2_j8 w6^I`9,=Al{VZ6*ujW D=^2wpXV>P]VMљq͡tŞ-}DmWd p3Q5^A'P γw,F30k"ZHؐDY7"c3_< ;<9 ]vHh"^QoOK;:lym@VRJG󍪏lVçeW=[1}͙yVl@5#nԦ)7jX3ͪR X! 2}_z7م/&1`Ť[$ f?%sR n_˕x 9Oިx׼Y՗peɦ\C0ĒA) M,M~nR -%˹]1QGLZس#5~~OeW>/{ Ow߸BMц N{ U盧PO_YK;):6&gu쇉#ZE(@H^M7a|ܾ.LnS+O * IPl'7^aU[&y'/ 2/ bƖ/x ^#WM9]+$QnVZ˾fgi?|߶d'6In7[Qv5;Ḩ'FIdp}MVܨzL4A"rPME6vHRg7#: :}sm&RT5yn0A%v N.q ٲ79+ Y4xur^nF#m.RX2OtⰧTY!oVfd C`gIg늖$~l4erP>h>4f3&&@Ä!SiqeWhn0c?v} * G"*5Y2E0.G:8b$O3n'AELq}<ʇ/z|X|+omq=@9eΥTHUTuksC8 t̮z-C߶.Ojw[NۀC}2 . et Є#-idyA9xrϓmwK[{em'FZ%\+M-wEFT>8`Lx=fVY_>U6Ƚv`A!C .61n7WKkYKb^Nsyrِ#^ݹ#07 g逜A"W1de{[%A18FݺO2vLb+]ep.<7|= OǒC/]!Nc;mcS VFDNʨCZr_'AS5!^Byj,WT*L.Vvj]1B{>qdoROgl])7»A&MsLt43+Vl;c} ]!C&cx13Ra0v=O$"QW&] Ģ"^eg(zw yqMATW {5!S˞[՝_]maC_/Q7kMLANl-2FF/H\y#L>d}D6]Crrfi53ԓ4G?`&t({ \v=elSi5\$ ~ Ã63u Zo/?j+U>vߓ6N Rvk[ZzqaD?c *^K:rt=bׯ-/|q IR%BMHޗ9x`%\ߌD 3jqU %n4Lz^a*tέT:L{p&rx857FȮ{;%^/ *PH֓]b=<;%Darj~fvzeKVAE4ӟ5MmVX>M6xqx2G?t|^Q Nx .ty'#kN˕ykɻVmy2' Pk D{!Rܽس\وߍMH%^EW=Ok#ՒMHW;4?׬!g&C9a C^J`KC$(_.׸&MN^f|r۩J ۼLz[Aq/(ЛXJ7rYt%~bIw!^P W}Iٚ/jk>*D$QRuca,3Ÿs%3]$Z,3^5D粦E9zΟ/i" в,BeHozTF?6#3z>a6hR5Lq{%y5^Qrce+W3.@R뾇/)d2ԓEj+}E97kx*e)0r>wq>jz4+y`Ҝ3( =u^A`~{Z$bwr7׵#&4ehErݖyfyX{m~ 7f~Lv!CUdg+#N@x۞͚~> )W#)D?آ) *E4(99JLg2e\ڊ#rj>P5Ѷ~=נ H}~aC@|y q / /HoE5Z.Ȭ͢Xgȸ5JZ. >O@\q5v[爦Y)>HtHHEhaլ$'ذЅt=snU}!=h.ЍIT {Ԯr:+Eb#HQ FcVsQ\M% B2egQѹugWg#k~~B%(v 8ݦgR6G""TFOi%ֶ@Ք,ڦ!hLrf6.DٷC [j}vJb1et;'.E&,&L1,dOw}Lݡb_ \ M.#^QlN!=v5ǒhi|>S:۷οDLYKc (z&0/kQAZc%:F; b9JaZVU; N:~l't47bqsKj)mUE>+Jw*x/^ =ְ"};۷*r'yC`hѳJ| ,h <$AztWSU?c/6X:w`-R3  ffZ17o]ܧ:,Q; (8w/?Gb]2~(cLc7 Bȹi#E`pg}𸗿i*TJ;gob i%8Lj \{3)΅n 7ia}w;w M9-Y V: y=i*e0GnD*iYpY[(iQCc;~qC#͔>wa(q1'=ͻ[(˪Oy[)XLnդ;قPnB ʋ,Z 9S+dLJe>rnQvJ~rVhFa|kQVe"QڒC ѕW{45e 2s/>O9)ei mpiò:M8DaS`8Ou$:kk=R+=Z+~  ( l; H AwF1 l6P{{PRAqbgݹKB2ܑ 1Hr`sJ xoO(g{$2k>F%e`p xȉ\V̅,|1Yo&4=?`Qyyx*fU+T c Pbt57i s M(S2%MzK \C'O'#3s2p0Dh? NN/HcL~\❴ѾYqt\d ycH;<[B@ʳK%Uum.#҇PV;>:)\S Zyԟv8NG;w3%5hO /At n: Y,Xch"d*tbbd8Uu[,yf\WB2 cOlᡅx>H델a["n4m7 >9+87= 4`7ʼn~u0*}n;O&(Z7s%!V])~LȌ jı+ģ+*lqI__G4`78\5Y8yHQQT\9½׳!<yv:U >3fK깨Adl-Y52Qnjl_ٞEiǨI52ւbqA'oQ;;TQ`Ē*JTO޶, =dmS#m"XèIwՏQl)!̱)OvrRsI9G^w/\(9J|Ʋ(kȹeS K؆'!{BSF+Txp:I/f/}}R֨ IHsV$į?ΙꜸR4~-"seΠއl_tLm)oMΘ9{7 ^V;߿f᪳Ēg^ʴ2ڬLF^ީb4_`dR89G8֕ڎxTG9_V3T0) C^~$:["s AKԶD87z^h:ǎ?(?ٞt7$[R-,-)J7!*}KOHگaY"Yz(z'c>YLFeJA hOȂ(fW hd64O 1B*Y' 85 GywCQ^=;+w%,ic |bdjsj/棺Px5=s zW_gu5E%X* WUeC ѳ0(OW 9^J"a7n$,Z%22^;hYޢӒ)`J 8_>b.$akpOk&P6,">?צ$ M W# VЅtp3!pޞ~$_rB-#>ϯޣtrk!YRg9K7:'St5%ږM_ TQdrNfU~D1.+rg֚Sε;$ߖCS'%z };_8Hw ^p+Rwcs/8 R {eG^{EzqR#PeRli[PKUK:z}џƪ#`FtQYJ~[j >JF&YY7`q[E %N/7=.U=:^E/`DKڜ?,44}оh Tҷa*mfUQ7>\gTш@*WAKCޏS '7znp nSV\U +t%A/%GD}&bfοHM6RZ}=1':6Dr>j(zJ^LP 68xV C~!ˡFW= c)I J:UR95ZVQPY)~k3C##0n([i9Iٵ0kCb.~ZHNo&q)4a+I }-diU(?g0<޼Y??+kz[G,ֺ@> 8C@3e&"e?V8hYii {/e{J*[әֽEi[-D:^ `!+TgBLw,c w?؊kDؙmPCVKLVnVȬ5!nP;rhrh=kEq\as~;`WCQ'gYȳ'*F!7̿ɖͣ# {éL0LQE@&}(ޥT8-F_rʊ>m7A}N6]-f'ga!Z6ZKA,B1sJV~|"j50HesZ ` *7ϾY$ſ\ce 5Wh "8$I ŽP n>2zQL4P̷ k%tqcDa u(-%$&Py|׼BSP&eI-;I|3HG{a:q甩q1', -/U6+ TQ@4X#iOŪ16W#kJ:Tf#f.si_;3]O;W\Îy/E~3z5h 3|[T㕜l,#H¯:r$P;4ys7] zM }`K">q}Hm;;z{/]-h89Qm.?fďo 2s=dAESڨ<g*#mZP/dSILAbL_-m19 2QoGs!ϟAov]z1ťF{'!wiӇrtluS4Es榫=tZF/߀g0*tV`Ake)5{/蘔[(.9&RwvZzT_gR%ZUL_4KL[SobO.IV||=&d&6BzO ȎZ0)ާ YnOCk /@^(H7Pv7NUW =`2Y>{<а>ZăWGbp+ 2I˩ C5m15tȉxMܩ8w`z봂Ϗ !B B c&KYl:8L9ʹja ?_U7߿j8K0[@Alw,ZD3+@Gzaߣ\S)7fԆv Ow:+ 6JlG~w5*-md&8u+V^+N\!#|4>9 Yk mlO^}_/&@ e"v}]HD4P TLlHvX:w-Kwȶ-KD)]'E 'C؉/X_cuRGDZ;V-qh4.`P="z1.OَrcmC3vC^kƾK]8@wK |ʦO]#\@y}%m":oOTu%jN}؎ қC9@N d2hצg5md,;ğz)~q:JCPWe&:+UevhR\JH}?l rwv9ރmL0TSIrriA|}|9E?C4VPoۏȯ$\wIr.wBa a orWs_ish,[Tε__o¹)2{5Mke4~ė`6Afaۣ<[dqfIS08 a|\8ۙ2=a#ui6jї&x<>kE}<l EL;U<n.~/_-YZ' 2!Y˘wf6p3}զ! yMpPhiOJ4oz84vw\JftOk>ӯ2öVմaX>$U-w78\̙ l"]Bž= Egk-Hy# &vlng ޤܸv ?:=I:shT| kb-(;,A'<2КNͽ ?t9vcTӛ59N374@t۴n /#3\-pJn&~O:Z 4-GyE(hKy},aۚ/L.zƺC `9V6>,ORڀ%j <q:w;ڴNĻ/:X+*F؆Bj[䱃=VӠtM}QLǷ")nٶ5{*X-tS8YY7 j'M[`oCxχUz ]ͿVBE^? N`|o3343S'Nq&{ҧ`6Er-aD6gczIQpu ҵjG8=_jg]>"哕 RI5Km8@{UVdtgE>ޥޕyoʦdw> \r݂n7UӖhu?+ΒR Cw I_YAXsxpQ9\h48J,_-Xnd3R|}<'B)3u< ;m󻓞` ϡIHRKȗ[-]l*(T;RK5s{kr*\5J?ޫJj12w:qwKWTU@6ZJh5Q:p-iw!|-`LVL'݇SV'(mu#~ i s01um%rzu֋>Zf\!dI* `݅awލƦLq3Ђpyr (z\\XưOκbQ{9[G ,3&"b Յ;so[y*-mbg7r`61q:@RPfp!qOI1TWV&aoЁnM t ēk&XU.gr;n +Sxdܲ hܟQD-ULg%3]P'nVsDon2us-jQSqU*+sMt} "D劥u`AQtʖD(^u,$C-s?R3ԫ0mmѼgսNZrA_Zmz<נΨ|K0H_L u֜C_%ozVuXhr ay E|_ʬ%;vkIUH+Bi/ɻlk-h/UlyҲ3Jg/oC]iDZ `irէ Cs׊M~<TPq'9ޓא|}yBeChUJDnY <7d]ߎ;p҉g<Ab gqgw&C|TV שHMRREShGi%ףcr=6OnFoЈ +4@-2a>nL9"= v&|]O~|*([jkUu.=U +j{0t.\W⯖̬Ӏ,pPED.){hyO:myw6b8 aGjPhϛ2f{7Zu" W>\-yKټՠƨ &3b<7䇡fxo[Wb UEB;5s|}ji{ɖ:?;c=@O_l]lu59̗ӳ(!NǨDc[zQaСakt!SMA?vulI-ybO62 ݺuL߾BcTw;X>9Hբ2v|+.f ߙ>2d#:_DgrsJ%>̉|*rݟѝG/:фS1!F+ƤW-UPHFL?54X|&.Q7^kD:9hb~( 7k:_?n>!siGMdQv9rcHe]N4%}7,KVEcjGܵBwx>%}Jjs03it D5h#%"mfKFϯ FI~/q.i Hs7\6ҿn"e>L\uI1m3"¶Y mp|>oO+'tGh#?.d"f@Fӟgdvvb[[vpcpxaHpVu~5dJ@^+ѠZS~e!,7+y,lT$Ooۛ#.ܵ3ʑſ굇TOy@J6eC<1]/8vsI;|5 Od-E7$lPڸ)WO#ҭ%_=ɨfs[Fzgi1&Ѕ^΃r4Z9yi&7 8hE!@k,F-9k${]$ۙų6&p|3Ibprs)Ӝ)g&׷\q6۷oAG1O<ʹ#lʘf@`6>(y35OģMQC"XŇLs`Z@:5ojqHd1AFI-Vw[2mHL,W3;|~a~Ӊ$bu^Tk,& _'[[>)rlNΞʭRYhͿ>{ćSX Xc)|{79+oնfW_*='fQ'v5y/3Y؇{*7O/6봂n,!f݉;Sp^cP0,Kfb[ RՀ ㉰*kUM#e05R=[:L=>JrKOPOxմǣ!;NwaP5hUA3˗z.K)]NVb[TlDOCFHf|+MaB S#]^mhwia [yboPh\Kyなa ;R O'B \/\vܚ@rvbfF֧[z J9OKzQ-{H>~gox;b- :`ZM 8*luW> x)/ʚ b72k09Ik^B}*D6_̚Ive#X3[oU8YQ[W%G"(|xaӏWcPBKmܘ/Nv<I"qd~ӶTܫ.񬜋oDkeƧ#G3bq$y#)ttRA ؙb5c||eso$4/y 7RؗOc$vW\fDK3[a(dG sX+ܴjr\J(n5UTC:V(=`i KTu+  {!^~譝ߟxDY$c2/Cm/Ji|D[T3 ; ] 3n]h$g(:J1"6wTK!y(} &投L;RTZuiېˤ|YL?E;B k=:J0] )A)S1&>B!A۶2Zٿ)r 6Fa@u.y$d h=/&LJ a."Dj%yyoX* ]1>*˒]7x% +vKj= l;Xf )2oJ]Pb IB8lCNK^*Ī{1UޓR'=XOD[!H}"\0;8O^XX:q(_8&)DVQr=fʼrOTE/^AB7$otQ'`'@ @  0}-Ӂ 6[E&RA2 ĥgmH@%*H(Z@*8օBGDx%%똦B"s{zn_I!5a/_K8Q ]dS f,qXV-֣◖I]f1l k~4N}%]f5:x{ ht]L vloh䑴k$Ob݉D7&\&]i/}bb=jk6Xv`%ŀ?3ʡSg 8Y ̌qQq ΜNZ&̴N=\MCa(́Bb|CH2{R3)?(hjp0y*>63_>4^HK7T[=xܠ ϴ=t.RZOs胢5!7/~T|YO3M:x0}9|Ϙ`xEJ*ħfQJSQu!0ID?k Pb*TPl:я"d<` 5ں|ҍ z@$r_uk-EP*rf3Dj꒔!xTp!X([/-L'jYW8n nMMG_\,TRtgV["$2h: pEuL ָ t R ~#*@9n Z4Z8[,D luH`D6wᝁ..pZ*_KL`m Rʘi|4|ZK\֓GۤH !R>&Sl =,i4!գOprtbTYm+J# 4ƇN>{m%rk|da"heV;סrucڮҍ~bHX6*Η%EJTBhM8Z4ij7SDUS)A4@M Paσ;VUOS?# ""6o<<-٩8XDQOgdg q=t~`V|\eZPPI3 XVڬϾVaýb&/7anP`*$uN¤V_xƕuQ9 +'8I?G[ SZl͢1t2I9 f|6 'J2%5WI8\JEAvwW#zX0mz"yI(K(4F Cro51ykvJ2 ƨld놨0 )uW |Td>!8ӕMJB6C.ƻ|x\MR(=r{Rt`Kӗۇ\#;꾛āBs@#eA5eZQPȮ0k#&pNLCC6N.֐Eym[';Q{7qyF']Y1rm=RY~'h-=,WNlbCaNXSyRb\,v ~@I 07ӀCHlL3sVkVQc󖤳9KaT``{anC-!#t'l.aT]=w 5s85Mo DOO H9wp ER jnr_/s!E8KlS!E(9/;(Qf!?29gծ ӊZuKfԔ }(`ς;Q&NURrYCM 2/F80PDvH_D21<IS:IQtƵل3 Tm#:ы=) <O_>+8<='GBb,OgWo҄!#t{?jcږQQ J𫨞ntTK@u|O\]ǍxbCW)bjo^1jý I |5BKzX%-AKU>hGcgb?{amOQ ۬c£wի?O) ̆[[>fF,54zݖI-^4_CŹj>JT{v?#I$[tGRmѤb~$d4$G|krx])O(FhkkǨғ0'3g#ҧ* zfBpY@:6ϲ,K ֢Õϖ.()7 d"WdC-+#%fϪd} FJז]"guG+rq6l>hvsgy"͌dNYo'ǯ6l @0|,lG#MHsaxN$z-ODY^ߏnņ.:XꍴƺVXdn-BKtݨhvpTSm$P?Fm1 KJ?K~KDLwҟ@-$5$q8m:sמ~"؝c zUw"sg| rZ=7m^hyu=%O]J _FD5V^Ł-Xݓ )3<gG`V~<.ڎ9i硁? w|f9#taUM_uXvAwn/P /A`Ttԗ @53 \d8)8p\x:SR )<[d1k5's܏/XҸB7+O31mJ"fG<il][Tqn?4& =j9 #`v܉`_jCNJDqV~.)bH=7yy8Fш \2>˯{bfOBg}v07CVWp^a ×doo9[C-)Sd8{y8[sMH[s,t`)oRiR;Y樀Bz~h[0LZ.,(m ^x#^ok/YX{'=Ovi97F6DsKi3> Wo?]t JWTIhQU?u{.a[5ЬxNmM7j*x17v[WwQj?~-?ܞX/$X tРי-.Z)~gkA@%%߇l 8PU1m;g]aKPq +4fEt,ӫھZWx ъM_C*)PU){siuG R:u?d1phh:0 aשv/l~C^k|Y < ?,"_Gv_rfe3GR*ՁJJTArKhy$=Xڢl&r"Dθ;!νc|?ړ9vK$ozf)e.2:TSgrqm`X~Ԍs?4*iFQ{r6; g{l,͌y]=5qEAt^9I~bFg 7FbS#kJ1C_KDϲ I=лbZ#O]"M"c/U&$vG#Y7}UʺIpCe qn= *^DOR%Ck@P~']Ԋ^; u;zY+])b Qӟhvt{ry"GJsI>۽pwC+"<7"ѿ=-L (7R* e~*&m)!ҮA, CK2M:F賳kȹ0q l9pG|QPF:421{0hְk&)Iw"R9Y ƫe|h^]\奸 n7@,gk{SC>`i`Ǵ i҇`I7?!8YNd!'edKa`4˩%$5kFJLy«{ѱxz>wcTRx;dιثu-ceMycBă~,o(:y"t ]˲(.3_NE!2N5:4sݎՂ:f29%t1߹fsJ&gh}x'U&M4tɶ LJ oY,V`!JuJr"M=^ |1݉o_2f H%X$~ީWc2KD~%# D=LTE3?ކ*XS\uv ol0zSA?FO02D+^_KV?^rdAL/J}^xU$zM5XZ- y/W疖CrnEiOCaC5 קY)G R[DP53M.Nua܌ gA1ڜkP %.k%,uzc>xa=wx,] O59ׯ\j?_}f{=G2cĞ kBO9jB *Y00K'ީrK6#eP7K 7ԥ^ujUec4ڮ3-j<^w)_""Orb,!~o&G^?- O'!ǼϿd bR`ǠdPq@N?VO,U8CA5yU:ٓ..ԜUN6g5m(Tsu_ %&[Jl HJ|B/?2d&wL2=sE[ZM%SaГ=6ijY%WZWxj5>0mZKD[5;M%S>=>ߡpk|+|}}lZ ԟ!p+(1A-:ZYvbڊ;m9Bw]W DT/R+=O$Y(AL43R $$eBΠӠ +EijR3C)֣{jѻS  Ɛ54Kzhw0^T͵'&<ѻtce.ךu mC"U2ن3;OA{;^; ?O=] )U~c %D\ j+]ڔq vB\ϸG d.{7\_+rȏ'SᣠHxQ 18Y8!v/> ^E&//L]H1a͠q|,:vWxnvжsrg~.Zld~K3w,#6D60}yȻ4* '-/i>@Ry`ĐTTޝRBg!"!ǣ+DaNWaZ1+J9,Nx IcWL(HChfqRZJDmSYKw82]ݝWS;zeY@k(gatOC@23"_ Ea@^ƫ_M!SiqHqZҗ s,00 V wnˢ[cR}Q}hPq{F,<)ԛ"AS@+UR7#RsW76"" mG)s&ySda@ U z#`V =p{Ea;zA@w0vqu"Q**:|'^wd?xo]^ ¡dHa#u''~6mR y]PO"n#f<a d |j#p(?!OorRgkVX^O1IV+y$aV%+ #hhe }[YJG}d,)&1_Sc^ 8>μ Ylsţ Sl:c<^>{zD慩w{j+]o涞= G&=ײxPQVMqG9l/3]g qx7 hn8`>q(IW v `_ǫ0h 9slK{b3 6~0F5,̞j_J5yΒⴐjW ,C5@!ǘ褄peΖv6u(t;pjcTlf >SɂJ}8B޴i,p~bkx|-=PJ.[a_Ut2MN' :pnjh82K+ogLOs:NZv.O8.S$\Y83j${KTRBb,6dJ_٦5buiZ&C}ݎN^fB$n$S @6bxv^ƙx器|2ׇXߨ׋"l׼z10|1wmʯ/Q^+eG|pٞs)O%\' %_&cnDž7pvI%x*|,7߾PЁ) L&oU:SUO fO=yp2v}L޶=9X."+=˷C)KIXGUa<(-jZ'oEӄ/|_[Lw$3Dd^0/2J>uENc%wP#/B"P @BN 4(-E~ERb'%KٛHF6 ذ-AO ]XIّTk- *s)f\ȳ@ܦ鿾&-FA[wF3,Mks?&v JVNξOәeJŠ| FF=7oOxԫ^n6F8 ቦ]z#8)d6À z=VO BhsZlE~M>> i,OS^ oƾ2}GHԇ}ZHEӫN2[Sp),%Β\ >1wjOX8&Q&OVMS!SUp CԤaۜp؈恁ep>3>rmNf|glplk90Kqס P W:3v{{yofowJ03;WB%Rtļևmw Cv#ÎɺU~Ԭ(|S0@S7gӪV¢Iw*4ܴG>Ʒ"I0 ?{+nx'?9^윾;'#<'X?d9 FRz!gcBlew-2Cfdḳ[jՑ4RYކ8!M=mNx3 hׂEn '1`NvG{XZ{d3.6:֙n9~}j !9}يwαGkhQ+x&Q\jG;  Uz50AXE0moP@m"xO1fl[B5"݂=Yp%9o8%X qTժd9t͑(C|G-,)? 8ؠ^2OvR5F@2O(XYmF7 F2>;K%&KU̲e0L;b4dNP?ı$&ٴ *6ZTgxnCc{/JnAX3_p_IҞWv1 DwO kYP0Y[$cgA"U\냈spt2 1U\3`BF+' [rtD)`´Y ",Gb\#8N՝ ,6Ǣ8wia2x+ v'`mD9U&Dkɧl& gAX`rda8z%)}w{9.BIE̿*") UnSI8`;VE?9kf׍۬)VBW`h(=O]m c̡ nƧ2`&ֈNSڷϮW]|ot]w{F sT{'}^8\Ę2Pkld[ͯ.:#,k=M nwEf̃#/)9Xs;~YQLm`+0&1Qe7zeNvpw&+GHZwRBJgR*#Аe,nʟYoQJ_ZSFc^e|Aڽa+@NFdw~U䎹wdym&ɵ dF^z6qvk`f&(?BU)<=u 2Ik$xC[v<9:8fV &Dbpl`Ӗeg"L>k*z8-7iA6&@TpԞN0jVZ +-:{>}&FMlJV}>u,ⵊ=|U$D0x:X ŢYMgmkW@/(-6j0>z^p_SB{Sihᢽ.stho<5a\Nj7yq]uagHd;Jj)jhBuIKhZ֭ÏBY*cHLsRZ}톖3&=ʹK)cGPW/j"Yz.7[Ъx=g-cebmYӧ>8i)Q[d6?IѢDz D]XCqU]y)rR6(j/ (eT1_U,Ly H&l/M{]PoN.;fd 79KJzY„_ѐYvK)n[kɗμe sɎw 9̳VI/=R  tk$I?`~R x3/^YN [7]u ѥ1 gvBP[5 <9d$lzU=#xTE2!#@oIQI?p:r n%t ^qF@H ҄$YWM1^Nuϟ.+?'g\l 䝬ttض|<"˧ڗ[8Թ72yƻMQƴ$rɱ.CGq25GzVcCέ CBE+2I^jvn⺕\{o#l:Ʋ#ۢ5Ft'KMeFgNQ>kwӂNu:ГEgkL. f0ky%_aќd)fF8,&Oo_6]\6̣"FR|X|6_*Tw򑻨d\McΫrQU#*dS;2s<5Tλ!4By; AŚNv.vV)7pc `ɇF!&PJb_7>Cd˧+C+PYf~=!ߪ,cXEk?p3z"'}"}F>V[#A^,5ՁGsZ0:jzz셚nS0ۣg /q&l%4r{;m~zg8/KQ܆cEpiLZW:e#&fOikסڄ;}dtM OeU+ +>z+;hY=\-p<]\2ۯiA[Wj1A\Yb4.y1'p.*u=Vmx?vy0qbi BejJsI`.ׂK4Y}:P@GeЭ.sѵ5ʣ9WUܱ4ް2{e?OeͲf^L6A5T믎 ߱w/`{,8q&@7d& #,oU\)r#kYtRV)!>fib>ހ.lAF֫իjO%/÷)bDBRӽ?K'Ɨ*X_Iuᥛ]Fxܣ!]QR[g|;8!%\bN@?{R-pӏwt$dW|'0tHi cLmuD4ae;?VY9U :Xzx(OGN\^#ׂEK+ꝴjpoK >t4p 2M;Ky rmƋC\;&[ٔ9+E2&KyjiuJYE]gJw^R>{EUe.3Nai\] ߔip풲+IH!L{~4`pT0+#>'6e떨n<$Ω^U&!.4e(h;{Zb'FΟ6l3 ә[gO2I.Z E׆y=N'/{-m|z\aSvw[}VI$ f@f%ͣpͧUػLgr-5FsU 7'8=x*N yicwL}ڻȌ ?,ݾ1g.7;z(zMhR{Roۢ"eZbQ4 <Ң}rW"QtSYBB&-C'as.uǧ3o#Cr gk 8߰,kۻx]u7 x zZ5:?"at&~6[צ'Jv&ԅ3\[cl⭪(Q[5ݏսECp<#q- 8;!n/HViLWN?ە{>rNނ{xQ ~zk/NBK&e߫rheGѡAo˛/LO\/(STf b w@8TpD8#^%!a[ N -*^n]|+eX8cVUOO5n$̊FeK*ܢt^Z GLVa|>AЧQtDƳXBC΃vx,IV.BwueZ!Y]0\~킯ಢ8ޱޡ6ƪ=<&OKq.Ojݗ*.?yLssҥ/QwɏQjX?q隫PTkv;OH=w82[)L%90'-`VAȫܨ0(Y*4f go=앢+MFH!7?.^\su͙S:6U**b2Yz\Yz~ԟ1lysK.'g4'NÕZm0{<S%w`Y&vdef-*4'(ߪGF+aC3Ӫu(YIU3Yrq2+Oz w A0x> 5iNNk}wmgz={4ӌ#31~kEj{zJ}@Wg%_ <'(R`a,أ/V5שRg%q7,4b_YE۽`b%9xpDʭX@-c|ՁҰox60viSTbݿ)jخ<-\u'a%zwGod`7]J.++E=+hW yFq唙[VE4~=eF ~c'0#=4+Z e.?w`ddSmһȠhFO=9t+V/2h1UCb;lЮI+`='W?7՚Y6ͯ ~n) Q9>|*z;ҜWgJZlZA-ĖI¡*EFԅjn~=(S0XpV] wc뾶s==^drE7ߚ[o(A5c x@OvcOan ;L?Mj+[+<[Nt:wPb]}7׏eиQo*"Jy;:ԫVŊhlgFV(\ IۧwLlL+#cZ!#CPґRB#GjU(ɮ})nn ʴ*>-!>˳fu.P뱭CCޢueyH&rfB{}xj +;,hQA P;He Q5WDo*a3/ӍW d%9nPS)߾(k 04e>.fد9w?>l`be g`t|O0 D7wU1pvOf[%gנW=š2x`'*=Sk*1RGil -}lx?ӍviAQ^Y#`~حќr)x''W)k$*olNz\ $ˌ;~`.HmUg\m%!ۗOOg+x6w1{5kctɓY-z)fC|30Vc.wMoW:MWJXN7a 87dKXv Ysm$ B/c)WAǕyy|$gկg323!F1ZKۨgA_?]ei=S'#u1Mէ Zp[,Z_4(9hTm K0saY.Je,mE z-w߁j@6XкH_G?̄.s4xJs`Rw#r.(I."Py E2Deyk2UJk[W#Aco&Ԍ&K *} UB{[啮n!eoR3BivUAh`#'Lw Rƒ=بm߇)7[d~+Z6٩/Zs[uKeZ Gʭ0z27D.ԗ L@N!j%˄GbZ/Y(o}ax֠"3 2 ! H~&`R1 -J$W+k&LqTmCd"_pr_ 7z٪8 [t=}dWP;N[-pΰ;=,zW,~%q %d~WeS/{nz1|솩Kd dx?= L=.:J[1V%zBI㧼sjKO?7N:E >m̊xf_yS{ek:s>^lo3y80{[ u,ZyM!oZW>hVh˭*L-F[W}ܡ\8j,ip@R4j-vViM2+hU B7MUf1yV 21Y3`/gR~To۴O?Ԛ` |WJ yu3XǢyȎQD[V}>BGUY쎇eR`ER2P1 mёs(dL]59#2NfQ #EB:683 x"ͦvIK5,_gL-~' V1³Si;_f7G]Xt) ⼚Wxِ:5@fEq_֖(S0@#UCmq=njfe?'Np DSpqBS͟+lYL5GS~hn唶_hg|Yk9<,; ƵK|E}a ^sGՕ`yTV.3vLKTj366xl Py1SI{`7;K_`%=cG4({feeV690 slXeL;;hZdHom+ M3pTʚV&JY "n)vUo&/$V`R_r k[+'n3y>: c#@38]!8=OtgKU fߖ|,̭Uhx:xh )d/~k fw=5_1)>0Ȩ)etu2\gk4|tsBf>Hz qy `о?dK4)i nWe$`NchT;:9!7*\w҉?=6" _4?ơÞQF"_K\@ȥ|Lg΃:l~bǁ;`/{JDY$uz,\ZK/jf,o ƖTo\u. P-]\q#U" N9["JQZ2waQhWLZ,ɂ͏bsfad2XܞN;.xF7 !$P/] yJ΢>O>uMj=jy9̰H8 !`OtAsVpJ K2Q3Y&k7U9w҆j+,}j 96ˆ.;eЭʃqE(8,N~ӔOmߍOYYZo8Xm|EeL1x MiOHMO/j!%~,}kY[&(DN]ـF3>Â(`J*{.ESm-y{{iU[}g!2Ng?eR7o'|}Tu n<6,w{w;B#080Wɯ÷mԮw/na$&Z1kp@̖r\Qwmf) ;TuݛIt~ Uk5kԏf|? 2{dвk1)D!?sWleumQϔ{Yht;T.x} ^)d 3*j>O+ֶקL8B&k~H$B([\\Ҭ T%TB)ciCm7ki79QR=~n;!L/6y:D8ZBȡэ:I76*rc{Ƨ=2 vV9=hZ}qv\-Y_B5vU>VJF_Vt}pH@1Bywpb $Z:D1F 9 6O +FO̶l z˳L%mmZugLjjղ3 ̵WtkdͅѣStf Dm-D)ja4t}R· EU,#:\B%BKѬlDZ(?N~ip/oY]䝨5l.o6Q/ڽ*NOiuhHpȕVYPirpQ!~mww-Pc2/җ- s{+ab kD,2X% A!uVEyEP$\$J婎1O~ҵ? » q@Y)gs;O]}qh䶳Nx H1;@ s hZQφ Oʶ0ڭt|_Sݹ7w3Qu8`V$ E6Ϋpx5r.ݝF톞e}<,c 0TvgIjz.[(WbUw*e&p8a@d㬉2:5~1(fCDۙENBhb ؃Qk',(ABXVfNs}K(8QnUP`DزV#)+pakٷ/L7Z)FI`l̞(c#M]zA5@nj),QZFD~(S噪(`/gy 0? .ӆ@3ޏ?F60`ЌAݿ%k'>}{'֡ -;tuCeU!^~ZŞdSZ?B hӖJ\N2 v^60@ S;$% j u/;vtƢa -b/u44@L +*Qʛژ* dByyiClƢ!Ꙁ5D^Tvb<^%J/+oFTAÉ<4Q3s>㐣lq9:˱("zl@Tց+VTC0XC,7*u!]3 \)/"̰-)Yf^ Zcá  K+f}1E.HY>!Tw%S#үk:\1EtF)?7C/!9\;nb c/QY}%cl `%r`\ŵYe֠ETJmxAeFޙad52 ЎȲRzm pn {el]48׎-w ٬5jHZA!̙.;Èi}cvs_I1w4bZ3JtLUlL w=NGO~w߄^ӟrbl=} cX~4~ MCd D KzʃʷJH { cjsΐY ])?yz\˻7+0_3;Y@ RFd*LIofRmcLz$rĔٙ_= X@ƾfu' B՛eyqpg#Ѷ"R|AD9 !c32|ɑVRh0rc$u)tEQ.ywqiAO,ᶧ,n)%cNtr(U>uj~ 4G_Xf], ϩg2I*~ciRBv?hAe-:}!k3^3st de[@Y[&[!SUogE*#b'x75-uvAݙ/W5R'է?TNCׂ9%إ2h6 xĔ|dC,EněpU>˜޳$=${VeL+և~)Gjɕ~~փ|g%A+*4vp# :* '\ ͒B}%G^Y' +4q5yelC +!qrN{lwgfz9ʬ!K8)wgp65Y7t ,#'֜u|"> "ܞCulN㝩YkoʯW_y!O8` 4̱bQ 3TnKZAmQR ~sJa[ء6,GnP*Pʞ|;Ik N'F0&"Qi-uFjI]2 ʊݫulW_L:$* +\'%'vYrNE2Y7G`DueI.uf㲔˧~=w*`Q/#ߵXS T^AO BèG*U ȨzDW.oK@2F$۝gNJs%N¡Oܜ܎Mj[E Mkx֣m0j9 ?[iBОt݃./)V8;2Ya^pAb$|u ՉZ@+z/T=飂qZu:GUWʫjc 5rHQ=|C]U+!)0s͕6^!{[aY̚O&ѭ5rsQfߧhw #y-W@ʊ(d1)LFO=Ԙ<ʌ"\;8a>Q:Sx[n\tQcc:Ƭ]5C#/:+$Y֙YtbvD+4,GrX5ynoa1ڻޣgOV^qd9~y}V!$$Ġ/r- {E 2*jFAct^>#c-ep n@F1BAf,,1H2} ;utX*je=eו5){z]&kTP(j(.9;>.yk6 rN>oW;.}D\iջs?a. QuBkQSKUWp?ZR s "i/R.90%F7hҸe^FuuL{Ϝ r*gfÙge]UyZ4vQHEfcU̮_1.4!@[Ly`odM"Wf}@Vq뗿$Gс `P;낒.Eb 3`.f@int?}_x3|2އx~|UmtE>>e#n]|]!g֗6=F*˷=tvQn|Y-ǻw(K~i<\y=b_cV_j iF#gO-rn\$وNGKH-wӰ.VM )y?;1z!|E{ޞC}"xF&3h\$a[wgl[]V~E+vB|ŪxݥX׏?¸Z6Փ~=Hr_CvNPT\əխŜ;E8-֣dćiE`=`  sy5IpIᰂHM&>?*\~Tm jTO!&ey1&bRcKZ_ OE| kɩkq N">xqF'}G%@uHp)T}[w:-Y6T3(h|uOaҕJ|f #Na,<jr<ڡ/ކc9UM3[и)`q ۺf1HĨmMlrmBp[睓B_,`F(fXQTTq@lRr/-JE\cMn~ &M -(q+V;Qs^sJWhTR.FC* 28Lzh4IAi!fq]$l65kӘ}?+0PABC]NېU;jNBڻ/^pxX݅~n.@ĖALF N{ymf߹pj{S 4 C,}gk'O=z8~e^oQ3ZVGñZL޾-fOi,YfntWxˆn~zRQNT[oYl&վ+achsO]^;NsUNXw1*a;I3VuK'k-oF ߷\׊Nz.1Υqol}T|p}?Kx*BPF 0kJȕ=ۗ Oy<6^}%{Uӷ6,HOu LfF9 R'l2$xԣ .uN,Smv_N^uv-МMzY³ ݗ ܎M>¦]ܛyl'Bz|kMa-uEzleNN;Z&ApT2)3t+KqS#2*g"֍}Ǧ{wKBwZVxX{6ynzN{3j൝ pPJhMk{̨ '-X`.%rba^_-j*'\lh=3.F4tt@8𛴅鈞 AA-]\HX[78)c\Uܔ-ڐ$Oܚ@29D@0~=[^`{(5:xAİ{r E9 &F 'IwOįN , ā%C#dpOkJe cA1Z cD]j WB ܈j ge)uC!ʩϐ (Fe׵j1^CD9g? Ԯ`DpCCy?mڨrB,] L u67>QcA8zin La#Os=IgFE'čR҃Z/F)l~6ʎ2&^@@0f" 7(3Wݏ2*!o{}2Wƒ`=6>֙.XhI5<ͬXz'flIOJ_)„?glmnet/data/MultiGaussianExample.rda0000644000176200001440000004540014046050560017245 0ustar liggesusersBZh91AY&SYY q0_i|_4}{ӛ{;;=5=[Y/y;wjc\oK׵{uouQ=vywwTGu[4Od MOS4M0&d@IM4ѓ)桄P`FL54=z4ɚ f=4&mOFFLj6C!@ &i40=2ix&&D"cMd h?C#L&0j= ɀ&&'CDe1 L&&L@ѐTD&4D044ڧMmL210ѣ?&C&4O)biDLidFM&1  &dMҧL&zd&iژS=50 L)QS'ziLa3& )6E6O5'& yOM0f#M LD)5L&'& B) &dMM 24Ҟ 444@Mh2 F4d06C  &&04@L 44 Kj`1Akk? l t )AIQ sbFHĢ@@BK-6j[Wgwd 4f gRl1q!hwϵz]? |vl'kl)АbϤykjẠ8ÊRP)iko#s$i|E;EpšRDI^ZT CP E(VhiVzǴj^1iz-&;FWw I-ss;2A6 CR[W2\BuZ=!~?+v,U"nƻ %95'L" m`Y"bWvK˦+ _qjN#Yf_ƵRI;eB6g~F5q;Ji!n@0(r˄ULGDoXV<1yˇ&L`Ԗ[.EɰnYf\3;JW4rS|[>b⟡Dž -if?8a)^B̾7JfkzxjR/a[Vk*Wo욖LBu_Őq)baRZڐWa| N!&wp 1ay=.T %A0]ĺ3d:L6nyS*,R飄 UQNey ኺdFm?,6wN12)4߳G[aX cϖsJ} e42뉾\#`n i sJUA\b9TI^¤)Mqt\dF' ë'햇[/}4q*s:Au 2;CGOZĘ-+sPjfX YGϘ[X )Hk"4nS ֊C>UiVql8Lg>`S¼T}J-ȅkRj(.hAzH%ݏ@FĈu?r|BOM|umEwR uwiƱ*qO&cmhBA3us40ۮҊ]KkJSRcsb-pt5O|_i:T9'( yfȧ0@C@Nvr^2Z),q1qume͙H<oܪ>|LmXN[vM8&+?~ןԇĀVKc,԰4ҾmdQo&2NF0\]sPmq<❘y+2Ɦ%($v*3Je"X2]l%*k5AgYW=cF%|:NiXV*nqꃐ!i\yeme*:KWP/v1ۭVpho"qµ=A..i<vy* -\F4_Y`."U )>-ECLccl ' kD GFT>3szCB.f;3>L ee׶ܷؗ'#R؏Aʬ_4@Ÿ]^}_t~T59g`;dt!Of}BB'DbM瘺{q?J$y?A{q1éJz #|wk]XoN r (Qε_0[kF)j?sj ׌"JIތ]Yĥ d!yMuPuX\E(^`uO\U8ͺ $gu_T5ū60(-M #H|i׉LØWTtD _7- v> 7[vUh=~~gX^9E-3pRn(p'Yw/6yg] +gΥ%:'Xb,=n0?cd|GfK1~0f$n*YYDlFFH| dC.JE{~:-dN v9kUܕ*M7g&MF;,bGܽM ̖W;tfx,EG T;T0O׸ЧϏ܎;N{ģl)zH'XPdfMxUQ[-ʁiKo%Geۂ1BAtLӯ !$Ӥn󭰸4lq@gs)pY KؽWzޛm=NH&1ǿ~SJ8_*lnK:&7 vYjp~%9dn0Z?[VߦG;M6fǧ6we Jᖤe+`Rv&I]1+%퉂,!2Uŵ=d&|WVOZ)#b3k8GAv֜bsN2$}֗cg_ܷR ]T?KvZ,/Vם5G*|_V]`VPM$T^QOy.FM²Ѿmvj9:^7֬/&% ✣jACZaUJD;nt3 2Zy`/_rW-Ru=,iZ)"|H22' HAה `QrƤdtivtlckeWmcѾKUYÏ '#+HJ1$Wulf/ԻnIiWQE}K:=Иzѫ@1Y ԼYxh$/ „JFh2yShtd3~Ό UEjg'îߍNvg{{T<.*bif}CHpz| ƽkHlvCl͇W.o_rH4l,ShқSdd}rNEǞF7aRd@ >bߓТuu3{vaK#6A➿#5$;YSATҕZwt*hVA ]m&7 jȩ4i!-+,d8 0NsIBMq)SpF+j?C7@1MTJX4h|̐pCPT*:Ʃx}s/qMhJ.`Ńd"Z螆?u^8!:gc%ynKefE@>p%c /Á? ˁh'p=\}Lj4^YQFEkla)@׹_im Q^r$kkBIJJv;}h~jo6=bB-:&LstsY0^|'FB¾Fo}TE#knavFlPN6,6GKҳ$s9+}^bzK} -I$dV-Ĥb/sS' 4;uunGe SO})zL #qkyl_A"M3 `4 f) +K[xvq3Zwa< $ ﬦ[ؖͩDGJzK!ZRG.V/6M7Y*?(tό?~wAck{yp?KC  W2"'\>Awޥq_ wDνtwVMO Hp>FTRg ̊`nmPx#K%;ϵ >U*^l_:+}UXa@K6cW:JafjpR(똎%R hm[|^@?l|VbŋOnn^'xcTp_&a 3G`ZC؏;?!qiku oBl;Hhʫ¸ ;%Acd{lkƘdx%e~1E׷8W(fu-fuo}@ 19N5+X6XaLu)FWe9ar3 -KMK0(PY{kSr_k>`e>,a0C4>s4XCI=φF.?¤5XշsZE XCδ Ez֛Ag/7 >ˋ֌yDf$ګVܭ1:;FQYyo,SUh%M+G|ğgAjE-lqyF`9 cqC -yNѲp.O{s-CЬazJ$ծ+#>.)yqE'0W>`ZqVz!Ê)#ԇfcg)04N{֜r^؀KIq^^&:UJ`*XH)Fa>FfWZxqVp+T\r7y= ۧ}Src_Oh*ՎZU h&'T?5DgPwuĆ0H60'u/ Aq*4y? =nZMQBp-8٦,|OM⋏.T\ZҦ.3;-:fg<9zO;鮥Fyj\ m̡ˣEƕ1ᇥXxb? |!\KΉ_]\M͸cV?\P{Şnl>IVNvpT$;F!M`:/H]w&kw]Qm7z?)l}yS/ZY=x(l\eU]-ӑg6deKW6Pg2E)@e˯M"F`&̩+\탮h Nv[/~%ϑЋ唢8kQ#3Ԭ 2WܽǦT9 !i,E8 v[FfBm~tkרIZI(R^zqUg|A!@x1(Z2x|Gاmi?&#WVH?Yr2ϱ~M9UtK3[&5C/sʇ!)YgEBjggT꨺ ^Ņ:gIw=&-͚HB319r8܋-JRS'"ؘ%#4E /*ω>eJadzy&"]{w-0*q9N޲vN &ubZj<qƻKxa5( Êm(N&3&BN*<򣭴{o2CoW3@1c0o hܯEJyisߌyV%@<7J"JW]Vbയ\S*as+ə"0EWDQf_FRPH}Y9!/(3 O,_Igf-j,VBm C]F_ׇ3Df{2*(D4i?.iu%TM!"q?IMe3C9,‹@ҽeIa9\Q7[k_I%;(S-l+(gV90hP[ῧȅAb;ڇJ7Ùf` A@YiEX3%MK4)~jBA<\x<%8myEXxDMgDRNȑu<ۨ&V~B6bj :MmsٙSϹdд,hoPBC)`Wj%?z^}5vpv(JuRO_n#1r @Ʃkp LKZdYh^Ei+.lfI6wIł6Mn ߞjKx: '5˩ܩɝVsMo^:R۪R"#HX -炱1gF҉,S GA_́7i$=ٙvj(1 "z9[ x_"T5-5M;}X55tw;ڇa r5#U)}1TU_POX.uWChE綗1ݖ"lhC%D鯩M67Cc8iɩtkBzR3d6"ͽd| !o7utCLoI#=웋iƄ戵ܟ8T qtCaPp/reٱ!{J0wBַٜJoA|ɂq_+{ٔOdsb!J.B7E1-}9p-qEi-pd(ոtjF7i)Ix>} bc!/ˬ(ο|43ʵMb֍†6Q|&k_U$QMꝢ:]bOoyED j 37򪞘K?di8C;w1/m 0нu40z%4`u S|'Ύ0͔W¿p/!1$@VJ .~<kMU'n]+Bl*e2LbG򨀻! oG|O6 {ukrYhP$҇DY_审͇c6GEĠq"&~1ވ`@N×1v݌Zg.vWx[nZb >v.5rK#b T%'M. %~o[d{9#>9lf uT$;E[jk]SC( ?_%)r8C.¦I7>I?ї+hD19W_!,3x_)Q lw&lΪlyWف81 wVq.T,b$rs4aT)誜6!ug{w~ا"̞+Yo/HW9@̛ԣ^\Ud!SWj ]uWqxS>hlؔԎpfoIY8/v:Kft=BzPi0w#ͦP=Qtq_Ek+.eDžFz g.vMq=TPlT!, o_c賓wEdlϷ*5uR 4W|rQj+Uds~.&7p9ܑ*dtJe:Y4B?qfmӳl+#In";b3Ѽ/6bY#jt[>wg8xgc{xxPݲ{>F$6dspRDnAvvBIJʶCe&O>P?kǣ(mW㪙œGm7U ;vC!`vt0_,A,05M^ĩn'g:W!jU1ui*u{ U =+;XVw]O o~2SG&+ {MgK/J9H|qG,UvI8)gFX1#rCy۽eHl9ܧTjr̒?Jq/-YbrB0*{)\jEe#9F.}-j]\NeMؓ;JQ Q&ϪSz 'Qޥ>KUwDUม+`eE"m+da$9ؽGl'HB?*WYͼ]LlG9<|iΜɯpeaHgWw2>u:=ri.BP0#(#}Ȅs]6Vט[Cן!Rb 9/C6Ws|&{lo0TEO񵃦)SrDi!@7}i۩s9c-牜L%>`ŞUwڅ#܇[jbY7ч-XcpQ= ?޿MF!4,ߵHB/1cP^Wubu6ۤnm'R!zN@Ma+ʛེH:~JoE[e'[fTo ?FӮ˰/2$v '@HT5I)eS@#\k%ު=0Aa}[3_?Z+PhzlaPn+Z}H EM>zjP-fD-k8?Uv5l B8uNwp(0Щ۱MExoN2xb!w>(AYS;CɮFV]g/oɿ8KE4СyNP3N)@ + Kut;bgzR^7 Y{=CSkl= V̘s)n@1?,#_DQ҂c>mz\md_p&y t7aM@@g% '3gTb8)m诵lGx#7D{-:NZ|R5JަЭGdg֢X1sV6>tj11pir$$Fdz"Oh*O;qC0w|IVՀL\IX-s7.Ҫ("]_~ 33/a:[¡p%iZd/seﻔ٬}NCDᰏ mqJJe@w% N􇮟 spCJo<1iptE OtI>Z(yb]g$j~ |QRԝGͱ܋3l-6THٲ^< 9o=Nne&F>Ɔ~ Nq۲}z~?Fcmb.S;VU˻MryI~ޛ\sm3'"B,_׷FtLmU&~+u:7oT虔j:^9E%l!󶌦|Ҳ!>&9l3Zu\.< ^eM0q峐+.3l_/|$ dq~NDQb-̏l?ŋw(&]N3;Pʯx6>oks—jP0]Ve2nTBˈkuvԀwGdoͼvyKҳ.p'I;2Oz[^9(&5\fAΗ6iȖrv J=NKpTPҏSbhXol3E.ri+Dު7R7^(ֻK7}_.͵P ;YfGsf\yg@d>]%lBiua5V-$wtmM3+Tdevy@vs{ *q}~$?zVZPsLŽEI?э5-7ji6ԖHu vN *{[ǐgb`sd *zx]vepVp^x~uLc&xkҢNsGC<Ū?Vw4 Ӱ]xҍ!ZJ<΋$l>o43λTRǨ:z *C:܈NUv@Pތip.;w/Mb:6BH Tvyp]m&q3{eyFb%$Q֫۩N^-<dkV@3|3x2:Sz:kNm{f.K}XTt^";9QouxOa0u}5ړhFz~ ew`\wQ/v~(;`AsH>3ņInǘ^.L U·*j=7tR?IJrU./#V=Qh.RH}\/r*@boG> 3ުB&#xU Ueޚ R=gOP}?rc]x[xtO2Huc@O R&gf™ w3r'0{);x49\*J_k@g:gcv]ɟrXoF4!,O'e!$#Yw鼑ݿ0e(o.( /ixF[&Exe,J WyپVRߝ4c-VDFk˗GlK&#LB+o]F\tpʽ+VZŐS, s+븘>*p֛op$ƳRi;`X|j6qT*b,ʲm.݉-Dqi/eVJשg噭×)ŰQb̰ ,ѽy@yr(woRTOV=ťL ?Z8x|[؈.rƳgZ(.mc*X˼[DJwˋxv6 /ucf*~k@˺Tdss^Y/ x&=$djIc#C{1H "xv=SG 2E090CdӔX%LjYu)rzʆVC>F7I١^/i"=\ClXVtGOtm.ִ 7:cXzw[KTq~/ΡՔGHHg=NluRTG4D;T|C Pb1Ǘt Oy~QN.lt2zbDn;$2>$ cѐ?sjׄez~$$Uq17LjH .:Njwdo|г0ϼs^.?fOD"D:VwY'hǹgUr"i~t7Wd@a 瑃_^߾AI]L.! a=^L۫s­Dn=DgX*-JawLZ6wkHZozupũGP ~K$B!su:vEMQr TV̼Y\ "X0 ?մyC(j4's`RʐC@wIk u*ǩ1䀒>I!̰LV7q|[zRKpbMOQ~uHMfXL/2M`4nQ Ha1vf r4%;GK. ,~"?cBӷ!m7y8L6QX%0 9D n%+$J”S >C@fZJ- |׻i Ê(HwUN7PA#ѼnGs^y12,` A=4хo;/WY49z4f, 5DjpmrDEg Y$p ]8"*thJξ[ vȣ?#XNhwލ!dg%XA,LPLfHN#@|| r^iD[4<.uV">Xεb" AGbޱPDB("+nS'mJړttփq' @oa+i=ɒӄC.@'/:A0A8}@w6 o^ -^GGf US )l7ɧp#b[I d!Sv1iqx%ݑ^xDe9_ y,+33|Ίk1`a2pu&`C>jI_P[vp% @!>w{P HwNAVa |rW)ӳ2ɗmF9A S?xcsP ۬ wE9W [;\q/Zٴ_PzPŽ5Ib=f8wMx+ۛZp5lO*r94ͮz`-eNJ,*ѠL}mQe=%4 oVƿzUD!6YmUwb}0@o]*}:bf^YWRŧkɭlxGp^YKڍؘ? .۲ە"3R{q6+bNiT}N cIf %+{IֺKe{A늵ށ%[Trp6tiX|t0>;#5ӫe}b<'l3Քe`  !YqqNp VS  M7:?dF{wrE8PY glmnet/src/0000755000176200001440000000000015035572362012337 5ustar liggesusersglmnet/src/RcppExports.cpp0000644000176200001440000011361215012065512015325 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include #include using namespace Rcpp; #ifdef RCPP_USE_GLOBAL_ROSTREAM Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); #endif // elnet_exp List elnet_exp(int ka, double parm, Eigen::MatrixXd x, Eigen::VectorXd y, Eigen::VectorXd w, const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, Eigen::Map rsq, Eigen::Map alm, int nlp, int jerr); RcppExport SEXP _glmnet_elnet_exp(SEXP kaSEXP, SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP rsqSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< int >::type ka(kaSEXP); Rcpp::traits::input_parameter< double >::type parm(parmSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type x(xSEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type y(ySEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type w(wSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type jd(jdSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type vp(vpSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type cl(clSEXP); Rcpp::traits::input_parameter< int >::type ne(neSEXP); Rcpp::traits::input_parameter< int >::type nx(nxSEXP); Rcpp::traits::input_parameter< int >::type nlam(nlamSEXP); Rcpp::traits::input_parameter< double >::type flmin(flminSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type ulam(ulamSEXP); Rcpp::traits::input_parameter< double >::type thr(thrSEXP); Rcpp::traits::input_parameter< int >::type isd(isdSEXP); Rcpp::traits::input_parameter< int >::type intr(intrSEXP); Rcpp::traits::input_parameter< int >::type maxit(maxitSEXP); Rcpp::traits::input_parameter< SEXP >::type pb(pbSEXP); Rcpp::traits::input_parameter< int >::type lmu(lmuSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type a0(a0SEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ca(caSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ia(iaSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type nin(ninSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type rsq(rsqSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type alm(almSEXP); Rcpp::traits::input_parameter< int >::type nlp(nlpSEXP); Rcpp::traits::input_parameter< int >::type jerr(jerrSEXP); rcpp_result_gen = Rcpp::wrap(elnet_exp(ka, parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr)); return rcpp_result_gen; END_RCPP } // spelnet_exp List spelnet_exp(int ka, double parm, const Eigen::Map > x, Eigen::VectorXd y, Eigen::VectorXd w, const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, Eigen::Map rsq, Eigen::Map alm, int nlp, int jerr); RcppExport SEXP _glmnet_spelnet_exp(SEXP kaSEXP, SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP rsqSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< int >::type ka(kaSEXP); Rcpp::traits::input_parameter< double >::type parm(parmSEXP); Rcpp::traits::input_parameter< const Eigen::Map > >::type x(xSEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type y(ySEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type w(wSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type jd(jdSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type vp(vpSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type cl(clSEXP); Rcpp::traits::input_parameter< int >::type ne(neSEXP); Rcpp::traits::input_parameter< int >::type nx(nxSEXP); Rcpp::traits::input_parameter< int >::type nlam(nlamSEXP); Rcpp::traits::input_parameter< double >::type flmin(flminSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type ulam(ulamSEXP); Rcpp::traits::input_parameter< double >::type thr(thrSEXP); Rcpp::traits::input_parameter< int >::type isd(isdSEXP); Rcpp::traits::input_parameter< int >::type intr(intrSEXP); Rcpp::traits::input_parameter< int >::type maxit(maxitSEXP); Rcpp::traits::input_parameter< SEXP >::type pb(pbSEXP); Rcpp::traits::input_parameter< int >::type lmu(lmuSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type a0(a0SEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ca(caSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ia(iaSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type nin(ninSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type rsq(rsqSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type alm(almSEXP); Rcpp::traits::input_parameter< int >::type nlp(nlpSEXP); Rcpp::traits::input_parameter< int >::type jerr(jerrSEXP); rcpp_result_gen = Rcpp::wrap(spelnet_exp(ka, parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr)); return rcpp_result_gen; END_RCPP } // lognet_exp List lognet_exp(double parm, Eigen::MatrixXd x, Eigen::MatrixXd y, Eigen::MatrixXd g, const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, int kopt, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, double nulldev, Eigen::Map dev, Eigen::Map alm, int nlp, int jerr); RcppExport SEXP _glmnet_lognet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP gSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP koptSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP nulldevSEXP, SEXP devSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type parm(parmSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type x(xSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type y(ySEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type g(gSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type jd(jdSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type vp(vpSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type cl(clSEXP); Rcpp::traits::input_parameter< int >::type ne(neSEXP); Rcpp::traits::input_parameter< int >::type nx(nxSEXP); Rcpp::traits::input_parameter< int >::type nlam(nlamSEXP); Rcpp::traits::input_parameter< double >::type flmin(flminSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type ulam(ulamSEXP); Rcpp::traits::input_parameter< double >::type thr(thrSEXP); Rcpp::traits::input_parameter< int >::type isd(isdSEXP); Rcpp::traits::input_parameter< int >::type intr(intrSEXP); Rcpp::traits::input_parameter< int >::type maxit(maxitSEXP); Rcpp::traits::input_parameter< int >::type kopt(koptSEXP); Rcpp::traits::input_parameter< SEXP >::type pb(pbSEXP); Rcpp::traits::input_parameter< int >::type lmu(lmuSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type a0(a0SEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ca(caSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ia(iaSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type nin(ninSEXP); Rcpp::traits::input_parameter< double >::type nulldev(nulldevSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type dev(devSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type alm(almSEXP); Rcpp::traits::input_parameter< int >::type nlp(nlpSEXP); Rcpp::traits::input_parameter< int >::type jerr(jerrSEXP); rcpp_result_gen = Rcpp::wrap(lognet_exp(parm, x, y, g, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, kopt, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr)); return rcpp_result_gen; END_RCPP } // splognet_exp List splognet_exp(double parm, const Eigen::Map> x, Eigen::MatrixXd y, Eigen::MatrixXd g, const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, int kopt, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, double nulldev, Eigen::Map dev, Eigen::Map alm, int nlp, int jerr); RcppExport SEXP _glmnet_splognet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP gSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP koptSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP nulldevSEXP, SEXP devSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type parm(parmSEXP); Rcpp::traits::input_parameter< const Eigen::Map> >::type x(xSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type y(ySEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type g(gSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type jd(jdSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type vp(vpSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type cl(clSEXP); Rcpp::traits::input_parameter< int >::type ne(neSEXP); Rcpp::traits::input_parameter< int >::type nx(nxSEXP); Rcpp::traits::input_parameter< int >::type nlam(nlamSEXP); Rcpp::traits::input_parameter< double >::type flmin(flminSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type ulam(ulamSEXP); Rcpp::traits::input_parameter< double >::type thr(thrSEXP); Rcpp::traits::input_parameter< int >::type isd(isdSEXP); Rcpp::traits::input_parameter< int >::type intr(intrSEXP); Rcpp::traits::input_parameter< int >::type maxit(maxitSEXP); Rcpp::traits::input_parameter< int >::type kopt(koptSEXP); Rcpp::traits::input_parameter< SEXP >::type pb(pbSEXP); Rcpp::traits::input_parameter< int >::type lmu(lmuSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type a0(a0SEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ca(caSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ia(iaSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type nin(ninSEXP); Rcpp::traits::input_parameter< double >::type nulldev(nulldevSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type dev(devSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type alm(almSEXP); Rcpp::traits::input_parameter< int >::type nlp(nlpSEXP); Rcpp::traits::input_parameter< int >::type jerr(jerrSEXP); rcpp_result_gen = Rcpp::wrap(splognet_exp(parm, x, y, g, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, kopt, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr)); return rcpp_result_gen; END_RCPP } // fishnet_exp List fishnet_exp(double parm, Eigen::MatrixXd x, Eigen::VectorXd y, Eigen::VectorXd g, const Eigen::Map w, const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, double nulldev, Eigen::Map dev, Eigen::Map alm, int nlp, int jerr); RcppExport SEXP _glmnet_fishnet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP gSEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP nulldevSEXP, SEXP devSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type parm(parmSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type x(xSEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type y(ySEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type g(gSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type w(wSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type jd(jdSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type vp(vpSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type cl(clSEXP); Rcpp::traits::input_parameter< int >::type ne(neSEXP); Rcpp::traits::input_parameter< int >::type nx(nxSEXP); Rcpp::traits::input_parameter< int >::type nlam(nlamSEXP); Rcpp::traits::input_parameter< double >::type flmin(flminSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type ulam(ulamSEXP); Rcpp::traits::input_parameter< double >::type thr(thrSEXP); Rcpp::traits::input_parameter< int >::type isd(isdSEXP); Rcpp::traits::input_parameter< int >::type intr(intrSEXP); Rcpp::traits::input_parameter< int >::type maxit(maxitSEXP); Rcpp::traits::input_parameter< SEXP >::type pb(pbSEXP); Rcpp::traits::input_parameter< int >::type lmu(lmuSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type a0(a0SEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ca(caSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ia(iaSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type nin(ninSEXP); Rcpp::traits::input_parameter< double >::type nulldev(nulldevSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type dev(devSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type alm(almSEXP); Rcpp::traits::input_parameter< int >::type nlp(nlpSEXP); Rcpp::traits::input_parameter< int >::type jerr(jerrSEXP); rcpp_result_gen = Rcpp::wrap(fishnet_exp(parm, x, y, g, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr)); return rcpp_result_gen; END_RCPP } // spfishnet_exp List spfishnet_exp(double parm, const Eigen::Map> x, Eigen::VectorXd y, Eigen::VectorXd g, const Eigen::Map w, const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, double nulldev, Eigen::Map dev, Eigen::Map alm, int nlp, int jerr); RcppExport SEXP _glmnet_spfishnet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP gSEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP nulldevSEXP, SEXP devSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type parm(parmSEXP); Rcpp::traits::input_parameter< const Eigen::Map> >::type x(xSEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type y(ySEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type g(gSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type w(wSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type jd(jdSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type vp(vpSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type cl(clSEXP); Rcpp::traits::input_parameter< int >::type ne(neSEXP); Rcpp::traits::input_parameter< int >::type nx(nxSEXP); Rcpp::traits::input_parameter< int >::type nlam(nlamSEXP); Rcpp::traits::input_parameter< double >::type flmin(flminSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type ulam(ulamSEXP); Rcpp::traits::input_parameter< double >::type thr(thrSEXP); Rcpp::traits::input_parameter< int >::type isd(isdSEXP); Rcpp::traits::input_parameter< int >::type intr(intrSEXP); Rcpp::traits::input_parameter< int >::type maxit(maxitSEXP); Rcpp::traits::input_parameter< SEXP >::type pb(pbSEXP); Rcpp::traits::input_parameter< int >::type lmu(lmuSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type a0(a0SEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ca(caSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ia(iaSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type nin(ninSEXP); Rcpp::traits::input_parameter< double >::type nulldev(nulldevSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type dev(devSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type alm(almSEXP); Rcpp::traits::input_parameter< int >::type nlp(nlpSEXP); Rcpp::traits::input_parameter< int >::type jerr(jerrSEXP); rcpp_result_gen = Rcpp::wrap(spfishnet_exp(parm, x, y, g, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, pb, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr)); return rcpp_result_gen; END_RCPP } // multelnet_exp List multelnet_exp(double parm, Eigen::MatrixXd x, Eigen::MatrixXd y, Eigen::VectorXd w, const Eigen::Map jd, const Eigen::Map vp, const Eigen::Map cl, int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int jsd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, Eigen::Map rsq, Eigen::Map alm, int nlp, int jerr); RcppExport SEXP _glmnet_multelnet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP jsdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP rsqSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type parm(parmSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type x(xSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type y(ySEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type w(wSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type jd(jdSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type vp(vpSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type cl(clSEXP); Rcpp::traits::input_parameter< int >::type ne(neSEXP); Rcpp::traits::input_parameter< int >::type nx(nxSEXP); Rcpp::traits::input_parameter< int >::type nlam(nlamSEXP); Rcpp::traits::input_parameter< double >::type flmin(flminSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type ulam(ulamSEXP); Rcpp::traits::input_parameter< double >::type thr(thrSEXP); Rcpp::traits::input_parameter< int >::type isd(isdSEXP); Rcpp::traits::input_parameter< int >::type jsd(jsdSEXP); Rcpp::traits::input_parameter< int >::type intr(intrSEXP); Rcpp::traits::input_parameter< int >::type maxit(maxitSEXP); Rcpp::traits::input_parameter< SEXP >::type pb(pbSEXP); Rcpp::traits::input_parameter< int >::type lmu(lmuSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type a0(a0SEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ca(caSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ia(iaSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type nin(ninSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type rsq(rsqSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type alm(almSEXP); Rcpp::traits::input_parameter< int >::type nlp(nlpSEXP); Rcpp::traits::input_parameter< int >::type jerr(jerrSEXP); rcpp_result_gen = Rcpp::wrap(multelnet_exp(parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, jsd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr)); return rcpp_result_gen; END_RCPP } // multspelnet_exp List multspelnet_exp(double parm, const Eigen::Map > x, Eigen::MatrixXd y, Eigen::VectorXd w, const Eigen::Map jd, const Eigen::Map vp, const Eigen::Map cl, int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int jsd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, Eigen::Map rsq, Eigen::Map alm, int nlp, int jerr); RcppExport SEXP _glmnet_multspelnet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP jsdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP rsqSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type parm(parmSEXP); Rcpp::traits::input_parameter< const Eigen::Map > >::type x(xSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type y(ySEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type w(wSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type jd(jdSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type vp(vpSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type cl(clSEXP); Rcpp::traits::input_parameter< int >::type ne(neSEXP); Rcpp::traits::input_parameter< int >::type nx(nxSEXP); Rcpp::traits::input_parameter< int >::type nlam(nlamSEXP); Rcpp::traits::input_parameter< double >::type flmin(flminSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type ulam(ulamSEXP); Rcpp::traits::input_parameter< double >::type thr(thrSEXP); Rcpp::traits::input_parameter< int >::type isd(isdSEXP); Rcpp::traits::input_parameter< int >::type jsd(jsdSEXP); Rcpp::traits::input_parameter< int >::type intr(intrSEXP); Rcpp::traits::input_parameter< int >::type maxit(maxitSEXP); Rcpp::traits::input_parameter< SEXP >::type pb(pbSEXP); Rcpp::traits::input_parameter< int >::type lmu(lmuSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type a0(a0SEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ca(caSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ia(iaSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type nin(ninSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type rsq(rsqSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type alm(almSEXP); Rcpp::traits::input_parameter< int >::type nlp(nlpSEXP); Rcpp::traits::input_parameter< int >::type jerr(jerrSEXP); rcpp_result_gen = Rcpp::wrap(multspelnet_exp(parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, jsd, intr, maxit, pb, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr)); return rcpp_result_gen; END_RCPP } // get_int_parms List get_int_parms(double& fdev, double& eps, double& big, int& mnlam, double& devmax, double& pmin, double& exmx, int& itrace); RcppExport SEXP _glmnet_get_int_parms(SEXP fdevSEXP, SEXP epsSEXP, SEXP bigSEXP, SEXP mnlamSEXP, SEXP devmaxSEXP, SEXP pminSEXP, SEXP exmxSEXP, SEXP itraceSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double& >::type fdev(fdevSEXP); Rcpp::traits::input_parameter< double& >::type eps(epsSEXP); Rcpp::traits::input_parameter< double& >::type big(bigSEXP); Rcpp::traits::input_parameter< int& >::type mnlam(mnlamSEXP); Rcpp::traits::input_parameter< double& >::type devmax(devmaxSEXP); Rcpp::traits::input_parameter< double& >::type pmin(pminSEXP); Rcpp::traits::input_parameter< double& >::type exmx(exmxSEXP); Rcpp::traits::input_parameter< int& >::type itrace(itraceSEXP); rcpp_result_gen = Rcpp::wrap(get_int_parms(fdev, eps, big, mnlam, devmax, pmin, exmx, itrace)); return rcpp_result_gen; END_RCPP } // get_int_parms2 List get_int_parms2(double& epsnr, int& mxitnr); RcppExport SEXP _glmnet_get_int_parms2(SEXP epsnrSEXP, SEXP mxitnrSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double& >::type epsnr(epsnrSEXP); Rcpp::traits::input_parameter< int& >::type mxitnr(mxitnrSEXP); rcpp_result_gen = Rcpp::wrap(get_int_parms2(epsnr, mxitnr)); return rcpp_result_gen; END_RCPP } // chg_fract_dev void chg_fract_dev(double arg); RcppExport SEXP _glmnet_chg_fract_dev(SEXP argSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type arg(argSEXP); chg_fract_dev(arg); return R_NilValue; END_RCPP } // chg_dev_max void chg_dev_max(double arg); RcppExport SEXP _glmnet_chg_dev_max(SEXP argSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type arg(argSEXP); chg_dev_max(arg); return R_NilValue; END_RCPP } // chg_min_flmin void chg_min_flmin(double arg); RcppExport SEXP _glmnet_chg_min_flmin(SEXP argSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type arg(argSEXP); chg_min_flmin(arg); return R_NilValue; END_RCPP } // chg_big void chg_big(double arg); RcppExport SEXP _glmnet_chg_big(SEXP argSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type arg(argSEXP); chg_big(arg); return R_NilValue; END_RCPP } // chg_min_lambdas void chg_min_lambdas(int irg); RcppExport SEXP _glmnet_chg_min_lambdas(SEXP irgSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< int >::type irg(irgSEXP); chg_min_lambdas(irg); return R_NilValue; END_RCPP } // chg_min_null_prob void chg_min_null_prob(double arg); RcppExport SEXP _glmnet_chg_min_null_prob(SEXP argSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type arg(argSEXP); chg_min_null_prob(arg); return R_NilValue; END_RCPP } // chg_max_exp void chg_max_exp(double arg); RcppExport SEXP _glmnet_chg_max_exp(SEXP argSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type arg(argSEXP); chg_max_exp(arg); return R_NilValue; END_RCPP } // chg_itrace void chg_itrace(int irg); RcppExport SEXP _glmnet_chg_itrace(SEXP irgSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< int >::type irg(irgSEXP); chg_itrace(irg); return R_NilValue; END_RCPP } // chg_bnorm void chg_bnorm(double arg, int irg); RcppExport SEXP _glmnet_chg_bnorm(SEXP argSEXP, SEXP irgSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type arg(argSEXP); Rcpp::traits::input_parameter< int >::type irg(irgSEXP); chg_bnorm(arg, irg); return R_NilValue; END_RCPP } // get_bnorm List get_bnorm(double& prec, int& mxit); RcppExport SEXP _glmnet_get_bnorm(SEXP precSEXP, SEXP mxitSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double& >::type prec(precSEXP); Rcpp::traits::input_parameter< int& >::type mxit(mxitSEXP); rcpp_result_gen = Rcpp::wrap(get_bnorm(prec, mxit)); return rcpp_result_gen; END_RCPP } // chg_epsnr void chg_epsnr(double arg); RcppExport SEXP _glmnet_chg_epsnr(SEXP argSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type arg(argSEXP); chg_epsnr(arg); return R_NilValue; END_RCPP } // chg_mxitnr void chg_mxitnr(int irg); RcppExport SEXP _glmnet_chg_mxitnr(SEXP irgSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< int >::type irg(irgSEXP); chg_mxitnr(irg); return R_NilValue; END_RCPP } // wls_exp List wls_exp(double alm0, double almc, double alpha, int m, int no, int ni, const Eigen::Map x, Eigen::Map r, Eigen::Map xv, const Eigen::Map v, int intr, const Eigen::Map ju, const Eigen::Map vp, const Eigen::Map cl, int nx, double thr, int maxit, Eigen::Map a, double aint, Eigen::Map g, Eigen::Map ia, Eigen::Map iy, int iz, Eigen::Map mm, int nino, double rsqc, int nlp, int jerr); RcppExport SEXP _glmnet_wls_exp(SEXP alm0SEXP, SEXP almcSEXP, SEXP alphaSEXP, SEXP mSEXP, SEXP noSEXP, SEXP niSEXP, SEXP xSEXP, SEXP rSEXP, SEXP xvSEXP, SEXP vSEXP, SEXP intrSEXP, SEXP juSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP nxSEXP, SEXP thrSEXP, SEXP maxitSEXP, SEXP aSEXP, SEXP aintSEXP, SEXP gSEXP, SEXP iaSEXP, SEXP iySEXP, SEXP izSEXP, SEXP mmSEXP, SEXP ninoSEXP, SEXP rsqcSEXP, SEXP nlpSEXP, SEXP jerrSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type alm0(alm0SEXP); Rcpp::traits::input_parameter< double >::type almc(almcSEXP); Rcpp::traits::input_parameter< double >::type alpha(alphaSEXP); Rcpp::traits::input_parameter< int >::type m(mSEXP); Rcpp::traits::input_parameter< int >::type no(noSEXP); Rcpp::traits::input_parameter< int >::type ni(niSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type x(xSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type r(rSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type xv(xvSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type v(vSEXP); Rcpp::traits::input_parameter< int >::type intr(intrSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type ju(juSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type vp(vpSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type cl(clSEXP); Rcpp::traits::input_parameter< int >::type nx(nxSEXP); Rcpp::traits::input_parameter< double >::type thr(thrSEXP); Rcpp::traits::input_parameter< int >::type maxit(maxitSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type a(aSEXP); Rcpp::traits::input_parameter< double >::type aint(aintSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type g(gSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ia(iaSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type iy(iySEXP); Rcpp::traits::input_parameter< int >::type iz(izSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type mm(mmSEXP); Rcpp::traits::input_parameter< int >::type nino(ninoSEXP); Rcpp::traits::input_parameter< double >::type rsqc(rsqcSEXP); Rcpp::traits::input_parameter< int >::type nlp(nlpSEXP); Rcpp::traits::input_parameter< int >::type jerr(jerrSEXP); rcpp_result_gen = Rcpp::wrap(wls_exp(alm0, almc, alpha, m, no, ni, x, r, xv, v, intr, ju, vp, cl, nx, thr, maxit, a, aint, g, ia, iy, iz, mm, nino, rsqc, nlp, jerr)); return rcpp_result_gen; END_RCPP } // spwls_exp List spwls_exp(double alm0, double almc, double alpha, int m, int no, int ni, const Eigen::Map> x, const Eigen::Map xm, const Eigen::Map xs, Eigen::Map r, Eigen::Map xv, const Eigen::Map v, int intr, const Eigen::Map ju, const Eigen::Map vp, const Eigen::Map cl, int nx, double thr, int maxit, Eigen::Map a, double aint, Eigen::Map g, Eigen::Map ia, Eigen::Map iy, int iz, Eigen::Map mm, int nino, double rsqc, int nlp, int jerr); RcppExport SEXP _glmnet_spwls_exp(SEXP alm0SEXP, SEXP almcSEXP, SEXP alphaSEXP, SEXP mSEXP, SEXP noSEXP, SEXP niSEXP, SEXP xSEXP, SEXP xmSEXP, SEXP xsSEXP, SEXP rSEXP, SEXP xvSEXP, SEXP vSEXP, SEXP intrSEXP, SEXP juSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP nxSEXP, SEXP thrSEXP, SEXP maxitSEXP, SEXP aSEXP, SEXP aintSEXP, SEXP gSEXP, SEXP iaSEXP, SEXP iySEXP, SEXP izSEXP, SEXP mmSEXP, SEXP ninoSEXP, SEXP rsqcSEXP, SEXP nlpSEXP, SEXP jerrSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type alm0(alm0SEXP); Rcpp::traits::input_parameter< double >::type almc(almcSEXP); Rcpp::traits::input_parameter< double >::type alpha(alphaSEXP); Rcpp::traits::input_parameter< int >::type m(mSEXP); Rcpp::traits::input_parameter< int >::type no(noSEXP); Rcpp::traits::input_parameter< int >::type ni(niSEXP); Rcpp::traits::input_parameter< const Eigen::Map> >::type x(xSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type xm(xmSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type xs(xsSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type r(rSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type xv(xvSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type v(vSEXP); Rcpp::traits::input_parameter< int >::type intr(intrSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type ju(juSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type vp(vpSEXP); Rcpp::traits::input_parameter< const Eigen::Map >::type cl(clSEXP); Rcpp::traits::input_parameter< int >::type nx(nxSEXP); Rcpp::traits::input_parameter< double >::type thr(thrSEXP); Rcpp::traits::input_parameter< int >::type maxit(maxitSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type a(aSEXP); Rcpp::traits::input_parameter< double >::type aint(aintSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type g(gSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type ia(iaSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type iy(iySEXP); Rcpp::traits::input_parameter< int >::type iz(izSEXP); Rcpp::traits::input_parameter< Eigen::Map >::type mm(mmSEXP); Rcpp::traits::input_parameter< int >::type nino(ninoSEXP); Rcpp::traits::input_parameter< double >::type rsqc(rsqcSEXP); Rcpp::traits::input_parameter< int >::type nlp(nlpSEXP); Rcpp::traits::input_parameter< int >::type jerr(jerrSEXP); rcpp_result_gen = Rcpp::wrap(spwls_exp(alm0, almc, alpha, m, no, ni, x, xm, xs, r, xv, v, intr, ju, vp, cl, nx, thr, maxit, a, aint, g, ia, iy, iz, mm, nino, rsqc, nlp, jerr)); return rcpp_result_gen; END_RCPP } glmnet/src/glmnet_init.cpp0000644000176200001440000002061515012065446015353 0ustar liggesusers// Automatically generated, editing not advised. #ifndef R_GLMNET_H #define R_GLMNET_H #include #include #include #ifdef ENABLE_NLS #if defined(__has_include) #if __has_include() #define HAVE_LIBINTL_H #endif #endif #ifdef HAVE_LIBINTL_H #include #define _(String) dgettext ("glmnet", String) #else #define _(String) (String) #endif #endif extern "C" { SEXP _glmnet_elnet_exp(SEXP kaSEXP, SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP rsqSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP); SEXP _glmnet_spelnet_exp(SEXP kaSEXP, SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP rsqSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP); SEXP _glmnet_lognet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP gSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP koptSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP nulldevSEXP, SEXP devSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP); SEXP _glmnet_splognet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP gSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP koptSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP nulldevSEXP, SEXP devSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP); SEXP _glmnet_fishnet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP gSEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP nulldevSEXP, SEXP devSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP); SEXP _glmnet_spfishnet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP gSEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP nulldevSEXP, SEXP devSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP); SEXP _glmnet_multelnet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP jsdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP rsqSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP); SEXP _glmnet_multspelnet_exp(SEXP parmSEXP, SEXP xSEXP, SEXP ySEXP, SEXP wSEXP, SEXP jdSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP neSEXP, SEXP nxSEXP, SEXP nlamSEXP, SEXP flminSEXP, SEXP ulamSEXP, SEXP thrSEXP, SEXP isdSEXP, SEXP jsdSEXP, SEXP intrSEXP, SEXP maxitSEXP, SEXP pbSEXP, SEXP lmuSEXP, SEXP a0SEXP, SEXP caSEXP, SEXP iaSEXP, SEXP ninSEXP, SEXP rsqSEXP, SEXP almSEXP, SEXP nlpSEXP, SEXP jerrSEXP); SEXP _glmnet_get_int_parms(SEXP smlSEXP, SEXP epsSEXP, SEXP bigSEXP, SEXP mnlamSEXP, SEXP rsqmaxSEXP, SEXP pminSEXP, SEXP exmxSEXP, SEXP itraceSEXP); SEXP _glmnet_get_int_parms2(SEXP epsnrSEXP, SEXP mxitnrSEXP); SEXP _glmnet_chg_fract_dev(SEXP argSEXP); SEXP _glmnet_chg_dev_max(SEXP argSEXP); SEXP _glmnet_chg_min_flmin(SEXP argSEXP); SEXP _glmnet_chg_big(SEXP argSEXP); SEXP _glmnet_chg_min_lambdas(SEXP irgSEXP); SEXP _glmnet_chg_min_null_prob(SEXP argSEXP); SEXP _glmnet_chg_max_exp(SEXP argSEXP); SEXP _glmnet_chg_itrace(SEXP irgSEXP); SEXP _glmnet_chg_bnorm(SEXP argSEXP, SEXP irgSEXP); SEXP _glmnet_get_bnorm(SEXP argSEXP, SEXP irgSEXP); SEXP _glmnet_chg_epsnr(SEXP argSEXP); SEXP _glmnet_chg_mxitnr(SEXP irgSEXP); SEXP _glmnet_wls_exp(SEXP alm0SEXP, SEXP almcSEXP, SEXP alphaSEXP, SEXP mSEXP, SEXP noSEXP, SEXP niSEXP, SEXP xSEXP, SEXP rSEXP, SEXP xvSEXP, SEXP vSEXP, SEXP intrSEXP, SEXP juSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP nxSEXP, SEXP thrSEXP, SEXP maxitSEXP, SEXP aSEXP, SEXP aintSEXP, SEXP gSEXP, SEXP iaSEXP, SEXP iySEXP, SEXP izSEXP, SEXP mmSEXP, SEXP ninoSEXP, SEXP rsqcSEXP, SEXP nlpSEXP, SEXP jerrSEXP); SEXP _glmnet_spwls_exp(SEXP alm0SEXP, SEXP almcSEXP, SEXP alphaSEXP, SEXP mSEXP, SEXP noSEXP, SEXP niSEXP, SEXP xSEXP, SEXP xmSEXP, SEXP xsSEXP, SEXP rSEXP, SEXP xvSEXP, SEXP vSEXP, SEXP intrSEXP, SEXP juSEXP, SEXP vpSEXP, SEXP clSEXP, SEXP nxSEXP, SEXP thrSEXP, SEXP maxitSEXP, SEXP aSEXP, SEXP aintSEXP, SEXP gSEXP, SEXP iaSEXP, SEXP iySEXP, SEXP izSEXP, SEXP mmSEXP, SEXP ninoSEXP, SEXP rsqcSEXP, SEXP nlpSEXP, SEXP jerrSEXP); SEXP storePB(SEXP); void F77_SUB(coxnet)( double *parm, int *no, int *ni, double *x, double *y, double *d, double *o, double *w, int *jd, double *vp, double *cl, int *ne, int *nx, int *nlam, double *flmin, double *ulam, double *thr, int *maxit, int *isd, int *lmu, double *ca, int *ia, int *nin, double *dev0, double *fdev, double *alm, int *nlp, int *jerrc ); void F77_SUB(loglike)( int *no, int *ni, double *x, double *y, double *d, double *g, double *w, int *nlam, double *a, double *flog, int *jerr ); } // end extern "C" static const R_CallMethodDef CallEntries[] = { {"_glmnet_elnet_exp", (DL_FUNC) &_glmnet_elnet_exp, 27}, {"_glmnet_spelnet_exp", (DL_FUNC) &_glmnet_spelnet_exp, 27}, {"_glmnet_lognet_exp", (DL_FUNC) &_glmnet_lognet_exp, 28}, {"_glmnet_splognet_exp", (DL_FUNC) &_glmnet_splognet_exp, 28}, {"_glmnet_fishnet_exp", (DL_FUNC) &_glmnet_fishnet_exp, 28}, {"_glmnet_spfishnet_exp", (DL_FUNC) &_glmnet_spfishnet_exp, 28}, {"_glmnet_multelnet_exp", (DL_FUNC) &_glmnet_multelnet_exp, 27}, {"_glmnet_multspelnet_exp", (DL_FUNC) &_glmnet_multspelnet_exp, 27}, {"_glmnet_get_int_parms", (DL_FUNC) &_glmnet_get_int_parms, 8}, {"_glmnet_get_int_parms2", (DL_FUNC) &_glmnet_get_int_parms2, 2}, {"_glmnet_chg_fract_dev", (DL_FUNC) &_glmnet_chg_fract_dev, 1}, {"_glmnet_chg_dev_max", (DL_FUNC) &_glmnet_chg_dev_max, 1}, {"_glmnet_chg_min_flmin", (DL_FUNC) &_glmnet_chg_min_flmin, 1}, {"_glmnet_chg_big", (DL_FUNC) &_glmnet_chg_big, 1}, {"_glmnet_chg_min_lambdas", (DL_FUNC) &_glmnet_chg_min_lambdas, 1}, {"_glmnet_chg_min_null_prob", (DL_FUNC) &_glmnet_chg_min_null_prob, 1}, {"_glmnet_chg_max_exp", (DL_FUNC) &_glmnet_chg_max_exp, 1}, {"_glmnet_chg_itrace", (DL_FUNC) &_glmnet_chg_itrace, 1}, {"_glmnet_chg_bnorm", (DL_FUNC) &_glmnet_chg_bnorm, 2}, {"_glmnet_get_bnorm", (DL_FUNC) &_glmnet_get_bnorm, 2}, {"_glmnet_chg_epsnr", (DL_FUNC) &_glmnet_chg_epsnr, 1}, {"_glmnet_chg_mxitnr", (DL_FUNC) &_glmnet_chg_mxitnr, 1}, {"_glmnet_wls_exp", (DL_FUNC) &_glmnet_wls_exp, 28}, {"_glmnet_spwls_exp", (DL_FUNC) &_glmnet_spwls_exp, 30}, {"storePB", (DL_FUNC) &storePB, 1}, {NULL, NULL, 0} }; #define FDEF(name) {#name, (DL_FUNC) &F77_SUB(name), sizeof(name ## _t)/sizeof(name ## _t[0]), name ##_t} static R_NativePrimitiveArgType coxnet_t[] = { REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP }; static R_NativePrimitiveArgType loglike_t[] = { INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP }; static R_FortranMethodDef fMethods[] = { FDEF(coxnet) , FDEF(loglike) , {NULL, NULL, 0} }; void R_init_glmnet(DllInfo *dll){ R_registerRoutines(dll, NULL, CallEntries, fMethods, NULL); R_useDynamicSymbols(dll, FALSE); } #endif glmnet/src/pb_exp.cpp0000644000176200001440000000055314140040573014311 0ustar liggesusers#include using namespace Rcpp; // This is the new C++ way of simplifying the progress bar. // We directly call the setTxtProgressBar function with the given value. void setpb_cpp(SEXP pb, int val) { Environment utils = Environment::namespace_env("utils"); Function f = utils["setTxtProgressBar"]; f(Named("pb", pb), Named("value", val)); } glmnet/src/elnet_exp.cpp0000644000176200001440000003067514171551160015032 0ustar liggesusers#include #include #include #include #include #include "driver.h" #include "internal.h" using namespace Rcpp; using namespace glmnetpp; void setpb_cpp(SEXP, int); // Gaussian for dense X. // [[Rcpp::export]] List elnet_exp( int ka, double parm, Eigen::MatrixXd x, // TODO: map? Eigen::VectorXd y, // TODO: map? Eigen::VectorXd w, // TODO: figure out if we should allow updating (safe choice is to copy) const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, // TODO: map? int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, Eigen::Map rsq, Eigen::Map alm, int nlp, int jerr ) { using elnet_driver_t = ElnetDriver; elnet_driver_t driver; auto f = [&]() { driver.fit( ka == 2, parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd == 1, intr == 1, maxit, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr, [&](int v) {setpb_cpp(pb, v);}, ::InternalParams()); }; run(f, jerr); return List::create( Named("a0")=a0, Named("nin")=nin, Named("alm")=alm, Named("ca")=ca, Named("ia")=ia, Named("lmu")=lmu, Named("rsq")=rsq, Named("nlp")=nlp, Named("jerr")=jerr); } // Gaussian for sparse X. // [[Rcpp::export]] List spelnet_exp( int ka, double parm, const Eigen::Map > x, Eigen::VectorXd y, // TODO: map? Eigen::VectorXd w, // TODO: map? const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, // TODO: map? int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, Eigen::Map rsq, Eigen::Map alm, int nlp, int jerr ) { using elnet_driver_t = ElnetDriver; elnet_driver_t driver; auto f = [&]() { driver.fit( ka == 2, parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd == 1, intr == 1, maxit, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr, [&](int v) {setpb_cpp(pb, v);}, ::InternalParams()); }; run(f, jerr); return List::create( Named("a0")=a0, Named("nin")=nin, Named("alm")=alm, Named("ca")=ca, Named("ia")=ia, Named("lmu")=lmu, Named("rsq")=rsq, Named("nlp")=nlp, Named("jerr")=jerr); } // Binomial/Multinomial for dense X. // [[Rcpp::export]] List lognet_exp( double parm, Eigen::MatrixXd x, // TODO: map? Eigen::MatrixXd y, // TODO: map? Eigen::MatrixXd g, // TODO: map? const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, // TODO: map? int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, int kopt, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, double nulldev, Eigen::Map dev, Eigen::Map alm, int nlp, int jerr ) { using elnet_driver_t = ElnetDriver; elnet_driver_t driver; auto f = [&]() { driver.fit( parm, x, y, g, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, kopt, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr, [&](int v) {setpb_cpp(pb, v);}, ::InternalParams()); }; run(f, jerr); return List::create( Named("a0")=a0, Named("nin")=nin, Named("alm")=alm, Named("ca")=ca, Named("ia")=ia, Named("lmu")=lmu, Named("nulldev")=nulldev, Named("dev")=dev, Named("nlp")=nlp, Named("jerr")=jerr); } // Lognet for sparse X. // [[Rcpp::export]] List splognet_exp( double parm, const Eigen::Map> x, Eigen::MatrixXd y, // TODO: map? Eigen::MatrixXd g, // TODO: map? const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, // TODO: map? int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, int kopt, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, double nulldev, Eigen::Map dev, Eigen::Map alm, int nlp, int jerr ) { using elnet_driver_t = ElnetDriver; elnet_driver_t driver; auto f = [&]() { driver.fit( parm, x, y, g, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, kopt, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr, [&](int v) {setpb_cpp(pb, v);}, ::InternalParams()); }; run(f, jerr); return List::create( Named("a0")=Eigen::MatrixXd(a0), Named("nin")=Eigen::VectorXi(nin), Named("alm")=Eigen::VectorXd(alm), Named("ca")=Eigen::VectorXd(ca), Named("ia")=Eigen::VectorXi(ia), Named("lmu")=lmu, Named("nulldev")=nulldev, Named("dev")=Eigen::VectorXd(dev), Named("nlp")=nlp, Named("jerr")=jerr); } // Poisson for dense X. // [[Rcpp::export]] List fishnet_exp( double parm, Eigen::MatrixXd x, // TODO: map? Eigen::VectorXd y, // TODO: map? Eigen::VectorXd g, // TODO: map? const Eigen::Map w, const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, // TODO: map? int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, double nulldev, Eigen::Map dev, Eigen::Map alm, int nlp, int jerr ) { using elnet_driver_t = ElnetDriver; elnet_driver_t driver; auto f = [&]() { driver.fit( parm, x, y, g, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr, [&](int v) {setpb_cpp(pb, v);}, ::InternalParams()); }; run(f, jerr); return List::create( Named("a0")=a0, Named("nin")=nin, Named("alm")=alm, Named("ca")=ca, Named("ia")=ia, Named("lmu")=lmu, Named("nulldev")=nulldev, Named("dev")=dev, Named("nlp")=nlp, Named("jerr")=jerr); } // Poisson for sparse X. // [[Rcpp::export]] List spfishnet_exp( double parm, const Eigen::Map> x, Eigen::VectorXd y, // TODO: map? Eigen::VectorXd g, // TODO: map? const Eigen::Map w, const Eigen::Map jd, const Eigen::Map vp, Eigen::MatrixXd cl, // TODO: map? int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, double nulldev, Eigen::Map dev, Eigen::Map alm, int nlp, int jerr ) { using elnet_driver_t = ElnetDriver; elnet_driver_t driver; auto f = [&]() { driver.fit( parm, x, y, g, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, intr, maxit, lmu, a0, ca, ia, nin, nulldev, dev, alm, nlp, jerr, [&](int v) {setpb_cpp(pb, v);}, ::InternalParams()); }; run(f, jerr); return List::create( Named("a0")=a0, Named("nin")=nin, Named("alm")=alm, Named("ca")=ca, Named("ia")=ia, Named("lmu")=lmu, Named("nulldev")=nulldev, Named("dev")=dev, Named("nlp")=nlp, Named("jerr")=jerr); } // Multi-response Gaussian for dense X. // [[Rcpp::export]] List multelnet_exp( double parm, Eigen::MatrixXd x, // TODO: map? Eigen::MatrixXd y, // TODO: map? Eigen::VectorXd w, // TODO: map? const Eigen::Map jd, const Eigen::Map vp, const Eigen::Map cl, int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int jsd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, Eigen::Map rsq, Eigen::Map alm, int nlp, int jerr ) { using elnet_driver_t = ElnetDriver; elnet_driver_t driver; auto f = [&]() { driver.fit( parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, jsd, intr, maxit, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr, [&](int v) {setpb_cpp(pb, v);}, ::InternalParams()); }; run(f, jerr); return List::create( Named("a0")=a0, Named("nin")=nin, Named("alm")=alm, Named("ca")=ca, Named("ia")=ia, Named("lmu")=lmu, Named("rsq")=rsq, Named("nlp")=nlp, Named("jerr")=jerr); } // Multi-response Gaussian for sparse X. // [[Rcpp::export]] List multspelnet_exp( double parm, const Eigen::Map > x, Eigen::MatrixXd y, // TODO: map? Eigen::VectorXd w, // TODO: map? const Eigen::Map jd, const Eigen::Map vp, const Eigen::Map cl, int ne, int nx, int nlam, double flmin, const Eigen::Map ulam, double thr, int isd, int jsd, int intr, int maxit, SEXP pb, int lmu, Eigen::Map a0, Eigen::Map ca, Eigen::Map ia, Eigen::Map nin, Eigen::Map rsq, Eigen::Map alm, int nlp, int jerr ) { using elnet_driver_t = ElnetDriver; elnet_driver_t driver; auto f = [&]() { driver.fit( parm, x, y, w, jd, vp, cl, ne, nx, nlam, flmin, ulam, thr, isd, jsd, intr, maxit, lmu, a0, ca, ia, nin, rsq, alm, nlp, jerr, [&](int v) {setpb_cpp(pb, v);}, ::InternalParams()); }; run(f, jerr); return List::create( Named("a0")=a0, Named("nin")=nin, Named("alm")=alm, Named("ca")=ca, Named("ia")=ia, Named("lmu")=lmu, Named("rsq")=rsq, Named("nlp")=nlp, Named("jerr")=jerr); } glmnet/src/wls_exp.cpp0000644000176200001440000000765214171551160014527 0ustar liggesusers#include #include #include #include "driver.h" using namespace Rcpp; using namespace glmnetpp; // WLS for dense X. // [[Rcpp::export]] List wls_exp( double alm0, double almc, double alpha, int m, int no, int ni, const Eigen::Map x, Eigen::Map r, Eigen::Map xv, const Eigen::Map v, int intr, const Eigen::Map ju, const Eigen::Map vp, const Eigen::Map cl, int nx, double thr, int maxit, Eigen::Map a, double aint, Eigen::Map g, Eigen::Map ia, Eigen::Map iy, int iz, Eigen::Map mm, int nino, double rsqc, int nlp, int jerr ) { using internal_t = ElnetPointInternal< util::glm_type::gaussian, util::mode_type::wls, double, int, int>; using elnet_point_t = ElnetPoint< util::glm_type::gaussian, util::mode_type::wls, internal_t>; auto f = [&]() { elnet_point_t elnet_point( alm0, almc, alpha, x, r, xv, v, intr, ju, vp, cl, nx, thr, maxit, a, aint, g, ia, iy, iz, mm, nino, rsqc, nlp); elnet_point.fit(m, jerr); }; run(f, jerr); return List::create( Named("almc")=almc, Named("r")=r, Named("xv")=xv, Named("ju")=ju, Named("vp")=vp, Named("cl")=cl, Named("nx")=nx, Named("a")=a, Named("aint")=aint, Named("g")=g, Named("ia")=ia, Named("iy")=iy, Named("iz")=iz, Named("mm")=mm, Named("nino")=nino, Named("rsqc")=rsqc, Named("nlp")=nlp, Named("jerr")=jerr); } // WLS for sparse X. // [[Rcpp::export]] List spwls_exp( double alm0, double almc, double alpha, int m, int no, int ni, const Eigen::Map> x, const Eigen::Map xm, const Eigen::Map xs, Eigen::Map r, Eigen::Map xv, const Eigen::Map v, int intr, const Eigen::Map ju, const Eigen::Map vp, const Eigen::Map cl, int nx, double thr, int maxit, Eigen::Map a, double aint, Eigen::Map g, Eigen::Map ia, Eigen::Map iy, int iz, Eigen::Map mm, int nino, double rsqc, int nlp, int jerr ) { using internal_t = SpElnetPointInternal< util::glm_type::gaussian, util::mode_type::wls, double, int, int>; using elnet_point_t = SpElnetPoint< util::glm_type::gaussian, util::mode_type::wls, internal_t>; auto f = [&]() { elnet_point_t elnet_point( alm0, almc, alpha, x, r, xm, xs, xv, v, intr, ju, vp, cl, nx, thr, maxit, a, aint, g, ia, iy, iz, mm, nino, rsqc, nlp); elnet_point.fit(m, jerr); }; run(f, jerr); return List::create( Named("almc")=almc, Named("r")=r, Named("xv")=xv, Named("ju")=ju, Named("vp")=vp, Named("cl")=cl, Named("nx")=nx, Named("a")=a, Named("aint")=aint, Named("g")=g, Named("ia")=ia, Named("iy")=iy, Named("iz")=iz, Named("mm")=mm, Named("nino")=nino, Named("rsqc")=rsqc, Named("nlp")=nlp, Named("jerr")=jerr); } glmnet/src/Makevars0000644000176200001440000000017314406704451014031 0ustar liggesusersCXX_STD = CXX17 PKG_CXXFLAGS=-Iglmnetpp/include -Iglmnetpp/src -Iglmnetpp/test -DEIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS glmnet/src/internal.cpp0000644000176200001440000000724414336776247014701 0ustar liggesusers#include "internal.h" #include #include #include // ORDER MATTERS #include #include extern "C" { void F77_SUB(chg_fract_dev)(double*); void F77_SUB(chg_dev_max)(double*); void F77_SUB(chg_min_flmin)(double*); void F77_SUB(chg_big)(double*); void F77_SUB(chg_min_lambdas)(int*); void F77_SUB(chg_min_null_prob)(double*); void F77_SUB(chg_max_exp)(double*); void F77_SUB(chg_itrace)(int*); void F77_SUB(chg_bnorm)(double*, int*); void F77_SUB(chg_epsnr)(double*); void F77_SUB(chg_mxitnr)(int*); } // end extern "C" double InternalParams::sml = 1e-5; double InternalParams::eps = 1e-6; double InternalParams::big = 9.9e35; int InternalParams::mnlam = 5; double InternalParams::rsqmax = 0.999; double InternalParams::pmin = 1e-9; double InternalParams::exmx = 250.0; int InternalParams::itrace = 0; double InternalParams::bnorm_thr = 1e-10; int InternalParams::bnorm_mxit = 100; double InternalParams::epsnr = 1e-6; int InternalParams::mxitnr = 25; using namespace Rcpp; // [[Rcpp::export]] List get_int_parms(double& fdev, double& eps, double& big, int& mnlam, double& devmax, double& pmin, double& exmx, int& itrace) { fdev = InternalParams::sml; eps = InternalParams::eps; big = InternalParams::big; mnlam = InternalParams::mnlam; devmax = InternalParams::rsqmax; pmin = InternalParams::pmin; exmx = InternalParams::exmx; itrace = InternalParams::itrace; return List::create( Named("fdev")=fdev, Named("eps")=eps, Named("big")=big, Named("mnlam")=mnlam, Named("devmax")=devmax, Named("pmin")=pmin, Named("exmx")=exmx, Named("itrace")=itrace); } // [[Rcpp::export]] List get_int_parms2(double& epsnr, int& mxitnr) { epsnr = InternalParams::epsnr; mxitnr = InternalParams::mxitnr; return List::create( Named("epsnr")=epsnr, Named("mxitnr")=mxitnr); } // [[Rcpp::export]] void chg_fract_dev(double arg) { /*TODO*/ F77_SUB(chg_fract_dev)(&arg); InternalParams::sml = arg; } // [[Rcpp::export]] void chg_dev_max(double arg) { /*TODO*/ F77_SUB(chg_dev_max)(&arg); InternalParams::rsqmax = arg; } // [[Rcpp::export]] void chg_min_flmin(double arg) { /*TODO*/ F77_SUB(chg_min_flmin)(&arg); InternalParams::eps = arg; } // [[Rcpp::export]] void chg_big(double arg) { /*TODO*/ F77_SUB(chg_big)(&arg); InternalParams::big = arg; } // [[Rcpp::export]] void chg_min_lambdas(int irg) { /*TODO*/ F77_SUB(chg_min_lambdas)(&irg); InternalParams::mnlam = irg; } // [[Rcpp::export]] void chg_min_null_prob(double arg) { /*TODO*/ F77_SUB(chg_min_null_prob)(&arg); InternalParams::pmin = arg; } // [[Rcpp::export]] void chg_max_exp(double arg) { /*TODO*/ F77_SUB(chg_max_exp)(&arg); InternalParams::exmx = arg; } // [[Rcpp::export]] void chg_itrace(int irg) { /*TODO*/ F77_SUB(chg_itrace)(&irg); InternalParams::itrace = irg; } // [[Rcpp::export]] void chg_bnorm(double arg, int irg) { /*TODO*/ F77_SUB(chg_bnorm)(&arg, &irg); InternalParams::bnorm_thr = arg; InternalParams::bnorm_mxit = irg; } // [[Rcpp::export]] List get_bnorm(double& prec, int& mxit) { prec = InternalParams::bnorm_thr; mxit = InternalParams::bnorm_mxit; return List::create( Named("prec")=prec, Named("mxit")=mxit); } // [[Rcpp::export]] void chg_epsnr(double arg) { /*TODO*/ F77_SUB(chg_epsnr)(&arg); InternalParams::epsnr = arg; } // [[Rcpp::export]] void chg_mxitnr(int irg) { /*TODO*/ F77_SUB(chg_mxitnr)(&irg); InternalParams::mxitnr = irg; } glmnet/src/driver.h0000644000176200001440000000054314171551160013776 0ustar liggesusers#ifndef DRIVER_H #define DRIVER_H #include #include template inline void run(F f, int& jerr) { try { f(); } catch (const std::bad_alloc&) { jerr = glmnetpp::util::bad_alloc_error().err_code(); } catch (const std::exception&) { jerr = 10001; } } #endif glmnet/src/pb.c0000644000176200001440000000134015012065446013075 0ustar liggesusers#include #include /* The progress bar */ static SEXP pb; /* Save the progress bar */ SEXP storePB(SEXP tpb) { pb = tpb; return(R_NilValue); } /* Set Progress bar to value */ void F77_SUB(setpb)(int *val) { SEXP s, t; /* printf("%d\n", *val); */ /* t = s = PROTECT(allocList(3)); */ /* SET_TYPEOF(s, LANGSXP); */ t = s = PROTECT(LCONS(R_NilValue, Rf_allocList(2))); SETCAR(t, install("setTxtProgressBar")); t = CDR(t); SETCAR(t, pb); SET_TAG(t, install("pb")); t = CDR(t); SETCAR(t, ScalarInteger(*val)); SET_TAG(t, install("value")); eval(s, R_GetCurrentEnv()); UNPROTECT(1); } /* /\* Nullify progress bar, not really used *\/ */ /* void nullifyPB() { */ /* pb = NULL; */ /* } */ glmnet/src/internal.h0000644000176200001440000000051514171551160014316 0ustar liggesusers#pragma once struct InternalParams { static double sml; static double eps; static double big; static int mnlam; static double rsqmax; static double pmin; static double exmx; static int itrace; static double bnorm_thr; static int bnorm_mxit; static double epsnr; static int mxitnr; }; glmnet/src/glmnetpp/0000755000176200001440000000000015035572362014165 5ustar liggesusersglmnet/src/glmnetpp/CMakeLists.txt0000644000176200001440000000777514171551160016736 0ustar liggesuserscmake_minimum_required(VERSION 3.7) project("glmnetpp" VERSION 4.2.0 DESCRIPTION "A C++ implementation of elastic net solver.") option(GLMNETPP_ENABLE_TEST "Enable unit tests to be built." ON) option(GLMNETPP_ENABLE_BENCHMARK "Enable benchmarks to be built." OFF) option(GLMNETPP_ENABLE_COVERAGE "Build glmnetpp with coverage" OFF) option(GLMNETPP_MOCK_LEGACY "Build glmnetpp with mock versions of the fortran." OFF) # Define a set of strict build flags set(GLMNETPP_STRICT_WARNINGS -g -Wall) if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(GLMNETPP_STRICT_WARNINGS ${GLMNETPP_STRICT_WARNINGS} -Wextra -Werror -pedantic) endif() # Stoopid hack on windows if (WIN32) SET(CMAKE_FIND_LIBRARY_PREFIXES "") SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll") endif() # Dependency on Eigen find_package(Eigen3 3.3 CONFIG REQUIRED NO_MODULE) message(STATUS "Eigen3 found at ${EIGEN3_INCLUDE_DIR}") # Set include dirs set(GLMNETPP_INCLUDEDIR "${${PROJECT_NAME}_SOURCE_DIR}/include") set(GLMNETPP_SOURCEDIR "${${PROJECT_NAME}_SOURCE_DIR}/src") # Add this library as shared library. add_library(${PROJECT_NAME} INTERFACE) target_include_directories(${PROJECT_NAME} SYSTEM INTERFACE $ $) # Set C++14 standard for project target target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_14) # Set install destinations install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}_Targets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # Create GlmnetppConfigVersion.cmake which contains current project version # This is supposed to help with (major) version compatibility. include(CMakePackageConfigHelpers) write_basic_package_version_file("${PROJECT_NAME}ConfigVersion.cmake" VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion) configure_package_config_file( "${PROJECT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/cmake) install(EXPORT ${PROJECT_NAME}_Targets FILE ${PROJECT_NAME}Targets.cmake NAMESPACE ${PROJECT_NAME}:: DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/cmake) install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/cmake) install(DIRECTORY ${PROJECT_SOURCE_DIR}/include DESTINATION ${CMAKE_INSTALL_PREFIX}) # Build source library if (GLMNETPP_ENABLE_TEST OR GLMNETPP_ENABLE_BENCHMARK) if (NOT GLMNETPP_MOCK_LEGACY) # MUST be called at the top-level CMakeLists.txt enable_language(Fortran) endif() endif() add_subdirectory(${PROJECT_SOURCE_DIR}/src) # Automate the choosing of config # if CMAKE_BUILD_TYPE not defined if (NOT CMAKE_BUILD_TYPE) # if binary directory ends with "release", use release mode if (${PROJECT_BINARY_DIR} MATCHES "release$") set(CMAKE_BUILD_TYPE RELEASE) # otherwise, use debug mode else() set(CMAKE_BUILD_TYPE DEBUG) endif() endif() message(STATUS "Compiling in ${CMAKE_BUILD_TYPE} mode") if (GLMNETPP_ENABLE_TEST) # This will perform memcheck include(CTest) enable_testing() # Find googletest find_package(GTest 1.11 CONFIG REQUIRED) # add test subdirectory add_subdirectory(${PROJECT_SOURCE_DIR}/test ${PROJECT_BINARY_DIR}/test) endif() if (GLMNETPP_ENABLE_BENCHMARK) find_package(benchmark REQUIRED HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../../benchmark/build) # add benchmark subdirectory add_subdirectory(${PROJECT_SOURCE_DIR}/benchmark ${PROJECT_BINARY_DIR}/benchmark) endif() glmnet/src/glmnetpp/generate_bazelrc0000755000176200001440000000464714341220705017410 0ustar liggesusers#!/usr/bin/env python3 import os import subprocess from sys import platform ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) OUT_PATH = os.path.join(ROOT_DIR, ".bazelrc") def run_cmd(cmd): try: output = subprocess.check_output( cmd.split(" "), stderr=subprocess.STDOUT ).decode() except subprocess.CalledProcessError as e: output = e.output.decode() raise RuntimeError(output) return output.rstrip() def main(): with open(OUT_PATH, "w") as f: # TODO: add ubsan + msan builds also f.write( """ build --cxxopt="-std=c++14" build --cxxopt="-Wall" build --cxxopt="-fopenmp" build --linkopt -fopenmp # ASAN build # TODO: add ubsan + msan builds also build:asan --strip=never build:asan --copt -fsanitize=address build:asan --copt -DADDRESS_SANITIZER build:asan --copt -O1 build:asan --copt -g build:asan --copt -fno-omit-frame-pointer build:asan --linkopt -fsanitize=address """ ) # Get R related paths r_include_path = run_cmd("Rscript -e cat(Sys.getenv('R_INCLUDE_DIR'))") r_lib_path = run_cmd("Rscript -e cat(Sys.getenv('R_HOME'))") r_lib_path = os.path.join(r_lib_path, 'lib') f.write( f""" build --action_env=R_INCLUDE_DIR={r_include_path} build --linkopt="-L{r_lib_path}" """ ) conda_prefix = os.environ["CONDA_PREFIX"] conda_bin = os.path.join(conda_prefix, "bin") conda_inc = os.path.join(conda_prefix, "include") conda_lib = os.path.join(conda_prefix, "lib") # MacOS if platform == "darwin": # get canonical omp path sdk_path = run_cmd("xcrun --sdk macosx --show-sdk-path") f.write( f""" # Use clang from conda-forge build --action_env=CC={conda_bin}/clang build --action_env=CXX={conda_bin}/clang++ build --action_env=BAZEL_CXXOPTS=-isystem{conda_inc} build --action_env=BAZEL_LINKOPTS=-L{conda_lib}:-Wl,-rpath,{conda_lib} build --action_env=SDKROOT={sdk_path} # Tell Bazel not to use the full Xcode toolchain on Mac OS build --repo_env=BAZEL_USE_CPP_ONLY_TOOLCHAIN=1""" ) else: # Linux f.write( f""" build --linkopt=-L{conda_lib} # Linux GCC build:gcc --action_env=CC=gcc build:gcc --action_env=CXX=g++ # Linux Clang (default) build --action_env=CC=clang build --action_env=CXX=clang++ """ ) if __name__ == "__main__": main() glmnet/src/glmnetpp/include/0000755000176200001440000000000014171551160015601 5ustar liggesusersglmnet/src/glmnetpp/include/glmnetpp_bits/0000755000176200001440000000000014171551160020450 5ustar liggesusersglmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/0000755000176200001440000000000015036100372022567 5ustar liggesusersglmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_gaussian_naive.hpp0000644000176200001440000001320014157246224027004 0ustar liggesusers#pragma once #include #include namespace glmnetpp { /* * Sparse Gaussian naive method elastic net path-solver. */ template struct SpElnetPath< util::glm_type::gaussian, util::mode_type::naive, SpElnetPointPolicy> : ElnetPathGaussianBase , ElnetPathCRTPBase< SpElnetPath< util::glm_type::gaussian, util::mode_type::naive, SpElnetPointPolicy> > { private: using base_t = ElnetPathGaussianBase; using crtp_base_t = ElnetPathCRTPBase< SpElnetPath< util::glm_type::gaussian, util::mode_type::naive, SpElnetPointPolicy> >; using elnet_point_t = SpElnetPointPolicy; template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType, JUType, VPType, CLType, IntType, XType, ULamType, XVType, AOType, IAType, KinType, RSQOType, ALMOType, SetpbFType, IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; YType& y; const WType& w; const XMType& xm; const XSType& xs; }; public: using base_t::process_path_fit; template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, YType& y, const WType& w, IntType ne, IntType nx, const XType& x, IntType nlam, ValueType flmin, const ULamType& ulam, ValueType thr, IntType maxit, const XMType& xm, const XSType& xs, const XVType& xv, IntType& lmu, AOType& ao, IAType& ia, KinType& kin, RSQOType& rsqo, ALMOType& almo, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , YType , WType , IntType , XType , ULamType , XMType , XSType , XVType , AOType , IAType , KinType , RSQOType , ALMOType , SetpbFType , IntParamType> pack{ // build sub-pack { // build sub-pack {beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, almo, nlp, jerr, setpb_f, int_param}, // add new members xv, rsqo }, // add new members y, w, xm, xs }; crtp_base_t::fit(pack); } template auto get_elnet_point(const FitPackType& pack, const PathConfigPackType&) const { auto& sp = pack.sub_pack; auto& ssp = sp.sub_pack; return elnet_point_t( ssp.thr, ssp.maxit, ssp.nx, ssp.nlp, ssp.ia, pack.y, pack.w, ssp.x, pack.xm, pack.xs, sp.xv, ssp.vp, ssp.cl, ssp.ju); } template auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, elnet_point.abs_grad()); } template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, const PointConfigPackType& point_pack, const ElnetPointType& elnet_point) const { return base_t::process_point_fit(pack.sub_pack, path_pack, point_pack, elnet_point); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_binomial_multi_class_group.hpp0000644000176200001440000001472714171551160031426 0ustar liggesusers#pragma once #include #include namespace glmnetpp { template struct SpElnetPath< util::glm_type::binomial, util::mode_type::multi_class_group, ElnetPointPolicy> : ElnetPathBinomialMultiClassGroupBase , ElnetPathCRTPBase< SpElnetPath< util::glm_type::binomial, util::mode_type::multi_class_group, ElnetPointPolicy> > { private: using base_t = ElnetPathBinomialMultiClassGroupBase; using crtp_base_t = ElnetPathCRTPBase< SpElnetPath< util::glm_type::binomial, util::mode_type::multi_class_group, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; public: template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , WType , ULamType , XVType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; const XMType& xm; const XSType& xs; }; template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, IntType ne, IntType nx, const XType& x, const YType& y, GType& g, const WType& w, IntType nlam, ValueType flmin, const ULamType& ulam, ValueType thr, bool intr, IntType maxit, const XMType& xm, const XSType& xs, const XVType& xv, IntType& lmu, A0Type& a0, AOType& ao, IAType& ia, KinType& kin, ValueType& dev0, DevType& dev, ALMType& alm, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , WType , ULamType , XMType , XSType , XVType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType> pack{ { { // build sub-pack {beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, alm, nlp, jerr, setpb_f, int_param}, // add new members y, g, w, true /* not used */, intr, 2 /* not used */, a0, dev0, dev }, xv }, xm, xs }; crtp_base_t::fit(pack); } template elnet_point_t get_elnet_point( const FitPackType& pack, const PathConfigPackType& path_pack) const { auto& sp = pack.sub_pack; auto& ssp = sp.sub_pack; auto& sssp = ssp.sub_pack; return elnet_point_t( ssp.intr, sssp.thr, sssp.maxit, sssp.nx, sssp.nlp, sssp.ia, ssp.g, ssp.dev0, sssp.x, ssp.y, ssp.w, pack.xm, pack.xs, sp.xv, sssp.vp, sssp.cl, sssp.ju, sssp.int_param); } template auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, elnet_point.abs_grad()); } template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, PointConfigPackType&& point_pack, const ElnetPointType& elnet_point) const { return base_t::process_point_fit( pack.sub_pack, path_pack, point_pack, elnet_point); } template void process_path_fit( const FitPackType& pack, const ElnetPointType& elnet_point) const { base_t::process_path_fit(pack.sub_pack, elnet_point); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/poisson_base.hpp0000644000176200001440000001006414171551160025771 0ustar liggesusers#pragma once #include #include #include #include #include #include #include #include namespace glmnetpp { /* * Common base class across all binomial path-solvers. */ struct ElnetPathPoissonBase : ElnetPathBase { private: using base_t = ElnetPathBase; protected: using state_t = util::control_flow; template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType , JUType , VPType , CLType , IntType , XType , ULamType , AOType , IAType , KinType , ALMType , SetpbFType , IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; const YType& y; GType& g; const QType& q; bool intr; A0Type& a0; value_t& dev0; DevType& dev; }; template auto initialize_path(const FitPackType& pack) const { auto out = base_t::initialize_path(pack.sub_pack); out.sml *= 10; return out; } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, elnet_point.abs_grad()); } template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, const PointConfigPackType& point_pack, const ElnetPointType& elnet_point) const { using int_t = typename std::decay_t::int_t; auto& sp = pack.sub_pack; auto& a = sp.ao; auto& a0 = pack.a0; auto& dev = pack.dev; auto mnl = path_pack.mnl; int_t m = point_pack.m; int_t nin = elnet_point.n_active(); base_t::store_beta_compressed( elnet_point.active_begin(), elnet_point.active_end(), a.col(m), [&](int_t k) { return elnet_point.beta(k); } ); a0(m) = elnet_point.intercept(); dev(m) = elnet_point.deviance(); int_t me = (a.col(m).head(nin).array() != 0.0).count(); auto prev_dev = (m+1 >= mnl) ? dev(m-mnl+1) : 0; // otherwise, set to dummy value state_t state = base_t::process_point_fit( m, nin, me, (dev(m)-prev_dev)/dev(m), dev(m), sp, path_pack, point_pack); if (state == state_t::continue_ || state == state_t::break_) return state; return state_t::noop_; } template void process_path_fit( const FitPackType& pack, const ElnetPointType& elnet_point) const { pack.g = elnet_point.prediction(); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/gaussian_cov.hpp0000644000176200001440000001247314157246224026002 0ustar liggesusers#pragma once #include #include namespace glmnetpp { /* * Gaussian covariance method elastic net path-solver. */ template struct ElnetPath< util::glm_type::gaussian, util::mode_type::cov, ElnetPointPolicy> : ElnetPathGaussianBase , ElnetPathCRTPBase< ElnetPath< util::glm_type::gaussian, util::mode_type::cov, ElnetPointPolicy> > { private: using base_t = ElnetPathGaussianBase; using crtp_base_t = ElnetPathCRTPBase< ElnetPath::cov, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType, JUType, VPType, CLType, IntType, XType, ULamType, XVType, AOType, IAType, KinType, RSQOType, ALMOType, SetpbFType, IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; GType& g; }; public: using base_t::process_path_fit; template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, GType& g, IntType ne, IntType nx, const XType& x, IntType nlam, ValueType flmin, const ULamType& ulam, ValueType thr, IntType maxit, const XVType& xv, IntType& lmu, AOType& ao, IAType& ia, KinType& kin, RSQOType& rsqo, ALMOType& almo, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , GType , IntType , XType , ULamType , XVType , AOType , IAType , KinType , RSQOType , ALMOType , SetpbFType , IntParamType> pack { // build sub-pack { // build sub-pack {beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, almo, nlp, jerr, setpb_f, int_param}, // add new members xv, rsqo }, // add new members g }; crtp_base_t::fit(pack); } /* * Builds a point-solver using the arguments. * * @param pack object of FitPack of the current class. */ template auto get_elnet_point(const FitPackType& pack, const PathConfigPackType&) const { auto& sp = pack.sub_pack; auto& ssp = sp.sub_pack; return elnet_point_t( ssp.thr, ssp.maxit, ssp.nx, ssp.nlp, ssp.ia, pack.g, ssp.x, sp.xv, ssp.vp, ssp.cl, ssp.ju); } template auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType&) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, pack.g); } template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, const PointConfigPackType& point_pack, const ElnetPointType& elnet_point) const { return base_t::process_point_fit(pack.sub_pack, path_pack, point_pack, elnet_point); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/poisson_naive.hpp0000644000176200001440000000651314157246224026173 0ustar liggesusers#pragma once #include #include #include namespace glmnetpp { template struct ElnetPath< util::glm_type::poisson, util::mode_type::naive, ElnetPointPolicy> : ElnetPathPoissonBase , ElnetPathCRTPBase< ElnetPath< util::glm_type::poisson, util::mode_type::naive, ElnetPointPolicy> > { private: using base_t = ElnetPathPoissonBase; using crtp_base_t = ElnetPathCRTPBase< ElnetPath::naive, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; public: using base_t::initialize_path; using base_t::initialize_point; using base_t::process_path_fit; using base_t::process_point_fit; template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, IntType ne, IntType nx, const XType& x, const YType& y, GType& g, const QType& q, IntType nlam, ValueType flmin, const ULamType& ulam, ValueType thr, bool intr, IntType maxit, IntType& lmu, A0Type& a0, AOType& ao, IAType& ia, KinType& kin, ValueType& dev0, DevType& dev, ALMType& alm, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , QType , ULamType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType> pack{ // build sub-pack {beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, alm, nlp, jerr, setpb_f, int_param}, // add new members y, g, q, intr, a0, dev0, dev }; crtp_base_t::fit(pack); } template elnet_point_t get_elnet_point( const FitPackType& pack, const PathConfigPackType&) const { auto& sp = pack.sub_pack; return elnet_point_t( pack.intr, sp.thr, sp.maxit, sp.nx, sp.nlp, sp.ia, pack.dev0, sp.x, pack.y, pack.g, pack.q, sp.vp, sp.cl, sp.ju, sp.int_param); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/binomial_two_class.hpp0000644000176200001440000000667114157246224027174 0ustar liggesusers#pragma once #include #include #include namespace glmnetpp { template struct ElnetPath< util::glm_type::binomial, util::mode_type::two_class, ElnetPointPolicy> : ElnetPathBinomialTwoClassBase , ElnetPathCRTPBase< ElnetPath< util::glm_type::binomial, util::mode_type::two_class, ElnetPointPolicy> > { private: using base_t = ElnetPathBinomialTwoClassBase; using crtp_base_t = ElnetPathCRTPBase< ElnetPath::two_class, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; public: using base_t::initialize_path; using base_t::initialize_point; using base_t::process_point_fit; using base_t::process_path_fit; template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, IntType ne, IntType nx, const XType& x, const YType& y, GType& g, const WType& w, IntType nlam, ValueType flmin, const ULamType& ulam, ValueType thr, bool isd, bool intr, IntType maxit, IntType kopt, IntType& lmu, A0Type& a0, AOType& ao, IAType& ia, KinType& kin, ValueType& dev0, DevType& dev, ALMType& alm, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , WType , ULamType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType> pack{ // build sub-pack {beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, alm, nlp, jerr, setpb_f, int_param}, // add new members y, g, w, isd, intr, kopt, a0, dev0, dev }; crtp_base_t::fit(pack); } template elnet_point_t get_elnet_point( const FitPackType& pack, const PathConfigPackType&) const { auto& sp = pack.sub_pack; return elnet_point_t( pack.isd, pack.intr, pack.kopt, sp.thr, sp.maxit, sp.nx, sp.nlp, sp.ia, pack.g, pack.dev0, sp.x, pack.y, pack.w, sp.vp, sp.cl, sp.ju, sp.int_param); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_binomial_multi_class.hpp0000644000176200001440000001457314157246224030217 0ustar liggesusers#pragma once #include #include #include namespace glmnetpp { template struct SpElnetPath< util::glm_type::binomial, util::mode_type::multi_class, ElnetPointPolicy> : ElnetPathBinomialMultiClassBase , ElnetPathCRTPBase< SpElnetPath< util::glm_type::binomial, util::mode_type::multi_class, ElnetPointPolicy> > { private: using base_t = ElnetPathBinomialMultiClassBase; using crtp_base_t = ElnetPathCRTPBase< SpElnetPath< util::glm_type::binomial, util::mode_type::multi_class, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; using typename base_t::state_t; template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , WType , ULamType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; const XBType& xb; const XSType& xs; }; public: template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, IntType ne, IntType nx, const XType& x, const YType& y, GType& g, const WType& w, IntType nlam, ValueType flmin, const ULamType& ulam, const XBType& xb, const XSType& xs, ValueType thr, bool isd, bool intr, IntType maxit, IntType kopt, IntType& lmu, A0Type& a0, AOType& ao, IAType& ia, KinType& kin, ValueType& dev0, DevType& dev, ALMType& alm, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , WType , ULamType , XBType , XSType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType> pack{ // build sub-pack { // build sub-pack { beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, alm, nlp, jerr, setpb_f, int_param }, // add new members y, g, w, isd, intr, kopt, a0, dev0, dev }, xb, xs }; crtp_base_t::fit(pack); } template elnet_point_t get_elnet_point( const FitPackType& pack, PathConfigPackType&& path_pack) const { auto& sp = pack.sub_pack; auto& ssp = sp.sub_pack; return elnet_point_t( sp.isd, sp.intr, sp.kopt, ssp.thr, ssp.maxit, ssp.nx, ssp.nlp, ssp.ia, sp.g, sp.dev0, ssp.x, sp.y, sp.w, pack.xb, pack.xs, ssp.vp, ssp.cl, ssp.ju, path_pack.is, ssp.int_param); } template auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, elnet_point.abs_grad()); } template state_t process_point_fit( const FitPackType& pack, PathConfigPackType&& path_pack, PointConfigPackType&& point_pack, const ElnetPointType& elnet_point) const { return base_t::process_point_fit(pack.sub_pack, path_pack, point_pack, elnet_point); } template void process_path_fit( const FitPackType& pack, const ElnetPointType& elnet_point) const { base_t::process_path_fit(pack.sub_pack, elnet_point); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/gaussian_multi.hpp0000644000176200001440000000644514171551160026341 0ustar liggesusers#pragma once #include #include namespace glmnetpp { /* * Gaussian multi-response method elastic net path-solver. */ template struct ElnetPath< util::glm_type::gaussian, util::mode_type::multi, ElnetPointPolicy> : ElnetPathGaussianMultiBase , ElnetPathCRTPBase< ElnetPath< util::glm_type::gaussian, util::mode_type::multi, ElnetPointPolicy> > { private: using base_t = ElnetPathGaussianMultiBase; using crtp_base_t = ElnetPathCRTPBase< ElnetPath::multi, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; public: using base_t::initialize_path; using base_t::initialize_point; using base_t::process_path_fit; using base_t::process_point_fit; template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, YType& y, IntType ne, IntType nx, const XType& x, IntType nlam, ValueType flmin, const ULamType& ulam, ValueType thr, IntType maxit, const XVType& xv, ValueType ys0, IntType& lmu, AOType& ao, IAType& ia, KinType& kin, RSQOType& rsqo, ALMOType& almo, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { base_t::FitPack< ValueType , JUType , VPType , CLType , YType , IntType , XType , ULamType , XVType , AOType , IAType , KinType , RSQOType , ALMOType , SetpbFType , IntParamType> pack { // build sub-pack { // build sub-pack {beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, almo, nlp, jerr, setpb_f, int_param}, // add new members xv, rsqo }, // add new members y, ys0 }; crtp_base_t::fit(pack); } template auto get_elnet_point(const FitPackType& pack, const PathConfigPackType&) const { auto& sp = pack.sub_pack; auto& ssp = sp.sub_pack; return elnet_point_t( ssp.thr, ssp.maxit, ssp.nx, ssp.nlp, ssp.ia, pack.ys0, pack.y, ssp.x, sp.xv, ssp.vp, ssp.cl, ssp.ju, ssp.int_param); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_gaussian_cov.hpp0000644000176200001440000001314314157246224026477 0ustar liggesusers#pragma once #include #include namespace glmnetpp { /* * Sparse Gaussian covariance method elastic net path-solver. */ template struct SpElnetPath< util::glm_type::gaussian, util::mode_type::cov, SpElnetPointPolicy> : ElnetPathGaussianBase , ElnetPathCRTPBase< SpElnetPath< util::glm_type::gaussian, util::mode_type::cov, SpElnetPointPolicy> > { private: using base_t = ElnetPathGaussianBase; using crtp_base_t = ElnetPathCRTPBase< SpElnetPath< util::glm_type::gaussian, util::mode_type::cov, SpElnetPointPolicy> >; using elnet_point_t = SpElnetPointPolicy; template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType, JUType, VPType, CLType, IntType, XType, ULamType, XVType, AOType, IAType, KinType, RSQOType, ALMOType, SetpbFType, IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; GType& g; const WType& w; const XMType& xm; const XSType& xs; }; public: using base_t::process_path_fit; template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, GType& g, const WType& w, IntType ne, IntType nx, const XType& x, IntType nlam, ValueType flmin, const ULamType& ulam, ValueType thr, IntType maxit, const XMType& xm, const XSType& xs, const XVType& xv, IntType& lmu, AOType& ao, IAType& ia, KinType& kin, RSQOType& rsqo, ALMOType& almo, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , GType , WType , IntType , XType , ULamType , XMType , XSType , XVType , AOType , IAType , KinType , RSQOType , ALMOType , SetpbFType , IntParamType> pack{ // build sub-pack { // build sub-pack {beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, almo, nlp, jerr, setpb_f, int_param}, // add new members xv, rsqo }, // add new members g, w, xm, xs }; crtp_base_t::fit(pack); } template auto get_elnet_point(const FitPackType& pack, const PathConfigPackType&) const { auto& sp = pack.sub_pack; auto& ssp = sp.sub_pack; return elnet_point_t( ssp.thr, ssp.maxit, ssp.nx, ssp.nlp, ssp.ia, pack.g, pack.w, ssp.x, pack.xm, pack.xs, sp.xv, ssp.vp, ssp.cl, ssp.ju); } template auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType&) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, pack.g); } template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, const PointConfigPackType& point_pack, const ElnetPointType& elnet_point) const { return base_t::process_point_fit(pack.sub_pack, path_pack, point_pack, elnet_point); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_binomial_two_class.hpp0000644000176200001440000001453514157246224027674 0ustar liggesusers#pragma once #include #include #include namespace glmnetpp { template struct SpElnetPath< util::glm_type::binomial, util::mode_type::two_class, ElnetPointPolicy> : ElnetPathBinomialTwoClassBase , ElnetPathCRTPBase< SpElnetPath< util::glm_type::binomial, util::mode_type::two_class, ElnetPointPolicy> > { private: using base_t = ElnetPathBinomialTwoClassBase; using crtp_base_t = ElnetPathCRTPBase< SpElnetPath< util::glm_type::binomial, util::mode_type::two_class, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; using typename base_t::state_t; template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , WType , ULamType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; const XBType& xb; const XSType& xs; }; public: template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, IntType ne, IntType nx, const XType& x, const YType& y, GType& g, const WType& w, IntType nlam, ValueType flmin, const ULamType& ulam, const XBType& xb, const XSType& xs, ValueType thr, bool isd, bool intr, IntType maxit, IntType kopt, IntType& lmu, A0Type& a0, AOType& ao, IAType& ia, KinType& kin, ValueType& dev0, DevType& dev, ALMType& alm, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , WType , ULamType , XBType , XSType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType> pack{ // build sub-pack { // build sub-pack { beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, alm, nlp, jerr, setpb_f, int_param }, // add new members y, g, w, isd, intr, kopt, a0, dev0, dev }, xb, xs }; crtp_base_t::fit(pack); } template elnet_point_t get_elnet_point( const FitPackType& pack, const PathConfigPackType&) const { auto& sp = pack.sub_pack; auto& ssp = sp.sub_pack; return elnet_point_t( sp.isd, sp.intr, sp.kopt, ssp.thr, ssp.maxit, ssp.nx, ssp.nlp, ssp.ia, sp.g, sp.dev0, ssp.x, sp.y, sp.w, pack.xb, pack.xs, ssp.vp, ssp.cl, ssp.ju, ssp.int_param); } template auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, elnet_point); } template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, const PointConfigPackType& point_pack, const ElnetPointType& elnet_point) const { return base_t::process_point_fit(pack.sub_pack, path_pack, point_pack, elnet_point); } template void process_path_fit( const FitPackType& pack, const ElnetPointType& elnet_point) const { base_t::process_path_fit(pack.sub_pack, elnet_point); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/binomial_base.hpp0000644000176200001440000004073214171551160026076 0ustar liggesusers#pragma once #include #include #include #include #include #include #include #include namespace glmnetpp { /* * Common base class across all binomial path-solvers. */ struct ElnetPathBinomialBase : ElnetPathBase { private: using base_t = ElnetPathBase; protected: using state_t = util::control_flow; template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType , JUType , VPType , CLType , IntType , XType , ULamType , AOType , IAType , KinType , ALMType , SetpbFType , IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; const YType& y; GType& g; const WType& w; bool isd; bool intr; int_t kopt; A0Type& a0; value_t& dev0; DevType& dev; }; template auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const GType& g) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, g); } }; /* * Common base class for all Binomial Two-Class path-solvers. */ struct ElnetPathBinomialTwoClassBase : ElnetPathBinomialBase { private: using base_t = ElnetPathBinomialBase; using base_t::initialize_point; template GLMNETPP_STRONG_INLINE static auto dev2( const WType& w, const YType& y, const PType& p, ValueType pmin ) { auto pmax = 1.0-pmin; auto s = 0.0; for (int i = 0; i < w.size(); ++i) { auto pi = std::min(std::max(pmin, p(i)), pmax); s -= w(i) * (y(i) * std::log(pi) + (1.0-y(i)) * std::log(1.0-pi)); } return s; } protected: template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { return base_t::initialize_point(m, lmda_curr, pack, path_pack, elnet_point.abs_grad()); } template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, const PointConfigPackType& point_pack, const ElnetPointType& elnet_point) const { using int_t = typename std::decay_t::int_t; auto& sp = pack.sub_pack; auto& a = sp.ao; const auto& int_param = sp.int_param; const auto& w = pack.w; const auto& y = pack.y; auto& a0 = pack.a0; auto& dev = pack.dev; int_t m = point_pack.m; int_t nin = elnet_point.n_active(); const auto& q = elnet_point.q(); auto dev1 = elnet_point.deviance(); auto dev0 = elnet_point.null_deviance(); base_t::store_beta_compressed( elnet_point.active_begin(), elnet_point.active_end(), a.col(m), [&](int_t k) { return elnet_point.beta(k); } ); a0(m) = elnet_point.intercept(); auto devi = dev2(w,y,q,int_param.pmin); dev(m) = (dev1-devi)/dev0; int_t me = (a.col(m).head(nin).array() != 0.0).array().count(); auto prev_dev = (m == 0) ? 0 : dev(m-1); state_t state = base_t::process_point_fit( m, nin, me, dev(m)-prev_dev, dev(m), sp, path_pack, point_pack); if (state == state_t::continue_ || state == state_t::break_) return state; if (elnet_point.is_total_var_too_small()) return state_t::break_; return state_t::noop_; } template void process_path_fit( const FitPackType& pack, const ElnetPointType& elnet_point) const { auto& g = pack.g; const auto& q = elnet_point.q(); g.array() = (q.array()/(1.0-q.array())).log(); } }; /* * Common base class for all Binomial Multi-Class path-solvers. * TODO: refactor more after integrating sparse multi-class. */ struct ElnetPathBinomialMultiClassBase : ElnetPathBinomialBase { private: template static auto nintot( const AType& a, const MType& m, IntType nin, ISType&& is ) { auto nc = a.cols(); is.setZero(); int out = 0; for (int ic = 0; ic < nc; ++ic) { for (int j = 0; j < nin; ++j) { auto k = m(j)-1; if (is(k)) continue; if (!a(j,ic)) continue; is(k) = k+1; ++out; } } return out; } protected: using base_t = ElnetPathBinomialBase; template struct PathConfigPack { using sub_pack_t = typename base_t::template PathConfigPack; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; using ivec_t = Eigen::Matrix; sub_pack_t sub_pack; ivec_t is; // common buffer for both point and path fitting }; template struct PointConfigPack { using sub_pack_t = typename base_t::template PointConfigPack; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; using mat_t = Eigen::Matrix; auto elastic_prop() const { return sub_pack.elastic_prop(); } auto lmda() const { return sub_pack.lmda(); } auto prev_lmda() const { return sub_pack.prev_lmda(); } auto l1_regul() const { return sub_pack.l1_regul(); } auto l2_regul() const { return sub_pack.l2_regul(); } sub_pack_t sub_pack; Eigen::Map a_slice; }; template auto initialize_path(const FitPackType& pack) const { using value_t = typename std::decay_t::value_t; using int_t = typename std::decay_t::int_t; using ivec_t = Eigen::Matrix; auto&& sp = base_t::initialize_path(pack); const auto& x = pack.sub_pack.x; const auto& y = pack.y; ivec_t is(std::max(x.cols(), y.cols())); using pack_config_t = PathConfigPack; return pack_config_t{{std::move(sp)}, std::move(is)}; } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const GType& g) const { using pack_t = typename std::decay::type; using value_t = typename pack_t::value_t; using int_t = typename pack_t::int_t; using mat_t = Eigen::Matrix; auto nx = pack.sub_pack.nx; auto& a = pack.sub_pack.ao; auto nc = pack.y.cols(); // set the new slice for coefficient storage Eigen::Map a_slice( a.data() + nx * nc * m, nx, nc); auto&& sp = base_t::initialize_point(m, lmda_curr, pack, path_pack.sub_pack, g); using point_config_pack_t = PointConfigPack; return point_config_pack_t{{std::move(sp)}, a_slice}; } /* * Helper function that generalizes point fit processing * depending on how we compute the total number of nonzero entries in the active set. */ template state_t process_point_fit( const FitPackType& pack, PathConfigPackType&& path_pack, PointConfigPackType&& point_pack, const ElnetPointType& elnet_point, ActiveNznFType active_nzn_f) const { using int_t = typename std::decay_t::int_t; auto& sp = pack.sub_pack; auto no = sp.x.rows(); const auto& y = pack.y; const auto& w = pack.w; auto& a0 = pack.a0; auto& dev = pack.dev; int_t m = point_pack.sub_pack.m; auto& a_slice = point_pack.a_slice; auto nc = elnet_point.n_classes(); int_t nin = elnet_point.n_active(); const auto& q = elnet_point.q(); const auto& sxp = elnet_point.sxp(); auto dev1 = elnet_point.deviance(); auto dev0 = elnet_point.null_deviance(); auto devi = 0.0; for (int_t ic = 0; ic < nc; ++ic) { base_t::store_beta_compressed( elnet_point.active_begin(), elnet_point.active_end(), a_slice.col(ic), [&](int_t k) { return elnet_point.beta(k, ic); } ); a0(ic, m) = elnet_point.intercept(ic); for (int_t i = 0; i < no; ++i) { if (y(i,ic) <= 0) continue; devi -= w(i) * y(i,ic) * std::log(q(i,ic) / sxp(i)); } } int_t me = active_nzn_f(); dev(m) = (dev1-devi)/dev0; auto prev_dev = (m <= 0) ? 0 : dev(m-1); state_t state = base_t::process_point_fit( m, nin, me, dev(m) - prev_dev, dev(m), sp, path_pack.sub_pack, point_pack.sub_pack ); if (state == state_t::continue_ || state == state_t::break_) return state; if (elnet_point.has_skipped_all_classes()) return state_t::break_; return state_t::noop_; } template state_t process_point_fit( const FitPackType& pack, PathConfigPackType&& path_pack, PointConfigPackType&& point_pack, const ElnetPointType& elnet_point) const { auto& a_slice = point_pack.a_slice; const auto& ia = pack.sub_pack.ia; auto nin = elnet_point.n_active(); auto& is = path_pack.is; return process_point_fit(pack, path_pack, point_pack, elnet_point, [&]() { return nintot(a_slice, ia, nin, is); }); } template void process_path_fit( const FitPackType& pack, const ElnetPointType& elnet_point) const { auto& g = pack.g; auto& q = elnet_point.q(); auto nc = pack.y.cols(); g.array() = q.array().log(); for (int i = 0; i < g.rows(); ++i) { g.row(i).array() -= g.row(i).sum()/nc; } } }; /* * Common base class for all Binomial Multi-Class with group penalty path-solvers. */ struct ElnetPathBinomialMultiClassGroupBase : ElnetPathBinomialMultiClassBase { private: using base_t = ElnetPathBinomialMultiClassBase; protected: /* * Looks stupid, but this makes the logic consistent, * and therefore, simplifies the other member functions. */ template struct PathConfigPack { using sub_pack_t = typename base_t::base_t::template PathConfigPack; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; using ivec_t = Eigen::Matrix; sub_pack_t sub_pack; }; template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , WType , ULamType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; const XVType& xv; }; template auto initialize_path(const FitPackType& pack) const { // Note: we want to by-pass the base class's override of PathPack // and go directly to its base class's version. auto&& sp = base_t::base_t::initialize_path(pack.sub_pack); using sp_t = std::decay_t; using value_t = typename sp_t::value_t; using int_t = typename sp_t::int_t; using path_config_t = PathConfigPack; return path_config_t{sp}; } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const GType& g) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, g); } template state_t process_point_fit( const FitPackType& pack, PathConfigPackType&& path_pack, PointConfigPackType&& point_pack, const ElnetPointType& elnet_point) const { auto& a_slice = point_pack.a_slice; auto nin = elnet_point.n_active(); return base_t::process_point_fit(pack.sub_pack, path_pack, point_pack, elnet_point, [&]() { return (a_slice.col(0).head(nin).array() != 0.0).count(); }); } template void process_path_fit( const FitPackType& pack, const ElnetPointType& elnet_point) const { base_t::process_path_fit(pack.sub_pack, elnet_point); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_gaussian_multi.hpp0000644000176200001440000001347414171551160027043 0ustar liggesusers#pragma once #include #include namespace glmnetpp { /* * Sparse Gaussian multi-response method elastic net path-solver. */ template struct SpElnetPath< util::glm_type::gaussian, util::mode_type::multi, ElnetPointPolicy> : ElnetPathGaussianMultiBase , ElnetPathCRTPBase< SpElnetPath< util::glm_type::gaussian, util::mode_type::multi, ElnetPointPolicy> > { private: using base_t = ElnetPathGaussianMultiBase; using crtp_base_t = ElnetPathCRTPBase< SpElnetPath::multi, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType, JUType, VPType, CLType, YType, IntType, XType, ULamType, XVType, AOType, IAType, KinType, RSQOType, ALMOType, SetpbFType, IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; const WType& w; const XMType& xm; const XSType& xs; }; public: using base_t::process_path_fit; template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, YType& y, const WType& w, IntType ne, IntType nx, const XType& x, IntType nlam, ValueType flmin, const ULamType& ulam, ValueType thr, IntType maxit, const XMType& xm, const XSType& xs, const XVType& xv, ValueType ys0, IntType& lmu, AOType& ao, IAType& ia, KinType& kin, RSQOType& rsqo, ALMOType& almo, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , YType , WType , IntType , XType , ULamType , XMType , XSType , XVType , AOType , IAType , KinType , RSQOType , ALMOType , SetpbFType , IntParamType> pack { { // build sub-pack { // build sub-pack {beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, almo, nlp, jerr, setpb_f, int_param}, // add new members xv, rsqo }, // add new members y, ys0 }, // add new members w, xm, xs }; crtp_base_t::fit(pack); } template auto get_elnet_point(const FitPackType& pack, const PathConfigPackType&) const { auto& sp = pack.sub_pack; auto& ssp = sp.sub_pack; auto& sssp = ssp.sub_pack; return elnet_point_t( sssp.thr, sssp.maxit, sssp.nx, sssp.nlp, sssp.ia, sp.ys0, sp.y, sssp.x, pack.w, pack.xm, pack.xs, ssp.xv, sssp.vp, sssp.cl, sssp.ju, sssp.int_param); } template auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, elnet_point); } template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, PointConfigPackType&& point_pack, const ElnetPointType& elnet_point) const { return base_t::process_point_fit(pack.sub_pack, path_pack, point_pack, elnet_point); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/base.hpp0000644000176200001440000002360214171551160024221 0ustar liggesusers#pragma once #include #include #include #include #include #include namespace glmnetpp { /* * Common CRTP base class for all path-solvers. * All routines here should be those that depend on the derived class type (ElnetPathDerived), * i.e. those that have different implementation definitions based on the derived type. */ template struct ElnetPathCRTPBase { private: using derived_t = ElnetPathDerived; using state_t = util::control_flow; // generates self() GLMNETPP_GENERATE_CRTP(derived_t) public: /* * Main driver for fitting a path-wise solution to elastic net. * The purpose of this function is to abstract the control-flow of the fit function. * * @param pack the derived class FitPack. */ template void fit(const FitPackType& pack) const { using pack_t = std::decay_t; using value_t = typename pack_t::value_t; using int_t = typename pack_t::int_t; auto& jerr = pack.err_code(); try { auto&& path_config_pack = self().initialize_path(pack); auto&& elnet_point = self().get_elnet_point(pack, path_config_pack); value_t lmda_curr = 0; // this makes the math work out in the point solver for (int_t m = 0; m < pack.path_size(); ++m) { auto&& point_config_pack = self().initialize_point(m, lmda_curr, pack, path_config_pack, elnet_point); try { elnet_point.fit(point_config_pack); } catch (const util::maxit_reached_error& e) { jerr = e.err_code(m); return; } catch (const util::bnorm_maxit_reached_error& e) { jerr = e.err_code(m); return; } catch (const util::elnet_error& e) { jerr = e.err_code(m); break; } state_t state = self().process_point_fit(pack, path_config_pack, point_config_pack, elnet_point); if (state == state_t::continue_) continue; if (state == state_t::break_) break; } self().process_path_fit(pack, elnet_point); } catch (const util::elnet_error& e) { jerr = e.err_code(0); } } }; /* * Common base class for all path-solvers. * Note that these routines should NOT be inside the CRTP class, * as this will lead to massive code bloat. */ struct ElnetPathBase { protected: using state_t = util::control_flow; /* * Common PathConfigPack base class across every type of path-solver. */ template struct PathConfigPack { using value_t = ValueType; using int_t = IntType; value_t omb; value_t alm; value_t alf; int_t ni; int_t mnl; value_t sml; value_t rsqmax; }; /* * Common PointConfigPack base class across every type of path-solver. */ template struct PointConfigPack { using value_t = ValueType; using int_t = IntType; value_t elastic_prop() const { return beta; } value_t lmda() const { return alm; } value_t prev_lmda() const { return alm0; } value_t l1_regul() const { return ab; } value_t l2_regul() const { return dem; } int_t m; value_t ab; value_t dem; value_t alm0; value_t alm; value_t beta; }; /* * Common FitPack base class across every type of path-solver. */ template struct FitPack { using value_t = ValueType; using int_t = IntType; int_t& err_code() const { return jerr; } int_t path_size() const { return nlam; } value_t beta; const JUType& ju; const VPType& vp; const CLType& cl; int_t ne; int_t nx; const XType& x; int_t nlam; value_t flmin; const ULamType& ulam; value_t thr; int_t maxit; int_t& lmu; AOType& ao; IAType& ia; KinType& kin; ALMOType& almo; int_t& nlp; int_t& jerr; SetpbFType setpb_f; IntParamType int_param; }; /* * Initializes common global configuration for a path-solver * across every type of path-solver. * All outputted quantities should be those that both * a path-solver and a point-solver would not modify. */ template auto initialize_path(const FitPackType& pack) const { using pack_t = typename std::decay::type; using value_t = typename pack_t::value_t; using int_t = typename pack_t::int_t; const auto& x = pack.x; auto beta = pack.beta; auto eps = pack.int_param.eps; auto mnlam = pack.int_param.mnlam; auto sml = pack.int_param.sml; auto rsqmax = pack.int_param.rsqmax; int_t ni = x.cols(); value_t omb = 1.0 - beta; value_t alm = 0.0; value_t alf = 1.0; if (pack.flmin < 1.0) { auto eqs = std::max(eps, pack.flmin); alf = std::pow(eqs, 1.0 / (pack.nlam - 1.)); } pack.nlp = 0; auto mnl = std::min(mnlam, pack.nlam); using pack_config_t = PathConfigPack; return pack_config_t{omb, alm, alf, ni, mnl, sml, rsqmax}; } /* * Initializes common global configuration for a point-solver * across every type of point-solver. * All outputted quantities should be those that a point-solver would not modify. * * @param m iteration number. * @param lmda_curr current lambda value (will be updated to next lmda after the call). * @param pack object of type FitPack of current class. * @param path_pack object of type PathConfigPack of current class. * @param g (absolute or non-absolute) gradient vector. */ template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const GType& g) const { using pack_t = typename std::decay::type; using value_t = typename pack_t::value_t; using int_t = typename pack_t::int_t; auto flmin = pack.flmin; auto beta = pack.beta; auto ni = path_pack.ni; const auto& ulam = pack.ulam; const auto& ju = pack.ju; const auto& vp = pack.vp; auto alf = path_pack.alf; auto omb = path_pack.omb; auto& setpb_f = pack.setpb_f; auto big = pack.int_param.big; auto itrace = pack.int_param.itrace; if (itrace) setpb_f(m); auto alm0 = lmda_curr; auto alm = alm0; if (flmin >= 1.0) { alm = ulam(m); } else if (m > 1) { alm *= alf; } else if (m == 0) { alm = big; } else { alm0 = 0.0; for (int_t j = 0; j < ni; ++j) { if (ju[j] == 0 || (vp(j) <= 0.0)) continue; alm0 = std::max(alm0, std::abs(g(j)) / vp(j)); } alm0 /= std::max(beta, 1e-3); alm = alm0 * alf; } lmda_curr = alm; auto dem = alm * omb; auto ab = alm * beta; using point_config_pack_t = PointConfigPack; return point_config_pack_t{m, ab, dem, alm0, alm, beta}; } template state_t process_point_fit( IndexType m, IndexType n_active, IndexType me, ValueType prop_dev_change, ValueType curr_dev, const FitPackType& pack, const PathConfigPackType& path_pack, const PointConfigPackType& point_pack) const { auto& kin = pack.kin; auto& almo = pack.almo; auto& lmu = pack.lmu; auto flmin = pack.flmin; auto ne = pack.ne; auto mnl = path_pack.mnl; auto rsqmax = path_pack.rsqmax; auto sml = path_pack.sml; auto alm = point_pack.alm; kin(m) = n_active; almo(m) = alm; lmu = m + 1; if (lmu < mnl || flmin >= 1.0) return state_t::continue_; if ((me > ne) || (prop_dev_change < sml) || (curr_dev > rsqmax)) return state_t::break_; return state_t::noop_; } /* Helper static routines for all derived classes */ /* * Stores compressed_beta(j) = beta(k_j) where k_j = *begin at the jth iteration. */ template GLMNETPP_STRONG_INLINE static void store_beta_compressed( Iter begin, Iter end, CompBetaType&& compressed_beta, const BetaType& beta) { size_t j = 0; std::for_each(begin, end, [&](auto k) { compressed_beta(j++) = beta(k); }); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/gaussian_naive.hpp0000644000176200001440000001231514157246224026310 0ustar liggesusers#pragma once #include #include namespace glmnetpp { /* * Gaussian naive method elastic net path-solver. */ template struct ElnetPath< util::glm_type::gaussian, util::mode_type::naive, ElnetPointPolicy> : ElnetPathGaussianBase , ElnetPathCRTPBase< ElnetPath< util::glm_type::gaussian, util::mode_type::naive, ElnetPointPolicy> > { private: using base_t = ElnetPathGaussianBase; using crtp_base_t = ElnetPathCRTPBase< ElnetPath::naive, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType, JUType, VPType, CLType, IntType, XType, ULamType, XVType, AOType, IAType, KinType, RSQOType, ALMOType, SetpbFType, IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; YType& y; }; public: using base_t::process_path_fit; template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, YType& y, IntType ne, IntType nx, const XType& x, IntType nlam, ValueType flmin, const ULamType& ulam, ValueType thr, IntType maxit, const XVType& xv, IntType& lmu, AOType& ao, IAType& ia, KinType& kin, RSQOType& rsqo, ALMOType& almo, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , YType , IntType , XType , ULamType , XVType , AOType , IAType , KinType , RSQOType , ALMOType , SetpbFType , IntParamType> pack { // build sub-pack { // build sub-pack {beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, almo, nlp, jerr, setpb_f, int_param}, // add new members xv, rsqo }, // add new members y }; crtp_base_t::fit(pack); } template auto get_elnet_point(const FitPackType& pack, const PathConfigPackType&) const { auto& sp = pack.sub_pack; auto& ssp = sp.sub_pack; return elnet_point_t( ssp.thr, ssp.maxit, ssp.nx, ssp.nlp, ssp.ia, pack.y, ssp.x, sp.xv, ssp.vp, ssp.cl, ssp.ju); } template auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, elnet_point.abs_grad()); } template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, const PointConfigPackType& point_pack, const ElnetPointType& elnet_point) const { return base_t::process_point_fit(pack.sub_pack, path_pack, point_pack, elnet_point); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/decl.hpp0000644000176200001440000000110214157246224024213 0ustar liggesusers#pragma once #include #include namespace glmnetpp { template struct ElnetPathCRTPBase; struct ElnetPathBase; struct ElnetPathGaussianBase; struct ElnetPathBinomialBase; template mode , class ElnetPointPolicy=ElnetPoint > struct ElnetPath; template mode , class SpElnetPointPolicy=SpElnetPoint > struct SpElnetPath; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/gaussian_base.hpp0000644000176200001440000002314014171551160026110 0ustar liggesusers#pragma once #include #include #include #include #include #include namespace glmnetpp { /* * Common routines across all Gaussian path-solvers. */ struct ElnetPathGaussianBase : ElnetPathBase { private: using base_t = ElnetPathBase; protected: using typename base_t::state_t; using base_t::process_point_fit; /* * Common FitPack base class for all Gaussian path-solvers. */ template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType , JUType , VPType , CLType , IntType , XType , ULamType , AOType , IAType , KinType , ALMOType , SetpbFType , IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; GLMNETPP_STRONG_INLINE int_t& err_code() const { return sub_pack.err_code(); } GLMNETPP_STRONG_INLINE int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; const XVType& xv; RSQOType& rsqo; }; /* * Delegate to base class method with the base pack. */ template GLMNETPP_STRONG_INLINE auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template GLMNETPP_STRONG_INLINE auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const GType& g) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, g); } /* * Common routine for all Gaussian path-solvers after point-solver fit. * See fit() in base.hpp for usage. * * @param pack object of FitPack of current class. * @param path_pack object of PathConfigPack of current class. * @param point_pack object of PointConfigPack of current class. * @param elnet_point point-solver object. */ template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, const PointConfigPackType& point_pack, const ElnetPointType& elnet_point) const { using int_t = typename std::decay_t::int_t; using value_t = typename std::decay_t::value_t; auto& sp = pack.sub_pack; auto& ao = sp.ao; auto& rsqo = pack.rsqo; auto m = point_pack.m; auto n_active = elnet_point.n_active(); auto rsq = elnet_point.rsq(); auto rsq0 = elnet_point.rsq_prev(); base_t::store_beta_compressed( elnet_point.active_begin(), elnet_point.active_end(), ao.col(m), [&](int_t k) { return elnet_point.beta(k); } ); rsqo(m) = rsq; int_t me = (ao.col(m).head(n_active).array() != 0).count(); auto prop_dev_change = (rsq == 0) ? std::numeric_limits::infinity() : (rsq - rsq0) / rsq; state_t state = base_t::process_point_fit( m, n_active, me, prop_dev_change, rsq, sp, path_pack, point_pack ); if (state == state_t::continue_ || state == state_t::break_) return state; return state_t::noop_; } /* * Common finishing routine for all Gaussian path-solvers after (path) fit. * See fit() in base.hpp for usage. */ template GLMNETPP_STRONG_INLINE constexpr void process_path_fit(const FitPackType&, const ElnetPointType&) const {} }; /* * Common routines across all Gaussian multi-response path-solvers. */ struct ElnetPathGaussianMultiBase : ElnetPathGaussianBase { private: using base_t = ElnetPathGaussianBase; template struct PointConfigPack { using sub_pack_t = typename base_t::template PointConfigPack; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; using mat_t = Eigen::Matrix; GLMNETPP_STRONG_INLINE auto elastic_prop() const { return sub_pack.elastic_prop(); } GLMNETPP_STRONG_INLINE auto lmda() const { return sub_pack.lmda(); } GLMNETPP_STRONG_INLINE auto prev_lmda() const { return sub_pack.prev_lmda(); } GLMNETPP_STRONG_INLINE auto l1_regul() const { return sub_pack.l1_regul(); } GLMNETPP_STRONG_INLINE auto l2_regul() const { return sub_pack.l2_regul(); } sub_pack_t sub_pack; Eigen::Map a_slice; }; protected: template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType, JUType, VPType, CLType, IntType, XType, ULamType, XVType, AOType, IAType, KinType, RSQOType, ALMOType, SetpbFType, IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; YType& y; ValueType ys0; }; template auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template GLMNETPP_STRONG_INLINE auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { using pack_t = typename std::decay::type; using value_t = typename pack_t::value_t; using int_t = typename pack_t::int_t; using mat_t = Eigen::Matrix; auto nx = pack.sub_pack.sub_pack.nx; auto nr = pack.y.cols(); auto& a = pack.sub_pack.sub_pack.ao; // set the new slice for coefficient storage Eigen::Map a_slice( a.data() + nx * nr * m, nx, nr); auto&& sp = base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, elnet_point.abs_grad()); using point_config_pack_t = PointConfigPack; return point_config_pack_t{{std::move(sp)}, a_slice}; } template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, PointConfigPackType&& point_pack, const ElnetPointType& elnet_point) const { using fit_pack_t = std::decay_t; using value_t = typename fit_pack_t::value_t; using int_t = typename fit_pack_t::int_t; auto& point_sp = point_pack.sub_pack; auto nr = pack.y.cols(); auto rsq = elnet_point.rsq(); auto rsq0 = elnet_point.rsq_prev(); auto n_active = elnet_point.n_active(); auto ys0 = pack.ys0; auto& ao_slice = point_pack.a_slice; int_t m = point_pack.sub_pack.m; auto& rsqo = pack.sub_pack.rsqo; for (int j = 0; j < nr; ++j) { auto ao_slice_j = ao_slice.col(j); base_t::store_beta_compressed( elnet_point.active_begin(), elnet_point.active_end(), ao_slice_j, [&](auto k) { return elnet_point.beta(j, k); } ); } rsqo(m) = 1.0-rsq/ys0; int_t me = (ao_slice.col(0).head(n_active).array() != 0).count(); auto prop_dev_change = (rsq == 0) ? std::numeric_limits::infinity() : (rsq0 - rsq) / rsq; state_t state = base_t::process_point_fit( m, n_active, me, prop_dev_change, rsqo(m), pack.sub_pack.sub_pack, path_pack, point_sp ); if (state == state_t::continue_ || state == state_t::break_) return state; return state_t::noop_; } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/sp_poisson_naive.hpp0000644000176200001440000001436214157246224026676 0ustar liggesusers#pragma once #include #include #include namespace glmnetpp { template struct SpElnetPath< util::glm_type::poisson, util::mode_type::naive, ElnetPointPolicy> : ElnetPathPoissonBase , ElnetPathCRTPBase< SpElnetPath< util::glm_type::poisson, util::mode_type::naive, ElnetPointPolicy> > { private: using base_t = ElnetPathPoissonBase; using crtp_base_t = ElnetPathCRTPBase< SpElnetPath< util::glm_type::poisson, util::mode_type::naive, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; using typename base_t::state_t; template struct FitPack { using sub_pack_t = typename base_t::template FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , QType , ULamType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType>; using value_t = typename sub_pack_t::value_t; using int_t = typename sub_pack_t::int_t; int_t& err_code() const { return sub_pack.err_code(); } int_t path_size() const { return sub_pack.path_size(); } sub_pack_t sub_pack; const XBType& xb; const XSType& xs; }; public: template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, IntType ne, IntType nx, const XType& x, const YType& y, GType& g, const QType& q, IntType nlam, ValueType flmin, const ULamType& ulam, const XBType& xb, const XSType& xs, ValueType thr, bool intr, IntType maxit, IntType& lmu, A0Type& a0, AOType& ao, IAType& ia, KinType& kin, ValueType& dev0, DevType& dev, ALMType& alm, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , QType , ULamType , XBType , XSType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType> pack{ // build sub-pack { // build sub-pack { beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, alm, nlp, jerr, setpb_f, int_param }, // add new members y, g, q, intr, a0, dev0, dev }, xb, xs }; crtp_base_t::fit(pack); } template elnet_point_t get_elnet_point( const FitPackType& pack, const PathConfigPackType&) const { auto& sp = pack.sub_pack; auto& ssp = sp.sub_pack; return elnet_point_t( sp.intr, ssp.thr, ssp.maxit, ssp.nx, ssp.nlp, ssp.ia, sp.dev0, ssp.x, sp.y, sp.g, sp.q, pack.xb, pack.xs, ssp.vp, ssp.cl, ssp.ju, ssp.int_param); } template auto initialize_path(const FitPackType& pack) const { return base_t::initialize_path(pack.sub_pack); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { return base_t::initialize_point(m, lmda_curr, pack.sub_pack, path_pack, elnet_point); } template state_t process_point_fit( const FitPackType& pack, const PathConfigPackType& path_pack, const PointConfigPackType& point_pack, const ElnetPointType& elnet_point) const { return base_t::process_point_fit(pack.sub_pack, path_pack, point_pack, elnet_point); } template void process_path_fit( const FitPackType& pack, const ElnetPointType& elnet_point) const { base_t::process_path_fit(pack.sub_pack, elnet_point); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/binomial_multi_class.hpp0000644000176200001440000000760114157246224027507 0ustar liggesusers#pragma once #include #include namespace glmnetpp { template struct ElnetPath< util::glm_type::binomial, util::mode_type::multi_class, ElnetPointPolicy> : ElnetPathBinomialMultiClassBase , ElnetPathCRTPBase< ElnetPath< util::glm_type::binomial, util::mode_type::multi_class, ElnetPointPolicy> > { private: using base_t = ElnetPathBinomialMultiClassBase; using crtp_base_t = ElnetPathCRTPBase< ElnetPath< util::glm_type::binomial, util::mode_type::multi_class, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; public: using base_t::initialize_path; using base_t::process_point_fit; using base_t::process_path_fit; template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, IntType ne, IntType nx, const XType& x, const YType& y, GType& g, const WType& w, IntType nlam, ValueType flmin, const ULamType& ulam, ValueType thr, bool isd, bool intr, IntType maxit, IntType kopt, IntType& lmu, A0Type& a0, AOType& ao, IAType& ia, KinType& kin, ValueType& dev0, DevType& dev, ALMType& alm, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , WType , ULamType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType> pack{ // build sub-pack {beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, alm, nlp, jerr, setpb_f, int_param}, // add new members y, g, w, isd, intr, kopt, a0, dev0, dev }; crtp_base_t::fit(pack); } template elnet_point_t get_elnet_point( const FitPackType& pack, PathConfigPackType&& path_pack) const { auto& sp = pack.sub_pack; return elnet_point_t( pack.isd, pack.intr, pack.kopt, sp.thr, sp.maxit, sp.nx, sp.nlp, sp.ia, pack.g, pack.dev0, sp.x, pack.y, pack.w, sp.vp, sp.cl, sp.ju, path_pack.is, sp.int_param); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { return base_t::initialize_point(m, lmda_curr, pack, path_pack, elnet_point.abs_grad()); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/elnet_path/binomial_multi_class_group.hpp0000644000176200001440000001002214171551160030704 0ustar liggesusers#pragma once #include #include namespace glmnetpp { template struct ElnetPath< util::glm_type::binomial, util::mode_type::multi_class_group, ElnetPointPolicy> : ElnetPathBinomialMultiClassGroupBase , ElnetPathCRTPBase< ElnetPath< util::glm_type::binomial, util::mode_type::multi_class_group, ElnetPointPolicy> > { private: using base_t = ElnetPathBinomialMultiClassGroupBase; using crtp_base_t = ElnetPathCRTPBase< ElnetPath< util::glm_type::binomial, util::mode_type::multi_class_group, ElnetPointPolicy> >; using elnet_point_t = ElnetPointPolicy; public: using base_t::initialize_path; using base_t::process_point_fit; using base_t::process_path_fit; template void fit( ValueType beta, const JUType& ju, const VPType& vp, const CLType& cl, IntType ne, IntType nx, const XType& x, const YType& y, GType& g, const WType& w, IntType nlam, ValueType flmin, const ULamType& ulam, ValueType thr, bool intr, IntType maxit, const XVType& xv, IntType& lmu, A0Type& a0, AOType& ao, IAType& ia, KinType& kin, ValueType& dev0, DevType& dev, ALMType& alm, IntType& nlp, IntType& jerr, SetpbFType setpb_f, const IntParamType& int_param) const { FitPack< ValueType , JUType , VPType , CLType , IntType , XType , YType , GType , WType , ULamType , XVType , A0Type , AOType , IAType , KinType , DevType , ALMType , SetpbFType , IntParamType> pack{ { // build sub-pack {beta, ju, vp, cl, ne, nx, x, nlam, flmin, ulam, thr, maxit, lmu, ao, ia, kin, alm, nlp, jerr, setpb_f, int_param}, // add new members y, g, w, true /* not used */, intr, 2 /* not used */, a0, dev0, dev }, xv }; crtp_base_t::fit(pack); } template elnet_point_t get_elnet_point( const FitPackType& pack, const PathConfigPackType& path_pack) const { auto& sp = pack.sub_pack; auto& ssp = sp.sub_pack; return elnet_point_t( sp.intr, ssp.thr, ssp.maxit, ssp.nx, ssp.nlp, ssp.ia, sp.g, sp.dev0, ssp.x, sp.y, sp.w, pack.xv, ssp.vp, ssp.cl, ssp.ju, ssp.int_param); } template auto initialize_point( IntType m, ValueType&& lmda_curr, const FitPackType& pack, const PathConfigPackType& path_pack, const ElnetPointType& elnet_point) const { return base_t::initialize_point(m, lmda_curr, pack, path_pack, elnet_point.abs_grad()); } }; } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/util/0000755000176200001440000000000014341220705021422 5ustar liggesusersglmnet/src/glmnetpp/include/glmnetpp_bits/util/macros.hpp0000644000176200001440000000257714341220705023432 0ustar liggesusers#pragma once /* * GLMNETPP_STRONG_INLINE is a stronger version of the inline, * using __forceinline on MSVC, always_inline on GCC/clang, and otherwise just use inline. */ #ifndef GLMNETPP_STRONG_INLINE #if defined(_MSC_VER) #define GLMNETPP_STRONG_INLINE __forceinline #elif defined(__GNUC__) || defined(__clang__) #define GLMNETPP_STRONG_INLINE __attribute__((always_inline)) inline #else #define GLMNETPP_STRONG_INLINE inline #endif #endif /* * GLMNETPP_NO_INLINE forces no-inline. * using __declspec(noinline) on MSVC, noinline on GCC/clang, and otherwise don't specify an attribute. */ #ifndef GLMNETPP_NOINLINE #if defined(_MSC_VER) #define GLMNETPP_NOINLINE __declspec(noinline) #elif defined(__GNUC__) || defined(__clang__) #define GLMNETPP_NOINLINE __attribute__((noinline)) #else #define GLMNETPP_NOINLINE #endif #endif /* * Generates a CRTP interface. */ #ifndef GLMNETPP_GENERATE_CRTP #define GLMNETPP_GENERATE_CRTP(derived_t) \ derived_t& self() { return static_cast(*this); } \ const derived_t& self() const { return static_cast(*this); } #endif /* * Printing utility. */ #ifndef PRINT #define PRINT(t) \ (std::cerr << std::setprecision(18) << __LINE__ << ": " << #t << '\n' \ << t << "\n" \ << std::endl) #endif glmnet/src/glmnetpp/include/glmnetpp_bits/util/functional.hpp0000644000176200001440000000132514157246224024307 0ustar liggesusers#pragma once namespace glmnetpp { namespace util { namespace details { template struct IfElseFunc { template constexpr inline static auto eval(F1 f1, F2) { return f1(); } }; template <> struct IfElseFunc { template constexpr inline static auto eval(F1, F2 f2) { return f2(); } }; } // namespace details /* * Compile-time if-else based on condition cond. * If cond is true, f1 is executed. * Otherwise, f2 is executed. */ template constexpr inline auto if_else(F1 f1, F2 f2) { return details::IfElseFunc::eval(f1, f2); } } // namespace util } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/util/iterator/0000755000176200001440000000000014157246224023264 5ustar liggesusersglmnet/src/glmnetpp/include/glmnetpp_bits/util/iterator/counting_iterator.hpp0000644000176200001440000000314314157246224027535 0ustar liggesusers#pragma once #include #include namespace glmnetpp { namespace util { // forward declaration template struct counting_iterator; template inline constexpr bool operator==(const counting_iterator& it1, const counting_iterator& it2) { return it1.curr_ == it2.curr_; } template inline constexpr bool operator!=(const counting_iterator& it1, const counting_iterator& it2) { return it1.curr_ != it2.curr_; } template struct counting_iterator { using difference_type = int32_t; using value_type = IntType; using pointer = value_type*; using reference = IntType&; using iterator_category = std::bidirectional_iterator_tag; constexpr counting_iterator(value_type begin) : curr_(begin) {} constexpr counting_iterator& operator++() { ++curr_; return *this; } constexpr counting_iterator& operator--() { --curr_; return *this; } constexpr counting_iterator operator++(int) { auto tmp = *this; ++curr_; return tmp; } constexpr counting_iterator operator--(int) { auto tmp = *this; --curr_; return tmp; } constexpr reference operator*() { return curr_; } friend constexpr bool operator==<>(const counting_iterator&, const counting_iterator&); friend constexpr bool operator!=<>(const counting_iterator&, const counting_iterator&); private: value_type curr_; }; } // namespace util } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/util/iterator/one_to_zero_iterator.hpp0000644000176200001440000000315314140040573030221 0ustar liggesusers#pragma once #include #include namespace glmnetpp { namespace util { // forward declaration template struct one_to_zero_iterator; template inline constexpr bool operator==(const one_to_zero_iterator& it1, const one_to_zero_iterator& it2) { return it1.curr_ == it2.curr_; } template inline constexpr bool operator!=(const one_to_zero_iterator& it1, const one_to_zero_iterator& it2) { return it1.curr_ != it2.curr_; } template struct one_to_zero_iterator { using difference_type = int32_t; using value_type = IntType; using pointer = value_type*; using reference = value_type&; using iterator_category = std::bidirectional_iterator_tag; one_to_zero_iterator(const value_type* begin) : curr_(begin) {} one_to_zero_iterator& operator++() { ++curr_; return *this; } one_to_zero_iterator& operator--() { --curr_; return *this; } one_to_zero_iterator operator++(int) { auto tmp = *this; ++curr_; return tmp; } one_to_zero_iterator operator--(int) { auto tmp = *this; --curr_; return tmp; } value_type operator*() { return *curr_ - 1; } friend constexpr bool operator==<>(const one_to_zero_iterator&, const one_to_zero_iterator&); friend constexpr bool operator!=<>(const one_to_zero_iterator&, const one_to_zero_iterator&); private: const value_type* curr_; }; } // namespace util } // namespace glmnetpp glmnet/src/glmnetpp/include/glmnetpp_bits/util/type_traits.hpp0000644000176200001440000000367414140040573024514 0ustar liggesusers#pragma once #include #include #include namespace glmnetpp { namespace util { namespace details { // Dummy class that defines a conversion from F to this class. template