alakazam/0000755000175000017500000000000014140010550012153 5ustar nileshnileshalakazam/MD50000644000175000017500000001706314140010550012472 0ustar nileshnilesh0f979f0b07e7e50bcfedbdca9c8a46cd *DESCRIPTION 05496cc19f375e705327e2d20c346949 *NAMESPACE deb2e7a263333e08fe59a78d95fd704a *NEWS.md a20363eff3c5c1405e307ba89c9b5716 *R/Alakazam.R 0c7e1e6726bb43b768906db6540b2341 *R/AminoAcids.R f6e0d1fce17fe087df552218004a6be9 *R/Classes.R 132fc1597e6af3535e8e499b7fc0848e *R/Core.R c98c107724cc210453924797ffd83066 *R/Data.R 86e564b8b709c13ca72e80296a455980 *R/Deprecated.R 1f8aedcd8b4aa759cafccf9efd7b340a *R/Diversity.R c9bdee2a3a5e4916aef326268fb16468 *R/Fastq.R ad9f5412243bdeee0c8197132867b49e *R/Gene.R b82e2c9452c3c2b56c3cbe2a909aab1c *R/Lineage.R 6f8a72642969fd382cd8f88bc18e6b24 *R/RcppExports.R 19b787d486dc49f3d4bd685f649cdaed *R/Sequence.R fbbaa27ed0b98b7da94ee3ca9c6d534e *R/Topology.R def92a4fe63ca7bcdba22c3a382dbced *R/sysdata.rda 79d782ac705c38b049c403b6bfc183e1 *README.md 89d58c96de697d94880cb4047ff283fa *build/vignette.rds 8e55f0c4422bff63d5f9a73636ccd2ea *data/Example10x.rda 00d346df4989b70e5ae4029101c56941 *data/ExampleDb.rda 44a2714d7443c83b5cf8d6f7b21c252e *data/ExampleDbChangeo.rda e21a9d5c5dd3aeae144c615b41f70133 *data/ExampleTrees.rda 648553187e0894164e6f1744976f2711 *data/SingleDb.rda b034dfc6972e3bdd19b8801d55ac4b7e *inst/CITATION 19c6dfc4ea2e7e338178015f02cf5fea *inst/doc/AminoAcids-Vignette.R 960653fdeb23924745066c49cd80e31a *inst/doc/AminoAcids-Vignette.Rmd 5137460357fa011ac6d06a1648d5af0e *inst/doc/AminoAcids-Vignette.pdf 9c9260e597b740654ed681c9398c47ab *inst/doc/Diversity-Vignette.R 087ef4a9040e3219bdaa0be89dac53c6 *inst/doc/Diversity-Vignette.Rmd 6af84f13e9013219dadb59f68970921b *inst/doc/Diversity-Vignette.pdf dfd8ae51f5168ada4a2842f6b3ed4ea2 *inst/doc/Fastq-Vignette.R d38d32e47bdc65cb35e328a02640c968 *inst/doc/Fastq-Vignette.Rmd aa1884fda02e65f1c995a771c9a724fa *inst/doc/Fastq-Vignette.pdf 9d129fbe25a9f2be19b083e23549d621 *inst/doc/Files-Vignette.R e83df6ce6b04a14b1eedfc8cf85935b4 *inst/doc/Files-Vignette.Rmd 66ccccab46a604552e25a0e81ba537eb *inst/doc/Files-Vignette.pdf 316b9e92df2066a0f3f72ec7d8bb1022 *inst/doc/GeneUsage-Vignette.R 802b6f439b64a29cf7dacffb426aa24a *inst/doc/GeneUsage-Vignette.Rmd 00ebfea33148e94f15c1cc720e4d54a3 *inst/doc/GeneUsage-Vignette.pdf 4eb7985c26becc0a14f4721b5d2471d4 *inst/doc/Lineage-Vignette.R 8a9e73918c83119ac0ce6e1710c46185 *inst/doc/Lineage-Vignette.Rmd 9b1a3e750522be30425b7b468a1e584b *inst/doc/Lineage-Vignette.pdf 517f65412d2dab6d8863bf49d936325c *inst/doc/Topology-Vignette.R e7e008c78c5c17e3e46edefbb6508230 *inst/doc/Topology-Vignette.Rmd b8abebd2cce124964b411f10f4521ad4 *inst/doc/Topology-Vignette.pdf d6b9c5b466e6acfac01f41f70279e462 *inst/extdata/example_airr.tsv.gz 2fcc671e7657eed4ee9b6819004d9563 *inst/extdata/example_changeo.tab.gz 547e6794bb28cdeb9d355bea001d77ba *inst/extdata/example_quality.fastq a859f8de5695231a17a684df638aff58 *inst/extdata/example_quality.tsv 987475fe1f56c385e720c6afd798dd08 *man/ABBREV_AA.Rd 12bc2f6e5c83021ba446013f93f2c819 *man/AbundanceCurve-class.Rd 13bf964a5e2d342c91185034bf2bb2cb *man/ChangeoClone-class.Rd a84a6d4edd8410275bb1abd5a463ad32 *man/DEFAULT_COLORS.Rd e8cf58a2dee521487a4c4c64af7a793f *man/DiversityCurve-class.Rd ddc49fed05c59121028f0dabecbe5fb1 *man/EdgeTest-class.Rd 1932908e3468566f4df4b03b421a5948 *man/Example10x.Rd 407424a705d79f858d4e57db2caab842 *man/ExampleDb.Rd 40db6c9c2338f5fee3bc9d1c8c9ce4e9 *man/ExampleDbChangeo.Rd 6e69b6b8867ec8ce3d7a0df5da568603 *man/ExampleTrees.Rd 8715b738946f7c22ce18b077e0f8b724 *man/IMGT_REGIONS.Rd 4585817f760a903f7ad773fff25573f5 *man/IUPAC_CODES.Rd 4d8441622f8bbb14de45524ceecbe737 *man/MRCATest-class.Rd 3b369061d3f5a02afc617e3bdcdc6f74 *man/SingleDb.Rd 0aa152b2345c25dd9061e0f12fa69a2f *man/alakazam.Rd db19819685d940da24bd3022a9d4e8be *man/aliphatic.Rd 14d7a80970ef09bd37bda31b80e04b1d *man/alphaDiversity.Rd 9c6358d65ad5b0b301e9f1959f6d6f68 *man/aminoAcidProperties.Rd a8d03c199086e18e26fd673624ffa1a4 *man/baseTheme.Rd f9daf6784e513cb086349cd2747fc329 *man/buildPhylipLineage.Rd bbfdb6340b92a396e2b4bb5f15cd5633 *man/bulk.Rd c686bdeedc7abc3277241668dfe4bb2f *man/calcCoverage.Rd af307d6e0209dbd3acaf15c8ec4c8295 *man/calcDiversity.Rd f5d0c57b59e2dc17cc82c1d59e29d4dd *man/charge.Rd 995aabe2f257ba72862d5b226ce03c66 *man/checkColumns.Rd 7c682c648b3a05217b526850f09d1b42 *man/collapseDuplicates.Rd c3719294a76cb1dc606b0115b935be90 *man/combineIgphyml.Rd e40fd4846b4eeb3836e10b9bae834506 *man/countClones.Rd ad2f576a3db27d486cd17d1d4f617fe9 *man/countGenes.Rd f18bcc0f36fc2bad4d104181caa77fb0 *man/countPatterns.Rd 228c0d1d4a6fc2744f10623b6342ead8 *man/cpuCount.Rd 2a319c89da2b5e3d33054136acfa3d91 *man/estimateAbundance.Rd 9dd006c3a64d4b51deafeecdbb805fac *man/extractVRegion.Rd d9bcf6fa4885d0682e7f951faf7f2254 *man/getAAMatrix.Rd f3d1c78e3419a6d133ac41d1b340edb6 *man/getDNAMatrix.Rd da9177951218d3a90104d18255531f86 *man/getMRCA.Rd d97054f355e98a82cf5a5a806526ed5b *man/getPathLengths.Rd 18e41b200a453d4a5b9a28b0babdb50a *man/getPositionQuality.Rd ca899cfcaafe40a388afebe97e4bf78e *man/getSegment.Rd 76697bcf036a02fbe6ddb7f351926ca9 *man/graphToPhylo.Rd ebd8bf4d329181cffdec5346ad8721ee *man/gravy.Rd 43a957cfa4f3285543fad47363376786 *man/gridPlot.Rd 86a06adb5a779690a2d79547d8a24802 *man/groupGenes.Rd 56bbb424640d95b6e9fcb109c76df6f5 *man/isValidAASeq.Rd a9acf8807ef75725f015d91f0869fd64 *man/junctionAlignment.Rd 06c223e80ce92f32f5a2c495b9d8a6e3 *man/makeChangeoClone.Rd 16c622dc1a843365e20d348978727214 *man/makeTempDir.Rd d977ffb1591f5c93f326241acd133275 *man/maskPositionsByQuality.Rd 1eeab523917cc47d245c324644f4a387 *man/maskSeqEnds.Rd 18ef28997eb2cb4a67ae7f06c4856f6d *man/maskSeqGaps.Rd c4ee04b0eacd1e93066cc87c0520800d *man/nonsquareDist.Rd 7ff01dba7bb52b0f78b5fe6e8883faab *man/padSeqEnds.Rd 1e23c90638621a4425fc49ced382dc0c *man/pairwiseDist.Rd a93f7fde10257f4d80ca1a3db58ebcaf *man/pairwiseEqual.Rd f0e407fd33a9a29bf63240fefb36c724 *man/permuteLabels.Rd c380b34307cbbee5f99ba5e2b06f4efc *man/phyloToGraph.Rd 1464ab02cdbdde56bf43bf2fb09896c0 *man/plotAbundanceCurve.Rd 3a398759982862f3c309f41f5d93f204 *man/plotDiversityCurve.Rd 5b9a7c245bdc2ce91dad0b34777140c1 *man/plotDiversityTest.Rd b04ce7ad42cc547cad4f6d868ff121b8 *man/plotEdgeTest.Rd a5b7b7857f7d7af28283f046db9d47ce *man/plotMRCATest.Rd a2f316fb3a25fb9d7264a991800d13d8 *man/plotSubtrees.Rd 57f38289101ef92fa9db938e09766869 *man/polar.Rd 7c2c3846d5f429596501499da0c9aec9 *man/progressBar.Rd 6649627271c10d1be5d87687c649e762 *man/rarefyDiversity.Rd 749b4b8b9daca586ea634d209ecbaf74 *man/readChangeoDb.Rd ded74283da2084401944c9ed4e06ae4a *man/readFastqDb.Rd a580831b84edd79a88f34cc693d3e597 *man/readIgphyml.Rd 7cc1917257918b65d8ff2c5e0f47e93c *man/seqDist.Rd f5e27a7fa978350281f109893235c4d4 *man/seqEqual.Rd 1e0a5d095b881bde9dfa4603903b23e5 *man/sortGenes.Rd 4551455c0ab7d85eba44ccab82ddccd5 *man/stoufferMeta.Rd a70b6eafc7cbb3753f60afe631379f3e *man/summarizeSubtrees.Rd 68a832553b26782673d82eeaedea750c *man/tableEdges.Rd 3308f5dd254a011be415178f8b17b710 *man/testDiversity.Rd 30c9e033d03b8ae1362aa6bb31de7aa7 *man/testEdges.Rd 20882770192a22a72305d094fbd60a70 *man/testMRCA.Rd ed2b5d2d9fd87a693a560dd5fd7fdf7f *man/translateDNA.Rd 8242a3df101301f23473a572115fc432 *man/translateStrings.Rd 0fae9e0a11ec04f6fc43723538408b95 *man/writeChangeoDb.Rd 3b377cf40c356ccde3fa098907bfd279 *src/RcppDistance.cpp 48e120890b196a5e995ea895e4f926be *src/RcppExports.cpp 960653fdeb23924745066c49cd80e31a *vignettes/AminoAcids-Vignette.Rmd 087ef4a9040e3219bdaa0be89dac53c6 *vignettes/Diversity-Vignette.Rmd d38d32e47bdc65cb35e328a02640c968 *vignettes/Fastq-Vignette.Rmd e83df6ce6b04a14b1eedfc8cf85935b4 *vignettes/Files-Vignette.Rmd 802b6f439b64a29cf7dacffb426aa24a *vignettes/GeneUsage-Vignette.Rmd 8a9e73918c83119ac0ce6e1710c46185 *vignettes/Lineage-Vignette.Rmd e7e008c78c5c17e3e46edefbb6508230 *vignettes/Topology-Vignette.Rmd alakazam/NEWS.md0000644000175000017500000004377714137535340013312 0ustar nileshnileshVersion 1.2.0: October 31, 2021 ------------------------------------------------------------------------------- General: + Updated dependencies to R >= 4.0 and ggplot2 >= 3.3.4. + Removed lazyeval dependency. + Added `junctionAlignment`, which counts the number of nucleotides in the reference germline not present in the alignment, and the number of V and J nucleotides in the CDR3. Gene Usage: + Fixed a bug in `getFamily` where temporary designation gene names were not being correctly subset to the cluster (family) level. Lineage: + Fixed a bug in `runPhylip` which was causing `buildPhylipLineage` to fail when run on Windows. Version 1.1.0: February 6, 2021 ------------------------------------------------------------------------------- General: + Added `readFastqDb`, which reads a repertoire's .fastq file and imports the sequencing quality scores for `sequence_alignment`. Added `maskPositionsByQuality` masks positions that have a sequencing quality score lower than the specified threshold. The convenience function `getPositionQuality` will create a `data.frame` with quality scores per position. + Added a vignette describing how to read/write Change-O and AIRR Rearrangement formatted files. + Increased `dplyr` dependency to v1.0. + Added the BioConductor dependencies Biostrings, GenomicAlignments, and IRanges. + In `padSeqEnds`, the argument `mod3=TRUE` has been added so that sequences are padded to a length that is a multiple of 3. + Fixed a bug in `translateDNA` where `NA` values weren't being translated properly. Amino Acid Analysis: + Fixed a conflict in the default argument settings of `aminoAcidProperties`, which will now default to `nt=TRUE`. Diversity: + Added a parameter to `countClones` (`remove_na`) that will remove all rows with NA values in the clone column if `TRUE` (default) and issue a warning with how many were removed. If `FALSE`, those rows will be kept instead. Gene Usage: + Added the function `getLocus` to extract the locus information from the segment call. + Added the function `getChain` to define the chain from the segment or locus call. + Changed the check for empty columns in `countGenes` to give a warning instead of an error so as not to disrupt running workflows. + Fixed a bug in `getSegment` where filtering of non-localized genes was not being applied when called from `getFamily`, because the "NL" part of the name was removed before the filtering step. + Updated regular expressions in `getAllele`, `getGene`, `getFamily` and `getLocus`, to parse constant region gene names correctly. + Updated regular expressions in `getSegment` to be able to parse constant region gene names correctly and not remove the "D" from "IGHD" when `strip_d=TRUE`. Lineage: + Added `branch_length` argument to `buildPhylipLineage`, and augmented `graphToPhylo` and `phyloToGraph` to track intermediate sequence in nodes for phylo object. + Added a parameter to `countGenes` (`remove_na`) that will remove all rows with NA values in the gene column if `TRUE` (default) and issue a warning with how many were removed. If `FALSE`, those rows will be kept instead. Version 1.0.2: July 17, 2020 ------------------------------------------------------------------------------- Diversity: + Fixed a bug in `plotDiversityTest` that caused all values of `q` to appear on the plot rather than just the specified one. Gene Usage: + Fixed a major bug in the single-cell mode of `groupGenes` where the `v_call` column was being used in instead of the `j_call` column for J gene grouping. + Added support for TCR genes to `groupGenes`. + Changed the `only_igh` argument of `groupGenes` to `only_heavy`. Version 1.0.1: May 8, 2020 ------------------------------------------------------------------------------- Backwards Incompatible Changes: + Changed default expected data format from the Change-O data format to the AIRR Rearrangement standard. For example: where functions used the column name `V_CALL` (Change-O) as the default to identify the field that stored the V gene calls, they now use `v_call` (AIRR). That means, scripts that relied on default values (previously, `v_call="V_CALL"`), will now fail if calls to the functions are not updated to reflect the correct value for the data. If data are in the Change-O format, the current default value `v_call="v_call"` will fail to identify the column with the V gene calls as the column `v_call` doesn't exist. In this case, `v_call="V_CALL"` needs to be specified in the function call. + `ExampleDb` converted to the AIRR Rearrangement standard and examples updated accordingly. The legacy Change-O version is available as `ExampleDbChangeo`. + For consistency with the style of the new data format default, other field names have been updated to use the same capitalization. This change affects: - amino acid physicochemical properties (e.g. `GRAVY` to `gravy`); - `countGenes`, `countClones` (e.g., `SEQ_COUNT` to `seq_count`) - `estimateAbundance` (e.g., `RANK` to `rank`) - `groupGenes` (e.g., `VJ_GROUP` to `vj_group`) - `collapseDuplicates` and `makeChangeoClone` (e.g., `SEQUENCE_ID` to `sequence_id`, `COLLAPSE_COUNT` to `collapse_count`) - lineage tree functions (`summarizeTrees`, `getPathLengths`, `getMRCA`, `tableEdges`, `testEdges`) also return columns in lower case (e.g., `parent`, `child`, `outdegree`, `steps`, `annotation`, `pvalue`) + `IG_COLOR` names converted to official C region identifiers (IGHA, IGHD, IGHE, IGHG, IGHM, IGHK, IGHL). General: + License changed to AGPL-3. + `baseTheme` looks is now consistent across `sizing` options. + `cpuCount` will now return `1` if the core count cannot be determined. + Fixed a bug in `padSeqEnds` wherein the `pad_char` argument was being ignored. Diversity: + Fixed documentation error in diversity vignette for viewing test results. + `estimateAbundance` slot `clone_by` now contains the name of the column with the clonal group identifier, as specified in the function call. For example, if the function was called with `clone="clone_id"`, then the `clone_by` slot will be `clone_id`. Lineage: + Renamed the `buildPhylipLineage` arguments `vcall`, `jcall` and `dnapars_exec` to `v_call`, `j_call` and `phylip_exec`, respectively. Version 0.3.0: July 17, 2019 ------------------------------------------------------------------------------- Deprecated: + `rarefyDiversity` is deprecated in favor of `alphaDiversity`, which includes the same functionality. + `testDiversity` is deprecated. The test calculation have been added to the normal output of `alphaDiversity`. General: + Added `ape` and `tibble` dependencies. Lineage: + Added `readIgphyml` to read in IgPhyML output and `combineIgphyml` to combine parameter estimates across samples. + Added `graphToPhylo` and `phyloToGraph` to allow conversion between graph and phylo formats. Diversity: + Fixed a bug in `estimateAbundance` where setting the `clone` column to a non-default value produced an error. + Added rarefaction options to `estimateAbundance` through the `min_n`, `max_n`, and `uniform` arguments. + Moved the rarefaction calculation for the diversity functions into `estimateAbundance`. `alphaDiversity` will call `estimateAbundance` for bootstrapping if not provided an existing `AbundanceCurve` object. + Restructured the `DiversityCurve` and `AbundanceCurve` objects to accomodate the new diversity methods. Gene Usage: + `groupGenes` now supports grouping by V gene, J gene, and junction length (`junc_len`) as well, in addition to grouping by V gene and J gene without junction length. Also added support for single-cell input data with the addition of new arguments `cell_id`, `locus`, and `only_igh`. Version 0.2.11: September 12, 2018 ------------------------------------------------------------------------------- General: + Added `nonsquareDist` function to calculate the non-square distance matrix of sequences. + Exported some internal utility functions to make them available to dependent packages: `progressBar`, `baseTheme`, `checkColumns` and `cpuCount`. Diversity: + `estimateAbundance`, and `plotAbundanceCurve`, will now allow `group=NULL` to be specified to performance abundance calculations on ungrouped data. Gene Usage: + Added `fill` argument to `countGenes`. When set `TRUE` this adds zeroes to the `group` pairs that do not exist in the data. + Added new function `groupGenes` to group sequences sharing same V and J gene. Toplogy Analysis: + Fixed a bug in tableEdges causing it to fail when no parent/child relationships exist when specifying `indirect=TRUE`. + `makeChangeoClone` will now issue an error and terminate, instead of continuing with a warning, when all sequences are not the same length. Version 0.2.10: March 30, 2018 ------------------------------------------------------------------------------- General: + Fixed a bug in `IPUAC_AA` wherein X was not properly matching against Q. + Changed behavior in `getAAMatrix` to treat * (stop codon) as a mismatch. Version 0.2.9: March 21, 2018 ------------------------------------------------------------------------------- General: + Added explicit type casting for known columns to `readChangeoDb`. + Added the `padSeqEnds` function which pads sequences with Ns to make then equal in length. + Added verification of unique sequence IDs to `collapseDuplicates`. Diversity: + Added the `uniform` argument to `rarefyDiversity` allowing users to toggle uniform vs non-uniform sampling. + Renamed `plotAbundance` to `plotAbundanceCurve`. + Changed `estimateAbundance` return object from a data.frame to a new `AbundanceCurve` custom class. + Set default `plot` call for `AbundanceCurve` to `plotAbundanceCurve`. + Added the `annotate` argument from `plotDiversityCurve` to `plotAbundanceCurve`. + Added the `score` argument to `plotDiversityCurve` to toggle between plotting diversity or evenness. + Added the function `plotDiversityTest` to generate a simple plot of `DiversityTest` object summaries. Gene Usage: + Added the `omit_nl` argument to `getAllele`, `getGene` and `getFamily` to allow optional filtering of non-localized (NL) genes. Lineage: + Fixed a bug in `makeChangeoClone` preventing it from interpreting the `id` argument correctly. + Added the `pad_end` argument to `makeChangeoClone` to allow automatic padding of ends to make sequences the same length. Version 0.2.8: September 21, 2017 ------------------------------------------------------------------------------- General: + Updated Rcpp dependency to 0.12.12. + Added `dry` argument to `collapseDuplicates` which will annotate duplicate sequences but not remove them when set to `TRUE`. + Fixed a bug where `collapseDuplicates` was returning one sequence if all sequences were considered ambiguous. Lineage: + Added ability to change masking character and distance matrix used in `makeChangeoClone` and `buildPhylipLineage` for purposes of (optionally) treating indels as mismatches. + Fixed a bug in `buildPhylipLineage` when PHYLIP doesn't generate inferred sequences and has only one block. Version 0.2.7: June 12, 2017 ------------------------------------------------------------------------------- General: + Fixed a bug in `readChangeoDb` causing the `select` argument to do nothing. + Added progress package dependency. + Internal changes to support Rcpp 0.12.11. Gene Usage: + Renamed the count/frequency columns output by `countGenes` when the `clone` argument is specified to `CLONE_COUNT`/`CLONE_FREQ`. + Added a vignette describing basic gene usage analysis. Version 0.2.6: March 21, 2017 ------------------------------------------------------------------------------- General: + License changed to Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0). + Removed data.table dependency and added readr dependency. + Performance improvements in `readChangeoDb` and `writeChangeoDb`. Version 0.2.5: August 5, 2016 ------------------------------------------------------------------------------- General: + Fixed a bug in `seqDist()` wherein distance was not properly calculated in some sequences containing gap characters. + Added stop and gap characters to `getAAMatrix()` return matrix. Version 0.2.4: July 20, 2016 ------------------------------------------------------------------------------- General: + Added Rcpp and data.table dependencies. + Modified `readChangeoDb()` to wrap `data.table::fread()` instead of `utils::read.table()` if the input file is not compressed. + Ported `testSeqEqual()`, `getSeqDistance()` and `getSeqMatrix()` to C++ to improve performance of `collapseDuplicates()` and other dependent functions. + Renamed `testSeqEqual()`, `getSeqDistance()` and `getSeqMatrix()` to `seqEqual()`, `seqDist()` and `pairwiseDist()`, respectively. + Added `pairwiseEqual()` which creates a logical sequence distance matrix; TRUE if sequences are identical, FALSE if not, excluding Ns and gaps. + Added translation of ambiguous and gap characters to `X` in `translateDNA()`. + Fixed bug in `collapseDuplicates()` wherein the input data type sanity check would cause the vignette to fail to build under R 3.3. + Replaced the `ExampleDb.gz` file with a larger, more clonal, `ExampleDb` data object. + Replaced `ExampleTrees` with a larger set of trees. + Renamed `multiggplot()` to `gridPlot()`. Amino Acid Analysis: + Set default to `normalize=FALSE` for charge calculations to be more consistent with previously published repertoire sequencing results. Diversity Analysis: + Added a `progress` argument to `rarefyDiversity()` and `testDiversity()` to enable the (previously default) progress bar. + Fixed a bug in `estimateAbundance()` were the function would fail if there was only a single input sequence per group. + Changed column names in `data` and `summary` slots of `DiversityTest` to uppercase for consistency with other tools. + Added dispatching of `plot` to `plotDiversityCurve` for `DiversityCurve` objects. Gene Usage: + Added `sortGenes()` function to sort V(D)J genes by name or locus position. + Added `clone` argument to `countGenes()` to allow restriction of gene abundance to one gene per clone. Topology Analysis: + Added a set of functions for lineage tree topology analysis. + Added a vignette showing basic tree topology analysis. Version 0.2.3: February 22, 2016 ------------------------------------------------------------------------------- General: + Fixed a bug wherein the package would not build on R < 3.2.0 due to changes in `base::nchar()`. + Changed R dependency to R >= 3.1.2. Version 0.2.2: January 29, 2016 ------------------------------------------------------------------------------- General: + Updated license from CC BY-NC-SA 3.0 to CC BY-NC-SA 4.0. + Internal changes to conform to CRAN policies. Amino Acid Analysis: + Fixed bug where arguments for the `aliphatic()` function were not being passed through the ellipsis argument of `aminoAcidProperties()`. + Improved amino acid analysis vignette. + Added check for correctness of amino acids sequences to `aminoAcidProperties()`. + Renamed `AA_TRANS` to `ABBREV_AA`. Diversity: + Added evenness and bootstrap standard deviation to `rarefyDiversity()` output. Lineage: + Added `ExampleTrees` data with example output from `buildPhylipLineage()`. Version 0.2.1: December 18, 2015 ------------------------------------------------------------------------------- General: + Removed plyr dependency. + Added dplyr, lazyeval and stringi dependencies. + Added strict requirement for igraph version >= 1.0.0. + Renamed `getDNADistMatrix()` and `getAADistMatrix()` to `getDNAMatrix` and `getAAMatrix()`, respectively. + Added `getSeqMatrix()` which calculates a pairwise distance matrix for a set of sequences. + Modified default plot sizing to be more appropriate for export to PDF figures with 7-8 inch width. + Added `multiggplot()` function for performing multiple panel plots. Amino Acid Analysis: + Migrated amino acid property analysis from Change-O CTL to alakazam. Includes the new functions `gravy()`, `bulk()`, `aliphatic()`, `polar()`, `charge()`, `countPatterns()` and `aminoAcidProperties()`. Annotation: + Added support for unusual TCR gene names, such as 'TRGVA*01'. + Added removal of 'D' label (gene duplication) from gene names when parsed with `getSegment()`, `getAllele()`, `getGene()` and `getFamily()`. May be disabled by providing the argument `strip_d=FALSE`. + Added `countGenes()` to tabulate V(D)J allele, gene and family usage. Diversity: + Added several functions related to analysis of clone size distributions, including `countClones()`, `estimateAbundance()` and `plotAbundance()`. + Renamed `resampleDiversity()` to `rarefyDiversity()` and changed many of the internals. Bootstrapping is now performed on an inferred complete relative abundance distribution. + Added support for inclusion of copy number in clone size determination within `rarefyDiversity()` and `testDiversity()`. + Diversity scores and confidence intervals within `rarefyDiversity()` and `testDiversity()` are now calculated using the mean and standard deviation of the bootstrap realizations, rather than the median and upper/lower quantiles. + Added ability to add counts to the legend in `plotDiversityCurve()`. Version 0.2.0: June 15, 2015 ------------------------------------------------------------------------------- Initial public release. General: + Added citations for the `citation("alakazam")` command. Version 0.2.0.beta-2015-05-30: May 30, 2015 ------------------------------------------------------------------------------- Lineage: + Added more error checking to `buildPhylipLineage()`. Version 0.2.0.beta-2015-05-26: May 26, 2015 ------------------------------------------------------------------------------- Lineage: + Fixed issue where `buildPhylipLineage()` would hang on R 3.2 due to R change request PR#15508. Version 0.2.0.beta-2015-05-05: May 05, 2015 ------------------------------------------------------------------------------- Prerelease for review. alakazam/DESCRIPTION0000644000175000017500000000574614140010550013675 0ustar nileshnileshPackage: alakazam Type: Package Version: 1.2.0 Date: 2021-10-31 Authors@R: c(person("Namita", "Gupta", role=c("aut"), email="namita.gupta@yale.edu"), person("Susanna", "Marquez", role=c("aut"), email="susanna.marquez@yale.edu"), person("Nima", "Nouri", role=c("aut"), email="nima.nouri@yale.edu"), person("Ruoyi", "Jiang", role=c("aut"), email="ruoyi.jiang@yale.edu"), person("Julian", "Zhou", role=c("aut"), email="julian.zhou@bulldogs.yale.edu"), person("Kenneth", "Hoehn", role=c("aut"), email="kenneth.hoehn@yale.edu"), person("Daniel", "Gadala-Maria", role=c("ctb"), email="daniel.gadala-maria@yale.edu"), person("Edel", "Aron", role=c("ctb"), email="edel.aron@yale.edu"), person("Jason", "Vander Heiden", role=c("cre", "aut"), email="jason.vanderheiden@gmail.com"), person("Steven", "Kleinstein", role=c("aut", "cph"), email="steven.kleinstein@yale.edu")) Title: Immunoglobulin Clonal Lineage and Diversity Analysis Description: Provides methods for high-throughput adaptive immune receptor repertoire sequencing (AIRR-Seq; Rep-Seq) analysis. In particular, immunoglobulin (Ig) sequence lineage reconstruction, lineage topology analysis, diversity profiling, amino acid property analysis and gene usage. Citations: Gupta and Vander Heiden, et al (2017) , Stern, Yaari and Vander Heiden, et al (2014) . License: AGPL-3 URL: https://alakazam.readthedocs.io/ BugReports: https://bitbucket.org/kleinstein/alakazam/issues LazyData: true BuildVignettes: true VignetteBuilder: knitr, rmarkdown Encoding: UTF-8 SystemRequirements: C++11 LinkingTo: Rcpp biocViews: Software, AnnotationData Depends: R (>= 4.0), ggplot2 (>= 3.3.4) Imports: airr (>= 1.3), ape, dplyr (>= 1.0), graphics, grid, igraph (>= 1.0), Matrix, methods, progress, Rcpp (>= 0.12.12), readr, rlang, scales, seqinr, stats, stringi, tibble, tidyr (>= 1.0), utils, Biostrings (>= 2.56.0), GenomicAlignments (>= 1.24.0), IRanges (>= 2.22.2) Suggests: knitr, rmarkdown, testthat RoxygenNote: 7.1.2 Collate: 'Alakazam.R' 'AminoAcids.R' 'Classes.R' 'Core.R' 'Data.R' 'Diversity.R' 'Deprecated.R' 'Fastq.R' 'Gene.R' 'Lineage.R' 'RcppExports.R' 'Sequence.R' 'Topology.R' NeedsCompilation: yes Packaged: 2021-10-31 16:29:41 UTC; vandej27 Author: Namita Gupta [aut], Susanna Marquez [aut], Nima Nouri [aut], Ruoyi Jiang [aut], Julian Zhou [aut], Kenneth Hoehn [aut], Daniel Gadala-Maria [ctb], Edel Aron [ctb], Jason Vander Heiden [cre, aut], Steven Kleinstein [aut, cph] Maintainer: Jason Vander Heiden Repository: CRAN Date/Publication: 2021-11-01 16:10:16 UTC alakazam/README.md0000644000175000017500000000354414067624107013461 0ustar nileshnilesh[![](http://cranlogs.r-pkg.org/badges/grand-total/alakazam)](https://www.r-pkg.org/pkg/alakazam) [![](https://cranlogs.r-pkg.org/badges/alakazam)](https://www.r-pkg.org/pkg/alakazam) [![](https://img.shields.io/static/v1?label=AIRR-C%20sw-tools%20v1&message=compliant&color=008AFF&labelColor=000000&style=plastic)](https://docs.airr-community.org/en/stable/swtools/airr_swtools_standard.html) Alakazam ------------------------------------------------------------------------------- Alakazam is part of the [Immcantation](http://immcantation.readthedocs.io) analysis framework for Adaptive Immune Receptor Repertoire sequencing (AIRR-seq) and provides a set of tools to investigate lymphocyte receptor clonal lineages, diversity, gene usage, and other repertoire level properties, with a focus on high-throughput immunoglobulin (Ig) sequencing. Alakazam serves five main purposes: 1. Providing core functionality for other R packages in the Immcantation framework. This includes common tasks such as file I/O, basic DNA sequence manipulation, and interacting with V(D)J segment and gene annotations. 2. Providing an R interface for interacting with the output of the [pRESTO](http://presto.readthedocs.io) and [Change-O](http://changeo.readthedocs.io) tool suites. 3. Performing clonal abundance and diversity analysis on lymphocyte repertoires. 4. Performing lineage reconstruction on clonal populations of Ig sequences and analyzing the topology of the resultant lineage trees. 5. Performing physicochemical property analyses of lymphocyte receptor sequences. Contact ------------------------------------------------------------------------------- For help and questions please contact the [Immcantation Group](mailto:immcantation@googlegroups.com) or use the [issue tracker](https://bitbucket.org/kleinstein/alakazam/issues?status=new&status=open). alakazam/man/0000755000175000017500000000000014136536357012755 5ustar nileshnileshalakazam/man/gridPlot.Rd0000644000175000017500000000074414136536357015035 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{gridPlot} \alias{gridPlot} \title{Plot multiple ggplot objects} \usage{ gridPlot(..., ncol = 1) } \arguments{ \item{...}{ggplot objects to plot.} \item{ncol}{number of columns in the plot.} } \description{ Plots multiple ggplot objects in an equally sized grid. } \references{ Modified from: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) } \seealso{ \link{ggplot}. } alakazam/man/calcCoverage.Rd0000644000175000017500000000222214136536357015620 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{calcCoverage} \alias{calcCoverage} \title{Calculate sample coverage} \usage{ calcCoverage(x, r = 1) } \arguments{ \item{x}{numeric vector of abundance counts.} \item{r}{coverage order to calculate.} } \value{ The sample coverage of the given order \code{r}. } \description{ \code{calcCoverage} calculates the sample coverage estimate, a measure of sample completeness, for varying orders using the method of Chao et al, 2015, falling back to the Chao1 method in the first order case. } \examples{ # Calculate clone sizes clones <- countClones(ExampleDb, groups="sample_id") # Calculate 1first order coverage for a single sample calcCoverage(clones$seq_count[clones$sample_id == "+7d"]) } \references{ \enumerate{ \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. Scand J Stat. 1984 11, 265270. \item Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. } } \seealso{ Used by \link{alphaDiversity}. } alakazam/man/plotEdgeTest.Rd0000644000175000017500000000332014136536357015645 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{plotEdgeTest} \alias{plotEdgeTest} \title{Plot the results of an edge permutation test} \usage{ plotEdgeTest( data, color = "black", main_title = "Edge Test", style = c("histogram", "cdf"), silent = FALSE, ... ) } \arguments{ \item{data}{\link{EdgeTest} object returned by \link{testEdges}.} \item{color}{color of the histogram or lines.} \item{main_title}{string specifying the plot title.} \item{style}{type of plot to draw. One of: \itemize{ \item \code{"histogram"}: histogram of the edge count distribution with a red dotted line denoting the observed value. \item \code{"cdf"}: cumulative distribution function of edge counts with a red dotted line denoting the observed value and a blue dotted line indicating the p-value. }} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotEdgeTest} plots the results of an edge permutation test performed with \code{testEdges} as either a histogram or cumulative distribution function. } \examples{ \donttest{ # Define example tree set graphs <- ExampleTrees[1-10] # Perform edge test on isotypes x <- testEdges(graphs, "c_call", nperm=10) # Plot plotEdgeTest(x, color="steelblue", style="hist") plotEdgeTest(x, style="cdf") } } \seealso{ See \link{testEdges} for performing the test. } alakazam/man/progressBar.Rd0000644000175000017500000000053614136536357015541 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{progressBar} \alias{progressBar} \title{Standard progress bar} \usage{ progressBar(n) } \arguments{ \item{n}{maximum number of ticks} } \value{ A \link[progress]{progress_bar} object. } \description{ \code{progressBar} defines a common progress bar format. } alakazam/man/phyloToGraph.Rd0000644000175000017500000000334614136536357015672 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Lineage.R \name{phyloToGraph} \alias{phyloToGraph} \title{Convert a tree in ape \code{phylo} format to igraph \code{graph} format.} \usage{ phyloToGraph(phylo, germline = "Germline") } \arguments{ \item{phylo}{An ape \code{phylo} object.} \item{germline}{If specified, places specified tip sequence as the direct ancestor of the tree} } \value{ A \code{graph} object representing the input tree. } \description{ \code{phyloToGraph} converts a tree in \code{phylo} format to and \code{graph} format. } \details{ Convert from phylo to graph object. Uses the node.label vector to label internal nodes. Nodes may rotate but overall topology will remain constant. } \examples{ \dontrun{ library(igraph) library(ape) #convert to phylo phylo = graphToPhylo(graph) #plot tree using ape plot(phylo,show.node.label=TRUE) #store as newick tree write.tree(phylo,file="tree.newick") #read in tree from newick file phylo_r = read.tree("tree.newick") #convert to igraph graph_r = phyloToGraph(phylo_r,germline="Germline") #plot graph - same as before, possibly rotated plot(graph_r,layout=layout_as_tree) } } \references{ \enumerate{ \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody Lineages. Genetics 2017 206(1):417-427 https://doi.org/10.1534/genetics.116.196303 \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - Repertoire-wide phylogenetic models of B cell molecular evolution reveal evolutionary signatures of aging and vaccination. bioRxiv 2019 https://doi.org/10.1101/558825 } } alakazam/man/countPatterns.Rd0000644000175000017500000000256614136536357016126 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{countPatterns} \alias{countPatterns} \title{Count sequence patterns} \usage{ countPatterns(seq, patterns, nt = TRUE, trim = FALSE, label = "region") } \arguments{ \item{seq}{character vector of either DNA or amino acid sequences.} \item{patterns}{list of sequence patterns to count in each sequence. If the list is named, then names will be assigned as the column names of output data.frame.} \item{nt}{if \code{TRUE} then \code{seq} are DNA sequences and and will be translated before performing the pattern search.} \item{trim}{if \code{TRUE} remove the first and last codon or amino acid from each sequence before the pattern search. If \code{FALSE} do not modify the input sequences.} \item{label}{string defining a label to add as a prefix to the output column names.} } \value{ A data.frame containing the fraction of times each sequence pattern was found. } \description{ \code{countPatterns} counts the fraction of times a set of character patterns occur in a set of sequences. } \examples{ seq <- c("TGTCAACAGGCTAACAGTTTCCGGACGTTC", "TGTCAGCAATATTATATTGCTCCCTTCACTTTC", "TGTCAAAAGTATAACAGTGCCCCCTGGACGTTC") patterns <- c("A", "V", "[LI]") names(patterns) <- c("arg", "val", "iso_leu") countPatterns(seq, patterns, trim=TRUE, label="cdr3") } alakazam/man/estimateAbundance.Rd0000644000175000017500000000525314136536357016665 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{estimateAbundance} \alias{estimateAbundance} \title{Estimates the complete clonal relative abundance distribution} \usage{ estimateAbundance( data, clone = "clone_id", copy = NULL, group = NULL, min_n = 30, max_n = NULL, uniform = TRUE, ci = 0.95, nboot = 200, progress = FALSE ) } \arguments{ \item{data}{data.frame with Change-O style columns containing clonal assignments.} \item{clone}{name of the \code{data} column containing clone identifiers.} \item{copy}{name of the \code{data} column containing copy numbers for each sequence. If \code{copy=NULL} (the default), then clone abundance is determined by the number of sequences. If a \code{copy} column is specified, then clone abundances is determined by the sum of copy numbers within each clonal group.} \item{group}{name of the \code{data} column containing group identifiers. If \code{NULL} then no grouping is performed and the \code{group} column of the output will contain the value \code{NA} for each row.} \item{min_n}{minimum number of observations to sample. A group with less observations than the minimum is excluded.} \item{max_n}{maximum number of observations to sample. If \code{NULL} then no maximum is set.} \item{uniform}{if \code{TRUE} then uniformly resample each group to the same number of observations. If \code{FALSE} then allow each group to be resampled to its original size or, if specified, \code{max_size}.} \item{ci}{confidence interval to calculate; the value must be between 0 and 1.} \item{nboot}{number of bootstrap realizations to generate.} \item{progress}{if \code{TRUE} show a progress bar.} } \value{ A \link{AbundanceCurve} object summarizing the abundances. } \description{ \code{estimateAbundance} estimates the complete clonal relative abundance distribution and confidence intervals on clone sizes using bootstrapping. } \examples{ abund <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) } \references{ \enumerate{ \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. Scand J Stat. 1984 11, 265270. \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: A framework for sampling and estimation in species diversity studies. Ecol Monogr. 2014 84:45-67. \item Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. } } \seealso{ See \link{plotAbundanceCurve} for plotting of the abundance distribution. See \link{alphaDiversity} for a similar application to clonal diversity. } alakazam/man/combineIgphyml.Rd0000644000175000017500000000415214136536357016214 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Lineage.R \name{combineIgphyml} \alias{combineIgphyml} \title{Combine IgPhyML object parameters into a dataframe} \usage{ combineIgphyml(iglist, format = c("wide", "long")) } \arguments{ \item{iglist}{list of igphyml objects returned by \link{readIgphyml}. Each must have an \code{id} column in its \code{param} attribute, which can be added automatically using the \code{id} option of \code{readIgphyml}.} \item{format}{string specifying whether each column of the resulting data.frame should represent a parameter (\code{wide}) or if there should only be three columns; i.e. id, varable, and value (\code{long}).} } \value{ A data.frame containing HLP model parameter estimates for all igphyml objects. Only parameters shared among all objects will be returned. } \description{ \code{combineIgphyml} combines IgPhyML object parameters into a data.frame. } \details{ \code{combineIgphyml} combines repertoire-wide parameter estimates from mutliple igphyml objects produced by readIgphyml into a dataframe that can be easily used for plotting and other hypothesis testing analyses. All igphyml objects used must have an "id" column in their \code{param} attribute, which can be added automatically from the \code{id} flag of \code{readIgphyml}. } \examples{ \dontrun{ # Read in and combine two igphyml runs s1 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="+7d") s2 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="s2") combineIgphyml(list(s1, s2)) } } \references{ \enumerate{ \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody Lineages. Genetics 2017 206(1):417-427 https://doi.org/10.1534/genetics.116.196303 \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - Repertoire-wide phylogenetic models of B cell molecular evolution reveal evolutionary signatures of aging and vaccination. bioRxiv 2019 https://doi.org/10.1101/558825 } } \seealso{ \link{readIgphyml} } alakazam/man/getPathLengths.Rd0000644000175000017500000000261114136536357016165 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{getPathLengths} \alias{getPathLengths} \title{Calculate path lengths from the tree root} \usage{ getPathLengths(graph, root = "Germline", field = NULL, exclude = NULL) } \arguments{ \item{graph}{igraph object containing an annotated lineage tree.} \item{root}{name of the root (germline) node.} \item{field}{annotation field to use for exclusion of nodes from step count.} \item{exclude}{annotation values specifying which nodes to exclude from step count. If \code{NULL} consider all nodes. This does not affect the weighted (distance) path length calculation.} } \value{ A data.frame with columns: \itemize{ \item \code{name}: node name \item \code{steps}: path length as the number of nodes traversed \item \code{distance}: path length as the sum of edge weights } } \description{ \code{getPathLengths} calculates the unweighted (number of steps) and weighted (distance) path lengths from the root of a lineage tree. } \examples{ # Define example graph graph <- ExampleTrees[[24]] # Consider all nodes getPathLengths(graph, root="Germline") # Exclude nodes without an isotype annotation from step count getPathLengths(graph, root="Germline", field="c_call", exclude=NA) } \seealso{ See \link{buildPhylipLineage} for generating input trees. } alakazam/man/pairwiseEqual.Rd0000644000175000017500000000167614136536357016071 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/RcppExports.R \name{pairwiseEqual} \alias{pairwiseEqual} \title{Calculate pairwise equivalence between sequences} \usage{ pairwiseEqual(seq) } \arguments{ \item{seq}{character vector containing a DNA sequences.} } \value{ A logical matrix of equivalence between each entry in \code{seq}. Values are \code{TRUE} when sequences are equivalent and \code{FALSE} when they are not. } \description{ \code{pairwiseEqual} determined pairwise equivalence between a pairs in a set of sequences, excluding ambiguous positions (Ns and gaps). } \examples{ # Gaps and Ns will match any character seq <- c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C", E="NTGGG") d <- pairwiseEqual(seq) rownames(d) <- colnames(d) <- seq d } \seealso{ Uses \link{seqEqual} for testing equivalence between pairs. See \link{pairwiseDist} for generating a sequence distance matrix. } alakazam/man/groupGenes.Rd0000644000175000017500000001247014136536357015366 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Gene.R \name{groupGenes} \alias{groupGenes} \title{Group sequences by gene assignment} \usage{ groupGenes( data, v_call = "v_call", j_call = "j_call", junc_len = NULL, cell_id = NULL, locus = "locus", only_heavy = TRUE, first = FALSE ) } \arguments{ \item{data}{data.frame containing sequence data.} \item{v_call}{name of the column containing the heavy/long chain V-segment allele calls.} \item{j_call}{name of the column containing the heavy/long chain J-segment allele calls.} \item{junc_len}{name of column containing the junction length. If \code{NULL} then 1-stage partitioning is perform considering only the V and J genes is performed. See Details for further clarification.} \item{cell_id}{name of the column containing cell identifiers or barcodes. If specified, grouping will be performed in single-cell mode with the behavior governed by the \code{locus} and \code{only_heavy} arguments. If set to \code{NULL} then the bulk sequencing data is assumed.} \item{locus}{name of the column containing locus information. Only applicable to single-cell data. Ignored if \code{cell_id=NULL}.} \item{only_heavy}{use only the IGH (BCR) or TRB/TRD (TCR) sequences for grouping. Only applicable to single-cell data. Ignored if \code{cell_id=NULL}.} \item{first}{if \code{TRUE} only the first call of the gene assignments is used. if \code{FALSE} the union of ambiguous gene assignments is used to group all sequences with any overlapping gene calls.} } \value{ Returns a modified data.frame with disjoint union indices in a new \code{vj_group} column. If \code{junc_len} is supplied, the grouping this \code{vj_group} will have been based on V, J, and junction length simultaneously. However, the output column name will remain \code{vj_group}. The output \code{v_call}, \code{j_call}, \code{cell_id}, and \code{locus} columns will be converted to type \code{character} if they were of type \code{factor} in the input \code{data}. } \description{ \code{groupGenes} will group rows by shared V and J gene assignments, and optionally also by junction lengths. IGH:IGK/IGL, TRB:TRA, and TRD:TRG paired single-cell BCR/TCR sequencing and unpaired bulk sequencing (IGH, TRB, TRD chain only) are supported. In the case of ambiguous (multiple) gene assignments, the grouping may be specified to be a union across all ambiguous V and J gene pairs, analogous to single-linkage clustering (i.e., allowing for chaining). } \details{ To invoke single-cell mode the \code{cell_id} argument must be specified and the \code{locus} column must be correct. Otherwise, \code{groupGenes} will be run with bulk sequencing assumptions, using all input sequences regardless of the values in the \code{locus} column. Values in the \code{locus} column must be one of \code{c("IGH", "IGI", "IGK", "IGL")} for BCR or \code{c("TRA", "TRB", "TRD", "TRG")} for TCR sequences. Otherwise, the function returns an error message and stops. Under single-cell mode with paired chained sequences, there is a choice of whether grouping should be done by (a) using IGH (BCR) or TRB/TRD (TCR) sequences only or (b) using IGH plus IGK/IGL (BCR) or TRB/TRD plus TRA/TRG (TCR). This is governed by the \code{only_heavy} argument. Specifying \code{junc_len} will force \code{groupGenes} to perform a 1-stage partitioning of the sequences/cells based on V gene, J gene, and junction length simultaneously. If \code{junc_len=NULL} (no column specified), then \code{groupGenes} performs only the first stage of a 2-stage partitioning in which sequences/cells are partitioned in the first stage based on V gene and J gene, and then in the second stage further splits the groups based on junction length (the second stage must be performed independently, as this only returns the first stage results). In the input \code{data}, the \code{v_call}, \code{j_call}, \code{cell_id}, and \code{locus} columns, if present, must be of type \code{character} (as opposed to \code{factor}). It is assumed that ambiguous gene assignments are separated by commas. All rows containing \code{NA} values in any of the \code{v_call}, \code{j_call}, and \code{junc_len} (if \code{junc_len != NULL}) columns will be removed. A warning will be issued when a row containing an \code{NA} is removed. } \section{Expectations for single-cell data}{ Single-cell paired chain data assumptions: \itemize{ \item every row represents a sequence (chain). \item heavy/long and light/short chains of the same cell are linked by \code{cell_id}. \item the value in \code{locus} column indicates whether the chain is the heavy/long or light/short chain. \item each cell possibly contains multiple heavy/long and/or light/short chains. \item every chain has its own V(D)J annotation, in which ambiguous V(D)J annotations, if any, are separated by a comma. } Single-cell example: \itemize{ \item A cell has 1 heavy chain and 2 light chains. \item There should be 3 rows corresponding to this cell. \item One of the light chains may have an ambiguous V annotation which looks like \code{"Homsap IGKV1-39*01 F,Homsap IGKV1D-39*01 F"}. } } \examples{ # Group by genes db <- groupGenes(ExampleDb) head(db$vj_group) } alakazam/man/gravy.Rd0000644000175000017500000000267614136536357014407 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{gravy} \alias{gravy} \title{Calculates the hydrophobicity of amino acid sequences} \usage{ gravy(seq, hydropathy = NULL) } \arguments{ \item{seq}{vector of strings containing amino acid sequences.} \item{hydropathy}{named numerical vector defining hydropathy index values for each amino acid, where names are single-letter amino acid character codes. If \code{NULL}, then the Kyte & Doolittle scale is used.} } \value{ A vector of gravy scores for the sequence(s). } \description{ \code{gravy} calculates the Grand Average of Hydrophobicity (gravy) index of amino acid sequences using the method of Kyte & Doolittle. Non-informative positions are excluded, where non-informative is defined as any character in \code{c("X", "-", ".", "*")}. } \examples{ # Default scale seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") gravy(seq) # Use the Kidera et al, 1985 scores from the seqinr package library(seqinr) data(aaindex) x <- aaindex[["KIDA850101"]]$I # Rename the score vector to use single-letter codes names(x) <- translateStrings(names(x), ABBREV_AA) # Calculate hydrophobicity gravy(seq, hydropathy=x) } \references{ \enumerate{ \item Kyte J, Doolittle RF. A simple method for displaying the hydropathic character of a protein. J Mol Biol. 157, 105-32 (1982). } } \seealso{ For additional hydrophobicity indices see \code{\link[seqinr]{aaindex}}. } alakazam/man/alakazam.Rd0000644000175000017500000001146614136536357015035 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Alakazam.R \docType{package} \name{alakazam} \alias{alakazam} \title{The alakazam package} \description{ \code{alakazam} in a member of the Immcantation framework of tools and serves five main purposes: \itemize{ \item Providing core functionality for other R packages in Immcantation. This includes common tasks such as file I/O, basic DNA sequence manipulation, and interacting with V(D)J segment and gene annotations. \item Providing an R interface for interacting with the output of the pRESTO and Change-O tool suites. \item Performing clonal abundance and diversity analysis on lymphocyte repertoires. \item Performing lineage reconstruction on clonal populations of immunoglobulin (Ig) sequences. \item Performing physicochemical property analyses of lymphocyte receptor sequences. } For additional details regarding the use of the \code{alakazam} package see the vignettes:\cr \code{browseVignettes("alakazam")} } \section{File I/O}{ \itemize{ \item \link{readChangeoDb}: Input Change-O style files. \item \link{writeChangeoDb}: Output Change-O style files. } } \section{Sequence cleaning}{ \itemize{ \item \link{maskSeqEnds}: Mask ragged ends. \item \link{maskSeqGaps}: Mask gap characters. \item \link{collapseDuplicates}: Remove duplicate sequences. } } \section{Lineage reconstruction}{ \itemize{ \item \link{makeChangeoClone}: Clean sequences for lineage reconstruction. \item \link{buildPhylipLineage}: Perform lineage reconstruction of Ig sequences. } } \section{Lineage topology analysis}{ \itemize{ \item \link{tableEdges}: Tabulate annotation relationships over edges. \item \link{testEdges}: Significance testing of annotation edges. \item \link{testMRCA}: Significance testing of MRCA annotations. \item \link{summarizeSubtrees}: Various summary statistics for subtrees. \item \link{plotSubtrees}: Plot distributions of summary statistics for a population of trees. } } \section{Diversity analysis}{ \itemize{ \item \link{countClones}: Calculate clonal abundance. \item \link{estimateAbundance}: Bootstrap clonal abundance curves. \item \link{alphaDiversity}: Generate clonal alpha diversity curves. \item \link{plotAbundanceCurve}: Plot clone size distribution as a rank-abundance \item \link{plotDiversityCurve}: Plot clonal diversity curves. \item \link{plotDiversityTest}: Plot testing at given diversity hill indicex. } } \section{Ig and TCR sequence annotation}{ \itemize{ \item \link{countGenes}: Calculate Ig and TCR allele, gene and family usage. \item \link{extractVRegion}: Extract CDRs and FWRs sub-sequences. \item \link{getAllele}: Get V(D)J allele names. \item \link{getGene}: Get V(D)J gene names. \item \link{getFamily}: Get V(D)J family names. \item \link{junctionAlignment}: Junction alignment properties } } \section{Sequence distance calculation}{ \itemize{ \item \link{seqDist}: Calculate Hamming distance between two sequences. \item \link{seqEqual}: Test two sequences for equivalence. \item \link{pairwiseDist}: Calculate a matrix of pairwise Hamming distances for a set of sequences. \item \link{pairwiseEqual}: Calculate a logical matrix of pairwise equivalence for a set of sequences. } } \section{Amino acid propertes}{ \itemize{ \item \link{translateDNA}: Translate DNA sequences to amino acid sequences. \item \link{aminoAcidProperties}: Calculate various physicochemical properties of amino acid sequences. \item \link{countPatterns}: Count patterns in sequences. } } \references{ \enumerate{ \item Vander Heiden JA, Yaari G, et al. pRESTO: a toolkit for processing high-throughput sequencing raw reads of lymphocyte receptor repertoires. Bioinformatics. 2014 30(13):1930-2. \item Stern JNH, Yaari G, Vander Heiden JA, et al. B cells populating the multiple sclerosis brain mature in the draining cervical lymph nodes. Sci Transl Med. 2014 6(248):248ra107. \item Wu Y-CB, et al. Influence of seasonal exposure to grass pollen on local and peripheral blood IgE repertoires in patients with allergic rhinitis. J Allergy Clin Immunol. 2014 134(3):604-12. \item Gupta NT, Vander Heiden JA, et al. Change-O: a toolkit for analyzing large-scale B cell immunoglobulin repertoire sequencing data. Bioinformatics. 2015 Oct 15;31(20):3356-8. } } alakazam/man/buildPhylipLineage.Rd0000644000175000017500000001730614136536357017025 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Lineage.R \name{buildPhylipLineage} \alias{buildPhylipLineage} \title{Infer an Ig lineage using PHYLIP} \usage{ buildPhylipLineage( clone, phylip_exec, dist_mat = getDNAMatrix(gap = 0), rm_temp = FALSE, verbose = FALSE, temp_path = NULL, onetree = FALSE, branch_length = c("mutations", "distance") ) } \arguments{ \item{clone}{\link{ChangeoClone} object containing clone data.} \item{phylip_exec}{absolute path to the PHYLIP dnapars executable.} \item{dist_mat}{character distance matrix to use for reassigning edge weights. Defaults to a Hamming distance matrix returned by \link{getDNAMatrix} with \code{gap=0}. If gap characters, \code{c("-", ".")}, are assigned a value of -1 in \code{dist_mat} then contiguous gaps of any run length, which are not present in both sequences, will be counted as a distance of 1. Meaning, indels of any length will increase the sequence distance by 1. Gap values other than -1 will return a distance that does not consider indels as a special case.} \item{rm_temp}{if \code{TRUE} delete the temporary directory after running dnapars; if \code{FALSE} keep the temporary directory.} \item{verbose}{if \code{FALSE} suppress the output of dnapars; if \code{TRUE} STDOUT and STDERR of dnapars will be passed to the console.} \item{temp_path}{specific path to temp directory if desired.} \item{onetree}{if \code{TRUE} save only one tree.} \item{branch_length}{specifies how to define branch lengths; one of \code{"mutations"} or \code{"distance"}. If set to \code{"mutations"} (default), then branch lengths represent the number of mutations between nodes. If set to \code{"distance"}, then branch lengths represent the expected number of mutations per site, unaltered from PHYLIP output.} } \value{ An igraph \code{graph} object defining the Ig lineage tree. Each unique input sequence in \code{clone} is a vertex of the tree, with additional vertices being either the germline (root) sequences or inferred intermediates. The \code{graph} object has the following attributes. Vertex attributes: \itemize{ \item \code{name}: value in the \code{sequence_id} column of the \code{data} slot of the input \code{clone} for observed sequences. The germline (root) vertex is assigned the name "Germline" and inferred intermediates are assigned names with the format {"Inferred1", "Inferred2", ...}. \item \code{sequence}: value in the \code{sequence} column of the \code{data} slot of the input \code{clone} for observed sequences. The germline (root) vertex is assigned the sequence in the \code{germline} slot of the input \code{clone}. The sequence of inferred intermediates are extracted from the dnapars output. \item \code{label}: same as the \code{name} attribute. } Additionally, each other column in the \code{data} slot of the input \code{clone} is added as a vertex attribute with the attribute name set to the source column name. For the germline and inferred intermediate vertices, these additional vertex attributes are all assigned a value of \code{NA}. Edge attributes: \itemize{ \item \code{weight}: Hamming distance between the \code{sequence} attributes of the two vertices. \item \code{label}: same as the \code{weight} attribute. } Graph attributes: \itemize{ \item \code{clone}: clone identifier from the \code{clone} slot of the input \code{ChangeoClone}. \item \code{v_gene}: V-segment gene call from the \code{v_gene} slot of the input \code{ChangeoClone}. \item \code{j_gene}: J-segment gene call from the \code{j_gene} slot of the input \code{ChangeoClone}. \item \code{junc_len}: junction length (nucleotide count) from the \code{junc_len} slot of the input \code{ChangeoClone}. Alternatively, this function will return an \code{phylo} object, which is compatible with the ape package. This object will contain reconstructed ancestral sequences in \code{nodes} attribute. } } \description{ \code{buildPhylipLineage} reconstructs an Ig lineage via maximum parsimony using the dnapars application, or maximum liklihood using the dnaml application of the PHYLIP package. } \details{ \code{buildPhylipLineage} builds the lineage tree of a set of unique Ig sequences via maximum parsimony through an external call to the dnapars application of the PHYLIP package. dnapars is called with default algorithm options, except for the search option, which is set to "Rearrange on one best tree". The germline sequence of the clone is used for the outgroup. Following tree construction using dnapars, the dnapars output is modified to allow input sequences to appear as internal nodes of the tree. Intermediate sequences inferred by dnapars are replaced by children within the tree having a Hamming distance of zero from their parent node. With the default \code{dist_mat}, the distance calculation allows IUPAC ambiguous character matches, where an ambiguous character has distance zero to any character in the set of characters it represents. Distance calculation and movement of child nodes up the tree is repeated until all parent-child pairs have a distance greater than zero between them. The germline sequence (outgroup) is moved to the root of the tree and excluded from the node replacement processes, which permits the trunk of the tree to be the only edge with a distance of zero. Edge weights of the resultant tree are assigned as the distance between each sequence. } \examples{ \dontrun{ # Preprocess clone db <- subset(ExampleDb, clone_id == 3138) clone <- makeChangeoClone(db, text_fields=c("sample_id", "c_call"), num_fields="duplicate_count") # Run PHYLIP and process output phylip_exec <- "~/apps/phylip-3.695/bin/dnapars" graph <- buildPhylipLineage(clone, phylip_exec, rm_temp=TRUE) # Plot graph with a tree layout library(igraph) plot(graph, layout=layout_as_tree, vertex.label=V(graph)$c_call, vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") # To consider each indel event as a mutation, change the masking character # and distance matrix clone <- makeChangeoClone(db, text_fields=c("sample_id", "c_call"), num_fields="duplicate_count", mask_char="-") graph <- buildPhylipLineage(clone, phylip_exec, dist_mat=getDNAMatrix(gap=-1), rm_temp=TRUE) } } \references{ \enumerate{ \item Felsenstein J. PHYLIP - Phylogeny Inference Package (Version 3.2). Cladistics. 1989 5:164-166. \item Stern JNH, Yaari G, Vander Heiden JA, et al. B cells populating the multiple sclerosis brain mature in the draining cervical lymph nodes. Sci Transl Med. 2014 6(248):248ra107. } } \seealso{ Takes as input a \link{ChangeoClone}. Temporary directories are created with \link{makeTempDir}. Distance is calculated using \link{seqDist}. See the igraph \link[igraph]{graph} documentation for how to work with \code{graph} objects. } alakazam/man/testEdges.Rd0000644000175000017500000000276614136536357015206 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{testEdges} \alias{testEdges} \title{Tests for parent-child annotation enchrichment in lineage trees} \usage{ testEdges( graphs, field, indirect = FALSE, exclude = c("Germline", NA), nperm = 200, progress = FALSE ) } \arguments{ \item{graphs}{list of igraph objects with vertex annotations.} \item{field}{string defining the annotation field to permute.} \item{indirect}{if \code{FALSE} count direct connections (edges) only. If \code{TRUE} walk through any nodes with annotations specified in the \code{argument} to count indirect connections. Specifying \code{indirect=TRUE} with \code{exclude=NULL} will have no effect.} \item{exclude}{vector of strings defining \code{field} values to exclude from permutation.} \item{nperm}{number of permutations to perform.} \item{progress}{if \code{TRUE} show a progress bar.} } \value{ An \link{EdgeTest} object containing the test results and permutation realizations. } \description{ \code{testEdges} performs a permutation test on a set of lineage trees to determine the significance of an annotation's association with parent-child relationships. } \examples{ \donttest{ # Define example tree set graphs <- ExampleTrees[1-10] # Perform edge test on isotypes x <- testEdges(graphs, "c_call", nperm=10) print(x) } } \seealso{ Uses \link{tableEdges} and \link{permuteLabels}. See \link{plotEdgeTest} for plotting the permutation distributions. } alakazam/man/maskSeqEnds.Rd0000644000175000017500000000331214136536357015461 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{maskSeqEnds} \alias{maskSeqEnds} \title{Masks ragged leading and trailing edges of aligned DNA sequences} \usage{ maskSeqEnds(seq, mask_char = "N", max_mask = NULL, trim = FALSE) } \arguments{ \item{seq}{character vector of DNA sequence strings.} \item{mask_char}{character to use for masking.} \item{max_mask}{the maximum number of characters to mask. If set to 0 then no masking will be performed. If set to \code{NULL} then the upper masking bound will be automatically determined from the maximum number of observed leading or trailing \code{"N"} characters amongst all strings in \code{seq}.} \item{trim}{if \code{TRUE} leading and trailing characters will be cut rather than masked with \code{"N"} characters.} } \value{ A modified \code{seq} vector with masked (or optionally trimmed) sequences. } \description{ \code{maskSeqEnds} takes a vector of DNA sequences, as character strings, and replaces the leading and trailing characters with \code{"N"} characters to create a sequence vector with uniformly masked outer sequence segments. } \examples{ # Default behavior uniformly masks ragged ends seq <- c("CCCCTGGG", "NAACTGGN", "NNNCTGNN") maskSeqEnds(seq) # Does nothing maskSeqEnds(seq, max_mask=0) # Cut ragged sequence ends maskSeqEnds(seq, trim=TRUE) # Set max_mask to limit extent of masking and trimming maskSeqEnds(seq, max_mask=1) maskSeqEnds(seq, max_mask=1, trim=TRUE) # Mask dashes instead of Ns seq <- c("CCCCTGGG", "-AACTGG-", "---CTG--") maskSeqEnds(seq, mask_char="-") } \seealso{ See \link{maskSeqGaps} for masking internal gaps. See \link{padSeqEnds} for padding sequence of unequal length. } alakazam/man/seqEqual.Rd0000644000175000017500000000221714136536357015026 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/RcppExports.R \name{seqEqual} \alias{seqEqual} \title{Test DNA sequences for equality.} \usage{ seqEqual(seq1, seq2, ignore = as.character(c("N", "-", ".", "?"))) } \arguments{ \item{seq1}{character string containing a DNA sequence.} \item{seq2}{character string containing a DNA sequence.} \item{ignore}{vector of characters to ignore when testing for equality. Default is to ignore c("N",".","-","?")} } \value{ Returns \code{TRUE} if sequences are equal and \code{FALSE} if they are not. Sequences of unequal length will always return \code{FALSE} regardless of their character values. } \description{ \code{seqEqual} checks if two DNA sequences are identical. } \examples{ # Ignore gaps seqEqual("ATG-C", "AT--C") seqEqual("ATGGC", "ATGGN") seqEqual("AT--T", "ATGGC") # Ignore only Ns seqEqual("ATG-C", "AT--C", ignore="N") seqEqual("ATGGC", "ATGGN", ignore="N") seqEqual("AT--T", "ATGGC", ignore="N") } \seealso{ Used by \link{pairwiseEqual} within \link{collapseDuplicates}. See \link{seqDist} for calculation Hamming distances between sequences. } alakazam/man/sortGenes.Rd0000644000175000017500000000256214136536357015222 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Gene.R \name{sortGenes} \alias{sortGenes} \title{Sort V(D)J genes} \usage{ sortGenes(genes, method = c("name", "position")) } \arguments{ \item{genes}{vector of strings respresenting V(D)J gene names.} \item{method}{string defining the method to use for sorting genes. One of: \itemize{ \item \code{"name"}: sort in lexicographic order. Order is by family first, then gene, and then allele. \item \code{"position"}: sort by position in the locus, as determined by the final two numbers in the gene name. Non-localized genes are assigned to the highest positions. }} } \value{ A sorted character vector of gene names. } \description{ \code{sortGenes} sorts a vector of V(D)J gene names by either lexicographic ordering or locus position. } \examples{ # Create a list of allele names genes <- c("IGHV1-69D*01","IGHV1-69*01","IGHV4-38-2*01","IGHV1-69-2*01", "IGHV2-5*01","IGHV1-NL1*01", "IGHV1-2*01,IGHV1-2*05", "IGHV1-2", "IGHV1-2*02", "IGHV1-69*02") # Sort genes by name sortGenes(genes) # Sort genes by position in the locus sortGenes(genes, method="pos") } \seealso{ See \code{getAllele}, \code{getGene} and \code{getFamily} for parsing gene names. } alakazam/man/makeChangeoClone.Rd0000644000175000017500000001374414136536357016440 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Lineage.R \name{makeChangeoClone} \alias{makeChangeoClone} \title{Generate a ChangeoClone object for lineage construction} \usage{ makeChangeoClone( data, id = "sequence_id", seq = "sequence_alignment", germ = "germline_alignment", v_call = "v_call", j_call = "j_call", junc_len = "junction_length", clone = "clone_id", mask_char = "N", max_mask = 0, pad_end = FALSE, text_fields = NULL, num_fields = NULL, seq_fields = NULL, add_count = TRUE, verbose = FALSE ) } \arguments{ \item{data}{data.frame containing the AIRR or Change-O data for a clone. See Details for the list of required columns and their default values.} \item{id}{name of the column containing sequence identifiers.} \item{seq}{name of the column containing observed DNA sequences. All sequences in this column must be multiple aligned.} \item{germ}{name of the column containing germline DNA sequences. All entries in this column should be identical for any given clone, and they must be multiple aligned with the data in the \code{seq} column.} \item{v_call}{name of the column containing V-segment allele assignments. All entries in this column should be identical to the gene level.} \item{j_call}{name of the column containing J-segment allele assignments. All entries in this column should be identical to the gene level.} \item{junc_len}{name of the column containing the length of the junction as a numeric value. All entries in this column should be identical for any given clone.} \item{clone}{name of the column containing the identifier for the clone. All entries in this column should be identical.} \item{mask_char}{character to use for masking and padding.} \item{max_mask}{maximum number of characters to mask at the leading and trailing sequence ends. If \code{NULL} then the upper masking bound will be automatically determined from the maximum number of observed leading or trailing Ns amongst all sequences. If set to \code{0} (default) then masking will not be performed.} \item{pad_end}{if \code{TRUE} pad the end of each sequence with \code{mask_char} to make every sequence the same length.} \item{text_fields}{text annotation columns to retain and merge during duplicate removal.} \item{num_fields}{numeric annotation columns to retain and sum during duplicate removal.} \item{seq_fields}{sequence annotation columns to retain and collapse during duplicate removal. Note, this is distinct from the \code{seq} and \code{germ} arguments, which contain the primary sequence data for the clone and should not be repeated in this argument.} \item{add_count}{if \code{TRUE} add an additional annotation column called \code{collapse_count} during duplicate removal that indicates the number of sequences that were collapsed.} \item{verbose}{passed on to \code{collapseDuplicates}. If \code{TRUE}, report the numbers of input, discarded and output sequences; otherwise, process sequences silently.} } \value{ A \link{ChangeoClone} object containing the modified clone. } \description{ \code{makeChangeoClone} takes a data.frame with AIRR or Change-O style columns as input and masks gap positions, masks ragged ends, removes duplicates sequences, and merges annotations associated with duplicate sequences. It returns a \code{ChangeoClone} object which serves as input for lineage reconstruction. } \details{ The input data.frame (\code{data}) must columns for each of the required column name arguments: \code{id}, \code{seq}, \code{germ}, \code{v_call}, \code{j_call}, \code{junc_len}, and \code{clone}. The default values are as follows: \itemize{ \item \code{id = "sequence_id"}: unique sequence identifier. \item \code{seq = "sequence_alignment"}: IMGT-gapped sample sequence. \item \code{germ = "germline_alignment"}: IMGT-gapped germline sequence. \item \code{v_call = "v_call"}: V segment allele call. \item \code{j_call = "j_call"}: J segment allele call. \item \code{junc_len = "junction_length"}: junction sequence length. \item \code{clone = "clone_id"}: clone identifier. } Additional annotation columns specified in the \code{text_fields}, \code{num_fields} or \code{seq_fields} arguments will be retained in the \code{data} slot of the return object, but are not required. If the input data.frame \code{data} already contains a column named \code{sequence}, which is not used as the \code{seq} argument, then that column will not be retained. The default columns are IMGT-gapped sequence columns, but this is not a requirement. However, all sequences (both observed and germline) must be multiple aligned using some scheme for both proper duplicate removal and lineage reconstruction. The value for the germline sequence, V-segment gene call, J-segment gene call, junction length, and clone identifier are determined from the first entry in the \code{germ}, \code{v_call}, \code{j_call}, \code{junc_len} and \code{clone} columns, respectively. For any given clone, each value in these columns should be identical. } \examples{ # Example data db <- data.frame(sequence_id=LETTERS[1:4], sequence_alignment=c("CCCCTGGG", "CCCCTGGN", "NAACTGGN", "NNNCTGNN"), germline_alignment="CCCCAGGG", v_call="Homsap IGKV1-39*01 F", j_call="Homsap IGKJ5*01 F", junction_length=2, clone_id=1, c_call=c("IGHM", "IGHG", "IGHG", "IGHA"), duplicate_count=1:4, stringsAsFactors=FALSE) # Without end masking makeChangeoClone(db, text_fields="c_call", num_fields="duplicate_count") # With end masking makeChangeoClone(db, max_mask=3, text_fields="c_call", num_fields="duplicate_count") } \seealso{ Executes in order \link{maskSeqGaps}, \link{maskSeqEnds}, \link{padSeqEnds}, and \link{collapseDuplicates}. Returns a \link{ChangeoClone} object which serves as input to \link{buildPhylipLineage}. } alakazam/man/ExampleDbChangeo.Rd0000644000175000017500000000373414136536357016401 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{ExampleDbChangeo} \alias{ExampleDbChangeo} \title{Example Change-O database} \format{ A data.frame with the following Change-O style columns: \itemize{ \item \code{SEQUENCE_ID}: Sequence identifier \item \code{SEQUENCE_IMGT}: IMGT-gapped observed sequence. \item \code{GERMLINE_IMGT_D_MASK}: IMGT-gapped germline sequence with N, P and D regions masked. \item \code{V_CALL}: V region allele assignments. \item \code{V_CALL_GENOTYPED}: TIgGER corrected V region allele assignment. \item \code{D_CALL}: D region allele assignments. \item \code{J_CALL}: J region allele assignments. \item \code{JUNCTION}: Junction region sequence. \item \code{JUNCTION_LENGTH}: Length of the junction region in nucleotides. \item \code{NP1_LENGTH}: Combined length of the N and P regions proximal to the V region. \item \code{NP2_LENGTH}: Combined length of the N and P regions proximal to the J region. \item \code{SAMPLE}: Sample identifier. Time in relation to vaccination. \item \code{ISOTYPE}: Isotype assignment. \item \code{DUPCOUNT}: Copy count (number of duplicates) of the sequence. \item \code{CLONE}: Change-O assignment clonal group identifier. } } \usage{ ExampleDbChangeo } \description{ A small example database subset from Laserson and Vigneault et al, 2014. } \references{ \enumerate{ \item Laserson U and Vigneault F, et al. High-resolution antibody dynamics of vaccine-induced immune responses. Proc Natl Acad Sci USA. 2014 111:4928-33. } } \seealso{ \link{ExampleDb} \link{ExampleTrees} } \keyword{datasets} alakazam/man/extractVRegion.Rd0000644000175000017500000000350114136536357016207 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{extractVRegion} \alias{extractVRegion} \title{Extracts FWRs and CDRs from IMGT-gapped sequences} \usage{ extractVRegion(sequences, region = c("fwr1", "cdr1", "fwr2", "cdr2", "fwr3")) } \arguments{ \item{sequences}{character vector of IMGT-gapped nucleotide sequences.} \item{region}{string defining the region(s) of the V segment to extract. May be a single region or multiple regions (as a vector) from \code{c("fwr1", "cdr1", "fwr2", "cdr2" ,"fwr3")}. By default, all regions will be returned.} } \value{ If only one region is specified in the \code{region} argument, a character vector of the extracted sub-sequences will be returned. If multiple regions are specified, then a character matrix will be returned with columns corresponding to the specified regions and a row for each entry in \code{sequences}. } \description{ \code{extractVRegion} extracts the framework and complementarity determining regions of the V segment for IMGT-gapped immunoglobulin (Ig) nucleotide sequences according to the IMGT numbering scheme. } \examples{ # Assign example clone clone <- subset(ExampleDb, clone_id == 3138) # Get all regions extractVRegion(clone$sequence_alignment) # Get single region extractVRegion(clone$sequence_alignment, "fwr1") # Get all CDRs extractVRegion(clone$sequence_alignment, c("cdr1", "cdr2")) # Get all FWRs extractVRegion(clone$sequence_alignment, c("fwr1", "fwr2", "fwr3")) } \references{ \enumerate{ \item Lefranc M-P, et al. IMGT unique numbering for immunoglobulin and T cell receptor variable domains and Ig superfamily V-like domains. Dev Comp Immunol. 2003 27(1):55-77. } } \seealso{ IMGT-gapped region boundaries are defined in \link{IMGT_REGIONS}. } alakazam/man/countGenes.Rd0000644000175000017500000001045414136536357015362 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Gene.R \name{countGenes} \alias{countGenes} \title{Tabulates V(D)J allele, gene or family usage.} \usage{ countGenes( data, gene, groups = NULL, copy = NULL, clone = NULL, fill = FALSE, mode = c("gene", "allele", "family", "asis"), remove_na = TRUE ) } \arguments{ \item{data}{data.frame with AIRR-format or Change-O style columns.} \item{gene}{column containing allele assignments. Only the first allele in the column will be considered when \code{mode} is "gene", "family" or "allele". The value will be used as it is with \code{mode="asis"}.} \item{groups}{columns containing grouping variables. If \code{NULL} do not group.} \item{copy}{name of the \code{data} column containing copy numbers for each sequence. If this value is specified, then total copy abundance is determined by the sum of copy numbers within each gene. This argument is ignored if \code{clone} is specified.} \item{clone}{name of the \code{data} column containing clone identifiers for each sequence. If this value is specified, then one gene will be considered for each clone. Note, this is accomplished by using the most common gene within each \code{clone} identifier. As such, ambiguous alleles within a clone will not be accurately represented.} \item{fill}{logical of \code{c(TRUE, FALSE)} specifying when if groups (when specified) lacking a particular gene should be counted as 0 if TRUE or not (omitted)} \item{mode}{one of \code{c("gene", "family", "allele", "asis")} defining the degree of specificity regarding allele calls. Determines whether to return counts for genes (calling \code{getGene}), families (calling \code{getFamily}), alleles (calling \code{getAllele}) or using the value as it is in the column \code{gene}, without any processing.} \item{remove_na}{removes rows with \code{NA} values in the gene column if \code{TRUE} and issues a warning. Otherwise, keeps those rows and considers \code{NA} as a gene in the final counts and relative abundances.} } \value{ A data.frame summarizing family, gene or allele counts and frequencies with columns: \itemize{ \item \code{gene}: name of the family, gene or allele. \item \code{seq_count}: total number of sequences for the gene. \item \code{seq_freq}: frequency of the gene as a fraction of the total number of sequences within each grouping. \item \code{copy_count}: sum of the copy counts in the \code{copy} column. for each gene. Only present if the \code{copy} argument is specified. \item \code{copy_freq}: frequency of the gene as a fraction of the total copy number within each group. Only present if the \code{copy} argument is specified. \item \code{clone_count}: total number of clones for the gene. Only present if the \code{clone} argument is specified. \item \code{clone_freq}: frequency of the gene as a fraction of the total number of clones within each grouping. Only present if the \code{clone} argument is specified. } Additional columns defined by the \code{groups} argument will also be present. } \description{ Determines the count and relative abundance of V(D)J alleles, genes or families within groups. } \examples{ # Without copy numbers genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="family") genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="gene") genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="allele") # With copy numbers and multiple groups genes <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), copy="duplicate_count", mode="family") # Count by clone genes <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), clone="clone_id", mode="family") # Count absent genes genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="allele", fill=TRUE) } alakazam/man/plotDiversityTest.Rd0000644000175000017500000000375014136536357016772 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{plotDiversityTest} \alias{plotDiversityTest} \title{Plot the results of diversity testing} \usage{ plotDiversityTest( data, q, colors = NULL, main_title = "Diversity", legend_title = "Group", log_d = FALSE, annotate = c("none", "depth"), silent = FALSE, ... ) } \arguments{ \item{data}{\link{DiversityCurve} object returned by \link{alphaDiversity}.} \item{q}{diversity order to plot the test for.} \item{colors}{named character vector whose names are values in the \code{group} column of the \code{data} slot of \code{data}, and whose values are colors to assign to those group names.} \item{main_title}{string specifying the plot title.} \item{legend_title}{string specifying the legend title.} \item{log_d}{if \code{TRUE} then plot the diversity scores \eqn{D} on a log scale; if \code{FALSE} plot on a linear scale.} \item{annotate}{string defining whether to added values to the group labels of the legend. When \code{"none"} (default) is specified no annotations are added. Specifying (\code{"depth"}) adds sequence counts to the labels.} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotDiversityTest} plots summary data for a \code{DiversityCurve} object with mean and a line range indicating plus/minus one standard deviation. } \examples{ # Calculate diversity div <- alphaDiversity(ExampleDb, group="sample_id", min_q=0, max_q=2, step_q=1, nboot=100) # Plot results at q=0 (equivalent to species richness) plotDiversityTest(div, 0, legend_title="Sample") # Plot results at q=2 (equivalent to Simpson's index) plotDiversityTest(div, q=2, legend_title="Sample") } \seealso{ See \link{alphaDiversity} for generating input. Plotting is performed with \link{ggplot}. } alakazam/man/readIgphyml.Rd0000644000175000017500000001215614136536357015516 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Lineage.R \name{readIgphyml} \alias{readIgphyml} \title{Read in output from IgPhyML} \usage{ readIgphyml( file, id = NULL, format = c("graph", "phylo"), collapse = FALSE, branches = c("mutations", "distance") ) } \arguments{ \item{file}{IgPhyML output file (.tab).} \item{id}{ID to assign to output object.} \item{format}{if \code{"graph"} return trees as igraph \code{graph} objects. if \code{"phylo"} return trees as ape \code{phylo} objects.} \item{collapse}{if \code{TRUE} transform branch lengths to units of substitutions, rather than substitutions per site, and collapse internal nodes separated by branches < 0.1 substitutions. Will also remove all internal node labels, as it makes them inconsistent.} \item{branches}{if \code{"distance"} branch lengths are in expected mutations per site. If \code{"mutations"} branches are in expected mutations.} } \value{ A list containing IgPhyML model parameters and estimated lineage trees. Object attributes: \itemize{ \item \code{param}: Data.frame of parameter estimates for each clonal lineage. Columns include: \code{CLONE}, which is the clone id; \code{NSEQ}, the total number of sequences in the lineage; \code{NSITE}, the number of codon sites; \code{TREE_LENGTH}, the sum of all branch lengths in the estimated lineage tree; and \code{LHOOD}, the log likelihood of the clone's sequences given the tree and parameters. Subsequent columns are parameter estimates from IgPhyML, which will depend on the model used. Parameter columns ending with \code{_MLE} are maximum likelihood estimates; those ending with \code{_LCI} are the lower 95%% confidence interval estimate; those ending with \code{_UCI} are the upper 95%% confidence interval estimate. The first line of \code{param} is for clone \code{REPERTOIRE}, which is a summary of all lineages within the repertoire. For this row, \code{NSEQ} is the total number of sequences, \code{NSITE} is the average number of sites, and \code{TREE_LENGTH} is the mean tree length. For most applications, parameter values will be the same for all lineages within the repertoire, so access them simply by: \code{$param$OMEGA_CDR_MLE[1]} to, for instance, get the estimate of dN/dS on the CDRs at the repertoire level. \item \code{trees}: List of tree objects estimated by IgPhyML. If \code{format="graph"} these are igraph \code{graph} objects. If \code{format="phylo"}, these are ape \code{phylo} objects. \item \code{command}: Command used to run IgPhyML. } } \description{ \code{readIgphyml} reads output from the IgPhyML phylogenetics inference package for B cell repertoires } \details{ \code{readIgphyml} reads output from the IgPhyML repertoire phylogenetics inference package. The resulting object is divded between parameter estimates (usually under the HLP19 model), which provide information about mutation and selection pressure operating on the sequences. Trees returned from this function are either igraph objects or phylo objects, and each may be visualized accordingly. Futher, branch lengths in tree may represent either the expected number of substitutions per site (codon, if estimated under HLP or GY94 models), or the total number of expected substitutions per site. If the latter, internal nodes - but not tips - separated by branch lengths less than 0.1 are collapsed to simplify viewing. } \examples{ \dontrun{ # Read in and plot a tree from an igphyml run library(igraph) s1 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="+7d") print(s1$param$OMEGA_CDR_MLE[1]) plot(s1$trees[[1]], layout=layout_as_tree, edge.label=E(s1$trees[[1]])$weight) } } \references{ \enumerate{ \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody Lineages. Genetics 2017 206(1):417-427 https://doi.org/10.1534/genetics.116.196303 \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - Repertoire-wide phylogenetic models of B cell molecular evolution reveal evolutionary signatures of aging and vaccination. bioRxiv 2019 https://doi.org/10.1101/558825 } } alakazam/man/plotAbundanceCurve.Rd0000644000175000017500000000365314136536357017037 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{plotAbundanceCurve} \alias{plotAbundanceCurve} \title{Plots a clonal abundance distribution} \usage{ plotAbundanceCurve( data, colors = NULL, main_title = "Rank Abundance", legend_title = NULL, xlim = NULL, ylim = NULL, annotate = c("none", "depth"), silent = FALSE, ... ) } \arguments{ \item{data}{\link{AbundanceCurve} object returned by \link{estimateAbundance}.} \item{colors}{named character vector whose names are values in the \code{group} column of \code{data} and whose values are colors to assign to those group names.} \item{main_title}{string specifying the plot title.} \item{legend_title}{string specifying the legend title.} \item{xlim}{numeric vector of two values specifying the \code{c(lower, upper)} x-axis limits.} \item{ylim}{numeric vector of two values specifying the \code{c(lower, upper)} y-axis limits.} \item{annotate}{string defining whether to added values to the group labels of the legend. When \code{"none"} (default) is specified no annotations are added. Specifying (\code{"depth"}) adds sequence counts to the labels.} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotAbundanceCurve} plots the results from estimating the complete clonal relative abundance distribution. The distribution is plotted as a log rank abundance distribution. } \examples{ # Estimate abundance by sample and plot abund <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) plotAbundanceCurve(abund, legend_title="Sample") } \seealso{ See \link{AbundanceCurve} for the input object and \link{estimateAbundance} for generating the input abundance distribution. Plotting is performed with \link{ggplot}. } alakazam/man/getAAMatrix.Rd0000644000175000017500000000125014136536357015410 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{getAAMatrix} \alias{getAAMatrix} \title{Build an AA distance matrix} \usage{ getAAMatrix(gap = 0) } \arguments{ \item{gap}{value to assign to characters in the set \code{c("-", ".")}.} } \value{ A \code{matrix} of amino acid character distances with row and column names indicating the character pair. } \description{ \code{getAAMatrix} returns a Hamming distance matrix for IUPAC ambiguous amino acid characters. } \examples{ getAAMatrix() } \seealso{ Creates an amino acid distance matrix for \link{seqDist}. See \link{getDNAMatrix} for nucleotide distances. } alakazam/man/ABBREV_AA.Rd0000644000175000017500000000072614136536357014553 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{ABBREV_AA} \alias{ABBREV_AA} \title{Amino acid abbreviation translations} \format{ Named character vector defining single-letter character codes to three-letter abbreviation mappings. } \usage{ ABBREV_AA } \description{ Mappings of amino acid abbreviations. } \examples{ aa <- c("Ala", "Ile", "Trp") translateStrings(aa, ABBREV_AA) } \keyword{datasets} alakazam/man/readFastqDb.Rd0000644000175000017500000001045014136536357015424 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Fastq.R \name{readFastqDb} \alias{readFastqDb} \title{Load sequencing quality scores from a FASTQ file} \usage{ readFastqDb( data, fastq_file, quality_offset = -33, header = c("presto", "asis"), sequence_id = "sequence_id", sequence = "sequence", sequence_alignment = "sequence_alignment", v_cigar = "v_cigar", d_cigar = "d_cigar", j_cigar = "j_cigar", np1_length = "np1_length", np2_length = "np2_length", v_sequence_end = "v_sequence_end", d_sequence_end = "d_sequence_end", style = c("num", "ascii", "both"), quality_sequence = FALSE ) } \arguments{ \item{data}{\code{data.frame} containing sequence data.} \item{fastq_file}{path to the fastq file} \item{quality_offset}{offset value to be used by ape::read.fastq. It is the value to be added to the quality scores (the default -33 applies to the Sanger format and should work for most recent FASTQ files).} \item{header}{FASTQ file header format; one of \code{"presto"} or \code{"asis"}. Use \code{"presto"} to specify that the fastq file headers are using the pRESTO format and can be parsed to extract the \code{sequence_id}. Use \code{"asis"} to skip any processing and use the sequence names as they are.} \item{sequence_id}{column in \code{data} that contains sequence identifiers to be matched to sequence identifiers in \code{fastq_file}.} \item{sequence}{column in \code{data} that contains sequence data.} \item{sequence_alignment}{column in \code{data} that contains IMGT aligned sequence data.} \item{v_cigar}{column in \code{data} that contains CIGAR strings for the V gene alignments.} \item{d_cigar}{column in \code{data} that contains CIGAR strings for the D gene alignments.} \item{j_cigar}{column in \code{data} that contains CIGAR strings for the J gene alignments.} \item{np1_length}{column in \code{data} that contains the number of nucleotides between the V gene and first D gene alignments or between the V gene and J gene alignments.} \item{np2_length}{column in \code{data} that contains the number of nucleotides between either the first D gene and J gene alignments or the first D gene and second D gene alignments.} \item{v_sequence_end}{column in \code{data} that contains the end position of the V gene in \code{sequence}.} \item{d_sequence_end}{column in \code{data} that contains the end position of the D gene in \code{sequence}.} \item{style}{how the sequencing quality should be returned; one of \code{"num"}, \code{"phred"}, or \code{"both"}. Specify \code{"num"} to store the quality scores as strings of comma separated numeric values. Use \code{"phred"} to have the function return the scores as Phred (ASCII) scores. Use \code{"both"} to retrieve both.} \item{quality_sequence}{specify \code{TRUE} to keep the quality scores for \code{sequence}. If false, only the quality score for \code{sequence_alignment} will be added to \code{data}.} } \value{ Modified \code{data} with additional fields: \enumerate{ \item \code{quality_alignment}: A character vector with ASCII Phred scores for \code{sequence_alignment}. \item \code{quality_alignment_num}: A character vector, with comma separated numerical quality values for each position in \code{sequence_alignment}. \item \code{quality}: A character vector with ASCII Phred scores for \code{sequence}. \item \code{quality_num}: A character vector, with comma separated numerical quality values for each position in \code{sequence}. } } \description{ \code{readFastqDb} adds the sequencing quality scores to a data.frame from a FASTQ file. Matching is done by `sequence_id`. } \examples{ db <- airr::read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") db <- readFastqDb(db, fastq_file, quality_offset=-33) } \seealso{ \link{maskPositionsByQuality} and \link{getPositionQuality} } alakazam/man/getSegment.Rd0000644000175000017500000000722014136536357015347 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Gene.R \name{getSegment} \alias{getSegment} \alias{getAllele} \alias{getGene} \alias{getFamily} \alias{getLocus} \alias{getChain} \title{Get Ig segment allele, gene and family names} \usage{ getSegment( segment_call, segment_regex, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) getAllele( segment_call, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) getGene( segment_call, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) getFamily( segment_call, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) getLocus( segment_call, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) getChain( segment_call, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) } \arguments{ \item{segment_call}{character vector containing segment calls delimited by commas.} \item{segment_regex}{string defining the segment match regular expression.} \item{first}{if \code{TRUE} return only the first call in \code{segment_call}; if \code{FALSE} return all calls delimited by commas.} \item{collapse}{if \code{TRUE} check for duplicates and return only unique segment assignments; if \code{FALSE} return all assignments (faster). Has no effect if \code{first=TRUE}.} \item{strip_d}{if \code{TRUE} remove the "D" from the end of gene annotations (denoting a duplicate gene in the locus); if \code{FALSE} do not alter gene names.} \item{omit_nl}{if \code{TRUE} remove non-localized (NL) genes from the result. Only applies at the gene or allele level.} \item{sep}{character defining both the input and output segment call delimiter.} } \value{ A character vector containing allele, gene or family names. } \description{ \code{getSegment} performs generic matching of delimited segment calls with a custom regular expression. \link{getAllele}, \link{getGene} and \link{getFamily} extract the allele, gene and family names, respectively, from a character vector of immunoglobulin (Ig) or TCR segment allele calls in IMGT format. } \examples{ # Light chain examples kappa_call <- c("Homsap IGKV1D-39*01 F,Homsap IGKV1-39*02 F,Homsap IGKV1-39*01", "Homsap IGKJ5*01 F") getAllele(kappa_call) getAllele(kappa_call, first=FALSE) getAllele(kappa_call, first=FALSE, strip_d=FALSE) getGene(kappa_call) getGene(kappa_call, first=FALSE) getGene(kappa_call, first=FALSE, strip_d=FALSE) getFamily(kappa_call) getFamily(kappa_call, first=FALSE) getFamily(kappa_call, first=FALSE, collapse=FALSE) getFamily(kappa_call, first=FALSE, strip_d=FALSE) getLocus(kappa_call) getChain(kappa_call) # Heavy chain examples heavy_call <- c("Homsap IGHV1-69*01 F,Homsap IGHV1-69D*01 F", "Homsap IGHD1-1*01 F", "Homsap IGHJ1*01 F") getAllele(heavy_call, first=FALSE) getAllele(heavy_call, first=FALSE, strip_d=FALSE) getGene(heavy_call, first=FALSE) getGene(heavy_call, first=FALSE, strip_d=FALSE) getFamily(heavy_call) getLocus(heavy_call) getChain(heavy_call) # Filtering non-localized genes nl_call <- c("IGHV3-NL1*01,IGHV3-30-3*01,IGHV3-30*01", "Homosap IGHV3-30*01 F,Homsap IGHV3-NL1*01 F", "IGHV1-NL1*01") getAllele(nl_call, first=FALSE, omit_nl=TRUE) getGene(nl_call, first=FALSE, omit_nl=TRUE) getFamily(nl_call, first=FALSE, omit_nl=TRUE) # Temporary designation examples tmp_call <- c("IGHV9S3*01", "IGKV10S12*01") getAllele(tmp_call) getGene(tmp_call) getFamily(tmp_call) } \references{ \url{http://imgt.org} } \seealso{ \link{countGenes} } alakazam/man/junctionAlignment.Rd0000644000175000017500000000673214137255716016742 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{junctionAlignment} \alias{junctionAlignment} \title{Calculate junction region alignment properties} \usage{ junctionAlignment( data, germline_db, v_call = "v_call", d_call = "d_call", j_call = "j_call", v_germline_start = "v_germline_start", v_germline_end = "v_germline_end", d_germline_start = "d_germline_start", d_germline_end = "d_germline_end", j_germline_start = "j_germline_start", j_germline_end = "j_germline_end", np1_length = "np1_length", np2_length = "np2_length", junction = "junction", junction_length = "junction_length", sequence_alignment = "sequence_alignment" ) } \arguments{ \item{data}{\code{data.frame} containing sequence data.} \item{germline_db}{reference germline database for the V, D and J genes. in \code{data}} \item{v_call}{V gene assignment column.} \item{d_call}{D gene assignment column.} \item{j_call}{J gene assignment column.} \item{v_germline_start}{column containing the start position of the alignment in the V reference germline.} \item{v_germline_end}{column containing the end position of the alignment in the V reference germline.} \item{d_germline_start}{column containing the start position of the alignment in the D reference germline.} \item{d_germline_end}{column containing the start position of the alignment in the D reference germline.} \item{j_germline_start}{column containing the start position of the alignment in the J reference germline.} \item{j_germline_end}{column containing the start position of the alignment in the J reference germline.} \item{np1_length}{combined length of the N and P regions between the V and D regions (heavy chain) or V and J regions (light chain).} \item{np2_length}{combined length of the N and P regions between the D and J regions (heavy chain).} \item{junction}{column containing the junction sequence.} \item{junction_length}{column containing the length of the junction region in nucleotides.} \item{sequence_alignment}{column containing the aligned sequence.} } \value{ A modified input \code{data.frame} with the following additional columns storing junction alignment information: \enumerate{ \item \code{e3v_length}: number of 3' V germline nucleotides deleted. \item \code{e5d_length}: number of 5' D germline nucleotides deleted. \item \code{e3d_length}: number of 3' D germline nucleotides deleted. \item \code{e5j_length}: number of 5' J germline nucleotides deleted. \item \code{v_cdr3_length}: number of sequence_alignment V nucleotides in the CDR3. \item \code{j_cdr3_length}: number of sequence_alignment J nucleotides in the CDR3. } } \description{ \code{junctionAlignment} determines the number of deleted germline nucleotides in the junction region and the number of V gene and J gene nucleotides in the CDR3. } \examples{ germline_db <- list( "IGHV3-11*05"="CAGGTGCAGCTGGTGGAGTCTGGGGGA...GGCTTGGTCAAGCCTGGAGGGTCCCTGAGACT CTCCTGTGCAGCCTCTGGATTCACCTTC............AGTGACTACTACATGAGCTGGATCCGCCAGGCTCCAG GGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGT......AGTAGTTACACAAACTACGCAGACTCTGTGAAG ...GGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGA CACGGCCGTGTATTACTGTGCGAGAGA", "IGHD3-10*01"="GTATTACTATGGTTCGGGGAGTTATTATAAC", "IGHJ5*02"="ACAACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG" ) db <- junctionAlignment(SingleDb, germline_db) } alakazam/man/ChangeoClone-class.Rd0000644000175000017500000000172214136536357016676 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Classes.R \docType{class} \name{ChangeoClone-class} \alias{ChangeoClone-class} \alias{ChangeoClone} \title{S4 class defining a clone} \description{ \code{ChangeoClone} defines a common data structure for perform lineage recontruction from Change-O data. } \section{Slots}{ \describe{ \item{\code{data}}{data.frame containing sequences and annotations. Contains the columns \code{SEQUENCE_ID} and \code{SEQUENCE}, as well as any additional sequence-specific annotation columns.} \item{\code{clone}}{string defining the clone identifier.} \item{\code{germline}}{string containing the germline sequence for the clone.} \item{\code{v_gene}}{string defining the V segment gene call.} \item{\code{j_gene}}{string defining the J segment gene call.} \item{\code{junc_len}}{numeric junction length (nucleotide count).} }} \seealso{ See \link{makeChangeoClone} and \link{buildPhylipLineage} for use. } alakazam/man/maskSeqGaps.Rd0000644000175000017500000000172414136536357015467 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{maskSeqGaps} \alias{maskSeqGaps} \title{Masks gap characters in DNA sequences} \usage{ maskSeqGaps(seq, mask_char = "N", outer_only = FALSE) } \arguments{ \item{seq}{character vector of DNA sequence strings.} \item{mask_char}{character to use for masking.} \item{outer_only}{if \code{TRUE} replace only contiguous leading and trailing gaps; if \code{FALSE} replace all gap characters.} } \value{ A modified \code{seq} vector with \code{"N"} in place of \code{c("-", ".")} characters. } \description{ \code{maskSeqGaps} substitutes gap characters, \code{c("-", ".")}, with \code{"N"} in a vector of DNA sequences. } \examples{ # Mask with Ns maskSeqGaps(c("ATG-C", "CC..C")) maskSeqGaps("--ATG-C-") maskSeqGaps("--ATG-C-", outer_only=TRUE) # Mask with dashes maskSeqGaps(c("ATG-C", "CC..C"), mask_char="-") } \seealso{ See \link{maskSeqEnds} for masking ragged edges. } alakazam/man/getDNAMatrix.Rd0000644000175000017500000000200114136536357015524 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{getDNAMatrix} \alias{getDNAMatrix} \title{Build a DNA distance matrix} \usage{ getDNAMatrix(gap = -1) } \arguments{ \item{gap}{value to assign to characters in the set \code{c("-", ".")}.} } \value{ A \code{matrix} of DNA character distances with row and column names indicating the character pair. By default, distances will be either 0 (equivalent), 1 (non-equivalent or missing), or -1 (gap). } \description{ \code{getDNAMatrix} returns a Hamming distance matrix for IUPAC ambiguous DNA characters with modifications for gap, \code{c("-", ".")}, and missing, \code{c("?")}, character values. } \examples{ # Set gap characters to Inf distance # Distinguishes gaps from Ns getDNAMatrix() # Set gap characters to 0 distance # Makes gap characters equivalent to Ns getDNAMatrix(gap=0) } \seealso{ Creates DNA distance matrix for \link{seqDist}. See \link{getAAMatrix} for amino acid distances. } alakazam/man/collapseDuplicates.Rd0000644000175000017500000001465114136536357017073 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{collapseDuplicates} \alias{collapseDuplicates} \title{Remove duplicate DNA sequences and combine annotations} \usage{ collapseDuplicates( data, id = "sequence_id", seq = "sequence_alignment", text_fields = NULL, num_fields = NULL, seq_fields = NULL, add_count = FALSE, ignore = c("N", "-", ".", "?"), sep = ",", dry = FALSE, verbose = FALSE ) } \arguments{ \item{data}{data.frame containing Change-O columns. The data.frame must contain, at a minimum, a unique identifier column and a column containg a character vector of DNA sequences.} \item{id}{name of the column containing sequence identifiers.} \item{seq}{name of the column containing DNA sequences.} \item{text_fields}{character vector of textual columns to collapse. The textual annotations of duplicate sequences will be merged into a single string with each unique value alphabetized and delimited by \code{sep}.} \item{num_fields}{vector of numeric columns to collapse. The numeric annotations of duplicate sequences will be summed.} \item{seq_fields}{vector of nucletoide sequence columns to collapse. The sequence with the fewest numer of non-informative characters will be retained. Where a non-informative character is one of \code{c("N", "-", ".", "?")}. Note, this is distinct from the \code{seq} parameter which is used to determine duplicates.} \item{add_count}{if \code{TRUE} add the column \code{collpase_count} that indicates the number of sequences that were collapsed to build each unique entry.} \item{ignore}{vector of characters to ignore when testing for equality.} \item{sep}{character to use for delimiting collapsed annotations in the \code{text_fields} columns. Defines both the input and output delimiter.} \item{dry}{if \code{TRUE} perform dry run. Only labels the sequences without collapsing them.} \item{verbose}{if \code{TRUE} report the number input, discarded and output sequences; if \code{FALSE} process sequences silently.} } \value{ A modified \code{data} data.frame with duplicate sequences removed and annotation fields collapsed if \code{dry=FALSE}. If \code{dry=TRUE}, sequences will be labeled with the collapse action, but the input will be otherwise unmodifed (see Details). } \description{ \code{collapseDuplicates} identifies duplicate DNA sequences, allowing for ambiguous characters, removes the duplicate entries, and combines any associated annotations. } \details{ \code{collapseDuplicates} identifies duplicate sequences in the \code{seq} column by testing for character identity, with consideration of IUPAC ambiguous nucleotide codes. A cluster of sequences are considered duplicates if they are all equivalent, and no member of the cluster is equivalent to a sequence in a different cluster. Textual annotations, specified by \code{text_fields}, are collapsed by taking the unique set of values within in each duplicate cluster and delimiting those values by \code{sep}. Numeric annotations, specified by \code{num_fields}, are collapsed by summing all values in the duplicate cluster. Sequence annotations, specified by \code{seq_fields}, are collapsed by retaining the first sequence with the fewest number of N characters. Columns that are not specified in either \code{text_fields}, \code{num_fields}, or \code{seq_fields} will be retained, but the value will be chosen from a random entry amongst all sequences in a cluster of duplicates. An ambiguous sequence is one that can be assigned to two different clusters, wherein the ambiguous sequence is equivalent to two sequences which are themselves non-equivalent. Ambiguous sequences arise due to ambiguous characters at positions that vary across sequences, and are discarded along with their annotations when \code{dry=FALSE}. Thus, ambiguous sequences are removed as duplicates of some sequence, but do not create a potential false-positive annotation merger. Ambiguous sequences are not included in the \code{collapse_count} annotation that is added when \code{add_count=TRUE}. If \code{dry=TRUE} sequences will not be removed from the input. Instead, the following columns will be appended to the input defining the collapse action that would have been performed in the \code{dry=FALSE} case. \itemize{ \item \code{collapse_id}: an identifer for the group of identical sequences. \item \code{collapse_class}: string defining how the sequence matches to the other in the set. one of \code{"duplicated"} (has duplicates), \code{"unique"} (no duplicates), \code{"ambiguous_duplicate"} (no duplicates after ambiguous sequences are removed), or \code{"ambiguous"} (matches multiple non-duplicate sequences). \item \code{collapse_pass}: \code{TRUE} for the sequences that would be retained. } } \examples{ # Example data.frame db <- data.frame(sequence_id=LETTERS[1:4], sequence_alignment=c("CCCCTGGG", "CCCCTGGN", "NAACTGGN", "NNNCTGNN"), c_call=c("IGHM", "IGHG", "IGHG", "IGHA"), sample_id=c("S1", "S1", "S2", "S2"), duplicate_count=1:4, stringsAsFactors=FALSE) # Annotations are not parsed if neither text_fields nor num_fields is specified # The retained sequence annotations will be random collapseDuplicates(db, verbose=TRUE) # Unique text_fields annotations are combined into a single string with "," # num_fields annotations are summed # Ambiguous duplicates are discarded collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", verbose=TRUE) # Use alternate delimiter for collapsing textual annotations collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", sep="/", verbose=TRUE) # Add count of duplicates collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", add_count=TRUE, verbose=TRUE) # Masking ragged ends may impact duplicate removal db$sequence_alignment <- maskSeqEnds(db$sequence_alignment) collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", add_count=TRUE, verbose=TRUE) } \seealso{ Equality is tested with \link{seqEqual} and \link{pairwiseEqual}. For IUPAC ambiguous character codes see \link{IUPAC_DNA}. } alakazam/man/translateDNA.Rd0000644000175000017500000000154614136536357015572 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{translateDNA} \alias{translateDNA} \title{Translate nucleotide sequences to amino acids} \usage{ translateDNA(seq, trim = FALSE) } \arguments{ \item{seq}{vector of strings defining DNA sequence(s) to be converted to translated.} \item{trim}{boolean flag to remove 3 nts from both ends of seq (converts IMGT junction to CDR3 region).} } \value{ A vector of translated sequence strings. } \description{ \code{translateDNA} translates nucleotide sequences to amino acid sequences. } \examples{ # Translate a single sequence translateDNA("ACTGACTCGA") # Translate a vector of sequences translateDNA(ExampleDb$junction[1:3]) # Remove the first and last codon from the translation translateDNA(ExampleDb$junction[1:3], trim=TRUE) } \seealso{ \code{\link[seqinr]{translate}}. } alakazam/man/cpuCount.Rd0000644000175000017500000000051714136536357015047 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{cpuCount} \alias{cpuCount} \title{Available CPU cores} \usage{ cpuCount() } \value{ Count of available cores. Returns 1 if undeterminable. } \description{ \code{cpuCount} determines the number of CPU cores available. } \examples{ cpuCount() } alakazam/man/DEFAULT_COLORS.Rd0000644000175000017500000000273514136536357015420 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{DEFAULT_COLORS} \alias{DEFAULT_COLORS} \alias{DNA_COLORS} \alias{IG_COLORS} \alias{TR_COLORS} \title{Default colors} \format{ Named character vectors with hexcode colors as values. \itemize{ \item \code{DNA_COLORS}: DNA character colors \code{c("A", "C", "G", "T")}. \item \code{IG_COLORS}: Ig isotype colors \code{c("IGHA", "IGHD", "IGHE", "IGHG", "IGHM", "IGHK", "IGHL")}. \item \code{TR_COLORS}: TCR chain colors \code{c("TRA", "TRB", "TRD", "TRG")}. } An object of class \code{character} of length 4. An object of class \code{character} of length 7. An object of class \code{character} of length 4. } \usage{ DNA_COLORS IG_COLORS TR_COLORS } \description{ Default color palettes for DNA characters, Ig isotypes, and TCR chains. } \examples{ # IG_COLORS as an isotype color set for ggplot isotype <- c("IGHG", "IGHM", "IGHM", "IGHA") db <- data.frame(x=1:4, y=1:4, iso=isotype) g1 <- ggplot(db, aes(x=x, y=y, color=iso)) + scale_color_manual(name="Isotype", values=IG_COLORS) + geom_point(size=10) plot(g1) # DNA_COLORS to translate nucleotide values to a vector of colors # for use in base graphics plots seq <- c("A", "T", "T", "C") colors <- translateStrings(seq, setNames(names(DNA_COLORS), DNA_COLORS)) plot(1:4, 1:4, col=colors, pch=16, cex=6) } \keyword{datasets} alakazam/man/plotMRCATest.Rd0000644000175000017500000000324314136536357015527 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{plotMRCATest} \alias{plotMRCATest} \title{Plot the results of a founder permutation test} \usage{ plotMRCATest( data, color = "black", main_title = "MRCA Test", style = c("histogram", "cdf"), silent = FALSE, ... ) } \arguments{ \item{data}{\link{MRCATest} object returned by \link{testMRCA}.} \item{color}{color of the histogram or lines.} \item{main_title}{string specifying the plot title.} \item{style}{type of plot to draw. One of: \itemize{ \item \code{"histogram"}: histogram of the annotation count distribution with a red dotted line denoting the observed value. \item \code{"cdf"}: cumulative distribution function of annotation counts with a red dotted line denoting the observed value and a blue dotted line indicating the p-value. }} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotMRCATest} plots the results of a founder permutation test performed with \code{testMRCA}. } \examples{ \donttest{ # Define example tree set graphs <- ExampleTrees[1-10] # Perform MRCA test on isotypes x <- testMRCA(graphs, "c_call", nperm=10) # Plot plotMRCATest(x, color="steelblue", style="hist") plotMRCATest(x, style="cdf") } } \seealso{ See \link{testEdges} for performing the test. } alakazam/man/nonsquareDist.Rd0000644000175000017500000000364314136536357016111 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{nonsquareDist} \alias{nonsquareDist} \title{Calculate pairwise distances between sequences} \usage{ nonsquareDist(seq, indx, dist_mat = getDNAMatrix()) } \arguments{ \item{seq}{character vector containing a DNA sequences. The sequence vector needs to be named.} \item{indx}{numeric vector contating the indices (a subset of indices of \code{seq}).} \item{dist_mat}{Character distance matrix. Defaults to a Hamming distance matrix returned by \link{getDNAMatrix}. If gap characters, \code{c("-", ".")}, are assigned a value of -1 in \code{dist_mat} then contiguous gaps of any run length, which are not present in both sequences, will be counted as a distance of 1. Meaning, indels of any length will increase the sequence distance by 1. Gap values other than -1 will return a distance that does not consider indels as a special case.} } \value{ A matrix of numerical distance between each entry in \code{seq} and sequences specified by \code{indx} indices. Note that the input subsampled indices will be ordered ascendingly. Therefore, it is necassary to assign unique names to the input sequences, \code{seq}, to recover the input order later. Row and columns names will be added accordingly. Amino acid distance matrix may be built with \link{getAAMatrix}. Uses \link{seqDist} for calculating distances between pairs. See \link{pairwiseEqual} for generating an equivalence matrix. } \description{ \code{nonsquareDist} calculates all pairwise distance between a set of sequences and a subset of it. } \examples{ # Gaps will be treated as Ns with a gap=0 distance matrix seq <- c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C") pairwiseDist(seq, dist_mat=getDNAMatrix(gap=0)) nonsquareDist(seq, indx=c(1,3), dist_mat=getDNAMatrix(gap=0)) } alakazam/man/polar.Rd0000644000175000017500000000255014136536357014363 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{polar} \alias{polar} \title{Calculates the average polarity of amino acid sequences} \usage{ polar(seq, polarity = NULL) } \arguments{ \item{seq}{vector of strings containing amino acid sequences.} \item{polarity}{named numerical vector defining polarity scores for each amino acid, where names are single-letter amino acid character codes. If \code{NULL}, then the Grantham, 1974 scale is used.} } \value{ A vector of bulkiness scores for the sequence(s). } \description{ \code{polar} calculates the average polarity score of amino acid sequences. Non-informative positions are excluded, where non-informative is defined as any character in \code{c("X", "-", ".", "*")}. } \examples{ # Default scale seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") polar(seq) # Use the Zimmerman et al, 1968 polarity scale from the seqinr package library(seqinr) data(aaindex) x <- aaindex[["ZIMJ680103"]]$I # Rename the score vector to use single-letter codes names(x) <- translateStrings(names(x), ABBREV_AA) # Calculate polarity polar(seq, polarity=x) } \references{ \enumerate{ \item Grantham R. Amino acid difference formula to help explain protein evolution. Science 185, 862-864 (1974). } } \seealso{ For additional size related indices see \code{\link[seqinr]{aaindex}}. } alakazam/man/AbundanceCurve-class.Rd0000644000175000017500000000331014136536357017231 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Classes.R \docType{class} \name{AbundanceCurve-class} \alias{AbundanceCurve-class} \alias{AbundanceCurve} \alias{print,AbundanceCurve-method} \alias{AbundanceCurve-method} \alias{plot,AbundanceCurve,missing-method} \title{S4 class defining a clonal abundance curve} \usage{ \S4method{print}{AbundanceCurve}(x) \S4method{plot}{AbundanceCurve,missing}(x, y, ...) } \arguments{ \item{x}{AbundanceCurve object} \item{y}{ignored.} \item{...}{arguments to pass to \link{plotDiversityCurve}.} } \description{ \code{AbundanceCurve} defines clonal abundance values. } \section{Slots}{ \describe{ \item{\code{abundance}}{data.frame with relative clonal abundance data and confidence intervals, containing the following columns: \itemize{ \item \code{group}: group identifier. \item \code{clone_id} or \code{CLONE}: clone identifier. \item \code{p}: relative abundance of the clone. \item \code{lower}: lower confidence inverval bound. \item \code{upper}: upper confidence interval bound. \item \code{rank}: the rank of the clone abundance. }} \item{\code{bootstrap}}{data.frame of bootstrapped clonal distributions.} \item{\code{clone_by}}{string specifying the name of the clone column.} \item{\code{group_by}}{string specifying the name of the grouping column.} \item{\code{groups}}{vector specifying the names of unique groups in group column.} \item{\code{n}}{numeric vector indication the number of sequences sampled in each group.} \item{\code{nboot}}{numeric specifying the number of bootstrap iterations to use.} \item{\code{ci}}{confidence interval defining the upper and lower bounds (a value between 0 and 1).} }} alakazam/man/EdgeTest-class.Rd0000644000175000017500000000340114136536357016051 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Classes.R \docType{class} \name{EdgeTest-class} \alias{EdgeTest-class} \alias{EdgeTest} \alias{print,EdgeTest-method} \alias{EdgeTest-method} \alias{plot,EdgeTest,missing-method} \title{S4 class defining edge significance} \usage{ \S4method{print}{EdgeTest}(x) \S4method{plot}{EdgeTest,missing}(x, y, ...) } \arguments{ \item{x}{EdgeTest object.} \item{y}{ignored.} \item{...}{arguments to pass to \link{plotEdgeTest}.} } \description{ \code{EdgeTest} defines the significance of parent-child annotation enrichment. } \section{Slots}{ \describe{ \item{\code{tests}}{data.frame describing the significance test results with columns: \itemize{ \item \code{parent}: parent node annotation. \item \code{child}: child node annotation \item \code{count}: count of observed edges with the given parent-child annotation set. \item \code{expected}: mean count of expected edges for the given parent-child relationship. \item \code{pvalue}: one-sided p-value for the hypothesis that the observed edge abundance is greater than expected. }} \item{\code{permutations}}{data.frame containing the raw permutation test data with columns: \itemize{ \item \code{parent}: parent node annotation. \item \code{child}: child node annotation \item \code{count}: count of edges with the given parent-child annotation set. \item \code{iter}: numerical index define which permutation realization each observation corresponds to. }} \item{\code{nperm}}{number of permutation realizations.} }} alakazam/man/summarizeSubtrees.Rd0000644000175000017500000000431414136536357016777 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{summarizeSubtrees} \alias{summarizeSubtrees} \title{Generate subtree summary statistics for a tree} \usage{ summarizeSubtrees(graph, fields = NULL, root = "Germline") } \arguments{ \item{graph}{igraph object containing an annotated lineage tree.} \item{fields}{annotation fields to add to the output.} \item{root}{name of the root (germline) node.} } \value{ A data.frame with columns: \itemize{ \item \code{name}: node name. \item \code{parent}: name of the parent node. \item \code{outdegree}: number of edges leading from the node. \item \code{size}: total number of nodes within the subtree rooted at the node. \item \code{depth}: the depth of the subtree that is rooted at the node. \item \code{pathlength}: the maximum pathlength beneath the node. \item \code{outdegree_norm}: \code{outdegree} normalized by the total number of edges. \item \code{size_norm}: \code{size} normalized by the largest subtree size (the germline). \item \code{depth_norm}: \code{depth} normalized by the largest subtree depth (the germline). \item \code{pathlength_norm}: \code{pathlength} normalized by the largest subtree pathlength (the germline). } An additional column corresponding to the value of \code{field} is added when specified. } \description{ \code{summarizeSubtrees} calculates summary statistics for each node of a tree. Includes both node properties and subtree properties. } \examples{ # Summarize a tree graph <- ExampleTrees[[23]] summarizeSubtrees(graph, fields="c_call", root="Germline") } \seealso{ See \link{buildPhylipLineage} for generating input trees. See \link{getPathLengths} for calculating path length to nodes. } alakazam/man/seqDist.Rd0000644000175000017500000000427714136536357014672 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{seqDist} \alias{seqDist} \title{Calculate distance between two sequences} \usage{ seqDist(seq1, seq2, dist_mat = getDNAMatrix()) } \arguments{ \item{seq1}{character string containing a DNA sequence.} \item{seq2}{character string containing a DNA sequence.} \item{dist_mat}{Character distance matrix. Defaults to a Hamming distance matrix returned by \link{getDNAMatrix}. If gap characters, \code{c("-", ".")}, are assigned a value of -1 in \code{dist_mat} then contiguous gaps of any run length, which are not present in both sequences, will be counted as a distance of 1. Meaning, indels of any length will increase the sequence distance by 1. Gap values other than -1 will return a distance that does not consider indels as a special case.} } \value{ Numerical distance between \code{seq1} and \code{seq2}. } \description{ \code{seqDist} calculates the distance between two DNA sequences. } \examples{ # Ungapped examples seqDist("ATGGC", "ATGGG") seqDist("ATGGC", "ATG??") # Gaps will be treated as Ns with a gap=0 distance matrix seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=0)) # Gaps will be treated as universally non-matching characters with gap=1 seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=1)) # Gaps of any length will be treated as single mismatches with a gap=-1 distance matrix seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) # Gaps of equivalent run lengths are not counted as gaps seqDist("ATG-C", "ATG-C", dist_mat=getDNAMatrix(gap=-1)) # Overlapping runs of gap characters are counted as a single gap seqDist("ATG-C", "AT--C", dist_mat=getDNAMatrix(gap=-1)) seqDist("A-GGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) seqDist("AT--C", "AT--C", dist_mat=getDNAMatrix(gap=-1)) # Discontiguous runs of gap characters each count as separate gaps seqDist("-TGGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) } \seealso{ Nucleotide distance matrix may be built with \link{getDNAMatrix}. Amino acid distance matrix may be built with \link{getAAMatrix}. Used by \link{pairwiseDist} for generating distance matrices. See \link{seqEqual} for testing sequence equivalence. } alakazam/man/plotDiversityCurve.Rd0000644000175000017500000000445214136536357017137 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{plotDiversityCurve} \alias{plotDiversityCurve} \title{Plot the results of alphaDiversity} \usage{ plotDiversityCurve( data, colors = NULL, main_title = "Diversity", legend_title = "Group", log_x = FALSE, log_y = FALSE, xlim = NULL, ylim = NULL, annotate = c("none", "depth"), score = c("diversity", "evenness"), silent = FALSE, ... ) } \arguments{ \item{data}{\link{DiversityCurve} object returned by \link{alphaDiversity}.} \item{colors}{named character vector whose names are values in the \code{group} column of the \code{data} slot of \code{data}, and whose values are colors to assign to those group names.} \item{main_title}{string specifying the plot title.} \item{legend_title}{string specifying the legend title.} \item{log_x}{if \code{TRUE} then plot \eqn{q} on a log scale; if \code{FALSE} plot on a linear scale.} \item{log_y}{if \code{TRUE} then plot the diversity/evenness scores on a log scale; if \code{FALSE} plot on a linear scale.} \item{xlim}{numeric vector of two values specifying the \code{c(lower, upper)} x-axis limits.} \item{ylim}{numeric vector of two values specifying the \code{c(lower, upper)} y-axis limits.} \item{annotate}{string defining whether to added values to the group labels of the legend. When \code{"none"} (default) is specified no annotations are added. Specifying (\code{"depth"}) adds sequence counts to the labels.} \item{score}{one of \code{"diversity"} or \code{"evenness"} specifying which score to plot on the y-asis.} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotDiversityCurve} plots a \code{DiversityCurve} object. } \examples{ # Calculate diversity div <- alphaDiversity(ExampleDb, group="sample_id", nboot=100) # Plot diversity plotDiversityCurve(div, legend_title="Sample") #' # Plot diversity plotDiversityCurve(div, legend_title="Sample", score="evenness") } \seealso{ See \link{alphaDiversity} and \link{alphaDiversity} for generating \link{DiversityCurve} objects for input. Plotting is performed with \link{ggplot}. } alakazam/man/testMRCA.Rd0000644000175000017500000000246514136536357014675 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{testMRCA} \alias{testMRCA} \title{Tests for MRCA annotation enrichment in lineage trees} \usage{ testMRCA( graphs, field, root = "Germline", exclude = c("Germline", NA), nperm = 200, progress = FALSE ) } \arguments{ \item{graphs}{list of igraph object containing annotated lineage trees.} \item{field}{string defining the annotation field to test.} \item{root}{name of the root (germline) node.} \item{exclude}{vector of strings defining \code{field} values to exclude from the set of potential founder annotations.} \item{nperm}{number of permutations to perform.} \item{progress}{if \code{TRUE} show a progress bar.} } \value{ An \link{MRCATest} object containing the test results and permutation realizations. } \description{ \code{testMRCA} performs a permutation test on a set of lineage trees to determine the significance of an annotation's association with the MRCA position of the lineage trees. } \examples{ \donttest{ # Define example tree set graphs <- ExampleTrees[1-10] # Perform MRCA test on isotypes x <- testMRCA(graphs, "c_call", nperm=10) print(x) } } \seealso{ Uses \link{getMRCA} and \link{getPathLengths}. See \link{plotMRCATest} for plotting the permutation distributions. } alakazam/man/IMGT_REGIONS.Rd0000644000175000017500000000131214136536357015167 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{IMGT_REGIONS} \alias{IMGT_REGIONS} \title{IMGT V-segment regions} \format{ A list with regions named one of \code{c("fwr1", "cdr1", "fwr2", "cdr2", "fwr3")} with values containing a numeric vector of length two defining the \code{c(start, end)} positions of the named region. } \usage{ IMGT_REGIONS } \description{ A list defining the boundaries of V-segment framework regions (FWRs) and complementarity determining regions (CDRs) for IMGT-gapped immunoglobulin (Ig) nucleotide sequences according to the IMGT numbering scheme. } \references{ \url{http://imgt.org} } \keyword{datasets} alakazam/man/SingleDb.Rd0000644000175000017500000000122214136536357014730 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{SingleDb} \alias{SingleDb} \title{Single sequence AIRR database} \format{ An object of class \code{spec_tbl_df} (inherits from \code{tbl_df}, \code{tbl}, \code{data.frame}) with 1 rows and 32 columns. } \usage{ SingleDb } \description{ A database with just one sequence from \code{ExampleDb} and additional AIRR Rearrangement fields containing alignment information. The sequence was reanalyzed with a recent versions of alignment software (IgBLAST 1.16.0) and reference germlines (IMGT 2020-08-12). } \seealso{ \link{ExampleDb} } \keyword{datasets} alakazam/man/readChangeoDb.Rd0000644000175000017500000000364414136536357015721 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{readChangeoDb} \alias{readChangeoDb} \title{Read a Change-O tab-delimited database file} \usage{ readChangeoDb(file, select = NULL, drop = NULL, seq_upper = TRUE) } \arguments{ \item{file}{tab-delimited database file output by a Change-O tool.} \item{select}{columns to select from database file.} \item{drop}{columns to drop from database file.} \item{seq_upper}{if \code{TRUE} convert sequence columns to upper case; if \code{FALSE} do not alter sequence columns. See Value for a list of which columns are effected.} } \value{ A data.frame of the database file. Columns will be imported as is, except for the following columns which will be explicitly converted into character values: \itemize{ \item SEQUENCE_ID \item CLONE \item SAMPLE } And the following sequence columns which will converted to upper case if \code{seq_upper=TRUE} (default). \itemize{ \item SEQUENCE_INPUT \item SEQUENCE_VDJ \item SEQUENCE_IMGT \item JUNCTION \item GERMLINE_IMGT \item GERMLINE_IMGT_D_MASK } } \description{ \code{readChangeoDb} reads a tab-delimited database file created by a Change-O tool into a data.frame. } \examples{ \dontrun{ # Read all columns in and convert sequence fields to upper case db <- readChangeoDb("changeo.tsv") # Subset columns and convert sequence fields to upper case db <- readChangeoDb("changeo.tsv", select=c("SEQUENCE_ID", "SEQUENCE_IMGT")) # Drop columns and do not alter sequence field case db <- readChangeoDb("changeo.tsv", drop=c("D_CALL", "DUPCOUNT"), seq_upper=FALSE) } } \seealso{ Wraps \link[readr]{read_delim}. See \link{writeChangeoDb} for writing to Change-O files. } alakazam/man/makeTempDir.Rd0000644000175000017500000000101214136536357015440 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{makeTempDir} \alias{makeTempDir} \title{Create a temporary folder} \usage{ makeTempDir(prefix) } \arguments{ \item{prefix}{prefix name for the folder.} } \value{ The path to the temporary folder. } \description{ \code{makeTempDir} creates a randomly named temporary folder in the system temp location. } \examples{ makeTempDir("Clone50") } \seealso{ This is just a wrapper for \link{tempfile} and \link{dir.create}. } alakazam/man/ExampleDb.Rd0000644000175000017500000000417014136536357015107 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{ExampleDb} \alias{ExampleDb} \title{Example AIRR database} \format{ A data.frame with the following AIRR style columns: \itemize{ \item \code{sequence_id}: Sequence identifier \item \code{sequence_alignment}: IMGT-gapped observed sequence. \item \code{germline_alignment}: IMGT-gapped germline sequence. \item \code{germline_alignment_d_mask}: IMGT-gapped germline sequence with N, P and D regions masked. \item \code{v_call}: V region allele assignments. \item \code{v_call_genotyped}: TIgGER corrected V region allele assignment. \item \code{d_call}: D region allele assignments. \item \code{j_call}: J region allele assignments. \item \code{c_call}: Isotype (C region) assignment. \item \code{junction}: Junction region sequence. \item \code{junction_length}: Length of the junction region in nucleotides. \item \code{np1_length}: Combined length of the N and P regions proximal to the V region. \item \code{np2_length}: Combined length of the N and P regions proximal to the J region. \item \code{duplicate_count}: Copy count (number of duplicates) of the sequence. \item \code{clone_id}: Change-O assignment clonal group identifier. \item \code{sample_id}: Sample identifier. Time in relation to vaccination. } } \usage{ ExampleDb } \description{ A small example database subset from Laserson and Vigneault et al, 2014. } \references{ \enumerate{ \item Laserson U and Vigneault F, et al. High-resolution antibody dynamics of vaccine-induced immune responses. Proc Natl Acad Sci USA. 2014 111:4928-33. } } \seealso{ \link{ExampleDbChangeo} \link{ExampleTrees} } \keyword{datasets} alakazam/man/tableEdges.Rd0000644000175000017500000000352414136536357015307 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{tableEdges} \alias{tableEdges} \title{Tabulate the number of edges between annotations within a lineage tree} \usage{ tableEdges(graph, field, indirect = FALSE, exclude = NULL) } \arguments{ \item{graph}{igraph object containing an annotated lineage tree.} \item{field}{string defining the annotation field to count.} \item{indirect}{if \code{FALSE} count direct connections (edges) only. If \code{TRUE} walk through any nodes with annotations specified in the \code{argument} to count indirect connections. Specifying \code{indirect=TRUE} with \code{exclude=NULL} will have no effect.} \item{exclude}{vector of strings defining \code{field} values to exclude from counts. Edges that either start or end with the specified annotations will not be counted. If \code{NULL} count all edges.} } \value{ A data.frame defining total annotation connections in the tree with columns: \itemize{ \item \code{parent}: parent annotation \item \code{child}: child annotation \item \code{count}: count of edges for the parent-child relationship } } \description{ \code{tableEdges} creates a table of the total number of connections (edges) for each unique pair of annotations within a tree over all nodes. } \examples{ # Define example graph graph <- ExampleTrees[[23]] # Count direct edges between isotypes including inferred nodes tableEdges(graph, "c_call") # Count direct edges excluding edges to and from germline and inferred nodes tableEdges(graph, "c_call", exclude=c("Germline", NA)) # Count indirect edges walking through germline and inferred nodes tableEdges(graph, "c_call", indirect=TRUE, exclude=c("Germline", NA)) } \seealso{ See \link{testEdges} for performed a permutation test on edge relationships. } alakazam/man/graphToPhylo.Rd0000644000175000017500000000443414136536357015671 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Lineage.R \name{graphToPhylo} \alias{graphToPhylo} \title{Convert a tree in igraph \code{graph} format to ape \code{phylo} format.} \usage{ graphToPhylo(graph) } \arguments{ \item{graph}{An igraph \code{graph} object.} } \value{ A \code{phylo} object representing the input tree. Tip and internal node names are stored in the \code{tip.label} and \code{node.label} vectors, respectively. } \description{ \code{graphToPhylo} a tree in igraph \code{graph} format to ape \code{phylo} format. } \details{ Convert from igraph \code{graph} object to ape \code{phylo} object. If \code{graph} object was previously rooted with the germline as the direct ancestor, this will re-attach the germline as a descendant node with a zero branch length to a new universal common ancestor (UCA) node and store the germline node ID in the \code{germid} attribute and UCA node number in the \code{uca} attribute. Otherwise these attributes will not be specified in the \code{phylo} object. Using \code{phyloToGraph(phylo, germline=phylo$germid)} creates a \code{graph} object with the germline back as the direct ancestor. Tip and internal node names are stored in the \code{tip.label} and \code{node.label} vectors, respectively. } \examples{ \dontrun{ library(igraph) library(ape) #convert to phylo phylo = graphToPhylo(graph) #plot tree using ape plot(phylo,show.node.label=TRUE) #store as newick tree write.tree(phylo,file="tree.newick") #read in tree from newick file phylo_r = read.tree("tree.newick") #convert to igraph graph_r = phyloToGraph(phylo_r,germline="Germline") #plot graph - same as before, possibly rotated plot(graph_r,layout=layout_as_tree) } } \references{ \enumerate{ \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody Lineages. Genetics 2017 206(1):417-427 https://doi.org/10.1534/genetics.116.196303 \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - Repertoire-wide phylogenetic models of B cell molecular evolution reveal evolutionary signatures of aging and vaccination. bioRxiv 2019 https://doi.org/10.1101/558825 } } alakazam/man/plotSubtrees.Rd0000644000175000017500000000552114136536357015742 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{plotSubtrees} \alias{plotSubtrees} \title{Plots subtree statistics for multiple trees} \usage{ plotSubtrees( graphs, field, stat, root = "Germline", exclude = c("Germline", NA), colors = NULL, main_title = "Subtrees", legend_title = "Annotation", style = c("box", "violin"), silent = FALSE, ... ) } \arguments{ \item{graphs}{list of igraph objects containing annotated lineage trees.} \item{field}{string defining the annotation field.} \item{stat}{string defining the subtree statistic to plot. One of: \itemize{ \item \code{outdegree}: distribution of normalized node outdegrees. \item \code{size}: distribution of normalized subtree sizes. \item \code{depth}: distribution of subtree depths. \item \code{pathlength}: distribution of maximum pathlength beneath nodes. }} \item{root}{name of the root (germline) node.} \item{exclude}{vector of strings defining \code{field} values to exclude from plotting.} \item{colors}{named vector of colors for values in \code{field}, with names defining annotation names \code{field} column and values being colors. Also controls the order in which values appear on the plot. If \code{NULL} alphabetical ordering and a default color palette will be used.} \item{main_title}{string specifying the plot title.} \item{legend_title}{string specifying the legend title.} \item{style}{string specifying the style of plot to draw. One of: \itemize{ \item \code{"histogram"}: histogram of the annotation count distribution with a red dotted line denoting the observed value. \item \code{"cdf"}: cumulative distribution function of annotation counts with a red dotted line denoting the observed value and a blue dotted line indicating the p-value. }} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotSubtree} plots distributions of normalized subtree statistics for a set of lineage trees, broken down by annotation value. } \examples{ # Define example tree set graphs <- ExampleTrees[1-10] # Violin plots of node outdegree by sample plotSubtrees(graphs, "sample_id", "out", style="v") # Violin plots of subtree size by sample plotSubtrees(graphs, "sample_id", "size", style="v") # Boxplot of node depth by isotype plotSubtrees(graphs, "c_call", "depth", style="b") } \seealso{ Subtree statistics are calculated with \link{summarizeSubtrees}. } alakazam/man/getPositionQuality.Rd0000644000175000017500000000265714136536357017133 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Fastq.R \name{getPositionQuality} \alias{getPositionQuality} \title{Get a data.frame with sequencing qualities per position} \usage{ getPositionQuality( data, sequence_id = "sequence_id", sequence = "sequence_alignment", quality_num = "quality_alignment_num" ) } \arguments{ \item{data}{\code{data.frame} containing sequence data.} \item{sequence_id}{column in \code{data} with sequence identifiers.} \item{sequence}{column in \code{data} with sequence data.} \item{quality_num}{column in \code{data} with quality scores (as strings of numeric values, comma separated) for \code{sequence}.} } \value{ \code{data} with one additional field with masked sequences. The name of this field is created concatenating \code{sequence} and '_masked'. } \description{ \code{getPositionQuality} takes a data.frame with sequence quality scores in the form of a strings of comma separated numeric values, split the quality scores values by \code{","}, and returns a data.frame with the values for each position. } \examples{ db <- airr::read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") db <- readFastqDb(db, fastq_file, quality_offset=-33) head(getPositionQuality(db)) } \seealso{ \link{readFastqDb} and \link{maskPositionsByQuality} } alakazam/man/padSeqEnds.Rd0000644000175000017500000000244114136536357015274 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{padSeqEnds} \alias{padSeqEnds} \title{Pads ragged ends of aligned DNA sequences} \usage{ padSeqEnds(seq, len = NULL, start = FALSE, pad_char = "N", mod3 = TRUE) } \arguments{ \item{seq}{character vector of DNA sequence strings.} \item{len}{length to pad to. Only applies if longer than the maximum length of the data in \code{seq}.} \item{start}{if \code{TRUE} pad the beginning of each sequence instead of the end.} \item{pad_char}{character to use for padding.} \item{mod3}{if \code{TRUE} pad sequences to be of length multiple three.} } \value{ A modified \code{seq} vector with padded sequences. } \description{ \code{padSeqEnds} takes a vector of DNA sequences, as character strings, and appends the ends of each sequence with an appropriate number of \code{"N"} characters to create a sequence vector with uniform lengths. } \examples{ # Default behavior uniformly pads ragged ends seq <- c("CCCCTGGG", "ACCCTG", "CCCC") padSeqEnds(seq) # Pad to fixed length padSeqEnds(seq, len=15) # Add padding to the beginning of the sequences instead of the ends padSeqEnds(seq, start=TRUE) padSeqEnds(seq, len=15, start=TRUE) } \seealso{ See \link{maskSeqEnds} for creating uniform masking from existing masking. } alakazam/man/writeChangeoDb.Rd0000644000175000017500000000125214136536357016131 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{writeChangeoDb} \alias{writeChangeoDb} \title{Write a Change-O tab-delimited database file} \usage{ writeChangeoDb(data, file) } \arguments{ \item{data}{data.frame of Change-O data.} \item{file}{output file name.} } \description{ \code{writeChangeoDb} is a simple wrapper around \link[readr]{write_delim} with defaults appropriate for writing a Change-O tab-delimited database file from a data.frame. } \examples{ \dontrun{ # Write a database writeChangeoDb(data, "changeo.tsv") } } \seealso{ Wraps \link[readr]{write_delim}. See \link{readChangeoDb} for reading to Change-O files. } alakazam/man/baseTheme.Rd0000644000175000017500000000115014136536357015136 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{baseTheme} \alias{baseTheme} \title{Standard ggplot settings} \usage{ baseTheme(sizing = c("figure", "window")) } \arguments{ \item{sizing}{defines the style and sizing of the theme. One of \code{c("figure", "window")} where \code{sizing="figure"} is appropriately sized for pdf export at 7 to 7.5 inch width, and \code{sizing="window"} is sized for an interactive session.} } \value{ A ggplot2 object. } \description{ \code{baseTheme} defines common ggplot theme settings for plotting. } \seealso{ \link[ggplot2]{theme}. } alakazam/man/stoufferMeta.Rd0000644000175000017500000000131414136536357015707 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{stoufferMeta} \alias{stoufferMeta} \title{Weighted meta-analysis of p-values via Stouffer's method} \usage{ stoufferMeta(p, w = NULL) } \arguments{ \item{p}{numeric vector of p-values.} \item{w}{numeric vector of weights.} } \value{ A named numeric vector with the combined Z-score and p-value in the form \code{c(Z, pvalue)}. } \description{ \code{stoufferMeta} combines multiple weighted p-values into a meta-analysis p-value using Stouffer's Z-score method. } \examples{ # Define p-value and weight vectors p <- c(0.1, 0.05, 0.3) w <- c(5, 10, 1) # Unweighted stoufferMeta(p) # Weighted stoufferMeta(p, w) } alakazam/man/ExampleTrees.Rd0000644000175000017500000000144214136536357015643 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{ExampleTrees} \alias{ExampleTrees} \title{Example Ig lineage trees} \format{ A list of igraph objects output by \link{buildPhylipLineage}. Each node of each tree has the following annotations (vertex attributes): \itemize{ \item \code{sample_id}: Sample identifier(s). Time in relation to vaccination. \item \code{c_call}: Isotype assignment(s). \item \code{duplication_count}: Copy count (number of duplicates) of the sequence. } } \usage{ ExampleTrees } \description{ A set of Ig lineage trees generated from the \code{ExampleDb} file, subset to only those trees with at least four nodes. } \seealso{ \link{ExampleTrees} } \keyword{datasets} alakazam/man/rarefyDiversity.Rd0000644000175000017500000001012414136536357016435 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Deprecated.R \name{rarefyDiversity} \alias{rarefyDiversity} \title{Generate a clonal diversity index curve} \usage{ rarefyDiversity( data, group, clone = "CLONE", copy = NULL, min_q = 0, max_q = 4, step_q = 0.05, min_n = 30, max_n = NULL, ci = 0.95, nboot = 2000, uniform = TRUE, progress = FALSE ) } \arguments{ \item{data}{data.frame with Change-O style columns containing clonal assignments.} \item{group}{name of the \code{data} column containing group identifiers.} \item{clone}{name of the \code{data} column containing clone identifiers.} \item{copy}{name of the \code{data} column containing copy numbers for each sequence. If \code{copy=NULL} (the default), then clone abundance is determined by the number of sequences. If a \code{copy} column is specified, then clone abundances is determined by the sum of copy numbers within each clonal group.} \item{min_q}{minimum value of \eqn{q}.} \item{max_q}{maximum value of \eqn{q}.} \item{step_q}{value by which to increment \eqn{q}.} \item{min_n}{minimum number of observations to sample. A group with less observations than the minimum is excluded.} \item{max_n}{maximum number of observations to sample. If \code{NULL} then no maximum is set.} \item{ci}{confidence interval to calculate; the value must be between 0 and 1.} \item{nboot}{number of bootstrap realizations to generate.} \item{uniform}{if \code{TRUE} then uniformly resample each group to the same number of observations. If \code{FALSE} then allow each group to be resampled to its original size or, if specified, \code{max_size}.} \item{progress}{if \code{TRUE} show a progress bar.} } \value{ A \link{DiversityCurve} object summarizing the diversity scores. } \description{ \code{rarefyDiversity} divides a set of clones by a group annotation, resamples the sequences from each group, and calculates diversity scores (\eqn{D}) over an interval of diversity orders (\eqn{q}). } \details{ Clonal diversity is calculated using the generalized diversity index (Hill numbers) proposed by Hill (Hill, 1973). See \link{calcDiversity} for further details. Diversity is calculated on the estimated complete clonal abundance distribution. This distribution is inferred by using the Chao1 estimator to estimate the number of seen clones, and applying the relative abundance correction and unseen clone frequency described in Chao et al, 2015. To generate a smooth curve, \eqn{D} is calculated for each value of \eqn{q} from \code{min_q} to \code{max_q} incremented by \code{step_q}. When \code{uniform=TRUE} variability in total sequence counts across unique values in the \code{group} column is corrected by repeated resampling from the estimated complete clonal distribution to a common number of sequences. The diversity index (\eqn{D}) for each group is the mean value of over all resampling realizations. Confidence intervals are derived using the standard deviation of the resampling realizations, as described in Chao et al, 2015. } \examples{ \dontrun{ # Group by sample identifier div <- rarefyDiversity(ExampleDb, "sample_id", step_q=1, max_q=10, nboot=100) plotDiversityCurve(div, legend_title="Sample") # Grouping by isotype rather than sample identifier div <- rarefyDiversity(ExampleDb, "c_call", min_n=40, step_q=1, max_q=10, nboot=100) plotDiversityCurve(div, legend_title="Isotype") } } \references{ \enumerate{ \item Hill M. Diversity and evenness: a unifying notation and its consequences. Ecology. 1973 54(2):427-32. \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. Scand J Stat. 1984 11, 265270. \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: A framework for sampling and estimation in species diversity studies. Ecol Monogr. 2014 84:45-67. \item Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. } } \seealso{ \link{alphaDiversity} } alakazam/man/translateStrings.Rd0000644000175000017500000000242414136536357016615 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{translateStrings} \alias{translateStrings} \title{Translate a vector of strings} \usage{ translateStrings(strings, translation) } \arguments{ \item{strings}{vector of character strings to modify.} \item{translation}{named character vector or a list of character vectors specifying the strings to replace (values) and their replacements (names).} } \value{ A modified \code{strings} vector. } \description{ \code{translateStrings} modifies a character vector by substituting one or more strings with a replacement string. } \details{ Does not perform partial replacements. Each translation value must match a complete \code{strings} value or it will not be replaced. Values that do not have a replacement named in the \code{translation} parameter will not be modified. Replacement is accomplished using \link{gsub}. } \examples{ # Using a vector translation strings <- LETTERS[1:5] translation <- c("POSITION1"="A", "POSITION5"="E") translateStrings(strings, translation) # Using a list translation strings <- LETTERS[1:5] translation <- list("1-3"=c("A","B","C"), "4-5"=c("D","E")) translateStrings(strings, translation) } \seealso{ See \link{gsub} for single value replacement in the base package. } alakazam/man/bulk.Rd0000644000175000017500000000264514136536357014210 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{bulk} \alias{bulk} \title{Calculates the average bulkiness of amino acid sequences} \usage{ bulk(seq, bulkiness = NULL) } \arguments{ \item{seq}{vector of strings containing amino acid sequences.} \item{bulkiness}{named numerical vector defining bulkiness scores for each amino acid, where names are single-letter amino acid character codes. If \code{NULL}, then the Zimmerman et al, 1968 scale is used.} } \value{ A vector of bulkiness scores for the sequence(s). } \description{ \code{bulk} calculates the average bulkiness score of amino acid sequences. Non-informative positions are excluded, where non-informative is defined as any character in \code{c("X", "-", ".", "*")}. } \examples{ # Default bulkiness scale seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") bulk(seq) # Use the Grantham, 1974 side chain volumn scores from the seqinr package library(seqinr) data(aaindex) x <- aaindex[["GRAR740103"]]$I # Rename the score vector to use single-letter codes names(x) <- translateStrings(names(x), ABBREV_AA) # Calculate average volume bulk(seq, bulkiness=x) } \references{ \enumerate{ \item Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). } } \seealso{ For additional size related indices see \link[seqinr]{aaindex}. } alakazam/man/aliphatic.Rd0000644000175000017500000000215614136536357015206 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{aliphatic} \alias{aliphatic} \title{Calculates the aliphatic index of amino acid sequences} \usage{ aliphatic(seq, normalize = TRUE) } \arguments{ \item{seq}{vector of strings containing amino acid sequences.} \item{normalize}{if \code{TRUE} then divide the aliphatic index of each amino acid sequence by the number of informative positions. Non-informative position are defined by the presence any character in \code{c("X", "-", ".", "*")}. If \code{FALSE} then return the raw aliphatic index.} } \value{ A vector of the aliphatic indices for the sequence(s). } \description{ \code{aliphatic} calculates the aliphatic index of amino acid sequences using the method of Ikai. Non-informative positions are excluded, where non-informative is defined as any character in \code{c("X", "-", ".", "*")}. } \examples{ seq <- c("CARDRSTPWRRGIASTTVRTSW", NA, "XXTQMYVRT") aliphatic(seq) } \references{ \enumerate{ \item Ikai AJ. Thermostability and aliphatic index of globular proteins. J Biochem. 88, 1895-1898 (1980). } } alakazam/man/MRCATest-class.Rd0000644000175000017500000000327714136536357015742 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Classes.R \docType{class} \name{MRCATest-class} \alias{MRCATest-class} \alias{MRCATest} \alias{print,MRCATest-method} \alias{MRCATest-method} \alias{plot,MRCATest,missing-method} \title{S4 class defining edge significance} \usage{ \S4method{print}{MRCATest}(x) \S4method{plot}{MRCATest,missing}(x, y, ...) } \arguments{ \item{x}{MRCATest object.} \item{y}{ignored.} \item{...}{arguments to pass to \link{plotMRCATest}.} } \description{ \code{MRCATest} defines the significance of enrichment for annotations appearing at the MRCA of the tree. } \section{Slots}{ \describe{ \item{\code{tests}}{data.frame describing the significance test results with columns: \itemize{ \item \code{annotation}: annotation value. \item \code{count}: observed count of MRCA positions with the given annotation. \item \code{expected}: expected mean count of MRCA occurance for the annotation. \item \code{pvalue}: one-sided p-value for the hypothesis that the observed annotation abundance is greater than expected. }} \item{\code{permutations}}{data.frame containing the raw permutation test data with columns: \itemize{ \item \code{annotation}: annotation value. \item \code{count}: count of MRCA positions with the given annotation. \item \code{iter}: numerical index define which permutation realization each observation corresponds to. }} \item{\code{nperm}}{number of permutation realizations.} }} alakazam/man/alphaDiversity.Rd0000644000175000017500000001060414136536357016235 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{alphaDiversity} \alias{alphaDiversity} \title{Calculate clonal alpha diversity} \usage{ alphaDiversity(data, min_q = 0, max_q = 4, step_q = 0.1, ci = 0.95, ...) } \arguments{ \item{data}{data.frame with Change-O style columns containing clonal assignments or a \link{AbundanceCurve} generate by \link{estimateAbundance} object containing a previously calculated bootstrap distributions of clonal abundance.} \item{min_q}{minimum value of \eqn{q}.} \item{max_q}{maximum value of \eqn{q}.} \item{step_q}{value by which to increment \eqn{q}.} \item{ci}{confidence interval to calculate; the value must be between 0 and 1.} \item{...}{additional arguments to pass to \link{estimateAbundance}. Additional arguments are ignored if a \link{AbundanceCurve} is provided as input.} } \value{ A \link{DiversityCurve} object summarizing the diversity scores. } \description{ \code{alphaDiversity} takes in a data.frame or \link{AbundanceCurve} and computes diversity scores (\eqn{D}) over an interval of diversity orders (\eqn{q}). } \details{ Clonal diversity is calculated using the generalized diversity index (Hill numbers) proposed by Hill (Hill, 1973). See \link{calcDiversity} for further details. To generate a smooth curve, \eqn{D} is calculated for each value of \eqn{q} from \code{min_q} to \code{max_q} incremented by \code{step_q}. When \code{uniform=TRUE} variability in total sequence counts across unique values in the \code{group} column is corrected by repeated resampling from the estimated complete clonal distribution to a common number of sequences. The complete clonal abundance distribution that is resampled from is inferred by using the Chao1 estimator to infer the number of unseen clones, followed by applying the relative abundance correction and unseen clone frequencies described in Chao et al, 2015. The diversity index (\eqn{D}) for each group is the mean value of over all resampling realizations. Confidence intervals are derived using the standard deviation of the resampling realizations, as described in Chao et al, 2015. Significance of the difference in diversity index (\code{D}) between groups is tested by constructing a bootstrap delta distribution for each pair of unique values in the \code{group} column. The bootstrap delta distribution is built by subtracting the diversity index \code{Da} in group \code{a} from the corresponding value \eqn{Db} in group \code{b}, for all bootstrap realizations, yielding a distribution of \code{nboot} total deltas; where group \code{a} is the group with the greater mean \code{D}. The p-value for hypothesis \code{Da != Db} is the value of \code{P(0)} from the empirical cumulative distribution function of the bootstrap delta distribution, multiplied by 2 for the two-tailed correction. Note, this method may inflate statistical significance when clone sizes are uniformly small, such as when most clones sizes are 1, sample size is small, and \code{max_n} is near the total count of the smallest data group. Use caution when interpreting the results in such cases. } \examples{ # Group by sample identifier in two steps abund <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) div <- alphaDiversity(abund, step_q=1, max_q=10) plotDiversityCurve(div, legend_title="Sample") # Grouping by isotype rather than sample identifier in one step div <- alphaDiversity(ExampleDb, group="c_call", min_n=40, step_q=1, max_q=10, nboot=100) plotDiversityCurve(div, legend_title="Isotype") } \references{ \enumerate{ \item Hill M. Diversity and evenness: a unifying notation and its consequences. Ecology. 1973 54(2):427-32. \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. Scand J Stat. 1984 11, 265270. \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: A framework for sampling and estimation in species diversity studies. Ecol Monogr. 2014 84:45-67. \item Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. } } \seealso{ See \link{calcDiversity} for the basic calculation and \link{DiversityCurve} for the return object. See \link{plotDiversityCurve} for plotting the return object. } alakazam/man/charge.Rd0000644000175000017500000000324214136536357014476 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{charge} \alias{charge} \title{Calculates the net charge of amino acid sequences.} \usage{ charge(seq, pH = 7.4, pK = NULL, normalize = FALSE) } \arguments{ \item{seq}{vector strings defining of amino acid sequences.} \item{pH}{environmental pH.} \item{pK}{named vector defining pK values for each charged amino acid, where names are the single-letter amino acid character codes \code{c("R", "H", "K", "D", "E", "C", "Y")}). If \code{NULL}, then the EMBOSS scale is used.} \item{normalize}{if \code{TRUE} then divide the net charge of each amino acid sequence by the number of informative positions. Non-informative position are defined by the presence any character in \code{c("X", "-", ".", "*")}. If \code{FALSE} then return the raw net charge.} } \value{ A vector of net charges for the sequence(s). } \description{ \code{charge} calculates the net charge of amino acid sequences using the method of Moore, 1985, with exclusion of the C-terminus and N-terminus charges. } \examples{ seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") # Unnormalized charge charge(seq) # Normalized charge charge(seq, normalize=TRUE) # Use the Murray et al, 2006 scores from the seqinr package library(seqinr) data(pK) x <- setNames(pK[["Murray"]], rownames(pK)) # Calculate charge charge(seq, pK=x) } \references{ \enumerate{ \item Moore DS. Amino acid and peptide net charges: A simple calculational procedure. Biochem Educ. 13, 10-11 (1985). \item \url{http://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} } } \seealso{ For additional pK scales see \code{\link[seqinr]{pK}}. } alakazam/man/permuteLabels.Rd0000644000175000017500000000207014136536357016047 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{permuteLabels} \alias{permuteLabels} \title{Permute the node labels of a tree} \usage{ permuteLabels(graph, field, exclude = c("Germline", NA)) } \arguments{ \item{graph}{igraph object containing an annotated lineage tree.} \item{field}{string defining the annotation field to permute.} \item{exclude}{vector of strings defining \code{field} values to exclude from permutation.} } \value{ A modified igraph object with vertex annotations permuted. } \description{ \code{permuteLabels} permutes the node annotations of a lineage tree. } \examples{ # Define and plot example graph library(igraph) graph <- ExampleTrees[[23]] plot(graph, layout=layout_as_tree, vertex.label=V(graph)$c_call, vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") # Permute annotations and plot new tree g <- permuteLabels(graph, "c_call") plot(g, layout=layout_as_tree, vertex.label=V(g)$c_call, vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") } \seealso{ \link{testEdges}. } alakazam/man/getMRCA.Rd0000644000175000017500000000357514136536357014500 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{getMRCA} \alias{getMRCA} \title{Retrieve the first non-root node of a lineage tree} \usage{ getMRCA( graph, path = c("distance", "steps"), root = "Germline", field = NULL, exclude = NULL ) } \arguments{ \item{graph}{igraph object containing an annotated lineage tree.} \item{path}{string defining whether to use unweighted (steps) or weighted (distance) measures for determining the founder node set..} \item{root}{name of the root (germline) node.} \item{field}{annotation field to use for both unweighted path length exclusion and consideration as an MRCA node. If \code{NULL} do not exclude any nodes.} \item{exclude}{vector of annotation values in \code{field} to exclude from the potential MRCA set. If \code{NULL} do not exclude any nodes. Has no effect if \code{field=NULL}.} } \value{ A data.frame of the MRCA node(s) containing the columns: \itemize{ \item \code{name}: node name \item \code{steps}: path length as the number of nodes traversed \item \code{distance}: path length as the sum of edge weights } Along with additional columns corresponding to the annotations of the input graph. } \description{ \code{getMRCA} returns the set of lineage tree nodes with the minimum weighted or unweighted path length from the root (germline) of the lineage tree, allowing for exclusion of specific groups of nodes. } \examples{ # Define example graph graph <- ExampleTrees[[23]] # Use unweighted path length and do not exclude any nodes getMRCA(graph, path="steps", root="Germline") # Exclude nodes without an isotype annotation and use weighted path length getMRCA(graph, path="distance", root="Germline", field="c_call", exclude=NA) } \seealso{ Path lengths are determined with \link{getPathLengths}. } alakazam/man/calcDiversity.Rd0000644000175000017500000000346614136536357016062 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{calcDiversity} \alias{calcDiversity} \title{Calculate the diversity index} \usage{ calcDiversity(p, q) } \arguments{ \item{p}{numeric vector of clone (species) counts or proportions.} \item{q}{numeric vector of diversity orders.} } \value{ A vector of diversity scores \eqn{D} for each \eqn{q}. } \description{ \code{calcDiversity} calculates the clonal diversity index for a vector of diversity orders. } \details{ This method, proposed by Hill (Hill, 1973), quantifies diversity as a smooth function (\eqn{D}) of a single parameter \eqn{q}. Special cases of the generalized diversity index correspond to the most popular diversity measures in ecology: species richness (\eqn{q = 0}), the exponential of the Shannon-Weiner index (\eqn{q} approaches \eqn{1}), the inverse of the Simpson index (\eqn{q = 2}), and the reciprocal abundance of the largest clone (\eqn{q} approaches \eqn{+\infty}). At \eqn{q = 0} different clones weight equally, regardless of their size. As the parameter \eqn{q} increase from \eqn{0} to \eqn{+\infty} the diversity index (\eqn{D}) depends less on rare clones and more on common (abundant) ones, thus encompassing a range of definitions that can be visualized as a single curve. Values of \eqn{q < 0} are valid, but are generally not meaningful. The value of \eqn{D} at \eqn{q=1} is estimated by \eqn{D} at \eqn{q=0.9999}. } \examples{ # May define p as clonal member counts p <- c(1, 1, 3, 10) q <- c(0, 1, 2) calcDiversity(p, q) # Or proportional abundance p <- c(1/15, 1/15, 1/5, 2/3) calcDiversity(p, q) } \references{ \enumerate{ \item Hill M. Diversity and evenness: a unifying notation and its consequences. Ecology. 1973 54(2):427-32. } } \seealso{ Used by \link{alphaDiversity}. } alakazam/man/Example10x.Rd0000644000175000017500000000425314136536357015174 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{Example10x} \alias{Example10x} \title{Small example 10x Genomics Ig V(D)J sequences from CD19+ B cells isolated from PBMCs of a healthy human donor. Down-sampled from data provided by 10x Genomics under a Creative Commons Attribute license, and processed with their Cell Ranger pipeline.} \format{ A data.frame with the following AIRR style columns: \itemize{ \item \code{sequence_id}: Sequence identifier \item \code{sequence_alignment}: IMGT-gapped observed sequence. \item \code{germline_alignment}: IMGT-gapped germline sequence. \item \code{v_call}: V region allele assignments. \item \code{d_call}: D region allele assignments. \item \code{j_call}: J region allele assignments. \item \code{c_call}: Isotype (C region) assignment. \item \code{junction}: Junction region sequence. \item \code{junction_length}: Length of the junction region in nucleotides. \item \code{np1_length}: Combined length of the N and P regions proximal to the V region. \item \code{np2_length}: Combined length of the N and P regions proximal to the J region. \item \code{umi_count}: Number of unique molecular identifies atttributed to sequence. \item \code{cell_id}: Cell identifier. \item \code{locus}: Genomic locus of sequence. } } \usage{ Example10x } \description{ Small example 10x Genomics Ig V(D)J sequences from CD19+ B cells isolated from PBMCs of a healthy human donor. Down-sampled from data provided by 10x Genomics under a Creative Commons Attribute license, and processed with their Cell Ranger pipeline. } \references{ \enumerate{ \item Data source: https://support.10xgenomics.com/single-cell-vdj/datasets/2.2.0/vdj_v1_hs_cd19_b \item License: https://creativecommons.org/licenses/by/4.0/ } } \keyword{datasets} alakazam/man/isValidAASeq.Rd0000644000175000017500000000164114136536357015514 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{isValidAASeq} \alias{isValidAASeq} \title{Validate amino acid sequences} \usage{ isValidAASeq(seq) } \arguments{ \item{seq}{character vector of sequences to check.} } \value{ A logical vector with \code{TRUE} for each valid amino acid sequences and \code{FALSE} for each invalid sequence. } \description{ \code{isValidAASeq} checks that a set of sequences are valid non-ambiguous amino acid sequences. A sequence is considered valid if it contains only characters in the the non-ambiguous IUPAC character set or any characters in \code{c("X", ".", "-", "*")}. } \examples{ seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVR--XX", "CARJ", "10") isValidAASeq(seq) } \seealso{ See \link{ABBREV_AA} for the set of non-ambiguous amino acid characters. See \link{IUPAC_AA} for the full set of ambiguous amino acid characters. } alakazam/man/DiversityCurve-class.Rd0000644000175000017500000000524214136536357017341 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Classes.R \docType{class} \name{DiversityCurve-class} \alias{DiversityCurve-class} \alias{DiversityCurve} \alias{print,DiversityCurve-method} \alias{DiversityCurve-method} \alias{plot,DiversityCurve,missing-method} \alias{plot,DiversityCurve,numeric-method} \title{S4 class defining a diversity curve} \usage{ \S4method{print}{DiversityCurve}(x) \S4method{plot}{DiversityCurve,missing}(x, y, ...) \S4method{plot}{DiversityCurve,numeric}(x, y, ...) } \arguments{ \item{x}{DiversityCurve object} \item{y}{diversity order to plot (q).} \item{...}{arguments to pass to \link{plotDiversityCurve} or \link{plotDiversityTest}.} } \description{ \code{DiversityCurve} defines diversity (\eqn{D}) scores over multiple diversity orders (\eqn{Q}). } \section{Slots}{ \describe{ \item{\code{diversity}}{data.frame defining the diversity curve with the following columns: \itemize{ \item \code{group}: group label. \item \code{q}: diversity order. \item \code{d}: mean diversity index over all bootstrap realizations. \item \code{d_sd}: standard deviation of the diversity index over all bootstrap realizations. \item \code{d_lower}: diversity lower confidence inverval bound. \item \code{d_upper}: diversity upper confidence interval bound. \item \code{e}: evenness index calculated as \code{D} divided by \code{D} at \code{Q=0}. \item \code{e_lower}: evenness lower confidence inverval bound. \item \code{e_upper}: eveness upper confidence interval bound. }} \item{\code{tests}}{data.frame describing the significance test results with columns: \itemize{ \item \code{test}: string listing the two groups tested. \item \code{delta_mean}: mean of the \eqn{D} bootstrap delta distribution for the test. \item \code{delta_sd}: standard deviation of the \eqn{D} bootstrap delta distribution for the test. \item \code{pvalue}: p-value for the test. }} \item{\code{group_by}}{string specifying the name of the grouping column in diversity calculation.} \item{\code{groups}}{vector specifying the names of unique groups in group column in diversity calculation.} \item{\code{method}}{string specifying the type of diversity calculated.} \item{\code{q}}{vector of diversity hill diversity indices used for computing diversity.} \item{\code{n}}{numeric vector indication the number of sequences sampled in each group.} \item{\code{ci}}{confidence interval defining the upper and lower bounds (a value between 0 and 1).} }} alakazam/man/maskPositionsByQuality.Rd0000644000175000017500000000277114136536357017762 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Fastq.R \name{maskPositionsByQuality} \alias{maskPositionsByQuality} \title{Mask sequence positions with low quality} \usage{ maskPositionsByQuality( data, min_quality = 70, sequence = "sequence_alignment", quality_num = "quality_alignment_num" ) } \arguments{ \item{data}{\code{data.frame} containing sequence data.} \item{min_quality}{minimum quality score. Positions with sequencing quality less than \code{min_qual} will be masked.} \item{sequence}{column in \code{data} with sequence data to be masked.} \item{quality_num}{column in \code{data} with quality scores (a string of numeric values, comma separated) that can be used to mask \code{sequence}.} } \value{ Modified \code{data} data.frame with an additional field containing quality masked sequences. The name of this field is created concatenating the \code{sequence} name and \code{"_masked"}. } \description{ \code{maskPositionsByQuality} will replace positions that have a sequencing quality score lower that \code{min_quality} with an \code{"N"} character. } \examples{ db <- airr::read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") db <- readFastqDb(db, fastq_file, quality_offset=-33) maskPositionsByQuality(db, min_quality=90, quality_num="quality_alignment_num") } \seealso{ \link{readFastqDb} and \link{getPositionQuality} } alakazam/man/IUPAC_CODES.Rd0000644000175000017500000000171114136536357015022 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{IUPAC_CODES} \alias{IUPAC_CODES} \alias{IUPAC_DNA} \alias{IUPAC_AA} \alias{DNA_IUPAC} \title{IUPAC ambiguous characters} \format{ A list with single character codes as names and values containing character vectors that define the set of standard characters that match to each each ambiguous character. \itemize{ \item \code{IUPAC_DNA}: DNA ambiguous character translations. \item \code{IUPAC_AA}: Amino acid ambiguous character translations. \item \code{DNA_IUPAC}: Ordered DNA to ambiguous characters } An object of class \code{list} of length 15. An object of class \code{list} of length 25. An object of class \code{list} of length 15. } \usage{ IUPAC_DNA IUPAC_AA DNA_IUPAC } \description{ A translation list mapping IUPAC ambiguous characters code to corresponding nucleotide amino acid characters. } \keyword{datasets} alakazam/man/checkColumns.Rd0000644000175000017500000000170514136536357015665 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{checkColumns} \alias{checkColumns} \title{Check data.frame for valid columns and issue message if invalid} \usage{ checkColumns(data, columns, logic = c("all", "any")) } \arguments{ \item{data}{data.frame to check.} \item{columns}{vector of column names to check.} \item{logic}{one of \code{"all"} or \code{"any"} controlling whether all, or at least one, of the columns must be valid, respectively.} } \value{ \code{TRUE} if columns are valid and a string message if not. } \description{ Check data.frame for valid columns and issue message if invalid } \examples{ df <- data.frame(A=1:3, B=4:6, C=rep(NA, 3)) checkColumns(df, c("A", "B"), logic="all") checkColumns(df, c("A", "B"), logic="any") checkColumns(df, c("A", "C"), logic="all") checkColumns(df, c("A", "C"), logic="any") checkColumns(df, c("A", "D"), logic="all") checkColumns(df, c("A", "D"), logic="any") } alakazam/man/aminoAcidProperties.Rd0000644000175000017500000001343014136536357017206 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{aminoAcidProperties} \alias{aminoAcidProperties} \title{Calculates amino acid chemical properties for sequence data} \usage{ aminoAcidProperties( data, property = c("length", "gravy", "bulk", "aliphatic", "polarity", "charge", "basic", "acidic", "aromatic"), seq = "junction", nt = TRUE, trim = FALSE, label = NULL, ... ) } \arguments{ \item{data}{\code{data.frame} containing sequence data.} \item{property}{vector strings specifying the properties to be calculated. Defaults to calculating all defined properties.} \item{seq}{\code{character} name of the column containing input sequences.} \item{nt}{boolean, TRUE if the sequences (or sequence) are DNA and will be translated.} \item{trim}{if \code{TRUE} remove the first and last codon/amino acids from each sequence before calculating properties. If \code{FALSE} do not modify input sequences.} \item{label}{name of sequence region to add as prefix to output column names.} \item{...}{additional named arguments to pass to the functions \link{gravy}, \link{bulk}, \link{aliphatic}, \link{polar} or \link{charge}.} } \value{ A modified \code{data} data.frame with the following columns: \itemize{ \item \code{*_aa_length}: number of amino acids. \item \code{*_aa_gravy}: grand average of hydrophobicity (gravy) index. \item \code{*_aa_bulk}: average bulkiness of amino acids. \item \code{*_aa_aliphatic}: aliphatic index. \item \code{*_aa_polarity}: average polarity of amino acids. \item \code{*_aa_charge}: net charge. \item \code{*_aa_basic}: fraction of informative positions that are Arg, His or Lys. \item \code{*_aa_acidic}: fraction of informative positions that are Asp or Glu. \item \code{*_aa_aromatic}: fraction of informative positions that are His, Phe, Trp or Tyr. } Where \code{*} is the value from \code{label} or the name specified for \code{seq} if \code{label=NULL}. } \description{ \code{aminoAcidProperties} calculates amino acid sequence physicochemical properties, including length, hydrophobicity, bulkiness, polarity, aliphatic index, net charge, acidic residue content, basic residue content, and aromatic residue content. } \details{ For all properties except for length, non-informative positions are excluded, where non-informative is defined as any character in \code{c("X", "-", ".", "*")}. The scores for gravy, bulkiness and polarity are calculated as simple averages of the scores for each informative positions. The basic, acid and aromatic indices are calculated as the fraction of informative positions falling into the given category. The aliphatic index is calculated using the Ikai, 1980 method. The net charge is calculated using the method of Moore, 1985, excluding the N-terminus and C-terminus charges, and normalizing by the number of informative positions. The default pH for the calculation is 7.4. The following data sources were used for the default property scores: \itemize{ \item hydropathy: Kyte & Doolittle, 1982. \item bulkiness: Zimmerman et al, 1968. \item polarity: Grantham, 1974. \item pK: EMBOSS. } } \examples{ # Subset example data db <- ExampleDb[c(1,10,100), c("sequence_id", "junction")] # Calculate default amino acid properties from DNA sequences aminoAcidProperties(db, seq="junction") # Calculate default amino acid properties from amino acid sequences # Use a custom output column prefix db$junction_aa <- translateDNA(db$junction) aminoAcidProperties(db, seq="junction_aa", label="junction", nt=FALSE) # Use the Grantham, 1974 side chain volume scores from the seqinr package # Set pH=7.0 for the charge calculation # Calculate only average volume and charge # Remove the head and tail amino acids from the junction, thus making it the CDR3 library(seqinr) data(aaindex) x <- aaindex[["GRAR740103"]]$I # Rename the score vector to use single-letter codes names(x) <- translateStrings(names(x), ABBREV_AA) # Calculate properties aminoAcidProperties(db, property=c("bulk", "charge"), seq="junction", trim=TRUE, label="cdr3", bulkiness=x, pH=7.0) } \references{ \enumerate{ \item Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). \item Grantham R. Amino acid difference formula to help explain protein evolution. Science 185, 862-864 (1974). \item Ikai AJ. Thermostability and aliphatic index of globular proteins. J Biochem 88, 1895-1898 (1980). \item Kyte J, Doolittle RF. A simple method for displaying the hydropathic character of a protein. J Mol Biol 157, 105-32 (1982). \item Moore DS. Amino acid and peptide net charges: A simple calculational procedure. Biochem Educ 13, 10-11 (1985). \item Wu YC, et al. High-throughput immunoglobulin repertoire analysis distinguishes between human IgM memory and switched memory B-cell populations. Blood 116, 1070-8 (2010). \item Wu YC, et al. The relationship between CD27 negative and positive B cell populations in human peripheral blood. Front Immunol 2, 1-12 (2011). \item \url{http://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} } } \seealso{ See \link{countPatterns} for counting the occurance of specific amino acid subsequences. See \link{gravy}, \link{bulk}, \link{aliphatic}, \link{polar} and \link{charge} for functions that calculate the included properties individually. } alakazam/man/pairwiseDist.Rd0000644000175000017500000000347014136536357015717 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{pairwiseDist} \alias{pairwiseDist} \title{Calculate pairwise distances between sequences} \usage{ pairwiseDist(seq, dist_mat = getDNAMatrix()) } \arguments{ \item{seq}{character vector containing a DNA sequences.} \item{dist_mat}{Character distance matrix. Defaults to a Hamming distance matrix returned by \link{getDNAMatrix}. If gap characters, \code{c("-", ".")}, are assigned a value of -1 in \code{dist_mat} then contiguous gaps of any run length, which are not present in both sequences, will be counted as a distance of 1. Meaning, indels of any length will increase the sequence distance by 1. Gap values other than -1 will return a distance that does not consider indels as a special case.} } \value{ A matrix of numerical distance between each entry in \code{seq}. If \code{seq} is a named vector, row and columns names will be added accordingly. Amino acid distance matrix may be built with \link{getAAMatrix}. Uses \link{seqDist} for calculating distances between pairs. See \link{pairwiseEqual} for generating an equivalence matrix. } \description{ \code{pairwiseDist} calculates all pairwise distance between a set of sequences. } \examples{ # Gaps will be treated as Ns with a gap=0 distance matrix pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), dist_mat=getDNAMatrix(gap=0)) # Gaps will be treated as universally non-matching characters with gap=1 pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), dist_mat=getDNAMatrix(gap=1)) # Gaps of any length will be treated as single mismatches with a gap=-1 distance matrix pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), dist_mat=getDNAMatrix(gap=-1)) } alakazam/man/testDiversity.Rd0000644000175000017500000001101514136536357016124 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Deprecated.R \name{testDiversity} \alias{testDiversity} \title{Pairwise test of the diversity index} \usage{ testDiversity( data, q, group, clone = "CLONE", copy = NULL, min_n = 30, max_n = NULL, nboot = 2000, progress = FALSE, ci = 0.95 ) } \arguments{ \item{data}{data.frame with Change-O style columns containing clonal assignments.} \item{q}{diversity order to test.} \item{group}{name of the \code{data} column containing group identifiers.} \item{clone}{name of the \code{data} column containing clone identifiers.} \item{copy}{name of the \code{data} column containing copy numbers for each sequence. If \code{copy=NULL} (the default), then clone abundance is determined by the number of sequences. If a \code{copy} column is specified, then clone abundances is determined by the sum of copy numbers within each clonal group.} \item{min_n}{minimum number of observations to sample. A group with less observations than the minimum is excluded.} \item{max_n}{maximum number of observations to sample. If \code{NULL} the maximum if automatically determined from the size of the largest group.} \item{nboot}{number of bootstrap realizations to perform.} \item{progress}{if \code{TRUE} show a progress bar.} \item{ci}{confidence interval to calculate; the value must be between 0 and 1.} } \value{ A \link{DiversityCurve} object containing slot test with p-values and summary statistics. } \description{ \code{testDiversity} performs pairwise significance tests of the diversity index (\eqn{D}) at a given diversity order (\eqn{q}) for a set of annotation groups via rarefaction and bootstrapping. } \details{ Clonal diversity is calculated using the generalized diversity index proposed by Hill (Hill, 1973). See \link{calcDiversity} for further details. Diversity is calculated on the estimated complete clonal abundance distribution. This distribution is inferred by using the Chao1 estimator to estimate the number of seen clones, and applying the relative abundance correction and unseen clone frequency described in Chao et al, 2014. Variability in total sequence counts across unique values in the \code{group} column is corrected by repeated resampling from the estimated complete clonal distribution to a common number of sequences. The diversity index estimate (\eqn{D}) for each group is the mean value of over all bootstrap realizations. Significance of the difference in diversity index (\eqn{D}) between groups is tested by constructing a bootstrap delta distribution for each pair of unique values in the \code{group} column. The bootstrap delta distribution is built by subtracting the diversity index \eqn{Da} in \eqn{group-a} from the corresponding value \eqn{Db} in \eqn{group-b}, for all bootstrap realizations, yeilding a distribution of \code{nboot} total deltas; where \eqn{group-a} is the group with the greater mean \eqn{D}. The p-value for hypothesis \eqn{Da != Db} is the value of \eqn{P(0)} from the empirical cumulative distribution function of the bootstrap delta distribution, multiplied by 2 for the two-tailed correction. } \note{ This method may inflate statistical significance when clone sizes are uniformly small, such as when most clones sizes are 1, sample size is small, and \code{max_n} is near the total count of the smallest data group. Use caution when interpreting the results in such cases. We are currently investigating this potential problem. } \examples{ \dontrun{ # Groups under the size threshold are excluded and a warning message is issued. testDiversity(ExampleDb, "sample_id", q=0, min_n=30, nboot=100) } } \references{ \enumerate{ \item Hill M. Diversity and evenness: a unifying notation and its consequences. Ecology. 1973 54(2):427-32. \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. Scand J Stat. 1984 11, 265270. \item Wu Y-CB, et al. Influence of seasonal exposure to grass pollen on local and peripheral blood IgE repertoires in patients with allergic rhinitis. J Allergy Clin Immunol. 2014 134(3):604-12. \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: A framework for sampling and estimation in species diversity studies. Ecol Monogr. 2014 84:45-67. \item Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. } } \seealso{ \link{alphaDiversity} } alakazam/man/countClones.Rd0000644000175000017500000000511414136536357015541 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{countClones} \alias{countClones} \title{Tabulates clones sizes} \usage{ countClones( data, groups = NULL, copy = NULL, clone = "clone_id", remove_na = TRUE ) } \arguments{ \item{data}{data.frame with columns containing clonal assignments.} \item{groups}{character vector defining \code{data} columns containing grouping variables. If \code{groups=NULL}, then do not group data.} \item{copy}{name of the \code{data} column containing copy numbers for each sequence. If this value is specified, then total copy abundance is determined by the sum of copy numbers within each clonal group.} \item{clone}{name of the \code{data} column containing clone identifiers.} \item{remove_na}{removes rows with \code{NA} values in the clone column if \code{TRUE} and issues a warning. Otherwise, keeps those rows and considers \code{NA} as a clone in the final counts and relative abundances.} } \value{ A data.frame summarizing clone counts and frequencies with columns: \itemize{ \item \code{clone_id}: clone identifier. This is the default column name, specified with \code{clone='clone_id'}. If the function call uses Change-O formatted data and \code{clone='CLONE'}, this column will have name \code{CLONE}. \item \code{seq_count}: total number of sequences for the clone. \item \code{seq_freq}: frequency of the clone as a fraction of the total number of sequences within each group. \item \code{copy_count}: sum of the copy counts in the \code{copy} column. Only present if the \code{copy} argument is specified. \item \code{copy_freq}: frequency of the clone as a fraction of the total copy number within each group. Only present if the \code{copy} argument is specified. } Also includes additional columns specified in the \code{groups} argument. } \description{ \code{countClones} determines the number of sequences and total copy number of clonal groups. } \examples{ # Without copy numbers clones <- countClones(ExampleDb, groups="sample_id") # With copy numbers and multiple groups clones <- countClones(ExampleDb, groups=c("sample_id", "c_call"), copy="duplicate_count") } alakazam/src/0000755000175000017500000000000014137542165012764 5ustar nileshnileshalakazam/src/RcppDistance.cpp0000644000175000017500000002204614067624107016052 0ustar nileshnilesh#include #include #include using namespace Rcpp; // [[Rcpp::plugins(cpp11)]] //' Test DNA sequences for equality. //' //' \code{seqEqual} checks if two DNA sequences are identical. //' //' @param seq1 character string containing a DNA sequence. //' @param seq2 character string containing a DNA sequence. //' @param ignore vector of characters to ignore when testing for equality. //' Default is to ignore c("N",".","-","?") //' //' @return Returns \code{TRUE} if sequences are equal and \code{FALSE} if they are not. //' Sequences of unequal length will always return \code{FALSE} regardless of //' their character values. //' //' @seealso Used by \link{pairwiseEqual} within \link{collapseDuplicates}. //' See \link{seqDist} for calculation Hamming distances between sequences. //' //' @examples //' # Ignore gaps //' seqEqual("ATG-C", "AT--C") //' seqEqual("ATGGC", "ATGGN") //' seqEqual("AT--T", "ATGGC") //' //' # Ignore only Ns //' seqEqual("ATG-C", "AT--C", ignore="N") //' seqEqual("ATGGC", "ATGGN", ignore="N") //' seqEqual("AT--T", "ATGGC", ignore="N") //' //' @export // [[Rcpp::export]] bool seqEqual(std::string seq1, std::string seq2, CharacterVector ignore=CharacterVector::create("N","-",".","?")) { int ig_len = ignore.length(); ig_len = ignore.length(); int len_seq1 = seq1.length(); int len_seq2 = seq2.length(); if (len_seq1 != len_seq2) { return (FALSE); } else { for(int i = 0; i < len_seq1; i++) { char seq1_char = (char)seq1[i]; char seq2_char = (char)seq2[i]; if (seq1_char != seq2_char) { bool ignore_seq1 = FALSE; bool ignore_seq2 = FALSE; for(int j = 0; j < ig_len; j++) { char ig = *(char*)ignore[j]; if (ig == seq1_char) { ignore_seq1 = TRUE; } if (ig == seq2_char) { ignore_seq2 = TRUE; } } if (!ignore_seq1 & !ignore_seq2) { return FALSE; } } } return TRUE; } } //' Calculate pairwise equivalence between sequences //' //' \code{pairwiseEqual} determined pairwise equivalence between a pairs in a //' set of sequences, excluding ambiguous positions (Ns and gaps). //' //' @param seq character vector containing a DNA sequences. //' //' @return A logical matrix of equivalence between each entry in \code{seq}. //' Values are \code{TRUE} when sequences are equivalent and \code{FALSE} //' when they are not. //' //' @seealso Uses \link{seqEqual} for testing equivalence between pairs. //' See \link{pairwiseDist} for generating a sequence distance matrix. //' //' @examples //' # Gaps and Ns will match any character //' seq <- c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C", E="NTGGG") //' d <- pairwiseEqual(seq) //' rownames(d) <- colnames(d) <- seq //' d //' //' @export // [[Rcpp::export]] LogicalMatrix pairwiseEqual(StringVector seq) { // allocate the matrix we will return LogicalMatrix rmat(seq.length(), seq.length()); for (int i = 0; i < rmat.nrow(); i++) { for (int j = 0; j <= i; j++) { // check seq equal std::string row_seq = as(seq[i]); std::string col_seq = as(seq[j]); bool is_equal = seqEqual(row_seq, col_seq); // write to output matrix rmat(i,j) = is_equal; rmat(j,i) = is_equal; } } // Add row and column names Rcpp::List dimnames = Rcpp::List::create(seq.attr("names"), seq.attr("names")); rmat.attr("dimnames") = dimnames; return rmat; } // seqDist // [[Rcpp::export]] double seqDistRcpp(std::string seq1, std::string seq2, NumericMatrix dist_mat) { // Check that seq1 and seq2 have same length int len_seq1 = seq1.length(); int len_seq2 = seq2.length(); if (len_seq1 != len_seq2) { throw std::range_error("Sequences of different length."); } int len_seqs = len_seq1; List dist_mat_dims = dist_mat.attr("dimnames"); //print (dist_mat_dims); CharacterVector dist_mat_rownames = dist_mat_dims[0]; CharacterVector dist_mat_colnames = dist_mat_dims[1]; int num_rows = dist_mat_rownames.size(); int num_cols = dist_mat_colnames.size(); List row_key_idx; List col_key_idx; std::map rows_map; std::map cols_map; for (int i = 0; i < num_rows; i++) { //const char *this_col = dist_mat_colnames[i].c_str(); std::string this_row = as(dist_mat_rownames[i]); rows_map[this_row] = i; } for (int i = 0; i < num_cols; i++) { //const char *this_col = dist_mat_colnames[i].c_str(); std::string this_col = as(dist_mat_colnames[i]); cols_map[this_col] = i; } int d_seen = 0; int indels = 0; // sum(d[d>0]) double d_sum = 0; for (int i = 0; i < len_seqs; i++) { // find row index int row_idx; char row_char = (char)seq1[i]; std::string row_string; row_string+=row_char; auto search_row = rows_map.find(row_string); if(search_row != rows_map.end()) { row_idx = search_row->second; } else { throw std::range_error("Character not found in dist_mat."); } // find col index int col_idx; char col_char = (char)seq2[i]; std::string col_string; col_string+=col_char; auto search_col = cols_map.find(col_string); if(search_col != cols_map.end()) { col_idx = search_col->second; } else { throw std::range_error("Character not found in dist_mat."); } // distance for current i double d_i = dist_mat(row_idx, col_idx); if (d_i > 0){ // Sum distance d_sum = d_sum + d_i; } else if ( (d_i == -1 ) & (d_seen != -1) ) { // Count indel indels++; } d_seen = d_i; } double distance = d_sum + indels; return (distance); } // pairwiseDist // [[Rcpp::export]] NumericMatrix pairwiseDistRcpp(StringVector seq, NumericMatrix dist_mat) { // allocate the matrix we will return NumericMatrix rmat(seq.length(), seq.length()); for (int i = 0; i < rmat.nrow(); i++) { for (int j = 0; j < i; j++) { // check seq equal std::string row_seq = as(seq[i]); std::string col_seq = as(seq[j]); double distance = seqDistRcpp(row_seq, col_seq, dist_mat); // write to output matrix rmat(i,j) = distance; rmat(j,i) = distance; } } // Add row and column names Rcpp::List dimnames = Rcpp::List::create(seq.attr("names"), seq.attr("names")); rmat.attr("dimnames") = dimnames; return rmat; } // nonsquareDist // [[Rcpp::export]] NumericMatrix nonsquareDistRcpp(StringVector seq, NumericVector indx, NumericMatrix dist_mat) { // defien variables int m, n, i, j; std::string row_seq, col_seq; // extract the sizes. Note: This should be satisfied (n<=m) m = indx.size(); //number of rows n = seq.size(); //number of columns // allocate the main matrix NumericMatrix rmat(m,n); std::fill(rmat.begin(), rmat.end(), NA_REAL); // sort and push indices back by 1 to match c++ indexing std::sort(indx.begin(), indx.end()); indx = indx - 1; // find the position of the column ids in the indx vector NumericVector pos(n); for (j = 0; j < n; j++) { pos[j] = std::find(indx.begin(), indx.end(), j) - indx.begin(); } // begin filling rmat for (i = 0; i < m; i++) { row_seq = as(seq[indx[i]]); //row sequence for (j = 0; j < n; j++) { if (!R_IsNA(rmat(i,j))) continue; if (indx[i] == j) rmat(i,j) = 0; else { col_seq = as(seq[j]); //col sequence rmat(i,j) = seqDistRcpp(row_seq, col_seq, dist_mat); if (pos[j] < m) rmat(pos[j],indx[i]) = rmat(i,j); } } } // Add row and column names StringVector subSeq = seq[indx]; Rcpp::List dimnames = Rcpp::List::create(subSeq.attr("names"), //rownames seq.attr("names")); //colnames rmat.attr("dimnames") = dimnames; // return matrix return rmat; } alakazam/src/RcppExports.cpp0000644000175000017500000000701714136536332015764 0ustar nileshnilesh// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #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 // seqEqual bool seqEqual(std::string seq1, std::string seq2, CharacterVector ignore); RcppExport SEXP _alakazam_seqEqual(SEXP seq1SEXP, SEXP seq2SEXP, SEXP ignoreSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type seq1(seq1SEXP); Rcpp::traits::input_parameter< std::string >::type seq2(seq2SEXP); Rcpp::traits::input_parameter< CharacterVector >::type ignore(ignoreSEXP); rcpp_result_gen = Rcpp::wrap(seqEqual(seq1, seq2, ignore)); return rcpp_result_gen; END_RCPP } // pairwiseEqual LogicalMatrix pairwiseEqual(StringVector seq); RcppExport SEXP _alakazam_pairwiseEqual(SEXP seqSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< StringVector >::type seq(seqSEXP); rcpp_result_gen = Rcpp::wrap(pairwiseEqual(seq)); return rcpp_result_gen; END_RCPP } // seqDistRcpp double seqDistRcpp(std::string seq1, std::string seq2, NumericMatrix dist_mat); RcppExport SEXP _alakazam_seqDistRcpp(SEXP seq1SEXP, SEXP seq2SEXP, SEXP dist_matSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type seq1(seq1SEXP); Rcpp::traits::input_parameter< std::string >::type seq2(seq2SEXP); Rcpp::traits::input_parameter< NumericMatrix >::type dist_mat(dist_matSEXP); rcpp_result_gen = Rcpp::wrap(seqDistRcpp(seq1, seq2, dist_mat)); return rcpp_result_gen; END_RCPP } // pairwiseDistRcpp NumericMatrix pairwiseDistRcpp(StringVector seq, NumericMatrix dist_mat); RcppExport SEXP _alakazam_pairwiseDistRcpp(SEXP seqSEXP, SEXP dist_matSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< StringVector >::type seq(seqSEXP); Rcpp::traits::input_parameter< NumericMatrix >::type dist_mat(dist_matSEXP); rcpp_result_gen = Rcpp::wrap(pairwiseDistRcpp(seq, dist_mat)); return rcpp_result_gen; END_RCPP } // nonsquareDistRcpp NumericMatrix nonsquareDistRcpp(StringVector seq, NumericVector indx, NumericMatrix dist_mat); RcppExport SEXP _alakazam_nonsquareDistRcpp(SEXP seqSEXP, SEXP indxSEXP, SEXP dist_matSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< StringVector >::type seq(seqSEXP); Rcpp::traits::input_parameter< NumericVector >::type indx(indxSEXP); Rcpp::traits::input_parameter< NumericMatrix >::type dist_mat(dist_matSEXP); rcpp_result_gen = Rcpp::wrap(nonsquareDistRcpp(seq, indx, dist_mat)); return rcpp_result_gen; END_RCPP } static const R_CallMethodDef CallEntries[] = { {"_alakazam_seqEqual", (DL_FUNC) &_alakazam_seqEqual, 3}, {"_alakazam_pairwiseEqual", (DL_FUNC) &_alakazam_pairwiseEqual, 1}, {"_alakazam_seqDistRcpp", (DL_FUNC) &_alakazam_seqDistRcpp, 3}, {"_alakazam_pairwiseDistRcpp", (DL_FUNC) &_alakazam_pairwiseDistRcpp, 2}, {"_alakazam_nonsquareDistRcpp", (DL_FUNC) &_alakazam_nonsquareDistRcpp, 3}, {NULL, NULL, 0} }; RcppExport void R_init_alakazam(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } alakazam/vignettes/0000755000175000017500000000000014137542165014205 5ustar nileshnileshalakazam/vignettes/Diversity-Vignette.Rmd0000644000175000017500000001557514137534677020444 0ustar nileshnilesh--- title: 'Alakazam: Analysis of clonal abundance and diversity' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Diversity analysis} %\usepackage[utf8]{inputenc} --- The clonal diversity of the repertoire can be analyzed using the general form of the diversity index, as proposed by Hill in: Hill, M. Diversity and evenness: a unifying notation and its consequences. Ecology 54, 427-432 (1973). Coupled with resampling strategies to correct for variations in sequencing depth, as well as inference of complete clonal abundance distributions as described in: Chao A, et al. Rarefaction and extrapolation with Hill numbers: A framework for sampling and estimation in species diversity studies. Ecol Monogr. 2014 84:45-67. Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. This package provides methods for the inference of a complete clonal abundance distribution (using the `estimateAbundance` function) along with two approaches to assess the diversity of these distributions: 1. Generation of a smooth diversity (D) curve over a range of diversity orders (q) using `alphaDiversity`, and 2. A significance test of the diversity (D) at a fixed diversity order (q). ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. Diversity calculation requires the `clone` field (column) to be present in the AIRR file, as well as an additional grouping column. In this example we will use the grouping columns `sample_id` and `c_call`. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) # Load example data data(ExampleDb) ``` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ## Generate a clonal abundance curve A simple table of the observed clonal abundance counts and frequencies may be generated using the `countClones` function either with or without copy numbers, where the size of each clone is determined by the number of sequence members: ```{r, eval=TRUE, warning=FALSE} # Partitions the data based on the sample column clones <- countClones(ExampleDb, group="sample_id") head(clones, 5) ``` You may also specify a column containing the abundance count of each sequence (usually copy numbers), that will including weighting of each clone size by the corresponding abundance count. Furthermore, multiple grouping columns may be specified such that `seq_freq` (unwieghted clone size as a fraction of total sequences in the group) and `copy_freq` (weighted faction) are normalized to within multiple group data partitions. ```{r, eval=TRUE, warning=FALSE} # Partitions the data based on both the sample_id and c_call columns # Weights the clone sizes by the duplicate_count column clones <- countClones(ExampleDb, group=c("sample_id", "c_call"), copy="duplicate_count", clone="clone_id") head(clones, 5) ``` While `countClones` will report observed abundances, it will not provide confidence intervals. A complete clonal abundance distribution may be inferred using the `estimateAbundance` function with confidence intervals derived via bootstrapping. This output may be visualized using the `plotAbundanceCurve` function. ```{r, eval=TRUE, results='hide', warning=FALSE, fig.width=6, fig.height=4} # Partitions the data on the sample column # Calculates a 95% confidence interval via 200 bootstrap realizations curve <- estimateAbundance(ExampleDb, group="sample_id", ci=0.95, nboot=100, clone="clone_id") ``` ```{r, eval=TRUE, warning=FALSE, fig.width=6, fig.height=4} # Plots a rank abundance curve of the relative clonal abundances sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(curve, colors = sample_colors, legend_title="Sample") ``` ## Generate a diversity curve The function `alphaDiversity` performs uniform resampling of the input sequences and recalculates the clone size distribution, and diversity, with each resampling realization. Diversity (D) is calculated over a range of diversity orders (q) to generate a smooth curve. ```{r, eval=TRUE, results='hide'} # Compare diversity curve across values in the "sample" column # q ranges from 0 (min_q=0) to 4 (max_q=4) in 0.05 increments (step_q=0.05) # A 95% confidence interval will be calculated (ci=0.95) # 200 resampling realizations are performed (nboot=200) sample_curve <- alphaDiversity(ExampleDb, group="sample_id", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) # Compare diversity curve across values in the c_call column # Analyse is restricted to c_call values with at least 30 sequences by min_n=30 # Excluded groups are indicated by a warning message isotype_curve <- alphaDiversity(ExampleDb, group="c_call", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) ``` ```{r, eval=TRUE, fig.width=6, fig.height=4} # Plot a log-log (log_q=TRUE, log_d=TRUE) plot of sample diversity # Indicate number of sequences resampled from each group in the title sample_main <- paste0("Sample diversity") sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(sample_curve, colors=sample_colors, main_title=sample_main, legend_title="Sample") # Plot isotype diversity using default set of Ig isotype colors isotype_main <- paste0("Isotype diversity") plot(isotype_curve, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") ``` ## View diversity tests at a fixed diversity order Significance testing across groups is performed using the delta of the bootstrap distributions between groups when running `alphaDiversity` for all values of `q` specified. ```{r, eval=TRUE, fig.width=6, fig.height=3} # Test diversity at q=0, q=1 and q=2 (equivalent to species richness, Shannon entropy, # Simpson's index) across values in the sample_id column # 200 bootstrap realizations are performed (nboot=200) isotype_test <- alphaDiversity(ExampleDb, group="c_call", min_q=0, max_q=2, step_q=1, nboot=100, clone="clone_id") # Print P-value table print(isotype_test@tests) # Plot results at q=0 and q=2 # Plot the mean and standard deviations at q=0 and q=2 plot(isotype_test, 0, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") plot(isotype_test, 2, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") ``` alakazam/vignettes/GeneUsage-Vignette.Rmd0000644000175000017500000001642414067624107020305 0ustar nileshnilesh--- title: 'Alakazam: Gene usage analysis' author: "Susanna Marquez" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Gene usage analysis} %\usepackage[utf8]{inputenc} --- The 'alakazam' package provides basic gene usage quantification by either sequence count or clonal grouping; with or without consideration of duplicate reads/mRNA. Additionally, a set of accessory functions for sorting and parsing V(D)J gene names are also provided. ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). Gene usage analysis requires only the following columns: * `v_call` * `d_call` * `j_call` However, the optional clonal clustering (`clone_id`) and duplicate count (`duplicate_count`) columns may be used to quantify usage by different abundance criteria. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(dplyr) library(scales) # Subset example data data(ExampleDb) ``` ## Tabulate V(D)J allele, gene or family usage by sample The relative abundance of V(D)J alleles, genes or families within groups can be obtained with the function `countGenes`. To analyze differences in the V gene usage across different samples we will set `gene="v_call"` (the column containing gene data) and `groups="sample_id"` (the columns containing grouping variables). To quantify abundance at the gene level we set `mode="gene"`: ```{r, eval=TRUE, warning=FALSE} # Quantify usage at the gene level gene <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="gene") head(gene, n=4) ``` In the resultant `data.frame`, the `seq_count` column is the number of raw sequences within each `sample_id` group for the given `gene`. `seq_freq` is the frequency of each `gene` within the given `sample_id`. Below we plot only the IGHV1 abundance by filtering on the `gene` column to only rows containing IGHV1 family genes. We extract the family portion of the gene name using the `getFamily` function. Also, we take advantage of the `sortGenes` function to convert the `gene` column to a factor with gene name lexicographically ordered in the factor levels (`method="name"`) for axis ordering using the `ggplot2` package. Alternatively, we could have ordered the genes by genomic position by passing `method="position"` to `sortGenes`. ```{r, eval=TRUE, warning=FALSE} # Assign sorted levels and subset to IGHV1 ighv1 <- gene %>% mutate(gene=factor(gene, levels=sortGenes(unique(gene), method="name"))) %>% filter(getFamily(gene) == "IGHV1") # Plot V gene usage in the IGHV1 family by sample g1 <- ggplot(ighv1, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("IGHV1 Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g1) ``` Alternatively, usage can be quantified at the allele (`mode="allele"`) or family level (`mode="family"`): ```{r, eval=TRUE, warning=FALSE} # Quantify V family usage by sample family <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="family") # Plot V family usage by sample g2 <- ggplot(family, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("Family Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g2) ``` ## Tabulating gene abundance using additional groupings The `groups` argument to `countGenes` can accept multiple grouping columns and will calculate abundance within each unique combination. In the examples below, groupings will be perform by unique sample and isotype pairs (`groups=c("sample_id", "c_call")`). Furthermore, instead of quantifying abundance by sequence count, we will quantify it by clone count (each clone will be counted only once regardless of how many sequences the clone represents). Clonal criteria are added by passing a value to the `clone` argument of `countGenes` (`clone="clone_id"`). For each clonal group, only the most common allele/gene/family will be considered for counting. ```{r, eval=TRUE, warning=FALSE} # Quantify V family clonal usage by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), clone="clone_id", mode="family") head(family, n=4) ``` The output `data.frame` contains the additional grouping column (`c_call`) along with the `clone_count` and `clone_freq` columns that represent the count of clones for each V family and the frequencies within the given `sample_id` and `c_call` pair, respectively. ```{r, eval=TRUE, warning=FALSE} # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family clonal usage by sample and isotype g3 <- ggplot(family, aes(x=gene, y=clone_freq)) + theme_bw() + ggtitle("Clonal Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g3) ``` Instead of calculating abundance by sequence or clone count, abundance can be calculated using copy numbers for the individual sequences. This is accomplished by passing a copy number column to the `copy` argument (`copy="duplicate_count"`). Specifying both `clone` and `copy` arguments is not meaningful and will result in the `clone` argument being ignored. ```{r, eval=TRUE, warning=FALSE} # Calculate V family copy numbers by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), mode="family", copy="duplicate_count") head(family, n=4) ``` The output `data.frame` includes the `seq_count` and `seq_freq` columns as previously defined, as well as the additional copy number columns `copy_count` and `copy_freq` reflected the summed copy number (`duplicate_count`) for each sequence within the given `gene`, `sample_id` and `c_call`. ```{r, eval=TRUE, warning=FALSE} # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family copy abundance by sample and isotype g4 <- ggplot(family, aes(x=gene, y=copy_freq)) + theme_bw() + ggtitle("Copy Number") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g4) ``` alakazam/vignettes/AminoAcids-Vignette.Rmd0000644000175000017500000001733714067624107020455 0ustar nileshnilesh--- title: 'Alakazam: Amino acid physicochemical property analysis' author: "Susanna Marquez" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Amino acid property analysis} %\usepackage[utf8]{inputenc} --- The `alakazam` package includes a set of functions to analyze the physicochemical properties of Ig and TCR amino acid sequences. Of particular interest is the analysis of CDR3 properties, which this vignette will demonstrate. The same process can be applied to other regions simply by altering the sequence data column used. Wu YC, et al. High-throughput immunoglobulin repertoire analysis distinguishes between human IgM memory and switched memory B-cell populations. Blood 116, 1070-8 (2010). Wu YC, et al. The relationship between CD27 negative and positive B cell populations in human peripheral blood. Front Immunol 2, 1-12 (2011). ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(dplyr) # Subset example data data(ExampleDb) db <- ExampleDb[ExampleDb$sample_id == "+7d", ] ``` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ## Calculate the properties of amino acid sequences Multiple amino acid physicochemical properties can be obtained with the function `aminoAcidProperties`. The available properties are: * `length`: total amino acid count * `gravy`: grand average of hydrophobicity * `bulkiness`: average bulkiness * `polarity`: average polarity * `aliphatic`: normalized aliphatic index * `charge`: normalized net charge * `acidic`: acidic side chain residue content * `basic`: basic side chain residue content * `aromatic`: aromatic side chain content This example demonstrates how to calculate all of the available amino acid properties from DNA sequences found in the `junction` column of the previously loaded AIRR file. Translation of the DNA sequences to amino acid sequences is accomplished by default with the `nt=TRUE` argument. To reduce the junction sequence to the CDR3 sequence we specify the argument `trim=TRUE` which will strip the first and last codon (the conserved residues) prior to analysis. The prefix `cdr3` is added to the output column names using the `label="cdr3"` argument. ```{r, eval=TRUE, warning=FALSE, fig.width=7.5, fig.height=6} db_props <- aminoAcidProperties(db, seq="junction", trim=TRUE, label="cdr3") # The full set of properties are calculated by default dplyr::select(db_props[1:3, ], starts_with("cdr3")) # Define a ggplot theme for all plots tmp_theme <- theme_bw() + theme(legend.position="bottom") # Generate plots for all four of the properties g1 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_length)) + tmp_theme + ggtitle("CDR3 length") + xlab("Isotype") + ylab("Amino acids") + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g2 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_gravy)) + tmp_theme + ggtitle("CDR3 hydrophobicity") + xlab("Isotype") + ylab("GRAVY") + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g3 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_basic)) + tmp_theme + ggtitle("CDR3 basic residues") + xlab("Isotype") + ylab("Basic residues") + scale_y_continuous(labels=scales::percent) + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g4 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_acidic)) + tmp_theme + ggtitle("CDR3 acidic residues") + xlab("Isotype") + ylab("Acidic residues") + scale_y_continuous(labels=scales::percent) + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) # Plot in a 2x2 grid gridPlot(g1, g2, g3, g4, ncol=2) ``` ### Obtaining properties individually A subset of the properties may be calculated using the `property` argument of `aminoAcidProperties`. For example, calculations may be restricted to only the grand average of hydrophobicity (`gravy`) index and normalized net charge (`charge`) by specifying `property=c("gravy", "charge")`. ```{r, eval=TRUE, warning=FALSE} db_props <- aminoAcidProperties(db, seq="junction", property=c("gravy", "charge"), trim=TRUE, label="cdr3") dplyr::select(db_props[1:3, ], starts_with("cdr3")) ``` ### Using user defined scales Each property has a default scale setting, but users may specify alternate scales if they wish. The following example shows how to import and use the Kidera et al, 1985 hydrophobicity scale and the Murrary et al, 2006 pK values from the `seqinr` package instead of the defaults for calculating the GRAVY index and net charge. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load the relevant data objects from the seqinr package library(seqinr) data(aaindex) data(pK) h <- aaindex[["KIDA850101"]]$I p <- setNames(pK[["Murray"]], rownames(pK)) # Rename the hydrophobicity vector to use single-letter codes names(h) <- translateStrings(names(h), ABBREV_AA) db_props <- aminoAcidProperties(db, seq="junction", property=c("gravy", "charge"), trim=TRUE, label="cdr3", hydropathy=h, pK=p) dplyr::select(db_props[1:3, ], starts_with("cdr3")) ``` ### Getting vectors of individual properties The `aminoAcidProperties` function provides a convenient wrapper for calculating multiple properties at once from a `data.frame`. If a vector of a specific property is required this may be accomplished using one of the worker functions: * `gravy`: grand average of hydrophobicity * `bulk`: average bulkiness * `polar`: average polarity * `aliphatic`: aliphatic index * `charge`: net charge * `countPatterns`: counts the occurrence of patterns in amino acid sequences The input to each function must be a vector of amino acid sequences. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Translate junction DNA sequences to amino acids and trim first and last codons cdr3 <- translateDNA(db$junction[1:3], trim=TRUE) # Grand average of hydrophobicity gravy(cdr3) # Average bulkiness bulk(cdr3) # Average polarity polar(cdr3) # Normalized aliphatic index aliphatic(cdr3) # Unnormalized aliphatic index aliphatic(cdr3, normalize=FALSE) # Normalized net charge charge(cdr3) # Unnormalized net charge charge(cdr3, normalize=FALSE) # Count of acidic amino acids # Takes a named list of regular expressions countPatterns(cdr3, nt=FALSE, c(ACIDIC="[DE]"), label="cdr3") ``` ## Default scales The following references were used for the default physicochemical scales: * Aliphatic index: Ikai AJ. Thermostability and aliphatic index of globular proteins. J Biochem 88, 1895-1898 (1980). * Bulkiness scale: Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). * Hydrophobicity scale: Kyte J, Doolittle RF. A simple method for displaying the hydropathic character of a protein. J Mol Biol 157, 105-32 (1982). * pK values: \url{http://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} * Polarity scale: Grantham R. Amino acid difference formula to help explain protein evolution. Science 185, 862-864 (1974). alakazam/vignettes/Lineage-Vignette.Rmd0000644000175000017500000002042214137540017017772 0ustar nileshnilesh--- title: 'Alakazam: Reconstruction of Ig lineage trees' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Lineage reconstruction} %\usepackage[utf8]{inputenc} --- Reconstruction of an Ig lineage requires the following steps: 1. Load an AIRR tab-delimited database file and select a clone 2. Preprocess the clone to remove gap characters and duplicate sequences 3. Run PHYLIP, parse the output, and modify the tree topology ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. Lineage reconstruction requires the following fields (columns) to be present in the AIRR file: * `sequence_id` * `sequence_alignment` * `germline_alignment` * `v_call` * `j_call` * `junction_length` * `clone_id` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(igraph) library(dplyr) # Select a clone from the example database data(ExampleDb) sub_db <- subset(ExampleDb, clone_id == 3138) ``` ## Preprocess a clone Before a lineage can be constructed, the sequences must first be cleaned of gap (-, .) characters added by IMGT, duplicate sequences must be removed, and annotations must be combined for each cluster of duplicate sequences. Optionally, "ragged" ends of sequences (such as those that may occur from primer template switching) may also be cleaned by masking mismatched positions and the leading and trailing ends of each sequence. The function `makeChangeoClone` is a wrapper function which combines these steps and returns a `ChangeoClone` object which may then be passed into the lineage reconstruction function. Two arguments to `makeChangeoClone` control which annotations are retained following duplicate removal. Unique values appearing within columns given by the `text_fields` arguments will be concatenated into a single string delimited by a "," character. Values appearing within columns given by the `num_fields` arguments will be summed. ```{r, eval=TRUE} # This example data set does not have ragged ends # Preprocess clone without ragged end masking (default) clone <- makeChangeoClone(sub_db, text_fields=c("sample_id", "c_call"), num_fields="duplicate_count") # Show combined annotations clone@data[, c("sample_id", "c_call", "duplicate_count")] ``` ## Run PHYLIP Lineage construction uses the `dnapars` (maximum parsimony) application of the PHYLIP package. The function `buildPhylipLineage` performs a number of steps to execute `dnapars`, parse its output, and modify the tree topology to meet the criteria of an Ig lineage. This function takes as input a `ChangeoClone` object output by `makeChangeoClone` and returns an igraph `graph` object. The igraph `graph` object will contain clone annotations as graph attributes, sequence annotations as vertex attributes, and mutations along edges as edge attributes. The system call to `dnapars` requires a temporary folder to store input and output. This is created in the system temporary location (according to `base::tempfile`), and is not deleted by default (only because automatically deleting files is somewhat rude). In most cases, you will want to set `rm_temp=TRUE` to delete this folder. ```{r, eval=FALSE} # Run PHYLIP and parse output phylip_exec <- "~/apps/phylip-3.69/dnapars" graph <- buildPhylipLineage(clone, phylip_exec, rm_temp=TRUE) ``` ```{r, echo=FALSE, warning=FALSE, message=FALSE} # Load data instead of running phylip # Clone 3138 is at index 23 graph <- ExampleTrees[[23]] ``` ```{r, eval=TRUE, warning=FALSE, message=FALSE} # The graph has shared annotations for the clone data.frame(clone_id=graph$clone, junction_length=graph$junc_len, v_gene=graph$v_gene, j_gene=graph$j_gene) # The vertices have sequence specific annotations data.frame(sequence_id=V(graph)$name, c_call=V(graph)$c_call, duplicate_count=V(graph)$duplicate_count) ``` ## Plotting of the lineage tree Plotting of a lineage tree may be done using the built-in functions of the igraph package. The default edge and vertex labels are edge weights and sequence identifiers, respectively. ```{r, eval=TRUE} # Plot graph with defaults plot(graph) ``` The default layout and attributes are not very pretty. We can modify the graphical parameter in the usual igraph ways. A tree layout can be built using the `layout_as_tree` layout with assignment of the root position to the germline sequence, which is named "Germline" in the object returned by `buildPhylipLineage`. ```{r, eval=TRUE} # Modify graph and plot attributes V(graph)$color <- "steelblue" V(graph)$color[V(graph)$name == "Germline"] <- "black" V(graph)$color[grepl("Inferred", V(graph)$name)] <- "white" V(graph)$label <- V(graph)$c_call E(graph)$label <- "" # Remove large default margins par(mar=c(0, 0, 0, 0) + 0.1) # Plot graph plot(graph, layout=layout_as_tree, edge.arrow.mode=0, vertex.frame.color="black", vertex.label.color="black", vertex.size=40) # Add legend legend("topleft", c("Germline", "Inferred", "Sample"), fill=c("black", "white", "steelblue"), cex=0.75) ``` Which is much better. ## Batch processing lineage trees Multiple lineage trees may be generated at once, by splitting the Change-O data.frame on the clone column. ```{r, eval=TRUE, warning=FALSE, results="hide"} # Preprocess clones clones <- ExampleDb %>% group_by(clone_id) %>% do(CHANGEO=makeChangeoClone(., text_fields=c("sample_id", "c_call"), num_fields="duplicate_count")) ``` ```{r, eval=FALSE} # Build lineages phylip_exec <- "~/apps/phylip-3.69/dnapars" graphs <- lapply(clones$CHANGEO, buildPhylipLineage, phylip_exec=phylip_exec, rm_temp=TRUE) ``` ```{r, echo=FALSE, warning=FALSE, message=FALSE} # Load data instead of running phylip graphs <- ExampleTrees ``` ```{r, eval=TRUE} # Note, clones with only a single sequence will not be processed. # A warning will be generated and NULL will be returned by buildPhylipLineage # These entries may be removed for clarity graphs[sapply(graphs, is.null)] <- NULL # The set of tree may then be subset by node count for further # analysis, if desired. graphs <- graphs[sapply(graphs, vcount) >= 5] ``` ## Converting between graph, phylo, and newick formats While much of analysis in `alakazam` focuses on using `igraph` `graph` objects, R `phylo` objects are capable of being used by a rich set of phylogenetic analysis tools in R. Further, stand-alone phylogenetics programs typically import and export trees in Newick format. To convert to trees in `graph` format to `phylo` format, use `graphToPhylo`. These objects can now be used by functions detailed in other R phylogenetics packages such as `ape`. ```{r, eval=TRUE, show=FALSE} # Modify graph and plot attributes V(graph)$color <- categorical_pal(8)[1] V(graph)$label <- V(graph)$name E(graph)$label <- E(graph)$weight ``` ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Convert to phylo phylo <- graphToPhylo(graph) # Plot using ape plot(phylo, show.node.label=TRUE) ``` To import lineage trees as `phylo` objects from Newick files, use the `read.tree` function provided in the `ape` package. To export lineage trees as a Newick file, use the `write.tree` function provided in `ape`. ```{r, eval=FALSE} # Read in Newick tree as phylo object phylo <- ape::read.tree("example.tree") # Write tree file in Newick format ape::write.tree(phylo, file="example.tree") ``` To convert this `phylo` object to a `graph` object, use the `phyloToGraph` function with the germline sequence ID specified using the `germline` option. Note that while some of the nodes in more complex trees may rotate during this process, their topological relationships will remain the same. ```{r, eval=TRUE} # Convert to graph object graph <- phyloToGraph(phylo, germline="Germline") ``` alakazam/vignettes/Fastq-Vignette.Rmd0000644000175000017500000000650314067624107017515 0ustar nileshnilesh--- title: 'Alakazam: Using sequencing quality scores' author: "Susanna Marquez" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes toc_depth: 3 md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes toc_depth: 3 html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes toc_depth: 3 geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Fastq} %\usepackage[utf8]{inputenc} --- The `alakazam` package includes a set of functions to inspect the sequencing quality. ## Example data Load example data: ```{r, eval=TRUE, warning=FALSE, message=FALSE} library(alakazam) library(dplyr) library(airr) db <- read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") ``` ## Load quality scores This method allows to add the quality scores to the repertoire `data.frame` as strings. ```{r} original_cols <- colnames(db) db <- readFastqDb(db, fastq_file, style="both", quality_sequence=TRUE) new_cols <- setdiff(colnames(db), original_cols) db[,new_cols] %>% head() ``` The function `readFastq` takes as main inputs a repertoire `data.frame` (`db`) and a path to the corresponding `.fastq` file (`fastq_file`). The sequencing quality scores will be merged into the `data.frame` by `sequence_id`. The newly added columns are: `r paste(new_cols, collapse=", ")`. The other fields, contain the ASCII quality scores in the form of a vector, where values are comma separated, and `-` or `.` positions have value `" "` (blank). After loading the quality scores with `readFastqDb`, `getPositionQuality` can be used to generate a `data.frame` of sequencing quality values per position. ```{r} quality <- getPositionQuality(db, sequence_id="sequence_id", sequence="sequence_alignment", quality_num="quality_alignment_num") head(quality) ``` ```{r, fig.cap="Sequence quality per IMGT position for one sequence.", fig.asp=0.25} min_pos <- min(quality$position) max_pos <- max(quality$position) ggplot(quality, aes(x=position, y=quality_alignment_num, color=nt)) + geom_point() + coord_cartesian(xlim=c(110,120)) + xlab("IMGT position") + ylab("Sequencing quality") + scale_fill_gradient(low = "light blue", high = "dark red") + scale_x_continuous(breaks=c(min_pos:max_pos)) + alakazam::baseTheme() ``` You can add use the quality `data.frame` to complement analysis performed with other tools from the Immcantation framework. For example, you could inspect the sequencing quality of novel polymorphisms identified with `tigger`, or the sequencing quality in mutated/unmutated regions. ## Mask low quality positions Use `maskPositionsByQuality` to mask low quality positions. Positions with a sequencing quality < `min_quality` will be replaced with an 'N'. A message will show the number of sequences in `db` that had at least one position masked. ```{r} db <- maskPositionsByQuality(db, min_quality=70, sequence="sequence_alignment", quality="quality_alignment_num") ``` alakazam/vignettes/Files-Vignette.Rmd0000644000175000017500000000500314067624107017473 0ustar nileshnilesh--- title: "Alakazam: How to read and write files" author: "Edel Aron" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{File input and output} %\usepackage[utf8]{inputenc} --- As part of the Immcantation suite of tools, the `alakazam` package includes a set of built-in functions capable of reading and writing tab-delimited database files created by [Change-O](https://changeo.readthedocs.io/en/stable/) into R data.frames. However, due to differences in how certain values and sequences are handled, `alakazam::readChangeoDb` and `alakazam::writeChangeoDb` will not properly read in [AIRR](https://docs.airr-community.org) formatted files. These files should instead be loaded using the functions included in the `airr` package (`airr::read_rearrangement` and `airr::write_rearrangement`). You can read more about how we use both data standards [here](https://immcantation.readthedocs.io/en/stable/datastandards.html) and [here](https://changeo.readthedocs.io/en/stable/standard.html). *Please note that the default file format for all functions in Immcantation is the AIRR-C format as of Immcantation v4.0.0, which corresponds to alakazam v1.0.0.* ## Reading data Small example databases for both the Change-O format (`ExampleDbChangeo`) and the AIRR format (`ExampleDb`) are included in the `alakazam` package. For specific details about the latter, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Set the file paths from inside the package directory # These files are smaller versions of the example databases previously mentioned changeo_file <- system.file("extdata", "example_changeo.tab.gz", package="alakazam") airr_file <- system.file("extdata", "example_airr.tsv.gz", package="alakazam") # Read in the data db_changeo <- alakazam::readChangeoDb(changeo_file) db_airr <- airr::read_rearrangement(airr_file) ``` ## Writing data ```{r, eval=FALSE, warning=FALSE, message=FALSE} # Write the data to a tab-delimited file alakazam::writeChangeoDb(db_changeo, "changeo.tsv") airr::write_rearrangement(db_airr, "airr.tsv") ``` alakazam/vignettes/Topology-Vignette.Rmd0000644000175000017500000003063214137534600020247 0ustar nileshnilesh--- title: 'Alakazam: Topology analysis of lineage trees' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Topology analysis} %\usepackage[utf8]{inputenc} --- This vignette covers the basics of analyzing the topologies of Ig lineage trees built using `buildPhylipLineage`, using some built-in alakazam functions that focus on quantifying annotation relationships within lineages. ## Example data A small set of annotated example trees, `ExampleTrees`, are included in the `alakazam` package. The trees are `igraph` objects with the following tree annotations (graph attributes): * `clone`: An identifier for the clonal group. These entries correspond to the `clone_id` column in the `ExampleDb` data.frame from which the trees were generated. * `v_gene`: IGHV gene name. * `j_gene`: IGHJ gene name. * `junc_len`: Length of the junction region (nucleotides). And the following node annotations (vertex attributes): * `sample_id`: Time point in relation to influenza vaccination. * `c_call`: The isotype(s) assigned to the sequence. Multiple isotypes are delimited by comma, and reflect identical V(D)J sequences observed with more than one isotype. * `duplicate_count`: The copy number (duplicate count), which indicates the total number of reads with the same V(D)J sequence. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(igraph) library(dplyr) # Load example trees data(ExampleTrees) # Select one tree for example purposes graph <- ExampleTrees[[24]] # And add some annotation complexity to the tree V(graph)$sample_id[c(2, 7)] <- "-1h" V(graph)$c_call[c(2, 7)] <- "IGHM" # Make a list of example trees excluding multi-isotype trees graph_list <- ExampleTrees[sapply(ExampleTrees, function(x) !any(grepl(",", V(x)$c_call)))] ``` ## Plotting annotations on a tree There are many options for configuring how an igraph object is plotted which are helpful for visualizing annotation topologies. Below is an extensive example of how to plot a tree by configuring the colors, labels, shapes and sizes of different visual elements according to annotations embedded in the graph. ```{r, eval=TRUE} # Set node colors V(graph)$color[V(graph)$sample_id == "-1h"] <- "seagreen" V(graph)$color[V(graph)$sample_id == "+7d"] <- "steelblue" V(graph)$color[V(graph)$name == "Germline"] <- "black" V(graph)$color[grepl("Inferred", V(graph)$name)] <- "white" # Set node labels V(graph)$label <- paste(V(graph)$sample_id, V(graph)$c_call, sep=", ") V(graph)$label[V(graph)$name == "Germline"] <- "" V(graph)$label[grepl("Inferred", V(graph)$name)] <- "" # Set node shapes V(graph)$shape <- "crectangle" V(graph)$shape[V(graph)$name == "Germline"] <- "circle" V(graph)$shape[grepl("Inferred", V(graph)$name)] <- "circle" # Set node sizes V(graph)$size <- 60 V(graph)$size[V(graph)$name == "Germline"] <- 30 V(graph)$size[grepl("Inferred", V(graph)$name)] <- 15 # Remove large default margins par(mar=c(0, 0, 0, 0) + 0.05) # Plot the example tree plot(graph, layout=layout_as_tree, vertex.frame.color="grey", vertex.label.color="black", edge.label.color="black", edge.arrow.mode=0) # Add legend legend("topleft", c("Germline", "Inferred", "-1h", "+7d"), fill=c("black", "white", "seagreen", "steelblue"), cex=0.75) ``` ## Summarizing node properties Various annotation dependent node statistics can be calculated using the `summarizeSubtrees` and `getPathLengths` functions. `getPathLengths` calculates distances from the root (germline) *to child nodes*, whereas `summarizeSubtrees` calculates paths and subtree statistics *from child nodes*. ### Calculating distance from the germline To determine the shortest path from the germline sequence to any node, we use `getPathLengths`, which returns the distance both as the number of "hops" (`steps`) and the number of mutational events (`distance`). ```{r, eval=TRUE} # Consider all nodes getPathLengths(graph, root="Germline") ``` Note, the `STEPS` counted in the above example include traversal of inferred intermediates. If you want to exclude such nodes and consider only nodes associated with observed sequences, you can specify an annotation field and value that will be excluded from the number of steps. In the example below we are excluding `NA` values in the `c_call` annotation (`field="c_call", exclude=NA`). ```{r, eval=TRUE} # Exclude nodes without an isotype annotation from step count getPathLengths(graph, root="Germline", field="c_call", exclude=NA) ``` Note, `steps` has changed with respect to the previous example, but `distance` remains the same. ### Calculating subtree properties The `summarizeSubtrees` function returns a table of each node with the following properties for each node: * `name`: The node identifier. * `parent`: The identifier of the node's parent. * `outdegree`: The number of edges leading from the node. * `size`: The total number of nodes within the subtree rooted at the node. * `depth`: The depth of the subtree that is rooted at the node. * `pathlength`: The maximum path length beneath the node. * `outdegree_norm`: The `outdegree` normalized by the total number of edges. * `size_norm`: The `size` normalized by the total tree size. * `depth_norm`: The `depth` normalized by the total tree depth. * `pathlength_norm`: The `pathlength` normalized by the longest path. The `fields=c("sample_id", "c_call")` argument in the example below simply defines which annotations we wish to retain in the output. This argument has no effect on the results, in constast to the behavior of `getPathLengths`. ```{r, eval=TRUE} # Summarize tree df <- summarizeSubtrees(graph, fields=c("sample_id", "c_call"), root="Germline") print(df[1:4]) print(df[c(1, 5:8)]) print(df[c(1, 9:12)]) ``` Distributions of normalized subtree statistics for a population of trees can be plotted using the `plotSubtrees` function. In the example below, we have specified `silent=TRUE` which causes `plotSubtrees` to return the ggplot object without rendering the plot. The ggplot object are then plotting using the `gridPlot` function which places each individual plot in a separate panel of the same figure. ```{r, eval=TRUE} # Set sample colors sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") # Box plots of node outdegree by sample p1 <- plotSubtrees(graph_list, "sample_id", "outdegree", colors=sample_colors, main_title="Node outdegree", legend_title="Time", style="box", silent=TRUE) # Box plots of subtree size by sample p2 <- plotSubtrees(graph_list, "sample_id", "size", colors=sample_colors, main_title="Subtree size", legend_title="Time", style="box", silent=TRUE) # Violin plots of subtree path length by isotype p3 <- plotSubtrees(graph_list, "c_call", "pathlength", colors=IG_COLORS, main_title="Subtree path length", legend_title="Isotype", style="violin", silent=TRUE) # Violin plots of subtree depth by isotype p4 <- plotSubtrees(graph_list, "c_call", "depth", colors=IG_COLORS, main_title="Subtree depth", legend_title="Isotype", style="violin", silent=TRUE) # Plot in a 2x2 grid gridPlot(p1, p2, p3, p4, ncol=2) ``` ## Counting and testing node annotation relationships Given a set of annotated trees, you can determine the abundance of specific parent-child relationships within individual trees using the `tableEdges` function and the signficance of these relationships in population of trees using the `testEdges` function. Annotation relationships over edges can be calculated as direct or indirect relationships, where a direct relationship is a parent-child pair and an indirect relationship is a decent relationship that travels through another node (or nodes) first. ### Tabulating edges for a single tree Tabulating all directparent-child annotation relationships in the tree by isotype annotation can be performed like so: ```{r, eval=TRUE} # Count direct edges between isotypes tableEdges(graph, "c_call") ``` The above output is cluttered with the `NA` annotations from the germline and inferred nodes. We can perform the same direct tabulation, but exclude any nodes annotated with either `Germline` or `NA` for c_call using the `exclude` argument: ```{r, eval=TRUE} # Direct edges excluding germline and inferred nodes tableEdges(graph, "c_call", exclude=c("Germline", NA)) ``` As there are inferred nodes in the tree, we might want to consider indirect parent-child relationships that traverse through inferred nodes. This is accomplished using the same arguments as above, but with the addition of the `indirect=TRUE` argument which will skip over the excluded nodes when tabulating annotation pairs: ```{r, eval=TRUE} # Count indirect edges walking through germline and inferred nodes tableEdges(graph, "c_call", indirect=TRUE, exclude=c("Germline", NA)) ``` ### Significance testing of edges in a population of trees Given a population of trees, as a list of annotated igraph objects, you can determine if there is enrichment for specific annotation pairs using the `testEdges` function. This has the same options as `tableEdges`, except that the values `c("Germline", NA)` are excluded by default. `testEdges` performs a permutation test to generated a null distribution, excluding permutation of of any annotations specified to the `exclude` argument (these annotation remain fix in the tree). P-values output by `testEdges` are one-sided tests that the annotation pair is observed more often than expected. ```{r, eval=TRUE} # Test isotype relationships edge_test <- testEdges(graph_list, "c_call", nperm=10) # Print p-value table print(edge_test) # Plot null distributions for each annotation pair plotEdgeTest(edge_test, color="steelblue", main_title="Isotype Edges", style="hist") ``` ## Counting and testing MRCA annotations The most recent common ancestor (MRCA) of an Ig lineage we define herein as the most ancestral observed (or inferred) sequences in the lineage tree. Meaning, the node that is most proximal (by some measure) to the germline/root node. The `getMRCA` and `testMRCA` functions provide extraction and significance testing of MRCA sequences by annotation value, respectively. ### Extracting MRCAs from a tree Extracting the MRCA from a tree is accomplished using the `getMRCA` function. The germline distance criteria are as described above for `getPathLengths` and can be either node hops or mutational events, with or without exclusion of nodes with specific annotations. To simply extract the annotations for the node(s) immediately below the germline, you can use the `path=steps` argument without any node exclusion: ```{r, eval=TRUE} # Use unweighted path length and do not exclude any nodes mrca_df <- getMRCA(graph, path="steps", root="Germline") # Print subset of the annotation data.frame print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ``` To use mutational distance and consider only observed (ie, non-germline and non-inferred) nodes, we specify the exclusion field (`field="c_call"`) and exclusion value within that field (`exclude=NA`): ```{r, eval=TRUE} # Exclude nodes without an isotype annotation and use weighted path length mrca_df <- getMRCA(graph, path="distance", root="Germline", field="c_call", exclude=NA) # Print excluding sequence, label, color, shape and size annotations print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ``` ### Significance testing of MRCA annotations Similar to `testEdges`, the function `testMRCA` will perform a permutation test to determine the significance of an annotation appearing at the MRCA over a population of trees. P-values output by `testMRCA` are one-sided tests that the annotation is observed more often than expected in the MRCA position. ```{r, eval=TRUE} # Test isotype MRCA annotations mrca_test <- testMRCA(graph_list, "c_call", nperm=10) # Print p-value table print(mrca_test) # Plot null distributions for each annotation plotMRCATest(mrca_test, color="steelblue", main_title="Isotype MRCA", style="hist") ``` alakazam/build/0000755000175000017500000000000014137542165013274 5ustar nileshnileshalakazam/build/vignette.rds0000644000175000017500000000057014137542165015635 0ustar nileshnileshN1OHLP/$z0f&K]|m/,vXTcn;_;'DE$j²9c |/k!4~+ɭ哇uLrm-BVDo䏆xH*SZyyv<ʹʸeCJ{ T,p.*tĠy';y:PҩgHQ]EGdCG*ȡRA@G*#H)yFAa6ݵ{\!g!W [L tdk6` x`!~ӼݲϸLС'( C=6|Fv}+Sf" fd>>>zalakazam/R/0000755000175000017500000000000014137542025012371 5ustar nileshnileshalakazam/R/Gene.R0000644000175000017500000015666214067624107013416 0ustar nileshnilesh# Gene usage analysis #### Calculation functions #### #' Tabulates V(D)J allele, gene or family usage. #' #' Determines the count and relative abundance of V(D)J alleles, genes or families within #' groups. #' #' @param data data.frame with AIRR-format or Change-O style columns. #' @param gene column containing allele assignments. Only the first allele in the #' column will be considered when \code{mode} is "gene", "family" or #' "allele". The value will be used as it is with \code{mode="asis"}. #' @param groups columns containing grouping variables. If \code{NULL} do not group. #' @param copy name of the \code{data} column containing copy numbers for each #' sequence. If this value is specified, then total copy abundance #' is determined by the sum of copy numbers within each gene. #' This argument is ignored if \code{clone} is specified. #' @param clone name of the \code{data} column containing clone identifiers for each #' sequence. If this value is specified, then one gene will be considered #' for each clone. Note, this is accomplished by using the most #' common gene within each \code{clone} identifier. As such, #' ambiguous alleles within a clone will not be accurately represented. #' @param mode one of \code{c("gene", "family", "allele", "asis")} defining #' the degree of specificity regarding allele calls. Determines whether #' to return counts for genes (calling \code{getGene}), #' families (calling \code{getFamily}), alleles (calling #' \code{getAllele}) or using the value as it is in the column #' \code{gene}, without any processing. #' @param fill logical of \code{c(TRUE, FALSE)} specifying when if groups (when specified) #' lacking a particular gene should be counted as 0 if TRUE or not (omitted) #' @param remove_na removes rows with \code{NA} values in the gene column if \code{TRUE} and issues a warning. #' Otherwise, keeps those rows and considers \code{NA} as a gene in the final counts #' and relative abundances. #' #' @return A data.frame summarizing family, gene or allele counts and frequencies #' with columns: #' \itemize{ #' \item \code{gene}: name of the family, gene or allele. #' \item \code{seq_count}: total number of sequences for the gene. #' \item \code{seq_freq}: frequency of the gene as a fraction of the total #' number of sequences within each grouping. #' \item \code{copy_count}: sum of the copy counts in the \code{copy} column. #' for each gene. Only present if the \code{copy} #' argument is specified. #' \item \code{copy_freq}: frequency of the gene as a fraction of the total #' copy number within each group. Only present if #' the \code{copy} argument is specified. #' \item \code{clone_count}: total number of clones for the gene. Only present if #' the \code{clone} argument is specified. #' \item \code{clone_freq}: frequency of the gene as a fraction of the total #' number of clones within each grouping. Only present if #' the \code{clone} argument is specified. #' } #' Additional columns defined by the \code{groups} argument will also be present. #' #' @examples #' # Without copy numbers #' genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="family") #' genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="gene") #' genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="allele") #' #' # With copy numbers and multiple groups #' genes <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), #' copy="duplicate_count", mode="family") #' #' # Count by clone #' genes <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), #' clone="clone_id", mode="family") #' #' # Count absent genes #' genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", #' mode="allele", fill=TRUE) #' #'@export countGenes <- function(data, gene, groups=NULL, copy=NULL, clone=NULL, fill=FALSE, mode=c("gene", "allele", "family", "asis"), remove_na=TRUE) { ## DEBUG # data=ExampleDb; gene="c_call"; groups=NULL; mode="gene"; clone="clone_id" # data=subset(db, clond_id == 3138) # Hack for visibility of dplyr variables . <- NULL # Check input mode <- match.arg(mode) check <- checkColumns(data, c(gene, groups, copy)) if (check != TRUE) { warning(check) # instead of throwing an error and potentially disrupting a workflow } # Handle NAs if (remove_na) { bool_na <- is.na(data[, gene]) if (any(bool_na)) { if (!all(bool_na)){ msg <- paste0("NA(s) found in ", sum(bool_na), " row(s) of the ", gene, " column and excluded from tabulation") warning(msg) } data <- data[!bool_na, ] } } # Extract gene, allele or family assignments if (mode != "asis") { gene_func <- switch(mode, allele=getAllele, gene=getGene, family=getFamily) data[[gene]] <- gene_func(data[[gene]], first=TRUE) } # Tabulate abundance if (is.null(copy) & is.null(clone)) { # Tabulate sequence abundance gene_tab <- data %>% group_by(!!!rlang::syms(c(groups, gene))) %>% dplyr::summarize(seq_count=n()) %>% mutate(., seq_freq=!!rlang::sym("seq_count")/sum(!!rlang::sym("seq_count"), na.rm=TRUE)) %>% arrange(desc(!!rlang::sym("seq_count"))) } else if (!is.null(clone) & is.null(copy)) { # Find count of genes within each clone and keep first with maximum count gene_tab <- data %>% group_by(!!!rlang::syms(c(groups, clone, gene))) %>% dplyr::mutate(clone_gene_count=n()) %>% ungroup() %>% group_by(!!!rlang::syms(c(groups, clone))) %>% slice(which.max(!!rlang::sym("clone_gene_count"))) %>% ungroup() %>% group_by(!!!rlang::syms(c(groups, gene))) %>% dplyr::summarize(clone_count=n()) %>% mutate(clone_freq=!!rlang::sym("clone_count")/sum(!!rlang::sym("clone_count"), na.rm=TRUE)) %>% arrange(!!rlang::sym("clone_count")) } else { if (!is.null(clone) & !is.null(copy)) { warning("Specifying both 'copy' and 'clone' columns is not meaningful. ", "The 'clone' argument will be ignored.") } # Tabulate copy abundance gene_tab <- data %>% group_by(!!!rlang::syms(c(groups, gene))) %>% summarize(seq_count=length(!!rlang::sym(gene)), copy_count=sum(!!rlang::sym(copy), na.rm=TRUE)) %>% mutate(seq_freq=!!rlang::sym("seq_count")/sum(!!rlang::sym("seq_count"), na.rm=TRUE), copy_freq=!!rlang::sym("copy_count")/sum(!!rlang::sym("copy_count"), na.rm=TRUE)) %>% arrange(desc(!!rlang::sym("copy_count"))) } # If a gene is present in one GROUP but not another, will fill the COUNT and FREQ with 0s if (fill) { gene_tab <- gene_tab %>% ungroup() %>% tidyr::complete(!!!rlang::syms(as.list(c(groups, gene))), fill = list(seq_count = 0, seq_freq = 0, copy_count = 0, copy_freq = 0, clone_count = 0, clone_freq = 0)) } # Rename gene column gene_tab <- rename(gene_tab, "gene"=gene) return(gene_tab) } #### Annotation functions #### #' Get Ig segment allele, gene and family names #' #' \code{getSegment} performs generic matching of delimited segment calls with a custom #' regular expression. \link{getAllele}, \link{getGene} and \link{getFamily} extract #' the allele, gene and family names, respectively, from a character vector of #' immunoglobulin (Ig) or TCR segment allele calls in IMGT format. #' #' @param segment_call character vector containing segment calls delimited by commas. #' @param segment_regex string defining the segment match regular expression. #' @param first if \code{TRUE} return only the first call in #' \code{segment_call}; if \code{FALSE} return all calls #' delimited by commas. #' @param collapse if \code{TRUE} check for duplicates and return only unique #' segment assignments; if \code{FALSE} return all assignments #' (faster). Has no effect if \code{first=TRUE}. #' @param strip_d if \code{TRUE} remove the "D" from the end of gene annotations #' (denoting a duplicate gene in the locus); #' if \code{FALSE} do not alter gene names. #' @param omit_nl if \code{TRUE} remove non-localized (NL) genes from the result. #' Only applies at the gene or allele level. #' @param sep character defining both the input and output segment call #' delimiter. #' #' @return A character vector containing allele, gene or family names. #' #' @references #' \url{http://imgt.org} #' #' @seealso \link{countGenes} #' #' @examples #' # Light chain examples #' kappa_call <- c("Homsap IGKV1D-39*01 F,Homsap IGKV1-39*02 F,Homsap IGKV1-39*01", #' "Homsap IGKJ5*01 F") #' #' getAllele(kappa_call) #' getAllele(kappa_call, first=FALSE) #' getAllele(kappa_call, first=FALSE, strip_d=FALSE) #' #' getGene(kappa_call) #' getGene(kappa_call, first=FALSE) #' getGene(kappa_call, first=FALSE, strip_d=FALSE) #' #' getFamily(kappa_call) #' getFamily(kappa_call, first=FALSE) #' getFamily(kappa_call, first=FALSE, collapse=FALSE) #' getFamily(kappa_call, first=FALSE, strip_d=FALSE) #' #' getLocus(kappa_call) #' getChain(kappa_call) #' #' # Heavy chain examples #' heavy_call <- c("Homsap IGHV1-69*01 F,Homsap IGHV1-69D*01 F", #' "Homsap IGHD1-1*01 F", #' "Homsap IGHJ1*01 F") #' #' getAllele(heavy_call, first=FALSE) #' getAllele(heavy_call, first=FALSE, strip_d=FALSE) #' #' getGene(heavy_call, first=FALSE) #' getGene(heavy_call, first=FALSE, strip_d=FALSE) #' #' getFamily(heavy_call) #' getLocus(heavy_call) #' getChain(heavy_call) #' #' # Filtering non-localized genes #' nl_call <- c("IGHV3-NL1*01,IGHV3-30-3*01,IGHV3-30*01", #' "Homosap IGHV3-30*01 F,Homsap IGHV3-NL1*01 F", #' "IGHV1-NL1*01") #' #' getAllele(nl_call, first=FALSE, omit_nl=TRUE) #' getGene(nl_call, first=FALSE, omit_nl=TRUE) #' getFamily(nl_call, first=FALSE, omit_nl=TRUE) #' #' # Temporary designation examples #' tmp_call <- c("IGHV9S3*01", "IGKV10S12*01") #' #' getAllele(tmp_call) #' getGene(tmp_call) #' getFamily(tmp_call) #' #' @export getSegment <- function(segment_call, segment_regex, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { # Define boundaries of individual segment calls edge_regex <- paste0("[^", sep, "]*") # Remove NL genes if (omit_nl) { # Clean segment_call to keep only the name (remove species) allele_regex <- '((IG[HKL][VDJADEGMC]|TR[ABDG])[A-R0-9\\(\\)]+[-/\\w]*[-\\*]*[\\.\\w]+)' segment_call <- gsub(paste0(edge_regex, "(", allele_regex, ")", edge_regex), "\\1", segment_call, perl=T) # non-localized regex nl_regex <- paste0('(IG[HKL][VDJADEGMC]|TR[ABDG])[0-9]+-NL[0-9]([-/\\w]*[-\\*][\\.\\w]+)*(', sep, "|$)") # delete non-localized calls segment_call <- gsub(nl_regex, "", segment_call, perl=TRUE) } # Extract calls r <- gsub(paste0(edge_regex, "(", segment_regex, ")", edge_regex), "\\1", segment_call, perl=T) # Strip D from gene names if required if (strip_d) { strip_regex <- paste0("(?<=[A-Z0-9][0-9])D(?=\\*|-|", sep, "|$)") r <- gsub(strip_regex, "", r, perl=TRUE) } # Collapse to unique set if required if (first) { r <- gsub(paste0(sep, ".*$"), "", r) } else if (collapse) { r <- sapply(strsplit(r, sep), function(x) paste(unique(x), collapse=sep)) } return(r) } #' @rdname getSegment #' @export getAllele <- function(segment_call, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { allele_regex <- '((IG[HKL][VDJADEGMC]|TR[ABDG])[A-R0-9\\(\\)]+[-/\\w]*[-\\*]*[\\.\\w]+)' r <- getSegment(segment_call, allele_regex, first=first, collapse=collapse, strip_d=strip_d, omit_nl=omit_nl, sep=sep) return(r) } #' @rdname getSegment #' @export getGene <- function(segment_call, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { gene_regex <- '((IG[HKL][VDJADEGMC]|TR[ABDG])[A-R0-9\\(\\)]+[-/\\w]*)' r <- getSegment(segment_call, gene_regex, first=first, collapse=collapse, strip_d=strip_d, omit_nl=omit_nl, sep=sep) return(r) } #' @rdname getSegment #' @export getFamily <- function(segment_call, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { family_regex <- '((IG[HKL][VDJADEGMC]|TR[ABDG])[A-R0-9\\(\\)]+)' r <- getSegment(segment_call, family_regex, first=first, collapse=collapse, strip_d=strip_d, omit_nl=omit_nl, sep=sep) return(r) } #' @rdname getSegment #' @export getLocus <- function(segment_call, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { locus_regex <- '((IG[HLK]|TR[ABDG]))' r <- getSegment(segment_call, locus_regex, first=first, collapse=collapse, strip_d=strip_d, omit_nl=omit_nl, sep=sep) return(r) } #' @rdname getSegment #' @export getChain <- function(segment_call, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { r <- getLocus(segment_call, first=first, collapse=collapse, strip_d=strip_d, omit_nl=omit_nl, sep=sep) r <- gsub("(IGH)|(TR[BD])", "VH", r) r <- gsub("(IG[KL])|(TR[AG])", "VL", r) return(r) } #### Utility functions #### # Get all VJ(L) combinations from one or more chains of the same type # # Input: # V annotation, J annotation, and optionally junction length of # one of more chains of the same type # - v: V annotation # - j: J annotation # - l: junction length (optional) # - sep_chain: character separting multiple chains # - sep_anno: character separating multiple/ambiguous annotations within each chain # - first: to be passed to getGene() # # Output: # A vector containing all unique VJ(L) combinations represented # # Assumption: # 1) number of chains match across v, j, l # 2) if length value is supplied, each chain has a single length value # # Example input # v <- "Homsap IGLV2-20*09 F,Homsap IGLV3-30*09 F;Homsap IGKV1-27*01 F;Homsap IGKV1-25*01 F,Homsap IGKV1-25*38 F,Homsap IGKV1-32*02 F" # j <- "Homsap IGLJ3*02 F;Homsap IGKJ5*02 F;Homsap IGKJ3*03 F,Homsap IGKJ9*03 F" # l <- "36;39;60" # getAllVJL(v, j, l, ";", ",", FALSE) # - 3 light chains # - number of V annotations per chain: 2/1/3 # - number of J annotations per chain: 1/1/2 # - Expected supremum of the number of VJL combinations: 2*1 + 1*1 + 3*2 = 9 # - Note that this is the supremum because the ACTUAL number (7) CAN be lower due to presence # of different alleles from the SAME gene (since computation is performed at the gene level) getAllVJL <- function(v, j, l, sep_chain, sep_anno, first) { # is l NULL? l_NULL <- is.null(l) # are there multiple chains? # assumes that number of chains match across v, j, l # (pre-checked in groupGenes) multi_chain <- stringi::stri_detect_fixed(str=v, pattern=sep_chain) # are there multiple annotations per chain? multi_anno_v <- stringi::stri_detect_fixed(str=v, pattern=sep_anno) multi_anno_j <- stringi::stri_detect_fixed(str=j, pattern=sep_anno) # separate chains # gets a vector of strings # each vector entry corresponds to a chain if (multi_chain) { v <- stringi::stri_split_fixed(str=v, pattern=sep_chain)[[1]] j <- stringi::stri_split_fixed(str=j, pattern=sep_chain)[[1]] if (!l_NULL) { l <- stringi::stri_split_fixed(str=l, pattern=sep_chain)[[1]] } } # separate annotations # gets a list # each list entry has a vector of one or more strings if (multi_anno_v) { v <- stringi::stri_split_fixed(str=v, pattern=sep_anno) # take care of 'first' here because getGene will not split by "," if (first) { v <- lapply(v, function(x){x[1]}) } } if (multi_anno_j) { j <- stringi::stri_split_fixed(str=j, pattern=sep_anno) if (first) { j <- lapply(j, function(x){x[1]}) } } # get gene # gets a list # each list entry corresponds to a chain, and is a vector of one or more strings v <- sapply(v, getGene, collapse=TRUE, simplify=FALSE, USE.NAMES=FALSE) j <- sapply(j, getGene, collapse=TRUE, simplify=FALSE, USE.NAMES=FALSE) # if there is multiple chains and/or multiple annotations if ( multi_chain | (multi_anno_v & first) | (multi_anno_j & first) ) { # gets a list # each list entry is a vector of one or more strings # do if/else outside sapply so it only gets evaluated once if (!l_NULL) { exp <- sapply(1:length(v), function(i){ #eg_df <- expand.grid(v[[i]], j[[i]], l[i]) #eg_vec <- apply(eg_df, 1, stringi::stri_paste, collapse="@") n_v <- length(v[[i]]) n_j <- length(j[[i]]) eg_vec = stringi::stri_paste(rep.int(v[[i]], times=n_j), rep(j[[i]], each=n_v), rep.int(l[i], times=n_v*n_j), sep="@") return(eg_vec) }, simplify=FALSE, USE.NAMES=FALSE) } else { exp <- sapply(1:length(v), function(i){ #eg_df = expand.grid(v[[i]], j[[i]]) #eg_vec = apply(eg_df, 1, stringi::stri_paste, collapse="@") n_v <- length(v[[i]]) n_j <- length(j[[i]]) eg_vec <- stringi::stri_paste(rep.int(v[[i]], times=n_j), rep(j[[i]], each=n_v), sep="@") return(eg_vec) }, simplify=FALSE, USE.NAMES=FALSE) } # concat and convert to vector; keep distinct values exp <- unique(unlist(exp, use.names=FALSE)) } else { n_v <- length(v[[1]]) n_j <- length(j[[1]]) if (!l_NULL) { exp <- stringi::stri_paste(rep.int(v[[1]], times=n_j), rep(j[[1]], each=n_v), rep.int(l[1], times=n_v*n_j), sep="@") } else { exp <- stringi::stri_paste(rep.int(v[[1]], times=n_j), rep(j[[1]], each=n_v), sep="@") } } return(exp) } #' Group sequences by gene assignment #' #' \code{groupGenes} will group rows by shared V and J gene assignments, #' and optionally also by junction lengths. IGH:IGK/IGL, TRB:TRA, and TRD:TRG #' paired single-cell BCR/TCR sequencing and unpaired bulk sequencing #' (IGH, TRB, TRD chain only) are supported. In the case of ambiguous (multiple) #' gene assignments, the grouping may be specified to be a union across all #' ambiguous V and J gene pairs, analogous to single-linkage clustering #' (i.e., allowing for chaining). #' #' @param data data.frame containing sequence data. #' @param v_call name of the column containing the heavy/long chain #' V-segment allele calls. #' @param j_call name of the column containing the heavy/long chain #' J-segment allele calls. #' @param junc_len name of column containing the junction length. #' If \code{NULL} then 1-stage partitioning is perform #' considering only the V and J genes is performed. #' See Details for further clarification. #' @param cell_id name of the column containing cell identifiers or barcodes. #' If specified, grouping will be performed in single-cell mode #' with the behavior governed by the \code{locus} and #' \code{only_heavy} arguments. If set to \code{NULL} then the #' bulk sequencing data is assumed. #' @param locus name of the column containing locus information. #' Only applicable to single-cell data. #' Ignored if \code{cell_id=NULL}. #' @param only_heavy use only the IGH (BCR) or TRB/TRD (TCR) sequences #' for grouping. Only applicable to single-cell data. #' Ignored if \code{cell_id=NULL}. #' @param first if \code{TRUE} only the first call of the gene assignments #' is used. if \code{FALSE} the union of ambiguous gene #' assignments is used to group all sequences with any #' overlapping gene calls. #' #' @return Returns a modified data.frame with disjoint union indices #' in a new \code{vj_group} column. #' #' If \code{junc_len} is supplied, the grouping this \code{vj_group} #' will have been based on V, J, and junction length simultaneously. However, #' the output column name will remain \code{vj_group}. #' #' The output \code{v_call}, \code{j_call}, \code{cell_id}, and \code{locus} #' columns will be converted to type \code{character} if they were of type #' \code{factor} in the input \code{data}. #' #' @details #' To invoke single-cell mode the \code{cell_id} argument must be specified and the \code{locus} #' column must be correct. Otherwise, \code{groupGenes} will be run with bulk sequencing assumptions, #' using all input sequences regardless of the values in the \code{locus} column. #' #' Values in the \code{locus} column must be one of \code{c("IGH", "IGI", "IGK", "IGL")} for BCR #' or \code{c("TRA", "TRB", "TRD", "TRG")} for TCR sequences. Otherwise, the function returns an #' error message and stops. #' #' Under single-cell mode with paired chained sequences, there is a choice of whether #' grouping should be done by (a) using IGH (BCR) or TRB/TRD (TCR) sequences only or #' (b) using IGH plus IGK/IGL (BCR) or TRB/TRD plus TRA/TRG (TCR). #' This is governed by the \code{only_heavy} argument. #' #' Specifying \code{junc_len} will force \code{groupGenes} to perform a 1-stage partitioning of the #' sequences/cells based on V gene, J gene, and junction length simultaneously. #' If \code{junc_len=NULL} (no column specified), then \code{groupGenes} performs only the first #' stage of a 2-stage partitioning in which sequences/cells are partitioned in the first stage #' based on V gene and J gene, and then in the second stage further splits the groups based on #' junction length (the second stage must be performed independently, as this only returns the #' first stage results). #' #' In the input \code{data}, the \code{v_call}, \code{j_call}, \code{cell_id}, and \code{locus} #' columns, if present, must be of type \code{character} (as opposed to \code{factor}). #' #' It is assumed that ambiguous gene assignments are separated by commas. #' #' All rows containing \code{NA} values in any of the \code{v_call}, \code{j_call}, and \code{junc_len} #' (if \code{junc_len != NULL}) columns will be removed. A warning will be issued when a row #' containing an \code{NA} is removed. #' #' @section Expectations for single-cell data: #' #' Single-cell paired chain data assumptions: #' \itemize{ #' \item every row represents a sequence (chain). #' \item heavy/long and light/short chains of the same cell are linked by \code{cell_id}. #' \item the value in \code{locus} column indicates whether the chain is the heavy/long or light/short chain. #' \item each cell possibly contains multiple heavy/long and/or light/short chains. #' \item every chain has its own V(D)J annotation, in which ambiguous V(D)J #' annotations, if any, are separated by a comma. #' } #' #' Single-cell example: #' \itemize{ #' \item A cell has 1 heavy chain and 2 light chains. #' \item There should be 3 rows corresponding to this cell. #' \item One of the light chains may have an ambiguous V annotation which looks like \code{"Homsap IGKV1-39*01 F,Homsap IGKV1D-39*01 F"}. #' } #' #' @examples #' # Group by genes #' db <- groupGenes(ExampleDb) #' head(db$vj_group) #' #' @export groupGenes <- function(data, v_call="v_call", j_call="j_call", junc_len=NULL, cell_id=NULL, locus="locus", only_heavy=TRUE, first=FALSE) { # Check base input check <- checkColumns(data, c(v_call, j_call, junc_len)) if (check != TRUE) { stop(check) } # Check single-cell input if (!is.null(cell_id)) { check <- checkColumns(data, c(cell_id, locus)) if (check != TRUE) { stop(check) } } # if necessary, cast select columns to character (factor not allowed later on) if (!is(data[[v_call]], "character")) { data[[v_call]] <- as.character(data[[v_call]]) } if (!is(data[[j_call]], "character")) { data[[j_call]] <- as.character(data[[j_call]]) } # e.g.: "Homsap IGHV3-7*01 F,Homsap IGHV3-6*01 F;Homsap IGHV1-4*01 F" separator_within_seq <- "," separator_between_seq <- ";" # single-cell mode? if (!is.null(cell_id) & !is.null(locus)) { single_cell <- TRUE if (!is(data[[cell_id]], "character")) { data[[cell_id]] <- as.character(data[[cell_id]]) } if (!is(data[[locus]], "character")) { data[[locus]] <- as.character(data[[locus]]) } # check locus column valid_loci <- c("IGH", "IGI", "IGK", "IGL", "TRA", "TRB", "TRD", "TRG") check <- !all(unique(data[[locus]]) %in% valid_loci) if (check) { stop("The locus column contains invalid loci annotations.") } } else { single_cell <- FALSE } # only set if `single_cell` & `only_heavy` v_call_light <- NULL j_call_light <- NULL junc_len_light <- NULL # single-cell mode if (single_cell) { # regardless of using heavy only, or using both heavy and light # for each cell # - index wrt data of heavy chain # - index wrt data of light chain(s) cell_id_uniq <- unique(data[[cell_id]]) cell_seq_idx <- sapply(cell_id_uniq, function(x){ # heavy chain idx_h <- which( data[[cell_id]]==x & data[[locus]] %in% c("IGH", "TRB", "TRD")) # light chain idx_l <- which( data[[cell_id]]==x & data[[locus]] %in% c("IGK", "IGL", "TRA", "TRG") ) return(list(heavy=idx_h, light=idx_l)) }, USE.NAMES=FALSE, simplify=FALSE) # make a copy data_orig <- data; rm(data) if (only_heavy) { # use heavy chains only # Straightforward subsetting like below won't work in cases # where multiple HCs are present for a cell # subset to heavy only # data <- data_orig[data_orig[[locus]]=="IGH", ] # flatten data cols <- c(cell_id, v_call, j_call, junc_len) data <- data.frame(matrix(NA, nrow=length(cell_seq_idx), ncol=length(cols))) colnames(data) <- cols for (i_cell in 1:length(cell_seq_idx)) { i_cell_h <- cell_seq_idx[[i_cell]][["heavy"]] data[[cell_id]][i_cell] <- cell_id_uniq[i_cell] # heavy chain V, J, junc_len data[[v_call]][i_cell] <- paste0(data_orig[[v_call]][i_cell_h], collapse=separator_between_seq) data[[j_call]][i_cell] <- paste0(data_orig[[j_call]][i_cell_h], collapse=separator_between_seq) if (!is.null(junc_len)) { data[[junc_len]][i_cell] <- paste0(data_orig[[junc_len]][i_cell_h], collapse=separator_between_seq) } } } else { # use heavy AND light chains for grouping v_call_light <- "v_call_light" j_call_light <- "j_call_light" # ifelse won't return NULL if (is.null(junc_len)) { junc_len_light <- NULL } else { junc_len_light <- "len_light" } # flatten data cols <- c(cell_id, v_call, j_call, junc_len, v_call_light, j_call_light, junc_len_light) data <- data.frame(matrix(NA, nrow=length(cell_seq_idx), ncol=length(cols))) colnames(data) <- cols for (i_cell in 1:length(cell_seq_idx)) { i_cell_h <- cell_seq_idx[[i_cell]][["heavy"]] i_cell_l <- cell_seq_idx[[i_cell]][["light"]] data[[cell_id]][i_cell] <- cell_id_uniq[i_cell] # heavy chain V, J, junc_len data[[v_call]][i_cell] <- paste0(data_orig[[v_call]][i_cell_h], collapse=separator_between_seq) data[[j_call]][i_cell] <- paste0(data_orig[[j_call]][i_cell_h], collapse=separator_between_seq) if (!is.null(junc_len)) { data[[junc_len]][i_cell] <- paste0(data_orig[[junc_len]][i_cell_h], collapse=separator_between_seq) } # light chain V, J, junc_len data[[v_call_light]][i_cell] <- paste0(data_orig[[v_call]][i_cell_l], collapse=separator_between_seq) data[[j_call_light]][i_cell] <- paste0(data_orig[[j_call]][i_cell_l], collapse=separator_between_seq) if (!is.null(junc_len_light)) { data[[junc_len_light]][i_cell] <- paste0(data_orig[[junc_len]][i_cell_l], collapse=separator_between_seq) } } # It cannot be the case that there are 2 V annotations but only 1 J annotation for # the two light chains. Both J annotations must be spelled out for each light chain, # separated by \code{separator_between_seq}, even if the annotated alleles are the same. # # This one-to-one annotation-to-chain correspondence for both V and J is explicitly # checked and an error raised if the requirement is not met. # one-to-one annotation-to-chain correspondence for both V and J (light) # for each cell/row, number of bewteen_seq separators in light V annotation and in light J annotation must match n_separator_btw_seq_v_light <- stringi::stri_count_fixed(str=data[[v_call_light]], pattern=separator_between_seq) n_separator_btw_seq_j_light <- stringi::stri_count_fixed(str=data[[j_call_light]], pattern=separator_between_seq) if (any( n_separator_btw_seq_v_light != n_separator_btw_seq_j_light )) { stop("Requirement not met: one-to-one annotation-to-chain correspondence for both V and J (light)") } } } # one-to-one annotation-to-chain correspondence for both V and J (heavy) # for each cell/row, number of bewteen_seq separators in heavy V annotation and in heavy J annotation must match # (in theory, there should be 1 heavy chain per cell; but 10x can return cell with >1 heavy chains and # you never know if the user will supply this cell as input) n_separator_btw_seq_v_heavy <- stringi::stri_count_fixed(str=data[[v_call]], pattern=separator_between_seq) n_separator_btw_seq_j_heavy <- stringi::stri_count_fixed(str=data[[j_call]], pattern=separator_between_seq) if (any( n_separator_btw_seq_v_heavy != n_separator_btw_seq_j_heavy )) { stop("Requirement not met: one-to-one annotation-to-chain correspondence for both V and J (heavy)") } # NULL will disappear when doing c() # c(NULL,NULL) gives NULL still cols_for_grouping_heavy <- c(v_call, j_call, junc_len) cols_for_grouping_light <- c(v_call_light, j_call_light, junc_len_light) # cols cannot be factor if (any( sapply(cols_for_grouping_heavy, function(x){class(data[[x]]) == "factor"}) )) { stop("one or more of { ", v_call, ", ", j_call, ifelse(is.null(junc_len), " ", ", "), junc_len, "} is factor. Must be character.\nIf using read.table(), make sure to set stringsAsFactors=FALSE.\n") } if (single_cell & !only_heavy) { if (any( sapply(cols_for_grouping_light, function(x) {class(data[[x]]) == "factor"}) )) { stop("one or more of { ", v_call_light, ", ", j_call_light, ifelse(is.null(junc_len_light), " ", ", "), junc_len_light, "} is factor. Must be character.\nIf using read.table(), make sure to set stringsAsFactors=FALSE.\n") } } # Check NA(s) in columns bool_na <- rowSums( is.na( data[, c(cols_for_grouping_heavy, cols_for_grouping_light)] ) ) >0 if (any(bool_na)) { entityName <- ifelse(single_cell, " cell(s)", " sequence(s)") msg <- paste0("NA(s) found in one or more of { ", v_call, ", ", j_call, ifelse(is.null(junc_len), "", ", "), junc_len, ifelse(is.null(v_call_light), "", ", "), v_call_light, ifelse(is.null(j_call_light), "", ", "), j_call_light, ifelse(is.null(junc_len_light), "", ", "), junc_len_light, " } columns. ", sum(bool_na), entityName, " removed.\n") warning(msg) data <- data[!bool_na, ] if (single_cell) { # maintain one-to-one relationship between # rows of data, cell_id_uniq, and cell_seq_idx cell_id_uniq <- cell_id_uniq[!bool_na] cell_seq_idx <- cell_seq_idx[!bool_na] } } ### expand # speed-up strategy # compute expanded VJL combos for unique rows # then distribute back to all rows # unique combinations of VJL # heavy chain seqs only if ( (!single_cell) | (single_cell & only_heavy) ) { combo_unique <- unique(data[, cols_for_grouping_heavy]) # unique components v_unique <- unique(combo_unique[[v_call]]) j_unique <- unique(combo_unique[[j_call]]) # map each row in full data to unique combo m_v <- match(data[[v_call]], v_unique) m_j <- match(data[[j_call]], j_unique) if (is.null(junc_len)) { combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i) { idx_v <- which (v_unique == combo_unique[[v_call]][i]) idx_j <- which (j_unique == combo_unique[[j_call]][i]) idx <- which(m_v==idx_v & m_j==idx_j) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) } else { l_unique <- unique(combo_unique[[junc_len]]) m_l <- match(data[[junc_len]], l_unique) combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i) { idx_v <- which(v_unique == combo_unique[[v_call]][i]) idx_j <- which(j_unique == combo_unique[[j_call]][i]) idx_l <- which(l_unique == combo_unique[[junc_len]][i]) idx <- which(m_v==idx_v & m_j==idx_j & m_l==idx_l) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) } # expand combo_unique if (is.null(junc_len)) { exp_lst <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=NULL, first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=F, USE.NAMES=FALSE) } else { exp_lst <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=combo_unique[[junc_len]][i], first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=F, USE.NAMES=FALSE) } } else { # single_cell & !only_heavy # important: do not do this separately for heavy and light # must keep the pairing structure combo_unique <- unique(data[, c(cols_for_grouping_heavy, cols_for_grouping_light)]) # unique components v_unique_h <- unique(combo_unique[[v_call]]) j_unique_h <- unique(combo_unique[[j_call]]) v_unique_l <- unique(combo_unique[[v_call_light]]) j_unique_l <- unique(combo_unique[[j_call_light]]) # map each row in full data to unique combo m_v_h <- match(data[[v_call]], v_unique_h) m_j_h <- match(data[[j_call]], j_unique_h) m_v_l <- match(data[[v_call_light]], v_unique_l) m_j_l <- match(data[[j_call_light]], j_unique_l) if (!is.null(junc_len)) { l_unique_h <- unique(combo_unique[[junc_len]]) m_l_h <- match(data[[junc_len]], l_unique_h) } if (!is.null(junc_len_light)) { l_unique_l <- unique(combo_unique[[junc_len_light]]) m_l_l <- match(data[[junc_len_light]], l_unique_l) } # expand combo_unique if (is.null(junc_len) & is.null(junc_len_light)) { # map combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i){ idx_v_h <- which( v_unique_h == combo_unique[[v_call]][i] ) idx_j_h <- which( j_unique_h == combo_unique[[j_call]][i] ) idx_v_l <- which( v_unique_l == combo_unique[[v_call_light]][i] ) idx_j_l <- which( j_unique_l == combo_unique[[j_call_light]][i] ) idx <- which(m_v_h==idx_v_h & m_j_h==idx_j_h & m_v_l==idx_v_l & m_j_l==idx_j_l) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) # heavy exp_h <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=NULL, first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) # light exp_l <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call_light]][i], j=combo_unique[[j_call_light]][i], l=NULL, first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) } else if (!is.null(junc_len) & !is.null(junc_len_light)) { # map combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i){ idx_v_h <- which( v_unique_h == combo_unique[[v_call]][i] ) idx_j_h <- which( j_unique_h == combo_unique[[j_call]][i] ) idx_l_h <- which( l_unique_h == combo_unique[[junc_len]][i] ) idx_v_l <- which( v_unique_l == combo_unique[[v_call_light]][i] ) idx_j_l <- which( j_unique_l == combo_unique[[j_call_light]][i] ) idx_l_l <- which( l_unique_l == combo_unique[[junc_len_light]][i] ) idx <- which(m_v_h==idx_v_h & m_j_h==idx_j_h & m_l_h==idx_l_h & m_v_l==idx_v_l & m_j_l==idx_j_l & m_l_l==idx_l_l) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) # heavy exp_h <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=combo_unique[[junc_len]][i], first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) # light exp_l <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call_light]][i], j=combo_unique[[j_call_light]][i], l=combo_unique[[junc_len_light]][i], first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) } else if (is.null(junc_len) & !is.null(junc_len_light)) { # map combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i){ idx_v_h <- which( v_unique_h == combo_unique[[v_call]][i] ) idx_j_h <- which( j_unique_h == combo_unique[[j_call]][i] ) idx_v_l <- which( v_unique_l == combo_unique[[v_call_light]][i] ) idx_j_l <- which( j_unique_l == combo_unique[[j_call_light]][i] ) idx_l_l <- which( l_unique_l == combo_unique[[junc_len_light]][i] ) idx <- which(m_v_h==idx_v_h & m_j_h==idx_j_h & m_v_l==idx_v_l & m_j_l==idx_j_l & m_l_l==idx_l_l) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) # heavy exp_h <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=NULL, first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) # light exp_l <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call_light]][i], j=combo_unique[[j_call_light]][i], l=combo_unique[[junc_len_light]][i], first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) } else if (!is.null(junc_len) & is.null(junc_len_light)) { # map combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i){ idx_v_h <- which( v_unique_h == combo_unique[[v_call]][i] ) idx_j_h <- which( j_unique_h == combo_unique[[j_call]][i] ) idx_l_h <- which( l_unique_h == combo_unique[[junc_len]][i] ) idx_v_l <- which( v_unique_l == combo_unique[[v_call_light]][i] ) idx_j_l <- which( j_unique_l == combo_unique[[j_call_light]][i] ) idx <- which(m_v_h==idx_v_h & m_j_h==idx_j_h & m_l_h==idx_l_h & m_v_l==idx_v_l & m_j_l==idx_j_l) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) # heavy exp_h <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=combo_unique[[junc_len]][i], first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) # light exp_l <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call_light]][i], j=combo_unique[[j_call_light]][i], l=NULL, first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) } # pair heavy & light stopifnot( length(exp_h) == length(exp_l) ) exp_lst <- sapply(1:length(exp_h), function(i){ n_h <- length(exp_h[[i]]) n_l <- length(exp_l[[i]]) stringi::stri_paste(rep.int(exp_h[[i]], times=n_l), rep(exp_l[[i]], each=n_h), sep="@") }, simplify=FALSE, USE.NAMES=FALSE) } # one-to-one correspondence btw exp_lst and combo_unique_full_idx # exp_lst: VJL combinations # combo_unique_full_idx: rows in data carrying each exp_lst # exp_lst may not be all unique because gene-level info is kept instead of allele-level # make exp_lst unique exp_lst_uniq <- unique(exp_lst) exp_lst_uniq_full_idx <- sapply(exp_lst_uniq, function(x){ # wrt exp_lst, therefore also wrt combo_unique_full_idx idx_lst <- which(unlist(lapply(exp_lst, function(y){ length(y)==length(x) && all(y==x) }))) # merge unlist(combo_unique_full_idx[idx_lst], use.names=FALSE) }, simplify=FALSE, USE.NAMES=FALSE) stopifnot( length(unique(unlist(exp_lst_uniq_full_idx, use.names=FALSE))) == nrow(data) ) # tip: unlist with use.names=F makes it much faster (>100x) # https://www.r-bloggers.com/speed-trick-unlist-use-namesfalse-is-heaps-faster/ exp_uniq <- sort(unique(unlist(exp_lst_uniq, use.names=FALSE))) n_cells_or_seqs <- nrow(data) # notes on implementation # regular/dense matrix is more straightforward to implement but very costly memory-wise # sparse matrix is less straightforward to implement but way more memory efficient # sparse matrix is very slow to modify to on-the-fly (using a loop like for dense matrix) # way faster to construct in one go # (DO NOT DELETE) # for illustrating the concept # this is the way to go if using regular matrix (memory-intensive) # same concept implemented using sparse matrix # mtx_cell_VJL <- matrix(0, nrow=nrow(data), ncol=length(exp_uniq)) # colnames(mtx_cell_VJL) <- exp_uniq # # mtx_adj <- matrix(0, nrow=length(exp_uniq), ncol=length(exp_uniq)) # rownames(mtx_adj) <- exp_uniq # colnames(mtx_adj) <- exp_uniq # # outdated: # for (i_cell in 1:length(exp_lst)) { # #if (i_cell %% 1000 == 0) { cat(i_cell, "\n") } # cur_uniq <- unique(exp_lst[[i_cell]]) # mtx_cell_VJL[i_cell, cur_uniq] <- 1 # mtx_adj[cur_uniq, cur_uniq] <- 1 # } # actual implementation using sparse matrix from Matrix package ### matrix indicating relationship between cell and VJ(L) combinations # row: cell # col: unique heavy VJ(L) (and light VJ(L)) # row indices m1_i <- lapply(1:length(exp_lst_uniq), function(i){ rep(exp_lst_uniq_full_idx[[i]], each=length(exp_lst_uniq[[i]])) }) m1_i_v <- unlist(m1_i, use.names=FALSE) # column indices m1_j <- lapply(1:length(exp_lst_uniq), function(i){ # wrt exp_uniq idx <- match(exp_lst_uniq[[i]], exp_uniq) #stopifnot( all.equal( exp_uniq[idx], exp_lst_uniq[[i]] ) ) rep.int(idx, length(exp_lst_uniq_full_idx[[i]])) }) m1_j_v <- unlist(m1_j, use.names=FALSE) stopifnot( length(m1_i_v) == length(m1_j_v) ) # no particular need for this to be not of class "nsparseMatrix" # so no need to specify x=rep(1, length(m1_i)) # not specifying makes it even more space-efficient mtx_cell_VJL <- Matrix::sparseMatrix(i=m1_i_v, j=m1_j_v, dims=c(n_cells_or_seqs, length(exp_uniq)), symmetric=F, triangular=F, index1=T, dimnames=list(NULL, exp_uniq)) ### adjacency matrix # row and col: unique heavy VJ(L) (and light VJ(L)) # row indices m2_i <- lapply(1:length(exp_lst_uniq), function(i){ # wrt exp_uniq idx <- match(exp_lst_uniq[[i]], exp_uniq) #stopifnot( all.equal( exp_uniq[idx], exp_lst_uniq[[i]] ) ) rep(idx, each=length(exp_lst_uniq[[i]])) }) m2_i_v <- unlist(m2_i, use.names=FALSE) # col indices m2_j <- lapply(1:length(exp_lst_uniq), function(i){ # wrt exp_uniq idx <- match(exp_lst_uniq[[i]], exp_uniq) #stopifnot( all.equal( exp_uniq[idx], exp_lst_uniq[[i]] ) ) rep.int(idx, length(exp_lst_uniq[[i]])) }) m2_j_v <- unlist(m2_j, use.names=FALSE) stopifnot( length(m2_i_v) == length(m2_j_v) ) # important: x must be specified for mtx_adj in order to make it not of class "nsparseMatrix" # this is because igraph accepts sparse matrix from Matrix but not the "pattern" matrices variant mtx_adj <- Matrix::sparseMatrix(i=m2_i_v, j=m2_j_v, x=rep(1,length(m2_i_v)), dims=c(length(exp_uniq), length(exp_uniq)), symmetric=F, triangular=F, index1=T, dimnames=list(exp_uniq, exp_uniq)) rm(m1_i, m1_j, m2_i, m2_j, m1_i_v, m1_j_v, m2_i_v, m2_j_v, exp_lst) ### identify connected components based on adjcencey matrix # this is the grouping # source: https://stackoverflow.com/questions/35772846/obtaining-connected-components-in-r g <- igraph::graph_from_adjacency_matrix(adjmatrix=mtx_adj, mode="undirected", diag=FALSE) #plot(g, vertex.size=10, vertex.label.cex=1, vertex.color="skyblue", vertex.label.color="black", vertex.frame.color="transparent", edge.arrow.mode=0) connected <- igraph::components(g) VJL_groups <- igraph::groups(connected) names(VJL_groups) <- paste0("G", 1:length(VJL_groups)) ### identify cells associated with each connected component (grouping) # each entry corresponds to a group/partition # each element within an entry is a cell cellIdx_byGroup_lst <- lapply(VJL_groups, function(x){ if (length(x)>1) { # matrix # important to specify rowSums from Matrix package # base::rowSums will NOT work cell_idx <- which(Matrix::rowSums(mtx_cell_VJL[, x])>0) } else { # vector cell_idx <- which(mtx_cell_VJL[, x]>0) } return(cell_idx) }) # sanity check: there should be perfect/disjoint partitioning # (each cell has exactly one group assignment) stopifnot( n_cells_or_seqs == length(unique(unlist(cellIdx_byGroup_lst, use.names=FALSE))) ) # assign data$vj_group <- NA for (i in 1:length(cellIdx_byGroup_lst)) { data[["vj_group"]][cellIdx_byGroup_lst[[i]]] <- names(VJL_groups)[i] } stopifnot(!any(is.na(data[["vj_group"]]))) if (!single_cell) { return(data) } else { data_orig$vj_group <- NA # map back to data_orig for (i_cell in 1:nrow(data)) { # wrt data_orig i_orig_h <- cell_seq_idx[[i_cell]][["heavy"]] i_orig_l <- cell_seq_idx[[i_cell]][["light"]] # sanity check stopifnot( all( data_orig[[cell_id]][c(i_orig_h, i_orig_l)] == cell_id_uniq[i_cell] ) ) # grouping data_orig$vj_group[c(i_orig_h, i_orig_l)] <- data$vj_group[i_cell] } # remove rows with $vj_group values of NA # these had already been removed by the NA check for `data` data_orig <- data_orig[!is.na(data_orig$vj_group), ] return(data_orig) } } #' Sort V(D)J genes #' #' \code{sortGenes} sorts a vector of V(D)J gene names by either lexicographic ordering #' or locus position. #' #' @param genes vector of strings respresenting V(D)J gene names. #' @param method string defining the method to use for sorting genes. One of: #' \itemize{ #' \item \code{"name"}: sort in lexicographic order. Order is by #' family first, then gene, and then allele. #' \item \code{"position"}: sort by position in the locus, as #' determined by the final two numbers #' in the gene name. Non-localized genes #' are assigned to the highest positions. #' } #' #' @return A sorted character vector of gene names. #' #' @seealso See \code{getAllele}, \code{getGene} and \code{getFamily} for parsing #' gene names. #' #' @examples #' # Create a list of allele names #' genes <- c("IGHV1-69D*01","IGHV1-69*01","IGHV4-38-2*01","IGHV1-69-2*01", #' "IGHV2-5*01","IGHV1-NL1*01", "IGHV1-2*01,IGHV1-2*05", #' "IGHV1-2", "IGHV1-2*02", "IGHV1-69*02") #' #' # Sort genes by name #' sortGenes(genes) #' #' # Sort genes by position in the locus #' sortGenes(genes, method="pos") #' #' @export sortGenes <- function(genes, method=c("name", "position")) { ## DEBUG # method="name" # Check arguments method <- match.arg(method) # Build sorting table sort_tab <- tibble(CALL=sort(getAllele(genes, first=FALSE, strip_d=FALSE))) %>% # Determine the gene and family mutate(FAMILY=getFamily(!!rlang::sym("CALL"), first=TRUE, strip_d=FALSE), GENE=getGene(!!rlang::sym("CALL"), first=TRUE, strip_d=FALSE), ALLELE=getAllele(!!rlang::sym("CALL"), first=TRUE, strip_d=FALSE)) %>% # Identify first gene number, second gene number and allele number mutate(G1=gsub("[^-]+-([^-\\*D]+).*", "\\1", !!rlang::sym("GENE")), G1=as.numeric(gsub("[^0-9]+", "99", !!rlang::sym("G1"))), G2=gsub("[^-]+-[^-]+-?", "", !!rlang::sym("GENE")), G2=as.numeric(gsub("[^0-9]+", "99", !!rlang::sym("G2"))), A1=as.numeric(sub("[^\\*]+\\*|[^\\*]+$", "", !!rlang::sym("ALLELE"))) ) # Convert missing values to 0 sort_tab[is.na(sort_tab)] <- 0 # Sort if (method == "name") { sorted_genes <- arrange(sort_tab, !!!rlang::syms(c("FAMILY", "G1", "G2", "A1")))[["CALL"]] } else if (method == "position") { sorted_genes <- arrange(sort_tab, desc(!!rlang::sym("G1")), desc(!!rlang::sym("G2")), !!rlang::sym("FAMILY"), !!rlang::sym("A1"))[["CALL"]] } return(sorted_genes) } alakazam/R/Sequence.R0000644000175000017500000013017214137256705014277 0ustar nileshnilesh# Common DNA, amino acid, and gene annotation operations for Alakazam #### Distance functions #### #' Build a DNA distance matrix #' #' \code{getDNAMatrix} returns a Hamming distance matrix for IUPAC ambiguous #' DNA characters with modifications for gap, \code{c("-", ".")}, and missing, #' \code{c("?")}, character values. #' #' @param gap value to assign to characters in the set \code{c("-", ".")}. #' #' @return A \code{matrix} of DNA character distances with row and column names #' indicating the character pair. By default, distances will be either 0 #' (equivalent), 1 (non-equivalent or missing), or -1 (gap). #' #' @seealso Creates DNA distance matrix for \link{seqDist}. #' See \link{getAAMatrix} for amino acid distances. #' #' @examples #' # Set gap characters to Inf distance #' # Distinguishes gaps from Ns #' getDNAMatrix() #' #' # Set gap characters to 0 distance #' # Makes gap characters equivalent to Ns #' getDNAMatrix(gap=0) #' #' @export getDNAMatrix <- function(gap=-1) { # Define Hamming distance matrix sub_mat <- diag(18) colnames(sub_mat) <- rownames(sub_mat) <- c(names(IUPAC_DNA), c("-", ".", "?")) for (i in 1:length(IUPAC_DNA)) { for (j in i:length(IUPAC_DNA)) { sub_mat[i, j] <- sub_mat[j, i] <- any(IUPAC_DNA[[i]] %in% IUPAC_DNA[[j]]) } } # Add gap characters sub_mat[c("-", "."), c("-", ".")] <- 1 sub_mat[c("-", "."), 1:15] <- 1 - gap sub_mat[1:15, c("-", ".")] <- 1 - gap return(1 - sub_mat) } #' Build an AA distance matrix #' #' \code{getAAMatrix} returns a Hamming distance matrix for IUPAC ambiguous #' amino acid characters. #' #' @param gap value to assign to characters in the set \code{c("-", ".")}. #' #' @return A \code{matrix} of amino acid character distances with row and column names #' indicating the character pair. #' #' @seealso Creates an amino acid distance matrix for \link{seqDist}. #' See \link{getDNAMatrix} for nucleotide distances. #' #' @examples #' getAAMatrix() #' #' @export getAAMatrix <- function(gap=0) { # Define Hamming distance matrix sub_mat <- diag(27) colnames(sub_mat) <- rownames(sub_mat) <- c(names(IUPAC_AA), c("-", ".")) for (i in 1:length(IUPAC_AA)) { for (j in i:length(IUPAC_AA)) { sub_mat[i, j] <- sub_mat[j, i] <- any(IUPAC_AA[[i]] %in% IUPAC_AA[[j]]) } } # Add gap characters sub_mat[c("-", "."), c("-", ".")] <- 1 sub_mat[c("-", "."), c(1:27)] <- 1 - gap sub_mat[c(1:27), c("-", ".")] <- 1 - gap return(1 - sub_mat) } #' Remove duplicate DNA sequences and combine annotations #' #' \code{collapseDuplicates} identifies duplicate DNA sequences, allowing for ambiguous #' characters, removes the duplicate entries, and combines any associated annotations. #' #' @param data data.frame containing Change-O columns. The data.frame #' must contain, at a minimum, a unique identifier column #' and a column containg a character vector of DNA sequences. #' @param id name of the column containing sequence identifiers. #' @param seq name of the column containing DNA sequences. #' @param text_fields character vector of textual columns to collapse. The textual #' annotations of duplicate sequences will be merged into a single #' string with each unique value alphabetized and delimited by #' \code{sep}. #' @param num_fields vector of numeric columns to collapse. The numeric annotations #' of duplicate sequences will be summed. #' @param seq_fields vector of nucletoide sequence columns to collapse. The sequence #' with the fewest numer of non-informative characters will be #' retained. Where a non-informative character is one of #' \code{c("N", "-", ".", "?")}. Note, this is distinct from the #' \code{seq} parameter which is used to determine duplicates. #' @param add_count if \code{TRUE} add the column \code{collpase_count} that #' indicates the number of sequences that were collapsed to build #' each unique entry. #' @param ignore vector of characters to ignore when testing for equality. #' @param sep character to use for delimiting collapsed annotations in the #' \code{text_fields} columns. Defines both the input and output #' delimiter. #' @param dry if \code{TRUE} perform dry run. Only labels the sequences without #' collapsing them. #' @param verbose if \code{TRUE} report the number input, discarded and output #' sequences; if \code{FALSE} process sequences silently. #' #' @return A modified \code{data} data.frame with duplicate sequences removed and #' annotation fields collapsed if \code{dry=FALSE}. If \code{dry=TRUE}, #' sequences will be labeled with the collapse action, but the input will be #' otherwise unmodifed (see Details). #' #' @details #' \code{collapseDuplicates} identifies duplicate sequences in the \code{seq} column by #' testing for character identity, with consideration of IUPAC ambiguous nucleotide codes. #' A cluster of sequences are considered duplicates if they are all equivalent, and no #' member of the cluster is equivalent to a sequence in a different cluster. #' #' Textual annotations, specified by \code{text_fields}, are collapsed by taking the unique #' set of values within in each duplicate cluster and delimiting those values by \code{sep}. #' Numeric annotations, specified by \code{num_fields}, are collapsed by summing all values #' in the duplicate cluster. Sequence annotations, specified by \code{seq_fields}, are #' collapsed by retaining the first sequence with the fewest number of N characters. #' #' Columns that are not specified in either \code{text_fields}, \code{num_fields}, or #' \code{seq_fields} will be retained, but the value will be chosen from a random entry #' amongst all sequences in a cluster of duplicates. #' #' An ambiguous sequence is one that can be assigned to two different clusters, wherein #' the ambiguous sequence is equivalent to two sequences which are themselves #' non-equivalent. Ambiguous sequences arise due to ambiguous characters at positions that #' vary across sequences, and are discarded along with their annotations when \code{dry=FALSE}. #' Thus, ambiguous sequences are removed as duplicates of some sequence, but do not create a potential #' false-positive annotation merger. Ambiguous sequences are not included in the #' \code{collapse_count} annotation that is added when \code{add_count=TRUE}. #' #' If \code{dry=TRUE} sequences will not be removed from the input. Instead, the following columns #' will be appended to the input defining the collapse action that would have been performed in the #' \code{dry=FALSE} case. #' #' \itemize{ #' \item \code{collapse_id}: an identifer for the group of identical sequences. #' \item \code{collapse_class}: string defining how the sequence matches to the other in the set. #' one of \code{"duplicated"} (has duplicates), #' \code{"unique"} (no duplicates), \code{"ambiguous_duplicate"} #' (no duplicates after ambiguous sequences are removed), #' or \code{"ambiguous"} (matches multiple non-duplicate sequences). #' \item \code{collapse_pass}: \code{TRUE} for the sequences that would be retained. #' } #' #' @seealso Equality is tested with \link{seqEqual} and \link{pairwiseEqual}. #' For IUPAC ambiguous character codes see \link{IUPAC_DNA}. #' #' @examples #' # Example data.frame #' db <- data.frame(sequence_id=LETTERS[1:4], #' sequence_alignment=c("CCCCTGGG", "CCCCTGGN", "NAACTGGN", "NNNCTGNN"), #' c_call=c("IGHM", "IGHG", "IGHG", "IGHA"), #' sample_id=c("S1", "S1", "S2", "S2"), #' duplicate_count=1:4, #' stringsAsFactors=FALSE) #' #' # Annotations are not parsed if neither text_fields nor num_fields is specified #' # The retained sequence annotations will be random #' collapseDuplicates(db, verbose=TRUE) #' #' # Unique text_fields annotations are combined into a single string with "," #' # num_fields annotations are summed #' # Ambiguous duplicates are discarded #' collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", #' verbose=TRUE) #' #' # Use alternate delimiter for collapsing textual annotations #' collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", #' sep="/", verbose=TRUE) #' #' # Add count of duplicates #' collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", #' add_count=TRUE, verbose=TRUE) #' #' # Masking ragged ends may impact duplicate removal #' db$sequence_alignment <- maskSeqEnds(db$sequence_alignment) #' collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", #' add_count=TRUE, verbose=TRUE) #' #' @export collapseDuplicates <- function(data, id="sequence_id", seq="sequence_alignment", text_fields=NULL, num_fields=NULL, seq_fields=NULL, add_count=FALSE, ignore=c("N", "-", ".", "?"), sep=",", dry=FALSE, verbose=FALSE) { # Stop if ids are not unique if (any(duplicated(data[[id]]))) { stop("All values in the id column are not unique") } # Verify column classes and exit if they are incorrect if (!is.null(text_fields)) { if (!all(sapply(subset(data, select=text_fields), is.character))) { stop("All text_fields columns must be of type 'character'") } } if (!is.null(num_fields)) { if (!all(sapply(subset(data, select=num_fields), is.numeric))) { stop("All num_fields columns must be of type 'numeric'") } } if (!is.null(seq_fields)) { if (!all(sapply(subset(data, select=seq_fields), is.character))) { stop("All seq_fields columns must be of type 'character'") } } seq_len <- stri_length(data[[seq]]) if (any(seq_len != seq_len[1])) { warning("All sequences are not the same length for data with first ", id, " = ", data[[id]][1]) } # Define verbose reporting function .printVerbose <- function(n_total, n_unique, n_discard) { cat(" FUNCTION> collapseDuplicates\n", sep="") cat(" FIRST_ID> ", data[[id]][1], "\n", sep="") cat(" TOTAL> ", n_total, "\n", sep="") cat(" UNIQUE> ", n_unique, "\n", sep="") cat("COLLAPSED> ", n_total - n_unique - n_discard, "\n", sep="") cat("DISCARDED> ", n_discard, "\n", sep="") cat("\n") } # Define function to count informative positions in sequences .informativeLength <- function(x) { stri_length(gsub("[N\\-\\.\\?]", "", x, perl=TRUE)) } # Initialize collapse_count with 1 for each sequence if(add_count) { data[["collapse_count"]] <- rep(1, nrow(data)) num_fields <- c(num_fields, "collapse_count") } # Initialize dry run columns if (dry) { data$collapse_id <- NA data$collapse_class <- NA data$collapse_pass <- TRUE } # Return input if there are no sequences to collapse nseq <- nrow(data) if (nseq <= 1) { if (verbose) { .printVerbose(nseq, 1, 0) } if (dry) { data$collapse_id <- 1 data$collapse_class <- "unique" data$collapse_pass <- TRUE } return(data) } # Build distance matrix d_mat <- pairwiseEqual(data[[seq]]) colnames(d_mat) <- rownames(d_mat) <- data[[id]] # Return input if no sequences are equal if (!any(d_mat[lower.tri(d_mat, diag=F)])) { if (verbose) { .printVerbose(nseq, nseq, 0) } if (dry) { data$collapse_id <- 1:nrow(data) data$collapse_class <- "unique" data$collapse_pass <- TRUE } return(data) } # Find sequences that will cluster ambiguously ambig_rows <- numeric() for (i in 1:nseq) { idx <- which(d_mat[i, ]) tmp_mat <- d_mat[idx, idx] if (!all(tmp_mat)) { ambig_rows <- append(ambig_rows, i) } } discard_count <- length(ambig_rows) if (dry & length(ambig_rows)>0) { data[["collapse_class"]][ambig_rows] <- "ambiguous" data[["collapse_pass"]][ambig_rows] <- FALSE } # Return single sequence if all or all but one sequence belong to ambiguous clusters if (nrow(d_mat) - discard_count <= 1) { inform_len <- data.frame(list("inform_len"=.informativeLength(data[[seq]]))) # For each ambiguous cluster, return the best sequence g <- igraph::simplify(igraph::graph_from_adjacency_matrix(d_mat)) inform_len$clusters <- igraph::components(g)$membership[data[[id]]] inform_len$select_id <- 1:nrow(inform_len) selected <- inform_len %>% dplyr::group_by(!!rlang::sym("clusters")) %>% dplyr::slice(which.max(!!rlang::sym("inform_len"))) %>% dplyr::ungroup() %>% dplyr::select(!!rlang::sym("select_id")) %>% unlist() if (verbose) { .printVerbose(nseq, 0, discard_count - 1) } if (dry) { data[["collapse_id"]] <- inform_len$clusters data[["collapse_pass"]][selected] <- TRUE } else { return(data[selected, ]) } } # Exclude ambiguous sequences from clustering if (!dry & discard_count > 0) { d_mat <- d_mat[-ambig_rows, -ambig_rows] data <- data[-ambig_rows,] } # Cluster remaining sequences into unique and duplicate sets dup_taxa <- list() uniq_taxa <- character() done_taxa <- character() taxa_names <- rownames(d_mat) collapse_id <- 1 for (taxa_i in 1:length(taxa_names)) { taxa <- taxa_names[taxa_i] # Skip taxa if previously assigned to a cluster # or if ambiguous # (ambiguous taxa don't get their own collapse_id) if (taxa %in% done_taxa) { next } if (dry & taxa_i %in% ambig_rows) { next } # Find all zero distance taxa idx <- which(d_mat[taxa, ]) # Update vector of clustered taxa done_taxa <- c(done_taxa, taxa_names[idx]) # Update collapse group if (dry) { data[["collapse_id"]][idx] <- paste(data[["collapse_id"]][idx], collapse_id, sep=",") } if (dry) { idx_copy <- idx idx <- idx[idx %in% ambig_rows == FALSE] } if (length(idx) == 1) { # Assign unique sequences to unique vector uniq_taxa <- append(uniq_taxa, taxa_names[idx]) if (dry) { if (length(idx_copy)==1) { ## 'truly' unique data[["collapse_class"]][taxa_i] <- "unique" } else { ## unique after ambiguous removal data[["collapse_class"]][taxa_i] <- "ambiguous_duplicate" } data[["collapse_pass"]][taxa_i] <- TRUE } } else if (length(idx) > 1) { # Assign clusters of duplicates to duplicate list dup_taxa <- c(dup_taxa, list(taxa_names[idx])) if (dry) { # Keep collpase_pass==TRUE for the sequence with the # larger number of informative positions # (the first one if ties) max_info_idx <- which.max(.informativeLength(data[[seq]][idx]))[1] data[["collapse_class"]][idx] <- "duplicated" data[["collapse_pass"]][idx[-max_info_idx]] <- FALSE } } else { # Report error (should never occur) stop("Error in distance matrix of collapseDuplicates") } collapse_id <- collapse_id + 1 } if (dry) { data[["collapse_id"]] <- sub("^NA,","",data[["collapse_id"]]) return(data) } # Collapse duplicate sets and append entries to unique data.frame unique_list <- list(data[data[[id]] %in% uniq_taxa, ]) for (taxa in dup_taxa) { # Define row indices of identical sequences idx <- which(data[[id]] %in% taxa) tmp_df <- data[idx[1], ] if (length(idx) > 1) { # Initialize with data from most informative sequence seq_set <- data[idx, c(id, seq)] inform_len <- .informativeLength(seq_set[[seq]]) max_inform <- which.max(inform_len)[1] # if ties, pick first tmp_df <- data[idx[max_inform], ] # Define set of text fields for row for (f in text_fields) { f_set <- na.omit(data[[f]][idx]) if (length(f_set) > 0) { f_set <- unlist(strsplit(f_set, sep)) f_set <- sort(unique(f_set)) f_val <- paste(f_set, collapse=sep) } else { f_val <- NA } tmp_df[, f] <- f_val } # Sum numeric fields for (f in num_fields) { f_set <- na.omit(data[[f]][idx]) if (length(f_set) > 0) { f_val <- sum(f_set) } else { f_val <- NA } tmp_df[, f] <- f_val } # Select sequence fields with fewest Ns for (f in seq_fields) { f_set <- na.omit(data[[f]][idx]) if (length(f_set) > 0) { f_len <- .informativeLength(f_set) f_val <- f_set[which.max(f_len)] } else { f_val <- NA } tmp_df[, f] <- f_val } } # Add row to unique list unique_list <- c(unique_list, list(tmp_df)) } # Combine all rows into unique data.frame unique_df <- as.data.frame(bind_rows(unique_list)) if (verbose) { .printVerbose(nseq, nrow(unique_df), discard_count) } return(unique_df) } #### Transformation functions #### #' Translate nucleotide sequences to amino acids #' #' \code{translateDNA} translates nucleotide sequences to amino acid sequences. #' #' @param seq vector of strings defining DNA sequence(s) to be converted to translated. #' @param trim boolean flag to remove 3 nts from both ends of seq #' (converts IMGT junction to CDR3 region). #' #' @return A vector of translated sequence strings. #' #' @seealso \code{\link[seqinr]{translate}}. #' #' @examples #' # Translate a single sequence #' translateDNA("ACTGACTCGA") #' #' # Translate a vector of sequences #' translateDNA(ExampleDb$junction[1:3]) #' #' # Remove the first and last codon from the translation #' translateDNA(ExampleDb$junction[1:3], trim=TRUE) #' #' @export translateDNA <- function (seq, trim=FALSE) { # Function to translate a single string .translate <- function(x) { if (stri_length(x) >= 3 & !is.na(x)) { stri_join(seqinr::translate(unlist(strsplit(x, "")), ambiguous=TRUE), collapse="") } else { NA } } # Remove 3 nucleotides from each end # Eg, "ACTGACTCGA" -> "GACT" (with "ACT" and "CGA" removed) if (trim) { seq <- substr(seq, 4, stri_length(seq) - 3) } # Replace gaps with N seq <- gsub("[-.]", "N", seq) # Apply translation aa <- sapply(seq, .translate, USE.NAMES=FALSE) return(aa) } #' Masks gap characters in DNA sequences #' #' \code{maskSeqGaps} substitutes gap characters, \code{c("-", ".")}, with \code{"N"} #' in a vector of DNA sequences. #' #' @param seq character vector of DNA sequence strings. #' @param mask_char character to use for masking. #' @param outer_only if \code{TRUE} replace only contiguous leading and trailing gaps; #' if \code{FALSE} replace all gap characters. #' #' @return A modified \code{seq} vector with \code{"N"} in place of \code{c("-", ".")} #' characters. #' #' @seealso See \link{maskSeqEnds} for masking ragged edges. #' #' @examples #' # Mask with Ns #' maskSeqGaps(c("ATG-C", "CC..C")) #' maskSeqGaps("--ATG-C-") #' maskSeqGaps("--ATG-C-", outer_only=TRUE) #' #' # Mask with dashes #' maskSeqGaps(c("ATG-C", "CC..C"), mask_char="-") #' #' @export maskSeqGaps <- function(seq, mask_char="N", outer_only=FALSE) { if (outer_only) { for (i in 1:length(seq)) { head_match <- attr(regexpr("^[-\\.]+", seq[i]), "match.length") tail_match <- attr(regexpr("[-\\.]+$", seq[i]), "match.length") if (head_match > 0) { seq[i] <- gsub("^[-\\.]+", paste(rep(mask_char, head_match), collapse=""), seq[i]) } if (tail_match > 0) { seq[i] <- gsub("[-\\.]+$", paste(rep(mask_char, tail_match), collapse=""), seq[i]) } } } else { seq <- gsub("[-\\.]", mask_char, seq) } return(seq) } #' Masks ragged leading and trailing edges of aligned DNA sequences #' #' \code{maskSeqEnds} takes a vector of DNA sequences, as character strings, #' and replaces the leading and trailing characters with \code{"N"} characters to create #' a sequence vector with uniformly masked outer sequence segments. #' #' @param seq character vector of DNA sequence strings. #' @param mask_char character to use for masking. #' @param max_mask the maximum number of characters to mask. If set to 0 then #' no masking will be performed. If set to \code{NULL} then the upper #' masking bound will be automatically determined from the maximum #' number of observed leading or trailing \code{"N"} characters amongst #' all strings in \code{seq}. #' @param trim if \code{TRUE} leading and trailing characters will be cut rather #' than masked with \code{"N"} characters. #' @return A modified \code{seq} vector with masked (or optionally trimmed) sequences. #' #' @seealso See \link{maskSeqGaps} for masking internal gaps. #' See \link{padSeqEnds} for padding sequence of unequal length. #' #' @examples #' # Default behavior uniformly masks ragged ends #' seq <- c("CCCCTGGG", "NAACTGGN", "NNNCTGNN") #' maskSeqEnds(seq) #' #' # Does nothing #' maskSeqEnds(seq, max_mask=0) #' #' # Cut ragged sequence ends #' maskSeqEnds(seq, trim=TRUE) #' #' # Set max_mask to limit extent of masking and trimming #' maskSeqEnds(seq, max_mask=1) #' maskSeqEnds(seq, max_mask=1, trim=TRUE) #' #' # Mask dashes instead of Ns #' seq <- c("CCCCTGGG", "-AACTGG-", "---CTG--") #' maskSeqEnds(seq, mask_char="-") #' #' @export maskSeqEnds <- function(seq, mask_char="N", max_mask=NULL, trim=FALSE) { # Find length of leading and trailing Ns left_lengths <- attr(regexpr(paste0("(^", mask_char, "*)"), seq, perl=T), "capture.length") right_lengths <- attr(regexpr(paste0("(", mask_char, "*$)"), seq, perl=T), "capture.length") # Mask to minimal inner sequence length left_mask <- min(max(left_lengths[, 1]), max_mask) right_mask <- min(max(right_lengths[, 1]), max_mask) seq_lengths <- stri_length(seq) if (trim) { seq <- substr(seq, left_mask + 1, seq_lengths - right_mask) } else { substr(seq, 0, left_mask) <- paste(rep(mask_char, left_mask), collapse='') substr(seq, seq_lengths - right_mask + 1, seq_lengths + 1) <- paste(rep(mask_char, right_mask), collapse='') } return(seq) } #' Pads ragged ends of aligned DNA sequences #' #' \code{padSeqEnds} takes a vector of DNA sequences, as character strings, #' and appends the ends of each sequence with an appropriate number of \code{"N"} #' characters to create a sequence vector with uniform lengths. #' #' @param seq character vector of DNA sequence strings. #' @param len length to pad to. Only applies if longer than the maximum length of #' the data in \code{seq}. #' @param start if \code{TRUE} pad the beginning of each sequence instead of the end. #' @param pad_char character to use for padding. #' @param mod3 if \code{TRUE} pad sequences to be of length multiple three. #' #' @return A modified \code{seq} vector with padded sequences. #' #' @seealso See \link{maskSeqEnds} for creating uniform masking from existing masking. #' #' @examples #' # Default behavior uniformly pads ragged ends #' seq <- c("CCCCTGGG", "ACCCTG", "CCCC") #' padSeqEnds(seq) #' #' # Pad to fixed length #' padSeqEnds(seq, len=15) #' #' # Add padding to the beginning of the sequences instead of the ends #' padSeqEnds(seq, start=TRUE) #' padSeqEnds(seq, len=15, start=TRUE) #' #' @export padSeqEnds <- function(seq, len=NULL, start=FALSE, pad_char="N", mod3=TRUE) { # Set length to max input length width <- max(stringi::stri_length(seq),len) if (mod3 && width %% 3 != 0) { width <- width + (3 - width %% 3) } # Pad if (!start) { seq <- stringi::stri_pad_right(seq, width=width, pad=pad_char) } else { seq <- stringi::stri_pad_left(seq, width=width, pad=pad_char) } return(seq) } #### Subregion functions #### #' Extracts FWRs and CDRs from IMGT-gapped sequences #' #' \code{extractVRegion} extracts the framework and complementarity determining regions of #' the V segment for IMGT-gapped immunoglobulin (Ig) nucleotide sequences according to the #' IMGT numbering scheme. #' #' @param sequences character vector of IMGT-gapped nucleotide sequences. #' @param region string defining the region(s) of the V segment to extract. #' May be a single region or multiple regions (as a vector) from #' \code{c("fwr1", "cdr1", "fwr2", "cdr2" ,"fwr3")}. By default, all #' regions will be returned. #' #' @return If only one region is specified in the \code{region} argument, a character #' vector of the extracted sub-sequences will be returned. If multiple regions #' are specified, then a character matrix will be returned with columns #' corresponding to the specified regions and a row for each entry in #' \code{sequences}. #' #' @seealso IMGT-gapped region boundaries are defined in \link{IMGT_REGIONS}. #' #' @references #' \enumerate{ #' \item Lefranc M-P, et al. IMGT unique numbering for immunoglobulin and T cell #' receptor variable domains and Ig superfamily V-like domains. #' Dev Comp Immunol. 2003 27(1):55-77. #' } #' #' @examples #' # Assign example clone #' clone <- subset(ExampleDb, clone_id == 3138) #' #' # Get all regions #' extractVRegion(clone$sequence_alignment) #' #' # Get single region #' extractVRegion(clone$sequence_alignment, "fwr1") #' #' # Get all CDRs #' extractVRegion(clone$sequence_alignment, c("cdr1", "cdr2")) #' #' # Get all FWRs #' extractVRegion(clone$sequence_alignment, c("fwr1", "fwr2", "fwr3")) #' #' @export extractVRegion <- function(sequences, region=c("fwr1", "cdr1", "fwr2", "cdr2", "fwr3")) { # Check region argument region <- match.arg(region, several.ok=TRUE) if (length(region) == 1) { sub_sequences <- substr(sequences, IMGT_REGIONS[[region]][1], IMGT_REGIONS[[region]][2]) } else { sub_sequences <- sapply(region, function(x) substr(sequences, IMGT_REGIONS[[x]][1], IMGT_REGIONS[[x]][2])) } return(sub_sequences) } #' Calculate junction region alignment properties #' #' \code{junctionAlignment} determines the number of deleted germline nucleotides in the #' junction region and the number of V gene and J gene nucleotides in the CDR3. #' #' @param data \code{data.frame} containing sequence data. #' @param germline_db reference germline database for the V, D and J genes. #' in \code{data} #' @param v_call V gene assignment column. #' @param d_call D gene assignment column. #' @param j_call J gene assignment column. #' @param v_germline_start column containing the start position of the alignment #' in the V reference germline. #' @param v_germline_end column containing the end position of the alignment in the #' V reference germline. #' @param d_germline_start column containing the start position of the alignment #' in the D reference germline. #' @param d_germline_end column containing the start position of the alignment #' in the D reference germline. #' @param j_germline_start column containing the start position of the alignment #' in the J reference germline. #' @param j_germline_end column containing the start position of the alignment #' in the J reference germline. #' @param np1_length combined length of the N and P regions between the #' V and D regions (heavy chain) or V and J regions (light chain). #' @param np2_length combined length of the N and P regions between the #' D and J regions (heavy chain). #' @param junction column containing the junction sequence. #' @param junction_length column containing the length of the junction region in nucleotides. #' @param sequence_alignment column containing the aligned sequence. #' #' @return A modified input \code{data.frame} with the following additional columns storing #' junction alignment information: #' \enumerate{ #' \item \code{e3v_length}: number of 3' V germline nucleotides deleted. #' \item \code{e5d_length}: number of 5' D germline nucleotides deleted. #' \item \code{e3d_length}: number of 3' D germline nucleotides deleted. #' \item \code{e5j_length}: number of 5' J germline nucleotides deleted. #' \item \code{v_cdr3_length}: number of sequence_alignment V nucleotides in the CDR3. #' \item \code{j_cdr3_length}: number of sequence_alignment J nucleotides in the CDR3. #' } #' #' @examples #' germline_db <- list( #' "IGHV3-11*05"="CAGGTGCAGCTGGTGGAGTCTGGGGGA...GGCTTGGTCAAGCCTGGAGGGTCCCTGAGACT #' CTCCTGTGCAGCCTCTGGATTCACCTTC............AGTGACTACTACATGAGCTGGATCCGCCAGGCTCCAG #' GGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGT......AGTAGTTACACAAACTACGCAGACTCTGTGAAG #' ...GGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGA #' CACGGCCGTGTATTACTGTGCGAGAGA", #' "IGHD3-10*01"="GTATTACTATGGTTCGGGGAGTTATTATAAC", #' "IGHJ5*02"="ACAACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG" #' ) #' #' db <- junctionAlignment(SingleDb, germline_db) #' #' @export junctionAlignment <- function(data, germline_db, v_call="v_call", d_call="d_call", j_call="j_call", v_germline_start="v_germline_start", v_germline_end="v_germline_end", d_germline_start="d_germline_start", d_germline_end="d_germline_end", j_germline_start="j_germline_start", j_germline_end="j_germline_end", np1_length="np1_length", np2_length="np2_length", junction="junction", junction_length="junction_length", sequence_alignment="sequence_alignment") { # Check input check <- checkColumns(data, c(v_call, d_call, j_call, v_germline_start, v_germline_end, d_germline_start, d_germline_end, j_germline_start, j_germline_end, np1_length, np2_length, junction, junction_length, sequence_alignment)) if (check != TRUE) { stop(check) } # Get deletions for (i in 1:nrow(data)) { v_dels <- countDeleted(data[i,], allele_call=v_call, germline_start=v_germline_start, germline_end=v_germline_end, germline_db=germline_db, junction=junction, junction_length=junction_length, sequence_alignment=sequence_alignment) d_dels <- countDeleted(data[i,], allele_call=d_call, germline_start=d_germline_start, germline_end=d_germline_end, germline_db=germline_db, junction=junction, junction_length=junction_length, sequence_alignment=sequence_alignment) j_dels <- countDeleted(data[i,], allele_call=j_call, germline_start=j_germline_start, germline_end=j_germline_end, germline_db=germline_db, junction=junction, junction_length=junction_length, sequence_alignment=sequence_alignment) data[['e3v_length']][i] <- v_dels[2] data[['e5d_length']][i] <- d_dels[1] data[['e3d_length']][i] <- d_dels[2] data[['e5j_length']][i] <- j_dels[1] data[['v_cdr3_length']][i] <- v_dels[3] data[['j_cdr3_length']][i] <- j_dels[3] } return(data) } # Junction alignment helper # # Report the number of deleted germline nucleotides in the alignment # # @param db_row one row from a Rearrangement database. # @param allele_call column containing gene assignments. # @param germline_start column containing the start position of the alignment in the reference germline. # @param germline_end column containing the end position of the alignment in the reference germline. # @param germline_db reference germline database for the V, D and J genes. # @param junction column containing the junction sequence. # @param junction_length column containing the length of the junction region in nucleotides. # @param sequence_alignment column containing the aligned sequence. # # @return Alignment deletions countDeleted <- function(db_row, allele_call, germline_start, germline_end, germline_db, junction, junction_length, sequence_alignment) { # db_row: one row from data # allele_call: one of v,d,j # germline_db: the reference germline database used to assign genes. allele <- getAllele(db_row[[allele_call]], first=T) deleted <- c(NA, NA, NA) # Check for valid allele information if (is.na(allele)) { return(deleted) } # Check for allele in reference germlines tryCatch(germline <- germline_db[[allele]], error=function(e) { stop(allele, " not found in germline_db.") }) allele_germline_start <- as.numeric(db_row[[germline_start]]) allele_germline_end <- as.numeric(db_row[[germline_end]]) germline_head <- stringi::stri_sub(germline, 1, allele_germline_start - 1) deleted_head <- nchar(gsub("\\.", "", germline_head)) germline_tail <- stringi::stri_sub(germline, allele_germline_end+1, nchar(germline)) deleted_tail <- nchar(gsub("\\.", "", germline_tail)) deleted[1] <- deleted_head deleted[2] <- deleted_tail if (is.na(db_row[[junction]])) { warning("NA junction found.") return (deleted) } if (!db_row[[junction_length]]>6) { message("Junction length <= 6.") return (deleted) } junction_len <- db_row[[junction_length]] junction_start <- 310 # junction_end <- junction_start + junction_len - 1 # get aligned junction end (counting gaps) seq_aln <- s2c(db_row[[sequence_alignment]]) != "-" seq_aln[1:junction_start-1] <- 0 junction_end <- which(cumsum(seq_aln[1:length(seq_aln)]) > junction_len)[1] - 1 # For V and J alleles, calculate number of nt in the CDR3 germ_cdr3_length <- NA if (grepl("[Vv]", allele)) { last_cdr3_pre_np <- db_row[[germline_end]] - db_row[[germline_start]] + 1 first_cdr3_pre_np <- junction_start + 3 # without conserved # len <- last_cdr3_pre_np - first_cdr3_pre_np + 1 #germ_seq <- stringi::stri_sub(germline, db_row[[germline_end]]+1-len, db_row[[germline_end]] ) germ_seq <- stringi::stri_sub(db_row[[sequence_alignment]], first_cdr3_pre_np, last_cdr3_pre_np ) germ_cdr3_length <- nchar(gsub("[\\.-]", "", germ_seq)) } else if (grepl("[Jj]", allele)) { j_aln_len <- db_row[[germline_end]] - db_row[[germline_start]] + 1 # germ_seq <- stringi::stri_sub(germline, db_row[[germline_start]], db_row[[germline_end]]-j_tail) germ_seq <- stringi::stri_sub(db_row[[sequence_alignment]], nchar(db_row[[sequence_alignment]]) - j_aln_len + 1, junction_end - 3) germ_cdr3_length <- nchar(gsub("-", "", germ_seq)) } deleted <- c(deleted_head, deleted_tail, germ_cdr3_length) return(deleted) } #### Rcpp wrappers #### #' Calculate distance between two sequences #' #' \code{seqDist} calculates the distance between two DNA sequences. #' #' @param seq1 character string containing a DNA sequence. #' @param seq2 character string containing a DNA sequence. #' @param dist_mat Character distance matrix. Defaults to a Hamming distance #' matrix returned by \link{getDNAMatrix}. If gap #' characters, \code{c("-", ".")}, are assigned a value of -1 #' in \code{dist_mat} then contiguous gaps of any run length, #' which are not present in both sequences, will be counted as a #' distance of 1. Meaning, indels of any length will increase #' the sequence distance by 1. Gap values other than -1 will #' return a distance that does not consider indels as a special case. #' #' @return Numerical distance between \code{seq1} and \code{seq2}. #' #' @seealso Nucleotide distance matrix may be built with #' \link{getDNAMatrix}. Amino acid distance matrix may be built #' with \link{getAAMatrix}. Used by \link{pairwiseDist} for generating #' distance matrices. See \link{seqEqual} for testing sequence equivalence. #' #' @examples #' # Ungapped examples #' seqDist("ATGGC", "ATGGG") #' seqDist("ATGGC", "ATG??") #' #' # Gaps will be treated as Ns with a gap=0 distance matrix #' seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=0)) #' #' # Gaps will be treated as universally non-matching characters with gap=1 #' seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=1)) #' #' # Gaps of any length will be treated as single mismatches with a gap=-1 distance matrix #' seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) #' #' # Gaps of equivalent run lengths are not counted as gaps #' seqDist("ATG-C", "ATG-C", dist_mat=getDNAMatrix(gap=-1)) #' #' # Overlapping runs of gap characters are counted as a single gap #' seqDist("ATG-C", "AT--C", dist_mat=getDNAMatrix(gap=-1)) #' seqDist("A-GGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) #' seqDist("AT--C", "AT--C", dist_mat=getDNAMatrix(gap=-1)) #' #' # Discontiguous runs of gap characters each count as separate gaps #' seqDist("-TGGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) #' #' @export seqDist <- function(seq1, seq2, dist_mat=getDNAMatrix()) { seqDistRcpp(seq1, seq2, dist_mat) } #' Calculate pairwise distances between sequences #' #' \code{pairwiseDist} calculates all pairwise distance between a set of sequences. #' #' @param seq character vector containing a DNA sequences. #' @param dist_mat Character distance matrix. Defaults to a Hamming distance #' matrix returned by \link{getDNAMatrix}. If gap #' characters, \code{c("-", ".")}, are assigned a value of -1 #' in \code{dist_mat} then contiguous gaps of any run length, #' which are not present in both sequences, will be counted as a #' distance of 1. Meaning, indels of any length will increase #' the sequence distance by 1. Gap values other than -1 will #' return a distance that does not consider indels as a special case. #' #' @return A matrix of numerical distance between each entry in \code{seq}. #' If \code{seq} is a named vector, row and columns names will be added #' accordingly. #' #' Amino acid distance matrix may be built with \link{getAAMatrix}. #' Uses \link{seqDist} for calculating distances between pairs. #' See \link{pairwiseEqual} for generating an equivalence matrix. #' #' @examples #' # Gaps will be treated as Ns with a gap=0 distance matrix #' pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), #' dist_mat=getDNAMatrix(gap=0)) #' #' # Gaps will be treated as universally non-matching characters with gap=1 #' pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), #' dist_mat=getDNAMatrix(gap=1)) #' #' # Gaps of any length will be treated as single mismatches with a gap=-1 distance matrix #' pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), #' dist_mat=getDNAMatrix(gap=-1)) #' #' @export pairwiseDist <- function(seq, dist_mat=getDNAMatrix()) { pairwiseDistRcpp(seq, dist_mat) } #' Calculate pairwise distances between sequences #' #' \code{nonsquareDist} calculates all pairwise distance between a set of sequences and a subset of it. #' #' @param seq character vector containing a DNA sequences. The sequence vector needs to #' be named. #' @param indx numeric vector contating the indices (a subset of indices of \code{seq}). #' @param dist_mat Character distance matrix. Defaults to a Hamming distance #' matrix returned by \link{getDNAMatrix}. If gap #' characters, \code{c("-", ".")}, are assigned a value of -1 #' in \code{dist_mat} then contiguous gaps of any run length, #' which are not present in both sequences, will be counted as a #' distance of 1. Meaning, indels of any length will increase #' the sequence distance by 1. Gap values other than -1 will #' return a distance that does not consider indels as a special case. #' #' @return A matrix of numerical distance between each entry in \code{seq} and #' sequences specified by \code{indx} indices. #' #' Note that the input subsampled indices will be ordered ascendingly. Therefore, #' it is necassary to assign unique names to the input sequences, \code{seq}, #' to recover the input order later. Row and columns names will be added accordingly. #' #' Amino acid distance matrix may be built with \link{getAAMatrix}. #' Uses \link{seqDist} for calculating distances between pairs. #' See \link{pairwiseEqual} for generating an equivalence matrix. #' #' @examples #' # Gaps will be treated as Ns with a gap=0 distance matrix #' seq <- c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C") #' pairwiseDist(seq, #' dist_mat=getDNAMatrix(gap=0)) #' #' nonsquareDist(seq, indx=c(1,3), #' dist_mat=getDNAMatrix(gap=0)) #' #' @export nonsquareDist <- function(seq, indx, dist_mat=getDNAMatrix()) { nonsquareDistRcpp(seq, indx, dist_mat) }alakazam/R/Core.R0000644000175000017500000003632214137253260013412 0ustar nileshnilesh# Common input/output and data structure manipulation functions for Alakazam #### File I/O functions #### #' Read a Change-O tab-delimited database file #' #' \code{readChangeoDb} reads a tab-delimited database file created by a Change-O tool #' into a data.frame. #' #' @param file tab-delimited database file output by a Change-O tool. #' @param select columns to select from database file. #' @param drop columns to drop from database file. #' @param seq_upper if \code{TRUE} convert sequence columns to upper case; #' if \code{FALSE} do not alter sequence columns. See Value #' for a list of which columns are effected. #' #' @return A data.frame of the database file. Columns will be imported as is, except for #' the following columns which will be explicitly converted into character #' values: #' \itemize{ #' \item SEQUENCE_ID #' \item CLONE #' \item SAMPLE #' } #' And the following sequence columns which will converted to upper case if #' \code{seq_upper=TRUE} (default). #' \itemize{ #' \item SEQUENCE_INPUT #' \item SEQUENCE_VDJ #' \item SEQUENCE_IMGT #' \item JUNCTION #' \item GERMLINE_IMGT #' \item GERMLINE_IMGT_D_MASK #' } #' #' @seealso Wraps \link[readr]{read_delim}. #' See \link{writeChangeoDb} for writing to Change-O files. #' #' @examples #' \dontrun{ #' # Read all columns in and convert sequence fields to upper case #' db <- readChangeoDb("changeo.tsv") #' #' # Subset columns and convert sequence fields to upper case #' db <- readChangeoDb("changeo.tsv", select=c("SEQUENCE_ID", "SEQUENCE_IMGT")) #' #' # Drop columns and do not alter sequence field case #' db <- readChangeoDb("changeo.tsv", drop=c("D_CALL", "DUPCOUNT"), #' seq_upper=FALSE) #' } #' #' @export readChangeoDb <- function(file, select=NULL, drop=NULL, seq_upper=TRUE) { # Define column data types seq_columns <- c("SEQUENCE_INPUT", "SEQUENCE_VDJ", "SEQUENCE_IMGT", "JUNCTION", "JUNCTION_AA", "CDR3_IGBLAST_NT", "CDR3_IGBLAST_AA", "GERMLINE_VDJ", "GERMLINE_VDJ_V_REGION", "GERMLINE_VDJ_D_MASK", "GERMLINE_IMGT", "GERMLINE_IMGT_V_REGION", "GERMLINE_IMGT_D_MASK", "FWR1_IMGT", "FWR2_IMGT", "FWR3_IMGT", "FWR4_IMGT", "CDR1_IMGT", "CDR2_IMGT", "CDR3_IMGT") # Define types header <- names(suppressMessages(readr::read_tsv(file, n_max=1))) types <- do.call(readr::cols, CHANGEO[intersect(names(CHANGEO), header)]) # Read file db <- suppressMessages(readr::read_tsv(file, col_types=types, na=c("", "NA", "None"))) # Select columns select_columns <- colnames(db) if(!is.null(select)) { select_columns <- intersect(select_columns, select) } if(!is.null(drop)) { select_columns <- setdiff(select_columns, drop) } db <- select(db, select_columns) # Convert sequence fields to upper case upper_cols <- intersect(seq_columns, names(db)) if (seq_upper & length(upper_cols) > 0) { db <- mutate_at(db, upper_cols, toupper) } return(db) } #' Write a Change-O tab-delimited database file #' #' \code{writeChangeoDb} is a simple wrapper around \link[readr]{write_delim} with defaults #' appropriate for writing a Change-O tab-delimited database file from a data.frame. #' #' @param data data.frame of Change-O data. #' @param file output file name. #' #' @return NULL #' #' @seealso Wraps \link[readr]{write_delim}. See \link{readChangeoDb} for reading to Change-O files. #' #' @examples #' \dontrun{ #' # Write a database #' writeChangeoDb(data, "changeo.tsv") #' } #' #' @export writeChangeoDb <- function(data, file) { write_tsv(data, file, na="NA") } #' Create a temporary folder #' #' \code{makeTempDir} creates a randomly named temporary folder in the #' system temp location. #' #' @param prefix prefix name for the folder. #' #' @return The path to the temporary folder. #' #' @seealso This is just a wrapper for \link{tempfile} and #' \link{dir.create}. #' #' @examples #' makeTempDir("Clone50") #' #' @export makeTempDir <- function(prefix) { temp_path <- tempfile(paste0(prefix, "-temp-")) dir.create(temp_path) return(temp_path) } #### Data manipulation functions #### #' Translate a vector of strings #' #' \code{translateStrings} modifies a character vector by substituting one or more #' strings with a replacement string. #' #' @param strings vector of character strings to modify. #' @param translation named character vector or a list of character vectors specifying #' the strings to replace (values) and their replacements (names). #' #' @return A modified \code{strings} vector. #' #' @details #' Does not perform partial replacements. Each translation value must match a complete #' \code{strings} value or it will not be replaced. Values that do not have a replacement #' named in the \code{translation} parameter will not be modified. #' #' Replacement is accomplished using \link{gsub}. #' #' @seealso See \link{gsub} for single value replacement in the base package. #' #' @examples #' # Using a vector translation #' strings <- LETTERS[1:5] #' translation <- c("POSITION1"="A", "POSITION5"="E") #' translateStrings(strings, translation) #' #' # Using a list translation #' strings <- LETTERS[1:5] #' translation <- list("1-3"=c("A","B","C"), "4-5"=c("D","E")) #' translateStrings(strings, translation) #' #' @export translateStrings <- function(strings, translation) { # TODO: use match instead for complete matching? Currently regex characters in values will mess up the matching. for (n in names(translation)) { rep_regex <- paste(translation[[n]], collapse='|') strings <- gsub(paste0("^(", rep_regex, ")$"), n, strings) } return(strings) } #' Check data.frame for valid columns and issue message if invalid #' #' @param data data.frame to check. #' @param columns vector of column names to check. #' @param logic one of \code{"all"} or \code{"any"} controlling whether all, #' or at least one, of the columns must be valid, respectively. #' @return \code{TRUE} if columns are valid and a string message if not. # #' @examples #' df <- data.frame(A=1:3, B=4:6, C=rep(NA, 3)) #' checkColumns(df, c("A", "B"), logic="all") #' checkColumns(df, c("A", "B"), logic="any") #' checkColumns(df, c("A", "C"), logic="all") #' checkColumns(df, c("A", "C"), logic="any") #' checkColumns(df, c("A", "D"), logic="all") #' checkColumns(df, c("A", "D"), logic="any") #' #' @export checkColumns <- function(data, columns, logic=c("all", "any")) { ## DEBUG # data=df; columns=c("A", "D"); logic="any" # Check arguments logic <- match.arg(logic) data_names <- names(data) if (logic == "all") { # Check that all columns exist for (f in columns) { if (!(f %in% data_names)) { msg <- paste("The column", f, "was not found") return(msg) } } # Check that all values are not NA for (f in columns) { if (all(is.na(data[[f]]))) { msg <- paste("The column", f, "contains no data") return(msg) } } } else if (logic == "any") { # Check that columns exist if (!any(columns %in% data_names)) { msg <- paste("Input must contain at least one of the columns:", paste(columns, collapse=", ")) return(msg) } # Check that all values are not NA columns_found <- columns[columns %in% data_names] invalid <- sapply(columns_found, function(f) all(is.na(data[[f]]))) if (all(invalid)) { msg <- paste("None of the columns", paste(columns_found, collapse=", "), "contain data") return(msg) } } # Return TRUE if all checks pass return(TRUE) } #### Plotting and progress functions #### #' Standard progress bar #' #' \code{progressBar} defines a common progress bar format. #' #' @param n maximum number of ticks #' #' @return A \link[progress]{progress_bar} object. #' #' @export progressBar <- function(n) { pb <- progress::progress_bar$new(format=" PROGRESS> [:bar] :percent :elapsed", width=40, clear=FALSE, stream=stdout(), force=TRUE, total=n) return(pb) } #' Standard ggplot settings #' #' \code{baseTheme} defines common ggplot theme settings for plotting. #' #' @param sizing defines the style and sizing of the theme. One of #' \code{c("figure", "window")} where \code{sizing="figure"} is appropriately #' sized for pdf export at 7 to 7.5 inch width, and \code{sizing="window"} #' is sized for an interactive session. #' #' @return A ggplot2 object. #' #' @seealso \link[ggplot2]{theme}. #' #' @export baseTheme <- function(sizing=c("figure", "window")) { # Check arguments sizing <- match.arg(sizing) base_theme <- theme_bw() + theme(strip.background=element_blank(), plot.background=element_blank(), panel.grid.major=element_blank(), panel.grid.minor=element_blank()) # Define universal plot settings appropriate for PDF figures if (sizing == "figure") { base_theme <- base_theme + theme(text=element_text(size=8), plot.title=element_text(size=8), strip.text=element_text(size=7, face="bold"), axis.title=element_text(size=8, vjust=0.25), axis.text.x=element_text(size=8, vjust=0.5, hjust=0.5), axis.text.y=element_text(size=8), legend.text=element_text(size=7), legend.title=element_text(size=7), legend.key.height=grid::unit(10, "points"), legend.key.width=grid::unit(10, "points")) } else if (sizing == "window") { # Define universal plot settings appropriate for an interactive session base_theme <- base_theme + theme(text=element_text(size=14), plot.title=element_text(size=16), strip.text=element_text(size=14, face="bold"), axis.title=element_text(size=16, vjust=0.25), axis.text.x=element_text(size=16, vjust=0.5, hjust=0.5), axis.text.y=element_text(size=16), legend.text=element_text(size=14), legend.title=element_text(size=14), legend.key.height=grid::unit(18, "points"), legend.key.width=grid::unit(18, "points")) } return(base_theme) } #' Plot multiple ggplot objects #' #' Plots multiple ggplot objects in an equally sized grid. #' #' @param ... ggplot objects to plot. #' @param ncol number of columns in the plot. #' @return NULL #' #' @seealso \link{ggplot}. #' #' @references #' Modified from: #' http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) #' #' @export gridPlot <- function(..., ncol=1) { p <- list(...) n <- length(p) layout <- matrix(seq(1, ncol*ceiling(n/ncol)), ncol=ncol, nrow=ceiling(n/ncol)) # Plot if (n == 1) { plot(p[[1]]) } else { grid::grid.newpage() grid::pushViewport(grid::viewport(layout=grid::grid.layout(nrow(layout), ncol(layout)))) for (i in 1:n) { idx <- as.data.frame(which(layout == i, arr.ind=T)) plot(p[[i]], vp=grid::viewport(layout.pos.row = idx$row, layout.pos.col=idx$col)) } } } #### Multiprocessing functions #### #' Available CPU cores #' #' \code{cpuCount} determines the number of CPU cores available. #' #' @return Count of available cores. Returns 1 if undeterminable. #' #' @examples #' cpuCount() #' #' @export cpuCount <-function(){ if (.Platform$OS.type == "windows") { nproc <- as.numeric(Sys.getenv('NUMBER_OF_PROCESSORS')) } else if (.Platform$OS.type == "unix") { nproc <- parallel::detectCores() } else { nproc <- 1 } # in case an NA is returned if(is.na(nproc)){nproc <- 1} return(nproc) } #### Generic statistical functions #### #' Weighted meta-analysis of p-values via Stouffer's method #' #' \code{stoufferMeta} combines multiple weighted p-values into a meta-analysis p-value #' using Stouffer's Z-score method. #' #' @param p numeric vector of p-values. #' @param w numeric vector of weights. #' #' @return A named numeric vector with the combined Z-score and p-value in the form #' \code{c(Z, pvalue)}. #' #' @examples #' # Define p-value and weight vectors #' p <- c(0.1, 0.05, 0.3) #' w <- c(5, 10, 1) #' #' # Unweighted #' stoufferMeta(p) #' #' # Weighted #' stoufferMeta(p, w) #' #' @export stoufferMeta <- function(p, w=NULL) { if (is.null(w)) { w <- rep(1, length(p))/length(p) } else { if (length(w) != length(p)) { stop("Length of p and w must equal.") } w <- w/sum(w) } x <- qnorm(1 - p) Z <- sum(w*x) / sqrt(sum(w^2)) pvalue <- 1 - pnorm(Z) return(c(Z=Z, pvalue=pvalue)) } # Stirling's approximation of the binomial coefficient # # \code{lchooseStirling} calculates Stirling's approximation of the binomial coefficient # for large numbers. # # @param n vector of n. # @param k vector of k. # @return The approximation of log(n choose k). For n < 100 \link{lchoose} is used. # # @seealso \link{lchoose}. # # @examples # alakazam:::lchooseStirling(10e9, 10e4) # # @export lchooseStirling <- function(n, k) { if (any(n < k)) { stop("n must be >= k") } n_len <- length(n) k_len <- length(k) nCk <- rep(NA, max(n_len, k_len)) nCk[n == k] <- 0 # a = index n_small # i = index k_small # x = index nCk_small # # b = index n_large # j = index k_large # y = index nCk_large # # Check for vector inputs and assign indexing if (n_len >= 1 & k_len >= 1 & n_len == k_len) { a <- i <- x <- (n < 100 & n != k) b <- j <- y <- (n >= 100 & n != k) } else if (n_len > 1 & k_len == 1) { a <- x <- (n < 100 & n != k) b <- y <- (n >= 100 & n != k) i <- j <- TRUE } else if (n_len == 1 & k_len > 1) { a <- (n < 100) b <- !a i <- j <- (n != k) x <- if (n < 100) { i } else { NULL } y <- if (n >= 100) { i } else { NULL } } else { stop("Inputs are wrong. n and k must have the same length or be length one.") } # Small n nCk[x] <- lchoose(n[a], k[i]) # Large n indices nCk[y] <- n[b]*log(n[b]) - k[j]*log(k[j]) - (n[b] - k[j])*log(n[b] - k[j]) + 0.5*(log(n[b]) - log(k[j]) - log(n[b] - k[j]) - log(2*pi)) # .nCk <- function(n, k) { # n*log(n) - k*log(k) - (n - k)*log(n - k) + # 0.5*(log(n) - log(k) - log(n - k) - log(2*pi)) # } return(nCk) } alakazam/R/Lineage.R0000644000175000017500000014762414136065603014077 0ustar nileshnilesh# Ig lineage reconstruction via maximum parsimony #' @include Classes.R NULL #### Preprocessing functions #### #' Generate a ChangeoClone object for lineage construction #' #' \code{makeChangeoClone} takes a data.frame with AIRR or Change-O style columns as input and #' masks gap positions, masks ragged ends, removes duplicates sequences, and merges #' annotations associated with duplicate sequences. It returns a \code{ChangeoClone} #' object which serves as input for lineage reconstruction. #' #' @param data data.frame containing the AIRR or Change-O data for a clone. See Details #' for the list of required columns and their default values. #' @param id name of the column containing sequence identifiers. #' @param seq name of the column containing observed DNA sequences. All #' sequences in this column must be multiple aligned. #' @param germ name of the column containing germline DNA sequences. All entries #' in this column should be identical for any given clone, and they #' must be multiple aligned with the data in the \code{seq} column. #' @param v_call name of the column containing V-segment allele assignments. All #' entries in this column should be identical to the gene level. #' @param j_call name of the column containing J-segment allele assignments. All #' entries in this column should be identical to the gene level. #' @param junc_len name of the column containing the length of the junction as a #' numeric value. All entries in this column should be identical #' for any given clone. #' @param clone name of the column containing the identifier for the clone. All #' entries in this column should be identical. #' @param mask_char character to use for masking and padding. #' @param max_mask maximum number of characters to mask at the leading and trailing #' sequence ends. If \code{NULL} then the upper masking bound will #' be automatically determined from the maximum number of observed #' leading or trailing Ns amongst all sequences. If set to \code{0} #' (default) then masking will not be performed. #' @param pad_end if \code{TRUE} pad the end of each sequence with \code{mask_char} #' to make every sequence the same length. #' @param text_fields text annotation columns to retain and merge during duplicate removal. #' @param num_fields numeric annotation columns to retain and sum during duplicate removal. #' @param seq_fields sequence annotation columns to retain and collapse during duplicate #' removal. Note, this is distinct from the \code{seq} and \code{germ} #' arguments, which contain the primary sequence data for the clone #' and should not be repeated in this argument. #' @param add_count if \code{TRUE} add an additional annotation column called #' \code{collapse_count} during duplicate removal that indicates the #' number of sequences that were collapsed. #' @param verbose passed on to \code{collapseDuplicates}. If \code{TRUE}, report the #' numbers of input, discarded and output sequences; otherwise, process #' sequences silently. #' #' @return A \link{ChangeoClone} object containing the modified clone. #' #' @details #' The input data.frame (\code{data}) must columns for each of the required column name #' arguments: \code{id}, \code{seq}, \code{germ}, \code{v_call}, \code{j_call}, #' \code{junc_len}, and \code{clone}. The default values are as follows: #' \itemize{ #' \item \code{id = "sequence_id"}: unique sequence identifier. #' \item \code{seq = "sequence_alignment"}: IMGT-gapped sample sequence. #' \item \code{germ = "germline_alignment"}: IMGT-gapped germline sequence. #' \item \code{v_call = "v_call"}: V segment allele call. #' \item \code{j_call = "j_call"}: J segment allele call. #' \item \code{junc_len = "junction_length"}: junction sequence length. #' \item \code{clone = "clone_id"}: clone identifier. #' } #' Additional annotation columns specified in the \code{text_fields}, \code{num_fields} #' or \code{seq_fields} arguments will be retained in the \code{data} slot of the return #' object, but are not required. If the input data.frame \code{data} already contains a #' column named \code{sequence}, which is not used as the \code{seq} argument, then that #' column will not be retained. #' #' The default columns are IMGT-gapped sequence columns, but this is not a requirement. #' However, all sequences (both observed and germline) must be multiple aligned using #' some scheme for both proper duplicate removal and lineage reconstruction. #' #' The value for the germline sequence, V-segment gene call, J-segment gene call, #' junction length, and clone identifier are determined from the first entry in the #' \code{germ}, \code{v_call}, \code{j_call}, \code{junc_len} and \code{clone} columns, #' respectively. For any given clone, each value in these columns should be identical. #' #' @seealso Executes in order \link{maskSeqGaps}, \link{maskSeqEnds}, #' \link{padSeqEnds}, and \link{collapseDuplicates}. #' Returns a \link{ChangeoClone} object which serves as input to #' \link{buildPhylipLineage}. #' #' @examples #' # Example data #' db <- data.frame(sequence_id=LETTERS[1:4], #' sequence_alignment=c("CCCCTGGG", "CCCCTGGN", "NAACTGGN", "NNNCTGNN"), #' germline_alignment="CCCCAGGG", #' v_call="Homsap IGKV1-39*01 F", #' j_call="Homsap IGKJ5*01 F", #' junction_length=2, #' clone_id=1, #' c_call=c("IGHM", "IGHG", "IGHG", "IGHA"), #' duplicate_count=1:4, #' stringsAsFactors=FALSE) #' #' #' # Without end masking #' makeChangeoClone(db, text_fields="c_call", num_fields="duplicate_count") #' #' # With end masking #' makeChangeoClone(db, max_mask=3, text_fields="c_call", num_fields="duplicate_count") #' #' @export makeChangeoClone <- function(data, id="sequence_id", seq="sequence_alignment", germ="germline_alignment", v_call="v_call", j_call="j_call", junc_len="junction_length", clone="clone_id", mask_char="N", max_mask=0, pad_end=FALSE, text_fields=NULL, num_fields=NULL, seq_fields=NULL, add_count=TRUE, verbose=FALSE) { # Check for valid fields check <- checkColumns(data, c(id, seq, germ, v_call, j_call, junc_len, clone, text_fields, num_fields, seq_fields)) if (check != TRUE) { stop(check) } # Replace gaps with Ns and masked ragged ends tmp_df <- data[, c(id, seq, text_fields, num_fields, seq_fields)] tmp_df[[seq]] <- maskSeqGaps(tmp_df[[seq]], mask_char=mask_char, outer_only=FALSE) tmp_df[[seq]] <- maskSeqEnds(tmp_df[[seq]], mask_char=mask_char, max_mask=max_mask, trim=FALSE) germline <- maskSeqGaps(data[[germ]][1], mask_char=mask_char, outer_only=FALSE) # Pad ends if (pad_end) { tmp_df[[seq]] <- padSeqEnds(tmp_df[[seq]], pad_char=mask_char) germline <- padSeqEnds(germline, pad_char=mask_char) } seq_len <- stringi::stri_length(tmp_df[[seq]]) if (any(seq_len != seq_len[1])) { len_message <- paste0("All sequences are not the same length for data with first ", id, " = ", tmp_df[[id]][1], ".") if (!pad_end) { len_message <- paste(len_message, "Consider specifying pad_end=TRUE and verify the multiple alignment.") } else { len_message <- paste(len_message, "Verify that all sequences are properly multiple-aligned.") } stop(len_message) } # Remove duplicates tmp_df <- collapseDuplicates(tmp_df, id=id, seq=seq, text_fields=text_fields, num_fields=num_fields, seq_fields=seq_fields, add_count=add_count, verbose=verbose) # Define return object tmp_names <- names(tmp_df) if ("sequence" %in% tmp_names & seq != "sequence") { tmp_df <- tmp_df[, tmp_names != "sequence"] tmp_names <- names(tmp_df) } names(tmp_df)[tmp_names == seq] <- "sequence" names(tmp_df)[tmp_names == id] <- "sequence_id" if (length(unique(data[[junc_len]]))>1) { message("Junctions of multiple lengths found. `ChangeoClone` will use the length of the first one in slot `junc_len`.") } clone <- new("ChangeoClone", data=as.data.frame(tmp_df), clone=as.character(data[[clone]][1]), germline=germline, v_gene=getGene(data[[v_call]][1]), j_gene=getGene(data[[j_call]][1]), junc_len=data[[junc_len]][1]) return(clone) } #### PHYLIP functions #### # Create PHYLIP input files in a temporary folder # # @param clone a ChangeoClone object # @param path a directory to store the write the output files to # @return a named vector translating sequence_id (names) to PHYLIP taxa (values) writePhylipInput <- function(clone, path) { # Define PHYLIP columns nseq <- nrow(clone@data) v1 <- c(sprintf('%-9s', nseq + 1), sprintf("%-9s", "Germline"), sprintf("SAM%-6s", 1:nseq)) v2 <- c(stringi::stri_length(clone@germline), clone@germline, clone@data[["sequence"]]) phy_df <- data.frame(v1, v2, stringsAsFactors=F) # Define names vector mapping taxa names to original sequence identifiers id_map <- setNames(gsub("^\\s+|\\s+$", "", v1[-(1:2)]), clone@data[["sequence_id"]]) # Create PHYLIP input file infile <- file.path(path, "infile") if (.Platform$OS.type == "windows") { infile <- gsub("/","\\\\",infile) } write.table(phy_df, file=infile, quote=F, sep=" ", col.names=F, row.names=F) return(id_map) } # Run PHYLIP dnapars or dnaml application # # @param path temporary directory containing infile. # @param phylip_exec path to dnapars or dnaml executable. # @param verbose if TRUE suppress phylip console output. # @param onetree if TRUE save only one tree # @return TRUE if phylip ran successfully and FALSE otherwise runPhylip <- function(path, phylip_exec, verbose=FALSE, onetree=FALSE) { # Expand shell variables phylip_exec <- path.expand(phylip_exec) # Remove old files outfile <- file.path(path, "outfile") outtree <- file.path(path, "outtree") if (.Platform$OS.type == "windows") { outfile <- gsub("/","\\\\",outfile) outtree <- gsub("/","\\\\",outtree) } if (file.exists(outfile)) { file.remove(outfile) } if (file.exists(outtree)) { file.remove(outtree) } # Set platform specific options if (.Platform$OS.type == "windows") { quiet_params <- list(stdout=FALSE, stderr=FALSE) invoke <- system2 } else { quiet_params <- list(stdout=FALSE, stderr=FALSE) invoke <- system2 } # Set dnapars or dnaml options if ( grepl("dnaml$",phylip_exec) | grepl("dnaml\\.exe$",phylip_exec)){ phy_options <- c("I", "5") }else if (grepl("dnapars$",phylip_exec) | grepl("dnapars\\.exe$",phylip_exec)) { phy_options <- c("S", "Y", "I", "4", "5", ".") }else{ stop("Executable not recognized! Must end with dnapars or dnaml") } if (onetree) { phy_options <- c(phy_options, "V", "1") } params <- list(phylip_exec, input=c(phy_options, "Y"), wait=TRUE) if (!verbose) { params <- append(params, quiet_params) } # Call phylip wd <- getwd() setwd(path) status <- tryCatch(do.call(invoke, params), error=function(e) e) setwd(wd) # Return TRUE if phylip ran successfully invisible(status == 0) } # Reads in the PHYLIP outfile # # @param path the temporary folder containing the dnapars outfile # @return a character vector with each item as a line in the outfile readPhylipOutput <- function(path) { outfile <- file.path(path, "outfile") if (.Platform$OS.type == "windows") { outfile <- gsub("/","\\\\",outfile) } phylip_out <- scan(outfile, what="character", sep="\n", blank.lines.skip=FALSE, strip.white=FALSE, quiet=TRUE) return(phylip_out) } # Test for successful PHYLIP dnapars run by checking the outfile # # @param phylip_out a character vector returned by readPhylipOut # @return TRUE if trees built # FALSE if no trees built checkPhylipOutput <- function(phylip_out) { # Check for failed tree build result <- !(any(grepl('-1 trees in all found', phylip_out))) return(result) } # Extracts inferred sequences from PHYLIP dnapars or dnaml outfile # # @param phylip_out a character vector returned by readPhylipOutput # @return a list containing an id vector, a sequence vector and an annotation data.frame getPhylipInferred <- function(phylip_out) { # Process dnapars and dnaml output pars_starts = grep("From\\s+To\\s+Any Steps\\?\\s+State at upper node", phylip_out, perl=T, fixed=F) ml_start = grep("node\\s+Reconstructed sequence", phylip_out, perl=T, fixed=F) if(length(pars_starts) > 0){ seq_start <- min(pars_starts) seq_empty <- grep("^\\s*$", phylip_out[seq_start:length(phylip_out)], perl=T, fixed=F) seq_len <- seq_empty[min(which(seq_empty[-1] == (seq_empty[-length(seq_empty)] + 1)))] seq_block <- paste(phylip_out[(seq_start + 2):(seq_start + seq_len - 2)], collapse="\n") tc <- textConnection(seq_block) seq_df <- read.table(tc, as.is=T, fill=T, blank.lines.skip=F) close(tc) # Correct first line of block and remove blank rows fix.row <- c(1, which(is.na(seq_df[,1])) + 1) end_col <- ncol(seq_df) - 2 seq_df[fix.row, ] <- data.frame(cbind(0, seq_df[fix.row, 1], "no", seq_df[fix.row, 2:end_col]), stringsAsFactors=F) if (length(fix.row)>1) { seq_df <- seq_df[-(fix.row[-1] - 1), ] } # Create data.frame of inferred sequences inferred_num <- unique(grep("^[0-9]+$", seq_df[, 2], value=T)) inferred_seq <- sapply(inferred_num, function(n) { paste(t(as.matrix(seq_df[seq_df[, 2] == n, -c(1:3)])), collapse="") }) }else if(length(ml_start) > 0){ seq_start <- min(ml_start) seq_empty <- grep("^\\s*$", phylip_out[seq_start:length(phylip_out)], perl=T, fixed=F) seq_len <- max(seq_empty) seq_block <- paste(phylip_out[(seq_start + 2):(seq_start + seq_len - 2)], collapse="\n") tc <- textConnection(seq_block) seq_df <- read.table(tc, as.is=T, fill=T, blank.lines.skip=F) close(tc) # Correct first line of block and remove blank rows fix.row <- c(which(seq_df[,1]=="")) if (length(fix.row)>1) { seq_df <- seq_df[-(fix.row), ] } # Create data.frame of inferred sequences inferred_num <- unique(grep("^[0-9]+$", seq_df[, 1], value=T)) inferred_seq <- sapply(inferred_num, function(n) { paste(t(as.matrix(seq_df[seq_df[, 1] == n, -1])), collapse="") }) inferred_seq = toupper(inferred_seq) }else{ stop("Input file format not recognized") } if (length(inferred_num)>0) { return(data.frame(sequence_id=paste0("Inferred", inferred_num), sequence=inferred_seq, stringsAsFactors = FALSE)) } data.frame(sequence_id=c(), sequence=c(), stringsAsFactors = FALSE) } # Extracts graph edge list from a PHYLIP dnapars or dnaml outfile # # @param phylip_out character vector returned by readPhylipOutput # @param id_map named vector of PHYLIP taxa names (values) to sequence # identifiers (names) that will be translated. If NULL # no taxa name translation is performed # @return a data.frame of edges with columns (from, to, weight) getPhylipEdges <- function(phylip_out, id_map=NULL) { pars_start = grep('between\\s+and\\s+length', phylip_out, perl=TRUE, fixed=FALSE) ml_start = grep('Between\\s+And\\s+Length', phylip_out, perl=TRUE, fixed=FALSE) if(length(pars_start) > 0){ # Process dnapars output edge_start <- min(pars_start) edge_len <- min(grep('^\\s*$', phylip_out[edge_start:length(phylip_out)], perl=TRUE, fixed=FALSE)) edge_block <- paste(phylip_out[(edge_start + 2):(edge_start + edge_len - 2)], collapse='\n') tc <- textConnection(edge_block) edge_df <- read.table(tc, col.names=c('from', 'to', 'weight'), as.is=TRUE) close(tc) }else if(length(ml_start) > 0){ edge_start <- min(ml_start)+3 edge_len <- min(grep('^\\s*$', phylip_out[edge_start:length(phylip_out)], perl=TRUE, fixed=FALSE)) block = phylip_out[(edge_start + 0):(edge_start + edge_len - 2)] block = unlist(lapply(strsplit(block,split="\\s+"),function(x){ paste(x[1:(min(which(x == "("))-1)],collapse=" ") })) edge_block <- paste(block, collapse='\n') tc <- textConnection(edge_block) edge_df <- read.table(tc, col.names=c('from', 'to', 'weight'), as.is=TRUE) close(tc) } # Modify inferred taxa names to include "Inferred" inf_map <- unique(grep("^[0-9]+$", c(edge_df$from, edge_df$to), value=T)) names(inf_map) <- paste0("Inferred", inf_map) edge_df$from <- translateStrings(edge_df$from, inf_map) edge_df$to <- translateStrings(edge_df$to, inf_map) if (!is.null(id_map)) { # Reassign PHYLIP taxa names to sequence IDs edge_df$from <- translateStrings(edge_df$from, id_map) edge_df$to <- translateStrings(edge_df$to, id_map) } return(edge_df) } # Modify edges of phylip output # # @param edges data.frame of edges returned by getPhylipEdges # @param clone a ChangeoClone object containg sequence data # @param dist_mat DNA character distance matrix # @return a list of modified edges data.frame and clone object modifyPhylipEdges <- function(edges, clone, dist_mat=getDNAMatrix(gap=0)) { # Move germline to root position germ_idx <- which(edges$to == "Germline") edges[germ_idx, c('from', 'to')] <- edges[germ_idx, c('to', 'from')] # Calculate edge mutations for (i in 1:nrow(edges)) { if (edges$from[i] == "Germline") { seq1 <- clone@germline } else { seq1 <- clone@data[["sequence"]][clone@data[["sequence_id"]] == edges$from[i]] } seq2 <- clone@data[["sequence"]][clone@data[["sequence_id"]] == edges$to[i]] edges$weight[i] <- seqDist(seq1, seq2, dist_mat) } # Find rows zero weight edges with inferred parent nodes remove_row <- which(edges$weight == 0 & edges$from != "Germline" & grepl('^Inferred\\d+$', edges$from)) # Replace inferred parent nodes with child nodes when edge weight is zero while (length(remove_row) > 0) { # Remove first node with zero distance to parent r <- remove_row[1] r_idx <- which(edges[c('from', 'to')] == edges$from[r], arr.ind=T) edges[r_idx] <- edges$to[r] # Recalculate edge weights for modified rows r_mod <- r_idx[, 1][r_idx[, 1] != r] for (i in r_mod) { if (edges$from[i] == "Germline") { seq1 <- clone@germline } else { seq1 <- clone@data[["sequence"]][clone@data[["sequence_id"]] == edges$from[i]] } seq2 <- clone@data[["sequence"]][clone@data[["sequence_id"]] == edges$to[i]] edges$weight[i] <- seqDist(seq1, seq2, dist_mat) } # Remove row edges <- edges[-r, ] # Re-determine rows to remove remove_row <- which(edges$weight == 0 & edges$from != "Germline" & grepl('^Inferred\\d+$', edges$from)) } # Remove rows from clone keep_clone <- clone@data[["sequence_id"]] %in% unique(c(edges$from, edges$to)) clone@data <- as.data.frame(clone@data[keep_clone, ]) return(list(edges=edges, clone=clone)) } # Convert edge data.frame and clone object to igraph graph object # # @param edges data.frame of edges returned by getPhylipEdges # @param clone a ChangeoClone object containg sequence data # @return an igraph graph object phylipToGraph <- function(edges, clone) { # Create igraph object g <- igraph::graph_from_data_frame(edges, directed=T) # Add germline sequence germ_idx <- which(igraph::V(g)$name == "Germline") g <- igraph::set_vertex_attr(g, "sequence", index=germ_idx, clone@germline) # Add sample sequences and names clone_idx <- match(clone@data[["sequence_id"]], igraph::V(g)$name) g <- igraph::set_vertex_attr(g, "sequence", index=clone_idx, clone@data[["sequence"]]) # Add annotations ann_fields <- names(clone@data)[!(names(clone@data) %in% c("sequence_id", "sequence"))] for (n in ann_fields) { g <- igraph::set_vertex_attr(g, n, index=germ_idx, NA) g <- igraph::set_vertex_attr(g, n, index=clone_idx, clone@data[[n]]) } # Add edge and vertex labels igraph::V(g)$label <- igraph::V(g)$name igraph::E(g)$label <- igraph::E(g)$weight # Add graph attributes g$clone <- clone@clone g$v_gene <- clone@v_gene g$j_gene <- clone@j_gene g$junc_len <- clone@junc_len return(g) } #' Infer an Ig lineage using PHYLIP #' #' \code{buildPhylipLineage} reconstructs an Ig lineage via maximum parsimony using the #' dnapars application, or maximum liklihood using the dnaml application of the PHYLIP package. #' #' @param clone \link{ChangeoClone} object containing clone data. #' @param phylip_exec absolute path to the PHYLIP dnapars executable. #' @param dist_mat character distance matrix to use for reassigning edge weights. #' Defaults to a Hamming distance matrix returned by \link{getDNAMatrix} #' with \code{gap=0}. If gap characters, \code{c("-", ".")}, are assigned #' a value of -1 in \code{dist_mat} then contiguous gaps of any run length, #' which are not present in both sequences, will be counted as a #' distance of 1. Meaning, indels of any length will increase #' the sequence distance by 1. Gap values other than -1 will #' return a distance that does not consider indels as a special case. #' @param rm_temp if \code{TRUE} delete the temporary directory after running dnapars; #' if \code{FALSE} keep the temporary directory. #' @param verbose if \code{FALSE} suppress the output of dnapars; #' if \code{TRUE} STDOUT and STDERR of dnapars will be passed to #' the console. #' @param branch_length specifies how to define branch lengths; one of \code{"mutations"} #' or \code{"distance"}. If set to \code{"mutations"} (default), then branch #' lengths represent the number of mutations between nodes. #' If set to \code{"distance"}, then branch lengths represent #' the expected number of mutations per site, unaltered from PHYLIP output. #' @param temp_path specific path to temp directory if desired. #' @param onetree if \code{TRUE} save only one tree. #' #' @return An igraph \code{graph} object defining the Ig lineage tree. Each unique input #' sequence in \code{clone} is a vertex of the tree, with additional vertices being #' either the germline (root) sequences or inferred intermediates. The \code{graph} #' object has the following attributes. #' #' Vertex attributes: #' \itemize{ #' \item \code{name}: value in the \code{sequence_id} column of the \code{data} #' slot of the input \code{clone} for observed sequences. #' The germline (root) vertex is assigned the name #' "Germline" and inferred intermediates are assigned #' names with the format {"Inferred1", "Inferred2", ...}. #' \item \code{sequence}: value in the \code{sequence} column of the \code{data} #' slot of the input \code{clone} for observed sequences. #' The germline (root) vertex is assigned the sequence #' in the \code{germline} slot of the input \code{clone}. #' The sequence of inferred intermediates are extracted #' from the dnapars output. #' \item \code{label}: same as the \code{name} attribute. #' } #' Additionally, each other column in the \code{data} slot of the input #' \code{clone} is added as a vertex attribute with the attribute name set to #' the source column name. For the germline and inferred intermediate vertices, #' these additional vertex attributes are all assigned a value of \code{NA}. #' #' Edge attributes: #' \itemize{ #' \item \code{weight}: Hamming distance between the \code{sequence} attributes #' of the two vertices. #' \item \code{label}: same as the \code{weight} attribute. #' } #' Graph attributes: #' \itemize{ #' \item \code{clone}: clone identifier from the \code{clone} slot of the #' input \code{ChangeoClone}. #' \item \code{v_gene}: V-segment gene call from the \code{v_gene} slot of #' the input \code{ChangeoClone}. #' \item \code{j_gene}: J-segment gene call from the \code{j_gene} slot of #' the input \code{ChangeoClone}. #' \item \code{junc_len}: junction length (nucleotide count) from the #' \code{junc_len} slot of the input \code{ChangeoClone}. #' #' Alternatively, this function will return an \code{phylo} object, which is compatible #' with the ape package. This object will contain reconstructed ancestral sequences in #' \code{nodes} attribute. #' } #' #' @details #' \code{buildPhylipLineage} builds the lineage tree of a set of unique Ig sequences via #' maximum parsimony through an external call to the dnapars application of the PHYLIP #' package. dnapars is called with default algorithm options, except for the search option, #' which is set to "Rearrange on one best tree". The germline sequence of the clone is used #' for the outgroup. #' #' Following tree construction using dnapars, the dnapars output is modified to allow #' input sequences to appear as internal nodes of the tree. Intermediate sequences #' inferred by dnapars are replaced by children within the tree having a Hamming distance #' of zero from their parent node. With the default \code{dist_mat}, the distance calculation #' allows IUPAC ambiguous character matches, where an ambiguous character has distance zero #' to any character in the set of characters it represents. Distance calculation and movement of #' child nodes up the tree is repeated until all parent-child pairs have a distance greater than zero #' between them. The germline sequence (outgroup) is moved to the root of the tree and #' excluded from the node replacement processes, which permits the trunk of the tree to be #' the only edge with a distance of zero. Edge weights of the resultant tree are assigned #' as the distance between each sequence. #' #' @references #' \enumerate{ #' \item Felsenstein J. PHYLIP - Phylogeny Inference Package (Version 3.2). #' Cladistics. 1989 5:164-166. #' \item Stern JNH, Yaari G, Vander Heiden JA, et al. B cells populating the multiple #' sclerosis brain mature in the draining cervical lymph nodes. #' Sci Transl Med. 2014 6(248):248ra107. #' } #' #' @seealso Takes as input a \link{ChangeoClone}. #' Temporary directories are created with \link{makeTempDir}. #' Distance is calculated using \link{seqDist}. #' See the igraph \link[igraph]{graph} documentation for how to work #' with \code{graph} objects. #' #' @examples #' \dontrun{ #' # Preprocess clone #' db <- subset(ExampleDb, clone_id == 3138) #' clone <- makeChangeoClone(db, text_fields=c("sample_id", "c_call"), #' num_fields="duplicate_count") #' #' # Run PHYLIP and process output #' phylip_exec <- "~/apps/phylip-3.695/bin/dnapars" #' graph <- buildPhylipLineage(clone, phylip_exec, rm_temp=TRUE) #' #' # Plot graph with a tree layout #' library(igraph) #' plot(graph, layout=layout_as_tree, vertex.label=V(graph)$c_call, #' vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") #' #' # To consider each indel event as a mutation, change the masking character #' # and distance matrix #' clone <- makeChangeoClone(db, text_fields=c("sample_id", "c_call"), #' num_fields="duplicate_count", mask_char="-") #' graph <- buildPhylipLineage(clone, phylip_exec, dist_mat=getDNAMatrix(gap=-1), #' rm_temp=TRUE) #' } #' #' @export buildPhylipLineage <- function(clone, phylip_exec, dist_mat=getDNAMatrix(gap=0), rm_temp=FALSE, verbose=FALSE, temp_path=NULL, onetree=FALSE, branch_length=c("mutations", "distance")) { # Check clone size if (nrow(clone@data) < 2) { warning("Clone ", clone@clone, " was skipped as it does not contain at least 2 unique sequences") return(NULL) } # determine branch length type branch_length <- match.arg(branch_length) # Check fields seq_len <- unique(stringi::stri_length(clone@data[["sequence"]])) germ_len <- ifelse(length(clone@germline) == 0, 0, stringi::stri_length(clone@germline)) if(germ_len == 0) { stop("Clone ", clone@clone, "does not contain a germline sequence.") } if(length(seq_len) != 1) { stop("Clone ", clone@clone, "does not contain sequences of equal length.") } if(seq_len != germ_len) { stop("The germline and input sequences are not the same length for clone ", clone@clone) } # Check dnapars access if (file.access(phylip_exec, mode=1) == -1) { stop("The file ", phylip_exec, " cannot be executed.") } # Create temporary directory if(is.null(temp_path)){ temp_path <- makeTempDir(paste0(clone@clone, "-phylip")) }else{ if(!dir.exists(temp_path)){ dir.create(temp_path) } } if (verbose) { cat("TEMP_DIR> ", temp_path, "\n", sep="") } # Run PHYLIP id_map <- writePhylipInput(clone, temp_path) runPhylip(temp_path, phylip_exec, verbose=verbose, onetree=onetree) phylip_out <- readPhylipOutput(temp_path) # Remove temporary directory if (rm_temp) { unlink(temp_path, recursive=TRUE) } # Check output for trees if (!checkPhylipOutput(phylip_out)) { warning('PHYLIP failed to generate trees for clone ', clone) return(NULL) } # Extract inferred sequences from PHYLIP output inf_df <- getPhylipInferred(phylip_out) # Extract edge table from PHYLIP output edges <- getPhylipEdges(phylip_out, id_map=id_map) clone@data <- as.data.frame(dplyr::bind_rows(clone@data, inf_df)) # Convert edges and clone data to igraph graph object if( branch_length == "mutations" ){ mod_list <- modifyPhylipEdges(edges, clone, dist_mat=dist_mat) graph <- phylipToGraph(mod_list$edges, mod_list$clone) }else{ # or just keep everything the same germ_idx <- which(edges$to == "Germline") edges[germ_idx, c('from', 'to')] <- edges[germ_idx, c('to', 'from')] graph <- phylipToGraph(edges, clone) } return(graph) } #' Convert a tree in ape \code{phylo} format to igraph \code{graph} format. #' #' \code{phyloToGraph} converts a tree in \code{phylo} format to and #' \code{graph} format. #' #' @param phylo An ape \code{phylo} object. #' @param germline If specified, places specified tip sequence as the direct #' ancestor of the tree #' #' @return A \code{graph} object representing the input tree. #' #' @details #' Convert from phylo to graph object. Uses the node.label vector to label internal nodes. Nodes #' may rotate but overall topology will remain constant. #' #' @references #' \enumerate{ #' \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody #' Lineages. Genetics 2017 206(1):417-427 #' https://doi.org/10.1534/genetics.116.196303 #' \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - #' Repertoire-wide phylogenetic models of B cell molecular evolution reveal #' evolutionary signatures of aging and vaccination. bioRxiv 2019 #' https://doi.org/10.1101/558825 #' } #' #' @examples #' \dontrun{ #' library(igraph) #' library(ape) #' #' #convert to phylo #' phylo = graphToPhylo(graph) #' #' #plot tree using ape #' plot(phylo,show.node.label=TRUE) #' #' #store as newick tree #' write.tree(phylo,file="tree.newick") #' #' #read in tree from newick file #' phylo_r = read.tree("tree.newick") #' #' #convert to igraph #' graph_r = phyloToGraph(phylo_r,germline="Germline") #' #' #plot graph - same as before, possibly rotated #' plot(graph_r,layout=layout_as_tree) #' } #' #' @export phyloToGraph <- function(phylo, germline="Germline") { names <- 1:length(unique(c(phylo$edge[, 1],phylo$edge[, 2]))) for(i in 1:length(phylo$tip.label)){ names[i] <- phylo$tip.label[i] } if(!is.null(phylo$node.label)){ for(j in 1:length(phylo$node.label)){ i <- i + 1 names[i] <- phylo$node.label[j] } } d <- data.frame(cbind(phylo$edge,phylo$edge.length)) names(d)=c("from", "to", "weight") if(!is.null(phylo$nodes)){ seqs <- unlist(lapply(phylo$nodes,function(x)x$sequence)) names(seqs) <- lapply(phylo$nodes,function(x)x$id) } if(!is.null(germline)){ germnode <- which(phylo$tip.label == germline) phylo$uca <- phylo$edge[phylo$edge[,2] == germnode,1] if(sum(d$from == phylo$uca) == 2){ d[d$from == phylo$uca, ]$from <- germnode d <- d[!(d$from == germnode & d$to == germnode),] }else{ row <- which(d$from == phylo$uca & d$to == germnode) d[row,]$to <- phylo$uca d[row,]$from <- germnode } } d$to <- as.character(d$to) d$from <- as.character(d$from) g <- igraph::graph_from_data_frame(d) igraph::V(g)$name <- names[as.numeric(igraph::V(g)$name)] igraph::E(g)$label <- igraph::E(g)$weight if(!is.null(phylo$nodes)){ igraph::V(g)$sequence <- seqs[igraph::V(g)$name] } return(g) } #' Convert a tree in igraph \code{graph} format to ape \code{phylo} format. #' #' \code{graphToPhylo} a tree in igraph \code{graph} format to ape \code{phylo} #' format. #' #' @param graph An igraph \code{graph} object. #' #' @return A \code{phylo} object representing the input tree. Tip and internal node names are #' stored in the \code{tip.label} and \code{node.label} vectors, respectively. #' #' @details #' Convert from igraph \code{graph} object to ape \code{phylo} object. If \code{graph} object #' was previously rooted with the germline as the direct ancestor, this will re-attach the #' germline as a descendant node with a zero branch length to a new universal common ancestor (UCA) #' node and store the germline node ID in the \code{germid} attribute and UCA node number in #' the \code{uca} attribute. Otherwise these attributes will not be specified in the \code{phylo} object. #' Using \code{phyloToGraph(phylo, germline=phylo$germid)} creates a \code{graph} object with the germline #' back as the direct ancestor. Tip and internal node names are #' stored in the \code{tip.label} and \code{node.label} vectors, respectively. #' #' @references #' \enumerate{ #' \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody #' Lineages. Genetics 2017 206(1):417-427 #' https://doi.org/10.1534/genetics.116.196303 #' \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - #' Repertoire-wide phylogenetic models of B cell molecular evolution reveal #' evolutionary signatures of aging and vaccination. bioRxiv 2019 #' https://doi.org/10.1101/558825 #' } #' #' @examples #' \dontrun{ #' library(igraph) #' library(ape) #' #' #convert to phylo #' phylo = graphToPhylo(graph) #' #' #plot tree using ape #' plot(phylo,show.node.label=TRUE) #' #' #store as newick tree #' write.tree(phylo,file="tree.newick") #' #' #read in tree from newick file #' phylo_r = read.tree("tree.newick") #' #' #convert to igraph #' graph_r = phyloToGraph(phylo_r,germline="Germline") #' #' #plot graph - same as before, possibly rotated #' plot(graph_r,layout=layout_as_tree) #' } #' #' @export graphToPhylo <- function(graph) { df <- igraph::as_data_frame(graph) node_counts <- table(c(df$to,df$from)) tips <- names(node_counts)[node_counts == 1] nodes <- names(node_counts)[node_counts > 1] attr <- igraph::vertex_attr(graph) seqs <- attr$sequence names(seqs) <- attr$name germline <- tips[tips %in% df$from] if(length(germline) > 0){ ucanode <- paste0(germline,"_UCA")#max(as.numeric(nodes))+1 nodes <- c(ucanode,nodes) df[df$from == germline,]$from <- ucanode row <- c(ucanode,germline,0.0) names(row) <- c("from","to","weight") df <- rbind(df, row) seqs <- c(seqs,seqs["Germline"]) names(seqs)[length(seqs)] = paste0(germline,"_UCA") } tipn <- 1:length(tips) names(tipn) <- tips noden <- (length(tips)+1):(length(tips)+length(nodes)) names(noden) <- nodes renumber <- c(tipn,noden) df$from <- as.numeric(renumber[df$from]) df$to <- as.numeric(renumber[df$to]) phylo <- list() phylo$edge <- matrix(cbind(df$from,df$to),ncol=2) phylo$edge.length <- as.numeric(df$weight) phylo$tip.label <- tips phylo$node.label <- nodes phylo$Nnode <- length(nodes) phylo$node.label <- nodes class(phylo) <- "phylo" nnodes <- length(renumber) phylo$nodes <- lapply(1:nnodes,function(x){ n <- list() n$id <- names(renumber[renumber == x]) n$sequence <- seqs[n$id] n }) phylo = ape::ladderize(phylo, right=FALSE) return(phylo) } # Reroot phylogenetic tree to have its germline sequence at a zero-length branch # to a node which is the direct ancestor of the tree's UCA. Assigns \code{uca} # to be the ancestral node to the tree's germline sequence, as \code{germid} as # the tree's germline sequence ID. # # @param tree An ape \code{phylo} object # @param germid ID of the tree's predicted germline sequence # @param resolve If \code{TRUE} reroots tree to specified germline sequnece. # usually not necessary with IgPhyML trees analyzed with HLP model. rerootGermline <- function(tree, germid, resolve=FALSE){ if(resolve) { tree <- ape::root(phy=tree, outgroup=germid, resolve.root=T, edge.label=TRUE) } tree <- ape::reorder.phylo(tree, "postorder") edges <- tree$edge rootnode <- which(tree$tip.label==germid) rootedge <- which(edges[, 2] == rootnode) rootanc <- edges[edges[, 2] == rootnode, 1] mrcaedge <- which(edges[, 1] == rootanc & edges[, 2] != rootnode) if(length(mrcaedge) > 1){ print("POLYTOMY AT ROOT!") quit(save="no", status=1, runLast=FALSE) } tree$edge.length[mrcaedge] <- tree$edge.length[mrcaedge] + tree$edge.length[rootedge] tree$edge.length[rootedge] <- 0 tree$uca <- rootanc tree$germid <- germid return(tree) } #' Read in output from IgPhyML #' #' \code{readIgphyml} reads output from the IgPhyML phylogenetics inference package for #' B cell repertoires #' #' @param file IgPhyML output file (.tab). #' @param id ID to assign to output object. #' @param format if \code{"graph"} return trees as igraph \code{graph} objects. #' if \code{"phylo"} return trees as ape \code{phylo} objects. #' @param branches if \code{"distance"} branch lengths are in expected mutations per #' site. If \code{"mutations"} branches are in expected mutations. #' @param collapse if \code{TRUE} transform branch lengths to units of substitutions, #' rather than substitutions per site, and collapse internal nodes #' separated by branches < 0.1 substitutions. Will also remove all #' internal node labels, as it makes them inconsistent. #' #' @return A list containing IgPhyML model parameters and estimated lineage trees. #' #' Object attributes: #' \itemize{ #' \item \code{param}: Data.frame of parameter estimates for each clonal #' lineage. Columns include: \code{CLONE}, which is the #' clone id; \code{NSEQ}, the total number of sequences in #' the lineage; \code{NSITE}, the number of codon sites; #' \code{TREE_LENGTH}, the sum of all branch lengths in #' the estimated lineage tree; and \code{LHOOD}, the log #' likelihood of the clone's sequences given the tree and #' parameters. Subsequent columns are parameter estimates #' from IgPhyML, which will depend on the model used. #' Parameter columns ending with \code{_MLE} are maximum #' likelihood estimates; those ending with \code{_LCI} are #' the lower 95%% confidence interval estimate; those ending #' with \code{_UCI} are the upper 95%% confidence interval #' estimate. The first line of \code{param} is for clone #' \code{REPERTOIRE}, #' which is a summary of all lineages within the repertoire. #' For this row, \code{NSEQ} is the total number of sequences, #' \code{NSITE} is the average number of sites, and #' \code{TREE_LENGTH} is the mean tree length. For most #' applications, parameter values will be the same for all #' lineages within the repertoire, so access them simply by: #' \code{$param$OMEGA_CDR_MLE[1]} to, for instance, #' get the estimate of dN/dS on the CDRs at the repertoire level. #' \item \code{trees}: List of tree objects estimated by IgPhyML. If #' \code{format="graph"} these are igraph \code{graph} objects. #' If \code{format="phylo"}, these are ape \code{phylo} objects. #' \item \code{command}: Command used to run IgPhyML. #' } #' #' @details #' \code{readIgphyml} reads output from the IgPhyML repertoire phylogenetics inference package. #' The resulting object is divded between parameter estimates (usually under the HLP19 model), #' which provide information about mutation and selection pressure operating on the sequences. #' #' Trees returned from this function are either igraph objects or phylo objects, and each may be #' visualized accordingly. Futher, branch lengths in tree may represent either the expected number of #' substitutions per site (codon, if estimated under HLP or GY94 models), or the total number of #' expected substitutions per site. If the latter, internal nodes - but not tips - separated by branch #' lengths less than 0.1 are collapsed to simplify viewing. #' #' @references #' \enumerate{ #' \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody #' Lineages. Genetics 2017 206(1):417-427 #' https://doi.org/10.1534/genetics.116.196303 #' \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - #' Repertoire-wide phylogenetic models of B cell molecular evolution reveal #' evolutionary signatures of aging and vaccination. bioRxiv 2019 #' https://doi.org/10.1101/558825 #' } #' #' @examples #' \dontrun{ #' # Read in and plot a tree from an igphyml run #' library(igraph) #' s1 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="+7d") #' print(s1$param$OMEGA_CDR_MLE[1]) #' plot(s1$trees[[1]], layout=layout_as_tree, edge.label=E(s1$trees[[1]])$weight) #' } #' #' @export readIgphyml <- function(file, id=NULL, format=c("graph", "phylo"), collapse=FALSE, branches=c("mutations","distance")) { # Check arguments format <- match.arg(format) branches <- match.arg(branches) out <- list() trees <- list() df <- read.table(file, sep="\t", header=TRUE, stringsAsFactors=FALSE) params <- df[, !names(df) %in% c("TREE")] names(params) = tolower(names(params)) out[["param"]] <- params out[["command"]] <- df[1, ]$TREE for (i in 2:nrow(df)) { tree <- ape::read.tree(text=df[i, ][["TREE"]]) germ_base <- paste0(df[["CLONE"]][i], "_GERM") germ_id <- tree$tip.label[grepl(germ_base,tree$tip.label)] if(length(germ_id) > 1){ stop("Can only be one tip of the form '_GERM'") } if(!ape::is.rooted(tree)){ warning(paste("Tree",germ_base,"is not rooted and should be!")) tree <- rerootGermline(tree,germ_id,resolve=TRUE) tree$node.label <- NULL } rtree <- ape::ladderize(tree) rtree$germid <- germ_id if (branches == "mutations") { rtree$edge.length <- round(rtree$edge.length*df[i, ]$NSITE, digits=1) } if (collapse) { rtree$node.label <- NULL if(branches == "mutations"){ rtree <- ape::di2multi(rtree, tol=0.1) }else{ rtree <- ape::di2multi(rtree, tol=0.0001) } } if (format == "graph") { ig <- phyloToGraph(rtree, germline=rtree$germid) trees[[df[["CLONE"]][i]]] <- ig } else if (format == "phylo") { trees[[df[["CLONE"]][i]]] <- rtree } else { stop("Format must be either 'graph' or 'phylo'.") } } out[["trees"]] <- trees if (!is.null(id)) { out$param$id <- id } return(out) } #' Combine IgPhyML object parameters into a dataframe #' #' \code{combineIgphyml} combines IgPhyML object parameters into a data.frame. #' #' @param iglist list of igphyml objects returned by \link{readIgphyml}. #' Each must have an \code{id} column in its \code{param} attribute, #' which can be added automatically using the \code{id} option of #' \code{readIgphyml}. #' @param format string specifying whether each column of the resulting data.frame #' should represent a parameter (\code{wide}) or if #' there should only be three columns; i.e. id, varable, and value #' (\code{long}). #' #' @return A data.frame containing HLP model parameter estimates for all igphyml objects. #' Only parameters shared among all objects will be returned. #' #' @details #' \code{combineIgphyml} combines repertoire-wide parameter estimates from mutliple igphyml #' objects produced by readIgphyml into a dataframe that can be easily used for plotting and #' other hypothesis testing analyses. #' #' All igphyml objects used must have an "id" column in their \code{param} attribute, which #' can be added automatically from the \code{id} flag of \code{readIgphyml}. #' #' @references #' \enumerate{ #' \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody #' Lineages. Genetics 2017 206(1):417-427 #' https://doi.org/10.1534/genetics.116.196303 #' \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - #' Repertoire-wide phylogenetic models of B cell molecular evolution reveal #' evolutionary signatures of aging and vaccination. bioRxiv 2019 #' https://doi.org/10.1101/558825 #' } #' #' @seealso \link{readIgphyml} #' #' @examples #' \dontrun{ #' # Read in and combine two igphyml runs #' s1 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="+7d") #' s2 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="s2") #' combineIgphyml(list(s1, s2)) #' } #' #' @export combineIgphyml <- function(iglist, format=c("wide", "long")) { # Check arguments format <- match.arg(format) ordered_params <- c( "id", "nseq", "nsite", "lhood", "tree_length", "omega_fwr_mle", "omega_fwr_lci", "omega_fwr_uci", "omega_cdr_mle", "omega_cdr_lci", "omega_cdr_uci", "kappa_mle", "kappa_lci", "kappa_uci", "wrc_2_mle", "wrc_2_lci", "wrc_2_uci", "gyw_0_mle", "gyw_0_lci", "gyw_0_uci", "wa_1_mle", "wa_1_lci", "wa_1_uci", "tw_0_mle", "tw_0_lci", "tw_0_uci", "syc_2_mle", "syc_2_lci", "syc_2_uci", "grs_0_mle", "grs_0_lci", "grs_0_uci") paramCount <- table(unlist(lapply(iglist, function(x) names(x$param)))) params <- names(paramCount[paramCount == max(paramCount)]) params <- ordered_params[ordered_params %in% params] if (sum(params == "id") == 0) { message <- "id not specified in objects. Use 'id' flag in readIgphyml." stop(message) } repertoires <- lapply(iglist, function(x) x$param[1, params]) combined <- dplyr::bind_rows(repertoires) if (format == "long") { combined <- tidyr::gather(combined, "variable", "value", -!!rlang::sym("id")) combined$variable <- factor(combined$variable, levels=params) } return(combined) }alakazam/R/Classes.R0000644000175000017500000003026514067624107014123 0ustar nileshnilesh# Classes, Generics and Methods #### Generics #### # @exportMethod print #setGeneric("print") # @exportMethod plot #setGeneric("plot") setClassUnion("DfNULL", members=c("data.frame", "NULL")) setClassUnion("CharNULL", members=c("character", "NULL")) #### Diversity classes #### #' S4 class defining a clonal abundance curve #' #' \code{AbundanceCurve} defines clonal abundance values. #' #' @slot abundance data.frame with relative clonal abundance data and confidence intervals, #' containing the following columns: #' \itemize{ #' \item \code{group}: group identifier. #' \item \code{clone_id} or \code{CLONE}: clone identifier. #' \item \code{p}: relative abundance of the clone. #' \item \code{lower}: lower confidence inverval bound. #' \item \code{upper}: upper confidence interval bound. #' \item \code{rank}: the rank of the clone abundance. #' } #' @slot bootstrap data.frame of bootstrapped clonal distributions. #' @slot clone_by string specifying the name of the clone column. #' @slot group_by string specifying the name of the grouping column. #' @slot groups vector specifying the names of unique groups in group column. #' @slot n numeric vector indication the number of sequences sampled in each group. #' @slot nboot numeric specifying the number of bootstrap iterations to use. #' @slot ci confidence interval defining the upper and lower bounds #' (a value between 0 and 1). #' #' @name AbundanceCurve-class #' @rdname AbundanceCurve-class #' @aliases AbundanceCurve #' @exportClass AbundanceCurve setClass("AbundanceCurve", slots=c(abundance="data.frame", bootstrap="data.frame", clone_by="character", group_by="character", groups="character", n="numeric", ci="numeric", nboot="numeric")) #' S4 class defining a diversity curve #' #' \code{DiversityCurve} defines diversity (\eqn{D}) scores over multiple diversity #' orders (\eqn{Q}). #' #' @slot diversity data.frame defining the diversity curve with the following columns: #' \itemize{ #' \item \code{group}: group label. #' \item \code{q}: diversity order. #' \item \code{d}: mean diversity index over all bootstrap #' realizations. #' \item \code{d_sd}: standard deviation of the diversity index #' over all bootstrap realizations. #' \item \code{d_lower}: diversity lower confidence inverval bound. #' \item \code{d_upper}: diversity upper confidence interval bound. #' \item \code{e}: evenness index calculated as \code{D} #' divided by \code{D} at \code{Q=0}. #' \item \code{e_lower}: evenness lower confidence inverval bound. #' \item \code{e_upper}: eveness upper confidence interval bound. #' } #' @slot tests data.frame describing the significance test results with columns: #' \itemize{ #' \item \code{test}: string listing the two groups tested. #' \item \code{delta_mean}: mean of the \eqn{D} bootstrap delta #' distribution for the test. #' \item \code{delta_sd}: standard deviation of the \eqn{D} #' bootstrap delta distribution for the test. #' \item \code{pvalue}: p-value for the test. #' } #' @slot group_by string specifying the name of the grouping column in diversity calculation. #' @slot groups vector specifying the names of unique groups in group column in diversity calculation. #' @slot method string specifying the type of diversity calculated. #' @slot q vector of diversity hill diversity indices used for computing diversity. #' @slot n numeric vector indication the number of sequences sampled in each group. #' @slot ci confidence interval defining the upper and lower bounds #' (a value between 0 and 1). #' #' @name DiversityCurve-class #' @rdname DiversityCurve-class #' @aliases DiversityCurve #' @exportClass DiversityCurve setClass("DiversityCurve", slots=c(diversity="data.frame", tests="DfNULL", method="character", group_by="character", groups="character", q="numeric", n="numeric", ci="numeric")) #### Diversity methods #### #' @param x AbundanceCurve object #' #' @rdname AbundanceCurve-class #' @aliases AbundanceCurve-method #' @export setMethod("print", c(x="AbundanceCurve"), function(x) { print(x@abundance) }) #' @param y ignored. #' @param ... arguments to pass to \link{plotDiversityCurve}. #' #' @rdname AbundanceCurve-class #' @aliases AbundanceCurve-method #' @export setMethod("plot", c(x="AbundanceCurve", y="missing"), function(x, y, ...) { plotAbundanceCurve(x, ...) }) #' @param x DiversityCurve object #' #' @rdname DiversityCurve-class #' @aliases DiversityCurve-method #' @export setMethod("print", c(x="DiversityCurve"), function(x) { print(x@diversity) }) #' @param y diversity order to plot (q). #' @param ... arguments to pass to \link{plotDiversityCurve} or \link{plotDiversityTest}. #' #' @rdname DiversityCurve-class #' @aliases DiversityCurve-method #' @export setMethod("plot", c(x="DiversityCurve", y="missing"), function(x, y, ...) { plotDiversityCurve(x, ...) }) #' @rdname DiversityCurve-class #' @aliases DiversityCurve-method #' @export setMethod("plot", c(x="DiversityCurve", y="numeric"), function(x, y, ...) { plotDiversityTest(x, y, ...) }) #### Lineage classes #### #' S4 class defining a clone #' #' \code{ChangeoClone} defines a common data structure for perform lineage recontruction #' from Change-O data. #' #' @slot data data.frame containing sequences and annotations. Contains the #' columns \code{SEQUENCE_ID} and \code{SEQUENCE}, as well as any additional #' sequence-specific annotation columns. #' @slot clone string defining the clone identifier. #' @slot germline string containing the germline sequence for the clone. #' @slot v_gene string defining the V segment gene call. #' @slot j_gene string defining the J segment gene call. #' @slot junc_len numeric junction length (nucleotide count). #' #' @seealso See \link{makeChangeoClone} and \link{buildPhylipLineage} for use. #' #' @name ChangeoClone-class #' @rdname ChangeoClone-class #' @aliases ChangeoClone #' @exportClass ChangeoClone setClass("ChangeoClone", slots=c(data="data.frame", clone="character", germline="character", v_gene="character", j_gene="character", junc_len="numeric")) #### Topology classes #### #' S4 class defining edge significance #' #' \code{MRCATest} defines the significance of enrichment for annotations appearing at #' the MRCA of the tree. #' #' @slot tests data.frame describing the significance test results with columns: #' \itemize{ #' \item \code{annotation}: annotation value. #' \item \code{count}: observed count of MRCA positions #' with the given annotation. #' \item \code{expected}: expected mean count of MRCA occurance #' for the annotation. #' \item \code{pvalue}: one-sided p-value for the hypothesis that #' the observed annotation abundance is greater #' than expected. #' } #' @slot permutations data.frame containing the raw permutation test data with columns: #' \itemize{ #' \item \code{annotation}: annotation value. #' \item \code{count}: count of MRCA positions with the #' given annotation. #' \item \code{iter}: numerical index define which #' permutation realization each #' observation corresponds to. #' } #' @slot nperm number of permutation realizations. #' #' @name MRCATest-class #' @rdname MRCATest-class #' @aliases MRCATest #' @exportClass MRCATest setClass("MRCATest", slots=c(tests="data.frame", permutations="data.frame", nperm="numeric")) #' S4 class defining edge significance #' #' \code{EdgeTest} defines the significance of parent-child annotation enrichment. #' #' @slot tests data.frame describing the significance test results with columns: #' \itemize{ #' \item \code{parent}: parent node annotation. #' \item \code{child}: child node annotation #' \item \code{count}: count of observed edges with the given #' parent-child annotation set. #' \item \code{expected}: mean count of expected edges for the #' given parent-child relationship. #' \item \code{pvalue}: one-sided p-value for the hypothesis that #' the observed edge abundance is greater #' than expected. #' } #' @slot permutations data.frame containing the raw permutation test data with columns: #' \itemize{ #' \item \code{parent}: parent node annotation. #' \item \code{child}: child node annotation #' \item \code{count}: count of edges with the given parent-child #' annotation set. #' \item \code{iter}: numerical index define which permutation #' realization each observation corresponds #' to. #' } #' @slot nperm number of permutation realizations. #' #' @name EdgeTest-class #' @rdname EdgeTest-class #' @aliases EdgeTest #' @exportClass EdgeTest setClass("EdgeTest", slots=c(tests="data.frame", permutations="data.frame", nperm="numeric")) #### Topology methods #### #' @param x MRCATest object. #' #' @rdname MRCATest-class #' @aliases MRCATest-method #' @export setMethod("print", c(x="MRCATest"), function(x) { print(x@tests) }) #' @param y ignored. #' @param ... arguments to pass to \link{plotMRCATest}. #' #' @rdname MRCATest-class #' @aliases MRCATest-method #' @export setMethod("plot", c(x="MRCATest", y="missing"), function(x, y, ...) { plotMRCATest(x, ...) }) #' @param x EdgeTest object. #' #' @rdname EdgeTest-class #' @aliases EdgeTest-method #' @export setMethod("print", c(x="EdgeTest"), function(x) { print(x@tests) }) #' @param y ignored. #' @param ... arguments to pass to \link{plotEdgeTest}. #' #' @rdname EdgeTest-class #' @aliases EdgeTest-method #' @export setMethod("plot", c(x="EdgeTest", y="missing"), function(x, y, ...) { plotEdgeTest(x, ...) })alakazam/R/Diversity.R0000644000175000017500000016051314067624107014510 0ustar nileshnilesh# Clonal diversity analysis #' @include Classes.R NULL #### Coverage functions #### #' Calculate sample coverage #' #' \code{calcCoverage} calculates the sample coverage estimate, a measure of sample #' completeness, for varying orders using the method of Chao et al, 2015, falling back #' to the Chao1 method in the first order case. #' #' @param x numeric vector of abundance counts. #' @param r coverage order to calculate. #' #' @return The sample coverage of the given order \code{r}. #' #' @references #' \enumerate{ #' \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. #' Scand J Stat. 1984 11, 265270. #' \item Chao A, et al. Unveiling the species-rank abundance distribution by #' generalizing the Good-Turing sample coverage theory. #' Ecology. 2015 96, 11891201. #' } #' #' @seealso #' Used by \link{alphaDiversity}. #' #' @examples #' # Calculate clone sizes #' clones <- countClones(ExampleDb, groups="sample_id") #' #' # Calculate 1first order coverage for a single sample #' calcCoverage(clones$seq_count[clones$sample_id == "+7d"]) #' #' @export calcCoverage <- function(x, r=1) { # Use traditional calculation for 1st order coverage if (r == 1) { return(calcChao1Coverage(x)) } # Use general form for 2nd order and higher coverage x <- x[x >= 1] n <- sum(x) fr <- sum(x == r) fs <- sum(x == r + 1) if (fr == 0) { stop("Cannot calculate coverage of order ", r, ". No abundance data with count=", r, ".") } if (fs == 0) { stop("Cannot calculate coverage of order ", r, ". No abundance data with count=", r + 1, ".") } a <- factorial(r)*fr / sum(x[x >= r]^r) b <- ((n - r)*fr / ((n - r)*fr + (r + 1)*fs))^r rC <- 1 - a*b return(rC) } # Calculate first order coverage # # @param x a numeric vector of species abundance as counts # # @returns Coverage estimate. calcChao1Coverage <- function(x) { x <- x[x >= 1] n <- sum(x) f1 <- sum(x == 1) f2 <- sum(x == 2) if (f2 > 0) { rC1 <- 1 - (f1 / n) * (((n - 1) * f1) / ((n - 1) * f1 + 2 * f2)) } else { rC1 <- 1 - (f1 / n) * (((n - 1) * (f1 - 1)) / ((n - 1) * (f1 - 1) + 2)) } return(rC1) } # Calculates diversity under rarefaction # # Calculates Hill numbers under rarefaction # # @param x vector of observed abundance counts. # @param m the sequence count to rarefy to. # # @return The first order coverage estimate inferRarefiedCoverage <- function(x, m) { x <- x[x >= 1] n <- sum(x) if (m > n) { stop("m must be <= the total count of observed sequences.") } # Unrarefied case if (m == n) { return(calcCoverage(x, r=1)) } # Calculate rarefied coverage # TODO: Read up on this and fix #rC1 <- iNEXT:::Chat.Ind(x, m) y <- x[(n - x) >= m] rC1 <- 1 - sum(y/n * exp(lgamma(n - y + 1) - lgamma(n - m - y + 1) - lgamma(n) + lgamma(n - m))) return(rC1) } #### Abundance functions #### # Calculate undetected species # # Calculates the lower bound of undetected species counts using the Chao1 estimator. # # @param x vector of observed abundance counts. # # @return The count of undetected species. inferUnseenCount <- function(x) { x <- x[x >= 1] n <- sum(x) f1 <- sum(x == 1) f2 <- sum(x == 2) if (f2 > 0) { f0 <- ceiling(((n - 1) * f1^2) / (n * 2 * f2)) } else { f0 <- ceiling(((n - 1) * f1 * (f1 - 1)) / (n * 2)) } return(f0) } # Define undetected species relative abundances # # @param x vector of detected species abundance counts. # # @return An adjusted detected species relative abundance distribution. inferUnseenAbundance <- function(x) { x <- x[x >= 1] # Coverage rC1 <- calcCoverage(x, r=1) # Unseen count f0 <- inferUnseenCount(x) # Assign unseen relative abundance p <- rep((1 - rC1) / f0, f0) return(p) } # Adjustement to observed relative abundances # # @param x vector of observed abundance counts # # @return An adjusted observed species relative abundance distribution. adjustObservedAbundance <- function(x) { x <- x[x >= 1] n <- sum(x) # Coverage rC1 <- calcCoverage(x, r=1) # Calculate tuning parameter lambda <- (1 - rC1) / sum(x/n * exp(-x)) # Define adjusted relative abundance p <- x/n * (1 - lambda * exp(-x)) return(p) } # Combined unseen inferrence and observed abundance adjustment # # @param x named vector of observed abundance counts by clone. # # @return A vector containing the complete inferred abundance distribution. # Unseen species will be denote by a clone name starting with "U". inferCompleteAbundance <- function(x) { # Infer complete abundance distribution p1 <- adjustObservedAbundance(x) p2 <- inferUnseenAbundance(x) names(p2) <- if (length(p2) > 0) { paste0("U", 1:length(p2)) } else { NULL } return(c(p1, p2)) } #' Tabulates clones sizes #' #' \code{countClones} determines the number of sequences and total copy number of #' clonal groups. #' #' @param data data.frame with columns containing clonal assignments. #' @param groups character vector defining \code{data} columns containing grouping #' variables. If \code{groups=NULL}, then do not group data. #' @param copy name of the \code{data} column containing copy numbers for each #' sequence. If this value is specified, then total copy abundance #' is determined by the sum of copy numbers within each clonal group. #' @param clone name of the \code{data} column containing clone identifiers. #' @param remove_na removes rows with \code{NA} values in the clone column if \code{TRUE} and issues a warning. #' Otherwise, keeps those rows and considers \code{NA} as a clone in the final counts #' and relative abundances. #' #' @return A data.frame summarizing clone counts and frequencies with columns: #' \itemize{ #' \item \code{clone_id}: clone identifier. This is the default column #' name, specified with \code{clone='clone_id'}. #' If the function call uses Change-O #' formatted data and \code{clone='CLONE'}, this #' column will have name \code{CLONE}. #' \item \code{seq_count}: total number of sequences for the clone. #' \item \code{seq_freq}: frequency of the clone as a fraction of the total #' number of sequences within each group. #' \item \code{copy_count}: sum of the copy counts in the \code{copy} column. #' Only present if the \code{copy} argument is #' specified. #' \item \code{copy_freq}: frequency of the clone as a fraction of the total #' copy number within each group. Only present if #' the \code{copy} argument is specified. #' } #' Also includes additional columns specified in the \code{groups} argument. #' #' @examples #' # Without copy numbers #' clones <- countClones(ExampleDb, groups="sample_id") #' #' # With copy numbers and multiple groups #' clones <- countClones(ExampleDb, groups=c("sample_id", "c_call"), copy="duplicate_count") #' #' @export countClones <- function(data, groups=NULL, copy=NULL, clone="clone_id", remove_na=TRUE) { # Check input check <- checkColumns(data, c(clone, copy, groups)) if (check != TRUE) { warning(check) # instead of throwing an error and potentially disrupting a workflow } # Handle NAs if (remove_na) { bool_na <- is.na(data[, clone]) if (any(bool_na)) { if (!all(bool_na)){ msg <- paste0("NA(s) found in ", sum(bool_na), " row(s) of the ", clone, " column and excluded from tabulation") warning(msg) } data <- data[!bool_na, ] } } # Tabulate clonal abundance if (is.null(copy)) { clone_tab <- data %>% group_by(!!!rlang::syms(c(groups, clone))) %>% dplyr::summarize(seq_count=n()) %>% dplyr::mutate(seq_freq=!!rlang::sym("seq_count")/sum(!!rlang::sym("seq_count"), na.rm=TRUE)) %>% dplyr::arrange(desc(!!rlang::sym("seq_count"))) } else { clone_tab <- data %>% group_by(!!!rlang::syms(c(groups, clone))) %>% dplyr::summarize(seq_count=length(.data[[clone]]), copy_count=sum(.data[[copy]], na.rm=TRUE)) %>% dplyr::mutate(seq_freq=!!rlang::sym("seq_count")/sum(!!rlang::sym("seq_count"), na.rm=TRUE), copy_freq=!!rlang::sym("copy_count")/sum(!!rlang::sym("copy_count"), na.rm=TRUE)) %>% dplyr::arrange(desc(!!rlang::sym("copy_count"))) } return(clone_tab) } # Perform boostrap abundance calculation # # @param x named vector of observed abundance values. # @param n number of samples to draw from the estimate complete abundance distribution. # @param nboot number of bootstrap realizations. # @param method complete abundance inferrence method. # One of "before", "after" or "none" for complete abundance distribution # inferrence before sampling, after sampling, or uncorrected, respectively. # # @return A matrix of bootstrap results. bootstrapAbundance <- function(x, n, nboot=200, method="before") { ## DEBUG # x=abund_obs; method="before" # Check argumets method <- match.arg(method) if (method == "before") { # Calculate estimated complete abundance distribution p <- inferCompleteAbundance(x) # Bootstrap abundance boot_mat <- rmultinom(nboot, n, p) / n } else if (method == "after") { # Calculate estimated complete abundance distribution p <- x / sum(x, na.rm=TRUE) boot_sam <- rmultinom(nboot, n, p) boot_list <- apply(boot_sam, 2, inferCompleteAbundance) # Convert to matrix boot_names <- unique(unlist(sapply(boot_list, names))) boot_mat <- matrix(0, nrow=length(boot_names), ncol=nboot) rownames(boot_mat) <- boot_names for (i in 1:nboot) { boot_mat[names(boot_list[[i]]), i] <- boot_list[[i]] } } else if (method == "none") { # Raw sampling of input p <- x / sum(x, na.rm=TRUE) boot_sam <- rmultinom(nboot, n, p) } else { stop("Invalid method: ", method) } return(boot_mat) } #' Estimates the complete clonal relative abundance distribution #' #' \code{estimateAbundance} estimates the complete clonal relative abundance distribution #' and confidence intervals on clone sizes using bootstrapping. #' #' @param data data.frame with Change-O style columns containing clonal assignments. #' @param clone name of the \code{data} column containing clone identifiers. #' @param copy name of the \code{data} column containing copy numbers for each #' sequence. If \code{copy=NULL} (the default), then clone abundance #' is determined by the number of sequences. If a \code{copy} column #' is specified, then clone abundances is determined by the sum of #' copy numbers within each clonal group. #' @param group name of the \code{data} column containing group identifiers. #' If \code{NULL} then no grouping is performed and the \code{group} #' column of the output will contain the value \code{NA} for each row. #' @param min_n minimum number of observations to sample. #' A group with less observations than the minimum is excluded. #' @param max_n maximum number of observations to sample. If \code{NULL} then no #' maximum is set. #' @param uniform if \code{TRUE} then uniformly resample each group to the same #' number of observations. If \code{FALSE} then allow each group to #' be resampled to its original size or, if specified, \code{max_size}. #' @param ci confidence interval to calculate; the value must be between 0 and 1. #' @param nboot number of bootstrap realizations to generate. #' @param progress if \code{TRUE} show a progress bar. #' #' @return A \link{AbundanceCurve} object summarizing the abundances. #' #' @references #' \enumerate{ #' \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. #' Scand J Stat. 1984 11, 265270. #' \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: #' A framework for sampling and estimation in species diversity studies. #' Ecol Monogr. 2014 84:45-67. #' \item Chao A, et al. Unveiling the species-rank abundance distribution by #' generalizing the Good-Turing sample coverage theory. #' Ecology. 2015 96, 11891201. #' } #' #' @seealso #' See \link{plotAbundanceCurve} for plotting of the abundance distribution. #' See \link{alphaDiversity} for a similar application to clonal diversity. #' #' @examples #' abund <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) #' #' @export estimateAbundance <- function(data, clone="clone_id", copy=NULL, group=NULL, min_n=30, max_n=NULL, uniform=TRUE, ci=0.95, nboot=200, progress=FALSE) { ## DEBUG # data=ExampleDb; group="sample_id"; clone="clone_id"; copy=NULL; min_n=1; max_n=NULL; ci=0.95; uniform=F; nboot=100 # copy="duplicate_count" # group=NULL # Hack for visibility of dplyr variables . <- NULL # Check input if (!is.data.frame(data)) { stop("Input data is not a data.frame") } # Check columns that are reported are real columns (can be NULL) check <- checkColumns(data, c(clone, copy, group)) if (check != TRUE) { stop(check) } # Set confidence interval ci_z <- ci + (1 - ci) / 2 ci_x <- qnorm(ci_z) # Tabulate clonal abundance count_col <- if (!is.null(copy)) { "copy_count" } else { "seq_count" } clone_tab <- countClones(data, copy=copy, clone=clone, groups=group) %>% dplyr::mutate(clone_count=!!rlang::sym(count_col)) # Tabulate group sizes if (!is.null(group)) { # Summarize groups group_tab <- clone_tab %>% group_by(!!rlang::sym(group)) %>% dplyr::summarize(count=sum(!!rlang::sym("clone_count"), na.rm=TRUE)) %>% rename(group=!!rlang::sym(group)) } else { group_tab <- data.frame(v="All", count=sum(clone_tab$clone_count, na.rm=T)) names(group_tab)[1] <- "group" } group_all <- as.character(group_tab$group) group_tab <- group_tab[group_tab$count >= min_n, ] group_keep <- as.character(group_tab$group) # Set number of sampled sequence if (uniform) { nsam <- min(group_tab$count, max_n) nsam <- setNames(rep(nsam, length(group_keep)), group_keep) } else { nsam <- if (is.null(max_n)) { group_tab$count } else { pmin(group_tab$count, max_n) } nsam <- setNames(nsam, group_keep) } # Warn if groups removed if (length(group_keep) < length(group_all)) { warning("Not all groups passed threshold min_n=", min_n, ".", " Excluded: ", paste(setdiff(group_all, group_keep), collapse=", ")) } # Generate abundance bootstrap if (progress) { pb <- progressBar(length(group_keep)) } boot_list <- list() abund_list <- list() for (g in group_keep) { n <- nsam[g] # Extract abundance vector if (!is.null(group)) { abund_obs <- clone_tab$clone_count[clone_tab[[group]] == g] names(abund_obs) <- clone_tab[[clone]][clone_tab[[group]] == g] } else { # Extract abundance vector abund_obs <- clone_tab$clone_count names(abund_obs) <- clone_tab[[clone]] } # Infer complete abundance distribution boot_mat <- bootstrapAbundance(abund_obs, n, nboot=nboot, method="before") # Assign confidence intervals based on variance of bootstrap realizations p_mean <- apply(boot_mat, 1, mean) p_sd <- apply(boot_mat, 1, sd) p_err <- ci_x * p_sd p_lower <- pmax(p_mean - p_err, 0) p_upper <- p_mean + p_err # Assemble and sort abundance data.frame abund_df <- tibble::tibble(!!clone := rownames(boot_mat), p=p_mean, p_sd=p_sd, lower=p_lower, upper=p_upper) %>% dplyr::arrange(desc(!!rlang::sym("p"))) %>% dplyr::mutate(rank=1:n()) # Save summary abund_list[[g]] <- abund_df # Save bootstrap boot_list[[g]] <- as.data.frame(boot_mat) %>% tibble::rownames_to_column(clone) if (progress) { pb$tick() } } id_col <- if_else(is.null(group), "group", group) abundance_df <- as.data.frame(bind_rows(abund_list, .id=id_col)) bootstrap_df <- as.data.frame(bind_rows(boot_list, .id=id_col)) # Create a new diversity object with bootstrap abund_obj <- new("AbundanceCurve", bootstrap=bootstrap_df, abundance=abundance_df, clone_by=clone, group_by=id_col, #groups=if_else(is.null(group), as.character(NA), group_keep), groups=group_keep, n=nsam, nboot=nboot, ci=ci) return(abund_obj) } #### Diversity functions #### #' Calculate the diversity index #' #' \code{calcDiversity} calculates the clonal diversity index for a vector of diversity #' orders. #' #' @param p numeric vector of clone (species) counts or proportions. #' @param q numeric vector of diversity orders. #' #' @return A vector of diversity scores \eqn{D} for each \eqn{q}. #' #' @details #' This method, proposed by Hill (Hill, 1973), quantifies diversity as a smooth function #' (\eqn{D}) of a single parameter \eqn{q}. Special cases of the generalized diversity #' index correspond to the most popular diversity measures in ecology: species richness #' (\eqn{q = 0}), the exponential of the Shannon-Weiner index (\eqn{q} approaches \eqn{1}), the #' inverse of the Simpson index (\eqn{q = 2}), and the reciprocal abundance of the largest #' clone (\eqn{q} approaches \eqn{+\infty}). At \eqn{q = 0} different clones weight equally, #' regardless of their size. As the parameter \eqn{q} increase from \eqn{0} to \eqn{+\infty} #' the diversity index (\eqn{D}) depends less on rare clones and more on common (abundant) #' ones, thus encompassing a range of definitions that can be visualized as a single curve. #' #' Values of \eqn{q < 0} are valid, but are generally not meaningful. The value of \eqn{D} #' at \eqn{q=1} is estimated by \eqn{D} at \eqn{q=0.9999}. #' #' @references #' \enumerate{ #' \item Hill M. Diversity and evenness: a unifying notation and its consequences. #' Ecology. 1973 54(2):427-32. #' } #' #' @seealso Used by \link{alphaDiversity}. #' #' @examples #' # May define p as clonal member counts #' p <- c(1, 1, 3, 10) #' q <- c(0, 1, 2) #' calcDiversity(p, q) #' #' # Or proportional abundance #' p <- c(1/15, 1/15, 1/5, 2/3) #' calcDiversity(p, q) #' #' @export calcDiversity <- function(p, q) { # Add jitter to q=1 q[q == 1] <- 0.9999 # Remove zeros p <- p[p > 0] # Convert p to proportional abundance p <- p / sum(p) # Calculate D for each q D <- sapply(q, function(x) sum(p^x)^(1 / (1 - x))) return(D) } # Calculate the inferred diversity index # # \code{calcInferredDiversity} calculates the clonal diversity index for a vector of diversity # orders with a correction for the presence of unseen species. Does not take proportional abundance. # # @param p numeric vector of clone (species) counts. # @param q numeric vector of diversity orders. # # @return A vector of diversity scores \eqn{D} for each \eqn{q}. # # @details # This method, proposed by Hill (Hill, 1973), quantifies diversity as a smooth function # (\eqn{D}) of a single parameter \eqn{q}. Special cases of the generalized diversity # index correspond to the most popular diversity measures in ecology: species richness # (\eqn{q = 0}), the exponential of the Shannon-Weiner index (\eqn{q} approaches \eqn{1}), the # inverse of the Simpson index (\eqn{q = 2}), and the reciprocal abundance of the largest # clone (\eqn{q} approaches \eqn{+\infty}). At \eqn{q = 0} different clones weight equally, # regardless of their size. As the parameter \eqn{q} increase from \eqn{0} to \eqn{+\infty} # the diversity index (\eqn{D}) depends less on rare clones and more on common (abundant) # ones, thus encompassing a range of definitions that can be visualized as a single curve. # # Values of \eqn{q < 0} are valid, but are generally not meaningful. The value of \eqn{D} # at \eqn{q=1} is estimated by \eqn{D} at \eqn{q=0.9999}. # # An adjusted detected species relative abundance distribution is applied before calculating diversity. # # @references # \enumerate{ # \item Hill M. Diversity and evenness: a unifying notation and its consequences. # Ecology. 1973 54(2):427-32. # } # # @seealso Used by \link{alphaDiversity} # # @examples # # May define p as clonal member counts # p <- c(1, 1, 3, 10) # q <- c(0, 1, 2) # calcInferredDiversity(p, q) # # # @export # calcInferredDiversity <- function(p, q) { # # Correct abundance # .infer <- function(y) { # # Infer complete abundance distribution # p1 <- adjustObservedAbundance(y) # p2 <- inferUnseenAbundance(y) # names(p2) <- if (length(p2) > 0) { paste0("U", 1:length(p2)) } else { NULL } # return(c(p1, p2)) # } # # # Correct abundance # p <- .infer(p) # # Add jitter to q=1 # q[q == 1] <- 0.9999 # # Remove zeros # p <- p[p > 0] # # Convert p to proportional abundance # p <- p / sum(p) # # Calculate D for each q # D <- sapply(q, function(x) sum(p^x)^(1 / (1 - x))) # # return(D) # } # Calculates diversity under rarefaction # # Calculates Hill numbers under rarefaction # # @param x vector of observed abundance counts. # @param q numeric vector of diversity orders. # @param m the sequence count to rarefy to. # # @return A vector of diversity scores \eqn{D} for each \eqn{q}. inferRarefiedDiversity <- function(x, q, m) { x <- x[x >= 1] n <- sum(x) if (m > n) { stop("m must be <= the total count of observed sequences.") } q[q == 1] <- 0.9999 # Tabulate frequency counts from 1:n fk_n <- tabulate(x, nbins=n) # Calculate estimated fk(m) fk_m <- sapply(1:m, function(k) sum(exp(lchoose(k:m, k) + lchoose(n - k:m, m - k) - lchoose(n, m))*fk_n[k:m])) # Calculate diversity D <- sapply(q, function(r) sum((1:m / m)^r * fk_m)^(1 / (1 - r))) return(D) } # Helper function for computing alpha diversity from bootrstrap outputs # # \code{helperAlpha} divides a set of bootstrapped clones by group annotation, # and computes the diversity of each set. # # @param boot_output data.frame from\link{AbundanceCurve} object containing bootstrapped clonal # abundance curves. # @param q vector of Hill Diversity indices to test for diversity calculations. # @param clone name of the \code{boot_output} column containing clone identifiers. # @param group name of the \code{boot_output} column containing grouping information for # diversity calculation. # # @return data.frame containing diversity calculations for each bootstrap iteration. helperAlpha <- function(boot_output, q, clone="clone_id", group=NULL) { ## DEBUG # abundance <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) # clone <- abundance@clone_by # group <- abundance@group_by # Compute diversity from a column of each bootstrap output <- boot_output %>% dplyr::ungroup() %>% dplyr::select(-one_of(c(clone, group))) %>% as.matrix() %>% apply(2, calcDiversity, q=q) %>% data.frame() %>% mutate(q=q) return(output) } # Helper function for computing beta diversity from bootrstrap outputs # # \code{helperBeta} divides a set of bootstrapped clones by group annotation, # and computes the alpha diversity. Group annotations are then ignored and # gamma diversity is computed. A multiplicative beta diversity is used corresponding # to the gamma diversity divided by the average alpha diversity of each group. # # @param boot_output data.frame from\link{AbundanceCurve} object containing bootstrapped clonal abundance curves. # @param q vector of Hill Diversity indices to test for diversity calculations. # @param ci_z numeric value corresponding to confidence interval for calculating beta diversity. # @param clone name of the \code{boot_output} column containing clone identifiers. # @param group name of the \code{boot_output} column containing grouping information for diversity # calculation. # # @return data.frame containing diversity calculations for each bootstrap iteration. helperBeta <- function(boot_output, q, ci_x, clone="clone_id", group="group") { # Hack for visibility of dplyr variables . <- NULL # Compute gamma diversity metrics gamma <- boot_output %>% dplyr::group_by(!!rlang::sym(clone)) %>% dplyr::select(-one_of(c(group))) %>% dplyr::summarize_all(sum) %>% dplyr::do(helperAlpha(., q=q, clone=clone)) %>% tidyr::gather(key="n", value="gamma", -!!rlang::sym("q")) %>% dplyr::mutate(gamma=as.numeric(!!rlang::sym("gamma"))) # Compute alpha diversity metrics alpha <- boot_output %>% dplyr::group_by(!!rlang::sym(group)) %>% dplyr::do(helperAlpha(., q=q, clone=clone, group=group)) %>% dplyr::group_by(!!rlang::sym("q")) %>% dplyr::select(-one_of(c(group))) %>% dplyr::summarize_all(mean) %>% tidyr::gather(key="n", value="alpha", -!!rlang::sym("q")) %>% dplyr::mutate(alpha=as.numeric(!!rlang::sym("alpha"))) # Perform comparisons of alpha and gamma to extract beta beta <- bind_cols(gamma, alpha) %>% dplyr::group_by(!!rlang::sym("q")) %>% dplyr::mutate(X=!!rlang::sym("gamma") / !!rlang::sym("alpha")) %>% dplyr::summarize(d=mean(!!rlang::sym("X"), na.rm=TRUE), d_sd=sd(!!rlang::sym("X"), na.rm=TRUE)) %>% dplyr::mutate(d_lower=pmax(!!rlang::sym("d") - !!rlang::sym("d_sd") * ci_x, 0), d_upper=!!rlang::sym("d") + !!rlang::sym("d_sd") * ci_x) return(beta) } # Helper function for computing statistical significance # # \code{helperTest} computes the pairwise statistical significance of differences # in bootstrapped diversity values between two sets defined by the group column. # A p-value is computed using the ECDF distribution as the frequency of bootstrap iterations # for which no difference is observed. # # @param div_df data.frame from\link{DiversityCurve} object containing bootstrapped # diversity curves. # @param group name of the \code{boot_output} column containing grouping information # for diversity calculation. # @param q vector of Hill Diversity indices to test for diversity calculations. # # @return data.frame containing test results for each value of q. helperTest <- function(div_df, q, group="group") { # Hack for visibility of dplyr variables . <- NULL # Pairwise test group_pairs <- combn(unique(div_df[[group]]), 2, simplify=F) pvalue_list <- list() for (group_pair in group_pairs) { pair_list <- list() for(q_i in q) { # Currently just testing for one diversity order mat1 <- div_df %>% dplyr::filter(!!rlang::sym(group) == group_pair[1], !!rlang::sym("q") == q_i) %>% dplyr::select(-one_of(c(group, "q"))) %>% unlist() mat2 <- div_df %>% dplyr::filter(!!rlang::sym(group) == group_pair[2], !!rlang::sym("q") == q_i) %>% dplyr::select(-one_of(c(group, "q"))) %>% unlist() if (mean(mat1) >= mean(mat2)) { g_delta <- mat1 - mat2 } else { g_delta <- mat2 - mat1 } # Compute p-value from ecdf p <- ecdf(g_delta)(0) p <- ifelse(p <= 0.5, p * 2, (1 - p) * 2) pair_list[[as.character(q_i)]] <- list(delta_mean=mean(g_delta), delta_sd=sd(g_delta), pvalue=p) } pvalue_list[[paste(group_pair, collapse=" != ")]] <- bind_rows(pair_list, .id="q") } test_df <- bind_rows(pvalue_list, .id="test") return(test_df) } #' Calculate clonal alpha diversity #' #' \code{alphaDiversity} takes in a data.frame or \link{AbundanceCurve} and computes #' diversity scores (\eqn{D}) over an interval of diversity orders (\eqn{q}). #' #' @param data data.frame with Change-O style columns containing clonal assignments or #' a \link{AbundanceCurve} generate by \link{estimateAbundance} object #' containing a previously calculated bootstrap distributions of clonal abundance. #' @param min_q minimum value of \eqn{q}. #' @param max_q maximum value of \eqn{q}. #' @param step_q value by which to increment \eqn{q}. #' @param ci confidence interval to calculate; the value must be between 0 and 1. #' @param ... additional arguments to pass to \link{estimateAbundance}. Additional arguments #' are ignored if a \link{AbundanceCurve} is provided as input. #' #' @return A \link{DiversityCurve} object summarizing the diversity scores. #' #' @references #' \enumerate{ #' \item Hill M. Diversity and evenness: a unifying notation and its consequences. #' Ecology. 1973 54(2):427-32. #' \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. #' Scand J Stat. 1984 11, 265270. #' \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: #' A framework for sampling and estimation in species diversity studies. #' Ecol Monogr. 2014 84:45-67. #' \item Chao A, et al. Unveiling the species-rank abundance distribution by #' generalizing the Good-Turing sample coverage theory. #' Ecology. 2015 96, 11891201. #' } #' #' @seealso See \link{calcDiversity} for the basic calculation and #' \link{DiversityCurve} for the return object. #' See \link{plotDiversityCurve} for plotting the return object. #' #' @details #' Clonal diversity is calculated using the generalized diversity index (Hill numbers) #' proposed by Hill (Hill, 1973). See \link{calcDiversity} for further details. #' #' To generate a smooth curve, \eqn{D} is calculated for each value of \eqn{q} from #' \code{min_q} to \code{max_q} incremented by \code{step_q}. When \code{uniform=TRUE} #' variability in total sequence counts across unique values in the \code{group} column #' is corrected by repeated resampling from the estimated complete clonal distribution to a #' common number of sequences. The complete clonal abundance distribution that is resampled #' from is inferred by using the Chao1 estimator to infer the number of unseen clones, #' followed by applying the relative abundance correction and unseen clone frequencies #' described in Chao et al, 2015. #' #' The diversity index (\eqn{D}) for each group is the mean value of over all resampling #' realizations. Confidence intervals are derived using the standard deviation of the #' resampling realizations, as described in Chao et al, 2015. #' #' Significance of the difference in diversity index (\code{D}) between groups is tested by #' constructing a bootstrap delta distribution for each pair of unique values in the #' \code{group} column. The bootstrap delta distribution is built by subtracting the diversity #' index \code{Da} in group \code{a} from the corresponding value \eqn{Db} in group \code{b}, #' for all bootstrap realizations, yielding a distribution of \code{nboot} total deltas; where #' group \code{a} is the group with the greater mean \code{D}. The p-value for hypothesis #' \code{Da != Db} is the value of \code{P(0)} from the empirical cumulative distribution #' function of the bootstrap delta distribution, multiplied by 2 for the two-tailed correction. #' #' Note, this method may inflate statistical significance when clone sizes are uniformly small, #' such as when most clones sizes are 1, sample size is small, and \code{max_n} is near #' the total count of the smallest data group. Use caution when interpreting the results #' in such cases. #' #' @examples #' # Group by sample identifier in two steps #' abund <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) #' div <- alphaDiversity(abund, step_q=1, max_q=10) #' plotDiversityCurve(div, legend_title="Sample") #' #' # Grouping by isotype rather than sample identifier in one step #' div <- alphaDiversity(ExampleDb, group="c_call", min_n=40, step_q=1, max_q=10, #' nboot=100) #' plotDiversityCurve(div, legend_title="Isotype") #' #' @export alphaDiversity <- function(data, min_q=0, max_q=4, step_q=0.1, ci=0.95, ...) { # Hack for visibility of dplyr variables . <- NULL # Check input object and call estimateAbundance if required if (is(data, "AbundanceCurve")) { abundance <- data } else if (is(data, "data.frame")) { abundance <- estimateAbundance(data, ci=0.95, ...) } else { stop("Input must be either a data.frame or AbundanceCurve object.") } # Set diversity orders and confidence interval ci_z <- ci + (1 - ci) / 2 ci_x <- qnorm(ci_z) q <- seq(min_q, max_q, step_q) if (!(0 %in% q)) { q <- c(0, q) } # Set grouping variables clone <- abundance@clone_by group <- abundance@group_by # Compute diversity metric for bootstrap instances boot_df <- abundance@bootstrap %>% dplyr::group_by(!!rlang::sym(group)) %>% dplyr::do(helperAlpha(., q=q, clone=clone, group=group)) %>% dplyr::ungroup() # Summarize diversity div_df <- boot_df %>% tidyr::gather(key="n", value="X", -one_of(c(group, "q"))) %>% dplyr::mutate(X=as.numeric(!!rlang::sym("X"))) %>% dplyr::group_by(!!!rlang::syms(c(group, "q"))) %>% dplyr::summarize(d=mean(!!rlang::sym("X"), na.rm=TRUE), d_sd=sd(!!rlang::sym("X"), na.rm=TRUE)) %>% dplyr::mutate(d_lower=pmax(!!rlang::sym("d") - !!rlang::sym("d_sd") * ci_x, 0), d_upper=!!rlang::sym("d") + !!rlang::sym("d_sd") * ci_x) # Compute evenness div_qi <- div_df %>% filter(!!rlang::sym("q") == 0) %>% select(one_of(c(group, "d"))) div_df <- div_df %>% dplyr::right_join(div_qi, by=group, suffix=c("", "_0")) %>% mutate(e=!!rlang::sym("d")/!!rlang::sym("d_0"), e_lower=!!rlang::sym("d_lower")/!!rlang::sym("d_0"), e_upper=!!rlang::sym("d_upper")/!!rlang::sym("d_0")) %>% select(-!!rlang::sym("d_0")) # Test if (length(abundance@groups) > 1) { test_df <- helperTest(boot_df, q=q, group=group) } else { test_df <- NULL } # Build return object group_set <- unique(div_df[[group]]) div_obj <- new("DiversityCurve", diversity=div_df, tests=test_df, method="alpha", group_by=group, groups=group_set, q=q, n=abundance@n, ci=ci) return(div_obj) } # Calculates the pairwise beta diversity # # \code{betaDiversity} takes in a data.frame or \link{AbundanceCurve} and computes # the multiplicative beta diversity across a range of Hill diversity indices. # # @param data data.frame with Change-O style columns containing clonal assignments or # an \link{AbundanceCurve} object generate by \link{estimateAbundance}. # containing a previously calculated bootstrap distributions of clonal abundance. # @param comparisons named list of comparisons between group members for computing beta diversity. # @param min_q minimum value of \eqn{q}. # @param max_q maximum value of \eqn{q}. # @param step_q value by which to increment \eqn{q}. # @param ci confidence interval to calculate; the value must be between 0 and 1. # @param ... additional arguments to pass to \link{estimateAbundance}. Additional arguments # are ignored if a \link{AbundanceCurve} is provided as input. # # @return A \link{DiversityCurve} object summarizing the diversity scores. # # @details # Beta diversity or the comparative difference between two samples as quantified using Hill # diversity indices proposed by Jost (Jost, 2007). # # Briefly, the alpha and gamma diversity components are calculated for each comparison. # Alpha diversity is calculated as the average hill diversity across each independent sample # while Gamma diversity is calculated as the total diversity without distinguishing between # samples. Beta diversity is computed as Gamma/Alpha. # # Diversity is calculated on the estimated clonal abundance distribution with a correction # for unseen species much like the calculation for alpha diversity \link{alphaDiversity}. # A smooth curve is generated in the same manner as in \link{alphaDiversity}. # Confidence intervals are derived using the standard deviation of the resampling realizations. # # \enumerate{ # \item Hill M. Diversity and evenness: a unifying notation and its consequences. # Ecology. 1973 54(2):427-32. # \item Jost L. Partitioning Diversity Into Independent Alpha and Beta Components. # Ecology. 2007 88(10):2427–2439. # \item Jost L, et al. Partitioning diversity for conservation analyses. # Diversity Distrib. 2010 16(1):65–76 # } # # @examples # div <- betaDiversity(ExampleDb, comparisons=list("TIME"=c("-1h", "+7d")), group="sample_id", # min_n=40, step_q=1, max_q=10, nboot=100) # # plotDiversityCurve(div, legend_title="Isotype") # # @export betaDiversity <- function(data, comparisons, min_q=0, max_q=4, step_q=0.1, ci=0.95, ...) { # Hack for visibility of dplyr variables . <- NULL if (!is.list(comparisons) || is.null(names(comparisons))) { stop("'comparisons' must be a named list") } # Check input object and call estimateAbundance if required if (is(data, "AbundanceCurve")) { abundance <- data } else if (is(data, "data.frame")) { abundance <- estimateAbundance(data, ci=0.95, ...) } else { stop("Input must be either a data.frame or AbundanceCurve object.") } # Set diversity orders and confidence interval ci_z <- ci + (1 - ci) / 2 ci_x <- qnorm(ci_z) q <- seq(min_q, max_q, step_q) if (!(0 %in% q)) { q <- c(0, q) } # Compute pairwise beta diversity for bootstrap instances beta_diversity_list <- list() for (comparison in names(comparisons)) { beta_diversity_list[[comparison]] <- abundance@bootstrap %>% dplyr::ungroup() %>% dplyr::filter(.[[abundance@group_by]] %in% comparisons[[comparison]]) %>% dplyr::do(helperBeta(., q=q, clone=abundance@clone_by, group=abundance@group_by, ci_x=ci_x)) } # Generate summary diversity output div_df <- bind_rows(beta_diversity_list, .id = "comparison") # Beta groups group_set <- unique(div_df[["comparison"]]) # Compute evenness div_qi <- div_df %>% filter(!!rlang::sym("q") == 0) %>% select(one_of(c("comparison", "D"))) div <- div_df %>% right_join(div_qi, by = "comparison", suffix = c("", "_0")) %>% mutate(d = !!rlang::sym("d")/!!rlang::sym("d_0"), e_lower = !!rlang::sym("d_lower")/!!rlang::sym("d_0"), e_upper = !!rlang::sym("d_upper")/!!rlang::sym("d_0")) %>% select(-!!rlang::sym("d_0")) # Test if (length(group_set) > 1) { test_df <- helperTest(div_df, q=q, group="comparison") } else { test_df <- NULL } # Build return object div_obj <- new("DiversityCurve", diversity=div, tests=test_df, method="beta", group_by="comparison", groups=group_set, n=abundance@n, q=q, ci=ci) return(div_obj) } #### Plotting functions #### #' Plots a clonal abundance distribution #' #' \code{plotAbundanceCurve} plots the results from estimating the complete clonal #' relative abundance distribution. The distribution is plotted as a log rank abundance #' distribution. #' #' @param data \link{AbundanceCurve} object returned by \link{estimateAbundance}. #' @param colors named character vector whose names are values in the #' \code{group} column of \code{data} and whose values are #' colors to assign to those group names. #' @param main_title string specifying the plot title. #' @param legend_title string specifying the legend title. #' @param xlim numeric vector of two values specifying the #' \code{c(lower, upper)} x-axis limits. #' @param ylim numeric vector of two values specifying the #' \code{c(lower, upper)} y-axis limits. #' @param annotate string defining whether to added values to the group labels #' of the legend. When \code{"none"} (default) is specified no #' annotations are added. Specifying (\code{"depth"}) adds #' sequence counts to the labels. #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso #' See \link{AbundanceCurve} for the input object and \link{estimateAbundance} for #' generating the input abundance distribution. #' Plotting is performed with \link{ggplot}. #' #' @examples #' # Estimate abundance by sample and plot #' abund <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) #' plotAbundanceCurve(abund, legend_title="Sample") #' #' @export plotAbundanceCurve <- function(data, colors=NULL, main_title="Rank Abundance", legend_title=NULL, xlim=NULL, ylim=NULL, annotate=c("none", "depth"), silent=FALSE, ...) { # Check if abundance is in data if (is.null(data@abundance)) { stop("Missing abundance data.") } # Check arguments annotate <- match.arg(annotate) # Define group label annotations if (all(is.na(data@groups)) || length(data@groups) == 1) { group_labels <- NA } else if (annotate == "none") { group_labels <- setNames(data@groups, data@groups) } else if (annotate == "depth") { group_labels <- setNames(paste0(data@groups, " (N=", data@n, ")"), data@groups) } # Stupid hack for check NOTE about `.x` in math_format .x <- NULL if (!all(is.na(group_labels))) { # Define grouped plot p1 <- ggplot(data@abundance, aes_string(x="rank", y="p", group=data@group_by)) + ggtitle(main_title) + baseTheme() + xlab("Rank") + ylab("Abundance") + scale_x_log10(limits=xlim, breaks=scales::trans_breaks("log10", function(x) 10^x), labels=scales::trans_format("log10", scales::math_format(10^.x))) + scale_y_continuous(labels=scales::percent) + geom_ribbon(aes_string(ymin="lower", ymax="upper", fill=data@group_by), alpha=0.4) + geom_line(aes_string(color=data@group_by)) # Set colors and legend if (!is.null(colors)) { p1 <- p1 + scale_color_manual(name=legend_title, labels=group_labels, values=colors) + scale_fill_manual(name=legend_title, labels=group_labels, values=colors) } else { p1 <- p1 + scale_color_discrete(name=legend_title, labels=group_labels) + scale_fill_discrete(name=legend_title, labels=group_labels) } } else { # Set color if (!is.null(colors) & length(colors) == 1) { line_color <- colors } else { line_color <- "black" } # Define plot p1 <- ggplot(data@abundance, aes_string(x="rank", y="p")) + ggtitle(main_title) + baseTheme() + xlab("Rank") + ylab("Abundance") + scale_x_log10(limits=xlim, breaks=scales::trans_breaks("log10", function(x) 10^x), labels=scales::trans_format("log10", scales::math_format(10^.x))) + scale_y_continuous(labels=scales::percent) + geom_ribbon(aes_string(ymin="lower", ymax="upper"), fill=line_color, alpha=0.4) + geom_line(color=line_color) } # Add additional theme elements p1 <- p1 + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) } #' Plot the results of alphaDiversity #' #' \code{plotDiversityCurve} plots a \code{DiversityCurve} object. #' #' @param data \link{DiversityCurve} object returned by #' \link{alphaDiversity}. #' @param colors named character vector whose names are values in the #' \code{group} column of the \code{data} slot of \code{data}, #' and whose values are colors to assign to those group names. #' @param main_title string specifying the plot title. #' @param legend_title string specifying the legend title. #' @param log_x if \code{TRUE} then plot \eqn{q} on a log scale; #' if \code{FALSE} plot on a linear scale. #' @param log_y if \code{TRUE} then plot the diversity/evenness scores #' on a log scale; if \code{FALSE} plot on a linear scale. #' @param xlim numeric vector of two values specifying the #' \code{c(lower, upper)} x-axis limits. #' @param ylim numeric vector of two values specifying the #' \code{c(lower, upper)} y-axis limits. #' @param annotate string defining whether to added values to the group labels #' of the legend. When \code{"none"} (default) is specified no #' annotations are added. Specifying (\code{"depth"}) adds #' sequence counts to the labels. #' @param score one of \code{"diversity"} or \code{"evenness"} specifying which #' score to plot on the y-asis. #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso See \link{alphaDiversity} and \link{alphaDiversity} for generating #' \link{DiversityCurve} objects for input. Plotting is performed with \link{ggplot}. #' #' @examples #' # Calculate diversity #' div <- alphaDiversity(ExampleDb, group="sample_id", nboot=100) #' #' # Plot diversity #' plotDiversityCurve(div, legend_title="Sample") #' #' #' # Plot diversity #' plotDiversityCurve(div, legend_title="Sample", score="evenness") #' #' @export plotDiversityCurve <- function(data, colors=NULL, main_title="Diversity", legend_title="Group", log_x=FALSE, log_y=FALSE, xlim=NULL, ylim=NULL, annotate=c("none", "depth"), score=c("diversity", "evenness"), silent=FALSE, ...) { # Check arguments annotate <- match.arg(annotate) score <- match.arg(score) # Define group label annotations if (all(is.na(data@groups)) || length(data@groups) == 1) { group_labels <- NA } else if (annotate == "none") { group_labels <- setNames(data@groups, data@groups) } else if (annotate == "depth") { group_labels <- setNames(paste0(data@groups, " (n=", data@n, ")"), data@groups) } # Define y-axis scores if (score == "diversity") { y_value <- "d" y_min <- "d_lower" y_max <- "d_upper" y_label <- expression(''^q * D) } else if (score == "evenness") { y_value <- "e" y_min <- "e_lower" y_max <- "e_upper" y_label <- expression(''^q * e) } # Stupid hack for check NOTE about `.x` in math_format .x <- NULL if (!all(is.na(group_labels))) { # Define grouped plot p1 <- ggplot(data@diversity, aes_string(x="q", y=y_value, group=data@group_by)) + ggtitle(main_title) + baseTheme() + xlab('q') + ylab(y_label) + geom_ribbon(aes_string(ymin=y_min, ymax=y_max, fill=data@group_by), alpha=0.4) + geom_line(aes_string(color=data@group_by)) # Set colors and legend if (!is.null(colors)) { p1 <- p1 + scale_color_manual(name=legend_title, labels=group_labels, values=colors) + scale_fill_manual(name=legend_title, labels=group_labels, values=colors) } else { p1 <- p1 + scale_color_discrete(name=legend_title, labels=group_labels) + scale_fill_discrete(name=legend_title, labels=group_labels) } } else { # Set color if (!is.null(colors) & length(colors) == 1) { line_color <- colors } else { line_color <- "black" } # Define ungrouped plot p1 <- ggplot(data@diversity, aes_string(x="q", y=y_value)) + ggtitle(main_title) + baseTheme() + xlab('q') + ylab(y_label) + geom_ribbon(aes_string(ymin=y_min, ymax=y_max), fill=line_color, alpha=0.4) + geom_line(color=line_color) } # Set x-axis style if (log_x) { p1 <- p1 + scale_x_continuous(trans=scales::log2_trans(), limits=xlim, breaks=scales::trans_breaks('log2', function(x) 2^x), labels=scales::trans_format('log2', scales::math_format(2^.x))) } else { p1 <- p1 + scale_x_continuous(limits=xlim) } # Set y-axis style if (log_y) { p1 <- p1 + scale_y_continuous(trans=scales::log2_trans(), limits=ylim, breaks=scales::trans_breaks('log2', function(x) 2^x), labels=scales::trans_format('log2', scales::math_format(2^.x))) } else { p1 <- p1 + scale_y_continuous(limits=ylim) } # Add additional theme elements p1 <- p1 + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) } #' Plot the results of diversity testing #' #' \code{plotDiversityTest} plots summary data for a \code{DiversityCurve} object #' with mean and a line range indicating plus/minus one standard deviation. #' #' @param data \link{DiversityCurve} object returned by #' \link{alphaDiversity}. #' @param q diversity order to plot the test for. #' @param colors named character vector whose names are values in the #' \code{group} column of the \code{data} slot of \code{data}, #' and whose values are colors to assign to those group names. #' @param main_title string specifying the plot title. #' @param legend_title string specifying the legend title. #' @param log_d if \code{TRUE} then plot the diversity scores \eqn{D} #' on a log scale; if \code{FALSE} plot on a linear scale. #' @param annotate string defining whether to added values to the group labels #' of the legend. When \code{"none"} (default) is specified no #' annotations are added. Specifying (\code{"depth"}) adds #' sequence counts to the labels. #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso See \link{alphaDiversity} for generating input. #' Plotting is performed with \link{ggplot}. #' #' @examples #' # Calculate diversity #' div <- alphaDiversity(ExampleDb, group="sample_id", min_q=0, max_q=2, step_q=1, nboot=100) #' #' # Plot results at q=0 (equivalent to species richness) #' plotDiversityTest(div, 0, legend_title="Sample") #' #' # Plot results at q=2 (equivalent to Simpson's index) #' plotDiversityTest(div, q=2, legend_title="Sample") #' #' @export plotDiversityTest <- function(data, q, colors=NULL, main_title="Diversity", legend_title="Group", log_d=FALSE, annotate=c("none", "depth"), silent=FALSE, ...) { # Stupid hack for check NOTE about `.x` in math_format .x <- NULL # Check arguments annotate <- match.arg(annotate) # Check if abundance is in data if (is.null(data@tests)) { stop("Test data missing from input object.") } # Check if q is in data if (!(q %in% data@q)) { stop("Test for order q=", q, " not found in input object.") } # Define group label annotations if (annotate == "none") { group_labels <- setNames(data@groups, data@groups) } else if (annotate == "depth") { group_labels <- setNames(paste0(data@groups, " (N=", data@n, ")"), data@groups) } # Define plot values df <- data@diversity %>% dplyr::filter(!!rlang::sym("q") == !!rlang::enquo(q)) %>% dplyr::mutate(lower=!!rlang::sym("d") - !!rlang::sym("d_sd"), upper=!!rlang::sym("d") + !!rlang::sym("d_sd")) # Define base plot elements p1 <- ggplot(df, aes_string(x=data@group_by)) + ggtitle(main_title) + baseTheme() + xlab("") + ylab(bquote("Mean " ^ .(q) * D %+-% "SD")) + geom_linerange(aes_string(ymin="lower", ymax="upper", color=data@group_by), alpha=0.8) + geom_point(aes_string(y="d", color=data@group_by)) # Set colors and legend if (!is.null(colors)) { p1 <- p1 + scale_color_manual(name=legend_title, labels=group_labels, values=colors) } else { p1 <- p1 + scale_color_discrete(name=legend_title, labels=group_labels) } # Set x-axis style if (log_d) { p1 <- p1 + scale_y_continuous(trans=scales::log2_trans(), breaks=scales::trans_breaks('log2', function(x) 2^x), labels=scales::trans_format('log2', scales::math_format(2^.x))) } else { p1 <- p1 + scale_y_continuous() } # Add additional theme elements p1 <- p1 + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) } alakazam/R/sysdata.rda0000644000175000017500000000200314067624107014530 0ustar nileshnileshBZh91AY&SY!4/h0 @!,F%5MMM4 @hi44b!M(p40jb4zz@d@ Dp4$&ALjhzM@hUlRMxI¯Am /B՞P(H!FűXTN%  u`)^RI@A]ƊnYERLctS6&AsL&8M9R F76)b1v3(!CSn-[f'b,'ds $I ﰁGEĉJL"&\d@HhtI{%C""D& $ M„OРB <0 U dAX5 TŧC9C ˉ-r!FeJ_l;0eW4LUX,ٍ0Q*$HVQ.[|ȩnIe_zR N"G%4c&a*'np[~v `_M(Nc]L[ 1GxfaG&|8ruGJgb|Y ĸc=W`#(騈 1+*0 VDd`@[IC 0쇅y̰gN&ReEGɋ]SWZ`@ T̄TʵE)301}g'3I]VgE#VEŝ2 Қа eLdb[7@mNBۧ_ѿVmUN/H652 ԣKMJU~ursUIۙ زZ$vA lH3 7ZjPe:(h$١~[(~-J@qsE~2C6X/V*G.p!8Bhalakazam/R/Fastq.R0000644000175000017500000005772314067624107013614 0ustar nileshnilesh#' Load sequencing quality scores from a FASTQ file #' #' \code{readFastqDb} adds the sequencing quality scores to a data.frame #' from a FASTQ file. Matching is done by `sequence_id`. #' #' @param data \code{data.frame} containing sequence data. #' @param fastq_file path to the fastq file #' @param quality_offset offset value to be used by ape::read.fastq. It is #' the value to be added to the quality scores #' (the default -33 applies to the Sanger format and #' should work for most recent FASTQ files). #' @param header FASTQ file header format; one of \code{"presto"} or #' \code{"asis"}. Use \code{"presto"} to specify #' that the fastq file headers are using the pRESTO #' format and can be parsed to extract #' the \code{sequence_id}. Use \code{"asis"} to skip #' any processing and use the sequence names as they are. #' @param sequence_id column in \code{data} that contains sequence #' identifiers to be matched to sequence identifiers in #' \code{fastq_file}. #' @param sequence column in \code{data} that contains sequence data. #' @param sequence_alignment column in \code{data} that contains IMGT aligned sequence data. #' @param v_cigar column in \code{data} that contains CIGAR #' strings for the V gene alignments. #' @param d_cigar column in \code{data} that contains CIGAR #' strings for the D gene alignments. #' @param j_cigar column in \code{data} that contains CIGAR #' strings for the J gene alignments. #' @param np1_length column in \code{data} that contains the number #' of nucleotides between the V gene and first D gene #' alignments or between the V gene and J gene alignments. #' @param np2_length column in \code{data} that contains the number #' of nucleotides between either the first D gene and J #' gene alignments or the first D gene and second D gene #' alignments. #' @param v_sequence_end column in \code{data} that contains the #' end position of the V gene in \code{sequence}. #' @param d_sequence_end column in \code{data} that contains the #' end position of the D gene in \code{sequence}. #' @param style how the sequencing quality should be returned; #' one of \code{"num"}, \code{"phred"}, or \code{"both"}. #' Specify \code{"num"} to store the quality scores as strings of #' comma separated numeric values. Use \code{"phred"} to have #' the function return the scores as Phred (ASCII) scores. #' Use \code{"both"} to retrieve both. #' @param quality_sequence specify \code{TRUE} to keep the quality scores for #' \code{sequence}. If false, only the quality score #' for \code{sequence_alignment} will be added to \code{data}. #' #' @return Modified \code{data} with additional fields: #' \enumerate{ #' \item \code{quality_alignment}: A character vector with ASCII Phred #' scores for \code{sequence_alignment}. #' \item \code{quality_alignment_num}: A character vector, with comma separated #' numerical quality values for each #' position in \code{sequence_alignment}. #' \item \code{quality}: A character vector with ASCII Phred #' scores for \code{sequence}. #' \item \code{quality_num}: A character vector, with comma separated #' numerical quality values for each #' position in \code{sequence}. #' } #' @seealso \link{maskPositionsByQuality} and \link{getPositionQuality} #' #' @examples #' db <- airr::read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) #' fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") #' db <- readFastqDb(db, fastq_file, quality_offset=-33) #' #' @export readFastqDb <- function(data, fastq_file, quality_offset=-33, header=c("presto", "asis"), sequence_id="sequence_id", sequence="sequence", sequence_alignment="sequence_alignment", v_cigar="v_cigar", d_cigar="d_cigar", j_cigar="j_cigar", np1_length="np1_length", np2_length="np2_length", v_sequence_end="v_sequence_end", d_sequence_end="d_sequence_end", style=c("num", "ascii", "both"), quality_sequence=FALSE) { check_cols <- c(sequence_id, sequence, sequence_alignment, v_cigar, d_cigar, j_cigar, np1_length, np2_length, v_sequence_end, d_sequence_end) alakazam::checkColumns(data, check_cols) style <- match.arg(style) # Process the fastq file header <- match.arg(header) fastq <- ape::read.fastq(fastq_file, offset=quality_offset) #default: -33 (pRESTO) fastq_db <- data.frame( "quality_num"=as.vector(sapply(attr(fastq, "QUAL"), paste0, collapse=",")), stringsAsFactors = F) fastq_db$quality <- sapply(fastq_db[["quality_num"]], function(qual, quality_offset) { paste0(sapply(strsplit(qual, ",")[[1]], function(x,quality_offset) { y <- as.numeric(x) - quality_offset rawToChar(as.raw(y)) },quality_offset), sep="",collapse="") }, quality_offset) fastq_db[[sequence_id]] <- attr(fastq, "names") if (header=="presto") { fastq_db[[sequence_id]] <- gsub("\\|.+","",attr(fastq, "names")) } # Merge by <- sequence_id names(by) <- sequence_id data <- data %>% left_join(fastq_db, by=by) data <- sequenceAlignmentQuality(data, sequence=sequence, sequence_id=sequence_id, sequence_alignment=sequence_alignment, quality="quality", quality_num="quality_num", v_cigar=v_cigar, d_cigar=d_cigar, j_cigar=j_cigar, np1_length=np1_length, np2_length=np2_length, v_sequence_end=v_sequence_end, d_sequence_end=d_sequence_end, raw=FALSE) if (!quality_sequence) { data[['quality']] <- NULL data[['quality_num']] <- NULL } if (style != "both") { if (style == "phred") { data[['quality_alignment_num']] <- NULL } else { data[['quality_alignment']] <- NULL } } data } # Thanks!: # https://drive5.com/usearch/manual/cigar.html & # https://jef.works/blog/2017/03/28/CIGAR-strings-for-dummies/ # M Match (alignment column containing two letters). This could contain two # letters (mismatch) or two identical letters. USEARCH generates CIGAR strings # containing Ms rather than X's and ='s (see below). # N Alignment gap Next x positions on ref don’t match (Deletion in query?) # D Deletion (gap in the target sequence). # I Insertion (gap in the query sequence). # S Segment of the query sequence that does not appear in the alignment. # This is used with soft clipping, where the full-length query sequence # is given (field 10 in the SAM record). In this case, S operations specify # segments at the start and/or end of the query that do not appear in a # local alignment. # H Segment of the query sequence that does not appear in the alignment. # This is used with hard clipping, where only the aligned segment of the # query sequences is given (field 10 in the SAM record). In this case, H # operations specify segments at the start and/or end of the query that # do not appear in the SAM record. # = Alignment column containing two identical letters. USEARCH can read # CIGAR strings using this operation, but does not generate them. # X Alignment column containing a mismatch, i.e. two different letters. # USEARCH can read CIGAR strings using this operation, but does not generate them. # Tested with IgBlast output, not with IMGT calcSequenceAlignmentQuality <- function(sequence_db, sequence="sequence", sequence_id="sequence_id", sequence_alignment="sequence_alignment", quality="quality", quality_num="quality_num", v_cigar="v_cigar", d_cigar="d_cigar", j_cigar="j_cigar", np1_length="np1_length", np2_length="np2_length", v_sequence_end="v_sequence_end", d_sequence_end="d_sequence_end", raw=FALSE) { # query sequence sequence <- sequence_db[[sequence]] quality_phred <- strsplit(sequence_db[[quality]],"")[[1]] quality_num_values <- strsplit(sequence_db[[quality_num]],",")[[1]] v_cigar <- sequence_db[[v_cigar]] vd_pseudo_cigar <- NA if (!is.na(sequence_db[[np1_length]])) { if (sequence_db[[np1_length]]>0) { vd_pseudo_cigar <- paste0(sequence_db[[v_sequence_end]],"S",sequence_db[[np1_length]],"X") } } d_cigar <- sequence_db[[d_cigar]] dj_pseudo_cigar <- NA if (!is.na(sequence_db[[np2_length]])) { if (sequence_db[[np2_length]]>0){ dj_pseudo_cigar <- paste0(sequence_db[[d_sequence_end]],"S",sequence_db[[np2_length]],"X") } } j_cigar <- sequence_db[[j_cigar]] cigars <- c(v_cigar, vd_pseudo_cigar, d_cigar, dj_pseudo_cigar, j_cigar) cigars <- cigars[!is.na(cigars)] ranges <- bind_rows(lapply(cigars, function(cigar) { ops <- GenomicAlignments::explodeCigarOps(cigar)[[1]] lengths <- GenomicAlignments::explodeCigarOpLengths(cigar)[[1]] keep <- ops %in% c("N", "I") == F ops <- ops[keep] lengths <- lengths[keep] ranges <- data.frame( "start"=rep(NA, length(ops)), "end"=NA, "width"=lengths, "operator"=ops, stringsAsFactors = F) ranges[['start']][1] <- 1 for (i in 1:nrow(ranges)) { if (ranges[['operator']][i] %in% c("S","=","X","D")) { ranges[['end']][i] <- ranges[['start']][i]+ranges[['width']][i]-1 } if (i+1<=nrow(ranges)) { ranges[['start']][i+1] <- ranges[['end']][i]+1 } } ranges <- ranges %>% filter(!!rlang::sym("operator") %in% c("S","D") == FALSE) ranges })) iranges <- IRanges(start=ranges[['start']], end=ranges[['end']], width=ranges[['width']]) reconstruced_sequence_alignment <- extractAt(BString(sequence), iranges) reconstruced_sequence_alignment <- paste0(sapply(reconstruced_sequence_alignment, toString), collapse="") positions <- unlist(sapply(1:nrow(ranges), function(i) { ranges$start[i]:ranges$end[i]})) quality_df <- data.frame( "reconstructed_sequence_alignment"=paste0(sapply(reconstruced_sequence_alignment, toString),collapse=""), "sequence_position"=positions, "sequence_alignment_position"=NA, stringsAsFactors = F ) %>% mutate ( !!rlang::sym(quality) := quality_phred[positions], !!rlang::sym(quality_num) := as.numeric(quality_num_values)[positions], !!rlang::sym(sequence_id) := sequence_db[[sequence_id]]) # Sanity check. Just to be sure reconstruction is working correctly, # and be sure I will later transfer the quality scores correctly sequence_alignment <- sequence_db[[sequence_alignment]] expected <- gsub("[\\.-]","",sequence_alignment) if (reconstruced_sequence_alignment != expected) { stop("Reconstructed sequence_alignment from cigar doesn't match db sequence_alignment.") } # map position numbering: sequence input positions <--> aligned positions nt_aln <- strsplit(sequence_alignment,"")[[1]] for ( aln_position in 1:length(nt_aln)) { if (nt_aln[aln_position] %in% c(".","-") == FALSE ) { pos <- sum(nt_aln[1:aln_position] %in% c(".","-") == F) quality_df[['sequence_alignment_position']][pos] <- aln_position quality_df[['sequence_alignment_nt']][pos] <- nt_aln[aln_position] } } if (raw) { quality_df %>% select(-!!rlang::sym("reconstructed_sequence_alignment")) } else { qual_num <- rep(NA, length(nt_aln)) qual_num[quality_df[['sequence_alignment_position']]] <- quality_df[[quality_num]] qual_num <- paste0(qual_num, sep="", collapse=",") qual_phred <- rep(" ", length(nt_aln)) qual_phred[quality_df[['sequence_alignment_position']]] <- quality_df[[quality]] qual_phred <- paste0(qual_phred, sep="", collapse="") ret <- data.frame( "quality_alignment_num"=qual_num, "quality_alignment"=qual_phred, stringsAsFactors = F ) %>% mutate(!!rlang::sym(sequence_id) := sequence_db[[sequence_id]]) ret } } # Retrieve sequencing quality scores from tabular data # # \code{sequenceAlignmentQuality} is used internally by \code{readFastqDb} to # process the sequencing quality scores loaded from a \code{fastq} file. # # Once a repertoire \code{data.frame} has been processed with \link{readFastqDb} and # contains the fields \code{quality} and \code{quality_num}, # \code{sequenceAlignmentQuality} can be used to retrieve the quality scores # from the already present field \code{quality_num}, without requiring # again the \code{fastq} file, and report them as a \code{data.frame} with sequencing # qualities per position, not as a string. This is done setting \code{raw=TRUE}. # This \code{data.frame} with qualities per position can be used to generate figures, # for example. # # @param data \code{data.frame} containing sequence data. # @param sequence_id column in \code{data} that contains sequence # identifiers to be matched to sequence identifiers in # \code{fastq_file}. # @param sequence column in \code{data} that contains sequence data. # @param sequence_alignment column in \code{data} that contains # IMGT aligned sequence data. # @param quality column in \code{data} that contains # sequencing quality as Phred scores. # @param quality_num column in \code{data} that contains # sequencing quality as a comma separated string. # @param v_cigar column in \code{data} that contains CIGAR # strings for the V gene alignments. # @param d_cigar column in \code{data} that contains CIGAR # strings for the D gene alignments. # @param j_cigar column in \code{data} that contains CIGAR # strings for the J gene alignments. # @param np1_length column in \code{data} that contains the number # of nucleotides between the V gene and first D gene # alignments or between the V gene and J gene alignments. # @param np2_length column in \code{data} that contains the number # of nucleotides between either the first D gene and J # gene alignments or the first D gene and second D gene # alignments. # @param v_sequence_end column in \code{data} that contains the # end position of the V gene in \code{sequence}. # @param d_sequence_end column in \code{data} that contains the # end position of the D gene in \code{sequence}. # @param raw specify how the sequencing quality should be returned. # If \code{TRUE}, return a \code{data.frame} with # quality information per position, where each row is # a position. This \code{data.frame} has columns # "sequence_position", "sequence_alignment_position", # "quality", "quality_num", "sequence_id" # and "sequence_alignment_nt" If \code{FALSE}, for each sequence, # concatenate the position qualities in a string, and the # quality information to \code{data} sequenceAlignmentQuality <- function(data, sequence_id="sequence_id", sequence="sequence", sequence_alignment="sequence_alignment", quality="quality", quality_num="quality_num", v_cigar="v_cigar", d_cigar="d_cigar", j_cigar="j_cigar", np1_length="np1_length", np2_length="np2_length", v_sequence_end="v_sequence_end", d_sequence_end="d_sequence_end", raw=FALSE) { pb <- progressBar(nrow(data)) qual <- bind_rows(lapply(1:nrow(data),function(i) { pb$tick() calcSequenceAlignmentQuality(data[i,], sequence=sequence, sequence_id=sequence_id, sequence_alignment=sequence_alignment, quality=quality, quality_num=quality_num, v_cigar=v_cigar, d_cigar=d_cigar, j_cigar=j_cigar, np1_length=np1_length, np2_length=np2_length, v_sequence_end=v_sequence_end, d_sequence_end=d_sequence_end, raw=raw) })) if (raw) { qual } else { data %>% dplyr::left_join(qual, by=sequence_id) } } #' Mask sequence positions with low quality #' #' \code{maskPositionsByQuality} will replace positions that #' have a sequencing quality score lower that \code{min_quality} with an #' \code{"N"} character. #' #' #' @param data \code{data.frame} containing sequence data. #' @param min_quality minimum quality score. Positions with sequencing quality #' less than \code{min_qual} will be masked. #' @param sequence column in \code{data} with sequence data to be masked. #' @param quality_num column in \code{data} with quality scores (a #' string of numeric values, comma separated) that can #' be used to mask \code{sequence}. #' #' @return Modified \code{data} data.frame with an additional field containing #' quality masked sequences. The name of this field is created #' concatenating the \code{sequence} name and \code{"_masked"}. #' #' @seealso \link{readFastqDb} and \link{getPositionQuality} #' #' @examples #' db <- airr::read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) #' fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") #' db <- readFastqDb(db, fastq_file, quality_offset=-33) #' maskPositionsByQuality(db, min_quality=90, quality_num="quality_alignment_num") #' #' @export maskPositionsByQuality <- function(data, min_quality=70, sequence="sequence_alignment", quality_num="quality_alignment_num") { required_cols <- c(sequence,quality_num) checkColumns(data, required_cols) sequence_masked <- paste0(sequence,"_masked") num_masked_seqs <- 0 data <- bind_rows(lapply(1:nrow(data), function(i) { db_row <- data[i,] seq_qual <- strsplit(db_row[[quality_num]],",")[[1]] low_seq_qual <- which(sapply(seq_qual, function(x) { if (x != "NA") { as.numeric(x) < min_quality } else { NA } }, USE.NAMES = FALSE)) if (length(low_seq_qual)>0) { num_masked_seqs <<- num_masked_seqs + 1 seq <- strsplit(db_row[[sequence]],"")[[1]] seq[low_seq_qual] <- "N" seq <- paste0(seq, collapse="") db_row[[sequence_masked]] <- seq } db_row })) message("Number of masked sequences: ", num_masked_seqs) data } #' Get a data.frame with sequencing qualities per position #' #' \code{getPositionQuality} takes a data.frame with sequence quality scores #' in the form of a strings of comma separated numeric values, split the quality #' scores values by \code{","}, and returns a data.frame with the values #' for each position. #' #' #' @param data \code{data.frame} containing sequence data. #' @param sequence_id column in \code{data} with sequence identifiers. #' @param sequence column in \code{data} with sequence data. #' @param quality_num column in \code{data} with quality scores (as #' strings of numeric values, comma separated) for \code{sequence}. #' #' @return \code{data} with one additional field with masked sequences. The #' name of this field is created concatenating \code{sequence} #' and '_masked'. #' #' @seealso \link{readFastqDb} and \link{maskPositionsByQuality} #' #' @examples #' db <- airr::read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) #' fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") #' db <- readFastqDb(db, fastq_file, quality_offset=-33) #' head(getPositionQuality(db)) # #' @export getPositionQuality <- function(data, sequence_id="sequence_id", sequence="sequence_alignment", quality_num="quality_alignment_num") { checkColumns(data, c(sequence, quality_num)) bind_rows(lapply(1:nrow(data), function(i) { seq_id <- data[[sequence_id]][i] seq_len <- nchar(data[[sequence]][i]) qual_values <- as.numeric(strsplit(data[[quality_num]][i],",")[[1]]) nt <- strsplit(data[[sequence]],"")[[1]] if (seq_len != length(qual_values)) { stop("Different length, for sequence: ", seq_id,". seq: ", sequence, ". qual: ", quality_num) } data.frame( "position"=1:seq_len, stringsAsFactors = F) %>% mutate(!!rlang::sym(quality_num) := qual_values, !!rlang::sym(sequence_id) := seq_id, nt = nt) })) } alakazam/R/Alakazam.R0000644000175000017500000001762614137015775014260 0ustar nileshnilesh# Alakazam package documentation and import directives #' The alakazam package #' #' \code{alakazam} in a member of the Immcantation framework of tools and serves five main #' purposes: #' \itemize{ #' \item Providing core functionality for other R packages in Immcantation. This #' includes common tasks such as file I/O, basic DNA sequence manipulation, and #' interacting with V(D)J segment and gene annotations. #' \item Providing an R interface for interacting with the output of the pRESTO and #' Change-O tool suites. #' \item Performing clonal abundance and diversity analysis on lymphocyte repertoires. #' \item Performing lineage reconstruction on clonal populations of immunoglobulin #' (Ig) sequences. #' \item Performing physicochemical property analyses of lymphocyte receptor sequences. #' } #' For additional details regarding the use of the \code{alakazam} package see the #' vignettes:\cr #' \code{browseVignettes("alakazam")} #' #' @section File I/O: #' \itemize{ #' \item \link{readChangeoDb}: Input Change-O style files. #' \item \link{writeChangeoDb}: Output Change-O style files. #' } #' #' @section Sequence cleaning: #' \itemize{ #' \item \link{maskSeqEnds}: Mask ragged ends. #' \item \link{maskSeqGaps}: Mask gap characters. #' \item \link{collapseDuplicates}: Remove duplicate sequences. #' } #' #' @section Lineage reconstruction: #' \itemize{ #' \item \link{makeChangeoClone}: Clean sequences for lineage reconstruction. #' \item \link{buildPhylipLineage}: Perform lineage reconstruction of Ig sequences. #' } #' #' @section Lineage topology analysis: #' \itemize{ #' \item \link{tableEdges}: Tabulate annotation relationships over edges. #' \item \link{testEdges}: Significance testing of annotation edges. #' \item \link{testMRCA}: Significance testing of MRCA annotations. #' \item \link{summarizeSubtrees}: Various summary statistics for subtrees. #' \item \link{plotSubtrees}: Plot distributions of summary statistics #' for a population of trees. #' } #' #' @section Diversity analysis: #' \itemize{ #' \item \link{countClones}: Calculate clonal abundance. #' \item \link{estimateAbundance}: Bootstrap clonal abundance curves. #' \item \link{alphaDiversity}: Generate clonal alpha diversity curves. #' \item \link{plotAbundanceCurve}: Plot clone size distribution as a rank-abundance #' \item \link{plotDiversityCurve}: Plot clonal diversity curves. #' \item \link{plotDiversityTest}: Plot testing at given diversity hill indicex. #' } #' #' @section Ig and TCR sequence annotation: #' \itemize{ #' \item \link{countGenes}: Calculate Ig and TCR allele, gene and family usage. #' \item \link{extractVRegion}: Extract CDRs and FWRs sub-sequences. #' \item \link{getAllele}: Get V(D)J allele names. #' \item \link{getGene}: Get V(D)J gene names. #' \item \link{getFamily}: Get V(D)J family names. #' \item \link{junctionAlignment}: Junction alignment properties #' } #' #' @section Sequence distance calculation: #' \itemize{ #' \item \link{seqDist}: Calculate Hamming distance between two sequences. #' \item \link{seqEqual}: Test two sequences for equivalence. #' \item \link{pairwiseDist}: Calculate a matrix of pairwise Hamming distances for a #' set of sequences. #' \item \link{pairwiseEqual}: Calculate a logical matrix of pairwise equivalence for a #' set of sequences. #' } #' #' @section Amino acid propertes: #' \itemize{ #' \item \link{translateDNA}: Translate DNA sequences to amino acid sequences. #' \item \link{aminoAcidProperties}: Calculate various physicochemical properties of amino acid #' sequences. #' \item \link{countPatterns}: Count patterns in sequences. #' #' } #' #' @name alakazam #' @docType package #' @references #' \enumerate{ #' \item Vander Heiden JA, Yaari G, et al. pRESTO: a toolkit for processing #' high-throughput sequencing raw reads of lymphocyte receptor repertoires. #' Bioinformatics. 2014 30(13):1930-2. #' \item Stern JNH, Yaari G, Vander Heiden JA, et al. B cells populating the multiple #' sclerosis brain mature in the draining cervical lymph nodes. #' Sci Transl Med. 2014 6(248):248ra107. #' \item Wu Y-CB, et al. Influence of seasonal exposure to grass pollen on local and #' peripheral blood IgE repertoires in patients with allergic rhinitis. #' J Allergy Clin Immunol. 2014 134(3):604-12. #' \item Gupta NT, Vander Heiden JA, et al. Change-O: a toolkit for analyzing #' large-scale B cell immunoglobulin repertoire sequencing data. #' Bioinformatics. 2015 Oct 15;31(20):3356-8. #' } #' #' @import ggplot2 #' @import graphics #' @import methods #' @import utils #' @importFrom airr read_rearrangement write_rearrangement #' @importFrom ape read.tree di2multi reorder.phylo root ladderize #' @importFrom Biostrings BString extractAt #' @importFrom dplyr do n desc %>% #' bind_cols bind_rows combine arrange left_join #' group_by ungroup #' filter slice select #' mutate mutate_at #' one_of if_else #' right_join rowwise #' summarize summarize_at #' transmute rename #' @importFrom GenomicAlignments explodeCigarOps explodeCigarOpLengths #' @importFrom igraph V E graph_from_data_frame as_data_frame as_edgelist #' make_graph make_directed_graph make_undirected_graph #' vertex_attr set_vertex_attr #' degree shortest_paths all_shortest_paths distances #' graph_from_adjacency_matrix components groups #' @importFrom IRanges IRanges #' @importFrom Matrix sparseMatrix rowSums #' @importFrom progress progress_bar #' @importFrom readr read_delim read_tsv write_delim write_tsv cols #' @importFrom rlang := sym syms enquo #' @importFrom scales log2_trans log10_trans trans_breaks trans_format #' math_format percent scientific pretty_breaks #' @importFrom seqinr translate s2c #' @importFrom stats na.omit setNames ecdf sd cor cov median mad #' dbinom pbinom qbinom rbinom #' dnorm pnorm qnorm rnorm #' dmultinom rmultinom #' @importFrom stringi stri_dup stri_flatten stri_join stri_length #' stri_count_boundaries stri_count_fixed #' stri_count_regex stri_extract_all_regex #' stri_extract_first_regex stri_replace_all_regex #' stri_replace_first_regex stri_split_fixed #' stri_pad_left stri_pad_right #' stri_detect_fixed stri_paste #' @importFrom tibble tibble #' @importFrom tidyr complete gather #' @importFrom Rcpp evalCpp #' @useDynLib alakazam, .registration=TRUE NULL # Package loading actions .onAttach <- function(libname, pkgname) { msg <- paste("As of v1.0.0 the AIRR Rearrangement schema is now the default file format.", "A description of the standard is available at https://docs.airr-community.org.", "The legacy Change-O format is supported through arguments to each function", "that allow the input column names to be explicitly defined.", sep="\n") packageStartupMessage(msg) } alakazam/R/Data.R0000644000175000017500000003171614067624107013401 0ustar nileshnilesh# Documentation and definitions for data and constants #### Sysdata #### # 1x20 vector of default amino acid hydropathy scores # HYDROPATHY_KYTJ82 # 1x20 vector of default amino acid bulkiness scores # BULKINESS_ZIMJ68 # 1x20 vector of default amino acid polarity scores # POLARITY_GRAR74 # 1x7 vector of default amino acid pK values # PK_EMBOSS #### Data #### #' Example AIRR database #' #' A small example database subset from Laserson and Vigneault et al, 2014. #' #' @format A data.frame with the following AIRR style columns: #' \itemize{ #' \item \code{sequence_id}: Sequence identifier #' \item \code{sequence_alignment}: IMGT-gapped observed sequence. #' \item \code{germline_alignment}: IMGT-gapped germline sequence. #' \item \code{germline_alignment_d_mask}: IMGT-gapped germline sequence with N, P and #' D regions masked. #' \item \code{v_call}: V region allele assignments. #' \item \code{v_call_genotyped}: TIgGER corrected V region allele assignment. #' \item \code{d_call}: D region allele assignments. #' \item \code{j_call}: J region allele assignments. #' \item \code{c_call}: Isotype (C region) assignment. #' \item \code{junction}: Junction region sequence. #' \item \code{junction_length}: Length of the junction region in nucleotides. #' \item \code{np1_length}: Combined length of the N and P regions proximal #' to the V region. #' \item \code{np2_length}: Combined length of the N and P regions proximal #' to the J region. #' \item \code{duplicate_count}: Copy count (number of duplicates) of the sequence. #' \item \code{clone_id}: Change-O assignment clonal group identifier. #' \item \code{sample_id}: Sample identifier. Time in relation to vaccination. #' } #' #' @seealso \link{ExampleDbChangeo} \link{ExampleTrees} #' #' @references #' \enumerate{ #' \item Laserson U and Vigneault F, et al. High-resolution antibody dynamics of #' vaccine-induced immune responses. #' Proc Natl Acad Sci USA. 2014 111:4928-33. #' } "ExampleDb" #' Single sequence AIRR database #' #' A database with just one sequence from \code{ExampleDb} and additional AIRR Rearrangement fields #' containing alignment information. The sequence was reanalyzed with a recent versions of #' alignment software (IgBLAST 1.16.0) and reference germlines (IMGT 2020-08-12). #' #' @seealso \link{ExampleDb} "SingleDb" #' Example Change-O database #' #' A small example database subset from Laserson and Vigneault et al, 2014. #' #' @format A data.frame with the following Change-O style columns: #' \itemize{ #' \item \code{SEQUENCE_ID}: Sequence identifier #' \item \code{SEQUENCE_IMGT}: IMGT-gapped observed sequence. #' \item \code{GERMLINE_IMGT_D_MASK}: IMGT-gapped germline sequence with N, P and #' D regions masked. #' \item \code{V_CALL}: V region allele assignments. #' \item \code{V_CALL_GENOTYPED}: TIgGER corrected V region allele assignment. #' \item \code{D_CALL}: D region allele assignments. #' \item \code{J_CALL}: J region allele assignments. #' \item \code{JUNCTION}: Junction region sequence. #' \item \code{JUNCTION_LENGTH}: Length of the junction region in nucleotides. #' \item \code{NP1_LENGTH}: Combined length of the N and P regions proximal #' to the V region. #' \item \code{NP2_LENGTH}: Combined length of the N and P regions proximal #' to the J region. #' \item \code{SAMPLE}: Sample identifier. Time in relation to vaccination. #' \item \code{ISOTYPE}: Isotype assignment. #' \item \code{DUPCOUNT}: Copy count (number of duplicates) of the sequence. #' \item \code{CLONE}: Change-O assignment clonal group identifier. #' } #' #' @seealso \link{ExampleDb} \link{ExampleTrees} #' #' @references #' \enumerate{ #' \item Laserson U and Vigneault F, et al. High-resolution antibody dynamics of #' vaccine-induced immune responses. #' Proc Natl Acad Sci USA. 2014 111:4928-33. #' } "ExampleDbChangeo" #' Small example 10x Genomics Ig V(D)J sequences from CD19+ B cells isolated from PBMCs of a healthy #' human donor. Down-sampled from data provided by 10x Genomics under a Creative Commons Attribute license, #' and processed with their Cell Ranger pipeline. #' #' @format A data.frame with the following AIRR style columns: #' \itemize{ #' \item \code{sequence_id}: Sequence identifier #' \item \code{sequence_alignment}: IMGT-gapped observed sequence. #' \item \code{germline_alignment}: IMGT-gapped germline sequence. #' \item \code{v_call}: V region allele assignments. #' \item \code{d_call}: D region allele assignments. #' \item \code{j_call}: J region allele assignments. #' \item \code{c_call}: Isotype (C region) assignment. #' \item \code{junction}: Junction region sequence. #' \item \code{junction_length}: Length of the junction region in nucleotides. #' \item \code{np1_length}: Combined length of the N and P regions proximal #' to the V region. #' \item \code{np2_length}: Combined length of the N and P regions proximal #' to the J region. #' \item \code{umi_count}: Number of unique molecular identifies atttributed to sequence. #' \item \code{cell_id}: Cell identifier. #' \item \code{locus}: Genomic locus of sequence. #' } #' #' #' @references #' \enumerate{ #' \item Data source: https://support.10xgenomics.com/single-cell-vdj/datasets/2.2.0/vdj_v1_hs_cd19_b #' \item License: https://creativecommons.org/licenses/by/4.0/ #' } "Example10x" #' Example Ig lineage trees #' #' A set of Ig lineage trees generated from the \code{ExampleDb} file, subset to #' only those trees with at least four nodes. #' #' @format A list of igraph objects output by \link{buildPhylipLineage}. #' Each node of each tree has the following annotations (vertex attributes): #' \itemize{ #' \item \code{sample_id}: Sample identifier(s). Time in relation to vaccination. #' \item \code{c_call}: Isotype assignment(s). #' \item \code{duplication_count}: Copy count (number of duplicates) of the sequence. #' } #' #' @seealso \link{ExampleTrees} "ExampleTrees" #### Constants #### #' Default colors #' #' Default color palettes for DNA characters, Ig isotypes, and TCR chains. #' #' @format Named character vectors with hexcode colors as values. #' \itemize{ #' \item \code{DNA_COLORS}: DNA character colors #' \code{c("A", "C", "G", "T")}. #' \item \code{IG_COLORS}: Ig isotype colors #' \code{c("IGHA", "IGHD", "IGHE", "IGHG", "IGHM", "IGHK", "IGHL")}. #' \item \code{TR_COLORS}: TCR chain colors #' \code{c("TRA", "TRB", "TRD", "TRG")}. #' } #' #' @examples #' # IG_COLORS as an isotype color set for ggplot #' isotype <- c("IGHG", "IGHM", "IGHM", "IGHA") #' db <- data.frame(x=1:4, y=1:4, iso=isotype) #' g1 <- ggplot(db, aes(x=x, y=y, color=iso)) + #' scale_color_manual(name="Isotype", values=IG_COLORS) + #' geom_point(size=10) #' plot(g1) #' #' # DNA_COLORS to translate nucleotide values to a vector of colors #' # for use in base graphics plots #' seq <- c("A", "T", "T", "C") #' colors <- translateStrings(seq, setNames(names(DNA_COLORS), DNA_COLORS)) #' plot(1:4, 1:4, col=colors, pch=16, cex=6) #' #' @name DEFAULT_COLORS NULL #' @rdname DEFAULT_COLORS #' @export DNA_COLORS <- c("A"="#64F73F", "C"="#FFB340", "G"="#EB413C", "T"="#3C88EE") #' @rdname DEFAULT_COLORS #' @export IG_COLORS <- c("IGHA"="#377EB8", "IGHD"="#FF7F00", "IGHE"="#E41A1C", "IGHG"="#4DAF4A", "IGHM"="#984EA3", "IGHK"="#E5C494", "IGHL"="#FFD92F") #' @rdname DEFAULT_COLORS #' @export TR_COLORS <- c("TRA"="#CBD5E8", "TRB"="#F4CAE4", "TRD"="#FDCDAC", "TRG"="#E6F5C9") #' IUPAC ambiguous characters #' #' A translation list mapping IUPAC ambiguous characters code to corresponding nucleotide #' amino acid characters. #' #' @format A list with single character codes as names and values containing character #' vectors that define the set of standard characters that match to each each #' ambiguous character. #' \itemize{ #' \item \code{IUPAC_DNA}: DNA ambiguous character translations. #' \item \code{IUPAC_AA}: Amino acid ambiguous character translations. #' \item \code{DNA_IUPAC}: Ordered DNA to ambiguous characters #' } #' #' @name IUPAC_CODES NULL #' @rdname IUPAC_CODES #' @export IUPAC_DNA <- list("A"="A", "C"="C", "G"="G", "T"="T", "M"=c("A","C"), "R"=c("A","G"), "W"=c("A","T"), "S"=c("C","G"), "Y"=c("C","T"), "K"=c("G","T"), "V"=c("A","C","G"), "H"=c("A","C","T"), "D"=c("A","G","T"), "B"=c("C","G","T"), "N"=c("A","C","G","T")) #' @rdname IUPAC_CODES #' @export IUPAC_AA <- list("A"="A", "B"=c("N","R"), "C"="C", "D"="D", "E"="E", "F"="F", "G"="G", "H"="H", "I"="I", "J"=c("I","L"), "K"="K", "L"="L", "M"="M", "N"="N", "P"="P", "Q"="Q", "R"="R", "S"="S", "T"="T", "V"="V", "W"="W", "X"=c("A","B","C","D","E","F","G","H", "I","J","K","L","M","N","P","Q", "R","S","T","V","W","X","Y","Z", "*"), "Y"="Y", "Z"=c("E","Q"), "*"="*") #' @rdname IUPAC_CODES #' @export DNA_IUPAC <- list( "A"="A", "C"="C", "G"="G", "T"="T", "AC"="M", "AG"="R", "AT"="W", "CG"="S", "CT"="Y", "GT"="K", "ACG"="V", "ACT"="H", "AGT"="D", "CGT"="B", "ACGT"="N") #' Amino acid abbreviation translations #' #' Mappings of amino acid abbreviations. #' #' @format Named character vector defining single-letter character codes to #' three-letter abbreviation mappings. #' #' @name ABBREV_AA #' #' @examples #' aa <- c("Ala", "Ile", "Trp") #' translateStrings(aa, ABBREV_AA) #' #' @export ABBREV_AA <- c("A"="Ala", "R"="Arg", "N"="Asn", "D"="Asp", "C"="Cys", "Q"="Gln", "E"="Glu", "G"="Gly", "H"="His", "I"="Ile", "L"="Leu", "K"="Lys", "M"="Met", "F"="Phe", "P"="Pro", "S"="Ser", "T"="Thr", "W"="Trp", "Y"="Tyr", "V"="Val") #' IMGT V-segment regions #' #' A list defining the boundaries of V-segment framework regions (FWRs) and complementarity #' determining regions (CDRs) for IMGT-gapped immunoglobulin (Ig) nucleotide sequences #' according to the IMGT numbering scheme. #' #' @format A list with regions named one of \code{c("fwr1", "cdr1", "fwr2", "cdr2", "fwr3")} #' with values containing a numeric vector of length two defining the #' \code{c(start, end)} positions of the named region. #' #' @references #' \url{http://imgt.org} #' #' @export IMGT_REGIONS <- list("fwr1"=c(1, 78), "cdr1"=c(79, 114), "fwr2"=c(115, 165), "cdr2"=c(166, 195), "fwr3"=c(196, 312))alakazam/R/Topology.R0000644000175000017500000010726214137536274014351 0ustar nileshnilesh# Ig lineage topology analysis #' @include Classes.R NULL #### Graph analysis functions #### #' Generate subtree summary statistics for a tree #' #' \code{summarizeSubtrees} calculates summary statistics for each node of a tree. Includes #' both node properties and subtree properties. #' #' @param graph igraph object containing an annotated lineage tree. #' @param fields annotation fields to add to the output. #' @param root name of the root (germline) node. #' #' @return A data.frame with columns: #' \itemize{ #' \item \code{name}: node name. #' \item \code{parent}: name of the parent node. #' \item \code{outdegree}: number of edges leading from the node. #' \item \code{size}: total number of nodes within the subtree rooted #' at the node. #' \item \code{depth}: the depth of the subtree that is rooted at #' the node. #' \item \code{pathlength}: the maximum pathlength beneath the node. #' \item \code{outdegree_norm}: \code{outdegree} normalized by the total #' number of edges. #' \item \code{size_norm}: \code{size} normalized by the largest #' subtree size (the germline). #' \item \code{depth_norm}: \code{depth} normalized by the largest #' subtree depth (the germline). #' \item \code{pathlength_norm}: \code{pathlength} normalized by the largest #' subtree pathlength (the germline). #' } #' An additional column corresponding to the value of \code{field} is added when #' specified. #' #' @seealso See \link{buildPhylipLineage} for generating input trees. #' See \link{getPathLengths} for calculating path length to nodes. #' #' @examples #' # Summarize a tree #' graph <- ExampleTrees[[23]] #' summarizeSubtrees(graph, fields="c_call", root="Germline") #' #' @export summarizeSubtrees <- function(graph, fields=NULL, root="Germline") { ## DEBUG # root="Germline"; fields=NULL # TODO: should probably include a means to exclude inferred from substree size # Define node attribute data.frame node_df <- data.frame(name=V(graph)$name, stringsAsFactors=F) for (f in fields) { node_df[[f]] <- vertex_attr(graph, name=f) } # Get edges edges <- igraph::as_edgelist(graph) # Get unweighted paths paths_step <- suppressWarnings(igraph::distances(graph, mode="out", algorithm="unweighted")) paths_step[!is.finite(paths_step)] <- NA # Get weighted paths paths_length <- igraph::distances(graph, mode="out", algorithm="dijkstra") paths_length[!is.finite(paths_length)] <- NA # Define each node's parent node_df$parent <- edges[, 1][match(node_df$name, edges[, 2])] # Define each node's outdegree node_df$outdegree <- igraph::degree(graph, mode="out") # Define the number of nodes in each subtree (child count + 1) node_df$size <- apply(paths_step, 1, function(x) length(na.omit(x))) # Define number of levels below each node node_df$depth <- apply(paths_step, 1, max, na.rm=TRUE) + 1 # Define the maximum shortest path length (genetic distance) to a leaf from each node node_df$pathlength <- apply(paths_length, 1, max, na.rm=TRUE) # Normalize node_df <- node_df %>% dplyr::mutate( outdegree_norm=!!rlang::sym("outdegree")/sum(!!rlang::sym("outdegree"), na.rm=TRUE), size_norm=!!rlang::sym("size")/max(!!rlang::sym("size"), na.rm=TRUE), depth_norm=!!rlang::sym("depth")/max(!!rlang::sym("depth"), na.rm=TRUE), pathlength_norm=!!rlang::sym("pathlength")/max(!!rlang::sym("pathlength"), na.rm=TRUE)) return(node_df) } #' Calculate path lengths from the tree root #' #' \code{getPathLengths} calculates the unweighted (number of steps) and weighted (distance) #' path lengths from the root of a lineage tree. #' #' @param graph igraph object containing an annotated lineage tree. #' @param root name of the root (germline) node. #' @param field annotation field to use for exclusion of nodes from step count. #' @param exclude annotation values specifying which nodes to exclude from step count. #' If \code{NULL} consider all nodes. This does not affect the weighted #' (distance) path length calculation. #' #' @return A data.frame with columns: #' \itemize{ #' \item \code{name}: node name #' \item \code{steps}: path length as the number of nodes traversed #' \item \code{distance}: path length as the sum of edge weights #' } #' #' @seealso See \link{buildPhylipLineage} for generating input trees. #' #' @examples #' # Define example graph #' graph <- ExampleTrees[[24]] #' #' # Consider all nodes #' getPathLengths(graph, root="Germline") #' #' # Exclude nodes without an isotype annotation from step count #' getPathLengths(graph, root="Germline", field="c_call", exclude=NA) #' #' @export getPathLengths <- function(graph, root="Germline", field=NULL, exclude=NULL) { # Define path length data.frame path_df <- data.frame(name=V(graph)$name, stringsAsFactors=FALSE) # Get indices of excluded vertices skip_idx <- which(path_df$name == root) if (!is.null(field)) { g <- vertex_attr(graph, name=field) skip_idx <- union(skip_idx, which(g %in% exclude)) } # Get paths step_list <- shortest_paths(graph, root, mode="out", weights=NA, output="vpath") step_list <- step_list$vpath # Get path lengths for (i in 1:length(step_list)) { v <- step_list[[i]] path_df[i, "steps"] <- sum(!(v %in% skip_idx)) path_df[i, "distance"] <- sum(E(graph, path=v)$weight) } return(path_df) } #' Retrieve the first non-root node of a lineage tree #' #' \code{getMRCA} returns the set of lineage tree nodes with the minimum weighted or #' unweighted path length from the root (germline) of the lineage tree, allowing for #' exclusion of specific groups of nodes. #' #' @param graph igraph object containing an annotated lineage tree. #' @param path string defining whether to use unweighted (steps) or weighted (distance) #' measures for determining the founder node set.. #' @param root name of the root (germline) node. #' @param field annotation field to use for both unweighted path length exclusion and #' consideration as an MRCA node. If \code{NULL} do not exclude any nodes. #' @param exclude vector of annotation values in \code{field} to exclude from the potential #' MRCA set. If \code{NULL} do not exclude any nodes. Has no effect if #' \code{field=NULL}. #' #' @return A data.frame of the MRCA node(s) containing the columns: #' \itemize{ #' \item \code{name}: node name #' \item \code{steps}: path length as the number of nodes traversed #' \item \code{distance}: path length as the sum of edge weights #' } #' Along with additional columns corresponding to the #' annotations of the input graph. #' #' @seealso Path lengths are determined with \link{getPathLengths}. #' #' @examples #' # Define example graph #' graph <- ExampleTrees[[23]] #' #' # Use unweighted path length and do not exclude any nodes #' getMRCA(graph, path="steps", root="Germline") #' #' # Exclude nodes without an isotype annotation and use weighted path length #' getMRCA(graph, path="distance", root="Germline", field="c_call", exclude=NA) #' #' @export getMRCA <- function(graph, path=c("distance", "steps"), root="Germline", field=NULL, exclude=NULL) { # Check arguments path <- match.arg(path) # Get distance from root path_df <- getPathLengths(graph, root=root, field=field, exclude=exclude) # Get indices of excluded vertices skip_idx <- which(path_df$name == root) if (!is.null(field)) { g <- vertex_attr(graph, name=field) skip_idx <- union(skip_idx, which(g %in% exclude)) } # Get founder nodes if (path == "distance") { path_len <- setNames(path_df$distance, 1:nrow(path_df)) } else if (path == "steps") { path_len <- setNames(path_df$steps, 1:nrow(path_df)) } else { stop("Invalid value for 'path' parameter. Must be one of c('distance', 'steps').\n") } path_len <- path_len[-skip_idx] root_idx <- as.numeric(names(path_len)[which(path_len == min(path_len))]) root_df <- igraph::as_data_frame(graph, what="vertices")[root_idx, ] root_df$steps <- path_df$steps[root_idx] root_df$distance <- path_df$distance[root_idx] # Switch name column to uppercase names(root_df)[names(root_df) == "name"] <- "name" return(root_df) } #' Tabulate the number of edges between annotations within a lineage tree #' #' \code{tableEdges} creates a table of the total number of connections (edges) for each #' unique pair of annotations within a tree over all nodes. #' #' @param graph igraph object containing an annotated lineage tree. #' @param field string defining the annotation field to count. #' @param indirect if \code{FALSE} count direct connections (edges) only. If #' \code{TRUE} walk through any nodes with annotations specified in #' the \code{argument} to count indirect connections. Specifying #' \code{indirect=TRUE} with \code{exclude=NULL} will have no effect. #' @param exclude vector of strings defining \code{field} values to exclude from counts. #' Edges that either start or end with the specified annotations will not #' be counted. If \code{NULL} count all edges. #' #' @return A data.frame defining total annotation connections in the tree with columns: #' \itemize{ #' \item \code{parent}: parent annotation #' \item \code{child}: child annotation #' \item \code{count}: count of edges for the parent-child relationship #' } #' #' @seealso See \link{testEdges} for performed a permutation test on edge relationships. #' #' @examples #' # Define example graph #' graph <- ExampleTrees[[23]] #' #' # Count direct edges between isotypes including inferred nodes #' tableEdges(graph, "c_call") #' #' # Count direct edges excluding edges to and from germline and inferred nodes #' tableEdges(graph, "c_call", exclude=c("Germline", NA)) #' #' # Count indirect edges walking through germline and inferred nodes #' tableEdges(graph, "c_call", indirect=TRUE, exclude=c("Germline", NA)) #' #' @export tableEdges <- function(graph, field, indirect=FALSE, exclude=NULL) { # Function to retrieve the name if x is exactly one vertex index and NULL otherwise .getSingleVertex <- function(x) { if (length(x) == 1) { vertex_attr(graph, name=field, index=x[1]) } else { NULL } } if (indirect) { # Get indices of excluded and retained vertices if (!is.null(exclude)) { f <- vertex_attr(graph, name=field) skip_idx <- which(f %in% exclude) keep_idx <- as.numeric(V(graph))[-skip_idx] } else { skip_idx <- NULL keep_idx <- as.numeric(V(graph)) } # Iterate over nodes and count indirect parent-child connections edge_list <- list() for (i in keep_idx) { # Get parent annotation parent <- vertex_attr(graph, name=field, index=i) # Get indirect child node annotations step_list <- suppressWarnings(shortest_paths(graph, V(graph)[i], mode="out", weights=NA, output="vpath")) step_list <- unique(lapply(step_list$vpath, function(x) x[!(x %in% c(i, skip_idx))])) children <- unlist(lapply(step_list, .getSingleVertex)) # Define data.frame of connections if (length(children) > 0) { edge_list[[i]] <- data.frame("parent"=parent, "child"=children, stringsAsFactors=FALSE) } } # Merge edge list into data.frame edge_df <- bind_rows(edge_list) } else { # Get adjacency list edge_mat <- as_edgelist(graph, names=FALSE) edge_mat <- vertex_attr(graph, name=field, index=edge_mat) edge_mat <- matrix(edge_mat, ncol=2, dimnames=list(NULL, c("parent", "child"))) # Build and subset edge data.frame edge_df <- as.data.frame(edge_mat, stringsAsFactors=FALSE) edge_df <- edge_df[!(edge_df$parent %in% exclude) & !(edge_df$child %in% exclude), ] } # Count edges edge_tab <- edge_df %>% group_by(!!!rlang::syms(c("parent", "child"))) %>% dplyr::summarize(count=n()) return(edge_tab) } #' Permute the node labels of a tree #' #' \code{permuteLabels} permutes the node annotations of a lineage tree. #' #' @param graph igraph object containing an annotated lineage tree. #' @param field string defining the annotation field to permute. #' @param exclude vector of strings defining \code{field} values to exclude #' from permutation. #' #' @return A modified igraph object with vertex annotations permuted. #' #' @seealso \link{testEdges}. #' #' @examples #' # Define and plot example graph #' library(igraph) #' graph <- ExampleTrees[[23]] #' plot(graph, layout=layout_as_tree, vertex.label=V(graph)$c_call, #' vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") #' #' # Permute annotations and plot new tree #' g <- permuteLabels(graph, "c_call") #' plot(g, layout=layout_as_tree, vertex.label=V(g)$c_call, #' vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") #' #' @export permuteLabels <- function(graph, field, exclude=c("Germline", NA)) { # Determine which nodes to permute labels <- vertex_attr(graph, name=field) i <- which(!(labels %in% exclude)) # Return input on insufficient number of nodes if (length(i) < 2) { warning("Only 1 node to permute\n") return(graph) } # Sample and reassign field values s <- sample(i) perm <- set_vertex_attr(graph, name=field, index=i, value=labels[s]) return(perm) } #### Test functions #### #' Tests for MRCA annotation enrichment in lineage trees #' #' \code{testMRCA} performs a permutation test on a set of lineage trees to determine #' the significance of an annotation's association with the MRCA position of the lineage #' trees. #' #' @param graphs list of igraph object containing annotated lineage trees. #' @param field string defining the annotation field to test. #' @param root name of the root (germline) node. #' @param exclude vector of strings defining \code{field} values to exclude from the #' set of potential founder annotations. #' @param nperm number of permutations to perform. #' @param progress if \code{TRUE} show a progress bar. #' #' @return An \link{MRCATest} object containing the test results and permutation #' realizations. #' #' @seealso Uses \link{getMRCA} and \link{getPathLengths}. #' See \link{plotMRCATest} for plotting the permutation distributions. #' #' @examples #' \donttest{ #' # Define example tree set #' graphs <- ExampleTrees[1-10] #' #' # Perform MRCA test on isotypes #' x <- testMRCA(graphs, "c_call", nperm=10) #' print(x) #' } #' #' @export testMRCA <- function(graphs, field, root="Germline", exclude=c("Germline", NA), nperm=200, progress=FALSE) { # Function to resolve ambiguous founders # @param x data.frame from getMRCA # @param field annotation field .resolveMRCA <- function(x, field) { x %>% filter(!duplicated(!!rlang::sym(field))) %>% filter(length(!!rlang::sym(field)) == 1) } # Function to count MRCAs # @param x list of graphs # @param field annotation field # @param exclude vector of annotation values to exclude .countMRCA <- function(x, field, exclude) { # Get MRCAs mrca_list <- lapply(x, getMRCA, path="distance", field=field, exclude=exclude) # Resolve ambiguous MRCAs mrca_list <- lapply(mrca_list, .resolveMRCA, field=field) # Summarize MRCA counts mrca_sum <- bind_rows(mrca_list, .id="GRAPH") %>% select(!!!rlang::syms(c("GRAPH", field))) %>% rename("annotation"=field) %>% group_by(!!rlang::sym("annotation")) %>% dplyr::summarize(count=n()) return(mrca_sum) } # Assign numeric names if graphs is an unnamed list if (is.null(names(graphs))) { names(graphs) <- 1:length(graphs) } # Summarize observed MRCA counts obs_sum <- .countMRCA(graphs, field=field, exclude=exclude) # Generate edge null distribution via permutation if (progress) { pb <- progressBar(nperm) } perm_list <- list() for (i in 1:nperm) { # Permute labels tmp_list <- lapply(graphs, permuteLabels, field=field, exclude=exclude) # Summarize MRCA counts tmp_sum <- .countMRCA(tmp_list, field=field, exclude=exclude) # Update permutation set tmp_sum$iter <- i perm_list[[i]] <- tmp_sum if (progress) { pb$tick() } } cat("\n") perm_sum <- bind_rows(perm_list) # Test observed against permutation distribution for (i in 1:nrow(obs_sum)) { x <- obs_sum$annotation[i] # Annotation count distribution d <- perm_sum$count[perm_sum$annotation == x] # Expected mean obs_sum[i, "expected"] <- mean(d) # P-value for observed > expected f <- ecdf(d) obs_sum[i, "pvalue"] <- 1 - f(obs_sum$count[i]) } # Generate return object mrca_test <- new("MRCATest", tests=as.data.frame(obs_sum), permutations=as.data.frame(perm_sum), nperm=nperm) return(mrca_test) } #' Tests for parent-child annotation enchrichment in lineage trees #' #' \code{testEdges} performs a permutation test on a set of lineage trees to determine #' the significance of an annotation's association with parent-child relationships. #' #' @param graphs list of igraph objects with vertex annotations. #' @param field string defining the annotation field to permute. #' @param indirect if \code{FALSE} count direct connections (edges) only. If #' \code{TRUE} walk through any nodes with annotations specified in #' the \code{argument} to count indirect connections. Specifying #' \code{indirect=TRUE} with \code{exclude=NULL} will have no effect. #' @param exclude vector of strings defining \code{field} values to exclude from #' permutation. #' @param nperm number of permutations to perform. #' @param progress if \code{TRUE} show a progress bar. #' #' @return An \link{EdgeTest} object containing the test results and permutation #' realizations. #' #' @seealso Uses \link{tableEdges} and \link{permuteLabels}. #' See \link{plotEdgeTest} for plotting the permutation distributions. #' #' @examples #' \donttest{ #' # Define example tree set #' graphs <- ExampleTrees[1-10] #' #' # Perform edge test on isotypes #' x <- testEdges(graphs, "c_call", nperm=10) #' print(x) #' } #' #' @export testEdges <- function(graphs, field, indirect=FALSE, exclude=c("Germline", NA), nperm=200, progress=FALSE) { ## DEBUG # field="c_call"; exclude=c("Germline", NA); nperm=200 # Assign numeric names if graphs is an unnamed list if (is.null(names(graphs))) { names(graphs) <- 1:length(graphs) } # Function to count edge annotations # @param x list of graphs # @param field annotation field # @param exclude vector of annotation values to exclude .countEdges <- function(x, field, exclude) { edge_list <- lapply(x, tableEdges, field=field, indirect=indirect, exclude=exclude) edge_sum <- bind_rows(edge_list) %>% group_by(!!!rlang::syms(c("parent", "child"))) %>% dplyr::summarize(count=sum(!!rlang::sym("count"), na.rm=TRUE)) return(edge_sum) } # Count edges of observed data obs_sum <- .countEdges(graphs, field, exclude) if (nrow(obs_sum) == 0) { stop("No valid edges found in graphs") } # Generate edge null distribution via permutation if (progress) { pb <- progressBar(nperm) } perm_list <- list() for (i in 1:nperm) { # Permute annotations tmp_list <- lapply(graphs, permuteLabels, field=field, exclude=exclude) # Count edges tmp_sum <- .countEdges(tmp_list, field, exclude) # Update permutation set tmp_sum$iter <- i perm_list[[i]] <- tmp_sum if (progress) { pb$tick() } } perm_sum <- bind_rows(perm_list) # Test observed against permutation distribution for (i in 1:nrow(obs_sum)) { x <- obs_sum$parent[i] y <- obs_sum$child[i] # Edge count distribution d <- perm_sum$count[perm_sum$parent == x & perm_sum$child == y] # Expected mean obs_sum[i, "expected"] <- mean(d) # P-value for observed > expected f <- ecdf(d) obs_sum[i, "pvalue"] <- 1 - f(obs_sum$count[i]) } # Generate return object edge_test <- new("EdgeTest", tests=as.data.frame(obs_sum), permutations=as.data.frame(perm_sum), nperm=nperm) return(edge_test) } #### Plotting functions ##### #' Plot the results of an edge permutation test #' #' \code{plotEdgeTest} plots the results of an edge permutation test performed with #' \code{testEdges} as either a histogram or cumulative distribution function. #' #' @param data \link{EdgeTest} object returned by \link{testEdges}. #' @param color color of the histogram or lines. #' @param main_title string specifying the plot title. #' @param style type of plot to draw. One of: #' \itemize{ #' \item \code{"histogram"}: histogram of the edge count #' distribution with a red dotted line #' denoting the observed value. #' \item \code{"cdf"}: cumulative distribution function #' of edge counts with a red dotted #' line denoting the observed value and #' a blue dotted line indicating the #' p-value. #' } #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso See \link{testEdges} for performing the test. #' #' @examples #' \donttest{ #' # Define example tree set #' graphs <- ExampleTrees[1-10] #' #' # Perform edge test on isotypes #' x <- testEdges(graphs, "c_call", nperm=10) #' #' # Plot #' plotEdgeTest(x, color="steelblue", style="hist") #' plotEdgeTest(x, style="cdf") #' } #' #' @export plotEdgeTest <- function(data, color="black", main_title="Edge Test", style=c("histogram", "cdf"), silent=FALSE, ...) { # Check arguments style <- match.arg(style) # Extract plot data obs_sum <- rename(data@tests, "Parent"="parent", "Child"="child") perm_sum <- rename(data@permutations, "Parent"="parent", "Child"="child") if (style == "histogram") { # Plot edge null distribution p1 <- ggplot(perm_sum, aes_string(x="count")) + baseTheme() + ggtitle(main_title) + xlab("Number of edges") + ylab("Number of realizations") + geom_histogram(bins=50, fill=color, color=NA) + geom_vline(data=obs_sum, aes_string(xintercept="count"), color="firebrick", linetype=3, size=0.75) + facet_grid("Child ~ Parent", labeller=label_both, scales="free") } else if (style == "cdf") { # Plot ECDF of edge null distribution p1 <- ggplot(perm_sum, aes_string(x="count")) + baseTheme() + ggtitle(main_title) + xlab("Number of edges") + ylab("P-value") + stat_ecdf(color=color, size=1) + geom_vline(data=obs_sum, aes_string(xintercept="count"), color="firebrick", linetype=3, size=0.75) + geom_hline(data=obs_sum, aes_string(yintercept="pvalue"), color="steelblue", linetype=3, size=0.75) + facet_grid("Child ~ Parent", labeller=label_both, scales="free") } # Add additional theme elements p1 <- p1 + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) } #' Plot the results of a founder permutation test #' #' \code{plotMRCATest} plots the results of a founder permutation test performed with #' \code{testMRCA}. #' #' @param data \link{MRCATest} object returned by \link{testMRCA}. #' @param color color of the histogram or lines. #' @param main_title string specifying the plot title. #' @param style type of plot to draw. One of: #' \itemize{ #' \item \code{"histogram"}: histogram of the annotation count #' distribution with a red dotted line #' denoting the observed value. #' \item \code{"cdf"}: cumulative distribution function #' of annotation counts with a red dotted #' line denoting the observed value and #' a blue dotted line indicating the #' p-value. #' } #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso See \link{testEdges} for performing the test. #' #' @examples #' \donttest{ #' # Define example tree set #' graphs <- ExampleTrees[1-10] #' #' # Perform MRCA test on isotypes #' x <- testMRCA(graphs, "c_call", nperm=10) #' #' # Plot #' plotMRCATest(x, color="steelblue", style="hist") #' plotMRCATest(x, style="cdf") #' } #' #' @export plotMRCATest <- function(data, color="black", main_title="MRCA Test", style=c("histogram", "cdf"), silent=FALSE, ...) { # Check arguments style <- match.arg(style) # Extract plot data obs_sum <- rename(data@tests, "Annotation"="annotation") perm_sum <- rename(data@permutations, "Annotation"="annotation") if (style == "histogram") { # Plot MRCA null distribution p1 <- ggplot(perm_sum, aes_string(x="count")) + baseTheme() + ggtitle(main_title) + xlab("Number of MRCAs") + ylab("Number of realizations") + geom_histogram(fill=color, color=NA, bins=50) + geom_vline(data=obs_sum, aes_string(xintercept="count"), color="firebrick", linetype=3, size=0.75) + facet_wrap("Annotation", ncol=1, scales="free_y") } else if (style == "cdf") { # Plot ECDF of MRCA null distribution p1 <- ggplot(perm_sum, aes_string(x="count")) + baseTheme() + ggtitle(main_title) + xlab("Number of MRCAs") + ylab("P-value") + stat_ecdf(color=color, size=1) + geom_vline(data=obs_sum, aes_string(xintercept="count"), color="firebrick", linetype=3, size=0.75) + geom_hline(data=obs_sum, aes_string(yintercept="pvalue"), color="steelblue", linetype=3, size=0.75) + facet_wrap("Annotation", nrow=1, scales="free_y") } # Add additional theme elements p1 <- p1 + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) } #' Plots subtree statistics for multiple trees #' #' \code{plotSubtree} plots distributions of normalized subtree statistics for a #' set of lineage trees, broken down by annotation value. #' #' @param graphs list of igraph objects containing annotated lineage trees. #' @param field string defining the annotation field. #' @param stat string defining the subtree statistic to plot. One of: #' \itemize{ #' \item \code{outdegree}: distribution of normalized node #' outdegrees. #' \item \code{size}: distribution of normalized subtree sizes. #' \item \code{depth}: distribution of subtree depths. #' \item \code{pathlength}: distribution of maximum pathlength #' beneath nodes. #' } #' @param root name of the root (germline) node. #' @param exclude vector of strings defining \code{field} values to exclude from #' plotting. #' @param colors named vector of colors for values in \code{field}, with #' names defining annotation names \code{field} column and values #' being colors. Also controls the order in which values appear on the #' plot. If \code{NULL} alphabetical ordering and a default color palette #' will be used. #' @param main_title string specifying the plot title. #' @param legend_title string specifying the legend title. #' @param style string specifying the style of plot to draw. One of: #' \itemize{ #' \item \code{"histogram"}: histogram of the annotation count #' distribution with a red dotted line #' denoting the observed value. #' \item \code{"cdf"}: cumulative distribution function #' of annotation counts with a red #' dotted line denoting the observed #' value and a blue dotted line #' indicating the p-value. #' } #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso Subtree statistics are calculated with \link{summarizeSubtrees}. #' #' @examples #' # Define example tree set #' graphs <- ExampleTrees[1-10] #' #' # Violin plots of node outdegree by sample #' plotSubtrees(graphs, "sample_id", "out", style="v") #' #' # Violin plots of subtree size by sample #' plotSubtrees(graphs, "sample_id", "size", style="v") #' #' # Boxplot of node depth by isotype #' plotSubtrees(graphs, "c_call", "depth", style="b") #' #' @export plotSubtrees <- function(graphs, field, stat, root="Germline", exclude=c("Germline", NA), colors=NULL, main_title="Subtrees", legend_title="Annotation", style=c("box", "violin"), silent=FALSE, ...) { # Hack for visibility of special ggplot variables ..x.. <- NULL ## DEBUG # graphs=ExampleTrees; field="c_call"; colors=IG_COLORS; main_title="Outdegree"; root="Germline"; exclude=c("Germline", NA); style="box" # Check arguments style <- match.arg(style, several.ok=FALSE) stat <- match.arg(stat, choices=c("outdegree", "size", "depth", "pathlength"), several.ok=FALSE) # Set stat column and axis labels if (stat == "outdegree") { stat_col <- "outdegree_norm" y_lab <- "Node outdegree" } else if (stat == "size") { stat_col <- "size_norm" y_lab <- "Substree size" } else if (stat == "depth") { stat_col <- "depth_norm" y_lab <- "Depth under node" } else if (stat == "pathlength") { stat_col <- "pathlength_norm" y_lab <- "Path length under node" } else { stop("Invalid value for 'stat'. How did you get here?") } # Assign numeric names if graphs is an unnamed list if (is.null(names(graphs))) { names(graphs) <- 1:length(graphs) } # Get subtree summarizes and filter excluded annotations sum_list <- lapply(graphs, summarizeSubtrees, fields=field, root=root) sum_df <- bind_rows(sum_list, .id="GRAPH") %>% filter(!(!!rlang::sym(field) %in% exclude), is.finite(!!rlang::sym(stat_col))) # Set ordering based on color names if (!is.null(colors)) { # Assign missing levels to grey x <- unique(sum_df[[field]]) x <- sort(x[!(x %in% names(colors))]) if (length(x) > 0) { warning("The following are missing from the 'colors' argument and will be colored grey: ", paste(x, collapse=" ")) x <- setNames(rep("grey", length(x)), x) colors <- c(colors, x) } # Cast to factor sum_df[[field]] <- factor(sum_df[[field]], levels=names(colors)) } else { sum_df[[field]] <- factor(sum_df[[field]]) } # Make plot object p1 <- ggplot(sum_df, aes_string(x=field, y=stat_col)) + baseTheme() + ggtitle(main_title) + xlab("") + ylab(y_lab) + scale_y_continuous(labels=percent) + expand_limits(y=0) # Add distributions style if (style == "box") { p1 <- p1 + geom_boxplot(aes_string(fill=field), width=0.7, alpha=0.8) } else if (style == "violin") { p1 <- p1 + geom_violin(aes_string(fill=field), adjust=1.5, scale="width", trim=T, width=0.7, alpha=0.8) + geom_errorbarh(aes(xmin=..x.. - 0.4, xmax=..x.. + 0.4), color="black", stat="summary", fun="mean", size=1.25, height=0, alpha=0.9) } # Set colors and legend if (!is.null(colors)) { p1 <- p1 + scale_fill_manual(name=legend_title, values=colors) } else { p1 <- p1 + scale_fill_discrete(name=legend_title) } # Add additional theme elements p1 <- p1 + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) }alakazam/R/Deprecated.R0000644000175000017500000002347514067624107014573 0ustar nileshnilesh# Deprecated and defunct functions #' @include Classes.R #' @include Diversity.R NULL #### Deprecated #### #' Generate a clonal diversity index curve #' #' \code{rarefyDiversity} divides a set of clones by a group annotation, #' resamples the sequences from each group, and calculates diversity #' scores (\eqn{D}) over an interval of diversity orders (\eqn{q}). #' #' @param data data.frame with Change-O style columns containing clonal assignments. #' @param group name of the \code{data} column containing group identifiers. #' @param clone name of the \code{data} column containing clone identifiers. #' @param copy name of the \code{data} column containing copy numbers for each #' sequence. If \code{copy=NULL} (the default), then clone abundance #' is determined by the number of sequences. If a \code{copy} column #' is specified, then clone abundances is determined by the sum of #' copy numbers within each clonal group. #' @param min_q minimum value of \eqn{q}. #' @param max_q maximum value of \eqn{q}. #' @param step_q value by which to increment \eqn{q}. #' @param min_n minimum number of observations to sample. #' A group with less observations than the minimum is excluded. #' @param max_n maximum number of observations to sample. If \code{NULL} then no #' maximum is set. #' @param ci confidence interval to calculate; the value must be between 0 and 1. #' @param nboot number of bootstrap realizations to generate. #' @param uniform if \code{TRUE} then uniformly resample each group to the same #' number of observations. If \code{FALSE} then allow each group to #' be resampled to its original size or, if specified, \code{max_size}. #' @param progress if \code{TRUE} show a progress bar. #' #' @return A \link{DiversityCurve} object summarizing the diversity scores. #' #' @details #' Clonal diversity is calculated using the generalized diversity index (Hill numbers) #' proposed by Hill (Hill, 1973). See \link{calcDiversity} for further details. #' #' Diversity is calculated on the estimated complete clonal abundance distribution. #' This distribution is inferred by using the Chao1 estimator to estimate the number #' of seen clones, and applying the relative abundance correction and unseen clone #' frequency described in Chao et al, 2015. #' #' To generate a smooth curve, \eqn{D} is calculated for each value of \eqn{q} from #' \code{min_q} to \code{max_q} incremented by \code{step_q}. When \code{uniform=TRUE} #' variability in total sequence counts across unique values in the \code{group} column #' is corrected by repeated resampling from the estimated complete clonal distribution to a #' common number of sequences. #' #' The diversity index (\eqn{D}) for each group is the mean value of over all resampling #' realizations. Confidence intervals are derived using the standard deviation of the #' resampling realizations, as described in Chao et al, 2015. #' #' @references #' \enumerate{ #' \item Hill M. Diversity and evenness: a unifying notation and its consequences. #' Ecology. 1973 54(2):427-32. #' \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. #' Scand J Stat. 1984 11, 265270. #' \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: #' A framework for sampling and estimation in species diversity studies. #' Ecol Monogr. 2014 84:45-67. #' \item Chao A, et al. Unveiling the species-rank abundance distribution by #' generalizing the Good-Turing sample coverage theory. #' Ecology. 2015 96, 11891201. #' } #' #' @seealso \link{alphaDiversity} #' #' @examples #' \dontrun{ #' # Group by sample identifier #' div <- rarefyDiversity(ExampleDb, "sample_id", step_q=1, max_q=10, nboot=100) #' plotDiversityCurve(div, legend_title="Sample") #' #' # Grouping by isotype rather than sample identifier #' div <- rarefyDiversity(ExampleDb, "c_call", min_n=40, step_q=1, max_q=10, #' nboot=100) #' plotDiversityCurve(div, legend_title="Isotype") #' } #' @export rarefyDiversity <- function(data, group, clone="CLONE", copy=NULL, min_q=0, max_q=4, step_q=0.05, min_n=30, max_n=NULL, ci=0.95, nboot=2000, uniform=TRUE, progress=FALSE) { .Deprecated("alphaDiversity") bootstrap_obj <- estimateAbundance(data, group=group, clone=clone, copy=copy, nboot=nboot, min_n=min_n, max_n=max_n, uniform=uniform, ci=ci) diversity_obj <- alphaDiversity(bootstrap_obj, ci=ci, min_q=min_q, max_q=max_q, step_q) return(diversity_obj) } #' Pairwise test of the diversity index #' #' \code{testDiversity} performs pairwise significance tests of the diversity index #' (\eqn{D}) at a given diversity order (\eqn{q}) for a set of annotation groups via #' rarefaction and bootstrapping. #' #' @param data data.frame with Change-O style columns containing clonal assignments. #' @param q diversity order to test. #' @param group name of the \code{data} column containing group identifiers. #' @param clone name of the \code{data} column containing clone identifiers. #' @param copy name of the \code{data} column containing copy numbers for each #' sequence. If \code{copy=NULL} (the default), then clone abundance #' is determined by the number of sequences. If a \code{copy} column #' is specified, then clone abundances is determined by the sum of #' copy numbers within each clonal group. #' @param min_n minimum number of observations to sample. #' A group with less observations than the minimum is excluded. #' @param max_n maximum number of observations to sample. If \code{NULL} the maximum #' if automatically determined from the size of the largest group. #' @param nboot number of bootstrap realizations to perform. #' @param ci confidence interval to calculate; the value must be between 0 and 1. #' @param progress if \code{TRUE} show a progress bar. #' #' @return A \link{DiversityCurve} object containing slot test with p-values and summary #' statistics. #' #' @details #' Clonal diversity is calculated using the generalized diversity index proposed by #' Hill (Hill, 1973). See \link{calcDiversity} for further details. #' #' Diversity is calculated on the estimated complete clonal abundance distribution. #' This distribution is inferred by using the Chao1 estimator to estimate the number #' of seen clones, and applying the relative abundance correction and unseen clone #' frequency described in Chao et al, 2014. #' #' Variability in total sequence counts across unique values in the \code{group} column is #' corrected by repeated resampling from the estimated complete clonal distribution to #' a common number of sequences. The diversity index estimate (\eqn{D}) for each group is #' the mean value of over all bootstrap realizations. #' #' Significance of the difference in diversity index (\eqn{D}) between groups is tested by #' constructing a bootstrap delta distribution for each pair of unique values in the #' \code{group} column. The bootstrap delta distribution is built by subtracting the diversity #' index \eqn{Da} in \eqn{group-a} from the corresponding value \eqn{Db} in \eqn{group-b}, #' for all bootstrap realizations, yeilding a distribution of \code{nboot} total deltas; where #' \eqn{group-a} is the group with the greater mean \eqn{D}. The p-value for hypothesis #' \eqn{Da != Db} is the value of \eqn{P(0)} from the empirical cumulative distribution #' function of the bootstrap delta distribution, multiplied by 2 for the two-tailed correction. #' #' @note #' This method may inflate statistical significance when clone sizes are uniformly small, #' such as when most clones sizes are 1, sample size is small, and \code{max_n} is near #' the total count of the smallest data group. Use caution when interpreting the results #' in such cases. We are currently investigating this potential problem. #' #' @references #' \enumerate{ #' \item Hill M. Diversity and evenness: a unifying notation and its consequences. #' Ecology. 1973 54(2):427-32. #' \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. #' Scand J Stat. 1984 11, 265270. #' \item Wu Y-CB, et al. Influence of seasonal exposure to grass pollen on local and #' peripheral blood IgE repertoires in patients with allergic rhinitis. #' J Allergy Clin Immunol. 2014 134(3):604-12. #' \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: #' A framework for sampling and estimation in species diversity studies. #' Ecol Monogr. 2014 84:45-67. #' \item Chao A, et al. Unveiling the species-rank abundance distribution by #' generalizing the Good-Turing sample coverage theory. #' Ecology. 2015 96, 11891201. #' } #' #' @seealso \link{alphaDiversity} #' #' @examples #' \dontrun{ #' # Groups under the size threshold are excluded and a warning message is issued. #' testDiversity(ExampleDb, "sample_id", q=0, min_n=30, nboot=100) #' } #' #' @export testDiversity <- function(data, q, group, clone="CLONE", copy=NULL, min_n=30, max_n=NULL, nboot=2000, progress=FALSE, ci=0.95) { .Deprecated("alphaDiversity") abundance_obj <- estimateAbundance(data, group=group, clone=clone, copy=copy, nboot=nboot, min_n=min_n, max_n=max_n, ci=ci) diversity_obj <- alphaDiversity(abundance_obj, min_q=q, max_q=q, step_q=1, ci=ci) return(diversity_obj) } #### Defunct #### alakazam/R/AminoAcids.R0000644000175000017500000006074214067624107014540 0ustar nileshnilesh# Amino acid sequence properties #### Chemical property functions #### #' Calculates the average bulkiness of amino acid sequences #' #' \code{bulk} calculates the average bulkiness score of amino acid sequences. #' Non-informative positions are excluded, where non-informative is defined as any #' character in \code{c("X", "-", ".", "*")}. #' #' @param seq vector of strings containing amino acid sequences. #' @param bulkiness named numerical vector defining bulkiness scores for #' each amino acid, where names are single-letter amino acid #' character codes. If \code{NULL}, then the Zimmerman et al, 1968 #' scale is used. #' #' @return A vector of bulkiness scores for the sequence(s). #' #' @references #' \enumerate{ #' \item Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences #' in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). #' } #' @seealso #' For additional size related indices see \link[seqinr]{aaindex}. #' #' @examples #' # Default bulkiness scale #' seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") #' bulk(seq) #' #' # Use the Grantham, 1974 side chain volumn scores from the seqinr package #' library(seqinr) #' data(aaindex) #' x <- aaindex[["GRAR740103"]]$I #' # Rename the score vector to use single-letter codes #' names(x) <- translateStrings(names(x), ABBREV_AA) #' # Calculate average volume #' bulk(seq, bulkiness=x) #' #' @export bulk <- function(seq, bulkiness=NULL) { # Get bulkiness scores if (is.null(bulkiness)) { bulkiness <- BULKINESS_ZIMJ68 } # Remove non-informative positions seq <- gsub("[X\\.\\*-]", "", as.character(seq)) # Create character vector from string aa <- strsplit(seq, "") # Calculate average bulkiness aa_bulk <- sapply(aa, function(x) sum(bulkiness[x]) / length(x)) return(aa_bulk) } #' Calculates the average polarity of amino acid sequences #' #' \code{polar} calculates the average polarity score of amino acid sequences. #' Non-informative positions are excluded, where non-informative is defined as any #' character in \code{c("X", "-", ".", "*")}. #' #' @param seq vector of strings containing amino acid sequences. #' @param polarity named numerical vector defining polarity scores for #' each amino acid, where names are single-letter amino acid #' character codes. If \code{NULL}, then the Grantham, 1974 #' scale is used. #' #' @return A vector of bulkiness scores for the sequence(s). #' #' @references #' \enumerate{ #' \item Grantham R. Amino acid difference formula to help explain protein evolution. #' Science 185, 862-864 (1974). #' } #' @seealso #' For additional size related indices see \code{\link[seqinr]{aaindex}}. #' #' @examples #' # Default scale #' seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") #' polar(seq) #' #' # Use the Zimmerman et al, 1968 polarity scale from the seqinr package #' library(seqinr) #' data(aaindex) #' x <- aaindex[["ZIMJ680103"]]$I #' # Rename the score vector to use single-letter codes #' names(x) <- translateStrings(names(x), ABBREV_AA) #' # Calculate polarity #' polar(seq, polarity=x) #' #' @export polar <- function(seq, polarity=NULL) { # Get bulkiness scores if (is.null(polarity)) { polarity <- POLARITY_GRAR74 } # Remove non-informative positions seq <- gsub("[X\\.\\*-]", "", as.character(seq)) # Create character vector from string aa <- strsplit(seq, "") # Calculate average polarity aa_polar <- sapply(aa, function(x) sum(polarity[x]) / length(x)) return(aa_polar) } #' Calculates the hydrophobicity of amino acid sequences #' #' \code{gravy} calculates the Grand Average of Hydrophobicity (gravy) index #' of amino acid sequences using the method of Kyte & Doolittle. Non-informative #' positions are excluded, where non-informative is defined as any character in #' \code{c("X", "-", ".", "*")}. #' #' @param seq vector of strings containing amino acid sequences. #' @param hydropathy named numerical vector defining hydropathy index values for #' each amino acid, where names are single-letter amino acid #' character codes. If \code{NULL}, then the Kyte & Doolittle #' scale is used. #' #' @return A vector of gravy scores for the sequence(s). #' #' @references #' \enumerate{ #' \item Kyte J, Doolittle RF. A simple method for displaying the hydropathic character #' of a protein. J Mol Biol. 157, 105-32 (1982). #' } #' @seealso #' For additional hydrophobicity indices see \code{\link[seqinr]{aaindex}}. #' #' @examples #' # Default scale #' seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") #' gravy(seq) #' #' # Use the Kidera et al, 1985 scores from the seqinr package #' library(seqinr) #' data(aaindex) #' x <- aaindex[["KIDA850101"]]$I #' # Rename the score vector to use single-letter codes #' names(x) <- translateStrings(names(x), ABBREV_AA) #' # Calculate hydrophobicity #' gravy(seq, hydropathy=x) #' #' @export gravy <- function(seq, hydropathy=NULL) { # Get hydrophobicity scores if (is.null(hydropathy)) { hydropathy <- HYDROPATHY_KYTJ82 } # Remove non-informative positions seq <- gsub("[X\\.\\*-]", "", as.character(seq)) # Create character vector from string aa <- strsplit(seq, "") # Calculate gravy aa_gravy <- sapply(aa, function(x) sum(hydropathy[x]) / length(x)) return(aa_gravy) } #' Calculates the aliphatic index of amino acid sequences #' #' \code{aliphatic} calculates the aliphatic index of amino acid sequences using #' the method of Ikai. Non-informative positions are excluded, where non-informative #' is defined as any character in \code{c("X", "-", ".", "*")}. #' #' @param seq vector of strings containing amino acid sequences. #' @param normalize if \code{TRUE} then divide the aliphatic index of each amino acid #' sequence by the number of informative positions. Non-informative #' position are defined by the presence any character in #' \code{c("X", "-", ".", "*")}. If \code{FALSE} then return the raw #' aliphatic index. #' #' @return A vector of the aliphatic indices for the sequence(s). #' #' @references #' \enumerate{ #' \item Ikai AJ. Thermostability and aliphatic index of globular proteins. #' J Biochem. 88, 1895-1898 (1980). #' } #' #' @examples #' seq <- c("CARDRSTPWRRGIASTTVRTSW", NA, "XXTQMYVRT") #' aliphatic(seq) #' #' @export aliphatic <- function(seq, normalize=TRUE) { # Calculate aliphatic index for valid amino acids ala <- countOccurrences(seq, "[A]") val <- countOccurrences(seq, "[V]") leu_ile <- countOccurrences(seq, "[LI]") aa_aliphatic = ala + 2.9 * val + 3.9 * leu_ile if (normalize) { aa_aliphatic <- aa_aliphatic / stri_length(gsub("[X\\.\\*-]", "", seq)) } return(aa_aliphatic) } #' Calculates the net charge of amino acid sequences. #' #' \code{charge} calculates the net charge of amino acid sequences using #' the method of Moore, 1985, with exclusion of the C-terminus and N-terminus charges. #' #' @param seq vector strings defining of amino acid sequences. #' @param pH environmental pH. #' @param pK named vector defining pK values for each charged amino acid, #' where names are the single-letter amino acid character codes #' \code{c("R", "H", "K", "D", "E", "C", "Y")}). If \code{NULL}, #' then the EMBOSS scale is used. #' @param normalize if \code{TRUE} then divide the net charge of each amino acid #' sequence by the number of informative positions. Non-informative #' position are defined by the presence any character in #' \code{c("X", "-", ".", "*")}. If \code{FALSE} then return the raw #' net charge. #' #' @return A vector of net charges for the sequence(s). #' #' @references #' \enumerate{ #' \item Moore DS. Amino acid and peptide net charges: A simple calculational procedure. #' Biochem Educ. 13, 10-11 (1985). #' \item \url{http://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} #' } #' #' @seealso #' For additional pK scales see \code{\link[seqinr]{pK}}. #' #' @examples #' seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") #' # Unnormalized charge #' charge(seq) #' # Normalized charge #' charge(seq, normalize=TRUE) #' #' # Use the Murray et al, 2006 scores from the seqinr package #' library(seqinr) #' data(pK) #' x <- setNames(pK[["Murray"]], rownames(pK)) #' # Calculate charge #' charge(seq, pK=x) #' #' @export charge <- function(seq, pH=7.4, pK=NULL, normalize=FALSE) { # Get charge data if(is.null(pK)) { pK <- PK_EMBOSS } # Calculate charge arg <- countOccurrences(seq, "R") * (1/(1 + 10^(1 * (pH - pK["R"])))) his <- countOccurrences(seq, "H") * (1/(1 + 10^(1 * (pH - pK["H"])))) lys <- countOccurrences(seq, "K") * (1/(1 + 10^(1 * (pH - pK["K"])))) asp <- countOccurrences(seq, "D") * (-1/(1 + 10^(-1 * (pH - pK["D"])))) glu <- countOccurrences(seq, "E") * (-1/(1 + 10^(-1 * (pH - pK["E"])))) cys <- countOccurrences(seq, "C") * (-1/(1 + 10^(-1 * (pH - pK["C"])))) tyr <- countOccurrences(seq, "Y") * (-1/(1 + 10^(-1 * (pH - pK["Y"])))) aa_charge <- arg + lys + his + asp + glu + tyr + cys if (normalize) { aa_charge <- aa_charge / stri_length(gsub("[X\\.\\*-]", "", seq)) } return(aa_charge) } #' Validate amino acid sequences #' #' \code{isValidAASeq} checks that a set of sequences are valid non-ambiguous #' amino acid sequences. A sequence is considered valid if it contains only #' characters in the the non-ambiguous IUPAC character set or any characters in #' \code{c("X", ".", "-", "*")}. #' #' @param seq character vector of sequences to check. #' #' @return A logical vector with \code{TRUE} for each valid amino acid sequences #' and \code{FALSE} for each invalid sequence. #' @seealso #' See \link{ABBREV_AA} for the set of non-ambiguous amino acid characters. #' See \link{IUPAC_AA} for the full set of ambiguous amino acid characters. #' #' @examples #' seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVR--XX", "CARJ", "10") #' isValidAASeq(seq) #' #' @export isValidAASeq <- function(seq) { # Get valid amino acids from seqinr # for consistency with `gravy` and other # amino acid properties that don't consider # amino acid ambiguities and special encoded amino acids # http://pir.georgetown.edu/resid/faq.shtml#q01 # Also include here characters for non informative positions valid_AA <- c(names(ABBREV_AA), "X", ".", "*", "-") .isValid <- function(aa) { all(aa %in% valid_AA) } return(sapply(strsplit(seq, ""), .isValid)) # valid_AA <- paste(c(names(ABBREV_AA),"X.*-"),collapse="") # valid <- !grepl(paste0("[^",valid_AA,"]"), seq) & !is.na(seq) # valid } # Count patterns # # Counts the number of times a "pattern" occurs in "x", a string # # @param x a string (usually amino acids) # @param pattern regular expression to be matched in string # # @return number of times the regular expression was found countOccurrences <- function(x, pattern) { return(sapply(gregexpr(pattern, x), function(y) { sum(y > 0) })) } #' Count sequence patterns #' #' \code{countPatterns} counts the fraction of times a set of character patterns occur #' in a set of sequences. #' #' @param seq character vector of either DNA or amino acid sequences. #' @param patterns list of sequence patterns to count in each sequence. If the #' list is named, then names will be assigned as the column names of #' output data.frame. #' @param nt if \code{TRUE} then \code{seq} are DNA sequences and and will be #' translated before performing the pattern search. #' @param trim if \code{TRUE} remove the first and last codon or amino acid from #' each sequence before the pattern search. If \code{FALSE} do #' not modify the input sequences. #' @param label string defining a label to add as a prefix to the output #' column names. #' #' @return A data.frame containing the fraction of times each sequence pattern was #' found. #' #' @examples #' seq <- c("TGTCAACAGGCTAACAGTTTCCGGACGTTC", #' "TGTCAGCAATATTATATTGCTCCCTTCACTTTC", #' "TGTCAAAAGTATAACAGTGCCCCCTGGACGTTC") #' patterns <- c("A", "V", "[LI]") #' names(patterns) <- c("arg", "val", "iso_leu") #' countPatterns(seq, patterns, trim=TRUE, label="cdr3") #' #' @export countPatterns <- function(seq, patterns, nt=TRUE, trim=FALSE, label="region") { # Translate sequences if nucleotide region_aa <- if (nt) { translateDNA(seq, trim=trim) } else { seq } # TODO: What is the proper length normalization? With or without non-informative position? # Calculate region lengths aa_length <- stri_length(region_aa) # Count occurrence of each amino acid pattern for each sequence out_df <- data.frame(matrix(0, nrow=length(region_aa), ncol=length(patterns))) # If patterns are unnamed, make the names X1...Xn if(is.null(names(patterns))) { names(patterns) <- names(out_df) } # If region name, append to names of patterns if(label != '') { names(out_df) <- paste(label, names(patterns), sep="_") } else { names(out_df) <- names(patterns) } # Iterate over patterns for(i in 1:length(patterns)) { out_df[, i] <- countOccurrences(region_aa, patterns[i]) / aa_length } return(out_df) } #' Calculates amino acid chemical properties for sequence data #' #' \code{aminoAcidProperties} calculates amino acid sequence physicochemical properties, including #' length, hydrophobicity, bulkiness, polarity, aliphatic index, net charge, acidic residue #' content, basic residue content, and aromatic residue content. #' #' @param data \code{data.frame} containing sequence data. #' @param property vector strings specifying the properties to be calculated. Defaults #' to calculating all defined properties. #' @param seq \code{character} name of the column containing input #' sequences. #' @param nt boolean, TRUE if the sequences (or sequence) are DNA and will be translated. #' @param trim if \code{TRUE} remove the first and last codon/amino acids from each #' sequence before calculating properties. If \code{FALSE} do #' not modify input sequences. #' @param label name of sequence region to add as prefix to output column names. #' @param ... additional named arguments to pass to the functions #' \link{gravy}, \link{bulk}, \link{aliphatic}, \link{polar} or \link{charge}. #' #' @return A modified \code{data} data.frame with the following columns: #' \itemize{ #' \item \code{*_aa_length}: number of amino acids. #' \item \code{*_aa_gravy}: grand average of hydrophobicity (gravy) index. #' \item \code{*_aa_bulk}: average bulkiness of amino acids. #' \item \code{*_aa_aliphatic}: aliphatic index. #' \item \code{*_aa_polarity}: average polarity of amino acids. #' \item \code{*_aa_charge}: net charge. #' \item \code{*_aa_basic}: fraction of informative positions that are #' Arg, His or Lys. #' \item \code{*_aa_acidic}: fraction of informative positions that are #' Asp or Glu. #' \item \code{*_aa_aromatic}: fraction of informative positions that are #' His, Phe, Trp or Tyr. #' #' } #' #' Where \code{*} is the value from \code{label} or the name specified for #' \code{seq} if \code{label=NULL}. #' #' @details #' For all properties except for length, non-informative positions are excluded, #' where non-informative is defined as any character in \code{c("X", "-", ".", "*")}. #' #' The scores for gravy, bulkiness and polarity are calculated as simple averages of the #' scores for each informative positions. The basic, acid and aromatic indices are #' calculated as the fraction of informative positions falling into the given category. #' #' The aliphatic index is calculated using the Ikai, 1980 method. #' #' The net charge is calculated using the method of Moore, 1985, excluding the N-terminus and #' C-terminus charges, and normalizing by the number of informative positions. The default #' pH for the calculation is 7.4. #' #' The following data sources were used for the default property scores: #' \itemize{ #' \item hydropathy: Kyte & Doolittle, 1982. #' \item bulkiness: Zimmerman et al, 1968. #' \item polarity: Grantham, 1974. #' \item pK: EMBOSS. #' } #' #' @references #' \enumerate{ #' \item Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences #' in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). #' \item Grantham R. Amino acid difference formula to help explain protein evolution. #' Science 185, 862-864 (1974). #' \item Ikai AJ. Thermostability and aliphatic index of globular proteins. #' J Biochem 88, 1895-1898 (1980). #' \item Kyte J, Doolittle RF. A simple method for displaying the hydropathic character #' of a protein. J Mol Biol 157, 105-32 (1982). #' \item Moore DS. Amino acid and peptide net charges: A simple calculational procedure. #' Biochem Educ 13, 10-11 (1985). #' \item Wu YC, et al. High-throughput immunoglobulin repertoire analysis distinguishes #' between human IgM memory and switched memory B-cell populations. #' Blood 116, 1070-8 (2010). #' \item Wu YC, et al. The relationship between CD27 negative and positive B cell #' populations in human peripheral blood. #' Front Immunol 2, 1-12 (2011). #' \item \url{http://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} #' } #' #' @seealso #' See \link{countPatterns} for counting the occurance of specific amino acid subsequences. #' See \link{gravy}, \link{bulk}, \link{aliphatic}, \link{polar} and \link{charge} for functions #' that calculate the included properties individually. #' #' @examples #' # Subset example data #' db <- ExampleDb[c(1,10,100), c("sequence_id", "junction")] #' #' # Calculate default amino acid properties from DNA sequences #' aminoAcidProperties(db, seq="junction") # #' # Calculate default amino acid properties from amino acid sequences #' # Use a custom output column prefix #' db$junction_aa <- translateDNA(db$junction) #' aminoAcidProperties(db, seq="junction_aa", label="junction", nt=FALSE) #' #' # Use the Grantham, 1974 side chain volume scores from the seqinr package #' # Set pH=7.0 for the charge calculation #' # Calculate only average volume and charge #' # Remove the head and tail amino acids from the junction, thus making it the CDR3 #' library(seqinr) #' data(aaindex) #' x <- aaindex[["GRAR740103"]]$I #' # Rename the score vector to use single-letter codes #' names(x) <- translateStrings(names(x), ABBREV_AA) #' # Calculate properties #' aminoAcidProperties(db, property=c("bulk", "charge"), seq="junction", #' trim=TRUE, label="cdr3", bulkiness=x, pH=7.0) #' #' @export aminoAcidProperties <- function(data, property=c("length", "gravy", "bulk", "aliphatic","polarity","charge", "basic","acidic", "aromatic"), seq="junction", nt=TRUE, trim=FALSE, label=NULL, ...) { # Check arguments property <- match.arg(property, several.ok=TRUE) # Define the data.frame that will be returned with amino acid properties prop_colnames <- list( "length" = "aa_length", "gravy" = "aa_gravy", "bulk" = "aa_bulk", "aliphatic" = "aa_aliphatic", "polarity" = "aa_polarity", "charge" = "aa_charge", "basic" = "aa_basic", "acidic" = "aa_acidic", "aromatic" = "aa_aromatic" ) # If no label, use sequence column name if (is.null(label)) { label <- seq } prop_colnames <- lapply(prop_colnames, function(x) { paste(label,x,sep="_") }) out_df <- data.frame(matrix(NA, nrow=nrow(data), ncol=length(property))) colnames(out_df) <- prop_colnames[property] # Check if out_df column names already existed in data # if yes, throw warning check <- checkColumns(data, colnames(out_df)) if (any(check == TRUE)) { warning("Duplicated columns found. Overwriting previous values.")} # Check input if (length(seq) > 1) { stop("You may specify only one sequence column; seq must be a vector of length 1.") } check <- checkColumns(data, seq) if (check != TRUE) { stop(check) } # Assign ellipsis arguments to correct function dots <- list(...) args_gravy <- dots[names(dots) %in% names(formals(gravy))] args_bulk <- dots[names(dots) %in% names(formals(bulk))] args_aliphatic <- dots[names(dots) %in% names(formals(aliphatic))] args_polar <- dots[names(dots) %in% names(formals(polar))] args_charge <- dots[names(dots) %in% names(formals(charge))] # Get sequence vector and translate if required region <- as.character(data[[seq]]) region_aa <- if (nt) { translateDNA(region, trim=trim) } else { region } ## Will retrieve properties for valid sequences only ## keep index to fill results data.frame valid_seq <- isValidAASeq(region_aa) if (any(valid_seq == F) ){ not_valid_num <- sum(!valid_seq) warning(paste0("Found ", not_valid_num , " sequences with non valid amino acid symbols")) } valid_seq_idx <- which(valid_seq) region_aa <- region_aa[valid_seq_idx] # Calculate region lengths if ("length" %in% property) { aa_length <- stri_length(region_aa) out_df[valid_seq_idx , prop_colnames$length] <- aa_length } # Average hydrophobicity if ("gravy" %in% property) { #aa_gravy <- gravy(region_aa, hydropathy) aa_gravy <- do.call('gravy', c(list(seq=region_aa), args_gravy)) out_df[valid_seq_idx , prop_colnames$gravy] <- aa_gravy } # Average bulkiness if ("bulk" %in% property) { #aa_bulk <- bulk(region_aa) aa_bulk <- do.call('bulk', c(list(seq=region_aa), args_bulk)) out_df[valid_seq_idx , prop_colnames$bulk] <- aa_bulk } if ("aliphatic" %in% property) { # Normalizes aliphatic index aa_aliphatic <- do.call('aliphatic', c(list(seq=region_aa), args_aliphatic)) out_df[valid_seq_idx , prop_colnames$aliphatic] <- aa_aliphatic } # Average polarity if ("polarity" %in% property) { #aa_polarity <- polar(region_aa) aa_polarity <- do.call('polar', c(list(seq=region_aa), args_polar)) out_df[valid_seq_idx , prop_colnames$polarity] <- aa_polarity } # Normalized net charge if ("charge" %in% property) { #aa_charge <- charge(region_aa) aa_charge <- do.call('charge', c(list(seq=region_aa), args_charge)) out_df[valid_seq_idx , prop_colnames$charge] <- aa_charge } # Count of informative positions aa_info <- stri_length(gsub("[X\\.\\*-]", "", region_aa)) # Fraction of amino acid that are basic if ("basic" %in% property) { aa_basic <- countOccurrences(region_aa, "[RHK]") / aa_info out_df[valid_seq_idx , prop_colnames$basic] <- aa_basic } # Fraction of amino acid that are acidic if ("acidic" %in% property) { aa_acidic <- countOccurrences(region_aa, "[DE]") / aa_info out_df[valid_seq_idx , prop_colnames$acidic] <- aa_acidic } # Count fraction of aa that are aromatic if ("aromatic" %in% property) { aa_aromatic <- countOccurrences(region_aa, "[FWHY]") / aa_info out_df[valid_seq_idx , prop_colnames$aromatic] <- aa_aromatic } data_cols <- colnames(data) %in% colnames(out_df) == FALSE return(cbind(data[, data_cols], out_df)) } alakazam/R/RcppExports.R0000644000175000017500000000477514137542025015022 0ustar nileshnilesh# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #' Test DNA sequences for equality. #' #' \code{seqEqual} checks if two DNA sequences are identical. #' #' @param seq1 character string containing a DNA sequence. #' @param seq2 character string containing a DNA sequence. #' @param ignore vector of characters to ignore when testing for equality. #' Default is to ignore c("N",".","-","?") #' #' @return Returns \code{TRUE} if sequences are equal and \code{FALSE} if they are not. #' Sequences of unequal length will always return \code{FALSE} regardless of #' their character values. #' #' @seealso Used by \link{pairwiseEqual} within \link{collapseDuplicates}. #' See \link{seqDist} for calculation Hamming distances between sequences. #' #' @examples #' # Ignore gaps #' seqEqual("ATG-C", "AT--C") #' seqEqual("ATGGC", "ATGGN") #' seqEqual("AT--T", "ATGGC") #' #' # Ignore only Ns #' seqEqual("ATG-C", "AT--C", ignore="N") #' seqEqual("ATGGC", "ATGGN", ignore="N") #' seqEqual("AT--T", "ATGGC", ignore="N") #' #' @export seqEqual <- function(seq1, seq2, ignore = as.character( c("N","-",".","?"))) { .Call(`_alakazam_seqEqual`, seq1, seq2, ignore) } #' Calculate pairwise equivalence between sequences #' #' \code{pairwiseEqual} determined pairwise equivalence between a pairs in a #' set of sequences, excluding ambiguous positions (Ns and gaps). #' #' @param seq character vector containing a DNA sequences. #' #' @return A logical matrix of equivalence between each entry in \code{seq}. #' Values are \code{TRUE} when sequences are equivalent and \code{FALSE} #' when they are not. #' #' @seealso Uses \link{seqEqual} for testing equivalence between pairs. #' See \link{pairwiseDist} for generating a sequence distance matrix. #' #' @examples #' # Gaps and Ns will match any character #' seq <- c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C", E="NTGGG") #' d <- pairwiseEqual(seq) #' rownames(d) <- colnames(d) <- seq #' d #' #' @export pairwiseEqual <- function(seq) { .Call(`_alakazam_pairwiseEqual`, seq) } seqDistRcpp <- function(seq1, seq2, dist_mat) { .Call(`_alakazam_seqDistRcpp`, seq1, seq2, dist_mat) } pairwiseDistRcpp <- function(seq, dist_mat) { .Call(`_alakazam_pairwiseDistRcpp`, seq, dist_mat) } nonsquareDistRcpp <- function(seq, indx, dist_mat) { .Call(`_alakazam_nonsquareDistRcpp`, seq, indx, dist_mat) } alakazam/inst/0000755000175000017500000000000014137542165013152 5ustar nileshnileshalakazam/inst/CITATION0000644000175000017500000000411014067624107014302 0ustar nileshnileshbibentry(bibtype = "Article", style = "citation", header = "To cite the alakazam package in publications, please use:", title = "Change-O: a toolkit for analyzing large-scale B cell immunoglobulin repertoire sequencing data.", author = c(person("Namita T.", "Gupta"), person("Jason A.", "Vander Heiden"), person("Mohamed", "Uduman"), person("Daniel", "Gadala-Maria"), person("Gur", "Yaari"), person("Steven H.", "Kleinstein")), year = 2015, journal = "Bioinformatics", pages = "1-3", doi = "10.1093/bioinformatics/btv359") bibentry(bibtype = "Article", style = "citation", header = "To cite the Ig-specific lineage reconstruction and diversity methods, please use:", title = "B cells populating the multiple sclerosis brain mature in the draining cervical lymph nodes.", author = c(person("Joel N. H.", "Stern"), person("Gur", "Yaari"), person("Jason A.", "Vander Heiden"), person("George", "Church"), person("William F.", "Donahue"), person("Rogier Q.", "Hintzen"), person("Anita J.", "Huttner"), person("Jon D.", "Laman"), person("Rashed M.", "Nagra"), person("Alyssa", "Nylander"), person("David", "Pitt"), person("Sriram", "Ramanan"), person("Bilal A.", "Siddiqui"), person("Francois", "Vigneault"), person("Steven H.", "Kleinstein"), person("David A.", "Hafler"), person("Kevin C.", "O'Connor")), year = 2014, journal = "Science Translational Medicine", number = 248, volume = 6, pages = "248ra107", doi = "10.1126/scitranslmed.3008879") alakazam/inst/extdata/0000755000175000017500000000000014067624107014603 5ustar nileshnileshalakazam/inst/extdata/example_airr.tsv.gz0000644000175000017500000056730314067624107020446 0ustar nileshnileshR`example_airr.tsv]85z)TX"/22UM?N̙z-`lG&d)++c_ǿy\ǟ_ˢ|O?_ſ9Ճ?Op۟ NM,??O_/'ǟ_4WOn?7|[<*6g|!J?K$<*'/_<қq|<r8^<OH?5pU>a' 'ÇN pV>9/K8 Hxᑊӷh`Kՙ94lp8 ;>cǂ،/iTZl0/Y y ?[fD:uLDXb˯ v;P|8_y:bwZUE7:۟2rbxƟ>,O~`pl3` "E="/J[5 Rg!oO;' `L@+z$xշ\F{Q~wp8Dq $:ߧa/@_Xd?$ck)\ oBJ}t@M%6P&#vd!š<˽JARӽ`$AR{.[>{oKg Vô{ /´l&y+WrɁS9rNf9:aii9ZHp1 /z EG6AWӴ0cwLm\paKmAA!>1[1fDRVG!4 ![QK6;{η{|ˎD/E<} )i˂yHLn(:ZKr/)܇EB,< -<:㦔{cd°2XvVvJuR>GL^0ԂL?['۩' GX2GBǂxZhާgגKKbm/N[^W Ұ*)VIQ9>)ESGҗLg|t#N"d}<l\-?Ε} moYzx&n:[xT{Gޟk}. @;S,K.@$m]91}{]y-ѡŨQYeDt|m'}RgI/q$ꕒ:uȠ9@+CM6xǨcH=R1@6bhP\4/_}<ǃ@s#ՇY_b(9x+-eqKNzX%tm8Z8*Q1 oknW=2m`'X`+n9XBZ݂t)p<~w>ٮ:CE,|KTj`bB~_(h9RlkNc$x&ʱlrGv,HƆhՠ!⎼"Xgк~ht G-, I] qO巑I=xhWPP^5FrhRMsl5琬mЪjpmY1NK!4VuFjQ@ f4>~\,sۘсe! <5^-c;.G{2 1fV Q)uyI~ ?!pr r<}!ay:9 1 >LXK|XB& /w<$4K<%YHr!ĝ'#>u%yy-&;ųb`iGz-i]r,cB0hx9VCïd+J+BtX)Gr9I K0uy d}9X&RIqV$9㡖26ܓ=_ЪtIt!dA_/oujooro30Rӕ[baT DuRS*u-bUR| )/>q kU|o?oMe\eL̻hYԧCEK%PnjZ!!fBWU*|URjWsE}$<))^)y̜O7 cG]ӯvvi-Qġ_lhZTh,$wIZt\BTgi$P utu5M݌\ɲo@1pE_._yYwRG;휝.<h)X%,@IF B] [e9ː n;gRܰ2+f*3RLު=z۔).kYLQ 7FN\Gq-Ͳކv{ȧN݈m'^|S깽9h{|vGj,CuNǝ;r& %|ݕ{ u'?~  W).1y ~ƷCQ=ys|nY/}cEBNpv%'j>AnŬя' 3[!CA>US=fR]WGωh\ '.;HMѢ7 MH?ׇn_(MKzu&t;PaTf]v3-)Zt7ˎ}^qAtb\}TҚnۍҋHbbOA鮈!pb )_e{1L#|0tj02?Π 3RBMhKNk&A\:!VaB!NAݴ)BjpqQKAxeT#VX4Y)n\ѓ BmfE}uAI|k 1[Pw6 BqwjT (SrX2vD,5J`WVYX(?BMDA.%Yh1ڪV[r{ea:Qmkq|"Ms`L^ i`"; ˥IWvF c!4vBo!s-<9$e׹VAL^ a _D/0VMvEEʤ5B8Yp^DKBg5GjAw#'=vKV(\>QAͰ~RE%dc?ckO%>ȼFGEdj" N6>EtHʦ1c.ނ!с G'j]_¨\`<,>3,16>]OONH\j%h9M5nF:iN쌊4(rW{SGRdSdN'+2 OIjxt&0+%D:ab2֮szh9$#Q֪qw[*"qU EE'oHkJv6 `'Jm]vI '&oHCl]1>ZF\H|{,/Nu?UI:Qnt:̰OРqOq,^C)ӆ#ƣNEH*Ң .H"7Ec8DPVabw|Z SN0լ/t_ZC4|AþgDF-|"7091` Wr{A(cC߃f͡Dԍ%>*Q ([m)PKdpIY o̢)l `F` z8 MxiĹQY 1(A_^nz/XiDYwL(;֍;GD}·hbg{Uwuc#n^6IXՌb5QN+1qicYNvHA_^T-m($np7ܼF ՝ݖN u `f^|a$җq h1#/:`$ā@"}( yZnuI?.]%\1v#"7m]Rj;B.JxAzeg[Rw?V8ưTݻ/}R4|QrẽBgE>Nit7D6vn1VRVξPɩ;U(fx\  KZDw7?V9U5q0 .-YfL Ơ&hr@[CN}L2 RShP2RzzNS!'"-%$}r*SRI ޥ GiX9< 7'2TP;oA\{]#xfaˏ^JB >=v0l\݋ օldH{6j 0}F119jUz$<:FM/nFwҺhB~FzF_҆gij}htVs`$9TmDۂh6M5{j2Yvu, _R4V\A*E&`CrR5ՐuόLWM'+'q8hТbw<*y'F-ۖ9i)¸S[GX YyJ)/8*F&℃ hBrW~e833fq.)%T/GD$Vz(H+j ͅ㦝*MGm}Md3<{]F}{<YO iU4:|kXXP]4BxXKoo,[^%XZ.NS7 x}9?d^6xTӘKm""/5$z;j(t?@{mEi(22A ?ŧ)Dh2Y@YgYn{`ZПc*VN xp 7 jA,f7 Y~WWo>ݣ giOZIxs ; ڳ@M tsLJ/BCy9+2v <R^~ ðH0l34$yT>?}2["QT{1gR@RQ]^v-7BO17:"E n!4%q*ĚE# "\k^,Dj8'.nPNj.5cx .qoraCpXe3VRc\Ityc6fZ_Q$*JӮCI通Ter ЙQYVm|Xp Khm7n7Y&7F*{J ~GޙXZ8y.`(o K 0hǩM_ UqthӀ]3WԌZM-_,dq>b$Gn՛~N*a<9鯝ôߵ3p?kP4K\SOV}tyZR; $通Tz7|W-Q?#9@7҈ϊ: ;-x+B4)^xw|L]`[7"ש/:י vN3通AcQ|yp8l79[ y(;A`{=db0{QSy:aԌ-pRǏJ)f֊{gπ#6L}Gmn~Ǣ8qXq}\yߣCwFiæ4 %wg'&Lw'ϊĽ~/}h#9y3R kśKxOwCrt`:&U9mƫ|ut"A*n 1$aU#vP̥j$d;GN˫^|fz˖8B_B/"@JRg|A7NNjqo1s;yhx{x@ἅ&0Znxx^u}F\)df"ԠG@%xgόZ8(;&wE컦a~ߒJS7L*[syP&Χ|>7}:@*N8z楋0ԛ4f1N.[]y,Nk~UY ,e I`Ҁv4) ,KASG 1%I?$ h/ܨH74`>W hrvf&g/}&S%W8 lRd4\S&n{^oJiOym%3(bp,.bYke{_Wl"_[͔֩+:;XLӒw55v;2jb<0I@5ź~a VL"יy C!5'\6>X~Pa/\bvz'#N$4PNڿ'_򌟜F=C$T '!SKgtnt@M? TWGK*>={efE- okK֝;A䡴i>>1g1M_9~Qx*v14\^a=?٬^ ~e>9@ڏ+;ei Ea[~XD9[=lK OF;P凕=({h!S g|LehJ_? @5l>.>䎑g*z}r}gqƄ>VC*`Om:[mN.MSkh|BdiĘE5HRQtS^w1F2nn}#갚Ui?|AJ:jÖ 4DU5+z_Dםn#IuX窿+vJ̵)T*-zZdWK$?-bKKoz%xC]J(#t.(˪ %1ø;\ǢwA٧a5?Ҥ"߫B|:jo.LyַkTi>QM`f]-jM.~ݨh 3YRpl& S,+&ĿaʌS~X3_H< hR9&"EIDh4 (= Z\ה]T4.ƍ (⥉Ό kS60̇ukHAla }MouuFnc6 Tbq}60X`QV[Y\7J}Qfm7;x3xf a#nK73?"JLrpR} 7:bx:@L`N1dP#1^&7ټb1cN-1 l &ēi`&vHJ=CKѡ &J>xIk\l#:MÀ7!#։Q[TYתm 5<1htVU9-X-eN)9(/N?fWNG{r.e0Ot/]ܥU sBanzE~yVATS׼pFE&1Uy蕈!SY) `I7R/QlASեSkنǾ]k9*G4ME^vI!ɱ<-IUc(єqjҭ%o *8HUYwj1 R6DR 4`% $b|l-Qz<niX? ;*8$$(ܛ5}9g{sӑUc=?Bt~s۝qC$"4D AIh>>HZ*gK|q)x]8qh <Z  7Z G&{Z@cJ==XDQfs7nصE`& oyUP]K/$dv(]j;W{/vFccV1yh<* P`9.a)7ˎ}/Okr`fӆfj~x$HbE(+5qDSοN1@>dc+KI2q~dT0mZulI/V3i y.f|i $azRBBߚPjW|BMbtoo5(牤Hq3UjdCm(Es|oAU)h-/ #1xEz= jVfac5hj0>RzLVٹ^_~ Q أ'0hkeE1Vԇt̹>{u/M ^Izz|ߜX& rhZ*г-6"6c(D7NwTN[*1 $VHKD#]M]B }p5bdXز3>ٙ(#;7*;CcS1Cc4ّgj9]K30toKK= vKY܌Y;YyRU,Dst~9Ae[h.*{h/PhvZ"FA[ަD+AE?Ai> ڢ6XMYzdV{[t ~^2+o/ذO|%R5 /.& ًn칐ox s2;Af,} dv ̥\EyO;׾^lh.YPyo}p |ԯP%e"I~()mq~6d]lOiRn2C85Nx6CйD]D?9#!sh`$[p#nA㮼Zh,3v6$RvCeE6 WlNvm(*Ss8M͐sAlE+#{ewݑ];+/"oS9Զh];y]֫}Smin#D)h ZmㅕW%֢_4oL\GΗ-([fH\wG!U+蕯y7JT N hEKXpST̚y!@)D5Ya NWM+l@ZOiS-oDpYKq^%f`%vR3BS u~ӷFߋ|dp,qCY9ET+1 v ;n 4aW70mYA}?rUNu h+x{Q;ZܕuNxdA1PW-L\-Ki`jÖ&-CIf p7p-Y ~YW'N&;Mv/7Nw yh&!y0}M{@iLIg:bd4% pِͥ"eY͞.rdG sqV.#d4e~墇!0ՉkzB.8щ+wyRؚKrj|AI,Xܵ3呠PARP| (:IdEA$ᶠBA a)h&El|rI$iVGBY#w!jI7~[ VtJ=~PR;(u?HǛ wS.$\ zoP9&!`'I(w08Aj.\j(, dU+j[ϰݯ:dV] iXbn ∣5")puV͜<:\sN/@&!I`:!X 2IUM|"΀#4,!; KgTqhǕ 8J1}a; |=&gF0} ҟQu܏foދL1<~X,Bb_')m nKlK:H.iT鶴t;xK7t[^'"i-B4C(C(MxUtJB2Ti`H5ymi7 Cx1J8~ Uk71qmJ^ĩBց`txZK8%¨hLޖVMX(wiu|.;@4 a`֪RuK`tٕ=f_^N\xm aYC OCgZ?ݕ8})$@lR?|[I6z9qCi[/-T6A`]'IǺNK8x+DQ['{%JqgAЁ3VH8HZ#;זy !+ 0iJu)ASquR_ߣ7èQE k\=R9~t8ZMpZ/ \$5?vǝl+5 ɨ0mt)&~; cgJ:Ͳ_vN ?#й$qŤojQ EۡIc"U4u>p"4E&,?l>KrNyRȢa^Yuz%0 Z> 6D#I.]z KR? )\q,}#z" @=\av!_9c۾?:z ;uz^S!T4+ äxR%0Ό˨YtLL_'Fw>;+ru>rA$>ڡR@Rkt u2M Dw_OfXQ_F@rB hzR&.`\peDE"fB̄8SQ)f"N@b!apj8* HFeJx^oRA rVqnQ"5+V!lP)~\Z̑腥F664DcUCU2u=ќӣ.u>稫QF]zNsG4a[C3uܮO ܴ-9L'!Hӻ#Hv03؀Ts aϯ*Ct7ma`akeMj}04yWMp/VDքǎUM؜fmވD4U!H=̹5O{ϭ2Ⱦ8kx"8E!e!71TB#4㖭-qy$Ӿ vߗvYe92bEYj{!tfjL2'Lmqȶ;h' Z7:stpٔl$6[z}юI #R"(lM<WC#h%Ht+":= @ ^㔐I險B3X`GAŞ 8ވJĬJ8Q;!^,<ŠЩkE0h 1t›P:&Au$Tql}?<;JŦm(4 QT?>KꯖNqRttB\i5 i{IHP2Py`,PDLUlUd{"v@HL_AJǜ5ُ׊~Ǎʀ'UUᢊpkժ~2p3젚chEO޳Nu,"Ĕ^FiCR[ue>冇ԱX @)4A'848//)bЅ gCnM忝XiQ$A}(%:џe?ύ'DVU6q}4 f pSKkX\4!Dq:Br&Y9?D N ,CkI$zIaq΢hUe sڜ **"Tpv)n(5軈.>Z!h+)8'Ӆm r eņ\<)n? ~˿ݭ}3yb$07A`Tw. Yg6rq}J|]djcJ?6[)N UDEr˪ ~.Eyg/RN!O0龜z`z!S EZ;HoM/GnztӋ^~Kr=$=eq*QY(.:&AFs\KZ|w.?Y9eU%,˹K* *DlJן\Ss6აON7zq4g\ZtR^~& FUR <.NIaDaVE4!bes=kqs̐n -DYт%I_E73$l #0 ˯w_ hq *ͧbV* jԳNK/ %ʛB2ۛUnXڍ~R؊~E,_lnN4Y #@PB=#ܔp4niّ[>ӂp:x\w𠓧†uLwעNN)#AazhRD0ʾ6bB%hRF0E;]u33< _٬b5p:za~G < <:pfP^pZp"ʵ;ݞ{9{t[0'SHoEQ {>GOMI1$&:0Z2ysFl_cP~KeT7'gT?:tS@.SՓHZ/`ʙJcscL1 akxbZa:(a-ita^098^2'CK+1֝kz'dz>@Όb!S< H@bͷr;j^hs| X2hu%C2/9A"ylV&\q.\)mos<: 83'zε|^"i4aatiHM_KQKsc8@G`I\ݨ㭱?@~pLD*:xP䏨v]) 2a`"C÷ӕP9~BYL/&K^ҁ3 \^i$VC)s"3y )Ky jjE`k >O> 'r;vq}C෷p\ Amyp8!rw=Cd (pi{t00Lǭ=0j̛.{mܿ>KKN ?IJ8fM6믮| c\]].z&9ԏ'g<8V:8m${U2% 6QwX.bk K$顓fmJŧ汔tL]ϗiG3 c<6?gǪdy vL#kHuhwu1WSQ HRl}f פ@/+D,O,O,R8RDR$SEV]2ĝYyو뛎qWkVk?Kݫ\_TiE8K!Ug3  &gF"qY_Kنv{AX>lGHI|>)e<"Q)w/nY 8nRcX 4ŵ~_%[-;xP8>#$|ӥE]-oEጵI)rt؜OniFdr7tp'lzB!a\5H}iߠq&.k_}N>7[|21+{M( 1 FM,4->itDY*(3xZfuPM)UU2. a4|MPiƛpr41mE~4sIbj%R\eAB3f@v ),%y-(&q,FոN-D|z~|Nf?I4O#vfOh< Q֫5;4jҔEU`lo}l.Jh-cǤ2 ^,01WS廊?.ZtW*po%%eqI4YB _E+. bKb A}pŃ(F W` V=φg>r&>j1HkC)&QfUH&9'pĚ6vhl. 4N{B CNChz\ ap@4H5\Qҵy4 /iD,n1 2I>-?䓡)\a*T̨Ȅ\0 +^uȄO\"B*}W JѲ ewtV[@K1j \xYBp 8Чq`bK[!m, -tNg+6;STR9# ,<@l)](:ͥdSYp_eG+@J}weH.蒤caְrQnv9XҒ,SzGz4bS ۭefR{3Y͆1ɩUgRjoi%GjqCgYtNPܒVxf~YW)q`yF-ny1ۊ΋ Z<xlzv(vaZc%V($uii0 HKsm&؈v @Q6G¢1f "'+RZ%y]IVD=DFdN0 t:Hǡ%7&|x04 #:T6Z}6h&h`w dzu ٰGhzYQs)чR`'WUrK]gO9j>0@IYFDQwF'M>6z[l6%{iI6h<՚pkL:͞UCUJF4Oc*`iȏJzUjD4fbKST<=z6ۍԢ3n̺eUWێntLGh;4D }7k7A< 1t ~ BMZ\zE 0|q qm q3I_rqXIA,P7IT܀<9_ V>hL췶H[W2``">gNI47 +‡BM~xZ~ =([v<ȣܶ;-XYn7w[ľ>*64]^^z)vn'/S=Qob'yisOǝ>>XR #<<5C~.l_C^~q>܀ :ވH(5 uz:x=碐stUgi{qk{u`k^w;ͽp8\r~<~^?y:7'zms q%vrS#c_Yr-6e9B BNPDI d^O&C٤\G֏q }pL#HXyE(YZ`c*.{ldu:{&=e9 #}H/WYT;>\ڏo'ڥ4dN6=}}tfr;@V +^(~dQPӖ*ѽ=)SٌIQ~MA342ݩtQ=be3C!\6[SWy88K~ht͘ >;RB|H_0t~ǚ+1'AͿ8ywLs4|Okv΋j'(~楧S|/ZLYYH %0jɰ/-O:N"L[K vjz!‹ō0&T5{95} q#C~@[bw,|_ZM}pcp/1n?0?vj:h~kL9&M휚>]<'X)8:nt8ݮx^<RӐxEm`Ƌ媅>CW-ÊӴ5X)*yjCP Y8e4H΍ ZYŀ̘hC.q#qT^ۇ|!o~GLzl3M A6֤D m_QOek^e٨uuiA+upwUu $Q%7gSpl7r9-@n/qpJAA]l`q84 84Sjnv/36%E1G1r˷%m"C% ե Z_4Y<~>ҔŽ$*>pHVYLSPtyq(/ 8á)g,"gJ1M"%)!Z6[M*mh2옳{$.|9t / xR٢pURbUߖ0kvlAA ov5Ӎ)0$)6WW\0yEFḬ[cS;xoGQNt"-͢vt6|va\8*V"(\Du $+p6,8hɏRp*D [ DZF'}@]/u %[{x$=J4LէQq5JEvWbbG.:ߞ]Dc*k % am6NO\ y4;g mޮA{9>wŖ" .ٿGYMSJ``7R'- ܀XkۦOo6޶iX9ś7j,]`˚{њc+U;+P츧B̒G}4>󰌂K,(r,'|n:nqmܵy!F"„5 ϥZZxsX>k8tu{d󰌃ç`Ʒ:nfMWlL <KF;!.N-'N.idh5>j#:q\S ab 4mm$\|"ea{4U|bzeA9 ^NƣM!;h\q^_?j1@ k@S84 $6ǟe,ȳ Kp(-6ގ"bYaGk.ڎjCyAdHҫ%\l{:!sUcN8u.7 M J!5>\9 s?? n' J $5kҞ9S=%)颧z?A_+2"&|=>7 =J`.uYB;SpWHCEFVPVߴf7̻pcVBn,|67:hK7lƦEµwW{[N,UBSY]{s5kcɖtCS_Ma7!m8>tZ<p}!f{/{1fYa 5۪ڎxE`yu9K:v!%nz]=%SpƶR̡=ѓ[gp{|)^QP4 ,j(k `BP3B_g%k A jcZ#=tVrHJ7J='Y;Ϭk[,4;wf 7Ͳ: '{#1ڗe$!qmќb=fk0OXx\a!לD0ÞĂt?~ut_SwbؚB׊[f%U\:t JsU%+mek*4 40@|?)/0L_AQ6ĪʰߵjT]  B=A,X$jߐ>9|Ǒo4Jrbt%(&JʕmTzou'4 *pX.h]jIiX8Hc~Bp?()7n5 ~tI%1-)ɏU(eEӴbBEjH:5lmVQ0l'6>yՐ婎!{cymyC3OV㳜֯K:uB/tMM&f= u؉:߅lzӡs68C~@s A -vb!h9Z@leBoj7qgzf03)~G9j8/<.t(%xg r@3\$?\$. ۬脨Ʀqb>Y;`n!o@n/"|ʜ/sS -oצ^jw&WAKO$%0Fma> S}T?_jpYpJٓO W;$? gA6 #VO22\xZ B'% *Ai[X6aS@ՐBs_սzy~5Hf_ N*=NA/X;7`^Eb0GU1A|UɭCU/ߪ*}`Xzwnz{TEa MKDWԦ%.t#jП C%"G2|t1rb!2'>vG9\ŗbWGEփ6 .huZ>h0`/7}PJzٯGRo$jV&l]ᗧ3čmX MS;a|XzlRmJe6Ւy^®t&*W;Ph fo:hk$Ys!M{5@xA1Lҹf@ cL,~)vP+"qTuZ/1ɲ谯Ygį/ׂ K-P_yOKAUuLmlǘz#=϶\rB5 ( ̽f2ϯƓt .(-^3N=ra[ΐEkHzȐǛe>JeLll?Zuz9G"j{kߌ]&<  j$TMCաi o$5v;$-/3*I5;;RhD.GP/k|zwV܌Ή9#}O0kT*v#WtXRĀ)Hz+h>t ꓈NV2!W UՁ)UYTP'xF=T#jF]:t(3ZXf 2ͩNͽ|ayB.1/|iesɃBJO<C5 :+O@7^._7$"ɃD*t6GBϙL$d5t 6$>9#20MU\ >^z8J:=TiN;B2ӻ($%'d-hf( ~9 ~l=_( o2ס졚?Į;ϻu1\D]fif4'ж{NJ=T:-7VZ!:?eMUטƢDީɥy9U [\kO9杜AVrrpY7/<QX9/s\Vd"h?*sk[2|Z dz* AV?=_D.usHXf;CEblu's&3sv_%pnFT'%rw/3F6P!|VZB\.=T:P ݶ)6X :!ՁCpSnt4| M9Oȏ_ ,ʫ_s&`ٰ>6:U+)[f>ՐcQ::JU/EJ9C5{ ]~ILǎoTPvk\az3VRf3u,ZusN~:DqZzѲ%IG}@tJ?^O5^|çH\x D-ҵ9gCu6J ’ӂ>WCFg;;=}~ q~9oۉ^{8U'ħ&sL9D8|N{۩|)cŻޭ6~vEa(jH5i钋Y=1w8Dߥ >BUeYWPbH**$(D XB`$ l 093T|.Kؠp=W:ZNRç'ICU@۫#3@Se!ݷY*Tqd䚌c/M0(1(sMÚ%[\KU[,԰y͐ḿ00Y9g8tHk.c@Bbª/4a.^SqPj!6pֺ:O7Sq+DhaA ٓ3n1Ϡpdl6:vZT1Ix*?gC*5zw_s2ۡ׃P|q$!p2wwe ,= G1 ;?e8hB!d%Bӳap&?G&K>U_ͺo>k>KjolGqpxncr ׃`]䋦~q3# \Igr0 ko.ܮ;DŽ7h8UARec2  lk7(sU8%nnvovkՉOΙPrbmaZ"l-8 P%3鮠&,m0xQMށ+@UÐ5X,1%>Yoң4 \:'$JQ,ft»\o )",SGԜ\Rgw0.]%ͣl}8Evd(ƉT@*6"\R[PC .Ksdhk+HK`@Ovfo憯72Cza_}>#%|;1)vc{Z>nQU0!PќG'>hQt Z@ƀ]lvj!g-aQjǼ3\TO%#2.f-,cPpf'Ҧ*1[;'ed ;H7Mt,[)?dg[G)G*NZ\mBN+9E0g~[B3.Á@Ҭo'世2<%hI|. O<lzf=|`"d^l㒮]t;{jqeI.nsF3nc'{2F`ʷ# xinyQ[Gu|d hQRk|{p3{h[ݵun@,I<~x GRqc&-ދ>"ο [q-l۲ٜ?gKBtApļѯ;яL8ru~~35l.3h.ak%ʡSFjxKH\;9b}_e}:ĺ7 <zžpCj*ڀĆ}oK>\k}|lM]/I5p}"D_z5"qoKa+k"S/Id:zg∏ u". 3~qy@b%S]6Їtu,(UD.VN\ȝNMσ(HWա\`B` T2j*T[U&}ѫ^uVu+U },8/j AڍաDvDڍzn&!|.v}h2$;bP8~@77ɿm@F2`|\X.]^NNrOb`Ǘ0LLI7χ_ִIeg ipHwi!)[cM3dNtjde6a6^Ng6V(X X b)#Wjk*yT`ۊ _a38s6:oݫijcmt l-ϵ-9GOr 7׵d#3!5oD#6 w'㦻~`zWlhW]5E细. ;w WEkjJϘ< >JF4 yC%휆qW?@TsA:] G޾ʊCA8)Vo$%VZ2@G }yuv(@ YIb %ewS~;6_֙j~6u3͟&7QR*0D*ɀImR/oh?f$Po8aC ߄cIç4jza0o?'|[pYAA@v{C1&.aW\oɷa_e- ʑ!:͛ÚsJ%6t=\t:Ǔ%Bm%3lbO7Iȓ}I-(ƻWLZP;+iѬw-n"Ms]0־?ϬƬogϬ2kL󠒔5q,-zp]-%z 1UYzcb' o5x v=՗u-.e(FE4Loiā8'/^.,gUPM` +LQ>c]9XdYeGw ml*ؙ6KmF;f螝0};jmj a!zf0eͣNCZ@>՚%x2YINg並K1q؛Ү>V=>v? 1>m3Ղz)߽iQȕQTR GTWeAo@}5Mmut̍ݜKZo._a4Ҟ"J -O,i%,; 9U-MYL QPPBnu~k}8+&GRrzW.M8'bi朩(v{4x iج= Jh^δuLBREYゑWٞ,3NnWꉐ!mDs[d8ca͟ZOjIVdN7ro48FN[7j>1zͥ>8q~)|9d㑦y.=]V-s򑃨sj.Fˢ9:oҕot 2!a| }CPǨwRSmp&`4%]i 8=-B#3WB[q2b]ݾYoӇvczjDvZvg,\,:=?lꢰuHY:b[݄x}ZOC/qʓnh|;F3Wt.nf?YF.T2 nͩVPN1TP4n.-B| j'hd,\ h$}oN 3 Dm[t>7I: z&ˮiSQo,AQ"|Ѧ@!uؓWr}:.a3\>r ^tix1%bސЬz]mM9=!lDȲ dvĮ=}|ID!?j;~/hO@Y Up|H 7H='h?XLWBߪv+uTU D!8#Lf-S<ʝX`cw:uV?WߏN߇oNH[6dK}@$3#viѷlCd# A9Øjklщ&N(&'t߳c0=x 2ad  zsZ*F}&z \g;L:|\W9k ZVRG?#Nd`%V8~>'ҳ,I]JikFjj))Y<tK#sdqۮ^Y(:Ѳ5az =:@aa43^0}ޅoo09aTzsR73V/UV) 5Au$:%.B]7Z Z";Lw)nzOُlO_BىG =hUȾJS:Nj_$~_yy`FHS1ao YH|Ґl~ #&A[FvtqfH'zyV?~znV5‘Jn6ŐN7,ٵ.'SixzCzc'V[)w6'*8': vG0Em,W'Fp@H)&+hF4mm8}àL#8$yzϑĝ{Hb\ͥ;.!{KTa'lOˉYmҬ_aSV~H|L+fT8?!pLXFO4s|1ϛX_oxĴ?h$0 EJ:Z)QL]K# $m6ڗ˧fЃ=bq"q;3I41ƥSӦǀ-=޶:{4x:*yvҁ̂9@@<]Aά4L2+mqYm 0ZqOM]¥9pi(FmJF4; GמPle:46&P0Aq89HJMJU2MJ^-S 2ҷ pYܾ e,Məa ҷ2xIJ*RwQoոYrDB&$qm>)'),qx 0U^iv&cĞ;|9`~E.sQDc-> `DS|Xvˍ!ՍֳI+>I;ba?n2|#ׇmo{j8swFփhGYv4|S2 7aoYwWk nr~q\sB~ynzpYkpD_ӒxyXFRs)X!J},'.ܪ? ss;$G+yżzFBCfX.<<,aXVTWb{׻,Kۡ?ʒe?Ƥ{x">^Yr 妳B:?e lHFk]=cW+YG;nWJGhqP u˓i Nʻ7ԡ>Oqξ_BDzmMYEt,qڑPHb 4/5h&u! H=Nj-nw=P|D˯Õ*۸J?i͵Mgp8~ h>4c"?$2O {Sh]JPs *agYds(Oy/k̉#axQrb#$͋C1E䣛,Hjh@4TB"]7Y?{~<[{`֡c[@ʴe[ 5 `2ſˆ#Mh[8IE0aSr!1vKd jQB{?U]"iIн#Q,(,i!zA d@g^^}]MeShAV4,֦ϚhZ Xi+V"#z_G!mO;D_@ 4 4?^[4p[<݄EװX:%9x wGLw+DR'1kW?hVaбS{#+ w,&͋YLu #-]o O󏋝yOM&)Gм4i4Ox@Tu= TW{q CM8?Uʆ57eqӫ &Zvo9aË *Oѻ $hSr6UMoK"OT3!T篍3O[i>eemrjf*06[ hk2EC|)y_ y!"͓_AޠZ;8JQ%^a(S%}!]Tl=s̴3]]b݄M{[ .ݪIl"&e @b yd氁1W&Migo/ 9Tbʲ>kS$'[aS? -a ,koG( . ɠPCP& } P>P2"5cױ{a14KD!ṹ} "f눓,N8ͭX"KDH2t^k_]6?gdc,lBО>ߘ$́(y4^JFN ^ى˰§!9C |lɛvmHX7kˉ>o@s}BL'j2Mk`l^cVcUԎ$!?yZ2A.[&#N_=jbZݢfxΉ]闆/ 1"7="O!@#4!A_>í|WlouwD/LDԎxI;o\vĹ6qjKR>%L#>k~ NR^ ME?=|)<޸:{nWv]]Vj%28Sp>8l vM2{Nx~57WP8>^{ (zB)VɳcCNzxZ%BM0!2 jJJZޙ"~$Nkz p JJ$P(z w§GhZs 1l>E!Jb6)K7E9)FvT%ɾ|x%KP@%x'íXcQhcy epR ̳-">T)~>%𿋿нԏ-\W3C sy1J`Y=V_TN,S$Y=Jgkv8*6nO~CP{M29^޵>R[J`yiddR b̳Py尥9GǺ W4K7K"piɓۦ#VHn1#N>|]m=ӢK0"+`K Q>!5:JTj񫧸 cE5jKh 0^mM};+@yigeh~޿^{ΈƃpTOk3_wE8>{1Vϙ`eJ[Gt4^K@/̗:E'_e9 F 8h:4zUqD9.?*4.ޞFB0$>9HȩA0iؗd+IF[qH$+ egkV6Bhm.3+ cf;feրR 9d$ O0Ltc@ ӡ!v+<|q` {<.v&w<-DM:y&qZ;P~B0-b $Ȗr B#146Gp9 F>`d\w`tIfƽdbl[>ڽWiYi c\YLmGp5e'KMQ?B궽[cXG3Oke^)ciQ_؝r0,= |bId}4Hx9ER/0*PJZAie:[9 izҞ=(`:s ̄v_:;3k"ʃ9͌c/4hfiw+9QX6t%wAK7_MK\-Δ**FL)E;=}˸o!AL׎$řU#ߊܨߨvXE/3 a35 gv~Gu$/GcLh4nWq33U:~Ce6[g[$&F"V-c^H48v&'’p%5N?Z'ێ8J6 `7:vkav-0\M[|* 24*w Wq3DZ2n0ٮ,y.wðMs$E*46AG ^~ѭt{t{F=qtSOǹAEeDaDl,Y_UiO>@,bl5FV.n[WIkF>jmp.@qPK n ?JZ,% 3XhP"ܭv|0FK= ոoy=v qqyde!2vdZ\lXm!!nAFG)sa1/_ˣ៩bfy%O#)9#=&В9P83X=GMDXx,"@YA7bo4$"Fjx.V:_جs]؆?˧+Z(ۦ(+g\8ҙ"='xfOIn١ڡDz_Q Pu +JS30G6|5v-=0|_u\9U)7T7 e*[YVȇIOlʏ[п|kEIO[?č/x x _LFgJXNvz >TB4ɘS ;>p?60 /{`08ne5=\Yyٳyyqu sdUEuQOb>!⛽e0!P+4+G>ǭ 7C=SjЫ,-/tn7<`ߒcIHCW3aXqWMrՇ\I(h\'G|lMXw$h=M$b.U6I^|2=N=~!L={B?CVԙ˃y>y \\ pyYůu(Dp4lt0|E 5=w jIu{K1`S$5{7PtHtû%&& v.yZ7*7_ʼ|a#;հBeް;!O>4@*d$6ol9冟sL2W>HMbF$]tm=4R+fp@Ӱ|*h.AoiySP$ g(E ]JE{yŤyg< 1U GL'a[eR|:j8ݷsz>3ȸLL}{Z#2f"avbLh2ϒANsSڿ/?6!hµ`4 bO=73|t2xieNyl R-¸dx- &y)ԊΕ K.g $n=9yNw͗$ <>[Keܑ~sS)~]`7xL~52n.vgmߏ N^A3av+wn 3C ?:{Ύw%5CGiq񞹒=a&)nT2\W0IgW8k8*Lgy>n?>_)9AQ{,D Ȱ9:*##$%8 3F,_lDn&N.]mB8,m~&2 /Sm4o aoVcC8͐H(nbzYJk8 F񥹝`^ [<0ݯga/Cq3`ѓP`p ^ p\BtI MKUؾHQKI|4"Yo 6]5~~w3I]!|.Ps:fzf?AC1Xb+wg;!,U$'8H(G(8tH 2N2pk3s/[`"!xCuC3cq.aх6GN b.| ז] 0ols8vRlYD^ڛM(,jmlŅJszHm6YWwe,t;Uظrj&vxK &OǽS=cu+-ێ+` VZgT̲ BCJ}O<>sem)9Wr6l^vwZKsn02(w= fwvwO'ک44غP0[]ߞgKzK=|KŔi{i)^;Q,v7띉}:Ƃ=  3i̚>P>&]'\ 0!hh BmN`'Y,pىE-E ], J3$&Msϴ-|XX>ݒGW{R<`m)J(n[cc6 RnCbJ'pmyjPMcAd)|2àtڝ(-#[ѫMl /XNb&6LzؾRKqtqt Y75| #] .D@&E8`S)}VjH(n1;SmEpM l?ڕe Ԧ&栣:iӪ2udtd$-5Wj }_ &Owy|y+PC:㐕qϒa0-f3Q@/|nm\qu@l"XFt`.p`®+?9ά!bLٵ}?" 2W*3[3´PaB4WMQ@ZҬok(?dZvlJ Y#7>YRh?I_=<{+Dl:l`ǮW.d{y_ldY(yޓ'ٗ<\`;k]{{lw ~ng{={^a醗)΋sF(ND'fQON+Yۤxy(FVPtz(n/b3m‘QND@ن튙͙[%3r Ͽ:7mwYz MeP.ޘn";C1 0;(y7`Ԁo<77َqO$}]MED"ԠPٛ/r}טj%џ{$~0^ʳ b$B1gxvEQM%V'X6ʃ,>,D~sdͧGOJbJb)YrVJvJPce"l6,c` 4Di:aiG%4(7ѩ3gUǝ>qSR4o`iBd?#܍|X]x׺q+tkg}D (d}QGU!\s$۹h}eztվO}xZU7Wc9^y*ww iyNAxq؏htT>N臭>UCR>WW:sj՞=W3W'~^$PY,S7P㢀1#&hbJ{o5B9d?uPT}SA&F,\Ϋ>DhdTyp>"{tu$}5A/ߛmg;ڑl` vi5*vuh)1Tj~wZy:u<=oiТHn EӬ/zaf>'=߫_?<{ 33p$ۗ- l4aX`` 6Y껞ų39z6ڛ" /^͚M <.-vhk1NNᛒo=\%4|w(!Y3uuR1)'!z| SGb*x4 H?V@p@Dr MBDD6,C A@T H#R%rHVrue2lv~{ FdH9Kl7VAEjP0EExq-"ʢnojV,\ImKv@u<,!Z$%fOnꭑef[φk"E>6D kC4t-AY19e|Uu-,xIŅq &Ƙ _c1<\ )VgFU+X2R.rr|Qj(k3xN]J%w*کˉN*W)CNR(;RaggFh; >M63<0hy|-z)+.ޏe u0'kQ.Bk?KǴK}{EK6qv? 7%~3zgy Fa`~p3z)ĥǂZ.rm@PZEti؟G%T&Ŗ43LY=ReD%]Ր>UN6S,aO‘.) ᰓshUwDÜSJ: "&/9>*]%|>:C8>e,Վ؋wA[rȃ>#0ŁOB$]h8zFA4@^сm X]>n:'ePEЀE‰;9Bpͣ$mǏ[I`;a=Sָ$n,KYReFnذڸU[]a_#fw 9F=$.G0DCL ~'ICm (>~ Od3RZ?j-ǪrH\gdO4N]O $E.?#m!+#6+W8we,-ەZ޼h BIF t܈X,vf&?N>IGKO.NV+xNj-Gte:hd5%GEMkXNZUQBwf)/x=`(rA|gӖ N֞ ձ}Kn~āPD[%R !H^ km~`?!G]NRhm~" _mzeo6B*mI m[.).%H`h󯍉/qŞ! ,v7P0Yi5W G6D/^ ^-.<;j /C^xj@I1Dʕ ˧CZ: $f w!  37QbN\gc- dwt.~6V\iJFeljݝnj,wMRhĆlsP0ب4g"kfb\:ZlNUdTbX٣7GOaioVb>FA`J*9g_};907q[5p(e}01clZ Q9w$p-Bw$,YHw`SЛ=BB-KaC&#jS@=Dl#sO}'?C c j|3c&'zcN=AOq ($mpaӪwa˧Qe)@I4(^7W/26t$y"Z5{y<Ʊnű= h[0_&yҮm@K7Wlb!8x[yCIF4}~D.?fwčvc]TVEgnג:ȵțG/F ס?oj~v3yM82_i^l|a\yXB`;l 44 62fJp.w2dlK+vKxb>PL.c[b s0B>M7{իysؙ1šq&$ҘD jOCVГ?=$ѿ'm"׾Y2}1r _g>myd|ȞKn|QOR41y|QXMB #IrwQl3=`Ş҂L'~=!)!WA3=[iI% zs4}ܽE (?{[BĎ[ uh^~vO 䯗'?~{vɾ}ˢ腾1vh32ljоd+,JNMsP鰽aNC~r! O%R6:$1{>K{bx־ĠGqxj)~Sc<kp(zx :vxC@R{ycf;;P\e#Ehgd5t&6P'l$PT+\ɏh[43̌*o5mպsF9{4ˍoY2U #EX4 t>a@ W)kK=mm $ci{!`FΞ_ YŮA^B:$ ۮD$%UߒԾ#LR8_@'~QaN鄡(u=1lBɅd!և7*q w_mW:㟍u>?#ք<}Qf?v" ОjU+DP9vCzN~ӷ?/jTEՐM$ 'ܟ-x:^4=?{ﶧ6D _*s H5t!>Wd|@Z$ChWy-:sæ,q!0-lJvpX.39q8xR =g{^p4/? ރGv'g=YB+OcX_Gfnr{j+=w|ysWw %GciP[ZeYcv OZ<62^{|ћ5| O /5>8a4o^#G3C? |Y^`L,Hy_7Jk`q|%;P?BOow|&Gk7G?9^όm[RiV7ou)lT/dѢD`/i0 1 (O+*L1RTwD0 E#I*euB)5ECXriEC&F&JG"4DtqWG4#tgpeVqcs$L!$:;,٣Mg]7[Ó,e6&!1yRLًu4;aOaRRDD]9*fīJAWPÃP<&0"~3&!GL{RH\vw#." R"OՂ(5O\sPG9jQsY ?W0R\{0A&f%f/<$!ITihuet 5 ߛ5FV#|E 8AqRbOLVT'#/7~;{Lu;!hRqvU ~Ya[5 D/oR< lZo~>G~ { Q| Ji~^<$S )6$uр[dL2_a~E'HL˗65HI~"E͙ΔZ;y9 \uF;2xQ!48Y^*k@7qʽ/4d6zc+(`(L-]J}hw6 2C$A  8ղ4.858\ty^Ӏ>i}:ޢOP[UqE_B;֘5a>\S- _m3#C>LF%.)ڽqnfL$ ށӜ>i`>=&0򼡘&2nmfOa=\OC{y}·ּ?'"%\F(ʸ/u&Qʩ/n['y}fjnqL}NӠ|3CvǗ*cV&XD3%,e{+(2I*SvQt0'AZ)όAnipt?ݧ :i:fHSFeeg]{,hMA `,U-Ʒ') %Щ_ I_Uv$tQ( |Pt!eE+"*G]Rϼ?qi8I8}~F@ >۟磔FoNYތb;NGaRu{cj!TWD\ (dՇXe 9>-ͥYqLp_4 Wſy3 Q 껀iұIHme&i~z~O,)/)+(؉畧օօ Ku"OwJ_iN(wԩW%>i`ӹUۛpB(=N9M=2 @ou^VXYX^o\''!nUo-4MbC_k15BD~0Ld_ w}>inG}ҧHRY-Sh7=^wPsI d@ƒ=hx>^51K1v%UúI4JYQ ZO#wi>?J3,VYf20E_<9+yL4MyBxQe\(8%8i2a84oPu6@pޮs@3Z{CYv~͔ 6>(~Fb(nHӶu]݌~e;4HӃhN4wky<.kp:Y@4 ٯj0`8VF]xfbe]늫`^:f/!W;*0=N3@kLI7)́\5Sdx% 2X"gtFb2=Om;M Βޏ/QESԘ{ g;B3N|n3jf2 bzs>0Suo d[}>(]Zfa94d5^Ljjz]G7]G'襀jJӷXMXvdlfQ&X"-7b OuSx|=}L%s0nWa{Jve>(K&fI#3bZakv1_ntv r^nk 8up;S]^h6Ӡ"Ⳃ"E@QrDʸ9f]I] $bq dM <;N_1)kfY¯wbO-u¾qQ$}ɸQue" *J!8L4( !p L\0"\6ڶ׫3jLjԧpv5m=F֌6pI̹+; H=|=}=xyzMǷ֛0phvk(%P_K ƕzv-XE.kZPh QD,4i@1sz{ ƃ,˞x -PVgRgyY7<[N"!+ _:P\[.x@(V4"MCG^@Z#?2w@o\jy,ڹ*DAr@"i Z?VOB}xy$ fr WxxH}jsh. @jk40`i'P,Jq n !N!kqQ_,W6Piczzcr\|G{r(\Yq-F~c/Ut;2 '\)|4{|^<0k PozW2՝AV&r پx Ҟ+LOn i!4[{'j员v q{b(Ş|>\5AK(U,`̎-ӭ?pv_/ŝlmh $צʔ̞\zQ ^,)Z }py$&S\HE55l0`V(bIc*xl0+ǤY9njy9|s?z (au-!q n;-J=cscwH<˦3EɰB}9"!*e=lIeNe@ ҵbV-~|6nle5SRh ~s7C1G:Ae\\ 磮ķ %=:Ahd+Į\>3<3Y {0BvD;xQx;U\+x;FnW9'T\TH{ՙ0z>{W#ᙉͯ9ೈ 唗59dz:QYI[AU.@;*P~>|!YQk'7 դy^ =>& Jɦ-BsG*[ҿEA xWMoik!A.Zg>(XLJQ:ӧ1N@7k=+3d&<-6hO4tIX|g$c4-Wڑ&+tkn̳X֗(xAL < % #F$}MIPJtWԫ' x %qa>B qh (x-lvG*DnxZ̉=Ok邫Vu;; Aʂov%H(z,XxE IKp,whsw'aw9Gj)9wr|=|0eL8>Nޢ*sRq IV'?dﭜl`]-I0 5=1_8 zꞃ[sNf'2fe{.^,AV]wq${?~l}埾Uy~`=e)eyuS_è\cSz9iC2:]iݞO_uTCʃ&C{:* o,,W[oxCY{V!$pzxJ7lg[I_YJ {kCHnQ,k5.kj>%P0 o9r<ԼpAUG*xS{=^=727_3@҆ oD3 DO3叴i%N@#RYvS7h~YG$SHp8-wdm<" tw;آФjF\evƤ˯nlofF ޙCvpk"͒ۉf"caԋ'!1lURIGA'W6>amz<)@+3;ff{|)}5ts2 >ٻa[\SEf,UO;4,txLzjsr,<ҵ3az0ܾ+`C3)>|,qߎόQNS)nY͖Ц'F;c8:8Šc7n(A֔}h].?^GXUq~=<#mxJz<30y2̴kn f0{2FLI%&'?'XE4noCtG)rr$vgul?.K6^SL[J/Yij7G8btAvsJ76oJϛBepc'hyy#/Tl\~̌7?x M١bC!iFYoҎ4y3 `т3gF?^ޑiLٲ HiP&OB>ʔV`+\L& {L*&`.&TqIҰhkSiۉS^E{GyD.p ꜞtnrM;u5a0V>' 3Aot/,zbUI +~$o^- 3x}ܣŲf*p=;{vٳ}s/{7|haRlZfKJ/A_tOGi,H{X=D=s-TԂAɎZbJT{k.Mޅ_fn?@e}<^K"NC7 gڅt9 *蓷3/ ~"nFiwy=} zq*H'|UGeDgɪn1)ϊcg+4l1hHUNU5nk5kkP+\aPspjj2q2 !8ݷdjm?\>9l]~Κ ٿOV!Hr)ȦUQ*jP[Ų"N9e7-,ɒ4XWz/15,5 30&E_ԧzi7 3 J G"~*+}oeXtם,=zo`ϟ????}?4`~~ %U+Ɣ!<^RaKMϛ6 } $~X$o)'_/wϻyy{yϝkL>vUE$mZ/(JK"  D"YX<(>ۤ,V `NuMI r VvUwWO`BO-7l[iۙ=^yW~w-i?H u,)2PD*=rwC̽2 ,+;Xy2h,r }0'yҼ埁4I\~gui~$Fօyv!(KN2I]"T1楮k2֢H +Ϛu.8J+] 95l##%;= E6ߴհg@v;c_t~.ߍ<Wp$9wDt_?[]qa@BT ԉ!zpUk%2JS؈_R͓36>z=}eڢ?.%?^[@MP ȯZE:7R_%ߏ15i3fޞ;Es']~|Ax)gy>zI{T;Q*hpIu'ѡ^zN[B_9~G? IY8#Uhd&M}u9s߁IT3!5!/ Y^sY;x/l{rlH Jgpe^=d˭*?&M94T1Ⱥ1x `נ΁90T(Kamռa o7@;#Zw<;'9]1eÀ\f~&P >#[*P=;zU! K](w"c*Bf1B!f4Eώ0<4 ۛҙ#os_nwTvw{4-{3-{3;;fOݩ!dq*ŸYבsdqyԵU3AMpoF`=kb_W~EWU7r; Xӛ5Jm_>YnecjP5r+D՛`H6VP׍ئXvNSdR) P}uۭW3EB[1S]|.ENjOtg0oQbS#pUqǀy~œN UǩI^Լg{`hGвjaN {]zI;O_X%3ɢ6"v`I+"ty+BVfM_؛m#ˤf>zi5XV+D9sJ JZ3|a4 syμ#We~zԺ:(˦u6ZB+֤FX9ɗiS]5m656 Vj;9ݷp]o1O.? ^2pB]v&dq&?Xhf:ji_ H].ُ0xl$sx)y>a'&T> &X#/ӖN6SL u%N adpHp1xyoFKP] T 8IvVWdt^SKbBkpC~2тpuIhQ,>JjW~uKD|ҫ{ŒgFSIiCӃ<ϋ<=߮ _AR0p(1t1dA{LJſ7N"yۻǶd>. ސ=|.|lM͸<_? ITOk"_O7|G)ܦ ԂweSY _]l^S6,1'Nd&a fkM5S{~@=>zi0),=%"u".;Z0j DIt(-$o"@Fo'ﻸ=y{xL8+O|+/54h1F3p@pz|&%*>ө{S>lcvLvWMX u{͋,T[}~m#Ot8HSQn8XMy+| =>)I*>=Al SxlA(2d" 5^qAMP%_`tun~`2ƃAӹHUh5czdt m|1]W^|l @˼xZ%lϖiitŀBIE(gUmRe "%i7S DLn6w/>o|=7v.pwz8X,AAy%"ix۠.@jw5MN~<- /s(wiLcDZZ|=>2{|#Mm>#9ٶ-XP5=ɟ M ?"D=Yz?ƒnwg GR<fʮN z|Jޮ%>` l&˳д wb~?YGX$MY.{K٘mj> .3}!킫yT6&Wug).JJw1X0;]2Id z|fۮI$}2'~8N>udɳ?m-k45K&.=f/? ̴x }BɃO+ g>ΞlI2s\W$2~IgNvb\`Yٺzp4-cM i)( l 99ɶ9aN}cV5'J˰"DQ2 rc=F_ܬ  Sxdh=O XxН.wG0lݦswc+q΋]4х.Ae""p8F]0EЎ+gpcMYz`B@CW 6~#֯Uz/jJ-.5\;t?, `mл0U'C7>B؅Gρɯ!Lv7/ %"ˆˀ%FUddO g2Y3>ș?/ǣy?Ӻ%Noj@ M2NotSAk2DCHr+)(CM!ـ uWUl (-e͜>~Bs1d2Τ!vQt֤h:k+:Cp`ڷB9M)d},&U3 W3=:uZ6"$C7;XvNw '׌*3'W+e|}IZX!<6=oMIFu+3eWn*/7t >RDMgqTmJ#U,ŕ/62HQ`-]W uqxäMUڴ6:1c( KOj%]wD ԐG Q!̋@F̫ l[1"-%v~A1,OF6Fd.V F=acp[C/Yb3nUa8@2mDB#6c+H46PE$t N$aV@k 6H8RBJ9'A#:}خE’gNyX-bCy4jPzxQ c[Pwa12 E)Vp"OĤ2L"(bA\/d<6ӷoOߞ=}yf2~yN=}{w%n7ӷPxy=wD_}o:J{1޷o\pןcJPXxxgUG˓`> ^ 6_m0tPw\R7$qG˅bnh~mn7'{aGUORއ"ؖCM+IfI7S6i: RUt!!~ Hѷ_nFEx"Q$&,8ƒu#݊:[?O,| yqO4lvǾr\ò\@-qp(|]<zL#ߌ,#7]eǟ渮5 3i~H5/̀i~ons l ~w6#!c."j=d!w2Mb̓f(,Y-ſ@#!>F1]4@G@H͢EL'~ii?T[u1ue7:Bv9xcL?iTe+4# eOgqm^ueGLsqbXQW 7F1`iadXAQ%CӵFj+ەqA,Z-mI:{u;6v mIiL{5CVl *nC: COSL]1&I*ǂNV.i=CmPpy@< Eи )`x5kgzm%'RJ+H8d]xyyqcH88˭bZᙷd0&nh1tb/f\{g`%;kcv=L 5Ox< H8;<˵^w'GK C&5 (xq8b!rp`&;9XQ3]36Lin0]`SF]ubdV(7nSy#Fbdbt7vFwGԾͿmHAd;l][o3;˻d.ێڌLnpIy 엥\kD[_㔮ᰞ/]uq=?*Goe 7R+Vti= ~gt ~RN_CC4/]T@>5L_yݟj_9s 'ۋ7=TBB PL3v~Ld g,ϲ=Y)$dițܻ!J @Ў0ֲM;ڝ6kz=z|wb*{YWۄ4fB +Ui6x`d-.SST#%kZ-kZ4mk{Gꬅh×RNĝ<ȁ~\=1'Z'sRgQ@uӮU!;b!&#SzX6,JWxT8R@HTK@+jC1I  7 #ߏS %ވJ)x'k?_ ꍥ-_^" VA],0#(Ca d1&?w禩.b5Xd".+PƆSd}aA- ߧ c!Wba&Ah+ i &Pq{!CY m4 ƛf_kzې޻_?ׂ`w-&]|XObbwlLRmpby->{'&W6k(+11eʕ:&yv >ӧ4LܜP6hG9m7^DS&fM ppR@z PG,HtQ pg^q(+j]E{].Zo]4/ ~iK\̯_8AK_ʥA 8$L_A_FB9!G}ȶG@,0#Ki Q1 ^d)&AGv*d+AϭnB:Ƥ+Ƅa-/虋'  4݃ߓ@Q+T Ǭ+փ[4v1Gx+U[ΞJ/6ףvs༗~^xȭkxy8_b?JϚism n(?:; [Ǽg6,y? d%A#%AK_fYP cYy]yzѦ4dDvm{& Z@g'c#DQhsT CEJd ӀYj-`DŃY8,.Y8XK7aa`M^3t2ЇNXi`<&sp N-}r>rTγR[7rLR sh*j4\NkE?Y+h em3+ ' ?٭6Sw p -O;0m&(ȁwk}^LL;K֌\߾`[F5RJ l~}śr}ʼ_| 7g[bkۉ~q7~q&6zf_qVb^)N[yIZG)' 1pwJ^ GRJj@@B@7aCӰ՘؃՘Kڰ1Wt"аᶇMS-7z@|Ɵhz2/X-g&c _ J ]/ۣ ]pu$BPdPKVfStX.Ԁ$/;mIX:mb? sIN["h9uAmh6=18^Ѯi2֪mvr5c.~>W_Azy}0?Ri ش&7 7[Zږ[Qa3_Q$\m 4vE&-Z94xPyQYDZ^@ L ͬQT:TLw ; ykA2*ͰEȹ@.m|"떢F ahPiH4 L *sƥ,^nP0*2cj4))`s)#&"]]wwt޽3ON0­s*3 }lv ,NY j;|;|; =Txz{ D7ju[1DVGw抋#|<~W?O<@EU6nH4[g:ˏ&;|AA-&[53N*6ƴ,oÏ=WH+!.*BOPHNx[zP:rXGp+j|5ȟ&P/\e~`%c/-q,DG*"?E<^J/>݆"xuP3+7 e}^f9@>zP/6ԪAr ~a:)h+@m_N֐R-l엘JzCd?~p8&+}@N_Qp77,y&kZaj(sR/3cKy]# `ީL?LJƭQ)ck5e7Fr><@(s!|Ο@,A ̞ JPYRe/3D\wj(wŸwb.;|j7;n`=[^\y ğM0P?ف33J٪?E? 3* \W~x6#S 5+0يҵb3nq}ʭ9?+P*LWcb@<t\c)& ( !4)qRdLL\]_,MJ?سZ+H9;+I8#ҒΛH2bDD*i.l ˙˞$kI&7xv_7Ge{گ0y5|Xꋽ`,|mTa<'w'EldZ&])#b^p>O& k\E AxL£JՁ%<@ `6v\g9Fi7Dw]\EhH^gC'aE< \UCVdeO;1 PQMc z{:l/tK8 &YqoV*E 0WI|eWT|@)UO&CcG|ЍZĮLT -Θq߆io,,)-UhO8Ɔv.?Dk? 0HRD0-*MIa$5m'bԋw;\O BM?)qsJ$\u;{%bspPABc Ω`B3R/KwA_>~|ߎ6C\Q  K9;I7zbۤ\2hiP@Z; =_ X,О6T"@V? >TA-z:'U@F-h;d'ԈSuWAXШBEW2xԴUZ\tJx(u#:_I6QэtEbDe-A_"M[K)唐 EdWL#&Mr#q]xĎ\/xmR:eeʀW@MqM[TŶA` hm4Xod*7im. Oƌe!,+HmvX W4DXZ5M%Q TKM!8| 5,]"~ Hn4iC ^TB"ʯ  2A"lV*a`$Pқk4 r=˪>SY Z ecպ~k]`$W>_<- >ǝ2>ٟb.)h0qxa;v!9X5p+-n篚1+nucUEKM +n0mT9y85Q*EpLGnPӖV] Z: 12ά7 n!q*ddZ髾 '1?j/ݧS`pܚ57 ph=ϼ?6PxyH&B⨼I=p7% j Rn;i&9$ٺKkP?X@[#j(XVC)S{{ ;H<_(8ʏϞ=ໃS1[`y!x{ \oww00c d{Ů91[5شW゛㠃]toca\/wM('WEb vF$cl/xͦ0 xi%˺):%gGEv$ɎTێGvd.v$)n+9Qʦ>2ebGv)v,tQ 0i{16"L,'70W1Qa"&3pro&DU10c8uœϛL1߮`ˁ!}'#u -\PV8q= !6*ǫ)D_-_έ.ˋEEv+%^Fg&k9Y!Lñ١ F}Z Ѣeyp \QhFhJo< 6W&VN|(Ky@4=}1>S6Ax,\ 8&,w8Iz[<ܓr)ǡź (? ?pU|Y5M&.!xQ+5s|=y|sE™#H:MLN_S=nIԩI=>gؿYotRs!"$XVkYX/uosiߌZu =IaVՎ;'/o/gʿ.9yLۘs8Q+◔iWo@-Gc˾I}G36_ݮvo[#^+)/vEb(4;bG' ,bvaIWd ަ9]\f넺@oZg.=jlQ470t Q]898c2M0MLx[OădH%G!#kRx1zZ'= |\{A5_?wjVLn:V &>Dſև幆hΧЌ·|U6f&عc7KG B`:bG"X:u &S@/37qGGOֹ34OdǪ竫Dy޾g>dz_!_VVQ)d`7 Z!'m2dcO=ϓ;+k])X/.xo/sH96APd;AʙD7ai:d~L#,HG0m0ZXXګ:;yIֺ;RMz?1}&n>y@͒XT'%h}܉>kS y&m@Rp#)JS_|\$xAFrWKktB+pٵ~J+$#]6i1HkdE:u}Fg.X{`1.%/&C|:L̺sq.D{Ѵ$㽅"#%==E'~"~I©NDJ Ūf #J`L=nDMnh!ff Mm/4΢8Ї*񆠞$4)2C& 5x?0?~էWwt'Wjh4l})#^@YSF`j7n#iq7tn4n.b:w20pCE*mI/t e SNxeC#P n'a_J͊u+oS>Dg1iL(eF9cߗ8THrȎ {Wuh*8E @d@vLT< ]hO//^8 ;꛺Wb5RMqXM cuXnL+){GȪNZ9=V:eƁ06-XF'ix$t`ybdtY~KF;bܫ~V-tXc, /4XYAXW{93:Ure*7sGf ,WY@q,[;PT}`Me+>T(6h} =rcbOյuؿ4Jx]cpW챚KU^`3gn|2ἓ|94s٣@S9EN?nU"k&'C(X0] na tmΌ̙A#14zʟH znYM8sx=r;nFי>Andv|-h_\֍!ˠ5fRQuA W5P,tQ;*^3rnÄ1W~ch^]c5#\9Mi__q/~ɬDž"%i ]1 ~ ׯOk|llh))Kʕ%"Ӳ7 ]=dk~)hL 2fzoG|n}9NRwzdvӔ&W6ݴNn4=M8mwy2[7F=P:QPQuDhR0N`:b%U\ퟎǁΣ2 GUT=#%!WeRRwfQFЃ5'yMH"TP?.knAuݞ.F džTKD@cИ$E9G{tJt:?Iv{K5~ʍh#$%s: ĘN* ]7LQ`^rO4p..v8M ve(@>٘ K=ĂDtqCZ|بK@Ū%ѯ\e2$6<'{:L<=8v#>suG;>E4\h% tBb[͞i{mN90"anVg*zOZM$|pxzp68 :i,yv&߾Jo;6orqb6UweQ;%E'avWP.ȍ}xzp{xxip=K1>XxTބF }CfS}ؼ9V$w'iԩͨwC> $9+hA÷mx.[sr\m45ᩯX)25MkfY YFY)ٔ)Y)[~HO1~(|+ Q) ׋ҷ.r|g !5b e'w |!xLw5-j+A-W/aܳ{G/xmm![fL[ m} ŁhCY*7.WYDBnį~u_bu`{:ܻ $G٫v @ g{X 3F@w@sh?O>wZ>*_C O9 !,{q *D+DThl\_PQѸ OwA^8cmfw0X7m={x<fp~1:3'Hu![Ji2j'? iŤT}<3jK}bRIŤaaRoLU.&V Wس@Rv ]K4|Tao? !IݬD>!Pg1x|0!Ә|+w٦CvqF3:Wi(ޜHI9$ew~I{EAk@G=I`lR<nhfD Mf%@X\c{q]+σg^^e+ Ol4CgD{/tiUB:PGa31>Ѣ]%VMQ6{]K[fv+wYiX0ضLZx{Y6g>NIұ}ȡ }ޜ] Elsz\ Aaj+|I"0zR{4 ӝ25 hssXw+ 9H_iYwk+J9 ! 9>iD_@$d3sõjrN/>)ZFj&/, z0 gς`j})jSj M"SYw#b5/OCIe #;֜n'b ҟ 96X|**T1uؑ[ L%#E+p0q/ sym, Υq݇ I8ۋe~dg4ۚ5J8 )&Dqv;̸Z5=*xJ3]8NViAT'=Ή'1sPqxIwƆ >^A, 5ԀKWدрD3@gny۔;AANju'+P&x?֏1֭Z?;GV`z p{\,)2W)!hAZ^[=x\-)_[h?޲_\/EO&dx㓴LXɶ}d{tq!!AQpAJ(P_1YVB |g D@ݖR<>MvrFn Wm < q!Г,q JG+#lË/_f-些hq!|<{ G\"#m,nDj{V t9d> zmc+#dЭVD8ZXezLJ³c b~D@>f}#îxd\N'/¨kU'O%*]m >rZxR.v,Y׀JLWR)y[窲510J]"z}<yޒvN .&W^zOmvq?,mp~8mX89ϱ\N;1 |QYs.Ɋ=dO;`iRmU-:7צ߷8 `X-\9SWxB6Rf;f~ ,`4v 2&498TŒdz`Jm 8ЍV-Qim$ߢok+)&fr[ ^?+ȏcK`KދܟS.ʣ VV pۉưCQ@n!K*7 2-r $- [ژWRaO'>~23ėxCQѳ`#`,yv/hsf1MrdC@4c6A9 4>Ѽ{o=f VhUh4B8 W9O5 H,0 %YMc2 4VԘycBrG$5QdÎ׀{^Il,(]%)K/PfR%HH-sJ0 ݽd ,۟_YWP&  `zo`n}x/瑅O`5#j: }5$εf CRdh{vl u:ޟKtm<ΔEQ%P9ɺKj.XV#:.J{+:2cIRF?Tp}+><ȾaaV?Pػ%F U +ρ5#x'$^!qߜ}n+bJ3%ޏA!R=JwGy0Ip|&[e05u8YeԠd*Sbb*\e/}.6Kь=+_K?ᒑ}[evŰ8Ye*H #p /x$kDMU#OiNT*BJ R |>p7;LkBV/j3jt'+wcn6SejH<'Uuzt"Kk=lXZR!WŨXy~I7[xHTݻW},RZu݅}֊nb1nE}@1=(({ʮ!QSn}}.foZ>* Fe0qAbOd!4cd^J<{ݫI?U?Qf!4715U`<`~'{SU~Ij`Yp:i{NA( beBtxd ]aڻEsIm],M͓r-x{nY&zNN.M4j$זz0kXZtK;0;w@?|;?0_eZظq\(/)k-c>qvۣ6~,=ڢ݊iqzu"~4Q۵{?~o+8yTb"ߑzdS")̑tmLI>"1pa;& HdL QTuq%͂  ,UT߉D]Ivpu@3 G݀&ê4'bb~A֯ #nh X@}[0\|$-JP=Ҁߍ@_fo On//Mz)W]5'J^kp7a3ADr"%}by2d 1 /=Zs"TI.\_K_v)y\69 8Y&py~LL%KhxƆL<9VgiAjo/I %핼_6oG::A;& B[-zBp#z\-g4&I =[+7nԌqaP&l^+L9?Mj1_Q50e_UW7kOa4EQd?k%JbJӢ5e湼l/9yRlEF=SDfJ72 sg敓D~?Z>l+Yc*H[XoBW/b>`xkeEOEi o$Do"@oц_D\Κ"/s]r{E|cv|y(~_GvvVhKö:`+ 2okvb &|`EY(-!( (-N y~yOo5{ߤIf~2fS OTZaϚ"~gE~$PKGx K<:7H]Ia{2˒^X.n1YX;㳠(B(]' dӝBϊ@vz@۪1]0Vx c_)"Pa'=~VGGnҕn\Õ;syi?T|/JCJ~7J/N|_ܿ&?Ј/,(cNol}n|] y5 yF7c&-kGq 9mFA QnR%iW4wj$(1F5O~NӪCiU󯂤Eɪ'9j>r퇠aI5)Y]6\#f7CJΖC>L/B tvj}8F*.G^Zy^3%Z<-P`aO]TªHNIɋn;+<޻"m|HZ͛~^*-6|QP ~S.Pڨqߡ6@p/ t88G G[ N :AN7,zݐs 4HZ>F(-N s.zy~/2A䜱ܥQm*B!Fz eldXy "^yዴ`oPRIPZAb&}.:Ef;d5q-Q7[Ζh=lG.<<0}7+1)^.c'::$-JsPALΗn+OIJUGMg-UZ(_;Tm<ڄwɹl+pd^b< x lo.w|HZ2m#tZ`åloNI{ Ex*Bϱn'h \7 ?翤4(o=N,'S7G3Hؑ }i!u'&&c.^ }^?xbS%hυ6N1f,`Wq ʗ>,/nk? _w&Q(-O l!,?Np?uکg`{}s1Jc9*9݁$$^n*A c8&δt:33ӈ^BrnԍJ&v?.^ VKȄJ]ݭfivR˃漰`v;{6LOx9҆ς2 Oe>+-|V-ݯ㈺1'c, kFab.E1xvK쎝U.JժumFwP \O\q6.v?"v9=5TZnɰ}\2?iS1qdo*8A 6h@#=򳻶b Ƈnxz$Awmc֔crZrN%d3[rPr\bN(p-љm{XzlEe1CBeɰ6o=u9*jѺDMiVfDF]~kks}jȵۯV?ʭ,!5TKSaGťӞ,y2$@G~Zk}{_ %U2:Vb\6Js]֯Īax7oxg4SܧX6LҷHux#7▕|OƩ=¬9%tXIݻ.'eyFWҹ?GAw1v n@v2\ xW{+ϋsd,>Yk6UE4Vm/!Y'H#2~8 (< nʼ|h]!Ee7P-`{Od@qvlo]!襆jTAPNOyhOH7+Mh:}#j1 ju*\&Ű?aI/4SmrkJq%tf_ D 4ܑIx= [I_nnG )Ph%ud )4bB?b0 k`P<3UVGBû3pX*Ya%~!+hp4q^NyVAK Z>S6K>!c2a70BY!},} *9Ӊoҝqbk*u4UӘ,A)ЇRNCdv?(OPѢMʉKzvMKYL=Cz2h38fGB F{q, x*m VӋª}6&jܵSp]1*J0K(=EC?0?GNYNT8I4-duQ/-dWKS<|+*z4,ԈORjm[H.>Z%1گ!->-Lh2Z՟l<@es/H|4EE}enH~패^X}^ 8= f5~$m_` "g¹\bK"Ye&0-P* gq T4e_ۿ*g.Poa 37c&zҎqsP4Bi:D^[iE2fgn&qh)z/R_ TҨfݪV0K 6uju䠀|sK%Fz⥖+Bi˪i}P=>T0;90Zt<-.*CG=xmÒ<|wR~>ds 7lgkɏ@P._(v`Z>~Yȁ 7ow8IyY[]0q!)20݆CV`R:Y > Rjr:'q[j-P p>zɁ.=]e}Q/=!mòw3 l&YLr`M:kA&Ct=rfnDbb"~Z"HSn1Uq.y|&v7d_$gVP@j;'#gՌDXp*$U[ﳚ&#N_e'/1@NFv2ђk&gzDhe'";ىNDDĄdo=g'";ىNDv"k'xs,v":4Dd'";-O=D]mDdWD_i"+";ىȮ}d ǬR BYƈ\x@m14q:R78Dm k8&N/1.xp.51YGw9ïf0ӄm)v̡XêojêIX}E0rⰩ8S~yl}cB=8yt>R~+:P lz:RpVY: ![OzHG.WMD?M /0I˵Zׄ2Ԅi6Qiw:Qe#ߠ[7F_n z-`\~ >ӻVCИUܠ@-F(uUI6g<;|YEY*vVyY߿J6.i#S Muc\PtԌ DuefG6kC=It!XIJxX䡚 $iJPOeqoC÷( }k0jd5'r*}zy/_m*V5U׼+p PCx2:Fm/>/ƣ=FnPORRW{k>ePx@ N/,Ղ*:n:!V,TlKf;=iuLHFa.|<\',q6nAqbR0WŅZZ|@^ :Ɠ Boi{~y_%dz|Vz<9cH) 0K!iY;&.(#-~83rBJg]'fbHC Q1pQea>HQtv>BC g钊 4rT bxa?KP=:4r@ _mhmGUІXj G`kϷ} :۝m8 3y 5gܕ3:V~DҙM5"A5Xﲲɝd\L&*yv!G"/yjNhА&hE uDT/ 9xz:t/LxTXM)Lo41f|2RIzF8[áwm*\vCSXh|̍sQ ~ZlbVSщQN*1A/z+umsEudJ2+$Y@xutú7|zuԧ`}E\`?X>hQ]\|/I]cL)5=RV7iu,֕BL1lנ6|%ڨ*駇3TV5gQS6{.I"I4j$H)IBtR>Vpָь-j܌C-VVsScZF%u} O5C+iʞ8NhW|mrחR XPw p4c0D„UN6pMJ?D^$zϧm>棿%=nEK; նG}`E%Uvy&ZdcMf^#>KL 2VSAA(ɨ̎QpLN OGr< XVgumoq-6/{O=DwZ'ˮ0beɮOba-B]]d8MэClE1<; ݿ]t]"^Btk3[tm:D&>?>qGNYQ1m7Ht#ӀeEw͈98LS:Eo@e]`8s!y\ VpW$f !jm7a_o]?F sh[Q 2[kD86p ܌ttk-RTIj+ch&0(xAs*rھ=={7Ƽ=;14q;6b:Q\;{lʨ?u m&am5|S+MXf!3B]e'xvAPk:@l %BvW,TeuiL_;G[@' p7F=cH!is,b=CVHZ)wq8$ MiNKPeiöJQE"F:Vh.Y:#[MwN)E u \j1L{p5^ u\݇Nwp&R`Y!-Wl="{/+NrIR^. 4Za/]j7j_57gXǘLŅnGhS1.o'n_vE<".{ZKϑ,J?3]X:Y,3U{d-ʞCR¨rV^JwK<1. Al5jd^Ό2 : -Y߰~.:ݡH؉[w%rYլ/q xn/uFؼs+"^t*?t|fz2G8Qdaݻ;.QC4̕s]ƳN$?H:F*rSuy$" : q x,U5QmҩU,T͉M[_xJ}8eJ9FsOjraXeeq8t,^y04iHW uv -N Kazx\.-=C Fu8# QP w)#9(I), T8qߦ}#MO6-8kXRɃZ%6$-HOiqR`JzN[>n_>† u^a&ыQǣGZ76`>@IUr^{9ܳ2l@ZcrԲ'r(dk.tq{(e<8f#>˙nCNjw5܍d绨}r}K0)mn["J/ǟH l{:HeH7;"\ 4J/{^fq4#̛˞2u=k9!o. ;:Fñ}$yk!+3)A5zU#Mс\p-[9xl)EDWQK5%23toSGW]q#Ƅ8a'PEݥnD5$q09Pg%8NZl~I++7WvI;Mͥeʜ rsQ5Ҩ{Lz$/Gbr\܋LC,Orw޼_6PJ껁Y4$0S-VO76(V ZHf*>$5HfNIﯯq>TVIP d"<_BIW'tY${9m_: yټ\ \%}Ð+A7tų\S  9?Nye+z+|ߩ2.^1^΁ 95Lxl"[`dU<2r< r4M\y#s9fm{@Q HXG %I]3pBa$#|+,ixP-&K8)1f4 9<$JֵnRӼfʫ)e(z0VDAuK>cΛ ?w3(܆'q(r 1uLh퇟[xc w/jn޹6>MLځm Lě9md$Xxp/XE\h.C}kQn.yˮyUJofT.~x,&:+ ĤraL'AΊ9ߜS^Gi␼AŽMXqSl&C5e wox iЄ7+ o"$"poVmw+2kcArR܇IG0'BR^|..$syX7Н2ۍYԊ4NG_|J(LdjUZ"SϋXPXEw\hJчQ Q9VB%n(I7T$xߤP'G0x"ߏHH_D2SM?U^,*|LIzh O5۾Q-p,TR%DY\{/?,<~ hw4&ęNɡ ݒhuH0N8.ZpL vÁhʹF8pzOYl%6h}M "J.y.O2L7 61C 3\|B~y)DYiu&+IpOX.`+Cxxl (MxEmqޑ'5;EVV-eIƎec@3Qbf"Oδ98^zl٩KZ upk]nt`W@rTM&|#4 0ix0'Fzgxx'@ui)w{z#,7Z`-DY1yQC586f$/6rFux8%})a)36 H/vFz@|dg3Ra;Ӓۘ%bZi-oZJ}> 3uE9rGN{>^ |yNS]N;zװ5(]x䦯οtfv :>:㣃]}ѵf`tEUw<dsE.Kz.U6efY*RgE,fAL86JSY>b% !>b63Z(X fgM Fn[Sp>fi,zZGpk"SC,1$ĥ$WPz,h_;٧TjbKs|pL!$UR\!Zsqi*LS~s"I4(> 6q_0K_a;KYj,|Z?9䎝*C]R)=s~U`M!]cwvrzfd'n/hrp,p _A[<$MN>°㇑.ԃcLNm`vrӨ 3A')v&h_zm Qvǯ>d j *ޭ˵q3HAB݊BƗ7ǃƃhzR]A &^e)\5w8 Ikm~Vb^H.#8U [ik^ɫGULC?9/^rjE3o5s}ZUB'hjLDU}DEˤƑShQklfFiW:>Y,s ay`, `LBL˥i7q`(kzhrdn׭@=2'.txGʦ[H-\[EPMqHo:c e`n(Ȳz'Xhlhg|ɍB ǃ1dx9k|,$m  4S5t$6h,ɯ6g}BKZOb6-cY6caM2eֱa<ȠAPX4ExևA(~W_O >]_qjA@jd)}\Y;xB#kK\smw$/GR'Pe]$]Vky;q^tx?1h w_ BOgy:Tp~o$ӱYΨpo{-K'1l*3hVN"[?VGr\R #S5tWv!SkZ^,i<\D\\lFPv7 f~#,~)~u?UXZ%C?|cZÍ-hʛF2d@r\ES7X,D듼1='1 =ΥC?lyq!#n9BӁߙs^_; ؄BVR_:HQt6Bߜ`ә ꭠq j/r!Myy|MTL 0G҄vSOXrIl >ǰs"7Vxz x3%p-bUa9Dv`+_Sh 2'B:nSӔ h}C=HLn< U=z `Pcv{%H(:G g^jk!xIr߮8pE/Аφ*2~F@Chulei>;\.XrryOIVU"]a !>4ШeGؽPcR! rB&4S9^lT5+q>ݽ¬:<"yeGl(­^1éT?Ɛ|e~Аvl\~Lar{&&wdfU΄pebV."=vؑ0,4Y`ѵyTB?Cs:we:h$h=U?Uޤ 'HY Ib* 7˖刡JEԻZ^S=vi dYct/n!UYflC3wb}Ђn/6R.:yyr%rĦ$'Mą*~rmc:c.j2ypWk쎤A%ccťgiaM0bm]N26PuV=Cc7 uCiwn_‡ NDKIe:ɡcZga:P2Km`4w&<qk+odv JbD9/߬Ov<57Qv*dqb߲~jY}8- . *=t4][ղ8g, X˖MZ룋#g-zkc+wQ ΖFG2qdajZEy&;kCJ{!/cbrDqV2q Aá&TjR\(:u 0k×: + xXhJ-]0X9?Q63i@2nZo{VM[;NM3 ih`YqpG0Z2M|Z 4̃x6N# Kkol-c/K^#jŸD] 'qZcwbG;j`qjJzOa2B7l[{Swx>e5ҟNX 4Oq֧.OM䖗~AP~yڋw8+6^D10h/1V<'^-do!$@RO|2 u yf X:!uqz=;C郘w@K)#Nz' .*,J7Ȭoa`=~ᮢ\! Pki(sF/XhZ,|]BfS, \m`LwvW]bNNμnBwn~;w CUv!O%aիbe*Dج.uP>;;ZFϻwV,~ 'os<|rCe"Wo6mձ/ҁ%vn} ثt!Z(0ӄaVx`Ahq* FDLm {%ao#lcF<6=}] laeaX(/Tu2 Œ!]Zi ԑy,\N3Bjt WpvӤTUkZaU˚/fa½va ]`h`twy3bS$+.Z؈*4=">?h%߁?mڒa" xrJYt,ߝdp!yd^ 2p+0ꄺvVaT(:*ȡIRa鎨E>nkC`Qe4~ܿ*+$S(ם+qV@L^f* :,__t]eOJ}kUV,\N/+ر H)CY}N,4'J !E+> psYf)/x\DtA&~C#]=a=4BSFX@܏-}rBc"(IF>9`8M\تrřӨتF0|5 Ag\.hV^mb჈<~7<PCc.{)$^Hk/ElbCBt4H}}(]0wy/<=SUL\nUp1nry(Dx;m c 0D~܊I_fԃWG'ln8Qi1WFfzHGAc&p#hy@>gb Lnh?熝 ӑ X2 Ajŀ V؂+ 3V@!wJj_֗jQzF*޵]k)UiB{Gm?ϩFyv ,U{ICbH`*ك7nNm89 D 0^w#|[Xfnͻ j}>}+xS k:?>:'GЂ3J_g/@m~ܥf _ۙ ֑ Ej>CFǎG5KPlW q]˭"45n yⴓ&DPxB;TڍH6㑒td<8UτodOn"81R\/롥x;*DfQxuh>F@@@SU6]Lձpr)>`Ʀet ] Yu )GZVrt]]~tl CT)Rmyec֊m)G+Vl؈[[\H"KGl}تVtoI^rFpk}:r@m]Ib޻EH*taXěXq\GTY$X$Lv2CC>laCAZ;_kQZ Lh,ɡ;/{y5{TWlTLcgdhL^耇NL^nLD}BDvd0EzoSU v%n-: JY@m 9V88!\TžNW; `rШ`1t ߏGz^< HUqZscxQ/GqH<^Z*Aw81pw9gydn+{tF%3ʙ]ǙPDH(aXctRh)5_#ץ^¯s @Z`K)%ETEʆ(4hS̈́̂MO>4ȏҙRaih8Wy.߷/NUTPYb<pf+x\![d= [L޷K1~v!4b&ƇtK1oCRL1"AVL!o0_g>F6r``%W%̪5gN؇?m/7NI5~ZsB7f?zVI+iRA9Uu7 s"ڪ*VP᯸s-]jof7vrZa%1*5 Tn]Zm{wrީXEJՁN6T}O;;KSI de^N 29ԽWU!k+Lb~[}ͱԮ%TjZ9 ,DsN/ˬ8el-MgEOA`Ե~m9PfOzxMYCG$u),s/˛[Sc+sSIS-2ꄐ2<|@(%" g jf }k-?r!R'erǭf>Ј]%,0SNP'h؀O82'kt?l2-x.U؞ )f,7ه;}EDGr~p(Y"KLMF.8)sTb}VB(Ifg]ey DAK5;O!x)mJ(C C ޫbbrb>Y aBU~q]M3AޡC[,Q^ˁ]ǏUJWw3s%kL( )'4e0OK|§]w%MtT7+( Y6}t W Sڰ%)UQ๫6@7akLpv5}9=L}88 SΝ ,Vcd%6%^p4=\6\ RXʛOiEXc|JYmWN GKd@ t̺G6 myNJNe ;[B]g鹭&T) Sq'3 sk-'\);8m &'FJ3- ^.T9B0 O@$A\ጇk| o)D?T[0;KC>x)4bzQч@ ;hJ_OũC&ݾS]RVu| u42e缠D M_O&mET洐¬MLa>|2 = :x/6 QQJJ.rp{'+գh4~@:b 8 &r]kD^l1gaߪcV|X5[U*WgbiUL*x/L/HGJ9`*@)Se r'y*@Y=P^@w"ekq_2pQ%;rE6FG6\cZ%+3spB*`}lNoZ A_}UYz頯T 6?׿Rڶ5=Bd ~- Y[@Eb JȺ '*;O;-s `V;SH[NC%iX8#p|%kK >J.&L/(fDSe GL;O7(:.oE5K/B^"sT ^~h#%:-wߖ+^)QIU]k޵TI 2,0 p0*cg@FTrbN zYf۳GJq/H2YϠ#縨$c_:S<2h3$`V~gٰ5%L.xd/g= 9~_.ȷ@^Z׮ ˘ت"B, 2_QSݮs@'Ep~`dFKdu.>pj~m U?1T)ZjӨX pfѬJ4w!'тTSI(X1J5e xll%Fԥf/$5`9l dEs!4dJS7}eӗ8fPnhevI0XLO0I`{zD+ 1*!tKK|X`u:X1@!آV}Vs:h<1"5T9ƫsdU:|3>&Vh0IAUlj/˞[j~ LM] 23oUݩ[^_wɎW]PB9)gr.zՉ& AP]+$U[r,,ÜyZ]*@ɭ -8A62+qP 7mwi\J%%y/%kՑ<)Êo>@UhG£q $0jܚ7`.&|}>IY-ReOR ה qP0)*)R2B>$YZQLP(8s, ͑QcT^812Rei"h ơ$>e6$t#uM-e-I{DI~Jr_$\=lj]7GiJ, (9.1(N ]ao=r!*Vge'EBs\&ة0W%'7X*`#td @Z yC5i}S `hL nӺϒ"0_.H<."fC.ތ`̌84V`"vu7hp,9\B2זܱ3Onfy'[@荵jj2Z^"B< N*~ if7ԼGOEKU{ꃤWD γ9~Eci"rjRp1o̦MemZC_Ch _Cא/YCPY/$*^i{~lO'ȴ _L$zZCxI<J֠OZ>!E<4;9~;r| 3x,| z&I&^T]dXEAwMIz!w "L$*  X֚QCI O <|A2Oz ְDh# )vjs*dJv.UTLZ!15'RRIudPc/;/@oj1^,欗&mǚ}pDG~ ڸ1.2YĬ) wxA^*Sɮthnb>\@A4, ?\CFwEIuM0IhaePr0|yk-/29dhB]H䭽;ptHRIk‚fŒ+1q4\{427@* x7 S=WlWΛծEys¤|;h,&u6E#t#D(a;Mļ|}qw"6u c *_rƺ1ރTv6UiEu, myZG@|CQ.Ԭ92?&t>t .}<}  Wz+5=`Y$"$E9j nvLq )/w"ʚZ~W2m[m4^*JiAyH1 nY26Y:YyuhK' ZQ/t®h*mb(iC#*{m&|[AߪY#%aF ZWpCOCg.^E5 i{W"u:#9o_rd!ƖP^:N$,8Rkʂ35Jw҂(i\Py+}t*^Q5~!I@]˾q+ȁE:zZΕowQN9׬`y6yl8|C#5} hf~95rLe 5\&=x}&4=PjZ-.HT}Nrݪ(|{8h;T9^ZUB5}'b|cTOGeרѨLwbZ]JHlhqM-rQFig sx MGN=iJ[lo?.v9L㋰TN 8Q?8yW 8Cm^SEbrGh]U971M4c"f9;ӕ >9 c]؊cyG.3a69 ,OAhG1-m",Y;qo@5RK~6'xqLтb3n>6NhzjâQO@4of4 #㘣q:q.ҍ>8yEZs YE{k|׵ǿ;3X5,.kXAšP kQB4e}1L$`IےD~xx^qA`_@eX:ǝY18nyʥ`^c*L&}wܿrYpBRE?3%˿E/Smkތ<v4$RU'SތEy5l*2dWT49Yt~Q^CWv:V;GUk볕ICe"Yvc*#9v`:0b[(t<E*z{jiELj[wn]q1KJ <$u"W22ӟ>> 'mIjCb090ߥCʇTzaD)߉g. 2}ˋ11b(ʍQޑnE6hxc#bE9ګY8d|uĦz/&aQb6͡#aG%ܨPȊ,g8T<*VZbDyIa>JHן翐Q16_˱SsȮO1߸;3qv$x$kyV+ciH ɼ:^.XR;f4wy<|W17v<'@=*3t 9MEpB츨`f TZJ.1a0NAf1kzܧ^r <ߊ)(> "TH1b~y|J8,Cy78(1L8q0T?gvOՐI%ʞ)D C AG49,ÅX#;}MСO{5JoU xZ!*J5k4cS-ѦY5 `K ӑkT'D#6K~FksӔb_J:7GPJj<~`a!wj߉ZVPڪf>0y($7;Q @AT`,b֎|Ci-=M_d5G(YMEc]Ѭ?(5ҥi'X?$9-c% j2x\J.8X.G$jQCGfFZ ]59슷f3i5RZ fe'8a4)E83ޢ!ֹ7lT4\*"蒪i&܌j}6n=! .=YzgjI3bkAc̓^7Wa OiHV/$f'^Zo/%y#ź2TP[(fc0\8|K*VbwrĸP8jBΫnU/Oi)7~q uD)f~Eu'}paJgr!oAh c:o 7對OcyX&o4ai^Xo*ޘA:`DdM&s$OuMpL9#Pn=~9&P';e Bϻxӑc7M`y:9v]XqL$(c_O$,,m-K2Ja] "捹4Jmmr>hiɪ._uȿP6^eS;rD9q]=OsdCBj1?l{9~HX;rlwrD\69B,`KWLJ2 N\  =Ad%vjڜ w'ׁ̂"19 iM1cKGvxL1jbgnE"թ$EDZ)xfj}jyB,wd'/4 2_F઄ +` 1J#-7.E7oEw@%.}\/z;sq>7Ƿ'FH/c*hC ِo5 Y0)i0ؿEGQП5̖( A!?{<ʗ˝8HI+-F OXk*O^-K>YϮI>$'pmGdF(Q4^YD4]B1lPy/=670h R:GYy k:Gd1f5 EqDKEV4"!Ge0%,[n &L4ieۭqܪMQSbM[x'z|@#z8Dw-1Xvbl4a)\!rbuoS7Km)&'tHhDfL%Sgnص4c.վ x@jOPmW-M(g_꜋m.O ,#< 0s.!|M{p̊<7mW3͢q{<0$Ǖ0)&֡ E *YO*!/ ҿlÖa}U36 g6" uT~"?DDt$b(z\[e_;Eܡ'cי A($):RJS=Hrv˽{/^rnwq{r˽?\ =ddz7.\I\I0M'Y[ ;1 4PPE6 w樤`rt8W26ʄ+#{8򺛢vE4:Jr O|x"$r'Y#`2;cBo0#ܪ,%{Ǖcq\&ݏqX F7j0%2NSN 2|CVK Ho@{5kGh~W=& -8~6gM`IHC?`6Q{˞_73T:) I 1~+Cb .%hLc4hqfn ҅ۆY0 =L.O*wT]'u σxDU_>G2x`w| Yo syHLCf50u]续8 W&mB eK0lc{-]sLj m۶9miu: Uit`:xY}H<S0YDxAVWjwTe1jċ$ j`!7BY:ec_&;VR8GUN+:ꋿ-X^TgRV/*M0?a=Qq@(z*8ڬ4g+5FMM!j%2RX,Wf:}hY{!H̃Dլhu8(cI,B,ih eU2_p--V"`֤+oB_uzիS"PJV+iM*ieFZuWZJZiM֮fFbS Y-VFEX5n>ގ}H =S@+4$K׵>s ֫uM+,bɖZ׽eU5aL١O"hW))nv ]\.Zk8[Qf;Da" zKCg(CYV BEE <[-m4oZsAýgDƈ-|ÿ"{KyKP^~ټ姀^K(&^> m_~Psz} չYouvF6q[k4fi$ϫ TaKm; Y!0% e ҅fCJ:O+\J>wZ"y!>ފپnSv^]$4+uCltEB6Z0ݨG$T+\y~Vˁ$ s-y)ۃ~icQݤk^ɽ̎䵅Q ڥWo-}Y.e Lۃt8% $o[$+ f b3ಶq+_;iEtWH'SsWPQ ea-F!MQe&75ށa IckODS)DLuu_Ÿa«gQ^x_ք+; JyfYg!I遚T{iT䀕m޷js nY!s?.;Y9䌚/++a|E1k`M"CF %aI6ADN2"i4= ?y4.nEK.}|1gu&&sa% Mgbaj 4pU|jk%ٚڮ wqXKhaX?ۮy5y? ^'8~>rwn\m_o,X~c[Af%3r8Axlt {]a)ikr =~$uⳂ.!~T*ϸ>3o L[@#u~Fro+?3 FYLfJ~ٴSZ}0B3gF2=4EI)xҮx4]KzfwwPgB5"P8g#zb/Je?BB]AE\pχ0)e\sw yoMlS۴&]a5ea3LSE^7Qx)}Ok0)=zpB5bo׌v>xj0=P2mO0g$mߵ޿pMWpDi}J] ZL@;C=*}hd8ᛗ/l Ewܶ>5 @" omw)}hgzEp@MꢤPWl !ȁ+gށa>sdȣM,xeTJtKQ1N0 )2@:km;>E+gۆWLC 2hWtZUpF/5(ct%쳑(a\~WvPij{=YDBL(vY~lhs-Q.bg5҈b|$fSg 9{Uҍ|` `_3՘ D2t)ULIİAYi& Of^5VicM GwM''Pk5"EDI-S/1V3n)XMjnQR4/-xЇ~ZGJ_ƕCdi=6%)= __|0ښt23ÿ^金 QΜVӕ~IXMjw"`UxXmv%=lQҲ7eQ˄z9`hXi"iMU^$Jjjdռ~zH5[t@T[6iNq&ZLWOj7ӠsR)(yx8oju>\.<2(/)A@#;* LeǦ^,3;`ɂӕ2n68ͶKxhk[C%6LCJJncEbQӍt#ߛKv:a&hmtݭ¸U tX{$D|pt D'jɌvٿx*p=D!rMAI5(%Pl}=J ~W%Pr[AvMžfX֚895 x/2o {Զ/®Lo=k\l# VLU]Aq#00 ?b@BIܒ,bF=ZНkGfŽ*enL!E tNIiFv'5ꍸ6|V"q "X&p`"#q@1.bM86v}xbΫ|{w dcw^5>: f<t th5)u>`iQy xkhD*V&nL1yկRq 4]6dgy y|Zfӆ6{aQ= n':/Gk49^H FnCn>V"!+f8$ 45kF0OIS,jK(%\,cB#NxMyW[uJjfGZdH9m-B?2{|e`w"$d,"9c/'E㦹Nj7JUq XH!$.L7y}zRe"/&d`A omfD#(c"({&`EΣKX]\\ș)ff?c}ة +I~KrAav%?jd^c<snx`^\P~1iXZ fGtREjXuM^d +wn7a˙ 8KW&1_T RJ*S4^KxF}//^<~^'au˒j?3E0;~-ÊCmak3B֕(m}00a `>s98Z;=<`7p670D}/ kųC5_P}A@Z|^mwZ8àWC/1eщbj0VAv-dleSB=t ߦ J?nj"pg@N|6~'>'c5+W"?X续i[ w i\>4Sh?y[k(RPZ~"g[rN&0@ ME $jיh0 Sm`Lָ2ķK4 ѤQmF?T#ӆp]DCy4RAHh=b9V hm$)NBnƫZ >aqyL F< {&J~_ҝ4YJCMfLY!Q$v7g% Xڜ(\$~kG!訅2l)xuiԄ=;|F*߿dy!F` ˡy_Z Ӏ览ZLu( pEմ;gyJ}c5[4 ph3RF}w@%lpÄwH8A:w*bM= yu@QC> ^k&P Eo R0W (M WntRJh=mٺ 1m;`L9aFVӻlp>X*u8W6'ܾcP@ ݿv'dP9fu~_GuM xg6C@va~Njc}{\{Z 8\pq{+Y 5.7qH{QpJG`m"Es8Vl}ZŠff9'Ka@ L";KLKь;^iq)ij3XѼ:7߲&TlfNyNB|)u>++ܭ9aMxM0' z [>Z҆w6|y _ͤlobN?J95:r~NjCwxۜjѓa%6kR5ӎo[n(zH})Eb3Đ51"ˤ-)Z[ 4UM:N$} Avs#S( ?~rMyh&/aя> ҸgGrM㞽)`9jZ(B@!'e$F4;9N5v?iv af-v+'3G36շ/'B;;FԐ93r9vM͎MYn1l-Q ))(˷ ;L(ѦL3g0t*,o>L4F`lP8UEM K,]+2z3̨Mݤt{Ѯ=hWvحQkfb-wZ`U!x(Z0 } m%piiKncJ' i >j2{fghK2sԄh0ǽ,rTXcʡ.w=z V;f˷ p@dn s^uO"^p]i*] $G#GE HisT%B@a_G @o6Yfh͊jMсj_NwM.'^%@ly4gk7Tr6"P} pVm 7GwE@/S_mƤ:s$QPasI%0'|J=߫T{"7 (7!⃸p Ɔ4iR#xUgkrI3Y-D(%'Sxa)H46hRt\(<+z+]۲f!}a!~UNjh{*I~z*ALJÛ˾ g 9zL"e!?A[NЏ#cjlYǓ#Nm TOg.(n;8ʟko!oa#7 aj*mФg3oITT 6Z%D*C*C*\i!R +kW].Q !_4rqm#y^X`9U/%J-COS$P0 %#7޶51l7_?I@=\(Np@GYQiZ;"t`~4n1OWaTߚT@MdWz/#"۴NJ=hګ{!/NԦRӈ(-298RGo#`E9ѲX|λN|!?d::>:=Hm".0cD b#iτg>u 5~2bNN7Ḩ֡etGhYS%.[w 6e~!q  $3%e7tQ, )'ɜ|yMDS6QCS FN*9x~7ZBa~0* `b^0vn~4n_Pu?$FOyIgݫ._u97%huxݏoRH|<ݐ`W۸s1q.m: :aouw'b/ݢZb$BulsZ JhX%4L.EmMQ}*Ki9)( 595H O."!YG uD!4Em^AoL_ F\?;67TQzUS,- ZIrjN0d5Bz&yr$-s;uؠ#L pUYy5*Js†hQt0"+ .e5P}:rbnY(tNE^.H/^ C#,0(veĐX/© r.K `i ;ÂmF}k9*:]7]QNjH5MP]j@V$h-"hIbїc1)Z=:Dhi<2y? V~(haѹhC[:dc PazEpDC1ޞ54ua9m亷,(g-,2IᔷTw Tps=G*#u*JP]"\A'ԉzFPYg7]~ )>vBmڜ8ꭴimj Z1ps4z-BqFל^CY#¸1h"B[`:T3^;;ץ^b]"uEוӯ+OL&]W>+ה}}{!Wk_S)^E>PBԊukS)ݻpp,V_=zzS.\O>i֔ۧ 'ܧ$*:-?f]?a]u)+s+q5O4I/g7|%3#IәC1mgݍue/UNmekף롚U҆]ZCE))Z q|[ۗ<' xx}hIf8˃QnͯDUr>$&z%gjVݚrK9auaEpRWT/|ExX}.>NU~(d:'6E`Ņ"S%}=C iQ*3}fz̖?)$(B\϶|Rf8%PJ.DaHxs_O>=ehq Iu sIWQV~#|߇SgY(s!uKq`UTDy5!-X^?|Ũqg}|Ŧp0PAZbmL I({=.ҒI[rG𕸈ˊxp(!d?*ZA+ `*)[$i9h2\3fԠ'N ?Tp:6uʤ`SO#WڜRljʦa[K:[BP4#0J1 >J<*%#D;&J@4pruݖC'(coWܺ?gs4.H5d/;q;rj~l91j.}! ;x?:!.@Ճ3Y<3Kd Pm^ûRK{Y}5k 8dHh*k+4:;$1`OXne+pjypjygH4TZ6iSjڌURi mj4i]WE6Ui8l* 0D04alޢ:la/ɤٗw^J#0G*UxIi<} !ڬkRJ_1+^C4|}HTlvBYlVM*nGۮ$B;4+IK;)9^1Q= tݔmoo?<KLo:Pwzeږ`YDy[yjZvhԸ;Fw7XK^umuE{/?=QI!L*Ahje^D4x3"\d]aI'n, \ehUӛ mtS Sx+bj3tm=F"3]-}0\t8 An:EXRtltv!q[#!Wn /QA\x5ns>_#< z|:;y >3R{u(>(z#tެvZyx<+b/8%!``ih? pa+x8UQ5(6:Af$ƫQPy^ꮟ4 [Nsiڢ-ןm7gA'y7xڸ **lBI0"#͆n2,˔? +SxM]j, m$e4!{K0Hɫ803~$ϏGu^G+4Wq/}Z<,`qMXRo۝S~>BUUbN#X0E#kIqc+ n~N=Rٛa3҉B`Cy_c\mjq`Ç<.y58]m-fa‡ jqm1N!>x1m݊C¸i7Ϯ/!3h/e,h2_p, sy+Yߏ[9ER4 6#)MIL?^AARQhzOoF_B<}c[ q%1ʱcVqc9NWmYBEe%f3_T甀/C2S1EGʼQcWDfĔ0+l,sVaId sں}:FUuuB: J2LϠnW2NSKx<xP?Qqy8K=v"YDF;{l]T|⬣VotY<c*E1*G1mFd#/a`w`i[ƣ-ޭayVp-p 7ӢaCPƜ ,m%a&mu{E} i)80뙔iUd*e,-Xަ xQ{~Vz6@4?6h5g,qqCskypD5,$x ToVX^" B"p5dE#vIG; GXp6]KY`=M,ARX&>SU4cD#Oa]7)(5crs |Jxlo*E#x*enbgF"zحaV3*r B 0\9^P$A$v7fCIPMG3y]oB..u-7tWDxj xf$HnH:AZ9R " ۝7aVc 3& HλE| )EYUqbw<ըD|*P?3u4\)%_.چxx"Lh8i8Dea*tb"(n谈O.]d$4AuZ\b-1Hs+;]24MK&}A~w|\Bs!g}7sBz )=Ye;f.f$ɵZo+Wht! zC~'tg:E^4K0qOb7w=%GTʥFĸDh Pu'=U2ZKׂů_ ZKfs٥ݳv=p ZlٳpՕ/~s ?9HK1d1~74jb |bFo?a] 7^m~+i~xܔɎDQꨏj;Aѱ"5/׾#D02ӃU$znjb&ɔUliXXKK^t)5~5 >)O'eD7|>[cH¬8'}b_IC- 3!g%~MIxZbewTʕSVj9ϕ^bw~mkl琼nKqH|E:^C'h UfԄRƞA$x“7M[&-ͩ(Wuׇ:4̩CYp,FɎITQ)QHGjK魟WBp͠rqi&c&}"SKUԲfE]%۔ ()Uas(u}F}Zy8x^%?'A?(̄!(<^̠ϻckccK}cFYiCB(I!$'\*A(!"׼nQX(3I{1C+E݅ha+ŃȌ_)BR\).3cxFVEIGQ=-x0=<_ᙑTf?:s^?(rUb  _0E1 he Ex/,n{=xd\`_sD"([R7n<_ Xas y_gyc91o|տ~ϛ/IPtko~gپϼVD"A\حs=4;N0굲y_WaT.2 B/30GtD+9בu')õl 7G_3쥹t+/Y).BՑ+_)J1J~Q0#V .SJ1-Bb[nuA<Ί19}K!̱R|<3L|,Wl"w! Jz"h5ot=5,?,ddҒxD 0h " !2 R!A磵?AF(y,VX -IL@2ia lF%%q?)]2s%DCҐo4eg}x#+;ΟƝ)<'d0902mF@ ح·RO,Ϋi !i Y`:c?~qLnT k`mꕜQ[k`.N.fLvx>guVe",]diE҅"m*K8,DQ~RrB\Y5i5|--n0ҽH? XAYφXù(C)`f8!p a)[BӁ9( )Ja1Js`QKKA?2'W8Ï]QG.;)W 5t_EE_AKI÷z/&@"! EHh$Y$%znDF  4;Gφ.fDlɦ_Rk@[wx^A ):0L"88qm)ч>ٯVbڞ@XiŬ|{hи+/<8h*UW+~/=#p}2$TF/, fGpF5H}͍U`y=0Tq^9]|8_bvmδيr^KM-7n0Ҽ[liî[iX*p7Td'oC S8k]Pśˊu=ފ} <s0;ZckXF40J5cxwm['8Jl2J*FY*"1y &%U&;evHWP)̕BtPI*{a{ 9ICi Zt?^iG+㹵84Wڻ-vUꔗ?-*mTZ"duY΁GC'o`| }U3+re8WIJqRc]EBp촣|-ُ! yZ^S,BPƹ#A]^|xb.P5O&^rWVJʊpRS& aI!4i;D' u(C`"^w%I1/_f0!ݽ=u8!5j.&ф$E1SNVy1.I9џЫ$:Q (_@L^Q%oq* :"?mVO,!J]+9! ر벴ܸha,x<MqזGY4Zr^\q`'rUA6 Nrmݰ4O"G̏?1k2!>ihD9WeQ޻'3Ѣ׼~B>/B&zخ*g| ztcxTTl]M:raU`@,6XD BaÂ[5Β`z q>Iyjl{ D2,fwHt`\l[hDb0O <{, /XKGqwÅ9ڋM"[qn݊C;{z] VۿR7ݵ}iC=] UM{3%H=څ. O)EQOCRQDlsgϤuNNQoԃIǂ3EW$#f&&+nԻ=H)@ש44oe/ IR'(կ_Ӿ!*xpګ0;, 1a* [">׸K.-VUCFMUeNJz0;!qߓ}KNCHֽ|XU/힤< Χ+b$ޜOגwp?(%k1ʮ;HsTƍyċTҖBZ>/GO*Fd#sCU_oá Ng<%*IDrF(ujzFkBTsK %O;mߏWy󓥵%0)kvi";VZa% -ᐹ:]i]߿os%Vp~nUU0+.èWsX\|6fjZГxceN7Ubs/G0܏5!xҀТ{V$9* ڭT˥/*+->4[Vr|=YB9p t#vO aU< mq5DgubYPq"C zx~Vb_LS B5.n!(6`Tk60_Gryӷ.!o kMIk,+%ZB&U 'K):/jN5He#E4vġ ,OwL vAÅX|}q' .,4c:cMRWߠbpP >iu-ºPkv .ıs`dž;iQJYgaNV:$jeYzW\!^'b$̮f4\Ths*_d^aviXQ(zV/PLC0jq/ڊ Eb(Gs<3̨n7Ftz}CʏoGwWo+?`0ATZU{q@SƐ^x`B lZ|*p5R\sMgn:MwZpǂ0[ފC`bns\7IU8u$9w[Pjб~Oc==7+3UBrM:p6 9)F$'#43{+qiQ^-ڳpX?)JUxŦΒGWpvKR,*{u(a6b4 ڽIEt^+z;<r(m܄A%^D.(FӿSYx+xBfrm-RQQײ $w/+Zj-527-hcVn #w% x$QGQ(Itܚa C]Nqj X ar0e+'ft};~w*2}Q6Z|jP^NXm m&MfzD0M[j-NRU7uzb0ZH]9b8b` RP*puR-m ueRK'qL-VhfmhZSDC^rs9K"E40vpVq%Gׂ1pA ָR[GU`R6euNfN!rPC=%~:YEK0cNGURx'Y"f9Yj ?Men_cDX*1hZ@ lr̩XPB%ĩ!(OsȽ_Y @δFCT/ݫ};.Vo CSipaTHRi#hAznzDH] ~z:B-Lۋpp.+4:e:N=xNUU)TZ靕¢+(`AQb=UV~A4:) @T|H}iv%P1HuD?(a Jr\zPA;uXp{ܵo)P%7Cl1y.Wy}f[MJ-8 vQkpcQGp")~\kr*pTên5M4tTqA#="Ƈ~UZU}ZH/eTZ))6#5+d Iflb2TդE-īv67u^HZ @ DU[r$$$}aaoHwyx )3z[AHބP eG >х=_Q;ޛk͊Yd[*V?E1 NiEż\(XSC6ӥGr{|#N2ϼ~/[xa|ǘ_-p (WՄ{}x_+yL+2pN(px3_aLsFe4_>x|VǍTX8A0so<ȳۉbM4O9cJ~A$ÖzA7?Ogz|1<܉> qZҴ4dPסj#zd/Mu}ճwWqՇ N=5g[wﳍF]xe'Nߜ&H3IpQ&^YG"F  4#U7Ɓ1ë`ޮsJ!EG&Hɳ7Iw@h ^9xfok^wpO|V糧Q,|Ti\PKcfyR:m)Xl d~<3Bx2u !%_UaP~ T'  XlOۓ:3`N9Ie; =:>jrO~(z@sB?v쬯!EtA'o  O PWTWӹ*wLptfQ5=(,3 (u1p6!Fap([5ɻ ;]ZJp}xIw.D]' -B\D՛t/>y~?ˉө|Z K2:L/pnq'wC* M9YĂ NAD,ҌhƳiH3ь'`*4`$Bb "gBbA<̫Cc!sux|w7+=LO:G7"p8J;6 9,rJlj,(/$;̇BB.OA, >|!Up y!AE~^`?qAj؇Í;'qkֽ`p>\V.?N_:Tr͞>ոA5 K4k!ĸV O ~b!$yV^8W$A4}׊+Ž5y\#3aW=(&Qk/ɸ&B}#X! %} 9o9|{Kv潮*H(ˊbNS*t%0_GB&RvsN_&RvpC{N,bJ zLOJn4{҇>E'rW|6aaovXf"R@Z0![Gޡcyh+N LCU!u09F8 % vR:1 ' _)q-8*<9GLFo6"N7e> %H/ bH^^(Ei.#zkXL!OHtL BT 8Pl/lru RTpCKʨZu<Y''f@sZ|r3@p3 uB!: jDɳŐSD T!`*s*Rwr5OuDlGyTG6+(0Tw7 llepv. %9UoA|[Yេ vw"SQxET?,+3Ů7pğMl-X `-ϳ.xl?suܿ'~1v1e7Mr=(K݁%uṆuaЈ+'ٚI*1)QmT;[:Y`F>1 ZgW-V:E#Y_N&*}FFΡG`{*55iw=堪˩(G >g.$Q,̪0_!ѧ?w@#HC,pjF"wxa,67L[e.3:C`g?f}k0Uxqe5˜noPWwj>_ u*k`qvƻMuUu*Ed"B^1YAO|:kzumeKz,K*XKzxYu3YnoWngv5N-Je1BȔaO9g ^FLj6ܰY89D7\%Ge-DK_+A`3p 4LÇt/ف-p\o*P G;応i"'=Qxex C2ȑGjhXmcތ~ENIq}o)m2ff+Z94SAǔ7%pA8a\.w?[5Q?R BYkΰ+}d=??3ElZ|S|L\ 9˗&!9nz+lO`xq\C*0zM Å.x[ޢ:gSrBU;*D[J+|C0@ L,TN1YFVgg徎(= m;_;%fn;6PV8Wt{]-nw# + GQ;V )·1Cd |0כH 0 a9{8@v$ٝӷ: 7YmFNk Wi 9ElWPkm:>N'<\gcwqށ`hK(T@˓Rg%ۉ, Kb^vR o {Tڕ{zw7eBfZ Oz~-:b '=p>@ХBUl_/nYX)ץ ps`&_fKr?m8hn.j3?:!E}7rKSjJkp\WQ*=h8$~wU؎X4A;cf&͓6g\Z](2N2Is{Ŧ{5\Y+}^6%2-qXC}qa@][vD^%o6^+ڼLuRQD& }qM_ >_ $힘=dY*ȌI?;?/=]K)Vy0/n{d27DJ&qzOGw=hJJ7.§1;zvY` $3ﻯ=|,x;'z=:LSg.Ǎ+Emt&1xIL Ts{XmBh%>:"4#Emez@Z`Su`;t&Sg'kc jNtpyEF6%!4 O ՠV+ӵ dbf5XZ52=+`f)s`: jEkmUm//FD;CpWl[`f,-[3P\ȲnX!,%ooosFXCԁJ_xFeAc].9(ibAumt"~|PyvqtfOR @`t30Z{yǴ|8$*[UL+ բj5uQ>o/V,̠ظI`_“Eoebu h%QѱR|ezܼ'ܷOہNLAyK,ɡ`o(H2ԛ9\UuHFOj&pc|u>ձrFjڹ^&o)䀁RhN b(OyY|h2 9v( .nI57Hk?.%P1հ%iOӋN;QGۘ:jUr'HkF4R;Oﻗ頺 /zIPF/4Ɉ^ߡJOBi3%uK eN,!JܤWл!aθ@2>ph$_o16_")fIu+1A̢߭#̘ߒ~o vxK|V3vU':uOè pDyjaK՟ X7|~0-+M pWtãC >Uk8~7]Ekډ$#Ҳ@@Y%GɃ9r WNt(|@/=T~Ꮗ׀ FY=Ǧ!OMR(qyy_{æ?"(` _Pr`y9Ҏ`@K诇QFBHe>jkqr> X/vVl UQYJl.v!dMi1CL$1d^kk1~(h8}%4x4E!HrZ5>tAT5XqoAQʽ\C]^8fymjZ乸Ž"8c^%*I]%@"aij]u6s[v:QNX >~\,7Rsѱf(lB/Gīt]sabDR--x 9zo/uf h)ĺ ;PDݱ ȩfxԚC\mM@^8 C[S{P=B!0vz;zآ ;TddPpx5GOcMikfX!=]ˍ''I.6Qa9< CC/7MTt0PdZPiMV'A\7 N/\nD ; Рt.JOѽw0 D"y1(0趨2suw,6]ժ(ibW*KI5H PMNH'.u:)M'eTRH52W(sD!Q7QHLXy˿?^`H#p~YUaLc_Ghs.興"zӷx_^k+ǀ̘فh[=<; S<#~m45:i GRj|̢VWb B㙯Za8'r.x 񕼊lTnoxS^. aX+`$V< PwCWr[1,}v3t܉xt cV{Uw\Ν_M٥GK\hDRx&#>ؠR%lJ0T,iaW =KۅY|g\j&#=w[0U@aadQ4<Qpn\<*n0 *+K\1:VW18 Ż)/VfmEW$rejW؊R&,,k/H^jƓVyQл~vܱ&`,cAihZ0ny^ Cfce _oNZ].݁c# Bݛ 14~c$PM$̻!5AJԣ qsCrŤgK¡8B :pj&)`.?fŬM0Zsaŏ6LvjWߩ1xlUF$k2f2&b.xu08* ǯ?Ljc.LLRk*f*&k.'w*'|hs1qXzb9 Hb\k(SNb&f'c1\,j._ݾ=Řz.0.eM5SG?Ծeu"}ȡ_%+HsLe,oIb.jvQd"ƅe8؎pC(hǹ'hnƹZTyc6v}\/Ձݪ˼L ^ 7d¯d-}FmL;]jKDAu$QO8Q]Q~'C__?v7p) >G껮Qߦ=@\c_WÃ/vVv ,=vyNvy锐裯LQIC;j7b&w=1^k@LEE 'G %{uko*M$  뭺/otwQYA]8.Ruբ;ay%rc;~M[?V۷eu#6xD>U&DQ6/xvYm-0SS=QMV&[D ,Z..IM{;!edbLeUg]A*bh`gj {>=U[zw?2"=(k7bɕ}|&}zfQ݅_ Ի{Ğ-,d1v1W b*,Baxu=?*Ee.}HgB,]:WGg,JFB\!G#^V!FF#3aƓ^;@Z wD;vI )("Ǒ0EȰ仍^q 3&9"8勼E>}:*m WYQZ89UAh)*-'nP:vŐoUISNX)p;ăMH˲ ?f>лaUC"*X 9\??TNO5Ė}y~:9t 4䚆X>A+O/609ΜvZI'yEk`<}0v٣|\1__MB{x\D| YaWə>)@G* >o]bZ Tܱlcu $ ;^-wr a;y O5B۸e7eWQ1WTYw5@|Csr|?:Vy`R&H~VpYq_1-TXC.).^uFa t+EX+m~ot\MeF E-@ҡtHA1I፤ U gAJiL ,'Ȉ"qADkYtMf^5HiN{\ jz_ψWUZ6!Z"Ja -Z(ACVs ~[@&:v]迚~WWv~vm}#^9ڌ%垴9̺9,{\4v=(+lBH]lRM`u7A7Ώ˅cV7t i^# wtU ` se7uUa7j!cB6 E<Цds_L ب)E;(]`*(A8+jKk*`Fr[7%N+ׂ' Di2&2)9`EtTL]Ӻ ^_d.O\A\@BvBB }c#QA7HoY&ϧ=#Nhޕo|cvcoU,z_k ܠ$¦7TCom+woh#S=UմXHjZ{*CCF@Q\ÅA/jf5f7vVUA@WD&4zjL:VAV/Ɛ`싐/!tt+[ \3T!SVCc{="铞p?6˖0!?09<۾Y[nd3 [: ذ)݅GǙo ӓۊE3?V őpjDjChjt>~Z9#_BA9eZOP% D(ߍMZ_,VI F@DeBh\:֯L?y9iSi5IY7a髒3|apDPMX~]r&;%pT&ӄ>VgEh,0!LqlK.!-/HVq *_Q*l߂Un?e*MW :Xt;FSZ%b~ӵ>l-Bh;iw#Bu?j|>_DD}Ig^N;XL^v<mwQۃ2p_?w!5#;?\qWl9N.bW{X6aT:6#R[פ:]`Tyr)Wp#P*7Vʺcj5aQS׍R݆'Aeg:6$HJcPTM>lq#+Eqi95;wiY$h{B7FwN9@@b|b0:q@]ns!I.ٕ]QloJճX$ȝi _#8EqnqLOG `3 o-;NSipA%<_8wz-Oqn'Dǹɪ-$Q2 {" Sk+E3<6]fpALdrZw8K㔢 i=8MyvQ7Y aa,W`XQxqCS=(ӎQ($΁-M!`%YA%ސA͈{]ͷfۻ"0̬ǪNdG@PZc+/ y +AuVmV>Z>sF&#]J)Vħn|ŗjRK|UWdFVr'(_[iȪ4Y3"ns+ܳ@33ς(9YE|Q JM#\ECWyg Vڪ6v\< B6+3%<μv`7N!N]|8E3%pSFxq04W[ <-@D!,lw20@ѕl3] =He^& U&SP=>+&%)*pTN`|Ka$p&ʒ3 Ə>B!ʐ蚃o̹/L>f f?N_7kڨ>t+xѕ _=~fPhh?BB@o|*9<,+3FZghhkMdZk@`YE5'4FCdhy!ΧL||Y& [&Sa&mb\c3߼ά$Lj93[H$421,0/528qXG(aP?R('C"K^J81H"Lw+3IIRA{dT^v{TծM(CO}^y0@^([: qŋ&P4YVZ Q2W\\uWo7U'F隣znrTZ#aWPSc{v]t^d'Z]}>BL;\bݬ$!2n1͐a D@Rz9V5 hP U~|=jz_XH-w{|CvXj]mhO *C`5O+cU+pª^d{[ \D]X+`@SSJHf_ZRonRb;ϻ܇FܫgG@}w8kzo]{V'vݧ>XZoj? kZ/jDjJhJETez&"{xTnZŰ[:nU۰+Lz (Pvi¯9*$¿O Zhv jfşX,45T&б3a.o7̀p*fO_[ovv&k>hm'; :zU$+ov.2$4ߤmx]EQ;hdl'u%~UWYww;(} [̀+۴`5PCkp&_jɜ_D9i\oC`⟻qu:0ο;u֐yh7!hjo>@LMå֊+V?;ƽV'WV,ϊ?DswK,ۂw.b}G#NUUy%+#.mnql}+cWֻ'f{gg#~: LTUAE6TmϠŭa|m1A߂5#f1} JAynZd ;، Ku nud&(EuD֚kn4ʘk d |m@y'ik~{zpUsU"WyȬa~+yl%j$!r"QJ"io $蒾!Ml,@()_YL5wd`/DޟIv<טqwM6H;EegfVcx1#g!ddzj5\xJ}?_"?yn}B'BT IvQVXM0}4dYQ{!xˊce`\u]{ݹ qÓº{.|BV~[=;AZmwV"YH-PۼbĠ=Ӂxx@<+,C"9$(Crr~nň.01 *A-}:~acb:|zމ1nso|xXD, !2$,K =|MseWe™V'`n*m<}_D⽵.yλx+yur9qV٭[e8uYen*UQ<#(>eo*Uv);VL=wYȻuܭ[y {]]­UvV٭[eew_UvV٭[e ew)6܃3WnRv^bjbeGUdBM}eJ+|zF)STkMu1ͦzLY#?рV+qRuZ٘Ҭ/a!4 J+]uS-4u7oLIdRd(V!ke[^O,rT%?e*PU B{^MEDMeFF8HTz)9}<}Dk~5eM Tu9f,Q6:HQ]9@k b vS?O"9%ĕ%ɸ ыQ̿ Mt~KOnX` 5<pedYB515N3_?3M/WhǫL^U'/![(o&(VTP;"*d|FrLkؐUVC Gx_4 ў4-iRQbFDlyd3qԬ揬9 [@? )3QhGfksq=渖[f@eKd>?3 AHM}-TFȫ}5 ~v\㚃{5<9t$`Gsgjz83tAkzXlQxs99PXs`AsdS]jkH_Xs`́5XsA(çlZIjXk5Y&Y_X{e3\|'jXs0’kњ^!X0?ԬI&EZŋXk`A5H"9f䊏g| I/BI k~I-u"H`][O$(kP fdn̚kj?́#$Brr9+kfn$<8s5QՁ\cP:%=\5ą̈,kTk!|>}`̚ k7ج7:Y7ׅe&/D$Tl뉦3 ŀ] D|Kox&XnmϿiyjY`M# M`b 6dm ?2`D>@|Xs0GԬ9`8'>2aAenY`ԍ6k[eI`ÕvLui]xpA;v:rWDn`C͚e&L+b< Pۅeeg킵 `Яa`> 3V Ng+070&]̵{0+yJlv1b1 CÎMu su?=A9VڃIكIĖOݳ5_"-~607ЊsZ!i_h#5wv8xCZk &` Fݒ oOHPtɚk9i_@x,`"X`AWhbs4Ld3®f `rX]~{73@f^T!hB͚阂 lrjxƕ&Aؕ'&aZӾY4F8p84]'Y*~cke&b%|>g} 5Y/4NAj"L"c5}>_݌JVLBj$@Q/4R(&^&7/,⽘IHfIVجHnj2/P9YI3@2bF7$σ ,BtŠEhň7L:wM5kѿur9:E؟ \aop N;q>?=oD?.%Q';f QdvPs7n枥Zbe|*_%?Zfpsij0wKW^UUg``iMqXY3N~<M٢nfENJ4t r5?V˧m~~ə'd{N"LBtUHy| 6%=g:yX*%}Ω )?2^&*17&YYo #lv w}^/ҋOKRɋ"R-)_u@6 rJڻIHYTC@S/Ln?'/{QXv*U Z<HBjma Be@n {!irJqvX%:s;NVoZ*]a Xd;aC_ ;O`CŐ~C'|+}I;z+VoztGx'xwi['4y[o5j#jy=G [o5j)i<vmc5V[}^\%?VGQf5zER /*X/?WWVm 0nHi|r+TAIzoߩ{$z ºmR 7lU>EGWNv/Weʾ}+V?{S2"n}5DSV!UuC67~fVf| lfտ^ey.ߊHT.?xEQY&ˢ.+FG#FewyT'^m4Rv5K?_zn}(")|vNcE>(+nn.Ti:>V|}V-xs@.6GЪOpvAU+UX>տgy(_;+U[ư tE\ -־24 FDoy|Y "h-Ï F-ە6ZSFCiSnŖl r D'kZvG[HL]Okk:.Cq0s[xң[ZǴ8D)9a aE KL,]CX 1s &"n!K` $1`7gBLB'γxx.j)j>xt=xbZZ[fjrgZg&:+4}sY{b$ع2]]NrU#aШJL0>+ԂWA@6+1Axx+=t?d`)ڸ?j0A=kEEuC#Wؔ\$j"3AY"33' fdV^md^e*2Yy&-p* 2#ѡgrU9$*?UƁ-:\Wsڥ+лI].?Q ! /Lm?'k&/Rv>\\ 8ZUQQW$ XiQG;wһמDnIoh~RI8|/U#woVR?]X͟Vf=X ~9;V[ݷStorxm!mC4HzQE%`1jdTTe,>F1rL$^`)u&_,@ `c`ϻRJȽ 1j?Aؾd^XͦR7:Ճ jB-;&+2\ A+Voz *﮽˛kUުUyVSg~V[**Ϟ~.*"cD~y|VRi@?"bV 2# {k粒㪼u[Oە7UA*?Ex|W~,_NA+V䯉|*;y_ [o # zd`UުUyVS}n g.R5=yU͔dC%Gqg>د@&M"VGyS@숽wĖFvu 6wy?uVgg=|Gi!|䑁5_TTCKEz4b*pݮ$'1jk%;̤? ƎiAYugʚՄcP s3NG~ XշE~ǏF*s@GQ˕9jltFwltjVN{H& |||mUnmRcymfxj/@RiHʯTR:& $*ߦd |5bCd[AFVDO:ΓFLx>'G΃BzփoᡍŃ^>|}R6ھIi<#eeg6Bon_)8J޹'kM82Y?}`$lϾKcl#ٵy\)Ukgڃ9{7qus~䌃/N$9𾮀]@~ԝ-2_+?`? ?p'UlVo֨ЬO]exOyܟ]3~Z2lM{&kM&[kMVݛNxcAd'1΂UV.] V[hWtQ}v}b?ǯ) \b^?w8?g?gpo'Sb[t8⸏{qC{~/D,R?WP0 DO3OL>Io\t.[<×įjn=SM~oP6}"_ @]<<ܛm0B꧎zg͎=pqOS>{ ߗ{~0g޾> W5~zW.@{7I|_-b98$RGEhD,"2K%C8|qV7Žs}UL XGY%:Mk+ϑ'*$0Oۿ' -hwkH{{^G{'R~wA#bm2ukݝkn{>rTlb{R=ʕڳo: ˋ{EW`A??m9d0cOd u]F%jHk"lE wC/K ]?o>ޞ|mX.؞my>Y#п&Y7|+?mbmhJwij{U\3=5h z4QakA/AYޛ0Mx&H7hݯpXdװj|_ rRlaYl?>O\8<䟱lj< s+3o1!|↸g\-7iM1 oWu[L2ePlgm)|m*;[xvװٛJ ۹F{sLhLbt)[ Գo7/#L,QÔe z%}pD-ٖэ/*KZM"=Y$ Fԯ,_/e=d&?ۻ'RLHUK}//.-' `rO>(~?bSkN{)i7\y {4k5O5ù!{@aƁBſy$c6rW |xbOӼoKK 151ΉfAp q7?>ak ~^υdW *ݳy5*Mӓ#XCruW΀}H_3WC[^W}mnZUe۪ +Ɉ:s( tLaŕ$Sʆ6qĤHf́Cue;3m9pЗrۡVRW?W0_ j1,@hGkz8zH=%ڿ65YߤA.eں~7׌QxM]8|dͮޞW Vv]ѣ+z6\beo+W5E!FC.Q<]._=] p?؂1LR; +p)"ĭϸÔϿ- ~ڬyiIy4n4 f(?%~yWⷯ@_+kA|?y-Ih }/ }QU[s@nZE;s[jZqD+".uiRV,6ᯜ2-*;ۡ>/f9 ps! |`ݻRfw]]{{& JM_4sC kט1(Yj.,))ϒKgmkwF%Wf6z {hkW=C;;ZcRgclu:bj]T rױj<m?;O zwew險7{O`[ |{g% W 'Vy8ޛ_;p%K|B[,QӾ`Ѯ`%7@QwDZF[|_1|?;tK\rx} Ñj}@46"~Ъ@4KȺ>m~@xxx|]x5+ם;E^Uw~9ݯ#\flG.r ݷ$Awtݧ@ ꍫpܧʑaNWeH3wp'~b?t7zdqK:V x\R2/o{J'SU.{|OU {p: #<|U@s6H4Ӛ@k Ú*:7q]UxWWU>hݽk6gj N.n|22zɦ@wX 71YuCu|m,{B J=Ds=LWmpoyo#>/Kx%~UJ^9kB?0ݑFY䮧k:V s^_t5Z KCE~<7hOœ;9eFo(D5H,bQO@]ОTj!ײdSG;̼h1906Y KNk;<I#6a m#x:RGSup$b!wdٌ_se2wlx}m}ucMlpj[a3ٮL.`;خW MsԱeneUmS{}kRBSx^y֟+|An ÉF󠼶igFuN C{X5D3swI.**۔%?L?(y2mJ6?$Iuwн\ LT@+6qAhHnƧJi3c» Lv?dZd&bO:6> jEەb)OӿUyH>PſT /Mhw0hx$4@l^Bٞfr2oH1DrVt_|_ OO~~s] —&h`B.UxmͻO p+ke{ۊ陾``>a۵C;l;>kۭշِkw=(1Iۮ@=,}]~>I3w^.;>5F eh?*NhʱZnL 0%x1";Y[W4SuM%v}. VkIenc8xsAw8*a 6*!!nX]C>sn#|D6 4*,<-54+Jxuy76kWg3 upK>@m3Y &<ѓJoD2^Gjy2LJj+#Q׊Yx^)1#r F;;>މL;)| c1x5Fh65;l3 -i[2W4"؝ޫvJ`s8w` v{aT߰vp\םzoL`wg;O Xo;^Q:*> ۱Ռ~Uv!YNܼG]Ǫ|O=^rN;nTUxә{77$vw!Xt.WއZ1Lw#`MPc^EBle|Um2;MʓP*z:5$nw{2X2zɦp^uy3Hs@?i2=)dSg?{';Ui[42zFGlup}lHw}p'+li<_Id4AW_K:At„Bpsתjչ0hLZ@]Ǫao,{+;>c޺:ޢǏcޕ?}kލMMzPb[&UlI=J== =I=KObOgWx* .W+x:2d%2.ȩWQ:SHQ`|A(t rn+rAx8Nm=–Hwq#)Lw%2SR{'e[,Bc߼'?L6^>υV|}pܟ ]ΰܧ}#s'Ib_~_r27 Vy>??X.OҴm?rϖ#ނ-)-SZէh>w`p4gmRZ?j čLI#1c4~I3pӜkBl U/)HiΎӜi-9=iΔF|U:)nt9_v"~y?Nn44IZG-^Mh-kGȁ~.rP/D+ );ZF廃Xq b$~ .BuF*n<h5fADBvm(SKd%R5`]n*vu $HͽB^xO6kEx [*F>PܶUCDo`5$UAt^;m.2iú_x%l("Ͱ)FFRDdQj ZNuK,s'ъcT]>ɕ38Է/kP!#@Pꞈ{y9?h`խP2Ne'x,;,;,;,;>{sJp}2X/NjB%/ڕL#ðg*IhތvdzՉTg珼e$d]G~]vV~;18ԛҥLycPԵowϿ^TN6fu%z]鏭nJ>?gLc<̓FL$E`"HiΛM鬺L'"ى ௜7{,;=Zlè Br'iS,iUl\)@n%+JTώVU*|Ԋ)j0)`~,6w/vpO'n~?9[~Ovsi\ofД H 'e$=pݗgEbTܙ]G:(tP0 ^X~jC$@=ÿm?o_ӡ[R(Q6;FX6O R_fAM;cv}bRv'}#?Inn-v. @fbX< ~ľE sDԃQh3VwCPT`*ۯq"/r#4:%?T`V*PH~ݕ9~~#! _@ p?? +;ۓV>3#CH''6in%F:d1 HgvWXnм7H{Zci U#i3h|qsn}ϥ&hߍՔ]E=o)㏼̧ݱ톸h:P8]HpB`V,hx%@ `ÌB_>+#J !p1HoEChCtцBRY.p \ @{@ZR.h*X~G&`B8JUb+{9y/&u1!Ӓo!Lr9B9[>9ӌ`_{ Wp!q/ϐ,ߓw* e8?~$}nthVħ?SL;*֞CT] φ$|\Hib@T;oQuT?)GNu?1e_Ft<|mҝឬ^pπ{p_U1po\|WeF| ݥƘK AGFc~A>{Xk>F2u=F2{~ Oc$c/?gM#d#m~uT6W1MmQ1 /xN?LjAg^""Fƽ:kLO؍Wᏹ~{'{ݽaδi?=3=h?ڇiJۭ$)=UfBGu6S4L`1yJ[x[h<6vfc@S8@>?'2>/JW zp_XO#*O3ׇ_ Dc~mM-{K&O( =T(AFMjG/ 4ՎҠ,iи2 d4%FHzi{?;D]E>Ǽ 0dʔ%aE=so=)Hͻā+IZ 983!#P->cJһ1HfiO3-|sWO'R |q&AJ'gA~C~7غM ?O@~Av:J@~"iߤG^A}tB^F[xćH~ ,ɩc޴>zz 7INWpPx[u ]=j@ [nrQOO߇_g ȯ[ ?ωu{?woo8j|߯_Հ¾ \zקjJ&?e=? O~'[ӯU0Nr̖&ua3d?%7qw/.?6ʄ+wvXJ+k}<9+L'? אF[zd?up2p0o$o )@_w#YH85C+&;?߹O| 4|og4?a^ ?!:=o:?A~珛rf䟂h@~__;;F^&?{{uw#_'s~z.3>y_LжQf| Jv? O7ά'xϣuuCX5>^og 0  byOo{:)ׯ1hoҷp ~oEaq'UlOP{5g|6aW/ϒ WF ?-WJVoHDݝ|t?{@K?Gg/}w>*dY#9U@hat?|go[HQKŗDN.(ݙvn;6(mж,ˑH|g_˷Vm'xF ŕXkka*\/_/e+XMBϪIX^N(d*|?L3CoC46_~)?LôS WRr&ayp%tXS:ea<ygoz޿dz'G=O;s@hWC)L} σw 7/!߬"n_.76^?v3~<_:'=#<7HtL}i>܆&A|'G|s}C >^~tα|. ??Yy Z dkּwЙχ7V=q㫶*[j |τgsLB|볺qYX/}?Lt.e,vܸG,Jf1\ֵm#ѶmouLk(ZbdwU]^'a 68} 1mG0ǐ`'cy|o㛘Ufl;7 ߣ 淓oE#Txp6ér 1| OO\ڼF3$<:P2!AZ껓Jwlvx ݧ6/?|2U'Ox&ݰL]ov j v >?=Ot5XF L}{.O!~i"QO4 Znjݠ,ng woT^X*بcicZ&HfǮIU]ʻ!ۮE]٥+'=ŮC|lT=vO|Y_J  5@ 8KIUGqR}NZA&҃J2 D*+` 0>eGA @  B,[A Lvj7.6kEGr ntM['CgVZ'DK̟XVBX.q1$ǐUَL"p KVfΘ`/ brqb?SX\5[nßȯ9F PZ*Ha{'l|ɛwpғΓ#]y~j{`ʽt<(d\4j {5Jz +ot /z 굂IAO P,v >Eů:/INhiu`x ;ħ[Xx)?_'v|=HO6hp_ ~ՎE9ȿ=ZcKE5b@߽dMv]勪>?/v?s9):T'ݛ2q7CJ{|om=@ _%`ovVvzWa7+@=@?]ۗK *44dkKcfHe 򍙽wK~e7&-~iL^+rWFP\W(ߕTӕfWzd݁IWF ]p_0[QWe2~r\ѩ} 4H]wq\'.SrF~.Vj#UK$ `8Kɳ.K"xXlOAJ=[F89= n%oުߐr9i9@ ˁ[|S/ͷ/_Nۗ߱B;..7y_nлpXptg`w9嫓qJيD*V 7v,e?Lo7|_НsFwо,\w%ҍF]\~\{x-7u-B#FۀXrĠih"j=_ŮVy3w/Wat>nv߯m&K.mJg5Yښ v@,ח7 eeQVS [ -n*&*MTΦwY@9$q+n{5r G?߯krLeB/ٚdCÍ>dNwlk}z]݁;wxo|goh7)"ڷhw";Nc4ځvhB;Y-闥` mٰ]îRet *pO+'5 ;tEٞˊ~>>鞒TO1zO,:~+Qb,#ؽ ?< qkS}S5~E`AvI{~ ) H@E)[GjB  NYc%\o6׵Qku\TNC U$@ _vծ,j~ U$L(rC"_H$ @w Zd$kiKjkNHQFk7u PK4,6~Kn9fIs?-H0#(=&~'c$7Q\[uOq܂ߜ'؍g-~cyG)EM)5SՁ?h:(;Eu]a~㮊:gg=U^FUZLA_$f=\QaaxTRMW&RO 3N;>p(Lw{S拓\|V>?y9;]\AP |-]I10?0%&FDn JypQhP+dy]z(^APۊ]:%ydM_nW𓧞~Q=OsDŸ$:_EW'`x:c4pbM7sMئAJ ⻽ңuy@ dV8K*Vaouܠu܎k r rmK:nY.MtbY ;'gVrR/.N8O)q4x|s?5`_њư=`AOu$C@`{+ߙnT *X%*x]e[Fi[2'?C  }AuV}0'/4<# j ړd2?y) }IÇqOf)OHu9?v͇r"aD3/sڧLQ$Mc.q,EBB&T~° \h)/ ZK3ȃ.P. Ae( _38b+ k- c+Vh=V"!* QSh!)\3TNZV,( *ʠ2 y zL%I-Թ_W yXI)3 u~֛іPTy֗V1T*q"">J YK0^(%^8RЇCP>@3Ur"Tj7/䒎W \RPY(Œ'٪:L20i, w@&ʓ{ތ%q W,:]y[}>ɒ&R$Kj0yEOADiyB8U RK!))V@(BH kl߈)!R<@)+wi[`.P\0G֧}j LPz:AUq?0WqK i}2XfHۇa [UoQGe2Ab1q-=Тa ͚% +%9DZf ]~`,YH,kgÂF+.%C8廊$U+_#DA4sǯ) D#8/-KΊs3]03%'CΨ6N;8J%Fa]0oc7\lW ex~"?ek[tAno-ݧ=>ٸ$廑{T _|;b޷+wGpﺹo ~fKZw,Kv33aߵ<;?I`әw+y{۾zNht|e @F>GL5S*1VK3aᵦ;,<>IbgZ$U&%1t|;%7׫åIuQr#J(?;QC4nOIn{Aٕ/ЂhedSkJxܔ:2*ud ;2*tdwd"#QkZ6 yca3(vv._/c/*WCR{ߥŭfė\7rmp\J[ֿd7b OJ܂8016o<  +Ȃj{ZVh3m5i 4jS܈mʿ[ܣEأ,ߣr!ơGޣUPG ˸%߼U@}ZMg9o|9^~ۍٔNLZxDB֍c f6è X[Qm"Xe7ЭۘxSnZw7,++[:3C~vwɉ~Uou7466 v`7ح>tgwv2`7]nk* p1W^7k~k{/o{x3CCeKwg@}H7^UÀa =xbGK9xAbs\s0񏍿x\:xE|C2p1zɮBݪ=o=7$߷[~ׅ~/@$Mto n9#ya+Dȯ(" W{ce7ڬ.[}27W = 6_Q!Ol㐂F!OlEIo`ɛSd hI֜vnubqG5/$zίh(W 'wb z,e0?!Y/c4n8ݸ^(Vy{~ʰd``gF^"7orטR~H׶y^&ׂ!sJK%J?߻|U: d~Y_j(IfLK%40'T  %㶊|i2RN7KsK7|RZa</ ӽ,(۽U"`,* *Q=rZU)+&LâAzրUi݋-5 Y"1׈?ZN&q!gAX yclq㱚JZ(N5JҵdY_W`=wb|?>Yx Wn3ISK>9/AX^NۋsHu?(մDHׇ AL\$F D"1YV2#CHf{n6ĴzF& #H B$n+vutć 6xUI0̢ uONxo_~ a*NQSH$R$4zQPoߞ[=HX t]zGҪvqPhp|7kWoѮ|Я`ɣߴ%is&|x tKi4<ԝw TmH,kH*ބA7$4X@:@A#xF݁t>WgtHVy/oJ4nRXqי ?yYl9 cĈfy78K|Mn0|wVܟ<;G^w{9G@8[j'O^t{'%z0$Ո 4Wʩ9Bo_ ,ԱVAڏAu?F~)Y D" 7i3Fiڌj3Ffl+Otȡ0͎( (DNJdů ig5ۖB,EE;!2X[0wThI .HtnI5tL;]vy։m'6b=߽_l݋Ї S#k!jVB!5Ā_,Xo!p tD38HE .B{#yKBx@HtX^a'Q6IҹLeYz(^5@"p)HHS"&P_BHoa,eI iD8r|pq"pzx'xu80偵cw}g_xS`ҸQuI"-4W7Ҿ5-V C(QAh7_W-6yo"#k仦&w^Sӟ*ӓQcO'C"*$nisC4$7d*4Qi"+G@ʸ߼c]~SE ldR;2៱H LH]_&n=w|ot@6[Uvպ( mWinH(8n|WjArŮa­W$o\o3Ngџ&L%鹂ҼT"٭~Bc Rx}8/~+SAp~oH9qyp7?jɯ 7b |+[Еw_$?LZ@knAx,o1'/Wxd> ߲|z^1+l1k ?Gh~j"NüżQ?ד.:'kyW0_v XWT?ѰzZ@?h3=&6ok~i^R|:JU 8pD /gqb'w2 8d<8x|m4isL%W} xqɕ¿}x D||*Hd@<SD*!~@ x0~ڌW9|5cU;c-R4 x>k,Ifىců8@T΃Cq>zh׌y}|`yAH^ 揀skbgFV#h /\60M0^sj!^{Ÿ_cmDe> N<<('?wG`nx0g0 gԢ2)`<3 OConؗ߰;/ (߫pӏ?C7fN%7Sp^'yp~(,א~}ZU!1u}dT}\7rڛIJ)*sMޜA ѥ7#:g3(6fИ?!5 L dC,7O1'ʍY`,>YH<'SF\/g;vT.t/~%UDYh,с'ofdXL !;&4į#^5V~::`80N, 03I_~"˦XfIIS9$--$$8m'|~ _p9r+$WH̯]Î=lnubz8OJdMyYm P%&9lh\YqֈJv*V 8)Hgw.vwaCcaӑ^8,܄ih\ZȇUG. ׇˏ|.|p@>IwK9}`;諒lK6d[ؓC~̏HA/Uy 5 y-~iuK|eK%&aǴgZ 4"B3!PM`&3tkvǝT!eRK^?V5s"9Fe|ωʡbg:_(XM_)+CZ؄NYK{<w05Bh_??x)p6㑻8zT8DٿZŝ}-;Vz=\|d^؟Ib_\dSNyq&x%?U@~v)aJ{ T2!nB+P`]Wͅ]L *V 0}4-alakazam/inst/extdata/example_quality.fastq0000644000175000017500000000203714067624107021050 0ustar nileshnilesh@CGCTTTTCGGATTGGAA|C_CALL=IGHM|CONSCOUNT=12|DUPCOUNT=1 GGCTTTCTGAGAGTCATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCACCTGCAGGAGTCGGGCCCAGGACTGGTGACGCCTTCGGAGACCCTGTCCCTCAGTTGCACTGTCTCTGGTGGCTCCATCAGTCGCCACTACTGGAACTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGACTATTTATTATAGTGGGGGTAGTGGGACAACCTACTCCAACCCGTCCCTCAAGAGTCGACTCACCATATCGGTAGAGACGTCCAAGAATCAGATCTCCCTGAAGTTGAGGTCTGTGACCGCCGCAGACACGGCTGTGTATCACTGTGCGAGAGGAACCGACTTGGTTACGGGAGTTATTGACCCCTTTGACTACTGGGGCCAGGGAATCCTGGTCAGCGTCTCCTCAGGGAGTGCATCCGCCCCAACCCTTTTCCC + {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{]{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ alakazam/inst/extdata/example_quality.tsv0000644000175000017500000000403214067624107020543 0ustar nileshnileshsequence_id sequence rev_comp productive v_call d_call j_call sequence_alignment germline_alignment junction junction_aa v_cigar d_cigar j_cigar stop_codon vj_in_frame locus junction_length np1_length np2_length v_sequence_start v_sequence_end v_germline_start v_germline_end d_sequence_start d_sequence_end d_germline_start d_germline_end j_sequence_start j_sequence_end j_germline_start j_germline_end consensus_count duplicate_count c_call CGCTTTTCGGATTGGAA GGCTTTCTGAGAGTCATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCACCTGCAGGAGTCGGGCCCAGGACTGGTGACGCCTTCGGAGACCCTGTCCCTCAGTTGCACTGTCTCTGGTGGCTCCATCAGTCGCCACTACTGGAACTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGACTATTTATTATAGTGGGGGTAGTGGGACAACCTACTCCAACCCGTCCCTCAAGAGTCGACTCACCATATCGGTAGAGACGTCCAAGAATCAGATCTCCCTGAAGTTGAGGTCTGTGACCGCCGCAGACACGGCTGTGTATCACTGTGCGAGAGGAACCGACTTGGTTACGGGAGTTATTGACCCCTTTGACTACTGGGGCCAGGGAATCCTGGTCAGCGTCTCCTCAGGGAGTGCATCCGCCCCAACCCTTTTCCC FALSE TRUE IGHV4-39*01 IGHD3-10*01 IGHJ4*02 CAGCTGCACCTGCAGGAGTCGGGCCCA...GGACTGGTGACGCCTTCGGAGACCCTGTCCCTCAGTTGCACTGTCTCTGGTGGCTCCATCAG-......-----TCGCCACTACTGGAACTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGACTATTTATTATAGT.........GGGGGTACCTACTCCAACCCGTCCCTCAAG...AGTCGACTCACCATATCGGTAGAGACGTCCAAGAATCAGATCTCCCTGAAGTTGAGGTCTGTGACCGCCGCAGACACGGCTGTGTATCACTGTGCGAGAGGAACCGACTTGGTTACGGGAGTTATTGACCCCTTTGACTACTGGGGCCAGGGAATCCTGGTCAGCGTCTCCTCAG CAGCTGCAGCTGCAGGAGTCGGGCCCA...GGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGC......AGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGT.........GGGAGCACCTACTACAACCCGTCCCTCAAG...AGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGANNNNNNNNNNTGGTTCGGGGAGTTATTNNNNNCTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG TGTGCGAGAGGAACCGACTTGGTTACGGGAGTTATTGACCCCTTTGACTACTGG CARGTDLVTGVIDPFDYW 93S8=1X28=1X23=2X26=6I1=1X1=2X8=2X44=1X3=1X12=1X1=1X1=9D6=1X22=1X10=1X5=1X11=1X3=1X11=1X4=1X30=1X11= 403S9N5=2X10= 425S4N23=1X8=1X11= FALSE TRUE IGH 54 10 5 94 393 1 318 404 420 10 26 426 469 5 48 12 1 IGHMalakazam/inst/extdata/example_changeo.tab.gz0000644000175000017500000000441314067624107021033 0ustar nileshnilesh0_example_changeo.tab\Ks8>kŜSKʲ MRKjOݪU/!Ta1$}_d~첵3fAe)/+jomr6x\W߫_7jncwk=l͟ϔyx\gfOZz`7nwųeV-9h} v&ҥ&J֢u ҆p{{kno`czG`CiS7|";m-<\t8?ΕCqu/|FcH)vsߠ{Gnh,GD]|<ݺM: RKt|:tH| uH& O'z[|62d{vxTMuQş+5) R@~Y_' F#abbME:3P@kB |BzX4|+o Ui$vE f7rGҿ DZēm$'p:MI-ѡaga6C9ӎ&YS 9$ϘD-I%F9z澁8'ɲ7!3"ZU(\ZGr1Us!u+2\>t2'XN.k'9A(OTw,c#j{E5j[v̸8/-)bB11`~\oiE>y *ucpQ`Ɨ2Y>IcЧp\(R `-p?S0R. |u`Ɨ2vZm9̗(+m^a bb=i}i &xic te9JrIt\30S9V҃t|L_*&y=.Z 4M4 eL>78Ʒy2~^]JAL5lR+(6# ( \fƢp\|򲹰`ڔ|鍰|*edKjzY& Z8 RR/"BgX|NztFӉS8#uFUͻxGmW5k%E\teh\6Yr.}j K_&1^Wzjz*)-Gb V` 09dFlN.zc |wK. x+ors Ӟ<2BÒy.[t\N+)~fNs?B5[]gNƛBR?+ TN;ރث:>Jdx;]D1{‹1x+pOJ#wy g̹gEvE-hYc${ƟSbv)_ZDqZ4uNyBES:hBpxdK4CbZs\ZSќ:#(}<\\P++y%]^f.~LpɗC+C\9|vG|r|U%]2寑)GdXɔ㲘Cf]d'.~a'zN4]kp|Uxl6&A$3} c)a ])޿#Wa"}ŏoG?72E]W6'%m `,Lõ>m%aY];:5dO6~Ww鰅n4xxn0z2Bi TϭdXV(x{~߯һݯP 5unmmz uVny yPw uA_Ke@/na㯏 al0ŸwT~U`IS^;{OUة{IiӣWcalakazam/inst/doc/0000755000175000017500000000000014137542165013717 5ustar nileshnileshalakazam/inst/doc/Lineage-Vignette.pdf0000644000175000017500000055033214137542147017551 0ustar nileshnilesh%PDF-1.5 % 12 0 obj << /Length 1345 /Filter /FlateDecode >> stream xXYoF~ϯ  0{ 'M~0T@Ɗ\ˬy$T=H4#7j͋\7O#g߿!!C|8pG ewOsq'q.eRM[o6ʅ0u3͘gki^Zf;FBPTi XpeD=-4tJ;3""(SY2Ke;>A ʘG1%0g !1h;ᦪ 5 cz]@1b[RvR{y.AslZڊSMƹGiy>N VM!PW";=[.VRgEtyม?kEW#ꏴLYYO 66=$ YZZlz I+f𝸝M%8 Y&lqQw(Tvlٶ4anaH]G-Tm*ֻ%zrnlنlZb) '$ȇ[ 0(-20$nS<7ClKM(:1J}%VOX#8D1w9tIMU`738`HGp{ 2ڻADA[PNmHbzU  2O+ʷE#bh`ˠ HfUVN aXaJ)A3CRW&:IlVwy5yf(a$l]lB}kY8_Vm:8j4!w 'f-|UR#[]2}TileWL5ٙP-3ݟڑr-lFIxC c'vjc<}ҷmzA~ޣ O7ޓ}|~V [kl_o0O:C_KW?)v} 萘nltᏕ>43ktk';`wFM=CW%m43hxbb^;a'#,L8nL]Tê+s峿 endstream endobj 37 0 obj << /Length 2675 /Filter /FlateDecode >> stream xkޭ\>h$5K {Jb͇G3;CJ(wZr=3C]7/|ūBRdQn6$X%~&Pn]g]VM"fK΃`XpBW}KW+᝻}<lQ}rFzرhھ0og&fǒP  &0e56@EmSfRm&G(U@9N̎ 7;lMSXP"tA?)Y''IPė~Wvb'h̞Oa<$H!5;/P>*4SAKY_&) PǑ0`LCo T6@1tf~"dR9NS(ʅA4if=F҇mxX;h"]81gA \$ k+ytuC =qUV{q{<==AT o w0ց A*uVcے. ޛVM~dH]^iݔ*gj0 #+漢8${B]Q& MZm G/ !:WST@ཛྷ30UYt;RǷ7_ja5zd5$=DPNY]BjD #J=e&2O5`3g l @((6_BAq!bU y*(<{-%2 B;p ?' BV~‘;+OU#jHzixZf{TUSATI%ڶi1eOa6z[j3ꂗ|I|p(T$AI>Xz^I`&!NJ3` 㾈bfQ;7qxfÀf!x['-KTW 2͡ ~y'aj1!zL۱N=$܈XiknVZd>%~qӦ`o%'9ΐ>sW.9*o!)ls{o|u&ydpKN@W|Z"St1UwGEhLp=XLJzcCwQCd .n~84l pqhm9[a2\Fu?Y`#֟Jb+;SbftfV`1|ţY 5=A .A$P^XKhU$] wcYvUtJ&`iHoڮ#M? (Ǝ6P1._p֦̄LBgl: qAo- JN6\8|W[I< 4t0IMnxkR ay-EWjz/1)j_ܟ]돶MͿeSbB,Jh(q[xXH :B)8/'J$^EӜ ^~w֋ k"=:t ZN}JKhn'l )gRΩKx*t]K~ v&[SKOݐD I`O/Bz;H4hh<9}3j XԶpK=C> ͖nu-ϗ@.n?wn;v}lSiKKsq8ٿtǃM[ux?'!XR&rv,wl̤${bS^V: 8F{t23 |mSs Y[׫vl 5iW8~mg6ĺ63:KB3N[4?~{2I vT/+V٥('Y;5z5*qIIm1\BD7~s_+P+NM3:]B/[{{]) n#5yB#ɁkeW+_4Igݩv7 /tm`.1qw[]i_uN!~"ķ7/]Q` endstream endobj 43 0 obj << /Length 1413 /Filter /FlateDecode >> stream xXo8="fc@ZO5^wm(8  L{Ϥ@wY[R~Wkak:"#|?tbU KΦGܳ(q#Q|nQƭD.aZMȬ,f(ry0tf _TzBj~& wIδ/CB7( e.x5[B<5~8ϏE ?N{o+Pu<2G&Ϟn'yYYat4۬124NAtxx2±0N W'  7v InHMd`nq4DD%D8[WF^(vI6EQX9%UXI7N؝WJ cQ#wϨ[ hf "S&wPIQ2K<jF!=7oyR̒)Sn@.-;PƝҧaM 6v~q9*M3dW Ϗ/p~wbTT}כ>F( 0^O_1fgnġ!>4/̊hF9ǧTm[ ㅙJAVxy.UYÇCb8Um82L.yno`Y\uli"t+:E22h4qv#|"iFMAL8podiDjZCצm{GkX8jTUEGړ,,[+?\ X!dS^_M6Bgvwz9u!F~Hjki6jl`m{=1e^Vv=5=FЖpeoWK!˼{rd|h|p7'e'_" fȢ|ǿc落߃#g|Mn"y 5IJǨr|%3_wY endstream endobj 40 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Lineage-Vignette_files/figure-latex/unnamed-chunk-6-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 46 0 R /BBox [0 0 221 146] /Resources << /XObject << /Im1 47 0 R >>/ProcSet [ /PDF ] >> /Length 38 /Filter /FlateDecode >> stream x+2T0BC]C33]s \.}\C|@.g endstream endobj 47 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Lineage-Vignette_files/figure-latex/unnamed-chunk-6-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 48 0 R /BBox [ 0 0 540 288] /Resources << /ProcSet [/PDF/Text] /Font << /F7 49 0 R >> /ExtGState << >> /ColorSpace << /sRGB 50 0 R >> >> /Length 1521 /Filter /FlateDecode >> stream xWKo]5ޟ_%l\mJҴmB!6 Aj*.|HHm?{f<9 _; uTBXJ(5Şk_OWWݖbk^jB oF)8z q򘑀 BSS5Jt&{lSUZ"9D#Dα 2bi+܀r X .E%( H0HUq*ayx/yyDg,G"rULIq$Nny fW$ňEpZ~uc[m+B endstream endobj 52 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 56 0 obj << /Length 1107 /Filter /FlateDecode >> stream xX[o6~&)ɖe@Ym2{h[(uEwHʍ؉ey^$HxFdH%7ig:hę.uFx͝~ /%+V@KD eٕj[3]$\To'BMb ܯ563ݝ^h?K埚fsm`OGC/zn1 R'Y h@<KATN0 $6,ec`^&Əl$\4mDhX}9}_\3VΔ1*1)(c~yBZ|R;,(E./O C;,zm mXc!Ϫ\WeiY eU}jK箯={ٸ|FMXVT$>Gogi> ¸MËDgnY*QW8sn*iTFAzL;vCt;aBB( ޤyw~7:o pUhz}ݤwMlfqyJq"׾ЃH( :F:jTn!sx LBcy<<&Sa/RXh aYUɝW9RmSݚl~̌$>>IzmO_߾f$zO{ns:.1'BפfLNi2z #ELBp-/uzOǙ" Y3Wv=' =D:Rr#)V")fG(ʁ]݃8c.Ql-5a*[6(o8{y==N>:Eok+2)x̯IL>el%!t' u@~ʯ̀N[ endstream endobj 53 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Lineage-Vignette_files/figure-latex/unnamed-chunk-7-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 59 0 R /BBox [0 0 402 276] /Resources << /XObject << /Im1 60 0 R >>/ProcSet [ /PDF ] >> /Length 34 /Filter /FlateDecode >> stream x+2T0BC]2TH5Tp Y endstream endobj 60 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Lineage-Vignette_files/figure-latex/unnamed-chunk-7-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 61 0 R /BBox [ 0 0 540 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 62 0 R /F7 63 0 R >> /ExtGState << >> /ColorSpace << /sRGB 64 0 R >> >> /Length 820 /Filter /FlateDecode >> stream xMo0 <&Jq)6K4V4G-7ٺ"REږ+0kQmT/[rN, Y-h \3Zi ; v1+kVzBL[ZZ`bRր 5V&@c 2HUHY%7sPɶTm5-?!j,eREU+o4Qx컲DZ i&]So,U>Z9ij޻ h'ܛnѐXbrveɥ heƱ\dh{)'M"e&MKDž*RAj4jP1TgmVfIAE7&/\psغ UF>pT?dgb%oF;&t3D5C^xFt-t1#IGf@xF|t4xot<ŀrUǀuė=4kY?$5lSǀVIy/Q'_ !: >)L#-+[y i5M84LF|1~nGx}<ւ_qu ?8H{ ANCP>.a}X/詥=+^1BX2>+H aԾx܆c Ʃ//ނ)( X t{YuYyҕAgTW߂ev,Po_O :uyqe~[@}=r{z[X_ 'r$DtS`=w \m_YUt endstream endobj 66 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 70 0 obj << /Length 1770 /Filter /FlateDecode >> stream xYo6BAbV,{]bm:"K$([TJ"YϹr<~HERMx}0pR/hľ{)MK0Cm٨sjNP5Y3VYԒ*W>T1Q-SS(jв*'Ք >~Z` eF 0o@J%7x*լeՏWY>}7ͳ囬PJ=JFsUժhB [7]j&_Ur9/y>X#  tk\ 39լX9Vr(.E׼ { E;~4Erh5 >c_Mu匾MT/P\vxfRQN\M/UbJ.Y61OUUxR|eT 2F;֮XjQ~t=O&o9[ʖ3[s@84K,7Fb"4Pw&uS{9ۼ4}}aPlcԇZȦ&x܍/n?V8a0^}A๋O9R8ҦičߋDZ+GØ% ܺJD-JE|tyw! x{me69$e%eAWSϽQFT{&]>tI骬{)]."r]$x%=]r9VEWRȅxWVռa<q@h>v굮Nc~MIX՛#S,ҳc]fQ0caDV=/  /B.lr/ľLg"i0_<ڡ!v$Gɽhˀ`$=,>OܼA'قtx٠4⶞(#H=@*2?%E+bo#4İI ӷVJN~:`q?[4IٔdjnZL'3x3؜BzͲ-vpላl> U Uz6)o_IX_4(=}ݚz&nI} 9u(N8yIlF FfD (%(}j}`HU. Sˣy޾?ʺ[u+n iŋ{C{B?SbS={M1M~p-+pqC`Ї臝Oƍ .*Wi; endstream endobj 67 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Lineage-Vignette_files/figure-latex/unnamed-chunk-13-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 73 0 R /BBox [0 0 425 154] /Resources << /XObject << /Im1 74 0 R >>/ProcSet [ /PDF ] >> /Length 36 /Filter /FlateDecode >> stream x+2T0BC]sS 6QH5Tp `W endstream endobj 74 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Lineage-Vignette_files/figure-latex/unnamed-chunk-13-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 75 0 R /BBox [ 0 0 540 288] /Resources << /ProcSet [/PDF/Text] /Font << /F4 76 0 R >> /ExtGState << >> /ColorSpace << /sRGB 77 0 R >> >> /Length 346 /Filter /FlateDecode >> stream xSMo@ﯘݷ,U 6`mR#&C~Q b9¼72o7LU\kh# cح-O .@uO{j ~|FHft Yí QEKkˀK| +9Tc2U!;\e1J\aRe8gn#M ##0sY,W/H7IϾ$d9:Ȥq _7EfxMJR?OJe^RfbB媽K%nWrYj3D]wҠoYFF]zZ蝿Éc5~l1Wҍq gҘ̓; endstream endobj 79 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 82 0 obj << /Length 610 /Filter /FlateDecode >> stream xڕTn0+BE.1CnIL[,$Qrc-O3`ݓ*\PAAP P ;dP%)c jLh E̋Ngӈ2cFLk|X(YS_]كtsMsDl=ĭ>j"V+ZmVP84}s/rV$%0`պR J";uYKZRKV~WKtMtVگa;]>`PsYJ*3qNUԋ?ٳephz|VK3g0Fڡ BӐ9)zիlޣ}c׶z}qU t3d`3pKf1ckg'AJMKRN9g.Mq ?1Ą!Ukf\b| Dyb\'>$Drꋐu;q+c619yc]GÅ-Wy((Bن+E/㵡i9x[G9__c~ endstream endobj 111 0 obj << /Length1 2096 /Length2 23972 /Length3 0 /Length 25266 /Filter /FlateDecode >> stream xڴuP[Mpw!{иww'\'CpK<3W4\kB/l 2Jxr [#;fz) Bhl 3r8-&&&nx $h 0T=j@ Lol 3~z{8Z[8JO'ӟh5`dg ag(ލjhadcT5qe'*. "&IVPj*Tyw./*$W埲]oif ۿ -y]@ 6St﯎@_q3}o_ l @h$ע{+߃?9mp_rJJr[#K;gɻ//Д_QG?52.z2]Oo#1#;/? _3KN/*˃޻c|br<.&37}HLEA瞧OO Gjk;Z,LtŞQ(-&m@gX0)פ131d03qz[_=\gG?9&C~P.mgpKO'dg03*߇3?$\lll2oqJl$a4Ut6WWev6zza;seRslұsg9g}MNN=()"K?򗓸 0rt4gzvv'(#=` 09"L"N `q&VE?`TZ!zFoz4ۛ齌?55-ﲬllFwvw {]{]{2\2\2Fwwϔҟ!wXd ԰4}Ag~?*@h'=гO3;'rzWɿ..os@w <Ȅ7*1仏xT)7q9L8=`F /`@tj]œ,U{7{uNSTb05`U*kOl&f/-k>4hgY+pVswDyj퀑nFC((.-i-W֠/nR<7 z_P`n)΃\Dlc!Ⲣ_ ŵllӕ̊+=I? ґ?9DV'FQrv~R=8c=l|oP}cFLV(SaK^M 9OHK!ƌhqZ.8ⅾ1#ıf.lj؂s]vV֐ "R$+rA7RѢɿ>)Io/}b>0\O犋IΧq7N亃 gaVq-:s *;l3g|,vl>zyk;8 4&#EV ŠPhQ\9 ]Y7Ýq:h ɚ:-s~3 PA>vU[%dPach=J[t EO ےOw?ʷڇ~5oJ9AP𴒿_YkQpbͭOk.hFIR"-ⓞ&] ́ݏ4H!ua<<&ԿΗhF8)8E$3Ŀ;x @AB0SLESa'jYX>XҔ<>/;&Eh?+a?IUe%4q,=3Ж|'}E轓ˌʬuTe}5hS_\P R(c #6-J 7V#aل~TV4:fPt"[ G%~7ɔY|LT5)/kwz( ^`Ndz*dY\ ch@ݾM_I}s{/x^W־G5ۦ9j[-swjʭo7ա:coJ qaL‚,l"֢f8n9Yv?GSp=-+=5y./}-~qiBP6 ;#P sŃjJޢGhp kltR ӓ(N+Զnzcb@/ZEeX=5?̕7l~[$6pm*횺9V:Q jD2Kq;<:UR*|$(aeœ:艫/H5s,R}L$uڢ 2?Fo*(PT n?hyQfX)kEY'tc{3YLzLҗ\v&do |žG7fޢɜ5]t/5E^S#jjf{&(XX}=C >DCCDx I>-Cn0T^yXwZY?Ժ3Dx~Xh>~Pb)u:1`F0bX̳plY|ɗ|9 v+@ UЄ2`2b,mOf B M#=neV}LUc/O3y"ۋ0Q"zAsҁ}<-0^7F|q{ V9fgKxxG"{!r ,jc1ϊj\{oO[2 $-vWS)rzGf`=gr*Z7ſQ fn~o^*Fm%۸7!9Ut0ؙtE{kVJ䌄Cߨπ{ڶ*gˌ1Fڲdcnvm?xfk Cjujt^ۡSqdN[5Ge\;َ/Ћ(`{Aj/GuwςBcvA;F[<yA˿E_#dz[dr5~4lfpQ^r >cT৕#sqP+qђEõHtiifJr쌈3$)P}DxXJݺ;&.emb#^[wߨLj- [n ;g1G s̡ӼZ0.[\tZ?z j5w_ hZ$xx\[W@c1us1L} y|:("}8\G7Uv݂H֮gM$Mf`2c|l~L}ÝHO= O{B9™r9HUaQ9)':} @ ,[x=v I\ǀ4aOT &XF>mr|J׈K SHoSR#oA3thr>TZ?DLdg{hɿMzoL>\rqoB¸CԲdd.3<s36NIH1Xܯ}{1 :Aiy[H>$ $Дi: k rE:/gw#̋_M{B;d=p0_%|DKVp\ -R{ЀN/Em&v1Aٻo+g-yan}Ơ,df=U멦`@_FGKmy\{Zdl!g猏CU1D_ ,'?n<RrS6/tEġccd+c§핶/?jCB)x0KӃ㪹1(QϐNU6N?tE;W pDmEDqM$Nw5N`ջ#F?[7-(rHA(iaʕwр9hq]TF(>##ȣd,]u7:%S # [-nQf^,qgSR<}SYI.*#>=S-sEmj?T%<͚+AkLՃ!.G@ L@>ҡul1} U%t aH3+d7^'HҼJlNx:Cxٻ{WDŽt}pם8=275RϣOي8p=A1% dQqШX۱o&ڂCH=ܜxͤ3Ru7e>8iFZXUjFY)49ä#ǿ!'0ss?8<;GwZ03Wr"B^ٸqQ,:u i벜4̪toc v"+dLK@Vc.YqOX1M2Ƌ*K]uob $|&`#|rCqbZIK:)J[)\VMIp tlyg?{I+N!w1pPEWMX ӡxaƦ-+l (%Pyōub4@KNOrA}@rDh UĤ,0MI_kS^s4Imj7!"(ܨpwyJVs wBlY}/x1P|傯Wqg+TtY1NK*>ZiYfcP(? ؕ]PᑺعAq ˖5%WOUUk^[}#0>Fgƣ?Ƽ.FY1oëː _>\暮XC2"R^ ٧\e .J*U>}f궶YwDΏN0^Aqȕ^_AF?>_Tĵ휪ڀ 1-&^3TP=hXn͓?bcnF6 ja[OMFg-'aM^mBܘ3XK #'UO>rIܢ)W/ 4Pvj{ũ5^U=TOvxh zc9/|ns<2^SgG+|cLඏ͞%u)u)Ɯ3oGb"1r0#0Q0 |KB ]M;'YyWjp;B.>㫀^O-i~W5JZ>o/%4I)rZRۖ西jvPV=tD}mǗÞ-%/;_eDerzu<~HhVrxil.,]d#u@p43%Y!%ϩMfADzr2dˈ+2*lO%gH?k$? *b䣿gMƤ[ÌJʝJSz^8;Y4]fh+ TxK~NmW`ΟI?B2bʰ3$a+edut"lN >A\he|6n+82>kf٥^d-tsqufа?bz_O,㓎0XjsԬwQBP^&h𸿉S@cV׎k8}>S+8JK̾O+e$j5vt^BֶK-TDjvn#w~ƱÅ;<4N-& 5|T]jbq6!)I@9l^N}3TRX"Dy$\/Qn'3`zx9 5+``2E0uDr h6Pui*,WGo!1SyDB JdFJ!Qh+whtZ$-WU^%Ҩ䱩L@Ո*ߓz*1zG{6M\dĔ؂2"dNda<ʥ&!5 sS@k*G.5BϼzԷ8MҞwV mu+˒TY=^3J7DUke3sHn)}+([ 4|VyA}Z~I̊]>t"i9u[~*Z^5,PՔzvY,L:oiDZ P)m6?@.25|w6[c鯣ҩRG j+6'mC4vMg$Ӻ ܿŝ+ T2ZD O흯!3A>YʫQO`[kjuxK=u~Xûڵps JƤ|Ɠ_{c"0p, ~RVEaP:P ǢnYhy}\jhZgmK7B`{㍎8;R᥺8LK4Q = ޹B)\c>?8[(TCꑇ^#B/&1iX2Xl2pb.e.:ůnzĞiз ҹSH1}gĝՕ0 =50 #8dEemdw2 pMH8<1^]VjI_sqx1P>ܥy|(Pv?t 교TŖ6Po:3%00hOCN4@s␵"=V0i3x^}g$ p$u"+vDzh33:smdΊvՉm/"zi*}@0 6J3)Ӓ 1Td0{27qWn@p4Kv *"3.{/ l꛲ ϞYn_Y3_o٪W31ePw59sإ/u75+|+ߦ*bdzPUsouVSxFy<_XU,!F ٯZdRm+9aM3']7HG)b֗Dߡ ,7ƗG3@~P3:2G-/'vn}=ھDYp5MX_u‚7ÕEVvT^Ì(W֋K[X[o}Zb $od`QK/䇴AS.)͌G$GIV}7ZcMCV6aҹۅT[qs֝^e:x$Z=( +zLQNd&$Y)򷤿EaHD1V͞/}ß)i@+b:-ł>|& ӆw'0 mzYDPh"sNe{Lg*E^7]qrڐ[0fg mm@ɍu5XM95b:N5+kf z [~xBDSt32*eD]>/`ky᭺NRwt^C8_H8Tl?"߯b)zIQ+ jAa N\8y&kDPE`!"Yt e]Q9[&eFF ֨zoI]3NiB4y[t:nwA=FDGZiL6}O lh-O,&98v"}J9:M-ϼoi=y8Ck+065giﷂ{; i͜+K̊ᑖ#^hIJ$"('٨!CF cK~vlQ}/;nC5!ȇ@Q23o!i3|ġ[z!/pGCINoȷWEA8D2L+5Q**{BjvJѐ_?w Ww%}q* buPx4AV2`Cǝos4u-wH(܁~P¼ddM@KB:%EeW@/1׶*mE,eG[$D(f0WAq1Vj\>uE"饩Zcm^ Cl =+?$wƜgt/xv@YIDKn>lRp0n5BfF {]yy 0CMwɖv1 YꠗOL IR,\Pjᚱ6:JYKpL{=,׎~poZ+V9A]^mx%1_tnrZD X[E!niY4}Di܄c% JnH鷫539V_ix2Y5qi~^pf0ϑs0 NihEA7! '3 &[|-2ȴ>t4h;0xoo-¬/W&hwvbT4Ĭ$fWMQhm^'yfG3bjѪ >BXb.H\ĚXkɑhͭw~-;(AD_(/aUZx,̶cA:*mqͺ'-ZkEZP/`DoNqTFwjgExCm% {UtTcFJۿj6l纡y7(#HGLa>2ìf5Gq1;W>X1z~g@yX9^/BVLpT zXL5OsL[bB;4( :Q4SH}%X ۳=J[kgVJPP6]\1txn7B!jJBe]>Z,o.W#aO!nDj CCd%h IŢ= Ȍ$$PV_!c3XlN<%h5Te<ݞkخ䅩(缳} Fw?'z)ȜJ(/= ]c)O Dß<''A_N"J#wmOhY&Y,鹜 i7i{y5)F0P'{BCDD%$v@=\L/rRwoG΀Dzp;I,pM<%9XфپXf;s&w eiQ#5~$؇Wa[[7ku:97+?ܣRbz8qR=%\P>H$EMja3e]jj0^o $#x ~3e8.Y)4XQkT^8)2FݜQo#-$?m\@Zn :.AD΁ gD kn\QXӣ8nёB2*њzKͥZNzx=];×.h-Ā  77 7!j'pl[mgeaLƌۯzKgl|y%,PGnyrqR;u8ذx uСf^V ²"Tc|ÍBH\4IЈ,8 Wۮܬ`()Y Lr7ؕ^Tf Tn oC]k$XLM;q?P$=o z%=Ctdɡܚ>4hka}Ъn傑"t3ܜH?[](oCˆp3818Njzi=. 얲n]Bzŏ!Erߨ1:}_>g)H6k>y+7U*驩cvz ,VS?ȌG2q `>U6t' s]"^_X0Nd[-8Є3s#_,h)Pibiͻ< b܆(~,NDHw*-'nҮGL4?uN {̌.cGLϖn2AdG(9c2v"Qo.n{ͬ['vC;)eoQo~m):3 st%y{1N3Jc ,Ş_n3Q%0D''Rk&a:XI=_2ob)m`Z,(4h0/V̟(iC'm7SoWZV^V?q+Lf#5T7Ҁ@>r9HJ!R.SQxjD{f弬8vAA>\T57QMԣwV.]*IMz aWi%I!n۰w_ٚԿ#0gx}YOx,d$PU hx {P 1vfVzL){ \/`|x-ׯbx]? /./v'ꄮW`h8[w=~Tn1-t0&9G>uXUy P؃ƕR`H^/<8&-#ڍhq!,b%q /@#)qcB}˙GҐ#yp.1~}׉@Oz-`sYשn1BvP7,y8fBv+g> ^jDbz2 E6%Y 1s1{zcMHp;*p+h:Io8mb"aQa7|rP]Tk4ߥ*4Q&.uB| |feD_vԺԊ |A8qt0i]Fbؗ`%3V6~I&/D`L^Ŧ)ns L;L5΂i%O/O{}P(cXn I H0&dwv sWMuRNS}3+G<)dh\e au;H5]&o߹ﷺfptJƨYJdJ!{3Te!%,_ iM[:HeAx͹mo=&ʧ9n~>_EHSbshɮRDp,S^T:sp !hL$fff!O Y0jCL ek$ZvnLՏJ‚,%o&*C|!~Δ7s"uq&2i+V_~ʛ`ԉu"mQ=g*WoDt۪をIxv>М k|jX} PӖzQu:2_Nl\^ϟ҂o1vOοCzMrv=fR *|paQJ!\aOv"U$d8]xˈ#H%nqueJ[>|ZƁ/Uz 宂FLC1RIz";i]Ak{b|" ͟o*<jS "KkĐӘGh 5\-Yo4+*ՒՀi=ps,1EDnw}8\t\2"I:~6=xѭ_"N(>M/a#^Fl2v3lGְs-\ɒng?¸,#k֏3sJ|DYݟ[ ˼2ӅϞe#^[AhRV^I_8;BPjB/hց6XEf;sn%OfW"fM[i8m'J#;xŔP%3(end&E؋!Q'| 1Īs$)C,RP(jM46V"MVƑu6BU,]doXWZ^M~8 WSRC+<2dW=\(]q "LٱXs /!S+ I ;>1<xҷ Iw}„:Bo1}B;ĸ hxݿuV,.E B{ٷh\B5%TV^*pL$:ڵ_Тsn (qUZ'W< E٫;}9H/a${503kP~iv콎tȌNI!Y Gے& 9Kj{4\] @;;Ȓ JQ(Q& OGߦI8ƇMl*ha VAdӼ G=oviY V/=v^ R,dk(\8d"bG#gϔGF,GX8&)wN.*^0Y_3VZ6:D{YbG$uuHym\6tSUY _9(%ƏsaUe& ]A9llx9ׄF邆[Ũ1׿(oH$6(%m JI(U_~X" e|+pFOŘtmEFml_ᄎ:z^0)UZڹ{LX?coܺNM.EB D鳵cmZGXcؚJ.$z5ǂ_^2X+ }KMUkpx9ܸ2xg(-ٿNх72n˛x B15GnߑGPFDCuv?;J_l`crDro"$Hذǹ5e=ZW&vh`,jV9yﳈ,W/x|t1z晽_I<^>#['n a JƃFhASZ:\)GbX ]l~.%Rj|͌ncp%W3q׼sZE$:s5"!oJITP(bs7fpD(5 H(k9C>T@JЃ7#PڜkaoMc Gt{,MS =<H_#?ߤpGU@pQq ͡%RuvwH(xtY8fR/pDWzsℑK>YHH |JSQ'<1C}ȼn`,:7*RC D!3X99Jd[Y^0hӢm5$! Or'#`Tz W>ݫ ?h0mYMOT7T6ݵ blrl,?a:wB=XƗ9\({l%00q wl}]C ytҦ囖WR^o·j7h5İS)Y_:[^+:(J+ǁD[ O> H%c]Ck4~[< 9J7 IRommĈ3#iKx?[#A-ћ6 O:j7yf<&q?ɂVy0qNw?O޽;etMMw?+o̽%Ym;;6fJ>CqSUUVF5Dޏbe{ m 2EtMs(CX|kjYRj7ei! w.⧧Mgl1VVLh' s#Zt00s->\qO:ā$PE:įDq#!7+:K["`Gdl9g-F(&:7 6P#XωX,VF~hhyi=b!>,omq;Fow DeXv'}yuj3nJ vkK>+EߠH>[^{N垃SyAZR,MԽhJ#LlߢS} OңgH9^_ з#. -grm鏗15!p//;./nQ Q$xw[tcJIʿ9 Wf-d`jXL gf[".ߩ^%E}&;rxEq04/9KGDtX1%rk/G@ QW|!4WIIR%!JԠ2^Yw @z}* 7% I@ sH/NP WR/(N ,pXtaŠ妦Xk)u #t3$dSZa)kн2aD#, .a hUA/ru!> 4fVܜrfah1Y2ב='[L䙿G2fjwOʼտ>G?l1m ?|<^`sa8DѪu``ƹlZUQ,2l5% tcmGxVl_5+ZBUcӍqAZ$~Mu2Z(Q#jjop olAV]CƎ=Kr~΢5*Gv9?G50UoVtz!)lc2 w(J63Y}aa˲xPoop#@\,b@H4^M DS_q2g|(EFPfeW 0ARsaZl'{훻qދgf"0_:v`zƯUU-zo_F囹I]NcR~}rI,ۋkrl,?a:ǒt;w&S2;9E g -H4m-Hw{~޴90S4DoiMQ(#Ъ"Gs;۰K>o_|UL쀵#}JGqus’]dM+.']ɭ?8A,7Ch?EDTÐ(D YOqMئ}$ށjCVD3 7h4B6fQHD 0ȿj߇Xz0"h6ZlUݧLMCQF;GtliXtr݉)K1qGB`~z&Io|k)+(_-' ]3 1ɽQU>zq: *mߥB3#?qߪ?:ES/EP.oaYۺFhoX^bwdl[= &6~7S\6hfﴧap)wv ag ˳,ؿQ㌴Wì YcXy9 }l1T$_eQ\YhyrAp|goʾtX_]O Rk`M|!2h :,Mcm J5j7R_-nw鋂`kWkV5w۰9b]Vy'y1V)wxO?5,qlq7KWLI=Ȭ-J:C6F\\kM_PTnG# 5=S~+<͓5O[ȣtU UJ1h%t:KHp@Вv 2]o@h#+SFB WA[6krڤ(euK"0jAC=nXX`-4DK٘>]DKRʘ҆{MZz~30}CDDwa"+2i@?&G "X,ڄިp'}U\|Ȝ܊`vro߻% k 髙AMy))rcH|_ǃA 1S'Y~cZ k Q@dڑ#p)t%]0,Y&ٶRF>6!}Jtq\vvL(F -+i~u$zY(=ϊYX#p}7 E54^Yg<,fVF^J ]3gF`2y m &7;kּ~˃ 0Q+{3\Cej"HNPEә =X."!,0X3j-rTdm0A0|o+w-HPX1ƆuP Pkħ3W$Ӭ452I'" 8U$|P*rJo+>x虎l11MZFiSrXJaOI#}F'mL)$ ⲋoGX:_=fZFUlsM< Ϊħt /{mCWI2&e=TD<̧r0_M٥/Տ #W?cb M<30 > ?f/x9A HUtY P3X/@jHN*rMNĦKChIÛ)Oi2 B&""oaGd79#N;frwwqW, &ai K{bh_slQRaS?r@rk0 3a#oizĠm*͎O,HT)4WŒ ̍DF VHw)W~<@*_[~>zŁ˧Rj(s-d AACڿVť+Ù xXyvygT5$:Rtx n_cqh NE'R:S^^gzJ}{| 63$}>:LJTȭ7ELf6~B+?. CݾЮMZ čJ_{$3wb>g@ rIjhm# owT67FS|{rEV ݣm'FW1 tU>ER /-yXΕ7 i;@R !f`de3yˏ^*Wtg0 8%׎*Z\x`+ut}J8BL_euZaydKU^V U=V ԥK<~V=V3/؊2JRI"҃dEEn=hRQTl7GdQRJUR?1j} t.ſӨCoTKcjE.O\}JvfruȤ{u,gG%1"%9U,(̚kCQyn_^ާ4|Ґ5 Y} #~p:÷:6% ڲ w&83)2D" ؙA,k7B_ I|7tf3iJ5+]n5[]Q[?!OX 8J^R]}D-HigIJcTSD'8N+ދ[8iqMDhsbWN Z Y,`["2Rs8 =fYb1q@-K&| d[TEuQyoĕ4]N'pAnYIP\'E6J7wkg:;NAG0*PF"^LWgOg1\3`a_VayU]'Yh:9n3Ye/cS]9Dܖn 㟍!8مf}; V#q#h@4J X00ڑb;T%D=f+XK^~!Wh;4fVqcM_dƏ{#\Oޞ㭩:Ro|IG =16Xf7zERjK+>_rPb'G]X 4 7"1rW*9~5czk?{J:R7qޜW}B>O6  HI|'P!V!jk5]2U3QBԘ,rX/A'aI8? ;őUꉣVDPޡIIo۲DTlj~0>w:ט= $f1dusxΫkc#o{,dąbl@CO;͚)tpN/Ŧ"p՘N&lK(@h!pSco!qz`^(xfַm`=Ntx@-:ZD~ (Lys!@Yf +cJ8J  endstream endobj 113 0 obj << /Length1 2587 /Length2 30712 /Length3 0 /Length 32208 /Filter /FlateDecode >> stream xڴeT\]5 ݽ [PKN஁`-xN]wwb.{u>c%( rrgbcf(*͜XԁfvfVVND** W-IqXs|Tf>@6?@dnvmt LL+gțY؃mfNyf%f2 lЂ@3+ hiHkdUT556@"6ۿ X+ X xA0=? * rkl`\g3=/'Yu & t%$x.m|̛;WI6N?.V/-Ҹt f' L怗+/& փj.Cm+ck ~+Dۀ|g_ Be89XL|4Wſ.QoV@ ĥy{@T|UºI0K;%("-ﲨAFNTq^[S',DPF󴙵BUvQqNg%F%:'^1.( +V `Jfٚ]0 ;wBc'Ě-Ϙʿqځ-yÒwY_:3rD" $|0DSKDL*v..AzHЈ1q'.uһnOɟ(㫞n.-%J/H*8PbxwE|قk\2N!u:f- >aGOCy7 )ޠAtbn ObǗ}^u*  &g. VfFUj'YUo79zkS+)*\J-wҠUw^ i$W|kKUa{ Og6 +8FX[W臘<$~q~ʌ?kVı"O4bxq\_5_p4ȋGYp\ ]O!r⏺觙e,07I%KjWedJ< |EjpQYuR>5B"8&2 V-#R5]uŕMDx~Z]l$٣QhU#.' \r@nwܛvb8 ×n^E:;kUO$Tq4 }.rR~ "]@?7t Ɨ@^N85 gA)0ŌW]}~p5RBdWB;#&Q6o_hu@>OΔݑTwARns݀D(>떸ށ[T)k#Zv˛W8Rvʛ6`JV i .KXy }3F!Q6z,7% hm_l8̊ebm"$aW)e`+_l?H+yo6Ŗ}ZɱU*9bAElyeـ2Nov1Hv6aC8 BʦWyQS=v׬Է̡p*MaCs+_*%7[F铒(A|qIRNOnGrkV:+.OI}1d-93 $x sF#//*v^v'n BTK,;~E®݊B=c?Cz`=+]$0/fV>Y:BQ&7мs {+a٥SuuF,;Fwҙ ؠ)Oߞ_khˈ4qtNPFmg&m#ӟ9ƲUAjaj[њZc"W۬uR9.exaZy Ox6?Y.I|x W%8DDf'dcByo>̛1czmm\)%'}R.kxe$]Ґ\LJPϏZrXq:aؼA;灺8,"ǩֈM"N j 5³d:2KA<]1{0F|֯(vB~Jc@#M8|MJZ/13"D,,q8C['RНTBAz;dmruvs&܎.F\t{ x HkC0jFstuEFT+hWE݊D' ֌j_wƺF0[_n0BO$q$(i T9)h\Q*#Q6=4QҺQTG@%rG}۵UǾ_յ 2 L{IeuٹXQOs2)4/]: h DC _%7ڿN?bYgLX 6Mtd.KA3I J~x;ap**O.$Z⪱Eqw[ ˪Tӡ>;/(q FsB`@"XtgQ_>.߸XdJE$D9͖xۿr&XPAS3c8-u ~&];D"d{nN:-W<]6i!Đn&l)P7|Hڽ’;ƇED#;GfRjw2Q:b!VBj<-v3is 4VԨO}y/3]M.G ^j$ABvIKdY8Jz!^۾ls S-Պf6i 1o8L੘(JTv>< ;MFࢬT~<>؛땔c7m)r4S]*9j]EIU^u 29Ι,q̵aɅ&>kwOlB'Tq~ yLj=$,v8洤-&~yY8P# )%j6j(ۖ*Q=o0Kahciǃhv -Z39䂋XGb*]O5e)jb.TTR7XZbʵƄǮnIQ>at慶Ku=9~q]bP_Rˉ:.wD&a5LaAb#R='X ^puh;p@s Lwbt:k`4_$iaWP12 Jw% ##}V#FQJEn)Wl᎝B1Od BfI/(m6G6j5iQ雃ˏ d09L$nT5:SOO(Dj;ŪC5sO(${ u)X,!7<Yy""WdiǗ*8nǙBwG6|Tq;ZO_< r(u%I(p} ZênO&:ld1:[LFF񵼪X3#D/,238|`VmkbIp^l@YŸϬMty7Rہ,۞K_ K9bVO6i[v g+m33dW1kE" | >tG8ڵ֍fG 0Bdd+f3q`3uXx%yppF_s+F-ŋ#C26J9dR΅opcD=sqfHkEM .^/dXw>gY!uS[[13K#CbNcH?8 PG/\qVߙSA<}5l%}* f[svmzvC0 Y ZKHHa/ϼhEGPLK4yYYR/ڬOvyHz)(3&Xn)όq1}Rͬu=cm(>?aaMJ?|>pP~ϴw%pa{?3=luapvZ o#iഊo6|] pZqK0 T)8v  t;hB/8ƿ"szt@z5Ok=xI+5e~@)x8~BvȄ|9wv,b7oQ>Ȑzqo{ߧq5R $v iKJIo9ـUJ7Cʣ\qf7OLħ>Jj>tNlueЌaߝhew~ A.C); l}/[1݅x;YHXy GT=Э^(Nv-S z/4_BKXG&ZZ4e (ۀ -ea1ɟrw- ?"Dо8’bM0c]'kv %(fӶEIwS pCgsw7G :"57 BVeo+TJh{|JZRk Q>BxU w~P OZ&l3Ұ=]udE{|@x,w}Z~s J,-햟5Z\cIZa$WfLGvD"J`zcʭ/6  5[ib_WE@q*WCK˂Lq8%lnk`!cX|<{΀P;"mg_;Ť;J\@'92BϹHlĀ+? okyzcS;Qm}ElC,E)*K y|󊢏)vbg #;OG<wܦ+7*X_KygIv]8&*J Lc fZFZ_}騖̇˿bȥ!f,rf:Xu,|`Gt F\Y `iԂW1G_hTK<*ȬU KXQNEAT+*o3ˀfd7m8Q3۸F܌[s:*YH/0]M_}}VANHa> Խ)ōZn|<N`]R/:Gu aX{&D-B_ўKv<RJHC=W&FxA|]ԘRa;h?î?Mҳkˊ (J r8)10NK2] >JM~vf\kxyAvI~o:Hr5x˔o$8~ծobz{Xjb8ѱpS[bei3'AYOkɱwd[3I}a#_Vt|2K[hk ΚlX$p}u&!(Qps*iIЯSql7|pgW+C~P @H~)ɳTBڕ]b(G n $frМ%.ΠVL׳7jEކvW_I f3)7UCG%-\TnUSjh+e{8cc^^g~A+Ck{g!!ӌ;71_Q8Su0-;בìbblkS96/.drrd:᪩{&rcFL4|yǯ*fj$V56&Ky&lIJ-LpG,u-V6!k ߬>m$FE'n=PBV"=b;[Xa* ~X1d.], ᖠjo⎛=m)'{k]xF)GlS= nO\GD oyoPս"/&yY~s\~_n*`\ FrLnd_> Q$(G!uA"A(c2Pl2"\=1]8gPd='|ocZtȝhC|{EO3W[gv<00x_:3Y(Z3;8ZjxJf#g&"th˼P^jM=LZ#ApD76 Ж%аfgr?CP\%HbrFK'(-b+u? :6uC~ROMX7KJ-]cIȂhL;e(v~쩻kI6+Rm(ڲ7"Q[V_fb@BWb;*h)#Z/Z(Wĺ+bVzŝ\:8\݄Dr3F,LM`Bdkeކ~F2_ ULR~_Cڜ@ *hiWj33Hh˦c+m7!_sʜGu6mwtF,`Yu4A>w~yrO̹9r~7RE1'HZK_o-MϡcΏU|G^;'@_L^# PEN0+!a, b]egC+|ӥ|&yDfqGVy"g7h~ 4yˇy@̹_Ok8[6·d9&ʼ Uel%_ KMޣN6jߋ3G1v֭V&' TsbڡI]>:6d04\|{>|BYIӜ~",w.x# t<J|V2[MmΎWS 2%49F Oٽhn4dI*<~ƈ > lS_McMIԇi-:O!א4~zuFb>u kvStVCWNYh&Ҽ[dGzLyd,. wk熐vP)ŕyؤfy,x};L1[$j/5Jo,J1W}'|XdYNPu;UBkh&!uJCE׌vD'\5vgcmoKLv`lexX%1.r3CDW70]9DIP(ṛ>S''fߡ Q,!hR*Xe*==A%&fB &HJJJ?8N=ґ$dLH=le'ǁ414=Žcqt"Dgh4Qg+sץSE0)Eb\5޸ -v H:<ܑ2_gY6l \ n?SUIRMKҢ D[d$a@b28 Jm/2gG'TݣlǕmA $30T4)fǞZ}Ff:Wm"lY WcIT 5Xd×tV纣RzD46؛Fv,2YE#|y;+kޟ#k|} K$ Z ٟǩzb֓s#kg}k%A=N;|[5ѥ%+X#1=3\F f\eCǽ9,܅5( @@(>>q+ Q驷$Ο5[F=$h~E[&Vbivߕ9IPB)CECkUVNsl + bi(a!ܐP.BO*(.([0,=Zz9 vʍTLd7)%hRq@̱T#YõC~=jŷws/Mk&zSK(U9B)}R{á3 `?q[= ++fήY~?>h gcé 7 ؽf.'.X婨bg*^mU;g G7s9ZE<8QP@+=B毉t. %^ мA>V?(`*MAF=!ϒ e,!EB6H7gTpU}ݓ(BdS`TQ|v6~b&0KX}eX&'3EĽ3 E )Cb}$̄Rc/ư?YH1mU,|mKkV?* xl GR`iYJIOugk/W%PבBtd hI`:P:hV|3/C(B;c >Jܿ/v)Y.LN WI+ Q7ϟ;<@4[3%OV9jIR8JG[$r'3m23^~g%yQ?KyYuʦǾWu.DcP:!d^|k6|.(9?*T IdvE_#udڗ2槰*OVLBRX^D;ƍGqlUꁙth‹ Mn7w#OcexV3ƇWz]oQ!RuѲq?o,}< $-r]X 486?hNH+nR9t̀4dxf@}>FutIq G0My9˞hH{·kZ?mIߐoJQ֐sVbJ$=0 D;R=Gv02B{%X?(tç($f #;A909RZ?>vnȊ/A;yZ& .L~)ǀIVٌ5lku{} jÉ?j&LR}v"h4mKqYA+V Lf|߶l_qN !6γkHHOZ+dDw45鮰(>hr1̪Ny*ŐۻJz%x3X## c)dCF.jEяڎΑ.0.2s!RDyJb_j]#^Ws9{V[nρHa}BjPiTi/뛲!cmb^ \Ɠ欈9s\rAJi:\Pٍ5')K }2a8|ld`GN$6ϖ+1~&;}*zA3C'uIl>1 H^,c GG9=8ꁙR^C&vќ{IounqP"c /M8,4|~zZ-<IN`oݴ21B[L`v t?htAøRP|ESS<h0SUxKҴ-0W }bԟUvmyاZ -`OBlTZlCʌ%"Dž^ ,ha h? w}Oh)$ Ff)V`+ڦwiї~0{Hb|~jg |lbSqlv G&"{' SsDCCΐ+3˦s 5"nDGgp8L*L";ZYbG!£;ET!N (< .!bu;)ǟmcÍC$c{Vj }+,;,־=;tXDKN,PjƌqX?|X~+*Q"zcloNTjzB׎yά񁲡 'sfq׈'@_ug9-⭊" ='ԕ ޢGM埕)+8*'Hڿ6Ķr9^]ں]4ma.l.|fYt?a,xދ,^~ƬR ݖ>YۆNiRGH!o',Ԕ%Km+rm˧ѦܾvJ1ϪrU_yV,1*]גN9Bf %}PƆH7qih컛Mx%a IQ!b8Q_櫦ߑg}5fNZ]3s2'c|k?Lhþ~Зr^ { %v,sEi͊.STCdB`hk,; %C&sA;8QNv*eԛKy6^ܼ]hdrP1\m.RǵntBhۣp?\ޒ͘PZh ";lkc;!SA;;e3~ntZ\@{£=f/QAoC^?ir6 5aݠ?@S8rĴ!ghE:Hrvՠtn.0U?VY_kw+-ɣ,xi8=tq9M0LPP5KK.bLI5}m4GJ zmey>FBr~e\R@GYο>VpSSF0*/KH`^}&;) {O2ɴ@GT=U )"l .;f\[.18A/G"d>I}# [G#$p‘ tgAKaVnj]HM*@Ek[ [7L~C}8pWZT 4 KV.wѿ tYUdyoX=0*90 ~%!dӞP6tiҎ,(kk(ej ^O|.yZ,laՍ'S79հ$/#|$."E6n6* U_)f MU}g|3jjӜf7 JhoћY( E{Շ*qpbh=Edu/'*h #S7=!7U6/HX&*bUUO:,=4X_`Ra -mnv{ͤѴK%| }_EQEB!N oE55+ !o N]2>کcgQeQ~NRHREŁ)XGc0'4[h_WĂ49j~ ժi0?},@JBC{gF9ܐPI6aHNJ])Jئk\ϲ0Auޅ0=+e|9*\>bO}ܻ"91 vM%{׈7#x&EuO!~u@#{Kq+` Ԝ'K+$JS̛;ÊsE{ ^;)sR֫7iC3VW z6Yd\rx%il/qm)^OZ*Ms, #ejmsb-z[XT [^=:qFH9` ,=5H X=>JK51g?MI%"]ʲk6mw:S/:?ڄIJō֚#] HPnC"*;}gAmpE9 $.AJuN旓&28ޢ R );5O!.-+\HhJʓt,GIX;?`lm3gi<84_QJ Ce&A+r5(*d V% m0p pP1$>U$eד^a@5a@=6BЈ>"#oiBSިQ-0)yjX Q]8'Pt*m$94P̛+Q&+$3*28| ^@}usc`>ydm<"tljbI@ 6]CR .Eg^3ؚvQг봊s$\6N W` 24Uв6,aeA8{R`xň:TnS߉oFMX'֟8 Sq̋v0"Ȫ L}*A{K_? :žK_DMo/mވ&h2}VHtgU֊a{])>K?xtDX66Yb Y@sa~`<:S\8vflEs-ϝR{T o-Y 0 +ϤНsp%>*Ȗ, P:l1lh= :0,LJ:7;kMܡ0qz#SJǧR"LՒ+2MJ=Y؍_@58; ߉wKM/0]\Re EfﻠUUg?ZM{Ai2NT8~bIqگ 4 )yeK TJXGII~.gi*P;.A!8ʓPuyVc c`9KVTъ=ll{]LSRB[i6cI.mSذ\©. -?˝p8,}φN$^?A.'iJ+32|w*G|u"'d3j*AU*-Zkb` Rʛ5aď5B':-8(F>hwFTT+DWw'Ael&o:x67ǵfzxE!$oWr5x.$zv)3z9^U]v8?t}u8(n1É}^c_l,oNTc|-t$dPk'|JCW#.5"&Gi/]6 M:x\2^Сm,xp$?ѩC#K]gStv_H'0껆xy l_SٸP:1Uc.u'{zJՆ^ް%XutP7;FT>X{1ZUH rH#uNJw+6|Hcà(tß`t!3mEU6a>89*5Rh1rԆrdɡ1{q B/TgSa4E &@VK2/iף7#efC7 c*T5(o4rڴTzPVqOJkp_PV{d* ksMUӵw%џliNs6>&"F)1{bh3s=4_p\+|Y[3Cmc*uHWg+vh 8i=.R u4-R F]&&i b•#lRH9`::b)^,~/Td9XI'G4skR0fI~uYRƓ=hz~3D:]|B%^s`vʓ2C0'}8jWsNs(`,ڎ΂Jq IIBŜT{\h̒TCU=,L4\K'iP>rF*6ߘlX9=Xɴu_-]苦b IyAw0Ǥ1hb.gMCu7a*>>hQDփ$a&jNGƥLhcM6,.N"-:c4rtL"~[lqZ79[00:4 frpK>dcEŤ8%_d˼Na/=ǨZNL3 y9W| GV_S5$QI\ +Qx`ᬗ>Pu(0EfQ9}}%:K#քlUdsd@v7q2-lǡ\<{.*{j>$(Rڀ+85O觅onI_^h&*%ڭ;v&yRWh D)č1gK3+]_xם@v!mMyh' &4;vzO,c{@A-0P­܁r{Wz'oJf 1׾J\9X.̓?'rWya[yl4 Q-n:ZarRN<9V]҉p?n?rf QFB'o\0yj⛁a+ 2Y'D,!op_ aD!lAd}Y@ )2aal\'=]\45)Յ- l>, ȵE ~ \,^cHV@z]mEi)Ǖ])Jb> w33iOHRuD⏀pֺyݽMђQno+$_4-pt?obp<4C@.)ftEzp_ (DЋ?dkJL7]{XNiN~ywR! 0N8u%$|\[; AdS2l*ƣih33"'-^4 szΒ xi%P]\{mC?8SNu |*KZ=2%`~s*c>G1Z~;GUlۘIkB$[g:ߦ~|Ѝ̧'+L4&^m򱷝09G~7 nm`}Ht8ӂ M8U-!TtS=ۿ9nqZ1\mQ.$52wu՞ 0Ez{7}Q|K2C|4zM\؇87ׅ+F=ߏQ<>j('{Ě*mF2 yrKtoomUms`lpVg,lR!p?^kq MHkWԷփJܴ]NfŲQ b|_-ň|kCŲgWOݏކ;$8 s|4 jXXh Yǔʆ%B~1DS_q2x\9@Y1bZd#d41LL\sv|cD'496ʿ3>S@m>,r0wK\r^'}~Gɼ:;}gOi$Y%uW湈KbXe~3۾][ґU[CŞ ЌES s9B^D i5Jk*Xھ!*0Rz\/@4X]ɉM];O Q~'E3g/=k..7`ޢsOVKjh,̄Q`n'}T;Xq*8Q47TLT ·_NOoi>8 'gအApc05*Y>qZ2pVeQ(Ѷ\h9&*=^E"u"sC 0<9^oKH˫|Tr:d&7I{D Ed/E>=Ie'0钧 ;3yeg'TR w-Ŏ̩E)+\*p`Z@G=z8QaN@g;<p]xk+aT8k%LPHx.l8,TC4ˎNƧN`$0N܇lAr!2g=Sȶs|54^V9o6E(OÊ@& J椪4gR]( 5J nPN%58g,M bC\\TmIF# cy×dpo_i1.Q9<ϓOHD#GTxӲxޒ1Zumkˌ lߓԇjOɠeE]ZB`2;=0AӜ FĂoDGSuĘw_%" 'D%ˬQc`4jbc 5Х*6B~1S"|;هKGΒy6q x4VďXO?TXn{ˢqh`dwѝ=g$Aŕ}Q&A/z1*sgE47"!FHo]* *^8-.rA)Q;DGF822;V6@WRH&w~CYR|QrWa><ܼoI6ljMz E$9Գ {ֲ\P꾀><F}W./nq1";<0}Qt'4"3\d6ۜj 8 q! :dd9_*6*R=,A|e;"[|uƓq{|l>S뺬:# |X:mq4!aڵ-·G8Yʤd[]|p#"ӿ ʥtXX1mVK#B)pZ<>{pyI B9na h)nRp֯yP?t|@h"/X߹vȱ]Wo"Q$uk?.l5ż]0 _^6:B>5Hw"%o14fչO E ~ \,_ZlpK^FbR{k +<|ᆰD-;^h6eq,U\\ztTJЙ8z1vz+ 4sY Rں\m:aw 񿕺}ܼ;:G-b^j-4eؚ#ݒbjd+% hfq5/܎n'zA#!> *<V@ҹNk~EGof[yaZM|jTvlAJvH#W$8-70# e<$ݚb4F2zbLئ!QO[lirߟz ^y8[of?0c""ezVPmws-ٴGLM"[wfvB~جYU18&; #qQ}cG kaKJ(N+>CxfC>GN%NP`22KѦź5 Ճe(➙ʦXk0pZ d&r{"rO/dq`?/-Yp ;7ɋ!"nXF!yx̑z;k,5r~lFɕr_IlSS }x~\+]C&Y9@GPbFB\-ae]0ZNfT{0keku.wZ0Ȱ=D834aZJd:I0NlhtoЬX-g Zm*ZU8`A/!=*lC [X@FN67#J-"^o\#}.m+à⦡Hi^HcLŚ͈yKX C)o(lW]dCfYk=8 P|@qT%;GH>eY VJ7?"EvbU ڦ#K+Dgpt1ykgA!`jKsR"4a*1 r+su[8qk]]Ʌ4g' ʁذPߴon2pX1Эӱ|P@NY4 օoZ6%BiuIXlohFPF]:<r@oG^ŵӖ'm-Dq}HVb{I!8TqjakdYIX\{P~rSsFFev{ mm!4@u#Tt}!@_o%KL>-H{FGEv& cPB.y<+p[e3|>_*_AVJIxR`/sevэE~n-ħ ރ_O'o|!!sռ8Z{5lwY1@DSł=9c˓v_C {n.5{ҴsW [3=(~Bn ڨ^g%wiwW+xU5]+zH#]O -@$l s/ӥj>TƟˈh[!)(eW"5άw3ܪ<6o٫5|kC`Όc&Mi Ƈ<(*$r.!KY,*$2dD`ΏgF&}ܻx@PC0|$Bdj1 OF5Ƿт!!BJvJ aC MNtg$4P|<˓up54Y|h%FmąS M#?n2CO@d6RnmzFqtٮZgDZ -Uc;Zވqs8W$*$&C8lT`N٫2L;f.بo~$z--nM].T:LWk߈]=U\ݛ٭0zv2}>(( QH7`;h\JV5\֫'iڈi&NAyQO Lcsrg r EgKǛ&-Ab@.80LBGW)=V[8 3.1 @hyЛkF}8%aTT+Umntv(9}q;tayعd +֐#N[mE B9ֈS U.[A7x})>Lhf a_`AclDejVj.Wh?'ͮ}b% 9Z:Q|ĝI/.ͽS*/qmN='L 4Ƶz>2gz냢t#Jj,S=%@EO|m@V!_swI'[^bϮN~d F u\[QY@JF]'L.\#@U_l!AU]qCzDXdIKW759覥(1cZeBC->M:dW6W|y4/ G zl5!6A_xcEGO ߮sc7ӣv͐GNTa@;~]N9&\a/mlA~FP+"?8<8\unA5 خc_dwۄ6PY:[3&1 {v~<9H/"){*3Tag‡( N-5j LJ[P%#)' |:M!Od"cspZmfPX15jp #W?cb M3ۘ2s"4.īa '] "Kz{Ctzz]jya~WK%vIO`bLȁ9QEpQ߷SV5%35E3jHD^d0 ^5b[8}-7i59AZ |G)_7gx{#5 nNc~A!7 qǔҿ) ثN 'J)/%;Mi/ͼmGB}n@v|^Ljgp6^*kS(5{RɮTnՒamǭZ! {oX/`HBV3N`ZqX VK&3\7!oucvC݋1DC1R{VDf28IZ2={9]HJxHYotMΌL<#ڼ~t6QJzH$K)$s:l i5^N0K' 94B9l 6>.o ūT9$Pj 6NOCa-e[-+Tn4ɇC,.,׽_d V9`葳?{O=B("v k{ES k$'5!E7p$UC7Gee& VUJwYB, wLǯf/Jh̶ӽ__".}=<#SИNtQbKt[j=m3-3G˞0n9#dOs] =^*;*RЭQp~N| /:lc!rz6eT Zr7OQkas)Tf4QJ; ѹe!6] !mjh=#yn"P\t*hlUDRw1q6ʖ$Jm m$NUlJ=?X2 ^Nyk kq1yqϷՠPSy'+! B۰㊟ .ϔr S.d05}°\,+ ep%z1yo9:w;m2O@v}Sz5;0+*( Z^xyM*4ot)BۤΆY`mLo=c&LGם &vR@0 HwRaZC*[h\<C%'!Yv%yP=0oEMXgf {?|l}h1N -k*܃ .! &iTu/F?5d-5Lz 4lˁ“+6wsYʔѕ<G`߇^vܱD{[wvVzWb}<&UBɻ͟[؜ {>)=ɹdGy%Ny|J  5rW.$* WUT lṭΥZxQG:'5 ɫ:_.[Շewhtx2&*JԀ]0w>o~Fo*UGͥ*®pY7z VbKimfI,M}Mr\=gJ,QxUbכ' q q>b͸sc@lyP'W:|HuP'5'm]> H1~cp6cS~g˖ܧx(5}ՂP ":;6_3I dO΂CP]6f=}n:tcD "jo)^uXbheQMޠX'hPt64[4_~zf6 6lFT9ߍiB.ZӓTL:nJ% r'*bSR=̵#J/KzlizrHM ż=г<`elZepy4iC3N{/̂sNqcE DVy"|nCB?(#@"lg"Tgm?<' h9I:́o_pC#jL=閃0;b&9p@)|T%ϔC#ա@,;YYUK83VGgODlf٣y=MD1O $n:q%!Tzx%oLzdolzɊ٥$COH5]z7hj$>ɶhGHan3 X(bbu%K3 wz{kv <)fJ % (%[u.zʮfaHz{\#s\F㬮=5?a0/W{郀X ކ)ڮ s-7dH*.iQR]N ԳhMBw$@zBV9  itHu׹2ۊiG}BR>yٰEe62=p6 Y:μ2߹H-]Y yuj qFAm@Tm M 9&\C-|d;&1WB#^϶ICU_ rs_0r詛b0x*M+n & LH4UQTC:=0N2Uیh@IpF܁EqЕuF9}Bf61z,o=.,2aVI/v.p[c_(/8gDZ{ o%r5U3${ aX z$INA+m@ NC$^PZ_g1 V#Mǡ=R> stream xڴeT\k5 xp+ ww Npww \޻|Qj>:#o 9*H֙ 'bgefWX, LLl䢎 t6(;[01qÓ$A w  ry؃T3] 5Q{8Z;JO'o 503ޅ*;[hm 3*IEu%Uj.vETUM] &&i$UlqWVVgfsf+OF 7wWSG;̝y\fnps_A֠ bk^Ngsп @d$a/{)ߝ&^?1ep#9/_9%%9 d 5~7t:8 ?A&"8:!*_"vwgtm]ş @_499R _߫/QVMTNS_vv&fv> ,/65,F[;wOC9D!N߈ (o`70&F?{ C X,e~g?;Gxﱜy;r6w,&g0z)9?{?_X iay.0N?sgcaгp$bff_-p/s@ w1ʢ1oejSHxt497iL91n s4O3ȯ}´]#@1O8,KH9HI%Pٟ\ _EiY'ʟ`\Tmmpr:@?Q - L0Q4wIo~LjFDtN+%Z@6`.J%%(7a'%h MlUa ɝ*ܓ1S`]Q7TX@TL1GB!rBӇ/XC)@257NJ{-ֳՒlX{6>l.cARkN@gn\f&gܑmE9W݃_ӻ:,K EI@{EqA>*nCfE2Om@z_1 }q׺) IFQ'\Jt6cPQ=1ϫv4[N筣6UqgO^fiZt`ކΆ7m=#>zؑEp%rz"8z[LڽҡqvcF q*Im1[H6Uڨt*yO.xmI9+~ {Jl˨H;BqFy8`¹Y)f72Xrpo%6ߒƮ.Pp}赦Hr2Q)C|%L2~L? &z~PC5=AzY{do[ݜ4Љib5jԋ װwR*K7lPguq_K Ek`&&J݊HO5P@7I.fv/ cz}$݇2<>Ài~듉XPTcj,otN#R0w{o z쁠sX,1NdT7Yi[">A< %1-m8mJ4ꯤ+"gu%ᙰ!i̊S-7^UfF)$}"|QwK6RWG蘐=g;)? r319`damvq%uR5;r&x`%}tuEhhKrЂ9Fzj8 ܒ-$=baZ 9d&U{vwvmuҋ&W2,iWwf3—nGEc#<+Sp\7Csƌu0#H+h';%pc^yx B鏅KJ믥?vdPb 7xhoFy=-ŀM_=OXIcQ 7 ZBA(+GIu:6բ/<"M썥tpx;P҈ GbVʐ˴Qrg鐺oԋ^t5k>.@̓oȇ`#|df_= l@SWqJzq wj7ve;ħb02TlI"ί޻7>MͬY1#3F6,:E e])v#B%V|T>/Aݶ 7rT來sX)6FEXk[01M!㎈3E(ԏN3Aq><'*#S >vS;%x1~-~(B݁<9ڛ汛L IZViؼTګ=_\(h18oB^=HOF\=f2:0!NȖ DDi2ؽ("u%mE(lF-ID-CzCFO ĺa *MxzY$6bt@.2j-8[VCU"O\otiS]+3-Ƈ -^ܭ,A/xB\6奉e9t&.XOgʋBKYWgCI979[HqTd8-Qp|fXHr8d JڂE;xkf`fhb m#:1P2uˡҝ+ fFҷ7D啿˜\ ^N)ܵ^w?>R"+ߟr8Ṃnb~RqpR;^~0 LQ^S V=E }>T-Vb>;[צnīmVW^/uSQqo)UP BC1/{B*]{ST|}D3إ)3Z!l'ڎegrmv6a-td=Ln:2g@5)pUO?b/ _ ]6 #,FWZGFߦ {*P['%=aN]Q$ܰ[)ėۄ E)-#AӞ_%4pƜH2YW[iR # ɺѠn \T540mI yФsy\OƂG]e (O~*ͻ?CΦ.-|Q!(z^( Yvպ/t0og ve %ĶۣPO FmKx"۪?Gctj(Q3;2r &)DvbIܢA~t^]"v܆ۘrހW$'ɴ("?\cBQ +2n QeSj}j"Lvf铔4{IOlׅ]BþįVɩvEYe0Jѣ6oR׿?/5f拵59ߘ4tX0cwUtMZh­~YgIz&Vϡ%^nY8,y smaʫpE);$lڜH&U,F`4~%O2ͣ )7oo6!VUDq-X>`Yghц~xD%GrMypgZ(*!ۣa&5gufSp3٥  s_4%ekbUY TClY v$a=&4NqI_@=2->Xֲ=|M-qL}ĂVnUpq9kJ421gg `qKhD0B:8۟#B \rHL`V?PuЉ$TYě@bYoi=YΎr I,$j,t:`ӍsoCÆaKϘg2~V9 ̛ I"ܧl坰|My:Q]9; r'UZ+- ar(n1|} KYQ7[WAoIi5dɺS̻Jqp: 2 8crq{ JzH@ ӎĢh"biMXEƽ$fQO ]UǟGnD(^~]_B +jPqQk$> Ϭ4ʨ+6rAfGnzOGk/0܈Ts6ntTTXQIa)p|r X<#-8-}2"a %U:ljgv3EѭI&}H*sRg$m3s\vZD#r% >likЪPbۻT.%*x T#!Gs񱿌qz9tO!B{w7+!O9W>owy|aЏDbבټm5cӀRIúU6b6,~:QfTH5*pAt;80SiC@˼Ig+oPX~yS/hF>`ā)c# RfzJ! Tui(A8( A$sˑЊZ(͎*Bذ;'zmI/OSGӼi/T) 5ߍ(T_I52kPfŦҬICnT4+X ?; {bH)#d~A-_ӁK#XMu5=yziyi,iuiB/<$ԓ@8`ĵ8lPUg5@!rjEk췙|q9 a4UۅQ'dY0˫w$=-f6R=gUT' ?ӕ?&J7vU4E].y hgO!q2XtO^M" %XFTn7E\.uȏK7mnR5)p:* g?^S-:_Av~AU>K>=?OGҌq^ m`Qh!Նe C# =O+g.M*Yru1RƂ{S-a^*N\.dP}@;SADn؎FTMtko0pQ%uRShn,% 2+IS@I P0 Hjbz)UFr lTq.or<:55|&I5m"?[Z0haNnz{vRCK0(_YP(DPd0l*sWog~[h >v{5v"7l"m 6/՟z_Z.pZvy"J9DU3m*+AF+p|6 XNICC)I"7UX$%@lտ4"Z&S+QoeQŵBn5)\FZ9ͼgSz½Z݈#ue1 "ljea3gSZm̐]KzX?IZ (/nrX]qFW& WT; /zTfFbA,g*/{8/|Ƕ*;u~Gpwk"AXsZ{XǰXMʌ#B( L. W`Xl+Z4?d7>p[{G/U¦ ߪ$ZzDV>M9Pz@X+t/>zoa _ v\YjjM8PCp< l B {gn&_̱|bwr~ֈDϱ=|׍JweYcAՍ9Кh2-ax%ŕ@oܱnYXO3~ J@z_SH0Vi|6"MG9οKVqmT`=ےӭ{GwDa3d sC/JY o?D;^L ʩ6 L>YLg֊o 'p5 P4n{"Nkё9S)a&{tjaebDUڟ ]Cd%T*ܳ ˧yR?rЋFC=m(κ;byUE:lH[;!_v Fnzqv:5.4iFfFVBJH(ЀhhUOwkmBz{6$ͤ/ap4,h "UtɍvW%9(௃nyF J,7=2#9,!*qq8LʻUS2D+3Í KRr_p}#p>|L?]*LV=afa ح_;rGMB#Xܟs)3qGrsS: ^n>ƭ9&aW5.Q81拷=<0?F( Ѝf, uQF`zy_N\6f50j"rB q׶qCA'3C ɿc-ZtFnWE X ZRՠ+;e$)HK<JZb>k Eb{SزJep f jr-CIe۹!;ժ\w[jyY98qF ?z7r5VѺzЅ7o%:!ouD_X ]| eyW" B3\e.wɩ 9$lrW,׾_=E[D:;_rؔ:e(mvb-8tS$P:NM7Bp؄ùBg-P=XNa;Zs8kw5B jruV;WC&#|& ͸~Am480nR/nx} N%"q,H)9zBeajGFޭtHXIf8q\e<<8SvyI( !|J3J մ&_\[?\]<2 6^XzTߡ׵J{Ғ$=8@ԒoþzE`hEvc%o)j8 ߤ:^ESM׉˅ʌw.MȱjAMRjua׭et'N gnI> 2)57H*BQ=~8阗1ۺW~7r+̕jfjƵmgzob?;ЭǞnYޱU>.k!^XJv@de نB%$gPН i',]- =ٌ>a1i| 0h}s8!Ն=ЬE>fb~Y,mq<ҿv9e3{aiWvabf\>Nt!TIk||;{5CFg5*^wjY9em:cx 19:Ь1#Ɍ -q[ʡOCߋ ;sAۧ?e{:nȔ1M >kMXei[|$5ʹ7w`f?弚<f܈Y((9( _g ,. $Ie,E; ɦхi͒/&ן'MEԭー{X~ l\c1-,{ Wԑ۳l<b[b/ŽO|my3{>FIduGjHY ]>/?0=%^NzdW6.# طHv]5IU( z`ol,~6߶c)R(u rCƟҞX?p[|@,xE"~c~ϳVj4D${`Ň^LPM$\~2ҀKt[Z&Le`CCF"`Шv͝W/HPޅpe;'34_81/ͼ2$</G!eĖ~|< ϳKaZ3vrZԠz ;>_2JwP=V )Y0zv}˗;uG>E]`VV4DDߓkre Uݖc VLS)B2K~ou0Mj ns"!0\=1Q׼gI!s<RX<¥&SB4@Q%vя8fK aZXF/O:HB؉$QhL]&9PfoΔ-|Cfg8x>  Fn RYK_jTI #MK؝mFڋy0s﯄쾘^ZJ"?EY@3ŗINK`^#W #V':$_Q1dqySLu,ͤ3b]{|B{UY>X{NDYDTṇ/ڃ?! 84\ċ)BV/:5}>ՙx/,7.3 ;hTrΨAS/Y% 9END>idjh5 }̒d G]#kmMcSos4}p IƷ8ׁ|H~4aCZڎ+[ SKgiܙun+eS&{^R* #G {hkp  3ʕI'gBFC9:l|j۲Hǂgux*]Hvqipj0j%l- \r)z0=9`}֮E?E~iA/ʷ:9{[c^Ꞹʪ;"bC[r&PJbur(GP`Jv 3%>9F?{@B"9^N"<*Q_du i"""=)es:iu(̍y |D"Vt(- I[j}Xn.0iFDZ'˛q̷I'{],eL%TPT6.Ǡ%_j"GGj9۠fуQBLquj[(о @TAQN;C-[lAvԿl!%P`k?yVJ ^_\#%10d>Bby7>ls&te`Bo`Nwo._<3svl!q\yj|K1S\DV2WEbP_xl4QKI7Ydtޑ& )3g"i@Nc)u-磞%wlz; *jȽ.eT=8VՋ>̦ 6ﱑju 3f/V{rZu |3"0kG (ʟF u5'E$1~FO#<]/xRwkH_|HNOz:\LBq~Yg%y'hZj E@;qr黸;y Pq FźXGZl)1].nE0g0x6xFJ}q|0+30ɦ2c?kkʼn8p7:Wsˡ̑e9wXQ\hԥ~;|XHT,^,`9GDɎ" 'o^{I5f!_G86#Em*!rVZ!C?p !i6B܍@kxn%;e7 U^l  EZLu ` w-!67G9n#][b" T^caa)ȟk0O}ܭeA!6\;Q LP < I/'XA'^xn-s6tΜOW@F. + Q2ιTqb#pBcI$Muhk#Ad0<&4O{ ҁS=6y ^T9 87 ~l>[Ž_0MLԎό"+Ab5YE:΂9jyz:]:e-Y}=?cf6+R+Vww;Hj|w#I`y $8DdmE 돧cmlhSRwFĈwӘd}w#]@DO|vs.R|{娯cùxBvӟ K>Lpt@ FWBXpLX'qߛXqqK*ʔN>|$yteUQXp`%OJXYgRRrb uA7c;9cBum\)y:Y٘ADQ+y0hTGyӾ]gTnrzQݸL#lϜ'IZ ۥL)˝l\.n7lչY͎cKv P,pԧvѦ89P&LԖTQV< k=.yOEaۖ7gC7p%2&4u<5)}1̡μkX4T7bOJ ?gaVXm $!:31ꐜH.4y4H;|?V {KƠ$bhTB<+Vr% ²v0?C}cKHKB݈gFQ/.”Y5e8 pbQ]fP{wazE!g|=#06g8E5pͥG֥ w/l2:wnomXIW*&$Ɗrml0j8h0 Ň@S(s+Ɍ>+KbO7-Q I)~15E-LY/!XV@"߈?@G%?.лK?DPP07N 5aUN h=R_B,v`l߼Y{lTv6ݟi ]c& )5,2n?t@a/S(6>Z~Q Gm%gtTH6]1Kcl62*D9SiL42U;`dk)4<.nY^ՐY {@- m Xdusې__D|o8Zc'F]<VOj#V''c*`Yk/m7$7 k)F29|1WHi4Nkm)~6)jm:xgIl"tO6=O9i? x Y5v\_~Sz~8^}j\nUkd~5N=9gP,QJa?1oF,tMwt49]pR )1HZ[S@#5%Xѻ Nl`̣1bE$iatf%ϙl֒-~CEFE;{~mqPrʩE7X3)8>8?O2lmeF&)ź3{,2@>uk##i䑻oWeR5b˺'_>Dgl|KG/xE\V I5feyKM) AbmyTԧV&H^_Z1ን&=丙/]?5, %fGQ^6T#:_V-&T'LS}YGv4xH`:0FV.a<")\9'\nozi氪C1.+ؽ)Dփ# Hk)a$?C< ~@fRX&Rvh8!Re[dR|RuQW:v*{uʂ'ҟDg$t.qa]=agFaKv(riTISCV YU-nR׶YE0ZcFb`(ni{NRBn 9x^k=}`:%og}~mwPmI7xŜ0vrC;s)1%dc3+b He/Q >xT6QQm.Ƣ=vb|o]Gi>̥o{hq!Pq2QE%M3ZS29ȓq_>Kqe9P+[u^uRp SUҕi< q-(ks@a.;0/ ,xnN|Y$Dzy|=ffKb|w (;0Dfvx'X_w&ߓiFoOGҝ~œ'VdPAg8WWbP)-sV!dc׎xgZC"5MD^/ܔا삶 t*ث#mRJ Av9VNѹJGb9ڕy(~2W9{K̠&ad^^ݜ*&S^=Y4PklwmXX .(Z*ruDiWjDwʫO8Ksi-*ۛפf|sVSLK@jQpeC mZ{DLɒY_Flu*1|LF304RMP };W&f)ꈧ7Uˡ.\xQ'u+,E?haj;vw4hCVcc[@9> wWوM9(5=L>$EjMNZ#[p5-_q4ʣ!ed+3W)k{.m ~F3et⍇AN?;9ྐ4G/^eϜCl"!lc^ eB`^T)ުJ59 as/S؅(ŵ)],Ϡo]ƕN6d!ih|w}!pDY>Td֕%7c/u-%"5W }~nSpc ív*k5_p%H(+)e(/i{э3vKR!H%& T =@l7*}v]b'eׇJ"hFZ_`?Vg[-eIዦg"Jm͚s(k4 8 3-iqܹJť4pPW -3FhX@H8uVn^zkZ[dC4`Ya+N3}|PT1]NXLуAѣ0;1#fST}T,Xc9/Hr@uzʴ,Q\լ_Fʚ$-s`'T6I"F Ce De&7u1IqoR#7?y A0i(ʞ#(TvW{N%ޱLjgP 1~6hmGYbCn:P/Jb5A+O@+[@XhAǿl3a*Y P!O:#%#fh-D_vLf;L]ϲ>ο/.Ok(Fo:%wc),mR UI(F [X+"^~|STF:¾LaRhebɪRcNV w[ ;CUOd:Q؜n xM2Zp!@${qO#c g RK5'aA&ٕZ&̋ j7ݯƧT.o_s4WB4;M;qd3̪OUk_gE~Y:4ʆ\58 sc>aD0d?b]46ICm)/2k泖67ay>NG8Ir]Uˢkۜ6 nn[V@ZdNbϺ7b't ( )]SV?njds =RK:E,9;Y1]7 jpsƿJ ܣ\)TO%5>Jx2 Y)_n ~CE|7A.|ο|&%|Jۺ't<"RH"Ta.ȿZ!K/ ͻˣ+J"j{߷^o|k݆'pDOTqPjOK\EߓD^:gA%a){"2 G𒭯[ӠWt:G}ϏJ)>A%Zе; / 7v)tEBVWu:EH^BPqq䆜qQ*(wxh)⭠9jv }ъ&7Kƕ*WW+o$i{%g"-l1?+ꢇy!E> 2z!LW"ۈ6rߛ1^`w5{_uYpѼĽ5n?KS|eth^k-A]q7(?3!tT2W֬!12̇IB &L?m DFL7,9],eҨo>*)*+g#nrjLKhUJlw}7]!$,DE*?%c<`#H.4 #oh ŠéD{#-Uq +<ʱ/T"qP[:tO"ڠqګ7a/O'goa3@ X(g8́4a]1:4s_J1dx(1O>&M*#+hu(7XJ?|k,fQ2p/5lRY|`*C!9l~9^ՖG{)2Ұ aY-ݮ L&Vs9jt ݌PJp|YW L066Eig`Ϩ5@9M5i,<%" fhI&fᴢEdT#/+\$ ac8}k.^4#:rfQڬ,[F/D<u~JhJ%v._xWczgVraґ?}[F`Y:-YI))_b)=4v!_b,ba!M17ʌ6DV-R3{8S\a,fs[K,t DuxV[ ?aA+<KOnvTrE2 )~Uz[RvףvT򃲜aces6KHxb$@P#N+V=eټPJ&8o4XBQs}PTڱX@GF{-*aה%0)}ppeVW\Wչ4?"8g&BTYe[W]s:-c%bNQe[ewb̝*j23U=Z!s&es m(tezˁ$h1J}?i_w4gGg¸` %_Dc:3ȴ(cnM0}`) IOUP~H)dY\qvt%ޱ൫{/̦'UUuxjfɛYnmQ I'0rK)Hƛ*R~ z/V%isQD̢eVdYX'i_jH [~r/#xz&;(x3:=]ZmtLX sVwebqG_zߑ44T G2gZE0'3]LbXeF^Oe\,ה)2?5TaE O*LkW;&36<dw7S\6޸5%4ɝV %7 yݺLSx4CojU&N  O endstream endobj 117 0 obj << /Length1 1925 /Length2 23106 /Length3 0 /Length 24282 /Filter /FlateDecode >> stream xڴeX[5{` ww  P8Np N|dӧwŘ6;ל (IELF I#+ @^AlefT9[lL,,Hb Vp;r"XXx(R [Û`P9@_@ht|sl,lAo)b`;w 3s?5T-[],@[,@fЀmF s)l Pi4$TRJjLo՜ELM]C ..i24Tپ7c(IWPQQ`e V izSTS_s'';>ffWWW&3gG'&_-`+۫WcmMdS[lA$;mZfw_aopSp#4@ǿr啕6@ ['-- 0 2[  C_.tQۓY{z]ĀΎ>1 5z?gfaMADQFRBMQmloݱerrs+O=qy> '6&b`7ՎH'n'';l+[OM5l-A2fB ` 7cs?3[#=vS#tAޞt'BbX;ۺ U] _VmOM)"m$hٴtVڀhOO;hcaF`/DmqͿ5X2iY)},\_F6N򽍥-wU5uD'ak 65qr@w$Y`x a03قRvNSҟ012xrFfEj,Ml ҩ |>EڔA/k- &*@T lM&tEdy:3魱#1·HW$2֕\XY֦֘n:: ^GG{D~uwkbhOP*!7uPPJЯ'RU,Ldg&lY!c&`-Lo3!)=KR2Mt<[,#=*ߩWhWQQη݆h \94V2ZtS'YZ'}0Ss!$ԵR| LɵѨj_lkdU9*˲u#PJ@U&g{?=iيBWa^*_gڑ9blt жY }")WnbNI (@=iSOoߏwW*ў\9JP6|xǿЏb>OCl gIEY 9M4[5T]y74|r71jTG*[d֑Fa =J-8B m&`T7جy69W_oSEV~oM׍&K#X =}'.i?C(9)oZ%I)k1f2C1 yN]LfB7L7V8 a ;-x߼c#Ϣ#lԚX 6թ3 G{v` N*TFf85O0Pw E 8:p-$A1"{" a!Lm4z~ѥeYFC\bz J%F1'LrT6H2S\n6hU M]76b4GI?cG;뼢UhAwVMjؽ8|զi; ǒ9‘J5=L Osmsf\#4zB ?sBv6&Wh7668]G_gyw3D57켒z-6;8EVoe3ZJ~X\~ Wǽw}I{䱙zzL@Zt:sbwvbO ݪ܏("CPMXb?Z2>X*FOBo΍,Y^%ni]-jT9myy5g)ƹ1WoBOAjA5ڷ(1eҞƙ4 ^I G+vԸ 7\//as>}ebvq˵ 1uGcvkQUz|\DkifYw09a՜gB)~uocAiZ)c`&t\ñߨ(זpG.9ZR (;uH$?E ?WLcg:%.mVR۵}՚X"X;Č4|^&QI1+8ow5sAq[Sf,p)cXFҕ9rՅ8c4KfCT|MCŶ|q ]#S8T 8zw D Z}L|Ӯh@2kU]3;~Zt8cCsS?];IU!m Wm(&h_#g&gO'U.^{'3ϒTlaFM oP_^]t5W-Bm,Jmd+q8Q ,SC~C& JkYܯ+;͑>řv<&2BnZVs.Y ƯԉZ uC/SE }U#MU3mטʕkQs%d%C69 Y:2Vg{R$/BTʒ hnqDVQ!` ʨC')u աaXα(1:#uډm n kI 7&g{fm~_ +ɢU{j' x;& j\CBWYr9w槓(\>)ym0dyhq`*Sw)&_Fj#jK_*y@>\]Ҹ)?;+5*"x5 nG ?u] H﫭-Qwͦ F[396oI :[;ڍwlل!gJfԏcȽ\m`dipfQMiڻV5ڢ]kbb]2DGDW-:Q 9"Q%_B?gڍ\!-Cnj4z!i|d642BO)5Ƨ4!K{Ƭ oS4=NxiThmV ?h3]n7\',k]S0 l&$q;*d m@vT3ݞ#uj7rg$"qs{ dqԠS+T׻^\٣<'rNX盔_,G*iLK# U@ nxZ =+:T=H e-kFZhf8!_(ul]"RRʹP FlzF&ޟ}{iۀIFwư6Ӗ޳T)ht[3jݔ>LZE]5QDOlHc}ɛ %zL!dÔ%^VìL& x" ޞ2\-6[W9CEdXKi{Wçо qS;HxY]û)' i)NOᓻ!3)d,Ӽ%uz 51^"ez1w& OX}ukqD_Bk Q}j8{3L7>1 _Y<9VUM{$^zkz?hIE3B|&Cl v&MlB/eF&o'n>,Vhʲ"y8DcUR5A6KO|up k% txmK:vِW  ?u N**^ h֙+ϖ@v% T㫄!1V6bS(Q5OKRA,9lpl6[+Pe0˯XX"5/+_  R5%L8Btǽghm:?w_rga+!s6c/g<'= Jh^i~p;$mTM|ջI8-Q= 9FIX}͏T]<[lIZBn_a '!YdE]>M5n|*춽!FvoP PQ3j̢Y\[EdC:׬mEp!$lemI9pmJ}z]gWʴ$=p&sibPf^w] )Z{E*Ǖc̒I0nIKnJHk?lX?䬝_-qJ*k$RnF#e3p 5r*JELfP9B2ILc?s$瑵 rVg6:'9;emFY?^l? 0>P=6&(i&B<yg)}/LPJ7OMR.,+Tw}Da@֑ë=[ a,)(C[!6"JAcN-O302՚'w&F*,l"3 .ZfAUKeN2W4DShevXz*?o/+Vorҁ%csS;C% '%Z*dHz#|l1|jg:5McxO!/)tWC<OixI6P8un6uP6#+ϔݰ܍}ye*&(铫Bhjo$Oǜ89 ?Z]*AժӫI{ 0YL'KZƝic*߷[ CSys Lk-h'5yp"^ǫY:1d5k=F^KOCpD(@T\`fn,.Xj ! 4&T_^nZT $O)AO-;FR h;&|w jV?8ߩ# X>`=ILS.aq K' ]c vߚ)UmKAxtB)nT,NF[ص q"@M|j*`(6 GZ0G޶L+;S4\ܝEyvr톔RWkq"S<;I`.I^l-YCr,pumȴǤb˩gۡLdۅ~W&ثa9}kn եue;#~xJLٺpۅUd3\HEbj ӔzNC]_Es\8<#dD'mL)kN:>q380%~ @Lr-YYS,iѦx:Bwlܚp*3PȤ#ӢIigNx rvJu2krOSⲤata?%j Z2{cd!Zl!_9Kg}Q<4hYN땢16fHĕ(\ED$y-|~ TL "YQ? :cÎMxz7EN* tg;F-5ߣ78Q@a M bl[3d3_yGmLaf84H1d&Kࢃ{$%]DN'Bi5(3|[$A_gu$fyUR0?_$R^$jȱq0>/`VgB`gS@0h Kԛ^21a 30$B!7^4$&ԙ*>yX%´ⲋ1]SAdT@NW + 7N3|\t'.<=BPá)2- ǍR!a7ӘKXz[ pNMaȤ%Ee(~ ܱOK^$gy"6ev*uAb.`5\mOGmj6яNV)=1'9_5^I^OQdhSIC2pMScKi&yTh0";E$s/ ցs#8ߍWbS6WtKόqwᡅJB wW*);UyU;;2 $TMtӑC5AZ97%L5W+:r'Mi@вT"/Ӫ8[aAl}uqi(tsgwiVE 5P%U_G n!}NYG(9(s Y o9WED͋dw>OGjR=8}_%nqV\`,f!M$a+XYfmeLBTLL5ZJ@_`';g쏌U̵LeғxĴ?A$\"T4P|*Rʅe~GQIE:1AwDwHDߊ~wE'rL=]S=jс;vM}D~H߼`P=1|tgK.{QT$/f ^Lʈ]6z'ȀPGXAf5ve p mVj'ǒEF$319G3kOhC&]%IrHIJ:`yEUϱ}V(da x?FLKb Yy;r q'b 6'8E|IB! XIo ^xq9Ba.~p<B--o(J:„&Ŵ$؎ftZMpNP1A5νNG%srsf{'=Nn8_᥿Y'E^sGW77гptxqaAJ]!rr|NSHB> k}"v]ΗrhWf#lqiSv'D]iTq o4 ;JLOﶯt XO3dlV-+CbA Z@_k#ThW'l9rr&_юfoz~'ek³* GV\SVh7o #Tx֏f$5tS,w9C|usEe X\Vm_JERc6ԙ5$S\E,ܕS4/ +g}ҪXKS$5Ċ"Ucr hՐTDU#x;X @%D|Km!&ue3/%Shz7\%!%v6b,tc:$A/&v \!A)/*NaKTe7d>;Q{貌Dggu`K`U3:~Mo9@uuk #W*2Pl5L"j n;n9cZٷi`} BN̷5̿T.mPg.ޱjztܨ ǤHb HXsuUUHqK3IL"儽E8ƚU. WT?f6e+̅FӢ^`)Qst&[; A^^?xZBi/(i.XYӜmeǶ-R-$// O\)DU $rDrQEiC$#8]yn`Mk`:jEhz,1C@[Our &X"vx83Ŕϒ;1 mVҒN/iEu-sHfl2).C-%%"eYW%\>2M`hgU:d|N h}ǧrҠع\+#ĐW[R|#ڟ$I6`IA_wyj 5켁R$uBd |:\|Q'XP{lʚ?2H6 EIS^-9&qri4ikIpMKqLovJdն궁JI>Nk_UA/]ؗ>wXbWp}+^ꊇR@ubhMtl4x)P4A+&$7>u(ȶUED$-fZQXdvm? ٤G 7"U+~ Q˵R^+t6AQPN,w 86 ]nɢ +l!UV~¨EBc(ҒrYlmSV#VVNd]ㆲԸ-T>=iLż2z^X a:HYI[thoWZnĿ]^QJk ^;QI2 "Q1%($l`mN9-y-_^߯W)O|{<oQƶLe(7l] sr*V3S^Řþqj`2Um Ay#.'z3UÍ#)+PȒ񒋰98츧cc3(*P͗2ҦuKlE _a)g,(O`Xn"Delu AyWŌ\κ<ㅩQawɽD)&g//;(5E11Hc~A;w v!i]sRB\0Q8!R],>7}x;d,걞 )_fT<O*)R1 Uc\VFŜn* !N:X39e}c)o 68 |=i*HrRu1}P3MLkc-;cQX)0  =tTnC$&GͰOK>ƎUL ⚟z:4N63YhvMq^|t~*}Pf \@I's@8^fS؇ '੖(<{2E5A cYo=×"EtJ=TYi 2Y4MuƇS fP1@.Qۡ)gw ꬧y3,kM *2#k Zi͢Pk۫t[5s`KFdlfMhf(PGΒ0C9sK:}l$y p@*L5 }!u)-R'!L\(.G 醜+q8ʬAmAksH1G/2c\SC(Y?6^ EC ŧ%+rL}0hU<>^.SG0sKsg5cj<)` Fv-m sOQ\V&$D+ $O.(xt:{?򰿄Q !vwK솸߃!w)]Vc&R&"rH^ AjDdڐ;K/V+X.v\Ag_O`X@;]9m#(]Sp1}ōaz{;,N(vA @њ$Ά 1CP(+/{M|˃ @5[\nuE_kTUxB,c )jl&ch́#s`cbjI&4z',2tиKNu|+FRF8 G8mHZKJќ`0Za(dRt {ė-7[9v 7 Ej-a ,Zy Ƣ3%,ю>GSXhe7qL =wYw(ҭv— A. 6<'] zg#.NշоtH<SZ?ۭ)sud-DN=d39X 2Nr ò'Yf{gwwx4U󋗿пjJY!r.c_]1Qb0~$ݪ)ְ-y\Ǖ]VMgE% %);-C`n=(T`Ù<u/iVPf" % -9VW*&d b97m8o2`RJBs[2~aDSdn>3ᶸ}!U&o1}9HiMݸrڙ^WiD<}(Xo I !|(ԧ-Kg.#\pX#yYG֕'UbXX6mBG'X;X ?S~W8cXV/ ˚tYD /S6j`,Ja_x0mc[% jζٓlOkmۮ&۶m=ߟ߰2X섛qn`ju ?7sA5I֓yAPb~ Z avmi~lBv4(8IqCcqs ?B!m@;ޮy;NfBk'"WL<~?DSql w3cp 1ԙ;oip)JeD廋ybF/[ Z)/%Qv- : ] GGlR*Xs:kA0EF\ɺjÐZN*\z=kCB~ 8K s/aG"W kYChJSA"L8}V2lvjtkw/6aVt N),-f$!<,_,zwS(y綞gy&Wqo9wIx4%/.qm1YF@V !8y~ٯ]PO8jO֛e(P厗vNmXsl6JC[+,PlG65$ݤ0q (" &%T! /J.4T46W[NP]X4ӷlp#vp{AN(0}<;} s9Z-%O\wL"{f= {}?B:ƧIƙ#7\׽'B ձm`37Z*ةOgB7jc? _"{G..•e"B:0g|)1Od@1+0Jdr#D\vljFyT.lw6%fsxlzrFryu-;& !ɉM:984V:,Gk%ژ (IC1&E7E"PPG}{SvxxA*Ji+tEDf("噿BhM4Reb a,S1+ :[HFd\X^&]DgD3"=%#Ldd4O^S7R>RS$|l#vK1c+aUB+eI*o @~ײ^I\xb?ZlI ?#^fX$T bo!SC $UAŭ`QuHy4nqٙ)u#|xo)cP5\LJ^Q8bxHPVrk@&hߧlzTsCE#ꖦ'VZ?!gk _&)\HwՅo7j.$%-8ϟmP\9(_uv:ҒawaaWC3αCI&AF` c3I-#gb(gB4]z'B;|gem׿ Lݞ,*fkit*4Mt7ifd7^!PE@S 2~[/KA!4>\ZU ewV_@߬1ҷbA|I̻We yE%8ٹi;-_;UpY[*P|%2x,.||5$Au$8Ga2g5a;|F s7&Mk: vu}o拏DȓzC"s5WTcF;< B]RܯHBf jLwp{j4˧6fGoֱHoʹ9[:>aKIф65fۓ)KA>qocmtckZ1:єd ӏ)q'T;hY  9?\F[OB8c)UuvQ"rai&|`>< 4p`;YpI  l^I0*];F%g?Y|#zl'S*t2+3o[A5\ewL)3yuVϏMrTEmcfyvQ幒z,y|,NKm:J@W&a}*Nۣa?5iBHR8 O M"^ K}6FKc*X~G*BW}~8y9 Jí8 ػ2Cqb'V;Ҟvss(.Q /K:']Rkbxu0TmmS?l 0%nﵙyd=/KJmBtLO^]\ /Sv%Wӝc~ZO=|5~:x+&c:4eF.ch(kK9(Tr^$D`$sbp|'[44hRC : k/z۰V[F;:R| \؁ nV5[lmYN){Xkڼ%y:}Of ^ګ!0CԊ?Y4"a7 HLC|B{Gktwv]Q3f]2TσZ -һ{PDؾ>@QrR (gn +^I_ҙA+C ݥdOi{ 7;31Dtnbf*玮չ „vjM JJP&VQQW;__+"y׆),0 + ~-t֘u W| S}na\-T#~#eD>8~n**õGZTDm͂=̧LC Z^JvCUpu1BR@Q(\X?rDb3M̐/XFrH.t(q@|lH=$_;lJTX]1hN XhwS1b ^MˮrdW][#v_h{o*,Z3Z"ڔCdymouxSRm%L[OmL9"OS>7b8aShCz-nqͧsR煰=Q"Cc@ާ x!}a\WTO?Sn`/K-9[M>2􀯷9.c5nnuwnhр]aY$lU3v>*9#<+i`CP'ۻڈZs_vjY_| :cھRgkN ek R9Nm?lcc!m72ቌ#e"qR M)~P+=GMEXc}q\y q 9[/=8S3󞖗U*? ׼`*ouG} ;ͺw~\륿ND>J,*[1F9:ZBavq#22(4ŵ?zȖ#Mk:DJ?Y;Wgg yYjCiWsb`;r@|۲!..ᪧZHvB\Eafv9t"$ X^:Ć"$$]8h;AnªjP 0Uf5';\\^lQ>lsV\*mx2g¹1}R6'p/E5\\qUz{]]z%,dͭ~D7@)>vCzZ#n~q(/r Мy˔^v%4RwQtRȠzܼ֫_ʖa3@`U7ޤZKĤfIQ1@W6+H 4t^2(?{A8zovsQ7[YܟICbT4 p96r3@д:&.S%OkJ_yJ ,Qטtm#g$ujZ7+ x^U*:+j_G`hqJb5'D>}#hYNW}bqnyluέPsvcٸ_uX$C~hk&;7䏓+\05=^#oq3BV{)g^;VOkJ*ak0?WOZuB~|/yS0=fR偐fo`WEZ OcFƺU){mVT'fiZ~#D>ZB7|JZ8ﳳۛǶIUm>~0 o!O!rr~M : h*(\ѻe"`z(ދ_ꍙXfvCl8,1!_g9YΦdQ݂`^Qظnfȶە}+D ~>T6LX0ЧUCS[5lbm#Lpҝ߹S2C_\@ƢdP (}BV -3P(h`t0')Thm%|AdK4E%?G}.%,ؕ< (`pdv^%T^p` F;y>oD<זFW1xwļ)]:91 _~4a-ҝڙ@IiG=P+; ܡ%EvӮƌrx_\v5d)O;0ONs?[ӕMڞ!x8C};'4COg|]ĵy +\fӰE,f1u*E\~( )L7Aw?:[ ,L[:o}BQfÊ<\p)6Q*z>/\TvӇh1+W,/5+gab ,63 98@ NRG9*B 0"(kGN{/ td˱Af7*4:4Vq&hϐ3At6U\Pi  k3D,c>c\(V;1hrrc5i֣on[{~HZf ۠-wPG0[mP d>Tqqx*or~ endstream endobj 119 0 obj << /Length1 2887 /Length2 30063 /Length3 0 /Length 31676 /Filter /FlateDecode >> stream xڴeT]M5=4  @pw{۝t`aZ2k֪]TYA( WPptpdafPZۙX()\&n֎&n@^@  `fAH.As7@fdP]LM\A@Kk (Dw6ߙ~G2dMl=]m&YFF'h vtL,u6@CMBU FJ\5"&=@JCMOu%=@Q4w 9X@We5P?VnnNLLn.NvSvx:@.@;?¸;t+E[\$5hH9p?{k7` 4/@ rOSuLW/m{f֮nXXwfDe$%ARǁDA `ee0T\| ]upt7wwbpvvʈ7Ȅf t0rto3o3H_'G'+@u5\܁7B`[Y.`ClT.5wt-@ A>Zvv&@L@1g+?'ݽjn.@-ksн/c}, ;߿W?_Ѣ^ @qފj[?.p7}^@3G30%UД<8ڲIPӝxⅿȀBmA9TҼiڔav?S?O]o(Hh2j(,UuT|IB?yc~N_eڳlk pi +!֤Odvθ8g\k.]FaofŧQleeĕz1%vK5FLUR~4߫ ېdsh˦?9΁n@]ړfȞ=ڧRГa]4VhȍkEP,_YxOҍoU D: \k S2V n&nN ~rz}&ʘwGi z[X /pgYI*C>+&KqK@=8 "մ ۘQ$\NϰjDt>^4*"C˜9RaW 0t[:IGNuXmi41;OZ)/ڣؗg޴ vRSZ*3d+_@~^{Q-Ϭ8bje8tߢI[ES|MO BjB'ڸ7~Ru}o0̮z) mF& Y "gUD"[d/]|&z d83",l>rZ \يzF[GAZcZ֎\tX/̗ B߼h/y͈^T ?M9͏ |7cCf]n爵 ۚ.: hXٳ6P`QPv2@QG[A;52HiFv.l#={&ف(_E_ ">!>f.OB9C7q^KU cdַtyB) T\X i#9!kLGlU=Ўf%SnYqmE⛶84vk{fS]O/ ō}JASĝT$`IU+u$dfF_\]M\¬6xYm ,qbh "X;[O@'su^]09>$nvN J/;9\MDpe(*HWѹ!]``vSQeQ]ꬪ[.[#}lpxBYjspTjo0k3oHiǖe0__~@&j9X`/1 g᧑֒:ގY?j}BVg̯G*3_^ &Qڤ8-FYlmM}Nuyv;L Sn~;xZtJۦT4gg Rhe|bU\SسR q!;7۽d‚?s CٻNMReR {G`.En/-Μ!lECZ]zK5[Wz&ckѱJu?p{+>3J/kl Cj0i79EeEkAq 7PYnq7.uS^[Y<ģYrµt-sn[aKc8\쟠V\u Yt! '~j{#I?` sMI/uI7>!_2=ͅƢƄ>":hz>)I +?NTl!@(9*9ـYiyR$6: }\g/ߙU'oqślEsTɆrK*< P,sSY]\ݻqc NvѲsɑ%ãMp.Ns_ v<ǣ.3~˫~~աim< d-PG:)u7~S ׽׏s ꎗH)6Z椒obki QI@;|FVz|w\G_ 2;zՍ\e@6.p7?J]"*Y*EPǨ V"p,)Cef{$ EF}nlnv_T_SxtU9zʁ G f*DdBgb!Qeφ$xr)VXaJ"(x_o&7- ?ALL.{b~n*kܾ7\uN͡_OT ! 2'r2oAW3qg;C,S,1/rx-?Ey i| 牴W7`յ_75]oQG= XbKV>O%S?6<3uWv;[-NjԶ f-04<33$!A SsM{S~T6DC hU:Wl! EM |SAajD\t:ř,Ѩʒ6&8:l""~iݕvLg\f ⳍS~18siR8щfCOƿV^XcDL{BJ 0] p^-Y?(<"^?E&e,u ^ٻLX~lLqķot?)BY~})"ar>tDS5,8o6ДǛTah @f_gu,Ή,bf IS UUinCv (g8A@UD׿Sgؐlxiٚr}SLym&7qHk%Ux!X4 1B*ϣI3sҭN4W=?㢳o쪳 =#T(N~s,y^&ƭ* 2C!"%Dx N|&%^w;|_ Exե2g.h/}F%qyAH|oj-ܩƫ!'G?ʄ3(AclCC s6&CϛN#o =Wj)əu`.d$BcP},B&Z OL|sNn&nyX1g">^ ָ W||ŒA*WC|NN IJ3s&i)V s-#CgwѶ!zu(Tdz?S G6p%e$1 '8B%f*9[|fwm@WxS/BMrY1i"{R mLf \`[ɣW+,! ծff)}AA+<_S0~e~wO(g1zӀvxsɉv] M2.ugvH:C'd [|>e)t[>m~ 2Ǚ& ( x}h*s~G԰wno99Wl^:5%&%neb.&UoB'4 8+@atrNaWJ*)ThQ0,MlEMfB:/sIکA1R S&75AzB)I&uPNVdy ++\X$Q< ~9s BTU@q=ay^o45o5a$=hxrqw۰'7{e$*ikO IN޽K9v`2ϵd, OwUZW R#J9zuKfc.q :|VU@ ʃBb6'^:&T&n=2Ibޱ|cVo뇖u/ :ab>rttI{UcOD=7m,#[JTu s 6DN Cw wSO)Ua1%4,N}I.B'9CstT6Be`놐s;4jJаc 滂]3;JFO]zA] nTsk2Ƥ7Vghs [rva5m쌖|w*, .2D]Qe¾lV}􀂫m,Sk7SW6)cS., 4ł 6Xdgtfc$K$buYؙJkGObFAf8 mdT,l 9P: o,چ%؏0\e(GvVDZ)"*̼lH=S)\F9scpi5{B,"zrq wJ5&Y649EXF%m cfhFQ8~Z&(c*awY-x۪2 d9^rL~9Rh_+&k2 QK1tɉ>!ܿDf]= )yk]0wl.NlqjX #ˇIatVFؒ/"srL=>U Űa3?Dxe\i%X ob5ðr׳t-nY52fP^H'}zl߳ٮ ))D_&F72 LzN&h O_ 쪨On-8ﰘیeR5+/d'bڔSsu*b'\Ԃ8-߯__DG,(V 7e:Ȧv=(9dmcZta-32pIWmIN6<ժ~m=FԫM%zԺ^'8 2OT8\όwXQ-{IR/WN] xÔSȢwmx%!9C~\3gnމEQ}sؙO>Rm\Y; Qj2Ql%6ʽxZ`ZY+O`fvJK_d<)4tyOKRu "ɹ{xiUOjr戰և5ۄ6ΓLf9kiDC; "S`~ja%T3])8T;E%z~-V'thȉR=uY)dps`%74fď֑P\0)iMz,?[~Q7u@U ⼈rj"Z%'L {`/lRǃ!dzOR@(4l!Qϝ"OcG`yL Vd&pF|x9F.Vק:4R;$Ч4`DθNp^t_zjɢw*:F >bmfdͥ;]m @Pw0gp F|'rPHJXD8Oz*B'(Ntm"ts م.QVjp L=G℆$<&hG/C[XK"ԊC#( ulɏ0͸^?ٟ`n ( Q{wF褁%o^g"e¤}U}=hg/);ñǨN w7Gs%Q#-G<+?w?ì`dcRQBC/!)O',`Z [Ǒl^άsй<(0j-nrxʵP0=,re<ʿFC˾,_܂G 'ܿD/$czj f1y 5"]BdoHf/a+ Ic[62U=6.{E?d#LgW.!bϙwxS"FSo>Av"]J]dOympe)>Mq5ŝCܝ-,mU]ižx;R>ukJej)"py&}78Xlfekߖy)Vb&p[UdO w݇L1USC1j!jq8B]U45K ӅJr(8!穌G](/︬|]HCfB<^CÜvDBBcbC0}eX.6a'> "L1\vR3XUz찐PrD$Kv F }? t}+BkMJ֚6T][lW2)XzQt)dం/ |ᧅ6+Dq͹Hiߚ8(r(lxktWHol]Ѡ>'itʼqKk/=A\2;օd3C.SC&%̥ XiMڑnY"s|t XZ"H!{Vu ;7dDi'uoPjh1IP'55 kˠz&žPe}\_k:T?hqo}5\}6W;%Ϧ]w[;ĝ^ǼZeF\h$%7|IV6?who>ŭ08goҫu+HPް$@+A2[ϋ^]BڗbECj.nЏaWm` GySp*G7Ε4ÒRmRs?ʂ#uoV4n$>3"4WzͶ!gc'vzqTK%k\ZG}%, ԁC# DI 5kԚ\k!| &3`kQ>"1܇ި 0LӲ FP5dX<&0J(3s +6龜Co<4cGI+GWz`*4X8xݪTL]7"(v!MyT8m2rE +ɭe@d}  r'G} 4eYG9H'u-X]fLjc]Iot@m6+Lg(yJKG5dBF (,w"#{&xFf&f~m+ˡЮd]N6%rʭ|h޹3C߄jYUAyCkif#ɷGMνF,i=5mڗF-!K}eg'a8qWFj+^ ɊM#Z3rP~:7 J>ic`[3Z0 E벃UyZC/W$2q/1G*" )҂Z'?70t|uVƩTG޳'vT/CXu2vW١ښW) ͏u 8pچrDf"Fzl %0`gh=qN隷f~/!q) q6%[y1}Bv-jKrzѨ91ToqrEl{pAgeƤJsغInDGCV,މE#!iR%n0(ѝk0*솺;^F9♷(hCBs?xT:ITM  `v>\ O)2B҉W޷? * dV6e y&9]Ek>lK"6GƆE?ٙÒ;}kl0&,SP_{ךx`E{ȖFܩ|{'O-.Ȕ6)p&jWsgF`>^UIkc.TSKOjlƹkǥ[RֺǘЗ̄ӆqDg~X '9D9=|/KI-Eޜ0uXq&xږEk;ld()r6ɪi EXkgJHmj`wV\|@s3JJ97JD W+[w$|m$'gXM^E>HS,̬, WsP7|AĒl 'T#A^'[euOɹW9OM4 Xh-jmrD/A7 t^s~D:Gsp hŊBxpO!앛iI9џ8fyd[P2<=DjySkWe;JFZk,[ YUXHސ2yc<|iq07 YyV1qf Pgk Έ=h5rsU.6Ƚ 8aYqly=wnzKNڠ4j1"q{hXӷ61r % b*~緂YGγ~9S*Vpfb|?0}K$IOu $j%΅c-v+3sUس{( @ #􍋃_uJy%[t~}S٩.dWς`,@T0GSPK{%U'BzPϞ dH &czYEO`ӥ|Pc_ yk]e*4{Wγ W }Z {O8TJG{2^fCpŠ+"D7pG\Wn7mRxHI?y@(9|='ǛΈU'a ^B$#1u-bQ`UO*NkD-mSc`FПE֡`^P`n*-jVᤠ>F{a _aR ک6io7Ɖr@.XE^UhFR][pdL+qyfau{>ّqV/iO8:Bm|u&V?L3,ZvzufHû:f\] zvJ3A; ^IzK+B"< -<ڰ/Jֹ橒~bMV )R9=wל⊯U?%̓94N&ܱr(+?I+G9Q,'nO?9q<}^ !ojX6?δ tIsSenwz)qcW{} [Jʝ/3lALK5#"6֣Tp#mق>\? vߙ]uvKwDo Wn-z׃̆۠?wGo wد.ȝ 6T}}zZTT]0Lo2+#4L.?8lA?Fٜm5ecl-J&J-g2S(O8Q]vHzjhI6Gqfs:N%KwoYZ׭ޒy P 00%ˀWGĭ[NAFGA8KՏ[ԍik퟈Ep8#?=Se=m>Éa"|g.ݼRoAauIUV3>.yD  qqYNgw˂ qCo2Rq̶"a:Hvxk@PuШ5,9肌JBY] 3;]nbH{U4n&&e|"3뤼v)B/nxՎ-WɐVp|5:8uE駭<煮 ٚ<1c6ü0 tjͺ)'ʫ֍ 0*m-jN4!wb6`"9igڽ9?LRШbb͈ѧ`+RD'rH~ox4i涇}7Բ;{(+!9o Yz96JDVF#7dnuR4ˬilJJ-T ܍ۖ!:_],ަ$%`ḛ:IK[`^d=˒__u;S;qɤYC*،=+?RI:ɰ9K֐LQ;Sl4:ᦴwt\d wgaU 9fV& ZD,ȋJ;.1. 6x"OB1+4Ke3#Fr$h;ʳ*LNo΂tXcC;yTgnD8a_z2NaNߪ%w` p؋T.ę l3=1xihh3CZu&SöLC{<] Ra~ppEoy]@6.kʛ дݰK7;nAg(κA@ cԒ`xUTg]R}(4~\qEĪ-kyжgO:LJa.м+l2/KMo~Բh>#%Jql+h 0MRjZ<(kB| (# zF(K',N;"ՏChb0s.#Hbf!஠F_8&RipZDQ5Po5.*n`Z\C{A 23&zee;9EmЕBhHYL}"Qh3)RuΌc% 1X PTg} k2Ckz(Ե~=T<ސ:4⳴vB Y-P `=ýn'b㔑#MPGґI3E@v([:bv4^G%_Ӗҿxb\I}~QYwMNbӼjR?1oHPjnSDdzq<] U!9>r紗/۷:>dq$~5CR5rުw1vU8 UEzSRlD=pWfcAem_% m۶m/۶m۶m۶m,zׇEQG:"Y1޾;@-$bzh b.~ܽEઌ!𚒧0S83^-5Dnl #QMI4]Q7y9S4@}˽D1ܒ'~ìN{_c\cG)>߃h~C4xR;~(F ˽MZ'Ф׿v3l'mvBfZp-U`" bP_3AƓ,U \f{_H &^oKcc^JUJ\ƃh7fOՆI^?you%ƚZ)=t7Ęy,^ۍ}׾h{h 7ų_"Y%/5fH)Kj0T68+؆M*`qrjCGGݾ%qn5½;y(E%Ab,$RB6\p w% $D8lcVh!8"۳%n\c\>gTB,p)1]Gsxq{ SBTeWGWRՇ\Qipo.:@<_WI0 vA H{{cpK y\[>ZRrVGNThIP"Y-Mnp?M|m׼EVx}mG^#I{yLFrF.So蠺?Ly^-2WG;8nY+h*GC>r P]C|1}BCI!hHl*O٢Qն+_u N .FJv+ȯ?DϤ?՗% 9ڥ@fXAl5bLL|]%x@IŠF~Z'W ^~>bO-0 9f`hz1Fwa|%EYj5Tqem!z)$*nOD!9<ېdD\5fP*T,mXVOّ_b|z!}}>3 o^A#@<'a22PKCi*S ` k P8i Qu<^ޚ~x%Iꋔǖ|4Kycuḅ7D]<4ˈgѷejBP?p0BzU@wcG-鎖1mUtnDcj8+\ Qy`CZknn҉wxpl62`{;k `7;5LMgؙnN?`\3پYHs43M\QQĹ&Kҋ 슩W`eRk1udۖ5SdtE.{,T#s`-jLqV{tw괜w#SX}}fwBLZb {]񨳘 ݰjKA9cKkL@ɂQ .AS]7%҃e/` ]~*]yipo4b,~_*K@y!^%#șu\R =ZFԬ4jc-,,B]3^S:s> 6i0ט:Oƅ`Ԛ`=}et-7H!gWؙxkjd1dh7G9 įzqm1*"w L>áPt"'ٖ1b+6;%mta?WY%,Ƞ[00/`M(Sڽ//!vxj􂜳7;+,FtN6W?9X1MJlL6>CιCt=!H!B]j>Hh%R$b%Sox2LXf"Cj=MEQ X= R|l?N`蛘:Fef7j)0YW|ZEU3BoeX:;B Ԧƺ+h>V~򛁟X`PÇh(v{|աӷAEjiw- ##߹1@Frt~Y<D;aoc{Gj.K 쟚'bpg20lo`#SS9P\SMRope)d~^v]Y߰goҵE, |aӨ)CT5_LVZmK0:N\VK̙w'SQaYC~rh- 8Wṱ}SϠfNP 5r썠 > SPL@kSLTR:&Jzϵɦ\&/kuj>ߌʟrWj OvL}z ~,[0 ]N4s _ݶjHLÀ3i|#j 9LRRUXߪ&OK@@n[WXxn6潲fOSY٠Sm:r©k9%AM~BUMyj(vж]vk RWr\q1+Ǩ'7s2YȜt㊎|;~"!RqЅPD;N,4wyf;twΗ"SL~^gېExlī k@4OUt?h_^2mٯ.DlOUyhTL\,:]x^E"X)*}B6=%p$nn_Qk {:L(R (&uo0\.bNiD"`lTGG <!do͂;q}29l K]=:^{OnfWe(MpCKLdp:4zp),XsrԧW42%gZ3eKVI >Oƅub(-?h}٭yJ`Ypy}DwKfȆ:ms9+??M ) ~b1 \V,+DmaM"?X$n tRWQ*".}T6M+]C%ao8 pDdՌyg+'-TUa+ ^c2_hW{uTr+?,C|j>塤(puȳY|5mWC+h0ƺvA0KM~f1!bs.s[?ig. H^$ܝ*$޲& s%xQQE2l=?KSr/> -UPFlu'og[T)bt-sHUnjBzZW֭NJn$ ֶWSَd=1,eKYp̤ /?$qlkOFoYJS 3TL&o#`y)SĨD‚eO8wP#Yʒ Kx y,۸^g[cLʡr:7{FH3M{'Zm LF:LrTΆ2Z1Mv Uv5sﰊ0ljoax@4=XKn*Y5{r2+d_0D?+$@v/Q@}'xR{d upOy C.+_n{f9&YlzK4G ?s˨bs\42\W"0pfb=*bv+y+~,awx=Ǣ{x*WHD9/i-8z|a< e(ӎQJ&*b(L£˰*n!ܓ)|nW2 ?hhvcMd琔4(kBjuGIZ1~] TgvCwm n}=/z!9ztyǬ{,x$yAXE$"7k_~fF%1\n7Ԏ{~jfJr P"3äN 3oУR@C0V(q wnwogfNSz%vNUz/e$gTҡ9;En{ D]iW8IfƋEF%cEIQh9[1w/% 環:~=4ٱwMP!2NFL|!9ӜR/&Wp g[QeKv3\GbyeP66?VK-Uc FBPXt.8.ΌB:G:R ^$JwOB/_EQB;ޝH&Zʋ(2ţ\'qk4hzP-@\+ܷ bR;N.8:t|gu@t@ޅp>_Vc!Vy$&Oy@ uwZ7;cnkP P&$Gs+|@qHA$FFr?ؤF duCEo"J@^9A\|&>cḂY-@0@dEߋǹɋ@@3ZAT8}`r'r)o2@A$ݩ=o0o߀5u?3$8G6$*n5dFL2Qpg0T97})6l%[cNؤrH:t˹b`>lϼ v[?1 D?SSC}k#'egqy!A-7_E[xTP /lY+,Wj,j,p>6W~A/߂\=q/oIŴq( SbCe6 N}j&a^uSS^Vp}gE韟-hL5Ũ"~#? @7,Df,կڡ $8 az-.}Ԑc۳ޣ 5Y Sd`TCٚ2cVO!T,:6 x(RX^\'3jr H 6ILVe2-"ZeڬP)t/pw1S@dp0??@ЎP%O!}.Js^%J?z*mc˨ M4GA6DFHPqoJz*}Ͷ>#.58͗MPK!=T4/C-Xv6Zʇ\Ro&i y~Xb$fP֨PM,GB\yնWARFue^ Eҭ.Ō0P0őaHBd҇$EӡYaݎ¿9>,Z!5@i8 _}[>=26i )Ke]*DRsW\xЛ$r[p<S{B"_z-- ;5ť1'-̗L4 m=9PF!m]|v!ˍQ4kCY⼹2TXQqn(IB7Q6.QjoQDHӅ#)3h wI ?S %] VtSu|<,Qtwlgꢗqx~P5Ni_J5ߥ PY#jsը]Hd;qi­v]7»%lJpis6LM.F!n0:C/?]hחn/ȴ#8esNF0I/Y[<#;A$;T%)ZiUh[.0W1uŞ d>{+`9^w%t*,OWs96=>k:9pDVPVg+m^=$S8K dqE(̪Y ІmJP!M*NTWFG<7Q$wyRxYIPnuY5pVKcQg!# N4tC4߱P_RT^ ,&Όa%w{0q+gi -xՒ-+ieO/#9"cI薔ﯶ؛3M]KZᛛ L|MT^ !d\<) 33z[.W?\V2]%V:qq-M#c?d\N$bώHos\6 ^d(v[\ك0aY?{A!!5L3'$~{>D :EB#E]v?dr-AkCεoj0w e⚓"kR&[ -HQ9UzV ]5[1U,= $T*\F0Qcg~7*>G@ 2:QKw֞(,^ 7FQ9_9ж׾VM_l=*{KD"&]#,wVWg~ jniQaW(ODy'Tqx8..9x qKeJk@H(ml-}b =sbB 6ز&ɒ5KTul~+xO"Q._SAa;V:ʚ8!SjG6E QPN|yd lY~_fe'BvXk3S09߂Eu>EYm@i`DvTq0Iͼ!ߣwfdPzUR.Rks$eAKYL d{%NG:?7:w^XhH/Ho|1,ծ<=kWdސKWYAwt!]JzS6v~>I%;x<[ˆZ&MEgGo?Ļ_չqepZ,Tj/ ׆h]4xzC^5Z5&#X͐U5Es*r*j|K+?g(l[eIYcNye^J+}OZ0 J%WXXy&B"V!-F+.*U31[J̱ВM>jXs@.܉0Um]HήMrR#k_Nu´o/mM[_9WCL _7˻d 'oaX#x^qqHТ{>zc˫L i-//"Q'´?ʠkw8f5Si #G=zCG Zw%5bH4g%\ :%Ax 1>ZaꘙNEHѵlYL VƧv`mys(k(oHws3n/fлk|#[ѧfxPMYh`~4IgfqbX&BuHK`)mTLeB2({Lf ETRf7.Gg3ȳ0<"t"CxSGLq 8boz 6/"\h.~ \G,ŗOQ p ]_7mu:`͓z+uA=V f|Ң5F7,l"Alm Yd"8 )J?\@@jS9"~oV-oVz k^l޲o5\&ex#u{\c]B@"JwD|eG[FŵH2@F*9ĵUZRu1Z i-@r Ec?Am5h+9㚸>.I;=bQ(! 1a~y{6q2F%Pt) OJ9xǟDFKK?訠+u#Pvh/)͔4]Dti6VWU26@Αgy~q,41'@nb-a`>Z^!N;9hޏN|lj(/7$i QBM96 CW䵥z!Bz6OSW-H% 8(85Kq$fqSKrh?\K w1V=Q:HM',t~ d{ &ڜ[Eyg@#>`h`xx%G-;Sm@հjjZ6TBN%M+mAVzӀ9dİ [oGS#g)z{$aW?@LiN!+1[ M՛-#.0+ Hp#^ yl` {Bq3ORATȔxgi4yr>KJ*^G xsS_\;BMZ_`.U>k7 pS:c =(ZO'ڈR{rI t_NOfW`J@^׊tgfP+(loN2 4.X7v]dB!7 .02gY2zJ81ʄs5VGX)ғH T9[Kꉹ7*]PXpwG4&:ߎ"f1D1 koZ2LlBDqGӾ O7sp:m%1qty3Px] f0<@[H>cn ,䳱( HݸFu#W}NdzbAG!yۈ'D[vԹHOzMj)"ݣX%S AՈK1h}2Ⱦ4u[201'`{7%Z"X f"eS$M:AY"ofTKL`Wvc\BR.0B}N o!QRS,:O37]%1{ O3uo5bpLkԘqCxכۙuG{Si)a+ p J! XEmWOэT!b[ qѻ9#ٶȖ1`}.R.WVmgNP;sy֘4rhbhMZ97N^hqMNy]2r2ƪ@2l4 g 1s-:6F7= q\+ݻ/WѴ  ea8)(Ux;Mz [y"rEwlêӵC|0E/߰}5Ⱥbܪhh0$vY?}Jo 5lc dzXOYoAƫ>QmSƇ""xa[ۜEi2,;{97?u_(|"4>4*3|T2yȶn{%h᯳zb Ȏ/˗Y|T[~J-닓sj4O7}8#_ FSMYXɱuWꮡ@Y2 7?E.cVR&L&.k!*B|nv3"3!sԿ_iI!]I[IˌdDJi;zx)Ɏd >MdJJV.bb7(G=$43Kvz@MDUlR. Ye mXC_ -Uw >΃ǔzL 7(Ky(/LjN0btws yk9c*U9kWƞ@r1R;klp ZuYPƒI T_>K)_F(Bu$HڝN?2Vs>m; m.1܈hJKMy)sB[G7W?F̧@TcQR'y "ݙNm;h (ZH|g,d821Y7>K4\fץqLW qdiHj]۴o~de2gǴUzkz*BjmˑT=sIUd1TiL&If Tx{q*>meύʝ(rR'j깩IJ3gf(lp!٫ Թ>*HJ4[+yai0颍ӎf&YI!p3kLF}lE]^mHFDF[ _sip#4to`RlS_Ѓn3fF(9ݹ" GQl/ys1Vc%: O?zv~mt܏ ' kUaAW x90oT5l/LȱAy%F~ g5hܹ=3PӛJ[b,~)p/7q'^ιA^EVƖU#7@PHAm)FL|U?sb z#|u#*cӿ^GsQ>.c3'IْlSITXUJ "_3VdZqł4Җ1[lJ'(;<8{H?*'@34=XMfbK&'=w{0]]֢n~:l=1Jhe 87*Seuʑ$-8n)$h9 ak7ɚ 6{2S@M9 K&F%9phobmK» w ="v/,˞ڃ݆ .&8o.X>-6OT ThOfDD"-lA^aɉeit2SJĒ2t'O97s/]n4 j *6`>Yzc?<1peFlAB+[#;ka-+Ҽg Աk f6*BҶv:}.{Mq/!hifkEqȎob+1 K0mQk} HW.4פdn,FS&]{Fn;j"#LDX/D> K_fb*SFgWjMHZAT(|OTnpnDK%lin <̔qWIL7QD$(O~K?n%;" zUP09+G4}g!G5o嬞2cr'fͤ)(BXdUsK];H,K蚛p0!D݀b*A[[Mx:0I -y,BjM$z#PB a]c=3^NZxMO^_ِآr|'}1mZO"y7ŧKiŝ)_ĈJ#K>JDž ؒ`/Zɒg3)%)6}`^K5d1z GSW4MSdgO?R{ endstream endobj 121 0 obj << /Length1 2308 /Length2 17547 /Length3 0 /Length 18948 /Filter /FlateDecode >> stream xڴeXk5܂K7\wonqwww'Cpw 4 3=s~/YꮺLYI l Ll̬y0$ 123r"SQ;!V`1XL!vVV>d*4t|UL @= @kP;AL^@H"ww'o1f ` 21+0B+-0Zۚ5@]URE JXo.jҌ QE5IP [ zoPT{j]ARMTM[YO 6 OF 7WWsG_ =? +hlo?5K+'+gk;!s&y+S I /k+_^{mOLJci< Ac/Ќ_qgG?9O4G] Z1M '+'ӿ"V?/1C Y'*!:<vvvJvvOO;  ͭ@fnlϢrpJU%˟d1k=sc['98:=o02 ]dKTڿ֔uG [wE yrI9*ikflge_c CVhgl?:+')+7&KL [ _?e:׏՟U?ש4|گ4EAFMBR/+I) d`;:#;ùnM !s# qXF< v߈"7z)x,AkLkLտ'EoSoAo`{^^-M8_3nl,W|-_Y2|m?+KW3pT|̧xZr3%vȁ"E~E`y~}dPUF[ROOv}|$Es52Vʻr ?seǷǏ:{٧^0Rۿù/8b`ttAA^pbEW Bz0tR ԴN3qC+''QѸ+AlZ\:zG# %ahtsS.Z )5fw ˖{LPJ2v$Bb/ o ]%$2sѻ< CZki[c܆,JgJa0$P~έl=.>bIvv((S+6Hes{k=SXh/tWbϸ[iklH~?܋'\SiQ;_^@rhm a?!!h0!߭`o@ҁ$q]6PZ03&Q..'w٩m&LP΄ mV):);+K0#,[G MO豼mm1i)*r|BRY!OX?C0zRB0dyfq*)% %$Ԅ049bu>H6R:ɪ%ed#tד}I΢ 2D`fh52]OϠsflvtd{)7 bk!NÞW|Iu6l]g}cJ@FrpşUS2pK =#1à3m})Dr 2Q'L?}/a^[vr8nB?Z1zW({[ט--Ur-7J;82ø-b͏)L/+,*뼵23Nڶ kB虐oc^?*3VlD>p$Fvju:)˝Ypͪ%ȗGb^"H跜d(󻢼)5[}܁e '|d,pAX3߈/~E o;=hvSu-۟9W ?32]!#;3[-qɽEBXiM'>Z 4cm+[x&9SDs|Ib):n} &0pJ Fs_O!^C/O@k9D}P=`gX;'rڸ$.7`ׅlFF?њ>L4Qv o/#ٚ蟛oqݓ IBg <]+fW3L!k 9af }gXKX^3fD9vy|Q#{k 1L_vj9].02=3W4=gzGoP$ ,Rxm[N"ENi,ۧe#ס3[(*Dod0$j ^>I+@7+h넬v QQvs98 2ȸs:k8DIn''b9ī{2c>>]^%izM=4 М:Ϙ y?; sy_2h'-b0ЛX3_:UvPvZ,[h]Q{uVoG9OԘ~iA"\ʹG(YdFK/: /Y8osdηۄd5Y y+%- [GI3zt206ͱFY?|:2K\ces [Tǰ3í$XȄCjj]"QG=_Ecsvsia?hiPl~2aJ3<+. *!#Q,]v wTau"h|J$GbL^ۆ8aUtS# -Q[,?9_UCAާ]2/ )^BO= k m|h>C.L/ruJ =/ZD2uuS10u-C=v/ۿ7~zЇv"*P>44 FIj~4)NQ9)G4q Vp2Ax/ՍL, RVnޙpol>2Dݠ W#&5p<݄1\6)=Ί227Mn鰏$1nX-*7w,ԣ237Tˡ뒊MWUd]ڐW~ zUUnOlJ%$t„h&X 4K)2Ul=Ih$)zVfab)PMn7'1r%Pt(3.e"Vݯ3yuDJE)Rފ"ތ8' Hf#Gm!!JP&/i-{k$)ݪ%Cϋ &GV< /{*np:lmQ4 |H\Jr5ؾcQ12 hE;e程x%51ՋA7XՂŇ]Ezd `JåuNZD"+G]:F2DI=*ߔl :(yZ42Jy0<<ߚס /UcSf[XɵԔYl~T?A˽_ٻQi(`UixoQI=Ϗnz+8hKvh|afex-Hb "҈6u}|LQ bڠJ/Z xMO.N z!ͭl=\DUr" Zw7b}ކL:E[($-LxԮF/]ڢ>aWGvǘj;sr:s;Tfn暍areK8_(bikMeMvns{J Q_W0x;cj0;2Xw֙,2~lD~kB}yI 8M L{ӽ?~r-(ŎRr*]_JU?ng2?Cw{n_V+".`/}}.+jnN*VG98Q RuiȶpģCS#$VTYRix7F0d&惭l*j/%k1Kr`HxuԴ/׷$)2W| Zá22[O0v! ~v(yw!%> h"!@c~^zOZ_S돏1rP+u ѬMy,)╼I[-‚pxB/yA9JFu( Nx։j0}%uX2W]?#*->Z"+ۓv}2 9#&kt!,B5(ofC*š7|C0*֧;0W <ɗLn١\ǤsGXLkV5۵46$_Cw|{D]yC9W +W #ftىZðD5Yt'bGkX[Wt]9#)Xߊu-wdh3^|}7Yw{LCO"KШ2q1,o:궞ti7!L*_E%f;b7i,BtO'%nSLEm[c\WTYޫJipF*DqӬAvU?dg1f-9E),D'i m6}kBK۸9"*ؙ޳ TK iMz_^DM"Z=9}DAo܍ nhCc f hվS"bqP6Y2%햗Uo} ck5^{/?g ޽2Bp U_S׽&ͣkpg5DԨ2|6o><gZrK6M[)qW+hi+n>{sk- xvKcږt,D:M |ka8d23b"Р>~8kL$l1 |h jJR*"u1|Q.0/nGDBNVmИQ drRbS %4 $%䙛`iWS{OMI7MG[a.LfS\ڏ@DQAn }+*H@;Ff(vzKr2 vo*<[7<[@c@HVol$9 @5(n:Cv"#?b!N73Vu٨8oo(Kb B ,a0L,9 }0ȽrUJu!`N<Z.:gqU߄(SM@)gRw)4^g*G]Mס د7nºߨ)l&8EBK=k(2&v-eסپ$lCwW*$Bwo[pY#]]][*eYLAv>񆈀nJ]*K>!GnR("[,[4SodzgΑkk&Jrxmg9 ċ>۳<GU%=VxXm:Voo$e*Vu4#Ap؍7K>Iꙵ=  s`DwTMFWh)WՇi}F6LEb ف1}'lQ/;Xlbw7X,{Ҧ0qؐd'h‸E͚vuM(axDo6c&wdIrt[p=Gϵ>}9Mv} (huh{hY* .~@H eD;nxh?F E+52iNx:[-V7LR`PxVaPJb< l@CGD}٭oK䆅Q HԒ02Iuyoܺ u<&s 2l+%>8oSL**w~QldTP+)'hxIc{[y\*k9__;NjOMc"&. ʕ]ob8j)?CUpQ?w5Υӝl"3Cp\Ao|PB&[PчXrx Ɵ_PL`YDr-6~c! ̼YY]0SW@!@]e.(S:p-L.,:R#،Gw|Y24$=c(HH 1XJ)YB{![[6{0$KE@q# xf4MAķp 5d  - }vJ} C &me7;V21`*߁m}&tz6Dِ(y'oD.T2 INЮ5n8p~KQ>jYVx>^ijx J==*r;< rD8 UZcGY^-*:xu(t~.mZy&wdY=n%!cOpLVr 8g߯vqw r87 US>d!wf>sQđR }˘=GsBŒkl_.{7F.#CU24C'rY]PfƝSN "ŧIW3 ba7/Ϧ4;ʙ#W9!wq~J,pZ .8e0xoM]x|5B#cISM- w !8ݕ?]@< "2fJ!2ȕeE rPX2JU(:y͙[[=·9޸E)ܗMMEs>c}݊:s=G P>zPc - ^w@5#FhJ:Lo>Z:YAY{rKVd\mPŧuaaM _5fq$1n!s+;&$Y6VIJ?:qoaEn[Xx([+NsHދVαmM=M;P\Îd+nAS_1@pʎLqi݁o7oyУ_в+iyk(~ F6Ӝ }sNϸB{V艮}N[oI\R,zx]|=q*7."uf?ع]HjLΛjщ9D_֑>]v!c@K$fUtQp2'UԖE!vZ{*kf-+'.O~"J'j,c6ZM&ף4!/$u ;~y J>|qxޔ[l:¨o0I~ KpT~FK"loGg^RȬXUAJEތ5z; }!sɼe7;TL,יN>;)ੇ\Ay!5@~̵n.\v>{6R*rbhGOv3f p3㦦 VΗl+Dj˂][h0 4r/xivvLoͯa^,I[~$.AkC65v=Pa{zP˦ V :[́+B3֋4l, CŠ+=wN!ܾoBBHA{*n;,놯# )lrMc-EAeLLsS- ݥI_+oj+X_etBZĤzhj{ƝR9 ilRN*J]sRqg.fp*åO yh(>w'Hp-bF,2PNNnj,ۥ0y\ 17?6hr⬔>m~ALG#/;Z.LO! ju >|K=Sn\f)]v`|7a:1$(%ڏmFkDr.^rH Brb bko].9 ! ┎x;6".3u``Fk'ZQhdze^IX<^ffH Gu_'Q,@5"dJ 4@MF122(TsS*k4ӿ]yKBېFzeEq2j+oABv!QX#ǙyOC o֪uط2`bZ0kX0JC—6,AaZCnz(4%ܳ.H a.Q7,9n'UH*N-лxӕB1.tH mjGkOI7s+՗(&3;cdž 4V_#yi`s>V^ ܻ';mL\0ާ@f/88pNp4#Bx~Q6@ػ/oph+.I/ ˳>W[#TȬ'S|q=Ep.NT>F5SSyM`?˜\X&kMPtB(i@&TꔻT5hbG8yaӃzmDzXqY㼈Amp endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 816 /Length 3653 /Filter /FlateDecode >> stream x[[s8~ׯ nMmUN2qe9aXƼIHY  H`p5IP0)@N0"i$/LXG NCq.c*c OAc C|7 0$MQf4I`N ?~g02aV00B5 `fAoH*y&Ia* "2A&T@0wPx?rP?Mf@c D/c*)]R15%&)=B#@bxRH5JL|2R= 2>- ȳ ق*f5q*"%a b"(7A|f* a!Fa@J0?H$&5 6TZ בDECI)$SN)Ɋ"%u g<l2*GB1lN?(#p>kYSc4QQϗոCbRه .'#004dg9|@DJJJ@MJ?'JňY6E94դ?"\}.Q$dcL TWgBN"pndD¹Rڭ{%DH 1:pj#[ }jL'`$\8I&20wI H Dn5ݫa]@ܧ] {VmU&Ltr{'N(h'iݳIjI70~~?oOG{i_9uUu8_^.ge%W缘O ‚WE^U켸\4Ӄsl[d:퇲J荢Ӟ$!7\ ƣ'콱((5 Jovb7E&l {)6o"&ZD!yEZmAQޣ"uv(9adq/0z}}`r|Q wmQT"ϚC$핮#^W"x>-.rvՎ fs.b$l9bO1r\Wflh1Xz0 J[?Q%9.SAeQ/و?rve|eÇD>OzbVa7+ggu~Tp%l ,g;_r⬡;"}̿K~^W˦//ϦgޔI/qe*@!x " Iq+ctwy^-/9臦2`'X26ly[SuOZiK=oInLwIR지ghqKx7IeͳT/K** 1 d=R}mV$zVW}KVqfV*zV)YEĿ+i˲eo./6U&IĆHKf2]ܚ z _(f_{ w~{}T>iTT\RbJEAT;騚P;y7c.T+VrŸ-q;459bٍ^q >g*^P- NIöO&@!mZXoQ %p0CHͬ2AzqJd>Qo-[A:54:#d H KpD%iA/aDj]G"j= u2Ձ =hґ 5@o5mіKFï {(WDZ[bkFelɔk)ִ_,BB_D(CI6]1$.u;(%}B4U|Qi #M<7smGe7Q)z"4)o 1 @&3uph3~hvTO$ec}P0RSDzȂo@2S3J2(SKHҦ)̪ Ov- /ޖ$dqȣW墙WF3> yͫ7?) yt|ns50>8ܞ 褾ų(JA`y`-8/Uw-ThblYje@(f=4.=⋢*K|p59E!Sg7ηF}a~8~۞60>zmv+f}+<+ 5h}n))NMA5jaŰx;!U6D}Uǯl7N`JZ)E.K)"Zx@MC,ݼ c`mFd>|nP,iuӃ9bV;gSz?ó6 ,˺ bW⿞FX&3W*!nkG Zkdnp(a_wc][]]Ka r>!Τa_6zO![/vFR81iD!~H^'8tp[ˢ-ct 3)nJlI{h?2Qlθw#=fk z)~lw{v&R]Ons>ڶVx ~>ϧ[X endstream endobj 132 0 obj << /Author(\376\377\000J\000a\000s\000o\000n\000\040\000A\000n\000t\000h\000o\000n\000y\000\040\000V\000a\000n\000d\000e\000r\000\040\000H\000e\000i\000d\000e\000n)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000R\000e\000c\000o\000n\000s\000t\000r\000u\000c\000t\000i\000o\000n\000\040\000o\000f\000\040\000I\000g\000\040\000l\000i\000n\000e\000a\000g\000e\000\040\000t\000r\000e\000e\000s)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Producer(pdfTeX-1.40.20)/Keywords() /CreationDate (D:20211031092926-07'00') /ModDate (D:20211031092926-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 124 0 obj << /Type /ObjStm /N 8 /First 60 /Length 456 /Filter /FlateDecode >> stream xڝSn0 W-ڲAiIOE%V^_JE[=PLY@ <+Q(AbyYPP@E R9jszIZ!P2d>}W#jKbj؃3_zzɅ٭Upri̷ ٌlMuF #ⴅBμgc<}AԬ@0LK[ff앥ʷ$_۾>_U?t*HJR!& 09i*V,/ W~N?8L25 L3βE-@c܄mG{< iG!FגKG9rJdQ*I wYWxnmnX-Qۅ8eOwoB򅞵3X(͓u/6=3cs•LesQ&*R endstream endobj 133 0 obj << /Type /XRef /Index [0 134] /Size 134 /W [1 3 1] /Root 131 0 R /Info 132 0 R /ID [<0962FE4326FE0691B471E86FEAC0B6B3> <0962FE4326FE0691B471E86FEAC0B6B3>] /Length 334 /Filter /FlateDecode >> stream x%MaDlrL069 P H#EPˣwHqDפ0)8ȅ<(W(cAC xNΠ . }0PyWO7ejTJ*A=4@J]T~m*=[{T:[e#}Kж1AhlaFU6][Jcqi2YB`aV p:l&l_U~lQ ڴ|iO/Wo\uLtiK\04U3|/~ endstream endobj startxref 183948 %%EOF alakazam/inst/doc/Diversity-Vignette.pdf0000644000175000017500000073266114137542131020167 0ustar nileshnilesh%PDF-1.5 % 9 0 obj << /Length 1869 /Filter /FlateDecode >> stream xXKo6Ћ ,zn-K- Fbbm+y %I|3OV O>᯴\[3)Nn! Vpda ګ:%XOݜ/gEc׏KeP[[S^6æƎHkYy\v `_V# L(LT9EF&`%_<n>hkP}b &"uKddVL,X'o&:^ssh~nfؽסʌ<X^OEn(v}Qd [0{{k[xnXG]dۮ'p>n?XҴn}}C5n|y?dg~몀8]GT󧀎A6\h\e婠sp@Cm&x@g3rtm[/v>/r5m N2+xpxؔ'|9O'Yc:ǎ6< cS0)6㬍 DCQuIF!JŖ a&oxr nkxєt$}"S92TD9hX6#@2c9='0Tp& TzS̽Q% ԒX`^ޯ5t58X8gcJtχ}"=VϓM,hw y!7U3ef1MjÍJQ~%QKw-5EthWճgH~ehMXjPjP asl_^1Ik_!!@ɍ(dF.>p%+x,*vcD 8zF˅#@Vl5mtیƴbW `kO`zla5^5lIRm"[S`HϰEM}3FU~_9LJ.sWtܡ?u=J"F¢bw_cIX!d_8=L1΋:ID8\L@(UQ?6qрK@ t}&<R_w{<1tF;F_<sŏ%EZ endstream endobj 30 0 obj << /Length 1988 /Filter /FlateDecode >> stream xYYo~_1Xpfw06Wv`!0ƂCrf OUW谁>ꪯzv%VDU~_at>o}ɘ~"ٮ`zW*~K]AuAZFŕ`n-ھuWIlU3 pY,=c0 z`8p0;ndԼ``MHH_b?df#n,O${Ԗ-0$A  &`Vp>C&8&lf ϘYSђh=R0L15Fɜ 6xYBQPyC `i/5 7>Np#ujḴnS1p=v ~ ҏ.{d&xCRMB{z;!v]NZ4zs0N&㙢E=$铡PVuL S[eAS54~$}³jD.PCTveS&~@ŃpҍK NPl>) |BZEsɧkq7;p6zA|vIqU +띴+aޙ% "_l̅G|8STzg Dےjj6Bl/!ґ'WZ.S4I 0STO !3%̯YbD|<2ڥPHp$> stream xXKo6W. صBe!]gm}-Qrc}/YRMlo6؋Ișo󢑳qs1BvAތȟ)ڧ~1y9:F^b,N;=*u>?Lh4YTq$X󔉄55+ohW7ғUQU]ҭ^f y!__[-߅)&^]Ҕ7L~0(Y i|e&7C(yF8[5"R.#' ͷ[`yLsT{MY48?J̌Z=:+%!Q$Qm@hpGѲc5 :#t<݇]~Ћ2^TmgjT|ic}lA>/ProcSet [ /PDF ] >> /Length 35 /Filter /FlateDecode >> stream x+2T0BC]S]s\.}\C|@.T endstream endobj 40 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-5-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 41 0 R /BBox [ 0 0 432 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 42 0 R >> /ExtGState << /GS1 43 0 R /GS257 44 0 R /GS258 45 0 R >> /ColorSpace << /sRGB 46 0 R >> >> /Length 50307 /Filter /FlateDecode >> stream xK&9?iIQ$UנF#+LG*J_Wou\C?s>_8l*?"K~2|&vK_?_{7?맻Y{k6cʏ_gگǺ=_MG 5?v=g_?kxQ,_Kג5v[せYׯ~=Юz qaގn)Ok#/=prOj Y맽bkziPW'ԗz[ۢ/[?Ug _|neP?=f;[¹?54Ojz+p5 IPj?s\/ԗyo8s@{cf7[h:`gmSY7՟?l]^~w]GmB)Bx(QuV}mj U>]pN^o˞}S߮>]i4~܉d!򆶝W7p˼XOxe]e6ګjqwk>p^:ڰ? h󡾁{O}';p&siûm[[ Oy{]M0J?czRW;V7T/Oز,~=IQyV·ޞxWCݰ?mRD<yǮ>IB{U kS΀w}쎀-Bw,p#î}yy= jlQwXPhO]ޠ7Xh8&7yp΄7}pn-p;kNwӾq*U#YN3JN*լʛc5ƔGזh;tOͿ ;dWFU:*ȓ74)3N}FPo/pݏhr:>3, X9<,@ūn[J4VȮw;כ'{U=iio(;C~NW8&w񃺓w jPȼՕc~-v8?ccGd~z);)fUʛF杮*lEI k3cwKm#iqR#]UgYqTUxg2FEwǙptmw7w"wirqlpVU&b&esEs߾ yN-UîSU2pHΜ$lWaoǷNd#}ԝ()DŠڽ+MMݕy#RBei23'.Bz{)畣lγH)mzA:dk}έW.aޓWٞgkpb&$3[֩J;*s0t]cdܲ8p>.jZsd'dhlf=%NPGvV: C{=̫_"_톭.^6D;v CPM@LRc]'H7%6ԨըKE(9sKPlOT']`7VIvQ@/%UUAA-I7uMX5k 1QWVG*9JN8<(OZ#@ Z$uNe>[D-cnf.c,SЁBRrx:Ѯʢ]^d^Q8nLNj^2|@VH*{(PV&4fͮÌf6"_8:C7;tǍ9S7$3t+7ps8Uuo(Tk'1z̑4U퍔X6$#EHnGNn*9wX&kF#<+ᄡD~A&E#CSIeþE@#E ݣ>X;Np>pX bW:HF͑CdG nII7&5/2/2rT+e#![#]r!ao;#] _h%Pu'#dV25G H71XQ,(rUA]nLˎU[?(ﶡKN胩*JPl&jgGV|-唍C]PUGMPwAP7UB[TKX0*@!*ہ;{=~p@=A* D '*;{zyds.ڇ/Gv{CY=Jfgy#]!PwQdw5ށ;ӞԌ;GvYj,y;!AkդW{ Z+>z%Y݇['4hn-QG՝gJXa%p3/4 {=Q4}Gмaxq2epФW{JAU?(5! Z|Oͻ?$>z6tnf wn?ԝ?s;! `Tu ! TʻSYICKhhUCtX G]U  ԮRih7dc7{&.PPA44hh;3|b\H83.THCm|N.:Aݏ+&{H 'O(Y}NJ'ThIBR6ƈQc`6:itҶ-nW=5>`aN:AP<䤓{ A%T6;c%B#wS9NT>CBYfF'40ʁTFV9tYL.ZkJevuB5| ([|}vNH2)'PV(+p*eU iWQ6ƣL2h7r΁j-a'4B...nhH¼!} j)(()))ҁBhHyCU fH]H6.PH5BNNNWV]}Ppjo)?m/ %l9aNYS);(;(;(;(k5eJYRV)+ ee/^EکB#섔u:e R!eBeFYRR+3(ʢ!i@hH{ Q!e;ee(X)e/^ !9!i^J>)EFړ 4 h5* UGX@vvN6:(XN^EK P BHYe9g0 e9g0 IJ'N*eN :)tN'; u:dN^th*Ʀ* dY8<111#xdq<2 c0Nlc0 c[2 5hb4.!X9(GeP8G7yC7s`eP e  Kd4444$4$4$4ưW*NC 5h3 l DpN\AA+ !503G !5 C85NMka k_X־/}a ks 9Bt B9.t6;~g}wξ;΁s :' YݝYݝYݝYݝYݝYݍXݍ17TߘS}qY87w7 s{cno퍹17N +-}i"4"EE^ߋӼ{~/X}1{_{^{1]_L{q8s8uB/N/N/N.V(w/gJHIIZqB2;kƕ ld62Jf%Y,dd=4.|"slU ̓̓̓Nf'yyy.uJ:5 ,dd}0.XuX;s ;$$$@@T#ӏ̨2gqW-Tx 2w̍ſ|u#U yr ,[)SBH:uqw+_UHfeN*K$tR,t5:E'/8{PpBD?2#c?.S<6N45:tRiWIN';hɋv/Ep/(VxRkc i=E͔=ES[48Bh#p&L<.鋻.w]!y a-p_%," ,BNUU5*nbn97vG CШʨʨJJ镰vU5*c"a.DHH7v3TT%YN;ߨQU}b/b?zS48_řř iPgp 5h袡fϟK?T`CG*AC  ?KUЍҀ tn4qE7Xܱɟ*-a p,B%F7n B'nt:Fn4:yэ:;'tNRDt6Qg$h+H5:H:#錤ף YFjc.Z0&G0(VT'u8a4Rѻ{7.?NV}HmQYA茡3:c茡3Θ˟* Nj#zzU*iNR'N:HF Bj'2VX)c%Ln&Lna#] ە] 0aA?\؍Fj#וf uT4Άِ:RgW38 Ngp:ՙ;{Yc/kl9-1#5qq!f{5vnحUV7.MbST.C~t]h\h\Lc9qO:"; !>Y`8:9'rM~ #xO-PӍF7ݨ+\q$?[8ʨJJJSU iѹ338  sXp\wW 96>p\a8w"Ѽ=TCɧs{9Xǧ l{U8Orr&>] 0Ν3"o;ru\w';tch|@DshqR|bAXޘƂ1j'a=Ab!Bǡ톍flup a'l\}$tnhJXkFCo8 kN;6ƃ9Ɗ.3/Ήq"g(Tը-2Í kʵ/jgz(5'>u 5xڕW/TU;:5֎N']%SvrY(((.?PkRsC'4B!*WB8L۟_u)ʝ@E5`]z(@v uŃTx|O8`]߰3o+=Nlw?I&F"*!dey5]߰NGEY^łHx50΂,L"uD:oXG:IXWyUk;~5upë_ꍕ8k9Xs+&UGoލ#0Bt>`}5h_)Ed~1}]܏kIwy`s+x` sS.l4^Knvi WsBI{.\YXJ&6ƻ9:_?CyNoxF|ůnY?:^w/⁣qN|gKy~tlTymc_i=63>}q5m{7`O2=fF^=}h v[/' }?Px==Iućڞ R#ϾA}cgC/<,h߿?_?gگgU~#D]7ȶ5+ȸoĆB<6d"A1nGlODhMFʱR-Wi=kxWi?ޢZ9dnJOۙ_Ckfh-|ލ a4F}OuUt;;{\uw{s51_=G`/_H7";f|06RKQ3,X:mF27Ej|/^}nH= '#?h%{8՝awAƷ|=WD#(o}hsp7Ν*r}xsg}΅9s41x)Ohwb}?'/sj;'Ӣ.BL޾M|w؜ES܍!rh9 <$9̰Gs5 ]L]}wn9ݝsRR7e~7 FCFd\SB}޾io"PK[6?׷Н s{`̥n ]ݱ$=~IBc9u܋ wVq@_c({Ƒˌ_3܁J % fׁN->eӃ~+^i|d'ȰA)ƃq0%o松 u*-*͒c(?qawƷ _ 潅M%6xs+buhP~sƦTj~rZI/_]g-5bgdW[GV#?ov57yoXf|0k6^M5tdƯC Z5}ͯ?{8dl*Ub fa(ov].YYc.|М?qZT+><=Ϲ%R< %% Ca *40FM=hdx5\{^\ (91Rs\%HhBW :jqP[d4ށ}Tȯ9s~k74sCgrKf>wk.oQ#j`%=40,(Y`^eY3}YnJ%foSjSWw3Я}YkCG-I2eBݭnn#k!a<?W2"iDj_0{t1d\;7^Ѽ}C™f=U3f|24Pw ͜Ǧ5y* !8+]9ZbYjuI5f'e+O ^*i(*ϴ ŕp:4ZGN3˯RJ*?P˄9aO4 ڗATiȡFwȎ%ߏ 棓B:R/iѼ?~~χe2h 3|΍A$r y'sGENARG{9hlqX. <(QC@8+wPՠjU$'uP>VfFM,a 8-֣(h`ϢY`sLA_wT2r)pB LEGbrJ?!#:GLdj9ԋ)FUFo1T0*j庬lՊf,NڭRP,ғp#;ihDZQպ'?=%*"P%hPhh4l]h 3]y '˻jyԁ:dPEZDS9B T3P1v'Ze-2>RNr*,+'cZ,Pz?W41Au!d'h*i3~t0 #83<9N\,d־<6U'e#8\9 ꂪ:<sF4 l ~@Cq7;>WDIF̐lޏ j.V}m9' KqXJ]1087TA C֡ek7?>S4;UNOƪJD؃*T~0#°K=ܐz*a&Tzvj~«0 JGf%@;dݼdYNFc:EXFX*?vL2WBsPd\R;ECh]'.D"h|&3rιpu ܵpp]RgմifB+!X݀C C}*׃YhW;:]PeB` 5,*@]gpNNg28N.%pT\V#.:* ya&3z}J$)3 zȍTyDO9fp:t! #ORU;þȼj|c pՆwswNECyͪY99ΑE?:ddvُΡO2OyuP^'W*SGjF;̝j[@ftY UgO7?.f~H<6%3Nٕ0T2Oj.W@Ϫ~]/VՌSa^ 62jvj,,JU R) Y|QP5ys{!(JҮBhPwX ~Thn - ` iνw/ vr訪Sv]B[i s0PPQeJUuތs5e1.XBɰc` U''#;?jmNUk4EnX}AU:4:"AT:itsQopAU67ā~A3S17F"g.ՠy)|^Nqrg,d^|U d18J^Z $!P^p[nE=׃) GS9n!weUy:(;.Sz p9NyZnj=kk^ݿ vW'4ZezSe+;~؝seD *PUOK[nU}NЮ JzK6_fcpbPغ~QOP0eqn>-_I'e'enHUbCZ1nnUȽP nݺo mW$ }w!Z1f1ф,R(kk<Bt:eqv<Dr2V([o>{aInB깙U _1C) )[HMvALNP*!evzރ:lӥ&/\#ۤG^z Džjn,&պ*K|` ̭mqqe '=z2wN {X<:,y=P d_+TQnqr|!CW[5Vr/pvG f[}N/m`g2u"8z;:+=#gRv^la^޾p@UR{^{;EPA F{ǐ s.0`-vF;F1sa[GvRYUH^;qbS/؋WW P&P"~&w@ P:ḒyPJ h8T^ .%VG_uP јtc2uqх0O d\hmZcW\2:o9CmPv.Mv,fnXaw (^P,2h(ktغUs7hYt%BͫG 7ߝ pL%%)-=w?awրU0{Pݰs?+7DR|vvK7|wTu%D"`ް=j9֘c-*RhzDw^_S NY آU9?'< S~y96fZ|`W) U*4jBka\+4<{:^M82HC^M\ ]d+d'%O#͜Um#$skZ,Nl3ԡbb8Y`~p*@_3C]⑐S%*vAsUdMl$ž8GeC7TM;!˻=Dx6K4T&C7䤓q,>TVW[ ]IɅ!笭'TA8Eؾ"ȅII\&HAH't0Tr~ ,jRU]ȅ"h6:i,~wOmRh=E)XN'-餳8+eR&{2ȅO.zA|**eSFaB@#/iPIc9*dۀx}%\㎣&$յ8Ɍ0 -/vj܍> 5RP0zAVgJJJF>[a&jHW9>;5;5 ^}TA&5AH'þyQb'a՜a%GP>q0MI5B'~l$8,,\a1?8'^CIGB1JnXITG`0A̓:yLv!88,dD/w͓'dD{Y ΢U38h5* >f%u:BwL"AUwRap*0$,ٸx`W调61/PE0֯k4dw`w~,@!0B28XZyS<^Mo}!(yqZ4X yR31`v.=TRV/Uq@VR0v %2hX)J1 ;Tt0X0ºw], EgOS3v'_f.$\`<5GOfŘ YؿJU%Z,QrjLhΟ |-YQ&y樊K5WfX9Q?p:5/6P,: uY@RpҐА)C,NGDFCFCFCFCFC@le*H7bV  C[p7*gi44Mn2t \#5eCW3^ 4n􃥎4/}T杢.53C,`QhGRpy,$Fđ5og},L@!e$#dCHCG]fc$MM1.;#3 8Xt6:x 9 9ʜmr/Ll}aPlC]4X\,b .b_X5;9Xhl$/}pu8TڍClMRYl.[4o},`g; eY@LN:'',#),.L*:I]lAll94֜` 8hh0H2K܂b5 Ӯ r& 8%d,dט;غ/#evlTvڍ:]ݘ#*7*W杠>8^;3w'JO+jlWk_h Av8;::lW8ە+?*;eK˖Ij;خ&ݝ>8/]'[bؑ F4/j~|Qkyghhn,Pn}ݠ?tT N*Jfu>nȅ ,B,FHBRӈζ㕲gdv2/@ctvvc[)}6'u_2;>XI*g؝,λDeu;[aY}M=ӫɰOw ̋lbk_tcvj/j^jmְ׏:HTU{z`*'c3\uPTs{v`rXLn^* {.y], 0 /,^PHUTnx.o,5h6X|cX|c-  ?X n 8e"d-8:-!ſtOڝ,dO6~YƢ}pэ/ B:S_e|2 /jt pIL70;疲,>yN8)ZF EU3Oi^C>ZPFC醲׉*ot!a}cn0ւ1΂>g&taJj $Ƽ|_, hv.]0fG'ݘtcR&?&X쒋Xl hw RbXՍJԼJN%,a풓 )~wrˋ:9E;nAJ7/BS% Q㹕}yqlXw'Oy t&oLռI~4GL'h ;TfVd4on,h^b4XlE7(^^=vXX ̓..ҍfn tӍ!Ni~Ǽ_6h(tCT !J*,E2*ۆ U#:R֑+c4blF7n@REz]LyЫ8M7;,Ѽf:`4Tq9vE`fWΦN7phL1YGȱyE dp&j;/g.6E7Xln,JY^`#B+pL7jQFN[:IW^u\r-_ |TWnt'ujC*tC08Bu$JUEc|epCW5Z2tCFڅy]Hv᱒]vaZk[>I8̠B B.d`B~ S3Ob~L7[ΠN7-r^9rv+gp^9S]c]x>i2ۇ28:,6ŖrjB Pqc=Ijmύ ὕ5&Ƅܘ/ACNluk|U@F[GUV77ᦢ5&|A*ޝ֘Y:%6װܘ5Zó/k|τe5u`s=|1N$\PetcvB!#Hh؍N138?^ jЫAjЫArӫze \H>Y'Wd&v5d&lWZUڵbp"]*Xtc18l>H`+m#ߧ|Ze>:HNIH[>f@=(˷-jW1NU^uz0ӫ>(K: #WX z%A1Bz%]7XJ>̂(kPTz ɼ3wܰVqf,;SX2zeAW}p`c5خlW^ vg+'T^9c哆XM*~ MjSM:9M:fCEXj1.zW BYP*}T 'Uѫv66zT/?YzUsR'႓H RD cULԏ*z'e0VJ+ѿB'_"SNIe{B+i$.)2t2zePWfV0 3l:>`6~d~aBd}a0tt/@ >I}Tz镳B'+tҫfzI:HSIl\@:sed\v`# T#uw!ZI56za?PdN@:N'; ]BnҫN: V+i2B'N CFtI)TN^Q3Rzo'5F2Cd茭IIHAC?r~䠓s BB9t:5]YNs:ˇ';d&wIƢWn1tp1b.:Q8jG 㨑o>h㏰:iDKHPL'l qȯ$tdC3])kt;~![d,.4B:)0)Cl~tRY bD%WF;F'N#iSfgLy76Nf!?BA:I]c$1(_`1td 1ItS*d$cL+J'N'ꎕHȁE''cIS3Tj~XaurLdLF8NR`NNf 6d!&N9N';d}2rfB'VqtIYYIq1IV#ϱٕXk`6:iNƝ"+RnIc$#9䠓NFr8>NFrw:nN>;t:tI_[ƹz eT#dvRItr]*,n,#>/:eG:9k`J|=12;$\EUϭnɦF8sϱJ7:d]Ky8mN';#)_`aVgڏӖ ,},Y2J'сl *}V'J'cG3ne 1 &!{`c >vA'kLn$3N؁t^.M\# t2OUG v@%3}ރpR3}ރ>(/󢓋]?3Ʋ6GUBB']3CmoQ:B*}ntd X:}>w>d? Pg"9>P$dcu }V:cge]gϦ0dt2v>ۆ1FGN7(``;ݠC<`p6g`3N 8 gB' p~vB!m%4RSI'}yͱj;>UwHcVWtlCvwY w;̃N8 sϭvB>7#Nsύ>w!}sN;}9 g8K+?f]X$gBYg?BYgIBc؍q%^FPa7llF p^qpjNoPȬ ?I`SHAG8gϓ>ϓqwH'>9~XEJ,}^y,B/W5a#7{%Ro<pFEj#Jsm.xsg{#ϝq㏐E蓚! Yv?BAs}qi3[g+lJu2J>G"}ރ8Pp:?cdQ;, σ>G" <_>ݻLg33"tFFoS'He7!jy2'EN5{kpkyo׺У0 ayW(,CX_ݾk!phh!j>+¡c\K?xC NN.k}DU5_!T5 W(4Chj!p^aCnCCw{BW4Pso ! ítk+Nqh]hEC+yvN7Q^~ aPOka|4h!LC0 a*!,CX񊆰 ašhph!p< Ch?*gv^8^qyX Bmb!TC .xVBkhZECh o0hha pS\xb!!|ECHC]G +B7>[[ o8 ah! C0+z! !LC4i|œhDVyE#ZFhr]-#ZexC8+aGEC8< z=8mo\lmb]t%B-UCO0օ)=/nz]Lgk ἔ'l5fm!k0!D{E# CBQQBW!%( ! ! ;g!z{E#+BhDFyE#𻲷 >\2?[+qwbh+hDˈ!>[h+v25 Q~ Ulb8c_»s&zp_1+VF+2hD-#+49^шfMChXhDFECF4 a7F W4_ш!F !W44hhDiY_шb!DECC 5ChBW4f!TC Bh5^ш!ň!FT +B1R_qyo^8)^W4ek!,CX񊆰 a70 aW4_ш!F4 ahDxEC0 aW4axEC+B7hzy44hihiY_b!!DECCЎW4fZECh+B3z!TC BW4jP W4b%^! V/kw8.*7\ aW4eV!,CX !LC a4hfya|EC0 a+0QްB7>^!xEC!!!xECHCxECHCH5 ! ! ! W4_!45P W4jU5_!P W4bE%^rx-^b^WECXԼ+49_g!L5! 50 ayW4^{!t5w5iTsW4Ts9+B9 !j|EC5a36^[{EChjj +BUsUs-oX WTsQsQsi>-;.qbb^QKK+_QKKͫ4_QSSͳ|ECjjj<++9WTs9՜j|E5Sͩ8^Q͡PsWTs9jMMMMͭ[}E5W5W5W5jjjj\\\\+W5/˫򲸼,#v1X_QKKKkW}E5O5O5O5jjjj<<<<+yyyy(r7jjjSͩTs*2՜jN5"xE5C͡Pd+9jnl+*WTsUsUsUsUdȢ_QEEE\W%Nq]L1^UTRR䚯ȥU_QSSSS""jjj<+++7L5SͩTd*2՜jNE"CPs(2MMMMMM-^QMMUUUu""""j.j.,,,,,wË5x /^Ëbȥȥ5_QKKKKKKxE5OENENENENENEjjjLE|EE"STd*2+9 E"CPd7llllllllYYYYYYYYYYYYYYYYY{=^ף{=^Clb999999999999999999ULE"STd*+*2 E"CPd(2TTTUWTdUdUdUdUdUdUdUdUdQUQUQUȢȢȢȢH.1%&Ĥ^bkJzMGlbTTTT5WTTTTTTTTTPPPPPWTPPPdWdWdWdWdWdWUWUWUWUWU*+*2LE"STd(2T UBUPUWTdSdSdSdSdSdSdSdSdSUSUUUUUUUUUUUUUUUmȪȢȢȢȢȢȢȢȢ*VV閦閦֢֢֢G\\\\\\\\\\9999UUUUUUJURUTU*UJUBUPU* E""""""X[[[[[[[[[[~[~[~[o[o[o䟠"""""""""RUTU*UJURUPU*T UBUPUS--,,,,++)))((((((('''%&%&%&%&5%5%5%E$PPPPPPPPPPUWUWUWUWUWUWUWUWUWUWU*UJURUTU*#e2BPF(#9 Nז>>>::::7777V3V3V3//+((((V$V$V$V$ V     VVVVzfٿkvk%kZzk˾.>qkOq>uʧN):Sk|jO>5S{vO=ޞS{j`O 쩁=uԱ:SzjQO-E=&ԄSy:O]X:S'uNөu:N:zStjNѩ:uCn SsjNΩ958SsjpNͩ90ԳzSrYN=˩I9u%ԕSrjCNmȩ 9!FhSqj4Nũ8uV;zSpNéw85 S;pjN8~SojM 7uқZzSoM=7.ԥtSnM]-7>ԇpSmjM6uڦZZkSkmjMy65Ϧ'SdjL퓩A25H $SdL-2@zScjrLM1u5՘SWc[L}o1-ԨSgbLL1"VԊZSaj6L͆05] Swaj'L0?S`LC0ZSK`jKM/5嗺R_K]~/>ǗR^jK{q/ּԚZRk^Kx/nmR]Ku.ץ^R]jK tc.u̥1ZR\K=q'.5&R[zK]o-זR_[jdKl-5εԹZRZMKi7-޴ԌR3ZjFKg,v_RY/K e,5A:RXjK=bG,RSXj K]` ,u.RWJ]+5vƮɕ:R'WJ[u+n^ԜRsVjJX+ucn~گRUJV*[Q:RGUjJ-T*P3zRTjJMRI*uERTjJ}O)5:F:RgSlJM)2VԻzRR]JJY)5+ԝRwRjGJG(5pRQ0JF(RzRQ!JMCi(5 .%RPj JmA-(>ROjI?'uNړZ{RkOjI;y'5nԭuR{NjI9'~ԀpRNjI7&uܤbZlROMI=5&5Ѥ&5fRLjIm2M&ɤbR#LjI0%uΗZ]RKmI-%5f̒WRJ^I*]%ԟSRCJjHI )%ur~/5urZNRI1I=&$5EHRIjIm#?h80DÉLdyu۝`wt4tt4tDNNNN 9osf͉5NT`ujՉ_&2Dʼn'*X(%RDH3"BVzRC}H!5;fݐRwCjgH !/԰԰:RBPH- %! ԃRA2H]SA2Hm >GR@jHS u N)ZRk@H MOl4?^fiza~.LÌ0c?LS0'?o̅Ia~f݇Ya}fՇy¼0>L0s>̜SOa|Ƈa2| fJ 0=Lw0=~Y& aB{f)az9az&I¤0 =Bô0<3?晇yabyXfgL0up&ߋ 07 3~07 ?9ao&Ian~l%L tü0/7 rD07L 3o06Ijچanm[&ӆɴFd0{6̞ et0]6̏ c0?6L bÄ06̀ S^/w)ak渆9aRk&Yak05L[ VÏbyaj~"LL 3QL05D SO045 sMMariM~B"& I0}4L E>ah & aFhu0#4L S@03 ?|IaVg03L qi¼0o3L 5D033 ð{mf00a 00L Ì0c0 S0E0 k9a`XkaZX9U 6iarZfha6ZXi9L? k)gaYo&rQfea YB挅UÜLq$&IbaVXf4zp ""#G +2LGNE"CpPd(2)))*:rUdUdUdUdqȢȢȢH~G raT%fIbô99999j(r(r(r(r(;TWdWdWdWdWd:T*2LE"áBPd()9TsȦȪȪjա_RdQdQdQd1jf 5~6ӄiBͼf^Ptg3LjVlf43>TfEfOf3Y3Lilf4 ]6w.:tf~N3?YLi֟l&43p8͔͒fM3Ǧc, Li&4jI5J,f-fL3mY'̓i&4c1Ęff&L3YDL}i4s]-fmf6Ka3,WL_i'l4U% *fQfFJ3#9TsP͡zGzG8TqPšf fH3oYd(Likf43C TffG35j8pPݡCu9TsP͡CUU:TqPšCڭ̣hQ|0DZj9rPXЬY ̅h(k&?4UȚlfCX3,gh34 _͌fB3cYѫLQhj$4s9 2\$fA3렙u,L3h4 ձyͼffff@3s9):tPáC #F4Qwt**(((((**)Q3fD͈CUUQQ1bD} ||&{fQf٢N!:PPP0aDݡ222҈҈ҡRPFQQ()))QSFUFUFUF5PEEEX_R7K4J7J7J7_C7_C744;7+4_47_47_47,7,744_%7 4|w|w|Y|Y|YDupͺ.I7+4 ||||||||,rndJFJn J JmI#ͷͷײײײײ#776k4_644ߥ6~4 }4_6i,jmXGXG:GGc͂  o6kh4|٬,|jEfEE%f%0 Bo7ni44oB7 Bo5jjjž}_[cYT~Afل fffqf5;;;KKW%o_6lhkkkk hVhVhhzoo⚟kzk_kkkkk\\ɫMM>>~ꔯ// ݫ~ͭjQ~:̫Qժժ:ǫ>ƪƪvꋪj设{{//ժZo^뤪jpa߰/ Ir Q QՕAVVwlow ɷ<շد骟6>ɯ>\q|t_}t_5UWWmnU_[;QwnD݉҉҉҉‰‰‰X >`Z>DՉU'*N? >3eNCWZTƪگ%PPPUWUWUwDDDDDDaa𛪚8Z?uAP`qU U UuUuUuURUTU*l6n6n B5j!Uq}[}[}[}[|5T A-^}VW WVVV!UGllQ[}Z}Z}Z}Z-r[udTVV+VV]UEi(Q}LZ}LZB|~-Z}Y}Yu(|Нll=Ym\m\m\-ZD+*~@8)'Ŋ$#bm6_h17^|lX|lX, YLh/fK;S֋IzUY_aa^1X].~]X|^W|^WW.au^|"W|"W,W,W|W̝.~̭]L.>d+~t\|V,IWu1Z1iXGܬܬ\Tt[1ӸddX((\,V,VV,V|UL->*>*(+fgrŊϯϯɴŊ^ůeU>V1 X,Z|Tb-V*>e*?Z|ALE"CMMyVE-AYP1𧘷Y,TL,>)bS1wɖ;/)8AKy!TCU+Ň0SO]O]ɇlcbbisb`r)Ŝbⓓb_1ͯUbⳑb^JaH1}W|QpX J[` 6;TwPP00fCUU8݇ ŒSbYc?jj9C1 X`XbU|P,Q Q|tPNCYA1XXXrRU|P|L1i#/ϸ󠊉OLb?\blbzR_?X8?{;v bN4hT;QwmщB5e4ʨ(NT%dǒE!2BȦȪȢ$ \neNtN$~ݭ]鞜Iʛ)Buk5b/[k\Cttb[u$?|0 CtkukV/v]wuw]wuw]wuw]ȿxn )5nmnmnnn-n-VMb˭˭ӭӭííݭݭtk5ڌ}t_*<'^&xIE[}5ݚn F[ZZ鋒_tr+ kiiiΩʪ꯬r+zFuz%SܛUV՟UgUYEr.KTK;*^0J|QqoFqoF\2:,Ƣu'NNNNRh`uD9vV-o>/Ef{PPPP͡CU*l GzG}p8TwPPPP_$-pj,oz["ppp{+ۜ9/K H~_d~r[m.K?Xm\ؘ9mXm\lLa00@V`y+<VWs=H DKy V"e U5U5UUUUqȼZ< 'o ?:_t""F ժFTy xZ?1*#~Ѿ*?+ul'Ɖ}hb~LONLgI?III s2\o_`8TSFUFUcs1ߘ|3ݡҡ¡¡CIFBLH_ +aפFy8}~5&%>fIͮfpN2~g|"d?ww M> If~9}3XO}:o} Ȏ!̤Yw Ꮞ_Uypll:g9}d1K|CEgE6\5C7)::/m"Hk))*A8} >Q#8(9|a4&ǂ?FY?/nr?!}p o=>?ῇrǨ+FWFW čtop>|t?҃|yKp%נ>׍(4>3Ȣ~3;|h _܄RG%~͛n~)/)7?4~*ͯ6?&f r?Hw>_2/3pvRB/4?LP+]Mh~SYrnc|p?OZݭSyoҨ ,ڬ\,AIIlVlo9pجժzW|Pϙ*U֛J{+wNw a\ڭO}(RAzPؤTi#ՃM"Nuaϫ}+vґ(T:yPV'K:1#Q7qu::1A.bi@TecE7S!&ߚV6}}*o~|V}t< }Ocߎ[ 8aMߛo[/Sa۷{o~ s9ς9sھihw9/yM{<;q~ܻx~ٸ&߇gs<C;˩w%,X_GƷƷ7^^}} wA3ߏS3PX$?~ٿon~}aϓ+z){}N(7N7s2Ts">}Ns < ʾN7Ns^xsjOzN߇2I$s՝[zFKsu7z]) 7u|>?υ;sbz^7YN+ jl9F7nS|o^G~n[7^m~~7|ߏ<7nϭdGьo znRu }~?ߪnx?wn7 } n3a oƆB6<憿`6 ;緀7 8woii wWa8&HD~6\[T]6o< ߏߏƵՔ{a/ో=@0<~=57 STN7vk9Tsppt`/b MtPӡC-U-\x =nw{p=nwURAb=\jW{گR7.Z 0=UkS\`káyy9 gw7GG3>yϣp{8{}.` q):o8o8o8o6yvEw2;9w)P.rxP獵C<)*26NEvEv#6F4ll|ac~8קpVslm|h]6>э6>ToyepFm|.\6^l|7=8ZDW77 #Eic]o66]2Ƈ{v?&wn7ڸ8l|m6NF[z~c666>674>q8l|~hqqZ ^<'xC_(z0!y/FSq8mۍo7nxNCX aa9<<3;?Cq8m>x a0CU]Uox]\ ;<ᾊ}Kj|1!t`>u'N4h8tD/U-U:Tu쪮<6NԪ՝Su'N4h8pDoF'Nh9rÉ#:'=6NԜ9A' ' ' ':/qaCWowwp1^^E뉟FY~gj~F^_I˕ꘞWoJp ץ*OW/Utyt~O ^ϟ{ 玽O yO y82-^p^0xS{PӡC-:ګ".p^pf^Optp:RR^墳zaګE1ګ7ڗWa5#ګ_|j^;P,,,`ګ7/Eګ7}+ߧT*VIV*V*ꅔW]տj_WwWUyz3]x  5j:Կjګ6ѿj*o^W_^ѭVvNss^ѭíí•&íǾ~~[[[[Y?tkwkwppttrrV~e}W}W}=!w75ݚnne]uUw]uHS{FE)5 OPKS{F[Yfe6\fe6<_ WKp wp wp wtMO_~p੽z[neMWt9ꍆ0 ae!LC\y(X.`>v7\ܓ]W7ʠDD~`P ؇j). 빹7:Tsppt`/b MtPӡC-U-\x =nw{p=nwFb=\jW{گ|C-CXpaB^'o 'ܫ_W7dӓyzң(G!= QHBzң ګ;:2弇˩[o_.lELyyyy۝+Op8PPtީȩK"5<(Ã2D kx\/ex3 )ë<W ""ME./E.Ftؘiz?111lz757hcTW};i𧍧//_6>l|ؘ+򊳼]^q![떇ly^ׁګzpOhViyj^Xhjf^p>Woq8mۍo7nxNCX aa9<<8ߵWowU Ui44n! C0T5U5U5U5UTTTuP;<wxp;<wxuxOGlnTUWUWUwDÉ 'N4h2eKUKUUWwCrӣG?=uNԝ;pDÉMtDˉ-':0ÉX S<@Cw1tCw1tCέ{!^gVwh8PtoL'N4ˉE<y]WLqokc6kcxW?\õ1\ÛMpm 1j {Ucx^5ycx"1 /"Ëbx 1j8]*ګ7TKeTKeTKeTKetLcz1]*j ګvqþþ ګ7gSyVpwwyŹ ޵WlbX#}O&޵W}þa߰л)79ݾ;;;;;;ݱӾ˃{a_B:]{VVVV6666}þa߰o7MvvvvNNNN....={޵Wlb'X[[[þ}þiߴo7۫hkZ ˬ.|>hin_]eþ~jeV]fپ/}ڷڷѾe͚nYڭr6iiߴo~o7n/} °0aӾ}}!,._p0=vcC\`~ ms]ښίΏPFBB(#훆HvCЕ Pư0ii2!,CXXXp(Pa_.0< jnS22'[&z d&{ פg2!tetetetCʘʘʘʘʘXXXX8q(Pơ ΓyoȷtI'[z C5e4e4e4# # e2B4TF*#ѕэ;TWPP0aDá222M#ZqaDCŊT'{ٽmvWln{?N=vp=vϱsl]]=vش...){..ΗƵ nlbCtP]Okw"yr]qxߟ6 c7ވ%lkf'b#kma]UO'#B =5YRnۥԪkյZVUhZVÇ3|8Ç3|8Ӈ3ZMVUjZVUiUZVUi|||[jk[ս2SYJVMUӪiյZuV]* Bjh5Z VSjj5JR*JJҪ*JjiZZmV[}j_ڗ}j_ڗ}j_CvPr!C* Bjh5ZMVS`K_!WHJҪ*JjiZλ}tG}tGMf{d7Mf{d݅.lwa 6Ϳmmowa ]v݅.lwa ۃ`{lA݅.lwa ]^{מg{^{מǏR%r w;jkzqa5jąxԪi~5jąՈ "7kյBv!!d8ohZ!r9wh5BN!SJ2L!SԪ,!K\Z-!K%rkBn!ٔ4.TѸPȩ,F6[We*l:w!].d9 !C2t!C!y9BN!S)d B)d YBΥs YBKK%y鼅BnQw'Nw{ݣuG=QQw{=Pw{ԹE|=\բsUUE 9t:ǟBNS9?uNSrҹt./ǿO&ok]ʩ,FnηzT;xzȮT.MJM~QuSs9tC9Jy`Cy]9,MsӹMMs׹u:wC9tCy8pSÙ:#ΩspRtҹt.N\Pap[[[g6=4 9Թ¦taӋk¦taӅM6]taӅM¦ .l鑚.lz .lz ¦Gjz{ɇ9!uNGHG(ʠrҹaaa92h96h;y;֙-\r+q[s:\s:\ސu.r\ru.׹2-se.wʡT.F!nsm~xCve(r*K6sfn3mvsnn7憹an憹ansa0w;Nsi4w;͝榹in榹in方en[方Jse.}5a_ jWþW=m6w}մo|ȮʩLe)mR_Ӿz楇4vs!ban憹a0w80w;?Nsi4w:~榹)F\/12-/12w].s/1mv-6w??-XZni営YzK--XZni喖[z7K--rKfi喖[Zn>anbap!c;r1ŘNsO1S47MO1R47_ben[_b%2wXb,sׇ\bl1mv-+/reWV_Y}e+^W6aY}eWV_y++yeMX6aY}5l² &,W6aلeMX6aلeMX6aلe &,l² ab,l² ab,,Ʋ &,/e1XcYeb,,Ʋb,,Ʋb,,NXcYe1XNeO.qYb\eO.{rYb\^=eO.{rٓ+' _&2\ʍ|7ٕ#1B'ߤC!c1b 1S)c1ŘbL1)Fb)Fb)FQb%FQb%FXb,1K%c>`)[-cbl1=Mo+C9SR.M֔b41M&FbtNbt1!Fb B#b 1C!cpTC)c1ŘbL1SÇRT)Fb)Fb%FpJ*1JcXb,1KYR-T[-cbl1;v^y{PTr)hb41M&F} ;/TPB ;/Tpq*w^yrʝ*w^yr}>* B*R 1C!c1bL1gJ5RMTS)Ք*J1R#H1R#(1ʇSRT%UIURT%UIZR-K%cbl1ۇRmT[* YBnr,x6YBnr,f!7 YBnr,x6~nsf?7~ns| F!2C9,C)ƭR)ՔjJ5RMT)UJRT)UJRT)UJURT%UIURT%UIURTK%ՒjIZR-TK%Ֆjbl1[-~q@ʛlʮ PNe*KR5TM&UIդjR5T].UKեRuT].UHRT!UHRT!UHR TC!ՐjH5R TS)ՔjJ5RMTS)UJRT)UJRT)UJRT%UIURT%UIURT%ՒjIZRqB.!K%r BnT[-Ֆ>ê>ê>ê>ê>ê>ê>ê>ê>\ B!d9B!C!ՐjH5RMTS)ՔjJ5RMT)UJRT)UΣ2L!S,!K*JZR-T`PNe*KykoMٕBn![-rM6eWr(2\JTM֏R&d لlB6!].UKեRuT]*Q B!dB!rH5R TC!XG)r 9BN!S)jJRT)UJ(L!S2,!K,J*jr \B.!K%rIRmv[-r ɩ1=5ԘSczjLO?\J!M&d لlR5Tmd مBv!].dKRE;J!C2 !C2BF?J!C!r9BN!T3R)r 9)q3!+C9r*SYʥ,!KQ YB%d \B.!kK%r Bn!{[-rM6eWrTK)d لlqB6!M&d م(Bv!].d2.G)sB!dBOr9B!C!䨣y9BN!S)̣r 9L!S2q2)d BՎR撹,!K9nv=dSve(r*SYGBn![-G)y !1oeWr(2\}M&d لlBR.s9dCG)s2>!y#8JGh(9B';BG'].>sM6e?P_s/<3O?鏟~ϷO=]ߥ}yq渾Oo~׿__C]:~r|ǿ/y~V_ܮ9̷ܾos/z\_65>; U _UU}9/仯華ʷ~7yʗ{yP*׏|sS'-/{7\?zM}{_+ڮ|}}~řͫ|)Jd_+k2۸N[ܮkB{~-ih\kBr}G[h|\/m?N_?_?>Uaoۮ?l_ O??Wo˧vzjWž%fl`{}^ph7~_; j:rumo~^޼nnO=_͸c~=t}}p-\7wז(ˣ>uIE\;ɗ?^_({oU37%9.7ʷ՗ߵ?5ϔ$m/us{D]%y^;ϧa endstream endobj 48 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 53 0 obj << /Length 601 /Filter /FlateDecode >> stream xU[o0~WXKj AZ^uӤn){&D!H¥R 6P@:MQ}9UQ7*ZL3jIm!Ań&TN>xX &QZ˗( d@vpN[{Fa_ 7"~D",~ڟHUf?R'UHxzhтs1Q;]UƷa($al*܋ɥ9ˠ6BfR=JmC#<~,ԣܢTc(t zijմ ˽4JllWC3^oL rJ~^tcῦ%cTɌ66gM?F"fS?3 *Dx xɉ&C^.Kipb,0"h@L̲"ѭ-!FՓA%M X:I% *`+c*}c9eP#u|`*V }31"-#9VEӃ[Ee;c Fk^g÷Fyn4U.Zpnbt[dtC` cR'PH Tl endstream endobj 49 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-7-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 55 0 R /BBox [0 0 416 278] /Resources << /XObject << /Im1 56 0 R >>/ProcSet [ /PDF ] >> /Length 33 /Filter /FlateDecode >> stream x+2T0BC]SJ5Tp T endstream endobj 56 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-7-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 57 0 R /BBox [ 0 0 432 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 58 0 R >> /ExtGState << /GS1 59 0 R /GS257 60 0 R /GS258 61 0 R >> /ColorSpace << /sRGB 62 0 R >> >> /Length 2054 /Filter /FlateDecode >> stream xYˎ\5WxImCH, G4 r0FU*qꜺr/}*bD>6;<́|ϛW zskvg xP|8/]JQ,fM>GqաQȞć|euI]+>NKp-d\E(jv ՇoŕKu%;0\>a6pqUGZ=: ';K.:sqKWR'LʞK%q, %1]OIL{s"*Z5zT˨q}f'c "zCC`99[ŌdDss3Q;aM."IM9"-*S^ɼ9B`܈NV'a0X0[\m [rRvG܊΢d o%*7T V hnЁ0[)Dq]`PWgitX[etQڒte5l `klpf@Td1,ѪfY)u_q|BA\0j"G&q 5o\Nx.c&aTc^( ܎2+ 7 5DF4[F5ך>] mqV]khU+5US׬li40!ie يhW_IJZx]٨N^$lgJvv2 7 6EjX8)/!!hZDE"Q4V6=BF!ye Rɛc OE]G46y%9<cTn Aho 2ŎEqqǪ.N,/DiuMzuS1tG_]h3Bmkwt \7bF'dn }TR0jmU $EN-nt\&bk퉪J&ݣr`ϔ -A2mr#GS)WtjU㟪6NU}٩QT?3T8SMRϣA2a#=ԧ} 7y}V4:4uB͏֎=|.__<0k endstream endobj 64 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 67 0 obj << /Length 1168 /Filter /FlateDecode >> stream xڥWn6}WCe`"Rlm(m,31YR$9~}HD$!9<3s8Իw12Ry14^N'&q~Y : ToPx Fښdĉ7[x"BMUnSm:1uw*[ȯj~?bQҔ7@J6$Ho.M xLvFL@߬pebgdP'KʬDFblm]9>c*pϋ]Xv`uB?\o=6S+7wGUiϋT:j9`<>MwFek`KVl^FH9_I͉$`+Ϯ>F-9䌵> \0Xj2I\J];Ɵ|/7`ż8ay_.>c? #N){uͅ2&rFg=:=!?q^uސeRz>|bFgwnrLҰކZ- *C"0(~𼇏H!1?^!u""⣜OKMz.>gt?Gsϕ# Y'mW/.{j,wΒ'G, endstream endobj 50 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-7-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 71 0 R /BBox [0 0 416 278] /Resources << /XObject << /Im1 72 0 R >>/ProcSet [ /PDF ] >> /Length 33 /Filter /FlateDecode >> stream x+2T0BC]SJ5Tp T endstream endobj 72 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-7-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 73 0 R /BBox [ 0 0 432 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 74 0 R >> /ExtGState << /GS1 75 0 R /GS257 76 0 R /GS258 77 0 R >> /ColorSpace << /sRGB 78 0 R >> >> /Length 3503 /Filter /FlateDecode >> stream xZI&#(~4K=@6 a/R~M{f&81ٵHJ|2Uw{Gig3qV:Ϗݽ;>}yϔ_~+gϩ/I%uU"yTَo5oz?sYU`rN92̙:`ֳ 6יZXl߄{g=괫XnrKxTy_`b -sYa"̀UXBVa |3؜IndX\XB^l$Y%4\*f:܌%;S#xKhMHͲMl*YhO͵' -,זso\+86$6%q|-KgaC[еYJfdn ÌtBlJi S`f9~`RBZWհB,-Z%XH"dC-`{pÞ`.gϞ.YS)dv_]SӲL Ư1JM );&~)w*Nu0{46%t*elguāA Qggvr{6P{Nyo,S-Q:hJ 3Q7HF,Laxމ $5vmm!sޱFl;G#tDqNxxc _${~q ˺(%?CQ-5!dLGij4;.?c_I&6^~l>ј|sͺ*9zs#ş#7/ai3wsl3W&1VA6Xv%Opxʳ o 73Bhx_gsҤxHI7% r<{xx~ >=/wG5k|ੴ\cs&džl4=GbM$IFd=X|d2Vcd"&  lzCs0eM25$]ZDj l_[J*idPVNH-,.`7bo V&.oM7ڀ= I* O5UvPLkDq;$ֈE0);NoePxIovU5*RȺ9V e Xۄ aJWh"Ol0[ fؖ2A#7}s6@*̱s[D&s?@0gPX=p`O*l H`dY k!añF  $0WՁ``9 5e: QutƂmKiv=^n+/+%YB##p̲AvJlR}k$"uD6_&_Z+57q7+z֛>N5 g[Ue%CavY,l[T"lmWJ7ȵژ;dmB4@~l+ݙJh v¶8S%JM!A*T"bWc*<*v D6&d[jW`\%:J]c;EtF E0XP9 )a=H֢r.UnZTץRv ~zW %ⅫzURo izWUcxaUWESwUMѫe|f=1KA-x*߫ʦEME] V ./g-v5jRx^(kfLmFnʅ8{'G:>KGw31ʪJטTh8[_{Ih9E%l!@:!(#YMրV#~1eNk5MmVzfyF8Ruyd}A |nuuoUe&y5.[||j橷5՘U y~YP0Z ']~3<{(hMHOv W<ɷ?umǹBuv *^<S0 q| V ǻ~Br&)x|]=܏s\Gj+)4䊇\P8W) +~-WO 쁤[T@\yJܾ\ P\&祧'puXo\isȅAj@RyMg]#q>^T]>\_)?M:~ӡQ2C7`C7?2$Ϗo^{tNǮϾ(M>W?'Nj^9 endstream endobj 80 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 85 0 obj << /Length 570 /Filter /FlateDecode >> stream xOo@|mrR?/mZU4oieY1M-&1R}v7lNT[a<vǀ"7 g!|g`)dmM|z:H1 >3rX# !F #MPr^UЬ 5W Axuo[8 +1욣{t7z7zk ).-nd؆\0vIE %i_EM^\Vۘ|c=$);vgW?rWٺ7mgSn endstream endobj 81 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-8-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 87 0 R /BBox [0 0 416 195] /Resources << /XObject << /Im1 88 0 R >>/ProcSet [ /PDF ] >> /Length 36 /Filter /FlateDecode >> stream x+2T0BC]S]C3\.}\C|@.Zk endstream endobj 88 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-8-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 89 0 R /BBox [ 0 0 432 216] /Resources << /ProcSet [/PDF/Text] /Font << /F2 90 0 R /F6 91 0 R >> /ExtGState << /GS1 92 0 R /GS2 93 0 R /GS257 94 0 R >> /ColorSpace << /sRGB 95 0 R >> >> /Length 1650 /Filter /FlateDecode >> stream xYn7WhBsinx' Ylh2򇩅fkZ3=@uOuUd굲{?壎FmTE>_׳faxvꏛjf0AK2396/~FI;}z?z րfȣA稶:u6DŽ2,Q'^Z1o71c|0ލ>b9:y uCx *ޅn /ꗵhjfaܔFݨ촷*{EƑ~_`ƪ.Bwÿc1D:1]|nvG`_:2e/|F'ZC'ĊJd[/I԰1f%n;E_>H<2UAr: z C(P с(yL5 Y $pSYMu4DS0 P&K A( DLwA;1V)di_`܄ v)|W}be$ꔧKwsaӓ:AS"B[T^bu. GBOJ!*; ew7q_.^3,] -#hY֐2mEԯ̓t7*#NUP)j-MN#- )g:B):˵`穚ւBonˁ.97S@k9Fkj A^LIǯWa>0;wW3"wwr/8TP[ +XT1XYP~&o26GL &;8o;c/ŵ~pCacc~3釲 G;?&_5~ᆶC: m0ZKI8_{  L^k?D(S(zWU"=&r^@ol/W} ׳t+} tc"XK;a$$>}^Q %^YX'g[%\Mu> wEvP'; yR?wwRJ0dz3ЖdƸUb,tt i?D&VI-GSq];9> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 82 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-8-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 98 0 R /BBox [0 0 416 195] /Resources << /XObject << /Im1 99 0 R >>/ProcSet [ /PDF ] >> /Length 36 /Filter /FlateDecode >> stream x+2T0BC]S]C3\.}\C|@.Zk endstream endobj 99 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-8-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 100 0 R /BBox [ 0 0 432 216] /Resources << /ProcSet [/PDF/Text] /Font << /F2 101 0 R /F6 102 0 R >> /ExtGState << /GS1 103 0 R /GS2 104 0 R /GS257 105 0 R >> /ColorSpace << /sRGB 106 0 R >> >> /Length 1681 /Filter /FlateDecode >> stream xXn7WhBs_N9>ذ2򇩅[ϴfzjM|EH-^ -> dP$ $t&J&>Oo~=".o&-Rb\~O7ZqS#* m 4Mla{fp~QEKy0oBR{q$SZyߗϣ 0dpB KEc ~S?:1C|ӓavg`_T=0%`1?I#t,Kl{XqL-HK;=\R HN#I/btN y}`y 2چcrWnƆ3w$pWYM n~{),-0s ,@A%s_$]Ro/zc"m]ZhImw]%3Q<%|n{]Nߓv_"{$\?$[ Lvq-3qqz~A e~5R'i (":5{[ kešB"l[)1dDRHK%HM~hrӲԵ66ߴ,uFuSq 4=ik3$G,nH*ZPv_UlV}U_Ŧ?"斦߯NM_l"Nz?[sUq]]HCCo ~,@CCg<+͛W? :pjB;֫*gk|ao:@ tQ@92֞o'a2D ŷ̻싛?~jiG Z;UƓ>6d3dj w";3i8k%@\1.(s $<-`J#7KT&e@C9;Hd{%vz̠f$]|}`Ǹ3\+*[MG~߰ĵ~gCaI#UVlb'ܩcYl4_%jyuO4p:A?lo4&տտZu:em  7K#UVlH?jQemFUc_<ӿt_GӯL0^ĵ~q+XFʼqN(SXLoly&iK\a< ӟ"wUhRW&%߫ʁV#= t,ӟ3h UKV du`"!lh n>|'>lxF(`dplV?wwVJ2FwXZ"XCn\0Z%aj9b}. o}n=ѢFw2]wG7d|)SBj UKV du;>ӂh nuH=>쾧1bkfyyPIX]?Pp[1'7S{ͦ}}z?yS/.\yS_jĻ +]}[qroXf endstream endobj 108 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 130 0 obj << /Length1 1964 /Length2 22509 /Length3 0 /Length 23668 /Filter /FlateDecode >> stream xڴzct]vmUlc۶mv:vǶٱ13<3k~Vڼ^EJ(H+`dk`,jkDHVַad2010@ 9;;s؝N&NhRç`6vWr3fPlh ?66Ɣ.BvfNb0[ ohihiз1HIdl]? [ dPVQP)*)R}Vtu?.BJb4a% @LYQϫ'SҧOO?"JJr"`;8I_>M 3'';.zzWWW:SgG':[S:;);\m,V賜Nf%)sCcG?NPZS/bpGcHcZFIilD!g?9rWR\wLoe8;:9#1{?=3K&- #!*D+9x6ҶձsrsO<a).9"6FB֟ONN5Ֆ66-5112Su#g;zes{gc A[fj` kR?Kigk0ѷr4671|tw1898{{]`dn96&?SkR~P#[+w 40PcKJFژ? VVi_&RgsGQs7c#9s'CTr 'ϡ12_"?s`??gthhic`cKeYY?lBr5.ۘX 3 de#c@Ogcsv:@i$;^@//`Ы q~q > 120?2}M ;l7imoo3 o@7osyNs7Iok7I/sO;ŠNƪFn3wr0wdd??iGueag2qpY?8lOB,rY6LrҝUIƃOw` eJsi$Yo&UMQSȐ^+"g*ru.qL?N0<Hs9T17uEHoߍĔcMV.֏VNe!ACU ] w TO}k!ty_kgFwXÃΒ#߮>TƁ[󻽚kQShB{ l:?YOq*}~[^p[ڍF+67pV0ռ}Fp iħ#u_gZna!L{Umq3z 9tCr" ¸LR )~]So6 yN)ste$-MRiX$Lk@OT733*}6z]qHxC "N h<]{XJG]ayབྷiϦˈȨ~PR ny1hWY%:uF[BW5Ҭ':>&rCʿl$4e ZPYpK4O<&bڷJQSDvyN}gE44ڂoh\Yr\D#4LOx-rmƨd礆.Ey93"1 ݾoXE@B=$BW ԘfÅ iT}D`?򣅄+*̸q*iYH&cJ˷Ä;| 5RFr,I Omv+ӤE"a,ʨkzN#\MFЏ펼n=DuPڪ8{璇~hB6;Owm xc:㖢1Dy6R>h2 fʺZ9]!xnI-quՋ G_ؓP[(8x$.%iG馋Fokؒ"(I!EAyP@[T+DO&t#_"YIӡsE2rB\-J I/ۢ* &D} CC bC9}od͡ՋR9QeƏ USN1 ,OtVP4Pθ-"#u8J2+ .۰Օ-^>'{UA8RqU!mL#8?I1dbMO O.u,^:TCO[Hu*_w8P9D~C&JxDdD4ΌNlkv_*S|PC}p/o[_]{2G< Hں#ۉ2Ÿd~1ţP#ay1ub/MSiƈѯӕp`I0:@C;`<<|_{4Ds8ZTUYf| '֬"رb|7B)z {fɈ-ʼ SDQ7Y֥-9A8w?;پ7IrkI-sbJgc~[-v;qd0}kQsȒx#M+޺beA6y V5 9Jw;'G{8HTq}"XP j>`.X>C:t#k J]ОE~I{<_L7uLYs9G#IX &=G 緲^B?\Qn[G%ܢ(YTE-M>r0.\(hrG,``;_Z{j0oA:ۅK=mVŦL. ^FWb:t%2a>וO|܏ړD()J.+5SV ^pU{Cqɒ [UXicWh1C%Q0 ǴN3`Gtk/Z|%8A悇?o;HZT ǀ >k=`_tU]iE/V}Yrޥ(dnjSѲQ-v:|4z2 r+U['aݖGA:vK,͊ZĽQIFZrL!ҼZQKZwY4yU7t[_wdmPjpj [?1۬@)aa. y[L0{$0Sr^AO^EnӕCV8zҗSD|1 q~W}wVݜjEwf%[ol+-E5dknȜn){9|s+w? -ev_Qu{^Tg 3-J K6y > U *NORs Tz|u(KI=LvƜԃoD4sI@GlS*TJF??W3 ̡',W*'-SK5<?^$mwhPﶉ#߀/rKCêqJ+dnb,_Y'`XRO|RgF@fr/?LB}S"@,ouKj5D!XLʠ]\0jcbfTLt(e,x2۝}R 8]l=D_Tl# [b"U-vN25^W w]=iCHg\5Q`W{'SXZU)|J,HꆻNfz-6ғ#ᦅhg^Ŏnx#_<ԇǟ  ҃PbVͼ`Jة2'\ I,:ieIK޶b @ ~4>h !/b5<&iC`E@`Er(˩k!䪤@KdmzН*uIMl9?#d:FU筈+mDĄ,+ls7s-:,J~Nf)l%Y Bkwt[ﭼ33UqHA,G4aœoCc@pS̓  r);s9޶M}ͷ4EexH)`Pߍ7lMik9|ZTa!A)v/W?j.3IBl_$R/hU לTQCwM%rj8pH`_SӒA i,G)%TWų`"^"8CC@O+2cuXlV؏lk#Ym߶<ႢDpVr;jַTjawUP GISV)r2ʷ'LV T};5˜bgg#0Ih%[,FF[̦ e2w;hKgv%![|!N CxxC_r#o^E>nfO#WnSgO=*lx =^7+y*AJ%ztyh(C|])zY:mjKrf`*rStA'd+F&>x+k*GȂ~M4C*j+]~XZRK!c2έ3VP-: _1 ӑ_ ſLk}Oʛ_ z"  :Rࢱ=e@0zR {oxc՟Z׶ɕXp SۭBl}ޡ&b!7 iXg: 0$:<"f-q ]{ hS9ȻZ [*q?.yQt9:QvOHfB<QrvݕSNl9Z@Kkx+bF3^RXx_>JݥYHh^:˹ZVrll`;+ȯR%`j2hƪ0RҶvCg*%?g@m-+TÆ1xMj($Z@AVׇe`61áe:(PSoOǤF)GrhRlu RտPh~\着{XːR,B Cq8(AofiƷ[&L[7b=35` dJ1]j櫿"Bg_.f>9P 0#"8s͒1B̽ptOIRlGnX_H#0~4=*+tuBȻ"ʻŠ(_6FqE*]^\Y`[妏q&&GΖ]l:j$h. :;bqަ(/q4IFZBiV5v;Sa}Z^ڶLqcCiEg>f=ϑʦ+^]/Y_l`&Pz}o0bKnw / W j]&Pvf[~DԽ*U>?x8%a9uԖ1cA)- KcW#p'%&/1D'kU>Wu x _K1 q#]vb i =x|0 ΁{ًߙ7[\'\]RgvT? v]gv?1.ćt{fq-hKll>#_ H%`aؿewG\M!JJ_cyATSjM9N\T%-'4<ƴ"8Do췣eGzraA#h("$ PR&@fW+;T= ߳6Di;’`v~>_JVҎ3MC]3)]O=̽`wknGJ8>̍fAdTfV6@1_PUd(:S(Tzh|o\;H^Mm1P\f6msr`Z@pG0/A^23xD5AcBUB&&vDMJ(b 1hA<ę.|o넱eeeZ?T,j,IbhLU qf Wlx t~LX!ڈN7+'9Rw+>Z|c#ZFmIae~_>h353bM3"=?g~w UچrΔ4«2} Bԑ1!s_lJȕ.p͝p%r*H;f-uo]yA#* :LQnfM9?Cg~?T0f%|"p%RIX!!zE?ul1LV]kZZŇ.Ĺ*"g,Exte4u5<&Q[ .}K{L(=sBc~^i'-q Хsύ+#_d}C-OPD1N5 I=YM&h3 gL#xjx5=BpFvRJT-dnJ=i9P&_= ;y+C/S\I!9($ Qew/V]A,1+^Jrۣ4BDfU?ϤmDĎ )-|FUHeY%}1܀0a[Pм؁ǜYHb4^6^L"IED/u^d D@)>`4/)2RmYbT:A[IA^u-%o3;/**aҙ.Ld#Wu2<" 6JYO JR{" KתkmuKE>@Q R)MDe4RCZZ\JpOM%(і_~|)j_<0S@?4a[›n|ɉZ4^{tiH^2᧤]7m~Z(;s3u a1vMzB(އGiGc5CCz0x9Yi8 YP- 7t Fm΂xuKh62;Y\Q%TOc> ׇ<҆Rי*Y\4ޤdӡ)ƒumCk۾{u!Wh)ƃ"'FZu ؚ lO{> / \,3MGnPʵ@ؙ OHQ~|tLL(!,"]| ![̆Nq8c[kIRx?:'pQdOWMڅ ֣FtH T2OT˳XgDiUv[^[$>Ёucyh79lE^FUAּOE> o"Ȫ6un ֔3O ϲ܌+́Rxgenv#퉶Y)s; *7홶^]K=ec|}.(:&F1"oNEP;&|;b)>:z5>ji0.b7O\>6O}emg;FØ\/OfiX U)m('ɿ1ƒ n.uL3& ҁ7ί;b)bJ5rObqIpJ ]GdSbHb2o^gQn|&3nK%ѡf &#Q>s6gݣ#-+B^ulwP:u"ǐ*1KJ֥Dw9àC- 篂q%1Iqa#aA^[ |=0H=j!UE`ט-&{uξ[.Fr N%[KxvO7+zM߅,(naH! o6ڝAqӯ r<@%Ez6"T濦8`oeUA<嶒CdVe}!*E_sw𞭻uBx1SVi\PwN_|Fh(E`F΀fW:N-+}~`>41Ym%\+ F䓀Ļ~t+cD Q9eSڗwn>;A}@Q6?āhn`s:' UA`2v޳ c PX|L9P):sS/p})H'(^Q bJc=d.065ou1o:ozXȣr-SBy6VRar4ݡA;FANkR_퉺;Epī!/Vj"iiY>LᄰQf3x@%;+D3MHf'[&&֤g7*x$)"O8AkE}ɗZi DӔ%Ez k}9 `C@Ubf[^ mw99!ġkk| [*q,*Osȱ(a;‰!+~;vֵ W&#[eG2Q@կSQh=$BY'=[2 >ni01LTF"ti2X$UeeYe ~qWxwY\8-r<H"_|Cs"iH; /|(({|MRg̎JEYM*P|-A2_Rz4Jڭ*2O Kݰ|GaV,u=P \J R5 ڼ#*uht>wϼc̃+U(;R4M`Hcn $8+mNKNrz59loeddl@2㎘05E~TDN *^UՒd CLLP $,KfR1-/ =e-Oo\ d`f͑n΍@AyS"|k1+54TaDL Nr ObZ}H$6#L]zP݃B;r=AZXYfGL[w}uw?pୣ((mџT~ _o~%ɸ4Z%׫E#} G_B3V @͎C%MuE`UNZ.&L%v]'< XaӭE?лD~xx=BQ^N#Ґxvιhc3z3Pۧr{5Jl&q%HQGJFyΜ|8EU{-{R85 $4Q3D,cx_M0s~"^jG)AGstk=8WJi,{.\W18B e({|L/llȪ_(z\ VB_[J: '\(Nۉty oo@3] \[2$-u+T킻U/˥H/UԄNqW ׬M46'-,^e!'ZPw^aEPNi?)o|jhFSWZ(GjPQA bϸNʌykvٯtobmj3;@Q3hS7u8YU#%>Sg1W%`cPFx.!\ RIp,$izsI%.wfIjƢ.*J%P~%pbQvBjRȭm>1Җ)$ĨxeЯ)75wG1>AϪGxu0os1ˉ]aLtu ]ed@*L(QUh"&=oKk"~XF>[`S0{; Je!ދjcc&Zpf2Tf1`aV7)PV]ʡZ- ^y!h. Չ )6Η]A1aU0P6,hyo M3qtbHǸ?PU@8=¥Mo -9HP ..8Cπj'@jQ6OIJ[#-g]`Ǹ(/KP PYyH9(9$ESghWl98a2-dKIk; 38Er`%t=n*C$vϽ髴2 }^/4>Z9oMTH,?`[kK ٠3' s>BAJczN_i?XY ~v̕vdc|j,U.- =|nhLMktD;Ӄ֬r??(:t*'r} ޷2aQe F9Ϡ_l9ʦ^%H-p:K<5TӾ_EBJ=v/@TP%Tu~ōr#;ek "e)|!`KkY9]aI:rVyr7~L߀֚)-R7w K)WNx֋R V˃kG#3Deo*Ŷt&jFK+ܻ`&YQ_H{j03]<Ƭ@$v pak;c_eIctu 䪘8rk(gHK+: |i̛I{gDn;[ԲLc:G?R!؇5&g[oռN ,( ,)Q+c/䓯\ߚ7 qKXfbUBGv\KfH^+ȹBHș\rsyjD틈%D:ڭ9x gTlɸ5ҵ_4 (۞|#D9?a݃R-W&b>hlۈ9}`R$ۧWڎB*P4}6AZva q~`UJ,f %y6c et!D\U<ge00gg7pU"[Qac ` ,kȽcCU}9 3ބJ]veEN̈́J>cP|]JlN%Pqmw, a:<ͷ< 6}:>nǕ`-d֒vv r$XZy//__IMƲzY!yN:9:V=>w Y -MgA/2?vOR8c{F!՞̔'-e.lyh 5W=*=wռ~8.CE'A "<Ljl} <8n7bJzX`TAv\b[v{I E1O;;B *;;cd;&h2,+WFQhjBvhAިӄSF뫻6$MxߞePW)ߥ#g6Zy#;M/RY->*=s0RHt_1NY8P?4mZ6:ܶs(vL>GLvaoPOݒc)ȷΏ qIxj3?(zI٥F@Sxw'1 "nZ$z3/noI6EǓw|d lڷ>-q?ք#RZu0Orl$;.xL3$){QJh(|(EUDp'knpO>"ɹ|KDu`I$8yhuir%>H^+ d .Oq nnN!E~Nrb?>K}HLQ Tu#GZ.o5#ڑ%Of~ͼѴz`<D`&::&'Xg `ߴ(_kd!By$"d[vRW6M̅ʹ=;hA0Z;9=[![ܣ?kGW?-m[$VjDaOl8:ɪEX?iE:_NAW$DhPe!,Rnbd (`Bu'2ʯʏG j Tɂ'6Sn>a|1pM3/* ;%P\$8-{72W}b ߵ&7|59b4`, *2QbxA6x!5ry24cL4$2Fw;(>`b:=쌌.p!CY %'iN<nBI#?R}Հl)sBgpV2dyZϯ*-ٴnywD/ dJrucXL9j f**bv@W{{JV}~T<꽖PQpN*h+ )9ًx>=\.$MUVf큉@|ҫjHhoVm[e6iǟTD,L1'ؑ͡S~?`.jߤӎië’S/Eq_yLz 3ߔt `ّ+|F'hǹfÙ?2ʾF%6r./ѦmWKjCK;x~-r6cb:".x=UY۰V:yр'2HҺ n0E٤SvCrMѿyEZN_d,疥[?e!Ieaè&4tmn5IϞ|>}!ز' v AmFX @qw%pUlSRxrF!Pke GݖgI;U;ffdoM>wUB ":CGR#YE, '##Uefp^%Rr=jQи/Æ)9"bgO %ۃphu`PJqF6ty>K43Q {㹞A]W.x2B4)=Mm'_fAKfЭӱ|amڂk)чE u_shsx~ 2mQh/^ ]e@[? ,C`yoXuF0&| zϵ,B}= Ƀxqp*qC"wb#VϞtğZM[ Br5*lfn sLkcnřfϨ_Zoz=ln7ú?naWç$߹\WaÍ'0B_J_3UYd0D)&GIhZ"R1]BMӬ~k"Z6CΕ}9S9r+ eDes{6˟UZ^%hT]т2F ADŽ1XO v qkΏJ{4ŕTdO.>ɖȉ#P5_k]I*1 ,61`pV2;(.BV`(MB_U-3"@*0#e]G#XѴvt3kQM/(p x2Qy^\) N^3H8gˊ7,RD@-&22iLm'xh+ ?Rw 9E,m=F?Xv%4g,0:eG]OSfSJKucE1IXz]г\;#*_jIKjTv[,VR R[ P+=! 2 b*ш0W\6> icXnqsSH]%Gr4ګ][ R,dk(\8d"bG!{7ɦ{I0# ʇM J}~x&6({ *?iB^kR|N%ҌE>L;qœX7B^jŖ=A:BVbfUktfjey+r D W.Ps]ÑѢp~mcS2,k^K{P)=pf iG1@Sˮژ ?F *_A`hϒ>5KT[%*2bAHoV^Ѯ*#UIF[+rQN9o&X"2&sY- 7+.pTkxX*32H$yy6hwڒ-LIExL!<Q!L(]k]r: kPl`@0˻_,cg"6|2wh!9>xqZhz#M,";¾! --WЬA2!4= NsTc@X5!sqRĀJ{Enp<'|t9Jpv9^gϛqŽ R2Y^lÚ9 9cPzVꍆnH@Īz5R6eh6 w n<Nj5P=uiJy[][:B|WCbHyXBV +ҡ7-]M%U>)WGg -qpa#Ց c9сW՘z!z5ܲp ̓ >S?77pN{Km&IBW\NZHnL[w_ѣun45Q]!6rl,B \~0(\vP7_XUC˵7u_LOy&О% a|,!A_Rj,kI4ac%؎'8k s5\DGg~b4&VK19lBZ/;а]eW9~FfUHM"4g`n"*%))Gt 8~L%mbG T\ߗ+ 88!s\o;:8v"Gĸ0yZ9bηs6ZK Ƴ:tQ3¨nVGk^I9)F; gj%|CU?$N>Vl;6ƓQI_ F;raA^` ,<*$8ӨljMѪ4G%jmuc; @f}5\*TAqm 'nxJ@37S>xlJgKt幕aÜ'Z'I+ )hb xZK*n摪\ip6iO Tp"UD}`FTXȺm'X+cqAsa6oK:GMgp\NwO(3e`!/MŇdic@-*}=2mR({^ٙ;Ǥ" w l Gwj#rh%cݲӦusCSAaALG=.o53`#Soy!]?kٽVq4)("8/%9)1;bsc?ufOn獬m.K7lA!oƼoQV=4Z5w1o k7`Cv26Q8)+/Y ߼K{{rQ4dX[UD(6`EZ4w*%P+Qt m8lvpJ ^ݢ*7 ,Q9-/x, h{pTŐ,yGYуe<ZyGխrh[3,9ZIBިd|jK-ty٢G6p%Y𽶜OoTg7c`,~E!|`lCj6{db4kv%;@*Uf2m9`+OO-A}Iy\UZs ʪWmT;|*s)jY kNr41it;pDK<04K=RSDZ2oD} L 6ja &єyD&t2'6G 8u5MW'cn )k4> fmb(eHS/aYsW@I 3E9z5Ճ? @i6jW%2sler+(mvs)$6.[s/)jd$_F]L) endstream endobj 132 0 obj << /Length1 2411 /Length2 29253 /Length3 0 /Length 30668 /Filter /FlateDecode >> stream xڴUX]5 CpV8<@@p%www琯ww{穇*1e.TYAd 9302T@Fv, *@s#G+#33;<#d'n p9[L|,y)R@;`P:yYFe3ӛhgniys{8Z[8;ooQF5`dg eT`(ބjhadcԀZuU U* [`U{{pSUS(I)uUj@7E7u^qR6[K= *~+x+=ftQb"W;{\doK#\BB<E@ |*#2 `%HL? eTǃ8`$ O-_rFHaxAgq|By[ʐ:Ֆ`>L׬`R2O!=Z Q}W.R/"C(&~N¶ j[>aЈ2;Fў^5-wRxEd@eˢGIS4w7g{!h͏-ikB'G0eV8ӒM0Bћ J8kbK_P_0`E#LlB;I1:z[7c 3|\{͔hraFHoz00κ/bNC,Zb1B2{SoiRAF,iWl;a^C_L(`v8DɔBaB-3m+RGs5W16{˧57Kv[<\fpGQz$/ Qj#ob&5UVA#;PP*m["\Sз>d:RcM:ѫkOӉ->% (*vChhZ-:)xsvn8`M#w+4Ahc&"lM/"gRpuȻVEoPEɠ$ʅ;Y)wxbP,Q{:!'x$h|4^1Mkgr8>Y CE:h.~ܞ5@fqt \V :xɲ/@dg4 lEt@%ZF{7Kv_%V?;l l3FIXsG5epJUQאE'~児$r_Ȉd[ mfڣ{>r0YQ N }Zf{{QߎtJ F1kNa6FAWk^l<.>~'r\u̼Il8&sOI씯.Z{^{[ɚh[͐lm3Us> %1B9Ԭ*nq?f>,7 Gz,Z]V5 =MyiW 1XjF5ߖA>(u 3ʔ<tS.V#j2$@0J:3d9M/? 2}fH']x- S>a6ρoJ-z}  rJXϺxx,XSgOJ?ZqߧAR$ yii*}Yfsg;_~mSoylCRk_':$ ; cù`Ӭ7nƗ삏z{.͞!#+~Gr>YqLԐS\ʽA9GkgA)اuuẦH [UK(V51>(qsuWf4ޑ-TG`]|J.l,>`ȼ4E>wq~<pHyZX@g7s| yWrgއ["/뼄uz4*(Ί͈f"H/Z߰mziGG8-݅PA־(dt+tٰeAP䫎Z_mfR]Fk!()-ǛY2*5 2?m1Fa%= sdu<8"<gqOlČZ;;]WE"&8FcHgOXZba4&?˩ӏnGx.K~J A|; <m4 A"Tp] p3BMbU9mp%dPƭ'  +F3nr~QfP) E~`)R0¨oGAZE7 'Oepf#S&hrŸQ6sˤ%\_{jO3r# jfkA8ϼuS0ImK MOu6V"u uř +zͣ=kOT(NV9ciγt.ƨ0 qy-ȏ?Ӗm~,.W̬܂ K!(ƅ7˫Zoʼn)ea0>M./ k{~\IQwGKmV5M3 ז|q/2W74+Ӝ?]W))7d̘ٶ3"ɽf2n.y'wz /[)O\˙;Mhbeg}Uyb\Ka{w3"O~h shOZ ,X82Y{dt2X?36-;A-Lhlj93))wj]^(#PV=q+GZ-|̥ᇸ)}H ߘ=&#EɤgqVW;m4ͮQh2m a#n6"vTG Eav1w}бhOmN (lˑz&įzA#*, aɅAE>@>k eK Юl%8l-)R"vFj2Hg}QNrWYEW $50E+UGn&Vu:8aֶoK/| %YmU{$c 0Þh`caʐT%6^?( #{vWXJti7RfFAOs?BW&M:'>rP컦NN<= xFxP Tx ] QG1y -Bv7pvX$6WXNiԐ5b'JD}ri<+QŢSFB]3~ηR9+sE ruvDƓc߅REQ[E 9"X1,(_=Eԛ Ї4֦u h\D{$A 8&Hk =Ar Ouƶ,oiCdί{^roN{~9pb ѐ_醓o||"w\gg8+Zĕ-+Lx} Z$1*\ْ!jkj͹iY7$s5֗J/ "&ސ0`"jyԡikSQ>Z(Ƨ/)⍫hx/zqk{LS:y.kqAR.B:|bKQ;GБw*~H_6R.6Ǫu,`^++Z'(yS24-XkUWuU0!O=sեqDf j cPz.ͩݙIdA\ԓCH7nU=( 5W?(܎Fl_}rBJo{?QD9%:\͠MvMNO?B=V8^w̴o =%"/jv{\.t&ܒa$]H{S܃ ltӉ[ DsR)q:*d9ba䤍Zԝl@b? :`'n\nk"@Y_j;:-LL嵐n`S2 #W)fy2Q/KxNs->/RB4Cڐ$E(~JLWI%yYG*2?j;ܹ,R`X _k<rAyNbThOs֕Toc-OfX$V^P㪑6.G]]u&=4;a[6ʾ 6dCbS3Ũ!c0oLֻpK;RWS۫Oɩ72LT2NZӓ-gRTYaJ/%NKc+(әOIhr) =7gPD,o>* I\}1~GDյmx%iY؅)ݡ|Lɗ<3Me߇M8[w:^%ř W̗ۢU )uv&'X˭H\e_k>- #Mո!T[RUel0*@!wx=Kj1(MqIx|Ygjt$Ä]W} +l:;qB]4 gzT6y* IjjR'8ƭU={`1}3O隒ֺ2`OԌ?9ol@836c04"PlE_AO,&3Vr{U,{k=ρ.Fd w2{0CD%1gsyD$j[G~G*4S}zCd.K\5 OG]-Jېˣ; #+gz4spB•ƘŏzHtM3zߖ-ƝNbe{⹷aY̾@Z~o$ 6Nì#*sP-7s6z* "u[yN.[N>/ yAUcnDP vWɴDoOKЁ@+.,>D%rW#٬C Sgj3 :qHOSҵ."#ϋFZ7g}~(ău vEg+A#[x FPz^,O@Gg eqbA ^&Fᮀ ]]weF!2*!X2N{Υ|q7P$g]Ǹk6ROyӆGe09h6~{\B ]DŽC$[#Q- %d~mlW#}vEMeӂ*gy?9#eo| -_]jS 2CCMlJN9_*O>e6%lՀ{SKutF-49e>)۩t`"aEJw aϲE'IײCi 枽 Z-txHQwqf tQnca{/Cw>D&tg7(Pgٿfy0p .a B~v̲J2A~XY9(bKS4m|k9Lql<ܚ#vcp|H]}ۀoE^䄍5%sQ=& ] RL:oͶrG>@l۫W~ǂ!)` 7_J8 5 M1k y]E%3K@ͽJ~G;Ol 38(o%c%xFUBNCvɰ"<fDӛs* Pq.fɦh!N'SBOu X:_gQ%zY)~7u*ȿ!խX4VeWaƖoy;Hi_Vh{ fO4"8b_ڡ%Y\zp'L& #'ȩ*]Mq^KP4/TN#4zztJ^ȸt<g=sec"A s ䷜@Fٕ׽^aSsH0(*jt'lZ{9'êkfer!XsѬ/~(H\,._|5Y-;2S8pAf֜Oѕ3 eVNix L;XE!~n Ɯs/0Z# #\Ɇ) TK`p!(tǧnɳ=^M Ces(p, w]*\D"!qxoK5/0=(W%lXGX5`qKH ]צ2E[eK!s eY-+Cwp& ӺGya3, s!TNqNjᙡb5ኒ̱N$Chk0@i.펍͂9'F^O=+Í&1V r[3ANu'ᑶWpDvrΤlw8*m/ӻ>뷻$)rXVeK)O*RŨ5y0=9:ZykdcR@{(8NiL/ZU-Ơ&"B9KF34$[hN%|1"`dZߍ80sicG~ J5ױ"ת6dqK By4:?$/;;uCBm /.ӳ#:+vH>ў ϗ#mXsǫ6&Xi$_uQľ"B_ln?6ŕLyG5Nb))_7Db{oT8>q@;|l-Vg2 sUy7/׸T6ĹAO=NP ҇r(9,z7F>D.8;,<%~4b_􎔚ry| dρlM\WҫHzUp3`Y2F1nn9=бpu DW&h 4U9{K@4{"Sh;%Tiq./B\s&0.@ؒu0f仱_h bd=4-KxnV"xD)<#6k4N| ʀuƝ؈h\+וɛ9~x|}洼,Uݞo TzXeӧD}.WHKKDz=}(C)^V+e9ͽD>vb9K z;)w5X*E]d_ڱ) },{JG{ 3T` >Of^V?ûq;?bY$֎_,m6'-|fS 76}vMCj|Nx/$%'^-sA˷󑗬B])_gdž4r%^w$Q{r\-y(3zrϷ%;'9$Ь ~ yggkotq>,Z|!8MPiWq<4l ﺹ-#9Yt-̌\Yq.B{+4+ pSQ01R l[dώǙq/ltnڇY#heqg >ZW.U<$ḋ?Csqjwo/Qu1ꬪ%Chگ$<շ{"[-niT Uu-ctU*fli:mP-!h3t ۯ 6 f͚Y5Ry4X,ECpq%sn YR-~OXQKjC?,I?$]6Ta9TD#,#lVwɧqzLc;FC %;zH Ε4sXBb>YcN@Ħ2r6xhK1;?;,z<L zDE+F+,J  vWNtYM/ܥ "76ɝ<3seog!,إL֡'dQ2.JFs6]&G K\5keɏo7sok@粁EV'`rΪg b*E`7Zs@*>amד39/)1/N)tb9JOD8}J·Gu AmemKܑ+4MZ̍{Hɰhp;Lu헐I-ؗN0CDS[8^~h=R]㑉NO:U[VZ\nȖrZ4ucҪ6 а{;(C½s& +a1CXi;-fTCz|p$yX%HaȱsE\w:O+fr׭~T[!"m(kM֘8˅b=8 /Y.v7^{uUb2;Q=sSa1Vǥ?jeFp9m3:,!<<_ fo\C2h&L~"BD">-U1/|hs,OP Xj,DZU%Uq ^ cqTBN5sD[6õt"HsX:u=<Y.a1`W|h (Gū4\[MX柆moH½#o蝲UWn&wf)w<\ ԠlH2xn#YZ{V{6/OG0TnoI~/H+c>u، |zYT|-xHN8UꐢUF]_R9:hyo;!ɲ|^4I)Q&J |E`zC/Opv/*Xp 񥺬KV0_x&-Ʀ 1fC/<?[AX3g3u)$Dx`7u)8 o=zϫEGbX}<UIS?>K3{7'pLT걮J6BԔټ3\5u`xdfN%wgКxEr3>|C]eoKx_5UOv"nYCs`Q #%k) UYXu#Ӭ` !"Mq:k{!ܙZW%d97 EVIY %n \I~RQ*6ET, fA:g93{P.^IdKΈnIYz8QN݇w层! g'A?`ir舻y*`X2صx?2+Ht01*/~$$ 6 Z_ 9BNZovX*W3!5p}6^Lu}uMe0O\RBGiNt?Ogt* -Ä,$fr&Q%2sɨ""%BY6lO6stx'Fv=GՂo}å128%\ !3'Rg|>\4pYF auu" 赿/٠Lpת|7о5*<#-f %S+ ~k!LSJLA$Oe*\>N{d/PziC"D$,[4b!Oɢ#Zt"˨RogsRYlQ]Je,sjlxE;8:]/t$%q:&s`KK!Cbjv.h±i%H\T`յ$qm=Z?IԟKV`c"7X@=4 cإfs4„)V/ V3) KZ/&M|璳zDg}+rsLԇMnnǴIup_,kw, S$/gpE'DbֺH<m:|݁XG56>`nL}7#eLBSG VGL_u$.N95\,nlY]_'Hz *Ji׺oֺfyq"~P+ܻ=C7ٰQˌ5x:m;m2 N:ԓ{Tbڡ ɤs N DLdؖmˆ+w9+l?:ƺG煏Mtɱl^T]ZnA^ė&S`LqIXьblD-J6Jq5<T񳳐^R ;>+6Pj" uGFM|xP}nU$Av/+us.i;΂FPq89l"[7fxN*OLNj _Oz%$+$Aۗ.6A5fwcH3"[5m^V_fMst??FIO@l} o cVvI1/ZG构c,)EXY <|a4 ;ΑpnÅsP78?[̙FŹtYHzʦ X14Lί᭑(E##…,[_XSczSžHKӖ AEނC<'™(3&=SfsFJl~f0 x7uHEOӗGyBbHz-15:֥p?"I%/r;UJPL!g#ah+f]|zIM^3my}*qHeB~g.O]97ZwZ\}:iY.'5'7GxV\S"f±/_3Cz R$]`?xgo1@cpL f5&c-Ag! ݞ5sP NJb4'cs h{EL1vf8R)lxU)*̯ۈ0Q/ukgˠfذ]P&!CO^+#W38 `] :/yGcFb~$"𽴇vs%,, Ljc#[[z:ծa2˱첍}'FBɵ x_!LL? Z0"H"nggv\:pՃ$6$X2F)a|\56?@]WI "}~^lW[@}&b8@[Fk 6+Ɏ׏R*EbpEF:iB#VqjI ;&~߃ȔOP0ި(yrǗ!AhET=aB;MrbP% ?ޤ>GӗR`jM m}R@~SPɨ˱ k*-eernN[L1䗱~5,}CNa1K2qP@W&iP^VK jjEjC Ȑ<p5m-xIg3BԅgNZ0Sc> #?^ױ֛rL jAh7nO a;hnUh6Q RzI&]h˜4h e8,]h \Qm;>-&_kɆxG٢[pQtV!yYYQM+aIewG=5 yٽ{|aѿ%tXP]h&JXuR=.ES9C8jT۾sD vYb[h^&3wy|x~W- JStV˟N[sshm>cy8мn@G>Jc)*D|98wgQ>_lWjK-5*&f7go+̷[qsӑꯑ}I̯eZW4E7m›fNhaɠF}fsITdY.WC>w-];u"xGBA`"t%3ϕ;Ԩ.Ԍ FYҏ<$`>ȯ$:fum܏)?\t]-%@[zenH>߂Gb&-fgo13f[o8~- RM(:THm/& K3b4gR2 450i*f2OvgS>kGexʐ^T ̮' P\ErnW𱠺Zk՛̰hm!o=P*2!R9xEӵ %cyǣ=v\];^O\XrNʳ"vKXb+Y5mG9Q//,tXUNz'?n ˕"^MocjbUv(%ul7$X u$8. vBP|k)P$=QXe e"v!P7t\(rͼ>k=#%. %T'2n0v_19[X3Fl5y&4QH Q/'Iõ?Inl1{`NRG_ߔHUBjz3E$}^Z9u&}F.$;tRT[\o˽OC{!TYod??!XgØXP+葙k(RmdM[Hl&dYaHcIfzWq0a8O7p=eښ(]dže*q?ucm2_m̮xY,ZOrf9ZЂXS'k0Ζ{dM"Gq-p{B{ 1&ekQ\ ۰&#eMZ(C-ݳv{dAz(tn;HGZx[­7`ݟiI ]2g m OB9ΣxNd%|il\ ʏ9c 7Dž'vIK2R-|堐QR܋H3JjX&C:ݞ,?G*>2 t{Txvn=( 'T)&d=^ ipvu u! 8DP#;P2}Je'Ǵ(O3;wmL|žG4_FVef9`l7zua?R\ע+/w^CvL3yE(3U śrՇW&6UW\QO+%w &vKzwV`HJo@Z:pY1̗ ]4zm9!p_%bh|,]NلLퟩ[~_7_*|;"Qq1MbŘuvղ7Dީ{MVm+cQ%=~7IM14&ddc J ˓x!-ي%y1 ?UH63 6|=.m]8n"2_1} /*OA.ګKU@eMcz*i%TS! ( ?tWras9?s-bm\/ByY;Pȱa›۴tEw ]X\U6Ye#}rֳEj$H; Vy L</QѲru xJ *TڏIB]b'.(0Φb$Eؤ18+d-JF =TWTߪWib1JE*ȇjnόLJ#VJѯ`~^))fEIL*$ظlU`< |"DA{w`FE@\6 !\I"Bp/֣ ̛As5IHQuu3?Uľ㱰eJpUA&PũY5]J`O0 :=zK YuwƫX85+_lyt3}F3 ` B(E] dknZ[g͖֔ A+0H8N׼;@P%UJT`6v)|JZC"+Vo4AAک- ^VpWEue>,XZآ!4EF!$ږS-En§IEP7kR8 '7O"爎r|QP-CAח`5g~I܇<: {)!BJJ$%'x'HL ƉHl[Èj%3 'ZvL4Ud[A +b~Iẅ́鞅E[(F(%;S"Wy_ٛm:"`%A.,COO6lƏip"uh@?wSPyljmZ\ mWˆ\LBYȧd o!![d贙MEbR"|#><W#.ھO6` O|oZ ]n3zM:7.dߑݰ7#hPVTj8·hSlQqTHSjr+JC >칻a6M'7􊙀[9[z.{)Eswl@U%'#Ùm1{I(Nc\<,Ra")krW<4?Fv u隥sM4Ě.(i5h`{iUlt dzPф^aE~4Bd͒x/k@! ض qtgEb=K҃fF#-rl{&fnyoEl:crbLorU~*8_:YCzZZ)(b!hU*;4ZA+;wf[-(bդt<ꓹ9SxW6EFBDS=dF$و.gw䑔MH|嫷L,"fBN)OwܟqDy2Db Q||*pB8|HC .һ|Uΐ}P8nà4oStpRPoqyλ;"Y~X8 Av`f2Oz ^"PT}V0]Ќ>c҅ 9o?ds]q:WiGeL6l5MG)~jC[ _G-c'bQoU749@ RZ`bc}G7-:1|41w68ݹ~D᤹A@@IT99/ct/-ܡxf= S7ATn=;h5DZ᳙en[PKw~8W^uF^lT%2Bwl* `s C^ɎYw71q1-Fn5]PK``ƈ޻n}s~9\LrGW'@W%torխv]8BcMEi tH'X>"ꌈ]4tO4cl~ ( ak+qeN~'*CBy^/n}sd?Mpd'qZS bHR W"h׊~|يR\ 9w*<\E@,)7K5i^p*<$9R32e`S^db'O '+h.0ǻM{謺rHQ}0a.9F=WX,[?34T XjJZt|P 31Q,MR`3kscM;qz\!8oŲu: ]~a& IzLs;Lδ^ۉd)(!.=IID!6H@5#X?PyGvބ`Uv),ۉ-GJ6eC^V RJX_^^*SEvؗ}`O'l2R\ΡFnhAU`ԂP\TfEl5%T޷GF AaSduފ5 zUb1p,+"/55Y)H"gzϥhRJm1A6'׹}$l,zUG ﮴Hڲ+q?E2Df+ ;=uΪ#L>mjn}ہ|5ɄdFEJw5*,!uv?)p: JU=uf}BEY.GQjKI+9ʚcb K [mMgm˿~"ӧy, y'˿*1g~_.^!ixwk^ pqȧlUlVDgrΨ܉♯;z?v5s/͌#y|}lcxXy\Yw?,EIxtYtMr B_NVLk 4{jfKFNG֧I9!EvL1|ҧ, r_$TBrm&]ACz/dd-Zg*Bi>>>$% ͻkMZ!M$b |]nS&B}7jI`DpF0k .qswFșr?9+-5sHnsrX/q6}I1He|?QSH\-~Z2ш;8aEҝ@ o/KOHUfw%u7Llw_b&aŽ<oq59rڅzI"lOp>,'AExuI~:  d ,;;'V);Ţ$V!wTJ[X7^8P&P["vFc> (.-w'/RE .ns)1[3Lsy)tO%gyS4 \+#Ҧ>\~^j"T&JOBH<b!ַ ā-4t7\b9L.VpHU~*MN^_"dơ}fi H,ea;6:Ǘ얌%//*EDTbF`|8=s {UJwEts0=V/m פ^ S8;|xC^PtbBpM*-LIu W] ضM LrcοdS5 ]-a-o|Չ7Ow`+~/4گsjkͨQ6?Kd8G:A=/Ͱ].h@~8-uJ Rt0DJqDe{;LZC#'e2WUso BK\uUi9P)ê{_ppFifU(Ġu3s0߻R^nq8rQ''yw7Q?9bV5SnF_et&MRN\(9&+{6$$5;64@ b\bt1ER- o0>(]˕Z4ɸ";ۺ ].B]؊_{ 8ϺxJy׻\iO/S$_}-Rdm9J7}_3(XF $f{@anxV%3Rhrw([繍@y<+4~sh n%R(^->w RaeuE%)J<)W"=yQĠՃqkm7y9"i:Uoi=J'4so]+G_H;DXZ>үѶmzNw6oq׼߁moDT|ʶ?jg]Bӟg;P//p vlfդ*IG?@}fy 4MёK5W tiz̐߇`+-/ ͉b=Pw N6\U(_~-Т`G9b\kL+RjNAr3dP^-Ơ;-ж / ݰLș1׬l@/p}@p X^0F;3h9˒ 朹L.%'ZNX78bIH&[|M58k}>AEN2DҐa6wf\ޯ;=s8wrTչqhU-:Zѽy>c <]iH*\(&G[«^] &yIF"[`Q9B7n)9 AΛB$߬ thjSZ,#! APU6?t'.; IJDi?5ck|Fo1|M s +6z{0Izh{\GI<-|S$k^53oӜ˄rf12^$1HHءxl¸[.'YK_.H|CO2 endstream endobj 134 0 obj << /Length1 1933 /Length2 21585 /Length3 0 /Length 22763 /Filter /FlateDecode >> stream xڴeT\k5 xp+ ww Npww \޻|Qj>:#o 9*H֙ 'bgefWX, LLl䢎 t6(;[01qÓ$A w  ry؃T3] 5Q{8Z;JO'o 503ޅ*;[hm 3*IEu%Uj.vETUM] &&i$UlqWVVgfsf+OF 7wWSG;̝y\fnps_A֠ bk^Ngsп @d$a/{)ߝ&^?1ep#9/_9%%9 d 5~7t:8 ?A&"8:!*_"vwgtm]ş @_499R _߫/QVMTNS_vv&fv> ,/65,F[;wOC9D!N߈ (o`70&F?{ C X,e~g?;Gxﱜy;r6w,&g0z)9?{?_X iay.0N?sgcaгp$bff_-p/s@ w1ʢ1oejSHxt497iL91n s4O3ȯ}´]#@1O8,KH9HI%Pٟ\ _EiY'ʟ`\Tmmpr:@?Q - L0Q4wIo~LjFDtN+%Z@6`.J%%(7a'%h MlUa ɝ*ܓ1S`]Q7TX@TL1GB!rBӇ/XC)@257NJ{-ֳՒlX{6>l.cARkN@gn\f&gܑmE9W݃_ӻ:,K EI@{EqA>*nCfE2Om@z_1 }q׺) IFQ'\Jt6cPQ=1ϫv4[N筣6UqgO^fiZt`ކΆ7m=#>zؑEp%rz"8z[LڽҡqvcF q*Im1[H6Uڨt*yO.xmI9+~ {Jl˨H;BqFy8`¹Y)f72Xrpo%6ߒƮ.Pp}赦Hr2Q)C|%L2~L? &z~PC5=AzY{do[ݜ4Љib5jԋ װwR*K7lPguq_K Ek`&&J݊HO5P@7I.fv/ cz}$݇2<>Ài~듉XPTcj,otN#R0w{o z쁠sX,1NdT7Yi[">A< %1-m8mJ4ꯤ+"gu%ᙰ!i̊S-7^UfF)$}"|QwK6RWG蘐=g;)? r319`damvq%uR5;r&x`%}tuEhhKrЂ9Fzj8 ܒ-$=baZ 9d&U{vwvmuҋ&W2,iWwf3—nGEc#<+Sp\7Csƌu0#H+h';%pc^yx B鏅KJ믥?vdPb 7xhoFy=-ŀM_=OXIcQ 7 ZBA(+GIu:6բ/<"M썥tpx;P҈ GbVʐ˴Qrg鐺oԋ^t5k>.@̓oȇ`#|df_= l@SWqJzq wj7ve;ħb02TlI"ί޻7>MͬY1#3F6,:E e])v#B%V|T>/Aݶ 7rT來sX)6FEXk[01M!㎈3E(ԏN3Aq><'*#S >vS;%x1~-~(B݁<9ڛ汛L IZViؼTګ=_\(h18oB^=HOF\=f2:0!NȖ DDi2ؽ("u%mE(lF-ID-CzCFO ĺa *MxzY$6bt@.2j-8[VCU"O\otiS]+3-Ƈ -^ܭ,A/xB\6奉e9t&.XOgʋBKYWgCI979[HqTd8-Qp|fXHr8d JڂE;xkf`fhb m#:1P2uˡҝ+ fFҷ7D啿˜\ ^N)ܵ^w?>R"+ߟr8Ṃnb~RqpR;^~0 LQ^S V=E }>T-Vb>;[צnīmVW^/uSQqo)UP BC1/{B*]{ST|}D3إ)3Z!l'ڎegrmv6a-td=Ln:2g@5)pUO?b/ _ ]6 #,FWZGFߦ {*P['%=aN]Q$ܰ[)ėۄ E)-#AӞ_%4pƜH2YW[iR # ɺѠn \T540mI yФsy\OƂG]e (O~*ͻ?CΦ.-|Q!(z^( Yvպ/t0og ve %ĶۣPO FmKx"۪?Gctj(Q3;2r &)DvbIܢA~t^]"v܆ۘrހW$'ɴ("?\cBQ +2n QeSj}j"Lvf铔4{IOlׅ]BþįVɩvEYe0Jѣ6oR׿?/5f拵59ߘ4tX0cwUtMZh­~YgIz&Vϡ%^nY8,y smaʫpE);$lڜH&U,F`4~%O2ͣ )7oo6!VUDq-X>`Yghц~xD%GrMypgZ(*!ۣa&5gufSp3٥  s_4%ekbUY TClY v$a=&4NqI_@=2->Xֲ=|M-qL}ĂVnUpq9kJ421gg `qKhD0B:8۟#B \rHL`V?PuЉ$TYě@bYoi=YΎr I,$j,t:`ӍsoCÆaKϘg2~V9 ̛ I"ܧl坰|My:Q]9; r'UZ+- ar(n1|} KYQ7[WAoIi5dɺS̻Jqp: 2 8crq{ JzH@ ӎĢh"biMXEƽ$fQO ]UǟGnD(^~]_B +jPqQk$> Ϭ4ʨ+6rAfGnzOGk/0܈Ts6ntTTXQIa)p|r X<#-8-}2"a %U:ljgv3EѭI&}H*sRg$m3s\vZD#r% >likЪPbۻT.%*x T#!Gs񱿌qz9tO!B{w7+!O9W>owy|aЏDbבټm5cӀRIúU6b6,~:QfTH5*pAt;80SiC@˼Ig+oPX~yS/hF>`ā)c# RfzJ! Tui(A8( A$sˑЊZ(͎*Bذ;'zmI/OSGӼi/T) 5ߍ(T_I52kPfŦҬICnT4+X ?; {bH)#d~A-_ӁK#XMu5=yziyi,iuiB/<$ԓ@8`ĵ8lPUg5@!rjEk췙|q9 a4UۅQ'dY0˫w$=-f6R=gUT' ?ӕ?&J7vU4E].y hgO!q2XtO^M" %XFTn7E\.uȏK7mnR5)p:* g?^S-:_Av~AU>K>=?OGҌq^ m`Qh!Նe C# =O+g.M*Yru1RƂ{S-a^*N\.dP}@;SADn؎FTMtko0pQ%uRShn,% 2+IS@I P0 Hjbz)UFr lTq.or<:55|&I5m"?[Z0haNnz{vRCK0(_YP(DPd0l*sWog~[h >v{5v"7l"m 6/՟z_Z.pZvy"J9DU3m*+AF+p|6 XNICC)I"7UX$%@lտ4"Z&S+QoeQŵBn5)\FZ9ͼgSz½Z݈#ue1 "ljea3gSZm̐]KzX?IZ (/nrX]qFW& WT; /zTfFbA,g*/{8/|Ƕ*;u~Gpwk"AXsZ{XǰXMʌ#B( L. W`Xl+Z4?d7>p[{G/U¦ ߪ$ZzDV>M9Pz@X+t/>zoa _ v\YjjM8PCp< l B {gn&_̱|bwr~ֈDϱ=|׍JweYcAՍ9Кh2-ax%ŕ@oܱnYXO3~ J@z_SH0Vi|6"MG9οKVqmT`=ےӭ{GwDa3d sC/JY o?D;^L ʩ6 L>YLg֊o 'p5 P4n{"Nkё9S)a&{tjaebDUڟ ]Cd%T*ܳ ˧yR?rЋFC=m(κ;byUE:lH[;!_v Fnzqv:5.4iFfFVBJH(ЀhhUOwkmBz{6$ͤ/ap4,h "UtɍvW%9(௃nyF J,7=2#9,!*qq8LʻUS2D+3Í KRr_p}#p>|L?]*LV=afa ح_;rGMB#Xܟs)3qGrsS: ^n>ƭ9&aW5.Q81拷=<0?F( Ѝf, uQF`zy_N\6f50j"rB q׶qCA'3C ɿc-ZtFnWE X ZRՠ+;e$)HK<JZb>k Eb{SزJep f jr-CIe۹!;ժ\w[jyY98qF ?z7r5VѺzЅ7o%:!ouD_X ]| eyW" B3\e.wɩ 9$lrW,׾_=E[D:;_rؔ:e(mvb-8tS$P:NM7Bp؄ùBg-P=XNa;Zs8kw5B jruV;WC&#|& ͸~Am480nR/nx} N%"q,H)9zBeajGFޭtHXIf8q\e<<8SvyI( !|J3J մ&_\[?\]<2 6^XzTߡ׵J{Ғ$=8@ԒoþzE`hEvc%o)j8 ߤ:^ESM׉˅ʌw.MȱjAMRjua׭et'N gnI> 2)57H*BQ=~8阗1ۺW~7r+̕jfjƵmgzob?;ЭǞnYޱU>.k!^XJv@de نB%$gPН i',]- =ٌ>a1i| 0h}s8!Ն=ЬE>fb~Y,mq<ҿv9e3{aiWvabf\>Nt!TIk||;{5CFg5*^wjY9em:cx 19:Ь1#Ɍ -q[ʡOCߋ ;sAۧ?e{:nȔ1M >kMXei[|$5ʹ7w`f?弚<f܈Y((9( _g ,. $Ie,E; ɦхi͒/&ן'MEԭー{X~ l\c1-,{ Wԑ۳l<b[b/ŽO|my3{>FIduGjHY ]>/?0=%^NzdW6.# طHv]5IU( z`ol,~6߶c)R(u rCƟҞX?p[|@,xE"~c~ϳVj4D${`Ň^LPM$\~2ҀKt[Z&Le`CCF"`Шv͝W/HPޅpe;'34_81/ͼ2$</G!eĖ~|< ϳKaZ3vrZԠz ;>_2JwP=V )Y0zv}˗;uG>E]`VV4DDߓkre Uݖc VLS)B2K~ou0Mj ns"!0\=1Q׼gI!s<RX<¥&SB4@Q%vя8fK aZXF/O:HB؉$QhL]&9PfoΔ-|Cfg8x>  Fn RYK_jTI #MK؝mFڋy0s﯄쾘^ZJ"?EY@3ŗINK`^#W #V':$_Q1dqySLu,ͤ3b]{|B{UY>X{NDYDTṇ/ڃ?! 84\ċ)BV/:5}>ՙx/,7.3 ;hTrΨAS/Y% 9END>idjh5 }̒d G]#kmMcSos4}p IƷ8ׁ|H~4aCZڎ+[ SKgiܙun+eS&{^R* #G {hkp  3ʕI'gBFC9:l|j۲Hǂgux*]Hvqipj0j%l- \r)z0=9`}֮E?E~iA/ʷ:9{[c^Ꞹʪ;"bC[r&PJbur(GP`Jv 3%>9F?{@B"9^N"<*Q_du i"""=)es:iu(̍y |D"Vt(- I[j}Xn.0iFDZ'˛q̷I'{],eL%TPT6.Ǡ%_j"GGj9۠fуQBLquj[(о @TAQN;C-[lAvԿl!%P`k?yVJ ^_\#%10d>Bby7>ls&te`Bo`Nwo._<3svl!q\yj|K1S\DV2WEbP_xl4QKI7Ydtޑ& )3g"i@Nc)u-磞%wlz; *jȽ.eT=8VՋ>̦ 6ﱑju 3f/V{rZu |3"0kG (ʟF u5'E$1~FO#<]/xRwkH_|HNOz:\LBq~Yg%y'hZj E@;qr黸;y Pq FźXGZl)1].nE0g0x6xFJ}q|0+30ɦ2c?kkʼn8p7:Wsˡ̑e9wXQ\hԥ~;|XHT,^,`9GDɎ" 'o^{I5f!_G86#Em*!rVZ!C?p !i6B܍@kxn%;e7 U^l  EZLu ` w-!67G9n#][b" T^caa)ȟk0O}ܭeA!6\;Q LP < I/'XA'^xn-s6tΜOW@F. + Q2ιTqb#pBcI$Muhk#Ad0<&4O{ ҁS=6y ^T9 87 ~l>[Ž_0MLԎό"+Ab5YE:΂9jyz:]:e-Y}=?cf6+R+Vww;Hj|w#I`y $8DdmE 돧cmlhSRwFĈwӘd}w#]@DO|vs.R|{娯cùxBvӟ K>Lpt@ FWBXpLX'qߛXqqK*ʔN>|$yteUQXp`%OJXYgRRrb uA7c;9cBum\)y:Y٘ADQ+y0hTGyӾ]gTnrzQݸL#lϜ'IZ ۥL)˝l\.n7lչY͎cKv P,pԧvѦ89P&LԖTQV< k=.yOEaۖ7gC7p%2&4u<5)}1̡μkX4T7bOJ ?gaVXm $!:31ꐜH.4y4H;|?V {KƠ$bhTB<+Vr% ²v0?C}cKHKB݈gFQ/.”Y5e8 pbQ]fP{wazE!g|=#06g8E5pͥG֥ w/l2:wnomXIW*&$Ɗrml0j8h0 Ň@S(s+Ɍ>+KbO7-Q I)~15E-LY/!XV@"߈?@G%?.лK?DPP07N 5aUN h=R_B,v`l߼Y{lTv6ݟi ]c& )5,2n?t@a/S(6>Z~Q Gm%gtTH6]1Kcl62*D9SiL42U;`dk)4<.nY^ՐY {@- m Xdusې__D|o8Zc'F]<VOj#V''c*`Yk/m7$7 k)F29|1WHi4Nkm)~6)jm:xgIl"tO6=O9i? x Y5v\_~Sz~8^}j\nUkd~5N=9gP,QJa?1oF,tMwt49]pR )1HZ[S@#5%Xѻ Nl`̣1bE$iatf%ϙl֒-~CEFE;{~mqPrʩE7X3)8>8?O2lmeF&)ź3{,2@>uk##i䑻oWeR5b˺'_>Dgl|KG/xE\V I5feyKM) AbmyTԧV&H^_Z1ን&=丙/]?5, %fGQ^6T#:_V-&T'LS}YGv4xH`:0FV.a<")\9'\nozi氪C1.+ؽ)Dփ# Hk)a$?C< ~@fRX&Rvh8!Re[dR|RuQW:v*{uʂ'ҟDg$t.qa]=agFaKv(riTISCV YU-nR׶YE0ZcFb`(ni{NRBn 9x^k=}`:%og}~mwPmI7xŜ0vrC;s)1%dc3+b He/Q >xT6QQm.Ƣ=vb|o]Gi>̥o{hq!Pq2QE%M3ZS29ȓq_>Kqe9P+[u^uRp SUҕi< q-(ks@a.;0/ ,xnN|Y$Dzy|=ffKb|w (;0Dfvx'X_w&ߓiFoOGҝ~œ'VdPAg8WWbP)-sV!dc׎xgZC"5MD^/ܔا삶 t*ث#mRJ Av9VNѹJGb9ڕy(~2W9{K̠&ad^^ݜ*&S^=Y4PklwmXX .(Z*ruDiWjDwʫO8Ksi-*ۛפf|sVSLK@jQpeC mZ{DLɒY_Flu*1|LF304RMP };W&f)ꈧ7Uˡ.\xQ'u+,E?haj;vw4hCVcc[@9> wWوM9(5=L>$EjMNZ#[p5-_q4ʣ!ed+3W)k{.m ~F3et⍇AN?;9ྐ4G/^eϜCl"!lc^ eB`^T)ުJ59 as/S؅(ŵ)],Ϡo]ƕN6d!ih|w}!pDY>Td֕%7c/u-%"5W }~nSpc ív*k5_p%H(+)e(/i{э3vKR!H%& T =@l7*}v]b'eׇJ"hFZ_`?Vg[-eIዦg"Jm͚s(k4 8 3-iqܹJť4pPW -3FhX@H8uVn^zkZ[dC4`Ya+N3}|PT1]NXLуAѣ0;1#fST}T,Xc9/Hr@uzʴ,Q\լ_Fʚ$-s`'T6I"F Ce De&7u1IqoR#7?y A0i(ʞ#(TvW{N%ޱLjgP 1~6hmGYbCn:P/Jb5A+O@+[@XhAǿl3a*Y P!O:#%#fh-D_vLf;L]ϲ>ο/.Ok(Fo:%wc),mR UI(F [X+"^~|STF:¾LaRhebɪRcNV w[ ;CUOd:Q؜n xM2Zp!@${qO#c g RK5'aA&ٕZ&̋ j7ݯƧT.o_s4WB4;M;qd3̪OUk_gE~Y:4ʆ\58 sc>aD0d?b]46ICm)/2k泖67ay>NG8Ir]Uˢkۜ6 nn[V@ZdNbϺ7b't ( )]SV?njds =RK:E,9;Y1]7 jpsƿJ ܣ\)TO%5>Jx2 Y)_n ~CE|7A.|ο|&%|Jۺ't<"RH"Ta.ȿZ!K/ ͻˣ+J"j{߷^o|k݆'pDOTqPjOK\EߓD^:gA%a){"2 G𒭯[ӠWt:G}ϏJ)>A%Zе; / 7v)tEBVWu:EH^BPqq䆜qQ*(wxh)⭠9jv }ъ&7Kƕ*WW+o$i{%g"-l1?+ꢇy!E> 2z!LW"ۈ6rߛ1^`w5{_uYpѼĽ5n?KS|eth^k-A]q7(?3!tT2W֬!12̇IB &L?m DFL7,9],eҨo>*)*+g#nrjLKhUJlw}7]!$,DE*?%c<`#H.4 #oh ŠéD{#-Uq +<ʱ/T"qP[:tO"ڠqګ7a/O'goa3@ X(g8́4a]1:4s_J1dx(1O>&M*#+hu(7XJ?|k,fQ2p/5lRY|`*C!9l~9^ՖG{)2Ұ aY-ݮ L&Vs9jt ݌PJp|YW L066Eig`Ϩ5@9M5i,<%" fhI&fᴢEdT#/+\$ ac8}k.^4#:rfQڬ,[F/D<u~JhJ%v._xWczgVraґ?}[F`Y:-YI))_b)=4v!_b,ba!M17ʌ6DV-R3{8S\a,fs[K,t DuxV[ ?aA+<KOnvTrE2 )~Uz[RvףvT򃲜aces6KHxb$@P#N+V=eټPJ&8o4XBQs}PTڱX@GF{-*aה%0)}ppeVW\Wչ4?"8g&BTYe[W]s:-c%bNQe[ewb̝*j23U=Z!s&es m(tezˁ$h1J}?i_w4gGg¸` %_Dc:3ȴ(cnM0}`) IOUP~H)dY\qvt%ޱ൫{/̦'UUuxjfɛYnmQ I'0rK)Hƛ*R~ z/V%isQD̢eVdYX'i_jH [~r/#xz&;(x3:=]ZmtLX sVwebqG_zߑ44T G2gZE0'3]LbXeF^Oe\,ה)2?5TaE O*LkW;&36<dw7S\6޸5%4ɝV %7 yݺLSx4CojU&N  O endstream endobj 136 0 obj << /Length1 1941 /Length2 23013 /Length3 0 /Length 24231 /Filter /FlateDecode >> stream xڴeT6 ݂;ŵ ] ww-ESܭ[яukFFv{ʝJR%UFS1PdWٱr3]llL,,b@#gK3lP4q~}`aᅧH퀎JS@lad@NΌFNjE dhin';#HE2F& 7'kK)@I r{Zh@vcdPjU%TTR*JLU]A@\DAM`HTڽoPP{y7./&$ V+Fߩ9l"X8;131893͙mO r?6 bg^Ng t gisq}/ӻ{/60rWNII`kdi 33y7t6rvq%{MNsqt!/+uQl|cFv.NddwD '{?=K&/ -)(>xv19;e' `yR ;S1{N'n^'glk;Cafigj.v.@i1[ft¿变>^ { r2r]>^T'gZ8] [ɿT34*l<@3xfHi%bc`d ?5oC#[K4/Mli@F6tt*Y:X]ڿF/bgn|o_"?+e> _4:9v2~|JRrJwl3Zڙ8FF, b}lS_`f9]}f G? 0xFF<f#^"w xMY@6?;?;?{twjCw9̎DN\fw^w^CG g\W!˿{?_Xd Դ4} ._xܽ9ޫ`egy?}C/>@yǯV)M&ˠ(yN*d ' psȀB-_2 @r}튴(bټ}O1U6%@`RȐ_RIF{(]1J P9m6vLWֺV8ڌhA83&ҨGdn0?{Dھ U_#Ux}jVQtG`LG荾bT~7Kh*yZ$Mtv,6I1i[2 ֢6 riGC5z{LmψwV(/#JZUb6ZaO >bkdsH"A7W@Ж|*@"SFJm 2jz GeYv~C$"b |gB76%*Uȷn5qWvX[)>mC/3Z ĵzԸk_ É( '#T= C]+xq#(~[=9F=9<%\ƓAch ]̏&3"LMy7~|6Tk(4ͭu +м#˜7{L$G`R e:`JYr*MIo7?3V~: 曦%4V}@WK=}gX.jA _!pR G.\$M+d)bM,&̂"/i+)LA= Rba'3lٱɑo_6bC *͹3 G3A;F^bg2v^k^*> {&"Z$;l~zqʜﵽu@X=DO!tmz~ґ%L4l!.1%E ƱLTYcғ\ms-L@TL|a6A}$/ZB^o=S3F^6Ou߫ŪB;9EWﮑl8ε͙ӗ;p1T E!,=a=q۴Ba(B`w5STcwrC`FF, ̝ \cHK1pIu{ Kb86L4_KSkg"*zn2fB q<|]םΏL)=k' ԉ$a6J sWSUz'^Fԕ4I]z;)e]i"Q>EI^ðjpZQ*{9m#J-vn>)TV/Zs0 ҟG#g7I5MOAFn\\">ҰYeB`U&Ep'HM&ǍeyG)Mdu&7b鹤/aNm?et 9 >KLe>Q#*]p+H{GII_jNO&ZCr.8D?h>P9bn|rUƄߠv&a"QFuA[f3߶cE>xKR)ՔBϊk t}X0= 7ELM3&qaW7U/'; lo>R(o8TiS+6N@v adX߂] S/E|)|&}UU !4GGrc\ɪWfyUn*< u&WbTiz]7WCylcĖz[US-zV= Seu<|65 X e>zUYD:a !hO"FUx^)2%}Z>E\gEwo\: p3t ;ʛB1}1y ǣ߄뫰UKL8,@z)GmQFA8@2%К)VeܡqE}_vabkŔϬ͌!J Bf8ccvjM5Rz{$sFdn!XG- Y%R0`A4O&>uqn#0]Gtg~gUʷ`AX#+,\@mˆ^%NR9w˺>E"ᄺTqQjk8U& %z|֛w{zw!12_AgI)sh>G/a@*Bcu=1i+Y:&j#~aNz8I3>y2(%@IS[<̛rY˛ԶQ=d==c_Qqࠁ`Ȗ;B_Z<kT~ZƷ</ RpY@/Pq'IiV \bV 4⺟xh(ŝm:46 5V%Mmz k΃b[ 'Wfr>% i^ kx0HoP ЌZp E~*SU LURCr$96>cbBj1ҟg%Dž^I%`gޘǐ vqBkw,IPvd8>A崏$6 wK { %s1r_Nmug^]1Zk)4dg3)HU/Fc`*ct2*Lɦbc5nu+)Kn6bd70MOf%їLI,TҖؾͭa|ȸT,-Г淂"O{ANUߞOq]Um<!56FsO']t-u"؛a{Vs OY!G>v0>Cz /q]̕+XPiuxRVU/bgO!zKh)Bs}qnosMp9)TR}r19[RӜoiR xRΩ5HZpxDIX͖+÷qCGb S,s h|Z֯B`@~ .8 EO/*Kki/];sw{q\!!ybPv"h5/hDB8{/{jNb] ({K!F<1Pc$0wOJ-LPdmnW~gGOdJ`J԰ gpP2Q PB*u;? >Fͫq% qNs/ 쎭.y, ZJF0m uP㐦@sc `D=(iNOtJ ۔+0][O,%RpPsp?Ĥm^")X~\:B,0G39=}w@ddzDID:If#`$C4J :O:]eF:OsE1RK1G<%>--ITaF?%_%WB~[|ݙ-ҭY5Hli`NS8Vwm*'K2Ɉ:iXŌm3;ILwiqYHWK:ܑ!D5 4Fz#M=<"'`4I4Vb.lį wV]_`H5:5=OTCߒnJKc >\L<O%Ϳ+#2euY%/4`\:? :JӨ~G^ϟ"a@y!SU6׏(O#,]鑬h_-Ծ^=S7z>(¢W$-V4ķv۟kzSgGFƭ9hջ&s]eK9Y]b櫗ߒǮڮ!FX&- _0;g23߭بٷ;@7K<0&5?PZQN) gtBJ##KHien B!!MIg%9Mgv-f GFeY^K+\Bdr儻ng)#j<-YOo8’m+6~vjR:n~|&Es |8${l?އͤ#GF‚')XG}2&EܒHF!q >b %d3% NHϖc\F Fv7ܸU&9 '@g'5-f{q>EWJX0!̭n=?4#[ .Fй"̈yoTNdJ#Hue3Cdɗ{/N}Hm uyo/v߃/S |<F 4UYPMJ^hiZ1B:Wo^.NS#^bC[-VkB*B\jB^?YHhN?bybnu1r||)%:J4[]`δ;NBgfbFjSq4M/9qF妩AN-q6ݼ<="sڗk]t2ЏdC)SW^~? =jF [lGBe'n>&{t@E#'CDwQUDE#ux]tAt*;` )Z~ @ʰb8e\UCX[wjR,%>h5)*o6ׇUzZQZf@Ϊm9+ %oK`>LQ^dK26mwO9keaG֎!ov k?,N z~MɾX\4f)Z0۾~{E*zTPnQ޹RN꡹-ʼnb)6&0Z֛"J{`V 2µ@D @f|{I(k8S^͵y9$A2?R>8nk^F8YJRLsOM5'6O*(xau :Ba=p뒂>!=Dh{P_\uv-oKmf 9h;Qfz: /n"7` M8WPvS'"`d2\q>RWo_*Ov,3=<ڳj =#)Ju4Mv77c?5A\&C arCgkڏ pq>ܳvA6HjebGG]n _R 潉Կ qKƲCgǾ\I7jJKZ)kN!db6Qm-n o/ M2=1i v/=Holk4 YT()>Ɂ# Y 䱾{~c k9UvFy^ (iE?xM!cNڲ_ I%rH(`%DQؘ\]d@Vv0vvkbEGCs/3}S)rZ9VLAᇼ`ʄd5H 3]JBBZ JлJ=U_0Qc9 f&cРIAN?iNzJӑ KLHU1xR/9xHw'6c!A!Q9 Ta!ol&'!4LpF}S80%Pd(mwT`&,?B} A_rX-" 脐{'Bsp uY[Eޜ%gX{{䯓Z{1ɣeݍ 2z,w,\Tj>m_,Y&`?Ue]l Hew(rĿ*ܗO\7" S\UH~i*i5=) ##̧vpSv߳x[,au:dLG7S@WN )^M_ l3 [@O@ލ5*!ݰDLS׫r'=|8*w䣾}ge&_ g>`xʛR 2 P<6Ro5`6麬}͑ vdoj7`8H뼬Zu2GuyxK6V*ђkg:M;+(heϿtU>"dLP D>Oq +=J,WHI"I(;iD;[1C9&>nK]˃2RLf_R3!LKy!4Jaf~ANePMMa$P+LOvf-.+\²:[fVXGF~FTX(ɸ,fEZ,W70gJ ok'%y,RVW O+ U8oy;Fr%-~mTM̹qF486Pޔю;=KZ3v}0͈Zx]$:ҳ|l+x+:O,gȿn!q#] 5m^?5y!P9!E؂1rRޮ]aY ɯݭ ZUՒfV=|?8Kb0~BPY,&p ;|'[ [@d|ΑAO:0q.P#+jPIvOjUVcNBIb>,j㫲m硯Nd-D;J=82Xl ݘXCΞXX@F:dɫgJ0mzeH綯M/0e9 /k(^mBU-YN~9 _9b/]}TnKjtKKG!Vr4/>ݮΞ% I#>L %R*͉XwFA)O.f=J0yzvve$+HmvW + T 100PJL |kҎ/GNie[lbb@JJ: N^n|C=[o _HTΞwUՋ6s"v qB49$K>\3StE#Q'`vj[|6@+AE!=󱪰WO\|'VG̊PDσ68m=WR@;:LͥZσa\ ѾU},3P4#)ʀpp>Ld/(p{hXwB]KƯhǐwp[C0%3:aLMOH;PRc"eY<lmukdFRAkܸM*_>Μa3R73\5P^n+E<\PFd+SoVyvk#+<_IL$i%T%iN:6I%ƍ"PgY8IGp/@=I^~c!<0L']ًd"Q6)"N@!1ta< Eѕ }t+4f6?8Gu/rDZS#^Wtz#nYPE`iCx[$c|ozT+ RȲ+#ҕ}2 =@{÷'B06טS:>S·I*dkGg0##IJә$e VRԦ дng`L*M. JUT߈D;J b^aJD 1(\.d´&<8sR,򍰻7~{L~*B0.tCC1G,TUMnuYhotyi`F>uQS(>V L5nߧfw"~Jjwo@nDZzr(I:pksa=!b}-[j=K۝\tq5ҏ͂_LLeb38SC.q2oō17/ MAPl|R/n7zOL՛:Pz`K\݀"5\YYJR#w.e@u Z.dԦhvS/.NP=C=VQ6zrfƕ_GwlY#+ >AjfkAd;Q]K"K:Y3}N/Fo9m@'52zX $f_599h͈aP3*֠R|] M[ DC089F6la#q;X]JsBB!3u-p˚ӘGK:YVOW6,ɏDb\]1-^ǕKh|v:@YicsSRoJ<|z+}3V FߨE f)tC#-}BVi&ks7fC=iLqTFE`~ bʩDY:L}hĺqm۳'wāP!ѓmަ,2l} }ǸKA o(Wg#7r( =X*Atmͽ-jKcI^.jֳ/^= pg*?}^NHp>߄~H9C{C~t~[djSRܹk01eMw84/vY3aBR{׬k2Iz:*9fvwʡXdcXS+_?ŠM͞(d-9&ۍ92]sy˯Oqml5t fEv1.C]mx@a -ԦnPCVfޏ;Vk+o;'Vą9K},yxgFZye'˭Bw7 rFq]G`0gjJ{pʦ:m۲5,$*kU`װa1dOsH047 B);R$h{J"AG1FCy.MѴJ}(?ݸH?D9ZJȇ"\!$y!g#NZOrSS$7n!.tiGz?F͈~Pʐ !Ʃt؇K"[[ U!oƵmtQ Ԃ "E;hC8Q뒂'v`gKK[̨'1t YsFdzM|j/eM~4Mq7ЈבYp!rH8lM,6CD28M~$s67/R{Tm[P$&i'7DCK%6WXk3k*suŐ5*e_3B"7&9UK:Pgê:!3(1PeX'bԒ=44پeOykjY+$ [}Ŏyb ˔x|[:|."iZ]pL ^v?b%]_I}˴Fcƙ3 ( 3/|v`x2!~홭 RϤq?h(H iU٥.?e]`0DLOE^jJtk'coWFCa JLJvF/yB?Hȉ+ˡ0,i"rѴ{tj("8MeX O;Ts[؈Dg:6Կ.'+@p9?[GN!$twOu]}5{g?:+f(VjHb]DJІ(Mlk&3Il-XUG2 ̢̋w-|.n>6s8(N8XOby!/Rg2Z onboHmW46R%h#Ҿ@G<ˈX=DzI)9e҆_6s׵j&K Zc]g'Md֘Uu0_?iTr g꛰[_1[{Lq!vL :NS%0Ъ(\vmt Kѵ}.•K⠙;{uUgYic^V<6Ȇ9W >Y_GG[Mq!lXfA)cmX$a Dޒat EP2|)s#骽WP'L%یbY-+?ۧzj8~eXR0TҊͽfFC8/9 AyAX4՞ps,CxmoCEt?ٓ`?ec<ْ& xMY+$K;HD`u=r[DƛSz­[+"Ckn`$#mmɚkyFW p;Z  MQ_-Phe V }ϕMQX6bqRS K&SU%ڎR\ %Qm]N*٭>xzW!yVXJLS@e'6-e H-HTv<u~UaQ+nӾ%\6t`u`6R}q*n2#I%<(E YV4w.m݆!gw"Dev%–;zA/ e̻: L v%0`="қK;QW6@Wz6о{_`J]ψ+e%J- 3ٍP, jlZ>ֺ1Qgsdf'©-At(K6rɢ^1X\AA1o'3&cHan#fֵjg7;iO:3Ro\@ggQ%Mp'hn+,'3G6 ,X2_e~\kE*2(P_?f YU^4cKR>\Qd19s!d/W] R=(5 76 ]%W_ -W}󂬧fwZG°A֔f=g76#h8) ZC0H%r-k$q7$H#QSAĆv4,z.<8L\Y}g[ ljm:4<w21be38 ٧qX=W(X?!ƙYd<>Sw,ˁB)$xd;HVH^Џk Wm:js -B%_¯60^6¢Ɛ%m -Tu=뒒K扽uɑQow~V<6i9pb1WoeZJw.E ,t< 8x&~`Mfe3D"bmPv.)m+A @f}D4"Pj}'RN fjÁp9dtTQ_  !*lkGysPp'2p^ǻ5'襒s_qtc rO50S ֶ4^\76; =AZ;OlmnUC30q@W# —o@yYIpz7nN]Lbs7<8C\ F#[<͚{h,CAB:f9҃ruwh W[Oͻ(AT7>Sh|kjE$+n h6dU41 91U=ř/%=cfg9|>Kݐ:|n{?5x;0H̱E)Y=qi C3e9бdZ<XL{iQI겑Qs P8b0.(FZT/7Pf-DeCQΏiZ eGe-btjؼM#yNh5IO20jvY=kPupS6^!̪P'LذażxY'3sq.>Jzx1c:qU3`0O[Pq =G]dٗf쌼EėٲC9؅>? hjt E{Wt_ВÃID z?76𑟶MEdl|n(_@/v\(sFz4L Ejλl67NXO7+@a|[gfbk^OM#ƌY3L"Y@1vdLyXTo9Aib&%I:^+л=)CBJ OҬECL3)ЬSՈ]ǀ*9g!TY!8 U九'0s`opmQ41DS/_%ˉ{YqX,- Gth01RzB%z'm9_Opqף9n~Ko[ރ$(ml($h7SF7MU=SuXCk&D[Htuդ684G}7q+VAv=rl8sDX$"5̖nUh߀;3{Dx oz53+ 3f7#E19@*DpDiُ#.yŅP)OS:=vya_k@@;uqI"uZ@5Ku5&1!|-I;Y@tb3|pl.52GGɾQ#l|=\bM5Tk:R z؝CS[5*G;fl-[(9)|Ķ5CrոCW^e;{e]~M 0q)@ӝ]$NpIUa2h9˘h #T_x> u`NH]Sju:𔻣(`:.AO*%zUOL HO7n{_ SdYIplIjGJ h`K:Ո ڕ$Gl lF'_y䨀4 '4X+Lhƚ~xUݮ1ӀH2L@Bk0&g;3qi'߬c?dbXcL%`W<.s)նIKɹǶny&E1] @L(5Vg6I%,Bl <;0IB|"7[m\ 8>D^8E|ahS~=|ǹ5VV+D?O,,#$6E g?< ]B^\#kX;K!k-_#]IjZVMamh@4ޅ7k@]~0g&:/fL&%gW*|СOJX4JC9YpQDYm?&g^;`&a]au ҩ 4^U*%OAj1ಂ맞i`=µ L@nWt0C2'Y:^fE|ȹ4D9<-7ӯ*_ԫE}CRyfQiJ[^٫x \]v I:n`2=ېĹ CjZxHpwlvC-s/N #grED"p^T ,S`0[ȃٓLM i+A֮%;Ci+wsDy [>v&L 58wWjb5(Н[Ee+XYZ߻m-|"~"gr&,#?"?>ބw}^#{dNsw@ؓ7+1Ir3)ށ%xWjՑ|)JI^*g I[,qzⷑMWc <(yH[Ȧ&mQe_ؘYѢ(`Bw}$߀n)wh"M2"+L1VKj>}B\J#1`C`HfY!ݭ3/KScYϚqME*Q2{ TM\sjl8-k65"a%,~׺e_'1 qs̮j6{>#V" H\+m[j .)ޔ#@ ˼ͬ`'#1p/>{V &C>!ʯ~0HS39{ Oi7\*5w9L"})8aAo*Drs%Dgo*NlʗC E˷p@){xӋ|ytd-LkQҠp>.̗s9< D57*#J2\H /Ptln& +e` fCŋ-q(kߴ \#OkD|+ͮQ$FZV SxrdpVÏP.Źbt(U~L}I16êqV3붢y@׈&Rufas ziT fuwER*}u;LGhQ60UoVtz!)lc2 yG=M_w`Z~T8?0!!7lp wP7NpM>i&08/jO2bQ.eϡi; IaɈr(6 uGAWUD7<=ΙW_7o2)֢K//%xFF;O-K} # ghtg dțI@54B,w\)`j<,sC ޡ.Srxk7}ZnFG -yjf=(=ݒC+?Qda;]G5`р0&&yCQ6|X@{4W6*✡>Ү1F&/&y)*DR.C aTX,gy/H*Dϟ<eB)ィv2SP7oDxg3&5\>NЊSɉ1jha+Cu?BL@&8 tS{a΃ip 8 1W#_vТXf5LTLY"5k)$%< ZN6{Ґ(ał`.lN7E?}+ ʦzinXbxHU(`g q!jGܔtg%{7cEՠOwP1A`MR#25fFGu<ƫ3?tR~S /'<8OAz_s2W[({0ƀl00c+"s%)V8GQ43uԥɄo@HEͱ|¦G ;S@on|4ɡz'f@بXbtӈ]pk+m HEoA`0ī.Œn^RE;_/7EiAQ{!q;覦@)mx[eŌ+=XMduhwJBcz-y;Y:&l՚%"{q}>*SN2RA>4QUj<70߰8`;̽-Ahgdkסbl汜dF7<n*ח]rRȴHAُfDF 5WhKM-H#95! (igkk]zlOWK⊅%%ɷsO޼QeAa-F& k "$.nPC>N'7;w>݂:/4+\2ZfIhI׎gXn7iהs1o!5]Nml쌡&ԢG[i~B. ؍[J7 Zh2AhWuf|h4x;XCs9T\0 \ŧ!6ARI "A9]{?\㒶QnT&R/ܚ@]~-Z,!KpBB)!> stream xڴeT\ͺ5 @pwwwиw .sv`@35UITM퍁v. L<9yy{;{f&z \ hbio'fpXM\@&&nr$r=@#5O 3dBol r-ԠQ{O'Ks 5XW-12wwٙd %` 01؛ԀZuUqU*5pUUS +tIuUՀv t5wPtyq5a5m%qfk0܀NΖ7 3jT3'{,\\x]]lfa pw>6q3bWߛ49'Ii H5mp?rJJr[#K; (` 4A @wu9RLw/ms&vΖ.Ywgv%U@gG/oRǎ@`aa0TT|b \<\[ٻy_oM],]b 2!]L#ab? `fd 4>܀'WߎD̜SKР ?ե2FꟃJ :v6S h 9gKFHߒwDW&7W*{'[#Y:KXzM,]L,Q_fi# ۙA{Ii-cg/h"M\@ $oFuQ %32ۙ؛ZڙX9FNNFL9`agx3FϠ]@)W`0 6 qE . `7d0JA,F?(q P?TS߈ TEUQj7H#?N" mc'И]lfE߈Tkacmӟ hR8~]lmam_U@ژ0to_ ?M@~7)w?+ij`+d Úl%0fղ?s5X13H?,A5bft}1? @'K?RE0,H$st6ŀ Zɟ /YAΖ%bbkwArq+$uw6w[Aҹ,q`u d# _ 1bח5PWy|d ;.ED=@Rѳde}8|#_/\\߷8 ,/؛[6NW@s3ВIZΘ& gRI&ؕhcټ%UOݘ* ⣈ j0f/WtRhf'ǎE;bX&ЯRHu+݋[0ly,u/Mw=`E /b8vЦix^VGl!d 娜g})w.N6[1d VMjXQnR!4W%B;j;յ"+:f՝ cGףUN6cSS&V[+Kͅsch4=Yp*UBNcDk9ާ@l怆28[X 6Prs.&I #T&w;\-11Vјo-ja_ ow\FsS̪GA7<_*%_p<{eMX};~3"wp1\??qZK5:GލqzW5:޽?@[H){f ȼ2~a(,bU-J៳ʧWyCN%^؆6MbThGշh"Sr0T lL FT8q>Lf\$~/wۡRۢ:1Ǖ Y7Yo w|裿f4w3W3?nB~#V KC}ZoW9M2N&Ph5rJ<<9Hf$AF+=m 8D~Ң-jfmIگf$.OjxM곖,DPk6F|2 -c^)@FrhV(R¥Rl՝8E1wa9&Jk6^m:g4Wb/oUI |% ͮwWgf"#pd=` \"ĥ -Ē=/FO` @cX"i_,_U\8]ggb[Xl;6nMqmԑN3,M#x>69aQ(XPl\KBiiI;%]TjZw! 1pN<|>vLJ&b< vK pdǒ,$Gl!\qȗ(Rռ&} 2Q!qwfX<qAǨ&9!7tc,W./m>֩ Ϻ@+&s%^b l,EZGQ"?9Ą$J=nIh33Wq:?b] ~aO@7s#Z!trqjg⨮)/>_B>Jec 6{>烂o=f͢*(@FԱBxZʋ8u-l}]=,nǗ6#2XQL|v `x^ٚ5[k'~wz%m;94@#|( =p8!$uO^) X|lݧgPnyNt">N~;<1WlP')QKp(~$^; :MZncZ ?e0WAC'#ڏr5g+h"]uxлQtt*͙dݳ7p5uf1*뜢}- $c}x n8 .<.2R6Y)>D(ள9~o~a_)qOZFblQHt٣{+)̦/&4l"\ĥ (Gn%ͧ7ˏYȎ dT1ܥ[[Æ'x'Nn[*FBneQ,Ww=IT+fO@)@ K>wũ"q/\<5,ۻ1}͡VqC.I5o^K,(j|2^Msި]_ }Y7r4%hgB 爸ĄŢ2 =ڴ/_<[.P"!2|pٯ`lzٟ_V,X! VYX4SH7G]L›L.R0tؒaJ: (MI .IUTL]`S(I CnǮوM&7KyBF4v%,@X =\m}|rh<;` 'r qE.іI$p d}Y?On̎ >kt 0jJqgo6ʡJ*O)8 5w:L#x "BGѬC,ET`E4&sv./ʾuئCKuҾ> duѴE{Lۮ(gi nr; B_lHeY9$a[N}GҰ.ڄI?56CDS,#^2?"+{ +q\cJ+SݬpCt95@@ޒFɨn(>gN5$1jgяqI >M-$5bWbUc pb95>^8 sԫc/R[YfGGWCrio!R7mg7JV'pT{g+>5P1,4` xh/Do &K'Iak,#_|]"ƠI-(d `Ql cEn%MnzMuMl0&ChCTz5Ob ɍkO a#o~ TWKkkCY%O.Q +dXL{ 5! T+~$X"iet?703 NA(#LFߛGM(Kxu^E8W+s^;R@)CFšMY2dw?@EVhh=Xlj0>0@LGJ>&BGo?Lv`J~jT{<вN#:V( 1c|; æBN7^]ꪋi_5W|vC3#]'GHe ^+7{Is=*|TԮ:dt8D4QQDnh [ЛUO09ynG,}A2BlTh0 dfT07/~*B)d;Ix*3߷iܙ|d >۩B&wg鄚(p; aM\}1Y5T=9;N78zwEb][$FDx }_@5\+.g3[[Ti&Xp4v>TyKQAX~p7E8ub+ ޒsL{_},R5&[~ ae0^Y&+IWj*_QH/ɧ Cܩb;ϏJÞ4h4g bRgU)QS]0 wH9ĺ=d O6tE#,o=VTYDyd,(MhJ ]yٸ8ɨѺU:7xt΢ uQ eX>ʩ5t1"ȳzvӋU#~tu67Z17t O7(崃&B2·S @g=eEu)hqJ8[A?9e@'ZAYf˕ghTflVl͎9FƤ v&/fr+H9qlF{\Tˇ_n '5Vq c)O #%O窔 VOSϚ9)\sߣMǗ/PXeL&en:'>f$<bA`-[KO.I&4uqH*RSL'5%;bB%Jz{r!#wv([<"bE[`e3{۰ ?9 Bӗ{ϒ*XvbyHex{;w/٠iM)@bCn6txg< sS1| , šܵ𸀎y/E;aoR5dS5{CB1%XY>SRh<}i[ٸIH0=ZQAZ+5yܽG6i?YAL['x,isw~3Hcz}\kat\V5IR{H9g͖mIǯ a`gV}F+iڛxjdҨdaD_+&ƃn :j'%\~j3d} 0m_x^(`jNA݉gΗn=ֽCe&T57 l=HA7&?’F!5||_ryKjѦ݇0&kHMuri9Zp%: BpDls|o ?qU7JXJ؏0QPҷGR8.|/-q||m#4wsPI^3MF,f7Vv^(S$:Y7cR~\; I~y $A9?S?]X 360y)hɼM^skC~~ >sLd/]n2la*P—휵ZPDm}uFg2=) G^F3=|ZP053 IyFf4p9>x{(KfZ'UDhyS.{^L049m3L:k1G;$@؝jו~gY0Q12h\UNoH8 m Ăs(gLQ}[sŲB{_p\oR,94z،9cyVjN9PCE+-|Lp>PiPGy1tY"[y\ [G{#;R'' (w{Gg*dڸW`$Kg)p/w#@1nx@u~Fl' ,¹P$!ݷUkK0;=ˣ5jd9F/c9ť\e,J :>YBa/ҳJ{%B!-l ̏R(~k]ҊF'28Χ9T+jR=A&3jY/i-]"_)T~m2ZH{4>z)^ ,Ŝ]Gd/q]!+AbP3xOEP*E3H`U ߶[)faF(іzgcQNi8ŁaՅ3@23_NIN>$+oZ pf+ǃB,` bL2Mdf_ПyŬni,Z hSQmmJH6: RB&D48UzFl>.$$W,_?T.MjAi:'s:s}"Ҏxf:V$T}> !]¨L١]*FHĜmtq2K7SjIQդ#:yK[/&8u= rX>&-`୒C[LȚuA2Hfwo> 9GHݑ7!vzzH<箏}BDgĽF8drXB) :PfDz6`8C EpČ%FLa,v,+o>vPtРg' bY0~Emô[da>r#*o0#i2qq[v\*Nl9љd]/nDQնMdu6rwU?@7GQP4rͼ$apH!Pg|B}dňbm,`~vq}ls`"&%bl$iq[eq6Pϛ(`pݱK3}1'r(ҕ=;_ GA>D}=r58vtZ )YM#6!6Ū7TRm_{Ehgvfy 4`O.8Z){"+¸qO=I1.W :Ûemһ m9fw9>+DL_ IKFKǘ4Z!P="֏*N{Lq*DY# do<|Ab%fC1sA??qJT[Wc.dT8(ʇiuqDXn?o. naIla"Ad~r[h6+cx%Js7D DPϋSٶ1>d&Yg87z**v #IBĵ3: 3Evb21|ar'K29] UL5KGKJg.,TDC-YL-V2|jdvAf2UŎR' 'R«)?=!Jjm)Vp?4ވr qwwK)\bތ}Z,ߢYΑ_Od0-aK: C0ˠ`²D7"~h&$A+FwyPMFOG,uөY.ԡ,89N{ ˄v)tXRuN LpU)%[rT$1g/u&\n\՝Ǣ wr=.K3Sځ-Z앸_6WnBw`4W;9}nU[7Pa |D%4QڊLCd![;/L**[XD \k!YM4=Y!/ Nc)d ,g'LYA@sHnq1]xyq1; =+vI΅\6J0$0f'1ٟg*\/ OVrmf&[E/ mVBmkGY\ddOZ&0i) e'?+gtsYj)VJ[JM|/dQ)Ճ1lEWMѿWGرfUJ0<ρ\3g,uv*s%Z Z?ۚdN+^uMSTpi.d>c^q_|$ځe$AI?s*e6V;4^RR1^ Ź׉$! sSCD'|f:bp)4܄~ 1|M)?*AP$*y0un;?źAu.7I~1ib)WL;-Y&}}/KTXKbYjz2P&”i7v%^.k1{]K3M0 Fn{CZb0 A,~Og}sf 31+\kr(r`ݽ hX NTM@ 9g_yPnM9qK1 `WqS#2'SL0$)R}ҌJ Y8?z-An4"<T /b򡛈:ڲ # P" &MфBl&8xMtCgq롼?s!9buyHkj ]2ڣڄ{  'zZXVRޑ;䎁B@Q)(Hf.&~7/Ïj!(E| U2b,IT sHC r築YqwrUUllg mғ9T0",'6KL&z#ѱK)&#Gl_3B{(9e_~#13쉗bTpr;YYM3*뻷CZƮٶNqԉK_>*,bܤ4J5k*<͊?$ ,MN(XYlɺG1ogl2Pyd.-as-$IlI3cK~&E7Y"}g}EGXڍWZYE$;%ee5ae_{H5%EU!kՄcP2OP;BEӣg` m$I$}DM# ^밈~ѩ7ДKȳpgSiXλ>;]Ӑ)CheD6}w dg!.w m,5ٱPdEO:y_qߖbۯXbŤSv!3v,.H }ľ^c&|#pb7 v<"zrs+֣X,#ayηA+3CJV:nw6=^89YfF,kw/$*׿Wֳ6n봌5qPL=gr&dMx;3aǴJqflX]q"?7 mB*4GZ- zq[ =lDXؑ4s(1+Oh2UX|5-tT?v4r%1$BI~4^W-y&#r9D?6z cOPzD܆[{cF6 URl lпa_0KE vs- y4jA/wS1E~ªpb!Z[q2(W#Q~D" ʹP wWbr|5A458H">ZQ H-s{0J$)_S Jkht ]lAL֏r-`w#߈"FZt·ߎl0hLAԉzQ˓V+.Wi”HR].xg:thp: ZE)ϱޗ=rsh:Իϕ$p~^`,bG\O.LGOCgjA"!x:ЩczmkV%*#k&0nS m1TݹBBʎEmFU(pz]xhq8%w9vmOksMS Q+P/1csk]PĽH׷@[_/ǚAJ{VoG#WxҘ|뵵[&^#eޯY DzR#{k, mXB۪^^z_5o4[he x͚*MnFEm`0 !x8~m)M֒kepAI3H甈XZ~:`^/*Odȗ+eAgwzi3Fl+LZ8hYbwY[w5[zj4= oj.;iC/*4!wuj(Wݯ\ 5d7_7\!ST×/ Đ+@7ΓZa2تr; AP4`6z3U9UB V{ @r9a{-Xm4_rV:f㐸V֩8 e=8V4liy_K6#Ϝ,B{:à"l)Unuו׺/A?0"Uv=Rb1 4T4}T7tQp2-û 8}u٣zD*ErG"udN?Sᭋ?v},yOܥdcw@ =!G8^j~^β0|<~, VHˡgإǕN[couĩ>U !"8v xh](VQ_\m1 aGVH#~񀸭Γxˆ/u%sC|K@}{)xmLnj=Eifu4s6U(3;E^a]E$"Qǝz㽈Z7t8N^N %EXUg r,4C|QC'Ճ넾Y(_7s"7jcd;-+WYˌdE1D^$|: ji,}Dxzg G\(#^lL'Fdgoat.x:Q\bTt]392,_`2LSc A(_|iJ$(w?k?m" 0(#k6;ʑqwdoC6W4l^|"ywsT:d f`,̞Y ?q+_"HsfJR4AJۿt3ͺn'j'GV=rA[B h+?SgvUE9/H#T|g4k':])@})@N~;D |4|̺$rvU\-jP\վ=Ľ%}xB׳'o?2"濠UwD dZMsGh}'[ ?=CzPta?lI[w)GJI~`M!{cҎ;7*.Żr6}uS_;>-aB+/5 dR6oqwp%֨~kT S9RE}( 9& ْĉT$FԦ H빴V<>P pˡѥL^1{3҈H;"ʆ8.gң{lp^ֻJ_Xp~YIl+l#ǯKXU%nkR8cLu3wLK܍jFjːcs-xksbE.{V Q>DRWC/!@ (3>K ia, m$$b㙻.1V_ V͘ FBϋ|7 Il#-Aܤj+RƗiH;&S!QϜH:L̄'oD&$p"|Cz ]MeNSĉ 93bFS <lȁV 3T$ GfvJhl2Jh0NIu?#y"s兦tpJ \"nR"RLA;s z Hłۚ|JQ.c!bq_A:>WaHq_skA{LƝ#YUS\n[Ǩ3e%bWGZ |訾ty$&C ᵴ 0tBl~ETw)|NjnR?-8m0 ibP<ݻ= &lkh.w$oF3g)zൃ+B͙/}R 3%1'& Oq2.uIF]ۛxFϒy}5UOZ_NQ?s-m5 a_nnk϶TYif/SKl7YЧ08v!7rd f~wLw $y)G@HingZ1 yU n/AXn{2@PsX0qs Jh:x1gDy~򂩨EB?f(͆ԓ_4ybbvg%d$jFڗRt[v{=eYrofmzc1zE+ 푚m$(-mq#1`: a~fFɯn[ ))l!ojPBB~N҄3K1Y1ګHAsJOR,t7l*WDCa29~ x hܼ}Mb[fwtZʉg%DAa<5W2d=ZD<3;p $wyo|S .91saUkIS1#a2o":rU"ݭq!D+frw6a];B&4 :'ϰX"p lMԤNI0ct`8TR칩03&~{A(X=:,đO6YbJU@1HF{ k'WZZ_ÎӺ B9=]:^@sa 89QK~;wnYt=E*pӯ7 Z$t!pwWN(7;곑& i^ƦJtqOWBopNf?d2CHfy'ڦ'I 6{94Ll -,+وl(-J&.yyCx4o଼qV$k:zQ}LM/=)T'A2}+bq]U3JZ~4Gؼ@NEƟ wsiVtbשh4b9e$J?x&;$g\YauXUm"\"#Z)Qω8 8_UӺblQPz`A&=Ih_92GF>zj*CJ`9ݐD,9>s?3j>!y SB /5t|/KtuSLX>7w#dqltшY)zz{RhuQWy9a5Ap(xDIuRLR%#SxJ$2 Fq/n /$Ru?G!\;s W]P_絺3:kY r)ׯMSt9,#7g; YMn;p4^`j϶|ϔ[^GԿUto$f]X:%FS|.\p}tg$M]BJn.GR2 +l/@#2h{ķAw([iuţLAy؍En5lZ{y|9x /,BC|ez2uײ,6g C/3kL_='ۀNZ6Qez,5!F&6: p{*߄Od)T k-⒜X(*V !@O,YZGTHbjcVALDϮ`Y{Ϩ|BÝ9zC%{[^jŨ d:w7 Al/g5o^N~bggݢA2 )َAMhE{ϏK/-Sǀ,xGG/WL9/A-1 wrkwVCh=·7kS=E;7NfƂìo^?MDs\StήbE?u7ZpYtJap~ԙ9X)szO|k Ԁ80Wo~vTه r>nb-$t3|͖1W#23$w[jssۑO G~w"О%/Cam0fQղ@ޘ(B/Z_gh W'~.1t^(k 1jYN+8}Dhᤘ<LW+M dLd_-wtHNÒA<X ' Nx; b[sgp|QMeɓP 0lJ#24 %YxFFVh0fw#9ԮI&)_0QW;88foN=d6`{Ý`{wU|GX9>P"ah`oDm Q[ "s(q }?B8옙JשoQ9LӀPy62cu9A|oe1Y^ܸu4eqpW)ӳ9[Ε*F(d"qie]1oVZw9h"2يO(2!4DP@AHYwJZ ɱljbaI9I  A/,G R®8ԖRR3 rY\87%C6jCYx6jі3xy M\V"}W /"-~Svk<>ٺ Ilv%"xC. .J?4^GCZf;8j+  Rvx4]{D5⻴p).:_W$o$BwX8|՘۞\/uFD֋J ع’L!Bąvֱ_"n3/,Q/$ni\ڻĒ>M"><3cu_@^pdJnOƀlz0Ǧ~L_48ZȻp|*r`sQPe?+zCTYH`? gcS^{NŐ W}j;_xACZtT58^֑؜m?ajFGd4LFJM׵G/؉lӊ%^qu$SBtd̻uZTDytT1Y~Q'kA5\&)1h$4Ro݁~wA/)^[xo(F hX|YnRf|n*s84v(뎜t{=ب\@9ЁX!| kV/e<'cdvoa#Qz)sW@vb _ :dMqMj=58"]E kLӑ*V8RUf8*OQ]Ade% vw7x=g^?<o4]ew#Eu4TvISZI0C*W GMwmn ױjޖ.0ӳSͻ$YtlNCT:i8Ca#I.W@j"ϐJ,{S -g,eE?ťE}:hRr8[nwB *HDW~`1 ȅUx~^廂qGAK8 JJX sGYiUaF b{eϲAB%8z@-o(|Is;?}*Y&&wEK$FO!97an_\/3z9 `3YxV᷷iASd8"~@T Q3Z,ܿ,T } oubFәݰJPnWbUYQh Se |N-qӰ[A.,$zЩp";e?%OOG'fep ZR~1'ٻ^~bJz!2uRg!i 7vQ6"ǺIzYm $/h9D%2nO֞㔖*,&%[zX4Q)դnߢk5*hyRuRm Nh"`> I?׸?:{ʑlsPA]1xfIkrѸՋ)Xd\xi<)_]sIv;O&tˌi<#d7 i8¹Xoͩ2jz;yɤJGQBֲ7Y??Ӧ5_1.=r۪MgɈ1UHgA( nd|d|aMwE+t'ceL$U9xܕt.8ip-EH0OsSMGUͲ''-&~Z{z璥 qfkdAy.8?K[K'{˛^Z!{n; (֬c2VЏ3'{Z)3Ӽn B6]Mo=əe͒JUgX<8c8g.w8|NB,g_o.\ ș4׷i aY;ݴ[{}EkzΨ3(R,@B Κ$F*4ST_u"ȾEE'k~<Ʈ9V( ƗS9*VĽ[njqȗM/b~*HB>@~`r/mƬިpg' dN&d|G/1@`nu|W~Bd(~»7/FԸ-e#g+uNo9h%-\%PD)uOT"Nޢ%" u@zpGWsZ$w aW6߀ Z2ڶ1͖UѪIR'eޙ!RbUy'_'-j:_pǤ]fL[ɠJG;lz8-(:l߯E:v,aSB=q†ŝ.G˽͏l4>MP&ڼ I8~>yuHcCxE.eXǣʵ˨EvEU_%˖eî-)ߊ|fnO,E2`|S֘89R0ޒJzY J4h @HDj(3T`tةsVs۪]Ԃ"Zwpc*/8ȋg z21wmAmĽ&4[_yjK#Mg3pM`3fiǵRRVRQ ;P~:V=1zAJ,Ot=M{GF,QnFP ɴ ,NV35,yNHs;w/Ŕzgh`%ҍoh)]u۵00X e-!&{ugc~xtX| .e# ^%+۟rZ'6~>7>l9{cU1HeX˂5^j,VLǓZ 8鱾tF,dq(#cJX3i/1UGF1PHwcӾw"gBGXD*^P=xbMύiSy F^%ES> @4 9xȌ*`{#`fC Mϟ)Z!& S׹rPH:o-4J2 a)Jg3Z1Chgzh8&!&5(+eb)wV'%l2@RRTVDo_ԛҸ\+x ʺO۬}e!'-J#LXa͐0J LZxM vq+l$}5X[-j\1q[ѿhJ#)#9G$Z&ɇMj/B}v' U3T;;> !m `\Д]GjcMwRdvyV.Eʕя!M7\z$n%  C"ZqxSu dbC Sau7M2PHB-CnlZc729~Оp)\οSw5OȀd'ͱocJJ7mFNˍ* UU 5@F`ʼn^؍t Tu.g@k ""Âqbz=6&LfbDх*SHMOW")*dt>M*Yl.y| ft;J-4hYwX%>DPS6#$0: tu;Ϩ|8'PEI|2*Kk7oe$Iy$|'āx)7e!0Pu <ꈟKQCX$q'E 8꺇Q@][}z%Y"l3 [öIw.Ds,'R{ёFFMrSׇ\#(Nِ=kKٚU>U&]h/\BČ !JN}F|C;7y׼^{r5}iB!B9ֱc18ܛ$C =xT7ah7u})&=/r ^Ap(ߤ™儸CR?lt`k vOcEen#,؀4ZNX_T ƻ-¦6f#CKlM$o(*|ǕwG jߟzKWL'&aL.=[] MQ(MU?g}C`,_Cd5+صCuJ쑤~>[Ğ>+$xj13t~ciEʡ#(OUzkgt>a$f3m}wӦ؀=)"Z8Cy^,v9ȔeZM |>5K KAzI9L'v'l 2Krk_7R]-'(}MqHH;˹ڷI>yuK6 dɢ;oIL7H[)\ᑽZi(sI t08h0j<Ծr|x6:%(EF 5~7Wpdf Ptܐ1"{“8WOPlvAVpԌe H ~V `{iH:'uu`V`da? , S8(U-NP6^Z(ĤsЂ`P$8`18C#Tk 7y%S+&c䷵ .s% %ӥf"^[ZP[bT;BBԾ֨ "-iBkPTcOZ+f,C"$5~̪_~Ln}*‡:.&t!fP! F+8uN}&}p}`r60(#hZ7Gmlto)"TK1,$4ro*EB]6S_ j3t18P*tÜ%v2t;^S ;V|1= DrpSn(HX,L~Y/VHL$"h.[@.B~b^+pgYײ>Fn7MfN?rhhe-"WxޥzBq㻾_O!QXsu)TRRO3F앾OZIju/I=ZP:ߢ/E[T=2~ .J%#4Qr{B0o1]q8P@FPo†'Լ=v# \H6yR+{ ex۸fFw/7kwɎY6 "A(A#%S%T.{dE{/n.8̱R2fq;ڵ]niHrsydgECNfO!zВo{E`n~tY0]Yi~>>y2TcrLjKmKD6d#>^/_ƥMPɐچ] VC4Wl%&^!94&f8i >,kpb)]{n2dV]8r@`ұʙWqz?7zQǨ܃Tdf "4#:l QJǠjl1Q8D [g$3zOa1c4w"s}%cM#^ gPD e8#_P*"+ I(f"R(f=z`/C!ĦXcg^$9Eڵ4C/ *O'NqnC Yl9 zRoga\!&'y l7W^PT5 8q*MS<@Tk%mҝ?eDMM RcLS;XG:jʲ㚜-k7,-4PftNp ┯c;gtf}z] EJ`UMU8SnyKr-YH9u ?M!oprt zi< s|r[(LUT{ |&TwȽZwtbÖR^f]J!Lhc\4*î"[%m}9>OjP֭Or6Hà[I{4M?CN/֊WetbB]u q(?ʾljN=O7ﶶ^sHYt&*ut7~FbvodZ5CI'R}F] A(+^UZqjALe CɴwO$Oؘ5[ Xǵ1} V{XCz)}{ï$~oJEOw1ƥ.[n' ;<۱P 3XBǟ`Rs׃rgc}"VT)MJ-04N8xM3I$?RbBBBQ$ǷT33D瞽 o,Ş{rh)v>^;yP±nCJr` J]kg)MÅI Qyi?HLL&;ੇZ|rdE/*{qrȾLo*}o8`>M]0Z?ۅu;n6tHjb* QG/sɘyiyaaY|dER;`veٶƁsNP",8 C`# ]]H}'znUT<@  6_צ endstream endobj 140 0 obj << /Length1 2471 /Length2 18853 /Length3 0 /Length 20333 /Filter /FlateDecode >> stream xڴcx>ƶL4m7vÉmvҠq6mhc1Ӟ~^{ϋ!'L'dlkqcg21I9XYEN6N@n@ `fd#Hm 1 t2Pq2 l Aj "bk`nj; HFc4=@$4P fV&[ P, PRPLM lgg\DUT%hB*b-@BUY ߔ 2.'"Iw & wFbC j`kO7+)?Tз OcmAt2+5Țmm;NcZW3|e?}X8m l@NNΎd7И_g9rOSUcm+f`Wol#[GsG'EḼ;^3sdrBRb*tudžDeA `ff0TXwDA}rupg߱uMmM~َA(% ) nFf 3+LŠ&x{L &@  [`lnsV'-_bo٦Ԡ=jlkc01:Ɓ]?ĝ T536r/PJ%o`m`?:sGqs7's'#/2 ٘ZtL,ҨQV?O/t4::عQAڠM %*Ds󏕘)``f66'hnL sv:^Qv6oѿA0q v'# `P@~+AeW@@0A fFAFǚD/`7w6D? Do_ ӿ B̀6YdAPuAPyg2 jX@m JӿR2C //&&PQvԠv hGdQ:sǔ_}guIζZ@ҿ*/'vrDϠs9:];.APo\@fPP (_7?e"y7w?4?Xnn zDMt2׿W?_¶nt\L:P8A]?`<ƿ84[^5 Hm)˟*$?)אXNj! 7ePJr$iaZn4'UL+ 0GVW Ȑ[+ >::z$B]V{R1.1t "VҬ}hD6e6ŭL{Q^nb \)or^2bqQ{SR՞L%T E|"$#9zctZ V#)Κ̧G)1'm +bF h@s+ 8Uo`;S?μcqGPNw]mMK]M-66n$5ÛnLKlz[Wx&7bܳkIO7U[.,~t!H($S} XJ! dͬޥizw%`?7)!AefA1 j:e@.TXpMFEQ?1e":`+x!J@,tLFe:‚*LV&)G`~Gz- bQRC6Fwv=v0$V=Nڊ-.c4Y ^*3\]4 YKdBS%9ǪtWn99\= w$@GMW~uaɏÛDi.x25J}1T j@T*q155nҜfw*G~WʔK3/h>=wR*^D"؉G\Gc5>z1V[;`Zrnk]nBoEN#gehPSĞ>L* JeԹ=[Rƍbc3,/>DARC{I4lK4*_0 ٩Mx>-Hžoh+Iߢ;zbZJn( \TYrYNwC?۟%NVZPI>c! nWz'I' F$Oōż ^ҳkSу3nR06]U :e`B˂>rC9<:uzYF5;VeB5m5 m݈Xؼr@uºLvk.L=[{l45Rr^zb OdᆠI*o\SRTJ3\=XVt 沎/6IQڴ˞dHt`vuQ_W./J:ֽ~F!Pk^ל P=,¿cC92مX2lz'$lC8*Bl*)$^<qCir*;KTf,_r VĦLy:Ȉ Me^ +'[Lo a ycz/R{0*-rMO)4űWkc=|Bn˷jx>ͭ>eᕁ'YU*l_ݚ}<;ecVyu&鬑m @,گӚY{e _0("Nn."G6TH&=n3 N՜)1yojDE߬uկՎ=hUiLPkqe!Z uQӾ~WęX.ySzq>$YA؋pu*“G}ʚԜl(u^85τDO&^=z=y](%4޾B]^`Wk\YW+0BFz6[Vd;an8uwa <͘G;Vn-^}M2x+Y>.UVDy!Syem=z5jt^:*z{{a9:jqib^x+}e/)=IY*3^\! t8k߯0~=0y :0[: v8+r'=̥Ȩ8HӬޅ5qpdE̙I;vA%'~7-wfK ӾD&T r_Z{cm {3|ނlEÆ'ң_\c[C@˺z8I.a2(E+s _s&깻'7O\0N.+ o B {E$ĐZHU~}8||q|E,nXJtf4LZi{wq[ S9>p` 0=AR%1oH䫑/Nj˝Qtդg׺ f!ßp^D ku9tޗ`X$~,2m%PzC6- CcO 'jd5 ` x!D7O3tvR^f~}H]Hx&^#.ֵ9&ɰsLT7~RWV(,N1_./ľH.YEJ0J yF+j+r$[e8Qϱ:`NEf|ރ/ݖ(yCUbkeQix`Djj1$m J8ɗG#j0aLr,SȒv$0d՛"3"!sv xH>ZQ\PD㲅rѦ@"S!#OTREľHp yҲz>ܬ yy|7Գ#&#[-wBBrc8FkFW{(e=%7 5פu0?~:H^չJL}Yǝ~[4W& K1 K_;t5v'Eu K%x>ZR$8 d?8RKT*܀98yP$+ubW;aőmc] P}oS4BzyU^4FB)~R> VcpV d*!XZ/|sk;Fl鐕%4 eK/x?<:LAX@?VqN}e:qIlLޱE ͳ>f#VIT`-q}]B'; a H\\krlЗ~p,oB?- xҹi\\Cx&l;@/ ip!ڞY~Y 鰺 6@DFh]w*94|B8'V{)tRDmM4¹z=FVY7ӐKA&% %r>cWBt>-޾™ㄺ~>criw5`/0!0o!o06ԾZGU $&%)|v҆8{`sH1pO˃|2>]N+kӒO^-bxX]zʁ'ⵐ >:伫q*d] 4VpoC i9sY_g9|*0~3> v)nGv6#OýV?JЧ_'bjWH):<ظz+RWv ]3wYӝ5L&Mѝ߸#lS6]k^t8H F\_ $@*wl3t| OF_ϟ}ƻURaNJ]_M;yQ\c_sMR#mt9cC2Rیf'/4 Rŭ۹ s|p,#uH1Sv3LNN5̋WebL􏰱q?##AIiFAkY> 6vsR>dyW +:}=(oV|o'Ì#Yn@\Qפ>:pP:[*\ KR3W#u^oT썌olϦ$ũ1'DOeD EnnǴ^I>5jf{J$ywf%3g*Vgz܆7"ByHܷQx/{KtJBդ e)iN\Q,[9qԔdxx.P, c q>4w.+uĕdJI9sWltay#s8udWYQc+YUs={ D]CX wl͉˹ unJ9;JWi!J5 M֥A67<|-pD'ӄabwqY)(X kioQwǑTb'Vh7nwwQ|Bq8s#&M* vM@sޒe5溶nad+ېgQ^Q`5~2A6Kr/M+bѲYY|^"Ѐ欆|w9Z(85Qxc/Pzb+1of&'NeL05kKM{Õ2fw!:Sb髍7:h$MF˻8?g`OIX[?Hsla!-.CĵoDWΟNQZ]͚7!,TKl6"GNs9J܃NY|}=h#%Z|o{EZJ Äp~72q>b9SqE!]Xvhs?luI95hFq,,Z#e~dĝ-XEmɰM[(zӁ_gwZ2Lb(/+3^HvQw֢o&3f?!RFX}[mm{vi=[,bd`SpЇ f_}=\H#[AZ0G^Hu2M}9"Ml5ѐzAIO[ݴ ^KJb!|Kd jB8i+UAl󤬒LB+~`WLKX{&|l#+{z;Vg nY"ϛY;,|Ah WE ]'WP&Uy%H;(.b_#&uU|IK>c5(e蠮c7;>I6}MΗ6R}ոy4VO$pދ~1VՊvJ-0m5[Bݣj?.8Jp.>hsx3oxo~G;ͭWdL%P@m3ωwx)Zbˏ}1&^)Ogk en'L 9 U(eFT幉DljK:?2gA 8]z{K_L)…iXʝ ;,Ê*[/3-|I8orB\4aJ%P[ûM}j| TJ?6>sU~XTuL+%Z=!+$CϵKr]| DWWw?'`. 1'3mNt~Jet^=g` u\E5ĵ zh#\zHvw/3t+<)#|M:ۢ٬bxs~_*O:$p31Kb | %^WYEcB?nl?Jq3h վRAv#1}t=.9E }"AsiGUcU9##mWI|70I!+M_e. G?t킇Eb/PM8#M b0@b]MU(tFt<>[m}nc4zN 3=v IQ#0?}*')۰GIفtL3wߋ o)*ͮBܲEnx@,A{f(5(TG*rX#眝#z(( V|aOedZ(>hY$ϝ&S؁̇ >x_qE$o0ZQ]H4K#ʘPF' /Q zZx:9V7UNn|8L+eVM1 ==4I@&^-={Ζ'%aOcegAܶoa-5nIYA&L{@z9oR1K#CV/Q@Uv+ +ʀŔMG@4U@!ZK$맢6Րf.q&pA@'9-J!ԠAN4L2wir>L$~WhPgLiZ 8^I?jyXd_ {eh12A=@tXeҐ͉{;u=|@Ѝ)f?0Vy\ǀ7TD!ܛdH,Mw S)ogf2\ji Br aad (OƧJD@/zN%E[J>N_ A"OS3b"盂y3.'&_AG: PqRIWB:ݹ4i5e\ő+2-z ,b%aFg>vTrOc h" @'Ilo+h]jF>ѲMK,_yr:y"{L XUٛ';grܹf C_ZoPVe~R1=||zmKZۤB'rhmy e6O|fy{ xi}YA.kE9 آ׆\5TB̨cڶc@AAs],?25mYrn5V}' h^eYc'(C HNTI*/hۺd>Tpt<81Zgdزnt`/䚱/7O͢ EK䲶|Ev|~%]ev uS1J >/+Wlkc݅"LՌly?QDEI*W0`;}WXr7kt#Z]J^ fz ;݋i#h#P|A{N+, t7()igW7 Fv[ŭ-#0]< ^YmhIv3b̶V&'#&SxB蹑2v1넰Q [꼛~[|T ! |!2zaMbzh;DvdЁ8QǨD D8lu?7)u 2jw<qbhQ~·⯞T޾}M?2޼(й$3xZq:{iբUK[7u4zjҭW($Tw_M8!(:4]j="?R0  :6uKĝn6Fg>jVEgNIOÞ j,xhF`UD_&; c=3=kMO /*U,}Dɱtɪ,ʷWVE}"C)4I3Rޖ@?Wt(-ݫ Lj2noa1#M[Hf%lAyWSPQ9 HF",95毽ڤ}b7`\I|g?} tla3aȍz2\~aM< G3[A0:bg`pdޟ$WCd@JO]Rn]~ONBs5Wv*6Ӵh?踺.Y(Y3FN@`˳GJDI=2ulkhUI\,ƀ2rg>[ A"vqUuttꝾM@e- Hz-~lõ~YQ TT[ui [:br=%j/گnCV{"=Q\,V&/lF"雚w.Ϊe(5p&S`a ̃atā,O, (<%bk{@T/diWi{ &zXWa4o4X:Bgڌ$|KB ܣ|4eoD3%Np1PtIzW W;AK0 ٽ-tH͔jzxÉȾYFN-."Iɛ=qtJj3E^@a?)P7q3фDAF ݜΏWqT6(6mk6n_8aҐaE3*[R*K%84EĨwUOG`ƾZ*EU!OZ&ȱ5If=H)QPP{*J$~V n%, }p̎ wԢoS5jx0y2˖%̾M `Nq^1TI: *<:HO-K 8]ۤ?Vb zqɠ VĹn}c]QN=bfJrL! v\ ۊoN[{r#4CoܷM'dt]Ib#;7$hb/XZ7Ye#)=]|ڄ.k]? !u!ՎKL؄./!HTy.UWT=8ju J΢;~~Xv -U+j1knf͐UU*Ry]{{ۖlB].Izmϯ?8a)w{(̻⎝M8; H5G(|AW酊,B$Z64]C1vtz`e݃hIA[R{#<_YQnΏMh '}"t m؏@֙9zfeڬU ñ"ov'[ú[KECطm.9 \0[饣3S>ˏjQ9tTnf0NQG,%:WyVy? eLؒXo#IK_QTXȩȓ(xBJifr{U4t㔼ďK9-?">l|ـɈW<4~CL&lݛN;/tY&ޱ}$e.C4Q}$:-䕥 zƅ iV~V{J /!&\ HQc4}s4]#ăyS| ;!(r.Z,3FQm:!6.NkYEiM͑f1x-޾"g&x p0͈в)V>Nh 02[ Oޙg{")K`l C{\`NӰjء-jw?-K7ʦp|=;R13=yo\2ӳ#<<τ6ppDySh~ 20;\j@l{װdwHrҎ #>jtg!^] RaR t W٘bg3II')9O5Y$k[&ΫL4e5G tSnCn鷛pqA{L2oZ3\trIW~&N5C:$o7>*7엟Qt b ي)Uz~|lg=uEGftmveJƣrO-HfJQ lt T #zn6xncim7DuL ƿ4~-!̾ZW_|(zCx>_2 Br킳e.V cXwCjEmGjl֩5>9H9Dd&v#vszMe1AEd|S\$iN 9]0fEGcPx> \-Cxj1VVe??S4=/+}䕟US٢;3A`e2d \AIqA@7J9#Sď2c A0pt^\Ш%#%bwf!jSE0` u5|[~{{toۛxam>sEl 9J;.vH8kxuGF!0i=MM@ʓd/-)o Umh o&˩ޡ|a#B*yLZ~} :^葿  M,,)Bh}n^E rFFGxn g>Q_pUeJ'+ &| 5Cݖ ia&t>^Zz0y`[ aC%Y=Z;kЃ]W[VTxf(!a讗^ˌ3#oה>կD?Iߖ9hyޣ霭qqx(smggc\|л _qfHƟqŘ 6nI-p`Op m<@GE]I%)1􄹂\\;xF:k.?%?B,Ef='D+dGF>aڵ{^iZꗍgbpŶa;m\b7\ٜ{5-x8Hs0XH?xzVZ78\$[RQVPsIؿ8DIՂ2 ˒"CAy!u%'n':}M#OD^SȎu* 89 $46%h1pEo)2r N{sthT'=H2zŜHe֯#rDXŅ>wꁱ`ɶ'nq%3d p 5<#G,5V. fʌ.OS|>7@ȬLdv2˺@hS`!C?^hza_ nq̱m -?\| Io̓S^?h^J}ZB-}Erl¬f"Q?EEt|s'ESс(tӱAZlA Qi_3r/_@Bk>VJznvwAWE4r7 3 ^&,Te?$ hK)eawm!:?aiÉelJ8roE\p(BQ~9̳X *okUMdfV_K%#.?-W[ CQys-KBB12-nJm2E/jx}@bt:j{YO_ [Ž/D/"Z@Ҩ.2A$KbfWcWOǟjuȝϟte~NS84Zߚ UK_6e(ҎP,m]>}2JG55e:s :PA<[PLU-\UK_[ skӂ$&Antckqzt]=#~Yzp ! FufA?P8gw P9>Qt4I3_A|HglGla/ںY#&aQnoV^Qp^<(Ik ]Fs1`i%:7T1HX%}ف8JD-y y5DP WCrqf=2Dayo :/5Pxr|58Max]0 VUS۷?r‡2-$C'D'hels#0й5A,+=Y6Mף#Fַƫ©4C6Db^.K66wav%0& {]i"Bdy,(8B^r3ٵoRCas3K$"{O#fΤS9ek/87ƣށH rWLX`0Op`ܸ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 813 /Length 3249 /Filter /FlateDecode >> stream xZYs6~_vW}0J,ډVV|5CI\ǑHH9ʩ@h4>p `i 3T.cF73))׊I4;d`AY0)BLIK-H31Ajzil`*?x1ʲ*f4kÌif0\1= x ,0T`X)/$#}tB-4HTLk5cj- 6(f9jxC$Dԓ*hV 5k`;#UTY$hKM39 E ^=~sg7sê9b}?0//NߝMr,XNt~P.fzX.#Y9sFIru4҉lg:(gcbcy4X=qߟVw~V:$cム$6Mvzm3-nj]"Jgd9e] VLoBy!DB-Vn|q1E$\2%f1l_z3%)o}*#o3Ăw Td*$"jHP/!1PQfiWWڶ\$][,/X9Xl{?,ϛx)hq9OjS̻6w2M۫L`MyJAgX:w6w'io8͆z{8LӪS^N)% t,꺘$;k&5oUu Q`+pͳ\ceu=b)hs/hycrX|trXږH[ 73v+ k\l 7!gM$u1#PPj!<.SZ0%^S3aYrv[eBVDdO%6{2͋lQ};euF]%j9`Y5\|l<`&ȡ= J(bB} X,Tq9~_6հlTMOi3cyܘuk;CǾOvwI4Q$ى_VӝZuU''%<\['t=,gM9.Ol .?%/˦ê.''7xTI1;4R pj>0ŢZ kTs!"a<.Ƴqlt6-AYⷘrm9[ZbN=Md`pŅǫC?Љs2՗3_f 7gg,aoY2U7g%& $/'gJ_OosZ!f22unTs5iF3+>'{峖Ҍ7>:HI?L4s|ar<oJR" .'MI 9_!%C~FĔ_G`fM޴7,DdbYw捿{ÿ+x@9*T(x+稣jbmkp.k=MZqm2$umm1ˎj%cT^ay 6fjQj5u7xuD>Gh{U8察-JEvs-'賥uTՠ(_(H[(<ޖV<&^kRmIk}:թ_)WFuтdR,Ƌ"`2ۼdVED.]߶ű-whDħOtBu[:땢m- Al3tE `jU+8ZSuDs( z83܀`Ph])`CLS~ВM|7=Ujsʖc,CԓI5%&'hDp@':Q礟[ec3qXzyo7LĖ.US虜+4`!mq*Y6>%Y[ ڢZs*SKJѦ~ci} T%/hw:=k_iBۖ9ޞ4ŸLO%87]ġgEMG{|? ^c>#^W|'|g|k _W~?l%aV@׎|Z8;u t9.kpm 5I85u[0hهa@5[h1t H0P'{f˚3g~7!j˺/Eux,yl4:.Pp= Rr/c}8}Sw[$gh;9ޣWhxѵ@h>z .C F߽ch~W<v_a](9~gS`^NG<*?.Lpmֶ!w}ˊ]źQYDw|9{ghKt2b˳]beQYW2mc>]!Zc3vyBf)>MNkI b7%If|0yc fl'3Ҫ=v8I!HYPiTb_W@",GZD^ e_Wd/ endstream endobj 150 0 obj << /Author(\376\377\000J\000a\000s\000o\000n\000\040\000A\000n\000t\000h\000o\000n\000y\000\040\000V\000a\000n\000d\000e\000r\000\040\000H\000e\000i\000d\000e\000n)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000A\000n\000a\000l\000y\000s\000i\000s\000\040\000o\000f\000\040\000c\000l\000o\000n\000a\000l\000\040\000a\000b\000u\000n\000d\000a\000n\000c\000e\000\040\000a\000n\000d\000\040\000d\000i\000v\000e\000r\000s\000i\000t\000y)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Producer(pdfTeX-1.40.20)/Keywords() /CreationDate (D:20211031092912-07'00') /ModDate (D:20211031092912-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 142 0 obj << /Type /ObjStm /N 20 /First 161 /Length 800 /Filter /FlateDecode >> stream xŖmo0SKؔ;RU@W'mS_K-%~g' i(Lߝ %B 6؞ Rl ~l FSx!(> @0qPp] C+ǝT#Fu`QtfXCsFvhZf8Y{1KJúZ>H-U'1>+|0?lRB~Ć6Er J%j"/@J` NP(m_=L5XϜ2a;l_hlnq-KNG'k6fs-1Aqf;4lV4wh?o5ڙd6ɜ`;[ɜL6Ȕ/ k-3"VGBy ] /Length 402 /Filter /FlateDecode >> stream x%9OQ@amXWdT{ ;?õ31 :bbE70H촄_3y{̎Y0%_z$@BR<}$f#'JNI4Jh,R ȪyUw/Nɪjp96; |"d;^v@wp.{_tJUBzp . T<}|bg/ÀzM!00&u46L$܁0pO_Yޣ4ex)~cJ"'R'O{zGRdb9M`bVb~ѿ51 =! endstream endobj startxref 242463 %%EOF alakazam/inst/doc/GeneUsage-Vignette.R0000644000175000017500000000664414137542137017501 0ustar nileshnilesh## ---- eval=TRUE, warning=FALSE, message=FALSE--------------------------------- # Load required packages library(alakazam) library(dplyr) library(scales) # Subset example data data(ExampleDb) ## ---- eval=TRUE, warning=FALSE------------------------------------------------ # Quantify usage at the gene level gene <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="gene") head(gene, n=4) ## ---- eval=TRUE, warning=FALSE------------------------------------------------ # Assign sorted levels and subset to IGHV1 ighv1 <- gene %>% mutate(gene=factor(gene, levels=sortGenes(unique(gene), method="name"))) %>% filter(getFamily(gene) == "IGHV1") # Plot V gene usage in the IGHV1 family by sample g1 <- ggplot(ighv1, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("IGHV1 Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g1) ## ---- eval=TRUE, warning=FALSE------------------------------------------------ # Quantify V family usage by sample family <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="family") # Plot V family usage by sample g2 <- ggplot(family, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("Family Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g2) ## ---- eval=TRUE, warning=FALSE------------------------------------------------ # Quantify V family clonal usage by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), clone="clone_id", mode="family") head(family, n=4) ## ---- eval=TRUE, warning=FALSE------------------------------------------------ # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family clonal usage by sample and isotype g3 <- ggplot(family, aes(x=gene, y=clone_freq)) + theme_bw() + ggtitle("Clonal Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g3) ## ---- eval=TRUE, warning=FALSE------------------------------------------------ # Calculate V family copy numbers by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), mode="family", copy="duplicate_count") head(family, n=4) ## ---- eval=TRUE, warning=FALSE------------------------------------------------ # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family copy abundance by sample and isotype g4 <- ggplot(family, aes(x=gene, y=copy_freq)) + theme_bw() + ggtitle("Copy Number") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g4) alakazam/inst/doc/Diversity-Vignette.Rmd0000644000175000017500000001557514137534677020156 0ustar nileshnilesh--- title: 'Alakazam: Analysis of clonal abundance and diversity' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Diversity analysis} %\usepackage[utf8]{inputenc} --- The clonal diversity of the repertoire can be analyzed using the general form of the diversity index, as proposed by Hill in: Hill, M. Diversity and evenness: a unifying notation and its consequences. Ecology 54, 427-432 (1973). Coupled with resampling strategies to correct for variations in sequencing depth, as well as inference of complete clonal abundance distributions as described in: Chao A, et al. Rarefaction and extrapolation with Hill numbers: A framework for sampling and estimation in species diversity studies. Ecol Monogr. 2014 84:45-67. Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. This package provides methods for the inference of a complete clonal abundance distribution (using the `estimateAbundance` function) along with two approaches to assess the diversity of these distributions: 1. Generation of a smooth diversity (D) curve over a range of diversity orders (q) using `alphaDiversity`, and 2. A significance test of the diversity (D) at a fixed diversity order (q). ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. Diversity calculation requires the `clone` field (column) to be present in the AIRR file, as well as an additional grouping column. In this example we will use the grouping columns `sample_id` and `c_call`. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) # Load example data data(ExampleDb) ``` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ## Generate a clonal abundance curve A simple table of the observed clonal abundance counts and frequencies may be generated using the `countClones` function either with or without copy numbers, where the size of each clone is determined by the number of sequence members: ```{r, eval=TRUE, warning=FALSE} # Partitions the data based on the sample column clones <- countClones(ExampleDb, group="sample_id") head(clones, 5) ``` You may also specify a column containing the abundance count of each sequence (usually copy numbers), that will including weighting of each clone size by the corresponding abundance count. Furthermore, multiple grouping columns may be specified such that `seq_freq` (unwieghted clone size as a fraction of total sequences in the group) and `copy_freq` (weighted faction) are normalized to within multiple group data partitions. ```{r, eval=TRUE, warning=FALSE} # Partitions the data based on both the sample_id and c_call columns # Weights the clone sizes by the duplicate_count column clones <- countClones(ExampleDb, group=c("sample_id", "c_call"), copy="duplicate_count", clone="clone_id") head(clones, 5) ``` While `countClones` will report observed abundances, it will not provide confidence intervals. A complete clonal abundance distribution may be inferred using the `estimateAbundance` function with confidence intervals derived via bootstrapping. This output may be visualized using the `plotAbundanceCurve` function. ```{r, eval=TRUE, results='hide', warning=FALSE, fig.width=6, fig.height=4} # Partitions the data on the sample column # Calculates a 95% confidence interval via 200 bootstrap realizations curve <- estimateAbundance(ExampleDb, group="sample_id", ci=0.95, nboot=100, clone="clone_id") ``` ```{r, eval=TRUE, warning=FALSE, fig.width=6, fig.height=4} # Plots a rank abundance curve of the relative clonal abundances sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(curve, colors = sample_colors, legend_title="Sample") ``` ## Generate a diversity curve The function `alphaDiversity` performs uniform resampling of the input sequences and recalculates the clone size distribution, and diversity, with each resampling realization. Diversity (D) is calculated over a range of diversity orders (q) to generate a smooth curve. ```{r, eval=TRUE, results='hide'} # Compare diversity curve across values in the "sample" column # q ranges from 0 (min_q=0) to 4 (max_q=4) in 0.05 increments (step_q=0.05) # A 95% confidence interval will be calculated (ci=0.95) # 200 resampling realizations are performed (nboot=200) sample_curve <- alphaDiversity(ExampleDb, group="sample_id", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) # Compare diversity curve across values in the c_call column # Analyse is restricted to c_call values with at least 30 sequences by min_n=30 # Excluded groups are indicated by a warning message isotype_curve <- alphaDiversity(ExampleDb, group="c_call", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) ``` ```{r, eval=TRUE, fig.width=6, fig.height=4} # Plot a log-log (log_q=TRUE, log_d=TRUE) plot of sample diversity # Indicate number of sequences resampled from each group in the title sample_main <- paste0("Sample diversity") sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(sample_curve, colors=sample_colors, main_title=sample_main, legend_title="Sample") # Plot isotype diversity using default set of Ig isotype colors isotype_main <- paste0("Isotype diversity") plot(isotype_curve, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") ``` ## View diversity tests at a fixed diversity order Significance testing across groups is performed using the delta of the bootstrap distributions between groups when running `alphaDiversity` for all values of `q` specified. ```{r, eval=TRUE, fig.width=6, fig.height=3} # Test diversity at q=0, q=1 and q=2 (equivalent to species richness, Shannon entropy, # Simpson's index) across values in the sample_id column # 200 bootstrap realizations are performed (nboot=200) isotype_test <- alphaDiversity(ExampleDb, group="c_call", min_q=0, max_q=2, step_q=1, nboot=100, clone="clone_id") # Print P-value table print(isotype_test@tests) # Plot results at q=0 and q=2 # Plot the mean and standard deviations at q=0 and q=2 plot(isotype_test, 0, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") plot(isotype_test, 2, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") ``` alakazam/inst/doc/Lineage-Vignette.R0000644000175000017500000001022514137542144017166 0ustar nileshnilesh## ---- eval=TRUE, warning=FALSE, message=FALSE--------------------------------- # Load required packages library(alakazam) library(igraph) library(dplyr) # Select a clone from the example database data(ExampleDb) sub_db <- subset(ExampleDb, clone_id == 3138) ## ---- eval=TRUE--------------------------------------------------------------- # This example data set does not have ragged ends # Preprocess clone without ragged end masking (default) clone <- makeChangeoClone(sub_db, text_fields=c("sample_id", "c_call"), num_fields="duplicate_count") # Show combined annotations clone@data[, c("sample_id", "c_call", "duplicate_count")] ## ---- eval=FALSE-------------------------------------------------------------- # # Run PHYLIP and parse output # phylip_exec <- "~/apps/phylip-3.69/dnapars" # graph <- buildPhylipLineage(clone, phylip_exec, rm_temp=TRUE) ## ---- echo=FALSE, warning=FALSE, message=FALSE-------------------------------- # Load data instead of running phylip # Clone 3138 is at index 23 graph <- ExampleTrees[[23]] ## ---- eval=TRUE, warning=FALSE, message=FALSE--------------------------------- # The graph has shared annotations for the clone data.frame(clone_id=graph$clone, junction_length=graph$junc_len, v_gene=graph$v_gene, j_gene=graph$j_gene) # The vertices have sequence specific annotations data.frame(sequence_id=V(graph)$name, c_call=V(graph)$c_call, duplicate_count=V(graph)$duplicate_count) ## ---- eval=TRUE--------------------------------------------------------------- # Plot graph with defaults plot(graph) ## ---- eval=TRUE--------------------------------------------------------------- # Modify graph and plot attributes V(graph)$color <- "steelblue" V(graph)$color[V(graph)$name == "Germline"] <- "black" V(graph)$color[grepl("Inferred", V(graph)$name)] <- "white" V(graph)$label <- V(graph)$c_call E(graph)$label <- "" # Remove large default margins par(mar=c(0, 0, 0, 0) + 0.1) # Plot graph plot(graph, layout=layout_as_tree, edge.arrow.mode=0, vertex.frame.color="black", vertex.label.color="black", vertex.size=40) # Add legend legend("topleft", c("Germline", "Inferred", "Sample"), fill=c("black", "white", "steelblue"), cex=0.75) ## ---- eval=TRUE, warning=FALSE, results="hide"-------------------------------- # Preprocess clones clones <- ExampleDb %>% group_by(clone_id) %>% do(CHANGEO=makeChangeoClone(., text_fields=c("sample_id", "c_call"), num_fields="duplicate_count")) ## ---- eval=FALSE-------------------------------------------------------------- # # Build lineages # phylip_exec <- "~/apps/phylip-3.69/dnapars" # graphs <- lapply(clones$CHANGEO, buildPhylipLineage, # phylip_exec=phylip_exec, rm_temp=TRUE) ## ---- echo=FALSE, warning=FALSE, message=FALSE-------------------------------- # Load data instead of running phylip graphs <- ExampleTrees ## ---- eval=TRUE--------------------------------------------------------------- # Note, clones with only a single sequence will not be processed. # A warning will be generated and NULL will be returned by buildPhylipLineage # These entries may be removed for clarity graphs[sapply(graphs, is.null)] <- NULL # The set of tree may then be subset by node count for further # analysis, if desired. graphs <- graphs[sapply(graphs, vcount) >= 5] ## ---- eval=TRUE, show=FALSE--------------------------------------------------- # Modify graph and plot attributes V(graph)$color <- categorical_pal(8)[1] V(graph)$label <- V(graph)$name E(graph)$label <- E(graph)$weight ## ---- eval=TRUE, warning=FALSE, message=FALSE--------------------------------- # Convert to phylo phylo <- graphToPhylo(graph) # Plot using ape plot(phylo, show.node.label=TRUE) ## ---- eval=FALSE-------------------------------------------------------------- # # Read in Newick tree as phylo object # phylo <- ape::read.tree("example.tree") # # # Write tree file in Newick format # ape::write.tree(phylo, file="example.tree") ## ---- eval=TRUE--------------------------------------------------------------- # Convert to graph object graph <- phyloToGraph(phylo, germline="Germline") alakazam/inst/doc/GeneUsage-Vignette.pdf0000644000175000017500000055512014137542141020042 0ustar nileshnilesh%PDF-1.5 % 9 0 obj << /Length 1827 /Filter /FlateDecode >> stream xXo6_!t>حYe+KCGJURNQvC N}Yģ|~<"i$L4Q&L$:YFھlyM9+.Mo6~ *"!IBSTUxȗ4xej#F"g T+RYr)k ͔N2Z0 y63%uI"F8cSR8 OmW5TkPQ6'C|[L/ -M,B*+hC?*Mm?l]uy@/g}JmGS+Z 3Ǟ&W?䚣,t,gsX/}vU 5J99|!yM.;.aZ?e<B'sg7o=mާGw-.eea݃_)6Ȳp cqYߕGic7 6?0:,-Bq_1OrnmzNܜU-.{LG;d$U+Xz:lNe @ri S*e Sb[Lf|n)u4vEqno)K6QPj ]Bq9bbH,x:3 Grjßi!3H-^g=I#&/Fȸ) ex'$mܰ< G# C\qf8r?rI*׶kY9pb6PNzhĉ[ٵִoU[[&̦Me)6*y,/Hj]2bIrh[4KC}mB-Nۺv|kACכU?#+ LQ>oLzhv_-0o;dN q_!ى2)' Ƙe $+滹_ouٹ;v[<OPX{WZlB^t맸N )ȷ(mGQmƹ>wk]Z<Gjӻ>ғ@;>Tۈ 5MUDUtQ)0  ).#a-~N&/]w}{b$9wP]WLo \.Cw!+wPe%~{1A^nn2_2:dzF  [7+Yf/~o2ݬ`= ,xd;.tt8w%h.f]uFx P{g NjiO/lC !ƵK= 3%~%8JJp rGdz0l0TqG  9s=|2j< +weJDB/6N.`U90hU}{G)K3 VF~̫j%ɏ_x]~! mss&M!4%㓇=}V̸_Yq FOYC 5T92hQˡ8}s",χn.!(Fa `rGܿd8J`+0o[wz"Dyl٦MwF%ObЁx9KRId2(zsc+{[k@ev/,5\K1w"v),?R B'bcK endstream endobj 29 0 obj << /Length 1809 /Filter /FlateDecode >> stream xYYoH ~ϯ0RPz:ESSv屬,:r_![rl "Hf!9$T nF# v)]z/` < a5|qf2\|s XXfy0u(PPd(W\8P47O@3<RFg.vxk*SYp35+U(!JlB*zQ;ppH(_m^WVR1:G/hVv)$dS21P?\ y`n[(8 hC.5Ð:H=la#$pF?> Y"-XaHD ³afL Yifs* .b ì 7 Mp.wAOt_ kYz6#_.vh+u<IfmzО# Z٭Y"iQnjXdFYnx\lUZYJzc 3͕%Nn.Ȭ ւT1òxP.8Wm办]kI Z*@)Y[>g1r\HxgymսVW]w;DpϘ\LA9 ;OrWj:+I/Waff9LqMBq+$WxZ"iӣ9s!lVL8]e4}u cҬ"u(UdJƎ-3 '|i@Cj/X.>r=[zwK S4a_@kui fK<.,T{)b" 91 p`XۤY:8E,`]沚s%@յ,Kʖ2&|0]FU??spo֘/^yE"YID@tX8*o2gVLDh(s҉•3TNA/V!'_yMKebCwaY*(1,&||=ׅxZ߄cy77ܒбA2k:6m +Z3ےegim tyYbYKi#j4J\Wy5Hٍe@>Tf;6eո U67zm:dhMWy]ԚЕk.Kˀ9$8[Tg TTRi`lnYU_>E4QTKwʧm>Tc̬9u9阬,8:Ic,HRWojشKUӦ VMsH*O̓QQ['z}wwpTǹ!qr4d'k*ҾKk؊U'Z>)U*}QLA)eT^}pX{ 'GGYDB.ϓg^cRFa*G(Ϫ${V9ڟey1򶷦KV> stream xW[o0~ϯ@ eZ6ݲ"C4ٯ$m袪v}>;%Wu-/d(fR-]EJ|͇Jp% EԻrhp q 0F4K3˵ 0O5d8O>gIpo5PLgSy:.FK.%{XLX.ZOe_c_ϯVYFb)Ԩ L_x?jd~Ns' 3K5j!K( ԗ(RUCiR90 t]>oאeKӐ`H*B7߈~܂_:N S1d-gT#XQ͒3X1` 3NH]vysA7+<oʗxCGݝJqi6F38  SobWق{v+*Af:"!՚;i endstream endobj 26 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/GeneUsage-Vignette_files/figure-latex/unnamed-chunk-3-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 36 0 R /BBox [0 0 524 263] /Resources << /XObject << /Im1 37 0 R >>/ProcSet [ /PDF ] >> /Length 36 /Filter /FlateDecode >> stream x+2T0BC]S]#\.}\C|@.Z! endstream endobj 37 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/GeneUsage-Vignette_files/figure-latex/unnamed-chunk-3-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 38 0 R /BBox [ 0 0 540 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 39 0 R >> /ExtGState << /GS1 40 0 R /GS2 41 0 R /GS257 42 0 R /GS258 43 0 R >> /ColorSpace << /sRGB 44 0 R >> >> /Length 1828 /Filter /FlateDecode >> stream xX[o\5~_D(k*T PUJҪiKRl]M(9\y<؛gƛw{r٩x3{{AOϟy8j3{G_\h[5bs5W~6,(p;_8B0 p6ǹ]MZM~9%*@e kx 6)ͤ.[5j:mrj:QxxZ$[3- bSI%\% !@6)+a 0bJ6! .m 0R! xrvr1on!@_ `RK-6t,~.USaL Lsj X63uұS-CSdH@(]7;湅q 䗌~ 9@ClTw#L$ ] VITeokV@Q:<[ae&<Zk@A\pr6=Bd[lcBmdKqH6S$-sw en^KhѺHj=7B'ϒP42xwAmoSچm. t׸e-]1 0GJY<}{Hzq ŶYZFmnȵife-1G.>xb_;VIaj-17tejeX>;R]ƵTX)y{ Jg1{؇GKnF#pu}Ƽm3Ŷyg\]WËxiOE{/۞@ӞHeI{TR=A鉴gSp>z"9 %A(młDU2̲< 1vEHtL(O+\zd8%z1]R+i.XFe0"dEi.5w=uL()\F#z8\k@fki-81Z=<=T. ߳n3XG[܄h@ݣFO'.BXeN2XWmC 3Km.-b!z PN2gXWd5갔^aA/\:]  4*+~I)GjwN f/:cj;[aOucGR\7^|݂[\wܝppwu-UݷjVB؜@: s{P˛i8[^XE LԢ/T~(nwW}o;" =@XZѼ7euViMzO}c ܲ7Fh#\r58u['",-#2l3E2w .]Kԣw$9mu@u#9#iJNxw^cJ+;Qw]6l3w)pOt/;}-r=)|<$M?.Cŭ E!Cra~}^(x|W endstream endobj 46 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 49 0 obj << /Length 1751 /Filter /FlateDecode >> stream xnF_A@zOA m7KEx$ߙevPs yp℻Q?D@'4 %ֈ?2xמ|߸5r-z\*raÒDsx9IuVU6db^MAl4tկdy9mUkWK'_.8 R d*‚E<2L&ipY 7aa9FGJ3!u׫h&2Ts!"M'f3AF%ytRj(UA+Iiժnz VVϪoњEfǤ`vغS%pS6YRlՔ+w*okجl2u< ?8+g5LUDd*~a"B'&KtG ݨt xZv`k84˾,)dn{]O?C~!Fc#|䖯sD>%WT7҄Ru Y+b#hz' P+H"Ӥ]f+TH;z\QdkL-`F &ΐG~6Z)mvMi2~ݰkoD-PۦBJD®κ9p,hrȣYzhkA-eW\N3JkE5NDwPteF+0*DxN $j0!x8X2/u8i2-OȞ\!:,ǦޘQ,M:u O'Ĵc}}j cN(&m*x6ʹ˓Yq;?ַ~pHm] ]8|eu=/LkCʼHyэ@ixTp)K* (CLm08`*a;O$?B\O48],< U]w˂u%خ` 9٘`?0 E z+`2z5xp :45紿nv$\LD,]oeC}PҌGNo"_У Ä>[8Sb?cx"%mr̳nK?tOu; +{ 3۞z˙=N@,cWA@ )l,%5𖆡ͪ%M4 i06a*6^{ \hRç&a`W"ِEǪC1,  \;&N~D>lmdĠ&c KwD ?RBa'!?x6!XĆ[kG,! 9Gɭݱ K:>/'(}Ґn2ۿE~CK izZ-طr8BTwںOu!.9=t|-S!*ZYo DmN]_aגư:NѺɤ{LGE"ƣ\ T 9z՚'~8}+?M>D~2J{5 `/#$?wnJU{D`Y?ec|bl^>/ProcSet [ /PDF ] >> /Length 36 /Filter /FlateDecode >> stream x+2T0BC]S]#\.}\C|@.Z! endstream endobj 53 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/GeneUsage-Vignette_files/figure-latex/unnamed-chunk-4-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 54 0 R /BBox [ 0 0 540 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 55 0 R >> /ExtGState << /GS1 56 0 R /GS2 57 0 R /GS257 58 0 R /GS258 59 0 R >> /ColorSpace << /sRGB 60 0 R >> >> /Length 1697 /Filter /FlateDecode >> stream xX[o\E ~_1/HPk*ࡪPUӖc=s|Kؔgc3`0ogGJ_7W~dzSsy\tF?o/h?vϞg^<sq/jS4ClW6~Φ6Y_.fv_l _h%PM 0xT;E@hX;S/L\5V Ji%0LI 0BV 3M[t-Z(` D!ɩU1F| &`0惛lcweQ^l8|S ]|pE=i]"cJ:k@a|'e']i1.wB\QqZW]lP6*6XZKI]K^%}vczُ/uiց1ZՈ )ᒅ $*!z n 1zK1(/$z <ٕ.g Wc!rU^΅U/MŴDn/ Uh4()+D Wc֕suG(%bEq˛ufB;L:c ;N:b'GA>3gR%}L*S,ϞROW ?:-j1ž/WmGPol,tG~b=_ vvDYͺ*U9[zd2Zf,a3X +̕+Ͳq̰ZDGXa&Z= 5v '!e*TTNKσW'\_\y*/6<" endstream endobj 62 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 66 0 obj << /Length 1490 /Filter /FlateDecode >> stream xXYoF~ׯ  H I@qE(>wDRm8arٝ]S4S̺4MnsYhu\Te2oϨ0 dYm%@"-'\\(a]z" 7[LjuOY< ]}t:mӋ'^fْe{ժ>>/D"6YM,-ʪ:0Kj)]= $'Ӝ=R- ,Af%zHIJd}II‘)$NEygG,Yئᾌ0VN<|kJ迎yLAsԗ#v,DA ҂p=٨zjx} ڇl]#7j3Ѹ!TB8a9v7iQ2W;#,A#O4ӀJ b,W@6YuCpZKk#'*ltE*8%'8siC'Į)Ȗ5AZ_.Y^O 0Za|OPS7 +ZXJ,] E\Y({ K(9×mMކ'xzTkzv xR2- ^Ljv{*Y9ӄC`yTA.+Ȼޅ}C^/wO)"%o7 ꟗkoמnj9d|ay>@_]>4jY@sw XZ#a@fD_0?:i*;$7fV-8] pD.Qs 600SúkQBm',ga}(~>_0B*0#u#ji/YV}" g{p??ދ(ʳjY\|Z';8: rb`JiYx:KT8AI#=&Ϝ'MzV6=ifw}KDl*ঊw(4a?*GY82h#e,LGcmnOF-w.ySyQ`jIopwF&?bu]@ ux{8Mx;27u1FHVbH~|3u8@ QU G 8 H|{ ajH 7HڇDd1B }HS 1b""T@k Yk luv"!2lǕ,S^?/b( endstream endobj 63 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/GeneUsage-Vignette_files/figure-latex/unnamed-chunk-6-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 68 0 R /BBox [0 0 524 263] /Resources << /XObject << /Im1 69 0 R >>/ProcSet [ /PDF ] >> /Length 36 /Filter /FlateDecode >> stream x+2T0BC]S]#\.}\C|@.Z! endstream endobj 69 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/GeneUsage-Vignette_files/figure-latex/unnamed-chunk-6-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 70 0 R /BBox [ 0 0 540 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 71 0 R >> /ExtGState << /GS1 72 0 R /GS2 73 0 R /GS257 74 0 R /GS258 75 0 R >> /ColorSpace << /sRGB 76 0 R >> >> /Length 2540 /Filter /FlateDecode >> stream xZKo ϯK{ُD HIE`hɏfw R H(+_+C&bNB=y]z,!X23)ĕK ~br!Oʃߐ'taC^̳o\U'3O"}Jn\c@c|"E:٧C2/.zgs}2,1P!,s i jNH ; s4> R TNGb5s*VG$MӰ.Q }s 5' 5)8j(( O4/W!4Ζ[l mxϲ !1xKdj]l*7=Sj B, ;/U*Dǫm']h{[L`G{i6>UkENbur[ \mbS[)~Vz뱕|mƸ%pMQXmkm:-k$Nb.y(k'SJ[ :J2@R6j]8T= u ZBgA=kmC;O RhhsTB9 m<^cN 6@Et B:d"*DbT֌OdpTB9 +(-jܫ8Ө e]mS4g@kKwXU|^sԭ<)6YBh3WLxv*.f 05Ͱ%S@ dmMDXTS BCtVYdֻu q> '25(sRW$kB2rROW WU>bFQm.2Tx+kFUH&ĕ\ƫdZGd/MH< Hunë}4BvF1t!Ï]U "OL@'UIoXF,JݢϢcF!-,XIS@,Jۄf_f\5,Pf[RX;?29PgqJmlJ}.ӊC3^D6u$ƛ'*P܊7,Q[qeb[S@*Pnh3-:.#)VWfJ^8k^ruH ]eK +W:+YpxjK뵘BLv7ٛxE\XhbM ƝO=?]7%6:@v6JM-?=Qu.NW=i~$2:݅p3mw(~DT_'˽PǠ^8{1FAmb[RʿM?U)*2C׺X+8WOrJ t'1Os{B's'n{9cs^vdpal7@-B_)~s ﯃mQ2_}ht{y)rCx.Y&ύ2\*ώJskx~ *:pt̕yh6 W|[LÈ yvzpw~iɔxW_ePk IUxǷx.'z endstream endobj 78 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 82 0 obj << /Length 1166 /Filter /FlateDecode >> stream xX[oF~@V0afHK/nVۮ՗0TCgp /Q6ܾsl{#Ę 0!6dcp0y<_I-wU279@4bd~I /ZuuĩUR?QjZra"vgU*OYEp 9}eqUg :.*Y\%iW_|bq!&d|eUbh@|"jeN]kiCq :Dt d^#gRTD_NLTbCUrTzfvB #XW*ِ5`q_v 2bCuzʅJ9A/oe$6g3@M rPT:u*J_0CQ1\y؟)WV`2@ǫ$<_9@Jw\GAfIpd[t-k׫!$ٶJ^bC`#nD"n[!{0i+# @jA ݝ?g0Zc2єrô@b->T-K!Zfaoz"hfzUWK-82JCW3b$qj+/M "B?Bu$\[9KJAgQsx':vn1(Հ3s)+{õᒦt* ֍eTfrc8ț9^~aWDy8 f y& ''0ۃǞinwlp:$bJ+գHq"WR} CT")$7Hp" q/iu9|Lh57n?U)2N.}r_q踉ŭQ>Iw[B䢐YTyQ!RXo^*+uyaCrD\>9r]ٯ%|fbYwSPil? IHC%>/ProcSet [ /PDF ] >> /Length 36 /Filter /FlateDecode >> stream x+2T0BC]S]#\.}\C|@.Z! endstream endobj 85 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/GeneUsage-Vignette_files/figure-latex/unnamed-chunk-8-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 86 0 R /BBox [ 0 0 540 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 87 0 R >> /ExtGState << /GS1 88 0 R /GS2 89 0 R /GS257 90 0 R /GS258 91 0 R >> /ColorSpace << /sRGB 92 0 R >> >> /Length 2588 /Filter /FlateDecode >> stream xZ[o ~?b^QdVA6.h4٢/ɏ᜞;'}/$R%98#?_pq*o }vqxE?ov1N~ɧ} PCZ꘦!>F1G_cOi_@k^s.8/e45|@KcMN*_fCU.th'PXziY@;%urA4;JC)+cǜؐS'' ylmRqmUB f74H BDѧr`R<-)sXl4V!7{n2%\$xEXQ?˞iFe,t{0 g*(U1Yz5TI/dׁ6. $|FmTOd6]64͓lh BDѧqy(*6"L]DRj׈S%^DR$׸j.npkDR@W%cgh'G%9JIj+ok؆DNG%ڷ t7Q{_„5LiQ;![4/`%J}()!V!gUգS'U*EyGhmNeyҙh\)!V G\*>ygYHQSiJn.2_>*)S.RZ(jVA|j\Acz&YlJ'Ş,Qy˦ET=%σw eS XC8[C偖i|hBbT^Ɲ9kɎ,@FUOQ\Q=Uc1MZ ;[\,mSBOJG'yI' 7Q=,YO'g ^]7kwʅwU=WAc}fB+ZkTuЁc.r]e(խó$+0~Gpz#|\7P_3__> pf3NީsKp{@N/|py{qyL|δ_ Rs== )?'#eok=2LG߼%1&bZkY~7>l%5rz}4.K4s7Ggdgyب {W/T"L6[_>Ǣosm17/͉ˬ}Ω,sRfW?=s/rlf<OgЦC(ȁU&_AqWHjOե!͢[/dvzBp:ղ.jϒ+hm/GY'=޻Vzw ޻>TUnLf "w⏗C ^Suů~pp~#Ic/Sm&@'y#9ݘT6=ʿ#D?>:0"-\kn(͈c/ĸ?b|!o|#iq]e-5ZG+)ښ#ߝgTW)؆T~g5]Z,Am|E n>>#)ɯ'y 磓V{jZ7Ʌf΂i5P#W]]Y ?E7Ul1>pgCC q„7b=egzqJ1 2кKPD"(9?wjQH endstream endobj 94 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 113 0 obj << /Length1 2039 /Length2 22918 /Length3 0 /Length 24154 /Filter /FlateDecode >> stream xڴyct۶vܱ:fŶm8c۶mccwl'>7j53Wo PƉ +lkmhL'lke`gdd%#q:Yڈ:NcG3##,@htPr@'CUw; /hDgdژY>\Dl,̝`鏷0=@`hcۺ~-6#) )$U?8:O-"*jQ!yU1P UhQ-@^C'χw91U!U-E1&?k0\Wm.Js'';nWWWz3gG'z[3z;S5p:X>VlcN's1I_JV~8}ȝ]G#Ĵ94憎** -l66NNΎdO ſ D_ÿo¶+ӱ6t3qvGosƶ6NZXTg,l K~φN;6NnNY'$* dd0q?H*fc"bkmQ#Z|XmicjRS ?]7qcPwJo n RŔ?b?x{L 7XOGC O"X&?R6?*_l?_CJ1&6V),(w7RgC?DTQ hhdlK.dAz!3+ǎ%R3GV8t,Y:&}p`gK?Te%h.ۚXؘ`fcx2}PI 6N.;g'o쟍d0 qDF\#VR>b>b>b~D1 &L? 3``lo#?G"38NKG/~*?zOf9 ?2~p '5<\/%P&rNn_?CO¶nt:fN.X8__g94@ve֘'kjsHXt$Y%tmn^E'%tDgEoے!٨Ejx-#ΰt;4T4|caʖЃb%`b>>FWvݝQlI]Ly5ocR ̈i:kdɚS¥G *^S68"k?YYbZ%"/aj(/dghj 9Bs N䱖k_a"7+qgǡs7% ~ChRާ\W,A:TC'o5:[Xl Z;tpB\Edcf*DeZDeTydRt.kΎߏ9SY0/oțH.~DYɣ2lBriȈvbm侈'Gm(X{A]8K?h~ ivƈ3TЗp‶39ٓ\:`>> |4Dw8ZҬU]az 'REcņnr]& \Iḡ?Wu)jeNswOWzt>zpu;abl֚Z XܕFocu[-q7uj4}5+`Z$Nqm 0je7xik5s!vN>=k{qVߥ9#-8sWN)G!ܴtÙ%>GqKԱ6]Dx)T|[t,9Q#BB4VAj\w=7'[oN&`85*{o|NV]"`gU M%[>Gd&NqU|Kݜg>rp>T(Oh=u"l?Gwn R[r|CdG[ ~H@S4yUO4(+ W2 2ﲀn,S EQ8Bv2]Ȳ>ڽ:{YGh;ZE'ݖvr(J'-͋ $HZ' ͠Ҽ>x,m+peNw%r.B|<Znnpj[@<1ߨ\BC?].6:}TB, ~4$ + NajDF~CYȒI:h" UL}&3ZtOO9OE}F:Ŝv-,J⨜PN\5z 'L =dD ⍻}%*门l#^9)xpBQ`8>Ŕ 5u.q}<x٤oшtbW&ޘa0LzP ,F3R8wg"]vM$c&&VbL=/mfqhJ@ԏbttm'79HeTLCO(t=ZWj.}F׬y`DTۺZLlo*`uZ{P10re0}}*w b+f~MdG.rh $&gGt7G=Cr\(1Nv^h9ٺEBU#u'gi.cf^߶- `7oߴaI&^i6e}>JN5O:whb }l,܊R5G9<)\-q_^>`>l8( Q/$-zJhƱm](@ MoF%,u䧪ؿrČpk^$;vA>۽gG= KFڷ/, +"^Lhd'Z |M湚l-#캰)|y/w5vyx Wr/ҞFEcI^nmt(0L& ('iʡgг6Y051Npm./W* (EXӄKNxӟ78`u <,}^OM|sBe%-9 $=rnT i`B 81h10mT!?5BSJBgӤ|o ;zz)P}|2i1ʚ_Q5w*a s,?QSi@)og6Z0HO@v7Gc)E4 'N 7?EO#0W-'/[ h#* *Ua bſDm==;r/~'V,&Q\Sq6Aa8l@8/CS 8>.E~;Dy%|7#> :KjƼdK&Z!ׇAϼA9ZWN1: < oH*LՎ^y>&Iߒ%68lۆN|'rz;4>=$fbPB,a1O& f%fh[W +JH(](֎:]By) f>RԉGu%{u%nvGr4]\D@J~@[&֦fHi47Ri,5bQt;$p0|t4>YMMӠ )*J<߹OO;?q\#Χ}CLR=JZ)E \_ ltի^uUN u$9>~{AD.ر$HI>H%՞!/j:D,/_d}BcSHS籮Eyw68h75ӳٟO6``xjB&un$iwiOh27|晥dy׽_Ǖ?k{42PNJ]Ub};8h n{elȪH?D^6$͋0Ӻ#K5ބ K̽H$}F?_d_]5D88"g/o}WK2j~~`~w|O.SA#1kN迥:p`M7!ZJlc^GG6T?AudZtw},3%Ft'( PlR~ɼNMfd=3չ͈+ ̧ _ø՘kE-I*E\@\\=YOFTAicr 8 k#f r<1p!F|K7E~P?"OгP.Rªaqe vkh1Co=!?iJG>Ƨ(o߿>i@־X ät1 o4̇-C 6NNՌsGm刅B ylv]G* WTƳ@ѻ{un@ˤ\Za0Wo 0ESAb@\FzxR^Qo+‘oPY?'!, NZM= zqp¢Z`\I)Sllg;ywBT9!AQ_n!]Ι|g9n 3.IB}s$ǯ3)pQ&ٹAG C)u*Pvɦ,!Ij|>;񟘲)~gߜnK@Ip(::4rF@I樂 Lo斥>IPT?fm1˗:͞i.DZzB,Jo1t[r4wlMfx.p"ԟϳ0 ۗJ_2"L>=q29ef xKDBy}Y<1"@-=m'\OMYvkۯNIyqtDT_6qn7.3H&v^xC-C|Y*x?O N;^=bΉoIŢ# O~5-3F#T˜o԰K!i>ѵwJ :??ߧuޣ؝;m)b,: "ZmE L^~['6H/QW=S}n$;@dIT^:d&W^ -l%8+4R!o`~_Db[e_oK)'(Z$@[K >HQ};2l((ttЃ7\}E5=຃Gaq6Z4g<7nٮ¨YMI#T{;-Hu?>[I#X^B!+. A"}13<_GE[~KTD#Oۺ:,h"\>I?_(HuQ* /OZV.t3sNR| }c QFSWQ /d{1FbWg舝0=~$Us?uuzkS}?q %$d]Q/2M~ww5q'w_#q J^~|3t)]3-? L {)fGn/Ȍ /9 HLx6ߚ \J~ڊ$_7df`Y:؋hYP5=gglp^Kʘ pe@-]/i#FJɠMOPh:_?W! p>YبFQ`ҲgWpLFƶ̻\U,wyM"IWRTrz?DUX7Ge!,^d,*ƥOzpCWIjm=/kؾߍU³*~+&~Yz29gSk,$+bAp\9lj~Ꙭ-Ң79a/5sp2 6w>hh$1G۵mYN/W]>iZ d/tr5j:tPHrfL'RҘ*g6I3 'thQzCeof`'-cL}㶃$ C;lRMqR-i)0#DQ5zlr;o~E߀`{."thT@뒞[6f:~V=D$sZ_ $nf=8:XSnX/#RUS,%TUsMDu2J"Sn?Nx2\^9ܱ.(YQ7c"J Yj5Pr=&59/ Q:セ :6eMgy&<}xiI>3#dLuثKP~*H ANyGbKn䜇OjH&%z'h|>:h©Hvڦ ع[tGȇaX@l5J8 @>;ҹʯI֋0RS> %E>lHs'){^8Б>@>A: êC R>uBJFӪPhr؃RdD/Y_=wRv'>Wxn)JiCɜB7xGt*585cqcªw-"o;}ѢIb*\EwUb=ḏCc{wԃF$tg*p,]y6+zEz+SZ( Vc::l` rj3rEgF-\V_h^SQk``TοUI.caߢ~}'9uXuޏYHΪӍOBXbʇ3߆ݔ`~ur0ڪq v좸2ϚlZ >X9S*)K[Gt`0J_`x _-cRE%,wtY?(@¶Eln!e|&t؜hTU}+m9H. JΐwX2q"J퐸F&?TTk(5T AClpcFdA2#%V1Ɯ9X&B81YD17Dѝlu7oJ&6GM ?uoaښS(}~yQ|H(ǭQW^ ԑpyjhFISK ϤAW `b⾑ߍ `E%8oHrP@\MxM8cgoǙ̋Jai&.\irU;'OneX~'TGX麊uyMΤ[uBſ?˕:/FR\[xR懬_1F=v:m 7HK[uxwCm@2ͿTJX1 \hG4uX ?'zo,tVrE#!zV5_$dTQ׹Ă9Qk%y_9)2D㴔t=89U}#ֳ"c I XRnmSQʣs :r߈];W>nvCP,&kV8&42脂%Ԃ)`NoiSwݜl9;:zeQCАXI<7K.j{VŒj.8&^0 ⑶/Cwg7?=!,yWώuB10Zdaq§s@ޡ\f,[@ޢעOI"T0)c`XcRAu}%-n5:+@W<\dc`j y*McM+λ@h mi&;K=}dRfN{c[Ϧ yNdeS3t}^+m9iJ%lolZN Y[ 4Vzl2K;PYcnrJ63R'un?ÈV4Ԗ̯c? OV.nw˙=JB9̖5A%9T[L6&?o&:]99}Q}-J˫w䟑n9 ct" s ] C_`"'ld:N\$/1麴zfgXf& nIXص>z`s@ۘkS%6K]sK+3V:s]Y-636\)% ,i7mgf+Zj̄(Wʪz'G ~w9DZO)ÒU ɺ,ȨAo wˉ)ˀX}C0HmY'e,c:G]=cP'+[/JtJ _e76c\T^t_w in8zu9VXN\m%9F7b1h'a(Բ)ש7IBeLQZMB֍i7EcD]8wS+36Ru-sW26nMN߷,'8j&^4T8@!<ο!\!3J"z Zn@pCbc7\wEe>I)T_l^uP3v< qi=Nӫ ^=4ED䵡w/6qhZOebM 51/8 cy= Q|/ f%Yt݊g"&W*l7+@2 ,DR6i]!`shC]Ld1u<p .MX7gnFݽka>r 3ǐn^١m&waf(Gٶa)y3Ob=} 蠧'̗s fiCDrg$nm%cX4Crn{eyTpY ƁTjjr F;?+^(9T}Wɞ]ifYtT|T x rL}VpHYl?Ssh}xV!LS"tdfstRwߛ9`%FBT8kL[-9+Mɪv/ ;y!pZtX T;<\WS`yY"Xy{:q% ̠z}|wzgar73k ц.gLYtLʤ}D&'1}M00sҷxRsw~їr |!6$Oup'F 'hwL10`J ?_LByޑZۆ 'Qm~a+ !̤͸Sd4)Cһ3Bw}@vIeR¸GB2ԡV?Kq ނW^o\Ih9f>t޴L& etN)Acۖal7$m Yd,åx# _?wH-sꙁ*o5W#߁V_4R+ի!T>75&M,Oڀfh*hrH߽%uM>>S_w؎cܕBg5|]Oy(BZ!%UTpBXvFIH,z5r (M(tEl Õ3uK h_.mz.fƜg;_,$w0૰9e~>sL3]9X{:)`rI)m+'/\(eUW<]8ںx4܄wGH .YEZG8#XHZe VM4ot ]ux(aL^(٨\zC _GBff6 ܑջmEL󓲢H5[Rn޶k3wzQqbCWp]A-`K)Fk9WO:vXQ# S]ŖQ3ۋDk̈j;_r庥s%KmQvĦǍP!K~prucﳡYkY^rYn\KA!G߾t 0-/t׬FR; WXM6uH` ropvFj 2mgmǤ-k" )6eTxEQZ# 6 .{$G^(pK axCiK)3P%]/L,9WHφ,.^5k // S_WY{(!K K7M} Nf22fX %I*W_M;5ݽ@)Jq A-o.7x Ykߐ#J-11%E=eKPGrQ8t apE8*̼(f.~I 5O¿q蒑:iQ yJGp944"FZg2< iT=K2.a͎E~QFNWb{ Y/#6c脞ld+WF!0 fNNM~^ԅܧf=_ ŞHDE [ m-y ]l*%#~(o ,,1+ur 1'6/X3r>1z_C{A5wCw3±-5,Mdj+ wfnjXU|-!ueicK_nςP8P+@/>mD'G_er x9 C7ggX_dh0{qQv2 緕A36(8u BiI` Bc' *)$2UʄC]3m5Ò4Bwe t+>|ʯxxI#"@u)+"oi} GED2>5+BJ'͊zڪ?".i02 :'f&tm[-yӔ,eJfq"o: sl~J MYL>Bd}.]yI\TSt^ J43yil GT";6TA!N+A5KK-V*iZ}K~ qrOGao(f6J(YT iAڞ_M;/9Og=09~ ɫNڵ5丏߽l?(8'Ѥt9g3b(%z n0)SH$i0:Y8~0kXd 7Ѽ)*/֛1DT;|%GSfFxi!=lq,A6N:wцle9\N*kgi=M;aS{œWU+&fbWen M*bqy Qzkד4gKŦn鮛 }wWԐfv5&+{C\_1&td BD{JDqp$GX[՗e͙vmn[YCZuD-vnGܧL1bȎKYIZwX3CX%dҥ>d~|v~$0/X ?\OjYS3,np1ˣ v ]>&R{D)tr逎 sTcJV%,qq2jYFn}~"~'*DiC TĮo-~&cTϓ'&e\OՐ$v'_(k#YgLG9]G7/XrE/Wz>﬽ +KǬ#]l?zo}9עtSL 9] d-TǻCxZ:!.kLf.y/J҉0jfUKۃyDWO,m3lk%?cy@[3bp!DMp*> 'uz/R{f驄˾yd,'o(-''+*+M6'ĽȚTvxy&#Eb SI*(H^U:m3kTEGT9\ם|$qR$fw1QHp<z=*9Z> DnZj [UrʇS)lRvD%H3L59=. v`wKN4H(]rO#Q~_\v5P5R禱=@Po:JXg4q@i\o$/JUU?9`֬"5IV\#lZ #}Nc|k]ZOTyNyo1η{&W:КƪpMg})fzؕJ<2,Ul>f>hhJ?Bѩ`/c-)\ cb*\+tT9,֚ky/$CsUH^n89덭N;'bny#'OSńN?{W%Ep .yBGQs=rЋhm }jYY X^$NT4-P/uJF{|f[uunt#-p/~WaH| q6Cr֞aK&YWN~mr61|Kmb+$OAnp5$:[% NW^.~:9H$Ģ~Ī:y\ԃc0.5:d+-vȨn6&a&¯FuثO}r="ߖ&0>1 8ve'u*;pljPӲʖ*܄66 4ûwPw *6JyfΗQh1cmu 297x27hsC+R/fAa4QM(NլP<>p N\D7̆ VWNj?rNC1j]F{.- r8n\GIp&HS4ۖ3ט.dEP:\f[J%{闥\<;zA2JF|f2$Og \cM\=$@;4) 44aIubyM;d2&1.D1p!ml.x;%xx[1Er7YPLx5WF[tk~]vYNX}Ιi{FH7/7X . G!frR/c[BAHwM"b:fw9t]c,rߺTnW?·JT RfƚAmE+Qt0t?iaz,I͜Ӄ7 >_ɞ؞e0vYwN/,|g≺Uϡ.|,`x%mQEuyRUZ $*ЊS(zQǙ)Fɝ^No: ,nyU"Q,[3ᓒ;:098eɨe߆SEYAZqM|5N+M%}nDz5!˂^6,21gBhQ, l5 p`΂+j!άa}s{6Q^Å3DHó @W)dG>(m(:4f<+dn n{̀.z9 d}?Y\ I5 ?_|!i^vzV1?$X&uHݜd0Ss̊B|B|4l0@5N1hh%6 Ρ4[ |C8,dt1HsRP]AS#~7ClAP^XD"ŒcS?LPf9԰~I%~m鋣vg3rLs̾ ^ł}dpJ -L#㦺`mRąG}t/Pk;(]d| Mѹ)z`UĀӭE|*ex(3]C:Cz {_ٌ:#*9`׍fYtlrQ $\t1k~B8#3tp0s# ycH Oqs?zRf/+!)*!rmvK}٬,RtsB|Z"Ia|ӠkA2؛0[ݩ;.'ppB Z *ñX1R?㞡$K]f3AXIkU:޼ u1u_ВVъddEF͸مp>!hԔ,Q{+%P1Зn9cEֳ$(*c2.+Br`a\Wik;Pjuk N'u,'4Xo~ZcPC=}k1 T0(n2lyi8XCn/w 8̽ !"ss%`$grx #XM"116ݕ!KwSz5r7șUջ ~]{7;`M !]b5N邒L9x65AtÁ9\9jv/kR|1*nOhP?lNy6(% _(-鞩*e As~@( ^iݕ\%i1mSrkc-NsÿB8b/zRg~ߕ?NLD(EK] C5۠LA5DMI9-MH}B̧Lg9 {O^2V!"حYw9˧1 + n=O#}4WMl#ifg(Ї/>nefxyLжJTg.tac5-zG+#[3^ 9aƣmw$(C,FiӇգnZlcbi[8xjcŜUSU/KFOl^HBCAfH/qFX. endstream endobj 115 0 obj << /Length1 2562 /Length2 30573 /Length3 0 /Length 32060 /Filter /FlateDecode >> stream xڴeX\Ͷ5wCwwwwwqww'xCpK}@3fMsԬZɉTL L<9y;c{f&z3 \hj`/f pZM]A &&nxr$ Z4x䁮j^@f?@ŕ RBD,,]`w@ `loag(8xV*{ `PjUUT*J ĪnETUM] &&j$U~Uڃ[@ˋ i+33 p:X._(@B͝)tuuad`psqepp`p t $%_ ~ @h$E; @Bi/w e,]SR[ٻMAƮn.l_nοk/uPgz>~cn.im:ػX+#`ne YcVWU =H{WOp1qL!7uv-H'Wg/;6> Vf濵7ssdTrrJ;ft0N%o3o3H?GG q1v\݀~>/'gYFt\.mog9Ԡsj`o03*8F_$lmTGv4OrfKlgl_kV.V@3%+WSI/1h-lmǤHقftXlKS{ _a@oF )Eee;6ۛ:Y[X9^LY`ag0 ϰ\A!G7W?3 `0 6 qAF? (q83Qb0JAF? (*(qT PS@5 k#n2@L@MFtz2MlA6;?9@͛A6@P~s?XCYAm8wps+!(/"d_Ծ_ԏ_Dd q8/ fAƠhGM6&a@g+dcրprspG'_L R/A.4QwYNB\<Ibk̠jqtрԴ_nAAF 罠ϥ P .fA? +ZDӇ 4,ܠ )h8#_'//8Z6LCs3~ВIZΘj! 5fR:I/"}obLYh_Y\xzpR`y ̗|̖"(w[c,U ^yZGs#-*^;T;#fGeYpQwݝ{c2y0ĩ6Vԏ`t\-$zX؟!#' ]:܂D)sBqѦ~q^j ڐIzd[ 6z#x~$dϤu{z9Ա݁}_6Ddy1Zr(/Γ8 .Rhj&Ch͝qah)@$JV]|njb=l>oŷ\[DZh<>J8rJ Xp)a ۠d& jI@cW&-aIefM,mh'#-C5?1xQҸrQ7}͒ɱ&crz٤/Yϟ0|$Mʃߙ)R)XT%a;Qmi/ /VP Inh;=*y|/@a$$)k4'WQM [݆Ǯ㑤g>w< )?oaOP}S&0{ԩpujPtiuQZñ~E\~ bg"s( ,x^9% _ ;>AǕ_Oi K7g dnj 0Vfm rA@T.aγȷJz^AoһX1(n36r8_d9g"ʗEfS;3]G^ˤB4?ox-?!f&sPv\,X` [):ZЃSJڲiÉ1!.&Z iDnYj0 1QF>Q`l FV[r͉|R'GoJFK-OT%5k @2x9ST1kkث)94Ed-8r>fiK?%YIQ^ݲhwGmd[ʯ6> g#,= @@"}Xm/W]晋JD7|ո~it4TpI&0z&U·*oz|%эߗ9[&Q{0,8gņGAyUrƦQD@p:WD͍_g{Bd[sL׎X$^m5` ԬΓ"w0Dz*bp Lf*ჷ$u({* +DaVD!f9Azb9?Ӓsv/$!'Wo>9 ?Tx.6+x!e bJox :`"ͻQ+KU {S m&m||KieX EJaФwJeLskb93+}`;3 W/޵y.Ҙ%2:*Bovlǻɷ}w;-(:H3cȤ'+ዘ?T)yED%R檭I,qHaK.wx"if =V ` dt~bs*[)p#n<- 3=R0W6Lkj;&V0d8]AiN%2Y/OJ/pcI4 ՒO=hx/ާR1 r~>;uͷkI#DjR`N6x Mpe(kn77$ ~C%6 V,B\ʎs752*/u1ŌwB'>k+;#j}`i6"ٲv^cv*c9}OĶǍm8&*& FC.Ѣ<ǃAP*t%º|.U?1}J0 }W♋06)EYu 0Z=9sRrFd,"I kIU @lK}lu|J= 難"Hr`;W擡i#UCJQ5ϔeKj$Wlߒ? oŀpdώ@EmbtI%[RD pxEz& g U%z7v=8lhv0Ȇ^A KIo=K6wNfq7z ~QA6 c֡&Nox`MjcڟyNmޝDSV+&D3҅3%Rfr^a_PxbMB=<e]ђ(\?x W3YaDT`Պv{S/_՜@K+5lqãIxA+r!Yk5O223G޷G[ց 9#KzW_7լ;+ӆ ^ryF%ӵby>r+<]N-x%d&|Jgx#b]@9l@]jdɜ*~{O#݋U 5[ TyQ-)1&DʢlnocuQLc껔%8w/iv7IQR8o2 [ Wx1MM5/ jfo:F'+he{o]i'T Tx6:yB0qe+wJ =V޴vު ̒;Q.5ژ[vE胎'Z@*ـ}Zڹ]#8yVmckΡ|ܚn3⋿Vrn>-܄ٴ~$Fb~1=ϐ-UgǠnv)J5Ni^@i2Xomr̓{gahTfOVh{V"=< ޛp톻WUh9b?s&tp7]N1*r1pY23U>|T,I8.B-5o 0R; >km^ N->yy >K<̀߫!ah}qF\%JAv +f3ӏ<<&D2ފb`I8&up)X4VEe\61p ЀXֆ҈ͼTv)WBY]IESۨNH,? lT9|$YjAD=WEE+*Ҷ GAUݫ@hYp~ 7kXb7XԼHLb&B^U=jL=lY7IB,)#2ߩ,欅0/#*q8(7 ed08sأո!Ȑ2aۊkaK` pWGb)k`fKđr32m{O@5G%nYKΧۦh/K4AnQ' o(ZRh85dK;c|R_#GE< ^w[LvxX\=i Σã+PIWOQ ׈x؈u/Tɶ4lüJa ww3ci]w^G?3CfY}Eҗ۹ B6 q4vJjki̚ E Gq [>`6O`+ۍ'*ub?k *25ANkb޽)GU'Qz,-a{6wV5gL~FQ^1T6+A|^l*acjyF9Kws~{bF/h)۶>^ 7 o?˟XuO%}tP{1s(`-ޠeK ;϶ͧ1O{z6~_*Z"nHLzga~pW70^= !Z/J򳔻MGTa,b'q2 sd/"rφN g 馇~>_7 UVii&;1-x~vR6);W s31K>@"%C -*juH)Y%}PxDŽ!]uN}sK{V" a}(.8w|E5G֑7Esb h6ZfYiuUꇫaV/0ā{4 lK{!^˽ d ̆WOl?a]l98[yH ~lV@Ԛ}hǿyqoopڙm0]d$o۪yZ,v`<0YbO4N=Vgj#yGI)ۧMSNO֒U*lP[&orTwmVN`x Z0 M<[5'eV^'dX¶Iz$# % %a5!U.c?%̎ocgsFZ3N|]{G"O2Ϯ"dx"#·cǻ=!U="6t\ȿgȟ?]uHQ#OY}ivsp0-Bh0kf`l_;[Ķ4|f$qs=?[y'@oɄuwNwЃ1ɹ ~WPZ cT`|ɽ\;@S4!PR}pqCaKVi$^0 n8ӟK\J]#ʆek >'v-6S1]Ԏ2+D^冏XQi>@^&*xh:#1$0v^#"Htv2AQ|f&\ 5hܷҸcNNV#r> (V LT N%:4}P! j>̳}>WZ_IGQ-tu[b$DD"At!T;;q2!7z93IΪv6~um\}l2R/˺ScHŕcb3J~XK7z D}V=#(2sX> =})E-09}A9\)NnŴ#?kSlςkt;rtM⁺Ƥ؛Lasp-plGݻ"lv{ ߇"Rh `v$~b3!;WkNڬ]+x޸@䣮7jzO-KbQI8]dDL$umxF6-AMEgp k¥xy'g=Yuk@5灩R3f";XyhR\?Ѿh989=jr匝#S>vN"A'-yQ1MOpC*t0C;HgoS`{ʄ\H#.~57뤲zL[k;OU\ٯ3ުR:1>72qG9:H̱ ѩ{tupZN&dttnfsKaV>:vÜ-;W6m;ྫྷ,gK#!{`8=xa_ZGZ)IC>;Iïk(hYc?iC%AlA+5fݡ*-B2aq~%Q5U]W_))|֥w{q-~bXn=ᙫdlmҥ f|M=;Rstl1,^;xX}f9ې6;w]Rߍte2(Ea,:b 7R6% \]H!;aMq4K0(2sqAiMpLӳcaaLSBIϛ^dA? yKVA 1,6} qMg(^BueӺ_bƾ혩&b؞`ndUZ 2TJ船 eJkG4 xz#M1;{e'Cվ^A؅p.GR{j$2ؕ(PJgTЅy¶&AٽpEG;p(}132q5 , Zd5lߓo -,6K9?wn 72?Yu!0\69b*cӓ8,:q5-I5>*iHŒoVwlUscBU uKϞ] :mkUƜ+* *PG< 6bo_׷BW t?p5`x갇4 Xz[(UǤl_$˛jޫI\BʄNJ >-U@D3?O; d ^J ?^.-T=~:ʁ#9T`ᕪiUY&j-+$&%V68N xHJ+pwZ0:1 AO-ʂHYSC"s;Mdo>)[EJ fXZjH8iS|m=u;GNGfr.HZrEAkFܽՒ`hT7ĬZr2>va[:FyLǯ#bN*NPpEg2yQbym<9V/٭t54勰 9.0+ߠC 9ԼXW>uw~-澡Ը8$@!bf"vnMUk5 ې˾WM3dG nKZ%B^,+ yÆ}T~~OŠFdiB#<k{: mk*l!ZvAѝToI5'(#>L"'8/ǒ$XfC,pmFI~ٰ &w/Җh= ̮8 ?@ˑ/8~BR?&Dk( bPgg"Ջ5r*;NQ,*Ta"sr^ELecSpv}7A[3|`.HFp!?!>kw51v'?}r3-=`Xnշ7N3j[ ed %N(wG1ip>F\3Pl$p&$b]2!%T4ʯ :λJ;Fl]+e7qr1 GSC3feY*ÇWoSrW|dp m3VU䜇.kWpQSJ0!cl|lgd!"Z.iQπ`S} F 2GlxAq xKl}7\nAgyCxn9rkTM"8 ;sEO )U`_x*ߡ(O=A|e?>^; %# ISlY0BikGQrf7}j;S=B#|ʪ0~mFٲxֲku7>nZp{ ¨-J˻3|#OmX]+Lɦh65qD,^% I6@g3m*t, ~Ӥ[aԧK h ש;) [sǪH"_t=05܈`x u%b~2A ot=b;')N˲n6%ZX ?ِ }*T LB +=mtC]5gqewbVFY*qU"]?6~gBn?*`ֈf? ngG$ኃkdwbNro[d5B~bsuvًW#',7v%Ҿwrץy5|Vpj-7:?݈Sτ- h|noWXO4WT1 2o"וWɥiY{)*l1KqQTűij-0`8Vߓ!Vj׆o/xPoJ+9F eՉ@Ua: Qs1Ht΅ȸ1!8+#|S LnVepג-Òn0>/[=31 L*Z80<:\sq@CS&J$.Kem[W;Y!QAcc@Z= ӂ t&&;";&ΉNTLŏ_϶YUeU!)y`,dz`(1VƹZajɣvM0fwKu{N2@qzTXo)i. sSA& W#:r\'J"_֎P8GM Ї'BL΁nW&njD(Pݹf&rQ3 ߞՁ4=8m43YZy'Š]c"y0*ku70KiO=桹EXEF,8gj oW& ї:g_kiVGCAXgm,13`6XV%>Ɔ`R\M":/E 4C\X(3@3T]Y=f|a5{n^BǗ(-q!\4jET|n]$W+HF08USc[da>H<ē]pv2Xu)4ܸAx*I8o}eQhbTUq9oEc_ Ds &EPOx/Q[|M~ 61Z" %{bzw ~ 4۱Œ}%*X<e/טc7;E.Fwb3U9OxW]~h2IiBgdvɇ,E#'CAiŌ%bJ,8RF}Bsjоƪ^ea^åJgM~tipWtы : $7!\68p_'{sXRp&[!&X`iԨћ#:&Gp=W0`k%K]`#|Mug (R'mv ESb) "B @d!wMzbL6LG}/~bg kfԭ<6Q.Hث&!B &SD[wOg],3 M˕S,~sB s@c*"ȜDNYI@8TA`> fN燕PN­9v5Y%Ɯr(.9˽Yu>ؼi&6?sW:AsKnzS"tS;jl#|u]#POg :\$'cO=6-=F $עOև+E[~T6fFmÑbZnTBC!G@R;8D'$5忁}|\.'ͅ 9b1lYm@ĵAʢ]7꩒a{:8l^l-!wY Ǎ_ ЖXSF^! ЄV Xv[[r l$kras 2bX~q"3/k3kf &W׷szQϊ-#^Av&P&5u;l+^jJOF R gcue{LKۺNŌ dLdFcӹn>RbQLcP g kUNBKsK3$r#MG'J[nzתT28/QIػ+[[)) g<<}Pxk*`Z1wk͟R#ܓbNhơ Z?t@kwc4O<+p'F+ܾ ˵ꕆ|H;%TOd2!ԣ >WQUWTp@|fD޷ڲH:> ȝtgծJ.tHmkqP!rͿmywPtܜ9Egwc]gfځpO9tff( L( *Ƣ5 ob ŦvM.K+s̗~3TSCob>J<dy Fl#_;]Nس[5u -TgbYS(4 Wa{eW1"ב_0Jo{h+`(*Я~'ac{` i̻W_ATU?L&Ȼ r>xވH7Gѓi$Pm0fe8>1 0wzY5(vjvUm݅'LyF*Ɉ'Ge=\̄"1K)u GVNk@tbNe(CǪ4vPRN5(_헾vG)@@7L(4_tm2O;s*W#mjyWS՞FM)'MqE&0M>]OM Vm gxi?OIךWq<%ﻻA d+K>2N%9u h2Tm \^R/F ~Rqi9ގu &Ə(ϻQK@nΦXM`ݑX[N:d6"p\K.r3Ր5&qC ^p(*M SP1OBc)!pnQRD7q!] M쪮H07![eS&sn))O@Eљ(`>@Rɉ.ƙ2[\Η[q֓yo-/ε[/Q0t;^SDmpXogTo(s^o#7I"yBD+[GN_v Ɩ,ٽ(N,g/g酶H NOܮ<鿛oyD_wR|ϽViV/8Q~JnH'` IveD2Ą {Fw UJΏV C˦e.Nӊ>ދ>a_x }$@7|Za DZ7"./u$z}E|دi`g"iV*iFf_ݙ%c暣!Wʡ+8]GuiM]wBJ-OsoS0uB 0ӷexU|RV|0SE"F/\<_'k GH6}}J{Fbᦅ G'̑"`I`<L}wikjЛu?d&^~:4q]8k77آ{Z8eɻk~yBEhY:܊WݗwiZ R//o[|4N`bJwa=0*F7:r'="ZOsoAsWrw1d<-L2u~gاcfrtc7fV8ҩΊGJIC&S_k*U `^5v\>MaZFxLmvA ąlAylsmg@UZ+,{=y$ibC<t*=H1SH|HݙN|!҂a]E2%̿eME:ADfW"$)QA<Cy J7{0?bl%"agcTqآC3 ͌cUV6؄^-@ҷXK’/1 O{aw-5 XƮNwGd`2E,7 =f#=+y4+~!h`l*p 3C5`/{}y/?O[!ߕj &:jZV64am>tOJ0ϭt>[;Brt~CȦ5G5$T昻?`^MvVzS&f2qڡȖ4,b$n5Cθ3߾IXv/J_0 B<5m\lQR~WJP'!^zlb>&68`egN^$-*qֿ)z>4>?L*&LxMLA`?UgX|U/>݊g8I<[^d'D`l9r!^fƀ/D$z]p/hHO[Bx׶9, Hm۶m۶m۶m۶m~m;1"`7|=?'ư \I..ŷ^bE%Kы0Vz(pIg@]Ӣzy .F tM:+'lvbA)gJ yxEik$N?d f^(v<H ^ '0::ʳ_"ήo ~#>FIQϟnNJ1w}tM!r&Haո$ni:,?8[S"rE +tfCRh94x wKʸJXz7 dJ| 94J3VRiM BdXns. <Rh*_.kw{fkAmcJgwx2Gd^.'l\ brѺ!fY^o&L| aF156孧MαTe8A_B>}$c_@$UEIiDQyB +u-yK̓`]n-J`"L#m}MCF]&$=2 PYF[!hWܪۣW'^478HR^_cyo߯H\,_a3LJL)6#dI&B)F&jY[kj!|PFxѝًߩ MGj^wqb8aTdcn(2LfH5x;kT \߲\;41V*$ 4sʾtxRZ%%W@׵ab+TntC4orq{c7#l+B[:XwPl&63=ZLJ,{`ah0Nv MFqӮ,Q3lv2ap%[! ͛ƈynzv1W~(.H+%!_ɛ$A.>J)y=YdV.ibdwv`$h x#C4'HL;Xz(ήnߵ4E ?dP:}AVU' 0P:u͐ƻQk+វ!#wnR'drai\kT~,"w*۰Imw/0>L4V1ȎG1c^ w}`% Bkw|$ \, \feX²aҊXDVLH?K҈%J@%* h0sRb}?"cb-'[;3^?TD;ְ̢ ;J%'W-cx[VGOkӺǰ6 lrlhʤ R~ҋ\עe?r0?&L l .3xp `Uk5.o {Ћ܍Bɟuv ϽˎjE3UE-0RF y϶0^4@(hTeۜS+t6 4Nf2M'%Izt*Р͔ 2z1+w9˵io) /W?O6BzdSy,6S*c(]bR0;ճ ѤmVȝ=lҩY{,T7M]ЖƚLJ;cӾ3Kۋz2Jt4j} ȬQ3'3DA yB>YaOZl̕Ӌu=I=8r xWY0T $:C#:o0p;< ΈB1dqX}CHpo;uFiĺD{zhEb׫ X5͛7<~y=}}Y[sjw@fg$",mU7M$""9 5$K]'jfj'˘@z"B+)9G{Cϣ߃ĸԍyW2A[N'N6~<+H`_JnqIR 6t߽YRo @/*R퐫HT}@'ιm΁x}}K2esGuZo)ÕQv7qtvCRDn9u4q63X0|™y{həl: ?o}aύgu(%g/t6 ݴ|n0)sXMx+hK Q Ib@c†BeΊ iFHqLmJ9*Zy<  69KaEXQM~+uX/f?ܟd+< ǤZj\0ri"Ca#r0Tv^$ԯu>s)F1ݟciN+4<"vBZC;8o^} dcA9#t) Mwu:%#ے%c3^z{{ 0MȨ~J|SAѮITU'\/DȾ~_|#xH^2^F O t~yf#LGJ,#q~Qu\1aHPK&*=M $7 k0Lwvo{KGɦ{(fBUL:ǰI@1|J} ګ3偸sLҝh7@<4t, }8l7$?_C(1;%tLXWUʝ#zGgK\jernGs2/d|ܫF\,:uORǬwumkRљ"?Bo2tM{ʽ] XT(Dex\:)v{_o>RsP^-Gĸ@가G 8`dK0/7,D^)S^ax0S8+4 tl47z\e"o*+VY2%qm.䔎#5n %>=[o%~,d ]ʋif8|Z^[G$Xe}T&=MDQ*;Θ/"5$^_W&Z KPVc9\p#ݩafNRS~P9,:ۃGqZ. 7 /TxpWeH{Re(2Ƈ _um6&s)wŞ/$ԧEaa .[,KQiAցf\m֢f&דh_xB&^Fo!Pim{?W%sR^ }VF}S-gw#"0?N/OFڲ圿bpB.XR!_X@B8G٘"oDoHD&бTn\^*gF`ak5 wkz\9 9}Y,6!!lz&]ME}_rL׏5 /T{Xzt&ȆYצMJǐ\o#SOˊiX>!!Aj $KY밋ǞT@RLuD {F{^Ḛvn~MS"7'EL_R+),k{ֈ^t*r&s-@%3m¿b_ڷTrL9$>pD9.yH3;M!tJn|uR2ߝ 蹉CY9]B42/\4Y7DuQ,C)}ރ7{f+8m\VZ 6絰+3VnGܠ)i~u4\hrW\5x+aBxxR@$ ,޿m?\M6e1.^ISq1*> 5Sbzjؖ RNid~;49Ha6!*Qepoh׽ZP$7`->b[*Y[S5!,!>;yDܝ#~M(JDZV|uqN#řa{H 1DLuJoed EmYLƇ)ԑUH[qYؼoy]66 ݶ'BqjC T b]P6\čE1>L 6o ċ[oBĵj1@m+42tz~9x\ݕNDuP"" s3`1èwN@EhmCRkܕq#,X^0Q.-?,.!~7݆hxEe+Ɇ}aj)S/e+VV;(z §2"*.&d&6flP1z>s#o79toŻBEA|]Re4ԗ lDXȢaI{1s'256Ͽ`?4VN+pGL=''AtO.&6t#0WԽiۭFT\ma+YU\ZѴ8O+B@;{{ZZyK.SM>:ra ֒=}=0}"jY]mv# (pKkf1) Q R)<2bDn1a-l{X=Z*j4\1,3 U wc <$v3x8Q (A6iEXgOIraOd`:%Zm\씿y6szY1?sR9%V?kGIgoOEL({/`EN2 ^/|=qaduAp"p N@|4WʞXA١.8<ָu9\k|ZŌyLw#g:["قݱmPD3\kԡe7J.:phv#MO"OT,5A5e~Ѿ"mzI"'E߃7{{S%Uw~6=鴽w}<M+F9T,m@7j#8-Y'uW%5+4Inai-'ʝ~p=2ݒ] Obҋ<鷊pTSjB]-:nx2q:< QlM!n1qgZ#q<>wZAyQc$ݡ8PDɲtpdfO45e_P|;_3xSBexv\ՙ o[KS>{Y)-Ʀ9q+ z*$vR"@ԵT$s{Ux߉ՃKkͶw:Qj"ʓő\ڤaf<\ޖGƔ̲;Lx甉D#:+_.[k"d.?Weᳯ SOg5\Oe幨s*!E)tFK4!pyIE(9ǡ ݙ'7F 6ZP+$ Z\ CҚ>pc {\0R}ubCkE,M3%׬ v r@R?;=v|\ds?7*/̇a=6P~6_J:o?Rc)3vQE.v.@8Vc{vc{T"N%6xPZz{4CJL/$1:璥a)'ӯ.؋_ x%3[[bsOy7"@?sԼk0/[N)&_#3!Ǭ7p\fg+$+dl5%(lAoB\c iS7]UT"".p#ǨIo.Y%ob]H?a5 (f͙L[U)m_0g7.BLGE*a-t<;'y|5{¿?Kk]u;u Wd~oW2'"+\CQ+' $L 4 ,}s'[Zi`ʏ~Gx|WndYdi2l<{]V}֫Z1|/lLTyp:u?rƫǡ=0z"e+EH|W%:y1Ӷ xamQDxx"|fuW Յ^y'SP5It0HgY1$X?^,v}Zڮ x>+Ȧsuhvl~tMm5E_u@߫Aj;蜑3o*9z"G[d 5U cZׁBN?6 `YѨ0LQ+Iڄ/IǣF ⠐AWeQUR^ywϳm~/ 6r+!DdN%= ;8jun~raA ]pS Pkb&앑C\ek *7l Qd`ī^F.p9f{Z.7mjB&4@\e266<ي祁ΑIז%(םSPF2sUں ڻɿwNl35=/ FFT-h~0;3c!_I46o'273kT_JyboR=3V¾W#6N s[[1 H)}V4,ˎ9D*0X|z=p#g,!qD*”^ oT~e*HbW_/ 2eÞ*S nS.7#$Ϫ 3ye4Y"";_dUjޟ`q%#X#:[M!}n`!B,Y\[kO 48 nԩ%SeOH)I6C#we=RGl. |#XQ^ݤboɧ>_}0+]i3bl^P sRn&5'i2t$'d !ÑH@jz%LIͽ_2d4&&1*N7CׂaY#;[.nIxm`f>5>%5W=4u!Λ!d14u&:G~|ep"pRtTWZ[) :cճ &^zqmlLԛs|XaVb-CƔZ ybeX5U'^ˇZF9,q2_=dvUEd^wɃ)J:Ɣ]}8fC:eS*"3.tNjsgPS- aEm\{7l"h0j`sv(E G TU}C`unt "v¸.b෻Nulq/1׌t YtxE(|Bna_uR:eeuu(qm:e*b&/Y}O4Tz_> 6mrNի`DJ)гMᚠrn!~t#(Ҙ  x3/ RECǘekq$Nӭu}}ʩ,7JcNjq;U;i-O{i8~g<(K<ڻ>mzFaoMÑm$B,(oe[EQ `7k ؘͣ|2SRӪnnM?[LWP߂:g\UK'lLLIWy/OӛPwyxyOi}zD }r%@{w#3QKT)v;ChprhT|{:1w4 .C(a]^^;j>wd#rj۩"!54?DJSF= $ovuZff.S+J0ӶL@T};@U1{aQle6 9$gk?a[pym6nsqovT,v.妱'1;==PtNsƕw0ui o@j3M,%k=!4g҈@<^xB+wzI))[ Dب"*^sf5Px {Vr8PKϴI4s,uhkv#Gg+xiopW;ò(ſ` 4VlyM ǣо ˯г'mµǗ(P Q|Ģ~x`}N[XoJD'1#X=$*u8yw9fȄ|5m(/WK7Lm'*jr* rQEQ ;;jrq:}8LQB aRƿ?L];?)u& R0^M \Ev9 SPrפT8>/EZ/zCa.u5 p6g''jSya}^U]^Sut۝kKt@y5vYt3PM i9uT44d;X);]3ԭ70qC `sM [*Lg%[MM͇SZN7%3zWV#[k|tmj8݉aYYT4\Oڍ ^ⶓn!vN?DߔJѴzzmLD;ҷ[{WJV?!v%tqwŚw3aDat[PɸZ,tr5X񎦺= kgZa#dbpR8I@[Ic`\i\7ᧇh-j1|Yd($*Zω&B̵E;kg᫴CTM/$e擅k&w̹%m*:Ҳh##_w{"`SDYi1||%ֳ(qjʌJ'(#*CǒE/ IrzFا)6y8k%( X2+T"Њ*jᯉYXچ}E~z1Aԛ4Պ[0 P O:Z 1^ɸ5~DsRF|Mc<“\Նt&"q{qKf|",+{-,?-g T&Y,z׸_-,}rŬzqtB͌'"*xn\LܨU7fL,Kef d|en9t O2HSH[m_h*1cf 8s`Ap8ZQD8Wh~81ZJ Ff#5-Lj8ܶUBw dҔqcWO?7 F_$!:^~gfc^ F`'O$m^ЛAmRSZLհХh5R0䉗QSp˒Y-Ryxͭ\_r+fugN߲98Y64F&NQ9 (Bd66J;xO-]X(Q eqn,ƫ oPMOߖđu ŅX8TW9NőƤrTT?bLdo `S#QyU^Tv0*1uu0S,ٔ(V2xV/пQe:Pޭw嘇LF\mq{Vϐ7xJko,,3ŒdpTUŲ ,iJoAݣrT=TtۄgŁa[vdc@+؎e^>#S7VO3@?;""3 ,c/M!-vpv^_[0m\ qJGz&IPK, zET"EVE$<$jAHy&`nwF7P%=u8} `kkMF碻1 J;8$C)i%|ۈKKη V(0trkmҸEϿ҇Y4%qlM`r3ћ,Xcjnj4axtAYckWb/f T|?|ј<*%[6ַA M{C^7%kfL4)HnjyVxM.!dCuPD6S.'S8/%F,v43ƺ)R|=HM=XbcF|dN̝tuN:mb$Nȗ,ǀ\}98PC+p+2U̝p [JE VZz{ܻpq 5ѺI8cg&Br~|61SWMq{{Y0D$_/a%y?$3耹)z»WxD;PŽ'Lh(2qh77ޥ3S~>fFI+ԏ9!Gk^hJTN㸹;Iݫ-⏟ۉwg|`k,O@Z-T[DN=8O>6Gl)Q1HBqZ7tQ.I@1"!*WY4- XWC(Em"-ʫ~d-"Â9|{YngnOfJc׎Lu 4a&g4i_daA6R J/ڋ͙X/ s(LxtgG͊ilC|$H jmJ ܅, s/WQ X Ίp)SP_@DIdJ"*ISL蔺> mSzMt]׺Z` -v[Hohi:F8҉gT/,Hևo&o4Ëf"{.KOW.W v!b|ӎ4sCϜ /5BLԪZuOR:iaOƈ7!bnOd&ޠe|zzƿT|7x_G{V(gO{f× ,YIQ|y Ī'C} oZ'*\AwI 5>UUlBn_[9HfFUbgrf{N6YprE`KC)Äkg`acx.כ9V9h>@m>ճ]C( qXY?4%lU;rd?JTĦ"]q <|1`/+nORGn](Qw\L2rݦyPі:[CX K+)9^+ռS|/؆kG]hw O]CJKۙw ?jO0v L*RG,(+eO-_Vfr\߀%9@1G;Vspx~k҃*}]NA<0w!?P VF6`5n҈¬V9xƄOeSX?S{k2 /4{0:8ٔ=:6*khfSe sDNrhnLy endstream endobj 117 0 obj << /Length1 1860 /Length2 20521 /Length3 0 /Length 21742 /Filter /FlateDecode >> stream xڴeT\5 N%C  %}7jTZ>ZDYA( WPu7q`aePZۙX((\&n֎&n@^@3Ӄ t|@m`ji:XZ;i>C]-`c`o(#@``eT`(:z~*ԎShIT4h?;9915u )zIPStoIPT7\AB]D]GY=X@We'2}Z8S@mhbd>u+kW-C'nV%{*yk3+o㿌T~}'ns 2V&++M܀&fn&nto9տb..k(7tQ;ӷ33qpw_6stpvusWF 3vG (#) x 80y7[s\.` U95wt->[?$Mhbom]E -ج]%nfV_z7q~?*#eٻ0pq-lvLO"'t߶O 0qq1cV/gcig`@L UHl&x>m�#s`a0[d09:3L.KL?"g17+9>y:OxYYL>.)]U]S_kYem\L\?{SoſE:z2d`&< w1QDVsoL?cڛb&h(\ s!l%0!X6JsDR\"`,zi$hvQB߼ ߹SS<2f+)b-payll랇E#w k Sd~ .s .8_ePWB[8aq\飣Bшp4 ~wFuJ#b*{έsCo3 [H+fw>%Ca]"{{caYnScrzpf"@<fUiL"GP F}RT>>KPijr%aF =co+tr.6Zn '%7 %U*'sW"t139qY<"̲dj^kּC[¾,e׍p j n,嬠/(/TK ;Y?S|8QMGϑ^ NMPv58-RK\y]& x EtP_s|B@z.hI/qR9kKrL|yj'WSɤp]|2a)4Nubbk4>8k qAnv1`xdRJHx,k QV*]ԏIgD#5ĸjkg褅A7 5ڌC/s?H*IVUx$eCˇ7iհؿ+[-m(ܡ NAFc/ٝ!*c/Od~n 9ɺv7 J Wպ4א96svC]W"b@95gv$ˢ2יd T|BsC[G7Sen019Ư`!V :X Ũ oI3`aLV6]P9R345YB3,9H$GGlh^#gqfD.i+fi~ENf 3ry_P *Eb*YZ0Ynb05y5٘ѡ*\< ay=(޷+AMm%d[1cz񈭼~~a9)?"dZ(2-8rl &K{TdpH7= 7AjҞ\l`):<ڎ|ZO'<%gN=1exP!dB¢(=U @MElw~0Qsֈ˅O>挽ż(t*; /};z p ~ӥj:mm읒\N5*:@׀lNӟ1>%4qi[6:(bpOL-*ө2|,*Xڗ:!{aJ:984ST1D ],X!xSy ى|(R3)O+ 6pu+B$`@mBAiUSDƚm6߱;ۻݲ#ɛ""&Wui,K} Nn{`x+U.eb['H5W(9Kx%)"qqZe m/ 1)@:_XO]5A6( ڢ_;8poɹ&U`!ql(Wu0p(e!ԇGyK!@Q$%lkdZBNd_@L:D|PHp1'`{9XnP0DwW pI?s'nAsjy'Ŗ&lI@RÚeJW;E^#s("QbM.OoGFxaHl@6`&Ft^uXkYSPT\iwU^#xFsb{l bA$K;Za`Gb7#aK@e@\GPMcEoɢ5MJ[ W4@j Nufsj6|tԤ {@w!epR(6}%kKG\2ꔏ4-'V }$l-lY -1+vF^eh$jM|KJ+ (|V֤o8L[^O3Q&,k.zQO^( xo\I۬+ ZNv/:`NU~d\Q@OE 2Ly4vPVEّ=cg{g o(ɧ?; Q͡4_GBY ,LU#wK@s^޶UC:LT2/[|<#cY#t$h]ӹ R\0De®la]޶IvֵkWF ,BúAVL`h뗏92(%*{6L칍'/7)Wf@4?>d(&ƍQ_$&%<4xۺĭ cL ;Jj ST؈JCU|P5iv@YP`8?6ٷSzh|D۵EM d`qRkc_565]lY"H]z1;.N APrsץL`RA]q\F2vl!eL?Q_!~-cҍgq m3l QƵɬ Lbՙi٪br M#3xZpUĶB+Q$R;/d6_HkG7]m"]3I|X68}soǓ_.YHա}ttyQ>pƈ6 /d&}$E' VfӴPέd+I'9dX;2EYC%̌Jby0/'\:bvH0i#R ҇O1Qzq|RBF5pO#s ~ i(|/\a ߴ#Fu(0){KgjURݝ'YPoinXY+ ws [Z8aPx kd߀s{#/MHݞXu?|o:VҶhkH"Q$ ޼*"pQiuE2fUozΙ+FQPU*V,:@LvtL_`Ώpń #`"/ĢPKF.On?z*fF6=hc}*QVNl5BuUV@4oD$B&Oi`ٖxɢf^̇gtiTgCTNԢpimӖr*ER9ZB`VqO[KQKbmE`^ƌu3`R`gY,j%v:HSiH:=O3#X>"âҺaAhٛg E'N+NW{#DaEK1^ S9ukW3tkHq|D !v:a.h81]ChzV}ڽ2XR@y“UhUqea'*Lōx]BU-{ѓ6N^O{g=>tճI-`,7x;٢ܟ'yO&\qsYҊ1,ߩ{<<^"ڵoY}mre>N5ꘆfKWVr+p&!FZKU+@`)Yvv͠Ih܊ *zI:gĄ| y([M*Iz6\/o +c{~qfT7NTer)Wmiú?6ֲhvY#x|fNTd O jaǻf)3b:] vaLpwrnnKXx62!*${ڡ(Zl{D?x$ҹGpkxck;Zp&f4ZS~QZo:Oʦms_An@\'6mkɊ%5>ŠynX"?y-Y†h$ws8}#FjXaULG v>Ұ%4$laTzHQO`o_{=4pF|GPw X >~X~㹘c2QC/KLD%mC"ѝIiB1*˾Mi7NP.KWL&xذ3&dRF+&bHx.̴M3D2y.R)I &V&eso^⦉o('Pä:48 2Ǫ\S7%1k#)_c|NVfT#ҁVh{K) G@'Cun$C^plq[v`xA]Վv<`STC!EdNFk ͂f9* JID($P~\xU1ۂIEIQ?^[B}3 j:m.TSz)z5FTOG:hZY;(Mq *o(nw!进lHVO#H+YLWTܯ[H;q!*v8[Ҕa@00](Nk7>ہtPi~5@mGSBZa[F9s]>eFFVÝL;̲eK&ˢg% PÇe=L1HĨ-|Dg}a s҇F; p{,vE. '*pI-hUʞ^wC]ÎѴ8J 0Z:la׌Aj 6UyF.WUl̮c91=9ԉW! Mmgq^.v3 OAήߖCȹ"]k *,otXs*,Qfj9q4qMCdQ~ 訾{>ABfRT㄄Eꥏ@SvT& D~$sv܂9&ፍWh9}r&PxciZߵ!byի=#R[zW8\KaK BcV~Si з CvŐhYujg". _/Jv5#$U:{ƟDͅuNNB掛#b}bϞdW={#I+o*~Kmq1/}f+W9O\!Լ"ܽkr iSnwSxe6A@;*AQgOTi /FESX)oRusd*s SFG5|QOFtįG>l'bGRY3vMÒ~H(i&'pƌ.ψtU&=(Io~hjxNMD-U58 *;ʀK66TP(/cП9'#^IQyZxq8~$ݹeI{Iݩ.cM\G|ov(NxcP/.0O :] 2\zdZN#x4;"ڰd;׸[P{y`K=;ZGL1ta)XO 0oβݗ"x=)іZ6t/2 i!U1ݬ)Ǝۅt~ca D5!:pTvR6T=ZUFkVOQv_U`-;|Dg7ޠe4ݹ)-2}Կ!|H*4U}攔WR fa*zP'I`]x\3<$q^QJ."uUہ0w E0P>d7K(jV^f'j0Z%c PobQ-Juyh6nҤ  K}O)TG< gRX+R=O#,bQax (;Micdd젅^:>;w#eb+$I'd{ٽdATWx[ī]秌*P `Gr_ +BIv h tnjWawg0T+O5dw%\| K[h2EyXl#e׈x:O\gi]wJ5Io/ё=ʌ, ~kQ~9q c}?jT-hө<,%Y2=Y}W>0owoS=BC^Nr!Nծ$$U8 QH-1Z}'5 a_\W$.xW9S= |Ou3ܷqg&œ롑@奓Xa{8 FT.M.Xar<㋼Jb_,h DC+Bx%ăx]Ce5.{([4XA<)1T=zRYMd~SמQaA.#q﮳P 5!87 e7 w^za qDx-iKnDMgTtiЖ!+ 4?|8ms1(cLᩝ@&Ĝt "相u ymA\~d GT*G:7_ ʎEQosT, 6t:-X@3}e!y6MbThH#/7C*-yz:>ྻ|R X9זZ7)Kχ/ZfB8~2+ĝ*̒Eۗ$1bxLWS㫙s:l:C ́%!;r?WELj8BCor,^7B+mJJ˷%~2ZtOmesl!fW Ͳ2=oj@}'wdDhb#("nQWq7Ύdc,J^IAX,8 ¯wP6<>NEGBE[|bSͺ]'IINB2T/Xz' ,*(5covx+IkM;YozKb}9gPlE6F<^Hn -`a W%irsܲW7o!́ dwCo!AoUyHX 9eCmeJ)J>,H0XNWbF)'E$ ʝ:Uw5!|ziϡ^o hUoO[}s)i{Qvٌwaz#q**WdŧhQMSg"w-ZΡ_B`Œi`,_ě{Pm@#fɖdΔ4VlBx_XAO^`5'VP~˃zBGme%WMCש՛m85ʈ?b "Qڌ 2 p[rCp1M+}#b!?h[t.A[M!H_H] Ԯ&^1yc[h B#ߛNn:l\H*FX^6F:by#a h QхASrP-<羸s30#$ӗ6e<+u;R.7zKFDTp|3+x.iSH%D pY+,ZLt$B^ppW{MF7X~oYvxO Ikӂpvk_sor)3{(&!k$f4~QG=GW8gdFɆ .('zɌ-=¹* 识0U>{]ނk 2˖z.4e<cYYp0 hA^Qw~|%8Vڍ~?XM&hR.w%Ki(IACJJл6zN".2rZnC g8=ivnۿ[^ԅQ h]O َش|B^.̭&Ce] G9 1xdΉ{^U\0~8N8TR5f )I*WNVh)/I,4iT%  e6te :J扤]4݌}1]Ù_DT}܄z(]ki1fhkE[v êM=wpQ__Ep^_оU} "i4а|S \&2#x9*gt%]2Z5r$K9%4͔=?ceO(yP׺Мс/X_e'o]ѦDw;{珍p*8D=Kx;YF)jR1bZ>K% oJ0XyNp!2FUr:;s.2g۠i)4sW(͛~|+(yƋ)[#/s3rXFLƾ3udL5lŝpy>{ 1r U"lvX\:~a wa8[9 /rӍ(Z0b͞/:AH%U\!'X-ݨs!"(P4L,qhk6";dV+?x@nw[a64jR$+/1b7Z[kòPb^K\++C.\z׵b <1ʲfkBg 쪶R["CG](,.`7g'~HQ,tXq.v2RJpsYp(YC܅p/-$f1аtz + 8T[Ɵ{x\bؼObn?|!_$񑂺z;ym Qv L^C}GUN_)?qΥ0eT3>sG}膡t%gTkԌiBZ 3GXTY5N.oզ=ԁ-!ՔtkgUB7'ӹuTIXduǦ)PEq}M|s#8(Křz{W ZBf҆vah>,3K u;jU|kS*_fK0edw nJCBy|z '5ۜNhH% (m&jz |oʾtX_]O!Iۘ"abt@toiҺplg*Q^wlo0(QRք

ra+0͈AgNjN$45 qٲ << 3H%vk 6cb:SBb Q¿(64ewxDxaD-_2v%y Ӥt4`#6uu.Yt/N4P*Zxp~1GIڪINB`ְ{FflTT;oPڡ asaSBM#|9 חJ6b!߈]D@\-NFd97{ZX.s\XYwϥ+"AvM_ ;s 9zDz41pнj!WU[M>$Yc=H^}3YI_ȚvT,-$4P-duAz)]|@TẇԷR#?oghZ"B<: 8ϘxƒEu-~H˗U&){u=Dku%j:V2=y'߭H4 nR/_*rp1 xV-\40UMBM0 O~\x>t\I9A OL uH[Lʂ]mxӝaOvaq?'R.-(i,+9nx2~iL⑍H 80c/ ]}ZLm8誯'" 0#oq3SK)7>trlȌ), c'H+QP16eSfYS .ƒW[fX?3WȐ?g t1&|Nǔ/@\lH j)*#[}4&_vế=;~SЛETJ=yaN^#dA$aWȕbχϟbB댓a~PU.|u f%$T5hC^ATP*y{Zl()X{GJkM :5 98qi- b';jP8N,V{pܾ/DŌ> BW%x:Uy"^@L m94 {ӳ]P<3VkLeT\\1 .jUPI%+5aMzi٣ih5iYa[?{3?wx2 oRptE?)+(6]Y~Zwi]=S}/He#q (CHtvo \ȉ--W4S c6aK ,(5%$<7E>!ʯ~0HcGrrWXZU QA> ?nFx!YUc֍cC 1Sf+S}%d?x$aP@+޳j4jP7,X!q!<=Ŀluֱ$;z~o$m "JpEd3J7 MA`p߹;a 0̡NE|0פ^ ZUJe҉rj"mtح]D)bprpW6žM>7N`-qEĬ@2Wev3#B G MO;Og7!TO[מR)$%S?&G2fFXA4 CC7 !!`v 3=,T咒u_*SyMd^oMDSA~,-pG 6mNKrm|)w)qtXο~;K>ooRl?$~mޕ  Iht{_8Av+9i3P0?=r,v#+qv߭Nqu85vOm+8<0Ư") Ks0Z:rm> stream xڴeT5 šݡhV$8Kqw+VkqwBqח^}<|5"SRe53JځLl̬9y;[# ʉHEh@ʇHNS;@6RshJvN`&c#w7dn ҽ|ww4l1f%d ag(ع-v 1 `gPjU%TTR*JtUkϪjRqQ5 P S zߜ=o5.@G'˿mc6;{? `=? +ќ,,vր#1 w:+9K 7I_Nw*ߓߚ6 8?rJJr[#K2N@S |vvtC]G{_߸69Y:U0Yɋ*HKJ1ɽ $o'o=Qq9~/+ .R g;['nѝ5af 25˽=:(-_&Vt3`55iog03qz[NF.@x&wK|2O߮?Gځl@3D;$hs-?l-mohNK`hkd>K'IK7%_. 6z׿(-)w?/;eib :9|'?&~gEEiMEEW6ILL-Av.n;"عl6# 3w{n(7E``1 `1y_[XÁ9,K[|foͿA>B6V˿5b{/oB1 XI"- lʉkSe#yBT  f ENr#|bָV|?>^&땵β5a9`-t.Nv@b"zDgwDLU/UEhuo(1UI;<^Bal6QƤ-95[D|UiTuK^sx3?2˨ҝEVgc#0 p4 B8.G%iS\_մSI3RjcP)T52*e9 %kӳ}6=A't EmۉK$WGk0oh}H/R_f,Hj<zxk^F fO=Օ'_!;+O~$E([Ec߱S2(MiKߠ4b4!|j2e|`M3 #Ӗƻ–awS|S!r$0BμcY>5kCA)UMXuʆߏ[:qntxbZd&y K9dq9~-K#D E`,/kˊ-YJX)>E(P%m:`0kdd@kF'|;ͻ]Xe6ßaņDX^?Pv^U?@lr*Y$6j%!h_3SI!bE'E톅1vlF0jIĩQ(/ .t>~6ĨiBzM߅(>`m w Z ]V\L'|ػl G%,p_^ZwZ\G%dz $ge3ת3TV\Lu-eŹ(S=W& ȸh|:6bg܆_ddwҞxuzإEo:6R RegBff$ IP@ `25#QSBmE+SǍ4.cH?.q9_ߦӱ>fnHv@c޽o@rNhkC~2?` &{J]TǍ&~Y@'oǢp_nns[:&Q"J>؇K]"T XNy"f1b-XzVT4v I:krej dgA~ \ejET^N% ,Lm]u0&ㆿ=%YMm$OT&;'έWL }YˀutIm:كXA^a"(q(D䀒izLkqJ I>C+Q6ӦI,Ӽ]i|ּFvgO·3/瓙6"%q/97D*!A])JI}E?>`n c&7J%43U^KY[`wc:-Ũ$tvx#F$;r? #zjvu^{bBuvoÜG%.V:K |(XL.f6]8<&>AxikZy e[&Ct)})½6Mxg-U#QY+-#dcj1ԥOlEDBAO1m*R ٩[u&;Ua!  j)G>>m!$ȓnس-) Z+1B Q:jնK+ح9 cu7Ue ˰~kIlδQ/u4 i!fXe //]:)XQQ!Z nxh}S['d{jiIyP{3].YBkK-;W%aKfQ7+{w2-_HDnv7t9 \pZz#?s(aLd47N x+΅G RBsh$MfT"]xl;F:6)JMH.JP1@:ڄd { }x7c]hU?$>$w'JZ?F$sw1AP`dq xBCoC  \ea_raM fw ( FA}Ԁ*Y!i#jۆK5Yi_| AQ3/xHO(ooQc1P9F%n&HySwUu_q(ݨn8ʫn kj."tJ"␲ hǙ\BX,sMد[:^J;-\D}WʀxX; N* x|Wcs8YXόL0l^;~)#pT=z)$?NH gC󵗝!˰/ ~zZ!Wi\# ZG@5pP›;T>o> ]'#\݃)QIC&DdhJM˦?ϏÇ7{zoR Af=j8Xw-ŏr2|J(`atXw2.ymӠ~|=툴d@af`gl "}!\r.NEl2){N1ȁ؞-*HS YP#u Ճu0ψez;RGE *^ƆА|d$cܯl--j$yzbyAEY5H&ö "m3ޠ2cElؒƬKFTm;mŅF 8S9;)h"T ^m*?ɩ4d941)mf HoaDZo 0vU#.ǃT$BM'%򩫋wT\rO]FH0v09?υiWu6Z'˩7|,8Bd5\Y/#z\5t,R3j>N^$g, Z]C?TĘ.E/7aZf#FMz^ZP 9 ܺq -{^E+~'hE)쬰Җr$ w=$7p(sZՎ~h9!+_E<<|giR`x{rf$D1Օj%eɣ'*u~p#t~='l3N"qIB%"{鞫Im_%EIʼncqBW~3ICMRT S1+cǃ T[mMɺoF ?)߼ݜ6?D:o4_öt ~6C䲘Sp=h2!.CWz[wzBl=AE9>M'.Y1#I~|H.4ى )7 |*AFGn;4b&41{(9[3[O+(JNoZ{`u+F&#Qʩ«J{C 0A)+H@ńD*7Lϳϥ9mx^8 .n܎4^:<xljarc'aԇP<U^j!wH m_HYbŘ38QH}L[)(fE}Nؠ0c,xǗ}gSOKyFGSѕ>&NT+N*pF6♸weT S4ݵ+I ju( /Sۿ5?O@v~џnOf kX=v!Q4sZ 8dLU.xee.v^!Z,G8ow]䬷r CT!S ;#}Si 5eC$B[FeX95/ 6㊜N\h695WaPEE<Juc5ihqȹizQTƖO8ݕU+u)EmwRlqF` @"~H4Oв):˱z;;` YQ̫o ' +ZZ̮CA23Op9rjשCEP7S&ό8 ]m3&r}2l^\m܆fx9ksԥmɳ{`A~ܞq1&TI=Eb*T%b?# n` knO!M{t vH:CY5 .*$wrF CIeYL^=[h*V|L k$)v}Z[1-3Z7נAWF$`>7RS|_7oޒ1obsgJ>mA#jou]\wXhf<ل0VGRKMqd[gZRPצ?vGk(Z1Fe)tn]"_aEE،_;XddB G \4'c@d Yњ)3H0糄߬7ҡiPs̎L]:o}ֱLT(4|cJdnLC ʧV6~Qg*.==1Ϝ^OB"7Ԝ^ÍQݯ4y3.O b1sZb撻J32y3 ]z#J?UZcx8sü ,]SN7#7JlU4@?Abr,P4nI(ӚVI qO jRVHhȻ|+A$aei"ױgL˖(e!*8j+E1ci٤GV'F䔿k[NG%,^c%6jBA,9C$_cAO[K.!Wj!:[yCMbp͙G$HUe9Bxo2-pˌXt&OP|0[n3zTYd@SCƃk?wRS ~y_ W%;sF[4g4!Y2[᷋ qs*ir(,K кйM6 +ybۇ å׬Ğlh8x+!vErHG?O).UcBwԿLZ.߆]]5C "aF.)fb. dvXY6'{~3ZEJƂ&=H/u)"qMR:8Kȱ#5CwP4R]U$=Auh88}M)s:x$0/vjʵRy+Q!(mp̈..Z+~AUȏ]9G^?j@bbw:%aٚ4٦pp07Hmon;fka4uF_/~He#Yz.xhTx$ e"jqs-E-Ra'VoU>r!65<6pO\+yTq浅~%;uoqtB^2\8]& xL݀@2c4o{O_mTW0LSV:D~q2N b.RhקpۡhB!1ґ am TK|PdXN9(0V2 Я b"Cz { -TpBI/.R: dӍ}ARB՝N(u ;ߘxȆK$$E] 4i^uY3Ǖќ6͠xiߝnBTlLe1mZ 83]/ǻ/ia"m&N}Vۯܟ9= d;,JɜDa d $q5؁r;n'YK-iLYחXN聾2(,6޸nnx,MRil{q*a_~1:/s:-R𼕖z(Ӫga)9sUԇ3(a;4OAi$yw?m}z u4Գ配R9KqƢA^ '|ڪv~ DWç;O2J[^oR쇽"nO? Ѫ`>p]*yk>2±J0`zy|R&=Ƚ@]GY Y%Fm-Py{߶ў`u1m|md?Y*wK ‘W6aIyN|AþE/L{uK\?bW磨,<_8k8>9/Qت@b(,]+°_u5Rp*2X;cwrb9pV[q%kɘz[+?#.lREUV nSBGV\~ɣۢ;p,\q\G!w!ԝ$RBXE{-O',P{0T#Nhʺz7@-(X`EB{FK=.1uGcȅA&P)Lg>C߼ gPh7v|Q=|,weGjײ^ gOXy޻\8:.e4Kܽ?2Pe}2.I=l%~mcY&dž]m蝪)8d ΣE tr4uv]&8H?w~ BE҈; ވEC.V4e*ߒqv"ʒt%Z Z{Βc:8 5ژGCƔEj Iš$!5.|u8lĭ"",nPcl@CI+1[6]vĮOGly5.&DJ1CY~ngT^VZ B}n5% Wr[iSC̵\@O\zԻ BaƯc{QSHs)W; WjiuGƜ\H+^wD ';@nQ"[nb.ߧ#u. | TÎ?>+o{5BяF/A"cΦ.>"t)!9͂ƜH#\N]Qz E_J&g ;^5G0(6K\Y?Jk6[1( Z.l"`dd@T1w}ADE9$\ A7+fDza Xv'w=ۇ.ȯ45=&3"U|U9}S ^SeII1BoӍVDP^a/]a)}EYࢀǹӜ<-X -;e;8r7+ 9PlWfiԭcw*o Con :a9\`j꺓(K(_y#po2K?<%,jv: GIEK~\CgL[2T*:z X2:h%@t)L ߒO&D.Fq IߵYq-Mb W/Uphku.?dCSӛ"8n[hD52@RKȲl2]\d]$9dtр-iUX-,*+ n)o%jx*ӸKU_ GM[{]lt:EK.L MaE.J܇fh#Rh_MvH,mhrw@p(o )D}HƝ߼Iu+WY%Fuƻvm|vR1ԃ> *8_miн }ku5d?5ԅ?t巟rxq9Yz^ɔ|ҙu _+14)Yt8Q>K[KDr KaƩqy>ׂI #Jŷg["+TJgi#>X'ħ B+Ⱦa3*+k 4}cwq>90pb{l Ql\ӁDY4t6ӝCv5YzB Y#RYܲKf)>3hO}C"o }'W:uH#ꞑgF0m-] s2RLɽ_Z#] )XuשiP[/ʫBdlr;4ݞRc+Bn"SzUy-Vaq28&ad±čRyk=;R r%(+sެdjځ"z ޅug^F5XBK7r9`a\s}{~FT+鯉;}33l<oIgl{{Sic_Nŕz"0}- .w˱ޭrֆ iG;Q2PG \ZU%0@\k 6+DHs/Hv|"K,ƊjR'@ g !Qa =;fAMSLm+.D=5S04}8˒XƦ {-,^lw~ڿRI7$OgFK"<5֋)HجkbP9ea,WSȨ!w^Vd_y8ZلSZ7VVlCmO毟9 kp͜XwIIli_ .`0~.М#*eIʣJڑ832ɨ]a!PN TlLFF@3Y-&6-k-] bKW~5[~}>2˧M-Śfj QvrN{ԏ)*ɿ`X;}<ImБImZ.ftԆ8%YzU-,_Ovi477^?aʐ*_VwMZ)N `h&&ݬliw cҋ5hHDH%FNT-D"*uGcRk&c#s%8'gx zCDD壔XA]L>%AfC_̴Q[y>=㱤k^ÛBǠK{D&ɊhxܡpLOԍlǾ;U}Zmز _`*L%0h BVUԎB^]օPi{k%%vfn*##Iej` GBaZD^0A4Ye orPtI?EՎa#D<ƫO|8$I2CV"^ Oɕ`š%c(-H$Wr8r Ml!-$G1w7 w;qG`S 1[}-̴`קԙ,xVUL2@\όAJIcIѤ`cƟՙyU Bۏaݞ7\ ;PܫC'Л/,E0] D4loo$ydy[F` ͆[?7GWne!Sbi\%tިR}úrwjn| 96eVJ傲Aڢ"QGLp7/ *Y,hv./Kiix#9uN \>Vm&ͲN7l.ae:\ȨO }* "s'ohL+mxɴɣrL=i4f 1} _7euC/-%as ˚^kIyE#1S+]#5#)m6ru[kRPE .vsϻΑ1-i|r1]C@rmɮ3~3Gd4h4`-.ciҦ(V˼!gǸh),x*S :YqR.S928?4m͆LMJZ%6[kP>H;6ٸ:կlt^m)@ bMQ.؛ >xcZ8)KiWs2>)j!&˫yP"Du.\#wn&Po/o1ذ>N.Wf\Y"㊼UMM҃ҤESNI4F߻[բs ǤPm@0ۙ)쨴%qER);&sq. ܰH+IrȭS}t>kY]ISCy'5v Ό6E)_BR S ,[So FɐbN-x5 @e 8aϙ{NlɄuT{Gu:czE6Hsyl-Ņz_ i5ɥ^%!Mp[N77L=m,IЅi,JRڈ7h{j"8 jيrQ|KjQ9q6'<zEN7u0W /Hl"u%} 9ۮ a#\TNsc[j=v$mW{/_=_ns ~F92!+`)ꙃ%=7 lߒψѱDgRг\e1oS[VqMUGs4x=ɛǣ.3-Z ܺ`- +ǰlVyMUp{$(TO_"bxUTP1w/hGO|G8iM3ݽSX劬Z;_]ۭ8_@DTu|/ݶ 4?d MPDAQRv~, njO *fٕ#uיTDXLUv @~=GNvy5vԵ$K흩 #˰|JlO;{ϒ1)>9hkd'ozmz!e$x=Ç8e6^]g/p0AǔX!J]Q%5u7w ED읜gI/容ΰ[WHaJ[_*u`s l ы 좾؁Otq0ųsS%7n#Wi/E-XGVWd)׮(0Y"ȮTQ1*rzFc?~pe "J{˥:![|Ntӣ:KtcFatQiiν]R?Fpo `{FЎ{2f{77hꏕu&h1(z; c 8'Th`2S 5i{)>GOb4%s$ko-#.~}.]=5M'D?)FZ&{6Vb2F[el4LC~fKpY|UL쀵Xb-v^{pghR Ձ)ا-e|k8? 15<ۜX둜'(-+Z6lw2Pȫ%6@2LjOߏZ!Еzp8z'1y''^Jl0}R96U&+ o[l|CS \!imy9(OP{0ڪ^RR<ؒgibXTߝ=J+3YՎrv(q꯵*RDŽx%Aa{_*Ҝ((okH5N-k[%_H`Owuʿ9}.l'CS_*eŜGˡc4L!= UIP'8aKv1̟5޾LaP[:K[@ǚ؅0PԠ(\̈́Z}ߞJި]wߴ~ԦqT&E J0M識?l]Wʎ$$X[4,W E"hu;&\"%ElXAlֿLpxၹI8 [GgQ$X*%^^UF)=>=dYq;(a $,<^E'*Mt~N v˄QZGDF)Svթm/+ΫK[CIZW&_JRcšqUmy"&J+aş,/[./ĠB 3v:#G3`y*ӛTf2wg 3D,LHZF(cLU}7PPȬkBai ݰ@< _+#ߓpK97O%Tư]^Ocư (TڧO$w7~'˖@Q;GVP&=RA+%m3}Љb쟃b ./[5N^ 3-3@zb݌rA݅A ۳KN˱W/k('.m1Pm<@n +6,[y JFeFDQڨ`ö+)&4/GOH`="RYgq-l7W9)' #cQ};|%cHCtǡ96!u3r6 }ھ\J8!j?oP7ڶRY6F1Q xjVjCe.z:=aWW\ylr5xg5pq!Ct FQu:Dkd3P𒮲 x\5/W`c=I24-p1;R߬n6H$S4HHč-y$$Jߙ浾jﶕe7H_]X&ӗCI8F03Rq䲇.1ڍ5h% @|2&$Ff(.WN&V`r<{%}ӄ~s%RbYYn!c9kM>Y#Y [Xm5؛~} E3DC?^ 22B#XݝpJQ,oI؍N'&r*ۇ2vJ%BYVW%j$!A=yK27.d~q*`jl6D۵Trò\uzZvූG.(۫cFX Dkv%#1l-dwe&˚7UUKJ+$\J zD"0hHp~väkVTmI/w$""԰HDt B0b0`L`KN} eˌB &h*vi_fR2=v|, EдPC! ACv\^P-}Z«0ZR>~6ȩt a隩sg o1>k!ai; 82qdoTO U KgV}@ٳ[?71Й懸wwoeX'΢Wn% 8aԲ>!`q~НV*,Ϟ3ѳKV[M1 w霭qqEЮݴl\ǯJ6Xn0Hy%7])6`~uS,Y!mkaؔrTt|`b@ͳobpޙo;.',IxfhY%c0V#+ǘfT 7atD/4j!59sw"ԙÄ(-&cR9S(5EN(۽\? *Ui/L^_m."y%®KR/Mj&օyzXXGIGwsvM45Ǻ&-du%Ii3`= ce; (WI2CHbTRPGR%"*Xc]qL'ִccキsU-aG8* *]H5``< w{} DozH~][~*(\FLr_~?:|4' 3 v$`\O%e$Sم-&&5&6 *@_hy?G~<3xF[n#֜?>qNn*n\g>v-W{A `~K@jwрCYh*~Fpt"\Gy Gוf ƦCm J9_3dsl^73Y'GcW N1<1.gG0H̊qV#ElT[LjгW0^sڡ7Lpw(lpg7Lx&پƧwNiI!1lVQzr{q۔ˉ{YqX,- GhKF`h (0;&;bUċ#s8"S7%&FIPK[Ŝkಿ?wSBZ匾"S#I̱SU"͛Ju:$ 3_^r9rN$RI6~5XwНڹW:daUh^3o2wxUy 7n]-N-,{)8iu$ CYJb2S͞+cEPn"pa [c\!$cL)g&U+͇L vhuѽfAdI^{ Ni4む^82XQ#XMZ5W#Y`vӆb& 0 =7 AU0Wr6{vJqJV }G?НxdEu^>rN4je}ЕHHJajĊёc ý$/f& -r;Pb /OWr]5WzVKY[4O37eg<~?9lDjSj!FCsY^W{ 1մ:I`db= w/w&tO6WS!1 ;b.vk Űu;.QJCRuuJpkA`Yg#Pi`l gGl( hx5[oM}T endstream endobj 121 0 obj << /Length1 2723 /Length2 28146 /Length3 0 /Length 29701 /Filter /FlateDecode >> stream xڴuTߺ=LHH74l[n;~ϽGϹPO5׳8Ċ*tB c8Ι +'11)]l􌌬"@#gK3lP0q#@;#i 0T=L*"ə ڙ[)" {GKs 5X~W-L629Y[Lryh F6f@ PSSVH(+)PӃ ۃ-@TH^U THShoN WNSRRcbdq3N5s@elFoLr4 h t,_~o @h$,%8 lw71οk+G #reeFv@;#;p7Д_G=6K]^_M@vNNNYwgvTTdgG'cGOzBQ033C*fg*vB-%X'gkk;YڙVŞA(%?`9:& 3-L`|A3#'pvtxO04q: S] ]3TTj)5xLf g@Ps-%8#[K oT G[#Y:[M-M,Q_f)g# ٙ{Ii-}s9Hk;K-AQRABA?abv& SK;s3;<ll/&Hwq~o&;A_ qD .ؿ#Ab0HA? ;AF8OT F\FFL`%X|S(p/?'AB;i׀2x[v8 6du|Vy\ xbY ~.;ܫE:9?FJ5Տf7\5q.6[NVF qQFvͩE)\{v=?%R$m1k9}*ҔRb#J eb[%:ޭ?@GHTDx ).2L=O5 Mc㲦gl򉥍=}␰573rZzuʆ\?㷹 MET8rR+ۥd{/zZ&>}@3^ bi.6?-vP{*lz^6ʅz@HE3z$P@K*s: D)G/o3s0z`Kl^2`7ë) wa4Xؙ@Hyi\sE 5/cGm!V[J=M(8.@؛Ikp&R{5.$z'k0x .lk3@)oU25SeddknXVC~B^sl@J=<?fU̯߱sЫtq4μAiæVB20WK|@9 )ߜ\ro.}Q5u!800h.x/]#Dq+CUZw}L٥"^"ln&{.86,A՝d{ABViz!Gv"91%歟h P6D7>.Y d&n]ڥ=Y'2mH=?e0F@B"KJs7.&mSmfDHoic"!v?uOjö; -'CB–eO2E9.^ьj 0"؆'idRkkdk!v($ݻ}ԲgfLf;_Y2%.{Cj&1Xmr\MH X߾:"617.hѳ| 5yOXOqzU$)NV[\I?dm*ukJ j#6ۇu9&M7 $!`jNܭ/u #|/^ajSleoZǖuCgTo a54S 5_:n}%W?eWE]4}5gT+AP9="]#ZU"AR`xr7* htNPhv}+ګc,̝@OT@J<ͳN7s)G;Q?䮼}|DUv4+]N͌\%GƵ[Ă*r^j.m:"̞ۺNSg6DӢVIb",C~q̾EH+6x"utG=Fi6fCBh,P"rtڠ=;|GɺVu1H4D'xnZ> _ɞ_Y̎(IQG4J?V0lr}8gv@r?-^E>49ÈTJ$&ݭ1wlKLO7/@" T)|XX(9|Czgs̝r w@(ccq]k愤#cy:ԧg MVO@(Mz/WB]* 22r"QBRw`iRi`Q}"0>QJEK[4Wv\d87Wr.tC|p2DZxtq&ά`U^2|-/A|Ejж3/kZvLt-3l?'%dW`q~*@cݗl#1ɊL/%+;8co?IMNSXtsFڄ7'N2>mWG uOr6|ES#>de$FfOjԊMI;oZь y[g/В^ X[khH]N;` ѩ5uڸUA•%@~@DLcH}U^Kǁla!g=\VِXR҂uħZ93Η5"4l>51'rh:N !GlGaj57kKn0L\57Fa՟LIwFJl1`oXn ·,>0GP&?CxzgeV68%G1U]so`nbruFuFܐW|%ߡ0oetGWlADo~Țܞޭc}GR0)2ՁFyYV;9үWH$Gu(qm5&8rP{/R/xv(X"=C#<=7+ёq#Hf%6xPڑ2>mY5nD.p !P(wbE m iq9Z^]u(e+(v%Lz)+qYu`E nRD9OI-uO^Z&6%r(ůeA\B* )11ϫ*=i[d:&Mjهʓ]NtA(;}_\@;dKݞlZ>lZ+c<1G/D?UX)L\q7 ꘂZ$k,I|N^fk`S0<非e5$ \ױ!U'Ƕ\%$k>zm³kYֳ w/_5tL)>t0t 86phLEJ&V]#H}$`TUָIű[\xfN ]q|yVhkĀȅ^:ΓX7ɯkz 2`Qx!{!ryx@-Eh17֩V} FM 'c;&_/lwDFrM{_BgqMAeZOwDæ} LN6 E*Ȼw^t!G JD{$ s@ :`j[[9e nhʺV1$ܟT)j63!z? BmGoLCL K߈kn UNVǎ~ec=>Zv;.!bKwݜnث9`FGV2CFשĺkgLv^?K^WkH=Z)Y < Љ\̽{77G$r;'k8sOQ޺t2l|2`Tl9CS hG^2tpR 8XaLHd1O‚,\P|Ҋ"Ӭ*{P * :7Gh&F ,)კ/Qp%'*_"Z4 F) ;]:FމRf㟣]>`O{QZvl:yz`73E>=Pƾ@G?<66}T<C$mc5< uOwefjGBM,g 3&w8u'«,tjfk@S!q#g3p֔^jhH)B-`h1zxVm!/kqZ1'^Z{ԃ>d5k3rr 1k{M/-+ctTth:5Z3'όERUL=BL/\f긷AeճCHɠY,("Ke ͗݇Եw Q=黟AA_ ,Vǝ#{rmրniJFŃhsB^R*3ElOˎSd j;$r/vCnhCq&6HZqf)g%9ԳP\:-cJƙC5}.ztnf]sSO~ͯ/|iS5 Q*۟l9wv?/WDR=#3E &/~!"RW2<~oN8J4%rp+>y~7K^Hc3{)*Y4]r9 IwJh&NWځ^qIѶM2".SJ}@oPr*9ؗ}|O{Fޞ<,{(9XO"0If ;6oyVSEJ4K#FpzmQ'};Ty̨Yɑ<Βs]j_@t4y2"%G֋\NMQXH2,L|.G@G%oAT,xw Y ΰ x$SefA[a3B }[GRm-g6SZچ;LW^Ty݅YΗQFY;N$X1 gt4\QmLeubbEwޅ!ҽy:hFJts5k9˃8?nf5Tjd!ZڛQhӌ3/'Ej0l%Ա(8= sef`pp{ȲZqOs)ҮkhAn5$<( ~6y`ѼMZW!DU}Yu`Jm̀J;w.%8⾌>$aZu4s67ߗ+o= ػXET*P)tG$oaIa ҭN@1wvcJ+œxujqP8|Z?P*5UtKh#XWbr\wXH气6J71>d诈c7^hH mgHw3bm|q޾4ûbF`3anE&SgNdt_;7;cy-T[D!*i"23#xUqGhnA%ϷhYut_Zmh!Gz*K&wϟDm U`q}"MyaO?í[R[۵4wQ$:晄SBI έZ=y]vݽ"ais\X G_7d bYRյVS^  i!:'K 1ZKAl>Uts݊NQZw6e P-ӅlߒZ(xo]z6wPI8һwU|?4$ r'r>KnRhY[Zs#oInΨTnXӌɐlUj15kS]`#ǫz}.!3 tԺ?M"ez!LHZ O*-v=Ԩ¬qFDdqRylTI0>.k'"O=,m؈sM,~#VC:K~[1/wLubdcj-1EV}ߤNCem5хa*ʐiՌ<܎ :x` :-HW99:-4.oVk33/^kMH3Qo<(^t~A)XezdS;?%>a'LB6\}` |Ga%t%d_E텡!](Jaŀ'{- 25gî De=^VApKP%8~SBT"cwT8[ToOtDb"N[mr߹e.rs?54p0T UBA˨|P`$nџwl޾[++-}]6J*L)U2(%l)#ũrYN C fv_ /PчUu!?I"}xJ2߯":DWNDL%n=0n۠"e 1 I'O.wqazr_}/i'Hξ0Cq˓?|l%tT${yNiR9VM{Xd'LT:~Vzw.D8g N4'%n3׼9ێx<7K5q:aMlq >~X8v*?"f&W:M8.lBvuim6:.C\tIUfק~uHL~Sr+'KiS y|/ߟU21L {g؝UG_8oIqKkᴱnSi[J}A\vRU5miL@ P6/x8q_G.w!CϐXdl~~T'jJxtZY:t+FXvrGקC7Wl9n4NhYfE5]n[A?:_:[`QptK\ǮIy5Uz~9_gHDoZ}&&GO;m[.0Nuؤf^"G_1OZZZ=pY.+EcTR/-k}O0 F>rW[R/h{1ƶUY6)2X[|AqaydzɻL֏U ls>k\L6E\DܚDmHĕk5^g)y"Y¡]}fv4«8N_~f[UDB3BM`ƝI^}}ctEJFƑk{ ͼ &wKB3r1r1[ţ`QFƿ6S/,J֎l@hV?~ ]@}88 E9oE !~ZZL(5SU3ց62o5Rk&m6*`1oY?D_2%>E6DdHj-ߧ)N0uš=vyg+&,j@Vn<#Lz7/3F\&d@8#<_B gPJ]#?3AU!fRܠr!|%T.VB?C+I$:J("ߠ V @t8"Vڶw7ꖫOɏQh 7}yN}f;^"aE2qQA!^b1O2"JR9HŮC=^?uЕGKj!x7B(I罈OqY3M+65-!(HTr>W%ϡ5#-t+O!n/~ nTyLG5ϲ 3%݉w<ý0*dg4]1JJN%Ԯ1{h#FS%i k꣝ 4(+B>a(%cܧUΧlD"nUOG?ӹZ..T:^{V4/p>C4_Em1+G{DɥL}93S֏þ5]vWXOuwW.T? WKǧ\W8.Y٘] )r8)B)X$fB뽃hд̀qa_,qcoӃƦSY3L,vרwbՅ;PkUvZVtqTX1ԙL@k>MGZv,kY~!kIe:L f߃'+1.Taf ;Hp C5 9 tɝ6dJ]ٍ"wW5"b݂q6HE?UeQr8!Zjzrbɩv&|A5+1^r]\UĂ>s%|Џ7JzQ B 7@tMq`Ţ#0{~X13QWQ?MfAPK2K ;iL.4yc# "HǔCl4j I8!;)z).ݮM x]j7F~9nL0D-jqER{ OpCb#G ^1 {CDu,| crk5*6i_!~!S:kRɜ"q_kB ytU1ܥOCdgZ_F pZ[;?E1ƴD̘`{xQzۮi&^f9%o*]Zh=xɾ;1}}]Vok.?] ,+C^:x,AH@ˮk=q O%cqk;}AʼnhZ2ʤƭʷ ί},^sZǛQ޻)_Jܬ\\Sӆ@I9vɸE<ɞS !/ޕPDk Sn"笹/z7Tʣ2:zbUAf:: } DDY-0|IG8x2adX zh.Zn8t K3Phik1` I O`3Ͱ[-ӗPY'{7wWGqNە(Mrӱm۶mwl۶m۶m۶m̼ܗYRj*{ӥG͐cߔpS07R S0=ժz3h5i fkֹ{Omx. >O^W jh%6S=sZ0i5A6ft7KX#A[Uoau_MKn\>x[6p%T̃pԳ•:ڜb; kHf3o/2y\}EAQccvܴK#1tuM,۵'P㖳ݷ`8AD -“yeL@Ļl:`, a)ŵ"oEs<-մ6e$Ht Y x@q3O&YxۼBWԫ{ W۰j )us 2.&5Qol` oqY<3Q$BBK˦@x}Խ_BƋA#17܁Z*\ .ɞ6- 鳓:wrUo$+~2ؔJ6z:K$j. "][[Z"\J4/r΅X>G'btvv%@6乺=1:ũ+$rm/zTnO/ޒd :/ zŅQ 056\kfkY3ȥalD;^_}ꮨ5Vh'PQd"v44ԁgӲo5`ӷ1 6\W<=#W,},Ks.}iC Xio[`Js[_$.L.7> o;Mِw|&$O赍&f 8E8¦<]$$E9&yF0 f/>%Imb ^ ~s&]Km"9 nb[Vi$L%*ă `&xeɢ7`xqBK`-Z?<w^/O%^nmEV !4 Tf]1pG)>f[G`3 4KH_1$AI d b5BMT|۹yVG3v]e4l|u u ې͌HKdl bcAELѪP.Q8il3gʹ\M>i~~~qHy [Ρc"@}bii^?vWiQCsM4*{lzU0fkS/ADN3 L !*3+\p-qJ +aZ1pќq5fDo?)V:|[~<kZs B~LͮzF*!CҨ]0Úѯág!knD&Ld!$uc"F.^( .5vtZz=-J- _Y C<͑"2xo~M]?BsCS(UigӛYb$쨇1pt*s%Ų$QƮlRĊSabf~84 `7̉v> 3w]:0IqT?xo3}QXWG[d"2m"HQDg_Aȗ[a:p SLyoj[H$/YY:zy?8h/k{p:G0K6-'CR0zvXFA!z62WǁЬˢahp,(e*?"ҒqNACءXGy7 [(x4$Q{sgrdysvZU^ ߬UZ᷼LĪ Juܻތ ;&@n$)GkʽM31>Z>0 "#46cᢔuN(LC=:?Dq suPnuu\͗o7eRE0((h t/[$ۜ~^s50qUO5 B ¨(xkp~MZ( L)JK;]&U«CYʓ Rp(}mN%EӰ~c1kɏgNl~򷺨3AAlXQջP3=a=Xefkwf{s4D,5YzEJRo~@s<4Mc]31@XRVahR_ԑHnACoo3 x+{ cĨ{ǒJٕGaڎU-wnkub?'+q_sIqV"wJG$"GUAT"?z(Kh}`>DsJGP7E?As< ݣܱjohdء-D%]t_$)Pዬ &KإDWԡVIbp#ޫSd6Kwm'Z7[ث\8P " 4KuЄF#XoϞaN<&, # {N#,'ՙ8|;|6-lZ,8^)O dVQaE2o֞*Dr ~gPlτX^Ɇqq(B:l:I^>8su@T4V˸H=kcBlr&MௌnySvRW!Yivp4K~Ѽ1/ק#c0i?ϳW<˴1N3^&@ gg63x&! 3JmGczkh!D.v.*bϓW a&^p̷% 4ͫnqf$ji/W)@.&vB|+)3*ֺ  eg!>V'EbU(O*@?VvSnObBl! %}o ̢Y2 'vV:?E,Xwȋs]i~ B[wT\jtv~:<!XBu`N20_4@~?EP=JyMˢ.xRucPy.YmG =Em3:!DCG¢y S5D2D ;B4~o?~d^g2 :_ճÓ2iAH{cxP@ V쏍2ySgX{&S4h%ކivBo[>\FR\ֳM5o˷PM)yxD.^֙<ۺI*X(S8+Ǡ?6X 3H 7+yF#y[=9u;-l$=߄&%" 6/Mn?Ĵn } $D-i i6ښ&!K:@A &)Y02aQ4x}.5Cn5Md@{Fs=^1;Vٽ`!D]bh}0 dYF앾v8SjZïߔ%)SC'B/S_"$V/ԙ jṨ* 'Nn1+ \{Oe6vͯ;&N&"lmX"yqH#e3+&ShzTԯJ)T!S؟6[0}`A僉$d3YJE{=>YGi.Q=bf*KeÊMـF'ۋ@D>@[kbpn ^RxDJ;n?VJۨא"o;Utq+!QW ҧLsΥ Ce~CH4Fl;RhZӸD8{F,cdڍL=Lc`6ᡔBeH:C nW("뎲SZ䑠\HF59Ò aE *gRnjHY]xK\i!uD|2`5ؽJva]CN8:F 1.89 M]+<+:ߺ{]H7iun{¿cemRO 8Ic'owxV>yd@FS$v6 CR"clrчzWQԲA/ `U|IN|b42}IPqftć;Omܳbwu=XIp dWq愆;H!canB-4)/h Z]>T钦i5 -JKSā]ݎ*A_<3˿8VEiTup; 2߹:,m(a{&ǤbY~2Nl^jbLj3bMd+"gJ`36{)01KzYo`6NҒy_à^pm1.ɒU-+I5,ǃ .&ay ]XǎF;qH< rgGןn@*S]_\K= t4Q{<ؓxi|J4 MceBfwniYk}key2IҦ72h6PІ""Ѯ:QG8 [ʋH]Gw:ѫ|F;pq,V{oG2bӤKms .0u$:q~<Ilɿw#U+ A($kd垎JV4बјB$eG) ?;#M̋ {aJm)P"xS$m3ȂbOTD2-V}uEO]崙 3ܯ GN{yQȠ2rs=ظpy׊;*`dd`Iz#RjbzøL1ތ s/>A^6D%BzX+yk:iC2|ؕ2#:\wY;sltl(BT.K0ŵ=ɇYbAv!j:]KoLh+8-՝њ/"ˍݯe ЈVŷdÀ\dNcO+B[Q*Q-?2jGLBux/Y+<8 YV Xjr2"C/-Pqsȡ'MgA y01hAބ甘wgt'R--W`[ }V)dEǍ ~~ BMO70M{/ dk'f㐒bTkP`pGdvnFV,A gi)QS`2AF;`Z+ϫ$5M͘t0<[W*ƌ <׶'"z .Mhks'Y~N40ֻ:5aKJhz.^%$;-FO<F N!<)aWIΰkfrydjH65SP`FYsv&*?$ŦAupDG)TGH!(FHwzA 9(d/a v| wp@%'d󇾨Dvs^& !c`v4jJp#qn#$-[DeΞ$o8D]c*:&)'3OT-|$9t5,i PVwN$OHUD3Wy/[ӛ[$#4 !+w%MEД+`̆AuS%P^oZ',|nG$ 5!d[gZ{Ĵ֢N,Nj [BJ^]b* *G4&ͽAh՛IxHҺO~\*,'94* cfaQk;ERQz" n | 2[Z gT;&:"Е"|8ᥓLZ@q)Nr`΂]*?D'Zlq);QIԋo?Iqp|x:$#_kkSSꭁ\.;]2PN-/͇AX4#>hMj&k~?_&1VS` S3 AgcR"G]y^spChӺs7V@՝~T(YQiyԜ̡!N9Lwfc4U] Kno'~:Q{2y>9Ԡ]L2AI3TÔ+dgnvpб4t݊NmdUX᷁-,h>NǡRbP.Psҏ";wbن$DG~*$N`?=QՔCh gxaSxt>*M~0m*j̓α{?L,}]qwڗ1xZh+ضs/JCE} >5;Y G:Na{RN7*oNU`Q{ᗪavhXV6A %uDQbM}a><-Gu9)@ǟVsk' gWMo3}I/$QYcnO3Fo$5wjum Q~MPbwd#d4b}M6za Ȑ4l9 5ri`UݖV[39͘oeJ'_ (¯>4ܵR6^<=p9 /^Eht|a[J |wmz~'+3,37\ZQ3rF&;y$uA#K"ڛJUWkKaGr {ub/ \&&^h9_}Inoҹ!jD~}@8`WڹJW@G6YuJ+?jpjD-<3`}al| ̕ܨvؐ^PTŠ%/O&l!5?Ã=Ε !a3TUu6!-XpC EѬ]O N.` %I,z3բR4p~=UKci$Q2Iұo|b0buI, 2[eFG K Wm࣭f a( )R BSclw1lO4뮣ai6k2qnD+n4IHv.f:GZB xa5Ij2SQ@H[V1b@)^O&2n@HU Nye@uA]TrJj<x) {n̈́ÿӭB;xS|967-`s"ͧ?jF@ endstream endobj 123 0 obj << /Length1 2156 /Length2 16183 /Length3 0 /Length 17484 /Filter /FlateDecode >> stream xڴeX[Cp'xw@pww N!Aww :}oy)Y[gQ~PRe6JANL,|9yy0(dlci`cba@u;YAbN@>@‹H oJSgwm"Le9ֵhmp~;&ҸGxn(?wXή]>%_MX?'l>/G xQQd| ^Mac }[l'PD7hXЙ3<42.q}IpʙA1UsY֞[FEOT= JCT* aY*ؕ*k90v"fGX az:\TBNƣpiCnofhVwEjœ.ˉaKj_`CX!W܆H~-xnJգգk>83wԖwu/ &!G]osҝvZҧh;%zC«&YǠt'6TuxM's"|/X;TTXBzI)^ ySz2{!Fk(n ;ڌA1]jx[ *߰U>.y@{/7_XV`W p6sLRl4 `=GvBM RB *}~}x@z=]sYҞ w:4ϗ2::),YYېb cuc<Ovⱷ+nBRR"/SRb~N9^k6DfcD2NUPCI򔞐"M})Hm F,(eUb$HdwZf㮡2i3*(pH)#R*Qo=@V>+j28ydr(*/Wa378vbM-:)QQ f֐u^~g)x"8z0rz9xDIn:jG@UiEi#8PБ^GO}a+pHS|)[t>sROallO3F?تA[K)&R;USbs/NzUX(59 15(,М";'!x2Z!S>@p_=+#E蕎^f/LxtqtNs?mPa2`b&Wn1Рx[,Jj|)o.uʢB-*vaU{HSU.1q 4?R &K_Mtr>QVmE C:8Q(:!4; A=oh$~ gǥps)[ : Ue{)ΒmzEF-n1ul# u):ue̟ 4"̓MYyMg@/M#]" .rP6SPh֍+@ }SSuxݑ^/${m>4L>b3S[p{!-RWVHIa He>&jTqRE~PJؘy͆T&9 O®W}[kwq\՝'a993Aa9Pbꗎ 0$%B_fwPLM:<">X%1IŵxZGw[Ӆ}W l0 v>D- T2afpPJD}5o_jqLA8A2M : deg(8?PL)׺H1.%ޙȨ+EtɺNWg-UJ\ǴwVqUoiO*U=g5k:U~G2ߞ&DW/W,=e \aqm2S9YtgL%4\ Dq9`'yk^k`+BzmA]3̐lFSu.a ~ms} Pa ){<=weqiė l j`9Vx+R2Y{'"McauYc&}֦MZR/w|TMS9$[Pr| 2 ډwA嗘LT%& MpދV/es!_@dBF$$4)Y#?|cUg[Cb ^F "8@䀐k ! /'ɮQp޽UnVgv/U+*n{@+xK`;֋=_yLy@¢$LU/dQh8_Ns ߚq)~KiߑL 47"Y5[.m7@!i<5]d- $LpHU>(zvӓ08Ì$x{ vg;R.ڡ7Rl.8é+P!IMd%@l0 FqIQFQ/O1#A4g9Fll[Y؄B-]ҳ,jgBCIij7 \>"| /?% x0 F>@b}fOe>+hdNԹGiՆ*F\}X;i5%[t?3Єy^;$Su/n!'Bsb^ܵOvhNT!t>/FC՞xPX< ZMXXK 6D Gə9S}B/tߵufU$i9o{tͺ*=޳\zr ͳؤ% vx ; E'B:fp(sD'Q_"r!#fX1qYE2ٳDO/=q7z D}|Qo^MVGrvƪ=hj U71S7ENZ4* ze!nSv > Tم6SLf5uތm j!eR| Twg5^sFjڏrBG6[7f5)U~p/ϋ6 OEgp'm)BQL@9 .w۟?RZ(w>kA~{𹐔xd!Pkp7B*sljNi'H{}X<6#:,%^yMA=FהG* !t*>=[L(tl2`te/V bp=lerp*QAuϺ/2%SݰdTϲl#:rQ/TC{K ER.![JWXc"qrAPZ,a֛]*zBk{a/=;\Wy!&Ii G,W$әW{BJgc捈эg06 T32KvTiѱ0q7.j|vS?фcJ*g2`o1W`[<QƵaR }Ym{C_13Rd)+~']&喘U^ebռ):GVn<܇'$.')k: gϷ֔nZ\<,rTL緛c"$mC?$3s048{ *v5q\7]!1zoB`eB!;}ZO`MzvIM] ҿz0)D,_v7|6 |잧u[4%~"ƘzCQガy(u'~\*kN+ddMY;mIN5)AgSQ@ r-نU#x*^- %3ƛyH"GKΝ,-ΦhDJoΠzl}B –9ދ˂FIqe8SB\@$3 fҹ^+|JFYNBr"^0evUm_3r,f;{!Yv(/tKQN*c⎰Z \aNe#Ug)b7tx_ CِVIa" X̕2sΎ6kVQmޫnם-u[!KTfX;}E5â :VO:*J-_" 2k$% ƫqq]Pl`PKWx#nP6ѱ8޹J-ݕ fʨQ;!܅wNňfOqO-lAurr_l\~<˻kN5 |m>d'r *Zۜđdm;rtz({ 蕥gRY(xvI1sAACڟ6Q8VԎDW5zLpB?odQd irD<&~D2Aj t,Y~xSڍT0헵Н _i~on>MhY1nPl7eQa&^1TQKaw.7?Qꆃ(A0d7f(x Ԇ*;# TgSݕH<_LOZfW=gnꐩ]z1&Еws.>5ۙvt/P)uZQ>1fBJ|zmz&a+߮AFywT"ݽN4M+l4r$[#U98%̍}%" }\VR{Q2?-8/)4Q_]swChK! 6IH!߾@Ot+HJ]'D;Tz/mHͺG$iV ÉΦo!F5Ν;2/uEZtipWќ.?~=P |5,{oJsa T4̖gETr,PAZ~c 0[ojG@UHL=9𥖥\7a(I'aT sk{D7T? 9ߤ->!A{!uȜU$IIc`FJ2swk<>>&Uwю9O.iK/Nh7xP' Xx >%2 Ts%S0 E^_µ9>nbbٷi3|oRk8>oWX.nԒ1LM<0b[~:chn?ݍYHµ%%mҰd)PnHO:' ش΢ d./ :$O~ Jh"fH#G=*$7Zg*\QٟR@V ȱ򓟖sikK"Hé/r G$b_3@ڑ` 6]녗YGLC E$)TQI -uݛϘrPJ$م+{! jJ>$pAk\k:'Ts/ǎ%䧭D#jn%)xOXn?FyzBFLþ$З+ HwU z-;)Q"}ۻ-ȟmFݫ;Qd%%_n`ʑyI$Nuj82ʚ (4|gFZv hy\!*b2MJlT_,EJ7qQއH2TZ Ͷ5͝tk8b d9"v'\1-! n=Lɘc'$* ~^6P->pPQNvdj"[{Dt$ӿfJ3 Z .V-N">H7~kLs%$B1!DAֳ-8YQ ը zSk.0͓䐬>ȁ."3u4kb•3s<H!֔&S=|P;FzFv>,!^)?ګczޤ"Y3qT&[RrXM?Dپ%wZ$gppyB=0fJs"d{|+ NrRZ2 @"XmyQ>Ijutr`0?&<&B1QN[;#'#2ȅ4תn;k ĞvD wHQ!XIV:+1Aזvch)uL.(awUthto.VN&ݙ푍FԗAbi")06) "PVcY,>] .5&<942zb=+ϙ*-": `eJ:&_aFW  V?:tb'qxބekp8D<`!-]`1_&NN?&+Qamdi^ydlfR|4 o]~>~ /.YPkX.ĩ .J<Ϻ٘0N[η`5{\S̈u3L"X;[FRA "Q܊bL 䳿[%( GA>C+&ȸu\z аyM-p41v%˧30#\Ε`#6Fˆ]W4pe hL.PI98Yw nGTv-"{?Yޘy+{o=ZgIao Os+p2?lW8w}n: CT$rDH#Whi=rAsigJv=T@<_Q;= ]&)Ihƭ*u m\:pʂ>P#"~%m@L.4*hVH~vngb@3-"ƄfڡKD,NH*\QD|~N.")S g~("C[_{#t]82+z W~<gjDWvi[0:nDk9$ic??Q6l!Mo:2˦IZr&Ēnj6 ݷP(ؼ-x, x;6'k'or MP^maeyv捛0*'O ŬK-o-v4\X*}L#z#q[s cO ]h2P4VM :w azkNfב?Dq~! "qI: cerzȤIW5>gǪ!ra @"rm:m˘g$#$h^Hcǟ+PpYz-pnu^'`D6(T'>CX8w۔ 0gl#.tV5,4]Mڇi pq9U]8G7d #mz0O:UC잼FF G e7)ˮ(eZ ]'E^N:_ZΚ-^TgBa{箙|s$=fjC;/QOlL8f828˦J8}OMd&`́K۬Ŕ\/)']yh=몋f4Tm${C K~ŚfJnuCxW~j6X;<\8^>U 4hf['\ޏzf}%.S)'(aq[$3ڠ%K[smaz3@IӾ4MPݙ y*2}m)4INڅ *G@!zCJbT²*螺Z!-Dm?J\5ܚJ=.'E2PnҝTt]"mEcC0gVTZ <9ʔ0f`D6b7$o?fH I-1o4mC+E BJxv @j^W?fйqK䛏N7.7=Am|ml.sx}=HFM$-XP NuW(|iZ^(e: yYQ%wV0[o;Mn}xhK[nw43=zT7:,IKs7rr'8?On5S6J) %eַo9nUB%ٔS{QS|WAց(IS5ea,rQ4]VL߮|9ODpc$1kX]GN{v ֋Onpsp'FH4׈_kĬ]O/@! 1b'vr;kJ~H4RmO9-{a.l ˸.w=F)ajiJFSA~@"ࢥ>m-(pf Ue=|N_ԓ9ٱpVDeݥ޳  Qᢌ//fn.ĭYsGU)BL? Ԓ\.AROnf5'k7Lt06'Lv%a +}H9Ce>_ćsbm"];jSWv# lBtg(V[$^~a޷'c s<-A{~z=ωGFߵȉ翮icGp_j/VYs!ziMkɞѧV_xk5y)՗ԪB1&,FcϮaW8ľeyh~ qx^lr 'Wz,jaY>pnXwJ^ʃOIB!Y҃YU04ckq4asӘ9a7s~⒵ttlOyTf=,aam2fS[("9szxI8.Rxݑ!DlzX+iO){#b>;[GW;yM:x>J#V2..Emgr+Gg 'x'\^vة6hEݕ " ^?BE!Z5Ĉth@Z_kE)0905L1zyh!Ujd2Q{{Vr΂xb3 cnliǃ=QܨkNs W)%/(r=[< ASmx=})̓$4RUik1ߌZݜpF/ FS1N$\tߤ(~s%) |4/Of 2};E 9HG4Llˉ5`!q ]g8KXu88=fҭNMC@&[mCI5L*uO_Rh<쨎6'ckOhx&Ϥ D؂-ֶ]j~bp„ nR)z ֜== q)8͑-HjXzY/b9}? 5O?dC_vC/0*3C?ӤF|"=?!j+W*Khi BT ]DTYn1Wؔɻ OR BZPN\+K:x6 (u+Y\7S12}]`ˬCm2y9|ag*݂4ݥ<n5S 9\PmdFK) G>8dzjRK'_BS5pS }*Ԁ"g0\ـ[QaB?U;=z[E Lwo;<)!!M/;E((r5僎ʔ ցSC,HБEkS)4ȫbP~#[Fx:vyG_-5) :ڪdГrveΙ*ҡ@rU"VFx_;1ݠz嘉AuNjq'ĭZM#)npިI6 K4pYj έY7o Mz#8%p$]5z95Bl{(;7 gFГ4_JvgRvdfaʚƘ K5-LúWhtùQ$հ WtBUԗkL1N #d`Xo[74k.0&"(kw+za Z;D0ːe )"o f & *J \z8\rؿkw %za`C<è"6(nR髢o@EWUsi)Հ}!ho_C?eEi72p= Է?7Rؒ~@!A@.M{< M#z8.ا"Җe_.v%F5 _JN_0FpA *X{_-9mt=yI厇܇2qJO4#hP5õ)()W31Y ƌ^~Z4_XCkT|[/f}SY`R˿-I960BjF iU,Cs"OOKjS{Hor$J\nc 祻N?ZPTva.-cI60fBTЧd}38!2 92UkRLamkVwh_rA5}a8`ia5y;r,Pyv\ 7xZJæO0GK2j  P|Nԭ~4E$ؿTn+|rNއh'sB $fz|P(nDB_ F q8 :۩;P*d_@%[Ddw&lvej7 D_jƻxg!qO4v8 >N1Jۼΰ"|>]g;95=d! W_ ꙺ쭘;yRn1cxl1Ii;kЍIpl*H< J nc]{H&UKH婾ivg]0<2 6/0 -SGã^ hUOasFm>k׳NEWF4aIKx"61 &ﳒō3^6X,IӾP <ݺ'Ck(I&4ńӠ)8 Sebkqd$"(akrsс  52 \G=\5 FvWŸ@QQY[3:IJVCT51A 2_H":N󵫯6ze1}~nAJX}(ϴN!+1FAA6brY0c"'yx]SKbc-]:%|AC!Z#F!- U|d2f:- endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 813 /Length 3435 /Filter /FlateDecode >> stream x[ksH_ߖnnikjp b+69ݲ,۱՗}yΥ[H&fZ2ä2IQ$y1)< .Ȕe1Xf Seb)(8JLaiͤi ڠshH1π>p@lm2HDW導ƀr`ѶB3 zo2*:AE2()D"Q 9!|ʠآXE6xmqAfyTyř7:3W#=P HYu,E ܙ LJAK'2ZLᚢ (T|JZ0ցouNJH'u ,T`I lq)cf* y|(D $x&Bl#%j9,&j@C-I=Pl.4a]rI+q'UhmeHn 伨9iWF?0GGF0l??Wes59Xi7!Ile?q@ -@d)*g7%S6F0d6),3RcېzH@mQV:Xl =dlFjQ[E/I.+Uz}WZSkfS!~B/F!P7CxO$eY3E^U L'H)gU▲w$"{Z~,12{w.r=XjWG ;- FN#qYkvh栏 3HlƓu.u)1Ep$|,rp6*c:W|yz$7,ws1O'!GH;$Y3I_ӻӺ\ <;Wt z]|\ Me5\\]LO)'_ *@)p, vQq+Cdw8W|x6-CYZb- /I;3Zxs| mm4ɕd}M~0[ ?÷>%wFYjqzs7, ;ͭV{2_y<~'9d+'ۧwy2O`/=[_RG8!Q~,?}b{yϿB<9WT̩PQPNAQGՄkNT,:׸ GmC>YޭxU{tuOͨ=똔ŸTA#o-|5 @o֤ ;82j%ᬛ暬UG T K?ggoS{SضL5 هiz덵`%E&Y[XuO[*Q "%Tur""$>i'ɬ$8Lv sյv}7Bu-i镢m-NA3tǺE `U+8ZSuH3 Utf4Ho4* F{#)r$tW#_S+2 RXZBЦ8d% t^xQ:7zK|GB͌R d}*Ù@G!+VcRImWh唶8r=lN|(ތؓü6? Uz(aO\BsW <ǭtm6́>ބPr`|B*D:x\/lV5D ẆV~5E } Ы|a5}! Ts;8rTz,?GrX*,xhUAcAxkGR8GN($cR+1^+@'UIbARjXWu=K AѴ[| 9;h4HXF}b-QQrx?O_|飿=}v2ʧRޛMF 㚙Hy/<94P}oMGMw_MbHc2CIO7Mq Z; ik\ݞ9r"#^ >%+>3>szCVz5o"K0{ŋ qxRځ(iNUFX#vh.? _'e@u7E`ྻJb/f x^c߅뼨وX=UuqUFuד%˪(xl]<<~(E afޛ{ig0E/?/)! :ӋX+%v~у'+;Gk0s֚9 nCinih0sF^T=SnKJ_WeF༽2֊#no}S?]_4>_WGlNf J ~p{Fn] ŀO,Q<]m?poH8r_m[޷n֓^2Rv> k]Dz@{eU78 Ӽm u9j.]w^ g׆>6es)&Z&o!۞lnvlR~ l))Mwʦ n;7MԦhڬz&Mh;d[@pm G/kzۀρ/uڗ]F.:^4d躕k"@KwSÛ[ϒMB}7NvU|+NYon+On)J/殄20ߎ endstream endobj 133 0 obj << /Author(\376\377\000S\000u\000s\000a\000n\000n\000a\000\040\000M\000a\000r\000q\000u\000e\000z)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000G\000e\000n\000e\000\040\000u\000s\000a\000g\000e\000\040\000a\000n\000a\000l\000y\000s\000i\000s)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Producer(pdfTeX-1.40.20)/Keywords() /CreationDate (D:20211031092921-07'00') /ModDate (D:20211031092921-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 127 0 obj << /Type /ObjStm /N 6 /First 46 /Length 348 /Filter /FlateDecode >> stream xڥSMO0 W"Z:i؍O 85TA釖PTaj. b@Hq NbH"BErDw^ff8fCTV{V #CH8!<}эHY`aiX= !O<6roUS9G G0pOkOq/{V:-dZKW)kɚ{GjvGf4I{ZU`]z/'EQ^XhV%qj?Z6|\Il S7e=+ pwAtYj"/wZ8ا68 ϵ! endstream endobj 134 0 obj << /Type /XRef /Index [0 135] /Size 135 /W [1 3 1] /Root 132 0 R /Info 133 0 R /ID [ ] /Length 341 /Filter /FlateDecode >> stream x.as>F;轎Fg,DmlH܄D܁DF$܁?_yꈈ9"!$ <"6ɰ{؅TH8CH/CJ΍-JrjJ0`U|VK G ~ȃ|(B(bk@Jchr{JjZzн,ڏ^hV-*aVh CtBtD/DoCE 0(\Elx` ! 30 00;%X֯|>ZZS=biCMub$?\\\:O__0 endstream endobj startxref 186363 %%EOF alakazam/inst/doc/Diversity-Vignette.R0000644000175000017500000000664114137542127017614 0ustar nileshnilesh## ---- eval=TRUE, warning=FALSE, message=FALSE--------------------------------- # Load required packages library(alakazam) # Load example data data(ExampleDb) ## ---- eval=TRUE, warning=FALSE------------------------------------------------ # Partitions the data based on the sample column clones <- countClones(ExampleDb, group="sample_id") head(clones, 5) ## ---- eval=TRUE, warning=FALSE------------------------------------------------ # Partitions the data based on both the sample_id and c_call columns # Weights the clone sizes by the duplicate_count column clones <- countClones(ExampleDb, group=c("sample_id", "c_call"), copy="duplicate_count", clone="clone_id") head(clones, 5) ## ---- eval=TRUE, results='hide', warning=FALSE, fig.width=6, fig.height=4----- # Partitions the data on the sample column # Calculates a 95% confidence interval via 200 bootstrap realizations curve <- estimateAbundance(ExampleDb, group="sample_id", ci=0.95, nboot=100, clone="clone_id") ## ---- eval=TRUE, warning=FALSE, fig.width=6, fig.height=4--------------------- # Plots a rank abundance curve of the relative clonal abundances sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(curve, colors = sample_colors, legend_title="Sample") ## ---- eval=TRUE, results='hide'----------------------------------------------- # Compare diversity curve across values in the "sample" column # q ranges from 0 (min_q=0) to 4 (max_q=4) in 0.05 increments (step_q=0.05) # A 95% confidence interval will be calculated (ci=0.95) # 200 resampling realizations are performed (nboot=200) sample_curve <- alphaDiversity(ExampleDb, group="sample_id", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) # Compare diversity curve across values in the c_call column # Analyse is restricted to c_call values with at least 30 sequences by min_n=30 # Excluded groups are indicated by a warning message isotype_curve <- alphaDiversity(ExampleDb, group="c_call", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) ## ---- eval=TRUE, fig.width=6, fig.height=4------------------------------------ # Plot a log-log (log_q=TRUE, log_d=TRUE) plot of sample diversity # Indicate number of sequences resampled from each group in the title sample_main <- paste0("Sample diversity") sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(sample_curve, colors=sample_colors, main_title=sample_main, legend_title="Sample") # Plot isotype diversity using default set of Ig isotype colors isotype_main <- paste0("Isotype diversity") plot(isotype_curve, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") ## ---- eval=TRUE, fig.width=6, fig.height=3------------------------------------ # Test diversity at q=0, q=1 and q=2 (equivalent to species richness, Shannon entropy, # Simpson's index) across values in the sample_id column # 200 bootstrap realizations are performed (nboot=200) isotype_test <- alphaDiversity(ExampleDb, group="c_call", min_q=0, max_q=2, step_q=1, nboot=100, clone="clone_id") # Print P-value table print(isotype_test@tests) # Plot results at q=0 and q=2 # Plot the mean and standard deviations at q=0 and q=2 plot(isotype_test, 0, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") plot(isotype_test, 2, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") alakazam/inst/doc/AminoAcids-Vignette.pdf0000644000175000017500000061755314137542116020221 0ustar nileshnilesh%PDF-1.5 % 9 0 obj << /Length 1729 /Filter /FlateDecode >> stream xX[o6~=XK>nVlH C[ BuquIPIXuLǏ2Oϓ'?4` L*`4&ĩ8VDP\G]=EqU,zQ8Zf<ob?ha_W*3XnxMۻu Kٻ_"0F2H ,DBhEN׵ՠn? ]$p!p2E K0Iӄ0H2BkNz&X|xX0gYLD {ATj]0L0=(AE/y, Z=@7YȦR D'JԽyriVZb+0 +}!V0za&J}){||+==AKZ/Az(j*ǂ&-`V9t(ELN lǤ vk u zQ`3cp3=CXx5ԋh_?zטda?/t// /|$y v Im_^`lf8 |3p6" BZö0Z|/j޴뽤'zgۢN.W9E#ެ 8 B6CʩemzD8)幩 } gQJ &v28ѝU.t9_z]&L-8(jrL=DveǺ؎ss| h勦Cgi&KD?V¿Np`>uIpK\Emj=_fY6:p֬!Ma|].E2#9=榿1+\ +Tv AwSN9ւ=lzVti bF8~KQx2Z8!5J&8= jfu[ >ǟ N|&Xf24lv /c"'c!RM$y3DaIjwNdhvŖfug/51Xs6?ds'<>5ȷqcLfZ 5$_SɅC5 Pp$$|XzawC(maD}"8MZVC'O 1,osvGG,ܺ aލp)IF|Q}~\RjvS-ؕ\8>g)gyVͤu@1\+H};o) y|/^$oGwzrx}9KEشlL'#Fl-8]5m{%L Ӧ,sꢷ`p7f r6w[ћLX{Y4a膔1=x_hg,> cr"Wp+\-}u`_,N7: 0n>-Ri+tQB/ M`+\`#"eJMr.Cl1D)f2QCTP^l\PL75&IxeoSxl]o%E_0 7\y~_8C%u3/5;{Ł(R)N?|/' endstream endobj 28 0 obj << /Length 1917 /Filter /FlateDecode >> stream xZYoF~ϯ  =<9j(Bu I PJbK*A)ْbrYȘȸz:/^#G>6,J"B6DGh980|Vey\ĉW?bfz`h۶ k g<0!L(Rbi%#w 8/v N#~[jYǎ:9Gdj[ԡR  im,QvȽR"xK8U 9^RZrx>u&Aѯ ,:m``x'ԉXuQ-B vԣ-2bA0`2J|e" #3,-<(^gFnՠ3 J`IgSo^( b $$"N3uD\@'ઌ%{X_.bV,QxԜfUQJ;.¸RUiX`>'xfIдKi.67qVJ,jx|?O jǘZ1 -B!u‹Ґ2e!SE! 4b.*=ӠJJ5F>#o\@BSCt:GUyK 6bP9Qr/kQޔu6y;72HQS*<|AJ2 "DZyPAQ9 ͥxe@^^jSr1 3Y$O!b1-xHZ>6-8ի$".|@!if;c w}s1iopF!ֹ$*arY%iPbUBoyxrq&=%R "q-2XVǢXhj D-L*T{ft8d? [U I(#6dsfsR%@ɯW#w(9{-Fs1I5 IwёZzGӚgͳ:Ϻ-Lǎ f?pkFPܱG-5Tduu܂HSvkf$ D(-ˁ4Hk2 )gET,\nEQϬ{H'+ͮn --UU|H-a*?6V!ECqCTsF 6`{ns~oKC\&8 OgsG>Ֆ1eJ|azf$xѢ  zXůHvm5JcM(Avc33F2+b"NL_@ZuS pKp-FY!tKiȘc:avt{W䠿'V.1tgm>VanCSNDI2^i$bqXQ&H*^܃W7~0XzƳxm=pK`pn,t*ޓW> stream xX[o6~^t m fSVtq%9{H%ilĢssظ&>1 .-6}y}F?RئXg!LG,۝$ee mOYU3-kYůeK1SP$sqQeg0, 04N#/5N xK$6,h~x>!gTX;_NxcLSAa@ "6 ZQ>:@k)%X>ß?'>rp "-јyɫ&gJKq;A>پcC@J1YGcbNjިI< ݎ":[RLԴzώYXmR R! wv@䎔t8{ 2Аb7y΋V,1G<-JQ$ /b3AbA}8vȣfY 3&_,g[aE_]X[J#iAjJ,v4JMr|ICI;/ALNq1@0-'i6bR)q6V-ӨAIǫ 3r2,OBpw1bS*0pN!Hm!?GJm0m@ERDǎ\<:NGo&ϡeqq:hNhac.d)Zoowck׃EͿ-3/"wK+驷3xumW=1DEY i}tl ~$E)pק#o9F:R6e +^)'r >il۠L_hU7ai3=9Zz> y3خZ*TeŦ)e`m oˬ endstream endobj 30 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/AminoAcids-Vignette_files/figure-latex/unnamed-chunk-2-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 38 0 R /BBox [0 0 535 415] /Resources << /XObject << /Im1 39 0 R >>/ProcSet [ /PDF ] >> /Length 36 /Filter /FlateDecode >> stream x+2T0BC]S]C#\.}\C|@.Z/ endstream endobj 39 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/AminoAcids-Vignette_files/figure-latex/unnamed-chunk-2-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 40 0 R /BBox [ 0 0 540 432] /Resources << /ProcSet [/PDF/Text] /Font << /F2 41 0 R >> /ExtGState << >> /ColorSpace << /sRGB 42 0 R >> >> /Length 10884 /Filter /FlateDecode >> stream x}M$=E\L:(NwQ-i{G3fn۱9HխU2)A< #"+#"**G o}/;sf/<û$}Nؿ _J_=oߟ|--+1-ǸB,:/Բp=%bP1퇧.~|F2,1Dil20m2D--֣_[Д1lFӦMMTғɰcp&&Þy1 jc|eo@zL` _Hmrb;_rT~8Xpd/5R.wu;U,*jY9aݏ.r^2Qr5{YqM(v\ &ಁQCQU.7Z+aְu?͟旤ߘq]EUޏi0BDj+5"Ẅ|pa Y[Oc_ZrܳJALe!j5pQqO|pa Y[Oc~.?5Zyɖ.^NQW7~h}u kXzO_TڻLqӆsuUN&ಁQ#eHY+|pa Y[;N c~/| R|p@1ZeVsgʄ1\r{zueT2yS=XDjE.W}&0ְu٘/3.-aYi(z)v\`9U1[>|pa Y[iLi4?͟O?{~ܺiNZlڵeN0S!̚V;˖ieebβmfnri43m²~Q`~%̅,jSqB8afN2ְd; i'-1ӡ#|OK[})[uk%fBӓy9dC8a/j+8[?e$6$trȏKX=.{On~5?>%Є %ʛgi<;8OjM^SjoݢtewinAQ~ * JR*[[{Z6 n~W'Kߠ)}Ak[᳭" Jw9hBB*[w2ne kX&XMLDoAGlȂM*Rwl݈u >사~ebXne-oTwWۦ1emYPUŲI+u]ab>사vJݗ'ebX&ebX&XMgqDӑ)GlȂ҃사{c/CVwLu1>,,;,z[|X Yk0ϯ4nҹ'Ku˖Ճy|Ȃ][R_lݙu㖖 >사~|2L,`i+5]cZ47kom]fF]=9vXK!kcQSj4Eӿs`hdAi(F'~2z 'k4F'1d˗XX߂Qǔ"|UdAU˂Ugb+evA}~j㞮;?ÕPL5Ӗ_3\=_g eWI? ) &B-f V~i&T?)uelR>E#=RB_#ךL;=w 伷 9T_?矻`^"|o}o[jyGoJ{pXQ~*3Y$qg~mH$+E?PEõsXR@;9I4jR&g6QWEbwAkjˎ.FK m2E6|&K]*Ayn+du.62QےEF> oGixLj/v7jA/^S gIRѨ^Go-q(]mƖʴ/8{Ȏ3b+J2aJ-Uu#֒~_~<߽/F }*9hqe'Zj9*o"< LW 4[uZ;!3 DBڸ`Wչcp^>Mcf:W/v|~`i_R$ k-׽BhF8Z Ԟut*]hĮT[˷ ԛVw'9TkC_a4r+.J]}JjN%ūnn)+SǺ0B},µ⣛oLƷn-Ho+| uSv-Ʒ$E|Ko\mEUں[Bm][|t[ߢ4 ŷVߒ-O}K\0V\-oSI9zE7\r]Pz]T>S^ a;7(J=߼A¯oY`E!Nu%kqWivsW]<<~?tX?SOs+J:gr]{ep@j1ʰ8D20m2lץu71iϕ3W6Rݚ20m2\wm^VჴIN4 MOp+kاil-׏*1AV +6ȁZkV$5 }KEk%jV\XrV }3͟ΚwZs$1a ՘_.\^u c>嬭}ݢ5.Iw;7P|p@ȁ4ꌠ%RIcӡLvG_c>Q-*x &ಁQZӌ<?d ɸ Y[{@&,@pd5? $ HV\ Yh.]/W0惫ュ6?x5 5Dj/}r B co==[B]W?4`/m8 X~WU _Zrֱ_ٴi5~Zv?_iW7)vM_ɴ)^ 8G(*hy (~h{yֺjkҫI^8Y5)`ʀk~ԍ*ŭv(O*LM-ϷH.rLDP'@ט 5d.a9k}2wP\W$ĺrrW\[PҬcz< `z|Q5%Q1O E>AdԺ5~UuȆ\Tt3% |YkwEi7jJsP8G:,᳭" jjJsU69 ev9GKpSSjuhR.H\O[V$лU4[TLY,_K_oRXbٷZaUd˾4,;G3JuXvvYk%`_;,Ѻ^aSyٷ}lVeu[,Uvkw)E4/3&eU.}.Y^K<$ jMI؞K{-Ezq>G[%Eր*a_}lia3ǖ}aj}_Dc[+%[ ?T׷_{Khkl1u\ùD_GZnj"jV,^߭N6Ȫ&fMWb$fŲٸ&q5W#k2L,7ic#G&1}uEwwH:FûKZ=ybR |"PL k#IUdnuXm{DZs.@՗.NFT^M rvx嵫lt{Yղ_d%f'eOstYk%`v=͏,3͏c}+Yw7?"s]djs[)s{ÒB3o{,׷bN-sòdԹ"|a{h%"hoa>j~h<,f9Ru`%ө7`5XST^ >l,òU,+TΧ4=L,˫8|޵ɦoIE[25ɦo)&4ɦoY\ӷdjhMRdòЎŒx,K#|zxY/nbwl6ah{NJ׬Q U񸪻òr,1-z1kj˗E6܅v,ڱجC;>*ne;?L=dg)ad2L,2L,_>{[N,)mFl-]{eÒL6[&*:'yq6ܬebyc,6nX`aIJ9%ȶmĒ͜Rww~|X>=L,˫|r-mX}IJٵĺ,jlSxmb=X϶,Sbxmb=8OI4xJ]9+6-$ GuGs×$DžOI| R5?>7{BsA]9-(4n1v w.:'RM%ir-ǾP=.PҬ.#%O(At0} zӋfOi86Qp@A%P6.y.*ꮔKsuW]~r#+p텸p q ?>\×op݁~ zSw㮽b]{îA*_.oBHO;l5x2k Nͯw}{ȯ?ocWd#Qo_Ͼ]y,I߾^\]^%]+D7dKD ?y=̰?Ww/{s;)@NW[@@Bқ)pښҹHGXe[[RoCOO/3e_}]כN1~OTFQP+Ij\|ХaNk+j^ƻyz>H:楱Hy&\ȗlzB-҉[HHu#EtOqޓ WB-]K[M})>jw~A|_-u|0hN1hm@K@ yRcB6ub9h-LyXt\vvs]3m5.ʖi&ɱBXő'iSs+]\r0mr,eL&Gr5h >5KDNPMtgzVQ3^(xS5YPU7FJbMICu'fe kI[e]o RSVbII;M;,.)ElZ'/K.Br_))ElȂ-mηn9E7S.vXhV;ĭnf.QFJ]j'YԲ]vO,c4aY}ܒ[! *-9hIe=RadXR=G+2ǔ"|UdbKUef)E8O_T@SfZw wȂrrwƊ~ru'W'1d=#I] /zgb>*Ln%d3ef\.wI΋6з{Hcb>*[rבdrҍ[ߺ]GگBcXMJ=M>Vܪi\1c$BxZWz^u;e k/؛:㗝dt70~#ȂښuHYi*Dղ]vo,8&n.էJY,X ܺi[m\2#M}.૿TYk&/9$n.ֽCºu1odg0խ9Dd*Ag%Upj%XBUnz~|[?D]!47صc -3-G;YIKvgiWLu}KadC?9RP2XQ6{|! *㗢46,aaK1ebX&rQN284p 4Џqup l4qt6SKtV mR#5N`L mK.KiC /::{Բl P5.KseuTNw5%Yw"+J ,*e lgyx[ uF$)IzzMK-a=B/e;9 K2&}u=9GQЮ'hCriq+g*AW/4n΍x,jYusв]vr°ȧ#R=IrŷP[um}+o)%)[Jq4l^%V;OF_f$~H=7 \ivoBN 2fz "'voE.^*=tM`bƁX'|Zb"a`n5S䘈C7["w?D.[L ڽbŗP KgXսلXQYPbdBx+>J&ĊX&BwzžےvebwTmve ە6]. Kʇ]ٮ'-pǤ$2.l!#@Y,g[E2Z b>&dW,["f Q{.,UYP1A=7{"|e}Y}fW;da{_V;dYP vT;dYkɷҹ[َ߳m8;~7sobn*v_N~C>z\k Վ߀h,(?ə}t-l &|Z{,?[qmXX϶, V2Ju }2|Xz3sgwݯTw_9dJY,‡]vO,_Z_hMS{7ށߦZOuw{AqlMoɺ;,- eLuX["&e7bh9 (_!Z)6.ƻՄ-S&\Z=}+'ebω垾E󖜨??[ }Gg-Yw7vޒym~_=wRC vJ 0&dn\0*`"%/x.>|X0^2m aGC4Ȩ`gLu}ń#SY<*m%8 Třpd*kX,wO厶ebX^ڱebX&ebX&r1biW M!/CgB7k{WbBW|USv-UF*uzwzȾ5YPYBjFTE6zfss‡]vÇfrK dž>Fyf/7>*~lb6t([ 9J>pX 3GiV3Ev |$r|XZQZ .[9c(MwbQlu<9 jȂGen߻G!|YkB*-w=.R;RҬY#xМq67Mo&7WEnn+ Sq6""7r m%UR&l Y[mh/ hf'D\?%B#n1ȵ!|@1ț 7>MM r|4b+WYPyAMt-|ص݇OFMEPFGlȂR!l= >사ް\ Oے讲VҖ@PCKQJb BsAr@BÃ~64(XKd60<:0<-[:0/㶁E2!uWe=q}/CB}:,|N]TxWNL6&/R?##|i^ 6|'|m,NB!E@PQ|w7 :o~. .4kD^>cׅ~g}j]w&_$a.{%$/ yΗ ~\-} ŗT_`}S_z6_s_K0{'/> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 47 0 obj << /Length 2001 /Filter /FlateDecode >> stream xYo6_at{Z#ER!ź6 7`HX,4x-)^lnGlt737d!7efDy?sԓ\9!Bg? aۃ9c΄BTs=.ٔbI| ۾4/p.IUߎ'"ΦJJI'N3!$U"a|\*VGc/p&.58IY#K]@$c,p7YMtެ3_li[Y+PY 3J:)s]7"'3N^&Z㉔ʙ-Z2F(@K|֫5ϝjIO+Mt+2(kz󘞀ե\qR%뙍VaY(-y-Wr՟7eK#DZݲ-1F ny9-UvYהmBӼӤX28Y`&6V% j&ӵ][!^*nXgcιǟ68lFqN| =[\往YQ %K!_'IZWtl=^#d@^==QȬ9Jg]6e:{x>v;O&7珉(T,dp'{gޘ|ե+ou tWг7o.qsvZWU^*͋(pK^n$HP[w=?lNц<ڄ53x#{Sd/^Fr~DHx \n0_Dhcdu('OI$R cڔK]/{OGB?\x=$ Q=tNNsޝ ,!/iڄ#uYW7i.lfPSvY4{w'ga:BrXpt@^A#O5=/AbB -uZ P t)a !^*XS`VSQBj$ͳC*^'*wQ%vO r|F$ǓλEXv.5M)J 2IKzзN"eQ~w1d`/P.9샶ZKY^B VĪ[ !vJ_2PX;c& tLp@W09}4|JW*ٳ0 W= Q)>\7j,i!v<.?mP@ez]rLƆpq$O }"O6asj|Fn-[KWWi@M釭#8-jՁ`fڧdRZvU{qW3w `<;&oO!.y^nR#|pX B$J+1_M _5TϹv|-84P> stream xWmo6_!t_d f"Jb}kC}Y[ DdIߑGŖ5I ǻ{Evh?Prj`w"e(QT`v$olhpGc ',"HޭbEEWO~dc1rn\HU+.%KxJAp\f櫞"LKSm'w(@JRW~'LP@rnwQ 郻oY#%" h09f` 8iF J,N CBʚ,Vo ?%FsSxzÉC80 Xm"\n c#h 99 K(VLe>&.+hOK/Յ,5Ψ#<|1x\_ó] +3|Cku6@Co9q87m]d/߷ !6-c Oƒ8RMN zqBxc|gog-Q 庙?.{1Qktf"7Au˽=bR ^UkjI[&$lr %P?pM'nb,v/vc5YL,/lNQJ(\dz endstream endobj 61 0 obj << /Length 269 /Filter /FlateDecode >> stream x]PN0+H]{ AnR^ )ўvvvgW3KVf[( tJ4 e`ZxNk1{u-/81#{!:;;eEYN$ӷvz!Wa1LLUf;dL8GM1B6Hf74.2qFb9"rSgiӸ?ᯤ2}juƒ!VrNirSP9; J:[/j9 endstream endobj 82 0 obj << /Length1 1935 /Length2 22962 /Length3 0 /Length 24176 /Filter /FlateDecode >> stream xڴeP\k5wwwwи-8 s93{tK]]MNJ/ljo sgf`ɫ13ыۘX`EF.vbF.@@ K>cO>|qWVVgfsfOF jfN%PY8023:0;38Ond :m.i @h $aNr(˟6Jcahgdgab 0KRMuurC_*u;ӵ5rߎٹ:{6}&vΖ.G,m;陥_2yai qU5z_ 8l!3` |burwdw_ٟ:0Y:C9:&R5)%vw8}-̀Xog#7 O#XfNǐ, _ѥ?KkI?6` 4eTwvrI(kedkivc Cl,a4Ut1˥]>^ёDc`??gthbmtvp(F yeYQLM-,#''#OX`agx3)!02ٻ|\]|fN `#qFܜF .Їɿ3#hkf5+?ym?2~d`t`t]n /-SsVLaU'{k&F.N>C7J@#""l\znv3cVV5*G`=F27iBDAIвLG=ՆB ?(ѹ W"A(MuXoo*JSnc up [BڸTb lۏ'M"}Q, 0R@ M1h|,,ҫ3XtLD-اRmrLj' uH0>ZNjG@JyP%;MNvX '.j02Jν W!r׈Ԃ\8 ΟcK^ 0>T ٯ\QT(QgVnex,(}ȢU炼81ٓujcR1"KbLBCCe`Ps>kWoAPKŐ]Öty%)oRH}7Yo!Snik^K Az:@@N<[J^~$s*- k,VkMFR9N} TcOD9R,kjB4PmaNBGG vF[t||2Y.P>?Wްxrx{ gt yB㹈[Hl/ p}BNQ!!hwN5u,H*z3mUpc\T/tral<Q1+9kI?!ZѴE|Ҍ"/Ec)jkQ$4pWA=m+4E u >zZGn_Le{Op}t@ww͉vH/5y7s \O B+mI~d6S")] p-3<\֕_;<>n5FDOIшE|J`үU.>v]b<鳢C g!!;Yz$Sx9~µY=3󧥓ͻQE֯_⮎0~6 JYc 䳀i &t]>Ѱ~%&w~2RyGWrYH'|5B>Qm!*Jt;h K ']F"ƒuW)+yyERFn[Jqvbd* 9v&I]{-{:BOXT/Hi~,> i1dv6tzo5Z;S88I1n+Gv/1'FcBg\9icJ;}_2u |EO!UCKmӧdyH@g݂jKF#/!buM oZeU}jE|=1VBŪGx`~pƲ+Kv#vȩʩ+f*|ܑ@6Cb`(t4*Nb~Ժ%nZFr̒w8ԩAv6jV SWGҫD wǀǎQ&31Nh+iER9Uz\V&^kR|o_^p"%*(zE0"X}ȄUqn~<_*LTc;hיhn9D_7J$8%+ۨ[BTnw^hd#h aA_c u<DhjADS8^A#J7,ID۽Y!¶ӯhuӌ IϚZ[a-0=êMVvݡ`<&!2p~kcue /fA4GjZ.栥N{Y_i,!NI{qc[@PUȭr@J]b:3zqn}gP%m\ފf8UAyd6z6 ^Cm'>!jI+0BhMlLlGU<8W֩ 25rG;b/$m9">ZH&׏%%* Պ0ʽ&Yq߇qѤdBCS8agb7N bB>H{2$0Ϧj? .棴pVA QX3%VJhr)eBǵ=kCoF0ڝ̈́e\(`J_}],44|F]XYgцW%ƤomL*(ӯir*~ |o}x+KU.p&ђ -yx|BK‡݆h(,HA3Ʃ`J;27֎ Wm 9}TJAu&z5%A 0H\h#F^8b>l|k?*q{ГdAHm?2Nl؎Ĕkn?vIp_P,÷e,(x 7}FRF/ O&E z阢Y4YPF%˨VVV߱ 3M h65Eu۬ n j3F7ީ P5$E([v^p&x#߄g ltڤp@zKAPHK{q:;݃Zh.(a6#S;s7XBy1Kկ_g-`2f-'xuwzY~Bj/C;q\ʪ5:N6X,_-N3xY׷,10 " 1Vۍ)% KLOBidB/N;ZZKwg}S%: ЈKtYsu[.WKk>v[/&XdJc> }.L U%fͻhgˆÞ8Ml1[ELB衂)շYM<λ[MEiW#[f`%r<1f~yl{;tL: w-F]nI6_y-qfY I#tl>Uon5j=A_¢Ds)f7k[ݟ.-AsƸ6S+4" ?Mr_mKhRA;^U'wJ5V~ImAXE{EiH ,,j4O+-(_xcul=?ԠamIku׸@"rzPX˰]つgLHvTׅ7cR=UAvGkT)̐5{|PMD`fyc-/c>R,Si5ŸoGkIzN@:#hw!9x;Osi"L߃cygs&3%=Ym*|\=K5o;?kjD\M,u>L `8}E;G7` 7Q8z묛.U) E0.$d+ˍKk1JWpv$i|aw2^*CeOPMʆ7LL?P1Za.so˚R.3I!aMb'C++3vhBc 8I).Rx4 ^&s3lv͒fܙD䢟.9j|Co go7p6vynRP#ajl!j)RWddZٍk0! xHEUJ"Hv۶)QNoJҴx~>7 ;_+D Iݾ~Diߖ*/<#-&}拤ܢt NzqJ43 OҳҽRz,"޹) MH^Rc^"Aa> *u,Ѷ[#$d¨[[eDM_r0ԕ}u HAL'u!xiJ`be'wIִY -B:etRKyp.)kvN& %Bp+,ï7*[0)-m=aDP.Uޓs$H]ڪ%Q2&d"*q%n "ջY~>`*TVGײr#CVj}T$|pge7iߚp2!e;y=i+Xج9oNj$|wkW e3hxpAC&jÔT}=*f8U׏ovqA&SG.+e5fvy3Χ5|BT%Q&NIi`(2Mſ:RKP-J>afW4tTE^vLPKQl_r?m٘ JWr X UYR=aNS7i-[~>H~ W> ?PMdg+}wQ$ݜ1+ :+ioI*)2}T˧Բ=trkEnG: H:8M^fp.qpVEaEhK\,rc-߁ %EV2gLVF#1ɖ"n<'6. p>g^X%&\ızݿ o1> CGJn m][[:77t|< 57`]`Z]pLEk2;u$sU` e޾#0Wl%-5A K( k"ӱ/~-.dEʘ7ɱ-Dl>2npE4 ncư,dz#eNzc=ywBm@cbqNT )Fqvg32"&V8|#;#xݶ dM>E˶^PXup<x_}aޫ cI3RDSlji94k {mV  51Uw8C#/{Q+i,:Pw|Ǐ ʮy11ȭs`b?D=IlJSױ.z9GM!R$n\4]ĶW{4_t<<.׫2_2+wN=y| z+Z(";RQwѐkFuܼfL|-C bt<\ЪL>Yz)' :0O6cJG[9e8-&6ꅯ^3 뮍 7-lۻFv" sv W?<5')cfdF\sHc_${eia } FUX&a[**Zy]VT"zwߒ =gC7%&i)!,{訴s~ ëyeaB6dv$ťglg,Z)6K`+|{+/[N=M^jY6scZdZ:WʹO:8޴xYu'P޼CZy}œcw EjyDWg|$[^Wx3; 9mdCp3 ڎre#L3EZ\ۢi @6!>,hHF/ q2JM*K. 'N",j *6ἨBK̥[]rI,P1"ўK։A5wtz!SȂ3~R ƈ{lR[}"^Fvww*gy˰agtV"Ú^@ruWIO.IЧ*}? )'Ɉ-0M hA}#k4S7eA]1GZKTaޓDA=~Hf r|K[97-hU]ɮm w2NJT9Ӷȸ0JXxE: ԏJed86)啣3SzD0 .ݼ =ɻ :V甜?'46|vlHs%mڜ&Sk1ƂͳA3(&sZȏ9儨+_esONr+όo nn;fr/mOQkunՅjzjԾ[T:OA SQ=YY"JQ D`3YZpr#Д՗j>x[l:Y+ AٺOlj1(5f 7ޏ&zրX@*XuGz8;UJ'yqi_\JԤ)y>j;(P̱toN /Y$m@{e9}m":2yװ¶P-p$D$[P9F/-}"͡ӓil|F:D#eC;=3L[a>*968m,#>K4Oox5' \>vV0jҧ*oG: ɺ TS)&FEO3kIڑ(,[=f˷Ö3/&|#˿&o//+pi>ZG? i[䣝#j\M A#Y,/+ѷuNmcSdW.06Kpj mkr{:qfbW9.'PD/0&p(OhjCq{u!UۅG!0.2vvIwE^o}!o`N&i-}0mC T|?Q- l)J .Ȭ d@(Ac}>~4=7#I&-X)Hۃ$E߀—b-ţ>0jYL2-n^zʺj9nȝԬ3z*]m1V.\xQh!H !nPw +\dGzxZՌ(+Lar|#TRvJmWBH;Frp[`;ʚ9lz ͅrN%y8$7B:Ÿ4)+Q/>MY~k!MeMl@y|XItJB}BeIas3' k{8֪Aƅ]l'XuW|~Pb1 Te'p&Ϣd҅)s+))jA~dM?PrX+]7ΥUuÅeI7}=[ҩdzts]a9:'~0Ť"DalK&%P!5}FBo H*'gH$3cIJf:L-ܞhe?h%w05lV04 _ػOUsyTW×'Q$|U)f]= ><)>}͇5(i} - OƈHЬ,MUF1Vti(,s_#eg| ӌV&L+i}4ީ\̼V*׍-\u6x|xR1(k7 pQA@E="iد.q eude6cʫjtdlMڝ&L=s;j5,# rK)r$9 %tWx`}EG݁ґn"hh8Q$k;˦{/3rs wz*mGkFbˁ3bƾT|팿7qE- @P0v܇cyqKCf}Jׂ]_q K}ZGya|`”[ҫBÏHF+"U'!ն$ qEX2>u*rŔqE螫):Cd ^D-zn/飪inGLm(+GB5^_|/frCWÞ">Gej +Mu|2qRRͿ8lPx<Xx, /'Xr$!7Tҿ>WRQ-Y~Xk,vI%?- w7Q"~}JLRSL;':F @4-z^uPҪUWv .qDo0Bf,Ip8tZtOQFg/eDŽ^_<-ů4fگqP)b-2~b2ll躶4RtB+.MZx'iIL.xKQ@Ea!|' ZD1#앪 \Z_I#]!}>Vd-_ T:IiTp{9 ӃJA8 kd.Duz2^`FjZY׷`/鈓fxH_%0*v=ާQ+o@  ֈw=PXu姯VQ>AU9WJ@+`j ^N2<^ŧ!^FԜ+Tv<&ۙ3|TKXw\T4M ׭7_I_}cc_zYVTh)I,{܆"X0pٗ}5Hk>U ]>5`U쭎tI&RVaFQ^BA o]VNUCؘ$Vr+TA"!eO_Gwx#sfD*-"DX*҉tݕaIb0@dUvt(e$]MSM>uXQܰs4$3ƚD4jk6lGǺjTϻUqvKzO=P-}sh \Lx0 mR&V\1&o…i`Tkzt 'AEb!|{WZ 26 gksV~Ԣx׷L3!P|zf&@C,]e"ԭKw;ԩtKgUpŧ_Ԣ]x`oS咾fR9r3"34],Hn W[v揘bIH|&K )>9p6]'@;٫-DbZ(l3Zװf9.mTV+3!x,.k2;td)+iNTPU_:65WʨBc|(aq"D~níQ%d̎\,Hj/I iH(|9|Z(Ӻ--*hVtg@n4`" C5mq }he3/_x󦫤˜h tXƯOļ?$|CwU󟿕K(W h =綐=qKpY5v@4GOEEP⦡dEXZv6lj&`'rrNaɅ8&̸qfkOSehR-2=(vnw=_6(4=!˃,Fa MA]nW{EA$mWǒćr1"ZWOqxYV lpJBN?㳗dX<&hZ߸Y ) fpxgUg* K7:d>A/$eWM?ƾ&5 A9@wN,u? 4_~q2 HqG]o_K'S1ě*%9WuBt>4x| QҴ_#R-9<3ߘJQ9q6fr~d: w% Z|+(%ޜ6uWHK#CwI9ݐnvSG@t_ ̢G_ӹP*qJFQ љ!_b{5X-M`£*1q]iPVKQ!GLJ+:Web{dZD5g  C4OL;m͊|[ d$4OG9{vD, lo@F͔C|`1+B o$T'@MɴO _(P84ӉmFcNl6Ic۶Vc۶m{/;'&ÖAv%|~dVZA>Siޕڦ}Fq).wGUUVz0"\cSCl0,"A!|d%q$S!$<+I˛, u]5Z4:SP]\n΍w "2.wH6 ?hU{O%!́-bW)w_F@f9@hY*i3F.BJ]=a,mv[S6%:A6@' g ,_ ckX{nZj .N 'rph`wcHOő%Ԧ]3QH?\}*4՟|Q4[cjm>eo@d=]˕EeZ f-.2+~ngcH͚ .~ﯮt3])=koT,[Z iR}U&)ְx>(駬/wy F[O'_hӾ9c6Puy\:wkkl$Y挥3抖c@FO8RUθl4x:|*O@ _-B=tW[AF?nDNRQF[ju ~#mbN1R(\(|?k:N52lvw@sVqz6dO _ 6ʫ6]:p/c' YH!)P3{? ԧODeAٴz2Bn! R=>S=e;Cb,K"xdCW4ib]r>4c\f(hlXMYPg f-(9;Ccė㾈}lJl›y6Z%jP5 2ퟢh?y!~]ǘQ'|cA9œP]2,޷5C4[^҈'Xu^FiX`w+[Hr'p&ۀP&譊Df.e~-gղTƶ{(jR*Wtb!v=H"iipnQSORjkB032OB,J-F [>gTI`քme7R-<SGOXItQݽoBG$X(9W/Y|u4a#w=Oߵ+͆N(+ï؊N¬TzP"cǼ2ڐ鋅^ㅧaʇɛ;yh-Wss-k`|R~dsPMq໐6Ҟ&e0o>ֹL&[%Z"tX?fbuU;LbkKqh<,RPZ8W;oxCZi5[8; ։NQ*_$I2"Ҧh3 nTeyTۢ &3fځ =LC>?;ۿWi9rK[{~lTHѩXYpC/krBKHgDQGap867+ebNe.&?ʗ%6`Q+sBrɽ{ s)#2CQKG_eiqNZ<5Y`Ab|WvN*һ) q;/ޘVˑSRj& ҆#kbPto.`)nT&ƙ;LDbTiQnT م8K6RJh+žyѠ@ L{Ws$3 T-s25bskVs!幉=BB>]JdpeR 0]!~9})lgMUah]i갪s=Vyx ~+\noږwxt%[X=`UjWRC{TgBgڸ˔Zߩ7QҾRF yȿb|"Ůggq7)ԚÖv0\mGX>hy&RWG|.Fn\6u868HEi9 J7DEE}ǃp?fT4#)򫧔F)1(d-ljB§Ӷ 0h(,;c1? $Be&aS7;>*ڬ`Ԏ^޼G6 eWDV)ʤY]ͪma] s=e@eDkÞ"E+?~ Y4ץob"A.DxOw%Gl]DG76<>n4àQݴr(d2G+_ PbZc, !%qŋ{o lk׬PKCSAOt] ;6 EOui;_ QɁG7oqyt%e~nY6z*S;rm{jK}4R1@:6k-^aߙ@DX"fæHkMbmR)73Y/N{𼯳3[ASd6WBb%LPncޛl`x91//R4=岐$AԚ]ZӟJrվQ젬Tb{im;kEc8/:7#x1(^K&@msUҌKSh*D^ F$Yw`"01J=ZIט%e 7a HEj0\4F}4nX_Cx7Sн֞B.\lүǛIw( ^veZ 9.93]1P?#1kN ځuN19į i0?Pd tAϠ`m&_r9F@iNOJ̥#;+OMظ~lMÜաܒ,gb;gՐ{܄@TxK&uwR%Y>Jt!:lHE >'S8ebsGF3bݓ5 ~I[{e[\Bjg-5pII Xv}.uZLɠz)pϕDؔX ʎvA@3'E[tSaՓkj1+ն g-yBM kzr>O>)Vh&jGV`<h CcPߪh&37XO|+H㗈VںM7-MIQH/AҐIbH[[ %ŽX. x;zC7 EA^eO}ua_C9 (rH <:YUN!R50-J'wa(w+PK D8Xpd%&f,prN5 Tvb; cBrSxFq!p$ FadB>ΝiiՁåSZZ*3͠HYN\淽֭{F Oo`SP`miag ęλ?bf>ˌ_olY<S,H?_<Ꮗ5j98T!c~R!5j~m#tj{IC$}ܝqFY&(V ͺ!<:8Xyϡz}AT>JoU,2G PcܫNS%*drnt׭a-k xiG3GAxFK}{ſf"&8Y$-Ote'4xoϥ' XCkT/]$ڢ1 hC!L$94//r_ޚ4pKi3nO.ܝ}0G*!A0;8 G[,M8pҳŰ5woaԆЃW̤SXR,<`p+fCU=l6~r&3ojA08> stream xڴveT[-ww+ݝ%w=#ܾ}F=^VENJ/l`pwgf`ɫ83Ћ8ؚX`EƮVbƮ@%@ K?f/VusttpXDU%b j@R]Uϧ#~ :ڇχwyq5a5m%qf?w0܁.Vh+6/##+_YZ<mOg-ĸٛ}J2ڻ8I8HӇH3m6Aci򗯜holoaj0KQ  C_*W"7ӳ3ۻx#7ymS{+WO̭lwS3+d jrgO/{WO׿',&b0s>TL#j?ȓuKͭd͑Q (-?",& 4dCW3`nl2~<`}\݁Wg7?`9fVM1(.mo[ɿTS~cBmf@sXF׏f3c%fk`lτ&OT'L-v5hza{ [GE#ۏX:Vvthjctqpp~HhRҊҴ.ۛ:Y[X9^L=ahe3_M`dwpp8a(G70qqX}L131@? h?ݿ!??? +q]C^ϿHrk]aUWg/?L]C7 [DӇ@ `fs[N5{5/g{@O)Ҽ)ouJSxxd97iL߮q 1* Ƌ&|C:%2M(oj9KZnO+:9r6 Uq2|}@Z](2`<*Ks5'z(x!EgTx/Gjz30^ /Ȯ7.OՉn\;|Rv`qYoxcRsiJU>$8;R!td/wrN_ό*xPrv{RFƱ <7*81'mwVRoY߭&+qۉHLHM&{ AOo].<ᅼ1Dz=wc2B] \[>&s;4\QZNITpٛ#?HCZ~~as^x$vE-]cUm۳j'+t\q1"4}fW\>?",+oe}gcRsIW#xƉ̳6m1K g %Xh2R aߍf[t鸝 4Qs:퐆O%[ mB&ZF/WG%+7*:E>G((Ƈq(G=譠SҘ%KHsIU嘥fPd SukȄz29ovlr~É"o!FzSewhJShZ,>b50~k||xl9-,pv*oګ7EJ8 S@N镢{_2xOhˁ f '(x^ 1@E$#Ր$w8BgR}^h Q<_YE~f=bnFB<<)T[; 7.n>=`EQ)#0z!PږVOwV4%O/ wI:/JtRYa8'#?_TQhK2༰vs7}8tc { l$g}nHB10cQ76e_ 7VMN/لJj*zV+=C\XX!!~=zO̖5˔[yg|뤮HCUA/zdr֔w?F3@gY dzVB$۟g-]6O[ m?ږG1_%!B1D:V(Vv"ǧp3^N$#7HR|?@z2H5GpWr{Mߖa %ٝQМx1h .'/}d0Zp0 D<6I99ާ7϶컷*;#m嶫_Q 4gJ(+j뮗 pxZ[ֱ3ԀUш-ě'!2V#6Ig`+!|5$^My#7d||-f̆/cYcxEFRthl8P틨SI4]3ɨZOBy"oF,/ __[qu#ӝ+b4VYErӉeҨ>\3?=[Y:(VifӳC,ވ2t' i4b75z JnBsەo/Kp]}(8j\PR_U%cbh|z_a||'[E RMPNS<f8fj+AKF<{*o`y] C(vԋ-s^6)1*0 UD@'\ D~ lR㻗覢j5bqiVlQu,_Ie}:,VmRLj /uJ`>y- ?^14{ '+P;.W]*r)YݭYeZ !6/Y Bc)6>Bs^YU}v/_j2RFߔ?(9S䜌;FϠ6kb*N#B[*9=zJ-VYW%'$ M{rjT-PJT͐n)%qAolIoy0n|I:T =N88I!M䮃0\xH#z\#?>vVZs]Ww21ăX;R]`d?of9P 蘟~iR M:WV-8 ؇?DV參 iӠT.OtN X*@Ȏ}ʂ͂ oŋbɠTlI>}fiȃq $Tzx%2#sesCx?wj(m5D@"tcBwjH1']4=;;Mu)$4H}jbbX-0$}CTY57r < yxL $ב#̬:2&Ξۢ̊MCU$Fvx䎔ęlB=D (<~`n%6-u|X⑝;VM6Uh;yd<+ CDҪ nP}ELl,eW7W@l/PݰZ Z 'ԴHQ_=K~Zov=jq I˸ˑ!hcNv FDQ/7h8PC~)hSrqʵ>Z+TŊh5h-!ENzAXk-\;1w9mHjǝ_hߥكYu:mڐNsJgH>Lזm?4Ʈ[ åkJ(=!Kd'CdT 'c!&9eF5nat'ThH{**7d!t4\.251ZmUKs"Q{Mugw4<A.PJ +npA&r ="ei~vKZ>MigZO5Hp4R{h3&o]%%4 h ;J8TnO<[^q|pa;%bYѽO%A8,@Zv_6פ&_۞7.)xޗ{:Q4g_ۆ00nw{e P .H'Ae8kwL*C!TEQ)(O+tnŏulK6VV_ BtH1BնCk˳d+@6EY*=jm~:/3_4f,Ӎoq[ cd%P{_$S{3J~k7-JAr, ʂU4yn\6]^ڽU_rT;$q_ -֢%o( 7*Jghr^ \Ljmg}w%[(MqUZ q0Ve3<._56\FZNy+A/1|Żj5QLu~S6PHsPIk/dhsw O *J(Og7Y-(1^2ǧ΅p$.N&W@ZjRK/4>^CL)[m..p%|\SyDZɋJaեdcGmb$6J8opW['.1MlKlj%#e:k#^f:lREڠ F_UDĩ=$iJ^'g]3ZHm>ь :\'ah( J :ݧ}7AZ+U7@ԀyIg [{Q7G:\=n9mC1U*8Rm|=O ř^ >cXS^ @V47z={% #mn5$!R|~͵Hbx?+Ui[ifB)ASĐ]JC͆p|_vC񆮿-xoȳrOQ"`ܞfʏ>`ʤǎLX_|۰Ї8od%/RIbC<գ+N|[sK#y-Ql +l7)Gw@vh`0LL I)nD"agiy#٫ar» )#v=}0YvpS' {nTnCpLp*wGXM󿝇x"u("/I:㻽 w eOBVPFVk6H*VW*|.=: *5 Z*toZV-tM\{*q_X^XLV7Fx3\(t rvQ %gVɈY Xw }N%cQh!oXI#ԧFX^w+IVا'GCJ>XyS7w_R!|dˠ|g>%:-v}4⤭Y%nȞ'?<#NBD OsyCIýdC ΂ª_1pE9ҩP36A-Hz&7JMNk_rԒj)2VǵjpgV%[[v:*T^  . kLQ,t|嵟N?'n!ގ?饑A8;PshE}nd8C1ao' >VπZJ1UC^A;◎,1 Hz[Eظm[|PD^t-I2n%1CY$==^YAWlT+"9nxAV* I7b:@cW #py}Lb1aTNԾewkd>+^e֐Fдm&Nk{"Ѵ cg򯞵FuOWt[@Th ሧ Y矃E !g`okes(b:đbiA1&.vKo)&/H^llNcAm]%ټ A癕W 0Ut60 jgq+_mVkӵT)A>q3׍vGxd;+$Bn LL2 {peo߯rkl)~W8&j>Lƶp.${VVH.(򪚄-tQ|پow%!P0X>7yG i%\bwtH>% 26Z'/"5 al?TsQVAΆej Q D¤@̋ez#sőF12S|-JR.4pec _v&3*) 3߷_Ku}SzQArCObAw^AC7 w2ҕM{ Yw7 Y{TIJ jkPJixrL4 MT )wbrh!7K҈ϑlR7Lc>DQÅ*#xppg@z7:"#}`i۶fk3"~?SGk_#RXTo'LN3z-b[ItOw$]FL ;Vj^ CL0nEQa"6"<,6ɂ{0h$T@DTkX (2|=w&;/X('8`-'zk'3 $T"̗/BYuQ!xչ-ۏK\=p!kh(_"Wԩ߶R$d&lOִ1rcM_o%cA 4ڱykYc,є5 cW᜶iz: o&D6Sdž fN~klx۱/B _ʰ8xbrdiljlXGtDF 955Yy=ġ g3T^=%~w3*HPZGK*g$Q1!Dv`(g1$o|h 2]U!\7v&ʷr|DgD I;SAaQmM p~uyeHiQ#>A@4^g;.(5TO/(4֘XXJ<5~F/0J5d[%ғ֞ Hm`Lh?BL8< ?PWX3RB9\Ks8ȳr +8(k43} ݀$ɸ#~QQ`p87uba:r$p8}͕tXl9xaS>!N>x쥽,FIiޅC[¹'߇oe~&b_H5[P↢$͙PQ<)m Ib }`B2<.DeC%ƥYKC %U%ɥ,Y4P1eoAsj/(wB݊iN$%(}'`=6oN }Yv4~ ppz0&v#=9.8'I7D#sK'L$od#(s ؊-Xb8\_E2k>yM׷QYN>tKBfjdx-=)ՔRw {^DS|OX 8^KaJF9Ss!Fz"OD H5!#, u3liu=..yg"jp(@`Mp,^z=qP gD8k|}lS uC"nR("Z%}U!\4B=!QHIŻ3ËH=_`a긌t<+50U'Flq~˲_S(2Ϯ77ps.&Lha*ڥ8 1\h|I'mIʽF`@m?D%=|hIbͽ ϘmnI]ˠi5|w(:Trtek:s5徹Q5Ze,[)Lߟ-20R'[~0xi)XXgUg}|&cCnX.FA\u"RJ9:lCXՂa=ZOQ=!O|{ A` Ùak }]=`I?UWGUf3*io;Y+UV)Pe~J`GbIݦj [D [|)B|ycWsnLGo*]|90+fsVl½~IT[cUHшlȷ]V^Yev5#i P E5AElR'ЧzAK@vyZȑE Y8̦Q>fNgcLqiݴ y;aSo~VX["$ t>HoKE_+6hMDLS?b'׋舢vрuufD2u)=v2돔D0}[R&͟/l_'SmY'^ J#G0 8mu:V+x P8 V[Qôu.1VlNn,{\7 /{˃VOm svialmt/~(<*3C`Yuv|;%roH,(RRxi֑ncAm6?t2 Eն@5w_#л^CK%;+NN- 6͛ [eڥlx@Xnu@= B$ZOfR\DvJ >84#Yɺt_u8 a}J)S4[gɃAe1UsZ}I}& NX{2ye>UFĵxɞz2׈>aSt$ )pY$dl٬@bWJMo~WFR <ÑKYH̷> kFW=x* UbP\61~ =R8k +[U j=VUAuyd} !u2鵦&~"swsC$*xN]cU} Hq^rN'q1DkA]h;k Z0bG,T1$hdp~,P[l#0~r+7aVӛ\c~I{tGk1C-=HW:t8"GMxIdp,h- &(BC#hm4-Mu7EnW&헖09tja9+3uNKZ.HȢ,r'yß?#~gܰ?}8'A*f,YZ_0œ'Eٟ JG ’h3t>zE並ri Ё5,u. QCT .H")'NTTJUE6ܳ|cpkyTf#93 B竣DV yX %Yt^Shg:N4_w767%ԕTYS jw>8m$ijLA ,WU$uo>N8f*`]y-jq^<]NGO&բSvH`͖jX뒷1-#Q ܒGIi29 dKU+LᰟP8t}N-.9Da=TTD}ˆmu_x߼ ^"ώc9-".beHI;  ᨨ@,ri5D 氪iͷ4'ۊ|~%{6,]x<+I.}J 9=O\B{Q&cy`bLzQ}3Sk9ICt.$cF TCq'_杊3Xt[: MCujx;lXX_h+?-ҳb n1(ú]mHŕcD5L Bw7^GSnYqJƥ DStlK9"S*Ͽ&ۣA!&%g՜B,$ܔ y8CDh*4a^$l'{`:6v<$7AjVA1TWH8k*aMG= A[U8('PgUt0R8y K i߫$#jGW*Zg}um!q:UUYL-$d!Yy*Q`ykdY褄#dabhYVx;u 4e-߸TE9F#sk'KjR8 i絻PhL\r3~hΐq稘c_v0'FG-X?; ~*߳Y ?g^3>Am#}y%DHeW҈ߡBW_ϜW9hz"LaG!6 zVcNxlsAwWYP(rB(j<͒6fN2pi7LNM(N\}g5ҷ!\_(]7 )!eaD-rj80{*GF/B$t~aԺ,=Yt9x"Vx¨`3fmU'#Z:S|"if~W'.]3ƥ)mk@gH 8| `lFǰkGo $ X~Ϣpk]JdJ[5k~%ȺtbسUNAմ^>)~" Z;D˫e_. +[:MuT.`mXOkG9$bVN`m-NMyK%{NXZћZ[񞞗1׼ ]9N XR6v(ʁ4]m?GVϴJF3ꤘCa SKx{{ w$Z#5'?JSīla[]@PZbHPij ?苤L*D ysP y(@ m ViFYm,{7-j[Tybl G?\]Kj70JNFiILu-dHATsttUXЎBH$|٤|q=cTcH !#>$Wty\KO.hom R߹d_ ~O)J#e4C&N,).SbU[+(0?/]sïn\|%"9  `YDqBJ3>A+ꅇ?|I=z) Oѱnƽ4@ ܇DiVٺEd+i~LZ:9kh/f3X(y059[pm`(`2]eY`|TleK+ ͗}8fnėIfAtpASc0P&yĔ$y7(jj! yTnV2^˼.#۔n[̪ͬ?f杶?M_k6;΢vo0TSEI)r N`-9̽WaSSRmQ.Ӏ"TX'f=B 3B@Nַwc<񰣥ҿB7ϵxLH~=9GvY]?PW/>B: HP3b%#32]s5+@KÓ~Bb  Quj3=ۄnnTG?aW,5 Wenmq+oj x](b/UV*9ĀX65&ш x‡g]sJFWLEc6ʙ¹F:Ww,"]J7e )$3o0š @G+KpVfa&A̼;4FN[SIWsLY9zZ̫^BM^^L1Z3 . 2icBm 3bzCUZp;1#/=:x);cS`m+y;d"Yr#IU׃. W \)]A;8H8"9JWeO9Jի oĘOaa*1U~DlrAK{F!dHEl@-K΃z z?pt 7 `Qtcٷ}m'R J -γYl_C zzy7p_nq{zPԡn۸Fgy^to@rJ-nr[ x2|k:N]k?n(O1qes{y) s@R2 kgU-IQNf%aԢ*Ga/xݳ3'뒬(Kd:RwvȑH qO<eD{6f?2g!Aм+`i?b83*0K>.kX|=]yK6s;@-B_4KrjF#',ߟX՜$^Ϫt]y%|dUHIh=БYY(+ݨce<2ir? a}u9W6 P9=h0Yd'R+=̶F~A3zFcB+!*^uc8zy9-8x  f'|:ps)6`4;'WfzUGwZ Yݎf ']16=C!JnWgD)fA}B( V~{u,KMle.^5t78P:uW1l!C*HCLwuPZCuX2.3EHa9Jѽ.KM>$z O^xd4d)pgE=|-ȲhKg5\n 8ԇHWM1 pLT(e* X mRɧE@:nh/aj~渥b32emh/Ts΄JFӑ4sS3Ki5y 䠳H~)Aώ6J){ϋ׾CayQ@ e; w^2t֨5QOb/ `5U̎">چ8R0srsB=RڴdjVU7SqB_fg}?Hr0=3G3O KtI |9yƃic&P \Ȟ*ij^~Z¼)Tv޹c=3hqw.j3mByU} ~+%ubQ*KyЅN[ [BVZZܽx?m؞K5G1ߍv\3n$0̰PƕGBM<JaeU.@R.D λ4鴒Y}9*0z}nt-o$qy+}[~dK,#`t1&T$NnDLa[' &}h@4#Q=1q 8*VogC'lN@Z$ j\ /XOLJ~ddUW ?1_E3@θ>zKnJgXzJ^@zr@tJ* bO_s40K sG_r]5C]H  BȮD$H;}{; ?O~54.U1}b%[}='X)m3jKTގPf4nF=H3%]50:me&@+s\P|ݬrPn ϊu↓/3P/5aL>'0o$y6~~Pa[9ņ1WyLȗ~fZ\FOxLyT'2NuwE t렙MR!A%MG֔k_5nڪӘ.@X}fX~:Ӷ;0&~OBD̉˭0I`V)K7)} @Au?MϓiB^kR|N%ҌE>);JObsO(*O,prܥJqI^Se\4֯PqX[)~U R*N΁M픳`}Nq|.O~\Zbŵ{jv61u`Du1Z` ,g6U7I{'KU ;؆8־ö<^k4 !EjW] "[Y峀t 7ިɀ% KIi[Py{ȷ d$e/3] \ފ+~i!_ ޟ Y IDIƛA[0żu~%SЃo H' G@;OW' <32u+és)_؉|zґ1 3: ]U2sӿ|Xd1>;raҺp#K:, )>[$Ey%\ˈT>o\x 6;FTehً̘8"Lp4 ;&ܛiͶR )hZ_N9D76N8-:q, +z"=6j X"c Ewfd-Sˆd^@06-В)2,#;(N`-5~x<5]g +rfC~/ P]i۵FlB,qKa!MswxyŅ8ܮK :vy?.Jjo/0Q`T PaKJ]z’Hnnkl]ljolHFeKì1 V2nAcn8S:qcةDԠ=hĆ 2E4w'<%n;1-k`,Ag1%mxtzz! z7-~S-USe%7QuG~h6L.}hb2GlE}[n&v/L̯;0i psC}! ǚ.VpCh+e\'~+'Mumjfe$OJ}t>:i@,5V E| i΅Kj\JM bxr*?*.0PwM{3tȑD]ʔ`Hv噴VVP8q~0h> %[dx5.,| ?su:_N=z^gZ:t@[ *AW  <]]3(N ;bE҃JM.(h4 F҇ℓ-gcK&NBJFLVm*ʹzRo0䩨Vt8tP/?[Ƨ+Qv/@OJ, { bZ?XNo&)UEcZ;r/_073e!4_7Kg/J"^r)&~N ȑ)w64n 9o mx]sޜ!?"8l]2RXѤ:f+P/ﱍ'oh]/5@V$xֳ&bXϞ- 5g:t7e@BLviɹmP^% 8{uh0{@:CQmLh=ca5;wn`oibx{o ߑY a Nv>ǐ#^=&jtb\ ޴)si[>@OFr)S{K"zW2խъgrp0唶qma۠$-DO<kc2][HKQ#V*Dƥ0tFĬ[;A@٪> stream xڴeT\ͺ58!Kpww ww'nv}N>;GgzjɈil "6֎4 )i+}kz=Lhfc-9d Azz82(hr @G}%7[ R gHcrM̬@)6nf&k0;[ oha`aз6HJdl\@F35hoi 1(ʊ QYe9OŠN6EPQIY /$ PD~UZPd@}@ӥ~p;n_ARmi4ut夣sqq5qrp7Z$)_~ @h$b/HJPob !״W86JIͬֆ@G}G'?6/Ј_A'{=e6K]2-K/}1}k'eX;98:"`lf YcVT 5 HkZGWӳ8!6v-H'G{7;6.o퍜l锭윀B2jhJ? `o23><G{'ߎDp l#3CGШ ?ŭm2 tNl-F@c8:GHPsh߁Vfn_!l)el-g b 43s44;ږLʿ%hvAߏ/ 3@ciha tp0+ @'-$"+?qֆ6Ff&FV=hYX 63,:ZkGP `lc{CYYtMB:? @' =NbЉA:? @'1$ ?]u@eA P??OS@U@58@55 ?߈hDwdo7Z[d54 4bxZhl'7tp' BL JhWfq2 $ lѳ@Sj :AClnblAlA%@ c@Ghof % %҉l?\#_\tR(9 ]lJp t pkAٮAPy H+?@܁jߗ? 'm,fF7B\5AWٟ[lWf&z #10_65׋?Q ]ps6\I߿x MBqОcIľ[Lh"5Hqj{.T# İ|]kN1CRUO^- t(^<BP9h|d{pHUڲR0Јno꺀ێ0ͿH5sDNpʝ4{4a%ChPvx|0RRQEKj47Ȑq$|'\ À# Lמ|JI'I)V i_MZy]]Q br%jGӨo7^j4G^``ӎ;i!F򾾜I s&" nљ@~&0爁`,?9,ƦJ Ϙ L^iX^xchٺ _m6c͊#< Vѐrk vFvQcP:h[\1 T4Ñ[!NQ RD\1zlJ' jH*Ä1.֋jE6}Q{D, ^<w$ 5. |o$KMƤ:ˎ|gC}?o鵂+JS<9/qVNUG _jy:SzxDRE۲?IxgněS.5WZN>"kbyוKq36NQa9dy,C #Gt E#:GkL]Q8w/ ^PxwQcքQ:x<=`Ry47vP:z4$S_9>\|ܕrYȃeM!Otd!g[ɇ||䣯FiyLoNXFBhݧ0bL4j4o<;'[sgw`PR:ҷ:ʥL]W,Axm)!/ V~Vs*As14 'I^O:?Oke1mȃ7 X*})7'ҍOv}?|2oafSր p4O*| gjCԹp#_ևJH-%m-H4!.O R0;1MC" w,1|k 2׿+0*~%+-y2zo "4LgiZ0<{@ *-'{F *;#+ldoEOAUYGԞ~vq_aVG6u6ZPBUt ذ8ck7(4[|F}L ݯ[6a0i,e,Q:V=SY޻3qa!ij==gI-Ƒڝ]ↈ(,4+Ƶfp3y'Elm#d~(y= ";C~v@l'‹kD \{1aq(yρ ZEsk5yEA5}$Z_gV#ᆟ}My> [ӗW3-TȚJ7񑴇is@\xHr/YO 5|7ӟeǥ^Ǖ܄wfMsw3V24xun_AGUܠyَi_KԡD-|*VtLX%Қf!Bmbn,chƒhb"=K4ŋ{˫U/$RX&W&z0 B | 7rhLU:[Ӳ2`ydLy@ B1nmWdeRsb/(c"(Psv2mK5fOʟIʼnVrrQuYTɸrH\Mdkjы$Su7Ddj^lGm/5MMΤ5>̼Fv1s@<";hf*)Ts'iq)Ŋ $]Kō@2xuM-|s )f̌ǩTaTtNcyO,WIM|Ro~ѷ` ';iҗc~ًU7؀ ȨVG6)'~Y]g_5=~sN ޴p6ŧy6+G|hytxj&Ad,ʥ鲺KD[-_e}IK3&ULDks~69Aj=ahBlYW+3UK9oa b.ٱΜ M#=Y I.;)lr4{Mx7Z'U_hZX9 ZZQDBjðOx|wѾ ̬R0/Iem%Lm "sv^eibz(MLsJ9;>fHdQN+|FrwKȤᗺeպ,+{m\  CƨbքXResStɌ.&o# >b՟B8nD`i/EA^#Ț"6#9-}7Px4|b4!_u]dM\zl8!Q~[z`^D;s8f,!!f6`dh9Vأ ѓtӘ ~r>*xF[.YON'9%Wv{1/霳zCETruY-y~IVD|z:ۃ(%3 ;Xpw/_`1idGEu`tzDHo}9 fvәr)\B:nW3 !:R}ȼK ?թkB#FL#Y:TBMF`y]9X᜴vtL.#bv^g=E[kˍ86S鯄n~6-HAYȾZ=1C]ֻ|I9" }0*:ϐx?TSxѸ!r휀F |3Գ" E+F#]DVg='wpz69Y_ R@I)j]JLx;u?tba=FNj '@PxIE_m+?LRW;wnXb+Ba` nv*`BL@%,ib]'/.SRF]+n݄Uۧ-|Da9N8PW6μ7*|/L.[XE[H@3)Z|:R:Z>}I?Oip^ôIl׮y|DTtk7]2^ a:oloxn;gP7|xʸD"ښЀߴNŃ]BpD/7rtGl^jʻCLEϕ}ZD>A];Cq<}cxk:6'uk`Q+2gkUjt|#cGBLYLRh~ZVd3i~/+s;~ߗ$o.BevIHiF"q"stA~ 0zVg_v0,U%\SBF̯&xAV/txóPUZ;Is^'+N`5ZG v 5P2*w|MMC2d ~]@1d]oye3(gau_l*lDYBz7&P˱foNM8!w4O k!4O9JXJAP*YCn:lnꗺ: 8y|ώxQ*g q*IԎp3%ԒMW9Lis,گVYpXVz#>7DEiDJx,W=6klMMM);4< Y e4zֹz Ib珝Q+iЛwZvw_qF붷?+*u^xCeGʬFD=:k7YƇ@R#<`Ĺ~ACb9ڍIݺN9ǵe1X`d}c :}/yhH34S$AǪ=Cx/[X"ABjO~β%#$44 \/i⽯s@:lqU\uWViZօ>SB<#FDmTTۀh6u&~(ס=wH2OôBE9[ FӦz 'U *V4>y!-.Rq> =gY*zSzPb(b.fsdMFԼ$ N(bѵ.aV'-BDYG03.Wl߰sZyC3A H'BGfQD.<}p_‡(K=p.t]i!fSŭ9I$唫QkPxNxblzT4Zg|ؑV'541x8Yd4zoz?ܥ/1LGT(!4(d 0K-)BWGOX*΁q}Mį[pˤ>|)/ʸ1d0&W3wmwv3 $+mG=G=0Cp)L a)c G&e.dw8b F.A{2l($]1@i ,amuEۤ0Z-jQVn 橙Ie7/a%L@9\AEP6 *!3)i9y(@4t[q&Gs˧v٥S ٝK/βcO1 u 3F#X[/|i#X fEuI<^ 9vmY1nT#ɀA|`OIbEѦ򋓁 gp-D#(>o1+vé3?x7y+?.ZOϟt:ǹ/!u{_*|s.:r/1QNIlh |yν[1B2737].%pg O:-`? y;bµIMbU~D <9ɚRdt\(:N"ώ'åR&6eֵ*9YJo} 9#U~9q1˿JLG[MWk1/]nRc#T8Dd@”=~Nv=hjowNr򑧒dA)-U\Mz/Tv'K&A&\yWِFCwakp{5"YՃ`?*.g>bBCjG^(9lb"(Q֠οMSO?#bhޙN,_I<)>bNJsNk43EnGܛ+?SC2P_ LztmS؆8XGG*Cb*@>l [f}iA}eHU401yfqrȴR4%5޴鯉[J?]5y>bt' V%7S~)9hh/54U<JnF:v`|LlRcL@eηt#To͜1/ԝ_t>)6hM)mWQ+0nZuԍ#!qҧmx[*PbCRf7I^Zg͋#vchJ> MP(`'#2ýPU& U_d%EĴ9ůnЪb7lmpTަ( vw>}Bhޘ4QN?]] e;#Mhn]ܮ5%idbEO/LL&ϕyfVŰ1I-?j.IUgP^;)"VL,*\bZXĕגPce {ZO&ntj$"c}?ISu{ e._.O@kK 1*4RRcg rv~)ھLRa͂<5ƇÞ, śŮ7 Ŏ[e+y*~$ؽVQ)&SH+//wM3W|oB\k͎)%H/iURF@;IL"X<Ǯ31TKNğ;?JqU^m:b;s?Q^4uZuu;KKs'+sJu{zQ7B!(珞og3ZE5f0+rxn)ABv7d7 i'r  f$'_7V}VyϩkY%%6e!GQQH) Dj- z+$ٛtlH\WK7`Qb|zY] @v PY~h8|݆Bk=0d9 9_NH\z: HhW-ݕ=x9#+G4hG |i $o^NU*OrncE?v-n*4.q}Gֿ >~H+lX@B ikCi`ZFǨ3co>D- Oo+Լw3_ȌKB`iA ,V: 粔{ߙ&GͪG2ăj-~X$ٯC?a3 #^c!n4Q$`6!7?ru.XrOgdbeWl,Lgt}؜K=J nQ$ٔ" ݬ* hȱܲy) &=~HD-'dXP O(!?GQëU=]^k laJ^`s˷5m]LFSU/NB]y)AwcOOt7 ^.l%9 ҄:05B(c7Ĭ i%XЅkZm.H+.tZ@~[1;&ث 3("ƈլ%y<&zT.il{JZk$WR dͷGèOhR[R9Cn7j) s;i*K,BDDz(yнy6 ]fZw.^TV+.ˮ7N‹Y)]ue%aSZ&%/R38M%wcrCUE@:y\ơv }Xmxm C A.Н[~Mֿ_VjA4@:zTHKD+)>j>1=.DH[~W2w Q=r{9qT 8':D*C>e6_2rAeWWFc>g A ;в|z8 [*҇B,SGFo>݅rH8=n ^fhG+ l/f1uN<l次7lbJ{-ХsoRoe-:{2>3ۡZ٨Ov1SW/1s+IDB{z2Ijv7Fޫi>x)N<##x|KlF4:Cľ86ejG2!|Qd 8tf2ٿk xV ghRO]*nLk _DPXR|]p|'GΦor5Au WT*W@AV켡p֣U\!Ӵ(@}e{[uE[/kJp6dN3)Ƞ`edDOuyX:T%ڗ$uonxO}$G]},qܾ%NjTAŨ{8/"E7O$Iϴnk ASSfs(s(;Ð$,uQ̕"27E5RHs{M) H-Pp[{W\0Bv-@s YQTf[V=J:p%rxp̶Djf2U+*ȭ* `$asKMU/ֿH(>=:( }f ,.\x6F_WH"u 9?BB0,ݓuNYgڮ֦8)/7q'(,3=3]E%`-DJPɛ Bzg9H/b@qO+95;mr8}1`""hTO:Zx?f6NřY*b!'*3ajshT2"},DyU-*_B(oU8Mfx+#rh ͸/en kS6 Ӑ77I-W_>K*"_}I HQ]enŽٚAF $g:)&4XJ[m^O=V_}hik B; 6a]9hHAǛpmUAK_d=ǠB&$nY Csq汎GeJV[JHʋ ЮjeDUwΧn}=ldxK33O&jF.+ `nݺlH ,)x}N2@n[L9uo޿Lx1=x|!)EgIcJٞO\xxh,p;ޞl^$ x%KV qa`H4ICmwk"e//`1֎wie“%VFY2MB4Zt2T Vv[8< We1ؽt~-\)&<d Ams?8.4ۇS\ɵDB`OnOVv_fМK'O??5{뫹W+"BUtR2#UA#pYix]tKWC^W꠰DpN|c{%Zށڥ7Q'ndzj@VO65JP4-cɗ=9aLNކ|W^*:+p <-axD+w9,san5!Q+\͎;~)dϛ$ `ĺy!) 9 Yt©4Nǔr~9@CnZcgI7\& j{hݻ] Vɰ-2WQz3ݮLv9+cuT,|yہSJG'8#Y !|p#^C#"dFռ %(2BwYrj cUC'z" IGRA"zV[p"|bݠ]jO%HŽ7QyMMp HY#ҫW!&$~8[2aF0W˝cZq-vT=sA/`cɿFF^tt,UBD &%6Bbhik4}8!QGuoU PL1w (ˮ/Cw_b5sAXnīI F:}geWD4<ρ)ЪjW=r`R8{{cKXRW2< ʎCčp?4dL-G-c𝛲t>.@< %wipw +XNj3<& Q5(ʈ&Aߢ=1vOFs}Wo99}"n{wZ̯=Veb"5pZ#7N k H`|n1@ "|~[^6͉=jx k^Ij:㱝k˧0aUeFʃP]Դ%9 >ː5Y>-~\fqX5(>EArш%LW;S.0^Gmd;^2uKJWUJ2vXȃ#:p1jy5yİ̅8=Ư{Vb~ߍK-9EA5o&u7C�&՗%پ`]uϞBXS\O2{8SH q" >?6`sK3lz,23H^j4C׉ .(uuYq3uɘhZԧm?Y+U PC~>;\|jubv"܏)f8Y% ũo 9nE"=J%֠E0B$8;}Ën.OD`$V'{ŷ7݊8_?0OZp[1B,0>}% {:^:v{ z Zcݷ3\ڤ||έc~ 'sѺ 5&;'4fO[#q162Cyb5QG/iY"OTF Y,&+x0''VnLcyO=*<}U fQMPm  UX\)&ntMM5E|܋DcDx)yzN!)}GQHQ&ޒJ%R:"{_̈/Pрu@Xa,sz玜~|_r` 5)2`sM. p'#97\?K.ijOa<`_=AD(FxOK0cTuyͻ#,?APEǻ%8̆*FkX tqM/V\$Z,FVV.Guxif o%zJTjr\xOH~59:40mEccg+)pD0KAa>vb6>evQ5@7y`%KN #w[w{?P}ΏÏV`;tP,RnLt.+;ks&&}.A>]utYl̼XRV5צ+N HO(z_eW2&Sf26ׂ5>paG9Af<\`-0B/0]r['y\?qGL# D7l=${v"^"0} >U鼎 |T^v*ʄOMB剀G<֨}!:aWta@in-ӊ$r;dLRA9,f0:m۶mvmOm۶m}kSow.!$ZvW0\h? n_߭ W'ݛ7&x8ikG(O5%Ŝ\MUqN7yg`Gp@M1nP#HDwEEAjPZz['sJvH0:Z5F6[ ǍCDȳQ %HD@jqk L0 B8:N?Muefb}ۙ='"〶&ĥCP;BG޳||}kUΕ`p5~O1x;&D4wyA~jbm.op;SB@8|]D٪&]`BVWsZ񹛔Reα"Pdrtu >vzG\c$omv߉avz²њmF7<.{~FXVr-Ibjyj`="w@ܱH]a123ElJ\(U&6]kKR|#NwaqeG_2ٟ܃.~܌c*WcK? &<V8C}i siV2(u{}G{ +r05 h;|Lel7]?+(h_IYnBˊ_2r#'JA֚»/\ m?OPTC[~E(Ľa -B&ko`\a^r-sDTA[WLqJ+3P(o%}^;ܒS)[!o"$U2MlaEy/(Tl { .j=y]2(7[.}`XMÆA) 檢"Y~-EuA"eaŘƶcd/ yqw̜Rm_hՇ죤U?|Abe*﹗}cmKDڵWqh熏;-T0(TtX:'kWifL1 Yw!TE f:Ͼ5 {/$t !pi4IU9u# a0LvBЯrC7d:g{Hڀ|;"v{/]?L[kiTsܵS~N@<? kנT}Dv q䁹 n(0GOĮ:| "fϺX!urayOW}<9 \pas&MƊ?(c`? -/GV8lF2܊CBV Iqp\DjuJQ>Ri{C? ޼٧Ş Ѻqi2mO )s(X1o@+=YHނsuա2]G֮<ƪU75=8\Fl8Xii}o,pyI;Uq7ZR0M~;AA•~r3S-+%ϰwPA G*!d_E7E7 px]8C>| BCtP}vfT~F(JULjֻWMSѰ w>b%M,U ?9:U9VL'883Ehϩt(+C%u6aO;>kAp6LC ^KWGʫr[P.XR iG$Om¥8)ܕeJ򹸕y-r8$rkBl(ϕO^FaFrI5lI_qEс<߸O 5|fAgAGcE#M 6ַTGA|x%vѦyykVA?t1ޑV'@>a{"$!/(4Ӑ˥΂)6buw%G@~6u=͙*RF= 8E%ЙKJeS3LQ+%kvd>5Lf>`ퟚ}p햄hy )+v8 )lN[`Nq#!y3YC Q4d^VֻG:ظ9 +]ޔ3vמKpRMdg&.gEɌ9j|K cB^~lP0x{s|pZ8a NOb)NM׊zR+*g HZb2=z<9)"K4׸);*hЬE (Gy3Yz3 33#+nP(-mV^LZ8ҾV6z$dώ9b[tBKHTͥB֞"'H`yK.Y#gG#d;&;JeC}{#<h.uT !_]dt%}>kXrƄD @<%l / $=sm51*D`''ԕ _yYJEUdZ$c)X,)7h+aK|!"Fz&+md(ZDp M:.jz*=;+iwoӒCdP?\9uxgߑz>R/Qiá %C-FJ .k"*P=/rF`'c("] !+j_gl{G84JܕUJRde)S-p7тz36Gp,K=?`>j~] &'I6n@slPQK\Ô#o“?Fiґw<drjAZfW>23Weu6yKiJq`2ʩQdgIr=9xػY>622;q)pfgL|Gȍ<_=]]>f?Ynrn$OsS촑K,qfm ".|͕$Nt>_],^F4{ajwI]b0͜d;)fn tI 57}5K$d\9Yy+ݣ-| ے@:\;Ts6w: ̢ͽ’(xEYDO *ZLwvs. funšÀJ51VCNǔ>fU#(CML>рÊڇ̅~L9s+؁1UőtI'@~UV+*|5>[oZX) lUS-[kC#_Fs8=.>^-F|*.9Ƴ˧yiE!QY ɳv 3(ƠUA\wt,$%?B g`n58q ;a@,Ν#]Š{O=6L*0MJWDz] T^xQ6fGr8n-ޛb䡞ijў碓`@ p|wt rTυ;'"j cxLhuo [|ۖV\oUfv8` 9T~1 J B ʋ&?"}#DqW)TԠ!~ox⿐p$;hboM3kG_NRGۙx&VZNMc|?gVєjT@@BhUI"g{jiJef;nktWΦ[g6qJ>H1*](Qz|P!idH\|dl,}fs)JvtH+aeڕ# ġ>\eї }T [W9S8jI\K~>>]WiCIN 7C1K?"{rCJS-Q։[<^AqIU>%{+xȥ@.!bvc%xO&,~W/'0׋]].V͟=mACn~$^6`rm!l,jEx! $ E! ?CYMZp|j!lKb<,J7\&XfBޭ )nSLPkݫ}ߊv~q< iDW[SjUSۭ0R*On)J Wș|̀>#yxﵜۄn>Xm!^pc)'m$ }X s˵~,w1ÍZ^g 4+7ewֿׅ"tЩ !^.8wRGۉϑC2 33r>1K 45kc== W;'K _t싢xԥx9=a?Tl&/'LU~YkC6+~{3i'~%| Ad+2>OB賡\g|ї1,!nD)Q\~T}k6!H) J*T#^\ŶxA#ǑIogby-(IZԮpPNh)dR]#psI;e)(.=iA-wz.:ghoT0e"]οKxPH@[Zf;wп?<10/d,DKH쓼7h(daj$)xtYgFT^ݳ^^ ~wJױ|GqEHYzDމ5U߱{ح>n6!3/!sKRx\@`a=m8_6Y~0 Oɀ_N˜v~Ȍ)@)9WWs?D="MK*`n&H}rQ$4 MB@O>nxIM;]wѱs1څւړ71zÑ%y<G ѨZoȼ 짅1NNLXm3+~bS`X;YG ,bQOx?WhV di/ AθhmdaT1DWox%&Q[F-bOYe@ZEyL.MYpƳ~Ղp?ؓf=ߞ % ljPh>VlB EQS$&{JZBNh B/DmrʞTVz pH!%I40Yѩj}Ws}^׈w.$TF,ȕ7{ q*QXѮŃ{M?%==M, oneM ^4&M'>ؙwݺXm.gzFHڇ]y΂70G5╳͖ m5IkF 3ptue6I`͉Ǽ7׻Az;'2I;}#zуpB ..ǹVFXm |bS˴טDRvlUKEAR,hYޞ?{5 nvl>r.Y4wFhcZ',$Q Ie}ZPrsAcV0g WS?{D=n0EtLJ"Φj%)|@`\T~p0ijV`zp`aj=!pGB<;Cr\?\]P.|E>خ"!Fk0?5lۍi4qQov 6 ?j6*ӄHlblo"a Bc ɺ*a$gE<n/ogn0y-01eb}5 hq')ŠMJLIГX)*7Iz26sg5INm:-&^&gپ[6FN\/={ECk&=)GeLǼR>D_N.2e_ṾO<#Nlbubd\w-ؑr{[Y%69?!o1"/Vo,ᒧer Mw]1q1cIF?s$DAu˚-ʯ?:I@h&gw S墮x /SR|3ďuaA[ @g+)V}aRA'Zގ`iɣ5-ԐƦmjF-E;=tb)$b Mq^ߖT|)*5 DwK"ϓ8O ,ckYp,]7BkfNf;,TJO* G|&ߴg3B6j-U[VaL0{׺~^gÑO&]$_]}9[y N)pyxylcYV㬾FՅ`@!L=+- / 5)?cI7Wv-V18, xjn jsz gl: -hC2Cs"c!U/4M<ׄ#Z’u.`M|0t=ڡkL1yB)Y ?',̈a z#sJY1KmgDΟ~995n!@س,gyLu);IFq+jmj!y6瀜_:@ b d?1,w`<2#-R\wZ3$rmU//2t{j1D*v| 'kŎYU])E8ཬ\_}$ԎuMK S"VBA_hUnERs:vy_p5׺g3 g!#ӔEg\"Z<)vDExڵq`dfX2< he02F/wKpLu(}p%=: <[ujVyWb=7PЮѥ*Yޅ_X6уwa{s ]fǿG~vU^iFn,ͣz5AQ ]=BL{LyJ{S϶В-i8 QRXiv ˺ Tnq v?ſ_p0C;#P$Qg99%5mcWD,cXpg&l!;WT{rJ» "#3mLq@^ cWfi:: oNVqw[6y:!#ZDdak7Fe;"$2J0 Dk!h%w{O1v%rnX6lDl6/*_֣Sgo#UY[̒e'rG LD'=q# R\p0WZ$"-baIzUpڔA'С:Rb(_KԪD ;UXjօ0{v D`g!;<nte٥郛;&$O/O!h-GvZT (.}V|R L=V{iѷ|DHQpm;V^.5bVp!'ZX6w2k KNF/u}c[b5~ |rPxˆ,xbͷ[ o!w'2`6^,C{Pƣ 2f_BAڿ~=XǮWZpJ@bZzMLf7,hry? ɰ۵Ň2Q Ov  Pr]5!)]c|EͬLߌ'w-A+>a:hTܨGc>2~yueq<[ 3q|a1$ݴkK-[W!kݞXz .m6j cDy3릖#=:2>{d=,ӷFs>`40ij!'W}s3ݯWh 'x b̫$sy HV}fw* ^<g.MW'N*ǖ=d=AxWJNdɉY[~{YP񾌓j>Ѕ^jw_W]gLT| Hɏ`ܵ-ьg XJk.a>yFj4Js32Fqx$%%5wN=-D7 7 p e콊ڀU=7'. <Kqg&yMA˳NZAv[o&hygr4VfdAcQO jI>k"3}[)]ѓyf!pJ@pL(cagjd:RLXfjed (Eeϗj5[D:"--:0\r'ӧ,-ǷIǛW[ Kf@ SI:, ;W|-fW*X$)f;f9[ӝF>,KsI da),_\'b.ˡ:+j-Xlh'P)iSH;RlUq VxAgC=="]/eؓ-5Sf*56˿Sӝ&eQҤt#W KZԲ _ZsQѣ"tv5:FɆ/Ut !vswkV')Zܿ+@t@Z5L_XZr܌(^o\_O,='nϯQn{GJ[=OÖZ/%"柠P+;O ض!L xG) ذ㘦qyX}eήO]l\LO|Xhdp%,)y[a-yWlyw[Ʊq_f!}86%!wҲuo˜4_ìQy~2+;HS}N]QMHTIJh&u_g2KNHM3Zyxȅ,q!m-hhpU*", |j` ׆n+Jf(Ӹ.6޷P=F{@u&-2!-ޮ+oD˵RQ+i#YzQѝar|y`֞ زlrOf,V7}3Kh&$ɱex%r`Kz'E^Y < +A:y>YZ'^RtqNh$!Wae䶺$FP#^Buq[D<;s+\!nM+3p`;Vv.ŽdR<32=vުŗ_b=qkËG&<UzA , %ۈs%[C6nL\L|i^|dBx;WwL[uTGJLm%?~p}vЀ Re^°.,۽U̺O2wHtr|l8b1}r;MB!AmӤi+cˑ;%ֱ!c&m?7qx  `s_s1iM8k Pd+m#?&H\s5.b ¯lgYf.9FOK*ت>8ZB@)nBV4 !=_ȯN&W ,-,/7"FNs޳doYRF ,kp~ǜvMb,r-Ҏ~:Hٴ9DoJ4zC$?HHl [$HҶŴ0ZlzU Kp\%BXGZ~,nڿ/*h5G,7'JL-Y% I'ڣ5>XXє OיKI\n<XbTx餃~>GaCeUۼ2Og ~oh]o٦4¯Z ź,RO' ,^&guL3L) YR PTO&Wp a?sKAOC^C%Z&Ô}Bz_)^Tj)B ՞5y%4u(F_H{=u},I3xPy|'ID&@˃{A nE|SZ,:qGûPc(οOHq+YkdGiG?@7&1c2ȐȌV5Q& O}e=~J_W+VINnh( #LոNr<@-h"<69hDӗ-fb'gUw[,# ,O~;1GݮF7f#K^1&-]-UWhTz'r9T>8*LY9и<1MN2/ʖF%CMFѺ0N^{}n/گi CM#QH_fq$AVܸPK, HaC0M-CMЦzνD+)w3:T~Kj1Hɻ7O$ݲfXY&? IOp.!#- _yXձ4>ڬ绂aw9.` {"-`4\RN/O^Ӟ],&|q?I` ?eR5!5\&q?˔›MٿfX,:$\Z#.ѐʰ @X V!Eu }c3 2RuwVX] endstream endobj 88 0 obj << /Length1 1860 /Length2 20521 /Length3 0 /Length 21742 /Filter /FlateDecode >> stream xڴeT\5 N%C  %}7jTZ>ZDYA( WPu7q`aePZۙX((\&n֎&n@^@3Ӄ t|@m`ji:XZ;i>C]-`c`o(#@``eT`(:z~*ԎShIT4h?;9915u )zIPStoIPT7\AB]D]GY=X@We'2}Z8S@mhbd>u+kW-C'nV%{*yk3+o㿌T~}'ns 2V&++M܀&fn&nto9տb..k(7tQ;ӷ33qpw_6stpvusWF 3vG (#) x 80y7[s\.` U95wt->[?$Mhbom]E -ج]%nfV_z7q~?*#eٻ0pq-lvLO"'t߶O 0qq1cV/gcig`@L UHl&x>m�#s`a0[d09:3L.KL?"g17+9>y:OxYYL>.)]U]S_kYem\L\?{SoſE:z2d`&< w1QDVsoL?cڛb&h(\ s!l%0!X6JsDR\"`,zi$hvQB߼ ߹SS<2f+)b-payll랇E#w k Sd~ .s .8_ePWB[8aq\飣Bшp4 ~wFuJ#b*{έsCo3 [H+fw>%Ca]"{{caYnScrzpf"@<fUiL"GP F}RT>>KPijr%aF =co+tr.6Zn '%7 %U*'sW"t139qY<"̲dj^kּC[¾,e׍p j n,嬠/(/TK ;Y?S|8QMGϑ^ NMPv58-RK\y]& x EtP_s|B@z.hI/qR9kKrL|yj'WSɤp]|2a)4Nubbk4>8k qAnv1`xdRJHx,k QV*]ԏIgD#5ĸjkg褅A7 5ڌC/s?H*IVUx$eCˇ7iհؿ+[-m(ܡ NAFc/ٝ!*c/Od~n 9ɺv7 J Wպ4א96svC]W"b@95gv$ˢ2יd T|BsC[G7Sen019Ư`!V :X Ũ oI3`aLV6]P9R345YB3,9H$GGlh^#gqfD.i+fi~ENf 3ry_P *Eb*YZ0Ynb05y5٘ѡ*\< ay=(޷+AMm%d[1cz񈭼~~a9)?"dZ(2-8rl &K{TdpH7= 7AjҞ\l`):<ڎ|ZO'<%gN=1exP!dB¢(=U @MElw~0Qsֈ˅O>挽ż(t*; /};z p ~ӥj:mm읒\N5*:@׀lNӟ1>%4qi[6:(bpOL-*ө2|,*Xڗ:!{aJ:984ST1D ],X!xSy ى|(R3)O+ 6pu+B$`@mBAiUSDƚm6߱;ۻݲ#ɛ""&Wui,K} Nn{`x+U.eb['H5W(9Kx%)"qqZe m/ 1)@:_XO]5A6( ڢ_;8poɹ&U`!ql(Wu0p(e!ԇGyK!@Q$%lkdZBNd_@L:D|PHp1'`{9XnP0DwW pI?s'nAsjy'Ŗ&lI@RÚeJW;E^#s("QbM.OoGFxaHl@6`&Ft^uXkYSPT\iwU^#xFsb{l bA$K;Za`Gb7#aK@e@\GPMcEoɢ5MJ[ W4@j Nufsj6|tԤ {@w!epR(6}%kKG\2ꔏ4-'V }$l-lY -1+vF^eh$jM|KJ+ (|V֤o8L[^O3Q&,k.zQO^( xo\I۬+ ZNv/:`NU~d\Q@OE 2Ly4vPVEّ=cg{g o(ɧ?; Q͡4_GBY ,LU#wK@s^޶UC:LT2/[|<#cY#t$h]ӹ R\0De®la]޶IvֵkWF ,BúAVL`h뗏92(%*{6L칍'/7)Wf@4?>d(&ƍQ_$&%<4xۺĭ cL ;Jj ST؈JCU|P5iv@YP`8?6ٷSzh|D۵EM d`qRkc_565]lY"H]z1;.N APrsץL`RA]q\F2vl!eL?Q_!~-cҍgq m3l QƵɬ Lbՙi٪br M#3xZpUĶB+Q$R;/d6_HkG7]m"]3I|X68}soǓ_.YHա}ttyQ>pƈ6 /d&}$E' VfӴPέd+I'9dX;2EYC%̌Jby0/'\:bvH0i#R ҇O1Qzq|RBF5pO#s ~ i(|/\a ߴ#Fu(0){KgjURݝ'YPoinXY+ ws [Z8aPx kd߀s{#/MHݞXu?|o:VҶhkH"Q$ ޼*"pQiuE2fUozΙ+FQPU*V,:@LvtL_`Ώpń #`"/ĢPKF.On?z*fF6=hc}*QVNl5BuUV@4oD$B&Oi`ٖxɢf^̇gtiTgCTNԢpimӖr*ER9ZB`VqO[KQKbmE`^ƌu3`R`gY,j%v:HSiH:=O3#X>"âҺaAhٛg E'N+NW{#DaEK1^ S9ukW3tkHq|D !v:a.h81]ChzV}ڽ2XR@y“UhUqea'*Lōx]BU-{ѓ6N^O{g=>tճI-`,7x;٢ܟ'yO&\qsYҊ1,ߩ{<<^"ڵoY}mre>N5ꘆfKWVr+p&!FZKU+@`)Yvv͠Ih܊ *zI:gĄ| y([M*Iz6\/o +c{~qfT7NTer)Wmiú?6ֲhvY#x|fNTd O jaǻf)3b:] vaLpwrnnKXx62!*${ڡ(Zl{D?x$ҹGpkxck;Zp&f4ZS~QZo:Oʦms_An@\'6mkɊ%5>ŠynX"?y-Y†h$ws8}#FjXaULG v>Ұ%4$laTzHQO`o_{=4pF|GPw X >~X~㹘c2QC/KLD%mC"ѝIiB1*˾Mi7NP.KWL&xذ3&dRF+&bHx.̴M3D2y.R)I &V&eso^⦉o('Pä:48 2Ǫ\S7%1k#)_c|NVfT#ҁVh{K) G@'Cun$C^plq[v`xA]Վv<`STC!EdNFk ͂f9* JID($P~\xU1ۂIEIQ?^[B}3 j:m.TSz)z5FTOG:hZY;(Mq *o(nw!进lHVO#H+YLWTܯ[H;q!*v8[Ҕa@00](Nk7>ہtPi~5@mGSBZa[F9s]>eFFVÝL;̲eK&ˢg% PÇe=L1HĨ-|Dg}a s҇F; p{,vE. '*pI-hUʞ^wC]ÎѴ8J 0Z:la׌Aj 6UyF.WUl̮c91=9ԉW! Mmgq^.v3 OAήߖCȹ"]k *,otXs*,Qfj9q4qMCdQ~ 訾{>ABfRT㄄Eꥏ@SvT& D~$sv܂9&ፍWh9}r&PxciZߵ!byի=#R[zW8\KaK BcV~Si з CvŐhYujg". _/Jv5#$U:{ƟDͅuNNB掛#b}bϞdW={#I+o*~Kmq1/}f+W9O\!Լ"ܽkr iSnwSxe6A@;*AQgOTi /FESX)oRusd*s SFG5|QOFtįG>l'bGRY3vMÒ~H(i&'pƌ.ψtU&=(Io~hjxNMD-U58 *;ʀK66TP(/cП9'#^IQyZxq8~$ݹeI{Iݩ.cM\G|ov(NxcP/.0O :] 2\zdZN#x4;"ڰd;׸[P{y`K=;ZGL1ta)XO 0oβݗ"x=)іZ6t/2 i!U1ݬ)Ǝۅt~ca D5!:pTvR6T=ZUFkVOQv_U`-;|Dg7ޠe4ݹ)-2}Կ!|H*4U}攔WR fa*zP'I`]x\3<$q^QJ."uUہ0w E0P>d7K(jV^f'j0Z%c PobQ-Juyh6nҤ  K}O)TG< gRX+R=O#,bQax (;Micdd젅^:>;w#eb+$I'd{ٽdATWx[ī]秌*P `Gr_ +BIv h tnjWawg0T+O5dw%\| K[h2EyXl#e׈x:O\gi]wJ5Io/ё=ʌ, ~kQ~9q c}?jT-hө<,%Y2=Y}W>0owoS=BC^Nr!Nծ$$U8 QH-1Z}'5 a_\W$.xW9S= |Ou3ܷqg&œ롑@奓Xa{8 FT.M.Xar<㋼Jb_,h DC+Bx%ăx]Ce5.{([4XA<)1T=zRYMd~SמQaA.#q﮳P 5!87 e7 w^za qDx-iKnDMgTtiЖ!+ 4?|8ms1(cLᩝ@&Ĝt "相u ymA\~d GT*G:7_ ʎEQosT, 6t:-X@3}e!y6MbThH#/7C*-yz:>ྻ|R X9זZ7)Kχ/ZfB8~2+ĝ*̒Eۗ$1bxLWS㫙s:l:C ́%!;r?WELj8BCor,^7B+mJJ˷%~2ZtOmesl!fW Ͳ2=oj@}'wdDhb#("nQWq7Ύdc,J^IAX,8 ¯wP6<>NEGBE[|bSͺ]'IINB2T/Xz' ,*(5covx+IkM;YozKb}9gPlE6F<^Hn -`a W%irsܲW7o!́ dwCo!AoUyHX 9eCmeJ)J>,H0XNWbF)'E$ ʝ:Uw5!|ziϡ^o hUoO[}s)i{Qvٌwaz#q**WdŧhQMSg"w-ZΡ_B`Œi`,_ě{Pm@#fɖdΔ4VlBx_XAO^`5'VP~˃zBGme%WMCש՛m85ʈ?b "Qڌ 2 p[rCp1M+}#b!?h[t.A[M!H_H] Ԯ&^1yc[h B#ߛNn:l\H*FX^6F:by#a h QхASrP-<羸s30#$ӗ6e<+u;R.7zKFDTp|3+x.iSH%D pY+,ZLt$B^ppW{MF7X~oYvxO Ikӂpvk_sor)3{(&!k$f4~QG=GW8gdFɆ .('zɌ-=¹* 识0U>{]ނk 2˖z.4e<cYYp0 hA^Qw~|%8Vڍ~?XM&hR.w%Ki(IACJJл6zN".2rZnC g8=ivnۿ[^ԅQ h]O َش|B^.̭&Ce] G9 1xdΉ{^U\0~8N8TR5f )I*WNVh)/I,4iT%  e6te :J扤]4݌}1]Ù_DT}܄z(]ki1fhkE[v êM=wpQ__Ep^_оU} "i4а|S \&2#x9*gt%]2Z5r$K9%4͔=?ceO(yP׺Мс/X_e'o]ѦDw;{珍p*8D=Kx;YF)jR1bZ>K% oJ0XyNp!2FUr:;s.2g۠i)4sW(͛~|+(yƋ)[#/s3rXFLƾ3udL5lŝpy>{ 1r U"lvX\:~a wa8[9 /rӍ(Z0b͞/:AH%U\!'X-ݨs!"(P4L,qhk6";dV+?x@nw[a64jR$+/1b7Z[kòPb^K\++C.\z׵b <1ʲfkBg 쪶R["CG](,.`7g'~HQ,tXq.v2RJpsYp(YC܅p/-$f1аtz + 8T[Ɵ{x\bؼObn?|!_$񑂺z;ym Qv L^C}GUN_)?qΥ0eT3>sG}膡t%gTkԌiBZ 3GXTY5N.oզ=ԁ-!ՔtkgUB7'ӹuTIXduǦ)PEq}M|s#8(Křz{W ZBf҆vah>,3K u;jU|kS*_fK0edw nJCBy|z '5ۜNhH% (m&jz |oʾtX_]O!Iۘ"abt@toiҺplg*Q^wlo0(QRք

ra+0͈AgNjN$45 qٲ << 3H%vk 6cb:SBb Q¿(64ewxDxaD-_2v%y Ӥt4`#6uu.Yt/N4P*Zxp~1GIڪINB`ְ{FflTT;oPڡ asaSBM#|9 חJ6b!߈]D@\-NFd97{ZX.s\XYwϥ+"AvM_ ;s 9zDz41pнj!WU[M>$Yc=H^}3YI_ȚvT,-$4P-duAz)]|@TẇԷR#?oghZ"B<: 8ϘxƒEu-~H˗U&){u=Dku%j:V2=y'߭H4 nR/_*rp1 xV-\40UMBM0 O~\x>t\I9A OL uH[Lʂ]mxӝaOvaq?'R.-(i,+9nx2~iL⑍H 80c/ ]}ZLm8誯'" 0#oq3SK)7>trlȌ), c'H+QP16eSfYS .ƒW[fX?3WȐ?g t1&|Nǔ/@\lH j)*#[}4&_vế=;~SЛETJ=yaN^#dA$aWȕbχϟbB댓a~PU.|u f%$T5hC^ATP*y{Zl()X{GJkM :5 98qi- b';jP8N,V{pܾ/DŌ> BW%x:Uy"^@L m94 {ӳ]P<3VkLeT\\1 .jUPI%+5aMzi٣ih5iYa[?{3?wx2 oRptE?)+(6]Y~Zwi]=S}/He#q (CHtvo \ȉ--W4S c6aK ,(5%$<7E>!ʯ~0HcGrrWXZU QA> ?nFx!YUc֍cC 1Sf+S}%d?x$aP@+޳j4jP7,X!q!<=Ŀluֱ$;z~o$m "JpEd3J7 MA`p߹;a 0̡NE|0פ^ ZUJe҉rj"mtح]D)bprpW6žM>7N`-qEĬ@2Wev3#B G MO;Og7!TO[מR)$%S?&G2fFXA4 CC7 !!`v 3=,T咒u_*SyMd^oMDSA~,-pG 6mNKrm|)w)qtXο~;K>ooRl?$~mޕ  Iht{_8Av+9i3P0?=r,v#+qv߭Nqu85vOm+8<0Ư") Ks0Z:rm> stream xڴzeX]6R+E;$[q(w+^(nš9Μ]'{I+*jfPPTYU66&dJJq0v,ʦN,,Ȕi 4Nv@V_@hb-@` 8da';#HŘrƦWGklcRd(A\_  0Zۘ u@CMRU FX?kH3$D%O i 5?@k %WW?*`Ah#7JbɎՕщ `dgW~ G+zu*3최N+)$NrMNb_ ** [c 6:;9;>fHwvpáO3u1l<]snjΎͿ/v9:9#"`ϞEd$^̨y/?D%<,V^NkJ!Y;")NNw`+(A`3?7sc읁c*B`@7SK?1k!= vscG7zAt4vޞW;BfL^[u\. 6x!~䟪iFuN `wY 4&?mlm4ihl qw0ɖF `kl: hr2Gi!u2~Q u[i)}=@/#'^ ttp Z0+kK(߶Nl 1-l\ccwd^`x6f03!N.;g'o9φrqEBf!^"NWy]?%,,fAV3ol7||n7Jm/J7^W" ooo /o5_wCωרk{ 99@ ׏(;9tY^U;#׈[L ZfF6.+;;ϟrz?NͿfY h1Jn .VGt\+%f)[!DPs_:UDAO'3H2y5rȶ[IѱOLʾeis̤Ŷ4y;"&_0'镵¹α6c;`} $;:¸Wtn(/wLޮ CӻI9e yZK}sE*|_TJS7ٮq>ؚ%c$d-JXh%)=KP1O>]ZF]F~SQЪ<oC|G=2MQ6NI"Ps&M lk# &0'F%W u]S,˦k@ER.V]ocrʧm`+jJX&9X}҃&_3Ӂc+ͧm$܀7Y$&-oPz6 'mץWHc'2-w#i9}4p6Tԥ/0c4|yk2d 0GNn&RCIe/3qXi&=$ق^W iC?a*,ɩ4 _| NXX`ԹN[6_6.RY~r(-[dޡJ$Mqp2MD޴"tKVz)ddz[, ?̄an&x` v[pq}߲uƕP p:~Xx6x䵗6K-vn"s^ ˄&"ZDܟ׸ڗ٭}uR@ѩ=Ȉ06:6JY0c4[*l#fn~Ƶ̓)}b +ĠB1bkWBCLJ0}A񕰿ۊ%Fkr\&-JK2XjZּpvaGSz9>NI7 jn\V5CFsg K%k6GF3WЍ3jL>i1EQpH±FibtH5PJ󳺯q̠4P0v@X[K+CPdGkJe4ɣnȽiڄ}E7ANKzB0tV/քXQX'JY"6j$5/btP]epб\"NM], '~%yZ<8"9_ʇAKhCyp6ɟnผX=yO%&J}/Fw~rh]VWk^>2 qäRFEF/)0F!&l(H$0khEZ{&܎~V=tzFG0H䃳~hW<ۓxobE_T3#WCU{sȯv1.>X6A5c-q2HGsZNAnuHy:yJR՛|/m@-]BB7W:hGi۳xN@7uJYY RFM݁I*jEn oxh[9r2c߰VN͓6QY2gw~Ka H3V~+m嚓LxƬ˵Z*6m8ScT&i)=z2&CŢx%?_G އ_nkzo N@<#:6 lt׬_j?ypmvPbHǖ-=@0㑠 FIb Q}z6C!ʊУ܅Z& Yɦlo%Zͦ.oq$±1< PR6)4]$T N1'"5O˲7# bĽSC3";E[:GghĤH/ 6F|hsSWԚ5Ge#MV;,On-GΊ_ꂧǞYX:;C'I[ lЭ p3:x^/qd4/*9r8h MH\=]E6KG_D␂ dQhUnz8|  /Z䑦d&`:Nۍ#]CAG'&G[@ݝݸ|h-̑2|ič v7,MG6WΪ[UP;iYI-q3SO}137c%TȖąY ,U \BzH#_mbօETb,g3Q]jqxU ańB,z'?p=-jH_b-y;TO+eG2gqAlfaCRzɸDAdCwRͤMێ8 oU0@t? JW8H,?`;zNZJ%J}BJ'?zrE2Eŭ{_L'7~O:IW0S&j$;w7=]s}'yfpZVA%")Iͅ|;-߅+>'{\ZgqEt'=6Aį w=/|P[EL ׾j@@ۯ0p9v=-nJТ (}IAܫmКn Ǖ%NAHcU1,V@CNfwpQPPi`#6^i7ř=ߢ%5Sj]KFt'JͭD"< ͢"-ʽixA=+L#-GV)$* lrBjPDЋ0Kteu=EX52kR(^x5EL0oZّ|2>4Ud=O%[K]e ]Ķ\!MNpE%/2Xt7q@{#=hԻf{Hͣ1_(9(Qhǽ-dE(CJ}c@sϼUENaM=ʛSA#CQǺò8Gg? {˒[,

ve*Z-%X迏0\錧5Mj`ӹFJw,et c-i^!7]Yƥg/Oj_Ϝje:2}K['6OywfݳZڟozGDOTĘn2k[)iz &ՠy2rn}Sy`E6D?`??5^][$ Fټ|~ER55( P~jI޸M~ 㭥T?dZ< WuĦu QؽnJ{ _,Ly{aR!Q+wGqͼ:j"M?Oa>Gėj=dtDD4MN(-#tʆ`SYy]L>n${Z5t;:r=\ٓ8jŗ3SRe2U=D1Y7S{7LW6tfp-P >y`q936UMTs7Nzzm>oٞk-TGh0ڛ-> +E.0LnDdI_w䏖Woڸ[(sܥ!<:P3?Ϯo_.a9m(L԰[*,\"ħ$)0>{ ^ Ͳ%5H4:е7QTdgW{$w<;R$:w.hd 挐gc*54/>WbN|sIv4MRĥ]_g+ Gj:LE2߽gG%vFoE8rmVW:JE*F1^6ꗸa4ᶞD F d Hm=v۝J7`1lvW+WwdjP@4h0cZ+63(,'cOwɠRb\5 3z@CV5}Hnfw9ޚ\o%ʻ q(PՄxgckrm`n=.gP>#F {?wp-}'*q1yHPƮ ٯӠy|gGO3rѾ_"8iǫͲAy΂)yUI`>ȇr#k}cqE+p =h h8@X2j)үJ/flx>z cZdP`JԻ`IA88;XS@)ᠦOёԓ;8S22.L*[HnjJZ_fmn!A]ő $k}h'ŋQ#kub Ձ8|KClg#ЪuDR {Yt\RK ޼D7$=J&v=v}\["A&K L p9jY-ژ$ZT`y * UVZxeԊw" !*YvejKlCVC{MIh Ss}9 D|VG v%t|B$,骚V$#?AUFv]e~ Egh^9+]`OA~}hJV͜"sWxI0`t%Mg~O#H O3W0f߸ t7r3<$g3ۉe}ϵnFWپ'Oz]XNճplRom*ό\~=321{ϯˎ_Yw~695`iQ@$i$BǘBsS\N*HA#%o:(;x^blkqLT|=-}ivɎ*T%'jq$[at/Ynf%qdzЧX6>>T^2/QO]G<~?vLzP]8XvESڮ1uZ2 dYo<~$hE@b}G JZ;[Cf(ǒD&~- AS9'U2ޟވ:7b;#+{(T,\Fѯ>a>&Ș[6=:`~n")@a#=~(gNEM6|,N#_4L8l7*z5>0PmD?k>+zʝ ?:bk,(0njT' sFV'g֐+\(-NG:8y^|cJ?ĭ";z|sH{Q%go|MNg qX M׾$ݗ`EO u~(ejθEUdq%NQ*Z0 8 ,o>T!ۛJ)OY-Opv`G6aa Ϛ}=e Km$>՟>^3,x'"^-53#˜_dXG6|qB8(&J$KWe-ND~HOwEu?uv PL N0 Us)$>S j#5Lq_[!.-)re4"SB#F#8);K V4- Ya>;{V@ѭHA}1Ih1n媈{IBr9`[X1@0Dw+zM*W7΋GLo1xm8ܵ[6"n6, q+?y30Dﭓ|P8[AX?t^Z۳^C#g{^GCcA(h>_b%bۊZ!QtJz&lIWSIS4eFL~@C6lS޹r7CKd0게SmmOQ]fBfDPv+ieK)_$i(._0)-/ u1D6P’h 6%X1cJJEXIP-G/^,ıѐ " .ԏTraZ&CYJ*kU 0X7|ywyez.? W$TGUp堇8plHΠ]|fZkR>-Z+e 1$B{ ./.bH5T&u) DMgAb!ZGBT>DDvh9;e.)=YKqHQY\U5^ƾѧ*:ǵ~@1MEF7 :57X1knBz[{(|zAtBΚ&:oʧBJPf]gQETte81R|?ˉJCK?O` ,m#Yda\ij e`. 0lv7Xzs:4(~TT{jh*B;8Fɼ\e~vTw &Z&ZQSB)!Gcm >`X`?2}AAx_h ՝ڛGR_ tq3*XZ.x KdҲsjxW|Ъ'$v EAH%nR&6<>&;d"d]N9ᢦ43Q*۞_k5$a0B ZsX Vޣx.Xg?ȔP`)#tvb$c@>X6]#+ȩAߴX)%} ;.|<}(a6=d J"Ŭmހu<+>ŕfK7İ7^K!yiZ:Yī,ڴ6.4{^)/!O}IVFcki>TK9;2&w)k7FO2n<<157~Y(;pX4Y3?=; E Zd,|/i FEYhÂ[Da j:soKnlv%e_t`.!,^(o< | W0I A}Rp7'.Qp\!M]- lsj<\`EMOKC,O 2ՖML3}{ėu9K}&s1l.YU[ P9#puP~cسEP8 sz{=25v\Mm@rP@:r;F [óvl[A5F D)[N=3tiIj6&0=#7E(^߯ˤY-3#$L˒P|Duje?q!8;S 9L(Plre1WtSZ'lWwMQ}`dFW>~=_JvԖ*HV%0Əm.E~Y8TqUs˺uE:6Ho"?j6aE'-yoW3?)\ŕ27iq\o|3I-89X1YSff,iihK+ h)*%d7 aٰw袸MnW;6[(@)o'Mȡ8e⋣|I&1T='\Ff-alR4!hNd/_ v3N9'UMي =֟P άh5*,g轠gqZbtV[}xLi Qy˝2EXH KA gesWeF'&w{OD!Ow;k4C`2U / *DŽocw_>G#:Y>z,nNpT%ڒk{?AwrEhzȺdt[5.X{[m!dTNd{ [PC ܜԹ'_5FhQrտZVYu2)|&mp. -9A"z+l9wfO-"L5w_3ɳ5Hk&)lݼ}A7IZ=:š8MĤwMZM} Z-iBDC >~z.aalzhl؁JT_eaPlqצw}"y&+^cw+26 7μM)@CBm7C|OENIDY3=fG$vY-~DžYf`{jlde(QQX8VE3ղ&7DT/Kd,U1qu1k*v!3Z7jeaKŕWHmloA)>A;3}wRRN(1]"~3n輡@=ҥLIS{%F7#7W`G'*2h W&OM'gkQnEtpwgV3bHIv?;kղ8-STup{"TMe6gM|cgv ߪ-šp.ӳKGnLepkE_[L'5rޒwuj'[0䦱_ ID{7!N懇ᕃs!#R Ywb_[/eh|vPNyIDѭ>]\*\7,V$0yN] ii ~02.-4t?S%jL$5&B)mgՊQ$蒫vlݥKH5~>$_I%ّ}5"Ig|R&leď6A)KVF",KEei 43}?Yr]>D^xRr*/)a뙐ǮK({#D& vtkU^XCqqi)׻#8;LzAU?nZ3+ʤk縝VLr*ȽD,m(=Y卒VrR8s%s0D++.!~K&+V~ x. F7i\VR *BtVi$v:9[G씇{\ִ=Ş",:J-1Z5O裆K -mLUyN%; WznÁ7^.J?-׻MUvxSգXb7Q($(Fij%b-+ it5`&=ފ5PTk9.a1ВA?RZG}nUJmK9 bu5%nJ+|#ǯDiKš*z)ܬ6ؼuq!x^ eJIk=FP6]"-"^2ğ×}Lo~|1xYf&p sjO.?=72D}T96t!u S|шƇ;86$']Qeo٭ԊR}ly)1L@ͤFMbc! KQ_# =foON&t(~ )`(Q^x4@ Gߴ_=Q!©"MԼ?WŊ۸$:@p5:=t%10ZuW,ɛ#&3ȤUEOޝ޲R;ޝssG]}Xs }Ozt-wO&3E0}EyLMXfY;gKի .ݾz"[Ksˇe ;ܓ] Ԩc҅mM:FێCqbYVSze>GPHXa5 + ~PtOIrlaMYLfN嬇a _X'i?|B[FZܲj=\%K2A;☙JhAga*+= 4'o=W60RnbQT r:KVu'A2nge 뿏ߚ! _{l=H%Ai.4>ffq2Y~3W;ّ\|@y`QJHKv``*h}Ҋb_ ֞?q"y,8v[2iS4fz>CQ,RR'f$; ML&gLaN0,abQ(lbBJf ^tOjXg;Z3L\'k$W# "7&)T~}2c36\P?ŀ:SOyt\;MhH)(yXvm&ۑ:!#5:|Q1R0r\.~laT,Uu.b=6 ''Wٝllg˶mZmkv^Zu{?oy` Wx-MU1=ȃ y$S<j-h⡁-:x>.qrբYUT?VG-b&ͅ`T":%Kk{Cvqm cu3&wA"cݤ8̆c" _ZE}R>.ǪlG@"ڑ6ˍJ W KAwojX1Q͸M,5O{`x-4Bpe'D+&GnGOQt@C oƗ)3~ ) ?T}j5A #YT]nIR&)>?"4ї, wjY+q˟=KB;GYKѰ0$GHej%vNIdN Yl_K9eL?e8\?,׀H [U Le٧|j_ͧHt!v*ٝOOla.# >=W=kw2!ʌi|aHG^bwCSzt2V!&aF:H~Z8%΅,ɤ]0A_6y~!(R䈺C_53Dur& L~l[!k4䧱BϮoK ³V<ѦahCouiej)+V@}Ey&^mWw&= b~kF،̀N|1%k6tl?7,GմFbYMR_kip ahhXǒٌU{grJ  PϢ.^s]]]&l'NLO("$.L8 Aù2yR;1:Km>k J3+fOXmXE&Q)ŧfm,,4͘>QoXov}s>64^5ܣgȕ&)'y簰x.,3k+.Cג1`:uQz_vn*ᅌWԌWUNŔKZ:E$U'`T0Ip͆y0FFՍ9 Llfʗ_f=䬔Q B{cڎRȞ̪dO { CI*}9E[Zٱ?x{%+Tڑ|CvW.@ᚡ5 a7ЭFNHncd10:on#/^un~h`SVtN^$JI=BzovYdެiG1ɤV*yxq u QG-CT~B~LwpxXt.P ՘MuHFn " #UvU}> sDnsMFMf5p*Ի`5ǔu酂i15`BJ +RFϬ\F/ai#| DHjY_MDftAyj5r~L0gH=Z,dv#c懪_Y;d# H҅F%5%^vcU李)NLc*Oigy!U/̫@›)˽Ų`w"r\燄0S)y?y;Sj?[̅(A⯎1 =?n)ZNj!aIn_%ו]B RB1ĄjN]UB~_6 +gә<pTSbxxȒdqfs~/.lfADsILQ6ЭkZ{v"D`^\?TM@zNoؽMHjQJj{vx]@ifC{p:vfH6^!'19s$]7뭞FFt>4Q|;%jZ= A#t8adW*$#~aXֶ=Sii~bk@#ԵYM9y,k=?Y[LBL1אc"?YT:\SDjx877( ( コ .䔅ϒXq;hbRRT3>5K=g`,΃~0.rm._Ke w(T~ŭX;wZڙ10-i\:xQ653ew^1:D 4Lܯ#~MrV} ߦڙ6Dɰ ׬Ff vMݦϨKvZIn.wټ.&T ;HeZ[~'?z Mʣ; "0XWSat Iǻ@`mn/hAF=7- w9'29 g.ߪLw%!oɗE{k5Lҝ[B[lZ#и=}| 摹{k %Q ot,K*4O]+{D薲&-L,Ưo\T+Pwo[1O&?UHHԏT餢E g&/Z^7eizK.9l5:[:4"//PΨ>T_4g'ԌF )-ר1rc/BÙǀO;t_F 7 Č_\$69+$| R1dҼ2`bNRԻ\d)G=&LL~ nSߣaR` Sr!w t vkI,jS i%ux$_M.e}zZMTFm6u[bZ3SA#Ԇ57j KsA"GVwRnp$? ;B'T>Q"%lvqޏ:ru", 8?&\0˵d}l6- YDny>w6YڑJ<D74̡ ]ei%SϷ>hkkQsbCAu>œ`]{񿏵$DɷbN˙aɩ2.|.,Խ0Ng\6ʸޯV2d>5ֱDuۻaO F'|ʓ " pO&%EãX[3w؆,o% p}ֈ3V9uޫY'P_Y-m{tRƓ0:Dgyo&`wHq1Zxu#|ɉV.(6;znY-թjH` ܈jp%sLRζ> s҉e4mQ؆"!yV?,k>K˥ (B$WȔ xa췻5ٳ"#+b|7w:ΏRZIW8{@pL$>qbx}TdMa5KvO` ewH q1=r]D# p.R.Yfqحm2#Nޜؚ˵B#l*Cnۋ~-~tAr8qpiW1bq8pW0-R]82 "Dv15Mx" r v,p(/"FW:R}>:\PV44T'xϑ[ӸHe jYsy4΄KAh"VJU*E2*|(gڮx 3t9+)7_=;fSKU$ })y1N\&k=մNzˈ߳L2ӟ6t")Vxy=EѡLK+w[M;g'-< ;`׹"7s)8=H,*=!|jO) 0B(iߔA:fG2IU?L;ը58CFRL8p>Ⱥ8G9So5D$kK ?@OTD1fUFX{ ſ!u<*0f<{Y`5F?k U}"HOl)1:7Nmm 6WA-|nnk.U˨bABIYy\97Ӭ45&Z&yzBHl}&Ljx/`8Ul`"&;A1)qRC2뵇ɔ|Y'ZIpe_- 0]m-$G~3skHxx ,4zgUMYh1S^0 ĥC:^~TT_7iK:v$HIu?EWQD 5Hwi̭LG|2u HŒɖh>nsK"me?KjաVk%앜JDU$QI 﩯 o1a4޸+T8y`V ޕTeYV : 'Y.50ăS wC؇KDL Xڶ\m0Zx͋lʸ;d7j{;sUaI3i3=BkƑ1˅ތ3?-0{/Cac5z2-E~cGC8v`,_-ȓoL1;[ c!kHcm&hVɄT=يA?_6b2V>6l6IvД|-:\;qgj|˾"ƕk4K۪SzD0ܭHYw.Z1H*UaGzJ% $ICDz6?kRN:]菉]M2k`1GUODQOܳλjf= &)G7ɐZ!c]H+P7WL2xқ|tKyG.ϒ7lQyjQPCMyBQY˨_j}0!XKcc:Ok<4}GpVT)g{#6J Oh">doTNnYn n~ q>un ~恲~x&y\DUL}4`\Cl] |Z(^bX/Ȏ aL1!?̋ ?^kg4'7 [QNJ*cdwUϟy놨⃤Xx_9. ԑe cp$ Pd KɕQLQV%Q9`e/M0Zmfq JhdJ\M"`CK5p,D` 4P*[82t~|uGd,6[t p$;k`Pu  >&au[i\. r>*TFvc-qwq3Q ?K0aItY?/^$ sAY`ZXqMs10?` endstream endobj 92 0 obj << /Length1 2790 /Length2 29346 /Length3 0 /Length 30934 /Filter /FlateDecode >> stream xڴuTߺ=L)!tmR6!nxssw8s> Ez!S[c-ȉ +'g efW;[9X((DFN Q#' `NG01q#P$ i 0vT*# [[;wKs 5XW-62uuL r y[W@e -fU&@MELY B.lgg?\DTT$Bb:@BME@9@^;]NLUHUKQō 8* '';FFWWWsgG'[s;ZX:\m@k?8Lr:YUd-M G$q9mRv @0r'WVQQ`cd r@&@'#'gG?6_D~_ÿ/ua[t=\{nj@Ύi69Z::9"`fi Y K˂D/g VOzBQC*2vD-%X''[w3V [WYL~+olǨwJO4؄ft0vLo3o3XoO;[;# h898=v'B`Z8|X.2p f*5ڂ@3Fy['@Ps %8#Kk oT6Ftt*Z:XRNF[{Ii-}s98H+ V$"MF01%0rp0rG` ;;<Ҧ@u윝f7(/`8"Q0q2 f`XR.A¿AlF?]wW5 p?#n33k7v1hoNĿ&Fb&_ o͟LyZ?`?EholdW X6?)`f.u8/i5XZ w; /f//;?~l6 38O+vp-lc23X?5mbf/4Ʋ1? :;ퟍb fg"?$ ;ۂ_"lKufJT`.wt+L-v0[' _ ^_ `'?&K X:?\/,AdW:^yܘ܉iVqrjX? 327& şGlaa[7Oz6T`8Y(H5G?"_ MlMx?4Mf8.הYLh" 5SJ$ 5)1_֚+ƯM||ń~|UgPO[-m'>U6BPq$2vL[ڲƵ`5*wNc"i s~H@զMU/0N#,։Ät J0]f8YJXOTLhxB-Y!@D ]I#+V hzTI҆vd,`yZ)C9Ŭ-IO26[5BաkF>+VB˟q'ΨΆ }M|h, ,B)nq!jeZ3c9ܚ*˼&֥ЦoI*"jal=s*i^b9#Gf+Nѫz@9԰+f sq^M{\ MB,9XȺEXB_?u,|S$S{f ǘb!LeM2Є }ނ5g1ҡ9k $JeCn8^ 쩰RG Q·m*MZai%|hNժD`{ư@M^-D"\yUc>r))E'}j+{sBH/Z~WP- mi7L!0NfrJƠ1QA]+>ړ_hl n hg&N(A\g@(=]r:!񤁟 em&ޠ09qO,]f bYXm7DoʎsmTHe&CsossQ:"_[V?$]9W>y/ A\Jh{<ZBH)x"c˦+p':t$_գgLڢ]hvq}ĥyۿ$=A(MBC;3d$Q.brA҅PP)KJk y6A/T԰`qAc~֜͐DcW^Jn}Aq(5 S~V 26RbV'hhԆ)J\*=QA"7[s>63xxADQ':mX*;:S'NaR+'״KV_1jRr'9{r_ .{3gxyS4;_5Շת70G1#b|WdqwH>_ j⚕Ek CnwcNث >D.b-](G:h4\Rsl;ԏmYc'q>K'NTőyuMR1zO[VOT6:̊d64x5h-io涓Ov#LgsFVO}7ϗW=ڛV۴=x,lĿ*V_bHf):N=^I%lSGeFZ{[ZFVԘ!ϟE_eI3(%Hφa/055(}b2#+-\bbOUzҦMn].Ҭb#6JUUҋUYNM%gBYnÊu2)* w$Д > }7ywt"p~+[@qߑ@:(ǻB,?Xm3A! tƘ4]3yǪ1(fpEs-WyY!1_sT|bEÒGVX;P܈V=TzPRro"&K`62E_}CZY7ßF&[haӊuw5MX͝ MnTݦS6([ K*b䜫ßb ~@w ~irjl\@!QWqPL[K96*9bY-nk~yOEn3+/|J)N)+J}u7گ _Fy ҆5—&zi(>PN2|L?S^* 1n< V${PbEnm*+#Ld:_4{N*`!Tr/W w'n/XRlGAUA"'Mֿ$LU($Y |py3": ۞Ď޾6O{dD|~F  7AH?㙎hxحT'qyoՕ0#fZn6 - }43"ˏj߫!Щ6ֱ[E&wjB&!-(>/+hQ2Ȗz3/8J}`ڞ&T a fVl0ܠMHOqa<سvMu?wayNSU^b%9>|Fe-F!4q˔O NY 3ΐ}|{[YⒶiJ  DT{T)4R^-°Џ7tn͆f0͕?96@Q0?V`ʡăH.VӛFUP.9/Sp[{!v%tncmO & +T)/|yaV< Ē.>ȉc>hm9jhȞۛz zaH}rI)L;*paF, Ey!C}ajy' aLA[,ި5uQjWO,ާfsV_ <{"J т̿zi~!,P2G:OiˇWg\0j3~N[yϨ]%5qE1 h^-*IL o5.$\;4bʱkcT!p,4 s0%fY黏1K۸;<'3<]B,RO5I4WOK/IRLNN8m֓yY.鹍[aN鳁/+RYS踾ry {N}KG-,i@*;7os}֬ѳOwHt kP6Lܺsވ3k-gi`[% :A _^E*0EqeS]S Mr!{ւO2\?7I3'WdKNuG 4ܷ4Ŵ?c :&Oi5,=b]7ubA5+R_'ܓUEӠeNʤDn^Ld  `/YOᾒ$2UۊЃy)K=Os|>L{r& bJG9oʻg֡7+<҆1PLG"n)#EJC׏~:ONԆDHo]G&՟oE4~ A 3L.O b96䑧~E Z%8bZ)}p 槪TEv]O-AnmSז$zվoQ/?$I\>3'2㋉7*38M&~9ȣqڌ]Rv⑾4hh 1$-i Ã/S !nf|3UCW Cf{_5AH2&T.ƹ(D25-7T V]W?S:fcid=tݖyO ^P5{\|e1z#n%9m:bө4+8-c{ ,..֓4(Gnxſ8I)xE\ͯ'G6BַDR󐒚f_9g2|_*& -b#ay7| @3m>L_Qqn ;9 6zE c33-q +Wd \o(%{zYH%n'~+Y-Iĩ)cKtrb*HzӃ2(SG:j%D5T6']P7kx geIIR|JY<2_Feg(),Xt~Z26kVT*X!{KtCЅØ?:_-29wA\ /jf=Rqc"(:+5Z!>-XS]4B[ TXm(XBQl 6`I=}UЯb,W7Ԭ"Za6cǘnHd7'ʖyJ=~epW2YOK>{3{:PR.@6 NT*"kf?mxSt K+Z0G3h#ujPHepQzH(|eig9"ŊG*_=Y4' :MPlYN\/ _NGX9mڹ)눰2B丢P3r\NTN!j"hiLA#?MW=;q*H~UiZx^2DwOk9Kc񲨛 +7,]XwyGfK&%VD0.uHM{3DgaNU{Uj =B)=RVȫl&^.G_ s ~}Ox>ڎCwQGc[r4~2WcR9;c,R J ?rŊ>AxƛK2qnf$^SUS3g32 Cp:Sб2S]%D5s$PѶkQt$kaq(]ZصSAnXboOmvu") ͪptQ4U;h@2ɻKkF!!<9iUaF ^Tfܘ8aIJlU& 1⛍Kaή9̊T$硳#=$=6]H!)XHm؈DܖqW4 Χ+m<UQ@ -l G3Xct:K4Lcl V7%\ Tŋw%|K$Wm>úG>ߛ8+}w:JAEO[~ nUڃCGKuo2%\kۋ(pD\$ 3:Y)bN>T͎CQQmq?(Ba:޾j\iL=ȧJ_ӟiJrQ1o]Hn7i iOῌ5(0٦~jJVX3gջɹʋJlch:j92>1k])@ˇm&5"s$i< zdOLخRuа0ᮗPj{H0jSf v Z o›fG!{&2\idH1&"f?^pu>uEo)!mxkZ"=g䲽F B(9bL#\l>eH9~F ٗIـ48!:WEoLit riLp$ b"$L X ܷnJTM>䀼kÆ#ˎLYDĭ7h!J8t V0r)@%)R(;0`PVin"X"l[Zray6Vf!({ddS_}KHcoj!4fxgw!4ĄplB<)x W2%ݛtV6>"i(8U65"Tp?$rd̫{z"iW$ 9uX}j-xؓxPk!~}qdBz\]Lm4;S!Aũ\0BmQ,وx[X2zS+qzHߺ__uoZdE`"'N1j8PU$ &}v쁘>85A_;’#3 CP=C6d l1\ .Nk<0~:[]VUxx뗮/4U|Ϙ(UDliZ+~ܹ ľ k>OdC57R2E>Op$?Tϵc3.`E}畋E>Lv]%'5:͵{l8  2CֳR㗨A3e< )N˲";Bv1A<{mHGxyj΅9[& VJP72К|?UEǎX[;hUaج߷Mޑ=**΋T-"~suj(9Q'SS@z{imAu6td?bb>]ThW{ rgΉOwY`yiR$ʣ`b2叞[C7? f@LxU}E>%HILQQU803!cɗ*eethT |37L#ccb$ + (x$ ~x4.ícXYz_.?ϣBqLFibljbOn H§h۽h<ŝL+49ŏz̸HD͙Q{K0[3J(?g kqT@|aϤ{tk7mwKJ&*pSg̰eo`oW5*ʺ/kpmp Gj}ޭ5IY>CHe/̫ӭN:fہs |md>3PߤJ/`w;KdKV.Rur1tnH+)-%W,j{lIKFv*ND}ױ H9}3o ^}OAy ~>d7SH~ߙ-=%ۏ+trD ˠ/1afR:Uxdgq3"{>:hU(Hq7]D\+鏅0͕-ŻeHd3/,)CvgPB?QH|ϐ PYo&)h$Oai%{:e8:@E Z=g1-&"EHtAk&lMWJh3hx6ǙG5_{w5_Wc0 5B5 hldq(.b95ok@1ɮv/ijJrQ>Fif*8̢%qt&i,e Z @< d*f/Z!*Uvso"3]gK2Vh8:HAET9&7d&wss#uJll$ O:Hl{>HXG6Q;c˼x׷>5(՚7Gm}r<;T]/tsCe鱃늪|fAeyȤ'g-k_a?cϕ Ű7,TeX^FWJrHhWV]Ƿm"Uݻ\X5Q2諲O ϒ~XAt-T$qެ9?]D\GtpR޸6Iʸ]):̶:=[;ueemK #HOŗ$te)QR3:o͋94^9kĽJUWb d:_Lvcx3&[ nr996ɉ4a7vB:nx8d-Je45/v)Dÿ{f Y҅7#A.5?w׏U[>+־󢑖]^pQd /֫]DVٝW?))з/`) |ӬeIs23x ȕ>0Bc[T'9`H1*,銐ğ`P]sNUaPޑQ3]XDŽ>:j8ru\ꟊ22uc 8L jb#}.EU.^$1ldbRKJ6(6 &[X[H+6?4hHG:6Eq0RKӰL6 (>qJ5XZ`Zgw8u26@ ,,K5|O9&#_٦B̿廜ej\W A1sDv.{&EW= 8"ac/D㚱} s FMyflt[B LIŇalE,i.<V/v7"W(<CFl,Fޤ,YEg {'|Ղn.;q{G^\oT|:6(sd@1|H>}S \mX:)xT&h dꌀ=G [͛S`_IH+/_ș#P_*́^\{c40if0弡}W^{Н}&w)X7{45BSWnyozE.oK>Un${q=(@;RME!uZLsz%y-$N{1j;_8(.^DŽ om` ahl%Z  o& 9d~t>kB^x *XxN^QUwASRRlJPvknoʏr "&V\_#P`(<}?k{N"ɵ eع/E k'AW{ T}1 ]VLڋRc3伪7U,[DŽQrV@['o/eJ\s;eHqDmYC5Ȕwr1xSH չY.:SX|ׄ1zk%tPէ3٫GA Bͺ܂:zNE3.$>CS©,B&kN׎Jλ!Ɋ^>}%wiH ȈC,SR\qKz$9cYC \=`j%hUBBVk[MvQDR84T` ˥&S{I26o2+AIU^Tsf2?c2+{XNͽs+>}|KWlߣހ2c}WSb;ʑo;*vlMZE{[JeRkbQ < gydrh2K˹">rj4Xίcq.FV=)vm<"RU^IJIe TjXƫ)K1^>eگG׸z`w*L5  w!ph?7Ycr РK3͛ FCVsܽ^Q)TG6s]Y|#LI!4=hlbҹ M, @*0j\TW tF=.Ff5ԪB_ӿ[V]lLo[kUK*5s]c7C!s%[[˒1q5(c"ly8[O.D AFɎP1K9+i8-UtWec۞TQ;b2zgM} ^B\SQ8}Tߓ:O3(hඳV 󍐹@aTLJ%UG=2T#\q!9a7G?OIuo߰C')UJ3.Oawoӛi&|d]k1IYA ̃r"ghLƂhrΑO -m1(ɯGk|@Wޕ]&vKCZ s3.AAE(qmDЎPzz-ǡqx_u:,ard}#ƕZpM"bIY1fkI$el(_lu3}ҽ%"{HxB>oNL`._1CFLI=>OIOQZ!Y>EہF-zwTX`)g[F+3K[`_'#y7xm 9_Yd?4qWub{M4Ŀxe.z(݂`7,Yކӎd[(;/KVG`4EH ]J*I[e8RI%lRs/TuDTi5/~ͥ&[ ;(Ͽ=ppb?[" '/OFu]DEH m6V]f> tB~<}1GNOk9Wvmxd Jxu~'~mvi 8l> LC{X۫S#,{^Kj"SCiCCӋi+?U9[$Ƴi[LX!ۚ UbrE֪PHi#;J)I@< x$#s@iXA\LǛN{m\*-_GPa|zS[`#ؠw܄RԙsVe!MXlh!v:Xӈo%@هE7% ~*A_r ?c㒮3\)WQþN*U\gT@< {˶+OѨ~M6ϼ+~!ݰvE-?f;då _hയr#Y !̭щɕ`mj #j^ xF|ōHƁ!_>ɢ#ӱ89+3h? h"Qp"މY$'1ڜ#'>%@kz][yEZVGAnO o%OV㦏o*}vdBb7JHCm:Z0IFui+υ D`,#KLD2AEb-q3Bfp\om溝& Eh1-fw< '˽VSõ}(l^8?ae[q2~̪oN-S+2 -\VjNvRiwa >kTuϧhvU3]=Dx/ 틂hJbY 4 s׽N d#Bi(H/˪sջ\8Ir#;I11hǀn]_:x>` %x}D} Mrѭ?u5;/͊2c91Ha Mٯ~ !vЏ0 dמڂpI`BM~7ѽǓo4[7mFQecE3}6+g2Wa40[ l@E(mĿA+ $:Q뒲ح Ό$D Fgͨkaae/jm-NlYIìu d7o $PPWo~&ϿV|is*\ |WF W!6 j "FcKT8 RtZ dH|x~H[^ɔ*^bf5VG0 @?'$8C"hֻ ^ثr=70gD6gDLer[5庨 >z@y5lBxE9/u)fǦղXb quu"(TS~.0>-e@ul2f(r*;9@yZqBKf7Ca ;ѓwLXS\Օ𵲿BK:F>+S̜,h(HxLh}}^_r_N LUY}ǘjB9l79YQ6zv73! S;gC}ُݩ.cƁUoD֓rLhZK&b6cհMI4Sƽ6ɮe!q{@DsLD!HMOI {`c&Zlʬ"EK,sJ^Q6Rd "0 ) 1t+jò@̙<%2KL-rk{,<ݯ_o1+,RWXTm!DW7c@n8)OTjέ}Jh輂jC$&TEg4 q<sV]`2Ni]qNC&>C !VG-̳^;Ny I("v!Q|mP q*2m>z!UwN.!ZZ' kt.eK}*~Ec630=t䆫so3\yB{aG;J6GtH.{ g~;zu$D lN/|-bk-(u?\)n̘eK?ٹ{ " ecau v4ET?{*΁a;c}}ƛڜ!˟_|Šיc˫ɝi_^gBqqZ0%&t]bvs]PF3tiqq Նn[/HBsRT~C_|qeة6qGI8'/c^"V+5=_iYtm`t2/@ۘ2s"4.īa '] c k˟d.Z@ Ag+%:r!FuQ'/[_ɨ.05#\M0%ſ˽My{X" G _xI!X^0>MߍMoXCtGH:x%/ݶh"? =DކpON$]/n+Eҧ-e%B}Of ]p:ڙe"i>\!N *jC/h,Xp*7p6 _\iUoYe?B[k;K_7 d7 m]?YAi3qwB$RkHw%bбaTF+L_p^>cD>VR*4ܩ5FB -G& 7)_C;m!; 8]VS/(#cHCt-YU"PYOͳ3π+}+'k<9lL*u9ߞ _]"!gxdL'g?@+oy9no}ߡ=Pf'VfA9.LƮRhub-U[ bcFf0%(_PS,=1W"U= Q*rq&6ǐ\wC󐖊8߃G]bZm^{|&]J&"C sAGGJ,͒G}&_X8qdjF[sl`geu(&a}];7]ƻ$TbކcPyNՉL/UBjQ ºbaT%,JF!7lp zÛ5{6H C|ޤus:+QdrBwIh㥂vp]s =ioKyuu,U+ؓLÖKZv4bI/xT I|fr2Ȉ߻!!3 5W@:8K4]+'a>4% @%ǝ!wQ(p_|aE3QC|{(thFɬEzPzB m tÈK&SQ+JGEXDOO|&eoKᬼK9FLPo G]5#o_ r_Y: ]dSDs#}zab'24U|DXPWm9cBc'k{d]a*5=7'S=6J/kn|;R\<ɬ)ϭԅX'-zj&օG+rX\B}jyLS? =J4|m SS\P7?o#Ġ 4:v(uGbZ (@s@ 9g_Q{ !,!;K8OZ2ǭ9KV'g Kh8O^4FN_M6v9!jFM=SgI!I cJ''H1bŃxdo!;!_;rx/,PK]chT`džƖ_g*ì3CSBtrW=VŰ~q:@!%ZAK]Z?Jm^7۶8.sL?Dzd7!sLIdt PIYYfsέ!W49P/#:iو"3F?!eۀ8p9IiB}q!^|_ߨ#;]'Y+ 1?c5Ѧ+$ #4bE߳4KW2UFR6S7tX`fM0C<-2Ű{)c<)fxPʖvɵdT?'z M0K 7VZZ/MSN?2g58ZU69 q--FJL3zd5O/,. \"_f˄$U֏4 )$x'OzrCK9Ḩn&}Jb+dzrWr떫vZzqLImxmHDDKugkCe~$afքG:/P3&q@~GF_HZ)b17+4@59C5ck1 P&K ~Ӛ+x$1nFh? B^`sC|3&grMtֿ3FsSـUv$M .!i$&AT)"ÌYtWLew rLJ7>H@#ٻx w&y:_Ln̚*U'"46Ɗ¿Ax2ϱ<'2}5+0?%\ߦh>{Z60ŬW Zr}yFDG5Y5V{/v{u6*7¡: ׏]Z/4B)KZ2'N_VV9HOu$Ѳ O%5H0е0᜖Kr~fAc¬A[˃=#7_=1`HwRjlfZZĻgv,ƏƎcL:x>m |f Com,uPlyQ^H;>75 Yx!UfQֻR;:Z<ᦑ[dI mP0燖r,\fy, 6Zklľ*L/Пx^J;}d#zHlȭ\f:S7[v,RH)7,驡3#u/.nɝ.\QUc80b:V)"K>/yz)k/jt/%͢ |Jidk퀀BCD#bL,I썧k(j zD+VWFc ~1c^24P[9XQcu&\ja3Q}9Ζ=f{ fTnS7>`&X<}-75PfIWY0CY3v.::_RZjQsu‡ 雠Xz.n^{v}h;3ϴ!} ϞΎ|_^ghamCPUǒu"pazCw*3A dBZB4\ 0Y r6/r9=-[ۼ7hgst}՗+VFIfmMq~^)#6;tȔ0 iӴ7$&LN(U|M Ǥ<2Af iz-鴬*l H)U,m*4eqȒ)…#椷Jʦ :41qjG<n+k[]rw6њi`-$07u7pO`:7Zyfr}_ŒI$`+uJZR"6ʨ_`'G{{ -d}hr-9ibBqՁ^ddt|{`R1zІ|w(HJ|R=rfz\$7ESS9v$4}J"WbnB4y:Ȅ&@3Z5{k9T]^a|I[XNIT {xm!otȃ\Y)^^ ̅7 {⡨%-N_ ɇ^"SwTqL'oI56$ ߽p%N@L)yK:oRA VN%6r6zK&xd6 }rU^ >\Rk< d-f%]*(SC&큨I;<b.mqwW"4-4_y n>L4=\I^lo\? zǘJ! _mpѿvK5?*qV a%^kIQQ]HdyV%)w r:_矫:geQ~P ' xwt @Kq>ZnپϾCK o鵝ET5NC 3FÎZ2xg^g椕AЈ˯uZ5vξB |#< v & Kg˙ylN9GzzP*&mZ"ː=Q_j??q* kj]1ӝBH 53i: \\@,+ Z"9&ъ;Ah%!qr;~Q]w W\2M,a>}nPՁd/x _kEesS7nAvWo}b(_a,FM=sX XO13EL;F#Ze yutW|o5 :x^4cAQsw8+I PF_ϲx0 44X+&Tܐ!%V=d 4-B%Ci%Kh1lWy ^yH,J4@c;2FERVނGdC]i(ݔt鞸iLᇺG_}؂dNYD@Kx4[DЁ&n\ M{ @@(H/ʷD",`-_)l͕؂O GxI{jϓsqJVg5:ʚwV@5"Yh *1sg$>O5cީj$esmX l|E/ NLqv$3qp)?DHah˩w9S0.؞H-.!)^e&+ʴn[ qe~q-ܖ`~Ŭk8[l@I*~bU0XXA!ʋq,?9ҒKJbL.:7ChXפVė#Ӟ6ˣCx-ⶵkܛBc|+i]icBA4'hzw6cNț4/噞iBɇ~&At\c39]Q>齖1p(vאy}-4ܴ; i<R OaB:_[$A<+B|jf#P#yֹ̪4M5wqOUA.#dk-৴ZΗSx, "-vKfۙe< ;\XG2G]Iv;rD-`;2+T9 QF^Ⅷت 4h@Z%VvcOG_ # B:IyOH^ƒ埥/rrFNK 唍:AtG Rk=?׫٭ \WhStYf$Ebv+& upǭ|I'dg3UAX6_JVCO2+ŻvCCƥvy3W>~kaNGkaD ʖi=`H; 8 3] ?\î TxF (|gP-<٪t[`YPaӿKWߚW…O4̯Ã>]B~xSS+5n߂f٨0ѵ d2WjH'޴i?¤d>Pgd,p%ZĽH"<ƨf 2UAXϖN( v&/ބz^Fb*?l1yP:R I-Om0S,850eԀ JTW]4]~-4B.=R2 @^NLiQ<"%;So4YMV!/ʺ_Ypc^ \eꊔ ԢBDK-4cipOCVC=Ȳ'≱r|>*zRO;`Nsg9 ~`@6@9~-tDvpk̕H2XS&,cYcl7LyhX8 iSpTE(ZZ!g `&p}M^ lu .dz[XԢRB^!4;ntJBE:P~iTԩ҈҈?q4.[uV#bܐsc}SJ} 8s{dsښDh5rѹ:7Ctfgq D˻ρRO 'M0̈4(CWm*F}.j[zV<v"1); i=֭[c0dU"Ek]>w8<0UH$ҵ.n_6mu~ݑin]q"3~**^|>u Җu휿G|;<@\ZZ`W=s8Vi#Q9[V=1\H4PkWtUWŏm9$H!BroE_$-Ȥ0aTI͜8m^*&z$>Gl }S Govݍy_7:ET:iY\b04lvkLsdJT/Gӫ6F`xkPpuw*y wz-xs'`/ 249V<{2ܬK7WL Q8mȞ9!Z^`Ȥxc):_ژ'd3Y&Fm44ZG2TXFL8Yh%}uUp*RQĐ6]//Qrm{ʹ諌L@%OMlƘQ&J_i]ӣ^{ ~sLHX%,n]ՙ.Gځq̢;y<r KFgg=Xޡ00t#y%VMEKh)YGCq.J{xpQsva R 'tV\-77ig{Ug3}C_O+M49c|֝{ o#2@EOZA]\+_sɀ"XS<վ@U? 5ͩ3F )݋ f⪀jjc4.Yy_]*9xn9LS ;6Eˑwo(z7 ;75DU45OzyK!~؆gF-2_7‘]m! .CL1s6RPln d."uyi!Ŀ# $6l4K0^KXS.v:z<6tXU?qUdV(.M_m`E{^a r] 9%Ά|C-sfipslh:  x+C3vC6y? V_#a2K}'u=kZktTD^[D0Rdـl֠S48>KQ;D?t5lIy5JtJ &`N:?yq-}` )&Ek8j|V,Pibo}?ryQP%ckБ$_ߙΔv~E$hSjt1z1݇#  ؿ5񓹔lɦʂ v ,.t <-`SQn>A4szΦaz :d)rM(5G!1 /?K[c+:2d86J؟Q3iA7CޝU4)0Q98RA(:eA:Ea|-&.{kJ'~DyզMy3FȰcӈ$Ŝ>JYQ3N@U5~wlݯtOhEojҢ 4i2VSaQ?6M_=ؑ2ɓ{Ov&[Iu?Q[7?ү&1oIH^|ܳ]`g4]s+#sݫa TT>_\1pNk%_ >g Y2f܆tv+պQE {h&km׎msKxY;Dj: YS'+9 fwO{n&1SՒ$ϒ_f 6U#0^-3Y #70((dw+|ft><ۚ:|~_rYL.'$5REwvׅt} EE TȺC:JLya#9O0{q3mPżb-5QÌWv`&tLX[픿ミ2vObԆa;fŒ3cHLJʆᄘ ߃P?25GX\"#$CBl7 M,B+~RFu Q%g((d +"h'37*Ŀz*3n5GnhYX&8>Y R+=ѭf̥[O:Y8L98Xf9HT~D:=jc5)PNC$Zr4LB~PҸڠ)\f[ۙYIa ѷI`cm.Sd_w1U s6)w7S_v԰L@m:FSki⫇'@&Y/r xoV ( Hjq;2W=. XNWA!澏wVFs NSMvŜ?W?{?iW0TKQ1W݉Py|apМ-yts/E8-V($ ~6iAcokZA+rA,ǧe rf٦v5+ 5~}(pE^p\J%o0xC<. iS.BR2RǓF:kA |I}xA\S`e˶b!3}KJFR7Hlh|¾'xr<#Et)Yr{("+6Gs]naHb$zJ?M%4`=H/J0"7y5 \7ǰt-p}'Ai/a+\zN#e>8n9y-xB([]#rԅ矲~^Ķ*tqP!*A]pp|5?ЎQcS(f6߾ @*#i,pa,vЖ/r=+/A֛]ZFӒIád*$ <;1˚Hb9GMzjBXᖗ9ޜ!1K{c-Vr f(q{ >udL7Tfrs{$4ז{1qzLV?<2\ h`3vgI{s=h1rxŮ-9Ƣ{*m<`]K]) P[돲O+ꘞ sjNZ_QM&dF{zDvRK\WyQ80TP|+Pzϕfʍ͇~0(!K3[Wȷyf?ئ[RE?OsVk% ** r-ت^MF||,tAt9Zu >V9ā \.wTs"'++ GjiY<ǵ*{eTLN^"ttܼ>k?l&p3$1 C H`4@9Xӣ?q`]J@ö۰έ!*vLwXS+Ä DNFr7z3 ixMmaBwA;1Qy5!>,=Y"#TbVYTXdaIEx_ڟ@J}U،MgHx '8N`l[OUI97V_ŤKw)vI6ۂ7ӒENhxXMCEqo ډL(?v2~ ptUSWZ όȊ\#߹OeJT>?iq!A1)i+,V([I&>>wux[*z"ق> stream xڴeX[҆Ӹkp 4N%$8݃Ckpw'pȞofs V֪ަ"SVc1w0J:\ؘY  6V&W;k3;3++3$n pZ\W:YYyR@i0(]MԽlZ@ŕ YZtK-\'ӟբY3[[k  ˬ Ptx7Zh@ShIT49::815u )FPSWzoPTg˟g܁.6we/pvՑÃŕْ/}V.g[3Wc@t+=[A.?$ow7ON\*ceZyeey52i%ssvSC.tQ'ӷ33x7f kWe,Ի3k_6EI 5u&1)8wW|"`gg\] Ÿ[ً-AnȢvrʈ_ o% :fV,5+lMqtpXع->.&@矎&6nˀ,2+cJ~F@v^s8s=:a&v^?Z?RiMg"i 4Wv52`b`f/Ɵe>׏?4]\\G4EATNT]( 50qv6B`}vNNT= 3} `gG8,"L"n`qX&.a(MտEoMZ4CZL /?^|`|W`|`x`h#f|rLNP]ߙ?'ٛ9M(.?^㟩ŻŻwY^wYk9W_` Բ6#DSNa{?*@uբ>LlpR\ۿ=fKf6+%+xO|ԖMZʚ /E*j ̦.v3O jSb۽|1W6W'DdVX ";/)nKl#hvt?ƲO_W~(֌lṈFI8 c'D?g\3& ۍː^}b 3}q8&{17Ʈӝ#o4^k 6A/g> 'Yٖ"\΁LJq Sgkށb+s=cbHAOUv0˧~7q&4=~7)r6)Ѩ b t5- ԡh?IGok%oR2YQ:kIr`?iJPUYiڍ҆R;r9Fcmt? >I^"/ e=U0knE>NۡZtƼS5̬@Rk$̖.lAu;@糟J7Aaʄ7ޛ|ƒ? yc FN;*Bq&ZQUã)[9~UfW@Kio6"qtV47P¾R pp͆:_,|W qpIUj6Fd;GsɊ*SEy5LJێ;xAEMQA^$3 љ=f$b# t5s,{k,: ~܃Iy5iVZ҄= $/=k *ȳkr18sO>FucknC8_ m>sB&^+W;y%Zf*h0D'R$dZa$^4Fdh p[=lN:59xfXuX&GS1ʖ&a Cj{AM2 AIBi-|Qs B%LLjr]ITJ#,)W.S|Kr_RΦ‘1}0h[? 4t:U 'ZHxv1SYcC@'GAݪKO6KNx#[4rlQCv/圩mSa`bE##Ƥ Pj7FwobUjEDžSk=BAcy[ +yj_uH_kɣrn@g1TdG  |+T#Ĕyb_5lC5~)"TzFf-o=y#+C0jK0I.Կ~9]s.lsxҮ!x;r>BЄ$i36{I_HrJ1/S'KE<@էG#G}JY8 'OPLa겙S:c¶LǸmh6#g>ച3liϿM$~]y<"u Dh]k{3j3X'[YC腘٣4%Rgɮ]_xirx1L3l?EsHV(̳On7wڍ C8eP%F-+('w8uBSe@;?&őY:C'JT$sC#}LLLrhÕtHFsv01, }yC79AS'[f.昴铮;N*-}D/5<>c塺u`|UƮIxEla\Ϙ)36jD5&}16BB]1t qDTnygA/f^ JST6|:ƫACo8-[8|MpSF% W KK򯀸 ]8w_1əʘ$I!UZb-j5\64,AƆƸ!R+ ѻCWɟ/Pwq\R߄^`!QĂ*UDZ)d$"@qLԩq/_ȡus*U%,}SfrѸ%d7E7}䡹d8~H^z u.wR37l5i>30O n)!06\rtUGs1#鮅`",-$@E~Bcf# 2M%cEs plR)z|9Zrdn[ξ\g 7)fW5rY ᮣyxVFSW<;SpV6779Lz\B tsW O}?vAI!cfi`Bܵ锻'_5VʜJ !+PojEZ TgPCqidy x;t.&N[ 5:Xޤy8y-?#~biRDh!h DU'LUMbCȰPQt?U]&@Pe`:|¯G q)sǖ9B#ϹǷ:SPz y pJ^9CIpN2 J,hV$o&:8sd$4V!{ %08<%?Cj܍Yt URu[eSk.i|٭>Cg197*=4 {]ݪ{hV[0RsH2n 8d kdc]lyA12E;Z2؇mnc97 M(.wywIq&s`kHrPq1ȐHЕ,^88U$lgE; 7TkJ9țf7\iy 5L0| F./t?MV;x%xEEy.o?t5X0IYf¬z7[#X˔V>nힽ"juJd=}҈dˏǗHMQtxTd$+S{jT܀ z*'{J&Oy.9up90q:!T躹yIY/P3[pjBYϓQ1~\'0Gc1}$$vǀ<%8$x3߯8ϜxdW4r60S+/ &Z Caj <:J]OBq\C?`׵ךN:@DR!p_ms#GOCiq -GI= -% =1zk}@2l5KorZȥ3_~7)y֑-mǛs*VfY7,n%n{uZi#Ύp=E{|ӥS5ДOj+튺]BFssקhcCf3kN EBJľ"g-̲O4)} Iqs?XvqNWKLsn۩,:*!kŇs9 f AP.) ձօ)M*uğ&]DT:K R\6^˯cd^?ݏƗ<h@-9wDJeQj@;>bGbCSm5+7}h5-` lR LA),|~ƣӹ/?Oυd 7IaI0w HR5^I OBTSxr/1!@hNSqrŎgUyNyp6,}'׭[KnٗBʙjzyyeKs]ʐT[/NGT.LCAI` sUS'M& ^P-71ѯkAT3'10LJ#`*w6 |2nHd`wi(\]}o4ЖTaEdENzA2H{ZS2lw.Y$u ǻ](<3ck Ǚ :71zu˱Fu! E&e&|+럱tk *C'r0*!Ĩ~:6DKOG NaOFuؒy+ѷC,\0k j_&GqCHKOXbcP%nם{]E괢-:L ul,»f_BV|&)Iu8:Cى$1A_<J[#C1RP@q6C/l 8ǔ-Ue0gzZQ+>RTǗuE~aHb=gPݒDU2Vu!l`e[BSa qf^t+Þ1O<{GiAs,0V( WyhcB]x׭lA$f6ECJe+Lwd&6.\c> xv=)Vc ocLT%6"UP89?)"ȷJ'' c#sTԎ`Q &n2wϿ̻{;&NOckV.蛤 `آ|Ֆa:em+0 od%Ѡ b 3z,.g^-'pҳ0"GȔH|\NB >$Ru3L-|`JV􏢯NxQIaZŜgLHm2]?XN&Xyg@f-)6-ү:}oA$+\1UN{} %uu\)0 [si%TݪhaZפ輦!/S.\d+xכ)U(GȬ.Kdͮ$CTyf?FgYOR,YıEjy̹4z[>Ap7Q PȯVо=>pF*mm6L]CNJקۦ@vOW]@YUai/e;py~`<pcis(`pԟ7vA}ߙ4݀KI&@8El P"cQMUM{L/%5r yL=8_-13@1v ]tS8!x49y;ssh'ޏ-s??6(hG? {v ^/k6YM} C8g֎-NjaGU 1Q ~3ds\>ҬyWՈM݉~\hCZ8O:ݭww,=v [CrWD<(1@oL]@@*iB0u{Yy )'ͷgtC-7OgY?&Р(V>r3OV+`D MLjJf*:*S  ƏQ26lb-w$2fI`+|y0/iBF\S?!hjS 54O|pMIG C hL$-}T hj1㒼Gœ§Ft6 vX-~)OP+-U&a@'YuN<!岲tdxgV <)O x0/)9T dM5qTx7G1<eCG>$RrUc]d\ίXB ͤ˝DC@hv1;9)N=7D |̴=$fSвߓɓ~p#畅qٵ-F{~PZgC zz2D=bw4 xU$'W|kTB;/ZFgn/K.y9'P_~9y іjrN ߝ/R~, s?:"4 Cwq;dQ+*q~|cp8En@?bl,g,^d g}

Y|^# sOۻA玂浐\s5+˾Z+Z DߗhRJKu؎LbҊe^)b̖PZ/t8zJʹI}FF37B[FþeE!?NIeYsg1Ar+f~%}i1(H:S R!Y, QhyN oTC?{~[M`ƭ_]ˈ%ܸF-nVnEj9 vWokv]cKJs+M1?g M \YMڵ(X" OK1A\Q[q dޛ̔U,m H Y7QV'K :LlHָ_KĭG=g`UA|&A^JލWx!' m _Ú,|c5!shOmТ~iU,ۅ-[O!61 yAu?hۧϣLhY "\m׏J$ #&[E~~1Pcm"x K:yi)2WVfe3#tR0Ȩ>'2weHrN.SQp/bMi8rUcA h}lIh8*wpsc w.w 7 dXIgC=Gxy?f{ j^>b=]`m'Wfs#C/;%SJ- (e( Qn>0cJ^:H~a~<NRTD^UL?Jg L44t#^#_ο2<+(Id{^Y|ZB]mҪ3ۑZpdQ @3!˛$F 벛ǤrrO+s4o=?iܐ9uHQ&R`3=G KʋzTuC'txORJȤ_#?^]Ar9"ڴI^grK7{*Xk$7"Ds/Rjmо{?g2HG2$ ֺ3 F8aWFGE{)ݘ{!p9lVǴ}9)|?T= Pb-G[_ѶƇ]{YEdWLIKlc!ϕ'"3 ֨b#2RjX̌ۺz2m>CQB˿d{ ,~ď$(Aga!\QĿW3 Lh pvc0 B>{a~hHBJɦ~lae5b?ow؊vmϪ[0#JG+?<5\(_3Wz[*|U/ń:dyߍ=)'!28PC@+묲b8||!ߑH/b " H8]N} Һتm`O,lJ?E a}wUu+aF ͎yv{2p+ҹB`Sxd~o3çY4L ' xPGiO\H\QҕlWm7s,>qg;Q:rڃ(W|M0)0čM$1?JآQy!2 Gۤ?Z]-oIԫ36mZ+!F!4h-Jzwx:4"A5%-󨍼k~{")3-:gTn/Cd6l7M/ }(7ٻc!$T2UoBӗ8a8n_[= y(rƌ 1nRpmGRlHbB1EfmlIJlUQ̨T7FRwZ槎31%dCB- ri|I]_˩f&Dgk*tvcn[RoVRU .OeCg(b fa%Hy syc6$Ph{d-yϝQ݉p*lj ʩoLn͖|y+i22j]!Fobnϲnu@J<8߳h YL%gUvzncnMpAώs]u%({x+<[Ӣ8}*4s{`fzq6z0|{a7ZnZeV1B>ǘ[rUIXw4 o3)ƸDK:l?Nopd]kb9L^L.}e! "9}9+9ݡͅSBj*1z8qou6%yǧwyBȬqFqj8h'Ǽ}tuL#6 -1+AD>>6h-\ +g)Fl|Gz^ioBZ>?D7=Kք2p77uRЉi]fw%p&ؗ3PЙ:!X凊r2Pw]""L> 1R}wԴz쵩d(W@m]/:}۵Hh%r(&0bҳa*x4wT NGb`_Pw̥nŐEe㞒`.#/GݍyB4Y[2&.7ŧ(9W`0qf3Z0  anv NjPv S/Q~r\ӾoPӗEӥuN=yF7nh7ۈ^qiZ53vڐLx48~ FMT\7CC`=/jih7H!=%5_A龴uxݛӛQ]k/ tB8}#J^Rvxr-;iNH ꏇ8(-{[Q]sgeWq?R(u3;/o=тW4}l̰6}h)(eiEcMto* &3ŠR *E\)VFV?ԿL;fM]@%m$cbl*'!`sos!44Y}wwm)# 5KxM" ܟtW沛1٧p #v<"0i!z nxdTl܍_2ǓwcKuY__kE_":EY5 ҿ&˰%kcyV|QM:q檀<^󸼙U5ůWK*H.:$ݑ\cJ9(MwQw+&fnm즽vkǸ6(EyqPخ gD_$͖*6YC۴6 Opu# n7?K 'yv7f/H>FH4V!Qb^5wQV?8EZ3av]4Z}|~~ǛH@:83OJl`NIL7^17,N4t_t[['Ⱥ5Z1Dnj7_ʈDK`~k-6~"ҥo Fldz8o]P\wS*~ *{g *=_hZ@yDO׭va jY5ԣY_l@Ɖ&oBFپJѓ=BޣĬ/0"nGketNt~C &C,o>ޑ*'ȋuXqS9uoJ7SOȀb'aµ4;vSudYr>MjE~J*+@[ŪфjR7Lู:!x# i/?=FhfƄq 贾J-$f- C_go(g(ݖOXAS !K O8D9a3^MGB#Oh5 rn/]% }yyuO}h(lf쫸Eb)/3c> ~l, uUJ$4eRT=tYʡ!,WH⛡vT#`83/n27l̔2e:Ak@ >j ܸ_ʳ|imPx {xγ*|~8r1L[iK:>%WsTW̶G@ϡ vd tF_W`P 8T bQ"oxZv;&?Ni GʄUIT)-FV cTB8E%U.yѨ㩃`7w(pbA/$ߘĂU4&yg~5Y֝1;>_`9 ga .Fc;b})/U#4'9N$M42?۹ʻ 8]zrtqp*晅- GwVU+|l|Y H3VOq.w$i*g) f3AL4x+F4l8i}y)'7ƝjBX,,<=pXu#/#MEI'bxJ_x_ngҺO(Nr^a@c=c綖ytc,!5H8qڿ Mp:%-)Zc~.2FUν& I4`D0#EN븘x*:wGz <͙s]||s^ǹ\>^{3!ByX&\)Ӄ\:W#HwM6 *̅-'\^8EeRgrp E:|ᇊRZ#?ڀj!ͳ1n%_BYA\VSULͮYt>$? ׃&PN/D8 |2Z-G|}oJ~.QP/^Z{4}j~3WaËۦ8u]xuc=),tޚ7Aqm2DUI%->0I(Ѱ~6d-[$sŴ&_ꅱ$J!M:!LP.#$;rIZ YdUиT&p, BVR '5.V@|pMˢMw(-Rئ3 FNa(U u1:6Kfdtf Nޒ7Z z-D^2'GO rw;H9(od0xKL=LZ(|ƍMJ n&[.i{/ ki=.+2&b3apq@Ps1C ~ooKyz׵,P Ј-&r->~,\ Bd[ovwN\$ Csqz>/^a(`5 aqZ74kl#~G-Lnt[I!Las_A #]H4jcŐsjO*oY Î#xHuL}l=́4 XxˮSV-m&M6aWDzJ,9W4եc9W[>j8Yk\JZo;`].,kiTEL-Vߺ^j$3V7j=q<<­Hz^3AX\&$ 1M3Ox& ,݈p^?c;78T1mY Ze0~?:'Y kUetVա ONZp iݶG֝Twɡ4a{!-Ӵ'e^'yW1[OH;PDz$=Px"ŭfc2W ;OЋytC&V{c ?7+ǧY'|Wuq Ewik`&|5-JF$7Ț@&pX82Lȝ% e™1޺{:SbZfU !u:s"z~:ޠ;WGΈuW5wjkUH m@d~쇁l2hR-Gnl`~Bhꣴ49W#tSJ4D8{tkchC7sc~ݡ^6)} `Pr~SSy@QOeW< ~ ] &)ni6%Ld73.|Z7X{iZV#ުYfJN2"#O."sH *$74ʽ81*8E;'uޅ+9˟?ȉY4,[7.b^jM <%BdslfWj䭲S{m!Ã, kcm6&0 toq?PJ[|/SFM2n]Q0KKnϯx--WaEM=~vOmЇO(Ng">t ~<9u>&+dXۮ/)g{7@C+i @aaUEN@z+#~R[L4 6s'f5O6I$3/qCoL[=߉5ǞB)*OU4CnwG$1`71LO밗/K.wVNi _ͦ򖙒/ZfSs ՗!\JrLnBCDM򸎚B37c_UhEϗ%IwOY=H^Y<%|{?+;18:<ߴ<8n7bɶwhHeNbZM.4ȫ)@3P%ۿ9vht"JƵJCX{ i\ɡFlѢ!LFmfCf/tQ0v'.UoXRqaTVSSV!Eq68FXΎz5mp ?zSaECZedt= :&698jlF #e@zHs4ȉU)'sWOP:3&4 sH 8cruZL<聮@/X#P1߽XGH & OX|gqMKn{,mz%8V+fzXNa7Exsp2PL"CΑ}zҢړ{̅sam;㐴͸s*RN5ѶzHtT^ lD[öh6vxZ1ސy}2Llj߻[]([n$È_b}P_'{M%8F> endobj 2 0 obj << /Type /ObjStm /N 86 /First 685 /Length 3861 /Filter /FlateDecode >> stream xZ[s۸~ׯ["7vv:ěM8Ig7Dl$RKRn_Eɖd36 `1KX"bB[L3LI)11!M $f1gH, J1)Y$l,c&-( L,ed"1~l6#% )Q ~p Hc PRZPv&La 4S)Z $LĒi_,D'Nt)Ɓ2~,!%(fd 'dIƌHR`fL"Dh[_-HY'D: "kc*;P)B@` )S# Yu>8%#Hs6#b.e@P hҳ45r$X`TXR(؁REHPMDVTl AVf!ԥd)ӔL-Qf "Qsbab}H`'?)3׿bxO,s_g?6/ۆ7'ySiF}q>+Gg!F6g#L1`˲̷#T_Z_V#fu4⏪z~?7i>8gDG%uDDNzv*1 R!Edh~PDa"O#Ijq օ}1ѯ+@EE+#((5g='_oO]6|VM(+z2UY_yɛ6;|%󬮳2_FWb>ް1wXbbQ@ᭇ!M`](DȸVK`C 1v;SPO^O(u$)p]@u]S({:j& =a4:Nhn7H5eÿw+x# m13%.sl5k`98MDK #^7IGYGĞ`C'Cp.:[.Đ0w<+KhMf?uY C=Y>EqC"8fY{fskt0vZsU1mثU\4OHx2V( Rق$"bި|~4i5+K:5~?&S^gE]?R˦ 9 , 拢\a{6UER5}ήsMWmΧE=]-.gYٴF=s`J6M1_k) v>ΫUyի<[fYf|+0E^FJ&w  R^2lwEew#ޔ$R]*$+.ĈR ^*U yfWZ}[r :9)H8M$u2|q^5MX@NGerOn<|yKB,j tCdV 7 6G4ہO)>&~G*>SQbIŜwC6qZq?cRݞo}T}plSj `̆cMo=?yfာMY/z 6joP0ݖz&2HR[X3}R.(J%'ҮNcf2Z)pCзh/H#B$I%;*1KҼ4&L* ?LB:xӍs*ݲÃ=%6<=bݳuu#fNĶk=tzXWVڗ^+ %lZDW/} y}J7oKJTa };5C/8썒cu"í>JxcDG36Wns;!vQ'8MqeLPoja"}9{z{UC܈SކIVBP_aW)Y)ɣj>A&)i^\^uMZ&8я6Ӈ%׼-_ke}R]}˳Wz!-zz}ӽ?GGʳgk?~}ӁO<ĤlNB=!߉?xoF1 {xO~6WyBHj^n2/0Eq Vtů,ɴ,P.>sЗP=e^լ|_u[7󬹂"ګ:y[?g+-߽aHI яqFU1AΝ,K/*EkDף{ߋ!LBFpcoDl n(xRC? |4x(`~ ?z1\՝$ĂyV|R~7}_[8/pUu6ޫz]םUsp{p*fgjqNgHn98 ֑BMo5Dmн7;o>{/``9ld Q ~S I[>"/C Icz)Q 6 E{W3Ai}A=#a=ä(I:l\ wzWmMyKO9 endstream endobj 105 0 obj << /Type /XRef /Index [0 106] /Size 106 /W [1 3 1] /Root 103 0 R /Info 104 0 R /ID [<94D9C194A356564422A0F5402981E450> <94D9C194A356564422A0F5402981E450>] /Length 261 /Filter /FlateDecode >> stream x93Q_Ē#} G1c}Aիg0tzs %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Gene usage analysis} %\usepackage[utf8]{inputenc} --- The 'alakazam' package provides basic gene usage quantification by either sequence count or clonal grouping; with or without consideration of duplicate reads/mRNA. Additionally, a set of accessory functions for sorting and parsing V(D)J gene names are also provided. ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). Gene usage analysis requires only the following columns: * `v_call` * `d_call` * `j_call` However, the optional clonal clustering (`clone_id`) and duplicate count (`duplicate_count`) columns may be used to quantify usage by different abundance criteria. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(dplyr) library(scales) # Subset example data data(ExampleDb) ``` ## Tabulate V(D)J allele, gene or family usage by sample The relative abundance of V(D)J alleles, genes or families within groups can be obtained with the function `countGenes`. To analyze differences in the V gene usage across different samples we will set `gene="v_call"` (the column containing gene data) and `groups="sample_id"` (the columns containing grouping variables). To quantify abundance at the gene level we set `mode="gene"`: ```{r, eval=TRUE, warning=FALSE} # Quantify usage at the gene level gene <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="gene") head(gene, n=4) ``` In the resultant `data.frame`, the `seq_count` column is the number of raw sequences within each `sample_id` group for the given `gene`. `seq_freq` is the frequency of each `gene` within the given `sample_id`. Below we plot only the IGHV1 abundance by filtering on the `gene` column to only rows containing IGHV1 family genes. We extract the family portion of the gene name using the `getFamily` function. Also, we take advantage of the `sortGenes` function to convert the `gene` column to a factor with gene name lexicographically ordered in the factor levels (`method="name"`) for axis ordering using the `ggplot2` package. Alternatively, we could have ordered the genes by genomic position by passing `method="position"` to `sortGenes`. ```{r, eval=TRUE, warning=FALSE} # Assign sorted levels and subset to IGHV1 ighv1 <- gene %>% mutate(gene=factor(gene, levels=sortGenes(unique(gene), method="name"))) %>% filter(getFamily(gene) == "IGHV1") # Plot V gene usage in the IGHV1 family by sample g1 <- ggplot(ighv1, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("IGHV1 Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g1) ``` Alternatively, usage can be quantified at the allele (`mode="allele"`) or family level (`mode="family"`): ```{r, eval=TRUE, warning=FALSE} # Quantify V family usage by sample family <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="family") # Plot V family usage by sample g2 <- ggplot(family, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("Family Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g2) ``` ## Tabulating gene abundance using additional groupings The `groups` argument to `countGenes` can accept multiple grouping columns and will calculate abundance within each unique combination. In the examples below, groupings will be perform by unique sample and isotype pairs (`groups=c("sample_id", "c_call")`). Furthermore, instead of quantifying abundance by sequence count, we will quantify it by clone count (each clone will be counted only once regardless of how many sequences the clone represents). Clonal criteria are added by passing a value to the `clone` argument of `countGenes` (`clone="clone_id"`). For each clonal group, only the most common allele/gene/family will be considered for counting. ```{r, eval=TRUE, warning=FALSE} # Quantify V family clonal usage by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), clone="clone_id", mode="family") head(family, n=4) ``` The output `data.frame` contains the additional grouping column (`c_call`) along with the `clone_count` and `clone_freq` columns that represent the count of clones for each V family and the frequencies within the given `sample_id` and `c_call` pair, respectively. ```{r, eval=TRUE, warning=FALSE} # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family clonal usage by sample and isotype g3 <- ggplot(family, aes(x=gene, y=clone_freq)) + theme_bw() + ggtitle("Clonal Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g3) ``` Instead of calculating abundance by sequence or clone count, abundance can be calculated using copy numbers for the individual sequences. This is accomplished by passing a copy number column to the `copy` argument (`copy="duplicate_count"`). Specifying both `clone` and `copy` arguments is not meaningful and will result in the `clone` argument being ignored. ```{r, eval=TRUE, warning=FALSE} # Calculate V family copy numbers by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), mode="family", copy="duplicate_count") head(family, n=4) ``` The output `data.frame` includes the `seq_count` and `seq_freq` columns as previously defined, as well as the additional copy number columns `copy_count` and `copy_freq` reflected the summed copy number (`duplicate_count`) for each sequence within the given `gene`, `sample_id` and `c_call`. ```{r, eval=TRUE, warning=FALSE} # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family copy abundance by sample and isotype g4 <- ggplot(family, aes(x=gene, y=copy_freq)) + theme_bw() + ggtitle("Copy Number") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g4) ``` alakazam/inst/doc/Topology-Vignette.pdf0000644000175000017500000104643114137542165020022 0ustar nileshnilesh%PDF-1.5 % 10 0 obj << /Length 1796 /Filter /FlateDecode >> stream xY]o8}WDڗڱ޺"xUIܙ@&OカNtJC5sS<=Dc?걈L oq1II̹p*E}Oszn悆b~̓Яz9 J}[>eQt͙f^ݙI p($9C˴+V 6{;~3;W\U'\rY.3 c=&1`ЈFh'!qc$4a&p!KEv޳f[yS,@fsI$yU?G\(P>̙ G))7euQlӪuBLr{Dq,~Qun٤Mqǵ1d~Śn b_51u<U~OXwxHb6Zz:qJ umӷL(|~DI| <2aL*Ѥ&X5v=ew'x9VPe_SԣH%;ZV(ണzo0!31`tYYW$$as9nyGʅ9gy "iiWMb"El+V~S('IiTkSmX_#eNN:M n[[Zeptԓ_]Xl{TD4>n#K>w3#{r"Er3 ߖ`g> stream xZ[oH~ϯ`x2iJM*U]k_("0َN=s!1.q ؎se9kc k'X]? O.l\m8Cs@ǩL'aadYZ *ʒo'U6lϞ^4atR]]) T#t$BnX+k5O]9$`aBl˕Glxjd*QŹq$~혇BX]'j@& >J,I$N?.m, MB"ǪL& <FUjEuUiNr2[7IvY;fX?]e5pvDQЊ0e++D%Y!,Ng,{a狤2gXEٍ}v$lQ{*O7F v;vm{4|A|eh@p,3R qkbDH8 {n6?G)Sy7q5g\6x{ca6Ȁ<StWL R/nK]RVa2#CP;85avM% MafZ{EcE]'ꥼ3S;6,hw~ELjJk-OB+Pf w9Xo¸0y,)e-(1!(>{yN,Py}Α\8YV 0.*,u_ȶroGtbef ,i(Ldq ,$:̓.d/L UDg!V5 IqxJ6QB.r&/~uweI)pv-&K֚2xNssC |4[jSq4 Mղ- kWT9 ֹ}ulZF=XhtU=K9fIN)e3zLMDޔ1C.i:eaD_4Mnxc)Oш) v-N9VAE5'B[dJ<X}i#/A%#&M_\Tmm=qa~q\-;\}M˱X)s/n921ˑ#Ͽ@+"{xl}_ ~'Iro+9̾d!8w;iX5:fLauOtMl‘79JDn} 549iNCd5g_ a_Nm=;ڻ[ij].nBmw4R`3$~Eiu Ŀx7@c @Y_ϖS6Rh^&=E1=0+9&Pyiߣ) Z?zE(+f 9c۞pZy 0W~k(Ou Z?̫1,p=d2kBvS ۭ~;m P3UEGLM :oTYS,> stream xڥWKoFW΅>884XH 4EAS+D*$ٕDU "c yth2H?DH'q.r5z~fyj:zVH#ܑ*,vZmwUߏTj⺁,mmvqW9}H#Ysbac3yiaU4]LǠt LeqQM_US>uEfgâ':vvUŔch}GE,7ˢ3zELN¶_Xˆ}/ZC:}#%;@gbh`D~oOE`~qJ]xna ˄oA9Œ'Lh9g %lc5uI4͊.0nR{ۮUma-)# ,UЊ9QqނP\eD]qzyxm'}pmaVl:ӥ;O9oJB)=>Jt=gP9ɣɗ L &L1ÕZ&R0+KZԍ/9;ԙɴW<8!wyt%3pT;G~ťw83 p'_6MXhc@ <8qė#ƈp` +VuGsUs۶v{f7qK|4^Mfk/A 9 @*pgfȬ곛oԛC^~x KPg!HǪ.=ΐveg` rB%gzfÆ*`5cPWi^kkiܮR ^>`::)+DU7wm Fh0褕`KDwi^vhL[߹gMc]n,mEւH b_ތit#^nh$"ws^` ࿫a;A'O5W~n-TχEp*ˣ>sh=?ѐl;j;: L[ b\\RO:%Nh0KPķ5 z3;. endstream endobj 28 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Topology-Vignette_files/figure-latex/unnamed-chunk-2-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 44 0 R /BBox [0 0 404 255] /Resources << /XObject << /Im1 45 0 R >>/ProcSet [ /PDF ] >> /Length 33 /Filter /FlateDecode >> stream x+2T0Bkl˥kT endstream endobj 45 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Topology-Vignette_files/figure-latex/unnamed-chunk-2-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 46 0 R /BBox [ 0 0 540 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 47 0 R /F7 48 0 R >> /ExtGState << >> /ColorSpace << /sRGB 49 0 R >> >> /Length 839 /Filter /FlateDecode >> stream xVMOA 1Q;)HTZDǻ&{l;.l\r?5|  ֦[0pXCc W2{4 8o{)!xEC%M; Y%Ơbb jA-{Cf [9)b(6&,5ΉaAnɥBPr03^2&njx9j+[Qlْzny\J|9{.*;ˤ)&e}L|XM `GYNlC%":`` PKD,#'K I(d:=\h Wi.`OQ/PηJպyQJ %!$X!'XOh]v:imV{g '3&9_)hG^;b|}A2}.)nI[UétJ%./Ŏ~Z:ʴHeӏ 1ldXbQ'&0Nޥd~DB}8NϑdޚX#͟Ӧ(' $Y]͕hr%>ґi}zWDH"G*vEp}3R\4}i BdNጥzz ^yN.<*`nw:l^rLn~; endstream endobj 51 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 54 0 obj << /Length 1784 /Filter /FlateDecode >> stream xYmo6_a`1Qv@۵N.`bѶY2$zmw|Qd)l'0(w^ ,'x2;pQO4)a=nvkLFz1t"pol)^}gDڗHde_S*ʾĹ}Uod=*Vi>.bmG;\}~SI d:L C>K̗jUOeoV#5NSeQg!nbt&u h Tf@̿,{8i= k֌qg;HS vR#8dj'ײ#IZ8Kͪ+)#{BL0a>ܣx슿xqx8C0Ɓu.uK~[|x)15hL<*˙6jݹO1FiE[:5q q篎_'#& ū}1!cDtqEf^JuDD#":̺g;F^c x˗2:Q)+Ș4\U突R[K~כ PE7[ 7HB#[J܉r|D8S&D +($._|Aȗ@2ިRjf1,U*{HLa?2XLAւ]ZS8GCQmL-}RI hbmcKOmϦ+a끶>T|IX)[Woyav^`BSݢȲBS|o|0֕&Cd@힪˰IJ%o-hR MP# ǂDDpx2hr*c4azgYn} 3krð}ƂjU}g%}&b 01g8 @2=,xApq\ܑ=k93,9EbZ ճnV%MNns};x{\.kic:c;U ߿ǼNݕ]u#(l4b(H4Le"hd+S1=RCx!< tݘ $>쌻 SV[(rBnEu|W_ŕ>h[Uܪj=gU-w&xL(r8^\09MV43/U7GpLʹkfTG{1}S@P8u=1> stream xZ[oH~ϯ``}ҴUxە*"fl€~\ qlNn[<e|l'Gi]D>|pP¬=svr`|t! `<p2(tQ}3&4cF Sk7Ҟygg61ۺ=ѳ@jIг񼾷>=G d EHLB<ݸܶ?Fo$2 bc؀S>! =}|BwD]W.Lw]dyXXgX3^Q^@]~cFB# ރ2LF.*@a`}o 5,x)O]~G{WLY ޤUuѕ2Qk_vXih5v uJg^9F!ߎ0e`-7"\9f.sXJR2}^ٙ$:?31kX:S 1_ AJBdFBWVԦ*Re, lV&Ҳl" xOIVmIgkH:rQ$InV7Pn*QDeT ,ʄPz展,$G53ɪYe)\SѠ|S"Z3P5An4sQǜKٟi^VVaߔ;k鋮 qSaS Z32Q$ܥՆn#q%"YqfK-0_x5 H/ӥ8^WEah`UZ6.?[y|-K>swVF"2a`Bv ܂^*,ksF'XqP7(.N~jVx*f=Ĭq8Ȏ>Iן2tx@L3A%nhr֘gd呷3!?  ~:v]NT WC*?;񐡾~44Diz zŘο)gַH: RO^ZK~ (b{6RooT\0&%89{H:Do endstream endobj 65 0 obj << /Length 1230 /Filter /FlateDecode >> stream xڭWmo6_!d_$VDRKȶ[}ʊAK,y4~w<ʑd'K!y}sYD2waU{E̞.CI*@]{ؖ(4 ^~ YشGz7<>L;cRk/2B pb#lZ 6``\b2mf UOLkgpjJ kor0$5.:Dudowx8yվ6FVɍJRշqOB^7Ҷz`릾xu9{.״jXFqYY{Pg2lNmHSew4drQ]諱f|\}XYCD vK/WV),4#M>s^)O4h2`>>/ProcSet [ /PDF ] >> /Length 36 /Filter /FlateDecode >> stream x+2T0BC]S]C3\.}\C|@.Zk endstream endobj 71 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Topology-Vignette_files/figure-latex/unnamed-chunk-6-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 72 0 R /BBox [ 0 0 540 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 73 0 R >> /ExtGState << /GS1 74 0 R /GS2 75 0 R /GS3 76 0 R /GS257 77 0 R /GS258 78 0 R >> /ColorSpace << /sRGB 79 0 R >> >> /Length 25249 /Filter /FlateDecode >> stream x]&qz?Q'4j|KSiіػP\JVpIaȬJ3RoO7 Bz[zǷ~ޮj]~N,->7f_Fo?O~.Ww9O~ٻ?}/9]:ʧ8?=woOߥw woo->?%~F{?sS;~$?ߏ~*ߧU{gܕ~[ζks}xwxioo_nq:~{j0"O\z>Ā~w)U=R˳K;~rǗ6(V?﻾ ߌr4W3aWn}}絏skq6bﺶo@n~מ :\U=KG[u#K4u/:kv?kzKK-g_ξqqҗ\/̣/ǽ]Kk~%u~^Gt%q#KJP^~ξqo_{{stEkޏok{=1?kv|c |Ƨ\Ưoȯu4hg+ǡۏ{ڳϾޞv,Ftc7Ft%q#Ks:ǽ]~sf9>%kg_.~\a6o t%]qx}y;4({9Bt8:½2˸G/Dx.l֎}fz?&w);al7½6z?dҸ(;qo_{^{)}Mn%wk;6ct .c@;6brg}Yoo,7q7t|qÎ 47[.lw߽m_{;}=ދݯ[h^z;b Gǽ]~7hdVcvǺ]8xN;iZG#wq_ut7#w=[מ~y/LRoSߏ#Nz~\ޏޏ#N:l{is.v_M;z?o¯u{jd:pm9UD{.l||'}6@\_;[:*g1ĵiRtﴳ6l?gx/K5/|}-^(VkC,#N윅/厱/D8ُ{ڳݿer}c;׷9zc_-;9qٱ_͞X}oƐU7qe]l{?9"%=r))˯==~/sc_w'z}c:^T{g^at{Yg{sy߷M^mq?lx6~kz߷M&z?JheY^sXM1ޏfb@5wu_ۿ(~/c_Uq+@/c%=;)NvncwZ&7h|>~\sL _;tۍS8zzzǸl/ޗ҃rx;w1^Zp<?j9x?b~GO?b~%oo5?=bRUugv,{:½1Lk/F<~oG sE4u}3#tx/~\#Ď~{1=7=W~]HqSho56'G+y /6?o^֔˯}K<.M}g*׮?~es퓯m3;Ƈ|`RNF> AANǃr }y}z;jL8AAg|Of:O?|G]?_ѧ>z'A$I~H˟~O_}6jg^Iی_ʬT|M-c:-1T<:>W2S'~w3^k u-1?㇢xg[63ȴ~zb>'_|V-uv;>~c2#EM4;F߱2]C{Wƥƹ&X (wqOҚuh[y_Ŷ? ~\2A9>k /A߻}Sv3xe$Ff"ϘY#}k$F:HgK?u{w>D߫gT˧Tl GA}Pps Vn@@ޮfeP|xDeξq5ut"ˌt󝏧&f|//X{ak{c5S_/_M+jPz>$}ƾG}woJ}4ǫ?r ;%*x)!rpxD!WמCloS`\"@/oC>_E [YCkvV-u~+mHet|S緆<QP}鸆ޏ0s%| #2*/|/~:2soet\S͗ѽ}f6]\ 7"y[acz?#p/49{`ΗwG9Fxs>n˰_92⺣DI6A*)\H/D)',4I&yQE&!&.ɇQIL "IK-Ӻ}S0ۿ&<%?h|>q8M"I$'Gn'ǃAǿ:www2w#揿o~Wo_o߾ɣ1sS v}۷ok>$s|3#aFے;V/}kĿ+Zf.|ea^|^iOxU[#:Dž|9^޹btf՛xi<؟ [rly~ jzo+?co`$nYƍm #x6ޔ{:Rsqǻ7miG3 &eo|q>x30WqdW#?#^a0f01 yq~aW#䃁G`>a>3/k^_0QZeW8U57JqO7KxrG\ea.ǝ8_{y#Fz/~TQ9&r { <K_::߅:=eMÿt~/9K)܌d>o 8|JS?SV;2Kﱄo=n:?l=,_:Ex|x^p/{^xrx>q'?緰Gzs}^r~Ol{~9"N>-p^{wMgO՟ < XG㥇ÿg"1^Gmd0{Ļnz=ۓ~أ~#G(=3{7¿c(O,ܓd/ њ/ϱ=}_ܾ/=JYzGG| |ڮ*W+!_u>/q~5y}?N1^o|~3ߴYcnו?u8z8ZK5b[o8?qϼ~*~(u)~3O,y{ g"^9_S.&~ m؁Wb_'ۣxw~w()ޝl),Axwإ؀ίY!xdG E$;cgxўx#`͏?cFtG:}٣‚}I5O-ۯQc?٣V52` ,b<_>cdzB5٣^||{ÿdb,2x}=SϷ/~lǻۯx^eyʧLn'{4<٣M>oj$P>e)729` ٣G_H7>Oe:/{ԽgQ8Ż^L x&:O|ƻ ACm3X4O8_/زq 1Q:B>Utu~04YG@Ϳf=j]מ=w ]x7sG;[g3kxz>/קiz~ګbϼ:ͧ=֟Ա쭽ckO{X;?p_/秗召>Uw֞0p>wSO8m>yx_G<3^Oxx̗l8_)8dFSY ώiv<9omۣ|*=G<;8V;8V<<"oa/=KG9x3h?/1j4h4~4~/ϗ]?wџ>>?dd:):q/( ۯ|W =Ϙw|Ȉ﹜)~o|̈ʹ+3o W '|G OYU.V|x=qc9#_78V>op|ȑ/BOk`F8#IJ_g}SD# {KΧro̟+;?W{|g>xp}zn{t3쥓^Gs_\o{4::,ĵG>sw||g>|e=zzWX{gXywX~zI6-?czMkV=<׃Z~/MzG\>ֳxw\/sx՗ڞu'V[s=0|Żz$zcŻ|{9_nĊw+ r~~9?xױ]c/r]~zcŻN<~|/z}@%A|DzG|٣J>c{^/ȏ=jC5!dk>Gch䓈b<'1I1?|QUYߥy{7/|ɿ (d?4(m{)Oܿ4b#"]sŷ@||s ͧK"q~i~DZm{_m{vWSy\tw>׃o_|=oO/Wl> v< "|IbgK:|z'CN[ŗËO9grRO >&.loO|Nc}=GE|҅7|Rwը.Ƀk.<>].Wk?nq.y 5?6RlxwOl)6Y|dKԏ_y O>%lgo >p-ߛeom);|o8یw-_|pKԃ_ܸg'?>q1G}_p:|hO| >'?~X }A.z}Co`)WP1B`GzOz0}/_޿Eos>{zOH|ߡ'1L̷(%GUFY,Qz_D{zKWٸF/z⫝̸8DE{C %CO |q?X驌^Io;o{OVؓsY%^=,A;dF=f76dW[zE穇/rƙ8PxrKt/^C/hg /74OƃKzFlҾ*`xRzJz[Z=>!fs([I%փҋғZ>66 = Cjгz%6χuz~_zzm;v^w8xƮ_:'wSO!re;;wUzhz> =!ۡWV咞{$鿇'szeh'ЛL}P*OzA}D_F9 ?~qRoLϧyWYXdقz1n  b#H܏oro$;<>۲u/_Le-™_c:n w4O1uXr8 B#.*m pŨ*vhor3܅+=F`aj#vJ5F&p+ [|P-ƎP-# k="Z{DTWFWq<af^?"+q9;3d ]X̨6G "3;g5gFdFψ0Y|FTOW8#Y8K$.2b gݱ+Nol`aDBpzc71GZgc:n`\38OhqaF7Ǟɞa^eza{G(9~r{3ⶰg8~۫Of ˌŅWu-W8^ a=Yc%`.<rQ1Ӆ3W7v"օ]p n=2Dp 39G<pVWq thoS8Y+=0[u|ccad$ 0WH8~ 3^HbEP-0W +V+^q@WFqWrB(k\lqQqԣ7Ф҅]qSȱsuD]3+)\akWGWw |\ uAN*\z&# +?Y +pތ `g`dߗLp`+(R`2F|d2۫9 %sE/9OW\_-dLho͈&ʢWJ׶_V2[\hos\\Ȱ_#îF{:ף؛^0FL{ɘ{`2(-;x3;L^g~٢h3G\YRaCU!r_JlM0#_ ,Q\gg$ k0}n ϸ~1R;9[|+~)gG{r+P)|7hRrSr آ׏hq+kE{-[ `=~ĦV`J8'qt}?#pNO㸽\_as{⚟^g=prW{b{~'g{9myR]Ol/׏ S8_O\==xkz6'k{ܟ'K .|b'ĶVҞXqxmE-W{}N<{EO{SF{ᇽ*#=sXaǚ/s>Xʱ5~9w>XF|c5~^3_aϰ|g>ı'DzW3Xʱ;NJڙZ9V|*&NJO+~u.+|cNJ%f/~x+w㸼\Z>Gѱcz{?k=̗:w,︼\/|s||7ϗ||Wϗ||wϗ||ɗϗ||ɷϗ||ϗ||ϗ^0_z|Y/e=cw̗^2_Sz|Y/5󹞳XX/r7{r}NO,s˱㖟\{Y~9w\O{s:N9:o{U~뙎Ӿ>륎V?6zWzzs=yszt//+8׻W wf~f}!PKB?d=!cpn>Ǜт/0$Gl Ґ|F~=!;=_ͧb4{7ԓσ@4ڞt 5=D Go԰~H|(H|F>N|F>R gP[5j)VcEN+|Ŋ֛ ՛/ƊԛOƊoƊӛƊӛ f~Ň۹۹.N>B~^^|@/W+̋oG +z{½^_|H@-W+iwi'>Z>Ɗ+0o 9 ~ ^Z|WX->W_p7r7֢BވBEB^z{xb=*๿QW,_^!Y|h,W`+4o(vgu;{w7/Oޣوz4 5i%;:ho'S W+o| >{^aGz#W쒞+HosGa+x1"S 8Kt%=WL+Iѩ^+Hޤq{mql7 vң 8# [2C+:wH/3ߐfކzƭ 3P>h]Y1FzިL~oGq^LCBTfx~Ǝe BW@zziG+׋BUY@zBVYA@zchɪ/CoVxG9vbl٪+CV3CnzZbGDZbUhzZY!|Fګ; S]zڨ a5BX-*^U#=cq;[hHzI&ꭷdb{1dkƎΡQ[zvyŞ*vl=iSؑ9-b9г6`.:#mecӶJgmcGm\z!2d끛{ $=qs޸ؑ+IŤgfEЭw[C'8~ڌ Wzl魛*07걥6znCi67>F}䆅7)ң{ս^QGzw#=W^롧%[ }Nz}Pz~C OW (p?wHkwoO]o?~Wƈ}Fe=xCgTkS^~<*Q%xCgj {FzAe] Iȉ=~/YaFۏ~]a*9?/atVL=?o_㻿ky!S/F~eO [?n192/>կ>㻄ջr j/:cp>cz!;i3*՗$3Y2ݫ#re>#>㳏Rihg?Oc?UacQ}p~5NnQ [;~no___??h^BQ7foa^TZ1w[gb~_Wz޵Ձї]J@NNCUݿo3x=xcɭ-*?w~;j n>g r>  ҿB3*6|&$>*Y;:xǧtM_ZrHUOD뷉;;>D%pY?Ȍ{c?{Y_gwR-]$anc|M>?ϿGfNU >/]>Gs=|L@'7+ _W_}O;#w?i;U,c俿B'kDב)TR`GqY\AM-VcGbZ:’d̵Pd͵` Z0I7dq]m+Cgzۂz%Ղ-hj.F,d2\Qkv56(3Qc5.ؑǵyj5W'_,xάNK@5/~JB5LD5/L"GuA!.HרNP2$ص`q&7kK+ ^-ڥ`eƎScÂu9 KcBcu&'- 1ը\[Tj_f2ЫWZUYc&O{BP'W .Z}7_,*,fל[ˋ}-(ĭZb^FjFVU/ hoF\69U3Zlr h¶5'-x͖tFᖽuƆ{-{jV7!!gZaQRĂ|3V>["XAnQ<#!\UȏloLƪmmȖlk_&U1AiN,dReY>(q-ˁgk Iyq BsԂEjQ?Tr !ebߤ Gb IM.3('-,;; sRfH rՍ35-!g<"V b+ 2J[iX_}|Rk]AN`f8_(5=`Q5ڼ,%bo _b+ "-b#}2G-!`3XZ1_+,yʭ>&7Z[ԟlQ>bQ>bQ ?3ePƋ؊U-vv}XlQy*hd^Ͱ oh+jŽԫP}Յ^ks6/LkvfC6zAиY쭕kB _=,p­FX 8eoAamX4-xUs9DYp4JX՜+jFlWI[@Rj]qt+`UUsR]aTs ɂ^ i8(Pjݍ9 Zwc^U ׎_bjjz'ׂ9OzGtc^PyMҀz{=6L`~1/~{lWUPVzlZPʤޢyzrA"}#|ǾTwQzٓ{AokHu,Sc e@@aH]ɮ]s lcc܂P޺d؊D^b D\kȹc 0)8ט kLՏqcq=,؟v*^{l]#[ k`t5@xSfb 9v-umB\`JjSLc͂v$u5It5 i,5-VXq]\HvɨTbljzliV7n*|z ,HQac8רH^W:-x~?sz#K˽F ETԨ֦2ikT2F5*&S#G\Zhۨڂ9nuH#dҍkT0zh[;\61's6z#\s --+#v "Ƽ+ȨA`1רkT=m| qƼ": -HAPkT={$-]+N#vغ|\툹F{ \?`6 XLq.>kTG51/XͷNZp %M|R H5ȗýF]pc^9 悷es?h kTPG5*1kTU|$#)֨BĨ]"+<3}\"Fwm~zn5V1ר f5*>LOӦǂ4|icZҶTk M6U?fQ_8Y㌹J] hx@\K *5 NqGp6Ƃ}m[m0.dWm*\ƌFk\b/^Y la!-9G1Gfr\&̘k,x Injl 1h>D^Wf5*1רKf*Do{,ù`[n\"1ר$̘kT$4flNU{YUFfl}댝**3^Ѷxϴȃޙ39r5s1G`\cA\ۣkH+ pV/6R&wׁ;b݅)^nաYiWL;*; ~mWL<* `kxZrXw-ڿWoXPr}ҕi_u~W_]C-܁{_4ͫaU抹 [k~鹅Gbp-3JS,{ lss+&& ՅPsh\zXح?:WV~_1?WLP*W_ <ϛqŦ~b_1MT\1Oqu5P t9_0=pXBK&+-K-pi2~uzR:6JpI ʂ-\{ *ph^_+\d)iꂬHfEٕqWƔbS[jPISޔrx#,,ܢ[ܯ<F=IȠ9ڿ)T[Or.l=g<F#i>3j&ϝj&| h?o AuM/[xFI1isa<k~Gn6/E{ߌS}ߛ}z_nl9||||p?'^[ckCvfύ{o exiȏԸ{[k7ajCٓ7j/#5Ͱ#Ѣn[c}q?マIQ({8~dǏA/6M7$di+?3-? hi˅O ?fY e}?U`T*p O#Yq:3tݎw -G|yW,q>^n}w|zOw|PM kfHj*G)&z̪@DҐkitOSFSWnb-KjkĬ7 즦\qTPsLyGia;% ^ ;+J/֞|0dXvVRZPIItJJJ(bJŰư5GqV$a9ѻD%ZD{IZþkJLJ𒱠+9l(.}'Witw$-P"KJw[ݛDۍ;"P" Sݰ}?7ԟQ߰6 m-*iYɵ`niIPL 3 *2-vh)ĐBdQ kZd1c߬CZ7 c'Z1D+Z2SFJ^ZT2d3kAʠrZ"DK]RVZ3ԭe2C E4ï%6RPgHjyΐ!ҞD ϴ,hxwZ440hhil-G2Z4Ri(NJˠԧI ujHdjPeH˯g $C-Z5 kH jQPOGKƆ:ZP6r  ETm`i!PYC <+-rtC.-RZ|7 bbWk JѲ4i0u%PFTtCzFdCmQl:tC[Y$#@(/D4K}ѡA@EɛQ~D~9?^{#zդ##MK,KG Q\:=B3Qk:8Z"tp,ZNOi(=\?qk#gk!z[$Rǚ(LlNܢ?u}:b'Q:֦E0]ul8"RV`A*BW3_t`zDpm"u zsF~AޜFQQo=q"u8D: t!g%#H9:8Z"u0lE`A(E#&!(eDP&WR6VHZ*&;0D(rV B&١}l4юTHvRӎymS;r"vdDmH:IO ZlGَ ( ,n;mD&;,wDh$cSldzq9^cq9ĭmbPyU.6)z J2[n2CT표nM1[{ @ Q4"4@%9ծ}}rH,$JKQE D??II<`xV!.xn-xcXQ܈Br#V6ce8XВx  d'yn% d$-g& ?BR':he 'IP0 ^[,pWRz g u*\n |d"(K:4PV¢LDI %Yq;܉U$ZfnTbT}bKƜ-ؒhu|p-y *5rҰbu%+c0Ζ/k[FO'ZAr%u|J(1j8Zc$ :{4$:sI:J>KءlDP^4杺ȘkEjRǎ_d|({"'mf.2 >%جLNƱ~v̋% / wӖv#+9j)SIY;F ]{rW"َ:Tv v l;is;Ư Y%5x"~ KvbIWذ)a*1A#F_5{;?T3&zd8F]V+άBxCY6!®Q=RlW MW/01'lBr'^ۂm3kef|L,mG 3+r"Ď>5RͲZ|mfIV3ZB1%R/.k,U3hhԙՄ/$j"Nhr`v7\m.Ynb+5.]dqIc Z:dx 2S0냲8y"yj(}A?S"@lZ0ks K_~e/X'4+.d[8/|Q-y^JnK*w~A\Բr ]݇ԙZ/c[q[mQ*G+ZL#XZEA/#U/|Az.[lpnk^q[gikە%[l8)k|bJ?#eUXGYRbVY^E Bq6zͼꅜ]3v{a D7^p-ڸEiԄfH_!! .mu!EeU'5*,mlw~-vKp-6DH I TZatM_šhL`q[od,*&Tޜ"m8:0c8~­z>`.H[ole+Y๹ M1zgeXNz'  }%`j]H㲢T@Z=q"mQ6\y٢37R$!ز;LJL z':J ՚M+=`Zo$,Xlr0)5g 8AХ!Õ!U"tpz'̍-}'8b3މrts띨?T z'd,6Hk#Nh[M~W5Ae :aGNX., z',9t띦U-.uĒ0 caf$z/Ozgz욖CI0 )|(1#a]UBi3 .##!cww%ieyX'X0CKfy3ɅZ8Jӗ?3=vGHvύ.ذB{l8:q+Z̬=aJO#eG1'bƸEn"(=%]3nn2ִzlUĚYe7􈽹JюոGW"H.0[4}wFrǞ@@7Ѽ R=VH3*hx`*k^3­Jd,ͮ<p 1 Žp.(#&Hpi3$#fٝeLXFޫ|ռ% ]G 5 Vi3~XlZ1"^8O띡?MwS{g̛Fl!AOW{g< OG;qone`KB[ECG( m.OEFެ4"Pԏ1<Ϡ(= 4ntYd9aPԈ;="H{ :gOG,2zXo @`(G+8I%6Ztp#1!W0"Θ&*);ՌYr+(Y"7:HmhnբZtpU6ĵSGWN|w5| +ɢQ|fpu؆ %v盌aiسr0bh : .cf{tpQ9KlNzS[ l>kFh-:X@ $,yh]v@m0,yTh{gcK!0t/ytc|e{ y8&mzr^w{NM1-4ģ<<>WLOwPV/dT">6A*.㈘|BD]ted{46d[2`0F2˶mc5Ge%(KiqQf2FɌ(s4dd;e22YN٫,}d!#Ѧz.#`ee?2!Iِ lHR${ 6m2([ҦX{L*nQ~lɮ8\e]n]f2'ʘL"v/.3&㔙+'7uJLBVY 5,8BdTQ|$pf4Q|O{Zn*eS!#eM+e:N.S*@I\nrLdvZkw}IrӽQ=AuYm:)S-AgcRVjq|R:!cBž.!S?䐹 ۦdq22e\"/ܯ*&~RM`a` Lhg</#CL+'bE7la *ߟW|zrO =U?}oS# Z) W5*K}xBojJ+xxxr nIl]Uc٫J{,{Vie?a2#|ʲwck{]XnQiOiO@W-dCﰡe?m-dDNt?o-d%G8Og<8~43EN m/5ӊ쎷Zke%[>xY^cx1^VMNw< ~o6ʬ6NJW[3v-q3o(M} [9YOe7#FYvۛƧrg;FCxZ%c=[AcYo'm7iGeWeg-3/ o|ۢT'|oߚ|p~9~ى0οk{r<w:%hϣ4N`~tti}<=%?`ǃZ4{<}4t?|J4-G)vp^zg$RtYOeb9򑔆g2 mޝf)@%ީrнv"6fGk1;EBiŞ>VTwg- % q,+% QK|IBK2\5RHJ uRݲcaWK0@Sݬ=ŝ Ɨ `ZT*TƒSA]@-H,kt[RWl2"Z>MKlGZ幂g-ޕsstЎZ,X֢aEK?-8lϠ+{)[+i@ceuX$er-.skA"-lΧY7mG [ zCl%5XP.\W8l{@Ƭe%X/%%r kyh񽀆yd}x,ss,-/X7%p;܊޹TҼ - d"9H8D(XA`/DA.rEFԋUČ22Qh6 BH)i!%KQJVf Ht޺6ǝi!v3C g!(booXS<ÊzHj8|e RDmzѭ7)A"JئKz#ԑ5%d d$9$l Kbن5bo6]Ά\ג6DA6d%)mHIpڰ> 9jrĪڭwuU>,bI۰*l+u]\q}ܶv,([J۰h.aoK~r͓SͶ% H KY[ReE2$dB5DPBiv4}]XJ1L~Ÿⷎg8,g}:~q7}7O:ꙅ+ɉ^_{g|㥃]KskY)g]>Xe븸D^D*EwZqu꣎3-%q}u~ S ׂ>[H:ZY[B},m33j]ݠ{X.3uϸ Pٙ=f>S*ҽ6 &~k$swǭ>\vu۟qsԽjǟnZ=>& w7?ܽZB}BC|6 OH|2 B|!1A~r1W+L]>6?|L> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 84 0 obj << /Length 2062 /Filter /FlateDecode >> stream xXm6_a@EKݥ{= >E K\[W[2$9ᐲ&]9$3<3/qW߉t!8y.`0b tF,WJ,W2%{ii8j=~ETO`:Sv/NH"W2MYpY4P u}H5a_7^æ7]qӨ2=[XDZf*,@\$,%P 2ў@'ZUݙrp洷ҿ F8-#uJ zn"b͝? 昞Viۛyn\3lź9pwec;N}l|yaXTf~bmOcO{?L(Kܰ.NIߌzh ePzτj̕/+ L5u}>GQ -=r׵c˅N!i$~;,P' lr} mo㺗u3|{K`ws0WVvF?' `d^a(9ƒPÞ vt\1˥08lT¨{"ue:~D skV%2Ƒ{s*gIî(z8\akQ$CgAl}hQv֩l4EOf& L,LkL)iYۍԫƣ^{E)1c?__I^FdXèzjydZ롶Db3\x$ 7leOmB2f/\62 _ͯ Mg{,rta/6X8.cCuDI˫p9zL߂S?)[r\PyxX&Xogb(J P wA. ̣8^C>6FUkR sUa]M5J&Iln_  EHv'OBPHl.@(-XN4N,4* gpYz|*Jl83M ̓ULfYKhG0QN h_8*'~QLYA_,]$Q*r3~L4=H#/N~X -ߍTyx]oR3oOA`-غm ˊȳwMH)UE7xhǭӌ?);Y늵l6ѕcHi;{IN*ڴSD43ȗ/ȁ)MbWf4G-nj;V.@g jW삡FtqCEGGRvJW5z2$fuѹ{HpƐCBH3|J8}$X3b_d|"iVDVg0^ٷҍ~lUpzsr$=(wc~j0x?;.ƐG~0f wC=͗cl̾&ӈ6!K5"` n^J%ô5 endstream endobj 92 0 obj << /Length 1752 /Filter /FlateDecode >> stream xXK6WE\$QE@nM) L,ɑl;ál" ypy xz/iYÏc·ד?"R` tq E1l^L?J+?xl]ݳN~pD"Hd#|0 mtS8Sz7S37sj(h)(3\]5U"j5$ jADg#퇩᫗-:C$CweBb & %:_[ێ涚JquYeU ^::n͊lf+5~JW~-Zڭ3AてMm|e*8J7w&",mmak,JŤ\ yK ma)hǦ3efՙwTt/l/),n5^`A+흥xC̈́ ;ۺ$Yk7I‰5MF@lS Vw?h 2"Y'5iĴ;w*e h'BTrp #N0)t wK3VN1 {Ra[pD{׃H) #Z&(d=^ܞc4 37ݺ˳4}2rNRf Asuu3ᲩKO`+O'$,B#: ̯ã&rHKMѮ1kGbNYOT{$dS"pk")}h-,SHUXPZm #;Evp1:=Qz Xh;jCsLh=kVnET˪c$o؅QaVG(BM#SIIqӼ |:dnBbW]b0zq. jゎhEH,jVXp.llO#L}=ZBzpVٗ[y: L8v缘\R;{9w2I/WM]yU~6x;Oz8xM]wOS_&O^8!7E4&9`'( زJ7N[p1#YA^.cD8w=k3K /y E˭|D?nBќsm4$ Q4s7'n x_2Fh&(X?R[!e=Oê9%֝a 02KvE 3J^_]cHlgI/ظ]Ka<)Bhz><*NE;'Z!>o4wp׷,`` tտXU8Bd}xw;!J |z}#druk'q9l;P6o~{G?49y5xTE3[Z[X*()gF[.Ts endstream endobj 89 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Topology-Vignette_files/figure-latex/unnamed-chunk-10-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 97 0 R /BBox [0 0 525 278] /Resources << /XObject << /Im1 98 0 R >>/ProcSet [ /PDF ] >> /Length 33 /Filter /FlateDecode >> stream x+2T0BC]SJ5Tp T endstream endobj 98 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Topology-Vignette_files/figure-latex/unnamed-chunk-10-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 99 0 R /BBox [ 0 0 540 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 100 0 R /F3 101 0 R >> /ExtGState << >> /ColorSpace << /sRGB 102 0 R >> >> /Length 1814 /Filter /FlateDecode >> stream xOo7<&${kMmm 4Q)w8]|$+ |$ ꥲk~?Em A{*Y]V7k^}sSve1gWaE-T+U!r`ĊHKe`y@,X,YbLcGc4v4LcGz;ҳd푞 Iu4|$4~u$Z3C}+$)kDC$@j;PہD&%p($ԶX=@m : L#X^g$9 ŹG4G4GƴlP,e\ٱ2EEdUgP)zWGYVKټQF_rECvGj$I#lW] uiSO/O.s3k9@fF!&Q~%gf6cK/! νlf3+f}xY;Y'djbd]$>Glc}.Ebb}Ec310ؿL 0v/ؼL 0>ķc3q-شc3,رL 0>ݪ˚Y^Xiĩc3)"Tq)EQEV`je'0%_))DmnL0fǟv?yp[ ͮwWڄ)O)8Y넲7or޼Mڠ;#M<zO2{eoPi<}$P(2PہDR.Pd%Pk.`9'- :ihCym5@XY08O Bi< D(DDjK{Fj;P!`H$ j2a-Ph-P`-P`-R`TǮ2;vIcnӹo8x|=!ccܪ`j}&{Z1`g`Vgd`lc`a}&Xf``^xl[Wsg[mv-شc3,2<6l1`ƬfVEںg*ly:Yq#e:1'rPp^ޏNח^lު:5w*izh^\׏~zGoo_U/~ur^=[ȳKmNQHN|e;q[&]ѫ^$Sx쏏BPFNmy҉oiSYgo1 l޶ffj,q.Wz&J118q(=/gd)d^䢷|jbƩU ੢ݻrͼUftD;LF+NgJh Lp89#Xx0oX~-;)s/^~k7;?u endstream endobj 104 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 108 0 obj << /Length 1169 /Filter /FlateDecode >> stream xڽWYoH ~9u4 hS] -YtUG_C&v ֈɏ7C Yk Y3_]ZaϪA:\_,f[! XY8@nG^"K_50OϣHA$,;<upm3κDLAp /"HA|<86h_-$`R S`9wQ+hiַщ"m-EfqY7znEEFmZ$蔩 8FǨ".*J!5Q(6YݘvzCr(mbB뤉*ir[ P#IҦR'䓣AV 3bqdˤy3 UG^)^qf;oa|n;x88./>\<$D8=DE]~IE Q+P ݊U{.WZxu=~{Muzё?lw1&"W4j0v[jɁjT1an5Kp8˂p  nXaS+g@tDTBb-UYRA>Km2;%ID /0b[ >MPb]kFEl+ ,밮5EWVXW-iUq'%6 ,+ ˶~G[ Ѹs1brNk][um( 0.}|h`|u[opP9 N&"ѷҨOBȕZOFX1Fu:XmӔ)n{f Ř<+5徸ON}-*m*{z&`F]oy|`4dvuU Nw'OE'ăèx%zsL s'wie&ߙMVyClÝn7Vftt{Z߼6 !c32{ra4(6V(v ;v)^t#':]vz'+4<(Lw+\lτG }>B^Ȗ@ymfeP.@p6.@޿s~142 ߖg z6XG^zW>ïѿUggV}GK|j1;n8 ү endstream endobj 105 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Topology-Vignette_files/figure-latex/unnamed-chunk-13-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 112 0 R /BBox [0 0 530 276] /Resources << /XObject << /Im1 113 0 R >>/ProcSet [ /PDF ] >> /Length 35 /Filter /FlateDecode >> stream x+2T0BC]S]s\.}\C|@.T endstream endobj 113 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Topology-Vignette_files/figure-latex/unnamed-chunk-13-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 114 0 R /BBox [ 0 0 540 288] /Resources << /ProcSet [/PDF/Text] /Font << /F2 115 0 R /F3 116 0 R >> /ExtGState << >> /ColorSpace << /sRGB 117 0 R >> >> /Length 1138 /Filter /FlateDecode >> stream xMo6@<6N11Z== $ڭ7E9JY'R93o3__/qA&  ݥ /7_tx3j9 mBL+FS U3D܁,%eU8v lP:)Yaz(^΃D4]" h0ZpZ.RSƙ3T5Β[vX@6T-NʼnCĀLj`81iq ETc-8͐8KP8=&pv6>HZ>zZ>ypZ>#m}qT4X-T-`hqV8+Xjqi0$Z!vXH6!jgE(ZJ&KD ?oߍ5k d!*mCvܤ&F\6:&ʣӖyLGcVŞ(.4ayj7g"be&"vXe"M&3c2cɌ-&3ºd Lf,0D6Kfl/dKfl.dRXזZ2ciltXY2ccɌ%3XW2c[Ɍe%3vXU"M.*dƚ[Jf,)dƊjGPrG\;O Px&?r_mRıq>Z~Q7^-)t 1+tV ahcQ\w?t¬ ?5?<ځNm O}# l:]pAf' O-G{[>5<$ħO!f\Wrnz}?[>ԳM]vvE_ն+TˮG?5besdm%O6,YHzG$%zћ}1_pnI!l\P!.87+TyƧd\O'$Q)')ܚDG:Snʹv(Kkg<6Ij;Nt}h4}^qygng6~~s2ֵ.?\Ϸ7A~~s?/{J~‰ endstream endobj 119 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 807 /Length 2184 /Filter /FlateDecode >> stream xZmo_..徿;hHFuJ("9\.yvvf)I24Ӓ&ac#YgY`^&% 1X@ZEHdd8ȤPi@9Gp2@?3fldY@3㙌C@TD`J4ƵLc\H\bFej` \I5pA_e Thp*g&yq+p1 =J=?D@spYW* gԨ{+,3-郼S1iADsDeyh8+HZQwCӴ(eqኇA D PłFŖ9+i3H$9D - R#XyE(ܓV4:^x8HZCAÊLx$JHWeu<BTEd,=ed;6',=.KOxg,]IzX|TM$I/b~.o9!Q]&@=F%Ԝc{҄n] u{QK%SUR>'r'|29}Ur>FeH.Dcä 9蘥gm7E=*-X)˵I:ѹFOC (z+OoҦhY/WYqA#/0$ϪO0f8ʪ:.*FSQ}ޗ.$>hS8G~ b?ervSL6#L15̢}lڥLd_rdcYu33e!8d^oed}Q 䄽7Eo~UYf.mx<4F2I BF˦y`K^,Iߌze]I;hmg0lt!4xٚf+lѴX=>*rE'MhÃKU>ȯ*$K0:$YoVifëA~VŠì7)GI D^ L1-)GYWs=l kofl2Y(27g|m҈[Or!d'̠bћNWrNE;{~PRnLxNf3uYow+vj l`,bM|"m)܆'is+9JX.aR6')aonƬL.z˶*cQV)PRuÄۉic0ncUھ[9I/)~aF^tjV`{4"w'0՝Oz]gyhC'7Sǽ{U.һ;Q?`HVr!m'L[;QntUtFYjiT,Z8%&mӖYڢv[8Ss%q8*{l'wA>;eQ_!PsKMF͐15jrj.t7%CMQZ6*ꦠfDu{ eeWk 7q1⋹)5a~ҘVl3v[ꉞ>~utM`E⛺{jN)slF +5Mkl x-!t\/lt[kW#9':ӏ,_?hDa`WD;. \-B4P5'"Ӣrs CEgX,9Rr+r!=]pQҏ5uX5Xzn> stream xڴeT6wwwwwNpwSkqw"Ž/V9g3޿H\S5\N2F(>*1;%@ ,̼yU{ 39Bhj7q\JfVff t~WL @Wu/G /`j,A@w1G/gkK+?1D-51up Ew50ZY,@m@JUICY=qSSא(K) 5?@;KzOw? ":,L`]nj`W#/+%_ԭ]ζ3Wa@tOKf@ JR;]Mbmp+_{k+d2{7t5qus%{ͩ&9;ɡ/|Lq::8{1Tۂ<@>+[# (#",f 4bI#f#~/#gm| n@?*!p̭\߇} ]d[_k?_};@ &EagO.I7;;E{ LLR?]$=֮fVWoЋ,Kgٽc0s}lA@na `V֠qHd`n rpLMg>@Ͽrp}w8,4$G70g7z)qTLjA&#w? n{#ff? ?w$OwvYyy8p|O^ =_;kG3g^VsuvjYa`lY39I-* ``p2s3fc/_忎s&@Oڲ_MzKXDl4yl"Zl'x.)P(-0A^?5TMe՞R=sk"gO"!2ɨXMJs"[S>ՑA И8ye~CN#կȇ(^dit\E"Xw}{Č1Y]0.ÞqAӥK/P7jY>6#$W!ixceBV'9"3E Oe?ح7ZÈhY-}6"T?6% 90TYE[\_Q@}#̾t[d(T!S c-ŜZDz`cG YGVvOɣTq:#}s6aт^xX L+[W Ł*HMC( _\Fe۹?h%[l`='~1V9ؔ^ɵ6rՉ= K]0ۘ)!S.s5܆ADF{+=:ep4(gӥ /q|wBhޔ#ݼ. krlbcӯʠ~|v7gS aV/ [g)wa;JnU?|gةG:콗9̃Ssҟ"}l#_#M^-U2)[, ]^Uv|I]M\kOL9R,kjF<Vf,X>8(v}{'6)!T_7=^,fTkFgs'}"t0ii45I)9Ɏ)>u1|;@to9 n(,dp(61!pZKڪ 0LP9b ?zf543f}|)NmaCrrN?I#Mo 5na oԶ7u9ƫďVGvGhjPԋ]\㋭H$,]hkެ|x!D,R{B*5ÎA 1M@a~]ү1/S}iHV 7IKϋ'geA(d[V@=}"jJ){9D%;.8Gv>vܛ'@F[G+GM$ƬdQp:ZP"bE;`,es2!N?/'A߇ S3)B/ !ؕ~X2y*si-V0jOŽ:ǭtqYcK/a4{¦{IS,%UPi;O^_Qn$ Oֆ b- [ʬW\{ 6}xs8Ҥ=NI)X[o &:D~u1y6~D\'I册Q]5۾z|qh zi֑%o"L{&E`-:q (řq1*g1yx>(A-H&n쩳6nYk=lVEc*Z؅9LFď$,pΫW>.?&[W)bAlՂ~ ms4;5{ dl5,B?b };Iu̠նX]?sR[v$u5Bk۪p:vvv6xCmQ=4@j^􈡆̤DhٳM5:.6_$QW q~fWpӆDٹqZ[??э:[V{ |*msKG+qYʃ}Hz1SF1MNSTG4dUpJR?oMb6<ȑhTs{6e}&=IE#O~ԟ9He"~w;,:I/ZsMQkͣ,e *sGqݳVc~ lɤ? 3%կ4X@f&2ha ~*6K%O] [8͚9MSnhdLv b DNS,npjQu"z4ujk@큋A{̱rƥ:59Z7R "8R#Dу֬ G!⼾'?[:T,:8wK%<8` JJËPk ֐%r?J~!P @vj"f5V} L'K2Èu.gHb#hֵ( hZv h(C%:#9a]`"*T;wi*{&1R+Ʃ= bTZm +F朇t_ps?|e Fʐ%b$p&5r=#rfr@S|3=Þ[xp720I*e_Bf~pqPA$ 5 k*yt>:#Jg^[nx̵zY'R0`EF z Wq:xU09~\|٭`h{+rٹwK4 {h2#׸;H^PEu F}6 @#6q }$FM* if.jW|iAZ6EpDnQ8e'ǦxЉ.Wq"`TYH"\}cQPlD<' (YuKq9'R<4t?I ^؍*_ȨKr nQ/()I=^ا >aJ'Źqe<c!f 'i: E~*bLtb{j$ޭk8W4=/3A @'[x]R=iMk)Q_z"u} J-AAX!a!)H};: LC= RqT5 nI j+ȨR |눚}^=c0l+a(Nۧ4F˻Yo0f!i3;&,WvVIEU'`бiՐfjQ-4#{~ 1,X.-eILƨ.qq;l_$#%JqJqRhM7BFb]/LdxWЂw UayD{^ޫSH l19&?vMGhJP?Y{=Za>yG3d^Cxg} ,{N,˰N\?}KG\e-/ w"Ӈ>l3Mk؊#ܩx d6K <.j'[?ɿZ >Waf7m_YwtOkJ8GyD?AɃ˜ujL.N$$lgM>uˏ"U4&: <]¡CK4,Ē{0DwDzL瘼z+|;yH[/$0x`˅ZM f%sv`DMk;F&e븓_4hsȯ q ?XUE>|b}fY}p,4}+LݼW/pg9ȗzM).M$g9MERq _hZW?ZC`,¡,AܬS J[2MU~\Ue;cZշJ<T t, ;Zsٹ~.ʪaQLRX`oǒ)ůPK2 BUD+_ +0~n >lsQgAM9_qdGTÇAMbc)˝!AzL$~u8BsFSÔ8 /uLRBUs+C!:\+ ̟&sJLm^fS-GΫEg!!="[/J|ԡXbN'fag%K^fZ1)_tM 8Vt#~xERO!mİÇ+Hȉ5Nه-#nݙ(4l1"i"jπͣz<<ȩReh *VdBX>#!OЏ.6@(u£T!/zw/ m5wpHJAiJeҀ,Q鲘i3 T"&ǥ/c\yG"Zl\$\.Er@SnKl-_8[xXJF4c7Teڠel>oexBd?G#7cb X%oli/ !]%odɓ 6{oόEٰ'0Yzg2Lnj7U^""6x i',n.GĦ`Q}bhq%bXFi| N:tƖvDkR!9hszmjB 3m5ASga(lZ>ݳ륻,2aO`{F+;18fA0ҟ.R }Rq6ݹ"8@#lwg}ػeacbf#0_Q} G3}lgZm5TL]Qc6R;i?t,/}nj%!2%j{A/qG}]]]U!5 z=:"$p1g?/|0:Tpbuthzw >v q NJdL  !ODM& HCzSK_aBVj)F-pTM?j;"D([^+Fޤ?9ZK  > asy>KMl@R5:el4GpքSmDyR{Z)^dݲo,kհhSu75QBy9NG8?=a[q.! QLL I+1䥇){>4{0Qo=r8bmg :r^kHV"N.:Vf#Xo$؋ jRE.İ OzIxDzkb~*:rp{6 ƥ*oV o#0o!;pԂ<qf*}>}07n,oLKOoQip,.ݙn(a!`aZ ە-cDV8 |wef1&c _R0f2BXS 8xPF#:u.Q70a#dШtb=-z3q([ GTs~%f1I6[?沧UP^u2jFM IBMXǑNTRh"`a`cf/cXgS h=y$X-$崬jN[jnO*aM>spN ;c2 YT C@*h X;~7(R(\8a@ofA1u+Y tɋ1K }!:vs,E ;/ula5Q3böoW32nņM1bȬFY鎕w^/hс&cМU{|"+-c%5 Ųnp/&'@u~y|2,}l_4CX02ʃ*FyK@ Y"a$uJw8Njxr@!.4f WzY۾ Z5 ʌb ˊ@˚rfM T+X }SìN.PV$r򊄩F5 ʘhwe&*ťꄪiёA  i/8"⮿C뱌c~a :#vɿ %zz*\ LJ 8DƉ46ɦWl. CPt-?wD `|6Ѐ1kƓ* Ϙ G InQ=}'D|&Eft O#wo2K|̼ 4@w/d,^ WQ^2&,\×.>$9^˱HYqVvbbQGY+vU݌U]"d347&w{w2[Lr7D4IڡlƌZ!^-\P\JJ[Wg\-U$(>zZ;hAgjDR6Nc5٥y+D]CyS&zʃ&3 h5/Dу4z$pąf1 V>J<Й/J]:75+"wCY ;M,53o]ˠ&ןX9fͷwF㓞9UAH$21q}[euLG,\6VBz[06yʔ(QO>KBy q_h. 4 ]{,bQnjI޹nkUMkbfLșjbwӘ( CCهg!.Whh[?A5P:ܵ i^L@'pͭ ntֵ@sǯ<<3:pnsNDë}(zTYf3y{Q/`,1RV{ N`4_.C{ʢ=R@*O/ (;QU-w}8,^:i"^]TM$:  ތ{$gnœ]_+W^qg(?㮋ŁȉVfd3FVN1{<ǂgR@ceKt\L6AUNQ4+JAtK-p(S496BdOR91+u[9PwmG%~$>_:1<ًD=+ȱj(fm${msH  )ydqG7z>j4@͇exDf|[TE:0j"OߚVX^`{]A>fO$u}GC=7Kh>EeLErVw|W- %QIM7JOUQI؉ff?Tߜۮzȹ|ʺX^'AOxpKfXz} aUԭIБ*1}]ˮpo𨺼kāGɮ;1琘ZwsBIuAV$FH47U:ssjjoV৴"3v89' AO!.q]m%a%b7uKkoK4]cIeuw$R؟0oYvH[o1gt~UjjvIjuMb#[Ds"B~ WUn)TIFf}tp|6<MިMhxdy_?ϿR(E5po#F3zbQFQ|Kڈ`&-ՙDa|V9+X鴅|3QW20c!^n_%dRJw}`WZ v6BũSC%;|T&/p t>̵b[~:%~3  D.*tq5Y˺!SHH0ORgv]!Wu SZ5) 0NHe.ЉCs'IjNU\YCD2OXf7d$KG1=G%ҐY|x@σRw +AVG~g$gŠR 8*|ɜ) M8|7+y(W$M.C!cꬁ( 7^. >'J+GVNm*edUD~@R8wZ 9T92 zt%>dm'Ϙ`hZ`L-V% ;5#wZgIˣ'.B1"wbO ;cwkN6鲍R$NR*Cic;b/1UOP m Z,pNq!mZZ:s8Zۍ1YZ~\iQ+aw]Kg֨Jԡ(ۀŔ5NLY*U%/HlrjQA g=MS)|vρٹgɜPi!iuIF4.2:u`qXY?Ĝ_u0x"3*3| $RgҙEQ*glҾb(Zݞ\hG^ƺ@ű;WP#NmT sZi 0ee]q6(v`Jta ?=8"q?j\l:1Uҭp ,#%R*MME> o)Br9]mW>%< zWһXc J2r㨆?otxo 6],9E~5 GKl6WxW=nM$FE-]ɫ2gA R$nE%6Qy S\Oa[-W:fNm RdL[L>A7f17d#!bkgM"3]qS;[GCt1A䣠eӆfT̯}r& V bg1?nsז~saѴJ&#.{uѪ?VѾ '07$Eq(v9˖\|+U-$K)$MOUk #` $h$ņ~31^:)U< kA}#ρl>tH*=7 =(m¾0"AU}ց:Ic\Ml S^,i=سD=s[*IHa rc oËC;<, VμvɈ ̤}X%)̶d>*yxV:DipnlPBtm{q!*\c׵q.U005, ZQ :0foiXL[$q!Gu]!23 .]$Fn54)Cٖj1&(4n&\ 8OqBgC"&e?x6.0`plP.C\ӣܳ(4ɪ^exœ=3WP78$My+RJ_¢ޓ/.z<7>[ Rӟ?bx?215akƌP*}%}`ϸ!  4. qۇKxOXmL0&NPdv.=7!Qcvﰬ-UY/, GO%46'\oj^E n'}~pVSVl;c';/b%:TͰ Ouq%[==bg@G?g$վLBozfyvӼ}ڙd;xWgm:Goqc1)u ^LmOp["MuZ(pC%OaXyVT~W987mu( ljC*n8\j/3zܮK vn l)F:qlqQ\^^s;I'>3UgG'( /J&،|e6hrS2 ʷ^%OC6Vy+[ *Aɕ}* qnf&V=?>rfqN/bq8:$BưTx5'6kKl xQAa%G X}^8(Ͳs@'?ՅWN3V<\Y1vRY"OXMu"COȉOS3*F#=Rw&?/1b$N yRxRk,C,E%0tߝ(Q^TeaP~ }؈qO(~ăA)iXdb_ɱ )wHh}X)2<+T6d !Yd8%f%| .2 vk;^oGy]8bnk0{NmB <0 ١$Ui[41%b,6tCn̷QZ\( } d c@dZScǕb͸lʭS=\G{W.BY ~$- 1T%VSծ0חa'Lӌq=j35|NM9N*畹EdH `a>U d"vwy=q#^tkſL($*JrG4WA>Ib3mb)E^&9%~TjC*g4X T6:[hݪh[A3}41J޿9D.=<Qq_T3'h,Cˌgm(I[$*TŠH[r~siTD!c3]:\=id KjJ/--"7|^b IZ/ڌx=(bDJ9}T+1{:FxLzӯDQz@5sׄ<̏賢f߹R ͒KSڳtO=`rp̬> Aj;λ=Kd%N[L#ŋ9>Pu7x1.h"$ISա} J9ۡz]uV0)cK <0 q5iy9SXyZ2kweQj,T$"yTdL k E}>*wCԕ":}9N`c {zuɠbxn![$u] ˫ýV)Z K"Loof?,%HDW)Х ȝXqe*kr;p &N0dAiPhĚR7ƋL#"uq0xCw5,7ߘ_i]zU&q4kN^tI$e-7:5|Z;/+x= vWrl˭0Vaqpߺ3';lh)^ΞdyFA6T''<d,WDq)/Q^!|\U?܇5r_2 *uY$k+%QNu7(?eiMF%B6ƏA7dmooRQ},;0X;Anz2-e* #e`8"7_XTA\ }q /UY.:}0ZWӱ ,3,Ʌp58G)8}Oqt^[Cr.yLbMy05ߘ <=z*@@EUT+A s78ʔN)k!fLzy{8P V={Zr>#?+˭\Rrõ}&J^-dħv/ CҒL2ӑU%'|@٥Xᅯ@U5ȒJ]2SãY~كhگP,<-dYOgF.#O|bfΐ37KFw.va-jqفw:`~=CJ#.cxU_cQˣF5 [*7AIdl_XhlG 3"$>e";D& qE+nzL0=csp < >MTEhoJ5.2Ϻ #zAH@ˣk:==7㮯Zar {8Ou@eo{CϞi &;iۅoMYelA\_{T~I*KpdX(r Kz~{/[x ő :Us]ǚ,!*;(YĊۭHdB_[*Յ8L3w |ƨ 㷂 y#FJs|']bސ4i-X(c'OFu߬ Ӡ 䜑m90)9UQ];>/t0Lnb~1ꐪ$;g>lɊF'h:+Lcbs/qÎj#;}5D=YNT. ށRC32XAddƌLRm2AY,JϛjcN/^nzI¼pND ">~셅d(a ;_p[ᛘOyb^vrǿC=tnGRTOX{A=t\OA ~F풨} -o/->DU+} ~d.?H]Mn27Y"moVXoNv>UYmjkјY:D1xؚ_cT03 ƹc%X;{(>oL=Nl)IlNog'TC0JRw221LE1#t̩V뼇}8F>l!K9&71>ll {g9ӣ0L\)/NigȿkYu'zʆ#}"lmD=@N)فfa=_R]iIG hl<*8=uW,SaْUg_Njw"@Mt%ߩEcO խnԮ۞Mӈy0_ds0Qw5]kY80oDdf""n^SuG"%hdDܙzN0DI&JT—H YBoy1GscLE3Y,&l 4rWK_xDB]%In95%yLn&VWO xsY_-0¾S(netm+/mU:@ Og]'PK Cn1+݃Iٵ߻ me3%\?om:j{.C}pH:Ce:2rM|4OyI V&FU :R#;'- Xa1*mI3g+ MŠ'3c9Tkj N+W᧶^["gl{3қJ:۹wۘX\Y@>?fǝ"@G{ rlǶ,U^56nE]2Ke9/}PBF炎[`=~h(XpUZF"[ a04N It` tASfjk.(ycHdNo40gt}o(YZ^f,SzizFٞoe;^#{)F\Վ,Y`enB?A:D(8/i:`_F 5{_Y˦֛s;l5l? !A Ȑ@)ܛ#+N`^*LmDpᙓmibV">LQi~?u4*h`w 1Θ 'ӷVR9!`0Sv  IbJ>tO!tϷʋ`VorH;4Iu]gbAhd͎z[^:C[\Lim Ң4Ӝ7MJ0 1}1dˢu2?}׉okIwiHTaW?N O?JњV #Gp" )7R7Aq? Ԍ˲¨oӓenh==e)-\R+ß8Vdz('6~Ҕ'̄R/ʹyYsZ 8&5|sDo.k踲B1?\')?*.󢹬k'R* o` eJ/;j} ]?ܟݸξ& G( x[ =ke 62=sdnFy}'d}FӜ4kZ厅|>Iszׅx1_3t^wfu[ՇgaDC46H,M%$z|^wzl݄~4#?Y, DgB%TV~d G2 tĥa4!;CU'<_=2[`7m*/q7t!Ee?y{^Dl'&w_ %(4964hĪ~g;Zk$&nX/ }swCM9PG{p&}n1=_\I+\{BHL\nݎdmc<^ =KHcHY5L۠p>zԗ^"5Ven+ (.ɤ*R »P$teW+mqYkM20YTeG17B `mjk耊8c2%[K?@ȩI jӹCuO|LxwaτfUn1JR U0@{5ԥ8F C_as,xc/ ʃأ)9%!}+x wG,?ԧ9129 :+qAJ-Gnս_6U4$+}1k+̉!SuZ.:weP(yMVHXT5\u (J3<K\&=WsCbeQsk_kބl3ȴHK2w I h뢩]XIco`?J*a E,۶ͧ],~ь&R\$9sq2\GZukZcƍ=pC HRlz'ź W_ny3H>YƝ̑7'ҋ0ĪyX8K̞T8e 4ᄀhY5] 1y6@n,A*}fx{,V^%6r瀡!L3'2D"p:s?^o i-;FVg=m1.HM}u^T1 C <q*B+E/1(,*1b-`ھ@p[ȮXmT LQ.[A`.jfޚ⧸7?vT%mtކӴ[M0 t^݄!RAQF)5sݮ$)KۤJp#HSiΚicMȯ%xW0& #wgK<1ƖAniowHgj hW_K j ML +M0]:<[LI\iݹ$dL *cȁ/_0D1i$q>qԗjfT#QZ2&nPgeoPbglb{i/*L"J\E6*{jtrۂ}GYI N.8`/KO(soQ*ְo EBI3E[~#/ez`a~SZ2n4vxMnh?#ny e22!]jqNu(P M| H$c%u7ZhkvOz_\Dޙ WāEd}/ 7@/$&cU]p[BFN8K-P*B#CΤH+L=q]p譔uv+L:{[{l2(1E0R'$# /u^Ո-ICד(+ܧ"JiQVNA!4@PBTAv1Tbt Oic$XƓ޻ۚ!+h"} *vSQ8kdIlH~sݮ7(Jgח]c}wInHL8GwIv?klWʮ :\N#?#/ endstream endobj 150 0 obj << /Length1 1962 /Length2 22702 /Length3 0 /Length 23890 /Filter /FlateDecode >> stream xڴ{eP--^ Z Phw/Zݥca GX2@I(b6J]YX `;{V6FQ9R hۋ.V%37G' /%@ htzSL= @uO +/ vva45q~S-A@71O vF?x2dMl6 9@I v4`{)jj)U% e5Zj`rSSאb(K ) 5??Ձo-o?y +H(K2y+ Q1ڛ+>ffwww&KWg&%_ԭ@w h 0ot#Af@{g'I?vo|sz[!\Ĵ94V&++L@.@{{7CWg_o9?bNNr(K4. ~{2}[o_혉jߏmw98#"`ag d "2jogϨ~=_≈xX!7ٽvFS>q[\N36`w{Z-TՁY ?2K t=̬kRYJvX:}Aog7 w#Vn9m2`?oLgiZRڷ 5ź̊`acKVH_+;U, +\̬Qe\Lކ^֑Dm`ߎ0rsml.T߷a `WqH lqrLL<Xf6@dvys8,N `#0%t F<,f 6;Y߈߈o |s0[  m%|K|c7o- o\y E w7?} 8mZ (8@"m,ۗksm?? lM& ŀ2Ch.nH8<5ϼ|gtBqA,PHsb#v]. mgB0)c-me{?'E[7Yt''!#H0Ӎ|cyEq'wN!YZHxSЮ_g|;͌LAF Kxb0,vgi)ZA٘<~->GWR|fu8PX z}~n8"sj#@(acO-_IykZjHVa owlQYC'(bDĩ;3?lhC}RLud"Ȑ+OkBys}KʢZm2%6z*;|3ob"g|Vz  ,86<#E^]!)E'WP ms#Sozvq&UZ`¯}]tFaQu||f4y# Jb>W1%ήݶ}0PEQ5橃Su@7  C>'eGP<&#Şga9L^I|wrb6XXun Xvk.N{FU)TǢ6lJ7WM᭫87˻W+<)b(PQ_̀e 7A=]-1#döf{:GhB,9ֿJr1Jŷ0% Ĝ|glpHqxdJwkyo]m~JQgm#YZَJ܊jt$ջ4#KؑJݯ`XVUiZ]. ^R~:*C2+&)K&@z  `w~\/sԓ h>{rcEq-S~;_w{Pc8">y_T BtJ4xLY(Ɩ},)v*dU,|v7dІpMSRI)ו`j2>V4zGex8`vaj(Ƥۘԕ7d2&yPu5mP'扇!_,/hiq~VRw^S'hbnO'qy!c0#!+ $\ C6QGᴚ2l-Ok$rL(#n`A`ܤ֏Ȝ aXu 6o9g'/(2/)#uZjJ't]70{cTYE4q̷-UZbm)mƒ Dz4!opЪj]<8B&gA ,Bӿ(Thm΢,aQy>4kl@8.Li2՗lLrbqi6*# |elj~|_3JB-sn}fJ5mx+0(kO#MȥUu}k'`r>NUg8~Zղ 5 mobDYfRt[t1QPFv"Yn@]>X(6b"dcB}˾3-='N|=t!;Topn w5"^yTs/gnc>* Mlx})c߃n.YPROӸ%z S|s9 a{Dze`i G=HxY@`ro"(ŊJ`蓉gRx"B׫uңǯ}GE z%-THn3S+VD&* Ѣ+fǓ۝O÷^D3LNMZHL'k -rR4tQ HSLm-lDWU5аFRNُBrBUQS~ŦEua~0(߮/^ǩC:k3VQ |zI^nԼ:킿8-ަfYloe%(Ԣ`9sMlp}6v*zG'wSV&t{?e0z\Jט7 5]䔂7Ȥ16:e"όZlAsZqSQ Kn-%-*o05.rYm͠8~ 9"i~O\鏲 6u.b(e(F0*Ah.|XpF\ !n:HJs-Ϯ#2:Bܬktg[z `4G HZx̷VQ)ov>[:!Fizb7lďN KYqZ"+9<3U}SNjrapH>&hY{pW &J"?[8#g`9|ǎ:;f)j4%ט FfO%1 9P :@[}jblH= ,}7Y.PcϋW$|k6Om!vfǖZ#J92c~ EU6wn T1/]؛I荐$mף&ΡKappZ4؎s_9Z>N䍦Ҵ⺋J*>g)yOڲ}\UG'nO[(Tݐߗ4qsR~57SvMU* <Ѧ%$U~΀|j_[aKzړ/vXr IˑX4Zѥ0,!IQfOWz;xpg:D;S*5ޘڌ?Wh|4)aTcI)7qךybn[Q'Թf.{ B de^8q+z\ZRtj~xm.XYLui=JV:. 5&-;v߆%%bZ`8]Ϥ#9[gD}т ϖFA#r,Lz*,eoFi4A7p.y.݆t>Mrgk3xt-NT}k!>D>#]W"T.#YvSB0ʑȽ^Am{vr yU Aj'JJܗn)nZF,}|"{U+~70WKY}.l١ ~R3El]-T}]:FΒ'fߟi2ʺ*A·{*)|0YPtub@US[7{ciX,!{N&@hV#0M4S*i!NRhتf^~hW(f og7/Jb}Qy=S&^0kӉGfs4U\[ԭgt?SL'һի1*qHn%QCr֖Aϰfzݞuۍ03xLRQf> ˶PNEbqRYV"-lezHu}*倫N`3L L!wHjmg -9V'aKõȏa~y\} D9̞`_TH,_p}Q{o*2%)L#"jV-vVsg-][Ը +}wGbq5ϤnC/W w翐Dņ9F_5xS-p0mL|S;| הtD&SzN9MAv'4øc.j.}0!%K̏ $ ~wZn.7`/5\猴SMNZ-VF!qOF 3<[!Fj-KվzO:3LrlҮKw d7x=UUn'"*^O]9ާdQ _$26&US1c0^lkizY*RI"y\/i|rd :O/A":^(ƘY?$VgAk"ֶ܌8V<΄Aȏ:dh4$D(a83tĒg}DwdWޏM#mc=MY'kFPCwԫ,K@!_-L,,*dǃ`CFZ<do~gH_%É)]wAm-g֘_[~R5%dR?+z-m1n:iś}f0_f"t<|Og&9;4Lg4oc;yOF:㵀fP`9~v\x1x;] unVngY}r&^g5{[Ҍj0%ʪeۗ_@WQCaP;>GClXi ~uX&2T~ey| G{6BӅKrN?&q~CRjVT͝s&˘P릩G~)e= sm}\. -j28Q*Tt JtugbwL#dq9i(Njk`u2mD7~_ciinw,V^_&DcaK r1: @1, 0,Lxg("u@DSvěF%G~O-G;cQgI]|:+xɇ,ohAЪd.}M !9%osIViIcKM%+zmFol5b. ﯮCۓ}T^ʷ*9rHk߿Oތ,/re4DȮbçϱT5̜4nSѿ7H1fJN@ATH\|jU+uV%KloT'zE;xL}e?A3Q:F~iRSn#KtF"xYYA1p唁CS wv_h[OKdEV&!wltsIVB`@ubs7X8.9׌(Ebe[5tny %xM ꒥7CG-В=qBoPӊiVQ^/s11$@ _녯D_3Hv6긤ҧW*C'D@&h; 2Ig]&Bȡ?Oi\Rz.ؠg1ZOZꧬa'MNڌCޭN)1T˻B/1H0{6kUb^",ԫVm{ѤToǮ!>θi ,${F샹E4WB8OT/`2M鈆Ld. >p}IV,p]^$VE{d]3x*M(4RU`UiPCg]XK!bѪ@Cc!O]il691?SzOIR?"Thd7L^Fv sG+5o6 XjyF8N##B(~OBPUKdSO)A<_V0e433, jrQ :%`JH=;ᬿS6ӴV>a 9n.Դ!m:.h=4,896^U6,bltMa` igUrvO'ʴ)V < HiGg"y`e&&C(&L~c0{{w׍u+E]` ؉T8\nkl>JuK%/S "Op2mw{|QTlqҲV̈́' vƬ1snlNe.GG̊)cbH Κ1F\7)G3R)õf8/k/U 9a? 6wSY-*a9͐քظ.HTϐ8q?l٪ ġ ο+|*R0`2f.$|2F!JcE* Ѱk~{{/ &-rSr!,Z Qُ,1.[z0-yՇt0p"Cՙ(e蘸Lձ:[= V1EFUK+1rGQiIr%͇:>)ya>B#EP@%DR1}J9N }56CNhNsZ ƆCJMP1/\T%Fpo,qу-{؎4f^Ɵ$AO,"y5F>IPCY3Y\#5Ebeۯ4ѵ()Z8 x*'yvaj{boLpKYDO7vi^yvr{H\Ү4{zŦd:*7p~ )%q^"([JP<By`3;tv+.ZrW|])Dq p.r d7{%}{oDHV!ea,Nzؿ|\Ï#B/ Fh$ Ek}Kkɸ]#XrD?H/&U*>m\(py/zTP ?yމ~Et {"pcV/!{v̔hH\8im 魨 a%д숔8_6`ub^rCp S0Jڊ\eZc50@+(@A2 !=~E~dR5t:S=ԽgsLXjc7ޗ<,O_iFKss+R-=; @@A KtĩCD8̡}@TPL[o_Yav72(57N @Z0JƧ2DW%/ͥT1u)qmp\H<BĢwipQZi<>Qb༭Q f$R@Et3/J&`]ktʥHOeJ:?BT33\Q8YŇȻY.YolaINf1h@>rHWxp Ҷ&ԕ"_-M#)o+ Zn`%WB#dz#0d[>\xH ܘkoW$1KJaCC"Οn141./O-Rw`_% :.}1_ɳrF#d'Р?_Lf1t kjdnDPxvI$&yڅ㪥GqG:s[%i ~="vhec}UP@#5FX3THQM[fyoR=hk~up[Uu8:zSLbuX^|#.Wxr &5d'е%\b9]p D+@qB5DdSr$cGz_6Ԍ+B5= 3LcP'Ɍ" }9a]3LNi-e1E;aڿ,(ͺfs0NqӐ͆w{Kh!H=9 T֊¦wC9bY0ʤg=o|uub0xJ kmArhtq}Apo"؀VȏC? i$% +L]*_I{FЧX.a}7ss2HK4y v]$^=>4:ė죜C[ߕb`2FuӃ$VH'6I}.\>z*y;?EC2']9T4M;Sl5;jET IlH-{,M1 {ixWHt i7(Mk?C+-kahK)Hfܘ}b) 0kĈwq̈)(5/W6G&ع._/)-$j)'խD^2Č$4JH6OBXL70)~LF ^-N:l]FT=?ZiZ,nAdeS -椓02pǷ'7B0bp;džwKrK\O^+Ϡ4ӠWW>o7RI2N7$#p-E.z 3cɶ]3\HK+33t勰K\}΂N\^MƐ۬CX3.f RB]>Jf^gl偟&c֏f|R/WFP5xe=+lһ |An/<àYpЀk$2A*#}$c^ Nj”G6ar~{O/? ~UnD >^փ!!됈?$FRU QS}S<=u|Mz3.k-́0A+|499A#jccex@1`(YN4=.n+K2̀n&pCVAo0&`y&ZȡO?*jI5D3㽓-@ T{ 0.+b-=n\シ(ݼ" YS5Կ7̧׊ѩw=lqGnA;4ܧφ',YZ'x4ٛA;q,$ :(r!XM}f8FDzMJgx*hzEAN 5=U-Ih:5wNُug S_W._ݛ>>ގpB뭰E5Xveu^1Bz==n6y}9 YסJ>ގSV硌qygך!}J̋p^` *%j ܟA_e=-lF@+2͓,nX=QĶQ V?qB#?vUo:ɶ@wxY xLW;U]2sUSl3SK)GU8g@:w򽪳^נ k)7R]6U+]cLmmfZiq6V(*$TMRcrEO ?QkvYm"j1l-И`(RJ. $py"GsmDyM*kx҉R.|sֈ$|_{1h\$J9зMu#!Zbb&G;M_t%Çmytìtex&pr`)2\ɔm:GeUyy0zP'cVbSٻ,DhѶnVIҴV?N6/`>\鄂t2(eG QvRE~5qE3U0H YIz Qշפ[{9*cLMB]A~4wE)& (~{u ,BXrӹGVHlT[[bD ҁx`:,4rR0ejA<{5Ž#o$N#EA_e V"!'n ;h|"zzIC-?wo ro7s`-uTsoA%M?wgV\5gV79"=:,BfP J.'ѨY')x- "z9@O:kT@&APA`2'`(V>doC(Ֆh]Q8`wRצ(Y܋S'Oup-6,]>7W*/okK& 1'"6A.͡Wc=v#^>5/`̴)if.=a⮠=V)nq'ܮv$օv$"vI#{^MuNN+V%证H<$Zgx3Ҿc6RN^ *|k :+s -* {' i!jF&m%R Y:KIYMO"ySf18C)ޟ.kܥ9.xq5؏ȭÿW6M ֮g,eb6%et49CbLO) $$yO_L;zbat"\mQ>w ܣb:  ϡFF\kPoXL6bLYNu֬R E9A3f\ڠ|+QVAXKgV ͱ7aM^gեa\. Ţ0]V6.!ʒڪdk'r)(,}[E0nYVjcKkń\絳EYpL<;(KOCql hzv%Q/BiGb [~ѕ 7;e$˵>Q4W)*gZPV}LPըyd⌨g^y *P?.;:5*J>1j٥+߭ҲDC _b)(SC^]yVk|TW9oKj:6̞3>, zɤ^Wkt :j^G=@ւ(TG´e#w!l\Bٷû$Ez4XQ}8_]TbfH-]Ds^'J*/*>l000т$1PJgZstœ"4,ۛb|cYRp>u&)Q؍ޠM#U7&PH?n$h ߛ;6ilr]Ǎ&Z8|4ܯїNLd@ʰp܎Vs8Ac fa*|'+>TPnŃ}dz3~`͋4gmWs'@9FE`T=*Kߕie7OR%-.TFDuHǽ[yBB;vM5?&ao߷]GxJ'hĄx=Cꩄ٣+t_7 9gqYmZq%,zs2AXINVY>jV]D({paD u JEЉ nxR=-oHGPH$'rQa׭YHRdHu'+w^+}R3~;z5 Ij`u2u>3E8_I>$o-˻>Q[Tv%f޲>gx,#:riNDRΒͬ:rc]A*$%&2tE$V}]-DԬH Dv#*#A>셍c$촰H _i5ڻHOYWDɎ tFa^LdߪWP|gzϢZy4.8͊rH:PKXZEΩՋ&ˈTtˬxԳƞ1v:q=WT q zN=-s}g2_% #ր!& + `p݆Q8qq~p '_bn-@h 4j:VHSѻH$bklsg1R⻈b >ZbgtD֤F?>JӀCq/I= -ކ91֨>pO12  Z1ff[HݷsP?bg AXmTo<.>=8qpzUmGuE33:r$CuM)u!պQɌ^T5}(Vل)MM=eO|EwY׆ 0fkvgn{fr1W4_#[d zZDV*z$hTN}hlޕ .Nf^ }"Oć "5<3$_z&Z\ͼ6.AƠ*5_ )BHyXu#%z2(D7oUuìZ ?ER^oy;>/=ڃ, *~e|/j+>|r@ ׭PFX.mSQI $e VwcmgJ/38Kir 7+FMghN3*s'.zBՠ1<Ǥuq}srQGв Ȟ[싉'oT"Qjg,iēE]/7Y ЦԞbG%lT| =;; aIm<3 #ȧ]Du )["q}x+J\籾7/L ^a?ƱMny0h@" 7ڊ j^2ltHg<< `DϚVD84!JJf$8nMX HTEy 8mO@Oq10!H^=oc`|$sYRZSZ x>PTCCӪmpe l1iS tEGdwB%=>jѿt:js," N[DI \Г ߬:%pd{2|wmS Μ;? P]ؙqc1T悒BZgF Mc6_}K]Ey! v"jAqn.m:`{`t.|+7zܷK| dJ.}p&] }[+?LYɺ8LC4gvF>bPt:LΝ^u<}A[\kHߚHs'+ҝnFԟL-<RzyqaIȉ?F G}HKz4u:=} 鋝q\mzp+GY@|dhIqxjRv`(MX63-\5 }\}=̲)F{ :}F_oJ E3nžvt:>}oK.BQ:ȅI<) e3VϾN/\wr4&|q> a|'г1Y݈v}/z8sg%3(:mR\Im9r?퉸d61o!TdKUݢj?J&?H&<'^ {Fl;QϝEr,"gC7Y}D*6 : &^)1]e ‰jd̒xv oDnE8߁̶{lE %YjdT1ߢǣ⧌'LP'P2rO]H΄,߯6qݰ)h`/V 8),r­""L d$ Q'-8̦_| kݡ7J )X]$bܒIR=MRu? <^{OVxHg̩yC߉?,U \89^\֧v)`1E+y88#R}EHbXXUCy_|Z∨= 1{;бXߚ#vp]SE"b v8eqݙb"^URlkouE.)#16VfCL)۫hv઼ Ѷ@()AR)/v"5i86z2l6]!gѬP궠U|o60#wIzo;S8XA״^;E_'FݚusyhKtjf*f d'ozmz<&k5'y 0pU髡Vt+•yb/󷁳8ŖBv4mv32p!qb16#&9蝅[w 쿎l`VJH`Q,@΀aֻ5#|a?u QLh"o&|霡A;AA-u>48Q6#'Y/q˂)bӑbxdx ܁[yCpJQ*%D ~p:Ű{텚I[?W=>'C`ؘ{ 6cc07'k3iK?FM6lqsίK1d!&nI+[_,`Jͺe3 \wJcZt&c+Gcz?[:ٱy&+{B..DD6U#-5_5խ4{i^m҃`E㙲۶ ?^?9ZR$i BI}pj@Ð]Chh(֢*AxDّ\&y٢tBvy`-oZN҄ˁc3dN='5tm{$@v5g*0"o,k(0D0CQ9(<*Mcݭ'8-RkTs fy࿣FA"(<49ʀ- e,%<ÈP )OzYF1H/$Lt !w(V{h.0nd^< .'K8`B e $$4kH':iIcSٸyaL5SWc&M|,~v2E/f] 5k#WG ,ٜ ?H| Y =j!`T?4pṋ\}}Gz'WPAj`cWMQےH\HgdM21ך<*ns_]9<4"]5+d-ܭ|OZ řmE*ZO ;V7A%~u:+u)j+ |}^p`dhQVg-wCb_ &W{x'owL JQ>cf }Mt]{:Cb TbYl8}`Cto _Шg}FB MZx!!4_;׊}M3$Y/fE_lw[a64jR$+&V0ecn\uz% 7oN_ *B偱h%o*^ M\GkM*,@]K؃"7g6.sdž"Lr&ʘχ::qIxГκu^=wdw#ݼ7%2 yXv2d$U팻 S*OXNv6*=l.O!jހ5᭲j:%ڢLZ~xW59%g(Kf=Z]}ۈvo_SE~|sJa7ã'85+^;~zfAgFsi,'hb++L|^o7NIE%udz'͔u'WG{L&:=+ S޲핬㧘&DjC2*\nR 3g\&u :_J ܵ"%hi0C-3E/t(GT)?8ͼ J Vh$xuQ`,eE B=53B[_f-\ƦfB~ m MX-2]Qd=Ѣ^94oo> GLƳ^B&Mj spQ 4H(LJ4ٚfY|8JVγƤIw N;vJ8k$W*ᆔ0W$iccrfK32᝿pI=eA:[vC^tA :x|t55@j<@HQ*Z (DЋ?dkJL6^`Niߊ hC$l.h 80 b`N+^3c12n..}?o̷C+S@OSNSN'[DCΟ1 戦{c]gQ j2̽kYk*5@0/L?ER]q$o̟(;1?8ݭڭ*{O^}.  y uW J;7XF4Ķ&Ӌ"CWz\ 8CVyg Rv+~ wb=͹Zɠ>a"g P@JrۼfA$Jiʚ{~:,j6 ]vL_s))IU[]|#ḅBC\C@zHzV\a1W!IUǮ{f!P}x9Vj;6 3FXH;+*~l'J 傓^/Ɉ\7?> MO}-b# Bx<g# |St$~/֥![YdLxJVh${6m)݉2 ^)-ixFN-55VϤ x܋ &Fe~5ou( @"$,byE)&/߶ʅE/;Lpz*IH̶XhUIgYA嘆F0M۳tcpr > Gs`~ژrq x`޸~,} uFjA7^i#U}OmT~•K-|`w$%k4FI(J]owRsڣ@aC!0s+Hzapb]8 endstream endobj 152 0 obj << /Length1 2708 /Length2 31906 /Length3 0 /Length 33479 /Filter /FlateDecode >> stream xڴuX=%=twtww343HIIw )- -9G\{{=RkJX-`C vqrjm=,\l :2 k)3;o:An>`;^ {o=\u@@ Pl z[ٱnϼ6s6Csl,܁6@/T?w O `mo:S]d eo ?GzN '5] NprRp2?oO7[Ue+I/: [' t[1>RNم?/+'cix ? `RRV`8d XYr@g lk?`g!`vC|vߦ!>` ?']Av?A)A~*]v h?Av"??@KxAO"& ^h 8;mSퟡ+0? Oo'7ӟ` BSlPvC7+j B9:98t@N(?y 凪C /7t1.b. hG0t='T ׿J -$'};'TֿDjg/yB;YUO^2!vnf* WǟQqw)tmA^_/T_!?W}kA@={kGBT, nF7j~/j@+[R=\*td+_(ywzPfV¡ 2l2[I^ImPŊͤ++ |ӆ;=6%W]ZkoZ`H g̿hbS-0(lNh& K v}>O2h^G*lss"n#o<{c-4e^N0ՁS,Ͱ)t+uuQg;64R@ [9}1*WF 1 ؄"vq)}z;A7K2Kݻ4Br-bޢh^dw*#,W돵COȷ Q̃6cvETuj$7X* *OdwC^q$)I"eD~RpYA CQYre 5{j" ՟IEV Ez~eoNQ:R*;#"e)]+R8"+ aŴy%RG<q|#XΏcWx1֌ ~eݧTW^]zJ\TxzH}{.7CDV~VHCJn0].G2T..O[zߣAD 5ټWACgn`UTqBr ,xh(6CF*}&N t2٩ۛufi -tsB=W|[%+{U' ).. ,z|-}:I(*c=Y{?(M\ (r0grf-y]{ⓕ8 uįǗ7EsE-3hFei(p RҸGEwܬ׷7fio` M1_\Tpu\~Jc 3"Yqӱt mHH?|doO\t)1<{+DF<6k+"g?L0>4S#Ѕ'F Xv} 41wβ9ôCKx QU2PgɆ% x.v'X6R¦XLia&Fye:$Edx7_Gbek|3ndMX<: c‹Z˜ f}x\=>3Z(9D G\]ʟ'\QQC#3¾-1" OIEgھ>zr.͏A[D_RJl*]#-@v?1/oMP+K"=EPC-JV->XQt;Q8oadR_ OKs\MG`2nK1ؖ^4$";8a/k AFя"0Ԣ Rs9opSy^Pakyz4%P}ePv4R;3&u@1s4qEh+[-|di/|91{*1.bg Nc׶<\)$yBECkT+3ljbͺ3r3>I~]AZ\njo\fvu-^YUκd|RΎX{IBl',2[*{=wFy5wDS }5%俧^('MswO SP<:٣z_&ZBvxH,t)*f gxw <.nhwaυLf+/0c~HdV]67j#U g D16+9S+~#"OI.=f ) AN[z xBij^'k=ؕ9eQL<t.Fp2H),;N(>*izw640-FNF2{qt,X,Ivp((Q_ڤ^(5t]t1^^HOt$k Ĩ)yQ&$8YOXg&!OJҹ٬-. 8nm_e:~n-s|p PxK`l{99[A2d &=@uN9vФk1P#g&9Z4\18<}kDj{:ѸXVoeWR r{YH}\H; MxϘ(q3Lŷ,K=˄7%-"Aac'%F:|*sﶘ*IvS!-lbpMŖ;L ~9uM~ [Ce-/HF $*&\ɌM 2YbH)Qe9rt>- F^NNjQq=]/)e]-0bLER|bi<%:4κixf,# sd㧽AN(qA!=̄0mP\}W]1z]9iL:eLsrt˾O+.@D,]{]WȜv TaC)ni?<pWTz@Liӛa(qr麯uc࿫> -V* +rY0@Gn>Nʗ:@aHAmb6rnk& ;09aTJب>BYiwUW2LNp<Ȏ߆[1WȋSY?fI)D&ߛleEލ4l<8B@{*Oa]5͖zxo۾x$|MaJ8ҫ QkUO.;BҊa%MfItGt'^ HB0@<8QR9"\-xLV|n4Xo?;iFb{|̥O+#_RcΞ/Fs{~Eh~CU`uhsH>" 1Z9G7 ^0 ^O P\Gu8m.t>!]S286Xc%>`uɦTƊM >2ySfhϹVfcJCj"ddK#_+lZֵPF @JI߄/CGR{p'٥Ȃ[7m8N9@"xua]I&K6SlNaJ.x_ؠ1%_H}WwcQ*Bwzp)aa?g^Y#4pCm`2Yc "jQ&]er]j]s~ԵՃ2=Hmuϑr^^@ɪW>=/i 6 z3͟[I}ZDwեt1/Hg|0.^W7$myLF*-"NF~v Eɳ3Ƈ"3$ wPr?Tr'W݌F=I.$DPٯR^qm}]֮X=iH2mWd^X+ᜂk0. bA /> ڨǕxK?՟JY"Y6L2T(gK.mkiDT^ uꞖ_[b)~h?oyB{9c m²0XZ6B,IѿAfyڛ9lMK{l'UAjDIk0q:Sq2yY.tr&>?D^I)DWLڟ䃖gʰ\?r&mtDP:vϩJ2BhAAz.]XZ65usFŽyՙQ-'ZPsT1|;˓_ٲ\H!^  ¶k o8e+b2ݴBUU'TM)U,v,W:%/۪zX408/(ȧ mߋyȪ3%(_ehw|:|ˌ{0Y3Pcf.VuZD޾HXItRrc;%v+il/1$vȞS'x)>+ͼUNS_ X 䃼Bod=W=Æ_9nV)j }r9Q^*iahu! W@ /16Zv4>Fpף$K1IRo0rd3 8 7:&)U?tײThxC77|Bͪ3oM KmXP{5ggܶ …ol]ʦVJCU+.&ōZFC;\M?j [3d9qS2&asJyW*w]Jl&sQ$AGxk3idg}3;1;%l3rZ]\\EO(Ѯv- )eB qƗIy0ğ3>32~|fzts_n !qz>C~0껾:ClX abxa+cKـ2jܵ\Y3yO%g xi/{+gK(E}۴5\>*Uqkz ü?h x)cx\rd C`刉ڧ)ͪS?- &7a'bfwtA?‘7eeE`G$#5)Jxykf@ate$9_նL2޶e0t`,7 3GkC=oo15$P`w^F8~\X35JbIr׽A:𜻈UC(>X˽,O(av -XDxR*39

DʾW]wzJ_.*] cWz}p3wK*KI>ya, uS}CX\EAMc|">mMps}!Gmy{)E5.϶@Q+3dec5YQu0PfܘTSJ˱2ܰ9}=:Nܪ*'R`/5Oq'ƌwTM ԓ 漝a 3TCUڍ8(^vUsCq='aқSk{/5oa` on IWLc2AMj ׂ߾vQ4 [oǩbE"G.IjV1g_8ڃJvWRlluv&u>`nvωkZGM*<-"KOJAA뇫g /']lʸW"fA;7 o6?w{)pw@c†)blq`TiMEUOߪײ^CHٻ(5vTt{C \z*Es]J4Qj\`q9u {P=VTDNᇥۄ尶BR>C=|c_qo[i*TrBM.n49p~=tHQQ\x^23jݪ2X9Gh=a6S+}FG Ix6!zAgn4j+0p#kG]Qii42=yOFg(:o^3p@"n-w 4F mM /  Jـy>]yIVx-L[${tg=Z)*ADǜwN5GfZM F 8k}(Zi3Õ 'Bn<{Z%V&/M&c!e=nP۹֐LqONy!$>Gq;pgJ73t8xhU>iqMlɻn,xs{Fk‹VsVp9V滜[@ uDۖs:22._εB>Ct`*w9$9:5d$m7\7 W˞˽5G#/=9͕;}WMn=EPr]F]<ͨՓdfc2;D ޓ@O\{E<GLv{XXg3/h4^@>b*| ۊ☢-GV |ag|ܗ@7( # &i}_4N,>is]A"ʁhHSa Oz[l?ٰ6syE8\&詑\N@P:r= g_r)+Ӎcwy80OWI2`6^:mqeľkb #Qs~Gw6,8냀^C-jr`W<枞>=(ij]!2;G1mtW Q[h^u.BMvCRsↂ"po9E X:&ĉm/iZT`&)^o,w`٭irt(C9h;JAXtGcn~$nVeF7ٜRWKθVgPv^=q!o}5N؎6 kOk<nǯ#:fyw|z,gltGAjO|K7zHki|ڴ!؁[P 3 ;C/s\ƗLFP2be~Chbڋ줲KwGz8џV:/y)2'#23Uh}q^Zc9Q({UUAkwu;*b޼:1L<|90h*Xl*}"J4̳\+>jb>P_-P-: [H&ߏPB4gc\5x*UMiH S?OGn Ap2%QF9A+ clK BSƂ$ȵN:T qwvtU;! 2Ia&`| ʷ>|Kޚ%tx&K$wG!4 ?t36d5ɏS}):)ÏQs@vmEF –#aA_6JmNli2̆ Y88?5OBX^v- {Z,~j؎=Go1~Jl\݉ a]oLޤM0W:W'0Y zܩ(&~QnoufUMlA^~l/ż={{"ChPro,of";)w,b{[|W( "x} ń-0d`lgH} }H!8x\L1sYKך޲ً}H<>!u-k\*ywuPnpЌ~p1mu'`VYgBXkY_:f25t c\C0/G_-ÈSrfZZ^ -kEƄf!y9Ne?}\/+ZR"!YGu!<t&t{ytur}81ϟ!q'5}=K3cIC04Vu~U\_?a:!r[ص <={o"|\l͞L1l̩<9$(K׽<EߖBhm ^ű"\)`E+]]n;ؐc xŤHj+-`~&D(0T[&Yb~{~j3`rcj9Ss=s[-41; e~'gbsBF|nuG;1IAdžl3<*#a<ʼFW/I{C˿3tK( M#1C-ϫ.qP͂m`;5J޳0G8[& A˯U >ӿ"| @m%t<۽Ҷ+)gܼ;33iLZ|⬏P%S.>O#v)i$-7}>Ah/L4LFouRHH,w&$%!!Ap3rm̰WD{m,,TƤv}du`p휷.Ml:+&gx9?w>kxоX3/\9xvt-:v6VC>FjŦQ2kQV]CCf~sJI!e\hxv62\YytS?Tp)Ѵ !)Q";nr,~w~ 6֢T t;< hĵFZ@ɔduN9D6/Ǟr/-x-i0n*Hp0j&Z2EpϯfL=[א$7 a%Vvag932+3$Cxl?>MN٧[p8\n[aX43L.8X)Aߴ= ub^ޟm\ڄ%?Ǣ7O$wyhޕ{oT1KFSV3"Tr!|sDes:5[H'C&d 4d}pqmZ4'<9gO~\¯@܎+}M-{t?7YK`x46c)7lCȬԃ/LI3l Q'0T0!^8 &ɓvIC_|~9( 9 W7+4ٳ+T9.(_૤ە)\펓Z9b  LVkQ?WdX< b9ABzPeeݜz$,=$}oU>&-YvsÒ^՞ܠHSzaU>EtяQX1rX*+Bcn5M#0<#nP )s[!kŔo"}1MەRi_LauyRk=c씰(**XQm9zoۤ-u!%7#/wgY*Al &1 #Yo`gXۨM=)iun%MviL4hk1Tʇ\;* ѕcw ?(@l& DrD4Ax&R}WLdU(+767G6MH'o~C# 7=k<5խ6-?b=lIk#mb:<ա}x-m1kOl[a'FNYqT7p&od҆1 hK[ݧhf4Ҫ3]Cr6ð8v]5Z6yqoOl8Y_,Iqmaig) vI4zLzয়06;*kgԃiS3)?HE+wZ i}K$Lfi|[5Y(5sVY;žM"WƐy5/Ό=T;fggbY֚PGϏ"g'/y F 2KAzef/Iz &dlSG!9S!|L@yv3ܝIrW3OD#Kِs ) ІW5mbw(~W O5]+#&H9YGD& /Z=&ҏC_o)Qod1,o3"3<ģIÝSMi3p+}s;&snҶX`H6k+V*ۿ()8>csPn=ӟԈE" &]ڰbtqDF(Pw/]ۜ̓SiP]5DDBtQ' c;Kc1gt|g!~*ýXe;5)Y#okJݞ-w0cvrU?Yw6Vjҵ8Ptd ! h]ˆ /Ŏ:Ty6> d + 8t)0Xb$ƖՅ3D)I X@JVhA\{6wY 7Wau,51 s, /8?Yq8ywk+Ar1fBN50 B;J|]ȤtDV>t>4þέoq 6/> )e}.v0h }E\N.0.^  Є%Piՙ(X!G턐FZC+Aʞ`YtЫ֬mϭ2'<4mBÍPSk)E[9!װg[wpYy0{v%sFr`wH0tN:MazBDJbUR!,Ya8N:M/+/Ba:Z\vbN^hl'xUm4˭ﳖ j}'&l,=1 ( 4AbD&@*ܸ j _著2bF` y:(} Q WXax7϶$d/* GGf!nTyy"o?!q9Dh`~B$3+hn+m.cB#ƶ1cI|" -'{2zk{ͯ%t΁|I$T\oYĵ]3Rn6/I+R2bZ6QC<p]wz0nJ]3$Pm[0,8# o`L~iTabw^@mym؄xDCKa.ufo&g;|a#fb$ qNq>wFh7N8&{!o=5A6_0m|6*nk1$>  YO)/X6L˝NӒُPkT=4JtNq:&zÉrjg4H8J)սq/sT6]Y og\..;a<yܛ i嚔Y,7ܷo.Lk]@+(`Y96,ɱjH˗)J.%sж[iOA1@ο7UR>`wI&5ol)] Egp?cc5Gf3|#ݛ]HTPaX;yQD ܺh:AI{-vbM8y=~˵sw"]N[6H yFmY1˳C@ʋP`Q#En0k%rgs0-R ?b!眡8xBh^5Avv\lv.>IiM]V ko)ׯJ&ѪmL*ٓIڀ&-P刨q'%F=Iom@D5TZ+ok+!c-8@$DTgn#82z#Q39[cX['E3Kfp*R7YI qE"Ե¡x]YQ0GZ7_]Jt@Q Z5@UŨi7ߴϠH2m bT%CG]>w?FTg %K \u^#wx,޲$Ђ~XOzHYcBoC=JIgHGHfW&a{z.MX,Ì~qLй9v\j~dY鞷Ȑ;g^DIy5)2i%[]pp!p!ql{1&SSs;8g '#ψw8&);خ6/\d%am|WpT\](; nQt- %13jFp60JC[. ~ЎV+r7j6~9}RIs CrP=2"UÒn@,05,&]*}::Bo% cWdBKqO!:ddLM a;1#e{jKp Gd. Y뜰ܷ!7d H35lQ;$Y=., m`!Nl~vvv8{Lchֶ2ܦWDan3L r 8prCa?|X:tƴֳ' 6. jY', -e6aGu"w`3lpb'})[ }+b՞;PKP*D 7 )/Mqi sS%05 &hJBQ .! |D +*A>(88Af 1}ASAƒ"L.Y>NLƍoe}%A ېd.8L8c~ORLa<"x:VB jhyྫ{RNbuΞJ׿~R{'!SKC];8 |"U3ªa97 9*L e}_t1@HqV«[n"䃢$55 'M89!L[Rz dԬT$1'Վe I Z3 ChQ#^:mrgR3Z35vkIyD0)%XkΪeٮ?M1q] =M_qX4'Qgy sVymD~ˬ;]?`HվSxzp\!ko}Ӣ.hjc+VĹ_ VbsUZW^T.-4}CT"fhlׇc4oTOKCd"~72?<[ V9-naɮl.kgnr#R^&v75k4'?SfE^(5iݩP45jQBx( 2dw}#/|Ω_>8⋈{ݝ|ȧ]uȳ'ZffDGʇcfl#q`;(-[7S9yS?9u* 4~]L;&ģCf̷O1ž$-MɵpMSWf"#od狸f&}Wؚi/6W~>WB:0ǜ\H!Tz0jSRn6ߵF l0L` ѫ>]4zy?D}OyI|.*]of];&zEuAO3 ЅMS2Q{!5y,.S}sͪo>\tL!r`>h& PܵhϽC#};@U9N=WB 孆F:i[Y&NΉ]PllrهZ~Ș[O&VxaTg {HjUr\T8%Z sҌuHyə{ဌ٤`x, aq2F6 رm  4|LD`pF( mVZeo%?$4o\=LP)UT`u"'}]J)4nãCt:WZbE[j{8 /G41nc^%.9:&BZSVq8:BugR@,6;*p(o׭)}%\}){J &yg @Kq#¤:uk`6` P.}% .r*-# l5wl=r ,=צj8u1m=*` jnmryXGzcHԊ&؄9\nc|GY %X5TR ѣ6|&ڑtK@YI>Zب1sL"a(dͤM dFJ|,m+0j"XqjK7Hf=hpi"o J!$N#u#yue%]IO/u.z 6{# `7Lof{_TCRXTzaKlHj X$ %^Rtd]Zg oxOh6*V.cP~nt_c,`dI&kfLSGF 8a)H+xu墏=aw~,yӬdM8̛sPDݲxIP\B-=(vSH1;l! .^r,a|\X &F'y.gzI>ft49%B3UexvE^P3:h%ʡφ]`(ϸw8yi|gYա4c >N^_$Rč"l=(1}2 ez Q{c P^>fWB$gʖ"۰Sor ҳtEi&[灉/,KAl$^Yai(g(u*'~yhY܅,^`>/|\zc0{27NoguxY x[לtO"Mz#3jsac^R*)AdE^Oo*TƷh-רj"G "` \Z1謹rۅeJ5XXZёڬg:? Qr,鿁 6/-'Z_X!L>y;{$$ũx|\x.9B.%^AP)훇 ę8m5҃h[B,,bfyrRUtv(4Dn9a}ᣰ#4XGA;8n5NY3!6'5ZCF߫ Fձ{x_I.КuĤc[5&,ziƅSŊpؓS QQxc!g>7le2GH앂^P#Mw7BUk=&/}D)Dl @pϿq0^Ƒ1_?G6o94;7SތDO{1 \h/0Xks/<Sרb62Hfc_/P=r?#t܂+`!MY=vxHE_R{mbG T\! "_.n?=99Z' :IUc-ӊ߳н<S`$ggRyٴ'h]$0ouMcۭG(W֥w3 DT)*G3WNƛw'?Vi8'|m,5]@chkz1 8CߨcA9 5۞tN9 X)A} %T*Q0Jr[tԨ/o f (G@2-ߟ뜮J4?CHZ<0h:Q5VSYƒNlSeFt$D w*%mK1> t因3iO-F@_fVp&"e†yl^^IJ_G.¾3l,mW zIuC=e}"LEE<#1න`Y 7!QcVZkԞp-x|ZLjmè\2~ OEW.#ɣy,ZQI<()D|m.+RI鑬T.-k %4V‹Kd;8oL›3^LhR[]ȺPNJL` /K5ÊTϠW@{u tWնfhzDOb:ܡBWS(pr2g.rO2G/2 8ėp#o2bԊy3Ӯ|O-YF(@IN _vb&RtNd- ۼb8MzB -Κdf`bdeE`+{9+^ \ E Syt8/꬜jgFIGLGbR-l;3MQfم2; 8SD!e䌩3BϩPLdPP}K RrtvvOf(|<0YtMa[<;i+snx ~!97s8/2&*EV>2|f4G[Q*IA@OA4o-2p$ ӧnV ַ!}[Š>V֕40I4L8 '\euV3"&Ea{6~ DϢF[ d ]D!0X@WɫXL!ǧDbpK*ʬ>ܵ@QHT੄8 ^ p xX@ǚ؅0PԠ(\ͅ`h= ؟rvCK_1YYل-Q9𪽟De. 32%vK#nװ=4D[0żu*pq>'(Jx?bzh|^Naޅ9҄*#r z{lNluOHlW y~A*@1Unkc s39/r}tQ?>zJ,ΐ%Gj'zF0oRl!GI\¿-qG ^4&ԓXd02bie.>sS O\eL=7:S t<.oV_)V`Հ!ͣz7ٶKpR/xoGJ2Nڤx8u$!c.@I|# qmNGkaD ʖeػ ӍWw$Dp)@ً,x66N3uX97OLfl.in)!LhDۆI#)? &l0cq&\ g >Yz}HF*O n ыf=@}QQ"@.L|;b7[Q1rp.:2`FQʡ'y*fnYx"ͧ?qߪ?:ǟO°GLp֦U~М-3uݝQW,]ܘ6R.dH!j z|]("ˑ1;w^^I7A@6g:Nʏ="¼Zh_lk8B@Ũ~N9iwL/)*3HEej,`ԤZ5iһ&"&df̿ᙧg4ćTz4-M:˝|JzH$  KFdj֍D)s[nF((ıޯ [m_XQ*yuXнўz׫9 ;#*_/LTAx>)D{JbnLeb˴2V3W Ԏ5FhI+v?.H:ցLY28;e!f =pB $m`q$ W1=1+B (3urQoj,ho-Y |qh@VI\zVtr`h)Hyl>T0@P3\΍&SjPvބUC5F܍0b{=AD{1{(d^r3؃kTb0!wl>x&rֱmql`8aq\/K"Rڍ*+Ÿ]2Mߚ?%]d4i(E,eX8@QPWbcjA)ZP)L&")唱e,E=c4H6mI10 OԷ]@p3m χ2*V`PuBq'<aE/vC`4PL,1Db>°@zH-l0Ń<̑FTx[N~]WfO5WL)L$0"S/e^xEYOWcyKqa jluv(FD,>(q."3 yjTvlAJvH#W$rwQ,YV*O%%°oז^,ܺ!u)O@=~$؟+!`plPpTYߢoȃ%B|! :.[]pP՜xeIOw#Ilox(IckymEE􇽯W=1Z7tD#a[lٴ3͵J@ il%T^-ʰUֻuuo\pv?:=8U>X 6ґLQEbZl+Ԇu&Y տANW;n&o 1ey%AR1pak@h~D-U8:<|߂Ѱy5w< b6uŐVX1>Fc"AЩoS}Cv9xuN]JU*2+T(- {j\`:9?ܱB%!+8-GőDC'A^qEw.1?)Bķ6t*o`.$?TSuh+ظDsnc/~WAXG8Y,z2:(HM-R֏H-ll / -6QNɘ{D!Щ_P^i8%IYxr+GGhBGyc+f7gV}@ٳ[?71J*fWԃ)N=S\Fw_@rhs2#1[x)'@ <`F._&.FnS/ ^_!Xޞ-3Bfel'Ć23[X & eB)ィv2SW#^scxxx!CֺyZ> t؝C}\! ~CydHeMJhrcE`'5hBIu߲Q(mEJs f`9أu]un4~EWY5*/L#D<"bf.rY9čϣP`&[IC17?wY#_iJp0EW]kZ ўmܝ8dW0WA}PMG k(X";v7d~ gmJLj%˿} #Yb,,yUXF##lgfֆ; ]֯8b|pCAC{gп>CডcX_kRۢj' M[.И4B\v ,PDD#Z3dN.¯9[F*)νtFjt{8/qtk_Q^~,r&6 n%]QGJp{A1LM$k 24=4i/ Y5?Qɰq"y%L a ?b^poAOGԧE+&"9tt?-y?y`c7q F!^VTb)Uu/⁁c'WwTJfN5_BkRw^7-A0t'A%!2kZ!S<^%Jɾ d[v15>&)l’ ޚe7b Q-b,cvcFY7½Ork3pwXP*NGVxԕ%v:T?sqaF!Ml? +p;؟ |Wra|J=MzovxY\ϳ {4DN1bo㥥 X%9Dw <rK5}44ܢP/!THIPsKH9&ܶƈU]Kva wᵖ,k'HC{ ey "0ƍJ՜9ףF}|u$ DYcRLL ?cUuO!TP5D/l%9M-.:G;\F@3oNgtigdL[|FqӶQvh8IYBX9o;0rW$n}I[w/C.l)3܏ Âߨdɧ+B\KPOid͜M{1Oc5uiΑv0ړ =1u`rU­?W{[FGr iB,Y@^:mkZ I:aVwֹ/g͎+*e:_Y>/XozlďE)"Hץ4m|6#4yHUq.攕4GAʆ4i] \.)2atu^% um'ƪ򆑐YSqH切|p0r" ]ѐul-GhPC/WQ?an(kW@b>޼TmN1(!^QxV\J{DrC8T=wwnoKl M}̺m~Q]~ұp7JfO%dKK+Z(Ë%:+a j8͎Ӕ`|֮9 r٫T_Id*aڞ&$!H^'G'g Tց*fY_!1Y2IĪ O~`oOb~oogw( /,YzHNNcQ"DS7K^9)۞"a1"May`$ƽgM6}uꕣA-B[0[ΉE&6w2D1DW1P\NQw:5>[ƼMgk0^ 9JUn/TU+z'#ٲu)"S88Ā_ M9/yfjX`e ěahs8T[ 'G^>o,xEMlnp)S*M*|(_I/Y~ )c6XYsc7nH>uJF90HH$v 9iS endstream endobj 154 0 obj << /Length1 1933 /Length2 21585 /Length3 0 /Length 22763 /Filter /FlateDecode >> stream xڴeT\k5 xp+ ww Npww \޻|Qj>:#o 9*H֙ 'bgefWX, LLl䢎 t6(;[01qÓ$A w  ry؃T3] 5Q{8Z;JO'o 503ޅ*;[hm 3*IEu%Uj.vETUM] &&i$UlqWVVgfsf+OF 7wWSG;̝y\fnps_A֠ bk^Ngsп @d$a/{)ߝ&^?1ep#9/_9%%9 d 5~7t:8 ?A&"8:!*_"vwgtm]ş @_499R _߫/QVMTNS_vv&fv> ,/65,F[;wOC9D!N߈ (o`70&F?{ C X,e~g?;Gxﱜy;r6w,&g0z)9?{?_X iay.0N?sgcaгp$bff_-p/s@ w1ʢ1oejSHxt497iL91n s4O3ȯ}´]#@1O8,KH9HI%Pٟ\ _EiY'ʟ`\Tmmpr:@?Q - L0Q4wIo~LjFDtN+%Z@6`.J%%(7a'%h MlUa ɝ*ܓ1S`]Q7TX@TL1GB!rBӇ/XC)@257NJ{-ֳՒlX{6>l.cARkN@gn\f&gܑmE9W݃_ӻ:,K EI@{EqA>*nCfE2Om@z_1 }q׺) IFQ'\Jt6cPQ=1ϫv4[N筣6UqgO^fiZt`ކΆ7m=#>zؑEp%rz"8z[LڽҡqvcF q*Im1[H6Uڨt*yO.xmI9+~ {Jl˨H;BqFy8`¹Y)f72Xrpo%6ߒƮ.Pp}赦Hr2Q)C|%L2~L? &z~PC5=AzY{do[ݜ4Љib5jԋ װwR*K7lPguq_K Ek`&&J݊HO5P@7I.fv/ cz}$݇2<>Ài~듉XPTcj,otN#R0w{o z쁠sX,1NdT7Yi[">A< %1-m8mJ4ꯤ+"gu%ᙰ!i̊S-7^UfF)$}"|QwK6RWG蘐=g;)? r319`damvq%uR5;r&x`%}tuEhhKrЂ9Fzj8 ܒ-$=baZ 9d&U{vwvmuҋ&W2,iWwf3—nGEc#<+Sp\7Csƌu0#H+h';%pc^yx B鏅KJ믥?vdPb 7xhoFy=-ŀM_=OXIcQ 7 ZBA(+GIu:6բ/<"M썥tpx;P҈ GbVʐ˴Qrg鐺oԋ^t5k>.@̓oȇ`#|df_= l@SWqJzq wj7ve;ħb02TlI"ί޻7>MͬY1#3F6,:E e])v#B%V|T>/Aݶ 7rT來sX)6FEXk[01M!㎈3E(ԏN3Aq><'*#S >vS;%x1~-~(B݁<9ڛ汛L IZViؼTګ=_\(h18oB^=HOF\=f2:0!NȖ DDi2ؽ("u%mE(lF-ID-CzCFO ĺa *MxzY$6bt@.2j-8[VCU"O\otiS]+3-Ƈ -^ܭ,A/xB\6奉e9t&.XOgʋBKYWgCI979[HqTd8-Qp|fXHr8d JڂE;xkf`fhb m#:1P2uˡҝ+ fFҷ7D啿˜\ ^N)ܵ^w?>R"+ߟr8Ṃnb~RqpR;^~0 LQ^S V=E }>T-Vb>;[צnīmVW^/uSQqo)UP BC1/{B*]{ST|}D3إ)3Z!l'ڎegrmv6a-td=Ln:2g@5)pUO?b/ _ ]6 #,FWZGFߦ {*P['%=aN]Q$ܰ[)ėۄ E)-#AӞ_%4pƜH2YW[iR # ɺѠn \T540mI yФsy\OƂG]e (O~*ͻ?CΦ.-|Q!(z^( Yvպ/t0og ve %ĶۣPO FmKx"۪?Gctj(Q3;2r &)DvbIܢA~t^]"v܆ۘrހW$'ɴ("?\cBQ +2n QeSj}j"Lvf铔4{IOlׅ]BþįVɩvEYe0Jѣ6oR׿?/5f拵59ߘ4tX0cwUtMZh­~YgIz&Vϡ%^nY8,y smaʫpE);$lڜH&U,F`4~%O2ͣ )7oo6!VUDq-X>`Yghц~xD%GrMypgZ(*!ۣa&5gufSp3٥  s_4%ekbUY TClY v$a=&4NqI_@=2->Xֲ=|M-qL}ĂVnUpq9kJ421gg `qKhD0B:8۟#B \rHL`V?PuЉ$TYě@bYoi=YΎr I,$j,t:`ӍsoCÆaKϘg2~V9 ̛ I"ܧl坰|My:Q]9; r'UZ+- ar(n1|} KYQ7[WAoIi5dɺS̻Jqp: 2 8crq{ JzH@ ӎĢh"biMXEƽ$fQO ]UǟGnD(^~]_B +jPqQk$> Ϭ4ʨ+6rAfGnzOGk/0܈Ts6ntTTXQIa)p|r X<#-8-}2"a %U:ljgv3EѭI&}H*sRg$m3s\vZD#r% >likЪPbۻT.%*x T#!Gs񱿌qz9tO!B{w7+!O9W>owy|aЏDbבټm5cӀRIúU6b6,~:QfTH5*pAt;80SiC@˼Ig+oPX~yS/hF>`ā)c# RfzJ! Tui(A8( A$sˑЊZ(͎*Bذ;'zmI/OSGӼi/T) 5ߍ(T_I52kPfŦҬICnT4+X ?; {bH)#d~A-_ӁK#XMu5=yziyi,iuiB/<$ԓ@8`ĵ8lPUg5@!rjEk췙|q9 a4UۅQ'dY0˫w$=-f6R=gUT' ?ӕ?&J7vU4E].y hgO!q2XtO^M" %XFTn7E\.uȏK7mnR5)p:* g?^S-:_Av~AU>K>=?OGҌq^ m`Qh!Նe C# =O+g.M*Yru1RƂ{S-a^*N\.dP}@;SADn؎FTMtko0pQ%uRShn,% 2+IS@I P0 Hjbz)UFr lTq.or<:55|&I5m"?[Z0haNnz{vRCK0(_YP(DPd0l*sWog~[h >v{5v"7l"m 6/՟z_Z.pZvy"J9DU3m*+AF+p|6 XNICC)I"7UX$%@lտ4"Z&S+QoeQŵBn5)\FZ9ͼgSz½Z݈#ue1 "ljea3gSZm̐]KzX?IZ (/nrX]qFW& WT; /zTfFbA,g*/{8/|Ƕ*;u~Gpwk"AXsZ{XǰXMʌ#B( L. W`Xl+Z4?d7>p[{G/U¦ ߪ$ZzDV>M9Pz@X+t/>zoa _ v\YjjM8PCp< l B {gn&_̱|bwr~ֈDϱ=|׍JweYcAՍ9Кh2-ax%ŕ@oܱnYXO3~ J@z_SH0Vi|6"MG9οKVqmT`=ےӭ{GwDa3d sC/JY o?D;^L ʩ6 L>YLg֊o 'p5 P4n{"Nkё9S)a&{tjaebDUڟ ]Cd%T*ܳ ˧yR?rЋFC=m(κ;byUE:lH[;!_v Fnzqv:5.4iFfFVBJH(ЀhhUOwkmBz{6$ͤ/ap4,h "UtɍvW%9(௃nyF J,7=2#9,!*qq8LʻUS2D+3Í KRr_p}#p>|L?]*LV=afa ح_;rGMB#Xܟs)3qGrsS: ^n>ƭ9&aW5.Q81拷=<0?F( Ѝf, uQF`zy_N\6f50j"rB q׶qCA'3C ɿc-ZtFnWE X ZRՠ+;e$)HK<JZb>k Eb{SزJep f jr-CIe۹!;ժ\w[jyY98qF ?z7r5VѺzЅ7o%:!ouD_X ]| eyW" B3\e.wɩ 9$lrW,׾_=E[D:;_rؔ:e(mvb-8tS$P:NM7Bp؄ùBg-P=XNa;Zs8kw5B jruV;WC&#|& ͸~Am480nR/nx} N%"q,H)9zBeajGFޭtHXIf8q\e<<8SvyI( !|J3J մ&_\[?\]<2 6^XzTߡ׵J{Ғ$=8@ԒoþzE`hEvc%o)j8 ߤ:^ESM׉˅ʌw.MȱjAMRjua׭et'N gnI> 2)57H*BQ=~8阗1ۺW~7r+̕jfjƵmgzob?;ЭǞnYޱU>.k!^XJv@de نB%$gPН i',]- =ٌ>a1i| 0h}s8!Ն=ЬE>fb~Y,mq<ҿv9e3{aiWvabf\>Nt!TIk||;{5CFg5*^wjY9em:cx 19:Ь1#Ɍ -q[ʡOCߋ ;sAۧ?e{:nȔ1M >kMXei[|$5ʹ7w`f?弚<f܈Y((9( _g ,. $Ie,E; ɦхi͒/&ן'MEԭー{X~ l\c1-,{ Wԑ۳l<b[b/ŽO|my3{>FIduGjHY ]>/?0=%^NzdW6.# طHv]5IU( z`ol,~6߶c)R(u rCƟҞX?p[|@,xE"~c~ϳVj4D${`Ň^LPM$\~2ҀKt[Z&Le`CCF"`Шv͝W/HPޅpe;'34_81/ͼ2$</G!eĖ~|< ϳKaZ3vrZԠz ;>_2JwP=V )Y0zv}˗;uG>E]`VV4DDߓkre Uݖc VLS)B2K~ou0Mj ns"!0\=1Q׼gI!s<RX<¥&SB4@Q%vя8fK aZXF/O:HB؉$QhL]&9PfoΔ-|Cfg8x>  Fn RYK_jTI #MK؝mFڋy0s﯄쾘^ZJ"?EY@3ŗINK`^#W #V':$_Q1dqySLu,ͤ3b]{|B{UY>X{NDYDTṇ/ڃ?! 84\ċ)BV/:5}>ՙx/,7.3 ;hTrΨAS/Y% 9END>idjh5 }̒d G]#kmMcSos4}p IƷ8ׁ|H~4aCZڎ+[ SKgiܙun+eS&{^R* #G {hkp  3ʕI'gBFC9:l|j۲Hǂgux*]Hvqipj0j%l- \r)z0=9`}֮E?E~iA/ʷ:9{[c^Ꞹʪ;"bC[r&PJbur(GP`Jv 3%>9F?{@B"9^N"<*Q_du i"""=)es:iu(̍y |D"Vt(- I[j}Xn.0iFDZ'˛q̷I'{],eL%TPT6.Ǡ%_j"GGj9۠fуQBLquj[(о @TAQN;C-[lAvԿl!%P`k?yVJ ^_\#%10d>Bby7>ls&te`Bo`Nwo._<3svl!q\yj|K1S\DV2WEbP_xl4QKI7Ydtޑ& )3g"i@Nc)u-磞%wlz; *jȽ.eT=8VՋ>̦ 6ﱑju 3f/V{rZu |3"0kG (ʟF u5'E$1~FO#<]/xRwkH_|HNOz:\LBq~Yg%y'hZj E@;qr黸;y Pq FźXGZl)1].nE0g0x6xFJ}q|0+30ɦ2c?kkʼn8p7:Wsˡ̑e9wXQ\hԥ~;|XHT,^,`9GDɎ" 'o^{I5f!_G86#Em*!rVZ!C?p !i6B܍@kxn%;e7 U^l  EZLu ` w-!67G9n#][b" T^caa)ȟk0O}ܭeA!6\;Q LP < I/'XA'^xn-s6tΜOW@F. + Q2ιTqb#pBcI$Muhk#Ad0<&4O{ ҁS=6y ^T9 87 ~l>[Ž_0MLԎό"+Ab5YE:΂9jyz:]:e-Y}=?cf6+R+Vww;Hj|w#I`y $8DdmE 돧cmlhSRwFĈwӘd}w#]@DO|vs.R|{娯cùxBvӟ K>Lpt@ FWBXpLX'qߛXqqK*ʔN>|$yteUQXp`%OJXYgRRrb uA7c;9cBum\)y:Y٘ADQ+y0hTGyӾ]gTnrzQݸL#lϜ'IZ ۥL)˝l\.n7lչY͎cKv P,pԧvѦ89P&LԖTQV< k=.yOEaۖ7gC7p%2&4u<5)}1̡μkX4T7bOJ ?gaVXm $!:31ꐜH.4y4H;|?V {KƠ$bhTB<+Vr% ²v0?C}cKHKB݈gFQ/.”Y5e8 pbQ]fP{wazE!g|=#06g8E5pͥG֥ w/l2:wnomXIW*&$Ɗrml0j8h0 Ň@S(s+Ɍ>+KbO7-Q I)~15E-LY/!XV@"߈?@G%?.лK?DPP07N 5aUN h=R_B,v`l߼Y{lTv6ݟi ]c& )5,2n?t@a/S(6>Z~Q Gm%gtTH6]1Kcl62*D9SiL42U;`dk)4<.nY^ՐY {@- m Xdusې__D|o8Zc'F]<VOj#V''c*`Yk/m7$7 k)F29|1WHi4Nkm)~6)jm:xgIl"tO6=O9i? x Y5v\_~Sz~8^}j\nUkd~5N=9gP,QJa?1oF,tMwt49]pR )1HZ[S@#5%Xѻ Nl`̣1bE$iatf%ϙl֒-~CEFE;{~mqPrʩE7X3)8>8?O2lmeF&)ź3{,2@>uk##i䑻oWeR5b˺'_>Dgl|KG/xE\V I5feyKM) AbmyTԧV&H^_Z1ን&=丙/]?5, %fGQ^6T#:_V-&T'LS}YGv4xH`:0FV.a<")\9'\nozi氪C1.+ؽ)Dփ# Hk)a$?C< ~@fRX&Rvh8!Re[dR|RuQW:v*{uʂ'ҟDg$t.qa]=agFaKv(riTISCV YU-nR׶YE0ZcFb`(ni{NRBn 9x^k=}`:%og}~mwPmI7xŜ0vrC;s)1%dc3+b He/Q >xT6QQm.Ƣ=vb|o]Gi>̥o{hq!Pq2QE%M3ZS29ȓq_>Kqe9P+[u^uRp SUҕi< q-(ks@a.;0/ ,xnN|Y$Dzy|=ffKb|w (;0Dfvx'X_w&ߓiFoOGҝ~œ'VdPAg8WWbP)-sV!dc׎xgZC"5MD^/ܔا삶 t*ث#mRJ Av9VNѹJGb9ڕy(~2W9{K̠&ad^^ݜ*&S^=Y4PklwmXX .(Z*ruDiWjDwʫO8Ksi-*ۛפf|sVSLK@jQpeC mZ{DLɒY_Flu*1|LF304RMP };W&f)ꈧ7Uˡ.\xQ'u+,E?haj;vw4hCVcc[@9> wWوM9(5=L>$EjMNZ#[p5-_q4ʣ!ed+3W)k{.m ~F3et⍇AN?;9ྐ4G/^eϜCl"!lc^ eB`^T)ުJ59 as/S؅(ŵ)],Ϡo]ƕN6d!ih|w}!pDY>Td֕%7c/u-%"5W }~nSpc ív*k5_p%H(+)e(/i{э3vKR!H%& T =@l7*}v]b'eׇJ"hFZ_`?Vg[-eIዦg"Jm͚s(k4 8 3-iqܹJť4pPW -3FhX@H8uVn^zkZ[dC4`Ya+N3}|PT1]NXLуAѣ0;1#fST}T,Xc9/Hr@uzʴ,Q\լ_Fʚ$-s`'T6I"F Ce De&7u1IqoR#7?y A0i(ʞ#(TvW{N%ޱLjgP 1~6hmGYbCn:P/Jb5A+O@+[@XhAǿl3a*Y P!O:#%#fh-D_vLf;L]ϲ>ο/.Ok(Fo:%wc),mR UI(F [X+"^~|STF:¾LaRhebɪRcNV w[ ;CUOd:Q؜n xM2Zp!@${qO#c g RK5'aA&ٕZ&̋ j7ݯƧT.o_s4WB4;M;qd3̪OUk_gE~Y:4ʆ\58 sc>aD0d?b]46ICm)/2k泖67ay>NG8Ir]Uˢkۜ6 nn[V@ZdNbϺ7b't ( )]SV?njds =RK:E,9;Y1]7 jpsƿJ ܣ\)TO%5>Jx2 Y)_n ~CE|7A.|ο|&%|Jۺ't<"RH"Ta.ȿZ!K/ ͻˣ+J"j{߷^o|k݆'pDOTqPjOK\EߓD^:gA%a){"2 G𒭯[ӠWt:G}ϏJ)>A%Zе; / 7v)tEBVWu:EH^BPqq䆜qQ*(wxh)⭠9jv }ъ&7Kƕ*WW+o$i{%g"-l1?+ꢇy!E> 2z!LW"ۈ6rߛ1^`w5{_uYpѼĽ5n?KS|eth^k-A]q7(?3!tT2W֬!12̇IB &L?m DFL7,9],eҨo>*)*+g#nrjLKhUJlw}7]!$,DE*?%c<`#H.4 #oh ŠéD{#-Uq +<ʱ/T"qP[:tO"ڠqګ7a/O'goa3@ X(g8́4a]1:4s_J1dx(1O>&M*#+hu(7XJ?|k,fQ2p/5lRY|`*C!9l~9^ՖG{)2Ұ aY-ݮ L&Vs9jt ݌PJp|YW L066Eig`Ϩ5@9M5i,<%" fhI&fᴢEdT#/+\$ ac8}k.^4#:rfQڬ,[F/D<u~JhJ%v._xWczgVraґ?}[F`Y:-YI))_b)=4v!_b,ba!M17ʌ6DV-R3{8S\a,fs[K,t DuxV[ ?aA+<KOnvTrE2 )~Uz[RvףvT򃲜aces6KHxb$@P#N+V=eټPJ&8o4XBQs}PTڱX@GF{-*aה%0)}ppeVW\Wչ4?"8g&BTYe[W]s:-c%bNQe[ewb̝*j23U=Z!s&es m(tezˁ$h1J}?i_w4gGg¸` %_Dc:3ȴ(cnM0}`) IOUP~H)dY\qvt%ޱ൫{/̦'UUuxjfɛYnmQ I'0rK)Hƛ*R~ z/V%isQD̢eVdYX'i_jH [~r/#xz&;(x3:=]ZmtLX sVwebqG_zߑ44T G2gZE0'3]LbXeF^Oe\,ה)2?5TaE O*LkW;&36<dw7S\6޸5%4ɝV %7 yݺLSx4CojU&N  O endstream endobj 156 0 obj << /Length1 1912 /Length2 22963 /Length3 0 /Length 24132 /Filter /FlateDecode >> stream xڴeT\۶5S;;݂[pw#{s>~_Vc1W[U$j "掦@IG7Ff^ *GA!4qvt7qܬJfnq>9x3_b:8z:?zoĤ`ܿe@73 zY1I_Y?0s[[?.p&@;Dp,\sk3 _e,<?*H@ר|̩7hǤA &rI)OO?MD ZjEG{YJZ{͕̬nr78X?/Ɵc0rf@WWnFWS/IQTSFV/; 3GskK+' _b" pt&?7;I7cA0&@6?G&yL,ec.y]9Ln?Bs7H꿰-P67k/=9a?P{-*!nN rߧ_3?G,:|iT Q4S Ix^%-9Ӆ#K *n ʢ,v5H v(զô{lO3W3 PGdRXFJs"WS>ՑA?yezGF_ٱ^Yky#>Ƥ_dv޸ָ,S_&zF%}I9خ; Z~"҅(JŒTv;hl?1 :Ef4v'eI%XJS;(dII5Pw2vNɼ"8=< #W~T֮%8+r]@3+dN㘆gCv踫cK4˜!LV*{MeNas R9{'SIkĕw7eҟ6dyS` s 7{P3FмQówfu7(~ih}@AG[x_ΐ!x%0{e3YYD֦(V h0Y/-@Ku]hBԏ s$:28w9,@LrSxIU<~.xRsُk#uG`5T?($0Jk/YpP=ZZKV3X$ aV7苇8w yTڙk{R͎.=<݈;6^iReZ 9HM`L"3CF0gKƄ+\rK-E?kdzk۷`/N#p+3"Xg~0B;qQDWТ#֦gͮhҢ]@ [ps5D'N0( I>IqBC"_@U5)Z>˗d}~X#Gi Ǔ99,3ùʝ#u o.^.e˩6et`̺JgjR r;Rh,EGҙ绉y}t)eOǝf *BO( 8Q72|ι7 mљx&jډJ3ßƼ_3Oی} 1ja$itC_8gY 񫧃P~*Qo:Wj045lܲ6vysis,>3 `?b 4._˗M"^fʋ9h](/X[ [;ƽ)n} Lk-<WלBv2& $`mP :/Yp}=~**Iz]{ 0 eK ULRWTO2VPy½U'0٨O:Fg8'-PKbr@m=/%ZN!|)d) p=m-oꉼ{ >Q[7r2)\Z /묘@gFclKz0A_a#F9̧( ERv\6S@>Wo(=\.e`! I-Lq,!a: 4HnKv[C:d5o3!R&V`TV~)oI`& Z)'阗|BJY!O }:؇-q# J x19Mu'04c͛hK~ʟpp.+yODkv(6aݬʇ_"921ՅmnV=BI MmxK"wYmp^{Js!ٿrnxV穠6a5/{WG/hFarHRO~Rѭ^5s_ ~2G/޶c $l! Z Ő b kxpR;*~Lj|$k]w]C~ycD,6*h6NT}G_ty%92fY#;+4r/ղ' xx줩xay6,kYH%˫!+,e VOphxaVd2 yŰ<"eqq ESxheM>& UKe1/QˣFN2RA;g(nNvܵ*Jڲcf_c`b<_jĂJ.8}WN ؿ*ifd&\y N1DluD{ wm 6[ܤΠKdRSk<؞3T:Gctmq洝vpuc<2`=\FBU0keP0M*[^VnNSGv)T~M1쯢٘] :W4(&;-k+Zz9!:<_Tbӫ~R);~K'| 4d*̭ٚlba@1 62ta">_n:ЊhJ%mtݬdp <Č i@=3 v2)|8@0X~FY*4 H%ڋH&֟EbJF%:usKߛ%6V$$:{L(|8V8)S."Xr&zބ.C] ;Q E @ MFɄb+ͱ-)|_{A''W /<MUL&|\=S~E>C9fP?R)C.3Bُ-™x_ vC}E_?8 _xO 롼 a9di~1 d4(+^>2K6j៨.=J7&/#߼Jhl}Ld>caIp5z܀vHśX:>-y*:L D(2vDhvJ[$؋g066XV'Gr X@,]#9b?}o KC*j̪Fo̖<l!jM0W"~À4KGA1Fsi!RqpM~n o2H:jىeo]楩4z;-Hz` E ƌq#\!2ܝoqVJ`'ʪz}qP?cNn~MMIs{9¹`HZ82ve; ip}L)ٯ *=s$sQ >9V&aKzܪ|ɸq`}Rð/]Km*xNi GU*̊Sh6J;jv=LY&gJDA(euGLWRlCu=-Hm?ۑz !_7-;Q# ;oU{o[Ue[`\zˈs{,5oJ\Ľ[Q#o\ 75G|!SaHAcˡ$Ⱥ2ꣷڿ.oP#sUAHڼAk_ΜZ73YKT" 1(^.) ˃DX{Pl[zN2[CLM89KOLedjuQ^g]*6ӷ6]hzPXBOhRv!=RZôv/aqk&Bzsuay 71t*)ɣW¸bE\d6䖻K> (ME}M驺ZOz,"`׾台2=a70q%uJYq躷eǾe_ =qh_`prZ?7vdٕ*S~ o0 Qy\QX] Ux&b̥2XQjW;2ua;}5x {ir%ǕYuY!of@)Tu )'qdݛ%CBS~?V#f͔$ߎӎcy39ηlu0𦷐nj#Y #mզyә*ia^zY u%SvLclB"`Flkb|f)AEE,,m$27'GQ '߈K􊈋~l,KɏLy5+ylm†"'C}i1ĸ\;%C`<˶ڻ,w<֭|}T}i H !G|XVB հc}i7n[]SbQy0- /MkR}~7"XZK(I|E6@+>{P?HQ0<:tfq̧;ր3v0ޣl֨v@kҩt"S= D׼z\!gJm9 'G ɆY2SxdCjuqϪ%sLٰ̢"-THݫцɏvM`O(L+ae?.Ba/%x}r:`P47q/np-y^'Ewr" Qgw%U:gBV{۽{?DkfQw){Fw$D**j~7$/H~B|I):4OzPC|_>ulh%SfpuU%pQ' vʅ*;ڠzMԗXI "lu]郻P&b{τg,f*[=OǁT ]aMY Hn/ns'ZI2DďmNSXXuj2sfn,=X+UmΤ<+Χ1;^aeoƕ{Ә s3]9#iH E* a) ['&Bɥ9~ZȀi1 !7V4Qq6/+MIRпc|QcQY_mc#7+jaE5@$^'jHЂPїPR"`h +q4SMZsKÎI霢4XDH^QI'X5'(rU V 1|u0pQůBLQZUڌY϶: db1WB,$cH"qՌà#CJ*dD'Ç8[x2Ҕ }P#XF="PdȂMCV\?9nGuyd3BunHg%v4}61(XKa8uinڷPսd%0w)}x̃qe@oRp̋Y+ JB$+8zi|ʫkOy H[ DW $+8 &Fwo ;Gu8ok34J_TH[ Η9utZX, L>OPLZ$8HF#.ý#NH~ W\t"9!&5A" `6j&Ǹ63A2j4_MgsQE5kÐ`4'dX ,Hù k U52Af_M-u%+$:NK@Ha״ЍzW$A8N:`Ԗ="o0#]oj[guR8Ҷ2PdJ;ðP݅\,*N9L)U,F5q%!wWR(& +dM@..#!SZ-OEM81`!+ϝ7Y9|OnFǩ?h;L7j5Uݸ SiyD#NR<[W*\ksI,d1,u2#8Tǒl~EE[Pzkl$ elFz8OJ1k"Vd|_@Wx L>0)ń|ûW XABEmoŲ ⇄ mGi DZDȬ^xMGb<}m×BT=1--T8]ݤ,Jzmk+^zD~k3Zos83VU +IU("txɧe&R;ϥ>2 0g?pz y)$r KZDR䏊#.YX؋)({Ir:fLbOU Š&*ݞJϑ8g/q8r#߅li#~ODwOsRJl RxS6E~f[z" 51O?[<^yDT/%} 0QB h v9dwKog1;t VvgVR5Mh*d!aqR?d3Jzs}(jYSc'p;m71i37~}ۃIo3ɘէDGHVC`O P3[wil0%D̄O*k}Ǿ^^]}ẑ"EVg#=k^U>%eu v7qx $Ne%e±B{a2Vab#(_73,Lu qzv]\-dl/B(uӵ_up& O{jEHۅz~J""_iڢOⳭkgZilA ?Z͵y3܂4 s+å("k%o/V"{CڎFT"O1t_#~)4vzgj$''5]YIe9wE!88G%L3LW!Y\]Qo%O "3,'V}l6VܼۢsQzmh&o굧̔\IzͫHg@ {#xY Wa[* ܒ$H@=6u }v(-GKA8!GIA\~?F IaKtv9F]Cx׼ZWc 8NjrBL+>jxN|ŗKpnb 蓇y1Da"Q kҴOjHt-(k4bp,ekSla3-x x!?Hj:""J#4J))T5e]`]$FEScBNӕqD0"2aN>K.\c i2nqԲwwk)/S4F-Oi8)VU e}r$(MBZ`!/>R%%s\oN1](CA bǠW5')&q3۾9ܑd'+˽l$<͖ xK)RVۘWz^n{+j`v,;˱wqK,ڲのTGe].3 ^~gqm襰~z7(#I'ʥW'f\R:^i3Q舞^`)NpjB7 ژm埐 8\( C,5w$ vŔ&}?Qe;9f1vD\FeB5") 6Bs9+~#\siM ݴr*ER)RA앟R ZPT:Fbkvś6Ro:ML75$UyONhȸ<4G=c0R ?̼ TneId_9sX%F:HxEb[&wSž]*/yZZLLbj1i.EA໊i3kFetH{ $ZRcM& uo?V4wGdʑqLhHZGkܘ+~TmzҊtT}{+u$%ltJDD?˃8~ԑc=dN{&}Ζ;$Oe|VyKC4١W^qj"9I1W2cw4njվm(2""Dy݁0D֪,{. RN]9bLgťh2@wkstVoJ0R/P ` ^¼[/у˦bNg^ xfo٠2L)EK}nMފdU(S.M-wpjٶ~}{eVLs;zsMNjsjmcpRke>_ MA0UZ/#:<i+=eAEU-/ \ wDkFBΣ/AR!'.up'g2UJGUhZ6t.hV-la@g^w6m =ȓp5MfMed/QTfWSS(Rzf^.Xƙ >UPg8dfc ;8H_%l")FP {yDXEc I 1E}UK&aSIYM^] WB6D[_^AcW{Wu*jGvţ7?՗J0:uK.X>|ˎDsxдsˈYELVn}S(埍E;D%!GzІ5dc7vxZTpݘuk[|5aWѣ6cGȖMvDT H0d1sCvZ=',RR[SRI?I"*l 6|(E@J3j!asqZN1;g6InKH !*0>RIH0owuӁO>롉.wOſ=—nst 1SEI\GWer&abߛ;Sf<4&wG Luj,;njLBmՃr\; b,Tk&rPYo ~@@ɘ6懔]=U'gJ ;Nbne؍re0zyQ$q#ґ,WLCHgdb0vT}CIPb>x,X\. !ь0X͝ z}&&q7(je7w)#ӻEQ.Dnיyx"jo7)Fk^㚁>ُ<$슮#"}ǦDȑz1(B~pa/Ȳ~sh|z }woLnMO^9J8*ٴ&v7݆9% %ŭ9BS~C#$aw%K[;~W.|燍 7ժ0,flB8*LbDJq#+;NdO+Zy!TnU~W5GO,>DB@" $bU l3H[eLi${$ 1Zm:j~8ZE 5U&y끊+s vchqi Ă7F*+xwJK9n;P{5*Sm΋.38W.'U$ЮU+񟪓ZB>JIFKʶ.XGIW[xROm8.i.tY鋔L b}Ñ夁"F F.zTeasd0hfncx<`*/zL4[(ܼ:P!xP?uaK>bꤿkV eYr ~Gz37w6) %} Ůw˝R  -ۈc |!FCP%7h 4 OI/{^ g86 ڡduŸ"[p聯ϵ>-UORk#5 k9μ8~N8Hg)] ʼԐ|li89?<>AF;:j#SڔVq@/@ OmO7IH!aM6=4])SŧkFNy/xoҽ mKhv<O nn '5\odAs_h+51,7/Dn IRѱn690{ ӣ@X>OxT6qנM)Kr !S~jd.}4#LTUJ=|glIH/^iUUJW~1(]>Q™/P- _nݓAe/a^@IYwÌtm yyH\xZL.R{p6ֆٯ|غ QԀjm6:1ty(4ޞd"xuBW̞85ս^ y*a~3qR:ER-68Ч 8YW˱P6m?J`|j^X7)Jm:X%|V_l-)-| WI"!8?WXs䍓b围A;әc/ ~r;@'-_s-B2 Qj4nv3!4}(oY,`9?fa?f\"lSl:y? UZu  3f =;,ze/0Z^e "p8%=Ynqҩ3`LO6K%)I:lubjq_%U$۾c Z>}mO D9?)PBkʪt^R3¾0X$M(Q#.bFHM\W_kG}v]DyFƍ1Tǎb;9O7Q /i yQ h|{'?.Nc*t[0'hK p_K57x]u6ڔݔ}3opVƼ/a,i5 ɢ;@W[`%n Y\gKd\(]۷"%21K_$08!uX\PߘCUM&[Rvn9|K!e[Qxb:?e8"d% 'Gd5Ǿx#n71. g3VaG@zpv 4WhegkKN]ԁl# G.j6ZgW?!lF# a5 竰K{;˜m?c0ZJc^A >vS+X}x4 em"g).wL|Pƃ/n88ך^`B6X4Y({*̎V5S{! Tb蘐8SK$hTxo {ϻ*GXB`7Ɩ0zޱt:>绾{,0e0;_&/ޝ?Q6ǽ+'c.s}X`}q;bw#.\TC24NW(|B:-e07[H0 Rio{Ґ `G%o~7dx*0̈́eȌnXHaƒ2,v'(i^PG3;0 >!ձ@f=H>h|:m~]K:LQef 8y2&功JNoLЂ$;!3WB{tP |iw.R#>nT %)-) rinֻex| E+ByˤenTd_N@FyS!3sW'qMy.)f&y(![]扶kM?i$BvOCL_.ku8X&dYG KU[e]CZ&OM geeywN%NjD@ IF dEG Qk˺RWa3Z0?A*Ay*r$/1|'/q}&n ( z)͹OLYr ĕ5b)N0*}6Ƒ1eb? %l-o7b%i}4 >k'XWVMgJ3DtՕb4J% ca^ yYzWiDM9lfHVqAxJ^~x|ݞREt>-YMJW"&;';zfnZzӸ-ٷ7Lb}ӍX!Y=& i|g.[U`8 o2#BlDlt{(KK7`8 쮯0Τ Gr;`4?AjC4bxZx |/πv'rJED1(kѓb|61SW %]Xa&f9V`jzp'hGоnD26 fI՟hpL"Jb,4D%"- #6ux(%;X~de #KI/^gJl?6"[[隴45Z3s_md$pùefð?i%+wcy:C\{x#U>:d0jNS`"k֥nSuE-e"\H&,K?Md1uԫkQx|v<3郤ZƒVT fIR6^~uwˁ1w5klخzc"V}QpCI[#+iK~ߠQݷ 5rqbJiօwRF>eH?˜mLBEsYWjEu܊,Rx[ķ} >`MoO̭*47U,޸͎:\FL9:=kz"'IުԴ@gLZa;|x /pI`?*#0=īWwwX$@jŹްX2Mq?;]2rO<}fӐ{}HT+*̟ [茊qgc <ӿ1⒉V~d.MOa($A,gJIlTR NR&HS@Hz)/7ϱ;QG%>VG?%Sϓ4\wWra'rX:AH]*(}F7}}TCsoOHa܏- Żjx2s)2j K'WUU_:sZo'5}EGwA;+DJ׮!ʰŜ:'6#8xFJ& 8WR1FfX"+jy)-:.ju/C?a6Qpфrk8JS$k{]۟v#rp6 OcgP=^Msh\lŊ_9 ލ6PWtЬUNF| !X Z߃ㄇ7 Xhޤ1*ԕO){10?|{hfUG颰NOGÄrF4q|]Mi_k^gar0S)fe bhڭݣCwV Q`+mz7](}g{X*B`!f!& K긳K+Vpź::by0Vx^Hi\axsAT cJna9j{ #ڤ˨TX>ym`6@M[ck0<DhP` ͷ+%wgL+Dg1^Ɏ`#jC2"@#ΨgZPƃrC#:<ȪA<*t!/)|moUaP؄p. +Ww:^zN=>g("wik>FUSz(jR*nyI°bS s|!u圎Bcgp >@` A7M8JVpkݨ+_&O|젞-.~Αw + 6f9X@'G2iNg8y,fjij<1ɯt i-*y/3$A>ݹOU3x"ޱ9[4*2 M)͖[1ϭ dE.>#=qՌLLȃ(<(rNQ !/ݥ(v:߾L(e~尖:潺So4,m>_TJǿOMn%9mU?:H)M8y6lTFə{ sX6dg"W]9}ثN%Zᢌ;$XHUw25(]) Ka XUt΅!7Rā8[[Aa=B+ErnՀcލ̈&.RZ%IQ"atGȌ~ K׋u uP9+7k.U'a(=V""m CS cv͐krd}l_N࣡ۗcؔ=cw/L 7-RoP~++YR]H7@ZzXut"]Yj| >c;fm X `3ơ-tGnM]Ϥx<~Ҵ 騡>JD3߁k~ń#h "?f1j<ag* 1DH <VdR#ƨ&Ah`կ]9/cS9'RDZ=T>[;-l&M -ѷ|huwV[%f\=Ƅhs@H'/m҄Z+)FG3W4#o?!ہbQ]ٰDJ^E98z f7) O%Lݑë0JS).QJD\˾^ Az`JO{#_Xl+Dk E@eҢ4P@dZÙ[I>\ZAHƩK*mŤVneu-diɢ2v˳.r:c=z6FUl#^TX~䞡N[GwNe`?6 endstream endobj 158 0 obj << /Length1 1823 /Length2 12594 /Length3 0 /Length 13781 /Filter /FlateDecode >> stream xڵweT\k-அwwwZS\ A9oU=DIA(aob`adɫٱ03Hl,M)(DF K{;1# (])@;ӻ`<,j3] 3Ҽ;x8Y[`e`鏷#@`dg ag(ػ -vc $UՕTi88;O-j1a5qP W h^9=@A]'ϻwyq5a5m%q?`-(+wW3'{ۿ-@ &&777Fsg9_YX:읬W' /b\LYPr&@;g' T;A[;?1m68/_9%%9hgdgn28 T89!/W"wgc'fdnM-AG,mwsfv%UώA;F;/?x\n6{ۙھW >1w@NL.Lv.@i~[f@GĂO变/{3 ~r6r@N.@*pL-M@>,E3p-~_i}JMl<@3x&{{CP%bc`d oJ?-DXj{'[#Y:KXM,A&3\v6@ #3+ǧ5wG_4:;ؘRO&Y-9i;ۙ؛Zڙ>s<;;彷Mu pp*77/ `2d0?L&@.?{"CDv#;Gv0ɘҟP0YaU5Pqy#.{G? (=wb`c0|~}A|b__~V t,ڛY4LCQp3Ub h}XI% gPI&kQaڼn%VMݘ* # h0f/wkfǵND;{?M^%ꕷAͳ`8٠/u/Ow0bWh Cdz#3b 3o%Bb F^I?5j Sڡ!~c{d1cfۡC8#jkܤHsL0 /晬4ӷ#'51ȩ ^V-5+|!PF^dvhFnᥓ Ik5r@PՊXAguƉiwǔj)l™ʚʔ1 %|f1" b#~#&pL AtF{%wKf]֏K~;Ft;!U:H}z_ؗ1URVp &|St'&U/HՐ̒RXŃ1/[^Z><6 ҕ qJM)f0/JunOyISW0'k/صZ8Gwx9A&.LllޕFXO`TSq<<;4K*H=g/fc] Ghpgsl:ayjlL TNb 3՛qA'yLEhl˚گ08`Jl,ImK*eQ__sm65Gj3QȦpefjȰM+v?. ǐRcP&Dn$뀠E0_^7E!OOeYGRJfP}q8 >X"%Er>wk.%]!!REPƔ~Y5KJ 9.tjZSKS; p0&D 0Buo/j{;@5ʬ6<.3F%Xr:ᓵVR<99624:C!a yTOW;)Mfa܄1%Ą$r2-Rzf5htX^ C!nQ[5N-dzq1{<waW^# rd㷄lY<lEOM[aԵ**X:'ԟl78lnȍ|6gGmqB'Q'@Pp0{Y*ϑM?  vM]DG#K͖a) "++u njSMq.$щC!*wbޭ06 ѵusKӇ"p\U=4{pmKJmGsbR/W+riI YO.j'b(F=~j+6RoǮ }EwpIK05 r`p, 'yJO@aJuCqI>CWJ FH|+8U{`LewRs{쓾u۔u5و)~U^f ݫ'-׬P1S98j E>sbpxBZ.P!w14YP_ N!1o}+ocMOD SzSN?#aog㞾 KX'ds=s O+:Z2y~5M]L!%xȮܭ6q&8]{iOI*y#SZ^9&_dXʹ4LdC &+( %8(U]ϤGS]"~H`!+F>\d}(vWv/ wu-Euy4&m!@9ph/д ~ZK-~Az2Q8 =,n&0Af7j7*B(zMY21sDY8VO{s~+Ied`-PqfAwCK৖]hbRiYRv G4+hpй:F>u %y*U".4NY}Q DKGi5BZMK+f]CK" aXLٝrw!K)å~3X+쭙,ZJF2_m1%W5;ՏKARg]H]?kY቙q(@>dRZ=Ԓ5,igx ^JAS).Pvq`1ߒoqIxf]yw;-}HxjԻǡqW,~nnM &A񕷹ԍ,)q:ZJcVC>=:!Qܷx鳂q vsRz$x*۝:8D io+5F~t}<,>r1vkqcR"^E,nόMud[EE(KIduW{Z;P7$яEHCG))3ʼ:bjUt*=MmZZ#8b`]x E_95ƣ6FgGD^ql4Fʩ$j=˟AyO<f}K9rNCſLTQ̾`En"v0=U!Borƪ. .C4i W*?d1Phw:U!HcrLi`{,5E" F~&.b,cwW,nZM(/4gusWVW ON3Glwo{~I4 KZe)zNԧR~H,7[X i-2ҏF=`1Ls\fV|eލf%&;P{]$uVFSӂx'dGy/1D7݄+i6AԫZ;8&\XE(a`) 7vpGoæ?7Ih`]/꺯ZpeɸD~ 7v[׆mL#3gD?= m;gs# -p v.ꋈ'zKM {03jCfO܂II@uTA/6ͬ|-lܙ$wqEzp:-e`jhM5YC&ȓKI5--Lze[{ahJf`2CUBy2HezP>MCli)BH5D 6(XXʚ b^EU-y3NYGnyyO-}D 5, Og.x'l^Ϛ4>#̽hwwG+d~io,,9^hH9qvcȱLȀ'WIr%h.i ׯsL)μںI6:A NԶ$F7Oi2B clkjhv״6Agv5F\͝"J3%},G7rRKVefm!=v p0j/~ hόQGdǟ܍DJKyKm $\)bSȨ0xW~Gfp8Fm 2_ cvʉ)(N~ۚ8].aԚ6 k^JdP.~W>TtTHAa|+r 6е$t0uA먻ӗ꺒/'_>}b[1X2fojqC6_l[!H. װOuH"֓h5 XA|*{HUV81"NUEcCnn$O ȶX׈U$L 7Ȇw[ 2 fy+#뭵G"_y}T{7 5vZմ~m4 ID%#/.!O<9KN @ɍ7 htOC,(sH["_IH6bOM;.Z0Y `Pm O˷q.ϩ_T{J<$s7,<35>KPޘ{>(A٘W&jmZպ 1J,crun,$]Ƨhc8߅Xpзr*'rRK х| 2w6u|) rę?ر)^}QRA4v5L#Dm B0Ygt; n{ =kRfaJ|'`:$cznWcQ}T !">mfJz\.L߭r}$Xh<}A]oZɯ| cZC1pY3uwCƙ>GuA1U9^(WV@ z딆f_q[h1ֺmdXINvӐ0͐Pa>1IRཨR.8upkϽ{ՖXY6$`S%jjl~pM%O }á, ¿4!PbOۍ/꾪R;v[Б®]wOq,N[$N!J? =*t$h `+؟ػh84xw;>Gb&5_Kk[K;u<(G14}T {^3`D7鄪Jf3)KÎ>`uKLdHd jCύ8+։'<\ʊyø4Wbn@rz-6: gZҜwj#2J.AkFpa1- q`tZgDNZxz]rq*\ &t%PKцKׇ+;ĻC Ӈ1#"w1ԂsbPSqj*L@_C}zq i*%KG|kRUF?^A| uf4(fZ0I&$s- _%~ŠF͑c]>c5kؖj-1`d\8~Gʌ6cN%ojDxn>hp!ei@/iﷂ<"ȝ{k56DT *˔GZU NU;]E JlB2(Y$s9Zps1eMJt1-6%0 $3D؃ c$I:zkNhn^c8잤ߐIX5`iE{]) }fׄ{=NS' O\Aj 9rrPi~qpje'j$L2RJȋ=^pDrqIWůBw~|%H\1X(eX' @qGO%h 2zht]G2j?&0(:=&Jx: ^lV*k0?(ˊAd[fQFƯgUEor횂j8Z O ٽtA$`X G[mQ3g󩪦^:՞ui Sl~؏l%vSNJ-hNE<<*{媧b4:U (,I1{HppNTJW&Atj[eٛ8\P~hc~PtDlLxNU,[iyXgUO q7¨B|}pهPmZ9-e&Q}F[= Z \'4iSb![tjN(ׂ'ow[鉸(r soY4ެ5-d$5)ěg D8ySsߪ@iS;?A_q^xqh/l]JJ] ɿ\8ظܡ{z#2e2;|YܗS/11`? ~ Q f剋0M2޳cI]5L,2OI/[i'7il|oЉEϵAj7&BdDϱ|lT~#i-ePҎ| T?[Jwi8q$*f4""L#TB/)HuQ`Z 5(Tr`eDuu a"_MQ^c⣀_sd+33ELbҢ5*u9+/f* Bm ,$j%*_OIlmw$ʏw gH~&TT܀FvA86G9abwvKp0|1d xbl [3VZr[GKE[ڣ5~8b*ɝ0$Y?52jWG2Dva)itF@'IL y [@X$-Rg^=| CmC4&a按g!ꊍ鯎-}K|xI Dcj?#]{#*nXǴ9#`~Z%%=,/|r-( N 3^Z%y*4*bly_Qvr(ZM=?n"Ƨ^~f_uk'[bPZбy '|9sWtOBEjYqM0"kD pQOكܾ:ld |sFJl S5G0a}ێ셭lghU02_(o&ߴZ'n 8'/:@xGg%&R|(i+ah=~,E\'xhYalr*NlycȢw~Wͦ~FKž18mHwEp^|u]dƁpp8`)4#祒/ :tob}OhE뉍ovVkp5 uA[G&B);]BRs-`(YDJLqT~5v"qtl >p\ʡ|utlQdi3)/8ErU](_;-7$=d~4l,X]Nm֖<YFAA۝'nBu B MGشz-hכ{>X^MY;e; ej}ٯR!ylBT|͝ ?i,g $K^קN+1DM`a*t$F4BH>肇#v 0kn\w'/ې|-gÇ! X]Ysq@}30,Ԍu*CPak"gq-hvWZ]ʩX\EQwQb ݗT>婞UQ]H sot"nKx7;ȟKk(4DpƮ!JpQ Ɗ<~Ð' a7k`k]8ST9mU!s兿\Th94 Pq>,gH47=TW[s[s+Oz؛ޣl`׼`V7b'f/vF 4։e8rfRixWRyZJ` ԟ] ?^NU88ERh^>~@WA.Fݫ!Mh8>`hvsOv]LYSj ҨtS8UeUӯіq\QmIтک< +е{ВbSXܦ%5lK+ʖR,04:7,%/Ga/W]rꌃUnfsWf;Ȍm,ik9|rA] O13~Uې$8s{OF`^C_L,mJe㔴:շ%I1.tu <'9PYCRw(AIJteN#KR[Eڤ=4s=!-'vX'I6fu3b){H&`E:3q%YTo8fcrgTq,&=b9wz4%m.UW!bNMGC|?8%D O8,'/No5"YtmK"# XĚq*wK<"WdWķ伬!QxUTkd0|d!8 X'HͫSX*@ćS_lP.Wpc-iP0WAbyG8B/'J=X+agn"Cwgic(3Bo#n{er)W/K޽ϡXUAp9\'W);)i])> b# iqޒ?u1ߔ_IK Y4 ݏJT]us a<[^iލlS^&a Tg܂(ZZqxیݗh`j{=*G :IlI C1ybd endstream endobj 160 0 obj << /Length1 1712 /Length2 21170 /Length3 0 /Length 22262 /Filter /FlateDecode >> stream xڴcxdݶ6cum۶I:Tlc۶mض:g}V{pycEA bjk 9102lAN, ֦VFffv 1-H `fdafdefAHA@?)t2Rwm sK揋O 6z2dLl],F S,#@h Ff[3:P&RUPVaXjSSא(K) 5@1G7ÿ ":,L`-(T9@mdhh`hgO}W[+OcA@_@ruO+8Oa7@Jca<L:99; |T*svpCU'.jgez֞FcF gG^-_3Kk%LADQFRBMA@ btrso<qy^7; S1[?U;"m>9:3'@ 6(#_ ́Nft3`Yigk03vz[\<\'g+04qC?Ot-_J[_g@iL-` 4C`RuC?rI:[[+ifdcia[,Q hldbO8gK49w,XNfGӄOV `RTQUOc%25X98FFXdCgS?401l윝fdGbaf0`7do"'D.?^ߑ:՜lZNn``X>O%97oQQ[7Ovv37xɿNxg?[; hdk-{Dl94E%ljl'>x)Pп/V^W'TMeՖX5so"o,!2ɨWMJs*S>NИ8yb@LW޾Zm e 3&Ҩ_dv0;,]_.]JNJSaY.J큹^XϞ5%yCcGw}HɯWH%*RɧjG+}JNmW*ztv_%;ͣQZ9-"tS1kuMZZ5Ȇ}]A=VЎ_}^S_ha9r3JIꟙ;XmcLᥐP~Au~"S^ +Xvok zқ&V lӋBm] PUD%qDc[wilV~g%m ͈4o70̣3~*.їM# kq,נ&Qܠ,+ȵQ\NU k ʼA^J$h "4ڐѸz@"XW|rj" ]oqCr| RB(Os@U|LNC `Іٜ_#X=FYpǙvp>`;xZ YO&gMU-Ⱥ,N/b̺iO)_D>.O{-Nc&ULKhBXnLa>^,pxnC.V 2u]ACB`oMW jU6Q!`[S8=N}*"dQuaB%o!spżE jWG1m| *MXQ G)q[|5jSر:ǧ17 #/}ΥEY,j|I^%!"~8ܓ`}d!0N~)Zjzk{"%.?w'GH\Esc!<.Vs2hb9M1[m&4G}0Ѡ*F7ӟ$U#V8SLv:\4B&LLOQ*ǒG:*ǔ9Z%rG}#J hSy=7*78k!e]7 Jgw# Cr9MXST lڇM$R8l ftXz3v2;<=hbfo&"w2d! 1Eu{a`@'5,M6_x$ثi}J5niu2=yJp1ݍ*iTSd>V1uT}jָtS\yN_,\{BkDJF@u){QEA\MW@Ken,8ܧW7-ߦlF~ {&EsdP- To=6מĹs>TG]nskcff3=?}|"l@sʦ%̥SG+]b(;l׹sBQE关FXup]JԔr]+ۀ/L\^IU¢3#$79~W]א-ILc(Sgg5<ɑY#{R?i $MkI^JQ\9w7"h( Ғb6@ȟŝ$0kITcm: ﹵|Oӽ<_W׊AcW; 1nƕu[.դk-ML}+ŶߪUto=V`_m2T_BpM*?0>BYKr#~YtcC GQ7#f)ԯ,eM,νh3wMyA(ԴDk^0q][%϶[Auݑ,8s^顖X"IcǸDY}{P%?K7&QzsnZ\Ǘ:zo^Lb!?E`au)ӧ'$g4V"vEr&7/Կ2 A`auߎ|ݒ|6{LN4Czb]d񕃅|یdRDf,:P4MBݦ(.upͬo_l4_^V +5^ge<)3s{m?W/68BVD{rNC) h6@B @{z0"+0wGIvʠ /HG^r^A)9} =Ï 赩:-r^lom6}YE({e&E`cT78aKS*Ss :dLߪ4 m\|]y1I$ V=ֶ0K==-**QS?!4XiiJQǂf.G6B]{SY(duR_(B/HSGCΊ҉p#b\'SÁJm90_%7ҤlԠsoەbC^ r/[ȢO3+u 0 BG0R'(p(P'N1׺N;׍yތ"T% F4}ɄN7T`-IcF\t}Bp2}44ENPz4ĸVD)}ĝu&Wv/*a#Vq,@KZ K~~]j(Czg*yc8շ9' P3p5kg39D*GO5"C](0 =}^b;t7W^# s1yG <"ǝ 3M@dԶl.rZ~}drf!?/"\ܿ2eâ-(ڶ_ƷADlCr`EoR|( =Sۯ^&fLDbbI#jcZcY9e^՞Ԇ1c{CtR Ǎ3Tky(g ~J1sd9&6ݯ) mV(N%RpJZJ q( Jғ/kM{YU5LJ.TkժnV338!MF Ԭ=~'nWzG p9Z]^CR7dlp>ÇȟhxMCj ` ,iA܀f r@Crv*O5(49.BKި{(®c^g9|1sq*.5y " A_c ·@~WK G7ObTiS[h*?z%78f,G'"ހ.1SNuR ~ޜ -@YʹlVj~ݾ~W N:rB0|EJBHbG5=dEM_w*Wʖ>I#xu\FZfQ[n-XBAw^zk`f8_]&S~'< ]>z˂]],qBhZ@Y1 }.m 7IhpLIx:˙3\EԷۚ{6SØ'/ Qs`mG^Xcحq7#n3<䆳 1qFZ'ާL N8D˽ Wj Pk=ZR-i4j@".ؾMw}Aih%8HVz(1c!@O%w" fJ?\ecy bTinEI;-K}'fK6[U0P&~ UBt/c6lv9ᑜzu01f*~@tt0 ]pe_0="cJ{*2;k s~|v|:7k؅nyu뻜1Zvy\ D~:#-{mnI3@1"tVi3 z<9bOPIYtHfM#Cuo9 4AJ؀DQ24=? !f9b=,k '56 ]sH` D` xI=XaolJ#>};!b0e6(}W=$GK5x퐟֯_Sc7:3k׭}=B7oEqt+6VPV< T+8 "q} v+TbX˞kשK>sAX8溟+!;lZSs-NpWSsMT90) pZɴD%Zj3^U/4 eRIڳVgӃonڔ l(Z(TՖEƞ$w80jdk@A8D l˅*l}ݒg)`ODh绿QUyT'L2EQTyXZmQ |6L5 XN 7S}ĝꘔE2V@%gnR3o 8?鲸a~ݼE 9y n"_#R}!…xZݛTǚ-JgږH%O;~#ݔtܭ9Ñ`7)œ"Q}Xw>#t(' MP$c]%˴>k)Z4²Һ3LGvVK?nh+I)ΡtzHq԰jKOhsb'6ޠynt,ڳ ɹ :&ko -3,:~k-j*,&J Dp>IJ c 1  |p1Li BD8R:ʌfHp օN/80}e|E^m1Yv 4q+xc^A7h0j.`4ɍBdP C;1RsXSY^Z)1[m}OZ,nrW?<3=K?V6nPy ϛ9_O}!'iC%wZ^.FxDV0D/ -nv֣YQu:!};NWo2s6`8n}N9di)Z5}bcM/9.~4gf,=A$*gF> C j0ҥE Bu9هxثj$ vBA^gUCB잲ܪ Wqם VU4K4C2"Oq6"M~pVJ-cQ1Pk n}i4fc2kE$~@BdV{_f6 g\f .sfç%I̷3ynI؆\B){TFu{q3aX ]V[}ܵqoY}r6fP P wk\(ܩ@GBN,N?!E9LyXŽ[ ~6BLcON[eWIo ᗬbŪ! >&B7YIG!?H^螨%R+=E-XٰwVd줻3ʋ"+Vip<E2 ߟ!9}:1=o`wG$oF>bRa&4?ϳ|]6*8*(< l8z+lC-mN C~WxnR#~,}L8j{E; @o~z2æ,)/4=~>B3 -wϚ/ 'CQlm ˢQ@n^Ay([7;]N3 eTApjs7ap nro! ?.eAͲZ{R*Uwx*__Re|z׋6e7Cfw0Y3~SQ5%)ǼDV{CH}$W$?C;[PfYuT=Y @4_ujx8;! #GCY;gH4vUj:>0|I1lsؿ1ާyX%7IL8- l\&l%V6PE$*31(a{=HO[v׸tJFE`wЄ8w/>EJ~,ؘ G{UϬ{ѣ%;z>ޅTm)%<|"[4TxKKK#VfRh6gSH"b9Q N-Fvœ_RJO>;cuRPdƄ8ո^!`D8r5f2-vvBY8$h_E`rNlìdj!E2Mè""n_0{/c Fyf+G lq9^wfݪ5ĻX6!7; X&z=WE^/C$SoT4L:'&>c%Ltl 1V֎"WWѸ6<kk^ Z>(f\N2) knlGܖ V ~N6g^ph-@4J::HJ  l뚵VVSlZZW֣2inUɾ!/0G#Kl!`0q)1љ> A})w" O9KV69wznыsKn72M͋~[١6Lϲ^p+|<]30g'EiD۾Tl5WN&Yׅ$N/VM%٧1иgkCڝr)Yb.@h5B rX/˥Ѫ.x-&>]1ӇGnXY";{&Ɗ*3gse WDSZ5N̘bMe؈t]-.!"3ҡȸ4٣IM(cH3^Z,p,gr=m|a3}wN+=E{o n=-7ޟiqFqs*I&[a~=+]z&il(9]{կ{y[gs82s"(,kf/( N\L¾uyH&szŕ꒴rcN1dUK^,G(>˫EI^jra xO&Sƴ-2(ddtsI]V*@x}Xٱ ) ?U2י JUCž~hsM݇oV^!3h)t5%`W 0 ѤXu`8M͸m}w2ծh|9F66?Y1#܄c ɿO5ȖڊPyfoͰmK7{lWI֟ †9?*l'Oa6IJ;&wR$oIhՕ 4VӸ|/E-Vӟ>l<6קJ?( cONEKSX(2do<v925'=מfۈ7ty O"mcKC"Tzr37Y!ZgE Oq'۱H(B:JF=&IS^/ xiQEBKc࡭cEʊzp]P^".<2 f*wGA]?)V[^λgpE_l"A[bt\jl0 EJwnk&X% ZV"9.$:O=vCokp.9myZ=XWH]HgP-TzD皴8r0l.mNc/y jO$q|'X/Ʋ~؄e=Ô [M9 yXRÃYce\mVWH( l0w8581jGJGm[्Y_o#X.6pBm OȰ_C + Q5^Xq$-s0龁#5៣֑ z;Jg Z&d*9Yy6R_DR?3ܽ,u{/ l"H&y͔8ץP*?7 9-FIxnFSL, 9hV젒]t⡟.RuӬG`L$ͭT@w]K({7nĔZ6wf@B W\apԝʛObMye[%Y]^Bž6(Q])G#MqLCPEwrQ+ jl(65kar]31d]T^ÂqU o)= 1+~o'0O[ øG~]3Cn M`Bpˮ3u%ġGpa>g>eZzF+"{lO u"[`+ NUrz(,N7jB~P #C:BsM4Du[20Xnr AruU"guv%RgǴϥ .6;MLZF}>1ە:J_X 8AOh=hxői2 F؜J@shcRo=8l 4(_.±$-N rl "w\كYLjYHDڭ2e} JZv iQ`/HD8gXI0k54/~B pxBgCZRJ "A4Ͻҩּ݁'9u^p^tцRfv6d3I6AҼxx8"aD9+KMox4'-8mtج_;Eӑbj3oZ7GdW.:)bmr_߽1[底 }u:7HFE51d5?X`7βsl(5lR6TWזMg-عR5a#&p8K.;DOmAbt!A $aDC/ٌ.;zV1wyVqaax#@q.=!(ρz8͗9'=`OrT-l0y!.pet-n!w)6RCSa zNrf?D)>z&d7f]:_|h?.d5o>@ `mD`r坢UE9qiUT1i2*L31.si' !xɾUޟpΉxxјlb|ȫgO6EzWmdjeIAlJV;FZ!\ZLvP_rROEmBӤAb^@T@(Թe.fS+A=8qKphe3l-*]&6piiSy73b%B$tY8ӔG= a2G{^ns5 o".)K; 2^/-5 *᳾2""oM6aFPߛˆx]eGĿpb&pG ;.)(ulJ-dLo{b%j8(D`d9NW UbDMt|? )P6;RF̗ [M/cAL^v+K/}Mf Q[2'% Qm?豻J""c#t:"g @*M=4JDw:,?{YfFK_!E/1*OL \:qXz xnk{dLx󋵗3ܟT5+ G̔RB,'Af|g8Gm5.:ڲ/@F>hqJe;&2;tdt0"4ֱEʓM- f$%a;0anĥy:*/_˴IPd){p43sp)JZժr&}F+廻&WM?%Z>JuA]f1|,-: 3 ֯A,3LH"8cy!XxǼ-g2!qC]V|ZW^BHCj!eK49#"y+oY>" E# !Eɱk^0bC"\9K:(PeܯB1^6XH C\y<"#;]$0A?SpEzo%l;F)|" 5DfRk%pJ܋"j#bNVq9]3[ua@㚶v9q5|r1CVbLsk)y$b Lt )%YQI05%\,6U@Su U5≉SjB4%x {SZK4AR0?(TO`{%ғG򣧍7qO'RIY7P D wɏ3bgWAӏ-m m' .5Mb\<6T1cLJ'{#h8?DϏRDtW<8희Ə }K/yVrH99ڸRG&Yu}kfk0&H̞n$]}=]O~3pʊxwNs"njlZaPz)V"s/+t!٤;pFji:. M#޻G{H]wJ(m:jpk⦥IwHPJ}?nChXQrIue6RY̊4rQpO#h'uY9<-r&i~ɰ Y9yBn2X{" M./u˰\+Xw acAW2:^V:)~aK"pVYD>-}!<ƚ]0tEն}X10rrreqluI睝_+u>):pG(D> I4atp3|d狿m|޸7m̞?RQT P3d#svO*33N1Dq%d?X;:쪴wF-YɢW#X5 do˃_Oz *ο ~;}moMqF^auR;k ^dJ!#i5/+=*7u\u#ƥ$'0洛齺5Ҟ`%v!~Dۯd8a;f9czXNDPie[j؇ӛ̥4^XMPs׾_j m{a:lVY[lwe8gS1״Gt.]&ɵ6I;;?K( . C}k>;9oVЖXۧ -_KΩ }Dbq܀eKg QF30pDWwFձ*A^g(Pv%f&)WQZFV1{uyk\H~- 1G 0kk/NG}>UlI!̄MGQnn,4 PcBQO\ZNǼ$)ze([&1Jq|LP7hN@sj>]5MU~z j+*wa(XӵEG /dVPPEMv? M4m6fvlﻴ+nyj͉ǭ3c">9FG6`E"[0v튌bc49eHYX+]"b'/e9,Ⱥ* Lʨ)W?c2 eH̭ J*C C[¤ m?c8m81=}>=LiNLϴ1qbMw:1zTR+b!Vdfe\i %bta96liQXa[OR\:`Uqs0c~bkDO;qθN=s06,ҽ+1M_v$vqS7)PȽhc+[gzfIaqSZ3jѐ)%=:#o:(k`?1yڞEWRDOE;:+UfSvbtC72P7әy1,0$ip`Kp3`s fTu!_g5h( xQQ@ecLrW3~~7i9x< Ϙo_Ig•;8C/TJk"+/  g 5Id|M˸$x䀇ҞUĽ Y(yŰލӠU@v1W}ܿ>6*Sec7%'zܚY@㛜G増oG[ I3}I.}kN4zC>^SXp=e`IhN4ҍyQmsыUd:?݇v) h\6Sw 5HE'NBLq#TJ(/C\ S׃s6|H곲`*X26ZC#V) e. ~(wΩI[,cS"*J vKܭ4O -s·a(M@rWt]wɫ~{sLnt!#fS r Vd`J*JF7c/lƭxnXj dOhQJq e"9TM'Hs:m"]{+쒎ĪrJ# XԶd #uS;&; tcw~Z^c{UW* mcg-sZSdDi x75Jy؍!'i0Np#VW>X'~9.8}k||Ŵicu7xClI>L*}E` BjHj޵>29,jmk<%c1}kkV0X9-`LÄ?U”EdכaC=^)-޲_; ~\s(/ʒ7zߎ< uUI 9  eԯX_VdpQcB~U\Q3Wؕdf^0A:ǏbΥ{+AB7 (]qo>`{4rj֮O'jWr${# >whbBP,{=C]pk) ,8z~k 29%*Rb* Nf:~Xi=l [|+ 6~k7 K̯0CJ:3cFWnnG>AeZ;۪wef VGYb -wGƸmKר uMs&}Y^P{YHG<﹩Y-8TpIНYtlXW.fZoH->3iܙ`*qt'7"Gj(=KY-_=Qۛ'bi(˂=h.ԚGm p Ojf;R!܎AHFLMZd@Xrl!op.XU81_[C_ Y2 LQ`a8hIjJUjDzZ5*]hvKwɞ"`G)"We2,[ *O%ӻuF4Yǐ0N3Ieș\0ث;*+rLj"0F!`Jc~$70Q% lm)J Wbj;I"[H}d<攗07%D)Rp!;*EC8GõT-FAZã!$W[5u_&[£¦CwhEԞfR2ş saܦ&?%O_yef4CpyHi`^9n(z^\Y4Yx4# QR;/u!%ښb(@Dk󁼯]qp7Vllѫ6l$e{ F>I-`~Er5DQ{#m1Ꮤ1Rx:P!&[<.[Mg;6DUl~wث<&Zy&N "&|q;a-6ܲCV#`Fhfoq^ОJ07a3(:T2/˼΂7=auqZ+@`S-cXuTF]a͋h rǐQ&b%p}!*ORҗF¤1a/ExVy/u8ɿK;-!ݜge~qSF ȃA9$_U~2 6屰22i\Oq\? RM06ZDݧ3n_Pc|2 MF{z*"|I'[v?1{dK>vβ\(^˗C}Ė#}J6Z!y;5!֧/ƝC tq _c.2K{ʍp G ?2 }KbmOsZ |wb g/8zj M K#bJ8Q/r^IC]m[&{ cRgo7t`V䏄s"/r߾f!`Q%:dfp`Y["Vn1խXSZ+!:X AER]ƌx,[[\>WRsJZҜDoz׹"䒲UD46ĚS7-K&yzIFeyoA۵4bd|XR'Ѻ3jGy{2Y嶯A8Hi7/MiF߻TZ8U7g]Zyz_|zprMTTV^&1G,kCeWk}bq Q] Pw1>#[Qyhnj_lGJ~ 8wu63%oP:c­+Jg4w+ ,í1oxb="%VHOl 3-rUxc"& ̿:P?GueUeB8ާ/#L #+$͂ώVV"'x.rMx>^}9&lִ)ѓmaxkoc ~D3ݱ,LvC…qMh(L2!)꼀~uFŌ>ͧ][JUPD_[g)%9KLʵף (O+Gw'RInkiYL* R)J3K6jCCIv,R˥w#jB݄G֐~ý7ɬc7ҭMWxk"5\7dR h\R->*k3tشl?]nD'deZ۠i 5|5o3+:S>d0ly?AF endstream endobj 162 0 obj << /Length1 2828 /Length2 29794 /Length3 0 /Length 31381 /Filter /FlateDecode >> stream xڴuX>ҍݝ! 0 %ҍ4Hw#!ݍH(9G Zku{CK*iʁ lBeUh`bAvC@`'sPYBCyXxTsm/g 'vZB@':D;Rl%sK{=`dPbSa=Fښ;Xm@GKVS M v?.Z:,IUmY @^GK_m @U]{,'98@WÍ t [YÃvasv-v@?]qs +E(,N߃r:B!!;ÿ@5wg2:;YB!7W?6/Њ_i75TrOSCgfg+f6=mK+@559cSTUfU6 O|2Vpqq8M*d% vtvE- [+o̮zTh po@OK[ff ~>`g+d ~7ߎF+%͂OvE'k0@_f(٨]jvrXQUhC0gO-97UsG Jq ]o `Gs\@@+ueVC[_]L:wmG`#-흀>\@ *ov5iuo'Llrp]\̽P9} ᄶF9!!g7{1x쒿MB|v?. e A?']+Av?AՕ hu?Z]VWAP.AhAP.:˛?Er rpv5stbAd`h 'tVPV`'')4_E~ߺ;msǿ@a r+o7?E~w9tlL^ζ@"6_J//$8bPu'4O)^h.'#s/JPHCs 79>?>tv@z@Etvp3 ndoᯢP_rB kPz[_ ZnZW%o- jrAŁ Z/L@1R;+lYAC7!ڡ? z-%aJ UFzsuBO D]^[ ڥ5N# $SJBXΘ !ۦfSJhC_:eOG-3Jvw"<_[&S `Df&꾨Gp&5W:2̘ZV*! P=Dpٮwv;QӛJQoM׎aΏE%v/S} +QqDmQM( zC ^dpia%-~ÉMN$VKbU= ,?"~m=|.ں+S!Տ-3k Ơ4bC*ڒJ,7UJ+;qnWfQY\2):{$@6c8ɛ>svw(X%q+Xw"`IK nd*E3j,04!kjp1.GD+g:qs"SG z'U:iOVnE/'"<^BMN;BCTx[S}snMed)i ķwQ' {'8+8ktekft\ʯ Rrs:Wg AKN@L'Pʉ&"#c4$ 7ĥWT _li*lR.ˑ}n e}SKZoo^",(UQ%#]0$ǵָ:ei4ƽkW)R AVK͂"C]+Dt*/=$}]?Sj/K$q镓FվDFRd,={S%ɓ.Xw:@]fus c'`sc=N Tg+YF:/S96wUJM 0fcR^ lTG gbsS_JvYvc[~%:IbuMW}WۻH6϶9XK8v%҅]KEl fj-~.YlAT1=VL;W\'6"1Z5]53HNrjMdgZ3h7'!O];sJCp:B۠a쐹KatA/_)!3{mGhWGm\eI:> ̩#v~͓!^!41zB:!^{'+X\>f5}H l^rTj((]u9*|;|Rl?V)_td$үZWYMJ=1C8j?4r"b!-b"E*~.eVC a4"]l+. (S5\Fs~n*B_XNCK%-v`jy!ZQEWƁ_ Ov)w?3vE[10zV}F {=4v4R>URT/ʲQ?l@#H}8ͪ[e(TDN Ƣr(l^p?bC2/xwd\K>;Z1 פ֐[tJduFX|e'JP0C7;f,?|5fWL# g*;Lrvݽ+یs2Ɖ؀fDR=V߫ )>Y5zO^%Ӱk0J4ތCɧ~(lсI;9UX[\quc,F~Y=7%_H_M+̄ke"|?n;N ܛ@<릮Y=95bc۶ S~Ҧdh3\^xL*{mqT?F0L,eeup$N|\OG@ Vk,*Y __0BX6kOy' eJrWDiHFZP! k ga&+w}gkl,'3!whxǸ1$#ՆL"LaS}={KxH¹I]/(4ΒT?zI՞=!M[5Hp{uoi`~aݥ9IѧӕA{L!BAWqbz.i閵i7B;Fm)?-W]g.ݙ6X\?p2l3h ~D7rC+_e#8myKx(viרҹcVD!t'['RlA>t :dYt"9޷M=ֲv<~/Ü߼ T֧ٓ`u)ensLqܲ`^O) ~l򠾁6eΘ+AzÀj͉cOD(ܯbu| b{OŊ^8r˗O2oJ"ug]T%^9)6)Ӵ~m.lH 0}N{9GdeJ~ 'gĉ3pZ KKbNVO@{!mJGRR߫gIvCl]g'YV匇5 ^B)HxTy]>tR:y:˛m+2'R4o\JN4Z#Nۭ~P͇^8.wvIy^ʽ T!.УN[Ƚwg;,bmJA޲>Fr]#E)y-N2zȺl` _^n5A Qzpܐ=' u˒}7勏Οa_H"10<++r+ifvt\KA0 =7Qkq:vb +z:U44w:-B=.FT5 Od-%uv 6,#<{j4V]l>9/y:_g~"u sb50DmC+Zv*F xCltdq"Eg>Ƌ{)lȗR 8FD]ϓ9!B\(WY=GX ؅+4sԉφ}^ ]1>%^ `ҡ۫p_YRV1̇nюźЗ<5l/8'*-]*/#x_aql ,<Zӄ%9 Ȁx|!BM4ECs/&ʃ{}g"dقiㄛk:lgxcJ$o#R''vtۡ.XXH: d,]h@#.Dܾ/"{j۶WgS>!+wCQXwG\Βx|veW8Dq:64.h:|  _ms=ZXDkP~[ 劭bs&#WА^mjZd}/i}2}uGvm/fsՒťqf8w6#N 3C-uMdݬ%YՂVο;YmW9ثc1v7iiњqU}ײ~,h^A+}cs۱E"" tjy'NTFB$>FP}H(k`DdL"+D;J<(iBfMN`;Wɸ~t&V-[?ݼm-,+"n23%K$G㣚|M\%sDD4{bK>\wj =21V[\r`Q? 4]9>\"" Y4[fawlssSe l}?I 髏Ee]\Ū ǽ ! at0׈!kB3!UI@YV~dO ;aŎ&Űjs u/ml~&L~I|O@tZ-ARowT0\OF3QkMN&03n2nIU~tT| 'E0_K̇0Q#)ES#SBէnBّTDLkti.X_^Hq ۃ"wI@:'ٕ J//GT%!1Y\$urC+,CiimV)>bB Vݚ6lȊJ Jp"=^j.ifSٛ uUO-%CD/WAXhK.=4bnvFZbر:(\”qvkeClt8YCQy,Myqj sr: *S.m D~G;f&y"%\v̰'.G-n`n=cp$6E!bi7p\;L\/)JmL'ULxjKfb^ځʞTc#m8%R^ #yy[t!֯9'ıH-qp _! ~OX("ť;<1hEPtUk_p#נa[vtm6J$,y:ĵO>6S0u_/2Ki'NLS[T9ugJm1GG}ޓ\> d^r1袽p=z=T<wrYWڪ`W`VELx 26Fm4uj\P4RXȠ8Æf'վ`U汤pJI&!LΈn$)ʢQ.1L&f"NՄEA2l ; rnހFpLDU3/:)79X];5m )P&k#FS.5T)*o2{+L!4> Nj1pJĭQ^R.G[,=w8X *N $aD u5DOMnCy mF{#QԗSXʾE` LDbj"3}a+E*x;fEޡ8.8=*Pb ^%kQ_ױ| HNOt<B9Hyey+xa7r+dj`mOa}>t$p%Yf\y'YC!qGBe^RZHi}OcYKIHHǛX Xf6ַ |8PRN-ڲ~tN8ڇzN{A}9Ku =M3+2DNfuW^hÜ.܌0ycpN [$F~$ zbD g K6ֆړ]9e,r>2HL C R ;}]_KPlb/;T$T_T0_:t}|~Pa+(HGn,;$#= "syPiɀ~{~etOm+6:7?dB|TTo[.+C2(KZ5O/eatS>q>4Ɨ06i/KV7' g윴E\N8#0@&(_Cp|bה@,3Zet}0/ZDjmf}b~2R(}U=֛Q{6iH|wybuOysX+KPD߭ :.A,9T0 ۷N p-ˏVB5#R 'a?i> ]wTs41ڧ*ojdwg"mV0'H|{VyE3Oqθ2j$>+"K!ᙬvGu`NzG4ZI<*1~P"į2S1ŞˋӑŢ3iyu{+ LF(VnX3ekS˵yT^zZZ5RJLWwX8RR=I[o7Han)eDwW0\kEcq+T6<NӚǮ)ߏcv[ <ԑq5G#KXS.=8Mn2Lk4s9)nNuB*Bri\tR5}@3ށAΒ$S?S6?━fnvL UeǚpCSͮ9a"l,gT~_+m@om $(n0XHEWsRjUM`91AѨx-67ЍqˏC1n%*IHZHZX9}|vBtT<Uׇ>|1傮U]Cs3ܣGv,睇!J1 5VJWG}` Mx֛\2,ղ'j'KVm>0\V=}vZ`cv;h۽m9a nNV(g&9Z v&GT8VuՋ<~Rf Iȇ>-x!<[~R'\$p}?[Nj6棌fr\]]LdNvMb6%uYl,8J?˵B KMM9Q':~Xf/&k0Hr|!htñI @A=!=LTKp6IW-駕b] z…Mx篛uYakJBtc1ּ:~A5=YT2.<U2!Kwq/Ӯ4G {]WdpVC=qJ\3i$$u"$ݫ(->gU,#NiE2#OKl&1F}k?%]0Eb,R#J)sE&a3d}>PŨy3듃*F)"}&n.6<<'~,OOYq * ^$@둎5ͨuD_!-AA[<7_b&WkSZnsRY' q|YGA!*V)s<40Xò5oUyGvE?Aޖ"ؔMg9ڠgQ~lGŗ2aMЩh8zѨ\^f &msckɩ`8<3$kd[=}ZLKJ_#k]皈~,yX녈5^FܬOz9EŽܔ[ S<,zj%xI^:QY^}nF%eɬ k^(dd >ө7v[݋ rn# 5y5Fux1eýjٚw蒭qؼ3Jt>au(hVa/ R\%t}vu%Dc|Pƾ;cu19<0\qrJ B|͸#Qԁuqn)J+nSg1X:O$DB Eo26ꮨ<̋Az\U}FHbʌAkhˬBɴ=maRI8ˍ-~ζ m]]x 'D{c Q Îy{^pDfKq;ъ{'π22#LYUŵhśaS)0yОz"ϓ'"ȏ$i,V҃T +eihSyio_b8 ⎠xPvǐ`@Tr8(s{.b1I[/w7 `odH洑cyRXةLelZ!}hSIu u&glGP1 Ut \k2'wt[nb1+ҕ^eJ0hy_e{${<79TMF+ "u3̚G]*`(5K 8/HBqSeSiFF8zy,w ;׋ϭ#Nڡ՘ a?b%#{$SxAy^2N4=w[jr Š8?}.WB߆1j-= _(-I 0ՒX|FGGlD _`R*ks&u/L$o:5C͚:-˔Vj:v'AR:9"UW᯻4lI,=啌38o >oI֏^{ MF xc8`;uu! tp%=xv$2,(Vd^>:\^Mrĉ,zPhLm]=FV~ RQkXø\pzJO_G˹YC؟dXA(f,nwCr}ہ3w> Ӥe#K?,6h\( DoK%G_r1qNH[I}WfE@}<ϬTy~`G-gڮ0i(b3:\Vʣ,p\lh)*D$|v~N3:-FRYW,[cсexϹqmG퇶zq?c^|Ah`˔Zok?HWq=me˒̠F|nꎍFxWgvb־t!9MGb1EWL0/j "FBHzLCRCz#M֑Ѿo:SAcL˺Wܝ>qKҍ坳%;{\Ͼ-ſAMd&?NǼ _RtLN VL'Xf +EPW{u.K\,26e?ZJ8\;Q,NL h6NbEI.DŮ8T`2GG5"cw>Fq^}~U5{+WbIFd..<G_18"u#膷̑KB6F*~Aַ{Sӈ}Ig5+ [S瀠sĬ浭Σϯa=`C\H:w:8n(S-n5 mqWFA>ʳS#0kLE}y5NYV'ȋaXjw_װj۶m۶m۶mݵm۶mMB&ɊUeȃdn(r0nƢ=E,oߢE0g)!fhx6/= \92gpS Se, 5ܬUB2>xdEC*k33§qW1Vq}[+53 \@1E'eb}7E"Ȉ{LxoK\=lsOrƐs!AdZIkMF9mzD1wK")Ifܞ,a+AqOgZ?hl!ukZgJbUmM3c!T$|sl8[N.S 8QN9szW{0bn7}a]^]Y'EFx Ks:Dݹ@ܝo%"j*ȭZSUڍR"]Ξ>k9> v;h:?[[Hv >qG-gyKpʅYWRSW0K븾;~ZIӎ2*,R Ĕb`4721 QFB>t\~CYh$[4؝MrQѡ:O娐Dy Va4ԲE zfH*s*m0ȧB\]B%dt|%{5LAܑ5F7&[wfyoP"m XVTD"p34YK0'[1Mv#:^ Xi_գBNv>PŧԉO-k%QEvqN,v^uaFX( 4vtN2KcжK:wo#d>%X 'b_kivGCX[] ĿJo6cxݑbT\R˰ 6i&|2p{,FWc()dØ|4F5@}'C]Ge`0qi>!$ g/y '[6HGQ&2Kƺ&"{Lkܸ)]>4on{ha,ɵ5r}ɛ)҅>Qr l5ÚPJ+n(+MYXD@:?v|t4KhmqI|I? y6\~ցil66#5$w RǶ4꿺pmz|QH^j $uAI7.uycѫ]hуERɯݥ-d^^8̀TOwC}`}Qԭf8ͨ^U!a)XMa ѐ c`R:EgIHGkav d|im6(5h/0EF=Ȑ}#tPQBrUΤp8M9.wh"@;ϲkq+# rQ㏙Y4NABSu;$*^$Z:Ry) *UFAp [mOzƓ0M('.HKؼK\曜\+46?m k VxrD2REW?Aw옒Նtga$H dnhf\Ul%D<9l YP&qtA FIC黔9 ̛~YWJ.BKD'y/2 ^P8N`G(H3+IBh[|IBthGWeT`}ɇ!| `r(}X8%i]d|Pq3e%+C n7dZ)t+Ħ@KE㞝:Rz Ke7ecgI-u7WHFg}Q[T2$Ϯ**7*fQBQ(>-9+[.({WEBTuoEq Mh˂R/)໧]:K=x\RXr&Z]gP3+$ fp$r\1s$Wim*2RD]mᙫb_n5Z8SLMje{*Y(g;P)Y88ޕFU}&پmj6/_5;H:{X2)Qf-L/)AD-4HJY)4B3tLDޅ'UpĒm}|x|"DieB`ʥ{&ױdIH`INOZ4=!O!#PU9)JZcv(K$(]%0JG :i|۽IooqTKKoj-"HF6'ڛ|fsjk%FHl1$S^gl}Q|(Ux ZPv/M6, m ܺ 笏CmɞZ0 fћ%>h Llbk:D"~/Ko:XSm3& d-\'XN mmj^Db?B~7Sшi R(=,W3;Q 'K:ån dC4&oor׫L3c7+ebb>]pgY9i1?9bMALFT%2U~mݴ? 2G{c'˫ٛ{l*~+VŹXc8{eQ7v"QW^ݑ]kt3i~_\o?roi 8KA%щ,Ui򡻷!&8Yf;EL650TB5&tj6-d`ll^k7p+C5'"2];+^2Kb̰ Ӭ8{̑s|RT.=<wQ/o~M_mzp۫#^SHsaǐ::9@M(cIQ(`DMk*WԉdŅ%, n@E>Y&@;KWL;IU5rCluȥuXPsAď- D)`ỤS$86Ӏkq͟uz/Kǽ䓟sk\4O31]#MPʲI#Mvm9Hz:rra|{{:`MVdz*ͱ;ݐ4C֙@dL!㕯B! ?e[!^ey cδh}WnEOQjO})][裞JѣiclA/gDŽ#0iG} 噧i\-8{k 9e8x2$+)ྯ~Ri>WlUN7W;:u0c2p&Z.bB) ip#g' ݻ1MӰ{I+ hU7F$7 gViEƀ$z|Y6[7gyeozme/FDdJ|0VvYM]7KTԫjytScd;qŠ@Qeߝ(jB(5Kw@j$F9H )Kw4h:3FK-&hO&(L)|w8n,MDx7L4(5@ .V);ۉWwt!J)*nLiV'KBKYtó.eh+<#T8x|/k怮(j8VΫ?~ 9@aɄZq#] <6PQ5-LQP?W2ElOPulxݏ1;m<k5qG=ՅXu"K7X< N< ߩȥw[k ngWуk{)NQ; 81onceJo(=ELeٜ]S(y3vccRtK y꼠yhW-zC~ w2ɝ/pp '{)\xPyG5]$Y;Wڌr sN9!5:ׁȇJk_j]RU^" Lfɂ`*|JuqCg,Re?Mx{jnȧ\XǑ]+.%оrz-GA"11%J܆!Iw9pp s[L aW~9K[$tL0d $֡NݛFeqߦ]bIe]vnn/t&`:&, ХTO̽puw2=`pQoAIXsU*(qܘ7eH,5֔"2KT-edOXX܅(WS,'f0u Dtwd|4WJYC9%.s1?{Աy@!&ؐtm=x.Xp kNi"rIl,<^sYzxQ(4 ;M}.ݒne#qaRGXb\]%un5Ddۚ|6S%㍬QBÉS@'{ .lʋFNlF .@nȷճ;$/j(>kuX/\2eȧ&xUuqSR#nW& ȎD:17<2Q^! ̲#C n俬NME8Ѥ\k#먂:PSˍ[p=U_?WA35nj &O:GcC:>ټTzg> XhLSӛ,I|yQ]*2 'Yz\vv0 qQ*r׈e,eGFX0`wև(F\y!`n@+ .Pw-jS5Z/ FO@16QRbޗ{m#"bیSɻx*}YާP@cěwř60,/Q fuqPX֠Df#Fwfz,q󊈱 (^m_PyN?&(hҌ>_ 3Q<Td)Zos$lF9M/_*׈ض&Jڶ"*Nߡͷf7;f3F$oo}[ۈE/,Q_QcGbl!9;Tfk :>!iL ?Ͱ1NQ"8Ր^]mW.M 7؈l\enx׀ֿ쯫 gaTyvL q}n )r_m q%~~摥bR9q4*Nn[='E;HoTK=3գN)RM[!HYDQY8@&xrW Tk^wq?eP8/o~4|H`Z 09שAC)vEe+!Gͱ[O376#~ h*@le/ f]><+" cQZE^NgdG`ڜ%_$9 fZV g~N\.N \NJ$B  "[rlK~4A1/NINWہ p֭̏\7 8j+i0W_0FZ5 o^5_m~ICYcOM.8Nk͉ }W^Vϻ>N6Ct 7HŘyx-Nq{f?g&-#q WznNi]hh }62>}CāVLd ]#TYٽ`'pHa$g} 7t wcߗx]_('wޠL7BYXefb6+x?b)ռ KQ'y<0N% jERGAz%#SQMaux9XMLeхX6TQd(lmCB$ŧ!cNu{%hC}7RBYf_ #yZC(؃K'(0ry.zP% ! ;e7͸K\>4@Q+DP ]KQxgBb#EDIwλ/(/2]A%(6EL)h35PS߁< #`aChg!+ʗ}?~{߮kH<9Ŝ{ZU&Z ܑ-"%>?k~NT}pA2L{1D-Ppְs+[T.ԑiC]d灙ιs.$TdEï5yQ}|D^ ;wo13x\=xښM>j$USZhmeq%˿*Uϴ'Ͱ<_!g怨gL*ٰvrYDnz묱 +0cͭ_J}QY^x~&|AQpe5!kx ,?-LRE՞ٙBAdA.^Jt쑣 Kф f&Ҹ)t'<q}AF>XH'IK2`3VQZYǶX/IIy}49scn46ZGKИzL]5^Ӕr釤FKVD$'Y@Kzrx"z~77GJͱTPo/' l!qVSN%8%U/ E "CҒ"ÓHD|!0AIl$76p/TO0s4%Æ`'[-h,Cfxvmf>"~mn(]c xק X>*PD ai?x$cu'ۆz*UB&~;yg*G'8`q`~.@ ɬQ+ -\c)]4}{X emJH6ɂ5t02|K6 Wׅ+}Yv.}I]޶oM&whXU5P}!BPw,7.3byYm/Ocŋ8I9IN ̯ &%e8xO@; Wߤ{W[^r˪c҈ϯC~°$yXjd 3@ܬ2_رE?ڊ?X~Trـ%Ú?ITr2Zr0FMmq e,Y@ՉѶf]@EʜdtTy F-hрg[ ϼHJ_.ьK,v#@Ė}9e7 + j'H:RTZM0^Rd({>>-tb3@;lb!Kc&|d cSN:6}@Fhquh& ~Q7}~`)'.pӤmi`b (O4;-W L" OK19GCk?L [Zұ]3~g#K@sKB[rM%JY{LT>Y sJ*:9kRHS? F&.Oitr:f-FyV%hq/%bw+m#F]>m:o)>;٣k0Uu"%NgCPjlm*['d~~MIEzY: xPqN{/"껪 l: @lXy\W>?1d*c5ZhXGo1l~9I?9 <7:|]y摳~5? ʇVmsيM*$ek!Rr|4 J p#5KS* <N58n]}§[Ju5Q闫r% *رop)7E}OɔR aKl%tV[d2'T N7yq]He>$,sKh$c(I'xCڋbt%Ǿ^pesawa5NШo4]C7)z|B^.o#q8{T(IM iUbdu#،}M>UvZbsjǕmu~ _Ms$_ďw7;8B8N>X?)6 f>. "MCM\ftQD:NO|U|[sSQ`2Sy%Q #M֨Gڽ"Ha AeGXDzqsrNǬ$/8’읖˷-CXNUh5#fq=.a2 /:"m&E\7'szxy(e|JRq?" )')ap#s=vW^<_o$ YWxw4B(2¼[<@m?*%m&.a:(at Hhg$Ɓ  {@4^qY[da5Jfᡲ& MZwb"( %T_U+—7?vWJOP熬MO^1'\is/Gh Pci㷅H8sAUX,>7kKt'9( jf{jDJ\ct` jRX{`wE/}SepĀG()$cfg ` j^'\^'9f:aêJC]Mޭ7u`)y99Q' np³6 \xV jӦm73A߸}( ":ֆaF[~*n '7F%Hqx" 5}' |F~![Z ^^lLւτ5^(f5qW6ހ9HF B;.C\]vY A8 RD)ݱ:b5A:'@ O>&ÒqB +a>xEyvۖ}}cxy3J=Ι3dC~H@uThd,shjeQFJ;lBLr+ B15)[K#Io$oЫ˞܋Ք[H.73BYOӌXJ_S \}&~,&n<q2`|Տ|?.9Tdk M?CDj " 2bQLZuPbjN"AUI˒ IAqż+ux)Yic?=5my[֘/v"-rf)RxDpdC Fʦ>3B'!\Pשl#y9'.? C]0oaP=n~2ax.B/PA<)d.'׈)HDB7cin(I)2Ia?Aeۮu~dȝe[֒}=HsڰM5.JW:p KCgRK_1Eߕ"6a<j Nm9< owmX ~~$ .a>.@eC; |M_|;ҶRO}>SHN{hڀGf6 ^ZO!n@&E@ݰUdzxqP #v'bghܢJyBRlҭVlK;)w GMǮftD́w[QSf ZK$P%kDW#Me%'볘;d6A`z4z©m1Tq]my̔I@hP֋c4`~nt)m`q|LŮք51(4>ǃ)߷ /k~dΓh5sIgzl\%,3Y^u n %{ gg*BHOʹ-n (0wa@9TX2c `>v߱VacFOKzwzeꁯ_~*ߨ<seŹzj&%1ғ꼩~c2iPGQ~TufLpHF-&|Fԓe kPZbD)كeBw28ifO_*̤jF]UߝLk^M @ÅK#I|)HS6Ȉ,(oX:ۘCͩWi P3>Ht`ꓽN K#ȠX܂ٰ8c~md'e ^i b 8n!!/Ko"Vt~"?X(|%EHl,&W0T{qrKARq2|Ov  N+. 5V,Cb7hLF7{ ; Y%,]6H>ۼGe2˒|(eĘso{P_8]ߛ8TzU5㤒:.W&4C٦ GW3ܕQaX. VNn0ReH!0OF 16ms:g>K k# )2i1V $)zmX zɢB[Õ+LJٲsZSc՗&w.\4,"xp ?&GqyvR+'1x@O4 ߵm`if+{)HR&f*qwuUòMlcU1ic9'3L+Ŀ_e¤+n2U/ fZ:RÇ2 D݅m`/+2țNMBgK%V"淺R~!FՆZVv=*Qc-NB}rdML.oٌ9Dn6/R GŽ_@6%WJ g(g;r,CSj݌50r D. *".!L17v/rfWDJnEbyG4#֋Zx+:a4QOC ϑU%*N_Rw߼C˧kХ~C Qyٞ\j8V&UPIp}tdEڜ~A6K~_}o>pbIWonƢJs::i1j2:Gbc!Oڕ=,=eI zXViiFUoT.`Ʀ] F~W('k^Pqdn2E 5"As{E"FXPovJ7F}R 8Us¸[ݱuvb'w]o9OM endstream endobj 164 0 obj << /Length1 2270 /Length2 17299 /Length3 0 /Length 18687 /Filter /FlateDecode >> stream xڴeTk6 ڸCp'Cphi\;ݝ$hp |d;}V)HUM쌀v Ff^ 34OA!4Yي.9@`ef恧HmJ;@2Tu vN #Cw5H"jghafO?"Cc+;W'+ @Q o.P֦;S*P"TVPSTa|loo\DUT$b:=@RMEϧ*=@^]'ϻw9qUaU-Eq?5X.@G'?i;3]MlJ6y\]]͜@vfS5p9Z޿lkN9_ @h$a/{+ߝ{oOLJcn,55~7@D?iM]2kOoC=1C[g'6up9+"`ja ϙY%WQe}<[92@Y',&>\VVVۚؼv>1>ݙwl\m=?bS [?}7qgRppJo`@7cs??b?&x{L /xO'C < >Wti[S;ϿLkMiw`4g?[?$ m53v/J-ohch?: ' 7&KL¶f@ ;#3'4j6}t߯?׻tSile trph&U5Y5eUmL,lCGGCwxa`xO i01ځ] o#0  qDF\&ѿ7Io`zq3F&Io^蝙={ÿ;3;3 5 ;!@?;CphnoŻ?;Uw6Cwfb{dlcg坰?;a)ha Ykp|=?{ ;#?^?{=Cwow==5aP?L An_/%w߿t+?ED<yX l=fc3j_y4@71ʢ1_eJSpxt4ILJt>X6)Pk_eOWbM@L׍&JB;>r>H9jr~e]429Z%mqmD#Q(֩7dR Gl΁42 q[t bvɗ}(:qq2Q^į; ]zr_2k7cqQ(RSԟ̤TE}¥"~-pyQD봻+FP)X̌č[PaS|c=l.UUZwj܋҄P9t:郹pLeapxR.7 >技t'Ûמğ>*D#mBgtƤ$l)m-O<&U%.$ V7^lLkF=6](<1y`" Nu:}QL&[#=[RJ!%5w`7J;`Jr3a^ə@P˅ne6\gSqё$fTZuL\q(VzXnR(g7/͟ȉJ G{ :ǭ%,yS#x(r.b^1^ն`dl,{n'Iz s8iw`~%*NiXz Y%Sd~I9١e" O SaZ%*<1SzFb8kAj{`/|Aiޖm6P#0$A"7wF6O$U-Byyv)%x EesGM}Fu&q_Prj~uh,}pch+׹ ǔ57Fp_%''ί4Fh"657TQVZRgzc&&4t|:2TfwxOS|-Ut<بikG>h iޖ+չqssy*yC4-d I nVw ~|ZuosEp)|=tDx&=dJg$\?G|y<\k36.35-Jt (`הT mM}{6]4XV@wPKPȠo{vdW'D[)mk8&xF7E{uK?~f̑ ^S4gVY})@|m](X|Fn!c5y)#Mm7 E4EiWR_DᆐIڧ؆ĬagFDͨAybѵ85|%^={ҸtlW?kCz]qs~[ .>s.b!bSO ؈4/TZN{=FTQ%f^mn)R3 $`>TH)׼L3 .oޛ7yb"CtŲI[ {00h%UDXϸ/5UsYmy]!AlLN pnY~S>þc idGHGnxdoOg99X)d<<;F(oMO)uҹrxJ+LFG}ڣDWr%sF=Ù4_l^DVRXǂmN|f!e >9ŗSleW"cMuAv^h9U)W>gԭzDba51W߸ tRdXey#Db}p_L sIeM8f1bK#ѹ[vy^])pG$s;՛Ktdž<$LmhkвXc[„O)۹)_H͆%^W;)ee.MV]rV+Ln_kBEx1& ."/!qjF p0(;VTPw(Mr:A3=\i e 8u%P6|N2ͤ5<`v?X2><]#5 M*7p:~ D`/%ђ5'>:.$; LpE\LҖ*!x$zG7mѱ*սzE0c "Jh1Lrb>_,C;-#zP=l(l ._vY*Ʒ 7eECסY`/rR(~h&ժxy og%!pEYlF4h)zU);8 Sl rc8zzٝ"%Ecp{DI8j: lk#NV!vRPyY_!bz&Wm6HHB(DHW]iXmeD[tgbv8@0pX C:W. , U@mr bs5 [Wb]֙GN|PO3G 3bj" Y)2B!ض=d\0G4l d!,Pwk\1zwh-ZLV)KN]$B-at`rnH"X<3LFR Qd7Fq2k=.Ziк{h?Xz!Np8}ǡĂ}[YQ8?POk5_j>xY䪾cSpѦu"c=1困6%~bDbPzMjncޤ =q{ 3#W.h <%?d业(J\gh@dZ73 BO= s{NppߦJKV_o q<L뤳_h})QBS-u^?ph?2IK z~-vʏ$? \F)(n[lr%RLIb[G.nJe(|*:4IXe}fr ]TC1.YӁ7 UkmIT/4rB8#E||[ o>B7ֵch!]B}d=#Pb 3]s"FP, H,vV5wdAUh\&B8GBt^X4cC1П\U3l{f5o*O:u(xr4@^˱fϧ|tp\-㊄r ϧnHtj` 'Jՠ֍En!kŴm޶n6"-N}ImvLk94+\#%4v*u '+Ҷ$MmbaY2<;NC]8S$ j96 [M>sp\mކsJ`l&"Sz@lFL0 .ַ#jkYԅݎfOe<pt]3ݝq5SzLI"I}d2wM`L(GwZTPDړEW>3,CB?4P,5*]C]ErpIL;O2UuBߝ/*Vm&zBz~ G ֐f@!p S>AO_*Z׉ZeփoN (3̞H)/dmauM/[(}vNc2F{VV(5ppu(< @2ޯR/+uU@td̞V-_8ǚuWje'R2Q:#3 TW. sX+\6>Lz>#' h&!5ڻL/#u `ؒcX2 ){'G9LSiDA8QL\$/ M\ӎ`: q-2Ma+x攋iHk*{!C`IU8`:A(˙@Ȫydk3|6 EVfqYܓ}8ۡCS"3dcqG 3-_zm z}\^^6C*G5$j 8,+֕f*4 ʶ,xH0mk͉L|1vq"h|Zת*OBc@\WOj";rܽj!~*,5pv~a$1] 9e* }@h ' n2rġR˫ yLm fcṾI3hȋ ˭fL.| Bl!ύ>Iٞ@ p#O56jh [Ʉ=L$T!o$)K@8xr:fAgaqW/K| ĭ~ Nu5G"ϻ-ܖt{Rp=t}kb\ ʧ>3C-n?R=7؜3Td0=Ͻ,MuRU/ cq0e,;UyImAؒCvm9ڥwenHIEQsĦTg,XoD' yC J%C4'Zλyo/ zڢ_!ђerT^IGɨr)Т?'t SpDIBS.D) ^?jQERz26Rpy䙃Di0 w $hfaz6@F΄]3hREfGco2®d:lPfFO%TJNƉiݍrHJlĻ%Cg=zoyݦa46faPsy(YEps3Z1JNnIڕ&ٸwjP #jCI3C)Yf؏7la6&خc*Nɷ75 b-*B{ƋB~%b1sf FVz=  Xy/f֍%vɆxym<9QaL;qA4;+N1C *"vQ zq!$at0JL4'f4Z }8m\鴫Jqx[S9 G^IUInƍ0' 80BL#kƾ.D??IWɢY YMn#9rԱv$tVu>g*c t*AYoucKaGA 1MT o CHAKc09Fߪ=] qVoV[O (tRQ6%5 y?0cwŢTMh$С|\fA-ӐDh?S5oì)+衖~WqU׾39XK1to-&Q121*s9?~{(o$+Ox;|Fhݖ<{e`& 0ӌjPcW7X'<ù3y}6 Y`\>jq 9-J4į݀^ EC,d85'ellCE_C+G09ODs23,oRA?=:NjPmIyh^)=j򎚅uKi蒴^[Z-ƌTwtJ)b+4譁gHβM*G}-.%b*k;WͮTYOVm"]?o>NГubT -kI-w_k@$&!C0%bpům(Q>6%o0 jU-Hdۏb)i505Vtpi4GL7xqcϏP*܂Pk\dꮚۼ|ů QN6li+0]I(5#?ro'ݓb`=u˱S|(B1yLӈDS1j\BNY?ͪ,RJ*%Ѹ3ôzW64A}1<Tbr}^ɲ2Ta1c@`q qD*]I B_,>ArAbtMRtK!H~`@A1(OIDnȓ~lSR?.}{3FFZ8)ߵC$!O=؉u [7/[֙m?Y5U@O3n6EM ǡ%ϨD y9B^՟lЅ }@'1Tk;<8T?/$YwSEjZ n 5y+ d17Vؐm]sTrN ]'o57q]LkX"JLQ/S@(H~w o6M~TAW;-o*{dvme]dU:q7 '^'UHU86 &pXiMX߫]-yN̴0sj$l4weg~Q`_UHF]|Żv$$+r4K ;.wb;;-ĝvC)9y:ol'͘&tԼ6!vW"QC \1\+L2OSR%&&ax=i9Wh2q6IcPo>߾t/LE-Gݧu$}9A3'.{aVg?yDgyz? HoV;*S.7J{L*Y@Mrͪ6XK*1ȴIQX\URPZElfO2otYfyU~&Vm<%yzKrU#S/|Fkm/ۯEl>Wv~;{Alhn+ ]Vz 5.rł0vBCu'Yv{3 $fo (ќ3ݑ</tzO 7R MK]y9h\R:a݊֔iVʮ&(z nCV{2W4߯c/zPyA2K/wuR,eSަг5 }mbo89b q+!S\xd*N' S n-;Le`: [pe][# zg6u!|%: N .*zͼ n eS;3BhNvUkei-fbn[/mY+8N:LĥWa=lu:9g /,K@T[)3NSu4b7uձy:!Y?nIUh1)Dy]bd< .ifzh @Si##<`,u@JXˮ&"*3U6q~'辵Ֆ@ cĄ-H{B QVA67dGjVwbd*I 3޾]!NF;@;~%-J֜&YY\^ME% =q>B֥=뺄yE@'I%|f1K#LyAXF†snqGt&.2Ҍ|\]p)TyOZ=jK< ^c{84PGqc/ Pde8Pma|Y:} H ʾy EX\aQƫT&~`Z吃4,ÃU2n D9ɞVj4 aH5Rmwَ;4Tc~9*g5CkBIJD*>7El'=;ƽr}T4y ۬Xk$z8ԧ)2}Hx /YᵶFU1{X\R+ɮ?0tx89}dVvD/x)Yl:OaT-2w?F o t@<{̾^-ᯆ3vn("S@h >Y$ǔDG/g^ s!:58fgM#X}ϝpan#zyh&@ Pmn\h'ɼ[E3}Ĭ^@ǔvYR J ROͭ^a# 5Z={JKgUiʉ~e=ڊGn uC>LyNEVOG=ѵ*Fv ]ei䰵|̊OHcqJ} g0&ܦ| ZǮͣP/XM\į1az;w7V?4jvp,h%8{SqwR^I'@A2> 3Fz6` uCbZ8Q+Z0xj |_?6LvD\39lާo>sd!vζtR!ћrdJvK.zA-yC,{ e3xbkb5aT/m`8CgLlw~o ,"u$)?L~ 1QueA+2ejk61Gۉ)mt<T;q?… oOElMw !I)%j~3gW)1hNVGDX 5 v35 HK$xbLx\m;OӔ,ǧPByi(N1)O` kHL'5(~OXw5*԰[v._'?oϠUd?_&u) ne͙Iqv7Ч,LJRiLٴ ~O&c/.;Ԡ N? }(KX`` ō4*y]´(OyaSt:%*kp}{~tSȡ*Kv&K^Y8SqjL9=s`}j1X&B艳מ4tp䘦E4ӛ%#pOm) A!rrY| ?Dܬc4[ҷgPU | M"?}!GY[3 `/rY)ޡ,Œ`Lq(=H&FWd y-9uQZzK4 _Q>'_x%i%w7c 1nL7]n42u-RAVK^ e>|Κg`ޛ۴X9)SۖI*!)+0l}aWٲSruXc죢:jH1wY(W;WDu9O+V} Q6< Z@j}J$ EJkbP{!|hiЛ"]w4z!S#I"_i2?ࠉP2/hy>_=`#ف%5˙3"z?I{2z`=;M LGJ ]Ϲ3ѳ3zEYr8Q Xw{ ႺX&բ4:A.w #ZCV2C6^ FO˗E QZ^=I9_<솒kP=|?v](5sW# f(c0AbOX/ߚK@o庈w.ɁD=&q?WQ*9oC9c@ +f7>֖E ү` xՏ]QO,odrNDz.6G'`tfSg#c'8Tkt!ٞB)jUp'NY:XO+zZ~0I{ͤ*ZbĹ9i1^#p"tCB %kQVW/xq8 qYo4 pk1O ~zP)6 K܏FI cX2޶`KÙɥGD8Kq~G7tNr&.BmYX6ZYOċ#Yh<ˈx$@/(U9]a"G, Q3 i)-|ɓGO\\-C57cYMH1ʴV9T9\Ԯac8Ϫ/Q4Zh'z h:jDQwQnb2+&R'dySU2Z @Rh:^Z#l HûP <*GwGB x/ҢaR6FO<5g~DԷOH, 4 tcmgR .p [}`&`Ӥ\O snjP=5`^W:^xU9Z]?mΩ\idt N``u! E>\|ͳv$o}qUMekU!guz/FZ3,KΩc[=uu\Jr)$p)#z6d| ca%Z (u=ȿzJ{٤SdhA$ł;BR(NGs# o1lF,6D.'V߇ Fx 船sfkky9iniڜ|;=?xe;pgv}c rY\+(kwؗD%]tQ9 l7I~~BK%M16V/$fړa˿S93Eb%ʢh LvP]܎u 7aE*Bs̩-<2|s'{Wl >Rf8:ʥͮ"6D#d~Kw*?D$U.;y/%A8:JFi#^a44dYU0?'d𷩤kF_[ yB(+juB 19;vCeI_3ѧu7iNprI8L1GL)Ĝp`Gu3V@0S~zX_L!ΕnY@sf\!\GJ`ƔtK_6F_A(})a.SW}ۘVi!QU,v]\3 '`aP{UGu2s KB5 ڲ.Kw8Y?K { \ޅqG wP^joѥ1x,(6JCъmwQKU);Xx3Ϧ-Qdb˘ie>9rrBG@./4_.$tiYJ}+ؚ%'KwUtƤ0]XZۙZ'>RTo:b ׼8bp7IeNݼϲgGG endstream endobj 177 0 obj << /Author(\376\377\000J\000a\000s\000o\000n\000\040\000A\000n\000t\000h\000o\000n\000y\000\040\000V\000a\000n\000d\000e\000r\000\040\000H\000e\000i\000d\000e\000n)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000T\000o\000p\000o\000l\000o\000g\000y\000\040\000a\000n\000a\000l\000y\000s\000i\000s\000\040\000o\000f\000\040\000l\000i\000n\000e\000a\000g\000e\000\040\000t\000r\000e\000e\000s)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Producer(pdfTeX-1.40.20)/Keywords() /CreationDate (D:20211031092940-07'00') /ModDate (D:20211031092940-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 143 0 obj << /Type /ObjStm /N 44 /First 379 /Length 2715 /Filter /FlateDecode >> stream xZr8}W1-@\X55Uq.LLmDɜHBQ| d)e@qtєbƓI-Xгf\h4a\ND93!EG2,u1PIIe ɒXBX+( K FD2%E Ô)c)B^ǩVL $6Li%H:%[11Y :i 0m,0%(1R ԙį̆J1)F V؁,qa8,$lJ TtI FeQJ]C1ɔ"9EdnSF|KKhQ3n.HX{$zsNiaZz*v#p[$ܨm $aNrRS' G\0R OOrtbl椺54Bw)pcI4~pK#shP}i/,493 }ߺA6I gb傂A TZh2: њɌCEZUHa'kX(ڒ*׷2,mR'Gs滾Ef#Fel- #&g τĎL)WQ/FSjH*Mhe|RoܜgC`Q DXZBս6D_ l|dZ;@8)$>npXJMʠ[ħtW5I d<}Ћ$k %T鉔⡝w1hݳam#$ŽZcDB`O]|:B%ӏXUB-TM"R2HJA2A]QJn>huCx kL}CӵTA@awcKDYMbGd'~e.G]NFE~wݯF?4.X,zZfR뺬Fe̓׿ŋ2[x|V.Xd KY}bc"qhTF(zQ>ϋux inS(zVgbp5_,E|J0kXY.كa(zF(>Gh,|]dP""jnKC%!n)دK7 <Σg/x踌>D]||.y0rv\98.vf7D"x:_ߢ/UAkv*_-Y{ӶΫF_۲ΧN`eܓ{67l)GE*ϣۮyU}~zRœ/]|ЉċZdImglkuġp>[v@E^}6ó_4lS\#!YbCuِ}6d ux.q Jo>f)Aė N˳ l8֒8`S~(}0vyМ}_y(WE}bC,elC%ӎq/\oSP4vٺgS~?LԊBN"\ͭz7>_!e IKۿ]e/y2h9Lrf(>YdKWPbY}^r~v_MWgdbU_/&r~wJ/޿l]~ xM} .:bޮ&p|-.'I9-VsVf987GnkTa܅UBx7 h1V|@1"lB\w1ReBm]Wۜ@y ,5RWM-8v:pWGA\GDefN"%zZTb Yxc17@u-xV;J1<FSh%>%H:Ħؒ>o^zb3Cl ok!s@W@ ܜ{v Ld˨!s Av";`<{^XK\rCI:+\/qnbd`놫#!+J^TWGJWZ{ÊWz}r%t[*ꟼFլ-jdH `GusRVfHe%lKՕt݄KVd ¾FŦPƌgUxWK qݗp`]_!G&l5$\AŠ?1.PA؃Cѕ=K@7UCZu:vcŬ r6ΧH.[4A^]oݧ#[*Vş)ϻL! 6v[j~?,;\Foy,ecTXOW% ] /Length 465 /Filter /FlateDecode >> stream x%;OAsfr[QDVVVA.*7v~iFD;$!X`/yϼ3`mwH(*7Ѻ CYNz8³ < ijZh~pjg6iԊj8LwKVM18N3n Z!h+ѭ駺'- N@;[un;JV<\.n^s[[pmAKf͗jLۇ :܀Iu\Pw . n_sFK`G>M%5nmwam8o(u1ERCw2yr*UxJOzTJi`&vB#_?xr8_<S endstream endobj startxref 281160 %%EOF alakazam/inst/doc/Files-Vignette.R0000644000175000017500000000133414137542133016663 0ustar nileshnilesh## ---- eval=TRUE, warning=FALSE, message=FALSE--------------------------------- # Set the file paths from inside the package directory # These files are smaller versions of the example databases previously mentioned changeo_file <- system.file("extdata", "example_changeo.tab.gz", package="alakazam") airr_file <- system.file("extdata", "example_airr.tsv.gz", package="alakazam") # Read in the data db_changeo <- alakazam::readChangeoDb(changeo_file) db_airr <- airr::read_rearrangement(airr_file) ## ---- eval=FALSE, warning=FALSE, message=FALSE-------------------------------- # # Write the data to a tab-delimited file # alakazam::writeChangeoDb(db_changeo, "changeo.tsv") # airr::write_rearrangement(db_airr, "airr.tsv") alakazam/inst/doc/Fastq-Vignette.R0000644000175000017500000000312014137542131016670 0ustar nileshnilesh## ---- eval=TRUE, warning=FALSE, message=FALSE--------------------------------- library(alakazam) library(dplyr) library(airr) db <- read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") ## ----------------------------------------------------------------------------- original_cols <- colnames(db) db <- readFastqDb(db, fastq_file, style="both", quality_sequence=TRUE) new_cols <- setdiff(colnames(db), original_cols) db[,new_cols] %>% head() ## ----------------------------------------------------------------------------- quality <- getPositionQuality(db, sequence_id="sequence_id", sequence="sequence_alignment", quality_num="quality_alignment_num") head(quality) ## ---- fig.cap="Sequence quality per IMGT position for one sequence.", fig.asp=0.25---- min_pos <- min(quality$position) max_pos <- max(quality$position) ggplot(quality, aes(x=position, y=quality_alignment_num, color=nt)) + geom_point() + coord_cartesian(xlim=c(110,120)) + xlab("IMGT position") + ylab("Sequencing quality") + scale_fill_gradient(low = "light blue", high = "dark red") + scale_x_continuous(breaks=c(min_pos:max_pos)) + alakazam::baseTheme() ## ----------------------------------------------------------------------------- db <- maskPositionsByQuality(db, min_quality=70, sequence="sequence_alignment", quality="quality_alignment_num") alakazam/inst/doc/AminoAcids-Vignette.Rmd0000644000175000017500000001733714067624107020167 0ustar nileshnilesh--- title: 'Alakazam: Amino acid physicochemical property analysis' author: "Susanna Marquez" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Amino acid property analysis} %\usepackage[utf8]{inputenc} --- The `alakazam` package includes a set of functions to analyze the physicochemical properties of Ig and TCR amino acid sequences. Of particular interest is the analysis of CDR3 properties, which this vignette will demonstrate. The same process can be applied to other regions simply by altering the sequence data column used. Wu YC, et al. High-throughput immunoglobulin repertoire analysis distinguishes between human IgM memory and switched memory B-cell populations. Blood 116, 1070-8 (2010). Wu YC, et al. The relationship between CD27 negative and positive B cell populations in human peripheral blood. Front Immunol 2, 1-12 (2011). ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(dplyr) # Subset example data data(ExampleDb) db <- ExampleDb[ExampleDb$sample_id == "+7d", ] ``` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ## Calculate the properties of amino acid sequences Multiple amino acid physicochemical properties can be obtained with the function `aminoAcidProperties`. The available properties are: * `length`: total amino acid count * `gravy`: grand average of hydrophobicity * `bulkiness`: average bulkiness * `polarity`: average polarity * `aliphatic`: normalized aliphatic index * `charge`: normalized net charge * `acidic`: acidic side chain residue content * `basic`: basic side chain residue content * `aromatic`: aromatic side chain content This example demonstrates how to calculate all of the available amino acid properties from DNA sequences found in the `junction` column of the previously loaded AIRR file. Translation of the DNA sequences to amino acid sequences is accomplished by default with the `nt=TRUE` argument. To reduce the junction sequence to the CDR3 sequence we specify the argument `trim=TRUE` which will strip the first and last codon (the conserved residues) prior to analysis. The prefix `cdr3` is added to the output column names using the `label="cdr3"` argument. ```{r, eval=TRUE, warning=FALSE, fig.width=7.5, fig.height=6} db_props <- aminoAcidProperties(db, seq="junction", trim=TRUE, label="cdr3") # The full set of properties are calculated by default dplyr::select(db_props[1:3, ], starts_with("cdr3")) # Define a ggplot theme for all plots tmp_theme <- theme_bw() + theme(legend.position="bottom") # Generate plots for all four of the properties g1 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_length)) + tmp_theme + ggtitle("CDR3 length") + xlab("Isotype") + ylab("Amino acids") + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g2 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_gravy)) + tmp_theme + ggtitle("CDR3 hydrophobicity") + xlab("Isotype") + ylab("GRAVY") + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g3 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_basic)) + tmp_theme + ggtitle("CDR3 basic residues") + xlab("Isotype") + ylab("Basic residues") + scale_y_continuous(labels=scales::percent) + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g4 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_acidic)) + tmp_theme + ggtitle("CDR3 acidic residues") + xlab("Isotype") + ylab("Acidic residues") + scale_y_continuous(labels=scales::percent) + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) # Plot in a 2x2 grid gridPlot(g1, g2, g3, g4, ncol=2) ``` ### Obtaining properties individually A subset of the properties may be calculated using the `property` argument of `aminoAcidProperties`. For example, calculations may be restricted to only the grand average of hydrophobicity (`gravy`) index and normalized net charge (`charge`) by specifying `property=c("gravy", "charge")`. ```{r, eval=TRUE, warning=FALSE} db_props <- aminoAcidProperties(db, seq="junction", property=c("gravy", "charge"), trim=TRUE, label="cdr3") dplyr::select(db_props[1:3, ], starts_with("cdr3")) ``` ### Using user defined scales Each property has a default scale setting, but users may specify alternate scales if they wish. The following example shows how to import and use the Kidera et al, 1985 hydrophobicity scale and the Murrary et al, 2006 pK values from the `seqinr` package instead of the defaults for calculating the GRAVY index and net charge. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load the relevant data objects from the seqinr package library(seqinr) data(aaindex) data(pK) h <- aaindex[["KIDA850101"]]$I p <- setNames(pK[["Murray"]], rownames(pK)) # Rename the hydrophobicity vector to use single-letter codes names(h) <- translateStrings(names(h), ABBREV_AA) db_props <- aminoAcidProperties(db, seq="junction", property=c("gravy", "charge"), trim=TRUE, label="cdr3", hydropathy=h, pK=p) dplyr::select(db_props[1:3, ], starts_with("cdr3")) ``` ### Getting vectors of individual properties The `aminoAcidProperties` function provides a convenient wrapper for calculating multiple properties at once from a `data.frame`. If a vector of a specific property is required this may be accomplished using one of the worker functions: * `gravy`: grand average of hydrophobicity * `bulk`: average bulkiness * `polar`: average polarity * `aliphatic`: aliphatic index * `charge`: net charge * `countPatterns`: counts the occurrence of patterns in amino acid sequences The input to each function must be a vector of amino acid sequences. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Translate junction DNA sequences to amino acids and trim first and last codons cdr3 <- translateDNA(db$junction[1:3], trim=TRUE) # Grand average of hydrophobicity gravy(cdr3) # Average bulkiness bulk(cdr3) # Average polarity polar(cdr3) # Normalized aliphatic index aliphatic(cdr3) # Unnormalized aliphatic index aliphatic(cdr3, normalize=FALSE) # Normalized net charge charge(cdr3) # Unnormalized net charge charge(cdr3, normalize=FALSE) # Count of acidic amino acids # Takes a named list of regular expressions countPatterns(cdr3, nt=FALSE, c(ACIDIC="[DE]"), label="cdr3") ``` ## Default scales The following references were used for the default physicochemical scales: * Aliphatic index: Ikai AJ. Thermostability and aliphatic index of globular proteins. J Biochem 88, 1895-1898 (1980). * Bulkiness scale: Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). * Hydrophobicity scale: Kyte J, Doolittle RF. A simple method for displaying the hydropathic character of a protein. J Mol Biol 157, 105-32 (1982). * pK values: \url{http://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} * Polarity scale: Grantham R. Amino acid difference formula to help explain protein evolution. Science 185, 862-864 (1974). alakazam/inst/doc/Lineage-Vignette.Rmd0000644000175000017500000002042214137540017017504 0ustar nileshnilesh--- title: 'Alakazam: Reconstruction of Ig lineage trees' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Lineage reconstruction} %\usepackage[utf8]{inputenc} --- Reconstruction of an Ig lineage requires the following steps: 1. Load an AIRR tab-delimited database file and select a clone 2. Preprocess the clone to remove gap characters and duplicate sequences 3. Run PHYLIP, parse the output, and modify the tree topology ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. Lineage reconstruction requires the following fields (columns) to be present in the AIRR file: * `sequence_id` * `sequence_alignment` * `germline_alignment` * `v_call` * `j_call` * `junction_length` * `clone_id` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(igraph) library(dplyr) # Select a clone from the example database data(ExampleDb) sub_db <- subset(ExampleDb, clone_id == 3138) ``` ## Preprocess a clone Before a lineage can be constructed, the sequences must first be cleaned of gap (-, .) characters added by IMGT, duplicate sequences must be removed, and annotations must be combined for each cluster of duplicate sequences. Optionally, "ragged" ends of sequences (such as those that may occur from primer template switching) may also be cleaned by masking mismatched positions and the leading and trailing ends of each sequence. The function `makeChangeoClone` is a wrapper function which combines these steps and returns a `ChangeoClone` object which may then be passed into the lineage reconstruction function. Two arguments to `makeChangeoClone` control which annotations are retained following duplicate removal. Unique values appearing within columns given by the `text_fields` arguments will be concatenated into a single string delimited by a "," character. Values appearing within columns given by the `num_fields` arguments will be summed. ```{r, eval=TRUE} # This example data set does not have ragged ends # Preprocess clone without ragged end masking (default) clone <- makeChangeoClone(sub_db, text_fields=c("sample_id", "c_call"), num_fields="duplicate_count") # Show combined annotations clone@data[, c("sample_id", "c_call", "duplicate_count")] ``` ## Run PHYLIP Lineage construction uses the `dnapars` (maximum parsimony) application of the PHYLIP package. The function `buildPhylipLineage` performs a number of steps to execute `dnapars`, parse its output, and modify the tree topology to meet the criteria of an Ig lineage. This function takes as input a `ChangeoClone` object output by `makeChangeoClone` and returns an igraph `graph` object. The igraph `graph` object will contain clone annotations as graph attributes, sequence annotations as vertex attributes, and mutations along edges as edge attributes. The system call to `dnapars` requires a temporary folder to store input and output. This is created in the system temporary location (according to `base::tempfile`), and is not deleted by default (only because automatically deleting files is somewhat rude). In most cases, you will want to set `rm_temp=TRUE` to delete this folder. ```{r, eval=FALSE} # Run PHYLIP and parse output phylip_exec <- "~/apps/phylip-3.69/dnapars" graph <- buildPhylipLineage(clone, phylip_exec, rm_temp=TRUE) ``` ```{r, echo=FALSE, warning=FALSE, message=FALSE} # Load data instead of running phylip # Clone 3138 is at index 23 graph <- ExampleTrees[[23]] ``` ```{r, eval=TRUE, warning=FALSE, message=FALSE} # The graph has shared annotations for the clone data.frame(clone_id=graph$clone, junction_length=graph$junc_len, v_gene=graph$v_gene, j_gene=graph$j_gene) # The vertices have sequence specific annotations data.frame(sequence_id=V(graph)$name, c_call=V(graph)$c_call, duplicate_count=V(graph)$duplicate_count) ``` ## Plotting of the lineage tree Plotting of a lineage tree may be done using the built-in functions of the igraph package. The default edge and vertex labels are edge weights and sequence identifiers, respectively. ```{r, eval=TRUE} # Plot graph with defaults plot(graph) ``` The default layout and attributes are not very pretty. We can modify the graphical parameter in the usual igraph ways. A tree layout can be built using the `layout_as_tree` layout with assignment of the root position to the germline sequence, which is named "Germline" in the object returned by `buildPhylipLineage`. ```{r, eval=TRUE} # Modify graph and plot attributes V(graph)$color <- "steelblue" V(graph)$color[V(graph)$name == "Germline"] <- "black" V(graph)$color[grepl("Inferred", V(graph)$name)] <- "white" V(graph)$label <- V(graph)$c_call E(graph)$label <- "" # Remove large default margins par(mar=c(0, 0, 0, 0) + 0.1) # Plot graph plot(graph, layout=layout_as_tree, edge.arrow.mode=0, vertex.frame.color="black", vertex.label.color="black", vertex.size=40) # Add legend legend("topleft", c("Germline", "Inferred", "Sample"), fill=c("black", "white", "steelblue"), cex=0.75) ``` Which is much better. ## Batch processing lineage trees Multiple lineage trees may be generated at once, by splitting the Change-O data.frame on the clone column. ```{r, eval=TRUE, warning=FALSE, results="hide"} # Preprocess clones clones <- ExampleDb %>% group_by(clone_id) %>% do(CHANGEO=makeChangeoClone(., text_fields=c("sample_id", "c_call"), num_fields="duplicate_count")) ``` ```{r, eval=FALSE} # Build lineages phylip_exec <- "~/apps/phylip-3.69/dnapars" graphs <- lapply(clones$CHANGEO, buildPhylipLineage, phylip_exec=phylip_exec, rm_temp=TRUE) ``` ```{r, echo=FALSE, warning=FALSE, message=FALSE} # Load data instead of running phylip graphs <- ExampleTrees ``` ```{r, eval=TRUE} # Note, clones with only a single sequence will not be processed. # A warning will be generated and NULL will be returned by buildPhylipLineage # These entries may be removed for clarity graphs[sapply(graphs, is.null)] <- NULL # The set of tree may then be subset by node count for further # analysis, if desired. graphs <- graphs[sapply(graphs, vcount) >= 5] ``` ## Converting between graph, phylo, and newick formats While much of analysis in `alakazam` focuses on using `igraph` `graph` objects, R `phylo` objects are capable of being used by a rich set of phylogenetic analysis tools in R. Further, stand-alone phylogenetics programs typically import and export trees in Newick format. To convert to trees in `graph` format to `phylo` format, use `graphToPhylo`. These objects can now be used by functions detailed in other R phylogenetics packages such as `ape`. ```{r, eval=TRUE, show=FALSE} # Modify graph and plot attributes V(graph)$color <- categorical_pal(8)[1] V(graph)$label <- V(graph)$name E(graph)$label <- E(graph)$weight ``` ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Convert to phylo phylo <- graphToPhylo(graph) # Plot using ape plot(phylo, show.node.label=TRUE) ``` To import lineage trees as `phylo` objects from Newick files, use the `read.tree` function provided in the `ape` package. To export lineage trees as a Newick file, use the `write.tree` function provided in `ape`. ```{r, eval=FALSE} # Read in Newick tree as phylo object phylo <- ape::read.tree("example.tree") # Write tree file in Newick format ape::write.tree(phylo, file="example.tree") ``` To convert this `phylo` object to a `graph` object, use the `phyloToGraph` function with the germline sequence ID specified using the `germline` option. Note that while some of the nodes in more complex trees may rotate during this process, their topological relationships will remain the same. ```{r, eval=TRUE} # Convert to graph object graph <- phyloToGraph(phylo, germline="Germline") ``` alakazam/inst/doc/Topology-Vignette.R0000644000175000017500000001255414137542163017446 0ustar nileshnilesh## ---- eval=TRUE, warning=FALSE, message=FALSE--------------------------------- # Load required packages library(alakazam) library(igraph) library(dplyr) # Load example trees data(ExampleTrees) # Select one tree for example purposes graph <- ExampleTrees[[24]] # And add some annotation complexity to the tree V(graph)$sample_id[c(2, 7)] <- "-1h" V(graph)$c_call[c(2, 7)] <- "IGHM" # Make a list of example trees excluding multi-isotype trees graph_list <- ExampleTrees[sapply(ExampleTrees, function(x) !any(grepl(",", V(x)$c_call)))] ## ---- eval=TRUE--------------------------------------------------------------- # Set node colors V(graph)$color[V(graph)$sample_id == "-1h"] <- "seagreen" V(graph)$color[V(graph)$sample_id == "+7d"] <- "steelblue" V(graph)$color[V(graph)$name == "Germline"] <- "black" V(graph)$color[grepl("Inferred", V(graph)$name)] <- "white" # Set node labels V(graph)$label <- paste(V(graph)$sample_id, V(graph)$c_call, sep=", ") V(graph)$label[V(graph)$name == "Germline"] <- "" V(graph)$label[grepl("Inferred", V(graph)$name)] <- "" # Set node shapes V(graph)$shape <- "crectangle" V(graph)$shape[V(graph)$name == "Germline"] <- "circle" V(graph)$shape[grepl("Inferred", V(graph)$name)] <- "circle" # Set node sizes V(graph)$size <- 60 V(graph)$size[V(graph)$name == "Germline"] <- 30 V(graph)$size[grepl("Inferred", V(graph)$name)] <- 15 # Remove large default margins par(mar=c(0, 0, 0, 0) + 0.05) # Plot the example tree plot(graph, layout=layout_as_tree, vertex.frame.color="grey", vertex.label.color="black", edge.label.color="black", edge.arrow.mode=0) # Add legend legend("topleft", c("Germline", "Inferred", "-1h", "+7d"), fill=c("black", "white", "seagreen", "steelblue"), cex=0.75) ## ---- eval=TRUE--------------------------------------------------------------- # Consider all nodes getPathLengths(graph, root="Germline") ## ---- eval=TRUE--------------------------------------------------------------- # Exclude nodes without an isotype annotation from step count getPathLengths(graph, root="Germline", field="c_call", exclude=NA) ## ---- eval=TRUE--------------------------------------------------------------- # Summarize tree df <- summarizeSubtrees(graph, fields=c("sample_id", "c_call"), root="Germline") print(df[1:4]) print(df[c(1, 5:8)]) print(df[c(1, 9:12)]) ## ---- eval=TRUE--------------------------------------------------------------- # Set sample colors sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") # Box plots of node outdegree by sample p1 <- plotSubtrees(graph_list, "sample_id", "outdegree", colors=sample_colors, main_title="Node outdegree", legend_title="Time", style="box", silent=TRUE) # Box plots of subtree size by sample p2 <- plotSubtrees(graph_list, "sample_id", "size", colors=sample_colors, main_title="Subtree size", legend_title="Time", style="box", silent=TRUE) # Violin plots of subtree path length by isotype p3 <- plotSubtrees(graph_list, "c_call", "pathlength", colors=IG_COLORS, main_title="Subtree path length", legend_title="Isotype", style="violin", silent=TRUE) # Violin plots of subtree depth by isotype p4 <- plotSubtrees(graph_list, "c_call", "depth", colors=IG_COLORS, main_title="Subtree depth", legend_title="Isotype", style="violin", silent=TRUE) # Plot in a 2x2 grid gridPlot(p1, p2, p3, p4, ncol=2) ## ---- eval=TRUE--------------------------------------------------------------- # Count direct edges between isotypes tableEdges(graph, "c_call") ## ---- eval=TRUE--------------------------------------------------------------- # Direct edges excluding germline and inferred nodes tableEdges(graph, "c_call", exclude=c("Germline", NA)) ## ---- eval=TRUE--------------------------------------------------------------- # Count indirect edges walking through germline and inferred nodes tableEdges(graph, "c_call", indirect=TRUE, exclude=c("Germline", NA)) ## ---- eval=TRUE--------------------------------------------------------------- # Test isotype relationships edge_test <- testEdges(graph_list, "c_call", nperm=10) # Print p-value table print(edge_test) # Plot null distributions for each annotation pair plotEdgeTest(edge_test, color="steelblue", main_title="Isotype Edges", style="hist") ## ---- eval=TRUE--------------------------------------------------------------- # Use unweighted path length and do not exclude any nodes mrca_df <- getMRCA(graph, path="steps", root="Germline") # Print subset of the annotation data.frame print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ## ---- eval=TRUE--------------------------------------------------------------- # Exclude nodes without an isotype annotation and use weighted path length mrca_df <- getMRCA(graph, path="distance", root="Germline", field="c_call", exclude=NA) # Print excluding sequence, label, color, shape and size annotations print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ## ---- eval=TRUE--------------------------------------------------------------- # Test isotype MRCA annotations mrca_test <- testMRCA(graph_list, "c_call", nperm=10) # Print p-value table print(mrca_test) # Plot null distributions for each annotation plotMRCATest(mrca_test, color="steelblue", main_title="Isotype MRCA", style="hist") alakazam/inst/doc/Fastq-Vignette.pdf0000644000175000017500000043306014137542133017254 0ustar nileshnilesh%PDF-1.5 % 8 0 obj << /Length 1838 /Filter /FlateDecode >> stream xYF~uɑ}(Qh;u}Q'^$ў@*nyofi9?7=!J CyB~r0L&{v~#п U5w翃$!1AI6,K Ⅼ'E10`Qb) 9ß3pxGP C*'mf@hBBfQd~"SقI 0'ɿhl:M@8M|b08C'T25b*16n[B6ƲE|=~9 `P5yW%؟lL`$!ĨUfG>P8@I cov奜+\ȥE87&o$=6YkL,6ܺR |x:*XC$.w8Dq&eN#atdXN$|~`L00"!g'Cc+gb;@XO/VqzZoRnt Ċ3W2؟y#]P? 7RP֙LeYَi{shVP؍vkΌau}lU0}SSs>Q|Ai̎+vuf{tJh]Ȧ}?.Bp1$.[<0쵙W.& s|UsGjSOJؿrr Q *v50Qi*򳺭z42 ˖*Тllgnsڴ5dqXإ^ |ΫsJY3ZfN]o:WlPS^6?ߜux~c!=]7xq֛]i|6+f@L4|l .D*vMTYI@/pMz~·=\z[KyZ3~K6 G!i e@X-N8q[y.t]˼4ܴWӘTKlةBb+pr)iT]'N>a c8j~!ؽcKٮLO RA? x8e 0L!Qr6A;,L1xձ.[̸$>jBM\n~@< C6/Rg5!joj<0`,5}Zc(c~u0d\XG,∻3CΎ h%4OȢDHA&榡߅JT f!mYF d2ADRUUD!QrAܷf( jY-Q;ծ(>:z}vOdB* H3e^z<z\#sW}󥽛ޮp0Vab^*vj{0`buohD-y^o.e-,&E!ͻE0:.khBE/JŕTf5&!61f{jW1 f,/ Xd~R fkm>P[#ظ! QJ@H\LFV_.>T }ei]ΎHU)7&e.KziԚ22+3ÓQ'6Q#\Ct7|[#mx}{[q?=?k endstream endobj 26 0 obj << /Length 1575 /Filter /FlateDecode >> stream xX[o6~%{>bt@s im %ѥwCْvRKK<"? /Ԙ~_8`4`hfxh@ и4o*Ge{J Jl~eҕ|ˁG4UWuȶd3r.YQ~hϭ@ԡT)q\Ī; p!o*N8 _m)ǝWՑI d[#a#>_kGj|Dc]t*yv Z9uë |XF=nSiαNE_ї/(#9^`Y ),2di&)aߎ_Up!E+t5K1uZ~;Y,:vNK5նg Y`sJՓ (~8|8< ;иF㇢C4u(pYt  6ڧܣ mKc+0 zT'~iɔmqĶۧH|~gOF,v5w5O4i|!L]2K tH\fY"/eAGw693sm<]3 ca9ݵ1^[|sp+Q{nOi{Xn;H]B~S,<a$w1gK4!{z E7q%sԸĭU(+e?PxeVYtKqU|/2/q>m E,Ŀ"9Jg" 9ZD_UN!aNL9{:Zeќ8RDlźU@J&@F:61xS9Qynz,[f<0׬`- ZH|p"-Ѽ%R-TqvL]oJ l[\SµHuTr\h^Yњs0u>M+n-3i*4CTėr_*4j O= \`m+eȒ2Us(WETlHMgf>ӡ D03ZeT.41H+c 1˳: VFS,Ρo1s V(e-7., H;j׫Mi9f-#g-yP,}%CG׏|nt58{:@_#2l40; ̲m&hs5:@ 8w?gHdQl!o5 (U4ٔ|Y=Z^`#~}_v ۬ 8zP/j}|{Qo endstream endobj 23 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Fastq-Vignette_files/figure-latex/unnamed-chunk-4-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 30 0 R /BBox [0 0 524 125] /Resources << /XObject << /Im1 31 0 R >>/ProcSet [ /PDF ] >> /Length 33 /Filter /FlateDecode >> stream x+2T0BC]SJ5Tp T endstream endobj 31 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/dv/8ryjx62x2dxfsb1zp8_9zl0m0000gp/T/RtmpfajExU/Rbuild7ee6133762e0/alakazam/vignettes/Fastq-Vignette_files/figure-latex/unnamed-chunk-4-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 32 0 R /BBox [ 0 0 540 135] /Resources << /ProcSet [/PDF/Text] /Font << /F2 33 0 R >> /ExtGState << >> /ColorSpace << /sRGB 34 0 R >> >> /Length 1833 /Filter /FlateDecode >> stream xYK5ϯ1~GAD q@K6nr=vL+_m;޼2޼3?m처P&xm7ss[眙o/o\%5έ(狋?xߌ3yw?6dlz؋m+m-ڴߗ;ņl H)hkX-K76蘙PhT^oLJ1)GgPy%rNf-Rɪ:e6⺒3 sl]IG܀JmǛ3ڦR[URAʸ.FT̆p3Wڲ9aLf[iUBqn%l}σbKXɺo6Y7T.;UUZ[=b.ͭul3/®x_ai6>Gדg'FL݄mlt^PN.UqdSrxCd(GK%Oa61uH]AI8&R;D(wsĩK8nNb8?gS*H\Wl8SgSK\-Rlj{ xFOPq p2aVli3vI3aʲ#Xcflu+6!T 6c3+lq>|8'gr;}xhp{ݱw5Fx6ȱp77W7sj8\7F OTh7u \)8S֗Okx``;>Ħ V KMCK bIơ6UdT؜zyɠa%J76o_kB_rǴFw64.l5Eэuuӧ:JTeM\W/nK7*Kprir_q-,ZnLUhY*C#ːq%%1UYĆqUU~/a̢6@ptT-7m#g m39+S%Jlʴ}HֽU^"^WKʧmRq NU^6 a-Te: :(4!d%62qxU|xʩhbȧS%(82(9 S%Jl7qX] ʁ^<{7{#u]8>طO?lF1^<`LFjD_>`4#:nmO~}nn endstream endobj 36 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 39 0 obj << /Length 365 /Filter /FlateDecode >> stream xڥO0vv-a-`pfamnBˢ1^O_[@[h@dNCDDQoPP_Rt]R{s5|82z,}xMݲ,t,OwO9eJ~2tf@8ut&9@WQڞ煃X0`]aF)ACϩ%{YSRSD/ ]_XJ^'nyY:h3@&Trn: i!aʉPn<4xi|@c> stream xڴuP>\Z]Cp]wkBqwwעc}kM&ysz~1SG7W?oj vWD {׿zfLILYNZJCI}@qd{+"? `}R)G ;kW'i^'0ŋ忦RKG ˿nĢhwҿeV@0t=ͭYJ%fK^?'gc | `7?x6!_9Z|3_%exP hĢ ?;_MY2uO2El*m P[ˁM߇^ޑEZ:6Y&6ҽϢ# ^^Xd?׸m$hqsqL]\LXg >@Ͽ~K _H%H([*{GF~XY,l? =? /=ÿ!{dȠ@v? Nfix|7urc ccq%S'b{?$oqq{yl\{t{G_G#-̓BmaiO+ua2ډ $)"_he SuiBq_[+'o,DwLѤ򴙵;) J8gZ[Zc|]oW孫ؚp\<1:: o81bK&xcpN=]zTTKi~;A?p-zzJYIq+kUu&6S4uWy~ $d {~z~ۅ ی VW\v?_\}bPIR|I/Dtf08e|J}I~~ J5u㕸٩u=Nȉ}%זҳǵ%jYÇrtGaĈl,#P3S@qcc]#s Q4 qZú-v@9Z뻕Vԥ 8z/_Stvpx3[<}]בCߏ}kj؆ t9WGb5ASsbkCQt"2=pt"v442QC5 $f)B̥7h/`fTC4}l"U17!N<oJs {su,hmYy>{3\L?C=An}nywLiyt,]* UhDxf:d3<I#K!_V>ݡUta4tr&b8 \HYDF1sU<y^  מל/hy>W G<^z[Rɰъس\F四z4,k;W\cD:|إA\At}[)_ L,_ lMa-7M7AAb<6fvD;m?8aD5FH;(cd Y2"-w`n_ ^`2ED~곀Cm:PJ7:ПZFmAcL<+'#;iRWdtQ1E5O3ߺX.8NsРb'!}{)Uc? F3SM6h]7O XgmdžRyᏑKr,Ӏ*G٪0B&žQ_\JY^.~>ܟ0n YKz`nymڋ 3~qU*m\Wk;CS۪ Nѭꊞ&WL8kjt\"swwbl$d૾e1ŋQ{s8=H aqO(%sL2ZXRJ$ Ş15wzx&9=n1l' =j._6='j~ o'_]ىNڎ&nx>_,zL#[:d˒7žsKUyܔR} Kt8e<3<&fYL]a4h$mab E1˓nj`"s poỷ0.(C` {јD$yBJ5ȥdxUDpD{A3U-Ga;j$[u䤳+!(EՔȵ-Z}xQ:{4(TM sjb")Ϊ-B3. 1{7?kQV6tD$!"w/%g8+[%/,Z<.!bx eZ *hcD/Fl ZR Q1`ȣ"ȢReۻI j`7p1u¿[^f莐%kΚB~9<) opҩn[<<+bE *Ƣ3,Rlke*cq1#,բS/x Y|T-\M& mtCUV2ğ _f΍\GNj CηQjdmJ|{ى7C}`V1M}}{7|0NlFQZ/=CDzbTyvrL{L)qpV^.27y^`ȩ) ]38vO2%boV0E3X^뻈>iEe:w=8&42ÿv2x94 N,;PEGYy+7JsQ5鞞 Dԗ8<NvR4+ 5LJp~ެyzIn^Ct=ZuDv񥰂~ ~*POCl B@JvU'3L 'j@d8SLb? 6܌ڎ Y 2RxȚ4t@qy7,{͟2{YZHg,N5m* t`O %6j52&RyHy^ͨV9J~3ԜH0BQU4YE]:,ڕnMj+bF:>.CJ`!M >q P=|GA.:p~k~P_)vO+[ح_e] ,|B!V5ox9hSzϨ[^&t0mv-ƿpHf;":%3~h9Y/sb*N jk*%-NZ ~yg%#]{jzte aI2 JQse f߃MJֹuKUia(r3FFCR%: hhWi< 8tFd^QKw/S nvcAS, 0puD@?\#~ej괄3bA,[$B1`571)98husY6N n 3,~C  )ЗG2i &qCGK#kZ)AIicEWD[BFRLl?̋ǢG`?OU}R3# 7Y` `@nN~U/3t+VZ/o_eEsJio=lRcMHCdü%fU`$؏ ڑFa}2mcq-ب뱸غVW_Κ§Afb.2gE{6vdܙRKޘ{!Qw$L691bKeN.'kMgwhhGy/9:lU}tj? -v{(TƂuЄ6\yS'%KV۱ [x,e~. JqHG pe$'JW=F#M=8v]Vr=/+y.¶OV}~^Wm >WkåhyTeh^eބ \MrN nQ1|e0)Ej gEvl?qhKXQqC5ʳT(m`kٜV³0=(2UN2!s;=須3XMY VMJA ѢRZTV;U Z<#R=RH$UMߡ w7yW~}2HnfLES^Z!:∶u HBf-&=m Q*ckVQ#<( tUJf U0v6&&-.L5--|16aoCQ@>EkIM4ޗ J'LxuqTgIHe܊VБPAJ,E*3Y)+s/[ p&JѥP?`rˠC(@EKPWA\Yԋ^q; K#$2dfGvaEjL(0ޚ#|ۮ/}Z跛&DO2-k yh_=f9Z璓-aWtfz$闝u4ָ&8,h&cKZ͐)a&60t^%L`-^n揆HNϿ$%F1,Ôx4|=ۏ~ JcJO"鶝咽 PWzWB&B>C\&HfdrGc·`|D5TbpTy.e*E56ZʉK;Z`ѻ?քaJ8(/{j #߆Ŭ) xVN ݙc@5> o,lFaOc /M?٩tTIlLPPF+WOOo" zW=MN!z~ Z\D#MGk%/ҥSLٿl]r8vԂtljYCL6 kmZxsѝ όxn^l:U1aGGm=<ͫϱ w(kH=>ű lW3d.h}2Q;q/, 蟄varz)a|AĉXXF7 H|}[65z9c7yi5 ǔd:W.jvlg c٫ae[4(s_>M/{l^!B󵙋v;hdErޜEs O;aЌp6SC?-<ܱiҕ*4 `ZLcP_w4^;P)Q5#,y`w{k5pJI{D7[η>G5/Ls폕\oz5P,&Yi fc#j_a:ccޔjߋ\ ?C)M߶FI `m9F{E$? _0M&1,l1y\fyk xaɔD鲇S![@^ܵ 4NVΓi9CEO/`V׶7q%[JBC\)1}vڼl6AOG zqk6AklKz3Ye'BV@|3:QPİF8ď( o7[! LA,r`Y$xSCˠ0$Mb[#꺶y:M 㔧kh\1b,L`3vigZ("'6[.-)* O{reVeMC/,ಜ8OK3>teֱ_E q4$qL0qYraE'8Y(f<9`k  8ۛƱ,Z \z2, guPYX J_3qU皨N$^%#oP]շͭ٨U;oi>Gjf}D3wi @PXydH y@}rZي25:d$f/(~_ۍй! 6 )wTրWkwpRJiǀ ĦVPΛ T]IM \@}MI*D% % hZ%``}L㞍JNdf!AӋpA>?9gw htemVzo,)r?r#1|i&v-%.o-cT|{|]2>IƄ`}t;!wʖF-8ݲ xeuc@̗$(Leh0۳/1VAW5=+9qV +ԃl.;]WT*Izd^[r=PCڙU0m-ip|З#b8tW:vŭy\jz j|7k,0O(1|F1Q+*(~лɢv#d,}_Ͷf:|GY3+c NxlO#)oe.\pcքz+U_"U-3_:*]u"V[z7нhS,35"%=:bb9N8 xoR.R}wr{Fʡc χb!m|ï ϭ O8\ڛq6]T,]j؃uܯ0'?Wd&=`J67>Ė Gp JDz'0,r/dREC +n%d"^DEfKQNMe~ҒklQy9WN)2"~7({ȏLpجD8ל1P}C&.W= 1 20+ׁ[p޼*bMNAi+Ѽc#)L EpM%]W2,F>oz\OVL-Gj*Йb 1Nhlj=Io2Sk/6/.u;0PZ2x8֞!|yY8K7b5Krjj qFEYזYc)"ɴCM1(S|z&!ޯzn=AdF0/S&JN` bŨoAR)CA0!o<>w⫳C|:A ."q640bԇ@PGHk3y,)NOe%$X3Ϋ vcip Ce-'I@c׈dwsʦoE 0>@ֱ/wj6u͍ݟfekG"5hMVl?4ry_"='-|6PU4uSf5%ksc}䌁`PK* =G6ș͉u=\,IeC qyz'btfBQpiRolyH cil/ZPv~7L#8.h UOdQ,q< S[R<:v1_"?-RZ4߲F}7û]PE/y&0#݋ymYn"E*de~6ǾOa&Lx5\0Y5+ʄW}k6Y8@ڈ, !G i0^o!itkNUܠBv5kW]]`ej뾙D)j5{ORs e>\pje0LyKvCԁNתͯC쇺ˣ_-"v w=-!r٠XS .a,Zt Y~ j?&qȧiU3IֻQ50T߀IVٕ~xt2ydʮܦ-P?.0ԆZpG;E0s&8<)“L~P>{4Da  05ZΝdJNǗ[t®[tԪR¹NC(]~ɷlqp4v$ 6Z;G@.Nѷokq}h^H>+,M6o1Az9){Q.I{Fl_X42WWZWN\A43ձ5^3nϝGtH0Ȕ'sXN5]Rl֯Em%g$/ -0A_>"  ds6Ge,%$Ok%~ا!^bsϼA)[#!ϑ֓4<3pXY鹿|Ԇ"ZpŬhJf3? R^Mˊ?7ܤֶQ;}Vx8ʔwy*gj.0d7)낄XNϗw#P'ce޳L-q`OXmJ=*PNTScvF'B۴|o*ƳABwW3GL !jgE<_t{ekV*S5z{ϔ IϬofZV/Yрcϩ,]oY^ vإ*Q*'A3EY&Niw ^:HSpAgڀ`C>vVg弢6Y7|,ز8a&4#7)\\c~LpnlѪ@ofNݱhfvOK2U7vSɦ^\5slÞ??iGN˰7Azʈ~ G|:ZC0Vb i; (eB?@ӊV'klfٍNBl+{KS[vvci{9өPL9vNDZG] +Vlzw\D`3woB8mIelJQ UkS, |HK&tUu{cn'aJwt..$C-+~[oc DBotQ}]IԱu; pԴLǔzYDƞG#qBYYmaf< Ӥb[CO%mH$l;j6f4o>?C O|XEɋo}IQ?`ciZq Gf.oyB~oo\~A@QH8(R^7K\7 @P#K<:sUWmAڲ5S ;-v 3>Hh&[JL5fκqgN%`N*JfR\zj ?2n._ JMW[ObFPמ0&q!4Hۢ8bS" uQ?M"WK0v_jCfjf/LAH<1-#~ ` 2cю2*/BpsOiu]aw {}n'!T}V,*u,5^'/uBӿgg{f F8|Q֐S/2\tю&Ph +0^4r'rXO-4zރ|ħb*.&ݷl0mpOΧW R:c^~]Yu?O4d 8|w7L;vCOũ1a8 y}2)}FCVu2G{rג16}9?v{PZOc[VrwPQ)M7S5?ٹe0)\NEϔNV5lf,#}F#riJGB)p֠gK'DTsV6xb&F͚\6(!RఖnĮvVeIqplf/ 0|Hho&i9^7ȦMOٸR+sd~O J~sRW5={X `Ґ??uh! >xCmAbUJNSWqXmspw5L! <gCIɏ=m@- DLm%ɈX/܈F/e܈Rԉ>n&r]諘S yjlqQ4DFOb-lg"JG?;F]f{ݍ?LD}B ܶh gO?anSMr=j{bɦLđi$h(e0eJgNZ/gmk8Fo=X%v_Ukc.^f O+a۫PJSS\T21]=e!Yp=ɇIc] .uK0y0Fio"agၗ7<`᭑*$j_Y$'B|_*dy4NKe>yŃ͒H]HPBH9oUhu5%ff៦iWR}32EmKKվ, -‚=x^a:Ty@z԰/AYG*Ц[+;B G$M0jd$Uڃvp=5aq ߋ ةx.d4q1Q&YiYZZ2\yPhϭTs_V&ȟׅڶdY?N-q 쇴KD\2FFɋt^yiqBvdI3M_X兕.?M5P=|hIWlk֖|ygfW씒TCr׍.&^BnL#~ D^›ckX^ĐgCa6p {!O2RdD`cu0?cBq> vƙ"oxH!M:χv"VY⁤q'WaA |jQ^f4o8mӊ\lBNGrPQ涟xIL sIS& |"lkR9Ɉr(ǂJ0-ord[rX_ &E_["7hMtBǁOVlјm5Y.i{S| ;1tUxݢ]10Jeah_FhJtxle`K~uB]Iid;س7$ıAS  (d'6U?{|4v~qE8tVU4iW r~R/4ۆdt @Cu%餳%Ogi ps6˘Po{$Hւ~HDό`1It/saybTBK*>"'R*E4 ~e2Zcg$)Pu6Ce \*jZcq\ TG(o 6?&D>l*EҋvM*^ϝm%|Ԁ԰\ T(IqsŅHcֈkk9_XC{pQCv{wO.4 3GV:6|r @Iݭf@@U}b5MvePju [UOڡNzS"U󣄴i"U_ʗ{pe}g#Ehd^1 }_ 2lEgd5ʉvK ,@x;&2L~=L( ]Pi}(wY`}TDV{OvvYy H .XG}AYÿDa$ ag/d+,gg~}cm oeeI)j."ClR'qܪmd#YV&IsH*I2V,zFlTNS&g xYkpĽkb pF80D9P_1E))hkoS.Ktcv4HQUI,.,NRY>YH}bh Z7Cvm;F_3=/HҫXb*%%I)s2ڧV@)T]u(< ]5nֱ .CZbI\x`^a\GMO̐ g9L7}7ح2xCt)U^w2MN`RL`Az0H+*0~VZidЋo+V^Sk*?gs^Ë\biz+i'A=﷥T?jbM@ 9btz\kb>u OG\ نs0@u_.{ {otMP_Rw~ 9/[irc֨#Ʃ`6Ai)J-pYT`9-ЏT{e|T[ǫf"җIuP >LZW>#6S+Η[/ϟ~K8d5~.U>=X,,Np(!~p^?ӣD"0kSu6{*⠙Nr1)ہKC!7Ar$p7<ӿ@Ͷ kgosnu4̍{n]&#ʩ"f1,owF]<:0ktfY3DM;$͊}@N>EU6@N0ݙ]>OݮSj"~ͧcD"U%35MNI(8m5Ptq29 (KyGZ,%[(yG?ZfGN-W߰k&er\{js~xXTj2ů pyX4%iЄOߊTɶ&Jc yqBrтk%qroahCNt'|Lnx ELOTM_>a(?ͪf4Ewn'"%+jK =i(ưoKG@ 3*9+I>DRrmVJsгK 5A(,Lvփc:Q]2 Se2h~CI"vCTva/%ˍSw(/u*,SC ՃMBm:g`ȎG{!͢g ~?mJWx v'œi!z-T+jL?Dc-!Y@yY$w`wyox <@ x\4>"П1f^ab,c9C"~[]mjfpG؃9l"n'@ȋq>t.!'B5{E!-|#Xe,4vv,%Cӎ+ ]Nҷѹ! Qx}No)N1&R~]:BLBD4rk1fc]wP=L!k:{NPJK+\AY7DIZqZ$HF˫UW ҉ps10ZcI w%$4Mc:]Q3n4f~v ofv6;`_2!\4e?kfz`uׯI>L]y.. &[ =݉G$9_G;A엍_.9vB0H+yOE<^0"ŽƺnTKWm rϢMONՔx֢[:'.Yڞ*+!568=^ZR ھ娙t@.{ӛ]s%3k{j~X?*ǢieK㸉#Ѫ{[5~ GΟ'$z! Ww-=  GMZ>]ŘFD%H _Y2p;sa}k+d/dQ~2r?Mϔ3%+ߢķ־~۪"ScoUH:^obEj8墺|.$MH/l:륈3D x>߿ e͕tyLJ1TjlP,.'(Smۢʙ>~^ ffxG{ DPuE3ŰcXoCԪ{KF:v d@}TѻϨ2uN^7rK?V"eB1azLGO.6n(؍*/D q+ 9DZ[jnTv֟RAo*=ASDwXm {|&z?*Skk~ou> UOX`()EԑбGct(_kK$7h}y]@2[ǕY]de\)3NoI/l 袡G4jP 6zS=Cz|Šk]&m,UZ.[Q)3W~*@M"`aʶҔyU H . &:UWwI"@\[58B{*ΝnrKIT_qN9%C[2P- M݀8qyy1YFˬ!o }˰ݟqNQZKM? eE0|=Ԉlq-JGѡ ۼ2yФ(\ګy>XBJGa|\~z~WIu^lITL l5 $7h 8U񙢏}gv.VƴM@N{]P3Kdn;̎wE.9`HL}z7 ~~=ҝw\P_bjvR-|:ﵑcjce?nGŒEʟdz n-xr:OA^hDjkvin*tE5U]Ƞޗ#PaFz_0gq($4^|x@ ~i']OZP[M^`_Ψ&cb[@|dzR96kv Pќg而+ksy<@ϝh׌Xי){9dՠ,60E*4L ځ-=_5ђu%.jqGkn>r*6J\26߯_]pRa#TOkj 59e {/ ^U#C?K+U0GV[ 0y=SY7 mQЪHQ rKGiXB תD3 "'ܼzٽ}#(z8\.,`]ؾzc5>9o\_PS<&[P H.>UkeCP{Py@Tq)/bJIʤ"Ƴ* SN}v&f;*ی߂̠*?,8]?C1]K'voԦɰ~Ruޘ?<bx] |״%saa22~$E͎UxHMY >Z+4<0ԴKc7;YQ&*zYk]Q5iIi/as,F}btOa)ЏشOltkح@>lRKZeCL_Rw.Nhu\C̍su fATZ.zw2GFߏ`._fe`I_ly} _i$8?ahzAܖWlsс4x[;J=Ƀ3._ج7V3" 7Gn> e% jN>@!ztы,|Fz -rZq6UmD7Z@ 7]|= fԭZ̡a 7$gΩfi^6s9H7[Ěp.`f+38= .z .[.|*Wwh@𿴸S[0fnWb$P9AE;?Ab/0,ѹKd'Ѳ-=*1cuژR2%e!&G9BCwge 633+3RSi oiF{f\{1Æڝ0 =ayeSb&9Pќfdl"a~61?gq!Z?>!sUuoYjgOb$(,':M+0aCpwp+f4_Mُw@}bJqqJz~XO;F;tJOÁ:8Bxf[x)rwDuYF׫BȮn5>lKH7Nn2H1Z Bw[]NuI_/hr DNH%5WEd'y{ >AzCGɸI9J|>'F^ .x߷>[koUс#?> FXhqkAK3?lk ::dj6pᦝ~_:&vb,,F'4 ߎ@ҩӭ7oqR7 wҼ@-šBcdXߧޟHB :[zb@%_;lV:Wz<-rީ v/fCyo͡d3>+TSoGHl^dU"$=@~CziO~ .ҥ c$P9zvwN+:UDБ<RmU]tҰϿ FĒf.~^~Z4<6 vk?L؉ݜuGTB>*TOJle  Tʂ")x %;5gxبXr20(qz58ę92B0^Vk3Gp3JiYS{=[oC45KLKa)[|>90ϐZ@de"@luG3Ѥu~S^G wF"5ܚ;Xψ8ĔYAuu$~P71Ɨauԁa3VŒdˍ&Wj}ID.bG+K*\Ig0%9;WdůaeDrRޕح4N"lq씢Ydx+Sq4F1h<%b=/U9K0nvXWTe30\kG$HLқ )I Q, fg;9]hغRfޑQv'g͝|}t l<JHȌ4?dLs6Q~Mo2 㨇yuI4sq/.K*pxEgpSUzJڡZOW%r9f;*査2q9< !eir{k|X& ֗E^!*${{R$m; '&C#v 篴gG6?vPQ,WSba̵OK"}9(e MS(3 EERiT`S!H>7V*̣$ip > stream xڴuX>L7H72twwww7C0H4HwKwwIJwt ps`Xk9P PTRwv4sbceRZ;̬HTT I m*WW VV>$* zUZ̽J@ @kPuv3NֶN@W go w &ߑ~{3,=mfNyf%f@0ژ9X@]@F]EKU53_\$44dbʚR6#@FKCOM+kFwWJRbzRl,k< 7i+3jV gǿhm`~OOOfkw703Ț/~6nOg=tw'vm= Iok+_^{mwLn@1sWQUUhf:9Ynӿd@K  JVŝ_+3t3߉97]@7{3uK$,'-ɤxNLJίqb{OLR `.+k7퓴}Caedi.,ZN@9Ȭ`+ zYذN׾6`e~ y`;FHl<K[ 몿9Y92_K@Q{=NK3u%h9iKAHzfm?&:liAfuZڂ-lnr99Y;_Hrx`bZZ;_?_/EAOCUM_vRNΖNv.nd \\_Ŷz,f'g r!(7Eo`,RA<? "qX nS(T^hA?蕧L?5zzY8;NG?l,_+X@VP`O"l]lNxWѿw^ 핺쯶N(?W_h#e] [4t?w`}w@6N_737Jl?^cً~nΠ=Ǵ_zf U~u19z`=P(A^*۫߿W??ŝ|89XL|wků3/_ؿn[HK!vae 'a+qu`2&;%Ɂ"EEΊF>R8<%UM\YWzO&%6ͬPMNw([W9ٞ5C>}"ܰ}5ֳx鵈NE8 ~ǎ6[1-sڅ.E%E{ﺾuoօL AOI\n-I4DPK0PX 7)A cj򝞨JPJA=%zfuH@2 >3HA[&S6]Ӓ)Bd[̣f°,HR)_ T6nYэ1I+OBJY ps RkefTz@RM{xlrC9E#֝K$ v^JH#[sYm|QnTKVuFaðcl- B?.q9=[NL[i#7}]ӓ䚕ftQ%'4/;ѴҕVg%YzHkWmcSʐw nqsI Y/rxS?6[|ة_hº~jL5ɰ?k>!-!Nб{\$ b[G$9?5O@ϘvuԘv $FE͙e$g|uHU J8P}O65o_Lׇ+9SE.B\T`>N=3+LJ쾋D15hk,WôG_2XȦCΜy1 WzY s&y m];U HU]̅ mWkx6[buh֭3X29-xSW}$!&@g_ʓ[ju}Clg*gnUu /4 eF\ -Qv#@kh_5Nf%[u:-u卵Rs;8ygwns0-T(?lY'OP"` Xd `3L`t"@Dʾ[kUIv(䣶W&en+eSnE;(~>]ͨDuMy} bzzjzF?6gX4җ*ґ 6XQ$Vu44?VbJb( XtY΂A*lc~OmKRb$Gg#lC7k8˦pk"ƃWPQ6=<"js(gip+i\epIwL&ѱܮ [Tfs؅w'$#i> -1gu^U8~ qZYB7)+N 2sv>Bж?Y& ;-X*rQA͵X}]CrgL5yϾ|@sAy2+. +F)V5~V k{pg`gp[5ƕ9LگًlfCbVa7 ex;J7LCSz*7'@n*Ш|"A }"|&(;iNo5qv/Yf_`Ϫ4DL"d/ `6^oR$ݖsMw%7,:|u[n(NQKgE)l&>oɚO@$!&X*̮ŃA*]]e04a8 xk^nN\֞ŻU}{`i\-Adcx" H!E fB~X(-Y΢h)K?}tD}rW^ =ŝsch1@a;ĹƎcM\UL9"o[! 趤G㋲ԝ%}:)$GéЖBsi z}K/] !UK1 ]JRl3ɤ_$=tKA iiZϣ&7()׷$JE [bʅ-zY(ܵ;W$(P[\ƖbCPF H&еa5ܳsDl}'2IO!v@yqƗb7pN_ld 5u9LE1mŇhaӎx$P=K%icHVR%*& O:^~ $)Iu3s\ 1o2PۧsgNڡa5q6_pnVVxrd0c0[)5x s3輑{o4PYIؕ>_5YrK~Tեwb;qC.,3I^Ce%ҷ^V ˜ddo*C/0qvKd4> :q\Bl>hg' .0 Ξ&k "{Y ;gu&c)MI&fwIT95>l&/v*k*"q trܾ4ݍ匃ت@)27z P;:8b|6 u6 fV:KS5oM|Qޑ,%8aV@ bUX~E m_iu]YV4ڙ[[8۳ Ԛyz2Y=+va֮BG#eK(h;jx:`aΊMs8M!RG)99H3\$ɚHm [爯&:} 醀ۑ.s-yKԺHZF!JX RH\(~L͌~(6!MDnռgk<G YmI%bh}@R.d\5}mM(<8Lz C$LOw\&޻H5u\Y[7baik-ݯqٜ(̘|A["qϸFz(ٮ,RS>eVSSCM&7xoO%vHד=$+nU7H$lT*J5PQe u#wY_$[7D5*PRل1޽#Ui.R=7O ? ]Ͷcbfu,e>mM]{+0ri,M*~BDű`،U(7)VLjT)/y׽B1xz(1*MRKJ[61(,|4:,ʊzX#jO.SuaYq0t"/FcSHZ^O" ¶ikPq{|҇CZ_{#mcB DEtY]Eu*컑w\^BۡZ䏰vnOwgF^C7^V6.hPy9֏dz;=Nu׶dS_G8q_H[e:FMJ[28KPq &Ov _Hƭ}8('K LXzlzkۋwLkknIX]JU]N;S]ڢc/Jdƙ][V,/Xftr:Mgf4%A!"Y|;5M&T+[K,@i*}7פ󥏄_l]:S3 "pa*d⹟lyYkBE+#+ n : ˅#^緼ںi3?b#ٮ|0 DOCh>zlV:ylH-6?]г|Ba\v@u'vbIGΉL!*jㅅxڥͫfu)JE6˸+iHѼ7sTCw}CiexMԏğa-=]=GZוmU9js -]e!.P|ޖ筇y-bPM 3cYTNcM~9FRH[/T0=@F"o9{ߓ/T_#I64Y5L`& S)<9p([sqz䂘[GcL7jAtNvH S;hCz[=Lrw]7K[ 4F=8uKK@hQkh Js\6Hfb.8LO;r!O;Gg_\aE﨡1=8 GҶvDO21uxEfVk[f,uI|@wj%>TY'"qݑ[0#bMpᱜ_gs\]U#z,h*8I$'N n u%ϼ`:BV>[#u0szZgA:o" p7Dטk'T$J>D^Uƪ|z3=kegD$v8)uZjה*7Xp NEib:?~R&vʧ&o.Xņ!|e$|0"6^I!{bIoC̓(8ܞ?O];gTG5OUO NvTYa?=53QL xޠ|Lwn1XDf /l+jxgNkl0/l9VnD(9^YqqvbTşļ JUcT C$ӼhoO2hT?EZju{Hd6w/ᦈ_p/4Pn7 aPYj+,㎶ ̈́w"af x?-&U} >GtuMviuZb+&Yh/@kÍ+ۥXI`L+=T R =( =>&1fgK!)5L)fl"%)9-sOZ1D8ionDíVaQ9zBn̙ov_J5IginFkJrn=:e/dʚuu`<(Ɣ-LmT ֏jCgӘS_+lDNMP1QHgXaʬywit@H֬3ȷZR0v`Y躓cFL[$є{)woSEYc'O;`{1`WFG<"@(vu`+u X^)λTKrAO"9Ͻ \p~ ]DIQD_ηX64%j|:Pm} k}>-5CZ2 ]W6:3>}Ku0S+8Ctl&: #"vV$S<8½%p̧xkP) en% '8l"`XAvK\'vX4KO`y,[8P) ZA>I˵Bi[gf7%vd\d/?ǩYS]ir>BBċ%[8[ VG!KH&?m_D>f95@TDwT&vy:tO3pseEfΆN C {ۏE3+P3ݵ̿w"--ɤ'zg^7W&W7J0S4ArE3 H狐X4]8yxM;`Bn[)kM1*iHbs1_ q #px+VoYbf}GKYz jU1 X*?{jm!4ЊpyHVcFbǤ򡳸=m huLFܽ033 a%xXb)™ lD@(,llwy e3# J+N3q%A3KJޯ}^KlMyn5}\t03O6yS'=9OҤ`~xGb =LY$/qz7t)\a7)(Zvh#h檬0^ffPȶ7³XS!5ІٍwGii&5Wa{ձ?`1 uPBވv 6+A깉l^yZHPܨ:wUyW^C$,Tpv,J^3``ˣa I\昅 |F3K*t2c b`T< kf3culkF+N? V"f>&2=^j(cFf>e[0/-լ9pę+RـeTwdŸqTuO|X?F8iTZ>ƾ58G%r5?ΊTA;#%fXLj=B/Пb2W,΍b)`A _֌"|z"_p_ǯӴjV Ǥ{`Sǵt6 ~u 15t\γӨ,e]GP!: (I"CQ64"q{$nTFis*fW ^,3uጢ%5S@Z>-᧫PD/VhZ/ng?dΚS#E \ҿܜl!-Ƽa@0;( 9;O C0$j8R|JYh9/qisŕ2{Ò`7RI?8髾6՝4{eS!,m30SjoժV6MQs#7h?I2PDfN8:iY$zar~p[Kn4W\5t"?|]X Ž n ۰)+-y)`=WD8<tyluC `]ӰZbϊx%{^= BLɡ-Dd5bUidYufꡃW2c1}%մ1f9C2eX7gv;.'S4OL1}ԐWPMZ7,i\ZHaӻFlK%U@QǦ 0f{aw~#RQ MYRi{/*$j/R_:zY wsI9'2eG#1)(ڏ}$S6e4q˪7cCxʌgEqro Qzk0Gq1Q>pAAM(z*&\(ژ|Ob[:6mxjՆIB{OnhГZi `6(4 'R[Zܵ( }~G8hJvMea漏-uߗ"<[\#P 䰒cuC_jENVȢ5j֊ԡ+bC;@Whş<شT=x1I7 LP.!@ ?h.SHmE?Ey)[`۫n/$OhE.y@ORw&L,Ty*y%"haA'>xljMк1@ mdM+;c!4bq0PmUc٥g)=Rm_ [Mg(f5 azОOKp(,e";:P=X9"Jfτ` ]_E'S1.X}4:PB/l*An᧲P2…oi!^;>%:oA`ʵ{xv_찷&ְ\nOY :.utv;pۤ; дCw/|at7|y?ސx 36"N;N}NUˮuo{$!O'Ջвx7h靰m3X][fk,UHm&.OPjMS S=ZݧCZWH$_DR͋RwDT@<쾢'.-5̲{l}*w]'p}cqOkeھQ+'ni&VE;7GNigc播Oyk3Z؍Amᙋ1%-soa;^~]Z nEHiɓx~Y O\NX5,GHf$d1DJj!a=sGs0 =zRY2rkm yǂ~)3N~#,@8p"*ӅwQ4H2M[Hzn@"zCzcD߷]6Z#Raq(#=6s0'RA':\V[Pz0ޭ4dW5E8jN<* f Py {^ ZG?Mhzџc<Ҫ00/LQ^ Ю&,w4l(d$+&&Ʃ7YssMiVIҞmC>YҮ%a|RSU|tXd.sQ8ӆ9r'$Zf}4;#vMKTAU+\2%r7A'M5RzYr1`?~lAs31#Tr)a_[:x9!O#^tAH?%)OަywLb(qO)#4ϕm?/ p"x@rIvJ<XD*p(\*G|1;"OLMNZv4WGgcp3(tlv x;ǧC86˴oy8TV[EޯI(UfR֤<ԃ7 dR .|`c]%&I 3\ve4O"‹d/"]YHjdABgL (RnKl4Q1o=('wxF*Z@`Rl11rA7 ,R~?o>J=iWP0=AtF2 Xy|k`}놭:Ί5%qN`SDko4][]9l(]klE>g@U푙nI!s29a8.qvsBM̒;S'Q!U7 ߱AD+sv9}y(MCl b qE:7ezQ?̻.<%RÃ~Қ0"$W%_.MzX/̕8X>)*n=at}|U{&!//?^Y)is~'HϭeF8PP7G4bѤ#nVN:f?_[#xN.̝a~^\eb]]'`*)x&?^>0A/{̢rt9~)oW~#'̵)-!0iX0N$nO7Z7f]erUQB:~[&$e֒%qKlzm۶m۶m۶m۶m6v0Ȉ:d>O~_&|uW@=;Kr(=kQ_/=C.I#〶bj#ѯ4ƀ \9r$.fO̠4 #O LDr0]< )Sb_b U/3[[k@t?{?੉R޽ZZXY s_Bjk'L=6d-Fcw%lF: /IRD=)xƘPK2t];xBtD9)&Qp}Y*'';ެ5ۊ3(f\Ae%PCw<݇!N9F7*hfi0:ﶿ_N / ڼvm=η;-@Dnq `&46~_E`q u!!>bYBU& 9 1)ߺ[>yQ$;2Ӣ?NyĆxSaA-nBSkx +VIZ4#Qx7KmEt\t3de4RDi\:D Sl,A;IU$+H/'AȲ\PBTUBpGq 3/$Qs|$<.3j <-`k:JS%*3U8tw&0$(D(Eб^iRe"8i/8kw/ uU7CR弬!: Wr=%qb27jfo1Al9ûer >y/%>`epbkdR;a Wo 69 ?KlR/gb嵻P5cFPy|`I,n6NK@uW9yȡэnK{IJ(dgaWؒpR7gcz^>ܒsWbҙQɨMLGpp>t /Sڱ{ם>7Xlw^3/gh%(]L"Y;'d8)HPweEvMGiە'R@_SboW)vo @B2ho|{\--&~N-Ԅ6ARSIܬn8$f)!~(XʴVfnq!s}0{$&ȇG,tιI]r.A1tJ:n2]G^'L}²^l%XXp*ȜйZ3̣/WYrf;+;'"`̼@u&n Orh;m1M}eR͕ \߭1U#~}9BEͱS luFQcvU K{pm7D8$Ma6|:-Boyjj;PKK[|=~r VW_Nύ;!ЕKWTnñnGaTO>iSCiu5sTs-B3mt8醝r+ntV`iߨ zdXڬ漥p0!} [R`971psz|(1b+o`ڦ*7{ YSelP-kaiL3XR淄W0O=yڬC3>F%#-~?q%myLFW&n-|Ń"܃7xʂ-Y3$ɜEak_]ص5'L/Z'kyWC W;֠PmU:"'mKx~ a W{s?{ {4~=8Tq>$ն-OQ$ټR ewl+(Q KP99+ G%pP}TiH^AH),͚Z?-i(kh6zISqvoQ+"i5D?c^t^I 4m4CF/1t77>ɓN7M%aضmKzOyx m'pŽĴc= ۛg Ŕf d &Md o?Z#J4~"ޑUT;B+6p_ ad|x0x X-P$qw=8R18J88l `]dx:8QD NA.4DOU=2!';"* VקC cJW8--,Ƒ;2FS+q8$́P2%Q(QQzrt n}\Zl=+S0Z. nm0x7μ<+9[m5(&Ȋ ݵWRbt^DO[ctZ;ěV"ІHTymD6IL?BW~UWyx:ϝ>],r'Eܕ7y_3sjy}| mP19_@y57kfrv3Ŷ3jx!/GK8GaM#~ %aa_uZu}n@( 7#wJ9I˞U뢐x:F Q>12Z9nɛgp%s{[ZgS|eBtpK/zlWy!֗W/7oӓcR29 _L@(tcz襳i+$9|(^^8W,QԌ  ;ˆ?o8+c{'` [)6NPs84F ؈ބ4x!J=rfyw.pV:"z$- ڹǒT{·`ssHISNI5A#ɅHO8TJe U?^ٻ>y EЗ0Zi"/Z)܇HpۥsyWbtéSY&p-={*#uϣag;<_CRPbY"PNm?wB;Bqan'[B(V_]f[y>{mǸ/a2$Dˢ=W_> ExnMi^XwK43Mu~lWp0qHl+@f6HUV[eS3fhIgD(,$4Ŷg#$$|t_A"j`s2ſnvm>M- j5\j+cڛ.u7J]ʱza׬128A jlmV,&Y3p9 I_BY,`|b 4\屵94чЧ .arȓ^z[N IW3!< C;VmE誖Y96\n'Xc\ AԤ)gY4n.L⢱r%Ey!z pY%ch3H/;YDط=ɯts ryð4Jv"#yw|W%sE^JUm R+"hb?엚q D(z>r)[0T&$9Er+bmf` f<.+ /X&溶&(՗$2ڏ nA09[}V5$j hN<σ>KO&p+{O5GDy/ jID"p֣LŪK0ޣi%Z:>/bT Zձ; @$f4?hHyőrc F/hfvj(yjzP݂fXO\Kݔ6D׸\=PK @ EdJʹTHlK4W;$(GQJDCi%Ahި $X/c$7'XRDg~`Q|;4Z9Zx'h5>p== s .:l}HނG m=%ڿyx(J;z7u^:Ļt~K&uΉ,!X; ݇YbB>S}. c!{:C-`FmEe|,BnX#ju&& "7:#iyISGfшF:A^e| %?] -}Oa7AC&gdW?;aF֧v@ I>OFnq(GrV}^skBˬF)vD+[_U8z-l،C?$]{@d,0L("Nڑ*4|S]ubG'j$`l2YYa9;JL}E7=UIf.:O2‡Ȑ ؍YR9euB_c2SÐ%Em\}c3IXڝ`)uKs|2BC.Y8`%_JoҮ6&B>RS~C+==;;}}@]MGвoA}Ȓً ҵx|NZIEwqQ&!`M+5  HJXO,uj3L5?a$˽pAջYŝYQPSZҰw>193jAo0;S:E! Td7seQdrk+@`x}y֡SU [_gP Y;L[CN&kEȊjѣ Caze_[pVT{s!s5dgogO nCVS_E9 bx2b 0Vꔵ@eu(69[ܵ"np@f>xEJN}uxFU}}D}qpq0 0ƻ_W+T Oj^9Ga&\)RVUރ=rX,5,"5ki{L]/Bģz9DUo I%9,&@y rvV/ Xdn5Цo\LN~A;mf'-.$t̖IyóDLP5<+xiicM-B--MYR%30Vr &wRzz_Ė]SVb?"ziE<;늌rƤ{z?c1 f\bn:B!MP)ZQ݀6]I-uuDxY8SbaA|r)):mä6ha8w'Y}l8*4BB2®"gc0C4b#Lw2~t PV"<"*ͼ]L|'7%!}7WgY5Ydu¡yL\߷>G{5!s6qB$`['Kn:Jz 1L,J@ύt8c^{pn/*'6ӨSA>UV3ֈx2m f MM;l C?뢄V7r`i| %2EU{Pֽ \|6ϭ<9 Ӂz{fʍ d{Exl[4L 0O|Wn/(C RM%:3O0LctI;q0J4#MPJ&@&TGyv/D{S&%ʔԫb8M>31nhl+~C~s銚Ɖ|Ldm*V1|z"n"4]9%Q5-ft e9Vp6z|j3K.|P1O(#=L \!FgZ 0Wjyx` ƺ)V>aM E[*AoK;OdOP'JX/"y3 Dap0|iqͪM.y]7YwCzsʾ"śͷ:? 1?g!\?EdzEsn,<->D(@wԗ1618l$EKEޣJ=H ^g_6̃Vd@x*?GLi/dv=It4Oȭ,2L=> YtK-{pY43'20]{""+S;C -Zc ՚Ki?^B9-o|xlo=KtG5Ox|e5hTyb#|!f ڼfFg]> ePp>'qyBɾDf[SI $ kڵU.wScZ@gu ,6~x?b7-![4R5DNpF#yt55G$f_]fe3?4Yб?r*&FyaK.cH͡$d F(aH"d핸y6@G5錌ݑmT::TPMqpMP!Nt?t#6R $v*HVl|+֜Bέ( oO>>ʪ8Щc޽Ob1ITΦK2* x@^,#EwjB%"_9QC$nV7 ¨VJ cͮ>dO9WĒ ~a-{ k4dFQ֑ԓ`9"~[rj\Ўכ ~neځvvMLB.o\*FM0WJvUf ƧYBV.Fj)eA kU@s!ҧ'B^?sjՒXNb2/ 92I"ڧnw m ,S]]Y q~T  o ELtR3E gMBy YYjbQҺ)P7BުkjNuFH.q?r/mcynq_Be `7&E2QUGQbZdsbjVI{Z+ue!=ӛW$.#ͩYOOANߩ8΋䩹Xjǚsi#ta!z"nFlqmWK86*T~[h"caJȯ{˽kyD߼%tc>7J\Ry]kHFxWsJ&rΏ $|u~.r^`bOTZ_(uq*LG}9pJnTW,B{Jdj/p5JC<Ƅ۵ih֪0?cj]4_HBp" 2jgEasn}L$& Z+_ˋc*CLeVgzm;4x :^NKE؞o~ aC2%c-J drIE_q7}5ɍB7-%*~NA0p_Y^ u!s+m\wp3 엶k_))Mݝ(S<44 0$>!y_8>-d1-pC|eJN)YڛçW5Kt;D}4(Vݍ>L_czMaʑ2$v~ʥ7B:ך=>QSQR"=%r軕46X~ZsU9Q q@CgGĢGD&j3m?V8gW$KT[9=S7Mn*lW 3FNƆ}]~؊0&/ݓUch/Bjf *|ntx7QKձvHI?znmO1\Sd ̀a%zT/JD|YaMrG}ϞKNߥ+#g|)rlJfqa -YῠopWla_Fu? 7V=mNt?‚7d8@/~KuiЬ_M =4 /tiJɻBh[P=2z̴-':ilM/m9ع{Ex?V ^x]SA5 V{(.8u -y1}^z fy1'4 &LM! h4D2Wf13Xs8ۈ 7Az"}2D"bz-)Ó-#gW1VVx'&4{?\3mUu$aKNO\?m^B)Y"+ӓ]#99d"ѠU u&ACk*Dlf%gE$oG&BTa!y+(X-Eʊyں]p`OOQ6 Dו~>W^19ɲhSO(/S:Ojw*6>9rKEüG}"Gj!&nh;RM?cKb8ksrJ1uKKrLώIϒLnqwz)^2ujGr&$HgZLO!i8װ-)UC#b'&l5hKϰ4lr"duBѸHxhG U¬t~Q(seC3S7UP-B^`(=d~oO5)llM7ޘB(gݺ45Ṳ|e AˈõdZ0+hMuXHvЊf /r'@jvGT)lCBn $$+Lg"T|twB0)0jXH]w,zywJ!fa,E)ohHw0 5~|lL) GOSjR0+6c|UV3G0 zOh<Կewh4p% ˚ t( y\ $֚ύMl6%p!PԠ,?%.4 Qߎ {3f<5L2g[9OKiI~.: +ߕS BLus ĥW,\הU쫽wyx \{|fџjK߻C+p[eە]:|p?o_wB{"ݔ% ?O,vԭCP9LlI?0QՔ}8;!(盷f\)aZfъH27a9􄯎̨ OR.Wa=B׭N$=+cDn ϸKhQPߣj ߽p?ep 8 ۚn(QFǷOoKv2` Ӯ||KsO: `=91;oh}1*զqH3mߘCYSCFO,G“ȜD hL Qe5v ~2f uḽ{0( <lo -#UdB.x 9R&O?UW~~;sGu cYൽi_ԀCӧ63ˍ,MV`]+`el]|xK9d[as5̿;4p1F:σ&ȩh.EF?<BETW0I 02p)`R4(MQRqt  9nnAtDbE\=ms.^On)%dt0X* qw*{#GHR5XL ?ò[upԬzZ!,?g >ZEO< ӊ=8Ʉ 1:J_x}qb!$L]@!npJ 듯{e._~HOUNJ|k&,Sf<5 H=сL<0ٹ} ޤ8-*Aqݨ(=CD;C G̦ɳ{Fw׆YiވE:S2`ШD@ʜo<w<*.]h{Nc8#v鰬@aZps2JW?IPdH/yn!p%ck`JOq`%4}ZQ~qAN7ʔGɚ Clr vA21B/^qI>$L5|H-_fG[Cr/_,ߩ&U!g#Xz9yq2/K:⛐ڮw^H0J9{" P0yWGI1WA?ɷ 36g TMNtE`q:w:l1B[mV$:ZE g\0@LS_ߔ,c/~t)Y ,#@4`mS wڜ) nOS(e{60ڮ tx20ܨ9&_BJD>ɐ7-ClMKx`;K:'&dM@[!'$AH 3͞//c{#dNLe(ɏx{zS忈}ΫQ+O"'93ߧ B&6ẇ[s=Mg#j^ƽ\Lwf;nTmH9hyqKF6iZ42pO%3$[Ja8(P;ɳޫdiMU Jbrv|׮c/* XIZS"L [U0Pe18 Rh,OXƂYYs!k Ǔ.Ar T5ifKt/'&GQߥ'e~t[SɳN! &fS h! 3ld.e`Y Rjadm6מ(IUVjm{5lv~\m^qJO׈1yS2P R}7&!Яu Kd&3YF5䓶4gtp]Hg?K endstream endobj 60 0 obj << /Length1 1860 /Length2 20521 /Length3 0 /Length 21742 /Filter /FlateDecode >> stream xڴeT\5 N%C  %}7jTZ>ZDYA( WPu7q`aePZۙX((\&n֎&n@^@3Ӄ t|@m`ji:XZ;i>C]-`c`o(#@``eT`(:z~*ԎShIT4h?;9915u )zIPStoIPT7\AB]D]GY=X@We'2}Z8S@mhbd>u+kW-C'nV%{*yk3+o㿌T~}'ns 2V&++M܀&fn&nto9տb..k(7tQ;ӷ33qpw_6stpvusWF 3vG (#) x 80y7[s\.` U95wt->[?$Mhbom]E -ج]%nfV_z7q~?*#eٻ0pq-lvLO"'t߶O 0qq1cV/gcig`@L UHl&x>m�#s`a0[d09:3L.KL?"g17+9>y:OxYYL>.)]U]S_kYem\L\?{SoſE:z2d`&< w1QDVsoL?cڛb&h(\ s!l%0!X6JsDR\"`,zi$hvQB߼ ߹SS<2f+)b-payll랇E#w k Sd~ .s .8_ePWB[8aq\飣Bшp4 ~wFuJ#b*{έsCo3 [H+fw>%Ca]"{{caYnScrzpf"@<fUiL"GP F}RT>>KPijr%aF =co+tr.6Zn '%7 %U*'sW"t139qY<"̲dj^kּC[¾,e׍p j n,嬠/(/TK ;Y?S|8QMGϑ^ NMPv58-RK\y]& x EtP_s|B@z.hI/qR9kKrL|yj'WSɤp]|2a)4Nubbk4>8k qAnv1`xdRJHx,k QV*]ԏIgD#5ĸjkg褅A7 5ڌC/s?H*IVUx$eCˇ7iհؿ+[-m(ܡ NAFc/ٝ!*c/Od~n 9ɺv7 J Wպ4א96svC]W"b@95gv$ˢ2יd T|BsC[G7Sen019Ư`!V :X Ũ oI3`aLV6]P9R345YB3,9H$GGlh^#gqfD.i+fi~ENf 3ry_P *Eb*YZ0Ynb05y5٘ѡ*\< ay=(޷+AMm%d[1cz񈭼~~a9)?"dZ(2-8rl &K{TdpH7= 7AjҞ\l`):<ڎ|ZO'<%gN=1exP!dB¢(=U @MElw~0Qsֈ˅O>挽ż(t*; /};z p ~ӥj:mm읒\N5*:@׀lNӟ1>%4qi[6:(bpOL-*ө2|,*Xڗ:!{aJ:984ST1D ],X!xSy ى|(R3)O+ 6pu+B$`@mBAiUSDƚm6߱;ۻݲ#ɛ""&Wui,K} Nn{`x+U.eb['H5W(9Kx%)"qqZe m/ 1)@:_XO]5A6( ڢ_;8poɹ&U`!ql(Wu0p(e!ԇGyK!@Q$%lkdZBNd_@L:D|PHp1'`{9XnP0DwW pI?s'nAsjy'Ŗ&lI@RÚeJW;E^#s("QbM.OoGFxaHl@6`&Ft^uXkYSPT\iwU^#xFsb{l bA$K;Za`Gb7#aK@e@\GPMcEoɢ5MJ[ W4@j Nufsj6|tԤ {@w!epR(6}%kKG\2ꔏ4-'V }$l-lY -1+vF^eh$jM|KJ+ (|V֤o8L[^O3Q&,k.zQO^( xo\I۬+ ZNv/:`NU~d\Q@OE 2Ly4vPVEّ=cg{g o(ɧ?; Q͡4_GBY ,LU#wK@s^޶UC:LT2/[|<#cY#t$h]ӹ R\0De®la]޶IvֵkWF ,BúAVL`h뗏92(%*{6L칍'/7)Wf@4?>d(&ƍQ_$&%<4xۺĭ cL ;Jj ST؈JCU|P5iv@YP`8?6ٷSzh|D۵EM d`qRkc_565]lY"H]z1;.N APrsץL`RA]q\F2vl!eL?Q_!~-cҍgq m3l QƵɬ Lbՙi٪br M#3xZpUĶB+Q$R;/d6_HkG7]m"]3I|X68}soǓ_.YHա}ttyQ>pƈ6 /d&}$E' VfӴPέd+I'9dX;2EYC%̌Jby0/'\:bvH0i#R ҇O1Qzq|RBF5pO#s ~ i(|/\a ߴ#Fu(0){KgjURݝ'YPoinXY+ ws [Z8aPx kd߀s{#/MHݞXu?|o:VҶhkH"Q$ ޼*"pQiuE2fUozΙ+FQPU*V,:@LvtL_`Ώpń #`"/ĢPKF.On?z*fF6=hc}*QVNl5BuUV@4oD$B&Oi`ٖxɢf^̇gtiTgCTNԢpimӖr*ER9ZB`VqO[KQKbmE`^ƌu3`R`gY,j%v:HSiH:=O3#X>"âҺaAhٛg E'N+NW{#DaEK1^ S9ukW3tkHq|D !v:a.h81]ChzV}ڽ2XR@y“UhUqea'*Lōx]BU-{ѓ6N^O{g=>tճI-`,7x;٢ܟ'yO&\qsYҊ1,ߩ{<<^"ڵoY}mre>N5ꘆfKWVr+p&!FZKU+@`)Yvv͠Ih܊ *zI:gĄ| y([M*Iz6\/o +c{~qfT7NTer)Wmiú?6ֲhvY#x|fNTd O jaǻf)3b:] vaLpwrnnKXx62!*${ڡ(Zl{D?x$ҹGpkxck;Zp&f4ZS~QZo:Oʦms_An@\'6mkɊ%5>ŠynX"?y-Y†h$ws8}#FjXaULG v>Ұ%4$laTzHQO`o_{=4pF|GPw X >~X~㹘c2QC/KLD%mC"ѝIiB1*˾Mi7NP.KWL&xذ3&dRF+&bHx.̴M3D2y.R)I &V&eso^⦉o('Pä:48 2Ǫ\S7%1k#)_c|NVfT#ҁVh{K) G@'Cun$C^plq[v`xA]Վv<`STC!EdNFk ͂f9* JID($P~\xU1ۂIEIQ?^[B}3 j:m.TSz)z5FTOG:hZY;(Mq *o(nw!进lHVO#H+YLWTܯ[H;q!*v8[Ҕa@00](Nk7>ہtPi~5@mGSBZa[F9s]>eFFVÝL;̲eK&ˢg% PÇe=L1HĨ-|Dg}a s҇F; p{,vE. '*pI-hUʞ^wC]ÎѴ8J 0Z:la׌Aj 6UyF.WUl̮c91=9ԉW! Mmgq^.v3 OAήߖCȹ"]k *,otXs*,Qfj9q4qMCdQ~ 訾{>ABfRT㄄Eꥏ@SvT& D~$sv܂9&ፍWh9}r&PxciZߵ!byի=#R[zW8\KaK BcV~Si з CvŐhYujg". _/Jv5#$U:{ƟDͅuNNB掛#b}bϞdW={#I+o*~Kmq1/}f+W9O\!Լ"ܽkr iSnwSxe6A@;*AQgOTi /FESX)oRusd*s SFG5|QOFtįG>l'bGRY3vMÒ~H(i&'pƌ.ψtU&=(Io~hjxNMD-U58 *;ʀK66TP(/cП9'#^IQyZxq8~$ݹeI{Iݩ.cM\G|ov(NxcP/.0O :] 2\zdZN#x4;"ڰd;׸[P{y`K=;ZGL1ta)XO 0oβݗ"x=)іZ6t/2 i!U1ݬ)Ǝۅt~ca D5!:pTvR6T=ZUFkVOQv_U`-;|Dg7ޠe4ݹ)-2}Կ!|H*4U}攔WR fa*zP'I`]x\3<$q^QJ."uUہ0w E0P>d7K(jV^f'j0Z%c PobQ-Juyh6nҤ  K}O)TG< gRX+R=O#,bQax (;Micdd젅^:>;w#eb+$I'd{ٽdATWx[ī]秌*P `Gr_ +BIv h tnjWawg0T+O5dw%\| K[h2EyXl#e׈x:O\gi]wJ5Io/ё=ʌ, ~kQ~9q c}?jT-hө<,%Y2=Y}W>0owoS=BC^Nr!Nծ$$U8 QH-1Z}'5 a_\W$.xW9S= |Ou3ܷqg&œ롑@奓Xa{8 FT.M.Xar<㋼Jb_,h DC+Bx%ăx]Ce5.{([4XA<)1T=zRYMd~SמQaA.#q﮳P 5!87 e7 w^za qDx-iKnDMgTtiЖ!+ 4?|8ms1(cLᩝ@&Ĝt "相u ymA\~d GT*G:7_ ʎEQosT, 6t:-X@3}e!y6MbThH#/7C*-yz:>ྻ|R X9זZ7)Kχ/ZfB8~2+ĝ*̒Eۗ$1bxLWS㫙s:l:C ́%!;r?WELj8BCor,^7B+mJJ˷%~2ZtOmesl!fW Ͳ2=oj@}'wdDhb#("nQWq7Ύdc,J^IAX,8 ¯wP6<>NEGBE[|bSͺ]'IINB2T/Xz' ,*(5covx+IkM;YozKb}9gPlE6F<^Hn -`a W%irsܲW7o!́ dwCo!AoUyHX 9eCmeJ)J>,H0XNWbF)'E$ ʝ:Uw5!|ziϡ^o hUoO[}s)i{Qvٌwaz#q**WdŧhQMSg"w-ZΡ_B`Œi`,_ě{Pm@#fɖdΔ4VlBx_XAO^`5'VP~˃zBGme%WMCש՛m85ʈ?b "Qڌ 2 p[rCp1M+}#b!?h[t.A[M!H_H] Ԯ&^1yc[h B#ߛNn:l\H*FX^6F:by#a h QхASrP-<羸s30#$ӗ6e<+u;R.7zKFDTp|3+x.iSH%D pY+,ZLt$B^ppW{MF7X~oYvxO Ikӂpvk_sor)3{(&!k$f4~QG=GW8gdFɆ .('zɌ-=¹* 识0U>{]ނk 2˖z.4e<cYYp0 hA^Qw~|%8Vڍ~?XM&hR.w%Ki(IACJJл6zN".2rZnC g8=ivnۿ[^ԅQ h]O َش|B^.̭&Ce] G9 1xdΉ{^U\0~8N8TR5f )I*WNVh)/I,4iT%  e6te :J扤]4݌}1]Ù_DT}܄z(]ki1fhkE[v êM=wpQ__Ep^_оU} "i4а|S \&2#x9*gt%]2Z5r$K9%4͔=?ceO(yP׺Мс/X_e'o]ѦDw;{珍p*8D=Kx;YF)jR1bZ>K% oJ0XyNp!2FUr:;s.2g۠i)4sW(͛~|+(yƋ)[#/s3rXFLƾ3udL5lŝpy>{ 1r U"lvX\:~a wa8[9 /rӍ(Z0b͞/:AH%U\!'X-ݨs!"(P4L,qhk6";dV+?x@nw[a64jR$+/1b7Z[kòPb^K\++C.\z׵b <1ʲfkBg 쪶R["CG](,.`7g'~HQ,tXq.v2RJpsYp(YC܅p/-$f1аtz + 8T[Ɵ{x\bؼObn?|!_$񑂺z;ym Qv L^C}GUN_)?qΥ0eT3>sG}膡t%gTkԌiBZ 3GXTY5N.oզ=ԁ-!ՔtkgUB7'ӹuTIXduǦ)PEq}M|s#8(Křz{W ZBf҆vah>,3K u;jU|kS*_fK0edw nJCBy|z '5ۜNhH% (m&jz |oʾtX_]O!Iۘ"abt@toiҺplg*Q^wlo0(QRք

ra+0͈AgNjN$45 qٲ << 3H%vk 6cb:SBb Q¿(64ewxDxaD-_2v%y Ӥt4`#6uu.Yt/N4P*Zxp~1GIڪINB`ְ{FflTT;oPڡ asaSBM#|9 חJ6b!߈]D@\-NFd97{ZX.s\XYwϥ+"AvM_ ;s 9zDz41pнj!WU[M>$Yc=H^}3YI_ȚvT,-$4P-duAz)]|@TẇԷR#?oghZ"B<: 8ϘxƒEu-~H˗U&){u=Dku%j:V2=y'߭H4 nR/_*rp1 xV-\40UMBM0 O~\x>t\I9A OL uH[Lʂ]mxӝaOvaq?'R.-(i,+9nx2~iL⑍H 80c/ ]}ZLm8誯'" 0#oq3SK)7>trlȌ), c'H+QP16eSfYS .ƒW[fX?3WȐ?g t1&|Nǔ/@\lH j)*#[}4&_vế=;~SЛETJ=yaN^#dA$aWȕbχϟbB댓a~PU.|u f%$T5hC^ATP*y{Zl()X{GJkM :5 98qi- b';jP8N,V{pܾ/DŌ> BW%x:Uy"^@L m94 {ӳ]P<3VkLeT\\1 .jUPI%+5aMzi٣ih5iYa[?{3?wx2 oRptE?)+(6]Y~Zwi]=S}/He#q (CHtvo \ȉ--W4S c6aK ,(5%$<7E>!ʯ~0HcGrrWXZU QA> ?nFx!YUc֍cC 1Sf+S}%d?x$aP@+޳j4jP7,X!q!<=Ŀluֱ$;z~o$m "JpEd3J7 MA`p߹;a 0̡NE|0פ^ ZUJe҉rj"mtح]D)bprpW6žM>7N`-qEĬ@2Wev3#B G MO;Og7!TO[מR)$%S?&G2fFXA4 CC7 !!`v 3=,T咒u_*SyMd^oMDSA~,-pG 6mNKrm|)w)qtXο~;K>ooRl?$~mޕ  Iht{_8Av+9i3P0?=r,v#+qv߭Nqu85vOm+8<0Ư") Ks0Z:rm> stream xڴsX>mMneۘl5ieM5ٶm[<'mϾ~~Gk"'VT23:330dl m9镁f.ֆ&&68rrG3lP0v`b#HmJ@ladP휜 >@[3 [ "fH[ٹ9YY mM r y;`476ؙT51e 5G`{{;"&AWj*~m?U?|qSRRcfs3d'q`7WSG;̝y\jnps|< bkQNgst ka uq[iQ(Hcn,hkhkal0KPMqqtC_*M/v'ӵ1tں8y6ylc;[' 'g#?/*}Tǖ/?Dey\Lfnvǐٚ|vS>Q:99z0s(L-lMLŞQ(%?"̀&t76gy#f#(= ca xy9Ύ.@*1sL,?Fc].ekj[_VcOMl=&@S8Fy;珑g+ m,=L4R9ZIhhllwiK9~̿5-~?/= ;> QbQ?|2Br"wl535s  =>f1&@`kwq9i(;Q/qs ع>%afb0Yf-?b[~eo`G"Dvy94\ Y>"{=?_fVqvjX||hD]ck??z sgcb(.3++X};?tí3f\+V0SI_S:b%}[4w(P5NVG7߶X϶Ī%]C_9_<$1u $9Z%lsqΞ(wdy`qi(=uT)ϓ2&nL2f* H(䋒XY0;6gv&lHnĘtUHّJS3tLJ =X"#½+ޫWjVZ.Cbg)-K5Sq"&j.¥%2d :lJ+Uj7F"*oL.>y&t2j ;QP7w$P9ހxE)7P9 k#e Јu^bnKwoQ r,GWeُ_RG@  2S_'_fa[YV"g b5@k3#UgS i&zBon0f]dF1нD9Gqnm,$2n׆k|('sH)4Ľ1|噘qQrݦ/[nX1N _8~aGO +Ahc˝څm,!^AŀԐ(0€ba"$whG'C$wZ#ow |qkQ>4/l/A W =HyZKo*:z`[l͚ruIywwXZ7P9mu@XDQ4]dZA TlE%Y$3$+* e8m!U,x pAW:E8E&S,*x*Bbdx3(ynYԄ7$[Yijp\ vo7A $ЗݠMU6(ݯ e74BF HUs ;nюΌ0CUL\K4 >xvw0#U8Y'Kwk>r,Ͳ[UNe3Fy¿/lhEٲُţ<]hWU] r*]t/2I|QçرhF[ A?JW ~)`-(xޖ=L:w (ے[]0BwҰm#DSfa#_5n/si'ivޯVuۉHK/?ظxwjb#Ki P"UWXO~R\^YcpꍂӚ%^~M)گ+m)4u+  Eh-'XkY,Vi DbORv#E2ÚF 2YPM"n,N,] R{%^uU&*g3!Vt h,566Т=Ѣ:E+3L=TPkE܎WBkһ~f f[VKT{3K3-w/̮ MÑ脇4ؔ\w sƶ`;F1!Tq-V.6|Wcq$ѷV'3PPR{ڥxz'_IawQz)H\Dq̔/_58n=6&9v>!k}%zW,ȊlqB~I n3!BkhnaiCZV)ٗ$eK]<ޥz\GBMHSoWUau"6]1+<]/n|8;Q ~ֶ.rxw`s:6n92$: R >TzUUj0$ׯ]<Ɲ,ݕn`'h.W*:-^嗡&Ls>/w57Chdgj-}|4ԟ|P 1&a׭q&Tz/4^SkIp' wY7g|5_?puhM_\LSZ[v_Ly~<[j7:zh1@݀'Xx@b`YՆ9;iT I 3޾C!V쭒ZM{ CW 6kѽb D#xfH F^.aZD~Aš_srY Lffo#Fx3udьJH;7j^<-̄lqy\Q$r5bÖ1oʇZnr%30Vʼnh,gJe22*0Qݿb7HYVJOsҝS]7Ic"ee\d,oMAn0y_z,rem]uvMncֳ0nD6N/HƑHʿrY[FZB*STJ<kȜ 2FHF"KJFJOR4ҾEeřgh҉SMf +d2AM8XSS{? I9jaX'% :sb̓?ZuyK7͠XmYJs؅yh> }ƙ~_4H_.٠'SY63OX0ྏRo*g anl0U<U?HӅv_&-@M`ɀE/j:1cX[5m *[wnLoO4M;Ur5oCJf5r24%tҾ)^5bFt0; 4pNtgz}=n™(CүqP>^O/pdHʱL$U)mZu5Z<ϤT轼 M};6 dJ*n|y"?U^˟zAxz9mŕRÈ]1uGd|u~vc<]bȔb\5GsH`Ù'G;*lhTb5gTCT|l)tǼ}3I'C[W$`JR\gDThnE4 6\T=ɺʾSx?ϞέOe׎}u¹TcJ֗`"p8fG͎6s"Nyk=Cpt3 f|~ O Wxk>^40 vbo,Oɽ~R~DxVFp{*_N7c>dM ^2^zYTw.""X( G嗲+51] 3%8|Vuҽu ;lr,0hеpX,-)p,:68&]9m7 }pZy6{':R=o;ih "|aQ1Uh~dqS6]*#rO"gDe!y:vqJⰬ.eaGA޵?fVi2n=Z2bWEԶ-Jpޒy FgCԄ _;nXPؚ '"1a9,AEiMD)[YQJk[3#|% iڋ9L e#O曋 C9+d6Hр!mD!FiG]b_d&Rkh2ܤ&dԟ%\[9n Œ5.pײE1pt ۲yJsBREo0_Z(M`̔V7MY?<&%#c4b_`W 5A3VjJNR[S{A9GW !%]׵5^vBNA]%d-1H2iX165~(P]gΩ e5ҭbzԂDžA\/c$^V9w͊:*w5fR'IKB?ߥ&mK@ h$Ji*\Hgs(.#;Q富&>9ET7?gQkGzJ'eXpQIzs)P*SpsӂB,bЕZ*4F#Lj->ZWO{i{gƴBv;8Ysd8 ?˧ e&GF?u~ɊE"HAJIiB]KDUcSczca184y."i_ιHF6c.W3VhGbuOZ09_'+όrD_CLg)0ˇ$fQQjzCt"%~Lz^3L*^~eV(oJ/(kdzDޤk#'N^͋nL4F6د}A.`bhk԰{6* LsRx=]ۆ?KS/E$1]`k$UhWGG`VWw$@'Y{j!G~uxg*v݀Ke<răgI"B id"?pgَ:92_,;F:ԪdjjXdz^*+Ue=4;'EŬۢr'ΰA綷pmG\?).Ȁj$2q4a&Rwyotm?MfkH򊡗C }A J$IX3=~2`_A,tdG/(5>Z&]Z<$ك6h3<{RJȴ>}>wcnG:>g>hgR/`VQ`KS3$xI4ȂX ̱μy =Ml$[jJ0* MLH'j؉]Y畾pnW ^/c|ҀL؇ߵtCNqV.RZj-yT߽HA1CZ7M(-{Cŵr|0A@+ > !#>%,oDS$JDC A"~6  Bu2h76'x\Z#6Sj œ53Dx'cRW!J'4Su/"0ΞSC{*^/xh#.-y$߻bnRI| V t] \@hsZKұt˜A> E!G*/IF`?/OB5ʨԳe ^`Ze#lϠ+h+A=_'3Ҳsm\{,ԉ+S^"B0N(טBS›]/ZI ]s qo+٠ʆtWU'd\_ ,4mFoŠ̌ߟ\%0.H(928$hoJ'(?ix[=HZdkBOÅ QU5=l\pһSZFe- 4V X登M*/k6訧75l5>˳ %JMA \mYu5D5R~{+N|8.7~a)o0R4 $1VbTts.qX9k ,Z{Pp CRJpsY?=ZIeBZza`(!"Fk^]Yf.!>lƐ\ִ]s}(TCwvd딨Db\Tp#sʃ* \\dϻ9Rr~ٖiUձQ"9iFb]+Ntls+_j-09 ÿ Unx5K}Y,bÝ\]=bw}nvsc.Gi6po4}2/A$ߒ $OwܐLS?Bz̯pӗO }Ah!Rm N՜kes#R>sz˳j i> i }T~ү6&6BWGO/Qr~RY˘ 0-D>:I'" QzC #KTVd(<\LL@߈lH.^,RznHXz*hb%~㙚IZcnK\_&h#BP%_T=Vt,>eE(gfN[{;s' Pn,ew۷ZO$R}֋nkelY4-0 lun}"s63-(-% FLOmnk1cSX_I@A(#2,d3@}L(40\?-vvH_<3a9,| ɫ  HCYb _{6Zwo WbQԗ<[L*b [ N\*"OE_zR㛭-!E֪W1PzGDIw㤪y4;~Ea]L\$,wshHKpq$}N\{ֽ*+<㉫~^g`utSϣhio--7 ǙceU9$?rvTAiA]c8=hQ=[wReˑJ0E]Yv}I΃V* iO#U'H<&7Au'fnd|$ѩOc=a÷\骡1w':ם9Sgv'(w)K۪G?D`3^5k%8(WIW+[V47svd)ɮ0Cz]6tY$wXۘ~EG2޷:HDm 'OM>͋IVh v+qGU1X=>ᆤ&58Rq__*@adAғxQ{8ןqU]2*Pe4Q`K~ؒe?$~u8쎳?ca{""ursc@T`5lh7-daDA~-ųK> 3X)vf!|c&U@({uşyōe'2-VdlZYfkw(Y){%M4YdBotL ϩ״Fy[u[!zu|0EH5Ű'aM[kÝbY^S4u+gw]ç9r_5Z zi\qeVeYNا\ ) oʏn+7b( ЪM\-;͡]) I1Xz=WmM_9%^'5%)@y#57#eJ .?%ܑ9 sk9?#[;xiJ9^jKoC.x׬ᴊ}̃  &ilBS!mT׻ -on}ϐd%@+EKzb#+֖!3<1ȳ"C9|6MPGkX;qYՃ,nߠqk PO(8Zՙ&^(Pbw[Nt/W>9Z8meTP`Gp)*Oҽ01T2k>Sy'?e8ן7jdCZ*8ހbcZm^r?!I[sY;9]ٶbۃ.Fڌ1wl}c&hy3%7_XԭǻuE,߯ 63K!RQ}4~1ĭ᪻zf/)3Dž q>=ϭIS+3g_\t3hOU1Q-̵7øK4[R|I8U h6Pz4rzmnI;2ki7=Yo'.%wv_ڀT"HâasXM32^ChX^@q蝩 鎟2oL mE isڪ}&˲uNi&;i b ~\sܛ a!f0`T]&n%ND} NJ 5ZЧ_._F}ISQ9"Mjuy@z)pL)}]页sSg&r>,/+9Ї{-|v4h cId$m\897n$ L_SF%.̇ g(v*m'`,;WD&NB 6SGz,8,!Nޒ޹AG3dĝ16|m2<˵d_k/_,x{`4z@TltlΈ5[ !"pc5p)`IMNx%t5j`c`5ef߂u27T.6_0ʲLX˴p)l̗RmFl tSbx|V{MRT$U:tU3P dwbi /}/2T ~3)r43#/h*@ 3 m*U)5eP"Jzr*-0aНzѧX(2l-D5ٟ뻿7sr:vhzo muu[cflgM~ F,IG6͋@tkL)%k/UTEF])+Y'U1,ǵǗ| b(;ߚ5fK,|+fcbD ,NnnE({b*dJf}ՆUt 'dhKyY2sZ%Vֶw fj7$Jb+aȒWsDH2s !(uV݆1g^Ǖ#wn3`s(UICeK֝3]?8n(q[GV6e!dH$CwaK oFjː~)TF7 y"BǁWkq@W3XR ^Y Nq6m_ic Uffˡ}`t-q$d8 8,* f[f}!hZ9*,ҔJg͇xG}MF>d+ )A]0TiV6OM^03՗. TˋeT)0ɋJY^_ Sou{va89l'BtxƥFL$)KqϘ"Fph_Pk#y17۟Wx!mSWYq=%y E1A_bE~~7X?椆 DvE0 (MKE?3qb wbei=w.'xŕ$ŝ|m:W&Х;;Uyíjr|NbTPJI++STiM\1;0?u&,-sӿM-*r\{"G 8@e.(GfIxOKv<-ݵ-K=)!3!7lUF$Pp=]ml7pS2v޼GIHéOSc=_5T2\J;d'E ^Y /p E6qFq "a ,WbhTr~|צNm G9 jdsp{1  N a gǪԺ?Լ%E+'xSjp:V>b'BEL<^MJ(L&BTBe;| > *_ڟq~ n1_LPPa61bԊySZσ%}e(6;~il"iR{La-ls! bw6j!w~7{IRNThmx#:!aOt`Bh]jYv(yGZW79m)-2Vb4tJ7ſ;qVC1Q:]׸d:[\2CH/방Xe$T_A*b |[Y}(\apqN\3|SH c#w.\Q~p .P[|ԱXR/iGPVTgFEo,(tcN7\ ҚOE+tMLL\ݝUw`qC*ɒM$M8[%pNjM{2`!{ x`~8Umܪ؟!ZlYW6 3&l59?^*1"Lox} 6v3b}OKr= L`jGYm8̺4Cj5q%> ,W,>tw5惫-MrsF!UV58d=4q]$4\bX/c^xmŲo 0 XwkC\2:$;$ IIXID'9A2>  #|!$kqV1ZB%d/sϏi(jp`^߳K tX|x𗩬hIg]ǵȻtք,5hXYLc,sAlsRgh8vF:[8hdA"`Nɰj.?N zesf^rsB/I<?GzvKgb$$Wh7$ VffY<8G#m_j˜d\[OlfG\s^$a ʗb ~`T|qټ~+z1z/&$w4F`D?Cؼ.}R?p1(bkO<թp;t_4qp*qC"wb#] BjqQ*yvwp_{͐O^:0.tOc>; lb\*h dS'n tϦ2qNe j4?S0-'zm =O `7< P= &?pNxW0_v%)G ᢚҨs+åʪfR֣8FG#GK衖|}eT`/(0{ɠQ,UjXć旬k1h£`Bͺ8eU"p 2v+AW.αoUA-Oxd-7^vVUP+-Sq2ɚ̰>P j?S2Xhғ=_ E_vGЭu4[!;=|AVKY$bFHo]$! ncE <$ȋq#[~Ƞ?thmbj&7՟401rĭ%djRb ):Re0:#a GH}fG'Xsjar^]>o]q^r8#=1mΓLF>ψα_iqݏ$ х؍ >>lKƮ) CC :u4f1:tHa5#Qjb dțIDƞP7mg!2ʙݔvM7(nSȯ5,Frq~ 4[Kcm>Lɐ͉&SY,47Z!d4llL䵟FRRhsH i bN 4dckXo{T5Z~D2NvrL,p7}ioIy> JHA7faN " (JMCZq|ko@ǐ3w:jfVHK3Q3.>䓤vQ$v2RJpsYp(i'~ %: fB bhBx U#г !Şli{ݚ@S:(kɰ&@HwFyZo.phVM_C0pRo )onYj[9d:Hu@H9tt  4Bs Y.Pȋ$N#>w,P!MoR&pGfJڻ+mM@E#:_ndYe_#[V3竹Cx7$} r'-%V<$xq*e]RǓ(d$txLzC,$[VFjŎlJrsӄ_onfCC3_򥊩9EP-#%fŽ?ndV^ fj>S&+U?箣SA^mT;}{C)G8Lqmϗ֩k(CF u ^1G2$7=P>\4Mr+`{)_$NbC!_8~L -P><Sí/mB,#j|]i7@5ve<-z>'qܟn.H51ߝ{:~T VvOJeo^`yujT'O: _s :-+ Ν0=^ s)Rch1$*PoAaK`SmE}~:qHc}2"oUUp[Ee͜Gb1͔LY),nRoYPL|l)#;"yP"oN%uO7պo6E jc x0/;Aw]Q{ǪfZS, [!& Cw24D# S2?V>oըmkn^K+S*Kbu3h`|nIYN7v4 2wPFa/``34X"~g7Wnǃof ȕ;LzB)m=eS01B j*@¸I#t8A0Kc_v1MF|C˘ym8$[GeȿSRf6\B(@GV ,`1 tDzHma\*A,̨_9kb'Oq21Rmx}RSIe+`E` nױ)Lq.nkٓfîS6_#xS[<^Z2,wxzpdl'@.CzNB~6t.GهB8E@ay\m&)<)a2`- S`9Eq9,6zZE{ZGkOJi͠㎙;HDP"D'X`OGqyʩ^dțAԻ؅kh1^k X>1/S u!Sa4 qҠvݭ7QsVlFK.$ƪ~fhȻss;E1Od aR8JPKk&teu;I5$XibuZOP:/sW 5w;S UKٽq Miإef>Xɨ|(Hᾄ3e!x^e17Q!e0.6y{sjQB}JYv}>805L=ȝx_ ŀxA]aq%~"/D:,<2} *` iFiV#HP K-vīhG4gιgs]xSx4(oU\Ɨ;=cݲG >^Aի`c[kKaE%-ؑ`%2ǎ`\5 o%qKa!MswxyŅhZgP$drH&V-,0@S DhkPFעdEm(ss$?LEkWϦg^}s})-ɀ=נ݈9]0Ɨq71!jRkziqO^/p}8BOK Ǥ<2Af iz-5Cm~;+E~b_&!aQ"&zU6kŋ ^>T :4<¼v 6v4O&U4> 4fV>Bŷ[a1kC/Vc?,v3[ {w/L[/"@bhƦsɺM:q'&h~R`~rL䟟n8*hΆZXTvÞmEmg#kːp)1zR| ϞzN(·AVzܠ5Sc,m N'|k 3V{4Y {ZgGC'XLk]c ZϣSluJaŐ[]r:A1~/tl۴ywMP'ƴ[R06Wh2$z lB`h扲^8?NXZ]cRO)GT1FŜ84M1+W=5.EgY %Ht~&c/]8fx#z1Jc1#Cɱ#-h/'y7&jL `Ed9_8D0T5l)֧DRx$M{{DogpjQBfҾ1(c`9`[)B*2@FlSLq{!#eT&h^)8)XѠCPIE#s.}b BJ]i'F['"pMVX.MK6j^a+ ,1٠Vzן\J{dMI Q _+ꏴG/I O9W8B|-Z0EX;i%B-(\&/v>.yjOm lrNcF72g")gۑdeO_!K%^x:m2.`u,2fo wU@iͪyqF}CRyb1u<.ݨ(b%QTњ+u6^Մ2̯X<_<@_jK6_̚wn*$=:E@>^/uvdP_.> stream xڴuXݺ=Lt7nX4,AF[AS:>gwqb9|Lb s4ɝr2=\̬H@3w[;nPp#XY2@'+i 0(4}l:*͝ :Y:) gW[k58~W- 7y̜,Jeh 9́6fV@ ҐRȨhj3 kx8;\ #@RLYS fhih tf(k+IiiJ^ tuрPZiqwwgabpsgZ3;;O r?]pnWߛP:'ItK NM , \EUUE;n0Z  \+3t 03spK\_+[on&"x𜘔@`uݽ]OLR<<vvv+xH,%@`nH哴ra?smrv+['K[z8h9ٺx$'lBcX@†w巙,C3`e ?<wW`ߎDHl<K[ w ?圬@L?#@ARKhĢ r?zI{88(9[3suJ ru4s/7Res7'~&؂=\&6n' _|f `RxF0)' 5`j v..x- N8{@H7 "/ `x,/E7aHAl?"k*AF*`Q55 N^}fFlśY؂7' cWi'_V{9mAſ<+kmqt+XC0[K9f8oaWXE?]l=dpv<S}3 //^E:>`@6p\ZNGp/'G'8a + 2?npg3%{?I0g?Cق'XIg)06/S7z%580?+pq{Jϔ;vfr[.yrzuDEKGp%_P?/F` wW=PRWy%6G?W_ o?&NTL`x8~+H+?W"Z -/,Қ# g*`Opua3g:%v("E!h@F)!N%8/mӷjfJDRbZW|?-+ԞN ?~x>qJaXѾUւ LvBY2üiA$D[8)RM ^8䭯Z2'(z8ZBb]u#2.i>o[MT'2.N*vPM]1O&q D[+ٕ[ F4RًFCb٠ ̵ Xh^X.SnR޽"u#(~W=cV"^iatG ky}a,K9?20z@]|@@OoRGl9T&4bφ>9QM'qnQG2 @C1is;aB A)偾D-3cΦ ČW2l_ 96]&QxI`Ń$H(RQZߥgΆxKp+,+JMz Hres7-󃣺@;OCJԙ2]MgO8[¬Ⓢm$tzVښ s^ֶv.{K?>[S5ScQv^Luv V~ǯg36IA3Q n7J'FcbB~Tج.˺=~@FbPq}G&znHDVu F)[dQ)5]I#1n ٴP#8C0,GyՊPL#̈́M$>q |)BSgÃ0)䷩Lݣv-a>laTtE|9H-I!3u[2Z9*5dz C~tN\ eKD|k; 1r^ AL%nMF3կ9Zte$UQ4'LwyLWSl})1c=Ơׇ+xAQqқɄsdwN!LcN%R]YvK"u#eΔ19P  3m,)~ :7?NvH"s:C4Jg]㷷4{ފ#ݬ%&lEH4;+p 狡ny;l!_o'jmVpk;/g<fOKݫkL>3^⬂h^$paO\'NJl_?o2x~ʚ:kOFGzg;e' Gqb;(ʹfNx ʔH}!bnMg&c"$װ-B?]HЁOFXe8mGªԆqSpیpϯ/@Y1DJX(^#r4y~|wfFIq1k|BJ,E E;}[)D@{WʖBQ}}LBYx-J-Swi-Nz^I,qdU?i>A?97 ܜCwonջLgNlļjBGs֖G]&z|wO^$$&(ofaѡhnՀCLn& =pV7|E(A3$?aqmZݦ/\)?ȏw/fHgT7vDpf ?w֘bh{q})8>":3˙f-ήrtN9SgJNyAE14k JRHhi7,NJ[?$ 히glzO Mc/0[^F(;{gNR)Y5KGߨ_m#s0AC*z\q Hc^2;G} pfA0MI)?w$[,(?mgAG?##eCr>)jURUQ'ǯ"ڹ" 7!߀ ;,.o"ĪꘉylmHu: oG/Ci:^{2~9CxEhe%Aj,Z8IDž4|^!)\w[?`Nm%T!*5Ϻş#+#3ΐ>kx.p!,]_~l&1QH S|b}N)&O"Q+EU憣=|cTֆr=ъ GW܈'iګ3Оi^42kdžv*x}UgM!՛~c3x}UtR.,pJ3V;$4kXDa-yHv:+50]e>n 42QK׎?@p%(̈.j7!,JkŽpUT>|wԑ$XvęHy&+t!&ArZ?e\KiXnW\WӣXǗǔH'`C5 Ǻo4 9Sg+W9OбBLŬV7DRԜ;6B;xR&D:Lf+#~\c2hXG38y-&Rff[a1KcaPTAkn!Ǽs@M;}KJDc3"N곁z9[7wfn4XY5aH/Ê3L=8_;KBn~&U :!Pr-fgcqI$KOZG1>s(aݚQh0G }Z-,213Gڮ~T(]Hִi?īa4_v;fO\Y%r]t!]$чAk:mLcG!aE2+ Țqg+o0vrcلHM!|J 5Mae[H3%/9$&uR\VE3+v%"]yEוM#f#oop̥ =Bğ9&}pFZ~+JCMg}"܁NFY?B뭌$hEJ2H-.y>`T.Xܓ?ފ *uq9][H[joݮG>L>('L!..P%!]a㠞r0bzg@^VajU?f2~ؕn7tu$ƫ43~^< ="K6)( TiAmSdDPb'K[B-U)~i׶ s-Z#n]'~DE] Xk)uuŇp1$ BL@agй'M,Fs'A~E3cY^ ?UB帷#IAC5lm0fqw;ψ4Z< 'Ά+h D6qs{#Wܵ**_1JʲNlA"E2D~֐,d {K#ne䷾av!h#|bG^F/8^Z4+"5c,S-*:W-O"o\[mϻ=e3Ѧ˜ abϺ}Oj B数Y. Wλ4h6z^Ao/4k~ Q3D1jfjB320@M8CdKSTw;[޼Hش>2 !&#up4za37$=iȂ{[Fd#Wssl JV`EON~&ɘX6[4IL[L=-uc6uJl9pUAO}ɛo-~xYd1jnQ9n;wApQR\dJOiFhzd_p0ɫt p'Se0P܎t+Lh%m4H꬝?N-@aw7ֺ;am:'L3_=_]Q^ּO2l$axc~q0KJBsڭLه&%%.>rޮܶu$$oJP})̃Q+?}Fz(aC;nKP!y7ln+ģ%揥WYjdta,Uj\)E,vf)J|{Gm۝>caW,@}vxmqqBmt!i`BrzW/dP|xAF.~Fd}TW/˱ٌz"#'ϤƲgZ1."j^r[$oq4Uld]6.7%1d~ʔż]DiDn`]R@1t8f޼ONo2Z1u+,$SDM7`IݚLQQʬF"O^qޖJS/tEbyŐAcMŘԶ7e7r~OI猜wm|9[i'V%i| o*vkJHoJM|H8&>&0EW5p!9J}`eiKĿN:Ff_\-ٱL.pTC理TkCkTze&wW)K5oݾX_ xdG0$(C`E%pu;Z,?z2|X/\Jc9R=qp- HdN{YJ6m*Dbߍ5G#'泂kקA_lݨQD[lc4:[ص9M+ohVr~8Qo!?OPoeX(?.&GkY~l`/$&yݎ+dB(N !㜬 J}%sOÅFKȸGo?\x]̗ͱoMmFx㔛?0RF$TڌzpSJ|?S%Cۦ6c[2P},fӧ2%Mڄ jwCWe ?ĭv>hx\ԏI92M"D1ΑERjj.D"OErzr.Vg/3!*ea$;ӭ 9Er5wN0L`윓6Di~@u[bێC^h_h=gƹbVL u^*R@1Ѥw+1j=trUտ4CQ{h)U?"8Cw̏ùLъgEnp,ٖ ů7GQ-0gWr0KGd$!VKdHo A܅ JO&C3_T F;CHbҦXlFTy&;3%X6TC"Ӭ7pm)S>tQ:' | 辫) IcŔcC̈x~1n3RNxLm+|lV1l>2_3^a%^JEviBSdf2/q0tBG_Tqaa[NF i )]=یpG**5Cb<@}ٷ{+D,#0 ix(I)vϬ9"j݃<‰_J A[vZҵ ĔZ0]I#'elKi l$\HVnԺy5F z)J K#5C\,xF?9.DJ'\- )t͘RB,]}fsv[ Ug*)ݤFE©oV 5f7?e*N$f:6yD M p&Ği)%Bu-|TP{fJR>eU.8ꈎYlw7pK'|*dT5"R:ݢ!tf8rkA)Zݒ}hvOJqt GhVE诔Ѭa.o54* I7\ U#%>y fh⼩1ȡsC>=5>w잹fJʽrf!>j&=- @c8J}Pd͓N3;5k烧ԲzKHC0z=j~U!%1`i. |!1ࠕkox,KJi𡆿H<-Ru6G Xk-9h ih: ڞLhm齵K eY7gozuGLfKnY!lޥ(%NxA=&i=MjՆa?nHhc!<۲2l픷ҼkϜ8U6f1qa`;grH/;B-Iʂ"wߺؓ䌍U\":f)6LS"QI)Tk]Ė ߬mOYNBG|aevlB2&#g b@AdMEEK/q#!ahO [{Д6\gC.!CAg_;n~bt?G }D-@]{?է1 H=6g|DR.ѥz8 3DҷT V^רe?H5HijΛel!ۋ㎷{f?g/+k n^C'Q 4Y\`"U-XAVߍC0`=*'&Y>=l$PXvJϝMi27 Ƹ$\t9v$/5"!g^AK*S._9eyI' x˦ *. 򲩗F+^*"p\_m9ҤJ_{ta% &#m>ڽBA̙@'_(d2P䭾%S)j 5g`H?8Sy)4XkIsR&\_=ofB>|NTH\PSrJ<"@4He^IJm/mJ,"<Xkb$_a)Pf71 ֳ>FiUeŠ^t5J)T7gzm4=HxCc>HksSÛ_ Q:M<Z̮r)×} їЖZB|V^JD4'ҾLzx5G|yD. &f3KeM"'}1ZFB%Y9A0s zP0myQ]#PFx2suPQbJEtWƔ)эgTf(һݦvfW)AhF 2 VIr/w;d30~ԖG>UAT(fso==`þj sYYNN/ /FK2>fN?.]xpNnc=&pkL<`PxQ/%>F'mI*h`]˃-PufZ{61q3c ;+`YN4P7_ĨdYČ!xfwo`ϻb nhz zl}7ilk~{lW66 h);u,{L#p󥘋3[?` *Ƹ[v(ܖ#z= 7?ٱ\ݸhʁ \d>+Z=~/6˖AǥvriEVaοU5 UAOqdI;55G`39ǷވVVaBYujN~=1e7LG ^;km|i/ހ.07RR3KCa+D̺:In盻<)$ꋣj -͵4 -_͡Viv1:|gʗڍ#lySsB;YtN!uzV ̳ZEz KIN0/ڛk h7_(}2@y Gs7`CM[e9#jc[m^ :޷vXȉX)=-0=c|!c BCRU1 @hG1 /U(=B=X!*GEE;9ˢǕ$%w*ݰ{z}I4˪j>0_Ctb;aqnZ2< jͰApVإ짏+,E{"܃^8Tx>uc0޿O5gؖuƥl*;*& [ҺZ5l;BjdgIbsMܦa:OF9?1n L;!Y(>:8nTJ)7yoўU"VIOt4#xװDc]v>R{$='{NO Œ_JH kL2H"΁_ q|~üO@}"~ñA7캹ƒ;~M޴r3%|#VZ"7z%q}TF+-щj\_LrHUɅUM_m?%϶_r83V+[ _sʾ(9Ϣ7Jo"VFT&9w|qCݽsէ,pV7SBZl`L2偊ICi|:xm{&:ͫIVbC?=LU\*L!⼅̒muYHz|^2 _=4.BJrQ\WQ|;a(_~w𞟹'B^eIW~bmvz6k! '7ꅓ=Q2(8Ė;~m f% +sBDDY{Z r5rD<;ڱ~)m.:#*Q$CY0ujX ƿ # P9B/LZG)]\ dgަoX-ꘝNїCW|hFZ&fpT@v2Jd ~ -+,*ҟ4J|Xw#K GdZu:Yr@&f Wq!~"#m!tD;[WJߡ;*nqC;7V<Cw}jy 7|"}D+hfQ2)UW,4v5UA1F K#AUZPJУa:7.>ichNxnO&C\n:%O]kB5._v?](B5n7+vܩz ?=&1CfxZ(0|ރnp"+Kq\(EM]GPz~ݜ-2z[+94)µ 'LHqDW쌟]WVsA5λd%cg=-[uE*w+y_aRSt3*އHl&<+_7F3.0׉ڋ\?['OƮO` Gl]2tXV ڰЌj7\jIɫȦW6g8A.5r!$|JtJӃzȞKX|XU=TKxRdaSOc鰦UܶQjLڒ$,dLԳZHL-|H5odtluftpˤ pڗ-`R5|U-&glm +h4zZ |0kd)O 4bUҶmC Sf*1Z7ѼѐXo%lɺ[{Pe[W Q?0ȓ`륞DU)4.CA>3|u]Íi"TM\]lKh(ǷV2tې^hH 6p)+C-_xL{;vviF&(܍wc 7Pᜃ;uX/3 ۞RRueuh~,'UGi 1(' CW>݂6i cQ5w;S UKBv+a8h̦kJGFn ٖnŠEXRF`&Z$_-."qGuץC Xui;>[߇Vj;rNUD.38= RfVkŻ>}5T:$yX ,a| sY ᓂ̐%of@ QdQ>/9ޚ(z ı[נnmv>9/!M!e'CitҗXa{֑Xns).!@QdzL"&161\d/#Q5wO>֙02Lէͷ>( ^ěM[VÑw K]ʷDsI3S4Ue)ΫZq'#O KjOrEutMr x(0Qĝ b*\GpspP,i[wV5Y4{_6' Mf0Tİm|(Nܮ`"Kh:xr1>a#y[!UԼ;8|8NXX?%Dx45J}Pe~`9Zu -O?2ۙznt}K)|@;^'@i ]9T`D n5L'}.FvVt-rRyF"/0G>38%@7+A l ފk5tf6Hn i5qb b=6{okrygn"&Cx5KJ#x30;"0HزUqĪl;P&sB=z!rr(;*LNPˮe>);{ EV<kp#E'4R+ZI m8"|?[EX^X lD^Zy˲;Vfl}_^`1`v" kN@5'^7TH1 4;s.>;3h EW%䋤Vbܾձ|DuqL6sjyXhg6a PzDyL>JJ웺t K|&#EQxa FYp[ 0Xc۴|xy^7+dž-| hG7 [NtY]ڊރ2KѦ`7BY#5D3S2]|%yu&2U[,*9p 0XiX \?rGh3R$ir~qؾ+BߗlA7Z/51 }'4?TJcjM/}c"Ե{QE4 oSJgzqw{]% *9 pi~y_19u AmqR؂{R-SБDuYwxgn)c|Ŏ]F6WHa?rIN&ZAyGy9ƸA9>O*ј9j0:ԾmH˧4$֨/)6}W$'HwУXzt@Zj[uv w\G,VirހU v2H+Ȝɝ=hdx: R߾V2bMMaAŀyWכPof?ֶL8GdP 22%LZqQ3vGT؁Ga/tvV3\F<,1p"k/}M달4"հUPĵA ifݖڪ"kqzL+0 YQ] ݤ2;FϘiZ[?-ٳ([Ge׾iBE'O}#f'a9kg!uЂ.z nɻHdj.$Mc.7,"G`P0 ;} p >3z(d-z峑(V*$v$V dJnB%=V!Y^yaP9LHNS r݂OoL[VW,]oT9Nc96Us"Ф/бXߚ#vp]S@{$m&PZR زLIM 5a{v"!n$V68X' /଱Hun<;zfb %,ZfUm'ˬC2ˍ CgO!{+v:JylKw-:zn/чAjGPIGWgo$CE3Rū>?MM\CI5,?zey] cjl.jꧻoĸ D_ӿt:js," N[DKYIԂ|lP n40Ôi-EEp>F4g2ŅeI.𗣽GZqۺ4u3mK1h!8 Mլtˠǔ)=7XW®XQlze F .je[6ɘg$`ӰZL~cм,ېÌ ZO/mЏHGh_,d[t)& h ; m$ԍ4UD[yީO3/S-emJn*QJaQh1Vk(S1,N'dW|$PԦIۃHͣ"h^iRH,Y*砅'OYIcṲU] RI=0P;w cnV̰vYD5K|[}Q@}&/ K%?zZ_e  f ` __v;/h\Ӟ5st(}v/ Gh+)P@+kW:%-ڈRi0wK.NoY_;9V/l_ڍ֬&U褄ֈh>ҸxPJD``YTc.pɟ;2 ?ݷ #usɬD7V??eVM/n8F@D+ޡx1E%DS q;+Rh@4%HfpV+r̕ &_k+ГvO#!QC6w@ind B6ڲ8F<_v$( /jRdHW2Q(όEM0zo0c` 7v"\2܄S.S/,W^PjjՂY7-[1╉[i'/"0|6 rqwMϻ )&}QiQ+pCEUl@$nq2ࠞ F'Q zY.c-x^J! D,?HX*IL`NMPmQx*l;4~ݴ_9ڟ|5,.Ҍx+yӂ,oEɢԮ&8Zl*Wp54?,M0'_ߐKj2ctUZD)SךqqpW@ƫ vtPdDͷԹ}s0Kfƺ^FY'\zT*%Ls*k,oWy B6פX3|J R $$JLjKm(r3ަӤm`^B;BnjЭ*hnU؎G%|ፕ9 ZR~UEF&Ұ`cɏP->{6l.:Ⱦ#0"S!31o:P2;! Dw%HM89'^ШƏk='7vPh9LhFUz)r}=?C_$WRVNĭ]R+_ꂝ]z’Hnnkl\W @ГD :[*}xG80R|nc-ϗ#T6;J# T12>oxmɣ̘g{~;X s5vڛ)e\Šw\᠀\)y ֋2DhzܿMor#VYUj/[BB25~#fYX&fZоh%AZEoT-ƺs6`~ŎV4$x?6~+!{$8,͆Ҫ^uks9Ofx3a-\s%JE05GPb$=h)fal fUcdKfg?0kskmM\ړtt֫ ~.I^[^Ǻ]b,zC{_~~Ӭ)UhI$޹:ѮQL} dlv3=>y9T%^۾+"ގ'lT\"("u>Վ4NA/4Ձ;@el3O`W HZ})! ܲzmE4fL*tU`Fg>{.9xY{'ѹM0s^bݬ pd Y9qG2PЪCޫ`%5nov]Z@˦eO L>;w:_+ʰ9gEY[+Ɏ$;L$B(uЯ1jk{Qk6GZ@N{hE `24 tk6z\j:|E HY֭(׫XiouGwmM 躻{$] F Ix&pWZg6|jT'J(o?.岼Qy~%fx> ϋTH!1K]sjϖg+3PBMo 잊=,vD4]r}M{=8`p[,‡tR.BC+a?_&N8c_C[~b{^@'"D0#J݆jM1O?Ƹo [w +^ѫNyU9q8*$ r76' He٭?M Tgl5,hN&I'Us':wfK Zk\^qa:AOnW?Q3#5G$ߢacc9f0fl߱F&G18ȣS"x߃tst[TL+C)^{mtB'}Uʤ :SBƬNN4ZLe X# B2X.- qAg|(U dםz!ћ;*ZsJbmNuLIDԱ&Ըso5.@_s&Dм*ƻ }]ǧ=v%vӈ M`^ԏӳdG%ПY"}#@u q[|IMܮr.\l0^٪6&ئ^T|>>!tzOyjO*DQk"v2Ԃˈ'Bgs݈e]x0ЬK59/^+6(&"lvDQ(*$2\'oBY:/15N4`8)VI1Ŷlw*-_ʰ>j?0~CV(=W1Ώb'y{50TX󸯚?j`;'?&SGW\ 8u A"LITǘD2&j޹uZ)(X;q]aپg_`Z~|vXgC|a[Av5#R/`]آbT){(Bd zQw~2_͘x}Y#f5]$Y) jɓph *]և,% v<?{05N/Z =7aGz'V(zFcx KBpVeSd;'/0=9ҸB~ 0 o LmtuZ۞t@JU%XInn)Cb,%Q9d _$ml%{Ûkrw#lLH5℞tg*ķ]Cx/RZ8]yQ'E.&{S84P=*T gZJou)8]фcGK.\o8D0n6>D<oѭ"+ pnl3zaxK3zUG ;//@+98ۯ=UtG/G1k=VqYOvk6mG!q;.d}F%TՆN_SҚ!oh7TT{F`U ZVr3_@' Y(.MiRsRɋtϤڷҠ:,PGlxV)Hv}zq3G@Ĥ>Ư@emcD6LFC0 >il+^b2U֊S}-ɦYw7HT(ߢg0'ZP)r`˹ǝ(`19WC`',ɉ>XZ m[ĸ: ߆a6TYlķ\pj46s Re|ѶՕV0n"Ɩnl{#8 q$x4:F{֛; S!|_H-nLULYb'<%߯{YxdyN=9h"`7Ff~VNݲof)U]'g&EY#IJ1._QdOUja#jXa]b6Rc(5. Ѻ$3ʂm)eH]zua]KzaVB Oq*ofe q#[2Qi( /MɁ?cjdA88TGJƐ7cԄeJS=lk"Croh(9wTjV Ɓ=]_ ɼyuj0C2|;]}ר?֯LnP+X KYvL=5xX eû90`HK(s)ZN/%;9ʏi﭅d#Joq9"ήhLV!;z@r#(R,T,CIBNZhA\/ J4|wѢU18@E|ݴw_ؤC*m7\}1M[D+ZւU*iϩ-ϗ/-k ƁSFJbesʛȐ%!wr50X 3aӁQ,@ "33T= 8x۞أ-Da,Kt'`t/#Xj('نjm[%4?ʥcHwQUKzCe 2yl-E31˽I)߬'=Q+_ # d(p`p3PZ`M2l+S cU>n4փ}3%zxU3yiBKR$͙>O&FQ['`D,Y "qlSJǻ on!|r1tdSRQ'^Q7O;A)tT%A[\ɛ.d0%58;%v+&O&8aᮯs/>#ɳI-2x%&۴ ^i3׀M/hK,l-k3cxz>P>g}RˍiAfp4BgYGLy\F2k[ps#'0ozX$ˌd1MGi_ɞ&* HLܰ洍7 }x81a$H?S'ُيm( qG~=Me \lwV|,)P9" Gt7uKoŰ_4ZT;˟EbkqW=F3YUe[5~q+A!fRf}*k #WYVEq) gTBt9l /BJax&n%ob*2#~'N`pmC|ϯhۙW 8o&/tct$*"Vsg*#6^)gk}ȉ:n $ME uބ (5)=o)H>Vm07uqoHmYQ&> C|dzm[={ŗ2/wd'_صקp/v'pFՋaǣ-6!mQE9djhѹbBnc9HO<&V.G۱[ɓսoeeG X~&uujP`3@-KPP[aׅ@ÓN=ٰNT7#z{]~@u#\u<8pQ]NsWQ+fUkLEU0;ȦX=zllٕٔba@Ƌ4TΌᠱ+!ٜ-pܛoTXT͘J6V~EqB#Ӕ)|0vpB8#<{~@ϊ0/M>v]}UddT)JCcs<5ͅ"$Wp\BdFM")p | c3A=o432/ C,-h1]Lq|M^F4cy26FF#ӴvX9h9! ^fWscw?W/ӬmrA/kSQ]a.lS]M];f~5j}ϤyX""ş(9 ƀ,iY Tۣ2 oab./j,"h$Vo+l$Lzkjk3J r79nJZJX:vn@=̛`S/~Ev;0x (iL:\i MO5268 v,8^  mQ8:Vwj & 86}eῊsKg̒ η/vyZ/Da5B[~AUfF]4./oNDWi&O(%:ؾN}8' 4 /<: ѯuHi4nn'c}[Ct>}rZ~3m5zrPfy8M]D/דˁOߡU˫sӋ⊛9%ڮ-jUUR!Q7+nr {,ɆØ%ha>Pw*lLC츎ְeHgoyAGSR Qx }0>l6G'#(b@H=En#I3 tOosi a庩WBN\m`R̅ۃv›>X/Y@k}m$gJ \s:eک+tMJK;jެQ@Bރ6JGvǤB4dw,޽yp&'Ō6o?q|&1jxfõluۅeJ5X{s5+6tX>14FOј+cB_ltX@]ƒN0@Te?QS5jg:MGb38BV|1%eE3l#)XA̳KFFːm|Ih-"ʡs@>wq,3]_?5fƛ f'QTh'ca֮^]x%#&Q&`G75{M u%oU"n[v pMd)hHwK *3c"3ε:{C(}!495Y'0)RBi?Y;xSEܚћd԰F]L(RLE8kN3) ]*BPN8LNtg.lnn&w> endobj 2 0 obj << /Type /ObjStm /N 59 /First 448 /Length 2934 /Filter /FlateDecode >> stream xZ[s6~ׯ[5AɝNg_4v:N-67wXN>L |8`1SL 0&,"a)3F13 &0ᘵLH̩ɘ9czRP+)Ʉ4),Rd rLNu5Wu,c &5!eMV/ehyuS|faJEIhH&8_gVZz+<0TܗVᾞVW4MKNqP'C8! A0y啭ߖ涾QϽdLSSRS&1NzvFdSS,&CYs^t 8$m^f:SuNziۡguuJ_?8ۄN]kb2!i0zu87]Kks:iK䀇NFr9  z/JTA(9O"zvݘ_qWVx|:Dg|x^B!cZWߊ0Vu@RST#ܐl0 } HT ֹ؁*hh]Q > *:`r{Q+OTYB%xAt)(@ZTkb\߃%3% ,VX@ݍԆTbEQK} oFI_4xFK\5]7PCrj-S)hQJ=^n> +;8gX&* c?4L- DSM<ɔ|a5 cDtk{0rԒ ʆ~hx?;Aӣ܍rĻg͢{0P10Htr t0CBA8?_)K\qUxWiAר-8ghTuȡzs* y^eaY)u} qU3{|^< j^{g@vp_q`=ALH7ʊ&Wu澐LGcp~6UD~ _|NY`8 UtmP®7|)DcA!g]L_E*Wu6Dy;쇸ڌIU\[d;5|}C7Ny}o| 8l1_tq?/2'WeBÃA9ן=R28+Źz>g6.X0 9tؐ=2X [HH9c3)9!c$: O^Nkn#UFi?zf\mMLH;p/\VwXX f*i)|Pq= k4$mZmyo(n*&A-uŬTL5J1=%T$)fb' ̦^JeWz/ЋW`]PgŤY~&ꮃMF<_%CiBf0҄%JAwG}ן:C]Jۯ[VvJ: ճeV)@ohhݡ/ΣC6$k~Yy$via.Ϣ[4LNnY USЭ)hdG3V4l?.EԒrSq?.w?6ưN$cX+7 -%z٠MY Sn(8xa~鶫x7I&_yy>YῺi endstream endobj 73 0 obj << /Type /XRef /Index [0 74] /Size 74 /W [1 3 1] /Root 71 0 R /Info 72 0 R /ID [<5AB4F67107B3FAE64CE227E4974C8ED1> <5AB4F67107B3FAE64CE227E4974C8ED1>] /Length 194 /Filter /FlateDecode >> stream x;RBaўQ᪀T H`3*6ALn &9S]H6HA+ $ '&E@ =!da\§J5~Eș_/"8387BԚY%a h \\ bSѶkczמ̾<` x fѧva~q endstream endobj startxref 144499 %%EOF alakazam/inst/doc/Fastq-Vignette.Rmd0000644000175000017500000000650314067624107017227 0ustar nileshnilesh--- title: 'Alakazam: Using sequencing quality scores' author: "Susanna Marquez" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes toc_depth: 3 md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes toc_depth: 3 html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes toc_depth: 3 geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Fastq} %\usepackage[utf8]{inputenc} --- The `alakazam` package includes a set of functions to inspect the sequencing quality. ## Example data Load example data: ```{r, eval=TRUE, warning=FALSE, message=FALSE} library(alakazam) library(dplyr) library(airr) db <- read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") ``` ## Load quality scores This method allows to add the quality scores to the repertoire `data.frame` as strings. ```{r} original_cols <- colnames(db) db <- readFastqDb(db, fastq_file, style="both", quality_sequence=TRUE) new_cols <- setdiff(colnames(db), original_cols) db[,new_cols] %>% head() ``` The function `readFastq` takes as main inputs a repertoire `data.frame` (`db`) and a path to the corresponding `.fastq` file (`fastq_file`). The sequencing quality scores will be merged into the `data.frame` by `sequence_id`. The newly added columns are: `r paste(new_cols, collapse=", ")`. The other fields, contain the ASCII quality scores in the form of a vector, where values are comma separated, and `-` or `.` positions have value `" "` (blank). After loading the quality scores with `readFastqDb`, `getPositionQuality` can be used to generate a `data.frame` of sequencing quality values per position. ```{r} quality <- getPositionQuality(db, sequence_id="sequence_id", sequence="sequence_alignment", quality_num="quality_alignment_num") head(quality) ``` ```{r, fig.cap="Sequence quality per IMGT position for one sequence.", fig.asp=0.25} min_pos <- min(quality$position) max_pos <- max(quality$position) ggplot(quality, aes(x=position, y=quality_alignment_num, color=nt)) + geom_point() + coord_cartesian(xlim=c(110,120)) + xlab("IMGT position") + ylab("Sequencing quality") + scale_fill_gradient(low = "light blue", high = "dark red") + scale_x_continuous(breaks=c(min_pos:max_pos)) + alakazam::baseTheme() ``` You can add use the quality `data.frame` to complement analysis performed with other tools from the Immcantation framework. For example, you could inspect the sequencing quality of novel polymorphisms identified with `tigger`, or the sequencing quality in mutated/unmutated regions. ## Mask low quality positions Use `maskPositionsByQuality` to mask low quality positions. Positions with a sequencing quality < `min_quality` will be replaced with an 'N'. A message will show the number of sequences in `db` that had at least one position masked. ```{r} db <- maskPositionsByQuality(db, min_quality=70, sequence="sequence_alignment", quality="quality_alignment_num") ``` alakazam/inst/doc/Files-Vignette.Rmd0000644000175000017500000000500314067624107017205 0ustar nileshnilesh--- title: "Alakazam: How to read and write files" author: "Edel Aron" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{File input and output} %\usepackage[utf8]{inputenc} --- As part of the Immcantation suite of tools, the `alakazam` package includes a set of built-in functions capable of reading and writing tab-delimited database files created by [Change-O](https://changeo.readthedocs.io/en/stable/) into R data.frames. However, due to differences in how certain values and sequences are handled, `alakazam::readChangeoDb` and `alakazam::writeChangeoDb` will not properly read in [AIRR](https://docs.airr-community.org) formatted files. These files should instead be loaded using the functions included in the `airr` package (`airr::read_rearrangement` and `airr::write_rearrangement`). You can read more about how we use both data standards [here](https://immcantation.readthedocs.io/en/stable/datastandards.html) and [here](https://changeo.readthedocs.io/en/stable/standard.html). *Please note that the default file format for all functions in Immcantation is the AIRR-C format as of Immcantation v4.0.0, which corresponds to alakazam v1.0.0.* ## Reading data Small example databases for both the Change-O format (`ExampleDbChangeo`) and the AIRR format (`ExampleDb`) are included in the `alakazam` package. For specific details about the latter, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Set the file paths from inside the package directory # These files are smaller versions of the example databases previously mentioned changeo_file <- system.file("extdata", "example_changeo.tab.gz", package="alakazam") airr_file <- system.file("extdata", "example_airr.tsv.gz", package="alakazam") # Read in the data db_changeo <- alakazam::readChangeoDb(changeo_file) db_airr <- airr::read_rearrangement(airr_file) ``` ## Writing data ```{r, eval=FALSE, warning=FALSE, message=FALSE} # Write the data to a tab-delimited file alakazam::writeChangeoDb(db_changeo, "changeo.tsv") airr::write_rearrangement(db_airr, "airr.tsv") ``` alakazam/inst/doc/Topology-Vignette.Rmd0000644000175000017500000003063214137534600017761 0ustar nileshnilesh--- title: 'Alakazam: Topology analysis of lineage trees' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Topology analysis} %\usepackage[utf8]{inputenc} --- This vignette covers the basics of analyzing the topologies of Ig lineage trees built using `buildPhylipLineage`, using some built-in alakazam functions that focus on quantifying annotation relationships within lineages. ## Example data A small set of annotated example trees, `ExampleTrees`, are included in the `alakazam` package. The trees are `igraph` objects with the following tree annotations (graph attributes): * `clone`: An identifier for the clonal group. These entries correspond to the `clone_id` column in the `ExampleDb` data.frame from which the trees were generated. * `v_gene`: IGHV gene name. * `j_gene`: IGHJ gene name. * `junc_len`: Length of the junction region (nucleotides). And the following node annotations (vertex attributes): * `sample_id`: Time point in relation to influenza vaccination. * `c_call`: The isotype(s) assigned to the sequence. Multiple isotypes are delimited by comma, and reflect identical V(D)J sequences observed with more than one isotype. * `duplicate_count`: The copy number (duplicate count), which indicates the total number of reads with the same V(D)J sequence. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(igraph) library(dplyr) # Load example trees data(ExampleTrees) # Select one tree for example purposes graph <- ExampleTrees[[24]] # And add some annotation complexity to the tree V(graph)$sample_id[c(2, 7)] <- "-1h" V(graph)$c_call[c(2, 7)] <- "IGHM" # Make a list of example trees excluding multi-isotype trees graph_list <- ExampleTrees[sapply(ExampleTrees, function(x) !any(grepl(",", V(x)$c_call)))] ``` ## Plotting annotations on a tree There are many options for configuring how an igraph object is plotted which are helpful for visualizing annotation topologies. Below is an extensive example of how to plot a tree by configuring the colors, labels, shapes and sizes of different visual elements according to annotations embedded in the graph. ```{r, eval=TRUE} # Set node colors V(graph)$color[V(graph)$sample_id == "-1h"] <- "seagreen" V(graph)$color[V(graph)$sample_id == "+7d"] <- "steelblue" V(graph)$color[V(graph)$name == "Germline"] <- "black" V(graph)$color[grepl("Inferred", V(graph)$name)] <- "white" # Set node labels V(graph)$label <- paste(V(graph)$sample_id, V(graph)$c_call, sep=", ") V(graph)$label[V(graph)$name == "Germline"] <- "" V(graph)$label[grepl("Inferred", V(graph)$name)] <- "" # Set node shapes V(graph)$shape <- "crectangle" V(graph)$shape[V(graph)$name == "Germline"] <- "circle" V(graph)$shape[grepl("Inferred", V(graph)$name)] <- "circle" # Set node sizes V(graph)$size <- 60 V(graph)$size[V(graph)$name == "Germline"] <- 30 V(graph)$size[grepl("Inferred", V(graph)$name)] <- 15 # Remove large default margins par(mar=c(0, 0, 0, 0) + 0.05) # Plot the example tree plot(graph, layout=layout_as_tree, vertex.frame.color="grey", vertex.label.color="black", edge.label.color="black", edge.arrow.mode=0) # Add legend legend("topleft", c("Germline", "Inferred", "-1h", "+7d"), fill=c("black", "white", "seagreen", "steelblue"), cex=0.75) ``` ## Summarizing node properties Various annotation dependent node statistics can be calculated using the `summarizeSubtrees` and `getPathLengths` functions. `getPathLengths` calculates distances from the root (germline) *to child nodes*, whereas `summarizeSubtrees` calculates paths and subtree statistics *from child nodes*. ### Calculating distance from the germline To determine the shortest path from the germline sequence to any node, we use `getPathLengths`, which returns the distance both as the number of "hops" (`steps`) and the number of mutational events (`distance`). ```{r, eval=TRUE} # Consider all nodes getPathLengths(graph, root="Germline") ``` Note, the `STEPS` counted in the above example include traversal of inferred intermediates. If you want to exclude such nodes and consider only nodes associated with observed sequences, you can specify an annotation field and value that will be excluded from the number of steps. In the example below we are excluding `NA` values in the `c_call` annotation (`field="c_call", exclude=NA`). ```{r, eval=TRUE} # Exclude nodes without an isotype annotation from step count getPathLengths(graph, root="Germline", field="c_call", exclude=NA) ``` Note, `steps` has changed with respect to the previous example, but `distance` remains the same. ### Calculating subtree properties The `summarizeSubtrees` function returns a table of each node with the following properties for each node: * `name`: The node identifier. * `parent`: The identifier of the node's parent. * `outdegree`: The number of edges leading from the node. * `size`: The total number of nodes within the subtree rooted at the node. * `depth`: The depth of the subtree that is rooted at the node. * `pathlength`: The maximum path length beneath the node. * `outdegree_norm`: The `outdegree` normalized by the total number of edges. * `size_norm`: The `size` normalized by the total tree size. * `depth_norm`: The `depth` normalized by the total tree depth. * `pathlength_norm`: The `pathlength` normalized by the longest path. The `fields=c("sample_id", "c_call")` argument in the example below simply defines which annotations we wish to retain in the output. This argument has no effect on the results, in constast to the behavior of `getPathLengths`. ```{r, eval=TRUE} # Summarize tree df <- summarizeSubtrees(graph, fields=c("sample_id", "c_call"), root="Germline") print(df[1:4]) print(df[c(1, 5:8)]) print(df[c(1, 9:12)]) ``` Distributions of normalized subtree statistics for a population of trees can be plotted using the `plotSubtrees` function. In the example below, we have specified `silent=TRUE` which causes `plotSubtrees` to return the ggplot object without rendering the plot. The ggplot object are then plotting using the `gridPlot` function which places each individual plot in a separate panel of the same figure. ```{r, eval=TRUE} # Set sample colors sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") # Box plots of node outdegree by sample p1 <- plotSubtrees(graph_list, "sample_id", "outdegree", colors=sample_colors, main_title="Node outdegree", legend_title="Time", style="box", silent=TRUE) # Box plots of subtree size by sample p2 <- plotSubtrees(graph_list, "sample_id", "size", colors=sample_colors, main_title="Subtree size", legend_title="Time", style="box", silent=TRUE) # Violin plots of subtree path length by isotype p3 <- plotSubtrees(graph_list, "c_call", "pathlength", colors=IG_COLORS, main_title="Subtree path length", legend_title="Isotype", style="violin", silent=TRUE) # Violin plots of subtree depth by isotype p4 <- plotSubtrees(graph_list, "c_call", "depth", colors=IG_COLORS, main_title="Subtree depth", legend_title="Isotype", style="violin", silent=TRUE) # Plot in a 2x2 grid gridPlot(p1, p2, p3, p4, ncol=2) ``` ## Counting and testing node annotation relationships Given a set of annotated trees, you can determine the abundance of specific parent-child relationships within individual trees using the `tableEdges` function and the signficance of these relationships in population of trees using the `testEdges` function. Annotation relationships over edges can be calculated as direct or indirect relationships, where a direct relationship is a parent-child pair and an indirect relationship is a decent relationship that travels through another node (or nodes) first. ### Tabulating edges for a single tree Tabulating all directparent-child annotation relationships in the tree by isotype annotation can be performed like so: ```{r, eval=TRUE} # Count direct edges between isotypes tableEdges(graph, "c_call") ``` The above output is cluttered with the `NA` annotations from the germline and inferred nodes. We can perform the same direct tabulation, but exclude any nodes annotated with either `Germline` or `NA` for c_call using the `exclude` argument: ```{r, eval=TRUE} # Direct edges excluding germline and inferred nodes tableEdges(graph, "c_call", exclude=c("Germline", NA)) ``` As there are inferred nodes in the tree, we might want to consider indirect parent-child relationships that traverse through inferred nodes. This is accomplished using the same arguments as above, but with the addition of the `indirect=TRUE` argument which will skip over the excluded nodes when tabulating annotation pairs: ```{r, eval=TRUE} # Count indirect edges walking through germline and inferred nodes tableEdges(graph, "c_call", indirect=TRUE, exclude=c("Germline", NA)) ``` ### Significance testing of edges in a population of trees Given a population of trees, as a list of annotated igraph objects, you can determine if there is enrichment for specific annotation pairs using the `testEdges` function. This has the same options as `tableEdges`, except that the values `c("Germline", NA)` are excluded by default. `testEdges` performs a permutation test to generated a null distribution, excluding permutation of of any annotations specified to the `exclude` argument (these annotation remain fix in the tree). P-values output by `testEdges` are one-sided tests that the annotation pair is observed more often than expected. ```{r, eval=TRUE} # Test isotype relationships edge_test <- testEdges(graph_list, "c_call", nperm=10) # Print p-value table print(edge_test) # Plot null distributions for each annotation pair plotEdgeTest(edge_test, color="steelblue", main_title="Isotype Edges", style="hist") ``` ## Counting and testing MRCA annotations The most recent common ancestor (MRCA) of an Ig lineage we define herein as the most ancestral observed (or inferred) sequences in the lineage tree. Meaning, the node that is most proximal (by some measure) to the germline/root node. The `getMRCA` and `testMRCA` functions provide extraction and significance testing of MRCA sequences by annotation value, respectively. ### Extracting MRCAs from a tree Extracting the MRCA from a tree is accomplished using the `getMRCA` function. The germline distance criteria are as described above for `getPathLengths` and can be either node hops or mutational events, with or without exclusion of nodes with specific annotations. To simply extract the annotations for the node(s) immediately below the germline, you can use the `path=steps` argument without any node exclusion: ```{r, eval=TRUE} # Use unweighted path length and do not exclude any nodes mrca_df <- getMRCA(graph, path="steps", root="Germline") # Print subset of the annotation data.frame print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ``` To use mutational distance and consider only observed (ie, non-germline and non-inferred) nodes, we specify the exclusion field (`field="c_call"`) and exclusion value within that field (`exclude=NA`): ```{r, eval=TRUE} # Exclude nodes without an isotype annotation and use weighted path length mrca_df <- getMRCA(graph, path="distance", root="Germline", field="c_call", exclude=NA) # Print excluding sequence, label, color, shape and size annotations print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ``` ### Significance testing of MRCA annotations Similar to `testEdges`, the function `testMRCA` will perform a permutation test to determine the significance of an annotation appearing at the MRCA over a population of trees. P-values output by `testMRCA` are one-sided tests that the annotation is observed more often than expected in the MRCA position. ```{r, eval=TRUE} # Test isotype MRCA annotations mrca_test <- testMRCA(graph_list, "c_call", nperm=10) # Print p-value table print(mrca_test) # Plot null distributions for each annotation plotMRCATest(mrca_test, color="steelblue", main_title="Isotype MRCA", style="hist") ``` alakazam/inst/doc/Files-Vignette.pdf0000644000175000017500000047344714137542135017257 0ustar nileshnilesh%PDF-1.5 % 12 0 obj << /Length 1891 /Filter /FlateDecode >> stream xYo6_!d/2PqH#cˆ4@1CA[L,ԶOfy2O_IWH8l+zD'겵DR-l37(!Xu4rЮ )YBvi]-8K3Rg1E$8d%T Z:`<s [KoH\8&DwKJʰ0DI&B64_Py'Q.x rdZ7LBB} *# @ HyhJX hͲpmꖨy-mZ.gf5Ӱ5m v+G SO8sb\j1@o9FG )=]\zl)x\QIP8P9h جf'$.,-PLR԰Ih Uh4,Dj\輼TIHDFӪn#Mg$6K@Rr-TXbsv%X(mmW3^ԻKq[ӽNt.>H4M/)Hba'%:HA rT=ޑR"bDdeYz~&6@&9d(\v%b]Wk(78zqM[EWggHeEUG.'@+]4_i)d|Js \a36 Q,S,*SXbxOapo W⿾T =2e] hL!CPUR1X,9}k~e 5;R=k̆]3YoϾ$1RWv0Y(rN86p)BLe{οڴ?#p!zxiI~ѴSDI `.Rwt `г?!͍&O!LK{>GA0G*BY {a6 R_,H'XKMu ^-^!d>#μUׁۆReTN{}Kt-6$@f{:qơHWr6'@J@i8fjJ@Ͼ* ED+@uq s=(r`}yV'LzWƒ\N"jZ|_dϚfLH1` _e & f_XvwoKIl8Yb[6e;pq|tZ-kn!U80  p:& /LB|Ɖ "SkYWK`\( ;⁘䎋WMob:I.h+lMBb\!n Dmeip.5ae,<#dxH9_G`QO(bذS>bgs 3ܒ"@\;7dąc9 z)Ψc>& .?)> stream xڴstd=ܱmvfǶbtlfcfw/7jT {3ZNQ(0 ;gFf2ȎAdc `edffu9[Č<Ng WDG+337<@htp=@g#U{ rrf06rp-4) {GKs k|a`lF5`dg ag(>jhadcT5qeW5EƏU\AETEUM &*$TT~>T?|MWVRga{+oF >RAP[8;011893mjap9Z>@?¸ؙ~l gisMi!G҇}wMS\9EE93# ` 4A @o v9O.3]Oo#1#;omӿV,m;3Kl * rg Pǎ 9,l&3~v+N Gjk;Z,LnbϤfǵft7`[Nkfkd03qz[?.NF@ pL-M?cPY] kR 5xLfL fg- QF67?B4R?-$,݁&R_vig3~?&sdѰ3 ^4:988q?4e `PVv'Hdjig`e9:y3+;;壕M4 wqn$'I `R_03L  ,|d09u7`r_ _?Xd ԰4y#gGKwf)@o"" wO6N+7Nk4_^Y}o )/*f<Д\N ! ePx|5)l6Z*'oLv|}Ņr2ʻHierJf2ۈjc'ݏѬhRHu܊X1mݗP; :1cig Cd{Q>/W^}j 2-el"4S$׀JVY^t}Zm ΑVଂ;̐pDyi}" ۊ ƣNF91Ͷ16GzNqmqQ!njx%6$WiK^ M JHM! IouZ)<兾1'ıxe)jn܁sTFbWc6DԒ}gi%t03){|*| -??2P%6EHb=;_;oE[ps^Q a90\/H犋I.u0N u''¬FuOJwȑ5PfY?Wv6ʈVfA'r@X)|}T#GwaAYgzn| \#] Add/ rкtrk 0!DL|ȋ4?Ѳ)|uk)xɃޘ#Ky^%f3r$OkȤZվ Wv\J~>WFz%WX*3XZY,>پu~+$kƛ">>NvV0.|ʝ*6jZ {)Ze#?oc [+2r E)4RHFihR4R B74Yy9ԠyoR0sg $'и>ǜ J>ߘaW}lOG^eN.6P,3/Pc'jYX>ZҖ>,;&E3 j(b?KUg%4s\R{Dcg+|H@=qˍtЉeAeѺc.)텲/H*@.(B)1~p[Q3[G3gVգWrlBۥ5kN_)zbx-QeMf2?,] ez&wd$" iUP#]ic{v* <Q2' #T4IǦ?=iv'&IMm]s>K$*}HUĝ6ӗSɁp<˂^',R^9+=fnqٞSҞ_0j.,}d2\0'xwНgxwm2`E_G-<ݡy0 M"982YE}Ne )YDGvS!iR}fͳ#ІrL'KY.,R}*B%Ja)1+7<+OO{]e]Fq$><ŁDd JH#X"Bz_|g|:eye㬼!=zW8N` ,mty#MWыጹ>7Z}벮f?4G瀁_$zK>gZ un^HlWU+ьdSf ?h>[(j/cK`ԻxR'SuTu"olߤ`N3oZ[{T-,7 /ΨfKyeSAɯLolƅ=R'tG)Sژ_wD$)pmv7 +rTV(E2x"GDǨя63Fp_l6r\8ɒеhKtdʦ9V2+ {p/۴i=3t䟇ұ%VGTMʰKjR@3u+.&HNWq|K¥a}`7!gn(nt:վeEn @/ orѝ_ slw}{w-1 SZ?wf< o鑮))1!5B2<<3t[=Wԕ6|OA 8L]4'iEy۴/&ݷqmo]vO8([S/Yo<- ߏ;Lu!\32eך2MEl(r䜞֕#(IJy(O3G  EW~ ^XでCد}#Mf-.m>Y ?g*lf EESƞIW?Zs?f02d2ժ|i1~Dld&ˣa_} L-X*ӱ%Ҙ2VKX(]qkb8]-qsj탋:ȋby@Ų*%#IiӸG fCv̅54XX*x)>!TIfDu_ͧWk +ӑ,<GÈ)\$p6Y5D=ܓYtT[*tXcBdr],;+l Ǥ/R7ԏ|!OEhQg!abEցŨZγ@DK˭OķƟ $$理$2ĒEY,8N"W[bx5e&N\)LS͟~@L7?qBD 7a8^!@R)t?Cy+Z~co|Nr^P ٳơL(ʲe 6>OO+Ɯx1/ KwBhYNwߌs޲PG4 6J7l3;.E*ZԀ1܎ ip+肆bP_xN\/ TZ;-X2%%[:jht5 sR~Ay=ĺ't]_VP8DܟH&ټܖPWT5+ۃ$$9C:\f-`•)f;-j&syי_vi `eoMW}/RTݘp}:".`ź&O ^YMy^q&Ny}yե%"[i,$h [*}'-ϻhCE<)& |;^6jUN{"/']jOYcٶKw+ZfanE 4N}Ҟbq󫱻ひaW~ZyXA +OHB.=%洈 u,žҼKZm\աWB豄v*nvS*oN-/ʪC ˉ BWFۛɛ?*KO˲|~KMlBޢ ː @ ,s=Q# #M3`HjX`2q͐djqjEX 쫻vUˊ<%7x*IVVնx5 /$)llѿNnO8n̥s!R{mFfx1E"9[:\_K*¿0 'Д$Ib u4]tU^VTb*!ZƮm\MSfYpf /:`)h-lܜ nX]4Zk(߉M#w+$;%2Rs c/W6te0EFM2dꑕ(P:0nſy G˫?ٺi?>~6%.!Z=d[WWh*:O@[*<B6%5`h] W(xwuHMlÃIqQ.d:h# ;l_WA%8emIgB[c~齧 Scp2}*y3y =GE n18kh#O *cL*Y 33N5TG[4̪ސys.nݔT{PزCPg‘`f焐m]mbw LwG#f1Ie> $+.! 9ҵ5'b!F'o/jAGeJ7QټjT{kz:!ĮIFl",!2Oa tci3~\Dl~.xohl$ݦ̭B }]T5t3r}_Xu}JQ;\.ؒF+*dPg C-.2{ Yj ]PHHAݘo{$ 7bW*GY UbN2ko|-c"xz0sõj_ޅRrq-{ئ5-62 죮CH|O^cdC9FZH柋'SFOj%w .G K[/quxB6Y|+f&;~Or& ^'TZi_˴Jц-@ԊJ#ATlf%_ 2enq>_K=q=𸴧^%zGJHldGj BiL}nAIכMzшbuN;:ݨV d[cBX4A[`ГuF`Rr5ei "J~uUN$m.hQplnb{Ӿ$o}- 6>]|zGƟ/} DTB]R;b o_qaPG nOJ ɯU#R,G؍'] )>fyDqGfANۘ~ݓ53f 6jE MVZߕM'_c`/a;}Y5.MΩ6ti,gd2tk:vu 匪|jO#f?PYl S-~Q~^L+(uW '<0Y?D.g̀k5fl4LzK{D)sMdY61 !2jѼp;ͥ,P\4Uk} CM*կ댭Ql(:#f*>{; W;ͺo7Nʻ+_NhBZr1s5 q:yM_o#m>;c䧜:UrS͸mStH%[=/#PN~xqHn݊@{Sj(_zퟙ{kG'H2.|-Vw4"'[Y!qg lw7τ|&%ba;qmM ^IdKU:)2 *L .yς$7A^X:<90W]?( K0ܶ x͜X-̴ ZPXdEf}'ؙTf4Z2H=3qD Cƹ f+{zjd6GNꍈA2.`h3kGFT ;Ie}NJX]#yP6gʤf1#JϼY@묒!D׎^R}s,sA#pտ^y2Yb7E =ˠl05:!>rlRMj}IEv5sP LĩuϛnE߫gj 3 *άW-rFm ׬߲znm0 h> M6ϛMAK+5q~Y)QK*+lB4/u fb\8iC8~ihMj¾;{L¢䑢B69aIȘ",.{6$didrJ6UclkQ2]gSx—֎J);~ v)f?%zDڌ*\* [U,y/;h(5KS z`4\a!PY ,[)CkaG CD`/ ֗ |A#ͅ'}ʁq k qڇ&%.&3 ,L0bukV͜V q(c^nє7?5) )Ysꂪ֘.ugb,'2ߗHFJp{2jC""a*lw#N "=Һ ˾&]Ӂ70g'LhKmq/(+|t-mxca.Y ;h$~|,G+acev*lЕ %Iyr_t\05VP&Hk_-6Hyß^knsv{.,/m@`{ۓұA=݁휚a,ǐB}քN-ϕHr<?=L_$7]lsH3_gƭkDs |w`__ˇ<~I /%Wk&y?OΖ> 7[MEY<&OWLq#WCTmԻKxU:Tw<S d7lW/7;~ W0wۊa٭SMۄY8Ö~ﲩ0*QPv 6} P>\%!u,ɈXQbh%.ȇ{㨘ucPcd!LQgղ\d˜ɁwFP6AL6V6 N^pJ[AQ^9"}YT~\>=mjѷ7t uU LzY F$9dVd$5> 6ۈbWc[8{~7 APAe#hH*, r-\ObCɡ ;nO׃{~2$h36EfO]m&ᅡZe%M@3ɓA-Ъ*. ,pα8Q96"꥞X ]x4ޭ]Vev/ MR$O_zKy;\']`߶;k8r2h䅀qYZ7f,UW[pyQ[I&IA aF%b]〔P pFHOc?R,zc+%N_30m^ѕ@`?5DBG@Î@TD"hwCm#T! ~qf?8&s 'W/adc5DPQ_J gN/ zbuŦoüÚ#kf3%2 rkyT3/?~mǾI^09Ĺ1Mj1M'bHoYrC 6!f L+L,u$+>ᅯy*yfS0)BhP ^q9~ 4G~2s&Eb'<>PYspNp^lw@p^5ұVbV5^ QSŸpK}g#\{_ʑKHs+?6J6q]CjDCVP_n񠑭E7-h3\噔y z,"*:^ lX>Pz ԭt+'@p eȮOZ㬜x=,3ջ͂3T7xAu ?8BkTd~ހ"xASa*x[o:+hG9.ZAލ(^?abmgV ziRUqFAn,8quӤB z4bV~?3OZad5y{5O{~m CvM`\  M#+wz+6BDqm]׊[`qgUNv%`5Ta-H}hwB6"w+CUE%df!3K0 1@iwc5:] MGiBdG ;̝b}lKB*`%ŢR"H+fBE^KB|_DrѕSId06/'j%i6F_,]"T燻?:ItB4a_}8TH&,MB~:y>ړN.za^ fgQ7[C)^¿=v]Saxl82_iVB "&n!Fq^ YvF5_v=2ZD־_Tնcka70Fh*dپԙHrl _PPxDK /=kHrcN@Bs%`qTȟ"owc fLB"f3ؚ(PHVҜ%/M3TxF">4WJYީ~~%Hc Zb7dT^5p6hڍ#N8 mkCC1Sӎi]|dE >fQy[ WKY߿Xi#HSTan%̋o"6Bdy/,Yֽ8ќqZ6U7saE|s8ʊn4nN)~J׸;1Hh'u:IJ[$mP8?yc67v)jX#?AlQǐQBPJn rþ 5Q52Lrw>Tl\pvᙟgBCZ86Az"Nfov%S$vqJpObF4z8f4138\uEਭA1VBi¨NfBN{tJ "=Bj6Wt|k^ʎ-ZHZ[A.z]y6ꙢjzU.gY?"H"^0ٍY.g}x?Xμ{xƩQN\[*n!WP˜'9F zBl]8#Lgb9tLzq!=(G՛|H~c3Ls4 - %|`Vft̞|]˦n5ذ"(_B%юɈ.a?҂#hIytqfgzWd=I4@JԤHgu#6ֆ~=؜w\?#@o?HX<[GV$ͣ/"#k qҢJXf%?gWMP&Ms937z+%3^KϥF4kxX+r+Oq7`|%w,e}y/zIY* X2A!׉(`ٌ^h~_8|MNH1!:(j漛1 GbB[f` P:%خk]>^֣#Iw3 Q) 'klRt`b hW-ߗ/wMvm"N1%f$ wVކ"D"7}oS)U}gu=1 ^X5az1 hkƤ``O1;-8Z+-NU=`υ-[O/h.]h9 /XdT:o0f̚ePW7-.GeX7*9P#Q帵0[z3بFe4oD:}A; ?jQH 6xJ(?{ .)JNA۔s~ 6e#;Uy4i". 2 &\e%;Ցj״9>B?}t ߪ@ ~|){h&~:ߗ dʥРku`EB~5> VEjs} sŽ)6NKKy6|<\u9"ϐugf}(ÓG弪@՘$?䉦Y'c-?ΞF }V7)z^|V[Y ; zrb08[lʾBXhQޣV<'&n_5ƾ@M6Oh*E^K䜽]Lk*ðDVl }#..e}H"CQ='{$' co=於 Rf/6 ; :\դ'CU|uWOxkJn= |l@q!,q0aYI ҲqҨ i񱵮R.,}ǵJvXoLmHkCiրr!l.9:VjyaM壊=hZ.tH:8DyFþ< ^'O{,ߦBr֨4sF>Y~brFưm$ ;!vs~];ju 哮|-ƱyXuSx[kJ>,)╋" h<|rǂ) <=-̗ȸn-tnњ' Қ`VQ\c`2NsݝHȟjķU0# zR%&ද::"cX?pkcB |f u 璶|fwtv9Vuܣąh:K,σub3=siJqοpKmϷ{Aԟ?0]1NGr?Q; XQB#)c 5[0mJ#daG?w6xiֽ:o)YʈL4WƵVkE[Qܯѥh\_ǰIs3F2$6G!LhKuq VN+6Y8y]%Ct/Fwv#c8XZь mg#f C"KbZJ^zFlf -#~9ƀ?Ŗ]+A:/rA?2-_  g{2 G'(茐6Pİϧ5̤J$PM6Vo\X@0Z˚܈Cl7--nwzጴ;9W5y-}򍱾w 2p"4BD68Jdn[bncpI9o!J##܄VYaz'MCy >+oq^-NH*^K׷]05qvn}7OCQQkRob#GFlQ4ayf0Y{0(߉dhM0wu}Pmn1 &y0 ]Pe{=o&:gG! ,bY Ah7F:s2[AI.]'EXL&$K4Nʟk rڂ+͢IMJce2Pq+zឦ`HE92KAF5d :yfWkuF{v6C$fīO a&,)W#ظwAl'K^xک!=(|-$ :ǏX@]^֮gB"_%?o?YhܵLR /VBxSQ9rd0|bgrACxVz- J8]t(>; fh-ѬT70=^J| 'u#n&nk ݫ8k9yMɝPJ{~OuOX,ڬePzikpW6e-˶.jjٶee۶Vx^n$}wԮ7%wtBjwdzr0H ?:iH|fuV>d=TC6.U I^aeǤ{ZjiA _Cekhy>)Iir( !WNPD` Y!]VDD+3Q˃^Qmp0/+5\n ͣ$(})+:1$75S+"L||BOD2I0| CqU||Rg*>lpTgW7ӂH;DjpGb|%BӸ/]m* rLl-6BjjO4"M?//cة. iDXeV]*h |&+TǽӫQB"ϖי$yװs-r~s TUs80[љ/|xNךsǬ~OT8'ۘi7$]?ߛz6Hm"Jtmqa(ҸsR")MLg5IebAu9DP`8x[E UV:Go3Z6\TQ@|f8Sܦroшc /?yUm(j7B4!bs&Qһv>'#mL;brh BȆI^ًNqTl5ӕz#1Ȧ`&TA. sjqcGcdqufm\]{o'XXܑ*@:e- GfݝL0>4tF\^{Lp?@&x)x-W{N=OJ-w?_,HjTrkO^lQd>RgnY.AXXyآ}ZhTa{B]90ьN"[A XX&aO sF(S8ˑ(k m ψ9>W_Bwɳ8@-h?_>}ؕta!#P%Qs a* DG= ='ӵ&!/̄0F^䂷n\pǜ[>T_O|>gEس'e`ᰬ.ŧ=ߑڿ8%Iwx\0A]01}$=8>':AS 6gzxA. xW^%=Sg&*#ΨֈoSm'Ak^ot"dٝ⢶$@ ^2H:}5*0*˭տ#h1RN*ti8O="dSy4:`GB#aS)fEJSiu==HsmF&od{= ɂ]+]JLMV72J;V G4c5 V,B"wfJ3i +BZ U_άHޔZfUfU1!vg?= )ݩd؄" "O p`ѥ/g4 zɬ>5d|^Wf޼ MХ)\>;3&\Ţe(y\% 4|ΞT_Qcbzl5}r,cCQO'pFu͔pIl$< gbG2-.Zm ^s070;VWW} 8^Q^Oⱊ[rM)J#Txl\m&]n55ۻ>1 vP<顜 原~L7#BQɧt2#:ڝz6X2*k~,ھu^6ٗ19YS׳Jme泊~ tȤX03`۶|gC?m0T_y aYa8E:smgk DOmXKDW]gD(ۊT%ގ7EZגmȴWW@/7N=[[Yj#ݑ3tuS"} K d5K )/ ̼m@wX`T=.g!EoĽa e1. "~20ؒ7jo7 6psZ^ZHè5@GKz+,K-jJH(;c t+G^5Au- vd`Mߴj\d~4$. k_@˯#$ ůgH3Ź/+?of!R#&[A#P K.o4ÀP *I_!7n',ι7:rߔ*{Z 9MPrS@F uKXWxƇ1Z|j̉Qz d|;vX_ %(6i}3:C$6'.nܱx5$)H$D9'A .Y,e'))hk{ye^4#ɌJAbos-VQ%{sDZ an{䔏ސ1G6-)r 7#eȭlaR"G_[G˭(9ՂM~y%{-Q]j zLnW]wQy7ȿ!E0ZSl6ĂB5we^4z4qalH[̈,ZX!SAiwė“%zΙ藲\g3ȞQSP)1+0L|EZQ.^8 hkuNw~} q&·7UBe\(il, ҶrDTn*ZhD$$dpJ{F9X6AF7ƹE+רljW2'Dwtq~~E=5kav$ābQ GfBNg`VJ~蘫we=x~ra2z'v-Ikͱoǭo!@ FVXjVos.Y;;IZ+VA.gb] "wp4+ _Utq3 qq_Ǘͥ>pAnt5r=L  'ԖQ:zQ1BU "֖6U3vdG {(,X22`wg6s 5#(*8UȊpRyYP^bcKAȜϤ(WBsXFɏ%'/mnmw@[E=,ؕz;Vۀb,h?DyMYLJ%c+"|#T1$qNnėSӶ]41̊ b "' Zy~nS7z/& d7o ϘlGHI7rMh{ ZGHur.k~^4ovptRp(Aq,*MN9 Wz"轆zϊq|R+y7S=L <^ǡHSҏ2'.-!ntʂ(&Yd&#QMYɃrӝX[ ;NT+oQ'#$eғc e uDcdmK{&f%dSa%i~zX4WdWjG~t賩㉜F z72SsE~^yn|ِli\-O S~`̠3&ߜ$s!bGoBVPP2F\Y[L ~cK6(txaԼET9K0Rml-cyx74# )-!>)ñb@\MŦزur s\(B%5z;3Wcv WmB3x$*D968h1=' endstream endobj 44 0 obj << /Length1 2271 /Length2 27764 /Length3 0 /Length 29116 /Filter /FlateDecode >> stream xڴeX\۲5$8!8ݝ`X,k .޳9=<Ќ1kVZMAJ/ljg xr*vF f&z# Bh<N@fčHoJS;@6Rs2JvN`zc#75dn Ҽٻ;Z[`鏷@`203\߄j;hadc3*IEu%UvETUM]@LXAMTWUW zo 833.@G'?i3\lJy]]]̝ v 6St9Z>6 2}+'n gi98IKiV779 _' ?X9+$5 #ɛ!0K 4A @OU9;R{;ߘc؁,NYwsgd jro{O=\3D̜SK[ _ѥAfvߘQySS;;hȨ`~k &rI8(OM?MD-,$,݀J`_ri[ moHHټl{kKk /7[![0J**H߶Ndbgj 2szئ@3;G?`#0q2%F,F+Qo `T7zTYj|(Fo:ofiomffzn `4E3?[xśo̭ߨe21G(7v'{9soFo+h[?߿ob?vR:-ot|c1u|ϦWhLO<ª`G;k?LnLoMG7?ED 8Z2q0Kimb9d@&t;9)}D7- l愊Se#yql tE2#<"b(w[/,WIdz-̍X6nh_X1QF=K3y!82pݝQ#wy0ũ9/;#BK!⸦H@+ppϓ <ƫGZ|fR[ H?]9L&IPI1oltGrMĦL*i`VxJ/IV]W.W֎+&k@,,$sتH`k,Pž$"5 s=QG7,?qqaO t#@F_/\~^@$}r)uqyO^ܬmDM: ȓWJ(+e sl ,Io_c8q>r1( 2d[Ϗe 옛f(t,] {Wi#O)?Ԯ+\&K"mI3ئ^d|q#gb"S{E tpՎ=E|_]ph /cc|t?>jei"jNܯzj0ß̇a!x-(a)s S4Bo;}w|GmYw ԵaOԇ趆8Y-ȡulu" JyY9'ȧb)~4m=HΗ 2bθi|-ew6bBAhqnV@dXmͩ>[VaWdH,|S%ڳ rDx](X ؼ/0%TpK?sT)w/Q7[@IOf o#j2_SAԒPa$ZzLHMӮЃD){ K;7iq%9ؐgt)_LQi6QTr̴~n>I3|\J\LR)mADQĶ8Q]nr]mW^φU0(l{H7GeNþN (XtMy$?/jV7R/E):gS| _E:bɑ ]jeK,aZG U>1kB3joAH(Ѥ*>"s!CMٰr`Ž(I|2TQJcaCoّe]6i4DpY"m0ǼE 1^.\gcSj =uu3_E,u)m+a;L]p+{+hRdTIJUeHyX%ZJh^heVعϦ'X)כ7%rqqA$v,@a/?D/CnӣDxNֽJNLg]k~799bi)}7at 45fđ[v.y`y/K/u`Yh`:XS5x ynZ[!k ]O,lRleTdK^`fyI{S;vq.M7daZC[.zy^:R֘Ĵso<Вrm̿*"! I64|>&Z|i2yRäy1'cȵGu`z4f% /\Hг4Ke#ډ$:O;'ݥ4sy۪j8!wD+z#ػzju%dMaqF+jۊn|iZJI^vk7Џh0qmp" [v"F]F5#_cn "=wqmyt21wf„:+NM3גeĤt֨ȠR쾸{A W~ࣁy\{d/"qQgzvmONBXH(d`$x>PNZ^$!y[hcEtZ-րӇe#Z6i+pW{z53}*V{ey@3SX[9ȜUnUf+~!V!?sTu;jw]Shwrg,@xE܂:[9\P8dߧx;]y$愍ZU](g<_ be~v9 wgI109jr&Wnm8!_|3(Gh1ѷ%e<u@gp6 vUlގ1&ʦ0[DCKS=l~y\CΣf^6qԑtC#$?"+V!V|Yh(-)(= S":7n]MJyZG}G"vY_݁Z=ֵ(aHc ~w nN5*IYB;P2Țbsÿ%6+CҎnxFVOESOp iksZVЍfĞԑq\HvdL ׵\?4fРw& VOpj6|'(_&j/ OT /ftʄf$ ·wT+*1/7u*Q~wM^?ˣ̱%qr~UXmPFpHeEB0VqUyjE[!k+%B8OOt$]gp[.x:p5~88fb5U-Ȉw*~)^q-䆽BX A|y&zļ]Pf-:9) jyPB[xmǟxI[5tif=`T)Cpv^7{<]|@,,- R]mOAє¦=WEVarBt0q/dϥ T Zv'R#;0d{sF%k+FOdצ z8&N{uu6 &{DfnwĊ&{ao'3g2UjBevUz V^ߑ,c79,,G)ÔXm.*tY\SUsT쥁<}VʨEdg %8^Ar=Y/6`2f?uvgƢ!G"!-zSD.hMʟ9c/|!rwxSct_+iv\cNˋ;OYF^ >y3T&8t}88="ON܋ϗ=]xvżkC,u<^?y1R'eweNI~-D6NښU"^}[TG:_P3= C@n#*|˳n8]`L[bn_U+%ASL4ԴSMLpB($Қ3#L*Wnob1n'քPd5I嬿\/S a-\WkaHAxZ `@{~'6/D F~z{{L嫑{i) &YFbϹuFhAA%G0G<_?QVߙL= z4O 79<9ﶗi۸^JI5 Sp>QHx7ь-/%4^MY|UX>$>!^6N8+l$Gرkƫh5q?-q ToPҁCV9rkIѹ xz$SۣtLu]e7ZZ]]DuW.Ӄl6di_3Ϲxm ]_V^Yԭ~4 HWDI4)]`V?e,,MRb !\bԋyDh, }w j)i~ir&~E4M3y1tz( ?Kx4;k0hhhKߣiK]sGB{-\P;q^c[i!5`]I tŹ9M4YTņ}Zׁv)"O8nb94Чˇ;oHRm&SmMgz,q<"0wp&*4')6 Y+iyv0~D4H,R`o+數g10xLza؍'a[[\_+8gALgL wױ[1 ~H'MÇ.P=3nyҒqt@GW3>*mNVs9vviImsttKG㉴w1U>nB/$=drHe.Ё$KE)] #(RĒ.q%ѳd׈~KS dEk$KoU153 TE.? FswLmׂuRFǍeGL8%KA7kY7ְ̋Y" HA,B\fUa?귀( %źuSF>¨R]]5~qT/JYK$NӪ4 ɆfQlwWog(F룷-av|q(K]SiU6[g@X8b^K.PDŸYJn ?ЗWfW˅QJ:/+n8慠ޯK^9hݹcր_bcw;kc%3~b缽 I̳js ԕPĉC~ߐ(wo J;u8%PD-UB47讼[=>uײdjTr٢]s^Dѳ-!#^4 rpɿq.IUS.#n>Z̥kFqR8MO~b ^ Bԋ %}ctYeA׵<%' ˍ|UiSv 1|HnzD| U.+uZ>> }T6jQp_!ߝ̸ByJ~޼ʨ/eJ jTuuѳ:VlɎh[ܪCPHѢ!2.~[a<4>*8{kwOmXSWgaF\ `8]6Wt`~ɨ/YfAWG;JJWvL3-HfOJfsxsvBx^!?t{w(Oq6R[~ZiS6I5s/FZܻ 2~B zC0lfo2[!U$dz֕IT 38;/C-8-o9F"&NL&' d|,)BIVI؞ֻX,|S~\M0@NnD=(U$[q-m=V=_Yu tcͭ Vv$(vPBcE@6 $*̺z@mS+~ {ŶԝI}Ty=4ʉ !&@UzC&?Hux/k28"-bZ7٬ ˔ERЇ\(Ag [&p'~o*o~UH+:Me V@؟YKML8a )4"i@`c^! -OfƏ|8.ནsAޞ*hJYv)\:ZT_#Hm>ai8(똅Q1.= Zy%cmJS\燥%a*e-b]DҴ7o`]cr+B1Y(*"qp};"y得S>yQ'H 9ؙWq 6y8^x]QwUQ"`ڪžN;+gmږ',/\fǿ sqR9T>1n /=Tӵ|@2uD3x^X+h9rt$4QA5dGq(A8\UwKIZ0; Iu5dE3BOo0|>$)IJ<8Lm>l%fnjhԙ9$c~ߘ@؏ȻعC5Bg 4!k.cLe̠=E"ET\R |%&yR[m#͟^|d^hn%Eqq`_xM_o=6ֲS6Pr>UJw i,85),m.as8vV뾛;fB I2iyȳd7=75Qbi[Œ4J>g3 _֯/ P*Ymڊv4Dcnx꼤U;9Ϻof">wtc@?dVZA>ܢua6ꌥVvq:6hZ{,f@)5iub޸ws(LtLEo9ʒ54=@ڳc%OU֒EFˆ]s`ȫд7>@=MC3Y:"jjඡG^ŶKֲRg͌rȩC((OK滸 Ae%sX+K($0a ɗo<#З=Gf [/zS2J%Irl~#2޹}wjFMay co. h0Hwm)`\YW;+~>`]be'tPrHBѲMmr* C/ƭ V>XWΘ.ymR QoaF գ{&"HaP' Y96>T>!RlM0>Qdˢ HHHmawc͂&J6Y0ήW1-<]u\QT:pȨ i7< LR;Q[qf?nR"K pT݆֬,K4~jIjwOHPT < KĊh;σ B#ȏlA8Z%H  yDǐ̋1 Sn'Pk!B_kd (9ub7N=<_Qea9)H", _aZ#>9>A_4 ~VLәB۠q4M pǟ>2qw!QzYG[Ӟ QN7UۖSkpM"!-+錀@(H1mw, fM% a'Cj6V?aNj[>QE&VËmq*'度^j3G3e b>JN])CwNZ,Yt#(),Pz_0PwNJ*3Nt,>Nb}оɟmHf)NDۅ-4 iݯV*ozZD_q?c +i]mw)Hf-gZ#)$EP& =$s~j" Пninj$5>9w!Ie1UqH<#V|^|J| "uV1Σ#DB[UE1n:HGP^\wzB-̗!N 1!]$eE^!#@T@ޜyy"a"u vR 1HJ\{&P _<2zFnh,V2|#zE If$eV/бKr_KP93T{1r9NtYGxyQI Q vݻ(PG|.[Bd--#dG]5 N[sՇT~sEqi<`kCo2qۙ 3TT6G~Q\ݫ氒vhIwQB쐌9T{87Vā@gq0<;MA/IEպ^4槔&/D!JN[ VEf/t #};?ԋI($iC; t1a] >.r>Cl6OާUuyS*qhet+x̄8}OgxzAh |d8pS*4.9+X5?:&}f dz]=*G-zUê .fgl?!Fhs'29͠ Ycr;;z֟3;ՔZ*a)cʧXj4>hVk2{wCk-,սyn|;11bGnsYiQSUR5:yH'`yR{')Rʔ nՖَD(H{='|.=, MSCkN`'aS}o ?[(i{Km@M ixIkKQWQ #-gNֹThNZDB&K4t b07jG9-a ⤱90;A7ݫ+?"{sqVyӱzm,Ȳ맙_ ([un>\}kJgYA?ʦx>,, 5ʵQ3cDiMbj>y+!xԷܪ ~ZjE+W- y`\*n/PI5)ZX}s)}>ȥV@*0:L: U~K]/8\uzok |~7->QTcXKrTϛsywïe 8_^Y"}5K!]s(mώ/!IH" ?;(əܼ *u,td _&{إVz}5 *> Y;k*#'X[P_ ѩb,0|E!bqԽ=$ yن7,1S^-J165yσ0^>qg2.[lNso}L̪:&6(]KOUK<8'CXx+avkCW5OD/?`{DWt ^kI.yjbȚ4;"|k].V(,&Y'lGmD_έȓYb yMQqFdy2fBעơ㽈㷇}ts!W]'52sTdcYpz\fI̽\6V?Bbd誏E:Ė9JkTsD@0l%:J{_#~cUkྏZяA|2s;]FW.QE`=~`מ]y4[Y1]"r(OxʺUa"89fR/ݧt ]D$ԑՖ,PЍ? 4Taf%^s <~Ƙ=][j.Y& q-aWo I`΅P.o'Yxݳm7&OU#WષPAaĖ%SՇ"ݞ,R^x˗Ke|LPFk*qsO"}\ݠmAN/%/ UM0tX{iBd VG6@(Y qyw7}Wjc~൑=fHir /)˺:G,X*rP9-19PD!́7[Hۓ w|tv~ fm2\a&C 8Dӑ8TVY 'wH nիp4ԙud䲾g4ۗf=Bd48_?]^QOG{hpMKn8A };B#*S湌eūF "9,;YȲGƊ9s<2ݔ'H4LL`d9gTqBZ\OWʷלf8j¹!1jE|@ yx:Qd/`W8u^H#|)nfdγwiS&v%VS%I6a,Ƿl>qVcSӑ@RmT}h~ ҶMqI֨6i8D8c5O+?Şs Pbq>zMqGB YsN V tD>7tQN!{DBQph;+ ˹.of%>y{:b2D; {6|q4!93돃׸<:_{n^B)(56Mg]߮M\(pSzO#^ IZiq{<#6,Z>8P-%[Y}\~بB\ϯ7(Q|ެ)T<, G=ѣLʫjg*U?E!ļl•'Qq){}@pS/6`'pzJuk" uomzk֞@8oh=NG^g~[8%SFfx ]ܧمy% TuCz֐]'.*/qR%#)mPOf5XpRjPf +l;HMor?9AE2"yb)V$)k c05`'9kBJ(PªạH87HHT@oo#Dds8O.>͙}_娨t1j6[>iаr^J@.'dji*xC&!א'͍H<9g ljdnz8)tsoJcޞx1ɝHM:;Tp+ެ82l7:wKUfޅuZ&(*C= )Wqηo`&%VbH:`Pkpg?!űATVJ<"9QJSVȇ7G_ ͇E32„ 聿ue3aB*\i2[`rҙ;QYy^<k{BGpk@ Y#!a_qKND$V*h{ǻV5c_މE^3n<ͩ_VZ_ֲsQ}]Ѕ|:DXfUoN3[Y zr%5C#ـv;0]SinqHu3.< LT"&}Q<OKOWL=\ϥ)i#N'$.ČQȚHY'̺]HE%yiqz'Zg(SOZZ%Nb>3ZM],kwxqAنRѦNVb9nQ6Ԑy[(DBjD:>[ BE6.цzHSr9R2=R)fb)>ha ğ waZ s0''0b~EO6B1Fyfr6xV(#G؏YI?#,M~caH}IWt^',A džľI`\%P|*l7Vڇ兰h3=U.p q*d>Yw]7)xY:Z?FF7~KhK!]. ւ3n4'ev/NvsnQ`Nk㜚+a%۶mĶm۶Llv&vvl{o?tUV*o\m\2㪄_$3ƣ> dM=֕XѲ|b|x{dSL0 H{"=`Up|4.H3c2-ƒ5rC"}R8pYt1'C*n\7u%n)@i.^QKY A@L< 3uS7W5KIxh4?p2 x? 3R'PE|+787%JM?d%p*nW: ?O(t7FL"bWo3LzG/wZ{ϭʁ%yTW}5p$:6۳V_s2} _QE Xݾ*YJu^)dl^>(.5[4gB=@to] G\ IYXر+LZ i&D|4r?g.o[j71\JO1ť[D2eG9'M]ܝ[. ?m>d丷bn:HCwӛZ3G^2 o|W|I(ɡr3I7p/<VQ\m2|r "Nu!m UJ4;AeXP#ЂTbQ]qBgP],"#o\UU/<[HLH);qv*;oӘ;>wR%yl ZJ0tQ2x*}cηP=j 4΍w0=Џ碤u'Zj-3!^=gsU _~1EcmA*uplQ[g{ٸczO#:_? r>eRqly*R3[ =\_P7Io=@'BՒ)OYahlda_:"#[}6Zkl d$Tqlwα;{ M&h4眻ot݅,'@%|GH8O,V´i;Y&y!w[ՈWQ6al᳹OeLUvħ+hxQ4!Y߭(TH}0 0&+-ד5#qpD 6nFa׉N.8wŏp:N輜&Fwܾ'A̽".)u{ZKM-\m ifnʘ9Dh3k6yd}/EG2)$YY"Eqq7Rz"  ƘqI]%~ğ,]I=@[Zcͬp9&1_ 2~6rB֙ 1?v8ZW{4$NRR,j]mh ѡs?aTbg KtgrZ:e^!P?/ ߎmŅLUU} Aw=O=nD;iݨ*?r&!]GשG{O^)Huj^^mǿ<Ѧ% 7B4cҎ_ilHx^<% آJ2{T@1p{TݖF%/QtJKoj'kNHɼq^SgC69_s6*28Pqs͗ (p:[6ishW)6 XiOPgG%*i?TV% DsY~>O0>Ի"?jHM;N+f->%}䫆! @`Xi=.Ɇ gk_^R;[:& ^E' ),&? i9آ b8k@#H!1 @8΅UYYJ,vu !%zY36)W%*zYLYXS[>.6'T͑9fzk'[P< ߜ|Db·S̈́ZuEc}&i# S4!"rk!e 93P!\yHBo?B9RGꑨѳ/ƶ.Ra0?\ _RAmI[ tm9MV%Yc}3ꊮ:>.U5X`DKJ3f#!WO0/^QU~;ͤK{"}e-|S.gZH#FTxGp:4_UWϒ34VW.6 ~HJ- ɯ+Z@+ )B]Ȳ8f82\ҝ=fʈ;zh*嚥dr6IL8LV`~zKKr+scQB9]=q> /x e%uX.24B 8]ٰ>6ft7alW֒B[QRkۈF  #%G;Ds~sƶы" ˓r) 5c''Mɬxv"81T&{uZ`A{*x' -`N&hq>&+vU;VQ~qؤBˠmԀ8DZk_~ʡ_j9cq*op,3+h޿P`\3" Y9UP#Nw̝.S%%8t8Bt=bXf=\ G)x"\!Oϯʐ<޸55e1U l 6#B"^5#-V}iƸ).F2gz픻@78z)S6& "vdS7 eQĦB-l,|!ߵU헿3[л}?9k0}HqD`zpH0xHc}Ȃ,u/`zƟk.(^$k\ ߘ L q4CZfli2ٜGCjw^DmY'o+1͟RVyE~mRHcLE*TtCC )RJJKaf{tZY@.Z9|+n{>v]LQ(z~ 9OY] kPv>xl`PNP3[p1K1.DgSCّr < LAhV10hmvS,%Sv_øv@Ї;[WN P`jhjܰku[ѱhaN|_V'[.'@яa#<%qAD͎1PRZ66[wȘ-0e_$DFLnrk2_פUؾZMf2[ll]2"gq^LnLJ}''lX%~n=@gboktF_H%*L?eTdd9 fgɽy\ b>&ȎsepUs 0 Hƒs{0ڝƓQō)0'8ٶw O:{hw4ĨevOh']ss{5]ao_%TP!chu1]PGm =Y }wtuOW}'66$ZT%ݫʥU%R)zdf1.x|*UISxdd4.VIcotgs_\.N\+W}R9S.*bZBhZ܇anE?LT/*dkU@ߒ;cD^)wy^ 6 \(7#]2羯 bYR4I[ Q4%`"x8i*@~glMiT4Gpr-*ؿ ZwxWI#9>"QN=B(Xؽ6Ll7)}_E8jS@WȠGV? :ޜ2zN,ҌV|;E}V>sDU[;a]߾g(-]Ge)#(?GtO6\hm֩>pJ vz7f+ܽ4d mߕ_9șFcM˽O1'e|By4F]h#y}w]N RUy/G ~:$)z{ʁݙhglrb`EYgx𼆃._Zl玻Pބ }EgJl_\8=l5/!pǦ&PuGfο6ʕⷛZ6ad-Қif M{rjfAmz=*9d2Ծ9G1W}a)xi#$綶ƒ 8ci) S` Y1ƀ.O?V4i0"{C45.ڰfmP\I*Kj=pz8h\GrgÂo+Y-72S'q U >PR̟߳ÊL2uvJwFWHZ\!ZX7UyAJe𞕶(f,IԼ][1b~y@ 6Y L wH9$%5mD2h7qb/8xpZDABOsrұAM_骢(kqYY+ןEdpi")p%Hef&1|oو@Zpz(V^:B4 b2a{=#iD2b̘1ZѱwWz3 s&U5eX*>6C 5Ӄe@F_Z5+,sXwtOKiP ᜠyC~Bni CL< zKkЀmV4`t.a&#?;i_/XŢB3{ ]^`"$)QAsd̶2}K% T?T2Wv@|}# D=$ pokRa[ESF_bC]Z+vA$f ǛǺGJ1,iNp c>UdXJ7D& Zj;~#Ii9THÌG!Eʓ" V9S/ dpu13!˛Coech8olmq=&@kT=T)gн9\6 ڎAD/,8!ip+60k1h2NKՃutȃk)oןd SGw h[pSɺK7g:rÁ42 A7@=lZ~K& E)NуkX`dkgjxkK\ٮ0XBō+#c]Gؖڭ1$"|ko5&x).~OənŢi|8K^]rzyf8jg7j m[p-qpƌBOysaS!8{NrIO8U62m9c1.fz7*]$?Cq1Ŧ1 soY63n"' 6~?CMG L!{>_Jpy0XOn`CI r^j(\1K5QW N'UijpF|L_Wd>2pR2d0PCOvNb^- ȮNY:xD|siU쥀[i/.$PTrN|a&?\Yqi582 U5{"&4bAt2M "N> ;^ӶQ;pBp(/V Aj?.:DS%\ǚo`%+"ϖ7U5 S <gяF Aǚ*"~Ġ-q7x!^ޤ R^jڛs4Lg;O$V4onl:<^ub_)@[]N\ j 0IP5a@ ^N\vF/O n2 @_Jtϑ,ʮ#!8Y7zTAeU~1AnΔYm鈒mt~phЫ5gԾy U/X y Gz(sE jLsu5.DZ"Y#>L _Xo=Eo#ȥ5zw_^ NrK0 eݼFs?[#TLrs)b;JB*wEI2aZzZi Ĵ N/t? ; <hmz"͚tⰌ(iHk/RJ 'l5bOKNE5 4팢+vDC-M#ȁNCAP,V0Q+]l[u5oI6`o J`J{lfV>&9IZ}v `s!ɼz$.xnͷ:zѲø >/inO juBȂCDOKR@JAsNP HMV@HL6Ɏ8bkBD3l^tދME[Jp)gs֏:({: R ~']RJgAn]m`p„UMώG˵S7q z%?^>b˕DrYqKd0A".Sp6~t)gâ(sÜ;xLxd>\HEïw>[FBDYnN \8oɵ3N.ة}'$?=FJi%F^jYag>>fpqWxW~*zĒX03EάHBG cbB4lZ;M:9Z݈#ċlGmDVl2g+bW,n}t$ŬvvK2S~$,A&(ީP+ 1ӓ fQɞw QyQpqC+/z1Aw-TIoBD3'0BpuO脖1T}+.3V_U.+S7MU7}E4K>Aþ| w[茅 `tF_ v;6"ɗ"I,u5v~nuK9ՋRZ;J+tYj_Z~e}2l%RU^f57|'Fջ7G6al Z9z{}|d)F9w2fA=›EB*2O֜rtQ_,A '9iHAiyKK#Db_޽;w䆡SH/iELؐ XsߺISG9S d@18Ovil" pXa>{M\ +wa] E[*,!TC3?& X+A] Z-rW~#>2 H&[d#5}p=ҵagf e#!ƄjxBbL]R4~uEY^ednbwKWR6C&E+dšYJi[W¸ endstream endobj 46 0 obj << /Length1 1831 /Length2 19812 /Length3 0 /Length 20977 /Filter /FlateDecode >> stream xڴzeT[-Nwqoܝ`=8kvQ$*B&vF@q;['zf&-3 2OA!4t5t8 NLL -h0r U*ÿE;! 5Rٻ;Z;JO'ӟha+`hkfc۹+-Tv#) )$U89U5 :NPSQ }oFW}'\NLUHUKQ9.@Gş_CMl*2wradtuue0s9191[Opsq5yw?0ڂ6ڼSw'w"!XYEEY0K|  ?L,vgkm+fh 7nlA 'S k?kfaNNH^J\LE^lٱeprsO>!QY ޤb&"v66Axѝ7a051ý=3PJUҙLfl_GGN=0=A.@3 )3sL,[}\.ekj[iF}NMl&@SxFy;3iUKZH8oGC kt/ Tv6e[M-o{ ٚYߗ/ڟ~gd/{[[A _&;?x’*Ҵm535s  {&@`kwv9YPv7Q3Df#"{9<oZv3);;;:Ol Mӿ/Y aa~U79C'G 7f~׿O? Pk"-ZX͓@{33 5R݀ vƼA)!>bSe 'XqPS89?I~vIEA֯-7&J;>r>HbBc jrK~eԇyZl3qD#(7ԫdRݲֵ\h9& Gk4%pH^eY1i.r}s4oӘȯZ_{ih;GW EU1p!Y8Y8BKx0\^EhXmIKW"TZ!\ЏFB)F*ڍ6ԄMpR}2b)R"JlT̓; |3eQp MtE~ ;e(MC!af:WD@)C}q]0e?q31M/v@!.Fԧt:IxXK!\[rΏI.?:(u"Mgqxd,f342 ^lF¶fM_u2~KM@|VfY/L4?X^V@Z|ܾ6P桥HQSܣ=[HT{*\3dst4Y6;bsV뉚P2P7N>6K'.d4?(yДn46D"wڒFOmv|Vo[Ln0'$ MAՒQ&7Q^H֘)*zҽ63VKp\ɨx zPhp~#ѠVlU,{7ljP zֽ LjBCLzGż s? #OP:NX+nN-K-aA{ؚIIDBcBO82DVv\6Rw&JbV*\ie}$t7Q?7\s$v+zI1]sQ.BXD991Zʁ mhB܄=[0%^BP`E,SXy+\[^֔7zsDM\Iɘ^v83Z-P7;̎D7cp8YLID|H3]%b8 +T]`6a:1$-:7mY['ZS]P)(Vjv<^`+/4(>n\ש 1Uh 6gpR)FJ{0) zWO!r -;o+c1v*fr8Auͫ`PiP!~7s"N^D 7zE^bT: iʜm-ZW:"#n8BYE߅B6K=yI6Z%3|@Dƫ{*-v~*}p֔?)dr($pجH,ƘeC60_*Ñ޻BA/?IuhZ4)5WȋL'$*!v)wɪQe\dr'WXL~C8i1lus|&x4Jlf5]a+#;*/,}ݿccwdLDztqp= GN( ʏZ)Я_"]JEם G+8”0X/|ITɗ?&q㇩~kTY?9Itmsi0zK#I_ek`_!F7PL( !cT¶Hl^‰y>]L8u:?k9^f]j  iq^ZI[O *ZPJPɭyڜϟHLKRWE6D @E|dJ9l\Zٞ3OjΉSH,ű(r*nw49mce0?n>q.i$N)BuӡK2߳/9Ԓ%^T.cѢ45VSFO,_~%z=#)&2Uqb,ӌ4`|^A?$ЎJcp2_  O׌^fpm*^3 V~sccto sf=YP[R"1+I*W_bb 5̫:9%_z./ ZâK р~&6CqyKӮ{KaIC4p|Bh۾@ۘ߇S#]re7jdE?^8ٮv}z$]8uwJ m`vF&{'4'显2a&Il0G!ͤ{#Yfh|)6"wQCS!}>^Qu%Q`K`c?Z.Ef=%ޑHN/Ϗ1SBZ"ӣ u\_Cd4nR.34WxN FBYf+G\F?,f輶_aMf Ng3?l3ĥ$Y(NFH3+6bΏD&#rM~z2ۓ>9>$ +I,h >72zO[lk) UcN%PiLX ^lK07`o%I=m!}1~hkjt Ѽ_]{Rrj+ s hvsYuٽqF×% =)D*ev&'A M&En=0HAnS_ʐA@I_dW0Dlw:?!4>YaWNdupp$ wv{3zQT&?)x*}[ihcJςd`04'~!۸6ȁliC`- {!f(\1?6ՌL|r.ANw:IVf$u,$?@)*.,, z| n/E1:qg:b2V{_~b؂<-)s!o*d|3}uOB7]AjMw܋`C7:yĐ &ȎUضo 8Z#ъ3`,!Dw1zv]ʠWrO9а@՚Cgٴ/ gQ - /R%N.-y:(B㦑K +6gG6A,BWҺ *kZ[ڊˌHwnE#%cQ ~v4$ 0-jZQǛxs< m.n p!=ʔcqڃ@m )67D(Qʋ1C`6|mmI mAbZƈ)/w4kSY!ylX+|9J |HTTXjB׮ʷ]+[ ڒA;+W+^^WH_G|DwTPBhMq<|_҇;Y:@HFFJ#U0qDm]5/$59>I]rN b+y.A}c`;U(vG  0Q {͐f[x$s-5'[RX$}2$O'm|-J?sA8riAjrub,jOAvc nK0:jE*&Xa 9z%% YftizzX;;jY:mp%b]uxK&}[Bur2??+g!hVF \y$t|^Ti%m=$\b9 z~s~`سtL|3;b<3D+;0G`6!#fmVQE7\ԅc~TB}ruAvvԈj\YȘՐ\ 8CEOznARFb\s4oo'~UCZtg)ox-(,xS2mOXm?:ל'5utQAws}0;/C":r^.ԅ^];{,DHrIwȶ:+}+T 6QEO0q'K fcvi ՠ) ~xmq%kٵIO#e{ݐߑ 妹WӐٌs Uo JGS6i*J[|Kо~X+~F.ch-0a NRj/ 5!6 zSЧ\%1Iv(`|=Ca~<ٚGYwqacQ7e @hN ,P0e>l="d³yZD}*Eݎ7HF>7kz~%L`fI ^ӣs9qR5|ko{m85Qk>Dӷ9TkAy&E.rmAy je&Il>/p1oh#V콏?"rU|xXsaZt!_l@Kieˢ;~6 F zYHn?^L_>ڭcV`cG,0Y9 aRsQa3E--s҃k&t9Wrp P!"BL5S}e~1 \G]OMoX"6K0AK7<@Q HVΞ⁾p7q H|gs{_*Tv2Dr=6;QJMs>}]*М U8G?4r9_ RA0nE{5PRRt1ᐍ N<.%6jĆuR`uŨ5hׅp?Jb%/=d;XWϲ jF/ikv~K`+XcЊԬM<~R3* S}э6d`*Ǘ#_l[wJ+HN\1U]59-5W<x il3$8 *̺r8֒X7,bEQ<.y⁂{lQkoHKeU5t8bI H+WU|Y|xTL-LspةE5˽dvvq]kv 2vƆO FZZVv|i)F:ؕ?,tof~Yre\Ohl <(ųz3cNM>􄽀3eQw> #FJ"8mNFD^j05:aD#5ic{?cpIfOU(A@J:uYU1iԤ!Ky,l8uF4b7 鯹>~>&sv p8B[y d>.kE$P 7k;qI]9"C6evX'M${_@yAf;*QU9?P Y/#DcIj=V+-ǸWAigXb u?f0*2CuNg b;V/+Imp7ĦC 4U+Ey熅0,RpUHWuaR&!Q XT71pR];G/MZ˧B._,KIu}).t<6VMZS( XBᲸy⌺0" EYF0h~u;AJk7@H3?D  N\房N2SΩLVzìmɤn%as`C66ݡfF捎Q6<&}U,hF&T (D5WHg/dBңZ˜/>/\ 7_ .>e)meo0M.Hսn#܍tMa #6L$7KE/Ar-7uP{ы}ʄ^D7!t]'WQyW\JU#.2zah4ÑN>"GCԥbr-?FǧdE{v鳫WY {Jܶ#15Kq_s3[&gAllWبU:[kANر'ފPjZÃ+*RUZ !愼Or_HR=wyκIQuߤӋ46ߠ=BƤ>ⷂyu\DC NA#yy_;~ndb7IMXf,tNN'dP0pp UF $-E~6|d{Z嶶&t(6"9",f|uf\ӫȗVy-_T=5"̄M0{Lj1^'L iAA*!?Ɩww©Rmq,Tya`MxahryҫuPbpV--DzuֲI )BqI5#Q01fJb.Vq{N8ǩ[a-A=Lw +߬5Fp <>T;]n>'jw7siq2;6P͆5#c*[SU~ww) xҒE=ղdE!:lt$(!6Hfz#_xf_eRDs5N4J >Џ# 6],f_@f~*SOy@6sVoyN _ @.`oOP?+"u9.Cs2-{*[94Җz p`OR'e}>ђ^_s (秄M PƔߕXU`Le0˜]ZCX2;ך IZ֬a&6SUZh/E!4lMu_v+8vM_E!Fvӡ&vu͖h($t{5\Ve ~羦͏\_mOQ4cY@u|-#j#|$V1:M )mvsE@zN1#U[hSl $]o/<Ԥ q#>C^)!ZRT؂qHvK-Ħ%d{Y\ ҝz'WN|VFU$S({x_"ґFdL/:ͷZEc^ȿ<\Q7lj{@G\5 C15ٰU|}?7 _p Yf"~ .Puy`X+qS}!Ϡ1b䲺cO7ve!ZWZ 甹e,uT8EjdݽCZ(\\\1Cl8zJ8Y)M` U:Ig)Eq}^zK(H8ezvu`@[/HS1>9~,0KY9Ju۵N-duVֈ%,bB8#J3@` 9i`ӻ\tPwߴEL,EMA'Q & ")4c޺2n=blT&^b$N@"E.]T}pw3T鏮C sG/+ԧO c=%͢$ȐKQvK|gAr6IIެ-nJY4iI&[~Q> ;ʙ90R:/[rԈZW}U%[ܾ7Ob/n]wd¨9hY\#m afs} {k]J8#z~pxiS:ΓEϣ//b>3Iﹹ|N=S. CxFVI[h-Rn6O܄0/r{f۝r7s<{s3jvc XBeIU> byI68Ɍz.ӑ-LAZjI;*0t7׆=ҡ^q/%l()_/hΊ4N=@ YBԢV+6wOd#M@ƫqt/b,oݕu%w&-NZ+Hzwp V$hז'Cj:"W;5W_.нCq TgQ)skg_=043,~j!k8A;H--=Us%6:Hr؄4qhnv1$U:6/Ǜ#nGM_ Cez5EcPѵݭb̯ !,Y,fF(# K6PA~8<8[y­I ߟA2p^ K9#5<8~ FOq,NR:`u*qJFQ>W}쌏UR[>3% syu,ɢLo}* q>(]ҧID"Õ/U '$^ [{U"ڑ[T^F ^N 8Au;.*ʐCnJȋgtn5ƒ)3TJG=gAP# >&2I(Dme_'q(i>#Ǒ fRiG.gج'l0 Corzz^8|Zrzt" D+/MjI.Y:>͜:uX̜ VJg?Vqg0qw o5V<31y,RmmT"m #Bgov_=f[9Ay̥BF.Gk{-5}bZC]*С殺. DG~Uܱb]IPSᆁ9'1cEꜹǕLjhh_z,G_(~0z4NnU4)'޿MSrנ\_+2 tekD ES"]`J+Z ¢:cTKojڎ :O V:}W9u8g?ͭ`7(gz#Dm.ف0\HfDgFpR: iI`dԅ`ꚦLUc‘EV mlYD]2(aG ʲ֝v8 C=/ƀL]ˍ0eaʴб#kG3I3k'gmK=bmNt?v(5'سU>׵\-lcR1J"W=bbB5篙Ĭo~VhP7Gд74Wg6מ!o$$':j\ީ((T+ER Z_zX~Ɛ-3nS*ҝXL;ghGB$2?WS`}y$2y,5ݕg\-HQe9ھp6|؏fm'aQܭuw%>UC\u)HD|5U4qΚ( As*ORGvR[C"i/lpI#Δ"pw3]@06oQ6F&~$wz44h\W1t;38@3_}@'/ֹK*1&sBW//2bOPnӲLxA m}chрFB${tx ["zZp[>G:hU6EQQ^.“&.)9oa8X1wUܟ|ÖLy]TCU捤Ԑ|g'[KY2-ZCyİ)^JZB:qC EH8 kI܄',% ҁʪҜ"hn24Nļ {a۶BSzm1Pmf]ĝ\˳8õ)ُ۵Z1݃%6TM/RtSi 5 z/C t?F"q,IH%Z u'ga?ĨGR.sɀ&Y@_J#*ԶyGn`/"AN̡Y&]yYJǘw^%5ݏM(4VOR ُPhFpNɣVeK0gi켕 1}, #=yR7l7-ǰ6?2o7QիwNp0* }3*C2hњ熛-%e"^Ѻ4:1c ܉YCzU'o2Oں!'ޔGe==hλ9K?ɓj"ncy}ТU?0ЅeZk4nSǵlr[]}Rbc7MNN,tkRIF+1[I B_[Ӂ(t) gFz;Ӫ3IcojGQ}GZDq1?dD_ $Gn{:^}εL2ǐPrkgO:A Ni⭱"Ło\XXDqiTw/=R\ŦSe. nYaҮ,M7_9, #:Lq:;9b-d\;ƪ8UF6oz#?^XLUj>0@Xn^igR rKЈ: O}\mJG t0ǜ*&{Q›&0CeMN2lc-.ݞrGuny`Mjvf6i0BPiVCF$Ukڶ|ȏ}0z( 7(Dky:$ZFiZ6X끬R3ku; X۸W*B,'MWJ#C-n@S&QEnǩ7VeG7 ALcLgWrFrfQFoprşc=$kHjC g΋ _V@?}]h$LɊ@q륐TI؟u7JxSHO{hr.`鈒_`)̈́I`) } Ve)Zsj4FcYO%QH @N]qz4 N 9lJl=lz(@kXzR-[U _| wa\=`:zXpC3_򥊩9EP-"w)c& KoE/j_RMFsv4s-ќWYlʁ g| Ołn! 1FmsF"y_@S!Rf`V'3EMG=v$mW{/_=?}v3#$KSCi\A@ig<8vE4Mc h;K"n}J:Z xqUJ&2$SL@]xDNYP ,ΣQVPg%饓]օ3B A.w˾='=|(TRq[Ř]٬+P 7gTPo}tPCI7~;o[ 6\B=J?l+\tŬLiaᙈ=@`hKbCIF[d 0~D$z m9 /? {P z<9u-o\u c!_w]őgo(pm*bclX&1i'! EgrY:8Rp=Ҩ1,= iq2gV_ZδIb 2"-U.>%z& X5PP|>m,#0z-swn~Nt}|\P ()xG1JQce]Y}/D 6L@0d×zQ v('3 @oNn Y""|ꥒEiPow_.@7qغwGn;:ѥId^WBPKTcgZrj-Ža 3zoKxf INwciIAN"P+oPVՅ%`ĕ!\;X tҺa 9qc<ͬb^`ugX˝eE"*˖YntlZcLQºͦ yS37n3Io3KSR mIH+&+<Rҫ=f)TP+ȴ#ɑOGH)쯈0ݛ*SX"C}WO9Dbv/GFy\r(,ON)c 9O r1P |x$9YKTt0 17.uWYu?'pՍĄS}thxE5V3+ Gr"Qw/]{IJ];> B(vZ|>`?_4IE?8$_I ke4QJ; ѕ$I8Qpk_]ujF:w$KAӄ~%#g5力,Ӻfoo߶$HlpaQvgyk U_%.ߪ BM3kP%,|)XLCUIT~:EmX_/0=xmYsCyJʾ?fIO`GI 05=vXZJj!v{fxtݖ!u6bZƕӟ~wz_TDdP+gmhY"RW`HݳZs2]I6$>x9v+bW?->3"İ1LtGgYbҿQ- @ncT9 ^c֭x)ߏD3uU>e?lU.\9$Ozi\AxaNkG\l@fXYEFс+lYLזc4MZh =7yBT(.$ SQ;:*V6-9CF. "]ʈy"y7l8gOܿ([puV|,.ij9|3b~9yϑ?SH4-ӢRd/(L /;\6hm#5%Rӡ{- DRu9y{@Ylx NZ z}9\Iѭjg =Z^ 5S -:t\D.|kqf߀cǸ8@n Έ T/eq~9I;Oa2*zp7ZZuNT GR1s3w Uhƻ +#~h4d싫g&}$lL%j 099qq*Y޶63TA-3m tu& VF%,"6vOv6Tn¾4G5qWHWS}BP֬MyqIpOMKh.w#$Qմ>)_߉Rp{ha^ՂQ3KX _0*XWf!9WOsqWJ˸% 3U|d'wCL6AmT[J[}wC \]Vb ړ}[- 'N: BH}AA&(,793 fΌ[Bp55PFTI)fg3nWy9@S1  T5&F4z2&5w]7?p}ۧ*{|t\O.ǁ3hlKvlu/=t+򖢱qIu2̫L,rB&G9iˮFP\\,EŽPaCLl3Ze K`€)MvAKyŕ |#Q>F)>f^.јg/`}΍̠?l|r>Q$#~sddžYOODR31,=ϠHpWjkڽ5՟{7htĩP}46xB:; mےk||J?Z}"GGY R>1vFNzQǹG77]S;2W{B?\reF+pys3ݙT0 \ýf:ybWdZ+݈͌< uP_#XfӬ/fPnŻ endstream endobj 48 0 obj << /Length1 1898 /Length2 22742 /Length3 0 /Length 23934 /Filter /FlateDecode >> stream xڴeX۶6;S=] )ѵ>{ߕIrc|?,@Ç`:([G':C5H"bk`nj' ݟHRFc,=@Ch L&e:@EILQ (DEX()HD@UZgeSZO?bB bL `/nj`kW7+)_W8 w?1788(Ӈ}OL@13pWFAA`m`n110t2prv%Dʴ< \{ l=Q\s+/2G~Tdž/?Del&.6GZ[vS>Q:9:3micj(LmMَA()?"LNFt32c~#f#(mnxt4pޞT'c9}Ǹ]ɿT*ǜX&p rN-AϤW.qg++9k S646rO2QaK)g`m`_:sGqs7ߥ[.dB6VmKg>z1s|٘KіF6@GGnB `PRД/;1#[csS3;Lm tY 6N.;g'oܟ eg08 _qq ql>/ ## 7d0C#?GxgCLH,?+9.oa%'[K?Ld ݴ?&C;H@'Ga9L,,ټs?t-X$M$?-WXJl& oM#Ϸ­ݦP,m)l.H*_vb#\i1c֎wDb_ͫ9L Vn8mmNQBK3A#RPv]:h*?7gwƤa[;FotLdӦyuJ.e X&PYf0Z6&U$opŘ '[Ⱥ K$m_y$ț*[ƻ$_,>}GX{QW2+U/'!;ʳi_>CT b7\pS&\ZM1Ur "n+%pӧ%UE!(pިRd-E[+_,1ע͠6HGU\½DMp|i]T c5Z[C_wF|zS{wVM?b4C[i=(Ov>xy0kEh))D؆Pf00)h75o\aʚ {cD7RL@ӶTRC(1E,A/[ksO+`efY$j^߼q>!gWN\5ԟ,0r!I.u_ozv)ISWw`%jm;Lѷ,p%e#ā1 $#ʞ[rDvJ̋r?<=4w暷"eLqʚۊ赟:{)VDS!Q;V ZKLsU,^P*6SF,Z-4/o;$ ƺhd EW ΂cOat%}4"WƖX$2g  +M  ]<%u5i;no䪋rkrlB 1uF|Jʤ`f~ SM6ڢ+tV%6lZr6Al^X&prT)/#+)}^F}V6`Hx){9QTub.8J _i#'{5p> DKs%Ln]`ZԷ{hhqǢ9p2܍u}FTMZs-s4%Rtç ~+هAs0Ta|\{ª[_{ 7`؄V`aӛN!.'L†-ԧ/){[)n^얏U[Hh /󘘬gvN<:DQE4U^5J{K,Fcc;~RK޶;Bܘ!vyAC[W[Vt]h?ať*Yjo{g91ʅ{O|OnJ~zuC=KV4@~~?0?]b3j)Fu9,X%m$=g[:̒qa7,scb}7ŒI) +% ! yR܈hXVS^=Rɹl[u6Cc9bʃZǾߺũO|}Pu*aH7Pb=.Mɉd/ZOFJcShi=GN K[e`{U A `a`^[t&?1cPUXM|ų${`)T0"!Ђ8zܞRݯKΌDZ_97~NMuۀNa=#Za&.^ O_N 3|7=Z˃iރQ9PJcoP ZzU#@#X=&> scI `;:g֧VD$'6g3KCO@` ?XX?'tԒOCk_"Gɉ޵9^ouYX}eD-2R'vS$ibʉ+kDv$eܮ+?yuaj*DuB%B! fNyuYP\/8\%nHQ!OgP(ɱ²$U<yjZ1$qj?zNXufT.w$*/T[edjVٟt\v oi\׹8ׂk 8FO8{(23Lmpi0yH3Jz-MKNuMn >qV@Yvj5M`Tj`x()Tr .B_+o^CdeOA 1=lU Lwal) CPQ`ӏS~T߸4ͬrdt-ion٣# |9x3=tlz:qLW2<9u@x yl)`LQ-庘5~;䳷흙h95x׵ϕØCEGo]@U,~*+Kp-с&Tcc/X=҃qq0'rn/ 깃s>g{1W FH>wdXPߑ}ĮA4hy1M|lӴ!6KD=M?06pL_>V U!|>)}k<>_Ո#ëd(tCSCoZA[#CM#K dU$՚PS&ctȹ/xnGh4Ypn@' T\nIŨ2hP UzDhkQ]2 ȿ_lùH=n ^'4KIfB+IKe GSOh@YjПwuŰ?6-x_n>xzH;rʣ{ל$ѺQcrK,#;[ 2u3~;q~wC=4Q*L˴RwE,4gU_Ne'sJE+|`j/ZZ'/}ѹ>P\BC%>4GB;=zy2 ,5HAn!{{?x!Zj!>2#?  {\Č1W BDjYX$jW)ZI}Z+0魚1CZ?kFY9uv G P}\͊6L$3꯲6M=+M+2uĶ2GTUTX 1א)(DCjQ'CWްI^TŠபDŌl}Iߛ]4OF 5[b0[A귅Nc=$q(/`85'nme֭źUqpFjj4]S+I- Wuxa sW*q"?kx9nzkoi ×a6D# _lnyx\(lJ^^aaXea(x Ugφه?p%Dq]YuhhmbJ znR'Jr ׄ-؊`2d~e!.Syx"Bvϱh-%deTڛ|7^9dβ`8ΔV]E7혟M3bGh JAIP:H&e=NJ/ m*YaP)\JXuWxnO̾/>Fs1`󶼣OVJD P3՛vy[[<OmO R NEt8m@:ڠ"ClӬbU.@R;hbэ &*Bb5=}9^fN¸_3486VXvݳ۝Zb֌{Y~M3ZmEl/3+1N5T[=h'1~Kgݣ>4Fq_Tne+K ^!뭰 :!Uh ʓջw'"ZJMܞ>?]t_,8t({@0Rmf=ܺ>3Xu3.r+}9)hj~?` UA2=[ b-7.Uq 꺴L o 2-VˁKa3/>bDJo!eۤ"|IkKUc>#<-vv&hGY _D=K?+˭i Z%|?w`j5${5@I|cmY/Z~t+E|P)6N6IL$\7Z0;!(6MQz_pS=ɹnHF-ӊK!#^#sSF"+d.+*Z~p\,)/-Zg)h݋t]oˁ( mn̓z[u hY8Wd6٦Ʊ }wc*gɱʓ?IU H-QMnCbzidA#КӿT>.}qu=QؕMd;cxg0pޢ:~CہkY~]7 _o<'RFA1gmuޙ7&7=0HYf/J-/rte(d)xPaGIlO!^ZNHgx[ighS;xa01[&3MaN.9[-=<DGD6KXkCОh٧Zq<3.N ba1І?-w5_D69 Az($PGi7dDˆOQPQ˱5rtčP*CmQDtfߺxVʱS5{(G".2ɏQ֥} nl9r'DzsO >Rġvc#rh&]+EdQcҎfHu*_pɁ dD y(4kSxQmP$(ZՕ`ͧ0w##sPˋMLfXr sYhԸh ޡ]z~:cHF&ڄ^>*L+o ֊V] ix f(iژdkULT4JsztyFFTp'kĄc;2 8I_i9 nFy"RMb1÷:uem)۽Wׁqu*FǸ(7>DFl{ 궊~$zaƟ:US`|vz+5ɣUjH΁~S']\/ 8;ȅsT"cb=^nв"Rri#Yc'4@W邖ЕN2BO sށNpF˛ &qZ,>Sg:&Ulj-e"wc2V0j=Q yzQftMr{ wϗZ?Žf8x4ZBxn@@7EC p:eb BVoo!(iN5&B Z&vQɉYRh%0׳b5ؼ1ApYI?@&\늑xrZYJO+l4T+ t4QGY5ΒDŬ} ?c^*'Hn-:M6m r@M5vL(qZǝes,|?P =%$dJsyu7oRdV6+@^ldoՔ8+*9(|/a2nL5|Wéa;8Iʨα;dݒVk%^Qo.#/SQĆrwsBb\U>B4ttc@uƸ/OUXoz_ߕZ}b%{$[^AecJj+vd rg̏2S'ZVRWw6S.ULJI4f: "L5! G}%u`vhh~aV~`12 >dYSP$_ϦƐfu@%i}~,x[y?]%^ޮ? _L }+7]aW*OF1K6" lcէMi"GgZx ϧ3G)ѠO2߹Bj/]6zhF$۞=9>9EmbwˋMHzEޭ&œt(Y\&)Q\mDW\:,rA3QZSҜE*/|=5XrM[;n*CRz;(^A>r{jF^0nIUQ S$R 50׬\; Ǥ"5'|ʧ']m$mZ!.~5C~ttY͏G0\ B.zhfQ8Hx@oƶEWTn&1ᱲM. ̲w-FKĕ$i0/7:0$?!b)ȾM[)M%j" ώQGn%Hul7a0|F }}l8X'5 gPehRFeI.[E"9 *ϵZfQ_-/kRy n[} j8ES% -ad8iyn,q(Ώ t"v(w*A/:UO& :Βۭ W{ebg_|\)E|G1#4;$$BQAܼ_xFf:t4xcDZ ' _ DRt8 E3C޳ܨC`me_lү=7B&)^sS{No_UeZ˱(sܫtzI~sy7!X b&{y_<&X$:yvXq*V$/KaMJ g=rpXtDse O:HqhKt\ʘ&Om Ea )J3y-JdΦ}uD#wSQP B%%~SEX Ji%c}Mq]jcd›>:j:l m0qKL8gLXB*qoui8-$P(LDt_s4i&/Q,~Ep'zE 6?qz+W W.w%sh\gVW`}Ň`.OEJ/(t*ItO2#e[#Bs\tτ6ʴ8xD~KTavƒRD˩.ܼc*B:gB&2)l;rmA{\u7Omn!JH3=@厂.d{:9,ΐ\-u:l BV}fϼGxtT %T-{8\[h}i; Gmm<i lgW]kMPҗ2-2fKf"],WEܓL!î p@^˺8iVpWC#JS䂃b7}b(Ѵlx' R7;J.(臙=] }uR)g)"C5nӦ_žӞ}( rAѓɂTΪhCQ\:ɇ*54:] K4vS=&yguQc#nS'.#Fq,Iۿފ>nHHP[L+=U<]A:&h}9}PUph$McYFcZe(5MK-JOo@bvXa+OU ^.ZXYrs}%_߬]cQ q5B 0{TSsO=p7)=tɅ9][豰IWFn:) JH[,r~*INgP8ZHN$s0aB s ѼwO-;o_"tuϿx9YII}KsbAFeڞk#?c]"8{>~DgڄԘJV_sIRaӷozsCNàJe?3e HD x-.ͅ1גF6a{m,if펯t$ "`@t)Fѩ.HM_K'XB;h"y#BdRtޓ5vpGND22{փHa+`4)WVz?CG#Qfuu;?2ӖO)+`~>%Dnѓ%j!F쵝 wWbaBIH _@Hׇ0]j(%Fn.bKd#PwѨɴ==Fy(\djFfEi* 73N4~^hhni4XU*ơ29k7%Ny~i}ev% iw&Rn6My%ˋӕ#l= C"vnXL dEW\w;5!\8\@ϺȦ#f c)* C ruh>dsߋ7Wi^Q w;<(}RA `UC]^{ƒ]<0!|A_zggv~1)I t$hOL#|۸U-9TT(4]ݶ,(ϢI~fUi=P:޶ "߈N̒p9y2del~[(@~W&%fΜL't7 /6574qAD$*U`5X7-ܬBi]a|`K f ϯSJzös>e{'kfKJװ"|c_лikg7bM09ldnK3ƹid\''N$rHI})-K|]e@(z;G'΅jmu鏹k~M(]am]9kk3UhTL:` G}ֿ&uE!'q:Bwn|qsT? /GO ''wЯ<'/t[#ʱ hMB :dox'wM{J@j`~?6}=XhxQw t(Qs=턑7R%R$\x=dT{fpF-r} N'/2MmJS9If>\=K2qK%5ajopH&`$pݭ'ժQ||\]0GGj7uXg 6!!F eE*eĉEYFs l t4tl;G|?\]Q}Bbx8%3_茹)FQc!;i-FzBҠO[j{DAˇ^b"O*>bK dl`X+11\{uڧ/Vͳ$ T]n1O3KwFS_a# [v\Oi Gd(^=j(sm HI<6[h.Ĥǥu)齙߭>вk53L1XvYe֓mJ9%EY,PeL]Rky4dHU8kZx."ac 9:Q4qNϲ=!;U3ȤY]2l8S' f{qa}{K6U"mL2>oÛQòz||׳q zP6; }SKY[-|{ʌ{eݗ%7Y[Sz8IT/VE]CU+=񎇛/+_> 9 -:-i!Ă޹U.l# 8!5euޗ}/az.I\M2tãѷfmqbH*-zD$}M9HH'# vL/Zxa(2pf2N{o[PJ^w<@w*|RP.7U9b-**셥ȑQkCxб!^ȦģسRS:اxnI&0E btܫ"7 䣹v akx*I_$:<;3Csyb[eUX J]⑤Uv#R9Ԕ4vx<h0D_28UNN^d/:P|2j:vàޅ*KJW4N5whєR*GMvSM׫[JHvQqDy^1a71=s]F7$/#Hʖ]ST|bo-ṹI`+ JIpI#zH"PXXz}\Q9e^Օp6ŷ9wGM9LrAG@< LJs:0:A! QWD_]C5a787}"R 8YA ̶_!.a.SC:m%o NLMIciE>0={t>1ʅt|hz RGJ$Kּ#!!۸1\-3s*>íDQǹ@ : )wضP,-A(.BC*I9M5lgURT}5+0?%\ߦh>de#DhVV'IƀFݨ톈0e 0B)RE j8>Y{"G|n{W]z$*LrK;4L)yLO$}z_Y0kYc|ʊOjlּcr՗: ?s|YǗUY>43B~IX5g((8ekEO%ژ֜m̋džYUmU4 VmbhȤ|O ݣhRIكdZʐh 3_tGW^;閬 ȣvٽ4 Z k$ ӄUmg.l 5 #mXrU*mB^|2kkK1Ѻ,ꪙU8%󂊔M.~&b샒LGB,ysO7_ϩ7 GӰjJ #:Y7TY7Qm梏/2?vOR8c~ 'T9q[HCwHХlZO:J8ozw[v;kĀ| 6݃Ż\w"|U=L$i٧,B:Y%@"'X41>Ȋ. v+ PqE3jHD^d0 ^5l9J./>i:a,?߽EJS3jxT5޲_~H EՂ #ZEN hZ2E,FJGz,0.' wk_`'?nkd 7C'G-̊F;i)`P]ڞWօjW6 OBcR΅>o[ &SPJA@h1T0WchH[i-8`Wr0qTV)5\ fCHǨEXƾua =m1bѵx??w/J%0#C r}P߸!7h$n?Q]5CPQj~!_AItq3:uO^k' Ҋ=.hwn?q.m!,XU\KnKceCC*!Sv/`ElIo!Iq!7=%ІR(uYv:}˺ěKM1)쥨q<晱8MhRz 1SIiqq4SoUno*!F? n :JylKw-:1h*Tv'z$'PO#z _H1qB7y?Q:.W, XVq3f#qŋ^D<zשYi-{V?aGpʆs,V 4*/}r=1leEIj[!zB`OYI[Nשcv%H Pr4#*\=5'_='Vo">ou@_&%.,z;R٦j2P;EFϥ-C"r4)ՂSVSF*}{ +;ߍVMEmKrT%ŔѢ:i!&W8{s2 AJoJYG7%t;LPoOJZ7e*b`IJ Ƥ͙%? .Bvg {21Q|`6{CH#9M4>|=Xke ,Pp;^ gSGu+g-i6u{1.QX@j5 =Z]ZMEfj~Rg"?FtѹUCwFzF1,  W;4iv䮨,7bVPrPK >@CDs~g44VuVaUU$pۨEmT"&}BlEml<̤ ۀcؤA8ԩAY=$-D>Ci.BkAr pR5 G4Ќ`h,4kD˻{A?gR? ,l\Qd|sC 'CX|ThzŎ#,p Ϣ^|U8[+ O R\MuIv+n`S@5VVBR]kwзpl@"V/gv,>t/ pG*{nsP?&2P ǒ"dotAi m[ŽТMf\bGaFG[A;bo%CY.5+WoYaDI\8<9K[sW'Ldٜ|,ybYH 3~!\dץl-ŹBĖaduhqz47.V+xLw΋d*qۀ%Rߝ{e~_'X^jRTUw hh/ 9BNڡX%|Nv+&L]ꯖt2IB¸qbcG p Ó4`?KÙLvysw.r@+r\1m~w"ѻK("0sԜ[]3eا4ԳEy1M c= @]^ke?t6' hɩ}Q&9~0?Bm~*c<36ؘqb 7=~ FDַ8R_r,[ԉ{tF-mMa࣠-CJH=_ߓ}Tۧ<^Rp9  :LV]K%C3?0,V~=}8 Z>49 8ܓl̊qf8-u:pտ 0L^HGcbFd ^# 1#8 ؽD̜9{o0'Wǿ6:Pyy6hwڒ"& .O% 4E44<}oO8_PꏙJqb^';]I1]VJJ>^v$YTpVyuu\j̇4PNw?IZwWNK,#p@dɷ9>u x8ʝX/E^ YA/E <*_Ugld-bD&z8w;Ҵ+m4;ռFcƜ7kהpR/ wMd4ɽ5D|Bb_;?ْaCFL˲yVHg: >BVRUԘQH^\p8:=ja }}v֒Qe(=[uGN72`h vk+8/̝\'9*5l^^|: NtYȯ3jCJ$/;Ѣi1.⊾*XyBC [^ڧ(lYYZ5W[ (e&Fd',L`fn[vF v7&sW=ivV7~Vr|R@\2?QB.wtW}:gPОyQV[$kTe!`!e, zZraK_InM;CD̉ 是wAԡ~8MYoPcט2h8;~Ai=!8UG,R`g-'_(D`2? endstream endobj 50 0 obj << /Length1 2119 /Length2 16739 /Length3 0 /Length 18052 /Filter /FlateDecode >> stream xڴeT˶5 w !CK}~G\6gZUhy%#k -='@ZFRߊFAHKO CB"dw0wrLrvFzz h4dʮ6@_@ށ@ 21R|Y۸ڙ:DCҟlAZ@ I+C v0ȭ@S} c1@PQQT)ʩ+Q~Vr-BJ*baYeP Sh߄ ']FDY@ݟ5N@;{?C>R-":8p9;;Ӛ8;ZۙXOlmgZjG;L)i3C=ONˏV~$}%jZT\iyyiJ#A 4"[  hgC]v_+ӲpwӷrwGosنVfW,33l2"J4gE#c+Zӳ8C*be$dmiO>`mJڍͬtцN(!?&Lzt14C״131`oa43~|;v@O:0 >U]Cg:`4vq:ZX[oif#\R|ff.@#y3Cӿ;o.+ oʟce1wٟ+쏟|ihn0~㿄:iaq%3;XZYYXvv0pgm#_vH8:x`*+ NobcI tByF:!fqJg(e~67dfl/kh},h?Z@v?!ÇbjoXkhgPgo7ڙYc j!C?G?RNhۿ?b݀vkɒsuy{Vr6}$-(hNaQ&v?b\ÿ:g+ a ~|OX%;QAA{RΫ. 2т)EmI%ͳ*P'fW>~c%ED`8SV/UfP23[!TjSt@eH1q*Pi%97"v+D+#jd~"^N $Mg;hx>KN*%*l zzwQDەē~jo }$*ʍo־&&3;=&r17XwٶhfMP|!c:]R~ v.lS) 羜}1GgeaװHR&#uoW8+An 2MG?z G N!V<b:JQ=/+.wuy bypee7â8‚xq?X!798;ؗP|.T)?e8:ҰwY4^/$'cg.Ψ>Zs}-:X'Qi?ǐ)u|IdO6XbbJfxpO=|Os3w #38"b"t-b C$Yo%>Ht|gɾ;=VÐR.9kD1Qw{؇zfr%AcSn2p82ǙOg X;@J0?+GM80q(̵"x~WӧH?q Mcq`J'fdn i-V<\hBZeC&{Um>fOM¸,;@A3e* f=`9= Zwt9 `@112c yج4oz}+3xZֺ:#KREɟC{.#0)P]-ۘ8p\M}<5ӶYN W}=MuDEъQ7AAO?]\qk|C*k˕kկt%LZ%4ϝ@ھ2ٯNh€Kd2oq 7+%<55n-ť3ݍ%ҸsY{#A#/?yiwukJ#y@%&ksby4}_SQM4Nh: ;R`@׫#nK'D_&wde M?6t2# 3%TsNW=_|5&VSTX$pDDݏq8d3Dm0KlO^.|KaQ{Ɗ`zcq-wzԓ0yZ&D`L5!˜@ƞVtK(,ٲ__`mro(y0\:k3qɫ4<~pS yDqorTMdX_\@j7rS1!oJ \&A63""$/ź5&c5q6-4&tJjy[J&y;B{}[1~M=\z ถ[Fk jr$JLJAtuZk9U"ކِ<2(H[e'̷h)M;Gɘ"Kw| E&;㡩U*얓ӳ!^5b$$0׵g\ˌ]t76#ޓ3a aLI*u:>Rå՗(v`;,"c=~!oAç̈́~YldF -86S״~eO ن c_< i'@)+ZjΡa p8d0`zTt8n<#HO]k̶Am}B2?cАbl@Tgb< $W$º2Pt/fI) ҧ1Ks(L`4|i`V'߂sBkbQ9mg!Agۑ E͆l/6Wnr; (ys[Kݷ9ׁ!c.D% "݁ 8X Zh=|+T !ܢs{Rp/E5ĝ?D>lEMKD^Npaډ9Xzðm{9ywFdަæOH5ĜؘH! z]&RoE{!4)9Z\ՐDOsypaP1n%6b_ rM?[Hr u`^Gx3.=eW+>šHIm<5BUD,kb5 jA>=1SlU-@Iɥ;Idޭ {g'<-W/"lQ22a >䎨߇*Fr0r#>dBv GD9Mǽ3]ye2Z Za,85Y6¬-:ٓ˓dHB̯Eۯ@, „_M=RD~M4 o hg}Pݾke< q[ekuva Zh6 ƍ | ż~fQhElO&'r~yb&CAQUJ60#<5J.RryF+wsOïÎlJ7g0D62y>KEVD^sh%YY^*@C襞kf^,PL]WZۥ9W,왬NDq} 2.,ƳVt{Ccj[u%1ɉ[ /|@-:ViEh%p뇒 28ښDOkȨwX8k8 yJO,b |zZq&s*U/fW #DzWyRiB|G3 \{o: , #o}2Ye= ?<}@L|zJ2JPO,D %vrT &_;-;#C%c򖑜ngX8FU)y;`.\:-_m$8eF% j"ub X>a4EH9&P~-P/CH s뼰QSZJR7ۄz%1{Қ(f i'5gYo I|9)Y$yKzuD2RpW=e$qsjPŗ@mcc\8O/ [ vj@”H69j՛ q Xp#l\ցDKR7=jX s3W-l1L!LgWFO 5wįt;Ʌ 8n%t-ppiCw0;O:$8V*mj/ف0-jgDF <&;[4:/[@ *>wP=s = I|ιl`^5ש11 ;"DjW9{)\=C| QCawKl1tā9WM Ql=z]ٗ ϫ xB0`W5*6F%%MrC+u|Ⱥ։a2Fo%ˌ@vNCZ$Qc*$RE'ȴ7BI~o'[3o&D`٢D4i\{)gr>:B.;q2Ӆd\8]aĐؒəlfGwEz@5U7;1Ԗʙ^S_\̭Z\$õº ! iS4#vY7Z+rodL沧ۇf~gmʶ=RqyȽSa9m i'Phy;7`W^OKT=Y;!:g 7x}p^?QfR}=DP"=` w#b^W\~ >4ɯ92azy͹Z%٧p|m 0K+=t>^qV")X/5Xֶb>>&a: P{8B^QOKhmthUQtpy=h@l8IҖX[+򃱶rKr# r-a8%:MYXgFSpwi\7Sx|GAO3 [$̩Xe/悽lFN4!mˠA]EFlX@BGI}z*_DV0iȌ]OD˸T\h*5=l2ͶЋ _GI5$K*3jLxKk;z5Ŵiv!WUh yDwu,JgX=5/u7VmEl Se;oV8_oYPW%q(M9C5K%8Ep?e TI_:ڂ`)J ^ϳJwmgrN{J@CxSc$m{_[)vxg8܁Ū*&*|tf o.] d&l }T f"(TQ>T<2*ڱM$QJa"3Ybg=NnXE\ [u3"9LWwp^”斯NySܬVŠySoɦQ zgcKy,MbE- `SG's!|% [ҟi)HFoɶm]u _yuhk0 c֚WWiLgK`2"Lƾ$_<~=zӶGu>{e0'GK3t[x X3yk EXhS\]zchDfSq^&.^uw.cƗQw3QU$ހ DjhmW*=d}ۨQc}]!.m7=b6 ې[=`7X?rDc4w:7ҞyV,hs(IvB`B0b$Rkm Bͳ~FoRb[Hx dk/qTR ZKRo 0A¥/Ε4 y~b5=I؂ZsL '&KwԼz͞_EV*M"1 2&_ 1u@HM6ˆp04Y;]COs@R|hl6 ;{Wt w\{ R61KC_^\}PwYX[aFҷ4r؃f) m _ש:7D Ыݼ gj$ƖzQ⭏ SIZ}snNe=Ip}w, )v&"ɭ?khPC>AbF,U YyˍP Щ_ G.(wDN˳a2MTzl`"2YNuLRQ# *l1_z`-ތ38QeU(AyGZM 5a+۸% 11ސY{.-G%(J1[y-T73+]H]B%󥩠f3 l*өNͪ9QlӖ4R#Q~?(K|HIv093|i9"i(BUԥn&7 {Cίb甭miPCR|Ov֐ ]G'QUX_(sn9J#`RHE?QK0nZiTs‰1b1|T~f&CC"RԵOlSYcgn0zZT83ֲ,EuexZoo<:gKB|}1,y'b?`C$!:g7dzO5.]!;uL~;%vvyЬR[SeiA22xofLxFy%D~~:l@' _Z5S1!J-^s1G F[dWď$,mŬq)?VCn uB҆/<1ok}UIЊoh⅛? IJٔC$-ܙrs.H=yB32uLJRhE,asE$.Y}kgmaa:R]Ǖьu&L—`]7a2ƦtZ07V\CeA?N+ E.,Gd1g@m/ob'zOgWCxUe_uy^H̃<~5@Ē\vF0:gyUKXVmk_2Td;4(X3 X3c{%xDhs8iļec%^rG5RslTKfx0``fC/ xC9EbSUC9t:b+4v# Sn߈BK'C3ƧR<a$>7\jgޣ=_g. ^Od׶E,P\|*ϙ4h/ &Ϛr[_j6t@ {Df@7)N]Z3oVgeIG_A@(C++Bj^@Z/V}0e)sVAO$'מe~ 0_ 'l hCt8˧3Xfk7x}6_+mz-vVN'4jt驝VCDX@cTQCjAmf'SU1^fylo'D/m´}5:$qI|{0ágV`"G5kĖO* !h<#ɣKWFCV1rM|%}&G|A }w:@;azKʾ )&.hww͵..E8 R$B_EROVOa.I|Eča?ZJI?K{B)>yTGJ.A05?VΦGI,shڸN7A}|ۂZ)3s>Yd+'sf O4_Jejho[2;\f׫;hˁMsp! %&?֒0>GkfF4`cW>Ẁ7n?Ÿ͸SiZ(Txv8Y6|Am}H'y&7#uy 6aQYcB=+ 5会!3FhF\JN={%}䯢fK=5$Kf@g2 gX>XTF^إ s+l6Z%A.iZŸ". BUjw}}ڒIk ըVd F`|S` /v-^>p=k]d/ [?m!&+3N" \#8Rh5|v˽so0| >Gz/)/ wڎ7+}_z}ܒė>y_3׃vsONR[G%"RxԊR_8!xCa^/dÙZ}ZKR c-ctfBehS]K+p]/\տEml aVIy)aJG= 3{M/4 ]v~%-'ێEhL#$~ܘCԜnUU>{4&rTyJeFi44Af{*i;Mx*le'w 2)]e穂y$tyX1xc]g0Lo{lY rWr9l8'ۅ6 , ;g 9Bb`O5#NfɏQ"!5*mS,kflzp_:~:ypaQm& Ϗ:whzt iO0^;YO>̔+钍pf^oĭL 那 R)^;h~v֏eejd*(Y: kh[A ǮZ.[c@^y"Lu-ݫd^6,@ `%(`>J&5מɜq&6Wj~-aat\!hp/ؠt &9ۄO ֿ&UMێ.J.r]l$>(-5GǪG,>[URMj4X*6ͷ&Ekwe@̪ծI[Yae~`f<4:=AE: mf!8 "=q.Dϲ{[o:a^ytېy fˁE*ǤWUmV_my`8К4a'io7k9FPwDhDb%jڸVOMx`פnc:|QS=x%[$X@O7`Z–2;NwF[f{s=G%[/>cHV;~n"[7{}.IaCYsQXOG`rZܓRo7kS)HS%KB^ 1q[W >t~Gf)/W='!aqTXJ{OB… Rnʼ4-k76tp Y6LdVhJ:\r8箷Cz1c%qUU*.Ñ .=mS4"P<laqE+iZ@ܸt?,R9ȪJ *,"3$4娝BhhXSvxA4s-?.h}fKcW|pCNV&8m#cv,m;mC!cJn ~"blݏ,ZQk`;CvnyKUkMYy{2)iG3[ݯ<+lfeRZ6ȥץcJ2o w2۵<_ֽdR ɨMëӧnr*FH4=D%< NPH7c` .8Yf |(W^ }5Q ;ոa1oR!QϊBĦT.b_M.c4~DRzʱ4t_\="F E(MË)u={u~Gђ t-'bO}|hCnGv}ϘsApJ&2*}IK挶1 }^o%wh_?f<`%p܅  #1YZd΁r]*{a d9vI,$5@-:]+!:F8$=~B~Uc$Ț)AHv,Z9mNa2^CafH,( ٻ;yA>G_>\f\#)o K#6dI؈Ŧ{q,CXD4޷͚7(]J"yؐG]-KZI^:8}I oVsx`c{<~?nOG[rx_Z6e>g]ٸ {_ a!,soRz冯6ï,o&&kf)+rȱk͒ڬCop\NtUJIozOvǛ=(2?\=kinzO9S&)*eD;1|IFhK\kdٍ-b0*nP-24!f=|mo-)>bJr#d^R>0E{#zo)cv60b'  5%*6?}@GcrzĢ -5n}6x"Lnz7<+Jc1Xг8xi~iN!VwEiHV V %1`9mj$8qC`>]_؈Q-u, _uYKxU$gAC>ˆA~rp@RE`Z;:#sEl6Q ,Yߨ{VwG3^k9t='XH]m?RQp!sCM@TísՎ`VQ?vrŌj:[ySФU+#V]d[GquAiйt=X23S"7QgG=D %!/?bZTFӾIG7UP.2^. 0}拉eꙝG|Mh#b6[ ͯǿ(*r*1؆h{[T{Csv϶k>ݣ;ԥ6(O$C*Лdf|tLSmZ`]x_g~03)0?>a{gl l6i@bU1ԏnk\ZvBe_ײA/ Y>bb6҈0[V!!趋o`0M) ,3%Kzt}AKQ3Tb޷zǍa#E%9Z =Ղ8N.yJ޸Zֆa_&w}45|j1Q`.nšDXk0fӜiF|U? XM*vAL̤7d-䈘"CϞٕ:eHQKyMF1"tx'0PLjkQ~JK&&p v;, gw&Y_~G}7?ۣFplKm_؉Tu5&ݓ Cs"D2 =x½Iľ/?y^a5T3v.$݆pA ^ s7GǥzAEsk赥R6(:>R%7~HJ&Y~*1lb4ݩ`W9$ؼ"m(pхR)ZL˝C ZξeMq\ۉIM8څ >%Ȍ$Ÿ[ >P%fc۩h}O.! KN(䯞Q1EL@)ƍKfts;L;_w^'s).ec$Q?Huh6,3+U2 '҈bC$8cnΡd ?Y􈖗[fR9"g!:Ԙ;s_%# 3UxR?r;֋Blhy?T-UZS}zfƁCE^r2? ]qvpig N3 6do:CB-17hp^Ni(8<׌s$gɩDvH)+> W.sivmi8nQ2O1ns͏%AדD51(VkqrZe/roÑjDM*>x (Ӆ~'o84ҕ=}F(lmO{}o.( 4 jVߐ DRVۘJbfQ}yi-8%˹@Mnps5-iL4_ Id6 ߶ӑBQDZp?I,[,xNuՃ}Fx6'gJ endstream endobj 52 0 obj << /Length1 2201 /Length2 23130 /Length3 0 /Length 24499 /Filter /FlateDecode >> stream xڴxeT\۲5ݡ iwww% ,|w9`@3gUUV1TI^ dٻ330A f&z R hb3v8],.LLI=h0]<j㿀م Ҽ<,,]JO?" cS PVj=hilkԀZuUqU*  ". &&j|Ho nO837՟]oiN -]\x,\]@N SrlN@[_q7{o%_y(9+S3O_FV.+.δ;4))쌭].._ D][2=[o_c~b^m wrvq׉@-z?/N^XAZB\U^}Aݱgppybr`aa0(]3Ynys+{3?7su`TrtJ;7gt0%tM_oke|v6v\\4'gYeti{s_g4 do 03*\=\ v@nYzyhhV9YhdbjWEK-EMczl.=3' |}oF5I5iYE32̬ۛ-,c''cOx9`agx3A02؃\C.sQ/`qq{=MFm Ͱagfb02g]m`4d0Z';;t㝳|]8޵y8 2;lwwyu0~h@sYau?xNV[^+}A?{u~߇rΦ '?ދv|o]?{^Z?K}/jZ"odL (ރyxӳ3Ykde3Qj_{Y h 2 No +/.f8ВI5A+u (XMUK /֢ ٚm꧙О l.2/%lmmSQX742<(yfL'[teTNNpG>901hnT|5Q-6Vj\K",R,p(+[i#*CHQrՔFUF"_:`'Mz֤vzOmXUS ٲFt`}+ R-K89ˬU4<|r)f$[e^!7^R'yqS`}) i;>㓥\kRrTn{Zy&JM5Zs%-ᝀ֋O+Nc9`"8-eD R׎>&.⾝Y$r1\7?qg\XMKwhM) xkL{q@`ΝV/f (XִG+l7"sʦWwyB/6%^ن &1G ck~j!Qq0l$L ~,w|̺JZ(sۣVۡX5o'nQݳ3 Ug@MBnӄ0Zs%->F1 *8aF1߾r N6PX-RI}NG|Bԯs⿢ԚV8@N r7Hk^&qP 3I}Du7x Xg"I?k֫Fdz@ܮ b4Ƚs)TĥZw'MQ TJhfL^22-6Q^"9䜊hiD@e8jlKmeb ᑂYa(O˻7,UN/e1VPtoF|١'t cg"ʐy.rIZCv֬Q>Bu &~OKY 6%yy+)iJJ5-[Z^ k[`Lej_LJ",4YBj{٬a6Zn.Ϣ.Toмj%-~Qwtf盪pL~xDk}%B9Z-Wk7̩=ʢ5G]@,mܘD:yԍ 9Q [fCOT6ģcJԺt^8L\Ji*Ɔx\xy_Ĝt|5GM/Fρ)T9Ƿz]ym&_/6A˛LjѥA hpx߅͑ҨEyC.$Zڭk]AbuVyޙNݻNq1񸺮V&YwX X(FJI ("䃋! ̐kX !F5y J3[Vb(:+׭nS,C?zHF1Ykۜn&3wEHȒoRN Fv≠q1wdf WQ@#](/ѲjQbKr瑐GiuċqH[Og_tOq3g"r`p˝>W*KpDBN EgA$d0ƟR?SlLG8 %.k/[}RFi~ř3+4Ű*g%Hް`至 z/zv(}o.>ǹ8)dtٻv"Ԡ_afC8yjħ=n7)9#ȀJjndHݎQ=:lc`ACOTO1dJOgR̵l <0$S_a2YW>HK+'dy0AUHN.)ljg ɺO8_ܯʻȵY̞t_UJpj~܂Jrgt4oc"nP,p4FyZ g@N'ZأFUm#p…eub+uHbNmr$H mdNP%Sy"h=JgK:prLܘj_m !ᖼ= s2|xd~7gvTdjåȠO_Z`%:<""f56dkYpl, rH{آ3=5IzMN1N#́R@ Ga83gEe 4`+y>xb?d=-0ÒfPp5_}cpgуPGktGre7vzNecɇmNrw6*)މ0 Y`Wݬo336cC t8cIJl8c-]௄)NM:=ҭJX\ʱO5X ,Gu&VO̼$E==`쓂)vr'kZҌn8g6. rN 9a*[pla&Δ %shk7w$ 86Uhor=U.!c^J#Z68xTo*5^;&rB7{cizP.Q[9oT˜H eÔ̈n?bzƬ{\'Sx-qTጬ,c]9g5N"ɓ)/C7ݽ6ޯ7ch080*:y2+QB!kYoe$|ŕWޗEB7/@( mپj&@ ^{#B!>cK˄zu"95GB!\N+% 7sZ[&DuL*kMB&V.1A{Lދn=$+z_ hDq /8Xr/ѵH%L/sJ.˺Yz,S‹,6`vluyEPc:0 YD=*7|ml2cY,4;BE\l8BM&ewB遱Woylb/M4_m!YZcf`3|4@Yqm,az½f4Iv7[T}4F&vv`{bt(}_DGrH$iT!uS\NNej֯g7kVQKQZHNBGpCFBܢ~5~VM=] ߛaO{CP9jy$ƖޔL8ta}%<[$8$Ch|xW#j_)i|ÇuzqG V~sP;ی_+Nce.9C 7vY(W!"D+]?XYGsZ ÝL.tOOѺ ,}2"o8̓&e͡G~Rܬ\is[ &Җ^y$T|@5_ o2/ź1~-ث cpNLyV.DB> r4X+E]XX>kdAr Τrt\;V)[, hg40 rQA|#å|9M-F0Gɡ^UOGrNǏl5&XMpDuT"B>Uk?7gs,AΦ|? ]a8o 2 J[iPzJO itxA6K,K%?/!S_*O.Z]<}2aRup&YdBfݣ .2v5%l/6 N't5n }uF@׶JOQƤW#QmO[_\2s(.~Ϥb;3#zokYK~ɱfsK[ xId۱Ԃ2 x){sYYII'A[_?&ɭ;rc'.$-ܔrSYzVk)|@RtOW J#Rw1H$UmW q,lϼ,'Z&}S\^g*g]֏_>.M `h-BgR4ӻ)0cӢnӝD  X~3d Qs';>!}cG/;MO4_0֝*ں<#2"CyC+& i~@^ݛ +YDWZbžWt^u_[+Ba '\^`Ӆsr͗7>I  vqz,#Us9>6tc[gji uܼWQO&|U|/$A;g /3MeFu4xX\Z5Rxݝږ׃Z\ 6lez³hK@u'w[[ AW̰'WCʊ"Vm{vBӔxE<"d!8)epyy\!mUt6ѷ=҃jֵ2{]0)}n`l)UקåeY)A㔰j؏ߣ @Tv`Kf95$mVE#gu8W*7>KsfM1bCr8G"^|1,o$-%sGnU3k2ezhHgE5Ӧ/,p~ D^+YX郋߬lhDjVqH=dMz}oj?*%ԓVs* x9D췛lIΫC;'8H}e"?, ]l.H(8Ux8P iQ@S)L?b<ԨBvq Ђ8T#~I\,&Κf;r.oC|?ٳD^/s{0s`:8 O.`qx׎{h#Dr;IXUS]Z߅݌T#e&I|o@#dx %NX{l:&EVKXh^YXA[@4﹉">Ps\Ŭg^:Ȱ`3LQx!MXShKPȟ믍*mCV͗ٸ <_{+CwI Q*U5hD,ZZewS f_,{lAѿ~Y=VK~75z6@inhB%h2w8k0"}&w(/>jxGyD{`Ei'{7%A=q q~)Qn2fPϰ:q4[vTrH{r4-^溨23 eBtE//iSіO[VT(PFc{-S|P;tp!\n`FJAٚlLѳZA2J|oګw+O_<|fpq? 3@skTʍ e$AxKo $ Үꃘf WƷ0UȔPv#R$iw;.W!cR!%~c?St4[5q~SL (%Yj3^Ѐky>H V:GBi)eFu%7-qUu9l6fgiX5m&,[prKW댞G 4A ڎ؝YF؀vi.VFkisA,IZޕ#itj$'H Wڶb  y0KEVO&cM0qe$sG۩%"=kRDZHjv!I8x"uLll+u8pKf3K=ް,C;rGj6Z9b 7  EL"z$"9UDV@#iV |) 9^jfe-|ck`Q|K1ףA9(-zz59K5]кj]WT 0q̄Cj?^eOP-BΤE,>tqoVyr˥DzD()D_`-i-5S+d4MgPA]jN<&%ة J}$,`P`3;sh S''.K_8, cs H}6_>SkvOr#Â0c25".^G(VP.jϖ:'&v h>7GׅƲjMms dETxF ퟂﭡTs5W _|k{scw-9VQN彰}2eŶX7QK,[ ӕ¬BiFmۉD92YQC/&MM'ϟb'\ͺbD]"6}H%6 ~(8xD/ehtֈG?N̲ kh%"/>:):7I,އ8y3J5 i"Ih*㪥P>;}BRDQcKyFADoB<)qG9cgS驩UcŠ&=癖r@HKr]Y\<7' h¯P+rzՔn:Ocp_g*պ^5SȤf)0~q.+E墯a!qtÍ؈>bEM, R;ئ[;zIq4|w bpYelaNCh ܅͍9wYx[7|)j8S@*kaβ8[HY]uMꔊ49W}{ 8{בag"9?}h=~;DXSE [}݁9dM% ݫHрcIw?% *zN}wJkm=,lUK]iv~#>m}cm-1nc Vn~RɇMzaޡS9;+M9ܛ뎻j!켹r& -rBg@l7 Hd浅R+;mXYBL fvC.mk8|G0yTmWRRkͫU՝F"{!.$(vDC# Q4UrǧBs*oq KK?Nfá#ĎIh¢vM@ 4 [_g)X^ =g"KgOcF؇nn]Ō1+#QE& 2b}fK2< 5կ3n,Jd&ðrT#'^r)&U*Ӧ׋eR>X|| Nu>5p DlX7j<{xL3a_-s5$@|eo~ g`ȂOxpm1{|<51JӕHqϊK=ONI#JS< =y#[!s;סI *ѓ"C9ԎRip{~gm? %=9,86|r0j1.)*e({Dą/ v=?ͥ`(|`lhC@cwiX ɤ7 S` doxjU5nKUl!t 6o{FT`ΎTn9 4 &d:g)v|&fNv9ޭ=х8ɉuwD\\_q7U:#0CqFպpwluo-El}o;!K$0*g:k:7EY'/yb_W1~ߠw`d䠪 ц gBU;0TFlЧ!6\oxIDqĠ" *)}CgPB]{|E8^,RePkdCg/|Cf; Q?ΙLZJQ_ 'h?ioƕQБglW(J&Xa&gJ' RVoeaBOג 9QՊ;k,#V gѽB4{`Wm%vbIN@mV{u+l75iUګR։@i Di}FWhS=,)i 0<2ttCu{!@!( T/F{G3sB0`utĒ{-Hg6V,NW%Ot$NuyZfGܣ}NƞcRQPXv~, hұk,>Z f0q )? \45Wo'o`70}@v9oizN ] f%~ꓱ$s(OfnxKaѬ- S&= `sr V-vt߇(!Ⱥ :dw2z$!L\Ӷb;I]K.^^!*DJҗUEV3zSq|Gi '堨XUZ)lH1}`\c++fJ:H!wu58F% 66q+To{vBF;@z2]ԚQc5]*38읹E|}})ˑʃrJ[9zΞN&x\}U6`76)cOEE\?+)1@7韂-w@pʹ;26TmJC!rf#-SÓ: Ͱ-\ec"_ OV#wzjzBP(3'5'N_ݑșTjH0V|Koؐ5:B.jkx~+P@^ qͬNwtZWH6t$ŽHYB8BV;Mc9/H2xyPM=K&FU12y$E:F /&~ngMpKPIAң*7{1U-ABYƛ;&-Bk3{!k쭙4{8apO3AgAɄl,sݧTo@mP&j C̩'s($M`[wDhrˏ}o?ή %@]|?}KÊHi'v7d:+-Boq4/DQwaT&db}S#T vq|:zWb {N#V?4ׂdLmTѱ Z0{J9:)wecq ؘjPD9> FH6Ĉ>1"74] *OܗX'SgK[qp#{̓2@ /9Bf \"dY))0Gk/Xꗀ=08z"DG9z<)Fjg\]'ۍ<r¬㬵f\W] u2b4@۵TGP=&t%㭙=(L6EMكIbߛo8W1-xܓ(7BPxDƗynozl}\`^JR l$za ˩9 (l=|8P[xU 3m)QFt 0nhM{n`sU"9f\Xý4kGѢ6߮rفȇ|al;G3Gi+̜ Be_Ѩ8<9BI=&c8k0G>O:v;XHCPL~$ZɠezO:WG7dߓY'{~)!Hgj=N]Vp#.VG]:ݸ. ?KyƷɫgǗˤ״W L,ĸV.p6STwd&Q9#AO`ODX܎S"/d˒ZdÓY|k^~ _zȈ "we6-:qlh9y$1cěxm[f@ΐ`$M"4}̶yw t_a\Ѡ sp=]H\evUmwxqhE,s tս1_ϒg"Ɣ^"?3yz1 G~[\{7w$CR}Y%,"y$j\E0H{ZF%E ͖4vw\„c NF](zyEa}DN+䷎U| scocP+T^G ܋:kO9i,E80 qy_ǭ2yik_Ro2{xٕԗ:l-8Ci_dyȦ}YSKf6/yh0A]Z)^bd([\QZ(ʃ,:wđ!LzhάΖ"×"uh i+& ϶k{xi@u~@mKcbdltpvZ:[bIU~ ǥwب ,UI0N JEyŎ:?c5!=y/ *-[b#$VPi>sCŶ *n~ff mI0?U[iӘ欕ek[jÝ}XrU&%*JTdXv=͇Le&?vL6(i0*3l`nqYP*Y 5̛!X'Og,?F;)ixehbPn|nn8$P6XճXP?PX|o'eE)_$2~}fI;x=xe$Hs QFLܪ41;.<c=+wmuѦǏσ4FIFasmMD hRH<%FJfN-X58en$dq̤/Rapt/!>ψ!]G3sP7 x^#o|9lrB$BRHYGsʋ8vば 冋N+&Rgn]eL,IDX˷N4OHuCƌs vX$ޡp#͗ C T ġJ:i Gl6/t{[p󢐙QIH}]eNg$3:5Uzӓ/9'qssL^,&^^ljuQ!&=hKb.Z5`TFsȂFBh'^].xU i-*}"IۓeGJ20oCSd\zyVCA,za*I 7Oܖ'PmvO4(y8V+"V_w;4,>ǒܡQA&'3 0д}\`A Hx#(0EXA3^('a1q{c#aFS@_m6ϟ}Jm:{._O- 6_jt>r4Oxt}D}џ[^FvTqG;8/ .f.+Ў+0r!䔇SFA`W`c20랳Azl3eغ6Z1G(- ˬIP[/2 7'rA-_sqӧGIyUwkM &z+$(Ss֤O? (g5ŸH$z9?k'AaP{ْSVZ& $QAkyq|SLPW ,YB`j1D}`F`rqTgVhζ?dTd4sa";|8f_K7fA@t n-#K\~=}8 Z>F);}Y^t5P* )t@D^ 'M89!L[RzTz{vziMSrG6+"-ݞ =[d$Sh)h:tdu:5N>Ob' MHg/"^ W-5rHMnBZC\m'|FU", ,v|bٽ :[65 [$iJ˯OJ'6ˮzQ0#gD}~s瀐yڏ1W,a)X!h>a<="#r|qPԋ;P8y oԄiPT'A1Qݹoh > .(a$bq9+ 0S lk/ڊ(he&G'd!\LrbY`/8$l^_PJ@?ғCmU~oP,.9  z,2Bd{w)x}qǍJ[DX܅X߯-Rp c͜j{٦`oDTDT+6nooU|'77b ouf.S4 @T.=Cֵy6lgsL\whL"o_%@*K׏8+|7nqwqJ0w>VH01ŻWel0ˤ[D @sמWl~"kH9 ٧4GȌ,-L>),Az.Ө$?=Vv0Lb,3!GN}=Y,yU(z3{^Yx.^Nh2eCFa#g!5._*Gh߮zzՍxU:*$'*fwul FTyt@|~Fѕ'bJtKaej@2UKtPeMgoVySkj6Lk:z]64CT&P?hJQBRm[PV$Ǒ~f)cS!*gؼfw ["ɤIb[bzy7b\gr!\?{ic3LSa]*d*zq!"1EPgaRZCC癇8""k}~XZJ3;i!QsȞ qFwUlu_Ⱥ,rG{veh3tT#ȰÅ\_*)BYM O+Q\BtgZ{}MU r{p t&W'hieȯ[90/y _fUfJַ5eWyt1,.;%Zey^eroPT*}׈AM mc'~s_4 `.ϢhqNGQsY1Cr+b J힭9w]уoo^Rǟ鋬h|ώq_HOq` u a* '8@:F5Ӭ3Qζ:##T+K6-; m˾U);Xx3*S77cݎ!hRhFևƭJМ@$}f؉]+|.!5H܃L?%ZN:ٞ@CtD`sǸ` Pa k_U(UKڿ dő,Kڜݘ" ZBeZNFç#eZ Ot)Z`)wpt 1gx,=`_ښ1g[yoGp_D>-k #TUjDK -/)lE\qG\YVjuftZ},;P|`.cOQA-ĕ>9͇r8Q(mEJs f`9أuS.;,[!o583CU&+'[̒ _ mp ĻU/a_دt|QFrW&0YV`g0EW8.ZHύB{{&':!ud^A1xȼjxg 2]ë f"x l7-8-R.ѓb>4 Ue@V~_]7dX`NuaJihF͞;0 H!-J"eks);z0(H97.͛*eN?Vu*Rd&ruz.\ɏQx90gUbI$;#e2Z:O)V7Mr+`{)_$Nc@+Vq-%ֹh…~Zh!9_OE UV2ExemOzV7n vozyeMpzxOȔrԼn2e7`R Io?YQW,w(&7.$ygI@BT:ԓM&^-m6bgx#R21CO+T?`H摥NсV NUYECd#[Iui{چ~&WV%ki'^{kf֢s 4i'{x A*`m3s|#Ǔ8ͤZ/!V2–@˛Ҳd#kX;K!k-_"t)vJf֮d.;ՏYU ՇʚuXQdw!7dr+{O;[Ϝ/J-Џkly6d)  ҩ`P0c-E+Ȣ=)^ be+GA>H A%! @S]ja7t8~CBPmDߠ*꺳u(TSȑ)7N/U D7*{oԯ{m^2*]$]KJ9\VvX 95q aqK'd; S߳ƛwRtXJ}p[PqEΎnifș~P@"Gp5t`A QPLc&0!S SZ]"O@u3w6MH l*j.̜QU|bG.-Lf&3l8۞J1o}X5Eymr!$? ߂0jϧXH3z/#,x 7;:߅@ka$ջ]aN^cESk&i >$dH* <•aO_=`>JhN,zѼTym;c2kxS0O=CMf`>;ozAt=xT8zmX4W^J\ˉ]{CC [RL} ѣ㥿QQ3K1"| Г$xRrt2#SMU=RM/6'oZSZy qI#N,h@6X5X.;f'맆ޣ66Oւ=E)@"մS⩕R~E+M,I,Hdk'UW`zj՚Ç[qsׯ/r~B(ۈ;1oxΔ-qN #=D~R|5M FTL&;j2'w)]OSGo.VV'IK_6ntX`m߅\\Ֆ39+˼˪MQʁOw$^Ø]iIg/Z1/Fa2 &oe<Ŵ5?0P`O*^mdQ8G`dP[ `b? Y&?L}2E$b [ 8uXW1SZ2'd)fN ]'OPuVE{ R` ПO1*ߦbdIjVBx ՚$!Ӫ%ߊ7X~^bu*%lb36@/jGNjsƢ8>g/p v#($EgOF+O{G6|?S;m'ڼWV纎T$Ш!I h#0ʐ׎)fA0YaTmooFxX۞:q`PfX/4XIP{iIۛ`M^J8@rlUbpxxtjmp:x#Zٮ^:nJM7[-Bѷ z^mlӾkUlᄴzMoA&O y8PR >z;SqLECγr"c*N& 7[z'+jv)͠ ytO 5C z$dlӵ'Gֺbץَ+"#F_6vU#spWPVVӈkk'?Zuv Qyu6DVGHf3(c_N:h׵ibDT, 7CW??6`N"C,O)hicCfNiI $S>P"+-P| 2.I>Ee7n)N/#da?:kop#C9P*17UWAcpЀ(,3;%ꆇ);X%4b>4O8Q;?w"~^@DB\-`d#M7ޣwbQ+J b &=e)L,P+!_ 5vV&ju壚=fZl3c"z.)6LSUrux|^,`W8zUaK1q32@Xʔi>NXC^oT| _[́X֫ VԪR":l qx RDp rhڏrv gpovPT74p>Srҍi~R*cx[ 0ӤT`rywk)øԈdՎburVp'rP!R ֤e@kROZ&|&y;y& ދV@qX7GNR_AU7L !f"/:!O\򂼽7r|r\K 0~F3M*+R(Dz0#i$VԙV޾mlp9+ٷcGc; dpoy2]VmъOld BZH&d ʾfqrS+|T6Ao ?]HK,g q}*$*|4q}9U &ݠlׇ!kjVL!4+';vsF^@TI`|^ O8QNǾ ÈFO~ oP'x0ϓp0<++)L+b bdfG ;KmxN0r 1̼r`Lr83DMO> )`dmMِZ sOћG{ Pxi_ag+U6ǝnheM$R2u23]tq/|dXqE/Vt4'C[/ mXyqwyJ*/TY:Q)U•Eg& endstream endobj 54 0 obj << /Length1 2046 /Length2 14960 /Length3 0 /Length 16232 /Filter /FlateDecode >> stream xڵcxd'tSmvlb۶mcc7w>˱9U?P^VPڑ -#ccm@+h`if`c``%%8X 8쎦9CǏL{',)@ h pdn@F_@Çhmbf Hu731uSO?قtIC  3@N ka4PXM ,6e:@EIDQ ("DIQX))dE@UWeO?2""p;i?>C# SGG[.zz:'G:{:[˿)9\l-@K_q6) mfvIi1ʏ㿉} OM˿@15p+WZ^^`e`f66t4ptrex&9!/Ǖi[zxX;9c6}ن6fW,;Y33l2"Jʴ³5_ KH`k?6e66623w#'[zk3;'`c3:@;ДO1/[[` 8;3Q3W_Cw'kK oʟe!ݏgc߇* -6ο\YC@/,).&@+J07pe++CF@׿qH:9zma(^o Wb+8?'߈@o~0``Aߐٚa3eA bdd폸Mс?aE?92}qo]9 }gm,jfFߗ1p7sbشǿ>W7qed2\3˟dTÿO΋A 9:@+viƐ;<)[`O]2b)}K8woY8wu:i zKb䍑7gU: EN"#ɜ|ָ/c!(wd"(C PaLSdzKGh&ޙ`%lZNvZ8Hv}әC˗6?|"ox@$#PDxw9T261Exc貆$o$Cl3  \؊NNYBIrTǙ0BaAre3/6w67^"y~HtuvZћrJ=%Nʹy/G7DyhѴ`,w2[I\O[E޾4IDJWfk^ӄ$%O75$2aɠU{haSd&<$EwҤ R{` T:CD3L/׳16>*kʲ+ʓ/I/nKJB?VʩCI:yXf/ƯׄJ7ڇ.;˝}ͬ%IϯK4Lvh:@m2bP}mNIʜ"T 5LbNPAgwWxNXz{.-cXb=.AH|elhc`Ze.ۯ('+ep;arRE~ϼJ3?+ Q<j/;.$lG)5Rc)T45d aњ5v/XlKSyPq\n/8/Fkd."flE]x".J#1g<Fל1*scb,Y J5ܣLd3wkBHĦ$d\ŏ4CxަTE%9} #~RTnpy EdX\|~ 藈na'B,|r=ho: [i'V)Q1_Dnkl/SI%0 9GuVD6Id}/*vfT9xaISe?(~Tڝ(/'Lט>Sc|۪J8O҉J ZԳ!Ӌ =n\8:]#[  < Uu^lo*4 "bjD TjԶgÓ 2&‘Mf]:9L)NأS]%6{f UZhi?k):'2]nLZ۔}h+RRߥfD#&n1iatgo?_;hM'91k*|H^$|3*}I-+0Meo$F;GJ✶Uߊa0^Z8Ī5G<TyX(&do{"F" M7dOJx o߈X9}C!e48XbL$kb2/9c<n;3±CCeHV<_kBXFp {AŜJ ]1ErёKz.NoĖXſtMl.2Pm7K^`x|Nxpѹ Up"QxcP'oN߬p RKGZĝF%D4LHG+ o(50wUWW!˜*~ ,]${BCLjIy(]3nR&X柰|N+> UsQNe~])J`HF+nY~U>Ųc r @B6c[l 'YqD<:(5L?WeȕwM¹bhJtFkMړ+hgbC=e],^0@?3%eTH+8|$T̎ҍ\X>Ng"z5D  >kA7nM0Kػ6gF%ژ^2i1yӴJbp_O4O 39jÔD !jNa|DCh3PQ+qzEp n A5gfϺIt bה@nL _Nh0vMm߄²;-*THzs1!shj=!TjUZBgt-${l3]kp-u=70v\ Xku(QÓ [ja,GljX:hIsBziLgpӻQ. $fNFdK*U{Շ4d:e5\zGS!8o[m]Xk(Wu6I[[U?I:v@h3xS B(Ó~|k 8J1;v?jm3o΃c?;*eFd ѮK)BN_s|AV:ߌGwy:us:34 qmY.saSǝ :9{aVwƖKڟI`ғG~l`ս#FSPsrV;I"5L,pp:ȴJf(cI*&ԐDo#S*GH *Fxrr O֘r|HEJx%-.mr_TpAZTdEn3Kpn(7N|Fwܼ$qwKtM\m560I &6QDH^ '=Kw%z+3CWT^ tdI_L(QvŮ+c!ݐ=lאqNjM[#YpVw aI5gCr͏|c=1A=r rn"]ҍ^a].X#.,P<][%| #/SZG8y͵@B˔cĮ+[sre}q+v}#d魘Zɢa*6>:\P? v(i{!ǪחH0tW[e3[Go VoG1TWtՒ*/2iҬE~5-AT)#ĒM;H fPfg(‚cȁ-aL?;:sKn\\Bc>*>*uk҆Zo*h@{+bkt%ISaah=>bGSU8}5uȳ~nz=3{W@˗@$ƾ(6[ 0L t4lg8`F||פN󮓩#oWoʽ ]Grs&khrg4jN&d.'Cs 24U$Hol{rq^g_%>[^<(HO='Z㪎K ܽٱ/ b Ay+eWhJ f@,{MC,]HNQ} 0)ˤ`h\ނ^?kiaAK0 > :-֦E;sBЄ4r:v*Qp̘Z&b}x'=|7BQ ?\@Ӗ:5q:;Ǣ{YrMQ<[@寍;ڭ@<.γT1&ziŽ d\299|n f2a~^<Nion%q}ٛ?{?1,  ~MDYln,>v;WzY"TkOH_5O/&䟕%ӋFUL2 ]2CFsXD~އ^Ю7"<}7Vk`~uTN0Ђ 3l l, @*NfqŖĕsda 1y½=݃T>3 ݞneG ݧ{*^NP[8 \c-ؒ{tQdz%;0W$s?P(d`ɐVڶwr̖Jqo#.oDn&7}=:7D~7mŽ)ۤLq׊ $h0Rep`RyxdW ꃺ' 9t/һW |?ݍ:k7) tGh.>uBob T0m- n!d-N)+#!^Z詥&EXO6+I`8O=G5 ]EK}z+K NL3hEnQE1%9<;nhY"VPw&cCSyZ<^Ά,6t@ m_JT|Zg"o;tR;=>,^Sj-z)9?̤h_(2N3U~9ȑu hF ta&F"22eb.5eφͲ ŤZy!>kkTmn=w1$ggWv<bO>)}7J𼣄yOE.lUX#' +^_|MwC1gKek&tze Ij!J1ԝ'B9t˝cY_ۥM 2/2]נ3.:G M#ygFaVNǾHU:o%BջLpI9˿ȜʘZЬ%CIuV/g;qQ&'d7«,ʀٳLfGQ#e%oe#iTEGMmXplӴxJ*K )o2dTykpS]`PDy)j%{f "er^F-pțsfb߹=LXjh' ? ^7 :dr)0kwP& OܖLi(BfSdB_]JeVX؂p:- мۘgC9KhBzf2m;'P6Q>kdrjѹP)G JXٍ_v! ; &JvjU*fs~ZwdW,iPS4vO6_MEcSRZb7&Bԭ! eG  J$7i>|}zۃs-!^ SZcy,SVz'm} wJÙnqn5q2DNAl KHdALT>V|ܝB S 'j0QRMOx(fuίi*XtEXOsvΜ+h*`|uu)Z}×H|-+(~!WeXyØ$&#.v <:UfP+ss+u"Ծ+1g Ūj(^PNԐ\2TD A󢧆Yn j5)XgS&C#1l߈q@7/8ן[".OkHTFq3"U +T#舥FـU01go :o`!W 8펑9 RJM`BWNA=e'ײ9xUIf4ꌍJ|EۗP7I˚r-}pzjRP(^"rM=I~)ozme QXq)-ST)bs$IZݧ m"J eo>u{l2 t}LE>4 OsCء"x*0 &_1 |Og󚉒.&#bh_LC/Nghs8\z되 Sי0j1J8bR kE*= Od"πYzs;[x&1Sj('*L!n A`vw/$ Bd 7L"չST7WDt>U>XB|雫ch VP< /Ԡ#+"ᎣiBU7FwCkp^`*oB(s xk`ߌK y'- &~ߠ}Btux/ȫ" "FH ;.[?$+I#:ys~; SF]<~9k ^=,xo;[8EF(xEazGj(*|b-sm2{2{'OQѷє.t(ć}1+ջJK-K8O)w!z0C<1%|ɀRY\O! !ŝĆw]:[J:E@ SvlL*ٰ-.6ޥܒJ OEA@@ݠ5]]dJZ#p}g)* YiZ L\&Ih O ynr@JX):fMqEfD L*C^p}E&UK5pQd5Ff[ܿf[ZAe.0ԸJ (1, lL.@/v]Iۯ]eSX5Vx/I)xW_X[KҹmS'A*I|2EXě1\|5<^EF)h@5R q,VN,ٝ6,eHn:&1X>RR*Ӕ)@GR!ɈdL!<-BXa0Fu\bmӄQ4{qxbhޥL9Pyy&Ri.i=k#I$F {+v`ĕhtfgNt[)~ܦLL.bxwqؾSw}|T;[L][1\D 1Csn{\:ZS!Bi߫g#@J<n}F˷UˍRN&fjA%ܴ um'A ~LNx٦њǰ~cgp\`s+{>/si{?qp}n#Cx97Zxup~m0D!/ӤU~;/= HJmg!sjZvxTZR2a'''BxXE%Dks^:̃^3\ e9ѭBI![R),=QwPPca{.noo! WQ/(آsǖVJMM=U5oّ.CY  ~A3S 㴕*N˻6C,ˆȯ\Z D8 aS'0qmدpca{ ǬbQv>BbVb $MsKɧeW8w+J6~Y\p? -ںM[RP/y!\zFXHg!Ăk' R%lƊpjGll{3=_`&r U2X$G"m!_1 5]SN.A}ϰ2]Bw9Ft"HZ1e. q W*b~ݶweӡn}VBs[%鵻 &c9>/ obғPʝ^(F#@4N-LR(2:dhBt3nyNT%7ʹKNLgdxӘ1}}'N y?9!2KBd{u P?nZpd랳uYuVķ)7n9P\H?.像Uw5?ܞ&̂+:~#<85J]3>Fo՜"Z;廥$ ~R;j>iHXLAE{~V5^_g,U l?xщ1kjN@BtFqFݬnC)V'TjW#[?v<ڪS h!+r6e0H>ݙ vǨV9)o=L3nDB߲ i}] yXE~(G˩"Iw,< 6_"ttC~~v&+kw6.@½{J`xl~P5 1la\H `v!bqpQ5no;EsDWdJu>ti~eUU h]k3;^Iq4rRFruA^G40џM닷P0,Gb[ZJKOq3`1 >r=NX -ohyHoe֊dIdxcN' &_7|&={lnQ\?cK"}KLTߧvg8ɲ ; tB $ұ\sY&7 a?*!YҴ)k\/uw0}tx ՄpKYӵ_-v8. < gݣ?g$ݣT5f3z)?-Dt ?(rze4e.a 7U7FǒDlwJI9<s^9%2O*8,3_`ʃ: {"{j,e< fMPW7 ~U֑ -&lh.bp,+UzQ" ّxmMBOo4&KA! Xk⬉&q%:# _1?g][fuE_R5O|:;2n:)b?k4̺Hrnbj`WX{ i>kuj:ˌz$:H.:ĥ2 u9jȯoƵȥGE+8j*Dv NM:hp8P(:t|d8BىL.sJ L%&iŀN=f7"iG$R+&R9ݱt~r+t-=MQK;O85=b83ѼC4/=:l9.` أʕNR<]~vߑ5`X@& \цQȗn GImmgQz<v]"f=:FV/T* "1MrgALq3#b(U .c2K'ٸ<喫E\As$<3+[IϮE~A~"x†5T;cv=x/{Daf:m8^L o{t3^:*OY$Oy>+{uyNu dY>fKfn^t,IjXڀ.a㸦&-=ẅ́!6Ug(8,7#Óx {Rؗa^b'S0FF9oZFP'>e u ЦX1-qp`SN~ɖʠPG٠}э+ѹ< Zr&k{ܔ6cZ ',jB"&B[a- |uHSYWnySUe]U{gb4< endstream endobj 62 0 obj << /Author(\376\377\000E\000d\000e\000l\000\040\000A\000r\000o\000n)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000H\000o\000w\000\040\000t\000o\000\040\000r\000e\000a\000d\000\040\000a\000n\000d\000\040\000w\000r\000i\000t\000e\000\040\000f\000i\000l\000e\000s)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Producer(pdfTeX-1.40.20)/Keywords() /CreationDate (D:20211031092917-07'00') /ModDate (D:20211031092917-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 2 0 obj << /Type /ObjStm /N 52 /First 397 /Length 2773 /Filter /FlateDecode >> stream xZ[w6~ׯc{Lw`ONϱ:vEblʢKM_Dʷ8S 3 IJL3<3(Jfֆ9fc9bdBʘ@'p1)k 2bW &-~!E&H1,9ix)S -DA.tY?Zy"L"ˑv(3΂fK(QVIFf-Ufc%)S9Hy#)Z2Y2fa0^ fW/e`^cvdθ- j9z#_4 ىs߫SwhOogՈ?k]5 qEsN!k^UzNJTX0 OGТ')vrN4F9DC?JQĈ]z6j)ى7c':e  AnӶ:kmd~u3G!GB:A[ؒEn%ԭJ4*ըںMcx<mQZsʐhy4wtx@ד\x~V5E[y5m&nx5n~V5”i[FBxd ' %uʍݞ4WT4k. bT.Bi`}q1ϻ15ߎt܍QOtQwoX RoTa B"Kc^Z>ZdlVv-xAypӈu_5rn1W-\ȐHwshW @{EI6"./`6*&/)\ִ2-!\rY_Ųh2ofrT!,=c[.w&')gqʲ<$R̉-ru5'9zG]4Љr]+ .l6!OC^ĮeIxLY撳ԶE4*Zf:$c[(J;tHꉬb3A`Vb4z? a1#$HC 9+H Kfݳx2ګ>T+rQ+)9Բym /ш|\)ΔEWjS)ѿǠ-r2}%{25J{R1DQ8<F>eS|9{[.b9g|%JыD ͥє}bz|*2bőLr Gvr'h©TCzɀTa$c*:+c*h. ei3lS\QZb0 LfrcK!hłLnU.78$3S;&(9ּ]dP\bۥ}D(I!jKB|t G$@2r)RŞ2F"#ܞ䥞Y-+ąK]ݘ)ev ! u{48.}W\M!(TXNxi >GC D(’hZ"݌OTۗy^#KSߚILiA@ϫŤ/Mg jywsϗ\f6l|`:qhoKY&NIBńYg>;Ϸ4 m6xVOvg8w0ˆ;!Cw|̧gs/xګ!I'Sƾx`r:[U% X4 /Uo ދ#~ c59.ϫ9EħW_YKU[7SG_?G4@S?͟w є'4w}+c4[*}lmۇ׃7+=L||7_ Wm/#t&ͬaB#$Elo 4;y4ޜ=5\wΞ4QP1C:~q|7#ضW/Zv  +)ó33ee(\hU\gZUEdstl |ZIV3@d5w`ȘzL{wpMwcƞ_]$YrsܐOi=?_'ҥ%5q7eYBdqnPLٓ<)dAK!YCk7Z՘ X2/:8wؑ_E l5\z*?^{0vNj*>u37z#°978zڝ/ld]^wiueC1(&Z1ݱo(6f^)GPUxCp 1?@L P/#X/eAע ҷA[Z_|Z%>%c=]JU7Ǧxx7I\;doܡ=b)~`C߶՟KyÞ岧7|M/`ݤ&馚ۺ`6 ۇ+ak&)k],N3͚Q#hX{"c˥ΪWʹ?-u༹/ˑ X o endstream endobj 63 0 obj << /Type /XRef /Index [0 64] /Size 64 /W [1 3 1] /Root 61 0 R /Info 62 0 R /ID [<72D5FBE0EE082E98C29B344B78303B1E> <72D5FBE0EE082E98C29B344B78303B1E>] /Length 166 /Filter /FlateDecode >> stream x'BQFKyG^. , b3 E\I׈Qs ` AA@ZE\{08#B00 ! 9AP" BMyU޳UWyl5T;[MVKuVlu` X ְQsv\| endstream endobj startxref 161158 %%EOF alakazam/data/0000755000175000017500000000000014067624107013105 5ustar nileshnileshalakazam/data/Example10x.rda0000644000175000017500000020554614067624107015535 0ustar nileshnilesh}]UXP p Λ>I9INB&d8! ˺+MAjP *U׮+" EKޯ{ιf$yy{O}߽ozE-zP׃ϮFo=Ekz?g7zΊ~DH进舃JB9y9"NQZQBDGIKi!ZGgkRG%dtx]N*KthMk45PY'D3UUxHۋNVo]3B.\WT%`h!o]UMMS1+}Ɖ*/юE;"a"̃XRd@Fţ Xt(C,"?8 )bE-9ྀ CDDwHMfK/KpwcqC(\ J:TX%p80QxE*օ*(hZW H݅EPp #bK XP: kTa"XpB$|<+C #ϋ#$X N:$ ؔx W`oj u"P]$TV\pP ا!Nõ_gE)\|h06U8dÞ c'8fԠvW݅!bS0BbLʋƶk_$D-A\4,Zڱ:kE{'3x00ܰ#5VLʠzv!Thy $U+I0DCa.{p n3F5Ͱ WV#.S5k0{HvAJ/Bp dW D* JLDЪC 4*KҀu_p,xjJpZe D" (r,0ޅxF:Ax6{Jd1@ES c<. ߠ5nj[jN&d Vy+jxW"ys@ "(i\Сa1MޅA=&Jrl)xjsuT,؃*A-r_(UЦЇHIefm HgpMs8TLudst-cdY AcvjIS҄$@]0P 13l"Ln2S1 4R > SL,ȻcH MWř}5*bh6vAR=8vR h:6qjj+Ed.Z1@8G/u9Aĩ G j}$f֢aI3CЄb PtV4[a1' /!3VL$,T*0QᥒPN\D2!A^㖤>Rb* " bH)a~#`$Ŋ,BR1Dw1pڂ7ydA FPtA #UU5kP0+GvP~L %J !_^ϿAY\ݡMu>!LGKdNNU1Pp:Ȁwa2I'̌ه &W `FܺTR)`2jNA LR C^%RGK»+4)fxE^jiC. aD D25E]&ӊi$ CE#C;sJ2yPRR z)>9 ;U RًvQ|^ d$oR#0%T0<&'+ ROZVMb hњC&K 1jUAtIcH'b0l(O|$ 0Q00 pXJІ(JPQG]:,ZqB[@Dd+ւ[!)P4 'UB )g`퓸60̍kY`:[@0\aiKMTX u[ӀdLAIŒfIJ%@DXYXMrp1 5T1+=AQR Kl;1O*@1/Nwv4Z#I$eH L:" 7fx#kqF IV*T*\H)I$UYО`-*xA1zhi`Aw A#/0-i*AP`X?T&'eB!Ј0P|R&X:Έa0 /!6=ԉW=#'ڕ&is0TSTÞG_T0`uXH-Ua--oCHm&ц#4"GgќbQbD&8HMDhK 2N;K ŕjL{Qbv`=LEQe@BJy 3Yb16aRژ0.$& q[4 +h A@x ѰBz's8DF!TMBf9@U Cq"qr\)3I\krU|P.P0-t NDJXT΅2V  pq pR\K8m!mӭ׶1  k'.)k* -Pk*V(~Z!iN FVPZK2/AE,HKmi ղr< -*#I'U7D*ȧE>Q))bs t$1 D>F>|~%IGAqˀQdEgux ` D퇚Z=k7,*afgrxyKH7c84CbNŪIӆ;Ty}.Rہ7)Pyܡ֜S"hs0$K5ܡ_hۏ$Krh,Fg@t4?5>H:(1^|R<}d/]Bg~&[# ddtnJ:@@uc<RjXBȐ,'H0I(!qE *>#9k 05qJCؕ#W=̠l L+,Ts/%`F4FyO3cI*!\d˗l\h؈o#zlծ)2&i`BWd̩h&Q@W$w3w1 ڋu>=%eR&q ~6a'P[W҇m p0H9#HGV Vj} !7\$a~j393ɑsU`z)(vDՏ8+P< C[ĊA؎uvs^Tc0ӯ QYnB4^Hvs=ôpopڂ8us:n qsqsk%820hbU*ۑA:uqJ3Gϖ Bc)ܴگ:M~LF?Nt;J'zT4j5[Q#W9ǕR'OwHBƧ:s9E ]sNjl5YE,<&H$;G[ .H(Y ͠+Lo¦.'Zy<E9Xgј 9' ^[ 0 )A9i.%>#G7="6'?AIۡ@j@"@LkmNo ꔚ,5UswzSa_:9NUK3QXB׊`L7YUQ`]Zh Db͖(\bFo)̹51)K ps2%jFi*gbP`r>yի:«ZQ+fs?}@r mt0%1T\b\`(YwԃE@s^+gc  ~eRp9 dҒWf8ʀ 0@bA:ץ\0d)K`Vli Z+QTyFwЂCF!\P tTv^y#=6HUk ~bn#P&z"Rng8 `g5b * A'*:H4Ke#ixS6!i n+kKS)&>ibLaSY3GImT@Z$ţb -R@G]*2ȅG) ĵHdZ8!SÌ*jRvISNI˓IM,+"BQʂ8\ &BПk^\yTcbrc K.פ!Г $>6h/ab_^!960TyObjꟑRMgHQ.E ~U*HvE*d"sz| n6bD0҃ Pbm5F UB aR }QA۪:64_HVt=;'ZTؗp?vg(m򈇠GVGSfE=K֪e:mr>r>u>2 v> O^)޾љG"!i0TUaM2FKQjӋI(N vyJ8TAk% (+7pҡS8ԩ>WC2?'ZLvƧZBnp fP0"(ɺVGt9G*t0 Avuw.Eyz]֪c). Vad"X=D8%B щδ#tOȜ M 5eр @<$N|tTCͧjMfFH$sBZ-T:ŧT 2(&XHa)"-'0!U_q1Bn_`} idx^=#0 0 VPO0,jRI! GbZZ2CFoPW2N84 H&K-E+8NP#( i)2IUIy9*>]1AcTIWP)1+LEX0hZV16$tr[XV=0j7ޭ οL\X͉vAht u~Vzm3xɓ;OIreyLpDT$6»}=?LR>.rl!pѤJ3(UݶʨFy ,$$焖v!l[DBb@hw1uA#-=Q4&_Ò!?UcvZ# @@a/GI;]hS`#'ͽ~g@gA{'))kMX Iv  z IZњ p v;7y;eb*yEm5Sn-bXTO :%mQG#nYq> ce0VǜgunrC B6Q:r@5aly]Vb閫ͣ^bZp(͠0H 7Y-W{*tbGR:I1IG$+2%N9JH7>yJ'd V:͌XE \ Rٵ pp :|hIת3š(0Zk4)3VW|t6SZ+86 W:VVp"vbn\%~*%$P \B/l]RDd65ѷԬo 2I*n&}p!},RgMM+D<:^ 4WsƂDyf,ZD RπC!h"bhwHޖ]"q5gnwge${âYITqMH)-[у1GaJr&߱b8{]UW@ p/2z D+5{`Dp_g h+1~+!X[дUe$eHAayFrxP4}v)Ґ! }5|fHAh-r<8 Q/C v}ą#l-/sShNH +d)O "z#CzB+z`f4 #UP pגꍦ%ȉ-zmLDo%QqA`=&akEvnq ( %~$)t3 9nQQ/Ȯ?FI?i&00 sV[ZX( sp%(md6vWAN. [}PPonTIju m 1* B*$笹A/8gS>+F~3*ЉP?.:W\Q)d2VKC[ ֖_H*P=.V֘GsOBa |W 2abPSd*1a(_ *S"짰 V)$r2KO3KSAү~ afԂ45ƙ}Ff=w|?e*Om,I{ w@FBZ.cy`${lAV:G[I/8&,Զ7OB0 8ЪOfBW2Y@1JTQ^T)%vQ3,K]-BOfRМSJrҦ lVf:fuF4 慤ϢDE-e Hj,N.&$3!L+.Ȇ$`& Pwe) e;;#Lfʋ1A,tKpz7A*+zger/\b z{Amt6^TdUUz]RQL NSh)xOP* M8֣#zy( 3(4}jXZ#Ajֵ;?ak`  yV 9 "Pd9 D[*B`0 ;DدENh+$PlhhԠ ƽezR @ vU{+0I>vޛފLL,P&ք.'g Q>eV;ؿCXl1Ř;@ G#jWwŽ.|L*SD2)LRRV&ULS& eR +뉨LQ&-C+rQEZD6Z]D E0ۄ`q8MhjA5}V=A0A=TcЮ!1S2< F"kL(dt+R]BWN~.+/BHC Sz`êP&x=DŔ j"+7&ҚX=DKjb'\M,K`2zDT}cfnh>S0MC~(U@8"dY&BfyЬ9|Td8,+=K>r)e+:++8 H(fay%$uUY7 juU R̗y$I' QPuUBU%d\5\U\sOA } 0˃d^Hk,Ora(}_:Ҥ@(‡8.;-h)fR@ nKT%Z L 0(3Yna&0@Kd 1\uHE$K b@蕬vl8QR`[fd~q]>tNS$TԲn%(ׄ6~MInW\0#L`pZZ!)_FE(`E@%%%&*ĎxRB'jz1SasAdlN`xu{bEismD,'j涣Dےa#>-DeC6map[*Ll)YؒDW&DsVeI%@7Dy\輦΍cF{b!C$QXf^yGra=iQ,Iw,Nݹ[99%lcS˖:S;NBպ f~=i#4_0+Yz!]UB(# ]XDrQTX/dJ/`};}hy0AHnuۣQxvAfչaiu!^V>aBpI 4L ` F`V4"# W ZiB l2P%+/됋j/ e : cָ2DJQdZ1|*k4pM*LPa!BeP9'@NEYt$dAy~|4nTnTR$SQI-TJfjJ9HtH#h~> A|K\E Z(kZ$ F*mdDNS A̭B-|c:BuaJRnk4?M9VD/CokЖR>!)dTcKJ=P aWˈZQm BnC_ڶׂڼ2D*qk2qk"ϭ0CS!RƭŐ+YnM:P&nMݚ@.OKK wLm54&*N - HѯЊ9T. 0XE Ƿخ$1;KaMa.6ل} 4P @XDap` , :wDe3w oV`%H Wbr7\\$p:q(fmi-e•#$Kb\¬ A.mMV2(4up\^_&5%y сnŤ&iRtuݐfD>) KjT({4V[NN4˄$SfuLjr:쐚 JꩣB$G`D]~n3 V8!`B5u Ae%_HgMR&/ƵjcN6*Ge!_/L{v4IujKM|=vd}䦐i2a ,k\Pa>o )ErAF/Ȍio%k CqY4#dDl@aziB҃S'0TA 0L lP.7I%b*i T ρVi9|LR(TR]TTDEh7]>$ qDQ6 );j0 vIȅIP8b/nT/ uFT)w?@㗖2P$;MS)#e#2{h=G+v SxH47/ Ҥ{({LCG/X3 U~^9 TYF$eL w؎P{%*S(Ԓ*qr~DGl]&$Hd֓hξiW4 rJ!$|ܬ]U,VcMSXfG]RAK]BcͪQet W/mRE;ՃVpb.4 tT؉Y*yd-UA cUnU\VAMor'Wʭ[FͳܘզܐܒR* uN'ȎV\C-ޔ2r7 s!qRlϩ $.xvTqpЦ0  7;?XmPu"a$&(NH%]K׉LiPtzb\tI" Ex+$.HF@m:i+}9(PxJ jm|> j BTZ`4Ky9,lyfR(!)ynHvȂiKn样Iȕh4RB DbI{SYQnAT"OIZ@XF |<Oo`5 "XAiŢ!oFafs0g9׵|#(d\6.=IPY5Y p=0CN-G9YA¡+eDȡ+T 6r GX`\"FP sLʐEDW_$%e$65@Yҟ'"ҴSmghIL֖s,[qRCeMX"[B.eR! yӆc+>RP{ X10$^]MnEr5H ] +L{Y%R%8DDBsLb,9 "5b_jA43AGp di\$kyC؍m`ejۂVM`7i7].I!( nZ7C!)45D'lOÓ!pt9Z'HĥGq/UtĿ]n WT́hS¤Hh̆T}c8MAJvՉN&Mp_NM`cBMiڔT:ifv36AC# q M!>zJ ( Ci߉,1?RQSTف$L&qQb\{ā"V;pWH"+,L&ƬZ!"M5,+'Gs48oAQOH.?ZHTn#$jGǤbr859&LzpDMzޞDȜ5 9-ҙpJg3ڏå3T.q93S:S&[d =L=AKgCL̺5.QH3ŀ<)qv/,I.QRܼt{?e~gx(=U`#@څUKQt=(D o{ĵ$Sb]"n~yþ 'eNe_ O{=H{=@ZGei4Kf{\+ l ciU@`iX$Q kk8ߗ1AY JXsTK1g"( ꈼ>]3<4FiVE/.豊B?YS t !½o b>V5%Vcdꋒ"(I ,ɂc`ˬ\RWa%whIxjC5y0!m8g;5ī-КI"b9nj,Ɣ(AtL*IB icvb;}HCQ~N@$"dΝg [8(A05ϲ#  O[54f ;Yn VelAqt)g@Eg ca@$C|6P\yIP<&[20RTqmqJOp9WeY'kIY6W9Q,Zk%y&Ō:m@m=D 4$1dZ;줠iBd!X;v9$^Sa'Zj9z |vSN% ,;H*H[RH}0A@+^H,+0BP)]O%hjFKQ*AKlʹ(PehI(ҙ-W5{>jsrVTYT "$Evl&H惤2Kz (}۴*PB;0+3BBL"$8j&[!%10RB`7a3!sҲrsyl= "vTM=g:P,=JS=et:P*-(S`&2JDFL'qDesR-VFsи!>Tr>did IZRa>T> 5M5}R̄bHڮL =2S=aj[c9B4`+B,@zh5ԃ"Ã0OmQD&#$2ED$3kQM]:ta{x@w jle=G{674,ǣze/u,hx[?տ|7Y=f?u_0L<vq=\<_`4Xt2XvfL):_+艺g}EHG,fm nYwHAjX>8C=Rߍ^kZQߎ*RIr/k %(l=-mf5޴e+^GCczcJ6 ?)哋iƀحFw[ۈ1Xfq>]>}xz9}_z̀v5~8?ŒԣJ 2l gfcqfV!ߨܡJ. y8C]- د;-6^t3-Z3_\MG\6)Hy쁠t}Q@?XTC/넯@L-wBRd`~g^*JPEjk f`;(fƞ{~S#J;EI'(V ۚ# _ Ĕ`K~'eAvw^ux0zQCzӖmZ ˑGx4݈X{J Ϩ7%}o[|_E-F)a>>:ߍ=O~;g vo BW)XKhքXq>{~@R70ԈPxVԔM *?ZDJ;Ó 8I7ri lWAC{&hws(8@e3ìv%)-q?ZnEʑ;<#WbWcbi(ƔBazqOz&pխsu`G&rTդj] 3 ͍GL;}_vP?R9 ))-3Hj`@ti`z@*,U`SE*EDzε|h c3KW Yz^e=ojEa~,S&EN%dPrwU=q9?`D֖üpե_`D2 sB`-0x9'WNKPVwZHk i0R6 `ƽky2; =XK*^?_t}}EneƷs-hU hW]oI5PWU=RURCW(8UYE+GW=jGjy6먚E AUSuf_U-<~_fhfic4Z}|own?a!}Cg1Oi˽'S,gop<%J}rO <*^}Std"Ϳ>.XO?񓖬g*VF"QTͪwl5?_hi"}8\:JcvDQHj~LE_-[ˆD$=ȵ!oh'5>3~.lH h{ؐ_S )7Y/~QO4W>/^AgCߋ1=TT|,1FY1F*z =>m6wb+ c(z =HaD 9QaD"+:ܧ!CW3G$="$"u?%== 'iiX0oFe֣!<,D2G>II4ZR uB>gԐ,T&(f*DPp0]Z?yC4oMo*R3LW"G ;ۦCFX_.8gOq1{ꡤ8S«^MTj(#jj?%դtʫ^M&(@@,eQ#7a&2m&11fK61lI~zl)(ڄʮ 0rV*)T[n19ΖPU~֊@z?s@j]h}D(`c%HaI> S>%i?Mx7Y:wPo c෰6 **%=uBV'YJ"PCoD5=NwB ~ Ew:&GӀ6JFlJ/LC~1"DHEYU&RhMYosw"п :I{ST$n0<;$Nn2p?pLkqMFnLv R !nX2 m(6 U44iphE\Y%6 U`H4?UIúC\DLj+| GV,f{R3.#2!seUlR7u E]ڼL~hEi\|rGV NPMQ 7{‘^IL]ـޕ x xcB/`^.Wתo t2`)i~kTʈHkaORL5jYt+0E\\eM t `.ᙎ0(\\"$N1LQٓ)*3rqgoLwΓOw{3٠:Añ#ـ@iA̎RDXASAºB8V4-Xn#QHkt"yB4idT7 J Dt P&UX4zJ4-?EFF"9PR$bBo_lNU`”Dm4J5cueH)nphCcˎkY%\j:``i+rT-o7EIH.Kb0$4W"Ӹ椃&mA0~haҒ o1EECI1ih%mA'DNLRlEHPغ9'޶I.MlfD S$̌drffR6̌LYh=,~E%yQE6e@I;B |B`VQ$R޽ B炥 7p۶L$3]z5BeE卜X VhdUɐLFJQH%%+Hۼ`j}]:KJʘtLY}\B+8F?:n2hTh.L.a͡=DvdtCV(-Y赩由x4J*/Q"1{IU^(m"}q([ J(0bBV z(L%z#U|IZ)B&V&O)G1`g (2T dܐD m!0dA}!Z2 锬yO5A)Eac"X&$DBjVrb78(-Y3) Ed BW].Jd ( nsv*Q)ЅdFVI=TN_;pc4DF0^86R 5Q7R(%3 Oz) 4mMwRrT4 UӪ.m՞.mA!~66v2=.) [9EF;&Rvi$JF;hVQrJȔh, lǶN] b6deCREtvuS$G{Blk{, @+b#L{/Y}tUL/04~ %ztGFNaV[+#Ӡ{ȁ4E΃S᭚U^]J,R¼0ʬ¼|X+uu{.C!ZR))@f$!g-OUbu]=z &WtG1jyɃhe8!M.+r%C3=D@Z@]̒ԡN XRHivh`/%Pt#ZQk" 'jD薁T[L lXkWAat"{LCk6P뭭+@4k(@SM:@tY R{4 MYb~W1$0j;"dﴳǖX oWaQ-&cEƆ-`Ô UZUi,p仔=iaa㚒qD~):7ס=Ҹ_BDXO0Fju綅NsiR ]b  b#Nl&TʬNb &u,B|KA[(g) ,Ex"TRc):RtR.C :3AD8c?[]юRQ80adUAbYW4&g> /1HneNh*v4=[+HBFN11fi L$I՚MF0l/I|vy Y6Bq60%H(z.5 e~ Md~F>l'x xM U4I/]E&k#( RF蜀M" D:cTqUB*}%YCL$ܘ\dSt lJ5[tQAThmԨhҒBF׃\&' ZE(Sniw8rSTH:`H9|bn 8'B{v.n;+ᰙ4xNUD;ؽ뤇2@Eeru;Hو"Gު^IRBv\F#0J(Y.bPWV|osQ0 9/"GTgzR$ED42zn(\x-0č7"˦0UU /651T,bZ|Qn(l6^kޛ Q 2JBSA!*E3h6 ѩ),>ibvn+Ԑ HFd0*/HFdJFNKFsjN {^D,[D]4< tQv$-11g&B3n9ptA0K%0ˍ\Xv~iqҜ.N! tB"BUNQa #TLaD4 3[š89X&Ry`)S 4Z4 (S~(!l]!ě1f-T"M5x ^Mʾ1g1uj }Mk+:YnR4lb0 V)A=?-k bݝi'T~֜r r f *(|Eve2"]vS$ Y/w!fW6ѨQw]'K^$jm ɬH` *R`:;!Lj'@ L+qAIP%ByQ(PFJ Y cހPt"; ~P#BjwQ'7qҹǩ_ڜw1]^ dy&p7̈́nN9yTl(X*Xra@ƴͅ-M^̰V3D9 D8 2tt+i `˸G# GĊl,AVۄ8!\+qŸ9W! qڄrqm.m>Di*;@]gBQַ]I@6ݢ+L9C1XD%A^.٢K[@GNۥ* kH+yf C;rT}O 쭲N5CH,twƢ9#^g}>R`C QiD٤Uca#a$H*tr;RσWA Xn6$o]"O6_E' 5F,xª<%)$vYϥ3I8Gw#pA<-KĈ2Ԗ BHnRGVN\oK~)p}R%RgRKBZI#t ~TꭔoA$@:7̾ U.ߐ/GW>kjj_"ġ(Epa)nNY*\{l9蜻ap*xsT A~ %]ePFiZiKU`f=yf&u:%bC1?E")*)P%T!l)7%TQ!hC0BjWA]"I"|<3X{9]ID ӵD`|RHTݝQ5b`FVjer'\p0c P"휄q3䩤1+C"p$W0e"qƾo\ !%DmIDJ,`T82L:u i|k5G>c2g8ǀ1CT ߊd؇tLC?Y!D sʒ!:ʒjgTC-^!F"-%Oᐢ ,7zlUQPQIPt),zaxjB4C\:,'Y]4;+$oI9SGSIR%Ѧfm"c@-K\\rA^-Ae UAh*蕡4>0d2HZ$Q3HeB `/G_se,F,doHu. !Y¶*[DA+ S?W" &44ċ"f܅4)V %IivsVF$KS[4=̚` D7t~ݾD#  uB4lԿcHMXn#=▁_?[ur@NˈM62SW.Df"S,t 369SRer3J +ȅYUi@vQ'o"JTf.YTŜ)@g)4V8KY TҒrL@W_^lQlD.i%Ӫp@ڠaQ kS a0hX0$VW#t:FtJ+͔V$!_ ˄@`ǣa+F MQł BOjs*尥.NS5IZ"MkU*Dtneq׸kD$iY!\\ .!?=( ɷW *T*y}!{ Ėu$1y9;%溙<_偪9*vsYV'y-ʪU9\:a7 U>ɋ\iEU.ՙR#:5bk,R1 dFs?VEB% I*][PB' .*0|EX cDsYr 88%2]@@TˋZDw f}W0Х}廴]&\22j*oQfhI6h6(hW(D-6F4;캵[ArSedK'(رCԭ=%; "%CqZN aqZqZVi Rtάע"C OT0xddu\TΣ|[c6dH>՟#Bfl85+0@W\XIkIC$TeP4iH+DctV;J0bME#2iiZ @dquQX,K0+3;YL! I(&W rj*tKEb!~*KbqmAր\SQ:;:utqs3mNC|ۺ^0oh _5A^L#s]#ɄXld}~ǜQڢ9+w B"m.\ Գ$e,ZÆ`g]?Qco5 ?l0`cAfSxѼ>,l0K㥑tr`%m6Xd۞ ?pq\/Q@;m'd/&0X,PBn^Wս}ª.G ( qKID@J'%i3qnK,Yy ,-o$%I-Qܖ3uV+ +H4Kr(GԿ""%*3w 2@P QV oŠ+(i;1 )Jŝ0L0ϯNn*E06J;7K8o""ۥ wRo lwt񘾫2 )$~Agq].}'FX Eqͽɼ ɘ+&jWu(f!WØYQ@bPaSBpĜ6 aY3yX 5;ًaH`a3i@"ݩH;6ZghP8q# RJJzvLX\+qlI86I9Bc'*ąze- fzϘġASgԆOܘz])En ג3(I%n# @/vi;. 4xF:JS 6o ayjZ0K\VBb fH`y@)Gݴt<IGQl24+(cUY e]bCJ%2",TIBO=?^BYH;Gc R[ ̹$C~fXHU\ѡK6f"L,Dm1ъ-V`fHzd[mُ [\HoAfI1~[nRMj&cGWD%2&ԓ?Fc!6Y!T3Ɏ2깲&1>&11r&r&Ka"KY\jɢS\S*񭜒su ږFK @1o܉1'ԁ&Kfj.bv1rNR9@vO-\z sՅxKiHMKHAS-J$! {QF)ߒevg~ EDQdhpdfiPb4J'_e^ޅZdBx\.N i<-z,}'pL6ZO"vx MfF=Ӱᓶ$&k%WF)T.VepdL&$#;.b#ǮqW]b&ݣTuv G&U^id LG^\51'&E7ޕHyA;#yǝI?Ýd"ӝ4 Z^S4{!?錤DXASA]Ft05-<47"ЉAO`P7  "{g'#[~!4:%c2e?p>j:vUUAUZFvOѻb9%t̪%Kd.'Wl"t5-6S+geNy龠|SBhsIuc@vXzbά0z±,dqW?Ƌ HȔ 2I] d/WFaFxA2^SH`:p\\DAŅc ފB2:mIjL!1ĝ2Z:L5f@1ZOh D6iNP;euA4Oc3~T@ 2;ycڥy,auo[tLÎ5ӫz25E%a7Xc&MI,R^(+7w*/aJ=Ou'T_XϻASIO`EV;(2Tv2!Ld,2DkCinh"ZSjG$ j*A5WkvV"Kpnuk6grn[F knš@zy9@+O( $BjG"0!S+a( h -h3U{u"UWʅm 5Alt$D I5j +@W!0GJhOm:<2x p 8Y}tUL/0vb%"o-&EN֤w¼@U&?:--!,_ջ׿.%K)(s+JKDJ-DDhֵ JDjvW+;u\QTIiQ%Dd'$1 #P4)㺰OLiwn*#ﴳǖH0!vG8L6Rء%bBcI&ˊ5:| `Nvs0Џx :Vl[Ί5Yv,R6@J 0p aȪ~]Q14łȬ+T+_lԻ:Toy ŏt"R7HBFN11fi L$I՚-Wwauu4Ũlvգ%X6!6vF7Ryo~-#L/G*vQ ,s6\6xj.J|}%YsơA0VN)س(ix@EFPKH*w ;I::I>h/ÍpKCR תU6"AǵjNs^!]菎®cW`: ]@K=U8NK+:.Ebpe*^g wPpݮQ(EJ#&`jKd? @6krCgaQl&:/q7$='SNcbfSvd8 wA0Qv"LYDSeu;vzʔs]VXrcJCpQCΆrLcnZGO)O&BJ$}>|vk= "e15D-"):?c:sjHK u){۷N3 H 9Cy#RP,z.-5&*mKW $FьdD s<>8*.ެ)ol0arpOcT:Ȝ?8@:']R; HXDd/uuarrެ_jmA9UoeANw BAX$:w蹙7Y5Y*;̺,ϬCPVu`Ms*)P%T!l)7FT Kd X;IDi\:̦:rs 2sӵ=M"lA>n8Cw'bTPͷIpP0;'6T琴e% l[γJJ4.D9!roG3)Ub}դ])4幘ܖ_[^k$r](>)uoت A gC&zPY4nVgk&;hj|i:\dPJ_c2eTP#g)["R%A+] 闾tD֬twR\}3(;phL8[_ؑHakL %IivsVRod"x&Z%lǛtb:n_Yh|Eǐ2$?o[Z+N.2ɈM62KI},2g$< r\), k:56 =z^D'ﯗ'i$jY6Y̪a6/S U̡kavJNhwJ+͔V\+3¬t뭝Ul'Si.Nd5k4L6VKLOl.CbJ )"(XJZ`k:! gZ,XaKOh41k$>1-Q.YԠDF\ 2G[OJtMei#JoDF" \a?xr*{8˓ NBNÉO7 m:1!5]R/Iy K"m.wڦ(D;2n$a AJ!H#he"آ%>a#>)ɍ\]-3{$,1IT|̢3u RK+pe>²|lƒQ d@4c?j7zLŃA 퍕G` f)>{!>Ka(4?Î-aAbtт^ԧ '6qĴ=} cZΈl+EBD'$CX€,7|WxOtMzf+(is-B(748Q$7SDWI PdEGYNС·ȌڡKj a ar` ,ӡ2U՜$xenԑ -Mh3HG V[SX<s7xNJފ G:8Ж!Nd3i2yD'i7$Fy<C0GGa DAؔ$WnC=2 :ѩ#El`6 9# -'40X?{Rط&_CG|) -L$Ole)q̀(0Ŗ4B.n&9)(KJY]#f.»:1E@Y" mH)@`gȍBSdq~~@#Xz0IOrq;hqc@h'$Ϝ<-`cJBҩ>[WA NCz l D,hNg̱eVI ~n`| Bd2Hx|NIEMPqY@DreF7FTf!@멞&dp*h" 5Yk*mgMܫ&kP^ JT`) 911%M*&a nɶD:Jr`5ţ6 LäM` h@vepaŘR-vFKklMY2 r0Lr`7)R>P`]84g(XL~MN-IZ7`^&oE("dؐPGҬfl5ʤ|QM VP4@7o`-  i;0)O.F\iYNMZhf%6A^)mȸJyȭi1 55%|mPt%a@Œd 䦐:> .aBN.k9⏓ w]aj:EW([Qv\ʻmIJ*!zQGu8<M8easN2n23yp JiDRnHfq?Je,im(Dj\*Hb3#,HFW*!9-ů>dS&Xe lqtvLd!i Ss[T4m,"q2/qH ,{IA"g e3W"@2W"垴hJsqZ9q,@R =dNE|! WcQ;ǮPOV1hliafIQ"jFE4`Wa.<=+޹F0 vPC*Ier( q4:2XrjOb-Ӧ/#3c6LDh]eI |~"'`IT'qG~RiADF<$$ښ{,qbft&V{͔֒{U\b9Fs_uf/v!X뤣<V @c]f6 q֭[զ-գVΨko5uú Gow3֍o.Tbf 7gֵbb_ٙIy|\ߐ|)f̆Io*z4;15n|̤SSjfjZΛ@fŃnيKg f}yzm4 ^mݺY>'ى nE8>ujBlٲ 6XMFY;aubVDCxOݼy˄r ;=51=ڬsZ=%Ą;T4ek)7$Dž,7MG˘L6~װGi1gg:nvlH +q5.&nqWVlV ޚ!,֭8=>3;)RNםbf*VU#:'bӍg딞.Yغ92 ̖1.;7cipPިLhZ2D׮m̐m>޸nԔgIrbÌR}a3bԬ!EY׊Q#H%hz >(pj6'2 j?1vfjԸ>k7{\q|)ONGo sz|mgubºf$'jT-jr&Xcgݚ{GGmټybfJ۞x(L̊)5IڢaGv-8xZxnz*V7NvQ#H4I=3;'F"m57~fZL(_X"vWvDX<9~H%#0."smM]I<:8:6"2L[bG՚(vOnz*^'"N_]匒㒛3Y-YīU(oU)/fC쓽]mvlgmDfM;~Ԇ)S26352qk7LoU Ʀ#astD:D7D0v2Wul#FNn^ L:BɬKLlPTUbK{fwǧ RbX rY}=3qFJtޑ}@_i' W7p@_i?;L^1<'>|4'GSh^8 6zy0 {oݗᙾo#־#Cf `aGhd>}~w.XF=A~o\z/ۈ'_{WÍL_/HbvcӷzNXJ >hIoiQq< w#FǃXY<^sqF. яCXJj6FLg.0D2563W.>7L/;ToR$:B'>eN g 6W=ѶA[d)#Y궲[!Vcz Xr?1YH/L? \ő ;Ai$YkXx2!w(pƋDB_IQlah>%sK{lG@B:VϪ1l0!?҂e;4~?21Q=}@c؞2>6kNY[^ &x K[oߠ=UTjUb08 cw54zgAM'&oFhH FxmQq|aO҃F{ϖix0| 8d`+[R@ +lF\5:'~a@5lbOc]ӳgvn6XüD6Q]Qy7}Zp28A u v׶?1|p}?dF0A\7Z`gOC,yt{ݵÖ+D8 ES*qa E2>f!B]\7`s31se|}xir#tHîh83 ~XL\98nrx`Ö!tNC1r[ÃCfkiV+ 8 #M@PlC#,'J`ȠCxo4aa0~k,INn?E@oQ92dV{861C|ö.Mb l 9!g;w F1a6cϘkҡve I۹~ނX>UhXVZN$a2f~4$LH!f0%hPB(ϛ KʳG #'U$e{q4wCNcgdfp2FV>;h]4Dinj}Oo6k{G}xr}q LsOƏepҍ载ز5N'#E*O'9.-6q1kmhF,['L3}Z̒6Mo-ox Pj(^AKjĺ۰6nĶ=ZJwÓ}6ݝ27Dh2@=D{#곦1$0 1-`Q i0ˆ۰fֈ'b 2 d cbh\IzX'\-%%rp"DDtŨQ([pvRgE!kG#+Y}Q$l :!Oj:[!Dn~زؽpكrp?C#-U1i*,q u>^l#9{QGG h!/}&?v2npİ7\thE/|hrȕhOc6߰=`;ŞH 2a76Î^"P׶;v K,W{>璱'FGc?9` Z?o$rG^8Z;6A,}QJ vю}Mi :f*rX,$Jl ܐjXk\+Iip.#pUlġ֒Fۈ3 *iXE&a^N:hF[,` &M`$E rcc85`m`vG) \b/倅G"qyMkqP*i E{o!Ebe οhdboz\֊e76C`㰞W !> MC_ slh"s#SzMO`-sH-nxߖU1`0d<&`у1﷮L]eҽf6b0%0a|t,ȾI0{b؊mtcȫ% &ƨae n..nĪge}Cʯ6"kĻ24.FZja`-Ċٗ<׀wbd *th; ao#'ꂥ k;Fej7`-|`o8I*q'"0`1pT =O {Dܕh jQpح1:hi< ~rz mmcL}pqO}K{ݸަ߹Hb{&jm]_q{ 4<5#N^X@;cx!d<, ?G$mqB88~x&+bpejxnS/Lb13:VEBFu5nYW6Lty9+g,E729`]`j;iYZ8F l GLrA?μ3m,Eu=Nm7^$ ڂܧYc?dbmͷ:},|xD,$m99gz }@o$e{lsH$[cbuSOj1hp<}#CIߧ-;doÉ@t>Xoư3# 7k离dq8 W:۷@[=Şvrn:6[$c8bfàӇT\PTh G.Qx a& emqL2'fPrv:8y^W( 0ky,p.7 8!O:uڠwgΟ?;6gFݴfb[WϚku _.'ms_8IzOZs>~6u?1]u;_zם}a{}e9 '_uk2߼]''y=;_όw?O_:8|,=aßǾk_^,WYgً|}_}fw5Y绪=/KY)ソ_>};|yus_x/'~wq\8>_Bu99^w=7?=c{={oe|<_o?z]}ϟwk/y7u<{zx><K ^:WNW<ü}yz__'g}zX4_~??cKu~n>d=>;ۿ5<>m?{|ؿ-vg9?㭇;͑y统_|_uw{7Ko;qΗ燻k*z>k>P*q=|*|ow<_[_xDZd_zS<Gv?/%K:<.ho_YgkOqWq'܈'nק{'3O[J?^]Fok'xuA}:.7y<;y{w]Ͻ}+q_y_>Ϡu<}<[Wq'[gyxyϼlz=u{<9t} O?8Fw޼|Wzt˛{.3:xNh>'{7Now?_c=f4i< nN>,5|?%O탏;֫쭟s<>3<}.o\z}q}{8.C{ lZt9=z}b:Fz?Eǿd<'yy4wt9<>ϏOC8;?{ ǝE:[׻/X͟u6s{=3m}5rx]ۮt?Fs=,Z'Ytۼ8Ѹ/Yw^??;ȕ:{^)f)|mf;?y=f_|<[s ͝,':_?}~:hgrgqe{1r7vG=VwfOr{&͟\g;Nu:p. >yv^;]3M;~f\ʂqnuߛﷇk=/>c>{-w{k׿;{_jƽ57zWz2ԣL3|~j=gUt럱$,ʒsJi|/ivM^Lc>S>g^97q<3E+$|e\]_<.z^ޝh&/^?^ v'͇p^y1ϗy-L~ǟ׽])xO>u~}=>̾qc>?7y;{~5|~;s]{3ox _ q{?^Χqa^|:{W>j^oFx>7y}{wDZ /G=޳~lfh~^n'i8.?Eףچۆi\qW =QZh{;4O'F=z.xy+1.3ϗ,&q]8\oƹ}8j殇3ڛˋyx߼y\Iy4i=>wO4/w]us9ιt=#yky_L\r\qA|^}nϿ>_7q1Z4tSwu.>Hjꏋ=ߍ>|AM\W0mV.WOqxq]? ׇXύ>nu?7_^_ȼ~Ms߷uy>G3[~+>52= |O{^j]x{wy_{}}Y}%5ׯ_ow_/xq<߿ܕ1_/~N7dy'#/qR~xgwoO~.|>.~_7Kx]~}<'. +hs~}c|ߛo)᭷܌r>u7ַxq~fyxcx=3uy#y>/Vw=ޫ/_>g x<_,>,G.Ox>Y~4.#m _Ou۝j5JǟG{8x?_g3ggiަ}?zx@boYF뺒^sO y ץ̾uwf=|>g~|5}=tϟ|}>͋|7ϼ0t=#ov=B:#!+_=YLǝ}]/ۥ ͋xYY_uyzuYONͼh]f:K~yxofilfkqXO/ݙc=]3:9q84o#'~Dס_Ηzcƿbe{66w =2vFzb csg&/_zg]q>?|;xy 9.xgy7y%zSs?u}w<||ۗkV= c^)l~z^_ǛσwyC{):>|auՍ2R)>_/]vy};K{y2=:Y9_c~˗c>?{]qRϲ:`\x}ίs%g{u˾>umՎ+.~[^/KnyYhyj>Tìfͷp2ZgշPvET7"u<}:Y-y,w'/3Or7}KsZ9? |9z5j7 |cNf6=]H闿)tܭ}ޝo0+1"z5wHJo4΋i=kgL"w9[kkoS5Sz]~+7S?i|w?e;mӾC'oy[k{Ǿ?Һ OxΝy۷>qWǾfS߳'M_7?=u?ͷ!9M|>X/;9V=oZ}ow%_m'872!{^Ɵ~E;c՛W~iy[3 w{g6./\}-/ng{A'{[ˎỹW([/vٷ~o<y|D/{o'޽ߺZE{~';~W}f^l yr5gMyn~?އZ^|Ήa}/mxp|\u?+{WVRײcNX}~ؿ.)ԗ{7n=;M[.o]֋xϩuj>uQ\ 7,{mݿp{-O8w]yI{NQ_;[}ک~'??yܒ ^uw\~~g}|~UZԷ#{_>>uaz~﷏偟zYߺ/#qKo>Ջ|Sm+_?g/>}!:[/ao]v{G~cq}f߾g_G^rf[Oy[av{;3G\;poWpƿ~ro>k;#}{^wC{W>[o??7pޥG\{듯}.|%=+x7}O?ێJgo~]4إ~t}ӏt=B#ˡw_3ƃ_N^YwOΎ}}ݧ򷙧/;jϥK'XoyOۺtGL}t?c1<O|=W#ڻEW_|OwWrȗoXtJ5c7W?zs~\8'vzGE/rߥϔ:3GA3>wGO[F~o_uo})zn>'\sa|̯gwS3~w_k?/G|o8_9o{SNm<⨿n~v9c}Ǟs >k|s{ݯ{ҟ{C{9o{~/=h٧.=7]>=/5} O{-{O~UG􀩟_wt?>h9G\GY}o_O޽-w_cOx |ݟ-_ջ{)^󟧽{C{?tYO{W}n.zad+~yOXv#|^羯ޗ__иO>Q^'v[/7t}+}=_>C;kncׇ_}/8G,;ǿ~?v5/6t䥍?pU_=p%%#_ǽKߥ^}ۅ_}ϋ~wi w;_ȇwSN_;^-.5|x##>w~7]zѣO}bn޲\}/q ˳{#nizdwwGtoב[?=!ߢ߽ʟ|'ǿ^w~Cⲣo}[p/]KMGǜK^qZz+ٟ~Ƨ}knyy8.9?o[3V|] ƚ#Oku%}a+?5C7|ռ;Շ߯qxʘ]oyy<?_w:Mu<~|y><.ˉ9Kygxg58σ1.7yuO~</7>;׾?񌟜}*<ջOS; k=O>aM~q/}Ooy~_8'ݾ|N/;oתuӓ߽aީ/|1{o}v7W_th)_Onzܷs{Q}})z-wszpLL]~&~Gq'=c7~޿zS.⛾kﳮ7]z‘\VknUzw[1n>7KV==oZ??V1~Zy{./oc<^=޲ۉ|ު;/?U_!gfo^f~~t?R~L~z9qGx+^oyO{>W~S{ ׏x//s[U_k0US'~'gC<`##-~g~񐿮_oc7W~_ZF>/?ӫ?K_bOV?gi_#w֗,ZyYſx2y?^3*N}yq>]rv>nϽnϳ^/_n+e}X}78:[/=hͩd9$w=m7|c߹isCzɚuC{ҋUGȧNSno^>FU{!{Cy5"9:>:y>6mϷuYW歧V/y:_uͻ/^OtI(5鼷_s̟n->ᯜоN:W?涿\1|Uwݽn`q ɕ|Σ?7q}料kMݏ=|z<疣!Z?[_=U{7z1voX}G\0Ef?Wz>9kͩדYVrU}^^>z9g{Ƨ\ϘKGz߇.8dAo܉8_~Կ/qdZe ׹OUS^_oy|x=y|^=^_<+y|c9+7ν>.wwb~}9{7fIΗߛuxzF~?x.W.<_y?x7Oq}_uodob{?Yrb;5gמ+'ϯ>Ѻy׌<';y <|y*[x›[}~/J}_=t'ymVݓx!E/|e5m~kӟӺ=u'e_cee=_y՗R+nG&)C.Eh8ĭ׋ p?_ߋuַ'lJ+;޷óכaJEqa~/\N:p}+ǖ?G}+R[rՊ >s=_飏ܲԗ|r~_~7n^=z*7z?A~w􃧟Ϳ}ėc52:fe_m8U}_ݚ?z=Onwꢟ|/j|AS#c{1}8f>5Ƚ'cpO8+x }߿{ic_G{;?ge>?b=_j>#>7%kFu=g<1u׋5k5ϣvn{E/zƃ?7-W,Yllɯ{+/'Cri_}W.c'·>=z qXqe˞b{Ӟ34z>k n}_Zy޷엋/?yE;wOMr̚ל{׾=b:.cT֧{zny?^|ٱ}k.OyF޾?>}nݷ2g}h8axƶ{{{xO~W}!dlI{gdo#V^쿯8-+3aztݾF~,]q?qݟFUoݿ~wߝug;8/Cs43z{x׻Gу]Ca}~m>쩱}w{>3\课O|[}gcg.١eblϟ }όn㴗ŧo>1<_}+|dokY6:]3''rFOǯz%O:Gdg]+>zE__8tĹ߷ܯg+|__?z+g.]U'EO|෍wZG +?|ht±?SC|[|~c߻}]cx͏i1"tCjl?oS_V<t'N|}<noOD v>{ٿغ<䙇>VNޫ:=/ϱĕoy~O+z3uK^[^􆩡^=z/]љϼp:yO7|+?-;r m׾=c{^g\5Z0;U*q:4WEW־d_%~*ʕ"5WM a\Uh:L&>W _7!x; Kف KKmY_<>bUY¹V \+\k̓cʹ؁`[V\EssmY*S̵%YD<: 5*UeU͛kE}j],* t:ivǭT) *fgZbu%I\&dtu0s]} akVV,2׹.!ii_u_U?6ZUv3FnUʶDk4K M~Ul-+0~9VKw)0*ӊj=?>ykx9j ^;_u TZҝ̟+RsUcضƂ rVe/giGCEq=JWR(\\c˷j`9l6(@557q6C+kVX0uWKZܾfZAu@g{h̎us\w9Yyx~!>+-m\Zsڪ\&ۈҌ?6TrU2cik/|ku  #U36 \(ԧgɰwu6ڮ99Ô՞}l¿yVk%+23WU5 n!hyfd,hL`c¹G-ƄsZ5(lVyw@xYk3ylKQ\K>K,>zS 'm`yè)unLu3NQ¶J/^U:έ'T-}m1p'K&fR 8S= dNN *aRp<J~ PA%p0 0*Q>(Y*oTiFB֪BkZJ*A+?UYkeJzV<*iTx@_M2M2, G;*G8E* 3gJ(oSTMџaţڣ UA¨bߕÙTWy7\k%}]7U"uj+NMgWLhЂv;PԑEap\|6jϯ q~\zρc" $.3Y&oŸ#^A7qpeV‰ `p{ $Z+rp!Y+W*wXݏ7D7k"r\㶃Id,Ò`:iWGlkgD rt%RQmCƽc+@I!~EϏv0| p XVK.pC\d\' B C K(Kwujus^nuڎ8dlS3NF{NFNԶgI'^}=ܮ)`HUͅTϽӸtpr$4nPv]W*\a Vxej75+ 55B7]XYΖ9eo +%0nG '+b83(XYd @iV,mڮmv1F$ VJg2ץosZ2˷  4)0ݕdCjir@:vBM&ʓ"K[@e]Z=q2.eUu2 ٨K-'3RuhuoW&J<\+oWR7Kpe^";!I/zK+*R+Q|;|$UӸЙMl~#F5+TaAH-gjs(fKz.]4HLi(R5)nO):KuY3uࣦsv= ֩ ۵aS]YEgv]XbBBS%FIX4"]\J 9wp- t ' 6M5tQ%cE*!Re-6k{ZQT^A^ Q̽pYgMD.t%lrZ9s"˴a&?Uf8yG\$a.tik9~)V*JBӉ .s)3"} loY$ ڞ^U+0m4j,m0x;Cj3!V.hjb&t dvUmp hpKp2Vim  Raʖ9݊9CDMm׸r1=e mAٯy W[eȢĶj9\F"mjZWX!V[bz&ڙ.Hb8aʘ{33D s* ̓URZ*5fan*&WP mߎzmS0>PaQj@UH>R&GV\ꦦY9K_B lu蕅i@n ]B;݂mj.ٺ7ZL\Z#ps-bUZ^A2*st9. c9~GKZw5n/d)l SuW dA2K=Zr=;,w®|)֩lfЇBe[]܂p;& vs;4Pk8MjO;f;}^[Y{<-w+nhh m 96U {ا`:RsA]ڛJ buoO`cuBfay!2|ݴu;_C2>p{l>&!$ g4$2+~V 喧Uڵ5ݰ{&=S PyL*co}8vQyfO:[DN:9J >pt}@./K\;)V֠(}R~'Wc6×[TM\ŧz0\j@(}l)?V-bi}GUhm>SX.V݌ ;*kV*>ɂnnWWQŵe\n(1_EHX'©UnpPt[e nE\d1V*׫w2V%os{k<+NJ̸*䣀/6wEWy[o*[^-{b1 cPϪM}T5zwo5c­ZX9KUKTh< BU%A$}h5Wʝ*J6_{V\L!cUs}k@MdoK͡ hˬm 3U߹4/?SAid!;N뺬ٴ?nȊx$)o! *cwB`+X֐qy݁$+3o֮Cq NjD*Te}a3/q0):+:~=UʊtӪ#nӼ\udQC'KqUw+NF\0`r %aQЅ|KaD_KS.^ ⎈}$,s O`<Do$곇7b靐ε6iZ"u-8*0bJX0{)PX*X4V}C=_;]EB#:RR=XFP:GG,El[yxQ$ ڷ}y-$Ğ:)?b|GIMk1mxֵ$іP@ʍl;m~g$WWYzo4_fČYb͡< Q ?oɵZWQRs#1:=–,gz>1SޮR"50%mO`. 햢x 6gcZɨP}3|Q%Uś|oR>Z =\m,Yxkj ط\(W%^gI;i]fe{$Zb:Vyf!܈c 9CUL:/tK(J)[SЙ:PYo"Ւ*ڽ{-_G [sŹ IQ,l ʥwP\oC" KhNY&~ei["Nc ?@OLEx>SWS` ;)л7U12e$0 !\V`4OV(5-ki$ kMk)ITz߭Ï [Yúqqg˅ dG sŠE$g ' @Yjb5O\Y[&\ӎ`p/o-XDՉu_kj& =?e8]ÿX3yRi6_K>K_6?5a-yL2 ͣ hoaaw*g$F^:S*)/6DOB&;v|$d,$PLnm:Fڰ)>o9m!;cG:ЌgҁwVS/(5-1ȍi{e49vLP}8ۻn@!Ԃ_d(Es=rD~pa#F50ٝWM4A$&q.0 }.gP'P"e ãIQ+,9d#X#XN^I]1 x_CH7d18eEGzOD[VFp9E}x;.I 5 f&EؠC"EK?oݖgI}"̑w%3G<V)UP̈́Qҽı /(4HbLGҦ@$Uh<) ;mVKkQh0Z+g&{10Af*Q2BH_aR^J:%zc,XkAG(,dʑ@ dMNDm۴*Aru7'e MQ$O ȼ@p+ZJGa);2t;Ւ:w([xyRЕIyJ *NJ&$L7yô]>qdu WUX}@.II4\kSLZU``ȯX 26o$sR%,N"*KI- >W5k\ l'&,9V=ؖxa DwBLv`Jz@g)t8N(]$MƔ*=&!"j4" 6 $}Ga"8X!7P[d jF&M]e;\4!IM9x!mr-x c MX_9@hQA20CbN|g Sy!BbbQ|qb`޾;uL;_]\6a6>TY%*P)#hx%$ $,~D/K{3ӧg%@5XM/e 9MH릴>s M󝄬)mYC@%k+70;۷*]g= Wdh}tb gshs4z@!Fwݚ9\*؃W_X|]kTP5~hPw+^HnQxҸIG;8 k]R&"&¡dxi rG| -5$~6AstR0؍*!qAE D`k6:=lP/S6HdɄH!m).TroE N)i5>yJHTW&eP;kTP y"]C" ]ӒƩs,nPG|i ͎ۖU@9>t݇ %8(+i^sl. 7sjL_Mntin,WmaWLZ0rfɦ T_w/eL:E/f )275fplRf*:6A @pWIw{TO~8cUMb@Y@2Ak? ;x;ޕ@r!sh̝z>5O4EK*%(gH:)WaTۏt͝A]C@kGО ]`]¶ [wM7(.$}vn8'\.lIBd'x~ƉZѷˏǬگz,RHm}{ile2ޑX(L~Ÿ?Z8 d?R CUiwJ=|%]QpޥS`! {2H!szfϥ|u5E;/.`fU j2!sB)D[{m[C&? #|H܉zJ1*جBV {?6J-! 2]`].+L_ ЉL;ckeIQOfi׸EN؁/M5X!]#ӉG-9M~*L+V">6 dυ= ޽*56xg6R6|b(5$(jaZBHm:Q}ff8dtl0&%VKL)C`9^>*Pa892OQ\9ywv!D@Vκ$s[ &mg楡?u 9 ZHUxZxvxv?,:~E2>Y(#h5-a|h:]~.ST-< Bx`|ȱ4֩Ij* "gKR -<!=UC-1fnv>]X7~_kRTt9?G¼ 1 %Pkn1=TBqAR!X<': > 9#c3ȌZt<}b1Qb& $RP+:R-]Xf{j98WAEq}Xؓغ81{ )SMb.Lf0`иH=z/sPS`i>6@y\Va FဇC@cld{u/_?g|+ES!$;m$&\˄ޒҴpAȕj|T!.Swlhl0} <_p}-5j޺+'L p&`CY,j9X=/v ]1T{+po]Db_H_z&-Y݀jZk׼:gIPC7B꾵ԝ܅ Htyǡ@ŷC=Mhxu:Czq'O9a7@@{z\'}/B?!"w:W߂DxB817^&~f{x1>B<}M/-7OO3HC{~q^׿}? 'Aaa\#W:nG= CwAB{~h߇p>>~w qkh~?箲zo`]_Gqz> -'p}/?;?B{c=/|׷C>|'O1e(~s A}%7q]}K~{;W@%>}{G_܋#p_;㢾%›}~loM.AK޿k>۟v۱F^E/kzخ{R!]x'8ՇpN+ۼ~}g [/уzU~zo/ouaKtӸ4!ow-u4ÅyFl ħ4A=pK\E㭧-m7kGt8mf k5M+3޿@QSjyAu8 N>_zvَ_w7O5 w4/7%mەOmacΒ:{_?~E{h#|qp겲n`1_䣯RW6Z['%gg-+gX͆} zzXmr0WDLV{]/Wp|3֖3Z@۵7Fr ϳ<;?0QFd΍:[yGJ M7,ute5>4>IՅF߷Sb0 AގnhV|ƃ.l5\6jg kk-q? |&e~/M4\Z1f E͢/eFfs }y}.r'~ 5CbiYdlb ʁv7&vh^Jy+yw 8p:kՕ雭/4t}o~f@3/mfWM Ͻ m6^lZ/Gή/ak^v'^[]`>Vtnu\B32_9m~#lv/Z;bgj7#:/ZvE$xӶ5,L<֑ ~mce;~s ltY3{# g{k5r<8$ TkoSXa8d=[R*Ppjx_],:,5 Dw#[ea.+J3O-L)rsX1ఆLώn.B(::2 խm*WC([Uh/w!(t3tz-[PU0nH!3qĴqDBs AT.G`n@+,qKO^ni,9:ɨ\#4Xh(W8N"?z[Q4ɢazF1o3z6241mJm5NG0 b[Y&^nڞL,j{ؗ8ʷTJȪRkҸ:1(5ʘ0HcOF~.Rx5>RεZ0n/ÒHyԁM#TT,o-"`()4ډ(]:Pܸ\oB04M)_ed$I<q6XxE9̕&35}jjfX(]ܘCsg ٽmmW a9{˘“K> ;q"9*Љѫ8OzlQt,ќ7Z~{)ۆUm bKr.QkƓE4 (Aja޶X[) 8v `um6ĸDŠO\g묗td0ye(OQN:p#wRh&U2 ҽ@d_Hyy\ {qt*3pHm,ΊЀ8a)] 3َ{x~nVZ  ' &q VczcW[- VGm#>-$.B@qoلkTV"b]ٲ83jlQ2Y60|S%*є)WP%:T3SD?` Uϸ̲*J ۚXb(L!F_c.=Oʶ 陧OPS v*<#P(DK9~ƋRljQf vn$U/) .`DMh3P0͋.)=/"emRj?aXMqn(N>`ﱬG+y\uCޅJ)1Hyv% p[=t>M蓦0X/ä(7 UY[>1U)Vp(F'G##S/$ܬ!w+Hm,o21*Petў;Cj81cQC X0;e_"m&n0 H =jgS/}WhLG3 CkoNTH?hA}ŏ7~|w/]g^z\<~#'vUtȱ3w%?{cNCo0'>P3cxϐą_;W.={ة{=Nzz\q;ϭ8:9y.W۩7:'w;~T%Y/9+9}fX>n\udeﻪwNw^VluBzܙwNJdc[}MrI^D˧܉W/2W%G/ki(Lyalakazam/data/ExampleDb.rda0000644000175000017500000030115214067624107015440 0ustar nileshnileshBZh91AY&SY[s~ݿ2&RI,elHyހ_|O)@*C  W!@ T,`wa і:ٍ4lt1vMP T/]v^{4h=eM 큪WР= *U)j Kc@(u9tvҥPtRi)=1%Z-EB$h Wҫ[ =+(FH wV*t@uV=ymk@HYk=i 몹;+`mm\Q>v9{-THPli.V2@P!Q.p y>v{ϾK͎{{۲ @ղː2{y{Rn}z[J7`O^@GAƴG@4ްh=)S@Я< zRP4vH:@wJU@흍Amu4l:7:J=V5DN@ CР45K|=7 C m0E&r;mBٴhluQI([cV@@€}k@ U:=> ֪k@SUoE< RBzT d!dLԤI!&yO$44MCL$J2 @=@@I$S 2 JI&M TM#Tz'm@1im@M*z~O1'R54h4i4a3Dhjh(zם@WϦ*(Nd_>~w~ȟQ!Zclg*P]_ <s\VآVXYevO/Ҁ<|;DH*~Pst^Ֆ+7ߩ!3r>pmȼ^2gXdǘ&mKܯKSh  g^\+*Y۲j8\a6Jv{6gkMۺ4epMY:z5*72޷Bqj]_lp`Ǎ T>>6z!py ,0ر >3䤮0]%gllWuzt!;*h拊 [feԝzeUi9Z'yjBWeo&[WtO7x~ε\ì6LMRC˃[OI[^aȍgپYFsLT~ӈMwvc2rB#>. 6X dniNdc] ϽHnv6%j Q 8k"0.M*12LvFuImѵKBw);ogoWzoL}QHvebn˔v1cqTi{}nhxNW#QĚL*=5D87k* 9 !eC}?_}_)eX(@0]h+~'n 9%8S4nv""2=CzPemzz-t!ɯ v6B[?O.5=wTR:=T@{sn\tJ]uc 0 l/Dl2Aꏄ龨J\>Rɠc,^eptM^n a}N;ry=9mxT1zL“`Ź/>e'Q~C?E0"v]Đxˈa3CntKNYbqRbxJ% _Q Tsywgg'0'xHd}PlBy`%@GTw\ Y[s,ճqOjL{x.moyBE*]?5o#%ڍ RM%,=%L p5ʗ(F4) @}:o8e/r6C;0]\`K3I xc*W6Ir!eLG8"|usA4r8[6Y`D,rA5LU K!iTPJD)H$O %22I8T2T4}*H8"f*RftĤAIVi hiC-@R J((Bi@fS̀t2" t@"u޽7P lot ^ɀ1I.cBR@8PĢtno2AqcB;5%m9)OIF fNCHŸ}CD{{q@"edf,;E <]%6RI-$Í'gHƘz{ D8w6쉻p  JIݘsDTCuq 9QKqwdO{P{&i* vJ \I& Xg==¾7J#qH.-D"EN\Hu*N #iwhoިӊNP. ! F )aηvH̅ e0!ưQO} ~tl`YXjK`I pѸ:xw*骇U4 UayH"@(i6. vDdM2 Ҫs(!RВ$IChjdӖE@@vs:BCex/c^bʮGoUX3 Z 0$P]pe[F qDk ƄȠP(::N?$SBԂ/ScPZ6 ζqm. $ mlY6\q¼lD%WAnghYPKqPJDWN|ݮӧّ *?}۽>T[pSl>PDЄ*K zPE8$$U$bt('{[APC^=x@@ f``:r;C;l;BPS'sN#cCe2 ?sB~}/=c_c*l2&: /@j v9p 8C7bB a(M0iZ~Ϲ:H&>M]{C߾QS.2 JޖSbÇP::[ [iX;uMDETA3DU4ٽ8 I[Dm|?݈QeC5v)?nQ=#D@(ǀ)&yiy!OC9ډx̡ M:Ǯ=i+*$wiwp\<"zP)G]Aϱ炠64W{wSXk.ŕEp`Į$Ő7Cw4ZՉܘ׃+.>9(:;"`0<,uՇ ;׊>ik$K$SJB[=z2v BAH)!V4sp"%5A U@ )?z˃^2)Oa LB!Fb"xݶ@uSg7#URIA(@6뱠rG6J Hۇ?@@cIg>dU:$,B00idH6(R9Y5D-* B@ֳjѭM!4am܈ G+Ѹ+w|YU} }"!@DR P;Ȫ\hŋ]3<睠=N/n ܶX E6D n0y9;0*Pu \'fhմђ 9dGϣ!$0 r*FA$&@KGpk)PeILHQHD|U0!FdA G2TW]`L(P% Qێ#9eA*q#4&hȡSg6֕'DݰB `:Rl6R@u DA{۰T􀴂1)ħTO搞jKK/fj܋aܗ-BH>FۮVS["B(Ё;pp BJ4$Jdum|yz4=òqrkr!m:5m R *veJ4+PKͰiq)R/'8(d%(r)2Ha]u7x GJʄЮnJB.c59baFQH `4qD)@ rC҆&􀔡ҽs tvˍ(Rw`+{DuB@_R=PS?@B)OHlRIT+HyJ)ץ:PT'U)szq4@r(I)ʟ^\s@Utֆ#'[]ݣzĞUsFȀ PĪ_<})IC!KazE?Ÿ<*Įޘ4aQa~DnGd.`DOJzT y{`ۅ~Ĥ!`bVcɣ$=>)GҚy P`w(HsLo5N6ɰ=Ӳ88 &aG't vEG4ckO{EN7swp q˚ ;OzЂ.a:QF EC NdJM9=3]%HatvosR  7h0\bܪ^$4i!xt1"7dX S6\L~0 a+ 2 c?c2!s)ABĤGZ}2; }Tom`P=PbSJョ `LZhTztcw{ҵ} *hA,PJ Tv&iPЂB@(PEDX$!H ʘӷptYL>s$,ifGK  dkE b&P@`&b `c4Wl%<0#ݍ! (CV#@;#GzDM",~Gޢ~;7b >R4H) J@>#hU1ah7lJCСԴ#4 (糉9Yw@SAa:t W2 I ]KF͍YA74J J0I/na9^d9籂B6'Pt U^v$\jж&LS*{šwA=#OḢDa=p).;:JE*JB) lrt( *HtO䓉CFLnzްZ,8()aD& ^9@uAA`g/ G"Zt*^`zmԶRQT%H YSRRNT!YA%afUb%z\@ mdINT(юKuḚuEBhTbE@NxΌ)’ P8u2e:#WS!*Ѣ :SR62@#`Bf@ TPlݹӠ 9T-p뭀{0E$jT"7q=1Q;94bP vGn2 z߆dz=EeGExtzNʣ,c(A%CH,˺VH+7+\Hvb\. 1BmRH)NF1GӋ"$V1jbBA* s#J]*4.G ! $9 fHF;Z'.6t˜tH8y<>ON[{E;6#&H"%@v,$rx5 B|ȅ.: pX汰"l )Dn:fN۷ѽ[($zL*NSh@Ѷ!**md4 {ĆGݎ sSGPzzTkP4"JET$RD$(REJE@GB.Cm.=*dQt$1$#1LP$7, (TY1V"s<~1Sth=Džǒw(s hb-{H,-ؔK lWCra`![a#4ā`۳Д@p!Ҧ*tcQ`&E`Sܑ 2 ?E@E9T"kEQД4@1 UBu"H @ER, #4@8BVPJ@ )TD(C:L $X90­ RTi]2't] =:[1]CyX$JT ) 劄׎P.،Opv"x%w Uu\. .S<1/F<-$ x6_tg ${y ;k];m\Ħ FH^l*wO>>{<"d8LkP2?e.ēȭa <VY;"J#RDOb(yܹUIq/sDPTL"$ AH! 2dbM$42ޛ!݀y[Wp646i4d\ 091v *l4 8`G0M4D"F'.K~^&OC`C'M }\+HcP&b[_0%cם Cٗ$4[@BBP0+1 !@Ё3!tE$ }=/ZG0ҧIKY$! yԇww0L*¡0fٺmx)Dv="=cs_ѽF .Ǭ{3)LE2Rk\ϤU8QCãH|;?Wk=μqwD/sZsHICETR@I+@ AKg} B#5(H0eeEPDGPwl|ΆʣC}Ax@94-yJ4I~ﲯ\UtbELWX`vqDZ@'N}J ܙodYҢq -h #zkyJ_7τGK LHH{vmE |c׮Ȉ(R Ĩ~&o0}FwRZg6k׈{$q[`K`*JJJ J/c}B==4=6y GBi~)$#_X\  zO(GǗJQ7Gbǽ^zTW2\h[! s.EȅGV> x&QELCnǠÄwv=ưlưX`"/d~@wow 6VtM rIxDŽCJY:J뻸#l8Цȁ]m헃-܋,$J[N{ce @(ԗH]#7A(eBYLGEѡ4)8&dv 3#mC B"HT'svCROB@Bp k+pv )灴Bŷ$`p!\T5^MmNDLe dWRGf ݸ]P4͗y/Ϸ!2G;#]83s%oE ~>?ͳߦc~DQ_;f7h om/AEBn7Qn # s 6vr`JCoVdY| A0d3o@X0RVuF(\cDaP,d hKBZH+c)Ӓ=|2LܽP$&P5Z~*jf:J"P= Vg (6y/0UHGYeYeZŽjC>dJdaɶqoUi9C@VMhg7QtgY'H{Tki?yf +dT" h JT'"W%*x28K`r,^W!FV;z),,VGP]a%Qa9/a"cT@^p1 :( ":So!N{T"3:DN[(C]H1Q2t S 0:9NЈ&%!hEqkK#a92mL8G`0Sj2[qJgܓmEkP!4HDI #,IMt$>WynUPtm?vWp`F$, !*WqppshRAK8@Nv8xq+XS$Q܈ХeOx&9  3h`h7EJ\xz(I0? 㠃T* ND@PF$EbCI;뺅P@B Tf'XҤ 7ŰO\$X@l)IА9q9Ȕinx*p^Q}2 )Kl 98{k*2ɻ9xpX1._!1݇HkJ)a -H.晛S@Ҁ  L-d7G 1TRS ,H nw;8t4e#iuݥu^@lG lB@̎}xV*(L( Ap"ADgy MӤz.qRtXp+*8!s0Mytn[q1S҉ 61VCC BM*JH.@€$UCV>|{bǩ9DL& &!'@'í7r@B* <D"7/nwҠ(0 UCl@ #JG z>< ^d ~gL7];3LHʲ'ЈCuM_(aP]"㣛bD(t,l&Cʬ OJweH7P )Yi$&Τ S[[6Z%;(SAXВ 8d 60[oJ8n;E U@Idz{49$ur,wEb+2"iJ aAQ(B ͇e7qW8k ;R#JJUTL0)ң\ cѩ)LbS2B`B4:L L(pj@6n8@.* - Apç-Nw`'=&҇@,,d{nЫ%QNEs22`>?-ah(m(*P@ @PY HZe&AbȘ"Ҩ%BwtpP8&s\C +"'U8vƠ4:N&\LG!@2w!&;8h *WQ:%R@uB D!r EH-\nhUa]*J ۂB1QĈK RSH (J 1F@&$\DSmb [Z7:E ۮ)7@]kyr# `` Pr]?0=$ppJǐRn$%n VVJ:iXᨋe l[.U"gnA{@ K 4̸Hk($%Nk "'J*C0 a (Kb4 $)#-IiB9[sluPj8 b!9!Emw;@u dA`)Oà>zR* h;+J'HiB P Ȝ07Yt7 r DBF4(Ԉ%)&J8;]#1T}r!JI*@=ggNNoVAddyRthe;RҴH }gr4G,2K,Vw"eQDVcadb]2 rk;ϋH=;wv+zR," ݝ~\8fzF"4ܾL`O+} z.|hY]CDHC̀|p TK%BP ̤YIxw` 9AVǎÄ wARn4s":2-@dm 0,@Ԃv-*YTȣ&ʄa1E=.z8ӑ ȵxk8\: N q"!sGG#8WЌC@hMKBlpH%BVbA %d/|Lp%AG~^H~?nc>>\ PЀD @t2( t!RDA4 g8LDBrppD6E v e %*_rDt4v4qMD@q+,c!?? O@!R#F#rεD )7urR@R˴mB@ WDdG'DrwmQhmq0`=Q2t )ۇu1,"FV+?~n5q\~O)*@ҏx*mQld3bąeLg2F!#.8ݵƅyxFB4G2:BNy(b:]nۏ8*Ea^)w9Me| G] I-2֗8EȬ`Rƛ Ys e!$h&ƸN4 xɎqܠ;qH)rd\:;W6 %u\ "qk_8N!LyJ R3 *r9IgQعe(XewU4".8az `;ܕH!G b C EhhJP=rYB*7@8Ҡ&V!tàTNIHR ']~䐧c6ÈNn!zOZǹVVλf.H Tvb8Dc@"` ?BGHeE "@RP(:Aʙv .DXKlH}%EI9ƃЪN !(Yn)-vA9DyWЪ=ƍ;hh.|8 81Zi&aU/v aK`,K<ݤ{ Ћh9 ђY(!60B+wUIiT%,P&K,VŴN*rP2SaMAI 5P(ZulhemU*VN$.iVJTP 1ĨI QCqB09bZB-XŠB`!`nj#7*(88-An@3\eEBLHD+VBD4ZJ( ABTi(E)JQRC@JM,"ڌhHQӄ<@XSVPIZhJBUfV* &J@  J "jZ6āa ŕZD8D%IP4FI@bA%I 2 "6st)E&لu6 Xs~7h(7잢j̥^l|ӀFl0 8gФsGf-ؐJctܩvFQu#I% uc%[pSWMn`Br&CD#H XNzkq()*>UC'Qջs0n{RD!pܕ6c$\b\9jZ06;1)5 뗖<6$: YGHpHЮ`0adBDeH@ P(qn:B!@MN3aĢD#̎d)A#e8 "()B((JJ9N64qG]L`J톎v_{cդ r,p@tuQZ;xmg 7l n7up`+hʶH`KScc%bn*9{CpAuCv@PVF ewc2t7qR( $H|x8ѡlD!y I/p=ij;$ L]`/=@m'a!DS2  TP T! Bhy ,24U,G /\vLb\iPSI%g %*N[a :1I@;lJQREQeaJJP{`; mIsL88Uy` !0kƨ؎l6 \]hTOqpʢ6BLX 2}4(Bwh`tL8d;Z.;lb`Y]*v DFH!d FI%uP) E4{*`"H"auvm*hi0uŵlŨTu^zE}{Gd-%wrV0dQ];&QFqaSi!T`7`wMvUP]4=!EiؾaZ@-+`b泭CG"xQʕU'iQ89Oq.mvq\H0#w$`9W=v\$\^GCc] DWt8'e\ݓ;ג- g@P4=ea[ 8BAL{yt)Ys5Uq(=ibɭcp*$Z!??xQF4XGV (!( E!@"Q@J/E((&a((@)($(f)*h((&) (ZDD&A(Dhhz1& h@BQȃHfnQ 4j k>CԪdҴR8kMcAs;aѹpp „J"4"{ X'tK׽aKd;9S, DZKG#UCC'TcPns H @-("'l=}AѽQ8 rEU b^专9M`k 25xb7#j9z.Q;*MV{+dRBnsңנC98.H\w3 cu-A4X 0FU- Rm+rbFDJzV<@]Щd%&A@TJdM̛EL=Ta©oܲ+dĥ iP\ӅÓUJhuc,,%mlq(Т]sv2 "PqaWxEPh"XvqP A,35<=pv8kd f yc&VB&"P%"R(Q &&:@Qdbd)PI%BYY!$&AHD(LȔ"&`H@AAy8v bE T }Aǎ6A n9TЛ # яiI.Z])Dp(BɈ=- {(9baP4XT&y=#7$b, ui%%6ܙz9rAe ( C@ ܇Q$f PDJPNE4`B2,(ؔ  ЀՅ];ҁˆBr3ەGCn8v=q[ U %mHP%  MU g7$c%8pK@E-D_MP @紇CP.(z(&t0m! ''^~G]aPݢmRЀa 0rvEJ4CbÐ"K& эt @S406Q]*X@ ## C@6W riv+s)QZh;aи%SoqEЪ "J=(=׉J8.C "s$@+% #@R:0vʦPPHHB`PЇ\<;D0Ȥ2^ jF)BhA&b%`D4[ΚD>к>I=jU?@ jux9"r* @pM{p1">!̉!Ĕ@ @$X,1t& 䶊ɩ\:7J9@'YGvJ Θp"0FDB`@%T8PD@a2!eOOBРP1) ,,E* "X6$芕LZ8(Ђ ȉ l@] [3>^zldivS㰚v bG5*PF1. H+M3$Mĺ qǑ}<%v-NMPAG,i"L ܊nA^|z;W'DL'K%xvpmE!ZI݃+ȴ ه#4Ihg&v{ 2ġ2R !0PJĒ- hʼnq,@ۛ#st!m  % H P)(X n9N0X#HJqSbJ PiubIBbFh)F`~vC bvl'N% [Jյ`܁WHQB֞ k=ƨ0hE Ǟ@XA` :y wj'1ľDl>^KBԏF(6yXs}֑MɆ7%r~ZgS o.(i2:cy@Y`1 Mꀚ@CC &&jA !h9'ϷtmLnqJN kR3hbl"U9dֱi1q@jᩗTzvHI"6*c es@5H(P q"f9aނ0KMIkw,i!cm$vURT\&nJ~Vl&$FܐJqh%j 1pUW](޴5I´ݺd}mދ<U)4 knfvmgctM)et=3NBb2o@ I1:2KCLdAg $h  A~Ff05Ζ :a8,`Lr)0Tj$vI== Pڼ#"\Δ, ̛VHE K3\S;8zRIVddkbJĿɂ4;2e4gx7=hYwӥJW!mS9zjα-!421$!K+]ad5;@ ĉ9_'SC|>kםpMAնإ:û蓉{M jqVN2{9jG 2h1)N`: ( dˆ91@"¿=}U@rYw\ϵcT |֍%qxWw~#.@(AV@$1aA#&JJ!҆T))WidڄȄD/ȶ='1ZC^2gn"͇Nq.\JvCb~W+ĭJ9[Uـ0aiJH;͠XH8f%`@D S{8pQ:B8(!^x pcc0ݔ ;ͫEpDvt$ )pY Ŗ낎1r] ;>S'{,hy2c vHLM@td(P$BW~v,8#ωSU4gݥΔ'sv86;bDDd;(BB sĺWID AD)8BAG .œrQ-sw8d޸^LeA Fp2mF,`¦h9L,Bm5tHb*hpvn1pnWq=-* ;Á44ti Lc)  Bٚ9]n.@7uAcn8BPMl]`QPJ`@HF p*{DIڽA Ƚ?S Ojkߪc%tȲik-cE3BiLS;W(`֓θy!PV)€Hq"&.8ibDqllQ^(x Z)w":J*xEǍuqX+3JtdCݛnK #QQ"deiQXG©95BaDH7g.iŝԴ4f ?OGzT=;O$% BI qu1%1p\tup8@%q@ӟdӶׯ q 6.k}$P8BLx'_?jA^oѯIBg !lVˤ1ޒB@AP ?;>!@Wǔ:a>O9oGӮnIaB9[Z6*-\bA) ubfHHˎ!17M%fq d F F! 0isD4A"ipaн1H G`L%:J' (S2<[`Uwkl7kb@[jsW\p=Q!tOA﷋]]A[ 1\cE1(]#$% JWq)B@.w?=?FFoL.=R(JC2@>Laߏ_ڨxA3x@D ,0$ 3[w9A =0'i)EC; G"AvD#1 s(˱=u\) `Pݖt)`IBܫ*P;GWN" |N#c73v׆Q`N>US^g"РhIⰊ(%hybPEw0a!)$$")%*bbZ*j(* "&V%P$BI*& ))iUϚE[Xz{ O77 \ ow0P"4p1ONd=Q*fPYC;aKXl8OǏ1 GmS9w Ht B"B mzqfqTKr E(ā*IRDz)EU0pF z;x7m|||?1}Nm"=n^,=lmqK LJd98UQJB\;XYd08lr#™+bQn Sme h&K4y8 N4@,"tA( J>hd j{h 19(TΕhѐ Ð +xQBj0 7ZHi+M]~ĊD|H gw0 8wu91imIV6C yqb¯`:Z(F2G>+`i"Vʊ5ɒkM.Jgɴ1DVCwWD-@Q°@  .S] H*P-1wpO#$y||@N2tʃJ+~`}]6 y ŒwS; ل3O{M`8,p:Zh;U(dnXfBA4q u@ DyA2 oAu#r`LXx7۷%$!iW$ J "*L*f NN Ãcn-Pvi4pD=";U " wpvbc #kQ Ā D:| `0y rw(҇p" r&oNQ M *l^>=xwؕ ܘ)`s)H+WL"L(s1Zb h0ZD`R$EzH$(G(HD՜cJ1b$ʃ& W* Ъ ?:]!0ʹ p0X6 S@ R .:#Tg,@lJh5%*dc {.c #\iCAv^T6OI*D$q*ZP,4MS|a`  Br#ȫUY,꿽 6ȟ/zGħrM`F^2@B((:l $[ja4*ʉ>sb o@Rt. ))q DOB'rv\qp(貀Ph )+ZA *Y4dSkYE& l X4Ыݩ4iX(hb&Q ) 1Oך*Bdt%ɗKJ-%*R-Cu(6PP@`iIJj'ZR`Uhf""J}"`ZJhb#BRR I4%0y4+/"<ٲh1qqP@&JDžKaؠ1,R(Tw'BXX 9e"!HZ4Q"D%DIdkUb!$P t6D"W0t9r˦\vL܀:v6 W}\EnNREJi4Er(y𻓙@HhX:2DL t*2q@Rr%:[(N{ f ڏ>8gT@c_*)`ChPJA\Q*z!Bqq쳮@!k aP$_lr seɎQ']BcA&Agp'R$(|YlrmL)ZQ'X݅;"!$$U}4 JrLҲ!ɥP8J-AEq% "캧l bvJt F7 A{!amsr9P$a SĄ'wSZЫ7X:7p=aJ:nжAw]>|W d ?Cc|wߟ NDGr%$;/3oAWyz/ӿ=J﫷=wHZ+8 PʼnI2Fܵ+ 9:7xg=\UOVQA"$B)@`eG s׃>O(-AkJF!Z8w`<"]*w"eLHr ;Ԣ(`hӼp#D6ܘ;( AaD4*^܃d^@@8ၧ`D`L'HRwcݹҸX1qN@]ZjRJR9Mq]L(bo9)a St=Bi4RCJtCH`$XD1(n=+B+ƈ"Qd4w(nȁĀ)YJbMv=+  u̒B JJ] ^9XP b`T>Z"Z RU-A.@ 4 B!ɸE@CJ(JqM 0EVݲ|q||prp\GObxF݀ @(B5l([%YAIL`#s 6d xCc K\ꔘbTxJhĊw'ݖPG  悝6(#B"B WlKY} IuqHhP*@r2*F ( D9\!%ŚЄp4HȃI=S ppb 1%ւ}G `@?D 0쀆6EE 6u(IP ’[(Ah.A5dWS ,IHdX*dDUq R+TP4E4MP B#PH]t@PP, %t &ew>G9@EĠd ;MaN24JJ) 1IqÅ$ *d$5І:)+Ed@$91x*(k2.LBZf!%cY@ d& @!"Ht"`{Lg9%-PSUhG#@FV(DH CԄ3"IT vwX2$(ʸ1Zp* Z?LB~DРDQ`5?jD`D Un=roO Й !ncv)#d1w]rLG]NV:A!ZV$BIP*AYtR@ST)8v$ctr>" $G;{g $C(>8eDQ*AHi ){F,1Iq ocלqkZ4ٶI 2 A`AnAQ FAy \"*P)4ɕF4%"{K @J'9PI%Q!ehRa[("-(J pt{tە&LJ(p SCB0UEPPS@U1IEEQ%AQAPL0UPMD5LATCMPAQSDALCEQTA1S3U5D1 1!K-TMLUUT3S14$@RD$ f4#I@^xn`?=LP"qc!w v2 'oׁk@[RR; h2m lC(=z*"*#blqRxv=ބD=8]H M Z"4B=` vA\m$VtJbJH!*"7rCH#Q V)*H&3@)@L HkI 1V6хB QݰPiDEpHM  ˦n7%"݇VMPt>y6톃'L־Cc v=(˥seف;rzCA  ]d42TPtMELֳ8o$w<NB#% (Ìl3iʅ A!Hͳ$PʀTP'g7FNSk &ȧ5)rJQLM.w`t'd;9 hn -|?׳ Ay VM/8T |xS2랠]/N4Y,YK]7p=GaǞWAڸ*yn+b8Cz/j7PVõ 4,,%VZqp ,g6cL6 H!81Asv |aڀHƙ*5ṁ$6?[VcRAH(GZn&bfjIii!z ց8ZDT=zH1،@h#\N(^,ϝ3/cA5Rhb!m==hRD~OM.HEPNIB@X8 2a($F= 0Tѩ͡FRBh@J xҲ`>mq\ѬYgk7Ι.iwy ˝42GxKg@AŃ ` 9`u2,hôX!㡌9 Je6i!irqcq$ ]4(H0"2Č8[fLy D%ks$cGSZ\*D8b\"eANގ1ʺ xq7H;y}םFn[Vdrt vS Hjdq'݋5Sy6*YB&8ކ ϢMn6]Ba&!w-[?'uu +[BL#G2D,59cy#"ΓB2(&oy58 g\j|LvњMW\Kx,oE|cxvt}%!l\ooiC1{n@m܅=&)[zZВfjm7piG[WT輑 JM _S2;>>3O;8(s x NǠ"`g~d-2 MlloH"] ~q͏o|8/x 6E59l=šN]ɻKY>97ӊTدc&yI̪}9cG &Bm5+"blt@l,,rDF/֯{{FɈDr@Qn`W& ^Z,QKpj˜r=.6Y` !^q&]Ԡܡ$EFXBO g|aj$)xQ,.b"kc.[}t4OX-?7z#\0r'[G \yU@hZ,ȟ,Jhu熷!r];ũ;ԝYkwņɉLGU(ӏ-ajųui.Xɑnè-.f:Ul+mU_f ZhͷJ1uX\U{" .2>M;oݾ=_g6Qnp'Q9+n>z^$-i,~ ;dQYXzV N-,,N6j_6ms]#,o8KX-D!/^yъQh1t{1O;r\YMޫ9m'~O wCҌ_b*X܀P̅' vUtCB1 K MU!IP% 0*B((P 13XFeeXeYɼVȲqk$M6؟ x.%T2Uϱ8&2DX8w7'6P.,)1S#ln䅸n;Aߏϭvy.`dRWw$qh *//HW[O|T;Tܪ#Fld"]۝BT`d7U1 ێB㎃dRXS& ,!Lb؄1&Yݳ qE`T$،wGW$q2[Su paUs' D[Eݸܠ=iX8y2LJJ! @,T7(s*t@HA(T{! &0F &Bt8RbGw0n6;A h7kV1tO()4 66C]] 5Za~ν|PUrUm[)";"Υ.s\Rp*[mh@Mp: ]#s=ig7H8/RE&P^1klv0!(i1@TMҎlc@%āzzFQw,1< Hӵuzⴻ@ kB{fFs"Jx?G^Ѥ( Ef\\l%PfeIxu̡3w8]]``P34'B;T3`50203P;-w"`92U2IL@BA 0 "J {:Buj&Ɓ á@wxʫ:8knՠ!U`$%@e"!6Q2 w/bmOBҨt1" lT` 4(X1PJRosv;u8 `gQUH!&' 4K %mz4JBh)PĨ `"٘L/6;tl[-E 8kC&Hj#eQ6 Ԣ`6* 8n?˻qtrhKA4ӣp(JfDc0rϙƸh j.q$30@.xhh‡*u7kh0]ŗv7I/E4CS@! Ių\dA8Q·j :\ۭAs eu- J #@СpX^9 aYDHTP3T >(JDBg2 H[j$)90= r gp)߼=%&TL.1E@$tQtN\h0&H)HJ(UNz.9;( J2:tq2 ܂B#B*ġ*!(E½ ʧBBDْ͕ **:D)P /v'c5IJX/}|gJtjRHC *Қ/HiOnŃdth,qSutaliF`OMGv֟w@EÁ9:Lv!7 q6'mDSp 2hP!A4.D("I$h""!"V@R)@H(=/8&*j")TVhjh*fjPi4RM P'n8nb4'82a&%g *  4dA ;R:M:T3Þ{fֺ+ʌq$pXlY Dq۱p (!@psϭl b:LyܜTn_A8e&MV#Q+8yW K]F>b ^*nCv$$ ИFߎ{SB DB)F@p-1HĦ 8QK:: )"w(d P8sM[ FE ZSs@IQtK JХ/s -Hvd>DA(UJݷY8dV$U)tfJ Hj -C)Ċ`qEbPy R^)se) 5]qu[TdU PŒm+j9:=6WfM5)- 3۰k)p {u#SQpk0/g2̅$UAK *I'@гt3DCLJ#~HPbi( YO0=H!R- bea &`ND]NnaA l]aHގled*bV G\A7A9RmIbٔL0Byb-$%'I&Uwi@M# $ FUC4BG(=<62d8\@ 28p !7jeM0PL[J$*n )7w<('9,(P=(ȂG:(›4 P*KB0 J* AEe҈SQ\',l/v.@H A@N݌\r@w>}=ЌtScMS{!$a2(m']<]fXBchݴ$, elrm$π9}.x4X2Ie !vp`%EUV**H%!t 8;-$&daM*Iv4܀ŝ 9ʅs H*t@q KI4q8D*UBeCBhHBkNƅ k*ł6D+K 4tu.eNę;OT:td>yـDcA {H 4 h0;S@eA5pR8kvv(q`3)sQСu H EMP(i Ttg Cƌ6t0oNM¡¡ʛ%@ t=҃ `TǗn QA(E R) (IH:SHPS@P@ C9ñd eE2sdpcC .GG6H0J!! gbhE:LHr%&hV t.yPBGFnThL@ O(ӹ1 't&uԜqPwaBJP6Lqc`wqCїvD Q%0d:kT(B{bG8#ۜp(4Q`Ny6*u^("q<K{t DK 04 RDBUBChBg9Γ;dSzE@(`($m׬t!^M;#@ I@-P&GBň҆^1vQB(t"FAdN ((LRDAD fPDh**H(" "QR)ij A1"i:0ɰh 4@fM)aʚ<\!IȇhaDq wqT`M@5tQ DBvT@0"KLB" t0ABBt @M8FnB(h")"`AP( @HI$)V! (i@s+8\rq"d(`ED@4ed UA1"֠qwX@OV^(njT&<#v9)+`LrBr&ccrOI}}~J?X=a)E~J"V{켓k~{,|&Q̈HHR@ZJ@;*&䕓,dl(Qܓmpd6#Җ7`$cB;~AuHHV4/H(p\` ]*j4{บ!!?ӞEPWKn=X9_'B8?fTJǜw %ceėB t4$6$h*z4{ǯD`‡ C3kVjH.iغ[dۃzp`G0iBDIT򲢶j(_T4bVG&i[rCA6LUIXN p@UQd9"#k㰡gLVul@HۉtM]q!ԃ00R DH,׭j^[r %Qu{C "q;R!ñ""q @;)& tt8&MM&-(5A @C ]2rUf.-P]$Jtm㈠Y;pdaGrhJ ,a )H`iPMW&P(@B Q"JRUF hLp m \`RWaHC;}TJ)=qO@661͂4"Y)DOd'*U&HTxN%" &Es D+Jr(( ͦm& vv+?rljҚ396So<''ԎEЖj ;:YClZW-gx(0;!Q!hdj7q uнyu F{TZΘw&[w,ʝ:!۔#=-#+N(t^F+ɶM;cx뻰#>mEW6`ïMken$W(H4r5{<ꗖzlf7ޒUe\k ֝$A_›7ԿM/%~v䦛7Z5|GIC`rV}[$GQ)'.˺fLT`_OhVc.)(}*dbZ YKE2(-Ur%Hԡq/] T?EGdJ H \Bz%d2iIaeSPҭ PSaUh}]GȰ)8ENI(Y,jDa&aUJ} $23UEDVR/#WRWեDi, ^*:WR a,*HIJJЦI.Sm,(uKVJ"":HP(^H- @AOX-RO˗MZ&ȿmV+avm&y;mMClF;hڔS`sG3\3fKJUM Rd"duM).KNIeErz$XȞ%ȕ'V*%)*TɊ CPpв9T %Vhz^PrU^´|ZZ9I >=ͭUi_oP|\(=AcٶmkVfk2`ʩM@:K˕r@]EWo$¹R.NTE~;5і׎;2ڳy{繡^MJ&y <{sllUXSmb_kb>=lgv9L&@Cj:x87a)j>O1/WTOdErt/wA4^43rawrO{sAP 5AGhꑪC R$,hb>8CXCUUuPy"6=m:x:Gj6!@*(vhƩuQhiG}pawH DA1 RmR*c #ߧ98A IQfQ[ j$}(1W+ĺΧu͛DA7e j PezQ@#/F$rd'*Wfִm X(T/0FIB+hF$FDZSJ9A2 d'uNQ| WhW *&ҹ ?~CO(KJ$KGJN#ICj%ʩOBY`jY*+)Iʡ+%)"T'HVb"-PhRhj*ʣv}̻c97wKhK\24.Xh=O.^ZYs^5cVLL`,ƚԑUVDKDz<' E~e 1)]$|(h}T*}҅GKZɰ0$.(ԓZsZP$ʓB %P~}aV>Rb4VWJO){jCI.:2:IU>CJziO*08S ҖIe)Nd+@9%'&^ Id]$d2+z_$tWJ:JNNhj|QU<:)8-"`iMQzBO+`yi,#+ϗa{(W@rTrV.JS9)H1T[ %*'79:&nݹg!bS( P^d}nT;4ӽPG%)h~LRKӂ^"J@G5IS>eY&J^ i,/C \UtDCySO5K.8eMX%Km%4X x1,^(8@_bAzST<)a:|GHTpBj j MAMTЍ2M\O*9A:?K_/?ϣ|g*>ڡ8jT/1 ="rGQ9NR/7.,ƁM ERU4VHwhv}!! ^&iҩK KU'ƙViEҴBҜ+JaZ5CGI B&RzJw>5S5#^RtGJ\)u#=R4DSJiNȞ4K\P\' i1/q9hr!ixSʋRW%&Wj\"jA>BI"/@yRRȲ# ,*CBiu(8T!v]T\HQΥOʑI|$82SY KXWe\P'ekҔƒ t}ʂҝICuMFѩմ6BWU>^j*b^1M S&SW$CS ҧi&^1.J_>J$ CꌗIʅz JiN@*4QOxU4%^Px%\!.DIȥb EQ#ԒqE+V 8{ǨPO dORrZTB!ңF%Du UbU O%zLBj(ԎćچaXeMASȋ\-%Ubꪸ-4i)HVI\zSIT\(ZrDt}<*8$Y?:|&ԥX*z"U*TjNY R#0E=Cԧ# TC jrgPޛ3lKX:>>&y*W a2G̳--l%]*.EGPdSIW/`,9|a?Fjo/5ɭFߕks-eWcY}kO=yQg&,Y~fU ť'iLu5Dnu+KbB je2ٌ~ʧs2II y)O%)he0Z W9Gt $.SJkV ]T8r(-*9DdN*WQRht8P/JӪGtQ(tHqPX|"CC)F UjRDy$hdLGR+'ʪʂ#\ͬ6351I z'2MY %Zi$(GjIhhiBy9*+jh BIGDiG"p4J: Ei-%OI4"S-AO*zV IZCWӎ".@y .s`Eufe&d@A _ ~Ǡ  B* zsCN$):[9o̵\:ŁcQE.BJ(#8hDӰl|v {R^^??~0˺`;tCBIU8CK!CMԎRtbWT$ EdAiK).Rh+&K&e14!)NZ'>-i_ieeL{(DMK' ӠļDvs8bO^%.BԚfжŲ5#zASR<dmHW)=I " jDZ,TrԾE=.GW$sH8\:&e2ّ+`utKBיJD U8 dTX Bh2VกJG=@rQM(ZUUtjt:@#R.*VE~O}CSyoh|g2?=fDYry(/C,~! ޹g~*XS;:nw~7 uH0KҜ.Tfamڊ5U2xSq<FiYfl6hեyc0խWYLesFj6\bM%)gt:Vh֛6fa3iƭZEZJKfjTi&35jYlk-02&RBQdT+q z,Y ,UGQq¸!/BGz уRk_c][WoWEW~44* /B(4 HE4.<,~*'0EFIG^)_wrg-iˍKG|r|ŠD(F/<(\.<Ba* Ὲ}3-kA-4_~^尙!ܻ;I BQFM8B yF櫪 5Lt9EDD碚@f Lbc-ڬe2V f)li3mjPL$*WVEL=vLŦbVb9Ir]LѣVj|ҚufL6&Q<P4˜LS] U1=<R)N |UX/P?Bz1+_$A,%44T"4KAhGPuk%K9-PQZ ZYSAI⫖Ta,*#BI+5k/$Er)^^B䎠hIңH⤦"-Qy'/ eMPqu (UTMhƶٵO@j5VA4PYj35fSk0JSW$j8 "2&Su2V9&TԤ:RyQڙc&ƭY-E1)y".IKAv%{ͳfTE+AЍITbhiԩ00{wϝkREH&U'JKC@btaLORCWdEDXuVH䓿W?__/4kSW9V {G"hQM Vճcie H265%F4LD%E5CPp/^\Z*t UTW SJxC[kfeeDkQlؚk4D 2Di͒bkVfk(ؙiK8p2K~BJQЉ Ԩҧ M*2* 8Ѩm(x=P88ShqU=LЎRrU 'GS ')xZS)9/z-P\%+VUW*9<,LWT(aL)T||UWiқe&j>J*i*2:"U|IJCR CPҖTd%UikW^# % )](Jʖ*OԠZ =AA6զızEShRxbTj Jyrə9p*GC(%-'d|,jYD4>,j*}žQ?=wD/'by/.iJRs{Lisv3f^Vl'd<][I, jǟ=/9Sɧ1X!Oc,ُ1ҥLYʯXDnZz' '86,}>ė$KX+HTbhbi-Hw@>+Ĺ&ER?9ʕ5Q LN#&@QSx'zKԒITNA/!;!Mf~ }3qjhc.YQD濪1mIz5Q9zZIZe3#-S5QtU()T2B1Z&P`)j$4 ԋrb5dt?sC/XM% ) HRʂJAВ9x):TpD/֤di(ڊQZV54ћi"TRm#Y2JiBƥm4hDlEJ-)6XIYƒI*ٔMiMCs$]ʋI`5!&%G7 BWУZiZ-8JI{^|,oDj4nc|m,_睭5eκ[eKFqڜZV3{hfm80+g+M9m /=>J{jƢыӬ92cd-MqmL 3u\8.6enӻ3[fc+j42Ǜ|c^YMfYXxWurw,njg.4NjBf%i)36,c]vZ⹩2&3$5ǗhN.EOtJBVZJB\</(,)RK\ȎAԲ^STN19K H%.\Q Ut^EyK9%= ..pKUv@%i_؃kjC:hj$_пg 7s׮ʫll;*C!>y!oK[]%GJM\DS@uu..㋈zO<(>2 8(\HEΆHHfwD.ج 'L%Қ&E/ ZpWA#ԫ9)=qUu*XL /@x*'QLrR)b&Ѝ-NKBd}atldv4gv6 mU-ɵp'nm9@&TB:B*zJŐHB;JHO%EAx0P(\ȋPrHEب=RzʙIưZG=#R R'J$Pcv!Z@xUZUiQL)tN*JM($N+\*,nV Y$RRj,ICIШՊlETm&c1Y[Y$4)UT)ĖPLCЪp"M9U&EM ңR UPdUNW jTȈR0Wzb$]݁ lˋ"EsBR/T9F(NN=A?s~bzfutKۑI'r\P#@y-'Z%* Qhz 4TLu (.N*2*S@t#\p亍QJ0R)G1Ls(,J}+/CԇCGTX*?P ɈC⋊ԝ-))TʝCO2IZ9iQr\.2JzBKuCQRv4qm׷G4-l m 6m&Y`eI$^rc ['6+̋PA 9QA5QH R(Q2j%:~3*"Z*WTZdQ^T M RˇOi?9~>O!˕jH\SLUtQ.0ВN4hF'ۋjc??gqOYԅ}ROa(TC"4'4ffjic3k42խ2h665eS1JmMcZ-Xk$1A3wfKd%#G!8HG5@Q䋁'Iyv/c=U>vnb[m[w׳VGo@=  h[t)vTi z4_Yir´ d >/Ow ֬Ӭd†]ZUmEUX)%p mh靵a/e4]:k-Z }^t(w[}7AFfm$ M Rl-Km$ڴ4)Apma v秡@Mu5\5o){w<-kX=4ڱ!UekkmdQ{ zypy/Jx71w:ynjfxD 4dҍ=#COP =MD JJ"@i@=@ HTR`P=Chh  !$TFz @da LC@(S1#SH(i7zFHh&4=M!E&HdS4 =CM2  ~,hED:AVQ E!VDT%U@<8.G5BRSEP(iM ih"NIkb)*V-h(t=ӵmivQ&j 1b"gU:3T+NlYiJk5-%Fb݆ݪҪ6uS:mZI5QdAEPŎcDbAQF&݂-Uh;ACĦJAhDC]*҉I#Il;^]AmiѧUcglnUUhx=q-5v1+MGW:1KARk]T:A@4Д;d ݨ*J6K@Q製vGN֎DtMvWH4(TlRU ^؂PQQAEEPE3N(*"H0uB!2}moPuR ][OFɪnj6vZJ2&߷Нd #Wah 6Ff"R@<;QGIimiBE))QiFJZih  ^PzΚZJ&bX![a"4Й@b)R1 h Sr)HU=Wă"KmUDMAMDoXD(@J'֔DxٚJ"&$((%iSp (vE RP IdFA z$)E*R$DRaHR)hAY djV@h` P1Td}L۰JT,kfqQH-EATC@b!\-llE),XC@D5UU kUTiE ];9q(: idUVdNAqGcf]F`[C !C(b4 VmF%ڀ`IŶ,Z$ѱrʩ5lKmg@!mbc (ЈLPRFmR iz=*JJF}6P M ZPlRhSKIҚ*;R  T!J: JvP҅%%Bi )T  P%%!@R iC@R%"P 4%S4IBVI3 H#HR4д THAJҺC@ m ()F)ii@)"R҅4 AJ4R,GD@jVI(*J#CK1UWXH3-;\U ̨( auX3X@UO Ix 1H%A"@~Aa4  QE:#"xUUU_ +eTJ "A20 (@4 0*0(zěVB4Д4-"P44CCMMIT%EERғSE5CTQETIUI@Q3h i6AEkqaX(*!*gU6t4b61EU5 - mFh* 62L E44 дDQJ:IM PRHR ]#AK@Х RM#BPPE+K@CIIC5J "b((chv)AU2RT9uH}: }[C PZFbZ)!ZP())@)}:Q T" Z(iF4Z )J()DӥiDHSd|oN :k6K9 iS~5t&6^B_B:JihFӥJZ(B(V(vDzǣjoZ*ŬwkONC3 MT'Bh<:Ӷt':s&6t!uIUE7~e|H*uNQGߠ}}Pצrso&+jؙ'^tZƙ8xQwU5&9vJ5F%f3QúXlB܏3iʖ$i= fL8tS*5t(ieb.uNsUk <&S3SW´FGsE8$).8*؍!nЌc@MK2"jUNrR+*2Hnb/FoXv=KԒj:a]u o3OWMi.nqa[N/|z5r6ѾՈZ=}^}pZm zthX8;i^.ŗU%3n颰L\axn]>MTrLf(v;Xূ # DXfq u2!@¼Ji ‰x1s&7WTMQ$,b%6 z$f%Id&"b "2**Aqk[?xS?_~N2tN6x烢&"b"nG$PYQD!T!u$(䀠Ҡ1ɔ%TTAd֊&FChUQ$h:5EBlaN5l6!"hc DѲ@@ TC0aN>swRz-3IATTHRPTAH34-E2M4DTIS ADERPP~Vv|IC+\('9t9@;(ࢾ @ H@"BȒT<^@ NE@;B;BU]M  Lbeξ*4t:" ЅFQd=F  q\nU@9FJmGJ<vwW%%#@aA;F )B8@K.ܨppK6Zj^t$ ޑǬIQ n8nS$ Hfؕ0 6(W.:ZRUb騲5!.0Û8mۓ]O)$#a B,Z; iyDב\l"ȼǷtĀw`-Ti> hv1/%>J"BlQW(JP!J(ZiUкuא?E'qGa5@ QHExwq[*/vcGQmRQ@hb v!]]$aH\^!x/gu6'Q[['28΃0eHU ^ʪn0)?A2ׅ!UNq v2"d0B=]" B@`R`F.ɴ @(P" ܪq*/}p$  #XgzT}Wx@Q&aeBUBmm=qѮBBbdt8)!wyڄCE2vNoB}Nq54,@ubEd7-GˉΠVIZ`֤@ Pc QqLi1 KcPִP#9aKىLt,UW <DJ5.jVumjH0fBlst 1Bh7ir)(%XEc7d֎MMSO3bHeKOfahI6q&4:v+N@5Ŕ@7 a MuDT Z([$%V@eRB1F8 {N3P@#bu^]Nq\ b2Pth{∩)K\u?>"g) 4TAx@](zbUR'[v@ n57"WSsFkK֒; 21[]ʄ{mA, !`a\} N֢@8hF "!0gɋַqI]eEMmFC+ [E' p& *y0* ^<=*FB vP8CI=(8D;{a* HKDCp.nu khHk,ApaJF B%!A(SkEX_O^/{68xR.7'p+Gnblbh( HX0 `ìh@0H@ETQ@fp*mm5 ᪊F4bhU2Fqr;lyCsBr6G@!FLP2PXٕ~l s/&JQ`X %PtפTM T(ui*s)ftaz.] iC@RZXkev]ۊ'A 5ڪN5245ګhQ^Ivj |Ʋ6{C$<`wX( e$WdE^>xl2d;~w}^ѿ ""|̡~Z$ O@n)QR4& <BXz&}'Ij,ʶHmȡ_ N{!n M vZ]5ib@I FnWq]ݰI=xMs"7d^0h bб;`t], 8 $kE1- @a|"s,ww7QӅC$?^V${?*:z{GaEpP$C I%w[/$^+fj{맷~y#>Ј=@gh41qL-;YƀmBY̸di<@"'tyD(%# ! iKO[tΖ,z׺f`4J[ i6 b`[!5tV;KGcu1q; Fɲ%䗯zyǗ8H(N]; * 0 HWCmP@ŚjāFk`IX=mMv*}'ݼ@WU4iiLBSw%Nmuw` Zz.ITT6&,$)p܊p.Q1~Sɂ=ҧҀ)Z8œpq{"CULȀJ r"ʤ݁?zGwQpP#@] rp @p܆s H(pbEak(?,# t 2Kc$jR(ݔ:9E`.TʠC:K2Acnp& /7ȀWKě_f@q=B(( NV1\%}q`0~)'؟=E;5\QP zb6_k"R>pA!N&BMC,R 7n!8Te` $I9r( QNz]_`@WIVA0Hp(eQ|>Bñ %(B=\'[X8!vNa?<)x-Y=d0/F=ݵULF=0 <(x6r)CWsdr9^Ay2dc҃cAh^@,S,m | 66dwEo=H誻9E8Y @S=w"JĦ{xmI41aҊhB2*8$4A )"4~~Q#Hzۨl*F M$.n YF)V H3bڌfSP y[](4a ]Us\5utm"P7*Gwr)er&WJ .3 @(C(yL>Px\a\ڍ(jBmdRA Q#v #1BRM``ےb"r1N#:lZE4kj>F2)6Hm΋z!ij([U)mkcUqV'6cjZ4b ΀ % (eQxlEAZ9,-Ti-TXh6ʵmju(MdHqpX[EjQJDXI OmQR`KAHL$Uc1 Q"+_:CPCE%5E*@MqLfҸuQ&%buo""# K H|շWI3%u-35HY𲜔 $*@m{1hDw(=^(u3B ZG4[#Z=p7 9mk!) JlH+ӓR CBJuj; !%"У-L֪]&;+M@8ky`܍lhMj9Ġ.v()/  ><|*񎰪q'zM:`D "2VtmQH$ܰvNծ.7mUQE4qB{  \‚v0 ;p m\@$"Bqt\@y˭v&ˬFE # R #3(."T\X ơa yT$ *tnq"uxE4 H0 ^.TU7"+yr6dSKc"wZ uŽ)8Q;^5Ȧ-dGElٟCvLkTH(bS5uumuEe.(j˦89*֐sM\&aC‡@= Nuh'3(iQ4n23R3kS)r:41vnEENCocG8_ERB/B:PWB2M tt":= :j?Q@"x؈7trtC(K.;)A]--kԍXHf.Đ5{80͏D盺Wk/6ZkFεSXB`g&6OCj*1=&(X@x&#Џ:&Dhی#9`dFX Z0 +c8tppb[0dTeSg܂]F YAAf׎8uĆU79KU2|{HHv R.`dʻu!wp600#A┲Utpe%/B#  ujSvׅUHk  8(mX0$#$K5%VJV(ܔЈf -Qb`v*G% 0IZڰGZcw}SV.xPd 6QgFQ,#VfRZ;ACkTUmﯾz޵S`51\Xց%$#MKWm+]aP-ʚRRn$4U9e)wvA{ XE"Rq꣸ہ: *@EE6|0| P2S.NepEmb7l7ac@lR.\^SݮkK4YS0WQиp+ke)s$|/#)Wŀփ @M`@vN~mR'Gёanʎ zPۅS5Z Tc n^@w\ mCZ@)H@a`t2i fʴ$n®^Y962Z0dEiSZ  Qr7ujL<`Is]`,V&9xR8#k'\4'ED.FUœ8 ->N$P1(P#RmfS~Fi  e6Ӥ`B H@t/E#@q4Н,b B iU6LA{'T#)HD7:z6:W xq_Z_ I@}x^1fAC,nV-tzt.lEqCٽ@g0f=nNK] QN \t4ҝ+ҭ-ҁ:@6OC pbPVЙ힟D|^cMo8bC|plWv8r7D T.mWHH$ ؠܼ]ݒjn7= -#ȧ(jk$#[bA8ܵv F5ƩҀ)cM.(DxuS]&ંe݁J@5$$.$yyB&BP i~n?!=!A'jĿ_Szwmw @ ! +B1*J/s"~qXPLw#`p "ǔ#+vv48In&$&ƻsD5q3hnuѕM^3݊Ţ@5-;,`;M]څ8Tm)m=q|(޻\TsBف#~-V(p4 *.t &PQ1{BѴnVr=(K`TM*EB =NH Vb)сK(&9M hcp#P d@Wn0K9z Va4ve2^ y=Be(P8M,ͳr\{?sӎGCSBX ]Wm@eͮ Lk:0sqXWbǼE]*UQPFwA%6"\GӑQ(()ex)D9h jLje(6PSEDQBD4@A0()- 5A{ a6nt I'ZuA!`D` ) u*(ɁO^':t#UdT!Gs P93(1R-uuӥBK ul ZԴlvirjJ \5nasj#buI]u^PUW6#eY:A*Cn9yc3zҏ݊`iG[cm1q-|{QUCľcz )(;<0~|Sae''4?rS`x>ԈyШB@P /[gx`|idжRZәӎ% NE M'CB; lG>|(_ױ*@ mti غF-jU^㮱)M)ݔC =B(n:N":.9ӲXtM[kn@\RBIY%.\hJE6 ӊW^% HKlݎb% "2He!dJxY'豮Ƌ-;!i֟=`qq=a3RJib$aM<4.Z!mGYpXSwN; ALkرvnQ2n8]Y!rpUWgPZ4LQUi8tJM] KI,uػ&Ҕt5 )E20P9ÓJFAv8+- A#ɫ9D!HFd0h,C-+G}sI$ؾŨk_K-C<lMGBhj`") RGEn+*{d*1"Nl DA"95'e8A:wcuF`Fjm&DdjVIVVY*0:pI0vH&)4[f]؅5DR*! hdT6stwfsw`d4FҍVˌA *$Pz!9 (! | ($* ),J2 $z"PʅBCJ% 4Re %,HЉT 2yB|8AA{½UuTaXT B`+. "@ B&+?ye B H0) ?x@ `ff`B$Ta@-  2 TD=wF Z BJ@` 6 H H\ UB * O N!SaX@@ **`)"T=7q(yeӶ"(?Oy F((!tlc-tgD2-B$E I"]1: 31C1[舔6Z0D9*PI+&ZM#`Q+S!uEK$[1кqDIEhA$D.`Jh3UU|y"dSUNXDy*Q AL("lc`H fㅯҲ$a&+T$qcD$%d`jk,hFJW w ƎRHUSXBnDvÂD.ri Z Kn^2b2i%Q0anMm7v:!p! ~y0 ^vnp'wdN B.2hN,`Q:2sDWwkLW+nv^NFcI!U LrV䧣<(.ѧH QlhcԥKq˄uG8ĕӺg\˛1n%" GAܲTTn.l,!!Χ`4t iM<Aҝq)H >_@WBjtLyR+/Fxcu1õlH@ #_ExN JD(Da{@P GPݒSJPPSCѢ4NNtQOBǎ>}=AT'!|i(?5tI fPzCSGvPp莍Ϗvp@QZk6T7CO:Gz4,8\Jaɭqݯ] V-+t z v@۹m_θΊs.ٝQJP0th,ܭI9; H@HЁL^omv)31'J Q<o۽H vA:e;V .G@VqӼ*#֍L۪S"tx޺>a "h^ l j Kwer,( '{\Ċ9S:Zh[vm]%ڴԀ aYĨt(^b@X; iB=ꌞnbyh`уA̴Af=*)`[`ħ)^ AZ42qmjPmV F^;tJ Gԍ Yđ4FY Qkr`37u r ]J.4"Γ6$bUe$ uN;En  &L'rҦ){o( V;^ҎN !B"uP W0hwR[+B A4JBZg ktYsrwmKL5&;(N"x찑+ chl\ 5*h LK=4Z}@bj8umwVQ D:@C(yAv%PАĄhbA"QUQEJT)CҮJ0~(a&XCix}0{1hOF܂kU+) 1Mq!'thJi4ٮ;h+}+ !Mvg:ŋ o M[VٮǷ^1R ()ʂp! ()eCP%K#B @Uư=w" cc}|{jI1T))DeL0&Wp>@r Q8 'wrʦ ݻXԨXŸRB%IV!(hH`Q)AYJdj"d& YiIh %$v Y ہPx(yW\ Ա6B!ʼn2"o M| ۱=(ȼ(quMut$)r09I(A7:  !rrgN x< ("[@T`B U,TRBD dJ$7h T*%d#SZ GZ&7V&ƖZ0p+ j4݀<ܣ$ W~9O eEa\(p$t\DDPue)`hGOՂ҉Q!Y *@Re֕# H^ww< k, } I.(=(p&]헄L xՃqn%JPq˴:; _fXu֞Zs59MBp҃›̉@dAA4(g.`2 A.=;ŕжĈ&| y<(eA_ 4wu=jƶPI':اձN[% dDaBp!AOS̗Jv/bZ$MF爓Y /(쪇ButeEC up(&pb(bRdU@DlUf!y.J͸ޖKtb<@Х(q4:u H$ uEaPqJD ,SRRPUTTA$$"P10B-s;E$&r4@ 㴂dPrPq|6Xpqdw|-[;>VkFj0Hj ꊝCwB#9Hē82QQx%fߌ'Q2nIy0ZfD\:5}iJJwˊ>`|y^sMM7'G%hpDDQ4]UOvo]9GM bI[oSФ(5+nYIxwTʍI,se|UJ%m!]puzw<8A[){!G,`e1]oǭ]0b{.BOqNsחbۦ8fy7'ҏ^A4 u\øZFhY;1qva-p[EB¸hqR%6!42%$,\(7OʕXǜ] K2q MHlH`n0s9$@D\uŶ*kZЁК>:@0Q>_%ćGۮ.kmg-UVfBmh%, vM[BuY-Q͒4;%2GY#fH&B#$JZOzN\)dyd+HY.n51=:F d{ІuB-JJ+REȹ4>]UaO&363 @@!)b (rUQ@A( EO)|Yx('ox0@vڍ[C@R@ Z8> * h#LlO@GT<)3ʞLPzQiLGԇd4HdbCڠi)"$h #"rhG i!!2)2L%(FZʌ2(JPhBZ2r20,Aɤ)qj3',- _4Ox3M'|3F>֩8QEO+R/o8 |R\[SX A^s/[µJQǏy*6n <`Tz_”IFCt!ZixUp7?ډVT3BbRoyֲtHȍ## lzv'2n7gsNә.߸#VN'$OuhX]Җo&b NG<]P֖.~rr}Mlhs+ 7:<}3*T;Ij)9-sx 7nBYh0Gow^(u;\2;`HK[t!o|=4#I.(%#K:uRcGDAGeɏ4MO}˝vpf>^tV)ojmefbؽr5X{{ G<^o>o/zԭ=eu_{zLOQ:v"iQQRP9m-0+lt Wk{aC&>rŃ[xY\eA>Жp&JΖk{.*9:,bХ2`3: ?'e{'j^n?Z&+֋vWIc[70.f]DR FA{5Ll.77JfފQKgwߤ\Br4|} ^&>H*Xeo0PS(Dkv],Z H!C9R BmД0}5HW=6{cA Ny)!w3SNz]\hP%^Ĩ60iم*l/Y !60p e ,KI@Ċk(&y*5NB&e̜0ΚNdsѲ[7qQHSY63(4'j @a88d6XS8@4I8chbX@xD&qư8GCM'Jo2LΛ`ɬŦr.;dtbhOׁ9RpZF4` AXnh0XLJy{kaU4ijr-S\~\MNfk6JހbJB ߶^gwBNH: "b@)Xѷ-{W "-61 ,lF>lNru'Cq¹MJPaWx"-XY_mIڽ13,} {xr[S9ўydLjaAyґF"Ӭ#RW>ח`" S AH !9; Iˁ !)2=U^u_ Wf IRt7ۙY.o-(z,,>ía v=tił;m,^b #ZCkH6,$k&Y\b-V&8B+} &\jSvdxD:јKcr2[o9I𛴞fݞZ)A}őD}IskwƉY\i,gq,P_ӎ2;ֹ6o2B$kuK747 WA5%PGvJ16jy҆ZSK%*&` MPa %ɷ%2G ;, pr>Ȓ$pă^ƒjr|1ƨz$Scg f!.#%gHQї-M4bp{snI}2LG]%R#V`R Bfxiӳ'Ak/\-N;[&ba:9bzVY#WτӎDN@i_3yfo&f(u< *fD H1 t28NzWL 關#PKPk4%u=LXhi4ӎK7盘RԄݹYzB6 2 = MW87\z.)qP@ӋJR~0c1KG M5nI-q«5j8"J=j =O"2pgG 7)#H;.W#nLBc" Vwu;}쏄剿õpy_oA7TG[Sƣ|JӷÔO~(N|JT% ߛzivLG,)O+%)Q !@ "C޷n 9H<N9s` 5-\KlVH8sX5]`d4һpbP< D;LM?GL=+ѾFzRf?/6OnfǍ؁^k>ͅHW}"DfKl4Erơ|$Mycۤn?}h.98HD&H^)rᤁTSZ[nNF/f_KkJS#)/I>Ƅ,B@嶼F!jHKe0cF WI+e?~$Fi^cg΅b3z(b0$bHp"ły\Gp^;#C`T旳eG2Mv0ئms) f6lGZ6 U(R)* i) QҌ!lllѱ)()bA3)(G FBM)2I))hfRhJBr() J)R)(rS% P"Ӈ% BbkXl)(xY;=WORE*H/}ץeճˬV]j,B(BL0aH \$$)s3@h(ʂҁ2" u(t 8tH%Yʆ"(J 8ĭ!@493(b38Y̅fCH *QBcJ5)PĚB90`a5$tR/I d601!S2)G-+TR4QLJ?:g k"fG \'&dĹ6CCNSm:@dR4i\њ$226T[2W2 90W$feJ3*F1s*0 AJtL hh()Hͤ:HD0SE%)%4R%5hR  #@XV&f[ c`BQPĀ"UcfYڛa6Rb&) (V&QiD FDhXh6C)$E3 EBP4%PQ iA+iVŵ RPA"%*[6^w6 &UpJZҭT9N`cfJ둜⋖fLb*V 0QqNܜsKtjsUd]X,kRͤNqҗ16'$Ɨ4J,L)lc&8 %8`H,2#8(Ғ0L8܊i%ڠs*m!:F"K$`3(^޺ W}VTA8%ES*Z(EhVwD%S.KE:V"psY\DdmE Sst:NVBW#+*Ze5ɕ9VDeٍrtk`WUC4ВuƓ&S:DtR"q3~W̢uSqeT;,UDHNGx5DډjLB򌣛j:qPڥjR]SF5mF3TdTu%pWU'A%SFMB8% 5*jtucJ8SWC9g9nvGv KPCs&! ^5si.22H *mP9ܫ 3euBd $q*᝝.KGe6H-e*TRӎ]SuKB5#Q*'\TsTS JTDڭ7-p,\Kv &䳗+aS9.ӉRD( jomn;YA6uAvnyD $<28,2`@ cqB@80HNO|I._rqN5NS鎲*!< S(֩.XIHe,B.J`&VUY"Y8Q4FZjrҩ[Mf9#GAr\aSKF'UllX-&,imFSbcM.GKQ~]bNZhVs5 cK̢5UB4aY2 j--Nmf%m1a*M3J!(#@Dj㵤sD`2J "InJnv9-bdDM"pu> 2M ٻIg*ξhȲ93!@Nɂen=~2}mޙGty8'=D"&ȃzӆ #{iG9$Y"=cqᾙK҇TFFJW%jLg=Ϸ5GPOX9lk>>8I* '`&950 K [c>!(|=z/χm:}mj4| C3iYVS~@?vOM]9wE-mnow0f MYIi]r F vq>"zF4 R7Α:lBBDYP:ON ^?%p g&Cs3(I:1T`H0AA@@@$Ԩ"$4Q>TPLM=xxF (QTT P  P@ ` @k@ JC6*!ddDOJ==SO450"hf5 FA!AB)FCh@i4 20 2fC# ѧU)hhh FM14 LAɢ5=HdCI蚛=)Gh=54hh (JHHiOBdG{TQ駩Sz#Cb>w?TPMIaՕ&ΝY]eKVsGYU'm\-%MeԯU(n HFǍhiI{2og!fey_O˯_hKef#V5eXr9Glٟ~Wg5ՇW]gdާBa-!7 *S,k75FN,^cS?{Mgg}3<5fcs1%a\ÊW-(Te$ MMj& '*4?־s3hd>fgǜdYUpJ7"*+,V5 ax'9kjTW"RMXSթR9Uea\[2કJ0jePDj»M-(H%I/T(Q4EJlV굢R6RL8aSrÕXj-X+V7.<;&8XfY.37oT¤aF5eih_/˟gfF29_Uʮ,M8M\-[37Z0U%Q]ohexKZZHmM2NEN[a\ 9 M #dI )ʼn"j&!&/H$X5 _ vPo;E+\*C$XҵA|[ZE:eG3 'få,kWf 츉ܣjC{ 4R6^Ш<1>\˧V-QUVJoz("x*eRY)4 i[vpH'TGT$)TVZ7X!RhDw6eԞcoSXtr[oG~4BQHfx=Us^Tv$vM#F̺U{+"D0O(͜yzٿ 8wyagEVw}"mj"ܤF~Cb y|/D|[n}Ϻl٫W;odɩZCsSckkcqMAZؙ{ck5m $ܼ͙LvzI柳{o y{-Ǹlx{4v8=M5rȊ۟A=L_܊϶ckЋ"y)j;߱[\ X'J*nާ7~Wz$I $Cl27r~u)JZyLɲ +X- }`<?D#S%V["ܙBKfI!E &ޓ"!$x4pn{{aO"C8;'q7&-Mϵ?8!L1͖lٳf͛6lٿ -Bŗ"fL1fFƅ_zP `:k&XVY&jI&-iլeU.W¿TFw%~?,3Y32Yj34̺S E= 5J<_YU|IBx8gY^M+ʪ`X!>~ 24|nt 5j#,_f?ϟ|,g21aJxN4vU4)*prZ9&9R*s+ *UUos;j`s(y="U??}s(@-%I*ŀSmfL3wm<;׼Wm']λw{[wI$Y -NBwz4|, ӧ F P #jB+dz$LF JWyE0&S)N?q_}vmsbmē3F.Xm8h~7$r*[Zw^6V8;mZ`,,e .PBdsiPR(we+G!Q`zQ&O|^L=U#ߩt{?P/e g~i13uɮ_ 8&0l/*X-"P"5 j6ֿȀjRDD$szx}uxx*Uݏb/ӝFYwkڧ).\9W]ێj-Ѧ9[NZk̬v BBHh,S QKڤ[ URRVl`[MM=$D ,L*Jjq\1̖bYh}|MRURG0f0gLbc(̬1f3&c1123 >#BWm JR4uY'Ls8qp?u?wef!sǜ[ʳ2 ̖b2^g,1f3%N0OrBA* ؂Q㐧zt|?YIO#i2H|a2.$} `} ϡnHw$!v0V|=3C=c=c>77v!?h|p:uzH'y\?97|pİ{L gC32: IiYT>Gc"w Ef3yr-+5qk65qȂəϡyG^zSĴt72GĴn+>ᬬĤ&`LFed\^LTk</7&aI#A{ ̋NEGL%2⒲E'qI"FgC++,7(/8CZX`H`dPXx K; ǑA}Zy̴fi:e=ZRV\bkdĄ*Uڙy#Ʃ9CrRt*#E!RNe UTTRMTUoQTY26pERU0•e9>e?T:))DdC^ ґKe_Ң# e2,BV#,L̸AR\Qq8s3*r,fr.+ ρIĤ,PŜOA_e ȿ2.,?T~,S3TSڅL" ,*@&'J'-%aYa5G%%_Ҫ|J ?Yk5v؋fͲ6lٳ34vmys/m6y?m|m:`y0շ퍶g3q6,YbqqXg8skk9wlc9fY{xg1n87laJTcE3&*3333fg333333332̪333#32fg31333afasGh6? 'US0 &2YM$Jƺ[ʖa-1$L:~Nfȓ?0Euq"P͠iE5C08Uh%jX!͊WTPbS%¨% `# ^K#6+b+U,b8K X yTM"DAґ^W k@ W"I41-WlK+*H"? L&y,xSG+;@R~[O"c¹J%DBT}{n R+[Q5Br]3}e~cQ}內dL.%\wto;˨s:DK$ßz=n-NOD ȶg:"з.p3TBjXt5qv;'}5MUǺ:G($D&Hy#Gv<6xrώ })ϯn֊_DF6kZ5MŢ(dGRFL|qUbЙջ8nO.}o~۫v]"9F-n߻eH}EĤ$Ɠy^.]CʃU)E9"U~\@s;MDF:@%T X С`M؛eM2Y(quK8\HȰE$'=OS#5]/LR*KW)w ~rգU.$L.']ӻ>>Q?Em>o:u53wjײUS_S2ۭgXq8fzYHCV= >&tD=KsAa{e~rܻ/,9UA̡lի[eVS>GnljDH""$\Lr>c{'BCo)6۸w}t˟w+\ۼ{C~b# Z֏;姸yYom=f~YqQOu[KEYUŸ[$ZUX YK2cW0!$">d{wzÙ3+>&#>3׭[[\DYQiQ&EɚZע}Gȼ^:N>X;{jMpl,ݵJ.~=g6:gZ6ah[WF+4MD#AؐFÉao&b|'j<5p4.u&zt@ܦ/GYM;.pr w"*yqgn׺{ό]F.Vf\FZP<@nھv+dHӯe=N۴㦹IM'16'aLᧆݞ8έjg{. iL^g30ݷW?Y.ɳYS|xuNb^kƮ~ξzO沍8}i3ZnK4I *@D!|i*MTUs)YvzrϮ^k毜SLsysr8ֿ:f_?W֗4S񣙘 3%?LYYi<,=:C)fWq4L\093ֱ3#32 ŬůfOٯZxds>kZ9~5e,ԯǜqys%sȔf42y'nT86a U*br7JU?>4Sj.zpVMU:%%Ha3CZCmvγ̪g~9Z]ϙ2O a̜ ZØ`vwJf7'4c*f13\ϙ fb̌?}q6cXӨsLә '=Ĕ`zGhjxtO)|ʄ8>#Qϸp6q"r& %'9e901%ɔ9sa'K˗#Rs#9C.L833)0r0VxTfe1LL'1NL\a|G_\˗&WŖO% 2p2CYic1Y̪~2e`q~ \(3yJePfsqg9f2a2<_2>|VʲfF ^0ɕ>YA2pyfFCpp2x!̓> K1Vb!dbLx~<~ŞbL.Rr\1?/5~.R|x0LU8|̼y\y#xʜUy\8~ϗ2ʲ UO99U*^XVdxA # )x8eAY^2ʡsK`rLYeresr+1Șʸ3a.LU 0bGW1V1LR?Jʼg21f93,Ùqf,ɘXfXefNs),2,*K,9LY9ǃ&V2~U|2p22Wσ+8g&pVO,rycKb\Xb'RxbKS(89bSrc9e~/y<^+,9\fRFb#(f"eRI *e'\uRls|G1$G3d.p0V)ydI|L2pž%r+3%1$eG/89r^E,pO s? 52>>q7ᐏ3|Ȩu$LRV\Pڨr86Vd~G#iZ4BŁAAAr.)4/9!2n8NgGd{ ^H"D QI YS C%˜QVX2VLIfLW# '**Uʌ^W9s^V qO3'#9)LFY2+Ep~LW,!/|^\1RxEdxG*dp& s$PW9)/ؼ1?0'*g xppW1|9)K#كթ0,dO0̌Ŕ.rG!3.,3g 8r2S +,1LU3,SBg%x̳9!/&N|>/Lec1U9be2c!b2ʖ  ^pĖU\c0ĒXb+^QC$^yc&VL*(TDO`z'Hz,3DRh\Eș2GRRP^ z^pO+' &^`SLLg9Ɍxe\r>ey1>a'9aK/. Y%̣0S1LyK,C(2xe.*fdb\ა̥˃)y2gBIHh+:F%%ņg#) KΈ>3aΧQI*628yx#qQ) 'y3qXP`H n9uOapxxLʣ eVq',eL<|2Ta99898Vq' \20eJG>NX?⿛䨾S ?.XO^/>cXeK.U~&&'J*0JqYFUfp\"Hy0XBNyg%0xfK c0<,b8a' F3#0f,eVxḶ,Vb̗˙pF!<9y NF\\aeCQr2xE1% 3R|Q1̈C8S/ dI.CUqCe|pQx8y~ d|LxyS3)2sÑ,9c&X| >D ̜d/K_#I& e3*3>8౉\Y3"G9qL1C,8b_0 ^2_|_0'\ęfV f\q',W)L~BG+9qG?NL3y|1s38r1T(33Lsas,X1a 3bfc13,g#_''rePp'd圿L>XbUc21K,NYYc*+.g˙g Nr< QsLer~̣唯1ee ,c0! *Ėad3#fV+1s3+21̗afe2y0,f0(& _㘓W2d1F*s/!0*eW%dᓓ*L0b_12fK*SO& Rr\YX^Ysy9s9T㗏f D 1bUɋ&FIrRf)WRd\ⲌegAIIIlrT'B>ERLL,ʖgH%)œyY"*+8;"h I)J_q9LtRI }H`H`6 JJE%D$RVz I 6/W9s|MgPl5 g fX)>AL M'ck:633Ax2ddHqXNs8 : N;ffE* %Fq16/;f\q j8 &'SВ7$!Pk/6)I&БY7r-$2'`6+6a$« z;`$;%2 0ɑPa83%Y$s> Q,DeYe fSY%̢̪ϜDa9pE&,OȘYFdS 2TfT|f>eLcO2"iDEJ h:%9 fPza+4 KKSYyziyAy f##Qw`o=KOaxNF&G3s9 Mgyk: eg"dΧi4g#r89 >NUy2J0aC(Sb>Ob㏖_Ux/Yx1'1Fy0| a*yᑆJeUQ32eR|ʑ$9E,2y8?I˓G2dxd)2b2,Jş1qLb.1ea0# e׮=/4= 05YII>i=č`\dy&u%|NGV`Vi-;R3BfUx(= £YSCԸ[ܔ9ϼ}GSȠxOr$Pj,*0:6'2$r7NZ)x Nfl4m-+7EgCA|3ęIi=MiQ4yb挌MfǑIШY;#Qwm:"ӑq,2?Oa'`A6 u~߇Ґ>zGz>kJ\$>b{L1-.R[K9ОфIspY<~+d _A4xpmwf/aӎ \ϙUw\̯C6+7bS#B4 xA} l]ZlDd4UrI)M`%Tlkθ/PiJҔ7Y& #jӆ Fti+:ӖyuENF5h;B"έqݪU@WBr, Gz``4E(2_aiU+FfM/gE6U_< F6'YmhnvC]k^QhI$J[ hTA9~ 8ey )b DF=/G4:O A= ISW)zqXIzX\8D1M&@ŹL'f-3Ks8:pNA:P~{'} N ''|! HCA8A* OiA=2 dr9 ^PNOR #Z_/9PN2 O(H'X'Ϥ'i׏z&OA:PO]uA>N8~d0)O9W6jŃ{GL6a0X~fV\ pa/̮Z00 ?;CRj L5>VSǕrkf\$(NO?I R$8E "? ւN`@MH_/~Wyo/V^b =d4b P|HH `alakazam/data/ExampleDbChangeo.rda0000644000175000017500000035102514067624107016731 0ustar nileshnileshksM=yas8I/%)ϙwclO 444n(bh肢.\t17~ad_^!Nʼx4V:0~|So?[?br_zOgp_no櫭ɵtݫ|3SՁd3M׭n0sW盁{u}]$mn !{{ce1w<뇡{uq=ܿz=u]?-݃Ż7fqcW=w|4x^0gw}?|ȷ'7+Og淿ѕcMjw|6yn7fYoz3WݻōL.onǭ^ZirK7{?xtw2ԡyp4zN|6u#Ϻ&geYw2^9yk5^yh“{Mcћ/kמ[QI<Ϯ/~NH[J^&O{r.ܷ ooƏǸ'73Ǹ? q^'-mw[۟{N&ٷΨ~^O] өm>Sǧ'?gNl2u֗緮{]a.a ?g<_8hqo6=:BRy#g||p۟WNbuMͽ&Zؽ:={zo^.]Hv^m_nvzakd;@|}O vGndwuꌻcjlz$'OӋֵ&w=Ư+m{M%Kvm{罊y3v^Ew_9~$=ٙ_8۟mS{hvG7g'-Ox w#0}:)N^G?=;Gƒ{ y..U=[;C7t~բ)<]_zO2I{͍a }Z396M1EG-n-'-޽}fD[}71;]Ecag~~t;~p>mk<7mgO}Jzfwvh8Kgޏo}Jzѽ8 |gܺV/nv]YWoyzHDj2٨uu2Ԣq/8;ԛ[ zr>xq''-qWkxce"(k d2h۟-^G!;__*Yjs'csn ]$_?7t֟] f/ONrJHdvfG_Y7m,Nw|5'V_{ vk__t-aޚ+tW|u&/Ľ=?|aq>yY{m,O&ފwyûㅷd,دY|O'Km2[ [p{B>v؞bȁ )L}Djh;;;Nw>s*Osm(֝(Q\y:'r6|;;ٻ}Vby͇#MnVjw4}jhS~sv]Z[_h7޷L=_b}r:ϣ;2'rˡL{ p|yroVI珷޻YכDG>[|w>NxOh/gF^ـ箻[Zowt_ C_nޫLg\ɍ䊯-n}r][E"۝m?} :`x>OcUD|g8-DK7?<ד4Q"S.ޯ&!_ Ӎӻ5|Ҏ ;OםY|-ix&fkڛ<8^ǐywڻI5pp~cѝ]xRi׭*<9 ӥWږot=~w|kįo>hADž$u"+Z^ɸIdKGw|=MZVfNt&އiOgN;s"wMT׹?y||}uТ݋\I[KV_$::Cߓk#~L&DŽO<,kz6z^g۷W|}ITi/8<߷AB^/I?o/OoG )$Ld j쫿<juwr?qc^ g~˵sE}ߓھ:y|BW<=EmzKnn}t0:]9ӛ]z 3ٝE1d໼o[O_^|-*^tw;atA/h1u|{nwhts ʃ۶}FQ=y}_fO%͌=_B;ےGesvkT$<~_$(KToDGXw}c{C"FB;\?&/Džp;={mx=ώ/DO<8n~=,-$OQ6FBi"Q9v2OTSߟ|oh=[^/w)[L'2#sӗ^Om~=,۳.D6'-&~>k[ݑ_%4㉯.wR/u?u9ۮQ SǗ}՟Q=Ld/=µ4xNN}m|8{ݻϽG-[O{{bϖ_\K79}<{v-)y>p1z&ݗ&w\J`ʪ=&-Qqnp6j_o&g>8brz+U^#|U'/sSgp edidQm^׉潎ޟ}PD#YwYQ}7lo}Ϋ[˫)Dw#0\%t}HT@DYWbzKdr:/]<t0}Zxov+ekMKÐii2c^&::acG/>>?W}] 擇惇\n{Ċ|<}P{-wZ>W<_\%<Ѭ5JsƳ˄찌>>{l|_^m=_%wwyx:]iYng?9lGwwݚM۞)&ϧ3Ѝ&NHPY^pw gK<=lj(Mt7]sQԯ?*+ܴ}ROFO7ӧ j:W~Bލ#g_}X^wyѿG/^{=:?%I̧o of}$WqY$k2\x_|"CtF=߽>4[.]L6޿$fwRoz7臘g_Ӣu+xyG7''/W=o|;%2#KyןD̻#~><%\;G /y{0N}s}IHIt>2ۛ?>LoO|}E몛vu6s=]2eiz|[&xo'|X ~w}~izUo?%g0].< G}y?vޭҹUuƳkJt_: uKКΌ{ svps;NfDw;&?dz%`I<+j,٣cY[3D]zD/Ξf=7~72>~Շ./:S] G^W=EepY07wD'GN~oN'7O-_uّfgrux/On-ֵ7jBgx:}dN\Lֻ&ԗkYm^ř_o}q 8Bv(}~gr{CWOW^{<|w+' or4;OHCܽ4?\[ uFV3ye4g Vv;{Eh1ՃwG@/;~jwr;oړ׋ybfלjݷQ"{Sz~SFW-J{4MD8por-#ޛ>&j˨>Q~pֿM!Q켿&N; aϯn|s Eo>u}W.qnRpB-Q-w~{ȏ]O3^mNd|WsÛyy8zg&g{ĹjC_]=XdIezmb/Ћ?!XL|&}iĚ&k)!8&2r[$pxN_Jٺ{Aۇy"}o[ȝ; 0gRq޻ Ĺ<2/h#eL: =yHg|uk$2Q{Z O?_t'֟^K>1Cn}Lk ~ro9Q>y"3:t'㙻p>跽/Ql.zN]ތn=|qnz$rO&#"Ϣ,=Ń<|W{}@F~[2K%z5x{zN>O;w5<%t^:2W~Ο2um'7zO-O~zw7~2.[ f/]q!_ыsy{['UkKJ|m|~ջI罻=9K4Xu뼤O}oz'v?}WwL-uԢ~n59?=ߋ8X;2fZKJTGϽDͫﯞL wG>g3De7[1gǏ!pN8g|7ODϾ"}[i?ܻН4ʯџ7X<_~Z:=#.I~uk2UMd\5'n qxx'b`_p5gL^gLH}uX$;'TƼz^M+ΐQ5~@nn}6oO73{mߟIH !S__s?.U&q@NwGw DOb@}H컽}^MO8^Ȯ_S/,'w] mQǰ:};5ga+bruYfה=(<(qC}ԟF ٟX؛KﵓUDkt0q \Yȟ9,ѻxQӻ/NE|og5zxzKUyH2ku.|=ɍ=i_|T_>3'vu&ܺ}xVprsxsA=g'#W S3o&$*Ğ q꼕[ߏ_{> _ |}V~#WCu8ljNB{>}&g9^N\e{wC/wF-NtJuGry}_'v|e2C&$".N,,޼oE?ɷ|x}y]=WCߵ:\Rb/}xz1s%UqHx0{mKzׇv"9|K5?%a_^井8/F;܆י?;zOXڷ7t($:(h6gGu⤳wJĦǶ?9;=Jk"a8:Q??'f><}ŸW1=|-3'kw'W3_ՠ<5q"QE>Dr8$?,OoĹ£nWSry_w',F~hpO[w+m??}'NK?m<$4umM~P{~T8|w1Rof׿ǐagt35^ 3K)NM4ǡhߦD<(D n?}Ea<yyew_|`z_EP 9qu/)y|{HBY$6qg&ݷD:)yԟlj}bLg"CW.}~.7$"b?ѩ#2qot;Ld"___ 烞ӭvyqsp}χZCs']/Ct33{=kc6NśKKO[댄 KB#>S0C{fT9?,~sϞ{-3򌋧;Y3zⱌgD}ҟ:|Ʒ/~ )7ŽZXn}$1sBC[?S3QF/>s7gNCO,;/zGKwPL;z}yC2DZ81qc%aCyuN9?8oհb8^Ew|>KxϮ] xYOAn?)'./]w[μמLC'Uy36ScLٌԟГ|x<'wd(oW7<3{׮v Ԧs ?/s0=0݋D~Lן]Sg|+]綏|/~pb/q͟מ,DfoľP~sݝ՟zAw'NOEg[Y|1g>{;npv?@&SEm'rϵʟ_ZTZOQ1z&|ɲ >mt#8&_sQ6V郳Ag8zwr='2Ûv"<9ѓ?m}2э>Cg ^g ꎃLdg;Fc׉ׯ<ڡ4ȽqYf>?''ω -ӫ?baz\a w3g _=Ӄ2IwZ;W{ᣯ?9;|tO9xy~ƃyo8[sFCp:[g<ۢ^b~',:;ڜG/wg6.}={_K㗄?y5:ˈ<Vz$2Da4uor/ӗ~W}b|do>{i;yyG\'Iw6wC"Y ? s[t|ǃKuNj݄߫ҟ3ҡu/ S?wn&˕0pp8`V5y}|__Ͻ_2y}Ef0#>';|9{v}6}Φ5 ~ %/8gܧ_O"auٟ&Kй]׭qRȨτu@{0p4k':gWy+ xΊ?Qa*'v,?v}qo8/{˷a|:Q.& g+^='m'"v*ݟ/ez;{׫x&D|tgz_ϊ BKϟ<4ѻ8x5hn)\w|Ο<-nKzP^/ {p#Q'_z?uj993:d1H<)v2~ 3l|y!f^kt77>,ƽI}sViꙥ2Qq䛗7$ӹGS.Jd&w^ٛv]oFD=w:,c~O~'gtm^FTg-S&v+>ѩ3=sكߏӛ˓ g/O7St9OlRݽŕJ`~哗;zv?3~oY{t|OzOf65.Fx<$=߼ }o~/FgN}hpjM7~~޴'nX}<|Z>4X}z96xL<w9/.InӖǣllv=zmԟO>7}+<ן.i;3q5ƽe{ql{>kg>==o'Bv'jji֤3n-}_?!j8;bHd8gx }cw<;Yzg.>C?qw ?h/߯?uW̗gJ:*סɳmǭ~\gJ,ډOδRxf"ZGIC7{=yjΝϟk[4}N,|yU1iK`v5OSS:48gi[Vlw3V[2^Ң$Z6yh0xf4M>%e_^VozJZk_ٛ2 -''5~OgDgΉ7-ROި:Cj/̟iɋߕ1_g%ghs){@zӷR@ǯ>j_޳"'ɍw.zBq4$],& ,vWOBͯYNω=+-O.^}phjI ɣo/8=pW^۷gCvhH"wOneA?|}'I&qB^CQ·}N`9oݦ%Sg_Lu7/牽)qZ.cӛ*& oX}}Cf )4]~j?k_k%;Ӕ ';_' U^B{ij^<$ΔݚDݟޤ\-GJ=hjPӖ'& s(~PuX]xG|o^U*>2/?FŗwX$ӏ S^prhzb :H0x㡀(C_x?(~-ŕfpL<.Ǭ?WbtF:7OόS1aAop:ż`r./8_ "\(SGw`7d|RY\(*Xww/ Xhx}K^ʫ!)/Y ZEy:IT%/('/N IA xgMHsV̺VzFRg8εxA( Rŵ }Vxʹ,/ICI*Ƌ5'Y޻*6H녊YeT5${xZ;EJሪMV:cSR 㥺#JIUɺuC$U.p脫:i`fLL+`,|fnKSYU,bzGsIœ9o sCU%-5&tus[](Qa2gnΜr]b҂ZhJ(j ˰Ȝ u+.Y̰.ZaT`qY;5+,bdZ 9. KU #9MDxJ_QWd)Q0LW,\̆BVSH*cxY7fns$ׄV!' + z"c"&РzӰ`rݹ؝K1SE\*>| %ppM&Jra3.>BW̏fJk#p1ֹȊ Y#ԸN[~ jt .Wqum)/Q^Wˋl#/_QpM^42p9-!% on\\mC=FX\s5z$+:̾dyI^BDqO\B pᦼkts+.jGj\XǥR9xE+ml_]_nlz_ާXZ͇bC SR/\(5aXcTkF舣*tY[?SHH֙o4܍q4g:'seɚ'ґ^cСmІG9!#ykf(K,d,NE=OèG#l~u=YׅULXhJ+tA1Mv9Ft@N0Z;|PCrfWCQ?"Z&dMʻpJEH %hlEb4WNEVnpQe~":+r`nyvl;.k3pJ^hZ .zmtlwO[%?\Ʌ?av\zl_.&/7u`v{vĨ`vȧ /IPKX6^5NJize ~hY})21`Azŵ#&`J.W1ROr8f,S*G޽ى;H[6yInv[z]@kU Rl4q 8*.юB6 攀 Lu& ( PY;GLbD;Ə ub )%XnBT%!:zIWf%+ME*A+.nB8>DE">N  7B0tHEL̶AlzDJ*bV%hƸ7ʶ31SM5Yb9{f"T*wl|-:2$V,&$| 'TUXH3Ѷ92. (eTX.[,_ gўz)c"pb"[y}6?C̋:M1R ɖ)t [dW 9 hG@zHq̀4]&S\vD =ABd_U"  Ov/kpHKH<9mCBǵ!Ϩd FZMjyYdbP/_nr"nm.!uD:I 3BJI&}}o,&Pm@Q` [PN!T)hB6jo ']PR{[E|jM!&WvI­U_qxޅ,`h& X|8a`n@1d-6( ;믆Ѿq8?Eˋ!p['ǑI1:Tp؇8Ccݦ\(r`44uINElux}և'$6fډ 2<]BEU-CDWuke_υoj !)tٷ,[,g*MjiaSOÙ7e't=YнSwN؆X,5PǭUU`PDAX s@v8+t H|DYݮp#l{,2472f'' lBasJ` !u 8CC'%}@CvU.2#=?u_uA5";D#)[yPߠD?r0õ+!t~`bjb 4hA$cb*"9̴)#bRkqa_K䵓4e^vUUsǽ>23ykMG]FK6/o0W(p#mZ`%+#6?g^_/_$hUڣbTPzRHw2+בx| NUoLԣ$p2RRae0s[G[Bɋv؏nMڞg0c#%DFAYYnӪȝ㸒;Zɝ8)EV'Vrv;6FyZbg>_:2MDz2ړdQջ_fuWW=qD+xU/RP{vQP4+xWW07PM݅NI)oܕzz3/c poYNʡNBsQ[֫ZVUq}QpJ:o5+![+D^:~{NJ;+ b-gxKd/na %*|Mo_l-#"bUy,#;PåB֋ z"FߡUKLl$QL0Y!eV-QȾY`᳋Tu#V(VɇB 2lXcbɪt6GI=3CFWWy`XJt {fgh"2 ?ҙa^ec=T=jfxg{g51SW\wꆬ2kƺF#: ;2R"cƶWC#4̡ ^G!hum(k60CeCalJWq0DL %[0 ;y_cmK$#ljvYU%P)cp8>(cMEn:=QFor^@Zz53hF:rnzKh7 !&Y V_|W؈V Ѭo&n&<+}ccgbB%ywi*YNUGJlRnd&>:ϻYMiڻF_|p(2N$Fh4B hlHWCUhG\+|% N:5ĥꝫ-PyxV!+St)7UѮnƚU[](fg[EpVR&*RV=)")ea )S#3;]`{ƾP8Cj K*RJo BKi(Ԁ (l,,OC;P7"I:PHD9͒Ԃx6H:+%Orl"[URx#?:\mjPQ%/e e@g&Ķ?]JC1{ؑ@!{(#]A`C|joa3QܴAu$ Bj6= = @pDDb XЈ-]X7U6bO-m[`܊V,525Ҍ&!a/TA@ |, $n,ҥb7VRDw!0.ZI r!@"2Adtj ZLbt鯤"1ĸųU9&~~A1*29`=@UDZ56Ul :Hݝr_U@otB %Lz1ь"*T"KXVvЀ57U1䈀~ H6bk.J$ @ƒCF@R u@qLzQNs$F x1z$:W9 *uq 7:@`@\D Z ~M@M Zm%H*$JPe@: 6 h ml6NBIp!$e7{+/K^\OEuZ cyq%h+/nFԿN}fosTqlImUaqHE@V]|z~ ݹݏ.Z~:hlK D:`K-%&H7Ѧ~!h~h3[% l;fF1NZ ȚNE'*3zFf , {B`})([nܐxsP73 z`GC$N&A(3bF:ōZ.VG7(2SuEFAl:}4f@KFՋyPgZ˺K#Tt5,e{Bm8o.(p"! ã^K#Ueh 6i ԋam:E(fyBVOJSqWw9){ލy^սZ{M嚀/n@~HMEFDUtΪ^-7^A / H)->) N@L)gTv%w݃JJ@(&G4ե,V4 @hc[ c"/Ѿ'a+sl/#M(eJ?җRh n6/M6dJǖ%Vtb ey(Dw Nq $Dώv+KtQ_|>Jq JdtȒ- @e EK]$GL0bpc!]4T&bĎDL/d~NftzCexŗJLk\?th){5jk|V#XN,OJƸBtsGc_kb\Sj*EbboƎ)2O.XL%>vLÌ2©RIʪ)ѸE|ſFLTۈ`!$аW_b0'h"` +XBTL $:XDzINP!υiHl1t3(nee!c9R~LbI`^:b=˄?};Fyғ `=s1Tet/ɑ\x,J =NAa\lC Ji~}] b-^,YN&PUaMpUf9bFIzXP7s"뺓0RE1^( 'dE>_A!3:#ȝ Q`u _ 2#F4I>`sGdTSm(щ(R[5Ê ⵟ=[ZFXd #tbҌ$͈|3` ksI(GZbaP QBo)c:&RN` kW2Scb^cXy!c*L*=6|Y? t101Bڀd\m:=&lYi˘N !}b @[*c:4(|HeL'Ĥx:Ga҄N!I/jͩl\ \s!RR<0OŞVf뒷+b%%KZUЯvKM8Kɪ b.$f^j3D2g ȯbBjܘ(3}řbZmRO@SŬ| vN!tjl'p-qCinH L 8L4d$a {aaq ?1[<(2d}=3aD k^C۱BH*¼s89K쵨&*KΖ2, F$0n`mHW;duqŬ:]MeRՓi1C9**4j*K\: A\O 48'6ѯXEY͎pSk#zhi-yX"`GWK ~aa$R%n';D +uepqzkIء}̺ubtpHPY:+%C8D8 EzB; Qft*FHF#tqc>e2b.vdSGYy؞ o0-ԑ/(BBF9 $"TG쳤 J# -R}Y+edR::.aGUBȒCqF2LKHx&za"f);LL/&2M~¾پȂ0iPKG*L ◥L]JԢ?FM$#;YЩch*ۗ@c2,fuuDK98#;]&Ebgo &H{A-;98[I zA9ܟccT3V^4Nm \(,'D>nU5 e ZFv le`aZ~('NPYIRvhy|m$kgCbSHeu>P Lh M8_246j6N0$@h%JSb}kWV2 V72\jLt~8YFbd@0l,Ym٩-DZ1PV qFӐe)tTgf@?GB 퍬̅M12F()Ӑ5R)I[毴4ӥv>o?4|9FyjEAf(Li^ִО8E-$Q܌1'!fx,Z ^F@&T]e0y ooPaS7 ^R룹ƽ!\  [;]ΙGzoÙN,bϐ /}Ws:jSuZ`:Ҡ>*tWBoAG&^(E>Rt*thE'l. y&"9Tvβ"; c-ά2Ll#6 B9/N񑼂OJ:CM:lQxb!te Q͑N xNc ֞ ftTA#SIG~\4K*.[7?T tV|$v}*Էyjd;V1m7XŻK_,ͥl1c}j? }3.g{ { "C\N!/l~$BQ"dpݕa\`գ}ZOLe._yN*>aŅ?U=쾠;G\8/?p $ LFFG >C^B{l8kkŲѿv~2,;#߀`߁wբ/FI(m 8{q\IѰqVSaK@HOؠbѶXȼ"6ȅAU) )1 mTG{DH<9`iE, 5UID1 }EAu=R:`{{?k$EFmUYY*b$.MqxGv[߫} {uoP^\u^zuMq1Fj )JK>R"h <=]cY&LNN4eLq¡!"p94dlOáDDd[""s8"gO+D`?.O ً(6"b\H,wjeKAZڢlMm$#4CwޝB [t4ZNN-y+@,8P 'A"l!t0Ţކy0⚸"~':1(-c!@T-2Ȏ@"q _tͷKA{芩Ϭm4{~O\ 4vFIɚStj =_jhK@bƬR' (!AjWUgV}mЩ֓gVFUin i_(x@T M/WIk s7_V4du+T2 Xra@zL),PHvGD_v%;T߷e@ok4F河w$| >Ճĉp͛NIp|z8sQCf e%V6V Y}afv] {ڠ9UQoiJ~qh]leSLVCʛAJBZ;h+*U uUH94EQ% Jl烿2:RpeI(9PJDvyd~2QZ 72ѹ$uRiz4۝N)>]^4y<\:<}IB]髞Tu4~CEGE+w*yvD8EDD:"ዉr1|w]؎[VDqy1UHՎ 1 Ɗ%(NA5"Dat&.}9]"B ;NHcx}e-{?;a~(:$Aԑ$ n};['UAF{nu2Pa* Ad:%(BVDn3bV}q,,ykUB_%jҁaE!Ѩj@AQTh cJC&(ԦȶJP\(Lcf1@ֳ1M%Yy^!5A;qi:)(Lv3+ EU_caQˮUdN$Qg%jG1ZH0*r(?WPAih`^\fI@!b}"Ry%%IVJڰ[qAc+r:pFCrσ, OX#bl5m,LS'5??~٪@Ke6y*L BdM=QծX ms6Xݤ"Z+3?Xur]dB?/JS& MZЬ>, >ji|J>l >iw:g>ɏR}&tvK/R3;ye_ìS/ξ(s}F>)Yaxc2J 5Y})f/(k07r\&+Pӌyk>6Fhܘ/P>_E(c@@ɆtǵE)M“87EJ(k1^(:L"%I(9{hL2r+ i 59\n2Y(RRS_<n$+rkzzO)5S Q HEUJDPLmkVד iJ4ps!1+V&,Qv`j1mcJPc h].iZ8`U 0cF+ 2:m ژ1C*A3FVUa.>\>cl uEn@hf$[oq-Ghqtʋ6H`ֹqZ Uݬ$0RN7Y֤(q#+D?? B)R@.1JӦaȀ>ZPeϫ2Qt@Z&oYL@p}Y"E2D1q %!$,OkUA;KU 㒨D )V[cT9@NuY%3)`l.~O,QV<~nmځRFu" epB$"I`TVD$ [qDNDCYv%4vd_6jG" A,f;9HQ[5+9xmŤug98BD%!okъBDy-I J +蟚!ɈJfYYk}XAԌer^ܿnP^ņ@-gO$#FtO5BА.F"R!B\k-"7₱s G"Кj1蟑X2H*f/e Mu.~m"oM$w#;H&r"*wޑ ت9f·- Yh`ȖDߡ&/*Z+l "ZCdlAR"Y;D8*w+"NB Xӥ ln܆Q#vʊH " ߦ]  xj*C uz2U]-?_؄`%BZ"'UIxs](zSR܌A(ʍIX!x%}Q5euD `/##;# !#6ۂh j B:[@ ")4ln nZgbe L>H@kx˚|KCܣ7 AXg!b9c 85n6 z+#k+1ڑ2p,z&פQ":H0AVk9 N`褪U'*d*"sIl ݞ}K.͞Pl0([4,h7|B]4 Y#ŁuzOr p( a[@z>Ef4UEP;ɍ>6K@u)|DIQZDi1BB=S Rt)9?lBӤȑHIuTI )Rl$%2GS|EBKqXMASjD`X8q<(SG~$@R 2\#Bحq*1E:P=)fNJU#&)lNal9y&T"0MY25SV"I;ӧzgYFdi)H2'J3L L= y82 S䙣cRRz+duZ,`ATE]l'VmSaobp4)a"+,"aY%>K{f܎e'cr,e^Hrg,'4 ,-Â*ΓJXp;þ/%fgBb)s)dRגL]e3ߖ/% B!R N 4'fKREKo6/@ tn2uM}r[UUK-wuOۼc>QRSp6$[ZKY,NΩábVIRad7)ѰrV8x68@ 7_t@bTjȓ ##~T]YVskmI {6XF, ݎZ/n="b748DeLxhr17G|bMqzO$5 bé%UnGaRg[AX6 cS8:Fi Ɔ02o*MSy$`nM= ZЩ$(oCɺIP[EM?ȃ2͔dJA`*5mAIRH 7LKlAI]nRRr6.ArǦ%[sXA~m3A,b5$ҩdI\pd2*A-U]t"Jbu<9-M=|7JY>K>x7б2)eW56,y43S҉)LP2@)͌Ҁ5)Ѷ|<ýXW Ƈ$)qcKak C@?qu{F]까߂o5޿A+6V=_狐`Re@vd諞/G+t>SuJlؕԴVk_?KaʀMJxy ^1Rz *k*ɻ04+c3;e4A#c-00>d4@c䂒hT< b4w'Ј6QS_,HĻSCQ#:e\<A`K+#kFS_sl\AP 4:RgWL7BQ0]S6E1BQ!TicF)d\f\@Hߠ(o |AlastUY+RfÖ9E9GfhV{z9Ls(݊Dz}!fL=8Uavl$gTZ2+^,sU7b;|iE2I2 )k`Fh2] 4)pQAe+fexz\6xg hv3JBdleJZ#%2=C֦{Bm.z(Ze\e ֹC v$\:׶P{PWdexZ\KyUOd\'.2H5X\9ʸNj?ج؆k̟o/ٱpH GfV| 5˸N&٧YSt>uzllkgDSK\ .ͶЖh>6rmh70o&Ÿ!d Jaӹ}oD$8"D$.ȖD[dD-Itڷ#:ȡ2"z#J+9 h=LTDD>MkuFAVSj-D+#p,&* s}M0f"DHOGR%_=1D 0E"dDo9IFzGdCP= ӗ1/YT|^st$c:,Ȍm u)+d;̟^TGXl&eqҗSPպYMI#xr[6+d32CY3AjCFXg垪X="r)|qC+esH_#acfMطʓ)/ Yђ)|9ԙ-}u يJ?PϩaC@UoA=xEAF6+I !!Lš`pKP`>I`RV_i$t0EF idbҠ@5 Q#ZK%|4R.vAB"jz#- 0#ı5P~YR,Y`|(hjj)S$IBhȂd2TN+}T@}x#NS $^(45As(AM=*gTb[~TEZo^HЬ`ۧT7'M޴{w]0ǻrRi{pˮ71y'*c:3ٌn;*Ռ0UNxLPgySƔ1% ~_F ikVfӉlS 8OS+1HZ,YWKm'm4Z32j1@ L ),MMzІ_zD1xgI\6'}%JcI2/Ƅi8Ҏ\Sx)PSYN7i) Os׈M }L;UaoMՄ^I$a"7 IkLHh<& KJ BK ZR!f$Y6 bxe)+` ִ߭ϻWMI\lQNb֜#V V^$l.UX L19Lhp`(c:ۨξ>auixkL$y",hƘ +p$V$X0zzRJS=j#(Ρ-u F$[wIp/JJ+wR:yz5H<_OXy_plj&AGu߉!}Vtm>`2X$2G5 9)g x*tQÁu:" N? "$D.f1p o@6"9ZMw=J lh%Í([42',eS+Uх5Q 2`u^% 1U4` 5G])8h4N4`Ӫ: )"d"H&r0=%d7O IB>2{ZF#"M":2)BF"\'" Z ‡݁"Z N /YZ !u0O qg ¥`mh, #~X7ۊG4ZK$e<-#ZđM_BFtH]LjO32bJ$T%efك%`%#\=[EE mV{*eAzY3L$qDJdC"(Զ^ZezK;>[\ b?d{#Ya"-JdLo5U6&02J F_d V~cš|*@@\'@e3L7hZ4h|? k:sNboH7&?r S0h)@VW%VQ5-cQT+$JC1 YSRLa# ޢB @}SȘݫA\! ܛ*8spp-\f"5.침"M.!E\/>F.hcR!>ir!E2$s9Mk~|}o_ &xof3~沞MG;2殬i:pA~M O d*gJʳ|;[T5s)P ?B f@&ժ@&/ᝏ\B@->5ߤ~{+T@wXUeMZ.1h姀Cjkq5DDPiv"Z8DI5f]|.qly<MF|!lJ%ֺX!N![VaAa>lD#4jk0+F4!5M(tXI#iF#`Y\*RD^1oFcu*z%U: 55 Kd4&+ZLc}^"$N~O4zNŕz:Bj8Afwz(,|XMRs<4 /.XPAww]\gg;IBCp48h 4v3wi &:7NR%+*FCEIߦ[=ց R/۹߭[IE;ivVNS0.š,b=B < YPBXPE( }) ,[Gѡڂ̂¦/͂W,B%GP2*`9baCecT, :\fQb {QYսaIqh_DZɆ q]n/Yc\P/.RPl`R?ʾ$BSSuJV ߃w 49$"tR ك -X0A+(YpdzאBBΔ- f,\4 3i[Lu<9m[MM@ W[qTg:N!C,TAGCDHV,F6:EiWfUr@u.QhUPS*ڑblX$j.^WEJh.vVDbӭW#PtQmz+Tb8DpTZpUXkB9AB>M'9's>] - wNNb!Z J@,(-HlbHi1(<CӠb1H+ *+m1$Z PX*l5Љ5Ebzǯ otTwPa5k5&D:v=[ d0q7BDT2t*8&ˆWO`Y ذ];>c,ڢ#u-ֶ5 QGl-2jz3vЄh/(Hv BP=Gh)9FlC3 OՠjY6"ŐW])g4MF󻠡Fh!'IDrĪSRsџZCL:qhBDjZy H?BVhWԆ93m/9r+4*Ԡ C gSjᷜ)V/5QX9:BtR$2[ru>6ߌwG֪l\zF|#Q}<[DӴ5(l oīkmM5%Z!D]FK8%vQhBG٪I\DcSR"c] Xݩ; #bm%E?<툰KaSRR~/u"jlrІKU {4ݵW##;EPɄ)D tz2lb% kCF[dUHZhuB+}+Ay\+$e` ݾn_`mDOMuQ0VLju@)U,kIsf wTKcEWHf*aҵʶI(} hS~Ur*9іzłP%v*ZՉ)C?2.ST"R Cwh*I :d\VY8 }-24h[#DoQJa sD2Ffn.5҃z]G0q<4zR4j=F׋ BΐYʾdURU綠!DLL?ưqk)vvl@@"h_`Xykwj%APz@ #eEJ1I=Jr]!kbO`ׄ2,'1K,;HG~sw.t0ûPF1kT3)3:Q* G^bgF~w(#`ϊYX Sf$sp!JTZ1l9bll8uZ'"#ClN3hы@01\8躿)Y>v*;IY%!>g)&!šp6l^Iڐ7RˣdQkl;(Bʔd^M <8S, Ery;Ԧʔ2!(%YC)(5Kze VbZ(qDiJTPۚH a1%dP8xZoYQLt4( Bu5%ÞR)eJ?#$hrt:JllB8^~.%>%pC ))GdGYX@˅T(/,NI4uշJPt:jv*O3SV•Pqr_e2L[)}cJ?Wzk<ƙ骀:<9Be餔=e]_A26;jQ<m\!y<pϫmա7Ymq ^ڈHs^@cΉP) *>:cJ@b 7b%FoD!(s(Sʔ~iJ((;*S~;SR]:%ud5fрW=CYNi6+L L#;*S:-%VMo)S:]BN!Jm) ckfk&LJgҖ2dY:&#qY ))J!NhIDiJX]H(1PbQ)(WEF{o&oaqnBPNE<Қ14~5J(!C9}ŴDC:-n7(p|(ePsp VP BbXXg V !iZ )`GnP Lzu0G(JDm6&W@JmPNK(/-%cʸ43ώg^sv71;0{8N方enCEp_4Iƥ(*7UP )gKi4yXW 1b#:zgj6ݱu*g$aZM{DF.y .3JP fNj.-A T,BO6U,-@}J ;8̨kdTwkψ$39t,-Ῑɧ. ԡVwLP0L$$D\KGjLgj5|CÐPNAqM5oaORP> 9&dUI0Z1)B<LgI&Re]EIJj)Ū'rr%K]Vj`fd&jt)|f &o y8~q<]PF " Һ=p}3kteI2̸2GJђҕqe\xWgjhZ`S˸U\H\Q,:˸~#&ĠK Jdcb0 a̩h1ǂ=:voՄS*P-dԲJ[Za/b櫸MJ+f"$h#,}+04uaIWaVFY0P_+0eiXf`CfS&egb y[ d֒G,^#YNE&Y^,NdlB!4X7 C Yڰ?C`P^Ȕ`;R֞ew\A̔m˰ ՟MrZ',O#a)TxĽWCՋ:!Y ~da{OZޠ!Ba}nH 0YA]1VYfAL139>I4FJL<[Va 5}< &[0٨Qj%Ku3I$"1˥fX_%XCB2|$g0Nu T_BYf,Y_ K/w&D2YQldw0J/*0: GT,*7+| װKgDqw `d &+4:z[z) KjM"b*9.Z7MӶߣ5d̀eF8XˌX\|9`GPXŠJˌvHKUXm`n]jjq瀅."njP1 I%p%If, Ҷ (pp U!gG N,*0n d8,r]3@_#96** GLYf$ 58a7!`]|J~[͏H D8%H_VMUe1".K!9ٶؿ&9кƋ{:5Ab)YD8P{[q%'m($8t渵gZhomMXPc**e Ȗ,|nf C4Jdun4ؒhwBjcQ5 IRa1E]Q2x \ 9+8bW;%& C{5f^—GPGD W ?3/Ӈ(PyQTO?ϲ0QzϥK"i"μָP [\Gk!`˼&A`~=ԟ4/CC\\vu/EM^xּatc/Abr-Uh=ՀCB@?yJ/F(_7K`KE%/cE|Q?[`I|P^dxيutԘ6lWےMאڝa*eo8,a$:>#q)#;*:*&˦ 3R)q\RceG15S*P :G/BשI:5ZG-4_/>HlzɰDmRf]F @K]C9O6b^ΐBZEWlGrz ޠEA**"5d5 Ը`t8g۝|%Sj)vBԐ5dl;ב4K2OuG#dO3Z8֕@Ra#'?T-v_j Kkz_ђFM!AUl#1͛k~dSӅCK>?MNN-;СQ'ىc̃-&JjҩavdQv&١ֻ[KGmEݶfCN# {"*ad/8v8de GHqudD_JL,nJP "?B 4҄6 /;P:dt"Tt kɘ-XXJr8z3/A>ƱAY텣6ÒԊItYW= )?g%>pU+޿g'My#S.ޔl(p SN+r.MTMyC{R:5p[2&ztXik4R4pSVa# "tb-z8f>rձmNk;, #^Uqt?RVdA%@RכrʊC*#4C8* uK6 j\F:xtwL~QJm .j|/ܘa|Vp '+0 ײeQjCq$:+|)%˥#*ͬN*`z4oEU{C/C*cթ jYgm8gV~^ի"Io>=|VND#<[(+J=d*%&Dm`XI)E3w[ o2- aT07c~Fsb.,c2BDG*tv UG4ThgE ݓae[RS Y tƯvqhE|*?mͩ,8< F*DR#16p }* k't4]昴&#KWͮZQgBz4+YdeqpB M)'>KW %~; 8&M[Q=mIgAM|98 G&k-5+񦴘GBsTYoZ'd4'@PW{HVr;&d6hL#fltC=3Z3qFsBjV'gt ,5O=h݀S)4+!vWLMn!Ҙ՚wVQSv7hZjC uY6,u`vN 'h(ăv=B349.(ھk,sنvN\,mPNBI+h|_ERl31V֌M QׅRׅںΒoIRTDdEM[f3ZSЀϸJM% B-4u)54S@ ktR fj_ rׂP-T%%k jgOLR3} ɦ! R!e ֮(zEw=f^BE4y1aK ecBZ%0ᲶrDm'kIof5p}%dPJƻQhP,k]և>$_FZ3]sPpPeX%@̕NMDj1ɪK-*j%H"}[46bC?EՇ %?C^)!궰8XɴN򱞚t66luUYZ5mT3t]\JLg00\zwM,JL~vv@9:]Ij7∳8n@;* *olӧhϊ 5-N c"6EJ@>"j N0v&q4:١izzI:&jŐ,`*̏G?@_Z?^vv"Y;tZyC_=V5 I#̤jej_O"\lUYL픲 -b l1JX"vrpݴ}dj>(B ]FTΚz/nڛ_k,S"hbI:2 Y @T5fʼNEq6Ì%kq=5#+jVkTa5ύ'R"V ~{:쌃k5߫3%H]t1:LU)ꌰ`*Bft,Ff&B ڻџrE12EFJF\1FtYK'#c7 , D0\yed~:*0V鈂;L{ZG!Fe}dM(FjJ,/Z8!HXcTD2ID"zj10A8ԨĠ֪A\kaPa=|Poo!"5+||qq%']j&7KǧIG@h+VZ8Nm6mGٔ58NY ,g+{V'T/FtD:ʼȧKG@#TqqM8SwEf SGT] ^-phr W7ϪH+_`鐯Y+ tVdO(?ͳc&p,_C^O=;-`6q}mX*(ԛVVV_^q2vN*Ԛ`HC%(d8K{q,NASC7esa4/{N*8,ħ݂ {ZT:JAlM)qhP2,͓a%te ^Qfz=c}1}(絍-oEtK ׉E N&u()?9Q? q^G ԉH _X4e,us'eHHsGH)nI11 )c0FAl2F0F_*zö+TpAX^Dw8vr)&nufD.zp8Cnrx8 uÝuըZѨF; R尅Q fK8Ng;!2Vj%dsSmwYrF_83 I{\F .-pAY7BĪُџQx,~H!(oFqUPc`K#QhUFb#RUL=+ "9= SA:@ )*xf7-A@\U",A( F+Z+\b`RD5FU!)ğ)>&b PF;IDz1QD]"tP| V Q1G}:Zx mj nj"⃣KR GF"@`)e,?X"~jY2rGkD8פ I(K'k_X@P9 @PD8'ATf}U/ղWn,Jj$/]jJ 4q[LIu^Sy &(LFe_o# դcO!U"I xO"B@T mMq_,Gn.OA)˻JD1bz8F=@j6B>Yu hǤE@P(unC Bv:ipG@fֹUu%T"8 "l! @"b DЖ XS;JHqP CL0 9Pwj N"mY]5,&@ؔDr̤Tҏ[_M6ٷ*RPV+gcenN67 !{MB(>w@쾦Sf=Ł]]"/CiLbY'דԬE\tՄezUI1 *! *6寕sDe/>ds[ (F[ID@"B8DЁA[JX澊֗p5)=Э%␶j 5o5{HJvj!Dj x=fu Y6JAAfTR xDpk ):F}WB|hJl+ܭ)AQ13W=y:P>H !k7ZưgDjVPwQbERزzѠ[y3pOQoCpT pKt\cN Eq܆~+yRm 388Z:Y  Vވ﹎K w'TEbsڄ>& væSlZ fDΚ\*𣠥qb"áZ\ln`ng~S!nQ&iszܷ^R%hD#XxdWPZI\E5X.NౠW^4^fy6RAzLPC'lRd3]z;.x!f:@k%U%G5%W8YR)"i*S\Ur` u 1gqR2:QQ$4,GRU}0VI@:?C5g)3/ R RYS k2Uu~T-F#|L + jJG@@Vq|H2RIYY)sFV5#PZ=gJ(4Ϝ,yYS:fRc<q;pҔ6v)L)e= ZBq.|+%u*)Mt8] z3Ȳ)eJk|<~cb?UeJ[%[vb$9ZT)zqB+NYUFn~'JY33P:˔3,K?R@)N~$%E)eOGPDe)SY$8Ӝ?=bn3RQG㪐dJ's,k1dꔊV(ў;Z*^"%ZQ"P҃VѥRĘ"Ҏ|U6jP%F nP6Q vuW z '(mcbBtV۞`R °<]+FI4`~N4%M 3 +* )-iU iZBz+ q fn5^wțV|] 뤮(FJr ݥlwNvP1]!{]:4mO'aBY $H;';;lpt-ٖꪢEJS4g:+:w $ nh59w 9T݈8A'g%lZkbt~/aS,!M_S(Mާߦ?^6;W̝?]aNƦRxw8m"*y+L-58?ۂ>rȺ S*Dw3mGGv_kI#L۔~j>R+ Qxkx WyanySovNxWOC~ӇzO$+@`@zOŽa 7jJ#>Z(Y]dU_D_Mah|fC ]o"w]r |V]Sjy5#&T ٳ&LbY ҉3+ot&MbVrVrGϘ;[ b\Gre7x[x_#ۊ<;FIEjt2qkqd:ξvGĀCӭ վ4q9:CU>t$AԯfeBuy%n 2 3 y&2 B^:#˶׽fZy*Y+.Ód.\$ZߵV} >Q+={B\2TY*uV\ 4FY=.dT4uCa עj̒.}jGB ؟&A 4=c٣jm$) Z4K5M >!vN" D"5jr)bB+M% TEw(BTi"I"*sdtT$#\ [*<*5zI/`,?.!ENʹi1DVv`yմ6J^5Um͙# fU@ 5vcc{"R-A^l6傹8/  />"(8h`|^@v·21V:J?k 9abPAuy VƮ 9ճ| y^cbjE $ni"8NbYB *`Q<t2L:FStd-|fcg)ߤC&`tQ/*i!LG:چv Ԕk[*|{2tP腘ͪ,PQ *Bel14ІbaP!)gU!)gLun.K f?6mm !B}vȋ벀d|2x%  6k& 2/K 2v(ij$nW$RK3 [4)F=/0blZ2/_Cm4q1ٛ|^E+^xQW'yъoElFҠ^Ě@sbFXy|e^ J45`jJȼ>WU&xaI:@23C YN!_LʔZPŨT؜|ld7 j;F9!*mP6vh4-W$6d1x ji9N+ZдYl֎jx1p #y@d7C\mFÁy}vNn!XFv2O\'LD\WdU A*#jd,~!A!#J;f- wEwqLȪXz"f (ѐҐU=QR'K[iz"iz"'Z#DlLudE#Kfm5WHGO$eeE[|~pR|ȌF JcI# V Ź$KQ,RFM*M%E8S8(#׎P.u8 o0]:<')jF0-5Td !a]>V#tUq4W.PZ/BBc0@5ΰE:֪t8`h=v8BGլJ:8WV֖ Tݤt ]mW4XTK@ Z: "%p@ѕVJ8a;4\#b7jCTvpGH"LV̭ZyA\k;@d c'~H:ƂC骁KPӗ> 'Yd T*,1tjԺ3(APhau,dMH&gޠT#ppLß4Y”tdKFV"S7,zC+qewJPQYʾ b U&\3ՋoМ0Ȏb4ҤI;kk~[@[ #8kvidﮉ?\u׬$v隐NqN&P#*A+Ϯ:}P%m d-"{3@E=:qo97ˎT`b/2CUgt: 4e'm0* F;7+p B|,T@pX Xh wj 0Ť o^ߠ{-&\ABAP"`d\b}.TApO$,!辰Sol0`!aSNbT蚰(?}e۷hZE |jÌF yXCҢlLꀸT%K咥 bm:Ҵ=\޺/ho@VDj1b{{XC0/{JP*J?c&hWCJFl9fYtKp5XPTC.mDg QX:V-g1d]{˙&-1d*henĒַ!88H>XjVt"Qgh3Ufx#PeTWɈ("U=eOv@ x"8jDTzFrdIE^B1Qh/9ʌb='XxaYso]zu ! Y_m+3:wLYuXK);ՎNV5YAl41BvbJ%}LCLg8 +0Q Е*5XE#xJlve} ?K Fј+وvM>{Qp#4 eXN>&?T'_c&w|my<:ėoL>Gy XxjUC찵5njJǒXhkVٚ=V>ʧW>V۫3GC6i%v&b|} 48.6|-1{R)\vUk #]-[f/-*X7c`q+~.1Vvfi>XO&[X&~ X_BKMbyVu"B(7]Z^ӁԷڥ @H$vjhUĚLN.Ğ&1c6bubr"&k'?#.F ^'VĂĹ{G@whyH G3bJLJ;4dY2=M#vb(P?PZcp̱XAܐ15by+Co4=S6qPYZC$B͆Qԏxab&#-F0*XJb'nW{`a,يFUjY}UKHJ잲Cmn'?}7Fz*O(TpK zHlDU03:r1U I5-\?ѷuh;x2a%=}?9% j; #TA"Wʑ|}u." Qc;=*`mVLL u{: 5VgdFQȌNoWIFr$kI'z PCKU&Ihهղw Fr# L~Hbne} (J';`=0+EƗ1!RVvʘN)`JnPsֆKML:?+L!c:4Y+>vڻL1k.a05[^komA0qrcbJYAB_ <#+=5も@CDPKpANqna,'ZpAa^˅?"\P)Mt`HnL.wr 6ZPtO(`inU/?@ I72kd57#a LF lhd&u TdZ\[`+_!>B< 2\2cc2F؋&BLt&Sq &9oB4(PAeSCcK^agro{>6`1|lakC ⦏]djvBV0 ϨI܍z1(MbڶM`69 ]:B:WoLXA3R0b=}:g7SeG^t)9m86ð=Rft Nrnic}0_Z9ڋhjCX*CRQX~hޞWafja)tt4UM56؆ 5,huɸH2z 1gGVՄ=j Rj$M&DX2S 8v%})%nPBHQIIn}-oIf=Tel4 .I M5FPI*1LPʲ(e[\;}E7dF$E.:)IjT6R(pzBT($& @;J!cdu`ʆ:%ZK)d螸 RRßeJߒ$e &bQbP uJhiRub]v"%ĩQW>̅-Rx9J哴9$(9A5bVIoMG4^kM'.i*Kv*KRWdD٥L)SZC}vi %YK#JY'u> vL&q>>Bd)Zs>o$%,1\^-LɢZ4ĒkVFIe)xY,uZt;J)?]ݍqR:͔>%+*GȶfY:ļC3G_w QKnʜ^v Yb,eJJ)ҏ!v)]m:]SSHlY&4^Dn)S 3{1-,vo1uM:x߱l%A,W7cP%>[孔^ qw*)Vqqp DqБpp8˵Ol%jD&m+;iM0O]Pd4۶s<7%^t ԄgmޚDy>{zkni γp!s%*rePG}P4\eG!I="TOW䏝a 7qq[@ƚaUj88q5qhw_Y!:RǁP~9H ҊlbqFa(͎'qX.#+u(r8/_G؄!RMo!I(ۗiu"&pʊ5L9*BJd(im0%-FUj'#A㳒1-jP0Bv\-!bvl%4ev#c/)̲NmgՋNֱ;,dTUE)J ,w_/wV3; Pk/5f]5QTDv*qhɄ : PC=Q]tGQg.DOPN) %ȌcHMWo# _|!#(2 )O6@cHDYL #+1[Ag>?~lَ/Ds1_x6X jE24 W/黄nB9<5QF2p`JͦXAȶ ~3O=؂_[5\@"efy,b~d.+NqZVxא2˄h:qMB8_%l[d!"qzج?2X!ld3tb͜e);bz(lod !NL9ʶMB[x>yZK!#Jf,e'ך0JejOJc3^l#ݚ~_,*ed'@e"kNŘG-hy&[zA*RMZX ^Z/0;YPtXaeX'l`&7XV0k8 SʖoI-ԧbLٽ-:֪Ak.b9lbEæ%hr0X=Nl6UbO ɼP68 /RA,GcN"},!YRH,K>:֢*U+$9NqYGNt(ҡOC[ӑ$6 {1TLZy,9L1U4Ck7"J/#ɝ܋`'K:͐AyA@'ݢ]qrtAgP1CMX70k(#dvPE X\E%,J 5XSYE5XT&m`)!Գ 4a0XX3%,nHtJEBkჳ^[6䀭iRIvF <$"YCjA&YsV!Y,NIU$jznn} D tE ?v;"J6G A;6Eu#3m^pHqHB\8Do+p1kv uW>)4pW >&.WlE&ќEv9 C-p^t ]!P%K%">oHZJWqwlN1GGgݎ-6_N b J6;Bbǖ1[ز…c*fb3$Zf$IUɚyRPɼ+?"FT5 $&x* %@2T8 ר#H926` 8.s=tơDt">l*Ǿ&cOT=kf~>j\mؾ q ڒ U4ކK:PKS}>\d.Es\8r%s.zDɷٶ\PY9nĶD-?8p(ev`"GRX[k v06 VB 7NjA)tAe`/kKR ?/C.|ގK'cBrl돕=`\…J./5qecc|3Ʌr3뉃R(biZ{ugҶ3Gz=lAEw+):"JOfOVlk'8cOW]CQh[C$lODuDĈJh`dե(f]ܭRLdo„1DX%2"u"^w)2PZ1LN;Ht"Dc"jЫZKݒHDIDDOq:cΩpۑ۝H}dZ;0[.#˰ G'˗9X[~tX9`&DѼF5Xz,˲JoֲɃL-}1lfo?%evt}I~JhQa +^.)cʘ`bP_ ݦ3c:&<U37~aDXMgL'Qz޹iL;*vvd!ksp2 X*1{=mbUztD8C5Gy9VGz'>{׻w#!tH$HNh:@k"tfk6~(_2at1J"Jw{ӡ&P6Qotc:ن;yp̻gν?_vh١eBGSUo4<SMR^EBv8ړXODtxEtt&:GG5u? t0I):|R:YvtVm!j蘨mK+cSsS 9SgJ5РSsWv'SB$jMmbҡKÍ\$4C#WP l:V HG]|]EɊN͚ʀOFOonXֵ :q1e:ߑNF ƿ=t~gǒ|k|͖ѣEˡV/RNBvxgesr*G ;F1aKUj붤#1t Hdri z zSfA? Ջ xKЮ{i B8N!4ёѯ]=`.*3fKkUxi6iб I%T3Q݁N71knLR5tYE9duvX*d97`_(;)GAv#L&`H?F5{yG2)5,&[JJ.V"Dyxu,UBM)-BېItXC6#d"Po]dVHp,г\΢*ևrjr! %z\J`,RTFNkgAΦ;0$zήc  )Y΂;N%2G5tRM[AIFлK e \+C9-LNb^bkk`AikYhμ ښ7XHTܳE!lB,P3kXoWjV0ً5,BQ|\:of,|Vߌ 'E ifI3a;Ŋ8Fвo:h" ,~}[Qi6GQՏESG{Bda:J} >P 3RɸFtF?*X-ˢFS^ y ̓ܜ\pJb~ӧUZWzygBQ. T>nP/P< \8GjLNyw!ډ5=PhJz"@ӠC b6X^Q jDP_\1"V];6qA)c( U\X9RTЛ2*)Ro* j4F!5NjeJP*թW"x::\ʠјO/¬gP'bhd1DؓY߃%!0DZ- 2#IT8qGAԧQS, _@9sUsFUߑ>̛7c3`3vl-:"(hM dCujҚ YIr|"TLPʹ >]EPLb^%(mF"Y//4Cǫjn7n!՛9A@bZ(=\X\[v pmTYκ~J_tu.2ML!*'\yr+f>PIT+ILu{G1H,3KRP)o"ރr̹ɓFIU,_q OG4즮HNB@ݑ#Rv9qa~lY D!UFdF?B8c]'8@a`f PFd2 M#J IY 4R󴑅Szh+(l6] Y()A+sYoy;  h%IP,A6)%rѕQJP P(I5: *c) }g)APt ? Nrِ  ҤTSPHR뢫Z簪hǛ*$-V DAEgسLF$>VKu %>KPhH$U\)Aa[  ^%'8JPiԆq)Az- u KU$J< }IjrV*,$̕}G,.W Xٞ -{8l*K:aGAT鷔4A6KI9Z q&3&CϭEVPcPKm8֪Ԅp]jRjMWJjj LcF@Vb7z47E 8\;t< KKa r& 2Xeӗe.ߒK%sIs"D'qYul44J+.٢6r WPKI^xͅwrѠqE\ȅq9Ÿ[rp%s\N%d.;|K|Oy1~;.0ob3EzLv\ϙ˞\2o^z++.PΨv >o) ٴ5%z`mpPpK%?{r͒yb{ꢺHTWt)? 4wq1m7̸DSдƢ7?@c]2VfFfFνw|:N̝uV↹Ğq\=.*%V .}"eK,/\e5.m_:yT/js(s):)ƾ~pq)k+Bxrʅk9Kls.\ /.r\"l \\%l=b2,xr(X|^œC/Sn8~?l1LaH*7\Wi>-Ѝ\b!5U^:H]Ǔד%/~=y_ u\i\<v(}K/-.n*_}1߶/co&ʤ;\݁r摣ǜ:Egy!lTؗR#K.ypmr9Dp$K 4\F@^\6 K'n_a" Y7kpwpٖ݇lMre\ /2Ń&X^|oA.[y .p9D\zJ'ޤlK\u~?le9-s`y=F ǎm[qyy\e\ .7\ /r>.7\.P^n$ˑ_ q /㲢I.py\._S~mA^<zl\BiBX.y\6),yb#\Rʥ~\r 3 sQ[a=!oK].M6L<@ξj=Z8QÅ)Np!v. \6M.M4v?t/AȻ\vKc[\OrX3v?v~+%^: lۓ7~]eAJ\|{\b]WzÅC־!mq=i%}W/ͺ2پ/1.|e_ڗPMsMc![z%-0e?Kq00pLca\^\\\/abw_v/Nbο(q[[U%/r\.^z?ͥ\Bh^p)pqKZ=ǸL .a|esq&>_)\.f-.O)>.7R 0p9\ /%^}qyyC\e?Mr.K\7\ 6\;?_ /rez\7d_bKv5ME:.co[^ KK!.\6A.5V'{W\ҝX.4q F^\,r%.|:PySrSfEezbD.p9/A_Ϳ9pK_ωSp ].`ߏ `G^s̋KKK^ph䅿zRlLeWsF5unPJvl2X'pqksqK\H(/% rfp9r%⏕ڗd('_}|.]$v?߿!.X '`ckͥ\eR^?z߇U/nz$/~v?̖!?YaB^zv'>Pxn.I^.c2 q.,&>6%.'hPm.[(Xːj_HWcV})ab_!sqJyYq .I.ck+D2/ue[AQMsJyM.p%&lK^[ҭqlS^d-$/I.ypp .-.pQ,U+/=|yIt7rT8%r5\N"/%%ݒJ;\ߊ ).%.1r\DxR?Z%TbHnqp.KŅmr 0.&p$s zşU_Ζ 1p.7Ņ.I.cRńKqڝ\RRôV9~xyD sz.n3.c0+ɋ'0CbayK]@^6//[y~.|Er ss9\Łysqd7'16 l)ߟlU-!/2S^/F\|Kmr'oI^n /'r=I./rY\ne\ /Fd0WZlU^čri=vl۾\`f@^. l \eE.\6%ƸrzLƸ@^\6Zo@^:Oh.cr I.p:p.#/\ǰ~.I.%+%]%htOK_ h؟cn{{b;K2UprYS^e\ڹu.u/K8zMK`.>L_e/?(/%TٗЕ:B=BT!.p`bH\_rI^Kc6p 􍮼P׽0%\ v?s!ǩkK'.5~24\Fp rD.p08p9.岺 =.z<\W /m=ve3\e\ް`җ~Er4_I _I a,njj.h<9sK3|b5pp2~qiFû˥c_|Ѿ."sپƾ4SwZ% /m_h݅/cW8K8ŜŢLKV ,ˋ3e:_ȋKbK^~@^z\J]6 A23q ̷0T v?ueL$[~vp8kcvOն1߮S zխ:XO[0pa\\V2w?r)%v\{q˺z~+_zq+;\V^WJ%:#cq_iĵ0XhqᏙ8a,z,Opy3\k_Bˈ7}re(O[B\Y\fRAr)\ /.r\о_iy rrz-/7 z \\.˪v?u}c.7⤐$ġ*y1?ZJ\"COyR̋X. /Abq Ÿ@(n^Lb{]..s[-_jr qY[ojSo-.%^'\ .~K(qqϽvsE.s=bS}wa1ecCr쪸3qK\B>űv'%.ũ. ЩS".A5' z̍zKW'dlKve\z60/.~)?%}X%}99y)ņ\Vcr2y}A!/+/rr\ 7l_ /(/}.?sey)-]eܲ(/.qc(/X,j<zqC111c /+/'qsEU%^] az?Llqq%.LU֏^G;z".\6$/.72Kl >@^6xr.K8Mr46@^V /x<ٙ8q|K(rq-.jGhzbU)hP0?rT8!)ˋkKKBk{ qT^ˋ+ LKr|eW^\pKh#G[jpMrs Mr\&p$܀&@^JDp$# ʿ^࢏Ev^Qy S\| x+>HHirq&\y1%M:߲%4\)p<.$m6%h^lKqXO^N]\kr)j% BlK M͍Qy 'B϶_#˗r\о\\!}_. -rR=F7<"/DY=gzzzXpz\ \ǮK\ KZZ^\ qq. .ʋ_X?V+ۗu2=_Zoڗ_zY.#/3w□DžJ}sC\bÅ?4 cttOyU/#{ݿMr\!.yY @lqKϥt].#6?*.'cA?.z-xE.<\c%.Vut/q)_F%RǶ\FtKyzwK\~1/敋q)}p) ˩þx ɋWXWx2)yYѾA^K@^"Be3e}c׺l%@^ //g}Kfqp 5\z[ҫ!ywnǾ%.DS7N{KQ/uuaR^w}.n<ø7ȅE.@^6%c9}\Vek\_.7\c=1.۰/7I.p \\R.^8|.o(rY ˖Aymr,==yb.׾MrysDydؗ\ r%5=v= /J\h؆[gA\W.иwƸi]sIa-[\i;\B[^\+$.\=}:XcZzqsI[%\}\/tS-LOz,D?*/E=Xc E=p,1s =~/2c U\ľ W!sayq.e=ֵ.}r\xNrqe:\ܥ~/!sK_^yO'_P.c.r\`_`r.U=-./­Vm4yA. \6e5.I.}yq\6%4zcqm.N LRK\vDž8s"]%&~ =BydYj!0&;߱KF.үpbK/qؾtB~k_šo4҉}eKTױeyssl K/Uqݨ}cXt%T_:0~%/^W^ ;'p=vzْÅ}i\ǶM.myz\jc==6+Et!KhrP&T e\ް%Z0&lI^c,\n6i_evb8W2 \!7eᏵvv;}պ;WS=OoMqOlӔp\'=uO#b4QJ`}Sx‡uN!98aY .&".\l-@ :8?N6hJڊЩ" YДm %%BiYR (VxXh j4Fk dk1^b,ucqN*#AI_lx pxRW%R':F< x]R|rҰG%E^)C}c^0QjztلP0g:3U!Ln=YW]lP:'xߜŶ9[,,YֵJ֏Wt K|E卯Wd_1 /f윋_S4>=y$HB=Kmիg\ WL_b_}E, h0,7߫\?p9F.B+X܂z\&8@^%/eohe \ /f_>@ ǫ)|9.th:tVS#)]C&Jt<Wk_v ٰH":? #+ :UXitB :LYv'"MEt|NT:6&UXy:g:7>.p[.ۀ!\&x&/Ro \#:*W\˴8rWKh{e)T;Mz˞[vr8D _X՜ Y=8ӨJ~7%RƻBK9H-z-|%m(`/IO;Kgr r2 I _b}^rֈ@B(  ^?[R[Gߨ_=Qaoi:+)}uu@H?[P893&v&0' Jm)a8&f!؈tQ`Viy8ЃY!"l/Oh}"8rڗGR&2}Ch}\uy`yJrGi_?cy翩t@t@t@EM Бx?\:mf2_3[x^/a ^4O4}ǃGWzxȇ$rɾj?c0PG]~f󍗛\:F1՚(^kүx /0/B"N'v:ڿ*_*LgFZ()ckyuG/=~⟒hn'r\Wzܹ,w'w#wDer]4?/Dӏ%wyC:WX뷬 &/x/5._Кo:~o|ι8'Uqvg%+B"{9‹Fq WzLuP^ɜP^q ;t[ecGKi ;N*e+١켶,I"i #A֏ s"sa02#1p7y%Ȃ3KqP7^@t4{hBCwoy#k~\Rv dZ#dWRr3:B}QD s7#22rx UȲ1,V s3Y7i@@96z"M(㩯ܲ?sNs%@7+r?Lkf.Z; hZ4iQD & 1 `#bXWb5gnVٲ¤[Ez4շ!w4ʦʦ B7kODWr5ZFi޼  IL-6(!t]e@'TI=J| rAPW6i[[fpW-/ Hw8Dq3tUPң*m@Nq[K<9@ܴ 4Ա(S'F>$gp1Qb~-zW0:\@nAM2 mQYf0#ys0:kd rtFщ-{|m: W3LAI,.P& eFxg7b zbG^u~<4FB4nW PG~fkg7UFEG~tYk$eRjMJʞtxcR&%yfvG~j ‘*դH]ˤ6n##8R$]%Mt-5#/p BE=W)X_W)VQUXZ-wt Պy}mcƈlk`^#=(:)3R7;Rh#vG8N踋S'9:l}6":h[~!ЉtR5>W`S *hrOIu9.BpN²ecOtme5 X![I՜P{8zsu%xqev02 8P٨gJmǒ/H̎U.;p85"b5/{Q w."ꋰeV)#eV_^w#v\Ay,exhYQ [$hrF#0] dܙ# ?TrX(r0?At#W蔕@1d2H [׼˖ť@:&22 2 2 2 2 2 7l`@A1^Ux!)2 Ȁ JC Ȁ 6O!-dn1 C\$2WIqu_C-[rJRC^_ 4TըJwn /QEjQ~5A}ot1'nS1FDs A0սtb7A/ /oח7Ћ-x}yCB<xǃ=JǃNN{:gSt);rנ:ӢS㵝$, S6Z0.nc\jd\ /Rea\xsqe[vEK]1K=-yžL2.ޛ.tnBp_eM/\ToJtb5\UEp"sp #QV-8CU5l_.LxpUq飀RĦoŠ EpKVZChI̢AuFydN(͑7-/^$2!ie/ie F7ed/D䖉djW1yYW%< BMҙnCឥ6 iEӪDVeK (I²fْvdG&CPIEVF1ek6F-XG0@ۋ͑# 0@[%xh[mL`6$ A4Ӌ{+6 A[Z5@Pq@g*tm$hNT%oh?zͫN68P4 X;ę HAx9hګV9h$@rϫ:ΫʫLxok SAt@tA蜉N ٶс϶e:KcRk6Y?؝x::D_̤ tnU9(и+o&:"7Aw}_,_{gQ-)7M(ݩp땷/~mQhK*,gf1[(ns]g͛ b"(,XYE`%kT4MGFD?8f2j*9Ȱl,SD(Xx&YM< ݨRG$γ-On GD""yJCD\G_6؋o0u55ձZFۤj Pub4je PS*e *m@@{{P(8u(T _(\CN]f݇$6q>h7qy8řsCҲKxAaEc(eKT(EӀjɱF % mO5u&cᰘ?S -4 Z*ŗ'et)4N Zl)_Shh0A;bgdcG?[&t2o-|3ȃYg|0w~_ >AAeUAPh=EDAJtp@ :6K:P%PZ' J%%P%P%P%P>޶)<%. _sk0N5_#5_QsydZ3t+MF Z-v}sݽojS穐D(E'3!ɤPy@AiӀ]JURY -~WCՀf43]9h΁f&yh]h(A*>.]u"\(Ck.lDڲtזqAn|.Hpvt].('[]疮y~ q:$ھg(q/*4O:_M*Qz3J>/} m?\V "ˉҊh9ֈHu"#4kmNF@D@ֶTXvhh-{"# "g MC:4G>&`7A$`:m%0m߅HtL3!?`e(=B0m &`Bb˘>VzOt l $^|G}0]I0`: LW J\)4ht+.lrkwE/] FEbOONYK_JtDsG鄡Y:t,DN9萛LyӔ!\G>s7:5wTߥ;lѱ~xtF@di1"uj`\:_uURJQ/ =(kJx5W1FWh,Fcj4RE@D@D@D@D@D.ȇO!D*x_CW " ȟY"#,tj#@ӡ]"Ñ"?9 H͉Ьdk 5h*Ӕn& r7hVh̅2Ϳun֪&F/ >Xł?Xճ+`q<sXRYl{XA-\*-ŘH%{ u,ސ\lAG}z1_G܁Woq "NZfN¶<vMGh0Nَ,Eq3@[S?XPh6 Rh"ši~N".dqE\|O9 lqU `!?\t9j.DRF4zv3)9IYmU[x 6babIJ < X m,Fh,go-[h,F1#difo Y#8PXGf2Lz KBٍ5/t}v ;YsN Kܰ }kO;|5Qܹo"^P$ {È%D814A s_Fɕz~țY~( W9X;FGjP3JE3Q34@4@vфPB.b]4I>IN0e4n54<9rH 4h&,_֜ D oBUXEhP4(s<"i< |B@O@B9Yr~Ũƃg!\MjYPdEa~i,[nqrO|+h<`\\󀮕t<`O%L#ʳ8-jW.؝w3\9b^nIM={aYQܕ}p['1*zY%Ԯ4!d* [adG W2(F [dl-]'HZ(P{? S~%uX=]'i .{ІTȟ ?*@`F`]t`F`TDFu꺿h~ 3Ow!!Nq`9k~Qčf(FN@ @iR(P%PZ((- "hIH΅C/:n kJtՔjU((JiH8(.4EP:te @ 6DOZ|JR5CQ)yr Dɕ)%4˔gzyRtIߣLI4Jdͼr`ʴ2K7E $Be(H}CGN]3PAI]jgGtJD3B!")-Mj6]2~ C)GPh.Q=RB1 dƩ s fp;9UV;nn6uYl$oE-ٗMnĒYa0[䆸)f!2oDdVХEcgR͍v祊8slrH9H82W΢YViy9Gu2h o#%o-yLVg: LdlHNNqn& &0r&˙ {`rF91)S:#1LdLJ< oZe}ﰎc22#\\\\\\NA\ׄ 9ݍ ; vU&*f\^pYRt7XPOj|τKދ-?ŗS 7Ҩs7_@H~x &<+ݑRe|ۤ aEuu%mX"XuX? =54aW B +aA.D] ^7 _^^^E^s2^N8y;PŹ:-{im1^ zaDK0υ 22 d.!Ȗ cvA͌x%RM O<í䦼ʍ2XƆ^^AJHzK !*B:A[Til]Or˒|~)r@CScVyG]k?G;|3';Aw-;vV3r=K~c8+?VW>^@r1`'Ѭ~w0}C!qf(wý-W@sČ>f.@VdN֜Aj`kmYQ4W$5ޠqGEq%4pUI \=YHj i,wL&$麘\|hOa${0w℞kw~l4H/]8~TgCN -Z?@ "_@ Fd LڕڟSǙkD#ݸBVdd%L|Y+@2# ԡ46>Sj)Fj;NԺ3kh :IQjNgD&x&-nJbzU]C?Bb#Gd#^ѹSF84Xze0,#VVt+NQ2b,SRr޵^Or{Ōҭ Gѱ*k"i_%N7BR.5~q:Mtl 8 ׃c 8hDgq8YHǖ86x8cc8 [ @:6YpCY"p@:6pG ˜տ Gq}3M {TK8RC -ʂ3}P* m/͋C0<1BR<=H#5"Rd(Q>bCwQ&iQ(Q,Xa"0f*Kz1[4Jw}֨Aըj}:,2*Z[I8\;Lrd ˘;k=HF"cpb@Fqi5 .ƶqf8$u<|fFF Gڭ&KGmc >_bQl1; '_'PĉA@"6bHt%brm.v@bA D2HyHđ@ =l9$bH`#5ɯFĹmTF@jzC0֛ q@I3q5@E^@llyCӃ0uk@@5Z5XoD"`75-z bM'1)-GB  cAP'=HdA$`XCF#=pDi- 0>A7അpi#&Q8'ь~X$EwXJXz9-fJ@˾sdsE%WD/;WJbVɱI08ۗԼH_J.use:R: PAB%!Ce1H]qC~8d1~+e HJ##b Hږ*G (d2(A@ V`OBJwT@4((((((((( )MALb⠴u,-B))vSЦ2'VH}cr0羵mJDIn0|5mdaQ J.!#=YYHZPIÌ`E!tJK\@ )Uy+hFGƕI(/BtKCB{azvhx <4l1<"ϐtMPJ}ss]"S\F# ))ϊL a]C68*ԳԦc%]]SCNuѺ qt-*aw , yr7^Շ\} p&>^WV=p@ *vR:Ǹ舿TA3} NcUE K5?V&Ns tG+(y}h;L]cCԃkYB | I@"N G @"N*#+XGějWs(|X#48Dp2pkqlj┳M-~Řs)>c#SڗA >G+K;g`rA =PN%%#R ȹ$dc@@ 2<_R=ʒ;9/Cu{Ӕ4ҠR=Rq% ťz - apXwtp, sfFW@ @ @m;ݫcRfp\j5 |ءdb\Gz؁ $ 11D-C6Fp$MJv$k6$@(&||eй>:\':tnGRRBB'<ؑDYPYȋ t<=t_J(msptګ$ #ƓDBzw>!FC5] &uܗ퇰jjCLXpL ܪ xitg8 8ޚtt>29qq"{srtv]dh8rĔQ'orĨ ^Ƿq/9_pXZaGJ | g~W;R;| =zdâҔ4 S&WM䖚oKҐ8l!1111K"R4,!o؁2O,Âa1JkHɘ"0i 1dCCe Md1-e4ӏSEL=)YKzMJ$h0qO`Ӡ[:F'`~t2{xLΦTځA\*¼, .T^G;1+B. 28*dpB+dHѠ_"O(KBE!x22_+,>yTzm`r`TVk1x[O}~jsy4A}lܲc2 &6YD;j ȑ5e@ګ5_4*M51:2FׁΉ@, Άe0 @t*f1pUTbu~zYZ@q{k-K}Cz.ҴEbMER4zYF,_I((]J"K"KO@)U;h<%P%P%PD(],1(P%Pªr)(md(?P%P+]#ZC+%?Ȳy4FGK?rr"HjQJ縦5~GiPNfB&+4=dG|M1FBE#q7|Jya.^7 xü:,yfvG Lj ‘U\x5]pG.Fn} {8ұb _Qyi4GxG&]v1yW 毁L ղ;CУ9^PlN:!F^:NP$8.trxƄJmŦ3&߂Rj:bRmju:SO^m-#)7Hϰ\HE6R)6Rg]m' TǬw!p]t7{NB'Ny~bKMa?_@ F i,]Ć&j؊'ܳb\sLJ&V# yK_ æ^XA>0'O....ak/N&c˶%흂aŁ  \?6+v\ތqTHMȍQlIPWW,o4)S/iW1G{)rM\p nY,&μE0Vu"]Rx)@d";df`Kr9ה2`S>ʣk4 D |t vhr BM1݆xIQ˩MB +:NȒx)eGE>#OŔ2sJ9>Ď%eC LL40]4i:0vaUhcTb@ۓzF'tބmPVTU94C$)Ƌ#4o@.VŵI 4 I Y-TrtE*O^-Dj&Uoƕx$];D3$d@$ \<2ɉFW|DD=|0ߎ߁na=U:8 :ЩikJ4l;e:sS Tcg|69dgvt@t@̍+ :S+;;:;C <{U9u$_̤ tx? Yw-Сt~ktXŔIb̕|1 "ݩp"( ?"-ȑYFG8S0:"8YձpX|H (I峸H`X:UY:;, js]g.2MYxy-FhX0> ˏw5?˒F4u;#u^gY"t:ןeqYd&s]"qHOS8$yRa&$aʣKFx;ZDa}aaICD\G:R~v$%_cͤ%PPu;jY̓DT ED]*FL%*A.@.ԇZLQpP\He1])Q:$6)ڠA xL29kVPKE=5)ٔ5%4|03#;tkPM\h5psALqϸ̬ax |*93 ^(p4\7NcP.ޑFv҅#> Xy #K(47@Zq ?(^>KПLsў^=Ć$8W)AEԺǦE'.}9MB(aʏ(5.XjjIH"apppppYŀ ˵q pppppppppp,.o!l. e\ނ us}ppppppppppppppppppppppppppppppppppppppps{\e\ > \;fpy\\\\\\V[ˆ@^\\\\\\\\\\\\\\\\\\\\ ާ..\\\\\\\ppppppppppppppppp-s]e _&x\2 OpEKݷ.=..............................................................................rl..p豷\\\py ~p>=.......r..r\.:L\& \ i$........Z|y1pppppppppppppppz.Lpppppppppppppppppppppppppppppppppph.ppppp_咹?ppp W [M.oA^ߥphydq...۷.r\.zr墹\pp re ˉK2\p}pp ................W%^<w0.....................................................  s........................'\\\\\\\\\\\\\\\\\\\\\\\\\\\h\. ....oҾ \}q\ /..............[}}Ooz{^~￿}󞞾lǾf=}zk+C?ji#9oy_k{3~[b{s*ѡLJcd'Ϋ;G>W xcCk^}u%=v> 48rC|Oz7; }sH,96fXwx+/{yĭαOnU9ߏ}G8~z78plP'>8tZXG۲) C'XvP ZC˺QuCwOCr֎!{ vlp 0$Wی0?tliFY? us Ui¼6O2{Ckmݱe׹3p=v72.8cǾW:K|c%éOU ;oKC7.suyk$b^z;90Rq8Fb:u1'nuǾ:6ߠCsկj>ұv^ލ-=fe>~zWtvaUYcǯ[#?6=4USDz~munXgc;=~wc>\ 䲪\c1uʾU*Z:/jq ȱUI,CCvd"W&Mf{_F]hoݖ~i̋Qm6 _.%yt{?u_}Kcv)Ohy-^p¼a _σrH{w鱥}ұ{^yN|z; FG3T-()sOjOy(| v K-77RN}[N\[=k>X31?tlm;mH:nٔ+8fA*̖te>mɆkM5J~YVU'>VԱ6rBzݶ9|mmKnRgM6QjwcK|q-N=pl]޾ -*.š: ).|{:q+vpiDz1c_msoS-htM8ʪ?o Ǿa}7l1^L3m\p{t*\lđ>ۓ~p} ޴)~sS]7co .TFXг#dO@{o[vv(@;3 ?{/[Wlֻ-m),GvCg%ˋ^HP-wDZ_ _\z+{mޛ˰>ߟcĮv?^Ӈη }hP7sGmonnWҮGaջ.%c׋Xk/1r]z{nOjԴ MVpz#{`tQTUU&*bzյKR-8M|I mvMT kvחӮOf~i,6\(v$/N8 {BhCDa'EY0O}v뗆G!R=j?'=|`/~&{t7.Vn^~5|Uv-S~CԥWsg3kٜ,> 0^t Y滙+]J6HZuC=kur]$' C7 ƞ#]gDрVLe:k֝8j59d2fϗwYX'Y_ɹ›s\k8qW/<׶f=#uYTfjp={%)v=8pX7[[?78\x:vPXoaڝ]݆^..éy a\6z䂺w]\..ȮK.Xaaޚ.캴]WxĈ^SVR8|ܹaI.®6lqqvkBqNol6|6>>w?ymzw±;~9ֱ!ӞUc u웭ygy+;zG--l6#:6^Y:vW7pu}Ni1&s;mcZAiO&:vXY?2FmL[tP.^ؘ41deLth ]V_elȎql 5ݘJW/)Zb 3ryy;fFFeefdJqswK{_ڛ9[-]Ǧ=cV_{9#6"D#WkC#\`5zEtJjcNژǃ5&Qӿvy\?FtYm]O1 49k}_ќ,Wޘt Ǥ4xg,2<1Q:2`?89vBTޔ^8m 7vlLu;7q_)^;Hanqj וٗ8\dĎ,3D\69TZ1[׉.|9Q#3?{/Æeg,ߵZ,Xjġ1}R 9lV_/{n[9qV8.^-,5X[c3"/IфDǼϸ[~zV-,㪫F-饱11Gu<4ھز|Rs9.=-[cTfpGe#4c,#|3R9\˟Z"qx^φ$EZhxgMɪB5jwO,|r֪Y6-oZH\Zf6X"՟9\_.Y[Lb-/-Y,+0Cwk9%e(Xdq>pp< [1D-;U'x,{#5%ˊV8uw̩Ο:]x>(i򅵛ˢZt\b9^nEUiN^Y4s^%9MZ_`N̼yWiSV{s &qQV3ZX*}N*/+Xzl|@gbҷ=1^~0`0^\Z_41"B[JB.%+9'3J8 -e.  ^j&kfDxbXg;3%g ^:.^[zd esƳ+,{dQ[;$~vV. cp_稴uc*,,.X!9lccƹgmAf+s!ڤ11c-Ʊyl#.$}8c9f?z$=pjuK5nn|5@U-`5V{~SWk]ɁSբ_{B=uY06 uMɉW3 fg \bW}\6'XoWi?c6]-8恳z܎)N>k`"E6)lP1ݏ5Z&2U;EyLܦm LeMsyhd?8qwBs/n-٦;0rnsY3oiS^NDهS,U![o,;5kvֳnvzĜULu5Ϲ>_8OVbط9᎚ڦ(aT"k' s \΁ ppppppppppppppppppp`CP8888888888pvOv|c_Υʹb ]L{}w9ߛo!7mwc!Ebsw bB:;~ߩY`˦kpR]nDiۧBWV]:aj$xwtG,79?iZ[w~#RwӀLw 3.ݒ&0иͦk.f"N"$ JC;yLOa3Jy*M i6<]qViibӿ& ͺY=6ii?NK=ݏ 54<V61v,^oIMr'N&Xe2M}=[g |xߚzSN ߨVG=syў?pyKZ&B䋳W7H /]eT-ZX,Ns5TT9G߶ԴNn_n"/OSC,|eoN/Vwo}#Ǟ!xózEv]\KiԜƏ\42^V9x֖I 0x7Ѽy='&J0P^h0TV(,G.ؗdFƯ~l$bYշr/981=GM8.c>n1ʜ!ز#%YȰ>7I7=Q?T_qǦy4w<"B m',DgH@/ƖxrrҼ6kYۜyI~^Ȩ]5sDxVR )iġ)eٳ@%n\'(Pj͎ФgOڤS]X6W75)#-|te ՃF{5qfъQB# %A vlP@y5 H[}8N)ϰєqKMJU,Awt!k^4~rKA3+D^%ZvgK~fj\_u G;"=2rgT9^< xM \J,}!qYh/&„W6R>]1-NuN%\/UKd\Jnj46I' %QCeQ֌Qe]زI~g=d5#VCZ`hj(2S9J<$+C8^#N YDUsmYp}%sio~ڎ.G0H~6,+s~Xc%Z0ug;tv}Zֿجh[zQbHi9dxŀ#f\e(jpKė]9cYw\FvTeg8~k$ -Wpd9oeG\W@рzx^"KU,EO R7I"'jax?9$pY%1ƏOJTwŤj6ZEjLC,iiVW!7L*=]e|^Rb91=,+x< #EmfD֡@eR>׬e:<Sm6D`M3=2*, ,WNšT2w9j<@Ya~=ncS%.ϧ֚da9y|KrD~f,CSdⲪw'I9g,al;yS^$bpN>'tR~;NkJE7a*ɶQ:=n>n{JP ?̜7϶]5ACmk/ecPsǞp#8 ܙC^8C׉8ޓSTLy9~.OZ5xKCֹO bGrxGB+,c9udl <ǎ(*#}0{)_Z[$Q$s^8a&&z+F{ę-.! 㥑mNS$vQ-7-YA"2"$r2˲f.z_A n%J!!7<@U S0zWqǘ0%/{S^>Na7j\BaR 9:JTDİβyDZYIœZxpg,(M̤k[X':e((4爞o9ڙ\+xSY-^.]#g=$Mfm^lT5FWbM=y J"ucS)=F6}93hؘO3q#NlKH4B0ʋQM/ɒc#5\ʠŃW℠7YAQŜ*l)  5ɏBW-X 1aֵ9MGkCʘq&"瑇,.A{SnƂ̱dosM}mcK͵ʤǪ1uS}IY*R G' z1/JSY%]sQBe{C9=oPLTj,OTg1rQ|a'1Y c[CxnXƛc^=b6oErro)~96g _ EamTI f'x,gjRTBYG&H3,eQ¡Q.[HBGѻQp-R67TKK^QBͭ&%:G!ꄟI^wgJ7OJV/hM1lu%iz@b˪%eg9xWLUQʥ/j0wC!9S]9]#)T뮵Dsv4PjVa]\1f]x8+ƩiGgSly5ۡH e(9R ND" MPVNO 1rRtlMALDNXG*-|&i -o.]Nw i$o nm~l8M 4ؔL^S;8UG |Kj1(3Eh6V;&%of(]ax]QYs冽́ G5~C]s6QʉX x/GtzŘxօ(_{ء0eJ_ Rk06nٮŁ;XqX; 'gI;'ЍkV^Y9^u}n7I-)m?UxyylK,1nh<\xΫ*a,RY3iT~C'sbW6)&E4(ւ>SNH~H6p1H Ib,BGO"5Mzqs b, CsJ&{٤d9od cu7HYJ\J\; AP IEdw"Dy yeE)yRl)Ns5}U7NM"N-n΃!Ǜ6|$'䝛'IH6MET9:"Vnb%xDY.źI$cDtlUNSqЅܰ$#L4/]Ԃ%R>3e|1 $mcWRJٺg+5.4)%ЬcΉ=(`䠖7Onݳ M߳%{ P8 [Q_N 'mJxI½lw]"aEnogו?}4*r0BWB?>@pE ~vx.T.]$oϳa a(pQ+5շ՚o>`?x6j4]pz>o4ۤk兗YO##gkR*E&NU<Ĝѓ8v&f&dF^ߺ*$/- _Gz^z*+BQ9aUVg[+M!'5mg8V1WK^F ‚ܱ& 6A8 WW rM|I-qgVϊI!4|Vms^}q(j1[#U&,zYMrz))U;s$[eU&5ͤmѮʢ.8^֭3(CGg<6 gtpc;H~h0KR(X[rx$C ?< E:%jPCkrzx(C3L$'6; R;*1W'˩9бk¦5zW(5DT1@.gqt0LU8ͺGyu[^A7l;׋:)RqMhÑsܑ,)}%G**. a6W|ׅjPx˻f<(OyUU< tiE&S ymHuZ*87?Oe\;7*%dTP_CR287Pƚ$01= D$-, K۶0[5{ń¦8AZ4z(riwazpLԷĢ5mƞ'K0+lyyLηcm5mvL(63f+ݘ> [ G8/#ь!'dGL1$ :) Q"9iƳDŽ=1'(El9j16W $nYlL1a}QS*t}܅fF;jGj<Ӕ:IBo!#E&R͚~tL$oTH 4wd]tT5lD5F')L'y"ýf7k-^SZ/Tzbߕ%ix*inWZT gGG)hpՏ0f&6\'Vakpmd~s5ЊM/c^9JY$xʱF'J$V{Aw$ѓ)'WcW,a%Hqtm8rY-ٚY _zLZa(6Okyj0"k[OϑqVہ5I&mL7$v1OOѸPF9'r3O6uG2//S216Ĭ[J}`^ۭfHDIP76laAך!v汎!cx ]̪  7ƛ \8P,:S C R5I׋yѾ19UVbaWd潆׻e)vh&xYҊڅHjR;9. L:R򲺚 Cs)J`BQ#,VZ m6o]aJJm9O j2B +*zCʫm쮚~xkRGQ'zCS569=)OQ ft+hֶGIS:DzƷo,=׿'ۂ_e +s^adF)Cw( .t\q+fɮ./ę(,N@5TW(sn(o1+5#3pŒ)Jc!i6WTh gCd7=/H%J +hKx\&o dk2fa3vQi]}Y 祗ptqȦV:&Zַ͐XZ_-f)&# wnm i)s\aC뮸oQ׿v#_5sj0f#|)F:A'(rɦǮuۢSKx0T.eȗOK=+(1WRS#Á](:8~ 28\1Է4s 8^WeG=n'9~$6q*eG{^WkלqUEQGt{7=tm2.z[ޠrjKE;7uU^iɡ{pUق,[ 8tmlDN E(t:թP=?:V:JEx73=s^d:dׄ1,yb8#}{"އFF."J:uv|EIDIa zc}R.~~W#Gy 'L+++{Y ,$in+?tр>^ Nlo6AVa|GA "QȇR'${r ɫr=ǀXb\h?D/'|($KM/u)R~H$#R<~`8y%bpcC$)3zh4x$lbh`ت !AkLM!w28=@FD{7LH䗄{u6op3%dY<ձ%|*΃&T^CJ~8sc,?Z79N65r!hpiF"{"JdK[s3ƚٳ()|+vs7[ǾԵck 6R4d❨&$ŚjV/ZM9kjJflUV6)(E,%5b?o9nN/)scIq@{b3)g MI4y!M/8/Cmk&B -Zܚ&%T"?&ĎcUJpg KhDJ`&Bb I&+ƻ}ՍӜ4\r佦3e2~Q+r0pkixo别ۖȱrSNHh;|!N9/*v0ŏР a쭖10b O5qIjIҐrw(oZ Mr8E.X'%`adR}8]iZUT߸yK4SYw,H<3O!?uRw4!wd%Y cz:.q?3%mD~w6U}r: jIMh'LI[WMVìF_8&q 3e'|&&٭@w6B.UoV6/rV*ܦ*4tsJ},k V`M!tTo 8SF]O"j4WrN)DyqȵO\ cURGP8AB@s'$/= EUqc^8)wK^OB_ʊ\$΋QgRFM7ȼk#OV -`g]q$>׹\Hi_ ՆFڇkLDž5[EӃNnW-1{KaG@pcHp+e/T9A:<-6 Հ 8ypXr̔|!@^dG⦾uFb-nK-9~xKyw A&yh%M^vs5Ug`WRDotiPLɞIifyb$Uƈ+*'xEAodQfuJ[(ABTtmtIv4ꑽB=r`j[z/ ,Oc2dzֺ|h[4IUG^(a̻B?llm8#WE H/ܛyW{$$h/ 蘋 {tngK-jRAj8| i \PDs=ggTՏϗrG5M@tMF^V0I90MTrQ7+37x<~ƫUm>$Lu_eϣtvN9!Ną^/u]F!:iHƫDzD9s)gX޳blAv(3&ǻTY*|hݓu -T ZS{xšj(:0]"5N1hMM#v\F۶U47֒{ɤJΓS d׈+zrPs9G^-k2<2a&߲9O}R!/_H-!Zؒ62.j[Zǐ+!w:iN4iVIN*pg{ Oa ud>RM 8YFMgif*8n-kx6%XxPiO5pCkۋ +;m̡ͩLC!aɞKP?H -' gK;Rϭ<7[(@Zqz$u/9pL>(jRt ́޳(  jˊWkK! b#J.kΜ|G VϜ 5$%W$>p ̜!ל@0*^=gVф &gQPWrOd)ëI`C#XźWnKOGyI'wwSve (0K@ 4 (Jyr|C<jg=/fJ+0D|a@yI-qXVbL V,M*~,6g@),#qg!{۲ٓr6t!@hm 6@hm6kqem,wZ]9h6̘Θcusmf~؋xFls{RàYz״1?hc^Z=Whm 6V۶n(ܼh5ed- @cmi= 6ڸ6i*v6ڸ6W&/mߒb~hlՏ0E^tm Cjm!sbқncfp6^bq]ISKCkS_5mQ.^Wsm 6ڸ69m)ѷ*˟6FphJm@#QGYYQ6ڸ6vvw _gO;is?cW#~8^ )ka\Jߪ/? gt3)͛t-qk/R?uw:>5~8z::CuǯtS:ϯ |~36c<4o>vykw>cvb8mK>e۩>Ǻ$:~fu ~k/~Os _aG9=ooWF?YKJ!Z;w·%nܯD~~cO}W_tȩ?]ީߧi&]{nG*]wSkڱYouvi=g=]Z;ݘFZfscSic;tI/_.Y_N'_׬5ZzC֫Ck{]|||N?_(_>~BA?||sr식O:'峓s ߟ?ɾ/c[|,}H\O+矗7䓾/k~V}i2.}QKr'drd3/}Ŵcϛ/K[_>O~[|dE9e[;/s_9 Hu?6}{'$tscEΏe9ѱL~>6m?'m}"{'[/m٧wvjii~(g̘2?#m|k痎OYGrwy}W?u/eY9sϘT?al뿕ʺL|ȌΑh~>/|L)ͱ;v^q.۵ue{ǟsunx86^与յϻNîwUO|ee# 3?-\_}U>6Qv>2WckuG:}շjg~|mO~/[OJu;ﯚ㋦[>9|T/}nM2ܩչ՝kut\?65U_ֿ؜V{2Sre%c5hITVTF糦OOYzVVtw~|eQ}u_e]=us#M4㧟{<}.۾_~E 9'_ܛ]cVZEey^̴qs˻{hsEdӿϛc}|7W۞gdӾG.~G_e}e3_e{r g\j|Ԇ|tMLU< c/ Ν˽Ԯ>_d{;ڇe>PNڟo-ױQ?v]2ٙkvm:ƪL+l\~vvYz]}7:Ov;u~r_61.k㦾[_ܳv,u ?˾L~Y3zh}kRI9{:mP=]5J'~PVr,B[˻)i|5]~"m.0蹩oN:7t @t~a`v~v~ؙ1ﶣr=]lLcӻ<"m?{Ox|[ۮǬW6]MTJcݯqHl{'Ӿk/꿪:?̨LQh7Կem媟uͩcuh۟첝RYs/6Nҧ,}i>_]lKv\t̿69Gk~󈟩q$;}ԉϔ|(칵znf|5^CƦ;gJsokטoI_[/s-:9v>C[[i=9S<<~A>IfO?-4>|^>kk']zT}wwnk:}gFPr]7v'SyӾ%_w8}W4sr}]h(/˘=ꚯ:u\Kf[c?1oڱt/?mXh\KrmaٵOKW3{g]C5}/Ƚ[ r[3G6'S璍vmt嵞޿h9}"5?w9V/uv폛]^I2vߐT'T|ݎs7{zgX|cH]ΑhCc: 4 4>}]r]G]w9楱e|]U>5:.ǧ~Z]]ُǔ*|;4'ac?8Q4NBrƗd~8Um]}Th<髆~T޾.Wd&c3j3l~׹''յfsj֝3V9.۬or~UUiGcm_K鿓vS탽ׯH{_ki,a7~I>ߔ>]^3hn,.#M|~J]֩oλzz1v:g4.?޵sҪ\C<<~˻<1tcQC7\UXrLk t w<7yھqA/~{W.s|PỆ޷s;>P]"zk̮_ڋrɷw9g׏2cMt> U|WMx-ItNr?y AҵzWZ_eBjk|}C9]c5LߖKƠhrM,,TWvYL߻]:LsL&S}oHrM砽gwyNxغӜ5]{r/O]ˠcB/u??v~~f:.:ΪMƼhYUWyo˵}a~fk!=9n}΍O:Ug͵zE׵ꓩM/NBR;ؿ%qy]龱S-}dOsԟǚӭ?~dZ[;7c};7:S]ʡ{}z&6Mlb&6Mlb&6Mlb&6Mlb&6Mlb&67&6Mlb&6Mlb&6Mlb&6Mlb&6Mlb6;/{OO\vty3L}axm}(ۜ~Yo sZN*yu77eWc9هu_h&M/79'Vps|ًU{69/&'ͅõSp8䪮BB*cp,߂uEziqI i Gra($lC tp)ppzikyZspHNvxݪ<%Nsx+z/aN8քYYsUs[pМKV5[ǚ\s67u׼ytw&(y(ުq免:yA9_8K5iݷPx(3P9R8G9~\-S涰gs I뿪N}{~BK6 kacs.022U]˅3  za)duȥ9{5Dz1| cd&-ÃfUN[X@Z6[-tkIm6yf5>\^vg[x6oosՁ3' X"46os Xž~;ojscgQ[6nznQfc8H{*YgF>>ڟl~c~t}+;ޟnXLX\chj?sw}?znF^.ӕ}i%?x~pui5c_sl)st1[RJʜ>ñYK_r?5:#Sڰ9X2%vJ5)>C-||9k9^j?ϯԧwڏc̵/\[\cY ן; -d3OmC94b1]?XCwv}kJoT\׭|l=]ۏJc>N?u;rcՌe1og!L?odW 7e36;ܮWp~5VCoյS֯ڱ؏}goWW|p_~t~O\c9Ԟ_?w}9s!?4&w29Ԯ9s':B[SlᜩR)6uv8L>׮.=ǟ1u`:NaPe*05j?ꃕ|h_27ܿoAM;K9dMij|W+CҿS8`ژsLY6>swlfQ==m[/ڴ\U}lfl>7Cnafn)>o枽潯ͦ\i)!%\i|˛ݿ^˛yi}ټ_oG}zi1_}lG.o6=>Ӛ,_iMן?6swnwovwwOy<={{ʰZo|~|7??5~~y̛O͗^nFm{y_ȲP|Λy_^o%^ul5O|%5 Sn,Ϩgwyۼ}o7J-mgQۆJ}5wwf;`}6<ܾwߛ헼}{ks͹msaqgvkv]iŴl?{ouuKyیÓ~-o~>k=9R~s~`'mk]Vi7۹OΣinjӋ9%{鳹C<>?ybbkb}>Wo?7ۏf;9׌ëW37^㽊zY/ݽ7y?Y;OS~3/_L;/Wo?<ho?s͘?9loܟ,kw??UNYk|]ogO7cuݳپ/o{|κ#/?m3^L;/{;kg^Mf _wu_f?syūF17zx,El7z63mm}Elyxot};?<<6͘ܛ>6l??|6%x1s%m3_ѓ{6dm3YvGv~4~sgۆuF͈od?jmod7|1{4>cmls_<4GC>uwg~`uz|ܧ?ӽ}#ݓuO~{7lk=ɓCM=Ҷgq|&26z)ٷyz2X~l>̍Γai;7'>¾;l) ?q{1oY?dAOf^3z5ǧWg2:Y{?`_ٷ|6yG?~i`9o??k=u~;s̳oy6޳љFgGZO|}1Y??xݭosgiwfn|6yml~}{5;.?~K|~v}gorFƟoF&66G# /}61g[x6g}697OY)۸5))-6fָӘ)}۹MB5mSjm3LmeD>rm[ѤoMemJp3![S*vl~1M9~lr\SbJ_LyI޾rkܸ5i[ĸ5W#ysޔ7ei&D|gBwM9{SvxkJCM.?<_M)9הޚR[SfRTw$ՔT~۔R3<ܙ%)Q3e&ugҝ)9۫)+5;Ý Aۦt;S2q`X<&L)C}xy6%/fΘPY}x4%!;#bW5z x1ZƵ8h@`hF cÇ5k=ybtH:MӤ39 s Pk fpc~ 6! 0C5F}^&shVb%90s2lIיTРq~4swc`<:` 1Zpkƴh5kb9sG xx^h8`rCS0gN(KfϢ-.&f,Y֒b6.fb̲3'x<0,RZky"hk4RJs`sy<:4'CZBG|:澦sr\R()JS.I` z($.;䞕ɾobR_ZoD]dYI;bu\N' ;uEo@L)2@`[ u`8ݟr҉Y,^IiXAw*B mt9ֆ7R*'8X$\+~ ˅9Vѣmipk'ό'PHo 4{ICs)NWwb _rE8PT5Ηalakazam/NAMESPACE0000644000175000017500000001220714137542037013414 0ustar nileshnilesh# Generated by roxygen2: do not edit by hand export(ABBREV_AA) export(DNA_COLORS) export(DNA_IUPAC) export(IG_COLORS) export(IMGT_REGIONS) export(IUPAC_AA) export(IUPAC_DNA) export(TR_COLORS) export(aliphatic) export(alphaDiversity) export(aminoAcidProperties) export(baseTheme) export(buildPhylipLineage) export(bulk) export(calcCoverage) export(calcDiversity) export(charge) export(checkColumns) export(collapseDuplicates) export(combineIgphyml) export(countClones) export(countGenes) export(countPatterns) export(cpuCount) export(estimateAbundance) export(extractVRegion) export(getAAMatrix) export(getAllele) export(getChain) export(getDNAMatrix) export(getFamily) export(getGene) export(getLocus) export(getMRCA) export(getPathLengths) export(getPositionQuality) export(getSegment) export(graphToPhylo) export(gravy) export(gridPlot) export(groupGenes) export(isValidAASeq) export(junctionAlignment) export(makeChangeoClone) export(makeTempDir) export(maskPositionsByQuality) export(maskSeqEnds) export(maskSeqGaps) export(nonsquareDist) export(padSeqEnds) export(pairwiseDist) export(pairwiseEqual) export(permuteLabels) export(phyloToGraph) export(plotAbundanceCurve) export(plotDiversityCurve) export(plotDiversityTest) export(plotEdgeTest) export(plotMRCATest) export(plotSubtrees) export(polar) export(progressBar) export(rarefyDiversity) export(readChangeoDb) export(readFastqDb) export(readIgphyml) export(seqDist) export(seqEqual) export(sortGenes) export(stoufferMeta) export(summarizeSubtrees) export(tableEdges) export(testDiversity) export(testEdges) export(testMRCA) export(translateDNA) export(translateStrings) export(writeChangeoDb) exportClasses(AbundanceCurve) exportClasses(ChangeoClone) exportClasses(DiversityCurve) exportClasses(EdgeTest) exportClasses(MRCATest) exportMethods(plot) exportMethods(print) import(ggplot2) import(graphics) import(methods) import(utils) importFrom(Biostrings,BString) importFrom(Biostrings,extractAt) importFrom(GenomicAlignments,explodeCigarOpLengths) importFrom(GenomicAlignments,explodeCigarOps) importFrom(IRanges,IRanges) importFrom(Matrix,rowSums) importFrom(Matrix,sparseMatrix) importFrom(Rcpp,evalCpp) importFrom(airr,read_rearrangement) importFrom(airr,write_rearrangement) importFrom(ape,di2multi) importFrom(ape,ladderize) importFrom(ape,read.tree) importFrom(ape,reorder.phylo) importFrom(ape,root) importFrom(dplyr,"%>%") importFrom(dplyr,arrange) importFrom(dplyr,bind_cols) importFrom(dplyr,bind_rows) importFrom(dplyr,combine) importFrom(dplyr,desc) importFrom(dplyr,do) importFrom(dplyr,filter) importFrom(dplyr,group_by) importFrom(dplyr,if_else) importFrom(dplyr,left_join) importFrom(dplyr,mutate) importFrom(dplyr,mutate_at) importFrom(dplyr,n) importFrom(dplyr,one_of) importFrom(dplyr,rename) importFrom(dplyr,right_join) importFrom(dplyr,rowwise) importFrom(dplyr,select) importFrom(dplyr,slice) importFrom(dplyr,summarize) importFrom(dplyr,summarize_at) importFrom(dplyr,transmute) importFrom(dplyr,ungroup) importFrom(igraph,E) importFrom(igraph,V) importFrom(igraph,all_shortest_paths) importFrom(igraph,as_data_frame) importFrom(igraph,as_edgelist) importFrom(igraph,components) importFrom(igraph,degree) importFrom(igraph,distances) importFrom(igraph,graph_from_adjacency_matrix) importFrom(igraph,graph_from_data_frame) importFrom(igraph,groups) importFrom(igraph,make_directed_graph) importFrom(igraph,make_graph) importFrom(igraph,make_undirected_graph) importFrom(igraph,set_vertex_attr) importFrom(igraph,shortest_paths) importFrom(igraph,vertex_attr) importFrom(progress,progress_bar) importFrom(readr,cols) importFrom(readr,read_delim) importFrom(readr,read_tsv) importFrom(readr,write_delim) importFrom(readr,write_tsv) importFrom(rlang,":=") importFrom(rlang,enquo) importFrom(rlang,sym) importFrom(rlang,syms) importFrom(scales,log10_trans) importFrom(scales,log2_trans) importFrom(scales,math_format) importFrom(scales,percent) importFrom(scales,pretty_breaks) importFrom(scales,scientific) importFrom(scales,trans_breaks) importFrom(scales,trans_format) importFrom(seqinr,s2c) importFrom(seqinr,translate) importFrom(stats,cor) importFrom(stats,cov) importFrom(stats,dbinom) importFrom(stats,dmultinom) importFrom(stats,dnorm) importFrom(stats,ecdf) importFrom(stats,mad) importFrom(stats,median) importFrom(stats,na.omit) importFrom(stats,pbinom) importFrom(stats,pnorm) importFrom(stats,qbinom) importFrom(stats,qnorm) importFrom(stats,rbinom) importFrom(stats,rmultinom) importFrom(stats,rnorm) importFrom(stats,sd) importFrom(stats,setNames) importFrom(stringi,stri_count_boundaries) importFrom(stringi,stri_count_fixed) importFrom(stringi,stri_count_regex) importFrom(stringi,stri_detect_fixed) importFrom(stringi,stri_dup) importFrom(stringi,stri_extract_all_regex) importFrom(stringi,stri_extract_first_regex) importFrom(stringi,stri_flatten) importFrom(stringi,stri_join) importFrom(stringi,stri_length) importFrom(stringi,stri_pad_left) importFrom(stringi,stri_pad_right) importFrom(stringi,stri_paste) importFrom(stringi,stri_replace_all_regex) importFrom(stringi,stri_replace_first_regex) importFrom(stringi,stri_split_fixed) importFrom(tibble,tibble) importFrom(tidyr,complete) importFrom(tidyr,gather) useDynLib(alakazam, .registration=TRUE)