pax_global_header00006660000000000000000000000064130605672220014515gustar00rootroot0000000000000052 comment=7341594ea53679c84d56d308e14503982fd6ccfd d3-chord-1.0.4/000077500000000000000000000000001306056722200131225ustar00rootroot00000000000000d3-chord-1.0.4/.eslintrc000066400000000000000000000002041306056722200147420ustar00rootroot00000000000000parserOptions: sourceType: module extends: "eslint:recommended" rules: no-cond-assign: 0 no-constant-condition: 0 d3-chord-1.0.4/.gitignore000066400000000000000000000001001306056722200151010ustar00rootroot00000000000000*.sublime-workspace .DS_Store build/ node_modules npm-debug.log d3-chord-1.0.4/.npmignore000066400000000000000000000000361306056722200151200ustar00rootroot00000000000000*.sublime-* build/*.zip test/ d3-chord-1.0.4/LICENSE000066400000000000000000000027031306056722200141310ustar00rootroot00000000000000Copyright 2010-2016 Mike Bostock All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. d3-chord-1.0.4/README.md000066400000000000000000000257001306056722200144050ustar00rootroot00000000000000# d3-chord Visualize relationships or network flow with an aesthetically-pleasing circular layout. [Chord Diagram](http://bl.ocks.org/mbostock/4062006) ## Installing If you use NPM, `npm install d3-chord`. Otherwise, download the [latest release](https://github.com/d3/d3-chord/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-chord.v1.min.js) or as part of [D3 4.0](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: ```html ``` [Try d3-chord in your browser.](https://tonicdev.com/npm/d3-chord) ## API Reference # d3.chord() [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js "Source") Constructs a new chord layout with the default settings. # chord(matrix) [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js#L19 "Source") Computes the chord layout for the specified square *matrix* of size *n*×*n*, where the *matrix* represents the directed flow amongst a network (a complete digraph) of *n* nodes. The given *matrix* must be an array of length *n*, where each element *matrix*[*i*] is an array of *n* numbers, where each *matrix*[*i*][*j*] represents the flow from the *i*th node in the network to the *j*th node. Each number *matrix*[*i*][*j*] must be nonnegative, though it can be zero if there is no flow from node *i* to node *j*. From the [Circos tableviewer example](http://mkweb.bcgsc.ca/circos/guide/tables/): ```js var matrix = [ [11975, 5871, 8916, 2868], [ 1951, 10048, 2060, 6171], [ 8010, 16145, 8090, 8045], [ 1013, 990, 940, 6907] ]; ``` The return value of *chord*(*matrix*) is an array of *chords*, where each chord represents the combined bidirectional flow between two nodes *i* and *j* (where *i* may be equal to *j*) and is an object with the following properties: * `source` - the source subgroup * `target` - the target subgroup Each source and target subgroup is also an object with the following properties: * `startAngle` - the start angle in radians * `endAngle` - the end angle in radians * `value` - the flow value *matrix*[*i*][*j*] * `index` - the node index *i* * `subindex` - the node index *j* The chords are typically passed to [d3.ribbon](#ribbon) to display the network relationships. The returned array includes only chord objects for which the value *matrix*[*i*][*j*] or *matrix*[*j*][*i*] is non-zero. Furthermore, the returned array only contains unique chords: a given chord *ij* represents the bidirectional flow from *i* to *j* *and* from *j* to *i*, and does not contain a duplicate chord *ji*; *i* and *j* are chosen such that the chord’s source always represents the larger of *matrix*[*i*][*j*] and *matrix*[*j*][*i*]. In other words, *chord*.source.index equals *chord*.target.subindex, *chord*.source.subindex equals *chord*.target.index, *chord*.source.value is greater than or equal to *chord*.target.value, and *chord*.source.value is always greater than zero. The *chords* array also defines a secondary array of length *n*, *chords*.groups, where each group represents the combined outflow for node *i*, corresponding to the elements *matrix*[*i*][0 … *n* - 1], and is an object with the following properties: * `startAngle` - the start angle in radians * `endAngle` - the end angle in radians * `value` - the total outgoing flow value for node *i* * `index` - the node index *i* The groups are typically passed to [d3.arc](https://github.com/d3/d3-shape#arc) to produce a donut chart around the circumference of the chord layout. # chord.padAngle([angle]) [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js#L104 "Source") If *angle* is specified, sets the pad angle between adjacent groups to the specified number in radians and returns this chord layout. If *angle* is not specified, returns the current pad angle, which defaults to zero. # chord.sortGroups([compare]) [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js#L108 "Source") If *compare* is specified, sets the group comparator to the specified function or null and returns this chord layout. If *compare* is not specified, returns the current group comparator, which defaults to null. If the group comparator is non-null, it is used to sort the groups by their total outflow. See also [d3.ascending](https://github.com/d3/d3-array#ascending) and [d3.descending](https://github.com/d3/d3-array#descending). # chord.sortSubgroups([compare]) [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js#L112 "Source") If *compare* is specified, sets the subgroup comparator to the specified function or null and returns this chord layout. If *compare* is not specified, returns the current subgroup comparator, which defaults to null. If the subgroup comparator is non-null, it is used to sort the subgroups corresponding to *matrix*[*i*][0 … *n* - 1] for a given group *i* by their total outflow. See also [d3.ascending](https://github.com/d3/d3-array#ascending) and [d3.descending](https://github.com/d3/d3-array#descending). # chord.sortChords([compare]) [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js#L116 "Source") If *compare* is specified, sets the chord comparator to the specified function or null and returns this chord layout. If *compare* is not specified, returns the current chord comparator, which defaults to null. If the chord comparator is non-null, it is used to sort the [chords](#_chord) by their combined flow; this only affects the *z*-order of the chords. See also [d3.ascending](https://github.com/d3/d3-array#ascending) and [d3.descending](https://github.com/d3/d3-array#descending). # d3.ribbon() [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") Creates a new ribbon generator with the default settings. # ribbon(arguments…) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js#L34 "Source") Generates a ribbon for the given *arguments*. The *arguments* are arbitrary; they are simply propagated to the ribbon generator’s accessor functions along with the `this` object. For example, with the default settings, a [chord object](#_chord) expected: ```js var ribbon = d3.ribbon(); ribbon({ source: {startAngle: 0.7524114, endAngle: 1.1212972, radius: 240}, target: {startAngle: 1.8617078, endAngle: 1.9842927, radius: 240} }); // "M164.0162810494058,-175.21032946354026A240,240,0,0,1,216.1595644740915,-104.28347273835429Q0,0,229.9158815306728,68.8381247563705A240,240,0,0,1,219.77316791012538,96.43523560788266Q0,0,164.0162810494058,-175.21032946354026Z" ``` Or equivalently if the radius is instead defined as a constant: ```js var ribbon = d3.ribbon() .radius(240); ribbon({ source: {startAngle: 0.7524114, endAngle: 1.1212972}, target: {startAngle: 1.8617078, endAngle: 1.9842927} }); // "M164.0162810494058,-175.21032946354026A240,240,0,0,1,216.1595644740915,-104.28347273835429Q0,0,229.9158815306728,68.8381247563705A240,240,0,0,1,219.77316791012538,96.43523560788266Q0,0,164.0162810494058,-175.21032946354026Z" ``` If the ribbon generator has a context, then the ribbon is rendered to this context as a sequence of path method calls and this function returns void. Otherwise, a path data string is returned. # ribbon.source([source]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js#L74 "Source") If *source* is specified, sets the source accessor to the specified function and returns this ribbon generator. If *source* is not specified, returns the current source accessor, which defaults to: ```js function source(d) { return d.source; } ``` # ribbon.target([target]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js#L78 "Source") If *target* is specified, sets the target accessor to the specified function and returns this ribbon generator. If *target* is not specified, returns the current target accessor, which defaults to: ```js function target(d) { return d.target; } ``` # ribbon.radius([radius]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js#L62 "Source") If *radius* is specified, sets the radius accessor to the specified function and returns this ribbon generator. If *radius* is not specified, returns the current radius accessor, which defaults to: ```js function radius(d) { return d.radius; } ``` # ribbon.startAngle([angle]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js#L66 "Source") If *angle* is specified, sets the start angle accessor to the specified function and returns this ribbon generator. If *angle* is not specified, returns the current start angle accessor, which defaults to: ```js function startAngle(d) { return d.startAngle; } ``` The *angle* is specified in radians, with 0 at -*y* (12 o’clock) and positive angles proceeding clockwise. # ribbon.endAngle([angle]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js#L70 "Source") If *angle* is specified, sets the end angle accessor to the specified function and returns this ribbon generator. If *angle* is not specified, returns the current end angle accessor, which defaults to: ```js function endAngle(d) { return d.endAngle; } ``` The *angle* is specified in radians, with 0 at -*y* (12 o’clock) and positive angles proceeding clockwise. # ribbon.context([context]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js#L82 "Source") If *context* is specified, sets the context and returns this ribbon generator. If *context* is not specified, returns the current context, which defaults to null. If the context is not null, then the [generated ribbon](#_ribbon) is rendered to this context as a sequence of [path method](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls. Otherwise, a [path data](http://www.w3.org/TR/SVG/paths.html#PathData) string representing the generated ribbon is returned. See also [d3-path](https://github.com/d3/d3-path). d3-chord-1.0.4/d3-chord.sublime-project000066400000000000000000000002711306056722200175530ustar00rootroot00000000000000{ "folders": [ { "path": ".", "file_exclude_patterns": [ "*.sublime-workspace" ], "folder_exclude_patterns": [ "build" ] } ] } d3-chord-1.0.4/img/000077500000000000000000000000001306056722200136765ustar00rootroot00000000000000d3-chord-1.0.4/img/chord.png000066400000000000000000003535621306056722200155210ustar00rootroot00000000000000PNG  IHDRu iCCPICC ProfileHT̤Z #k(ҫ@%@P+ ,E\"kAD(v .l ;wwo{\a lQ'#6. @zT3׿mt4S<7)r"7)4sl.]-(+Q.b4i>&2 (lw4: ʖ._-ʮ6:22N!o55l,a:{[9tРçC׬6miCfϝiSQ3a.;piQ3>fEΰhi }~~KIY>3epnJd pVZD/i^$,cFlo\)=J&yH(xa0=tt?i>+'Bl6f8:['T>pO+TBd3PA @bh*R~NCPtF7g)"sa&‘"g¹p .+p3|<ma"^H$#"d R#H҆t!7 ahDa8LVL)ӌ b0߰T:eac<2l>[m^`q8gspF\;7*xS >gGaGE& B10B N"XEl# 'H$C )JZO*!5.ޒd#9'#ɟ( e!ELFSQRT;5MF^>~XȰd2kedee^ee=d˞!R(g %ǖ[#W&wZܸD>C~  > \< hME6ҪhhÊ8ECEbb11%%[hJeJg$tn@g'h4g˜9s>()+')(7*(VaTiQyQ5Q S]z@K5E5g5Z 갺zJ~B}5^j55S5wkբijvkzPbx0%NƘXBG{BP'JgN#].S7Ywn^*zD}~^.1 Z * s Q܌2*n㌙i{M`;2)tiL`Vivǜbac^o>hA`bj;vfignYeJ*jUkku-ZV׶Il6u}w7؏:9$8;a*2C[Wk8~rwv:sg %ͫ7vp2\\JܴnnOuݹ#G=^yZz<.^vrr&+i%f%ge*UW X]Zcڼծ'O[ Emؖ.oeEw69o:g͖}[p Z~zGK~ܖg;p;;ntY[$_[4+xWn,sض^^^IIPI>};})M)(,k,W/Ra?w 5|n_EsAeaO~bTWZ]XFP# s;~d{=\/=h1c ~}"DIɆSʛhMP汖Ik\kmmMXRsFLYϑ坛<{~]Pǒc/ xe<_qrטZ_onצ7Z{{wp[[ݎ};ܻ{}?ău =*~7%ރO"< =/yOOGFY?;3;|/ѫS=;6Zzַ*okپ>ć*k?1?u}<2 KWm=̘EVANNM 8;@MOBK;QB=4Q)K`iCY6ӵ(~| ɉ_fО9ŧCPc[s W"LBOYiTXtXML:com.adobe.xmp 960 960 ;'CIDATx\SD\e!(8 7)`pb:rmD\QQWq5bXJI <伄ssΗ<O@!a 4h @@ 4vh @@]4(<8?99$RxɦH$:; ڀG'5Ba; F<(4@ 7f BR4*Ҹ A4@|z>-Ç:@pK3)TML˩n4VHT'9 =hh,ZWM"  Z" Œ<&3/7֐͑2AxV^NvV9 ,>4haҥbv,@!24f! !L&]r@@ёZ 4ΖhFR'MvM6}Wyyy%%%(//?uԅ ]r>|ׯ_}C:99X,1B& K!UB 5lW뮱T*js3N,>4õ4zL+ExR3G >|СC QQQ4hЀO񾲲r>}z6BC|H|z---{{{kkk `b/bǎzǏ~b7r@@w@3bBB {^u =}t6m~wN7"oF`c.i_ !W<=jZ1BUU#=z T[WWƆJ-_ڹsgyyן>}+$$^urssM@vv׵_xXyζ֦$PPO:kxh{iѬ:}9|3|7BQqmŧJ@K߾}N(2={Gʙ47|}*:::)))EEE^KsXTJ)"F"rP4@fa1H<6ceSH}]]]u ͦ hSjl@e7.5ȠHRn&q97wHncWC\wFދ[hI1p@⭅… ; h4{`V `g::/KwA_CÿZ P(7|z"Z0`@^lll/_~9E@ܹTYGKp0iKWt8{@ aE?Ȥ ŋ!]رcntQ&I+  #}{tt:u,lTi] - C 4rˍ&xw9.n]Yu',j кzзo~@ t$eŽ֧yh׺o[\f-OݧO//B\d@䍶o].߸S봿փHxr0:fߣGSϿ.8@&->J}t؁ U["q-|<#H#駟SeEw}w!&hA}`gV't/iDÛ#n{CC%%I&}\ B84Q@RGbh,q^z}.k?xs7\`T46((#r $\?=w}̡ +!uf EunYx"gw9233e4+hTp@S m~ 4$(ݒ0k4ׯ]AAȢ!hyɻ{~AwPNjWH3@JJJƸjHJY]h UC8"BEA:uAZ__?;;?E 4@$LffffG׺K9 }Te`?VQAڕ~Z4̓^%< 4]շz =.]:xZxݻW^=zh7}gϞ۷9U 34@H\JۥdyYG^:gPU ]~2;PAo5 4wf^R/mα@H vq7'YhYӵZo 7V\ibb&4ӓJN21GGGKKKSSS26l0bv"N .9Z,H2dѢE>e4V+yv׿F+G^ z{<5wk~W|G*#\>Μ5ic^mJmG|&իhwss8qѣ-,,tttF!={6I^>}@veee{{۷J X,V*u_޻<ՋEop<\ݵ4{x֭8sr7]?n7v'dXfq!zܸqfff***I7%իo߾[QUU%L:##EoO (4 跿@}>Bܹѻs>Pf:]p坮j)Ӝ/!t]w|xG~z##@R[[{Ȑ!kJٳ'Z,yF??[u ek2$'Faɹxw?R\!o"O|WB7}'B.&qԭ{9ߘEzO35fƍ e6ekkkaÆה++={:I: :WCV<ֽ]NtƤ!W24ٱDޒ,>_GqQu 76md``(ST[[[}}}ª';=r͛7$hjEsfM*k#ZOS~Z3tkV!S&E tnϚ, bnz>mccޔKMX5| zh": )h%gL/JK鮱E]h5+B;.wῆe_EH' 7Ik]]@dذaMuDq\Q@ 9XPnSID<=寵CKК̇|:ڪjH@ř(K)sU(Tttt࠭=`2 jk4V^^@%Lf`03bhZ{}TC~wέwuKAJp=kt1b@QCYY9!!֭[>@v~HԹ.Z潞Tu‰h:gl?m\$Gn%^ڢS,d1 rv՟7 7,,, ǝ% vȑXEAa542]SD38FTu憓YޚL6=>:cl.hVڕE滪>Nzӕ"\]#ܤھ}XDFֿA7\H¶Shd"=BkCj^~<\ТYw'U]\iK]* />Fx(\Jwap3*??,ƕisss۷obb7oXprr•4[ |9X{vWgV2EWOpUXGc/ƹ2LVpd@|[[!C:+I9̜9CKX @7qk]>}\*mq8ۺ!Z0~gz'e!fbh]}3i(#\Y<^UTTdddR ֣)A'[vv6@-owЭ_u~L;]죻U}ic7]=n[/4hB鉡"(3QFħMCCC8n0vÇ O4O>K.%fWUUr+W,ГWu~{2HȓU.g8QtpvX$] [eۋ3fPn>PVVV鸰y5ccmrfN3^njonV"]޲`чz%eKzLwWKRwEn۷OOOF+)&N Z)K***| @37]oRjXQQ:L7cFSDWOb)1AkV/Q?(R݅rՅJ'''uu^z2-Dž&~L&=h]V)'clL塹UxQ|MIS&l} 2?I68'J)+'Mn>|L&_gggMMM¡vG p @\EC r:r|>P{7y_oI77TѣлS4]QJA?Z7vpرcȁZVWWC P('Nm4-a4=qv7\G~R#uh绪x/Nin={bh=Z-jC+Jux=5#}'OЀJyv|Ց@P ś%?k]7TR5*",jVJ:zexчz6yEy'b 5Ɖ2 .9*=zpɒ%_o>|쏲+CsUy67'K7reM_,CmwQ[&/7'I@߸qcpS\PCê} @8,kvWKAڲΜrFUX^|W榸 8oч:drn%j7odSADǏ42*X[[8PP$Nn2:ژt:+kPܷ≲Q|5p _j=5$>,BYub>ƈw#"R%@ROnrzJII *h4MM^ȇF0~hu=L&C>yaY :5h@B\VsOs6_歕OU/eKOA:QbQ ,vWq}&#. Mѷo)O4GrѧOss[n5MqfHVE.AE6dUKAE^B7sіաrMQ>mBagn?NlMH]B/E] Z&ի?S?cheehtvrr庞a . t+O8gKC)'e5aY1f>Uc 6M'uҨW縋7Ǣm.F ] ZD&섐-bff&ѽ{^jUAE$Ui0g '|F"sٸ4ߜ\^?R& ލԤ+2|&WF}~b(p2q;HROm!UQQh7&L4h8|E^NRt)De-E@ضu;UjLl<4 gc_f'ȱ:76Wڢs2xHg; 3=bwww("9tPYo2``1^ $[@^!c#i9BE!h W'2c<ҕtG|4׿O];άSE"ͧ+<7Bu+-@L:Zw޲r劰sKYلD2r:h:~о&k95z}4w1ˊP@u~Ne7+`A\wz[hGBoG W ZD4ilROv:'7Y2u,;[sY̼ >4䔝=b+u*TԹߧ!a\l5x^nCCX wb͟  GlQmoo?qDxC\TTT>,JJJ:::7nܯϣR$-) `I[d*g̟ۨStun/w8JG|*|^upEhžǏ}vWVV?~XT5~f @ 233>~I3i$[|GPQ!`3䒨3DR_лno]^p =ɧN:vX#hN=dNܹ#ĉceHYHhB$r\tc,:Ӵw4:R'Z/LԆK˼/wdkJA׭I} + b ܼPr]D(B dE ?ࣝ~& Vpbs(<]t|>Q_oMVjw'NBPWW9VRR222nc拿!h [,hJw6u?RGvY+~& c|񑙞Ţqn*;4+-@Z[[CAی9R1TVV^zYUURK@nx\沢MMMy++mY 䟊,%!Cfe0LD9@AsԹQ>m8Ne}e.upݎ2z#(@/Y v:FSUU5k4LBqhpzNDi19{jA!_P :|>6,\m7ċ2g.n7!Kkte0)!g{VV1t OOːC4B~>)h8QIlon߾=b8;ļ˗/-@c]ϬL8C~+MR =tvulwSGA]ESMoke1!UtgEvj{˂ }LmINbޣh-Tw,@gXkHmwu>'RTQgp#Qkg76xXC n/-d! (r׼g!hl¡~ypө`MwMsy(QA8Gg) x(;nxcwyh@?Nu/ٶ۞X%ʙ2tPOOOjh47^!^ԩSqhR(t׾. :E{=5x =k62tPN?HpCәU1]\/i {-p84P\&Szk\OqJ6vzI˃^fA?;OWvjCbVPC4+s|6]szҤI;НI:Gvv6 z>p w7=4݅.un'B_%G^YiV.nfЁ@ߎܔ|('Ȅ t:t;Gg ŢP(49$%#'/bsՉ~"U]֕wk<\c 8L-^MgӠ8':ɗV}̘19 zݫW/h򫪪q3UUU }@AeRiyc9nΏ. 0u>E; *Uq=䲆L). lʝ6zNz<\WO -eP;NW6rvڥ/锡P(hн)\bD*mHݨes*[s~\/*("2_gِxYJw Iㅯp)NUG#[M?s\gE95222,,,p@⨪JÅC%:Np7hНrT*JM:ũojGf L24W{ڵۏ߷ZWSH3a%X!oSkD .u47΢V$U(իMLL`o@5j.E+++2̌v Р;ןy,_.Dͣf% ?d蛡dPsGY9b6Pᭊ(֥݉VOy|z(>7o('_|uR- p?h h((..644)dذaҹ<~xt+ -+/7 e.ϣhn{2nΞhi_+x2|_D `Ep܌-ys'wp߭[+đd]УuxtHñcZZZp5 888-1=@A+~Â37ԭ,I3xL2tU9~2 ϲN.W\w:EȎ*g80Kv& zZ@$QO_\t钺:D H3CNի˗qOhk4)+7xKiTj=žb_pdTF4¯JLW{E Rpc[a6'w~2δV n]w(Buu H9&LάhUU~s;/PCdwwDXan38LܲmQmpU<^KԸkV"[t|p1";'ٝ뢜o޼ݻ7 +ZhTTT,Y{:@M`eQ#9Q +pS7*qy68_yvpS5Mz8۹=Ӕq3BpwK]O@΀L0zh)M84q Р-6W:>bZW/͍XS8juC~z/7> */W2,:Ŷ.m47 kSؐա ,եR03 C 4Hڲoll{:@ߔfLf/yxvZYSNztE4aZyڕdxċMI:Ms4܆:B1vWc,^mJ&~__x999ɀlaaa!0ɓ'4n&ۦ\:}dNĸ/fOĂXf){>[HEqŋgg8 1ȕ9ԓҠtȃ=ɵi dsojKv7MOE/mJJJǏ@AwrO`.OhgAK1~SDuDE7s %Q$C wU)q1+fŞPGY  5@k7h>chvɊ9Zɿ|rt2W޽*+pLE @<${-= bMĬ9abv'LKParw2YMtv$!׊27ƴ#4'iW~2Cԣ(|FFF0 H[~Mxg]Š4ߕm۳ V/?1~ ~oݞ@.$4zs{-j> _2#<6eTtvC}/Io[]yrYӾBSS__߾}JU:bn߾-g<@ fg;bςX;څJ1cG6r<-pӨS*Tuxth|.)`#ƒ{#\}vz@?L͛VfX$:t( #GtAh4:<@1ۯ/!g8wܞ:/r/&~r j@(-N%;^M|x9S`ACXSvZy' KשT?;ϛD_VRRr9cԨQV"z˖-4'Oj}?9L3Lj)A%3\|>=^C8[glsX¼Dˇs'#nOi}UL;@p4kFYSgA,&Ɨtef&0 7mR^3cjg)۽+fcS5]iju¸"2rH777K "==bĈ Ƀ!VȚ>t1n˂!/7'pn>ꮜhqEg%[/6ĵ;!D܎6zW:<:{D,ccc*o?@9̝ = byҔ_Nx%Nh;n;UbȘr&D,k?jK]qmwFyzS РlZ4n\W3[gMI%W{laEJʼn[ i?mXg\.SiJ̸ktS극xORqՖT qM/jB[ ۷4Զ4hճ:hPؐ(*\gT,jO}9pvUYg_ɽQ~47?܄1k$sNSSSxP( $%9ttt bQ"SS7/M~; f8Uo6}!"~e3oG!-:nBsIkkkP4Fٻwoip? 'l6b:hPN-jNLY*H ~zR?D YEpzT46~W.V:C}'CHq~!CS@111hBBܡ_<{hprٳ $L9~)TV R ;ZL3+t!hU{w<[Ssx:'JIheee(@á9;7fѠ(1?z⽪kDdE/>.fE_s?Ԣ=Y>Owh'3lNպ@*Џ(ʜur41d2J¥b'%x5,@ݡ+N=Q"mܻ%ͫ;=urwJsx>cB)"?Noa:krs Vp;VG<\1cǎ0aD (2 {]SS@eU%kDY[ϧXPLqE+q8-o'Z7k.hV,z Z 3Ƙ[|?b<[mllP@QUUvߺr݇;;;s\35΍ q{?Yf^~ _.Й\X,FޛZj QfFIɺ"/Vz6M{3&U j*={C4ښN. @yc:gMJ8sᅲi߭/teL9ѣk/|b,;hB+ʆ-QVdK7g?2+~ʃb+BnLVx Ex qU5Q,Z֬XGxKC,UWx;vLKK iphUUÞ!@!H%X19-ж:7g+ˏs,)xgqo2?LY@mw3~HyӬv`(ܿhAϞ=%=h 9371&KО3焍i՞xk^e.pM #}[=;=u>>n$uhx{` 6wlZbSRY'o^P  0@)***W^`@2;b|v$ ˜8aς6N<^~;rҋC[=蕫S8㬚;HbWt>j!ϴo!܍!%vb?544 L`ݿ@3 @ɈqNGFeIS۵g"[d/|Oq0Nm}#`K^Nw= 5 ru{EهzIb1~ 4а_>+h o|6I<+ltس m8Y< .?#Şgwz=/6%udܐg޼06N uX6+~Bhx/8/K:t^h ?,KJd[uܞyiX{ďqYIXiGօ7tdBON|+Ҡ)\smq>m5b?W\RJU^v-s(U%Λӧ~ELgY_.KŲ.䠻Uek‰18bZ7Y5hx*by]l]6 co(sӃ*շ+w$(}zK>9KʞHecp, CA,{6$¶莌s0Ԝ8Yv8&cن@?M1.*˵aK4'2;#ōc$+с@gq$e\fdbςXî/}RD|R~X_I\nлYGó6-tf]{EE@uuСC!L4JYk1FO=fx?dg,+V) ےnς$n{E-/WA=#4?_{hwd[ iG5n `ݶ@scлK]Tٳg@@ R>MqHYh `a)SF @vhI1mJ.wΝ_%M}Gx野E7x_Rz }N 'n∷"wi <ɓ'C2j^t]l Kʡ}}}$h ]X,>n!]by bg"9 F;eם8o]4mt_yYZZŸ"=uL]iA&shEAZ @`0 >t1aS\Ξors2TcVq}*ٱqN%V]]ݝBO4[뢲4N\sss(P\{NF%Ľ`o.)>|5k -h E7T[6}bq_W۳ 6-ܙ^]ǯZJt^[Q_wi;΍kH|7ewUtgEv]ZZZ(yzZ }>~zȐ!_} ˡ55gJl뺨4Gyxx@bDzS]K0ѣ-Njz#4V~t=id۳ n\>#>,s|*2*q(qˇw>{B)5YQ4dBy3_iWRG vQ&Ə E q;$9Hlzȑ.\hn ՚Z Q[gMsN&]RJ˃D܇DeUc=!SIjUw;5ZJʡ`2hd.E"<+~g"[d/^=y%APRي +ƴ{pkbP\Z>/x:܄[kOnW%QرN,sjPꨅ ][`pWɬC+++g Рji2f?FD߷{cVGJe(/=ґ'ԺG K [t>lx5L`$ޤ Կㆮ 2`wOvcˢ 9a6l@h鶥$SscnصRhςضio6WuAK9LD]f9U4tWc,;!_ۑ/3کb=wY]}ppp8q" +Any,X"za t-U/.qZ{ďR?.N~ƽ' b*C?~oȾ}F\^KF@>Mlw]؞$$$X[[C\jSEWȄ= ⛕ڰ@Ľ}EMeXޙ#9 6ozs!<єh"?2ۗ8z*Kú'QV䇆p;K~2sLxo\hVD 4pHђHQ/I{3w^ZثB=+JdE%QtB M`8)BVJ`9z 2j | =RMK*qKNY~KE95NJu)tVУB{ZUNsn(g!>wiP)+Ò%K^@։f.$Q=`{ qYyt ͩȣHY<~De#hXlP/6%S5B|!T?л<]ʠfEW_ _@ JwL}$ѬU~۷oםyܦhšȣRJy94Z^a~fݝ"a;i `wnrNJ*44hu=1SaBZt]dY ܀h <dx9`je7D(m``Сgvyw\klu@7|>FY[[4}r˲ӝٞ$Od["ygA̧O0틟`eTUJKAՉ*gzyRuyIW_.֮]knnh?od?{=pj[[~u*[K $!@+=kmK܈ 7nܨgiKC$^9=}r_//=zqaҰ42[-Ыǁ{]-8@Pߒ0(w~-9o*j 4gtPg s&=1=!8kرs+ꤤ@ FPP6~j29#cU \{]g??ʕgh(in$4qn~ѹ τـmO-h͠|,>؜Fmǻ#<^-\~ihS^ fJw}|"r"CZZ b$س-E}Mcv rԒޡ---q8G+ ;K61nZE_$nE$t(]Ky UDhIs`¾ 6ߋ>LO{5~S$s ¯OZNd2YKK BÛ`%'xtv̍$?0++QJJ2@Ca~`~*Jo%h1/)l a>(Pl/OoYOj @w5>.w5֩7 $KHAfP ՞`8(Ojmff [V0-XjUu&=WK㘂;U/5 8{+aդ>twCg釙=/oaT1H j4*>_8JWft =v؜p'hqv%bqW9C?y(x*{1vx1?߽+V'2iέzE}D,shva2jjjk"DSn]!_~eS -0}[>/#.I8ŸM@uLӼZT e0ם8^36M.?ON#`ldDթ>b1/B Q  #==3%SwA 2J]MV{E.1 UlkrfrP"]T+v '4z"Pglﱐ `IS,gG/C;TWWȀA =CtWya G7~נU 顮Xv} 1"jn'X_9d-ƴΧI enY|>¾݋0G^3TٝΒ,}<{iN@;o}8ٳfs1d MMM@GT<3S]F! F A|xH-<΢U{jezE,zp# vљ00 }R"Qbh'''0kR1)%{' Tj 8َ8ykݥ[wޡph[t{H wm 瘛AD{A+1 &A)Ƿ~i&0wqҞȺ  ?![5?;ن=Tm[ vU|r}(?,|QGi@ϓg4t tgʹWKS/ ,^ʠ!/uI-90(l[3 ),[n@bh.2#þuTD\((އ;΂ClS\IQo89\ =vvsGIO^. ՃzýT'A_s1ѳ8[IqIJo]Qs<:d+6YG{[PǍ8`-Q09aܚA@͇,Ֆޡp@#WS9n @SSlBkExr&+7ҡgΜٕʾ曔P2r3snf=),Zxct]486RV9w֓?tqKl< ־I@  4Mlj8w`s^~=n8>acbhf$HC$b7{ fX'))YWWJ=b>sU7jjX0hmQATx:A6g^tE%ixd7mx +\:./x k̛T4>G!_a7?{FTyaP1H>/^ TE^ ,a ],Kr:>> h(ȍY!]<KǮMkI+d%Q`QGuJoOg0D:7dp;F;y`5}M3@{H8O&BD0O(o4lA/RX:tKK .qFBI8N1 x#gc<6,n WX\s9-}6)}Gx/iUz5³\Rlںu@!~I(#9R&bRRR Ш-D7.X8q,OMgaT6 !inߐ HX\͇]+_& Cqd&S:}8 Y@WOy=@ܠ} ٳgϾ pAiXDzD JŚx*]"##@+\huu1 ^v7} 64ԒW%H)ȋۯ<9g=n ;tn$Ɛ,x,вߵmTyS.n3҈]#ܨقMz322266#]ga, r8 R رc߿ -hʷ)hy1\ &;Dx`ꦕͅ5ѥlUlIeoYbHgq$Ap4nn(ޣ}s ^-H1k+ ok֬QTT/]#² %Ic@Ʈ*@M=ڥ| UBw4W{YA].s {NaD > 6ښ!j"$x(4'qZ F~k}"El^]|:,z5E 6~xPCAB tNe41Lgǎl:55z%M4 bT%TW!X[[۹S%e.Z^kz!=5 s!2] WxWև4'V0gxFnIw3jZ< @,A =&Ꚙ B p$ QdE4k_X+bّ 膺ںƎ*rWܾ@¦S6M CDuy?z$hG{CKn9NUQs0k 9ZW9}B|qonxo(86tݯy˔MJWQfo f￷qpp1b!n+iE`7SFիW@"JB"@M81551`԰VH1 .lAoߞ?-uZ;=q$q5y_-a'J{oe+Э,ᦍ.~ZY?2=pq>]6e \"z<3v?{ Th+k}Qg&))4ϵ a#AD͵)/8JAo—oU*S1ߙ^No_\7#&}CZEd[Iĺ(W̒ӧO!=۲LhW7"'ęa#_~ 4vQWWC8od_3,uYu rӫvxi:ŵ.ԉj)<_(y>̪9ZX }{RX, )A':]H뮧 =6>| Q]S.Ij]QɶȫZ٣om? 1$5'xynک@39 0;^;Yڿ$=!K7vu#6N B)))0:hbW٦dcl3 nR9U+߻<0Wc|MXrsO'L$Xi/h?dwfi]-ۀeBR|Dı7#mFX_Bze۽ @Hƞ)sYMāԼ$A؞Tmh?kFojφ\.Z]bc`Gj?`П|IϽ^'N-X9/h>L1 %kO9!aFhc{ir>xާsGty^sA#:}P"ez͘1c,!A$]D6D5ȋ`D"񯿻IIIh4X~~\9"/lH"bEXƜr裻LŹ󛲐Kxa&\r p3gY7e)Z`(&h/z6@ބwmd/:rYa@7NGGGUULa B#R ܓþ7wnqRmyec]W~t/Sy_Cr[a+-- 9Hr=:F:gt2VЩvYꫯ@@ X殝ut¶-ZׯCAJ'D.vKw_X"Ӿد>OEWwv61;N-a3_?G%3G^&:XrDDD@ 3.;4_(O]@Oǐ9^#ԮT=/?,īޮidŗ@s=лe*;tдi@=GA &1UJևT9 96ЂZŹڶa,^l`Ex=ߏC׀Cwm[WxԈ#ZtԳ9=m鶏"_t*t͔wo` @@Gn8&^;ˤ˞= 8$G71dWsyl---@ *sEw.:o}S*6}ޥϮ3.ixx^Ƽ7кw+2V[6}M|}D,ډ'&O :BËhk$`β/H@ IW ĉ:--Zmϋ#Y*#rN>YL^&?~f;aO/y{UMw~UCR4dtą/(MKf:(P:᠌"i@Hb`Isy<r0(zܸ|Ijl ./ywaV^\5BTҾ0sݬY̙*"A'&324n@_ U}6 NwhM6=IX;Wߚ˅DUx?ۇnN@ܖS4|hq(qՋ:,bm׶4xii @kLJ΃{}v?/<Y ),7P<4ObxS,v?~W TJJ[CrJ4E7e Y:ˣi{gƜ }#w(}eޝ~0v; {K O}  + +cN*?eA6:Ug+@fff !i~`?>ToY\g8Z$ǤpZ3o Zaگ_`Pc^Z&7E(Da=TqD^ @dm3Ba 20(&;ve@Auk)aP殳 PfsV`A[@Zʶ+JgQ$~N3=azmC䡥UErS~AJJ t`{,<'Ή2΍Wb:1p诿zغ&#zTA8Yf> C\c/ۺngl2ZDM^î }GL$ 1vOQ8;>  Sn44o*XqP( . r_-YG NƋ{hut{Gw: b5OYOz{W$bn)>%~ Cw#B6Havs<2 Yل|/z̘1 = sLZBICK_=[I}5i$ q(h=ZHqKv'rg+.d<hiwtmԗ>%|7C "o!j'Z\x%-R, A;YۣP". yO b2ZЪqJp۳kRO555222lpj=u-155UWWl xA:'3m< GAPeMoEKPGqǭHjC۞izކ0'/˘sPmNz2/ߪrU}!gW%Fʜe2-Xf"@ǰdHGGGPc0U'wNQΪS} / ߽{-ֱ.+2z؀Spr 0X_V<)|3prqssedPv$64]hi[j?ϫ-P+UN< ,Ca;'ϰ,[ @X0gNte4Li`ı,S ]lj@W^o_oZ> _I[7jҮ7ϹRn?k6p nU:l< {ޜ sU0Yxxvil[e(xdgDʞ/F؞\0aEv_.e'$ߟ9뇿9ϖv'(Bm6S޽}3\9sٖ]A't~ oNތ`p0A.~Y5/i=/u 0^a^h7B (~xa!|,?Iuu8TgxvliTKUM. cڴ066su&a5")Fht Qk~3 @D);f7Eh:-^a>QT5d`t9+p^ 7aװ ޾f3ئ7j8I]s;6liWh5iZJØhσ}f12bAZe}*{+ŵ&s-7:{l;;'[ws0I'j ΀hl-.?h/?Gz@30:-a=,}ez~+_:k+1G %}\Ntbu6;9A`m0mq8(ȌgÜ?;HW*^uiN"2xC+gvR4Y룔p=Sub Y@tWdGρ---ǎkllxܹ_۷=]y0OX(qi܎cܸq[ban 9 4]@X%S+~^v棅427pQd;m/>tG_KxxĝMJv]Jq! "Ȏ{jzq4 \*/ 0Xƹ|x}~CFcbzy@dTN-E!r=zѮ;wjo)ΉLII0_wUf~@磸Xtڌt:)Pb|f267ls^W7IJYxܹ騦cs}D9 ]_ЮSf8K?sZWʔ~ān:c< *n6ڋ #8zK(Heu`6-̍q[J& f׏vnTlh@wr/{a7LrhCvѼ L0Dէwݻw #2Gu92S0c~'I}iVs3~z]qlHgyگ_uW@#4g$){3^>z&=c,R& 9$,[ ͛="#3,@CSehs+F8:GfiJtz?VV^\ u-@?Ϧ~?Z e\oۼ4AGA^/!_G ǢAG^<{8)dp8<0\~r=ҴK5aTfx>{|qaF)le eplߘA?;GGGa! t~f `Cy!188v_Z $~fN}^NRIAeZ~~8lZz˚4o2VU8qbSS􈉳EzX4"Q ]&TQkJ쪹a?L<"+aCL ˊt2N`mYvD&Dt לD@7E`a 焷 &{۷[&$[DmD~p3$Bm:U%T;nSWPVl]HCϞBHZ0ʼ5Ob\e+sZCIENхM%m9aN*dv_@ބlwgS9yq?. C@a3Tޞ7 1UHponz-͛6mjoۑH/EAf tH"L9@043B-Ijo󢐥!hy^v,mۆ߹!@vzpr>/u!AגUگ_@Fo"vڵ=j=VilG.Y~~YzcnLTO?}5E2jhXe#є/RP@Sm 4FC:^WW|Rpw-9/ĂWo!ў/eLɎ"ZwO8˼d?^=/u@2)˧E6SZfT* ;J6ˎB r^NZ*miܮ0r^Dرc/_>ss>6մJU5k}Dn Zhޞ*%%C4K7BOcXV0ݍkݕh;*SlHeqdZV)׊SK tٸ(ފKg>?>NM5j3);]#e!Ajp2M#:sxڬȴ`| Q3f>_EZ;wk^( F 143 I:4bhvo!WUbACS\36GwuZvLA+pkETrEKBaznHf=y5*vOHTEQn4F<#>'t;.:?J+}Imv#/HCvzzl߶@Xb|,3B ȣ[70erivJ /\* պjܦ| D[rkĪ:3U*hlf,^h/i*Vn=*w\~K)q]Ԫ]$hJ5\s;|OOs|Z}sLח/jӾ8<;I.7b.GX /K7t q׋r"G!?|S&q#MߎGաƺN%nϕXЀxrGuLwQ/RF@1,sQ>B^ c͔둦C+aEXjVf^0jt)XGqyW1eĭ{;BUDyWS [q FMaעmnI5;܈?`XU1g̟Wve5Gln#[4K 䤟2a/c'|UO#ߗ}u!PRI+͊$oڇYq-S.rE9G@߾~)LWu87 У~p,?Rn9V? F߈4ar5raSt }/ 'XD]B_SFR8BUF)kpk 5CtrtrQ|T{qTVVv7 *++{qM6ڔӹW]DsAs  $9?* NP#3b%.3EA* ʃbY*= VnD 0T\u&{RvjQ]VUUSSSrF8/%Q]PP'Eb#l0Ky%׼zLSb'-v. BK\CaY.dOQx\UlU! )2|$2vj@\먂@3êsύMeܘ]p}0K9Rj=y#NnS :3Q\B~)ANDZU eFfwjOv}Ϛ 9:stZsV)z]4BǛχZe~Skk6LUzT&l_V,-G3|{o,ˣ~Z~Fp2nV)S@Jܿs#탫 mmI Cv&Ǚ8`O%nJ (lrh팴&]4jr,zwG% XȱKR6\ 0U3 /8s HĖi 4USfҥjCVIkI*=auϳ wuyFH=rFp"G>E|j6fAzQ ܓptQ]f0 "A$ V۩-)D;xueh7}5øhiLHrҰBI k|En_UY(_f;ZVlU§c>Auz >&JN`IqMQj5iN~C%t.Σ:N]/jz>C8Qb;tv`c +uSAKA;zĉ}642#=QDL}!楸Y[l -Nn BWNV؈C][l?Mװ 1`F<RsGˣZaee=:gwj5EG 4mNқ2-W,/hhHm6SDyFΈel[@ǝJ=j@z#c1;ZOڑ?PZ%]i; qn '|@c.x|7NT t73<24KZM*hTgDtyYx Q~?.*I5+Go2c5UsiGZOēyֺ3/iYr*-^2ts$).҈IR+Sj7$ De9_6\R8bZqˇPMڥ&~2 a8Zakk iDQMzHsOڲW#zͮpQh=S2꤁Õ%{hبsWbY#뷴vʵH!w#avڠߺvC6l2/hH0I=OAQ(%%|ֻ͡:(vm/ݣã)|L%n6۩T/ `Z/v:=#Td9#l|#_I:9CgTf ]04*Y&pAt2AO?;w@\.WUU1i:xnx"M@B)oϽM:Դ,SMU YLT(w 4Sm/EKu[`3GUYqG,Ȋk3\Q*#[©ALj/hnnu2`)d?Y(S$]2,v-O ?2h,mm;I}9Ԩș׃k(j'pwŪT@%OW AW/5ѫ^F&}!ذCv'IeFdۼj$`T[O?ᧁ:?=]:cDXU 卵 =7]ARM\C^fD4@X,v#)'cǎ=v4걳x].Z 093Z>)M7s͔ ~e:v]"$_#] 'Qui2;J] 3~CZE?b۩C:BnZx &ToHbZzd3XhཊKe4 t/>H#pGLM<ܩ:'0x\6iuTR.s=ʩZYZB\/!)cJrA%a 0)@|$@_Okoo///rqj,:^Zݨ&v>గ!o}d ZXF׫L$o_iEUyو6 =R9eF:S8J5wz B~^$zW_]|9// 0Qh-?or)kt t7u .OG\YuUom~* qW煬R7 Y#WZɬ!ȠKQu뇩!ɟfk ~:KcK**ɿFA cY~Ξ#9?Kxgqh l\ @_rA?a)ʛP2e+Pfg/aW#_ecº|3@^!B`KDسSގ^{!*QgBK1<}h6KfչC>b*bk0`+P{hu=,H;΂@#.g]T S gVY2ehI:6rޖ-:O}kbQ( ç  ru؈͋ /t^E?Cl6ER@}=4,[$CSz4RH4h$q27DU!gFP?_Mzn;vld:W9zW>}Y`y2mE8h_:[Q TјS^`꫔鰔$: ?mB @# cX;qD}Rmk9?8f"@u 9Mz\W#klDO8h@ \ .؆)]^㯤В'߈Z T6!.7LOXμ'(l.acpg嬦 aG/b~~qsfQ]L7"֤'ԯ\LڂI/vi5gWݼPdZsty?С.oYLݒjgX.>Sjň8*VT~7KjUWVN 5#OZzٲe $>F7LրI'[/I ^6aZ W]:.(`d:Ws{ DO^~ySb&<瀣^}"Z,]HfDKO{U*_AFe)ɮ֪!{o@ MuPމH5Ypş_MxGW-Ҧioϑ_[ǑoěPb hKj$:eˮ)fh&tyi lwtrڙ-_y%gcipmx,:^IY/S&DB:fff&e?yd΍.1_eewXOh;c&lvŊgϺo1dZ=Wq}jNO$,(|;\MDT{4*o̖fEAZ̨^ԶD[8&\u˒^ w"9)nLwYp뭌x9y[nLG'@IM%F¨7dV;QF^<8{5}^1{ގMsնD <Ԋ#!C(;UnV࢘oUHme[0-z;y)HI5).yk ]=-^zI&{@gyg7&8i'/f+Tgw!?!_ $D0 QD}DRgX/ &YN:6mo6a{f3lhȝ(WjE}OKKh& bmlVC.4Ϳq:HNܚ!'$OrU6/嵝?%b/Q$Gqܭ@sO[HYpXJp>i~: 6AӕsKlԸvP\, [RfF#"햼uFRc( [6L*4sMvRʅ>E(D4OJ[,;WFD9/ɒ-6KfQeS 6 ՜N mE>Z q3¬Dc ]U'j(+8Qv̪B譞ßRrlݪΡ!q?߿.ϧ31Ͽ`b۞3:ʖvaYs/bVSn!g:`uW1{k{"u7Ù˱nf7!Zd | < 41.-+ 4( 2* 1. 5) 7-0/,.)+w(ƈ„0ȰWC=Eqa zWhÖ=GesKITވr!/l+0$ `Pew*tIT@9^5 _+ lN:db`s6Ϳl@}Goi*B'Ь ,3UecL8Lrg3wg(K/[7޻sQGi»Tl΀D3xGWRor {O:#*핺,mg;ZL3m%[51/T\@eSbͭEj[0!.ف Fո3nsq[vZw 9c<"Ȣz,bYҫ>dsΈ CȎ[a[~(8kbpkmi~$J;iШz#r~v:Q&&|4{F\??{+QH5!*aZbL*vZ0q,tiq Im.d5/bƅh<9JIm/No, u4x 6 S s*<0]?В]T6I˫ƒ_Wcc#æpij31I4|AC!U{-0GW0Aij*,;fu!nQx[:xA';vF*ou?^y,4.a1C:c&&sssD"hvve˖a2/U`jQQTFag<|inTw\3%:f˯%eҶƶ.8t9w;XU'l,dun-}!fJ;ӊ[Kg? nIB'П}{2<:f(ĔOja2?%A *@Cۑ#mF:,`[6j1e'0\skq9 _p↥X8ShK9op^WM? 5hO“cC=Rd_ ^כ_MQJRxg@}eK*e9}q†A7POzҒh1$ހci2ae:ʴEO0C`ŽnL9;Ik.+ NlrU3 ac&i?>2pxZ_UMwUp]쓱 {[.`A mggmn㮳&Yq1wc{Ew`/4<5F\N9Bt3VYf*X (9HynGSit{ǨǛS驀No'J ocx&M&87q eɔ\N6T씧8im+ Ƒe*#pthH@ZBL#8qg}є`̩k4Ϟ\,<\OlKBo~ g ?  wnNoTZ Zɰ]';l F8LMű.S<[Vsn"v$*!2"=M9)nL] D݌RCfO{~r6)jV2/ѥA_t 愄e˖]2C@QXTo6$ނg7fƉ )IK,KYZQvԟj\T/2[nMi Jr`b++a@5^fmEFʏʯ ]%s<0C%h̾R>2#+N_؄ţ{]KUE< H]/:>|0EuiO~T 2G AຟR/>gWSP ߒo.dʉrU7;V\u%YR V Q|(d}`m&jW}hT6nM6 537e>6aEZ]*bM*q+i_|ZO[p.4wC0, 5C(չ˂Ԛp dx;SWP"[cvQ51?{:HWk=g1:/b2fNYXX@?d8 >.VZ PO.4aO9H>]aVOt$*m@}QE6UZI][f 1b<^|p 1/gO[sˎYv?t-EM7 @ 2/ڨq!@+>};pO bƧYik ea8[3)ZmMwt!_X lc^4}!(;ie5Q'ROt3D71pMY>]`f4 M&;TBN6nA^RЌhC>=_o#߈& C$f̥YzZfoczgCQhuD?2HSN@M#i %f>x@7>}GAfOY`" sSG=3Kv Y{yk\&qK\-0gט5sj1?B)-뭬_U2\bmpSvUB|R+PPz8t4\nJbּ\Ϯ 贉 igZh'iR4 `(wh33`nƳuZv ~G\ S) dΛg܏p}##nؔ+0CCVIQr~V>2  N`<1xO2|9 fTe+َH+迊1g=!D guW *.-x-y{puYrXJ%Bb@-ИwbN-v3Fokn+PCu fƺi)yKXpX&ZO,2)ѳ='K ŀ,e@7.W{!j )5 Qwnۀc7ނgk^pI7eViX9B;862lBQ@[͹Iv*Y aPTQ"T-eU"rt4TNt#ΟxKmD?@cccoPK >h!-^))-n5PrlƳ07h5e|+}Du%IN$s[ -yyHa#}uSABh?r$"K7NXVPlαʢS]|M; GTEzÞ*-[&../kA}RM Iq1 գ6sFQ/lT;n*$TRIgKɒ^Uvؗ2j=$G|Y2Ыzd>h`)j jc&cr@h}e}(Gxpw"8T#9 ׬XHAsssLx nB}Lyc1',u:^qg1V*8`W̓A3*os&@g+աXNo4"VZ`~vluAA\#+lr(ʵLJWK͙tn:8ٖKBYH;?@+iT';RLKkW;椅-:{T} EX夸|P5h3fS.2t5_'iʫb(Z.K ?̥9ylӡxP;E/n5.ݱƧS{޿PcIDMtG*.~8t8A$j#I[{ @z$ sW:._ O3R sTK??G(<o}u*u'#G~]~;% UWTwQ%G'S1p1ZvJ;4xTRK2֕O^zk[S}E!u7":")@@%%% ԰o%)HBDU'㳓c Ǔ#\tDuӂ-RJr):˸蘯<}р)9Jkx^;fɇB̒#TlM%ulydGzLoG[3)n_s)s z@IzGX"ف6,VKU=։TwwڛjK ϤH5V$h kyKȇ;(Źk0>:3љeW9$@w jP!9_{<*{s8fkd-c&+d鎓sJ ?VUr{X4mwݒƒ>"޵k2nǎ $ Я={PPrɈHtg;9j>y<31X_Y2H{AGVpٞP;X7Tˌx4/:Il%&t ,MuUބ=^6Vvď*yaSh>?h[y=."V*bAv)6'+NW ܻ{5/ i(?x1]kήn)dh:i7 > Nh'HvR gOoL_ni.):XWbEB-QKYL80Hř8q'-A(賐Gk )䔍~_`tlSzU?{}LwĦHbD̴Kw2Z'ǣ{-9A2; _~YSS)7uȐ^5 LATpz$ׁ DžSCÜ\ ŬT80pRrVK?jv*>w{*eU< *j`ʔ\4wXI\GZǹk+[ʸmչuc< <`C=f'_|ilag TؠdCR`gYDlٲJD_G>&H`ˏSknJ tojXt&7=^]/S)5.'=_ 0ZQPc{O:d'y'i0#<Q$֎z`W8)Wt{:t2H11:CZ?A[Z)XOIWnL]). _6F=C`~ٽ0%nTSvS)\"1"bvejT2F!V!A9E#K7w(olva^KpQXG]j[ڭHvrUly砣HP@-%w} ^="v<6jfRv*q>&i>ه=T]V76}cs?3z/[UmB_|"޲e o"I#j'&ުpP>zG`xS#]+OJ9?!c!mm~2!Qɦb*뻬y1 8 c 8$2$:,Ϋ.b#nKRőS{(ބ#NqcO<^̆{![-kK63<{ k:}zmx6sN+n;~gaw1o˦%&'ޚ}:- Hci+'AX?Gp3g'҆+b CQ\->4E/Α[3&$9_@7- bjhǂ "f ^6`L΀p o~[ɎfVOaNjjƁe9sU:5wDǸjƹk{$z%3Lǥ 1=j~4^6'm`|Z ;S| =N~d0Ax{qxL"F߉ݎ4fލp]/gB54&&T|ʛ+ O'+>\|6x2)7=tjHz&Xx ~H bw,侠GbN$WuxbљĦֺƪ+MýcC#7gޚ}0wϞ>y廃dn'| `Q,v.\(|J;S7C w}̸& {Nuϔ^q7>3ٰZS6=vLUP8t;5Y~^J9kgkaQghjg/SVyCީX!],NΫ_`r:GZd^7BFzaRC\.>m4X?@@Cհ;F[E;fSO)l`N9(ّG1]}N p'ڤLX$@ Wy 4Zc㚟 4'''/bM Jڭ@/ UXX*jc~jd6Rj.Re&h$ϛߙyHxI{E\{@CiKN85DO?@zBHjeJC1z'6FozD YKp֚LS<6+q Fc:L/_eU!dvbiDk2(y>0Y@g/^~++ng̪0$Sz/yMqJ=vr·k.T>,fJ3#S3NjgW/ÄD;.響7' SG$~ 1vsB ;v9MK<+ Զ=9ECTtc+ԳWQ<K" Ac虜},--~R㦇IGLr`(7 %t>ES6L/kE. ӒyJ'+N:I/9tJJ  >8$5i0WlUQDG;t;Isn܍h\刷Jڡ03プJ]Io^oD`Sv5r-(-!Xi"&.C\tVQ-rlwi1wkR_ǹ9`tLi;9ZHHH$&$$TWWwt, qPDTNnMA  WSXi%W$w+K~F44J >dާ+aSgUiٮw/O+ DfhL;;;6 ҂[Pհ\~W 0<+,$` (b#l!*oq{z$K3ތ(# pk >J, `LZ$/*NQm/3NY#Z}-j(u))n+czcqXG,AC@TWW'$$/vcpщFR&S^)xbS5p6nPp8rh7э5)rO01uxz.CBgYJvb~#UUUsss $. Hj؝QM:0ZL@:jKJ};lA^v,Us;J>Zi"x%Տf`m!dF-} 7|ø)Ϟ*g |UơU*=ez"KjE&U?8*RƼ,-j z4/c1P"^z< [N:Src*A t$kk NRJs%OYyIV6%|Mt63GJud#wIE$ !W}ab'I  36NT294ھݪߒ)=}јͽFUBU.`N>gYyo%A*衞V/c1d& ݞEZlwobyimq7e8H1iS؀=pRQC̋g#M!cDlٲ .0@w4^#9Ah] oA.!ܹ"l:Tj} sElW)~xʯ9KACb@ !oBddd0@_2G!:l56`sC,'XoQhL{nnF^5ryJg],Ax4r =MdJl@_(8@!շfV;NP?H)ؖMO*:m$EqO {/Źc6]6#@c @Zl d&n0Tl5t67ZsdkH L~%Uңf{Ki[>Ո֖APs)*'uQ_L X e*rlH_?)P{X5yR |"N85.D-!A0 Q}Vǹ4(@7[uSdȕ_?"3p"HA.GϠɚ6\z]dswBّ33Tv KG͛A:`N$-b_ 0qSX?R|A:b6ۃL9w^n.uy'Ay. A@oܸA\:چuS @h[J́;B`s4VJy0^VL3azTѾ/m(?U>\ ,$eD?0@ٓthQF_2nPtX#۸y€b#ś)mիs|nriJ>9_q 0?$\oNL UG$П9 4A[ 5܋Ã4Jt!Ù렌ƫϳWRDm1}rsQ ~,|?y$B8@Bnu:H0@[p8&@){d wMrtY(7X5j7 䑬RmRsב\g6u -N1@$_( GԹQ >lQv&;ň]~:"mjhf6ܠrgƞ}|2Sd/HEEEIIAXWB?i&t̠3U;ؙ;޸ @ >F\ 6DB,1r=hJ(\cxɉBsq4s? #^ 2'S Dx&&E-.Sf•_ ;I2v:9$ =AR-?эwD=|"F@xϭĔ?3?73ߏ{ rLU<t~&ߩĄ#ь@@-v8@- c(A;C(~@ {Pk1f~Oj^kžeI\o9CSN/'s@`8m&d?m9Sƾ.xeiie\DÛv3 c{sNS@k%9"@;~@Ƶ,wݼJ:ڒ<{)>%ʳr`as ђWd&HnoH5qeIlY 3S Хp<}"|@A[@͔^ J1 T2W~ s<=Sn A8)n4Wx%[1lĕ~-7eZm]r> ,b7_B;w(2}c;  ,U`u9:r;dˬ> A(fmLaG咯\wc KjŰF\~B*{~wjhإjTm >DNvxM!4/=͖YM=7Q.Cp]>$S< 6L~hAɛAboy2"Zc̞-Oa<l)9bme˖UTP/t_G^@^\3 # MCV7ӣ[S% .ƣўr}V뿯ExKN <R~g7+#B`Ͽ7"hCTX[ڶWk$h*V hDQ<P$mʟdeiHc aO* i1RvT oGC ~u&k6Ufznʁ"b.\aC݊[[K.H]?  7|ssxRaU_6{בSc`?KԘ};ڸH/Х )DWʆs.]2p+Xv]Ӛ֔D9KjygQۙ'\_N 课jhhh\ [8[Kdˬnk{ QN ] 5u4\#T&sLԠH%E[<m:W3\n]}>vz2*o'&&H>A#ЂrSƠBPԊ:_ÉbQk0Duܵ.:*1ij)4*U8ԖR܋PƿAъ\5E5NW}ҷ@O3B$_[H?z`F-dA1^J#\ p4uj02}>cME75Q5,wAgۡrcWlyJ3%_v$otl^zlX[HKu%mU8#fpV#8C`m;Sqp$K+Ī3Ŀ&j3ջut1 ( GZQ@ \%uZ_)1uDx/@ 4Ltl.Mz^t̎W̱{E7Z|c6SX1lep^dұ/}&yc5o}sJB-^썌@+K76j "lqd[* ˟N@ XHfd*FˠTH6/g󥿭;~̻Zs10V*.;-I>ʒXLݕf?tk+dz/~hD*%FޟUESØT%Gt`N%* ,e}eBy0^~j< G0IA%+N<#[uϔ)ϗ:.e<+ջP&q[m0l"ߕZA.αWQwyg 4mht,χΒ ׁNJZ9], cU=M@0TSzajyri)$}gr+>+W./y/z/x-Qy.ͻ^sA>nT7--O8D "_fHU=Uh^f_)tK=R`5Zޕm)@4+ {1^ 2wyX<׃T?#ł@G^" 0!nMT8aWG\7 \]RkTav*7_'Ab\*/y^ݹ/=u9WYgiGIĉm!D|lv_}E<XDm'x'.O͸zJ{P}d|),^S\SZWYrCm%@c5P[#`ڒ₯<8罥ӿP'NH׃º~څ|}wP;%#a]99qdDPPgUf4:TP)0VQ#Wxʕ/*sbVA;  AK5.AWld`7䆫niW>0e?ueoΕgƉsҞ}ܖm9VٹaK1ۋG)WY ̢J:ųibq=J}9<]DGs30I0-^,B D9TZA,9 Sm.*0irwg@ t s~+,/J"W(#x0It)k]lRL9pӛ+{_:sMsY=-)&3XqR.OyJR}iX>A+V( 4+++z˝ĭg؟gta#u 0Ȼs3 ڂH3@kOW?rRc-՛C&ߩUce[롍A.7^W{)WCMg]pڹbѓΕg-ۈZdsG7yoĒP@g$ h yб?7cpmO<|+;# AQ][e.È@b1g6R3+_dJqRȊZC,1 zpuL{uNHJ%aPxg([eÖ\g=%)h _q*Jmjj'&30p9aa)~)3y]OaajНjS˟Um4/ȝ|@tf"g:  \ngDZ%mG2DP8<ȃc^uر۰ pɓ' d;fւ_͒xbu~dåYwk pi{Dr}t=kǓ@ίO!зt.sOgoKJQLBϳdNֺi,%@ _MomAo2i〣Q(h-t##\CDc6ݏ1OsX]خ@y]tW~/?!ߑ| GQ4{{Kjp7s:uBS|dJ쌹>Q_`qn⇰sߞM5Ԧۀ:L#ER_X1{]s|Z {7ĘV!Έ`W薖2LO_舞ώCq?!|CcIØZ9W(r:ɕ?SK;Z *@^ )?_Sؤ\.fݨ2\t"_! .̘qab`v f%@3/T MMMjA@ɱ갢"< cyJQ ً_,W9%~( >91P @v%BؿɇKy ʿ.ϙ|-~@{GClcݞ*cN=f|JU3žz/[taGԵՙMDv#t7w64r* Ĭ{17|cn1tQ2q1׺bm$s^OPTC1m:bH3f6`"b"{L\RJFVNA  uOPdGTyL[U&}ɳuDO\@~S9Vu>g}Q۩Ňxd.H,K-n+ik%,B=Ps$C;N/1;EqF+`Ôez.s݆L+s<;fxH,_sOu$П>;e'e&4:J:3{cV͐J@+_h^u슿9^<6ghcc:75>Lm$U7TW"Rb0Uq7BL]WQCbf Nڗmynz¾bR2䃝B]=4{\ӏn|,eFM=p=#' X?k8+Kz zH !^n$͌(>NB>yʑiIl_'ZK4َPxds) Wh j'g`ÿFۙ$'OܧsN,&qBخσj.W,.7j)Ζ. #BֽRUmIVazN۩Ȳ舞9axLFI犇u˫8+{hD%0Neh^/AtH/md10q@ X^BH"8+N}YP_ aD;磔.~kTxc)lx<I^nYd^1Ж87:>Xg-wݐ r_Q"w[( 4??>贈kVgۢW_jy_qg>KVNo)|2Ofkq'9)Y)8닚+^?-zQdkNDL$E'pMB:iw vR3pVғ`Dސ{eݩ+!./6A `ŹJ"9?;CY_NȱվUV%wFZ~9fx>lѿfOVo$&&ǔ][a&^*ARD{fF{.ɟȕ:L<Ob ;o'a m"`-g|,-- :Vma"euU 55(Ⱦ|.ʠX͒cȸ w6绀? ߲$(];ך7鰭@Sgz'gW>y %ާh$y=F=&e,4V)*<.uwHO~/kޚ<~fA a,ouQ6u=e{݀;Ӻ1Hd_%E-U9ZI[!& =ݥx86?4/}3Ds8Ԃ#22r 4el hS <d~|x8ߋ0Pon]=|K7J2S3amKM'q1G]!BrP+~Hࠍ0.NWڬ_ӽes5[;= )qu4^V"fNSF@ zx9X'jh8\I =?2y-/R`ߚ4S4̍pjsފ t%l?>h$B 9v] 81JKi(l*j}˹TJw]PVcE"iFM!l-=}IA_W*1N{ʃz>qEgoW_}urrr U&=64.Bk  v윤@ZP$Xn*T e8:Oީv Woڕ:{2%+1Nɀ1g06Ǜm͊@늞 q)^l#pM'˦rHi/Sj$@ywYh*C47Yl[tzDd{N vƎ1(2N\)&L}i/ƒhCIF?SpAe YKI3(7A MWz 8:)&<~ ʾUiVz=k+ؙcU*;:so t*3m$yE( +{h8\6`}l 4IѩwAFfƧ8h~ȶ"0Նc혝JK o[ 8~(?)t7:򺍃m.}Zݝld 2GApK ![{Foq8B/O2-I0l <1D HB̨8)$|||4{6gh[&L|\֓`,Ɏ'(%ɶ"8:يV9=,}b};UivͥS8CyqE"_q/O.*<_Phcc}-Е2hymzJdx [@^׀2h C+hhkN{nosʍoɦ8襛Q㘓$*{%_4C"f75f޵#1Q\vjb v56]u^z(  J]]qpw]N%l;yV4A[CwNILL_fooO|*Jm7;@o>}omOP4Ɠx#ʛ u QFcul]bQN 5^ w;)&p_|:aqh5~7u I%?uF<"ۀAKCv": 7^74ӫ: xQz$H̓=#u)/X, i3gF+4D?gܲhD tDx6hL.CsfuTjH-RAS먫^94St?лM9F{vоłR';[e6:`/7>`f;Lbtî DW%n|4UyW?75WHn3>ڽ$W[/@I> -gmRW:g$u{l/Qp`0<W|%*))R+ho-madGepނ`-D!{Qܝ8=_d{Lܦ{0Q{'|})[pķqQ,,,۟ R}'Э2t!V'k9&I3PT:qX|C#磗|EΣ yaJ@jDx>8?)j &?Kx3H@OSF ΠԈC[}O 09&dis[n˿zzm/ėLjqt3!&MEPy)]w}`ȤLE{utt|0`ak 0D@K 09V$0USIM,\u}8&Ua[03x3Y_\a"{AeKi5 @xV9}Yh3Y&7Kq 1S;!jsۋ\~?#rSqh <7Hj)t/3&F)W;C]3D ~Ny %~w0a0!Ё4ⰔaV<g+m p~`$YxVQJ=w)S6E7T .֤͊L9 S+O^CIO:CBlPIP@ZWHfk鉹R9?aOB^&NyQ${ siO ?\xjjj ?TSlv4ͪ#z< 8@[\tH_ yS.?ӒDܩlG`6efbB_5sN^9 o_C&LJ $PBǒ AMh "FR5 Js#;*VÝ=8U/Q'`b'k]q73Dmb~TbPko@_4ӈCKx"@sr<BB]t!]\wHkMyvNl,O uF]SbA„ 鵸r_( 믿>881W`A uS!7$߰W n)>3t 01Of]E|scSml$+H#X[v4pP:g"`G-~gH8Gq|Ku ;WZ_SZ'1XaXt &$duj;³@lڕ4ǜI~vj RqLF"dzBsjbf XH[ ek*~ӃeIgr퍜pf3]gR/Z<$:wG +aE'FN!Go@#LTJy^'ϞWA^Hh-yHYq,P8tӨ#uhwѻݻ ?( ۶`o s:'FO74y_Ad{e8U"?GLznS9'I8ӫ@wׂ7,++yYQja,u]*[v8@" QIF}T97 զYuD۷Y:)1>Q=~C"FI_}ID FrA,`Mm i v$ `֞ǛnEj-Ώă|t{.EL)|Uwc.%hxW bHϡ!nuEOXZk@C0)REqIw;k*|1kmE ~0 bҋ}QŪ,[&rv^c߾WR_cN#/w9Phndk$ň@kwW{0 М#p`$tZxynv04sbm6bUgDp啻( ފѣGA9r䈀w( $0@s,/@C08/r2x1]˕PLsgOM6}x6V2K.%~\DO% +ft h^81@0ɦ"8n:4d+gZe͇u~B!TX`Av%WJ .']R°u LS}qWQ?zQ0h|,dQiatP @ݼug'|H6?z=lyaуhl hnϳw3B(>ItxKkauІ?$ЇԈOMC(@[A&,p`*cNxiWIm{F [ss֞{˽+aRA 3uNqOx\W.Z20hhh@fjJ2-dлx8@Cկ۫TZBZ8W2d~G{ަ@L5ZsueWm,OKֱڑnᮒ.Pg1Q8^0؞?ؖ?Ж7КK,$UOf'f+ 6ѷ;Gx8Q[k-sprӽ>J{|Hv_ <ZTTofT%6d1h53X! X4zĊeg=jQu&[ VGHǏFj;jH7r*yZws uMjҭ[H͹v[ٷ ;"8!:!:{Vz4:fU,Kb#5f(䄫D vՙ-=MiO, ! γ>?=Sc-&UWjL6B{S0M=qMo7|_RRBRA RZ!Z|5CM6?=ϸLs̞!*=Sk?~3Z]$Wdg*6d;{Wz]4u.0B@nˍ5r,#MO.qo.pI)M0οxv~NYumWK非TD'I 3U*¿hRKI>I՞񼟲7+D gaaA" b&N#7zb!@K$V`Y`-jlcθ)^J6;0aǕtb\bW:ZQN WGĴ`ђ0P;zgu08">Ql.uosͰ-M4ɿZou{U4pjuenyf &r@9n=.wkBI?gDИ;@C i-@hb8iТ/=jFu-F(W;5nb7XPus쬉.OFD.fwh"fuzdm@ksMuQ^FBQaM[k݁a#877S]Us$?ORS>]n d077HbNs*ECWd,@B]US"a`0bYIϰgi',o'Ż"/(uzVxdUE_|WYjC^\aC3ȼT_U4؞x%:3Di 80ILBɞ|ͤ$I_G< Jm,uML vW`0>H9`l{ަJ`zr֘G-6"XdIti o ̴6UZFhשtm)ΐqW˾[Yp*(_`LH Zp @~4r!ж gͤa;&ʜ j̦@cY =piօg'MuK% $XWcnȋ*@DyMTB|&(p5lh0/RfN6NhO Jcp(F\b;l >1 Mss+ˠ|F,/Ğ=U;Kȫ2x^}4 Js~GMnzgn5')K&lU}Rح#7\(֨ӳݏ='KăŹZ{tу"_ר\WC1g{l(AtZȟGo;SA9`/ мfr=XK1vtc߹=oӤs.6{|LZJJ⍦ۂniu{xc ӕ{*SR-rGT'aXK .7O4OxAd<~HSJm!h J%nBMUh'_ce&>+\=HyIaZ(Kk4ВyWi,;,Eh-p.O2Q(Ml)3U8;֍ٮ G'?[_v}iIWK 2h '3Cꀽ!#FO ivj3Š=Sf8_ 7˽ufՙi)o/ra8 C~y% FȻTѾ _C888^ﯽ ?l>Y tW{sm b r ! gRW\zk4lbM2߁/&CSwj2il7 u6U ڴ3;=oSzdXEѭJѮr[#ǀ{;ܻ"<;L>oj mE8Âh` 񣇰*OoثU+z"Ux SKe.XM '%p}gpMakm&́4'>Cu6١*i2,BB,ZeR'58AQ2e HsQbozԆƻ7Jzm6+Epxghѭ,$7B4x2<@2^/cd-#ʯIu#;juaoyډg?zZBrvZN8˽ZFr”tsSzҨ4.Y=v4:АCChR! qRn v5bY{p3N*xl{u7'LO&HM@ݣ Jy.B닟38G!,'uuTy[z̆eyV_.-Ǹ[h*<$m]# &+FAibV"Z*fvs)tlcp,LlZU޺ϓjj3#lTWf B@F|8݂(;G дP J}MUGDJ1!s/w@ {j(=)9a˶Kh9ӲeotrGfGG3T;ʹx=ߦ*YwSLcub*§FZ@(1]<4*;c){ \tA $ib|Ѱw1;?lya'']$U6dSpJA*GVڝKk[[f; WAQLmI6Jê#z" !lRn+pTAOjU{A+h %]*B{<s<0UkۚkVUo^ucgB"SA7DN$[Ub'-Agn$0?R?.JP><*a jnz# ADZW3.KSaE#5unƠPG ZgsWгA3/ 3Pw}$G*m@ܱ{/' ֌:p ]>30WO>pqh?Zng3^Y^;f/SA6R`6uljKYGUWD }N][SMvf;%{KٰgK^̙wU\./UNw|jF{`K P?4J [,,,nzQQU0}ęՕ%&$~tCetĚu=`^Sn!u|8u9ޫ d7쪒PP}Jݒ>p@XXb_qbAI-dN*^xJM 0A ?MA_ #紫o.!1l>/5F+ЪߘorH2Ȁdf`+ pԪ1^wV oAoRnaIbo{ho 6'@UQ씞88tDNܱ܇X v*A H_7/~Jhn:)@#dJ^ޥ_I%/􄃓8Ⱦ*I=.T]_޻تxVa.}V 8v$䷒&ͼ 8=Ϭ 7JLufCɞ:8]-٥v)V]\oTXUAH6zW&_?jGf58~K`H3Rc'kM▯Ρ|"zN}2fpqO Á(=Ը>U!;5*#΋-W8IqqDɞgU{~K>K`uL{h7@: l>ڬUq)Y5x;*  gϥ]~0a\ B[M{SB^~t[0hS5ѪߠXmmЭ oJA &GĔνsEp"JL8.E.l Z(ot7ƀ@ 1I48:Ƀb1NڗkA G͐k9`ʸ#ʾÖȞw]si4bm,4mb&Êڎ*PA8\!UA ϕڢb;-vstyԚ#-*|\P>)TcY1C| t9_MKX]C :@ ͓ǏVWа9Wq;=Zڙ 88 UDsgq?)f3@ISM:Q[`|Ly:JkyI۲tlvv 4Bt3t4ѬX[eLd_CIP'}|hc2ubqn:=0GkGќ{%펕U婑V9.;L JУ9߹}Wb}B!`jF}H q6eV U*3KYyH`Zh-y]2g=o3"=3ݦ[a/GfGWSp* M9;(Xa q\4$^eS]n)VOuY&ݪy|׽GcI^7'RO֐PYӐ8=ڶ`,UMC{݄-۬8!KH]ky(XYsPܾ,ꮻ`jj*4Bm3aBO$OX?}+nPN"$`:5t;pdTp8æS`{DDyFݯ~L(Qyn5, ,Y(oh,nSR԰0Ĥ|M2 M*=6ZKx6(rx65U_qW<٬.]]F ˓L3BSl*"& CH7>k ÖQlǎ۔2W=׸M2`Gq [K-~~L?਌Eh3Sv젤8"C뚵fh_UKYpIYNZMeol]U-c}`osSVru`{Mj;s_:37:7aʞz]{+f|W+Q:pؤ8ZcB>R}t"Ѓ-:zlBGJBJ^fb{ Q:MvC5~0mm`$vO9r?@FTos̸aMtغn<B#̵E{Bqv4bڎ*Oo%<}n%ą=Gܰt4VgfS)M0n+po \# Cz=˓s#4H7& /z <|MFEu{^I`y j& ]uƤL47Jf .HS:@;*3d=8^&YwZӼ:WXx#'\:ͺ}-1T3 GgXeU$w.ςdrdOMT%-/,zp⌛(fׂ`6SNʵhk4/?9 A1Q9 : ^PifnGR}FXv6'jw~Ca.*H2@UsT7@q]]3"[o=v] O;qb0 ؙͭe!z%D׹PXL{HC֎3U lQ[T,{Gsuv@xgJ{_F 1`;yҪ(@z5]9A]_O9GR;HUJ(JϮbqSMcs3Yr{~M[FBmo Hh,ҧ8V2~ x|AP4;#8`ʈq{ަRGN/6܀c׊5P\h@gscX׻6""#^|oAD"/ȲP┟8+vҶTTtĕ$D;L܆vmʶ˺V4?~i:J 8*a`B9jk=38>Gڋ@_lM'[kp&a1X?/}ÿ́ 4j^]qj*L4@4̐n ~#L%9&U6W_9Xy:(WXEymrDګGN8-ަ QmW2RXeWbUԛiWf&5Xc~?2YkB>Ka%ЋߝJCi0SDNY5@[2LQy "v)fgUzu űWٜQWꨁ`ter^ZŊ 'o(1YUJk+utBMeM@EُM:=x|;|Uy;|nݵD7YhL3@~$A{E @QbINN~vZv+ӊ)LZ0yE 8}m-,ࣜL~nC9G 50Smgn +K6qPݨ7~B!seIh.D3]圛^`ND+Uű*mJ]~HћX̘?@)QdWĨZ='azVJjw!uHN&R뫋Rc ڛ}=͔h.m7^:UAïTʬKMt I2>"͏ӟ ?1olKIVÍa1(a52wڻY鿅}r4 4“8}=zZ5b ]~n3aՀ@Kp[mUyXpR&fM7WFG2JX.A.K6鐲XlPbI=s|DԹtQj0SԠ:rNO?1 p7l;p/doAԻ@@1Ʀ5VfX4@Ąޤ: $xs}E:=+<=`K}P̾c#U'lZ s@|1M^[~9=ySt:C/!к7ND93/<~{EDŞDHVYf97/I=֦l>zֺHKW)0ADYHG!ǠV ]h jތ 'Ч6eksM2j/wMU(moGn{2s[4rD!j-i?F}b4Bvi/@y$CFGdXl{g= Fs,Y2a+;7hʇ@8]} ͅa%K+}6L y gEAxмZbt)UFn"4OX;nPk]kUY _:4^HJ.]!v/ w ퟏ C=?鱮lk%Fm|7=>j?LȊ@.}꣋C[<TKk{:sҶR035v2]]lLĬB]gUJ[/|F|Yֺɴ@&a4֕Jhgk̨#ޅzE J5Ud4(Y1˘32O.Lyߑew&w0,I2^aY&8NkQ,jֽq Qbzs%T`Stjr:ۡ!~%pQK 9|Af[LKzsL2F|A4i5GԞGyZV"3&ML(t^aM؛3c]yn9vHmpwE3GzɍVgGA2nϻ\/ݿW;.ª#z r[&%M6MRFz}mgH/B?C[ٱgw#8g\Um3y c(I+ _U`-.n=sY KWþgӌ{?*ӌ ̐^~.VHysiֽq ( eFwOP*3C"L kh pQc !V{uvfϼE~/B4wahٿ Zck$ >qd.@ڞ{ʭdV#eW8N#-֏?wҸ(Y'2V_n1!jrj.2ȶphvRө6'՘Y yฐR ډW?hn@b`4Bڡo}b*fÁe$bX HdHw۾V":&>#7~~@O~3ҼI_ǟ}olqa5 Z,;L Ը/h3O>uN21Y+zS(+d@Di-dTE*KM>nC8 ]H ܷO;;ezeVH tQ"FH;ѝOb<ɞÝ=Lln\E{l򳖊W&遊tKw3߽oˁ7z-π.HGRՂ:#CbJ[t~{ߘ|@cԿ2ZjU(߽qi~з.v d#\tVy*Uiz}7x \@0w~[B壄Mlh:; в= !&>wx$hwz7^l4 25Ge-B*ۑ 0@c.OzW>:]ؽz9>_=TZ=q℩)fw_GZtHaO-nmm{tHվ:X3KJzz\Y-I4{T[}?7|Yhx=@yshb5i:nZN!V @YH+<+7Q \O͏f;;ڵ>`Ƽ`|}G7Q!QnVd=TwAޞEh;F=Y w3xme.߽m 2?k+s[k}\m;%Vdw PKGz^vZ|,p7ʙze ,g{lBa Sz۝l'4hGZ=6s3s'* ig¤&A3H ڠr65yk+x} ls =\.Oy'>C^eF߽5X퍡 DO7:#mk=tX0ɓ']\\v<2 窄X+{~gzbb8:H ̘́Y.?J}rqL# kxeZ6;7N|\(wvߚҖbw\2 ./m` п %%%6OH.Z Ëz7O:D;cO^_[VS!1Qiə;0˭.7W+BV[J钿R`{_+cNYRo"|eEVAZ[ ` 'CwhG==cu nɠ4buF/ +-?W㜎i%oyOe)fKIBaCXѽv*0 {(;F*>2NE~; i{^ns/K63)xGuv8n)B{ѝ.Oh/|HuUwtZ(%Tips禼 ⇮׻W&/NYu暍Q Ay o oi/EaOI,EV#DӋbu?gRL*2lxID7Ꮃz w'XWM |eHI̡Vgـ@#J'(,B;ne{~.;lLJ*/iZ̬"?oJCÄ;΁Gݿ Ȉjޕݷ; ҈0Da.|z N}0㧏x!G,gvَDWHC dc~f"|J/ ;$& y'do,84+%fs۴-O1) {b5֙Hʼn>v0EaYg(s.W InTS()`{4{Z_j; ; äT3!D~NW-Q X\j0;6OyiCl۟z jVb{!t0(n[K=ZwJZK܄>"6ЀfpWpFԉڗoBUTB_R J}{{w㟜 _ 0}ˊ +YcUe=w40@hAg&Pph2,yZW쬂C@ Ya$J%/͍Gɾ KuOJ>M{p_0Hi)jyEQG;t@"(ڗfŞJmn!X\{rhᄍ }EjanwWS LS($OJ68os`of scw-g띕m. [-^ #TS  oMyŵ"h9_BΧq>zs=g 1b@:jfy`BjCx?}u˲k4΂ "ӳ,Fk 6H< KMx784sopw+;nAWa970u5vz'h.EB+.I4\Y{NNL};> k}JkPZ@;hcfjLt-dBƪlin,dڞ-u 4]$8b#AyNH&Drp4DgX_F68_OS":@C:Ƹ8h(X].E Ӭ' %Ue9p:לyh.UiHڢZ*_H7:4C陮lG>@$pQ,JV,z.4\\\m|! gd!Uh,jC՟_W=97@&n~ & $v֨Xxjx@si.h[HT/ͬL!fs9 p$i(Ut˻s!@EB":.JiƐbϵ_+-c57{Ch.)qTsjo/xݵmVBmGìʓuб!VXHw:i_AǡAc-ĶSk+1KAGv_x]ٱ{ qiڗtDDK>ZfZ@ơTydHHHXG 7O݋9trzig7,\x;i"3c^kфÙ0PcRh=w2)iG̸U6˗&rJ)wN,Dhhq-@ 9tf&RKw/)촾X%vN:,w8"to3 Qۛ9ԦZ4 zȁ@=]KRu l/y1H-t<(2Sdar!@J~*j̥4Qyag\; 96=*hùpႼ|%Z4AH%ב^PrQyU c46{Ž+m){wH Ч*yaQ3Pm^ߺ"Vsm"'B"T3!opd /m$6Xhwsqq[o~zCGި4G]HP&uǶRՓEvmON&?B:El*a~!A{#^ߺIS}o|,6PN3cEpbKͥ؊\ŏ7ז>}9ҎtCf5YfӣL,hi>t߇dd4t8تlG$"zE 5˷@=+L:FOಢj5n|C/暣iݴ +hA&h:tFrW94f5),q}f0=6fت-n:!wE˴=՞Uih3ʲһ1Rh~ $ABBњ[#YXH#8ֹ'PjG7;vyINt`"dO5?rDsxI6o:DG3YEW"T)TBZ知nlaK m['cdѬ}tV5ahf'ro(5활m61x.&4ɅU_o}1ƦQ. ;$A{~~>JvyM|ǟNx?-eg`Hab*hH4积 %Д$'/xneVv:I#m~B^FHlfvb@i A*Rj1h ͥ& < ZFcc}(Cg4UfIp8 .\x솫 T_Z]͋PYO BuG썕D#/Zw2厀̘j1J6YH֗ \VweU@ٞ~]xvqq9qDX]Y69ʋQDBI,xin\l3=Y|t^jo?c&\ʻOW1fƧ0f4+?Rujۍ7=>܋)\{>y$C@p1tce:NY4ɀw[_]0 vUӉX~pAHCifąJ/IaR5sMX4M sT@١Q)Ho0tR|xRobYzg-o&qMAmfW\Ň[ 3&èe{fXwӲ@!;MOs(;tZcFDgGQj'gC[»@3^jhM^:XY)h0$Gki<6yhݘ:QH N?uݫ\@9Z?p[62:LGmG 3C:Ӊ) Svg Ǻt_}Pk iZfE e7d ى'uepN4Pg.% z+ӠI  מtN ?@=`Ro" !4+SzAq/=Wjp n^9j{UCOGrdmhf'v]Hĝ*!|| q=+((AC%*@^ȋPYqӉv0,RMzafO=Carl&>8a7nLM6w8-I=]C7b\4ΣЁ;T[d])hސOF/zC7+ҭysÏ'}Yōz}dF@͡\ϏTea1V"`&jK 35F< }?ჯ9Qpo1*\ ت2ɥi9SjYj~sA33X^Ne? )**)٤GBM./~GR05Ǜl'nt[H5;)vڕfvIյ|һlY"{0{#ȩvQQ N_i[N.I\>&G|~S(EX-m#R+Pm>$uc0Ǘ-Y_[:zJηVœ3woUu[oہRp'hnp^*`Sd3ST)Wy^7*ϱ|$vѮ7Ku]@tUt6  Fsk$0I^$G^z5-KaziW/5G|e:o4g'h|ɽS豱_dCkhi|C'?J5R($)͎m`zQ&/==+OG=xÏ|U@UŖ~93t=מKѷ./V $#pڄ8˩ؘث|y:,32 iiUT.ʓ?,d4xM 29 )bȳOh.94v2 yG~0PA0\h}=a? 4/ސ0h|MڕC2!qcV,{n.s ;ZfcDN$yh0pZ$Z6hN2Qaz/|NjuVf1 wPŜqχ7&a_䚷;Ğl:܏ʩSl684QeH:?BBvʹl o/Yahl%1cM.dGRCZ-!|)1g!*{uc'Nt0hd#.H:/B P"l~fHtb}d G(=w"P=*?iUi՘oBt=OQ]|p'Ouhh꡷98tsrJ%/͍+זbp(y.e&.BTAO%[|yNV-E鹱^bz*A!P k AFEO`6%+K|'RØdDg%|n"̺+"氻h n*i)^ o){byD@C8h?HKZc(Pw¯Ù1lc'PM*}#M%y*p65X7[ĞV^@!DR/,%*N zԘo ~Rw܄Sb8 >пq"7oJ/J_UD/̞M8SP  !ػc\qQT𐌳ȏT$]2<2K (&s:[Eރ]v b*A>_V,4l)梲gjho= 4(E^^~oh rYV`9[#Yd4VP3H X)Nokp:ǓDqO b`v3Qs+ѾQ !` M wqCGޮΰ1A$i4w,$'!cd,AFX+,Vu@S&RwD 谄# %N[E'HO7c8VUn'2{8A!$6=ωʡ[^ɋPYKn;MW CNYRGЁ=AqZHc!f佞УrƗ JZ;͗.l~$YTʸ5t/M:s:؁u@CHO^=/J~]&|-7=Yp4]at@OR]7*VSt΃J.ØٷyJsmuygA@CHv8k+ԡs_Rs,A QCu}uBߤPN*l hMΕ]'6Ӹ1BLsͲTQQ9u844?=:tfre>'~cZGUfaߜQ\1Y߬e7R \jW^^#wű߻\]ɼgNiB3=_t<9=[p#H@@C۟^CsIzV 9W܇Xj:5ZS= JglK ,xin=_&ro}g zGIhՙ"í<֞!@! [ޡcV6/;\Gz}mŭ~ȶ++k]tDHCpKU{JNSXJS="E_ʵg qd8h\y=47 c4 2Ʀ7r;+5gWY!S4O 7?lnh锶vyս _h+yUf^?^Ad7ɩ=ȍmm W7zM6"^Y2O>~ ){=ʺXqX{.K <_=; +T:]AY01ħ@7W 4 :f; `~&X_o3ԦPO)J_gDn'j47"wh.i! .~jX>B Gtx|w#;Ҝ}Y{S`RHՙpsu-4?{Q:N~3 \ AjqӣLf1{lگnoh# e'J xw> *p5rtK칻ܖV  `0#Etb@Y&ff)\2&[#M i{4 yݻ_-ʝD%.o3qD왎7qk !P%?wչ"%#))I )3f'ztV<[L/jqp: OfX{5JO@F%:j\j3;IN4Hd b >^+OBw@VʰL7yKW)H,Qo#@OR]7Sy8X퍵enom]=*k[#GEEBXMU6/Bjs\V{c(^v#dw=Es_ODtYݛ0v b*;H_LqhsЪBb?JLKfjI. T 7m#UQaO{g;fAj)Eo%<`wV_xv[&-/Lqo<bEE)6G|칃hR?!@!1|,z^rH>Jm5$ \ b46}m%~V`?\y?(V_9qFMYμ[\&$  ! uӻ*VfMV+0@BGoom1{rV{jG85 j怏8:2d{+{L5eUOghq8{5Z]ΏP?$H7of|qNEe|d@2ϊVJ ѐƪw\Sy}_uw}yٍ:6T,3:6V0%Л+AEz衇zCHآsO`֙q |{8 I;ߕj꼉~~i;H)GlZ{Uo|t{ʡIdbfvۺu^ ùK)ĸp03>X}A֕Q7P;U\*t$zJ9b c9z>(]GTMt-WW]O|l6JH$x4*AM1V92+'K̞ ^*E5+o I$zVxV3[|ͪZQ{/ydKgiwQXN>|o;K_Rt݁`zO%I:|ϻ?7O^f?e[ ='EؒPay |XsAמT*ovC/ |OQ" ThJnSzaQvo㶴+aO^7D~䘺aT,?6oeP"tTޑC_hm7Hh S@' {56\/>)y1(sSq.iJr< cF$49Kt^+Ob A*Ex4EREF7\6Q'aCe9{ zrh( o^̓z/v9-R6[`=\­ۊo}NeK罾$ n9ẒRJ!Р2|u^myېs谖]-W0?&EZrZԥ[vw_MT⡫H{0ܞrHa9Fi?0֪'CP,hPD7W"G҆&Fב ?4:H]mD[ !NAxDm%&_8 ~HwLgbԤYw7$g+CT JeX?xsum$\niܶ2) /ÎPrz81/J=ժ+͏2xs[:/݉F;3i-[&șOZe>'ا_F[ҿK{i^x,w*Ka.<灘A_] iPB44 AEuwePfI3" bL{ZUp #Vk}{K\&/N o) n7_=iO e/K6!eW;K3ߗ%|&3 *ort%cu6uoBu8ƊN)19U;R9ٚa=ue`n/oڔxl$ b[ s":<³о2'RT@i: FeB@@N?+b/3r_bg < 8|OD|Uk~wE?ΣF4$s:K|Mi{o1(|D"3( +N¦Q(~|\4wΨ]4GY_`Ls!Ws-{qf\u&ZRYoQ`#i4_Hijhw ap; }r_zw2t= "R"2{un cJ?="]ʴ?_)=yΩE¾ꨳje41ߡD\A;b|d@W{A0R㩈H|Ϣ χJy~ʅTTȜ΃NO}JcaQm\6;dX!JҙlX*p(DErt|\C6w:x.3Q"]WyAoI.{9FC3ׯ_ڲheA14H+#?P_{Tqwtfva`Ed%}N+iYb&$QmXe 1<35Ω}WG:r"zSe磮;[gsdt(w!,ptKyp)֏H/s#-9ZEn~ؕs)Caut31ĵ.q&m ϟ &Ƈ9j;^d+WOeh"t[r dՙ5W(Z$tX?__g(Yt317{TX.N?@Nm.]tW?ٍ`bfVv|[t_4j=[`++lH-DG1X1$N={,.+ӟ&}<}QZ/VS:tz7dX}{h#q/^ PS8*kq@ zflCBgCd+:NkbGHx 4}I =3&i6OS[Ejfb,ll6^ Ȥ`{UfKZ+3D0@X|413W̱(l/" ՞ Nw?m4yo7,WY7/pv9#^[,k|Rec ֌-x !@(X24z0^S.#˭{1$]N1'=}?GxtjGз^1Ri O|x@@(3iXV{KIIgKM+/!gqE+NԱ<4ka 9rZΆRͿ]ι91Zyi;hژg??m~c+ ]٘n'6{߱3l1zMMoϬ(i2cv0(^΀7RJY] IfOeig1THskYɻ_0 `WH$"~==) parAgl|y@ܵSt^n}HK1-[w>VsI@&Zb 𕈛o:FF%=[ݼцe!f5 t:y*yw<hUב[Z!ö<ׇ]0\Ƀd[ryEȓs$ 7-Nnq]5ݽ3ZvY,͌`zfxad/q^S6{0GS~"L!xTopleH 2p;wdW?8 T䧸ksmfqv(fz2iG;{e,=,"KqڄfWku9yru_tXO_XѼ4;.|!u~n/hզYo7yZ[%M`w\|"5PG~aC&sT_ Iʋ2ˍ_M!!~nS՗b 6?J*٬vk-Gxސi_ucf4jx5{meY4[aYyn=]mԘ4z~$c:?p"yN~DkVŏ4廔%Z\5p@15ɌtqQ7_h/}ݙ͗w<,ݴJŋ*`{Pr:gznne>NDnYw"h ׭Iaܭ6ٻ|<Me}Up ɋ>ɿԽ9ۦcKsuywD8~x)eE5x  V9 ɘNf79hnY}pO;s;EK`I]Z<#\n^YEK`e0ba,UEz}O,+i:Cj.w8פY0ڠ"ɢ%1\sa4cک*ն.nO^TVWW?*Ɍqk{f^N)v_r<v8Q7fhgGդY T^4Gc>y-65|̧)ۡ4,cU%ƪ}5f:.t:MŁǻ: ś~z/۝Ǵ&E6}yeEGQRõ+g H$ocNXnYP^-IEqsگĽАaU`Zc ,# P7M5d1K4a˧mԐH;^HZѾ˻W!B;zs<Ꙥ)7Ad{DW&32ΝE}e5W7wH¦z#gb"[?,ir3U-y.ҭ>.1Efi&!Iu %vZ6n_z gO"-><4nX `E͗4&]?|S3ڲ~Ud%n>CQ1K `G:lnU w侯fq5k$ĸ4/dqq8$F׷:}v[Yɳ`G/Ҡ33@$a@4(Pg-O5_8>*F7zt[sJ\,t򯈇 RWWrx@@re㛘| ݪ /_wV6e; a5Y ׭~b 6M`,"~TD'yv3^g/;+&֦۠eWr#&G?sڂ;T8s|gţ{ D MmVy;y￐3s#4.KR3An̏oro*7LnĘ|<瘢noezӢ8NoN~}y"N>D֭S3N̕3b3To~X^Nz_Z<J+i0NmzXoei2i'e n]EU{%]ď.O?Y{㕛{jRͲBҝ{Sw!Do[v]> 'sPk}'eQ(^:8xmS74DoGbɿo=vlѲ\}FMhBfsQH'-|4ӜpT;aMю/_ 'aQi-Ԡ0ŋs,^>/_֕D\ugzg7{W7DŽi ;=a(Q\yY5|"!P愨ZMїNaebhP=]vzie^R|;jm1y 9zÉ1]}vk$ڽ3#KeDFgT@_Z]\N"-m  k|E\5s'BvhW>O8Q}-9]68g:.ܭplδ(6,X|6H$ \xnKZRc%dؕ dW,6I!mOQg+&7-yrU.*lFQqQ8`jvϴ~%Y4<3T}KRas|>_]]7޼}F=g LmGiblX?_Ӕ:4:ڔěĘ4 wL`0䞘B"Ol KcDҒ¥{L EcJSV.l*h{llq>[Uݘ}@.}'֦۪v\J2-K9%Jl;*BJ \.?ől 8 Z bc_o4f(]>>7= 4:[~w@H[B)ݾEe9I&WNİr.tƌY"=2bä/)셆B!EvDϊ li/o?7?| vemϪ },嘑m-#UN]ֵ<4fPGQ.ΪлaihP |FT,n X!u*w.mͱK3+O0*:ePhY,(U6ؖ96PH3tbO+Z+f+ @Ѥe Qȼ, Z+/<81%hKf1E5QvZ;uw;imuӖMvoDjh뒱&;buޛ>4v t~c'2򭛳5 7E]=SkZbWZS5ԖzoH ?8;[(<!^ޱLJ֗R#2n,`?ƭ &C&g_0yr5.S['6dzF7NMNoe|F듛lNɦ؟_t$Kp*K--%DQ@JtQ) ҇8T Kh&Ԡh!cKhQ(T&Ǒ PuR%RHR(\~Z6כ"6N3BL@@ѩhkĊ!f2d81? VC@/HiK>u%\j <}<17@A9GMp~0Je q%[Ž+DhҳT֠0 PuR{q6R}Vj .&A T>eS+KOO. P(X<*">,?&F[MRhxcY+BH,c)h4[t@@; oN ⋥l!fo m*Þ!v"@@ h4 h4 h4 @@w :IENDB`d3-chord-1.0.4/index.js000066400000000000000000000001361306056722200145670ustar00rootroot00000000000000export {default as chord} from "./src/chord"; export {default as ribbon} from "./src/ribbon"; d3-chord-1.0.4/package.json000066400000000000000000000030201306056722200154030ustar00rootroot00000000000000{ "name": "d3-chord", "version": "1.0.4", "description": "Visualize relationships or network flow with an aesthetically-pleasing circular layout.", "keywords": [ "d3", "d3-module", "chord", "radial", "network", "flow" ], "homepage": "https://d3js.org/d3-chord/", "license": "BSD-3-Clause", "author": { "name": "Mike Bostock", "url": "http://bost.ocks.org/mike" }, "main": "build/d3-chord.js", "module": "index", "jsnext:main": "index", "repository": { "type": "git", "url": "https://github.com/d3/d3-chord.git" }, "scripts": { "pretest": "rm -rf build && mkdir build && rollup --banner \"$(preamble)\" -g d3-array:d3,d3-path:d3 -f umd -n d3 -o build/d3-chord.js -- index.js", "test": "tape 'test/**/*-test.js' && eslint index.js src", "prepublish": "npm run test && uglifyjs --preamble \"$(preamble)\" build/d3-chord.js -c -m -o build/d3-chord.min.js", "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3-chord/build/d3-chord.js d3-chord.v1.js && cp ../d3-chord/build/d3-chord.min.js d3-chord.v1.min.js && git add d3-chord.v1.js d3-chord.v1.min.js && git commit -m \"d3-chord ${npm_package_version}\" && git push && cd - && zip -j build/d3-chord.zip -- LICENSE README.md build/d3-chord.js build/d3-chord.min.js" }, "dependencies": { "d3-array": "1", "d3-path": "1" }, "devDependencies": { "eslint": "3", "package-preamble": "0.0", "rollup": "0.41", "tape": "4", "uglify-js": "^2.8.11" } } d3-chord-1.0.4/src/000077500000000000000000000000001306056722200137115ustar00rootroot00000000000000d3-chord-1.0.4/src/array.js000066400000000000000000000000521306056722200153620ustar00rootroot00000000000000export var slice = Array.prototype.slice; d3-chord-1.0.4/src/chord.js000066400000000000000000000061521306056722200153520ustar00rootroot00000000000000import {range} from "d3-array"; import {max, tau} from "./math"; function compareValue(compare) { return function(a, b) { return compare( a.source.value + a.target.value, b.source.value + b.target.value ); }; } export default function() { var padAngle = 0, sortGroups = null, sortSubgroups = null, sortChords = null; function chord(matrix) { var n = matrix.length, groupSums = [], groupIndex = range(n), subgroupIndex = [], chords = [], groups = chords.groups = new Array(n), subgroups = new Array(n * n), k, x, x0, dx, i, j; // Compute the sum. k = 0, i = -1; while (++i < n) { x = 0, j = -1; while (++j < n) { x += matrix[i][j]; } groupSums.push(x); subgroupIndex.push(range(n)); k += x; } // Sort groups… if (sortGroups) groupIndex.sort(function(a, b) { return sortGroups(groupSums[a], groupSums[b]); }); // Sort subgroups… if (sortSubgroups) subgroupIndex.forEach(function(d, i) { d.sort(function(a, b) { return sortSubgroups(matrix[i][a], matrix[i][b]); }); }); // Convert the sum to scaling factor for [0, 2pi]. // TODO Allow start and end angle to be specified? // TODO Allow padding to be specified as percentage? k = max(0, tau - padAngle * n) / k; dx = k ? padAngle : tau / n; // Compute the start and end angle for each group and subgroup. // Note: Opera has a bug reordering object literal properties! x = 0, i = -1; while (++i < n) { x0 = x, j = -1; while (++j < n) { var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k; subgroups[dj * n + di] = { index: di, subindex: dj, startAngle: a0, endAngle: a1, value: v }; } groups[di] = { index: di, startAngle: x0, endAngle: x, value: groupSums[di] }; x += dx; } // Generate chords for each (non-empty) subgroup-subgroup link. i = -1; while (++i < n) { j = i - 1; while (++j < n) { var source = subgroups[j * n + i], target = subgroups[i * n + j]; if (source.value || target.value) { chords.push(source.value < target.value ? {source: target, target: source} : {source: source, target: target}); } } } return sortChords ? chords.sort(sortChords) : chords; } chord.padAngle = function(_) { return arguments.length ? (padAngle = max(0, _), chord) : padAngle; }; chord.sortGroups = function(_) { return arguments.length ? (sortGroups = _, chord) : sortGroups; }; chord.sortSubgroups = function(_) { return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; }; chord.sortChords = function(_) { return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; }; return chord; } d3-chord-1.0.4/src/constant.js000066400000000000000000000001101306056722200160700ustar00rootroot00000000000000export default function(x) { return function() { return x; }; } d3-chord-1.0.4/src/math.js000066400000000000000000000002371306056722200152020ustar00rootroot00000000000000export var cos = Math.cos; export var sin = Math.sin; export var pi = Math.PI; export var halfPi = pi / 2; export var tau = pi * 2; export var max = Math.max; d3-chord-1.0.4/src/ribbon.js000066400000000000000000000044441306056722200155300ustar00rootroot00000000000000import {slice} from "./array"; import constant from "./constant"; import {cos, halfPi, sin} from "./math"; import {path} from "d3-path"; function defaultSource(d) { return d.source; } function defaultTarget(d) { return d.target; } function defaultRadius(d) { return d.radius; } function defaultStartAngle(d) { return d.startAngle; } function defaultEndAngle(d) { return d.endAngle; } export default function() { var source = defaultSource, target = defaultTarget, radius = defaultRadius, startAngle = defaultStartAngle, endAngle = defaultEndAngle, context = null; function ribbon() { var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv), sr = +radius.apply(this, (argv[0] = s, argv)), sa0 = startAngle.apply(this, argv) - halfPi, sa1 = endAngle.apply(this, argv) - halfPi, sx0 = sr * cos(sa0), sy0 = sr * sin(sa0), tr = +radius.apply(this, (argv[0] = t, argv)), ta0 = startAngle.apply(this, argv) - halfPi, ta1 = endAngle.apply(this, argv) - halfPi; if (!context) context = buffer = path(); context.moveTo(sx0, sy0); context.arc(0, 0, sr, sa0, sa1); if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr? context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); context.arc(0, 0, tr, ta0, ta1); } context.quadraticCurveTo(0, 0, sx0, sy0); context.closePath(); if (buffer) return context = null, buffer + "" || null; } ribbon.radius = function(_) { return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), ribbon) : radius; }; ribbon.startAngle = function(_) { return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : startAngle; }; ribbon.endAngle = function(_) { return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : endAngle; }; ribbon.source = function(_) { return arguments.length ? (source = _, ribbon) : source; }; ribbon.target = function(_) { return arguments.length ? (target = _, ribbon) : target; }; ribbon.context = function(_) { return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; }; return ribbon; } d3-chord-1.0.4/test/000077500000000000000000000000001306056722200141015ustar00rootroot00000000000000d3-chord-1.0.4/test/chord-test.js000066400000000000000000000124521306056722200165170ustar00rootroot00000000000000var tape = require("tape"), d3 = require("../"); require("./inDelta"); // From http://mkweb.bcgsc.ca/circos/guide/tables/ var matrix = [ [11975, 5871, 8916, 2868], [ 1951, 10048, 2060, 6171], [ 8010, 16145, 8090, 8045], [ 1013, 990, 940, 6907] ]; tape("d3.chord() has the epxected defaults", function(test) { var chord = d3.chord(); test.equal(chord.padAngle(), 0); test.equal(chord.sortGroups(), null); test.equal(chord.sortSubgroups(), null); test.equal(chord.sortChords(), null); var chords = chord(matrix); test.inDelta(chords.groups, [ {endAngle: 1.8617078, index: 0, startAngle: 0.0000000, value: 29630}, {endAngle: 3.1327961, index: 1, startAngle: 1.8617078, value: 20230}, {endAngle: 5.6642915, index: 2, startAngle: 3.1327961, value: 40290}, {endAngle: 6.2831853, index: 3, startAngle: 5.6642915, value: 9850} ]); test.inDelta(chords, [{ source: {endAngle: 0.7524114, index: 0, startAngle: 0.0000000, subindex: 0, value: 11975}, target: {endAngle: 0.7524114, index: 0, startAngle: 0.0000000, subindex: 0, value: 11975}}, { source: {endAngle: 1.1212972, index: 0, startAngle: 0.7524114, subindex: 1, value: 5871}, target: {endAngle: 1.9842927, index: 1, startAngle: 1.8617078, subindex: 0, value: 1951}}, { source: {endAngle: 1.6815060, index: 0, startAngle: 1.1212972, subindex: 2, value: 8916}, target: {endAngle: 3.6360793, index: 2, startAngle: 3.1327961, subindex: 0, value: 8010}}, { source: {endAngle: 1.8617078, index: 0, startAngle: 1.6815060, subindex: 3, value: 2868}, target: {endAngle: 5.7279402, index: 3, startAngle: 5.6642915, subindex: 0, value: 1013}}, { source: {endAngle: 2.6156272, index: 1, startAngle: 1.9842927, subindex: 1, value: 10048}, target: {endAngle: 2.6156272, index: 1, startAngle: 1.9842927, subindex: 1, value: 10048}}, { source: {endAngle: 4.6504996, index: 2, startAngle: 3.6360793, subindex: 1, value: 16145}, target: {endAngle: 2.7450608, index: 1, startAngle: 2.6156272, subindex: 2, value: 2060}}, { source: {endAngle: 3.1327961, index: 1, startAngle: 2.7450608, subindex: 3, value: 6171}, target: {endAngle: 5.7901437, index: 3, startAngle: 5.7279402, subindex: 1, value: 990}}, { source: {endAngle: 5.1588092, index: 2, startAngle: 4.6504996, subindex: 2, value: 8090}, target: {endAngle: 5.1588092, index: 2, startAngle: 4.6504996, subindex: 2, value: 8090}}, { source: {endAngle: 5.6642915, index: 2, startAngle: 5.1588092, subindex: 3, value: 8045}, target: {endAngle: 5.8492056, index: 3, startAngle: 5.7901437, subindex: 2, value: 940}}, { source: {endAngle: 6.2831853, index: 3, startAngle: 5.8492056, subindex: 3, value: 6907}, target: {endAngle: 6.2831853, index: 3, startAngle: 5.8492056, subindex: 3, value: 6907}} ]); test.end(); }); tape("chord.padAngle(angle) sets the pad angle", function(test) { var chord = d3.chord().sortSubgroups(function(a, b) { return b - a; }); test.equal(chord.padAngle(0.05), chord); test.equal(chord.padAngle(), 0.05); var chords = chord(matrix); test.inDelta(chords.groups, [ {endAngle: 1.80244780, index: 0, startAngle: 0.0000000, value: 29630}, {endAngle: 3.08307619, index: 1, startAngle: 1.8524478, value: 20230}, {endAngle: 5.58399155, index: 2, startAngle: 3.1330761, value: 40290}, {endAngle: 6.23318530, index: 3, startAngle: 5.6339915, value: 9850} ]); test.inDelta(chords, [{ source: {endAngle: 0.7284614, index: 0, startAngle: 0.0000000, subindex: 0, value: 11975}, target: {endAngle: 0.7284614, index: 0, startAngle: 0.0000000, subindex: 0, value: 11975}}, { source: {endAngle: 1.6279820, index: 0, startAngle: 1.2708382, subindex: 1, value: 5871}, target: {endAngle: 3.0830761, index: 1, startAngle: 2.9643932, subindex: 0, value: 1951}}, { source: {endAngle: 1.2708382, index: 0, startAngle: 0.7284614, subindex: 2, value: 8916}, target: {endAngle: 5.5839915, index: 2, startAngle: 5.0967284, subindex: 0, value: 8010}}, { source: {endAngle: 1.8024478, index: 0, startAngle: 1.6279820, subindex: 3, value: 2868}, target: {endAngle: 6.1157798, index: 3, startAngle: 6.0541571, subindex: 0, value: 1013}}, { source: {endAngle: 2.4636862, index: 1, startAngle: 1.8524478, subindex: 1, value: 10048}, target: {endAngle: 2.4636862, index: 1, startAngle: 1.8524478, subindex: 1, value: 10048}}, { source: {endAngle: 4.1152064, index: 2, startAngle: 3.1330761, subindex: 1, value: 16145}, target: {endAngle: 2.9643932, index: 1, startAngle: 2.8390796, subindex: 2, value: 2060}}, { source: {endAngle: 2.8390796, index: 1, startAngle: 2.4636862, subindex: 3, value: 6171}, target: {endAngle: 6.1760033, index: 3, startAngle: 6.1157798, subindex: 1, value: 990}}, { source: {endAngle: 4.6073361, index: 2, startAngle: 4.1152064, subindex: 2, value: 8090}, target: {endAngle: 4.6073361, index: 2, startAngle: 4.1152064, subindex: 2, value: 8090}}, { source: {endAngle: 5.0967284, index: 2, startAngle: 4.6073361, subindex: 3, value: 8045}, target: {endAngle: 6.2331853, index: 3, startAngle: 6.1760033, subindex: 2, value: 940}}, { source: {endAngle: 6.0541571, index: 3, startAngle: 5.6339915, subindex: 3, value: 6907}, target: {endAngle: 6.0541571, index: 3, startAngle: 5.6339915, subindex: 3, value: 6907}} ]); test.end(); }); d3-chord-1.0.4/test/inDelta.js000066400000000000000000000020231306056722200160140ustar00rootroot00000000000000var tape = require("tape"); tape.Test.prototype.inDelta = function(actual, expected, delta) { delta = delta || 1e-6; this._assert(inDelta(actual, expected, delta), { message: "should be in delta " + delta, operator: "inDelta", actual: actual, expected: expected }); }; function inDelta(actual, expected, delta) { return (Array.isArray(expected) ? inDeltaArray : typeof expected === "object" ? inDeltaObject : inDeltaNumber)(actual, expected, delta); } function inDeltaArray(actual, expected, delta) { var n = expected.length, i = -1; if (actual.length !== n) return false; while (++i < n) if (!inDelta(actual[i], expected[i], delta)) return false; return true; } function inDeltaObject(actual, expected, delta) { for (var i in expected) if (!inDelta(actual[i], expected[i], delta)) return false; for (var i in actual) if (!(i in expected)) return false; return true; } function inDeltaNumber(actual, expected, delta) { return actual >= expected - delta && actual <= expected + delta; } d3-chord-1.0.4/test/ribbon-test.js000066400000000000000000000034221306056722200166700ustar00rootroot00000000000000var tape = require("tape"), d3 = require("../"); tape("d3.ribbon() has the expected defaults", function(test) { var r = d3.ribbon(); test.equal(r.radius()({radius: 42}), 42); test.equal(r.startAngle()({startAngle: 42}), 42); test.equal(r.endAngle()({endAngle: 42}), 42); test.deepEqual(r.source()({source: {name: "foo"}}), {name: "foo"}); test.deepEqual(r.target()({target: {name: "foo"}}), {name: "foo"}); test.equal(r.context(), null); test.end(); }); tape("ribbon.radius(radius) sets the radius accessor", function(test) { var foo = function(d) { return d.foo; }, r = d3.ribbon(); test.equal(r.radius(foo), r); test.equal(r.radius(), foo); test.equal(r.radius(42), r); test.equal(r.radius()(), 42); test.end(); }); tape("ribbon.startAngle(startAngle) sets the startAngle accessor", function(test) { var foo = function(d) { return d.foo; }, r = d3.ribbon(); test.equal(r.startAngle(foo), r); test.equal(r.startAngle(), foo); test.equal(r.startAngle(1.2), r); test.equal(r.startAngle()(), 1.2); test.end(); }); tape("ribbon.endAngle(endAngle) sets the endAngle accessor", function(test) { var foo = function(d) { return d.foo; }, r = d3.ribbon(); test.equal(r.endAngle(foo), r); test.equal(r.endAngle(), foo); test.equal(r.endAngle(1.2), r); test.equal(r.endAngle()(), 1.2); test.end(); }); tape("ribbon.source(source) sets the source accessor", function(test) { var foo = function(d) { return d.foo; }, r = d3.ribbon(); test.equal(r.source(foo), r); test.equal(r.source(), foo); test.end(); }); tape("ribbon.target(target) sets the target accessor", function(test) { var foo = function(d) { return d.foo; }, r = d3.ribbon(); test.equal(r.target(foo), r); test.equal(r.target(), foo); test.end(); });