aboutsummaryrefslogtreecommitdiff
path: root/advtrains/tracks.lua
blob: 092a1ecf0f57e74328077b9798666a1643ccb4d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
--advtrains by orwell96, see readme.txt

--dev-time settings:
--EDIT HERE
--If the old non-model rails on straight tracks should be replaced by the new...
--false: no
--true: yes
advtrains.register_replacement_lbms=false

--[[TracksDefinition
nodename_prefix
texture_prefix
description
common={}
straight={}
straight45={}
curve={}
curve45={}
lswitchst={}
lswitchst45={}
rswitchst={}
rswitchst45={}
lswitchcr={}
lswitchcr45={}
rswitchcr={}
rswitchcr45={}
vert1={
	--you'll probably want to override mesh here
}
vert2={
	--you'll probably want to override mesh here
}
]]--
advtrains.all_tracktypes={}

--definition preparation
local function conns(c1, c2, r1, r2) return {{c=c1, y=r1}, {c=c2, y=r2}} end
local function conns3(c1, c2, c3, r1, r2, r3) return {{c=c1, y=r1}, {c=c2, y=r2}, {c=c3, y=r3}} end

advtrains.ap={}
advtrains.ap.t_30deg_flat={
	regstep=1,
	variant={
		st={
			conns = conns(0,8),
			desc = "straight",
			tpdouble = true,
			tpsingle = true,
			trackworker = "cr",
		},
		cr={
			conns = conns(0,7),
			desc = "curve",
			tpdouble = true,
			trackworker = "swlst",
		},
		swlst={
			conns = conns3(0,8,7),
			desc = "left switch (straight)",
			trackworker = "swrst",
			switchalt = "swlcr",
			switchmc = "on",
			switchst = "st",
		},
		swlcr={
			conns = conns3(0,7,8),
			desc = "left switch (curve)",
			trackworker = "swrcr",
			switchalt = "swlst",
			switchmc = "off",
			switchst = "cr",
		},
		swrst={
			conns = conns3(0,8,9),
			desc = "right switch (straight)",
			trackworker = "st",
			switchalt = "swrcr",
			switchmc = "on",
			switchst = "st",
		},
		swrcr={
			conns = conns3(0,9,8),
			desc = "right switch (curve)",
			trackworker = "st",
			switchalt = "swrst",
			switchmc = "off",
			switchst = "cr",
		},
	},
	regtp=true,
	tpdefault="st",
	trackworker={
		["swrcr"]="st",
		["swrst"]="st",
		["cr"]="swlst",
		["swlcr"]="swrcr",
		["swlst"]="swrst",
	},
	rotation={"", "_30", "_45", "_60"},
}
advtrains.ap.t_30deg_slope={
	regstep=1,
	variant={
		vst1={conns = conns(8,0,0,0.5), rail_y = 0.25, desc = "steep uphill 1/2", slope=true},
		vst2={conns = conns(8,0,0.5,1), rail_y = 0.75, desc = "steep uphill 2/2", slope=true},
		vst31={conns = conns(8,0,0,0.33), rail_y = 0.16, desc = "uphill 1/3", slope=true},
		vst32={conns = conns(8,0,0.33,0.66), rail_y = 0.5, desc = "uphill 2/3", slope=true},
		vst33={conns = conns(8,0,0.66,1), rail_y = 0.83, desc = "uphill 3/3", slope=true},
	},
	regsp=true,
	slopeplacer={
		[2]={"vst1", "vst2"},
		[3]={"vst31", "vst32", "vst33"},
		max=3,--highest entry
	},
	slopeplacer_45={
		[2]={"vst1_45", "vst2_45"},
		max=2,
	},
	rotation={"", "_30", "_45", "_60"},
	trackworker={},
	increativeinv={},
}
advtrains.ap.t_30deg_straightonly={
	regstep=1,
	variant={
		st={
			conns = conns(0,8),
			desc = "straight",
			tpdouble = true,
			tpsingle = true,
			trackworker = "st",
		},
	},
	regtp=true,
	tpdefault="st",
	rotation={"", "_30", "_45", "_60"},
}
advtrains.ap.t_30deg_straightonly_noplacer={
	regstep=1,
	variant={
		st={
			conns = conns(0,8),
			desc = "straight",
			tpdouble = true,
			tpsingle = true,
			trackworker = "st",
		},
	},
	tpdefault="st",
	rotation={"", "_30", "_45", "_60"},
}
advtrains.ap.t_45deg={
	regstep=2,
	variant={
		st={
			conns = conns(0,8),
			desc = "straight",
			tpdouble = true,
			tpsingle = true,
			trackworker = "cr",
		},
		cr={
			conns = conns(0,6),
			desc = "curve",
			tpdouble = true,
			trackworker = "swlst",
		},
		swlst={
			conns = conns3(0,8,6),
			desc = "left switch (straight)",
			trackworker = "swrst",
			switchalt = "swlcr",
			switchmc = "on",
			switchst = "st",
		},
		swlcr={
			conns = conns3(0,6,8),
			desc = "left switch (curve)",
			trackworker = "swrcr",
			switchalt = "swlst",
			switchmc = "off",
			switchst = "cr",
		},
		swrst={
			conns = conns3(0,8,10),
			desc = "right switch (straight)",
			trackworker = "st",
			switchalt = "swrcr",
			switchmc = "on",
			switchst = "st",
		},
		swrcr={
			conns = conns3(0,10,8),
			desc = "right switch (curve)",
			trackworker = "st",
			switchalt = "swrst",
			switchmc = "off",
			switchst = "cr",
		},
	},
	regtp=true,
	tpdefault="st",
	trackworker={
		["swrcr"]="st",
		["swrst"]="st",
		["cr"]="swlst",
		["swlcr"]="swrcr",
		["swlst"]="swrst",
	},
	rotation={"", "_30", "_45", "_60"},
}
advtrains.trackpresets = advtrains.ap

--definition format: ([] optional)
--[[{
	nodename_prefix
	texture_prefix
	[shared_texture]
	models_prefix
	models_suffix (with dot)
	[shared_model]
	formats={
		st,cr,swlst,swlcr,swrst,swrcr,vst1,vst2
		(each a table with indices 0-3, for if to register a rail with this 'rotation' table entry. nil is assumed as 'all', set {} to not register at all)
	}
	common={} change something on common rail appearance
}
[18.12.17] Note on new connection system:
In order to support real rail crossing nodes and finally make the trackplacer respect switches, I changed the connection system.
There can be a variable number of connections available. These are specified as tuples {c=<connection>, y=<rely>}
The table "at_conns" consists of {<conn1>, <conn2>...}
the "at_rail_y" property holds the value that was previously called "railheight"
Depending on the number of connections:
2 conns: regular rail
3 conns: switch:
	- when train passes in at conn1, will move out of conn2
	- when train passes in at conn2 or conn3, will move out of conn1
4 conns: cross (or cross switch, depending on arrangement of conns):
	- conn1 <> conn2
	- conn3 <> conn4
]]

function advtrains.register_tracks(tracktype, def, preset)
	advtrains.trackplacer.register_tracktype(def.nodename_prefix, preset.tpdefault)
	if preset.regtp then
		advtrains.trackplacer.register_track_placer(def.nodename_prefix, def.texture_prefix, def.description)			
	end
	if preset.regsp then
		advtrains.slope.register_placer(def, preset)			
	end
	for suffix, var in pairs(preset.variant) do
		for rotid, rotation in ipairs(preset.rotation) do
			if not def.formats[suffix] or def.formats[suffix][rotid] then
				local img_suffix = suffix..rotation
				local ndef = advtrains.merge_tables({
					description=def.description.."("..(var.desc or "any")..rotation..")",
					drawtype = "mesh",
					paramtype="light",
					paramtype2="facedir",
					walkable = false,
					selection_box = {
						type = "fixed",
						fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
					},
					
					mesh = def.shared_model or (def.models_prefix.."_"..img_suffix..def.models_suffix),
					tiles = {def.shared_texture or (def.texture_prefix.."_"..img_suffix..".png"), def.second_texture},
					
					groups = {
						attached_node=1,
						advtrains_track=1,
						["advtrains_track_"..tracktype]=1,
						save_in_at_nodedb=1,
						dig_immediate=2,
						not_in_creative_inventory=1,
						not_blocking_trains=1,
					},
						
					can_dig=function(pos)
						return not advtrains.get_train_at_pos(pos)
					end,
					after_dig_node=function(pos)
						advtrains.ndb.update(pos)
					end,
					after_place_node=function(pos)
						advtrains.ndb.update(pos)
					end,
					at_nnpref = def.nodename_prefix,
					at_suffix = suffix,
					at_rotation = rotation,
					at_rail_y = var.rail_y
				}, def.common or {})
				
				if preset.regtp then
					ndef.drop = def.nodename_prefix.."_placer"
				end
				if preset.regsp and var.slope then
					ndef.drop = def.nodename_prefix.."_slopeplacer"
				end
				
				--connections
				ndef.at_conns = advtrains.rotate_conn_by(var.conns, (rotid-1)*preset.regstep)
				
				if var.switchalt and var.switchst then
					local switchfunc=function(pos, node, newstate)
						if newstate~=var.switchst and not advtrains.get_train_at_pos(pos)
								and not (advtrains.interlocking and advtrains.interlocking.route.has_route_lock(advtrains.roundfloorpts(pos)) ) then --TODO schöner machen
							advtrains.ndb.swap_node(pos, {name=def.nodename_prefix.."_"..var.switchalt..rotation, param2=node.param2})
							advtrains.invalidate_all_paths(pos)
						end
					end
					ndef.on_rightclick = function(pos, node, player)
						if advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then
							switchfunc(pos, node)
							advtrains.log("Switch", player:get_player_name(), pos)
						end
					end
					if var.switchmc then
						ndef.mesecons = {effector = {
							["action_"..var.switchmc] = switchfunc,
							rules=advtrains.meseconrules
						}}
					end
					ndef.luaautomation = { 
						getstate = var.switchst,
						setstate = switchfunc,
					}
				end
				
				local adef={}
				if def.get_additional_definiton then
					adef=def.get_additional_definiton(def, preset, suffix, rotation)
				end
				ndef = advtrains.merge_tables(ndef, adef)

				minetest.register_node(":"..def.nodename_prefix.."_"..suffix..rotation, ndef)
				--trackplacer
				if preset.regtp then
					local tpconns = {conn1=ndef.at_conns[1].c, conn2=ndef.at_conns[2].c}
					if var.tpdouble then
						advtrains.trackplacer.add_double_conn(def.nodename_prefix, suffix, rotation, tpconns)
					end
					if var.tpsingle then
						advtrains.trackplacer.add_single_conn(def.nodename_prefix, suffix, rotation, tpconns)
					end
				end
				advtrains.trackplacer.add_worked(def.nodename_prefix, suffix, rotation, var.trackworker)
			end
		end
	end
	advtrains.all_tracktypes[tracktype]=true
end

function advtrains.is_track_and_drives_on(nodename, drives_on_p)
	local drives_on = drives_on_p
	if not drives_on then drives_on = advtrains.all_tracktypes end
	local hasentry = false
	for _,_ in pairs(drives_on) do
		hasentry=true
	end
	if not hasentry then drives_on = advtrains.all_tracktypes end
	
	if not minetest.registered_nodes[nodename] then
		return false
	end
	local nodedef=minetest.registered_nodes[nodename]
	for k,v in pairs(drives_on) do
		if nodedef.groups["advtrains_track_"..k] then
			return true
		end
	end
	return false
end

function advtrains.get_track_connections(name, param2)
	local nodedef=minetest.registered_nodes[name]
	if not nodedef then atprint(" get_track_connections couldn't find nodedef for nodename "..(name or "nil")) return nil end
	local noderot=param2
	if not param2 then noderot=0 end
	if noderot > 3 then atprint(" get_track_connections: rail has invaild param2 of "..noderot) noderot=0 end
	
	local tracktype
	for k,_ in pairs(nodedef.groups) do
		local tt=string.match(k, "^advtrains_track_(.+)$")
		if tt then
			tracktype=tt
		end
	end
	return advtrains.rotate_conn_by(nodedef.at_conns, noderot*AT_CMAX/4), (nodedef.at_rail_y or 0), tracktype
end

-- slope placer. Defined in register_tracks.
--crafted with rail and gravel
local sl={}
function sl.register_placer(def, preset)
	minetest.register_craftitem(":"..def.nodename_prefix.."_slopeplacer",{
		description = attrans("@1 Slope", def.description),
		inventory_image = def.texture_prefix.."_slopeplacer.png",
		wield_image = def.texture_prefix.."_slopeplacer.png",
		groups={},
		on_place = sl.create_slopeplacer_on_place(def, preset)
	})
end
--(itemstack, placer, pointed_thing)
function sl.create_slopeplacer_on_place(def, preset)
	return function(istack, player, pt)
		if not pt.type=="node" then 
			minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node"))
			return istack 
		end
		local pos=pt.above
		if not pos then 
			minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node"))
			return istack
		end
		local node=minetest.get_node(pos)
		if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to then
			minetest.chat_send_player(player:get_player_name(), attrans("Can't place: space occupied!"))
			return istack
		end
		if advtrains.is_protected(pos, player:get_player_name()) then 
			minetest.record_protection_violation(pos, player:get_player_name())
			return istack
		end
		--determine player orientation (only horizontal component)
		--get_look_horizontal may not be available
		local yaw=player.get_look_horizontal and player:get_look_horizontal() or (player:get_look_yaw() - math.pi/2)
		
		--rounding unit vectors is a nice way for selecting 1 of 8 directions since sin(30°) is 0.5.
		dirvec={x=math.floor(math.sin(-yaw)+0.5), y=0, z=math.floor(math.cos(-yaw)+0.5)}
		--translate to direction to look up inside the preset table
		local param2, rot45=({
			[-1]={
				[-1]=2,
				[0]=3,
				[1]=3,
				},
			[0]={
				[-1]=2,
				[1]=0,
				},
			[1]={
				[-1]=1,
				[0]=1,
				[1]=0,
				},
		})[dirvec.x][dirvec.z], dirvec.x~=0 and dirvec.z~=0
		local lookup=preset.slopeplacer
		if rot45 then lookup=preset.slopeplacer_45 end
		
		--go unitvector forward and look how far the next node is
		local step=1
		while step<=lookup.max do
			local node=minetest.get_node(vector.add(pos, dirvec))
			--next node solid?
			if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to or advtrains.is_protected(pos, player:get_player_name()) then 
				--do slopes of this distance exist?
				if lookup[step] then
					if minetest.settings:get_bool("creative_mode") or istack:get_count()>=step then
						--start placing
						local placenodes=lookup[step]
						while step>0 do
							minetest.set_node(pos, {name=def.nodename_prefix.."_"..placenodes[step], param2=param2})
							if not minetest.settings:get_bool("creative_mode") then
								istack:take_item()
							end
							step=step-1
							pos=vector.subtract(pos, dirvec)
						end
					else
						minetest.chat_send_player(player:get_player_name(), attrans("Can't place: Not enough slope items left (@1 required)", step))
					end
				else
					minetest.chat_send_player(player:get_player_name(), attrans("Can't place: There's no slope of length @1",step))
				end
				return istack
			end
			step=step+1
			pos=vector.add(pos, dirvec)
		end
		minetest.chat_send_player(player:get_player_name(), attrans("Can't place: no supporting node at upper end."))
		return itemstack
	end
end

advtrains.slope=sl

--END code, BEGIN definition
--definition format: ([] optional)
--[[{
	nodename_prefix
	texture_prefix
	[shared_texture]
	models_prefix
	models_suffix (with dot)
	[shared_model]
	formats={
		st,cr,swlst,swlcr,swrst,swrcr,vst1,vst2
		(each a table with indices 0-3, for if to register a rail with this 'rotation' table entry. nil is assumed as 'all', set {} to not register at all)
	}
	common={} change something on common rail appearance
}]]









R3T.*lmsn|-'m=rI܌Ȕ43իWA1Ռij5 5 \;E5gmdigVkHD$B$,C!3Cݍ8SelKV>ʕ+|1,f КJX˱004 7LIח?2fsX}GuM;VZek⟓_/9|Bd22ji#B)M7l6<*iՎjto'NF:WC<gc-Ul")-E+mb1T(iYZPRбaUb6Tm-wvwY:I;D"Paw.s9ns;~sۍR>El*O u@::S*WHNҦiQ[sN[vD*[L(&xS4$N2p)"oʼ;'qnw!'ȍVtOSO-+}I]vH|_B6IFzM?}CLa=v19|Fg>ѓ30'[3OCz~s?eMGqCQ fˎ?0Y5 F94 Í210{jStn@ښY b6 \f%3 pc at٦[|5ÚF2olqeSVHmYlՍXFL9L6-G}a9!'Ѹfs;p8Tб jJCo|lL%$[?CVAXՌ-q¨HJpwF!kn &)G#R!(O6IwΜBWnA4Lwp94$2V8ٶf5aQNМV yR`Qvj5ZR͘Y-d ;?9@7:ܟ5;;,' 2+\vP_LLT`>rOTjAض/4G\u)+?Nxyk5IW76_MDԌf&ENPM%XvP*(a^h4./!l4 M9vh6 JJRRa2*?8%O SU*T&fB 05Ta5L5+0`nAU_g)`na%ƶ@ ,̒7'5$i5=}O8zb̓WsƓ&[ ɕapg(py>ҷiKE%2V7L2TUV1d{CI `q#p r 0& QE&lŤXF1|eXၤ`'uOsU)$=9& # O g24v)Xۇ'D۟J6-y¥*QEΑ++,#ౕ;߼@ig,6M;Ckxb1F66!5ɔۿhSgy#5'RGNT* 3$>t%?f&dɑNoTP{CIjA682Jj9[)'ZCN4^M&i 'Jx‹ߛfpBcyuGT<kDQY&5mt]\(kwf̏r9I)|&-AYDƒlC\UlK`JC,LSl}R6ѿOFlș55.Z:O$=$3"Rd!aPM }Sg )ݛ3!&1:Mo{N̠D; 5JCi5_L%a y7TKn[+-i4b̫2"$P z8uOB߯"R Y';>Gzg̚b7k 2h1|^L23"3eXo.  +U-%mR e  >yyP %Eh0`7(BDd\.jO"'&'Ghxc (>]ObdMkv(Lp407jn6 /ireocI3Ѓ"k0q'L$v0.\C.K#=@8;?EE1>g]#$MЖIu"Mmjᖆ&zoZ#$:8MO|>!H&:2IjbCSQLsdjF%ywƅFsK|aZYi0]Óa?Ή,eմbXY-IBm) g#H$b}D|+_MF)A{ʶLpiO (GSârv |g.)h;pc1"ޠm̌y. t( m׃c@wAԤ[^Hk\d$#hgLlʼmޮυ ao БDHy<[;*[r!)JSz2220h ?Y%qM>8#IXӢ&&5XPVGcFY} &:3k{#6hU;vxeV}LG_@?| ~X 1:,`S?lJpK,Yf~bI`{Xչ龌FkrpDDD2Mw^U{:iB~FlɑM%uWK].3K]3\-%VealY{X&G\OZ~r` dfF7`(܌ QF&;4hޖltn7XrgRByIh4am1B)mlO4~h}KD?m | 1\%;죜uW\bYvY۩2eL۲ۛ-uA\vAwd3&9fFnEx55eIT3%hn]2&>wzAtLF TYe/蘻SƛtO5N1Ƹ>Ȃ*X4 UjnJgnKUewk&[L3Hצٓ\V{5ͦm^gj[7' {qIm͸} {oΝJSlErb$ƚctZ[rҋV{=E6ALబŕ:r}l WV95,:`HZZSHr5&7l%euɅt?\ .;˸Ša!ٵ6JJ:YX95 1Y\}K,F2Ls! 84:NHdx˅eVy{)ow|{}+0eP54}PY`#w@&ۯ.49S>MU-7_ءG "/x$S*XyJ*`t(Tǃ l3kHg*5斪ekf !ƒ4͆vg4ݸܝ&FFFG'+;nd禶 S`Qqm&bO!$0f yPMCouZf),pM_e uv ih?s.vIVv2!0ʲajhbaC8YwtK6xYocFbxEk|Nf^4Z8ΚGEb-Co6Λin!+a\4R@j_q<+kΥ0l6܆pԗ an+<ƴM@E2RVUTu4pq7g4|W_r6B '-3ժV,%\8Hxwfns[g#}]ֲL;rhPn23D)r+ 1k կ\a4TʮtQ`BXneX] όAr$~ Њ붌kV 5Ι<1:FAH :rEZ}F(-Eyeq?Y H:=i5Vy&EC8{pݒD*h[Sٮc5!h{{FW/Z8v{aТŽ.[D'{ Řj2C9%3a^*"tn|uVD'yC^oci=s0jd!ǫ \n9oq+ q`0VF!EDaIQtSOGn34*YQN$74)eb-Ph`(d|~9($cYn$"lw>Ew,ZXՒM|(F YjayڮA {\'i &u0aw29Mpk c000|h3 S#vIFcَN0'va9T? ?M=ip'7=z$(mn<ߚgdUsNF@-mJ7k2Ko+].&UW"5XOF $m7Xc9t*-z53LO jb%MC r2 : [Kc?R=:(Db6"pQJShR7m!3ll RJI(,XjB;Pb"HT 1~&S ҐRUD lsW8iP4fv!Y$ۆ Z4ۯ& 5keaײn&[њ?a/JЮWPm:Ь4d K+L3YfXسDfKFI5**j$@"@1+=ku~]LG XQ퓌(tΝjlla0eV*~ϡjjttV),rJR75 %7C I{5s=jRS9h XXYe`­A'B,+qys'@> G/c͆NǏʔs9E)1m5rg0m[3\flН@ A'Gbd?hS/{ 0/-@JEI44,yi. L$"u T6WYgp+kxHwzlpθn*Z&7`]m6)n7̩eSmk7bxn }X`f8 )مՃFƎ (9˧3UD|&Nl/$~]2#eY!?QK F)!12Vv`ҕU{riE|:_jJ")OsRٛ5qskNJ3bf HHnN 6 S n4ΙW<0c~јjZC8) % @`X3!F@:WVysu,;.7sj4,*N౑Ŝn:C%(lm4EcV|UzO~9QZR÷=@qms9#9:xOхQ1xC+w&LEfm›[CKSm*`$Eb:DɌS@@6…Beu0&@Q6ی99tcwNB/$jWWLL0Ƀ ̙ɞfjNf ;]85 ]PȟI?gE)A,eZƺr;N+X1ҍ}r"ZAĕBfigӟ7KNFz7<JqԪnƕ^|zaj-G˨&[uӺH)A,[BN)+.Nܹ"b۶>ãYGZPI M=h`jl9!7;9N̖2.iLS'٧{c3Ns9J;=L'n9Bs"GM*(ލ8+;9CBë ʙ;ަZ1K$&)>45S4-&9n)RY=݄SyldXچ8-Xl=׼8`a2sb{f'!DIEFi<L/(Cxc?"MW rL+Bv}"hn@fd&24T( 0x*X̓q6LyPE=(Nc>m{rQEsdO_CaVRBOyԞ@svȖ=˙b66V]`Ŝx=Vsi" f-ֶ 0>0 EcW w֚2f2DnjX@&S60yX&twdPejUo&U8BI!.a0\ͧ)zPg! B:^@;DV6Ƣƭ,[,ГN L$Α&9\pFelRMt@edXmB·l .7غ=!rAo¦&޼F;"OFKvh1]雄e;*T2M˹/bN7uPL[8 ɼav 5fwjZ˅DM6hЧA;Jxqmh&BڨIㆬڕQe4S9Aћ# IFE)df)LöQL 8>xLt5%Lbڊs3*Ru[ё220`f)NNl'TwfIɇt'v!6)3Eze*UMydnW~Rtnw~Lg~_ɶ]ؑ$6rBg'S;P"1d5ΫڮΝYqDW ,YIIԭ#!dƦkگ**jP(@BPJ;Swo*( J +*U*ʩTS 5lXfYjtFVcYEI[VZ02(,=?n?=:Ȝu[U<&5U^T_uf"3#@L!Ad'tm'U:ѣE0h   -%6M|o=Ri]ii$#" JI̩WU0"Ĕx3MT%zW̔&ꬥH:L2D^TѢ!RVU*U*J-2 ;I\#5Qsa0,zUzT{ "M(Ϋc%,S.d72Fa]UeL@Rj+Jn$(abIT-sH6CO?=maYbfE)QT3 %Suens2M1TT)dhp *h4RD}3,wk#U8wRwaf0V 7 < 7d2O jxLgAAAF@,`c1 أ~Xv⏼4F.QGR )L0`d(KS rTЌ)LBTЦrT*P0c{O`^8`fm!d;"$F|F6 ;d0x;˨dO~j2W '$i0O݂',$IONzdrR`v16ebպGiKeݭo}ߕN6yhtBa ٦>PN%keUUUpAt!H 2)6-l+,c.1Y7ojQ,0J/)ǚc79%儺Ss{n!^y t/C#-ڲ& &.]k1L}*Y@BiĚ1(f[pkI$BI) Hp&KVګh03pvWAqn6n5 TQE%=ϔi)Jlo+#-KVXi1Uvue6LS~QJ3)\YVW?zn)$d5u f'8#  y$ *B3h&Ʊqnĺ}JVi):_|F_*1EЃbŅ,h`E$HE!&œ05dP ,Am7]a2Jēkv7Md+4*cx1CQ(gBju6ZTp*:CM 7}I˹='grn=1ɶY̨SJ3$MpHvb # &$0V\ "qMI*d ) 6|g^dbhɐ #X7kSB+g/%e *{l$+!݇4zpx켅$CpЙLnDRН{!=^{D8tqW9ˆz P 2aѽ%) __Џ JQu>|/Ȥʨ"RPJ5-j jX#J ܊"3"B&jlcmpkZJ3DNƶ0וmd>)KwHODza *5E N"ѡ'("<"b`0׹ЅRE0#ąUcv(.Fl{ߕw&s-Yx#76@̶IfN`A &m =q@>')D+mmFty3:E&qz)1XȏnEn|&Jgc>v!"Aj k9ov:/g=Yퟪ3DTaъt/' >O;n&i̟,jIvD.y5ϖaUU*dM&)JRV;5'_>(Ra5vnЪs$S -U9e29dnO}ξjCX5Sš)ҏ_;zZхbqi~R0ɇ)UNڏ&`h\ae\"?T! 4˹tj3[("IeQ]cU-kXlbEP%,Pg yIxwiR~]~7G콆;@toq4ԅTf\\=V6ƃ96 Gk@L")M<ӄ7i SI4fM!W) Wwv9e4˕fj$xȠ`(m(VWљƞ 9B@YaI0eB'BCbkUS#`S f0Rֶj5jpy0r[m8?żحy͇d)_.d{t]EX,Bt4"ȞE;y6@sھzo'SW ?}J%)J^*/(S )0k:3oDJ6337UV6E@I( C+nj|Q3^po=XKx+"mlb^ut5;4lbtЙJM K&n|JYg,4|&%$FE7kY8r3GzFùoÃn-C.(ۓ%)cQ.Ţ38+{v"=(;7;=KqR^vuQ3kAI䥝!!n#*PtwE, A-$@) LUf\[3a0Lxq<v;qb52cjֽ T!' cؑۻxRX Y524Fv?lb)  L 8'~5L0kjkVq3 8[mFQh~|??Cdљ"άS^æ^p1]l2&!n׌ce$61iY)E2X $ӴK$#p "#23L&9q\f6bL:it&Tf"" hY 8F 3ċ 'i<p=d.jP#Bd4I&ԩB1[mT*)&Q^Sӣ(h"ygvT~G]SXRi,ac od m3 ESd'X3 F0Ͱ$d,K ")Df[)f2B,QEI$DU@>"|Bf>u:\:o9 BΙd`S3:na֯Sh:K*]Kbd'>v̬]>>8p0aYjژ)I#"L4aF4aKꯡ!Pt0W:8ac 5XN0~"oj1qaчt?Ʉju5s3gs ]7'$ N=|Q#^TY(wSd2N9EѝJ`DvEb9S$ij-z0k5gW-۝˷;=%o;]p^/aՅh,+}]}a˭ܰ!ص0c%#l!)2q&$=i S 8u7{X1-O[ *Zm1iL4mp0S`5`3B[k(0CvȠAϋ'LV!d,RMܝH&Ѿߺ`A*Ա-d<%! $=hc;&DJ" FӜSorz *uاv iS!B0YeJ) INGRHd#IymuoUhj`LgMkq`3!$'H~<<:SI8JJS^k,RsZF=xȦ'v0?R\ l\1;=HxfKv>ZAzZqݻivjOq3TI;fdC:=omXYIwRdsNmͱFܦ 0zqI)`0`9̦a@ـX>j5$*_Oˑ$8(gEl~n2fAJjQOz(llڶWGGͷ⒎tq&L0$\ s.8hpR4,gef8tĞ:TNɴܱl+zlͳ3k4WA0* \ժwp`1,katA„YdcjfƓx8 };zhV -Ռ :z/ ViۄݡwHDŨ9hYp) +e& &daϜR^聄vLY 5?$`s#xT[X5e=j&K57 ٻbh_x4C4BTI3!u\$X⫽oRc(e"°10фw+Em06\dh%&&Q̘ =v}@S Э@"f4e!?WEMw% A54MG5TC~Gwb~ПKb&LKͦ-*U6uQJ^+ ֫J@R$3SeQ%))3UIOkUy9'I$s$5GF.j<'~0ɓ^IkqS ;,YB>v`⠑4"\+o㒪""xjY\'=f2z_BzFcYOdꙎ3 /&# b$T&~ih h0?(eᴱ94CכbLpu?pfy\V:)ANjPN=1TLz{ŴԚ29=0u K7"iYVX*#2YfIUU{/ CCjKt=]XT4a dѥ7Җ*ȦL\wQVzBͰCcВ-A-OlBPHi"m]dBjE*)bUd +,qmdxhH#>.kbT\?"jذ w;A2,D?'{CiYb**TU%Fz^Uq/ApnwǢrJ&.) j$6l8d~=(SȒ#ldgit`4,]B%$,v P{K%$dOp*VնINVhM"0$~H*a c0! cMpܠՍF]Hi޶ WtIY,JL6/MAWƧ]zz$tMvr@Q!usŚBL)C]ukchc[:#e #[*~ "qNc݀##D9>t>a. ;(ppy;,YjEEމčtÿ Ne2!D3[o{1=dif4q5I&Um[Yb;\, H. ĥ Jxoy<:Wk&&&ߟB3DK:h)46Mf"~_u]kuvL6AVۤ_\NnS0󙿏N[&kbSW1)hVY5COxJT(:oZ}$!]+m1sKThWcg& DI Ir$"!U"CT7l,0&+G#W&=5Զy$|i[Np= ʧԝYS j8gŋy瘒o/ ؼ}b|ye|&DyL!3ٰ]uVW< KXyN9ZRJɊU? xGo"c]5%jάW5 t:,NS6 R ? J1mX8ΙLHNҦ!e3(+̱ahZ[Ad 'W αEJwʳyLwY vsOY8[OOTC?{GOp k(5QE5]-gLOnOjF\i#{܍#6lz|r۞x o ޜ6xnѠo>XnGDqo0}/>bnC 9E\0#P=(J>IC{7MӌΜV3شOrdl(_J3b$C,D%XdlKr1% lhs\߲ AjOgO:?` v64XZWc8I7<'EDKHy~-ap˰]3lu^d;F8LS$@;sf}7fJdw_ %4Z ADD9vv40UWhvɚΛ8!Icre?C03$Hh8Ld4A )0%",!LWIܾgI*@8MoNJ*6Sa-&8~"f,Zz׌?c~5!HL; /3a.$l(I70k&v|$tqYѥC0oŚ Ns;nTܚχ;D;)~Pޏf$ܵ=sQE_%9NDfbپGe1G;MGon/zFmBXsA*Std9|(f6ٰ 5Й xLvIExT>jRy4)&My`S"=WHg߅ ` {`#vhAIӿ0xc"vc0s;(tD˝I _MY,LVۆ_[u4δ^Pp)X7VU[ent4‘a6ݿKJJ$Hodțrc:NI -N%7`mӳM*:LH]:=<@YRDS4wP9D!g2vnZ716 $,>+is?z547IF03}Y8\|SG6p2{C c#8e@&36-K9! P3>VUN N)NVƈė-6Q6"8Tq{Ba,x_HKvotש5Ji,DS$11|GXb:tQɐ:ॻS hd|n[CL6Z9;wcl ]!$mdC5R1&R2'BƤEmT6s!D4C:Bf#xPAU0"6Oog$L;SxavnОd#va؃̳nˆ_߫I !UflQ &*8 36}u?>a 65L|ij%ڤޓAk{H^&QՎu,3 EI-Ddd]8h-, a)ꪭ]gb&6Ƭoƍ֎9EX֌mtuZ(53}SቴHIǞJp͕Q˵Udܰ 3%@8< A]`ɼCC7[8AiXFCfP|1l9*Y 0 ! E8L0!R8hή0[\,x (vLŕ `IUŋb9j#S7c-P};L51zM vkUⓟ w4#$D0BP`R 0UVDN"iCQLCѥ#lT II44*ac9ۭ6I6gtA8ԴYǾߨcG'qsmcV9>@$|;;uqRWN4#i 2*$wonDָMs'a8-[J_ci+聴CghNIf0Q5J1*c j׵fUTtӛSXbY!Y:ՎbcO1*d̪ mrkr?JݑefẌQܺTrh=)gNSqOQG" > 46.2ƃd8iCK;y۾c @?XTD RT( J((∢ID4`${"N=nj-ldR3S~RĔP#-ek)$|%0YS2BPuv ШOȌ\ wM=t4Ոl C{8 $D8S+`B``zj6I1 d#)b> Y@J$ rutԆamnޙTӴ$^.]Ry әaO76Z!6EлeԅB*͡♩GL-VZZ1"3 DFQ1k΋y7>Rд2N0]L\n31P¾ByQb榛ojS- , )Q<|uD1Lc7vΞ &w}IKjf+2m|ґ؇Zjpa)4J¨]UԒYlDO?ᙟ0aa$M8YAŝ]ȮWKb;D))$C,?va?S#Ʉ ʜ^lܸ&az v2oֶ_ ܥcv*A`Pv*5۱To|Hώ Âe7BJᙚS;x@"x3%68`\e~3dɧUXpQDoԪT {0ZVeKQ,c ]Hn7=)Iʏ7,a9s9L*NJX0R&f q-aUe CɊR9eh⟄dykjRM!ifmdA$Çmw1=iAaTneGQEM>4{_ i.X>\鑇6ңBTLK>E`&(J0UQ`WՖ@[[.8R.#"4S/U'Iy m.xj9:H8p#hT4;1ӳ%]Gr݁Rс%q7y2CG뱯NTÀ\:h,XЗ3,9}4:RU6OLV] bjLL'>sssllQ_Zvo8b4QE?Ǔ锣rk˂r0y2I&x7ڵiUa nK ]ogV6T[ ;!P`~Q#C7$i +^aj8dUKlfn J*jQ'&T^x?t?}P')I\n4-b^ f= 桩\RXGitQqA,X%DJ,E,*˗LMyLygj/(tIOFiqPd#?m#Ւ6lRj DCҰܣR\1NkMRƑZeSY<[?Ass] |IF^X-ÇYU.Pfcÿd_,c[eXK%;q'$6dMyc kN9>AO?0(j  &9q/b0Hq2i0o&πn0lpY,E0[%ZV6 xjQ5Uc){O=E6Pc E>JynA)#h0>pjgQ{1g}=H? TN{G'¥*mHY8sx<xǫ|% y0X65U#aڙ '"2Cӝ9ȼ_׬?Aڲ Up.^4Ԗ;i@o;SIi6)+f$aELr㣐WRѣ̽F>?xt*TV2OiyFI'dv,I5IZ7LH=?: O'{ KR%L%Te$?=z%h4~+$pR>p$wgM4EzzDveWfLTԴfI%UO#|o&!5{ag7&ٹ܆(I=˪qrʿANRD_dO爛<ԚTb1_x;Ztڶa/KSeIfBr ll1k c:-6L,C ~Ɇ14c LtaDKTU͈4Җ,!0ba Ս]uϟp5lߘ;QsN)4R=$sVbX~,3FrUJinM̟6sI"9TYy',\m[2a!^u:cٚlX¯ȫyy~4p4Ŗ*i29&݌i a *;}JI%7U>5dTJB)Bz!R ?zv10x:xD?a+tەMe|f ,/dsyqUuЩ4c cA8'( dݡ B @IeAQ51)S"s:p%,df ON ́*gIJJRop PӀ̔0YCt6ٶ&tf3݌sBAfq 0٣w(H? ;;rR[xi]SAliUzUjSJ^dlaJFR/ϰ|~W֏`=eĞL~?8vxT}9O ^j}7}s*>~>OT ̉ OK;_}7ΔG, !`hp<\sH?0`CD(x5ޏ`~J}DuI $MSG{N2XSnYp-SXS`t`Ύ臗F'  י )MVd6&_lWg70dtq̒!uR4b F]P? ~cӧX{d73Ԙmn&0bjs#gSXqg q#U #9fق܈D)" )>pYI˙g42rYnDs[:V]q艘*TD`Iy;pRPBPm! mA C R?5 R:]ӔPV]MI®o9wAR;vp5khYV ؍e+RHiIA"Ll$ZAZެJrwn`)w.t'ZHPa]2d˧[4LjPa'>~9?W!f٪ u\Boӎqo)有hIM?nc3B[Md[%r /f}r⺃yG8/~C\k``S%Ya yQ?S bSܖt=*_ٗJp,I~Zض_;_[<#wj\£I}b4(3X7lS}!՝r'E릜.E,ѝf&YԃǏD248i1.1,jLUꎌ̙z3mM7q16YleM4ZKUlO E t5 Xjbd0]-M0ʋS#C [-֦,4Z+ˋU 'ãu5IJ`Hr7dH㟳=qeS֥`e[mDF-J ekk&Lhi)I]U&$$$ 2l֓U.MI,ҚSfQ3sq4 ʗfuԺݙ۹:tAteݻ˝29sqMvĻD7fp;JIBvNKJ3mj櫷nݙ72Y+TrvR[Lh]-4ɌJ5RY,EF; \]t3sdw ܦ_kdɺpNs8O{WX>ne2S,O#YɄT稷AE,ZZQM/1Fpʼn u$cy][(M7rv{ 3OYg,dߤ#n?)df0n7?fTj9# ߇~'D)Lz#чF;Q_P~ TGPHR #~7K:9fy9c8V\JrO 4 ӋaT2lNdug@hzc\bj'8vN 7"kMYL&pͰ#<ޘXzRj#˙ fFaGO|I 6CXՒ@`fwe28RHϰ; "% B$M H۰$ѡcD,W!e2 19}VqqSSsve CpMR#! R)L ٙOh|izt9o>8BJ 31bXbYlTES̎AFHk$ 8ud`Y!Myw#KA)QLb%F1^JLۮjK5)6fSPٶRHM:qDL$XOOG' yj$mZL`JiAU !T[LN791A?I2"p{10ʟ$9b:i4O:SGÐS(8o6?<N:͂؁3$@pMgEF]4ODw _@s)[UoxםM)6 J$Lnse;I6OO?{ӷ$(F`b;!wz{ԟ}5g׻~+h4yoN'xҥpӣRdKRLK1,K*y:â>B`3#69#9ä7!Y(> ̣c9IjjBBOAa),}{jnm~xҕ?HvD7 )/2щQH܏~x3L ړMrħ 01$~J70ȥ>ë!(ғ1ɔV,3:֜G8t^s0csFOlJRRb4K%dcK3QY,-,-saij*po9ٶNd9sJ5VKET[nd)8 G/4JTHB`g;y3ra?J%獰^Ry4JR2q]iι-'?mF?{Cڏ$k jQ䓒"7)AG @`ӱo0~pFsGzG/2:S辚ڟ*/ҵlP\"fOP6RzSYdxO<՞A_~OI#0I>訃9A%$D#LsSrTU#񎀎bf&22A>p`2'?vǿH}tc@98'8Mܜ)JdSE&E)JRf)L>yY;i>18ӭgJ?LzRDIS)7RVe7ZՕud@Ɂ AP!N b|1Fsǥt[yVH2`n aR_n,gXd4. ;V&&W> 2OTbp<@Opd88:N &覉0RJJFC/r4l١ -4`d`ݛ1JL 3 SEF& ; .6plFh FƆaa`phe٠hh8::0Æ sgqhAJUT>?ƟlYٛǒ},ЪЖ_2c&͛5HB7 H~*ڿ6Ybt:PR b~'#5{vZnOEQH)JRY,K%*RQOzΞ|a'8T3-5wt͌CI;ubBMuDd!X$dU) 9ûKәa+*2dKN(O?e9 N!öf+!ٌN,$'f5;!&s*TQL)h5 QILNp$`Rߧ=$V#~Fɾ(aQǎGz4'↩r%ʰ,Ͱ |oJpE%3NI6nIB0SFS)E) 9]9𪥫j!f0E0j&Y-VK0e5wBN\$&t~ =ݏzD7BqON(=#ǭp`rf JJE#Uѿ9?oh#tf8RMI7URSBCwDwq A?b0CύmI2S)SwzǛUu|>Lٮ6!DD'^Nۓ'ڌø4C@Odp8hos ([y>#*jЭݓu$ ( Ϛ7J}ރoww+&L4C(~Lg_Y k4B40af}f= ?8t=!'Ox_%eœxbd 9QВZg'02f%2,( M*0R;rH.ȧO?nr1Y>9,9S1܍xE9iIr#h:s7τd3:QQ՝ҌFafI!#937iƮz9dAΊgr-k'OSΪ{v񖆣QSLdGUm)3UV{k%@&kIH`if XO&-K}J>,S?#;Smڵ]ՠ&1}`3, ˉ>Af$}",{+iU# +BհKVX"W&["TJbc3 deUyL'O|NSsT8UUJUJy雳2d+IUaӘhttۣN8qņ6Ӧ4p S p) %$ 򪴔24 fvvr *faZS3$R\T[=>?ޭZK4˓ll66J@#f;VH[ Dx4N`⠀S C#<4sr cޜ!Jg'<7MSpNq=sL5),悥I͔9q3f2\c4OPDfYsTiA w/nKIyEH!S|?=[o.UɕZd?D}T]xqިg4'Ar'}`k%d#!fdc \ώ;d0!kU)J{Að8Gg'OLҚLǨ(rPprnLh3rNJp't/8I\8U6!K)!ث cLF3$}@50J 5N`x(O0g>َ>~叠DuxNm8cH6>}1Oe[94EAÝuuHЪ dbg6t4_&a0iY K X̛a\vo MRI;QFQHߣ\ߛߦwwa*lJݟ8G) (\#Bb< mq%1G<-mzݻލ/JlDOD= 8`D#m$9sџLA 79'pr~lF-Ģ0Դr=|aBIy^kj((-*i''''Ô&ke,yc$V짪fG9b㜱 Õ(TߤI0IXyC}Ó(4MhQ#О3Fw6Nx>{fp̓H+_Ix8I=[>L:iGՙi<ݞ|k7S48gUT!NB{_Bi_?)W˙3,֪9Rcomi{իYdl0V`ۜeJRSN`Շ.f0w 8.LDI)9Q6N ˜ba,S(d0%c),f%#ѫQ>y_nC>GRC.8vA}TO d}~U7z~x9Rf;8}CH2>jJz%hxyr:`ޠgInbI,i民K$L9a-_QJ?VUP7 /IhhwV*=Rlf9)K:ESU%ͶUXj(ljNzSc7989ǰcb|UUUN߃:"",F+ Jעω\d΀g`i2;|:2{~a9ϻٟ{s39%݋8m,QgHr댲2,U` x)G4q\`Mh3r< Q$#V6HūδdR23АLV!h[hSf!Sxi < MƥN<1;LpI_O?,!GG^G%J>0} h4n[ qCQx*%B(^ֵZ)PhwuO6*Rk;XV,EYݜDHYTՈ֨rb`1Fa33rƆ4)Li8 vnJS0)G$} 9#44?pmMa0K,1}=۫sn݁OS{7z鈳ЉX5TK}fsYśZgN=کэA)i*۠MFZ>C[iVյw-+u$e B`k"'> Q}Dh(zLRi5MZ;_W1OG^>? 쑒r$!=ɭ5IfS&cU:NygM72;G0&q몾YF`A,m"gt]s e}ēOR6K&pSW^6YHف=l(D)D3'tT3jv*bAyjk\Sʗ/6Œa8$09qxq5fL#zH5LN 8?&BToɘd(N*}t5RU_7|+|ԓ}$I,ﭶg^1GYx^vISRVܭPYL%(ȘK%Si&6M2#RFZW:pf# <19Ra=QT BvS7sV]8g̲0|XU2szj7UDymiqqq=0NiO%6 n$g*oH7mI3[i|H |LsI` fry"D@P%6J,Nk3Y҇x!bazgI䍲jMdbI$(e,w!_[_P# O2NctZrLs\{ɞa<4viO:;F l[-DcWjKW*g/b',UXŖ,q%O8dLz3qڇ.*D壗E>4v郞u4R7鑠S9ƉX*"ugB 5LK,e-WO-RC*dx .OE9h03 N&-r<2=f#;4ۛg?45SY pQ114 0Gj5]xyIGPri3"<< sfs #P][5)ϻq;xx?HI#'oI&qR& As&Ȑl7*3="TuNQDAchcIw{YJ3)oAtmGqGjOΖYe^=fmga>ߧGh(nTg a5ߒN~ODqÐ;齞^xڏ'y|6 >Ԟjd{CȚ#h0d18i͜aOrڶA#:˖]fet1r̹˴)$`9˜Ξ5:ՏYd?0ÆYSa9w2}!̎ddd`Eu@l0lMd. )49eA6U,Ӳw-(WTR*FKt\tqt`l&'yŪ36۔SZJ0N`3 &f-x{5[u4I)Frk RQ3&ܦaSR`dfXp lwhw64%IRL4 9@B$vׂ"ޞ`BAQPEj EX(AX֊(ĦJ7^7c ?rbx8Xk8g 2nքGڜ#M"dSpSx0|cP\ݏG 6u‘<'/IB~/U/Q5d'bO$z!<)ԲȘT0S9 A"{<@ |GNc3Mou G}Hӟğtd \#Іsֵm8h[mJ{n뜝!rvL$?=_}? r5ɂM(4')$ ſr α$jn'YfLYc1t)b )MqV8{mO0}|ᑼ7!R'*SwsȥJS nTE(Q*R1Ƚ+00#\(ffe&&U.qp8& )a'LpRFCo<,siL{8mf+ Vڵob4x)C_zMcVw$u<9 r>a0Pnnond۷IC _}RpvG#zC;(?8}ȟr?"6' 겸˞Q?Q2?jNMYŒљCbhK46&Revܚ'ݔ5(2Y4Bsێ͞n+AR_VB-hDH_J<`μIN)J| HYڏKmN `֞jUfV0Őȇ0jR j:1NtcsFH]imJYXSCTнe:)gwaE8JnV .smHr0Bq4Hcd}2U\`7qӻ]p)`"1bA\PSՀ<6O!1 㿑 f7 V"RRRTvt?pߛEUUU*U)Q0*Nu0Ody=Ը4Uy3ōQ߄q S5qcXp&,ҵFlI2S2y>UzRiƺl20d1qS8f~1ues`lqG`:510`WM Tݳx3'tDGڈ! "tO^t b$H2IF9O~pq(_A od~SdZSR*e&_y^k֛oì33Df 2VRk,6YMMQieS߽Z626iK/,QRliM&i&Lf[ixĢ dDg'& 6J%ԍ+6[1e<MqTUU*)R*S"$TQJac8:Xb|aFKvlٵLF0ml{q---:-KfM0ŋblw8ph:6hуF-& )*h6bbËÅцeB0lыiàw;hإ7fZȞRpf5уmYjI*1, A$(e03̤{38G8Êu'ěc4+ vِe 3@w:[mme"~!>}k>T} xD1M+X~qDSiufm%7(cF nG)nCOXsI!ړ=L cVl>}z+kJ%T 2zSsO 1Ol<^fTb~Ztߔy'Kv"WWժ[LIleܕsf $TYS#,oaNHBlys! &ԒYc$OC9&VViy\cSR5LJj4̪cP4JgrzCf~G"nۉtߊ7qjߚ9kll;Y/d)P22PP=VIl rS!h*hɪIJ~E7F 8&4JHٷd0%JcoN M#P8z\5kR{0&tݝ+z%erаc1 CO4O Ȧ :X5'# icO8FFERbcsU$Y2ŏLJ?bZaH9/1/s>)KW,Ij)O0s'2n|nQ5O44Nf[WMf9k*-Xӆ=QI$rTg:9*Z[mRhQ4<3s>s;zy'_(O:y6%'̦xFJqi2J=qsCЊQ7 \< :j;m 7&৲7$܊Qwa VhS  ,P`j.P㤇'FWZMrs! [o{~쒽psffcZF_6~RZ??_O%8 t/4~?VK "fYb4|tv]]UCJhҦ$e<_QKuUJ]5mFTRT:F'2`jC["1-Y)K9*?ܡC=&xαbؿff䘓Po 2ڢ ֟y@~# ȈRf̴GL0A0լ4iy/%众_/璦 cT0}pOLy $*(1c y/%}e'Y~1SobEөXT ?xif9bRtdVf: ,10{aG`LK}[ C +pCğҝۿU~RUe,wY7ff3Yٻvfhζ0Sl3B 59Ǡ&S,`2GߦC(RNxsG8r~ @4>Jd~@wh5CT6TA! ':r͇6lYzȟ)7S8t9cbBMV$ '&&?P{ qr 66|˲=5'ݗ͜WEիvbջ'bƹM񸍡dS27IͼΎ;!99G43XO= 7f&2Of8#PS* g9ssPO%&&Õn${3m%9: C;C1Ssҹ;wכ9ENlϪ=7 Up\6'^r'PSH_X4"~`s_n~YFTQ &'04d&z9t͐G*hL5LJ'H$p}{5U6ƕbҾl¹~h5|EMɧ,lΧ dؚ FL'd5[=}VXLnNa3uAdO ƃD(# qW)0w!a,L8 UG~*F[FLtį:4QFؚIؕ r P~,,\\dҞx3W-3½BP~ˍ"YR&07FM3wOCS_"r5 QQKlEMAd~!8BzrybyRf'ړY5ә6<ߦL$iOgTgl5L_*L: H,!?pf?S ɄuFqʖQe;!H֖-'l4qa~HRbTXTxsC)DzQG(ALdWY&ɽa6Fǔ6~Dp2c&LX. |I?\C'B֦9IC7G&a0>Le*eev7ftEL0̏pB #XRzfL؝;,04=NȵmlI>8boLxϚJpEl0Mha #yxG)3LL&q(vLIlTOc1HT;^u'<!|N*24pH늓 δuɅI#PN;W +8*Y,q٧iJcZIJQ*OR0(|FtH?scΌs/fg#rCn=+|'?]zc ?wýi̻w9iOD壣PO}3-6@YB셍pC8<?t&XYJk۝m#N=o? t#ϛٚj AO;?Ge7Sh ?qC]V2_!~!fVgWWڏv_&}#9Fnm>=,dOh8fxS:bnI ΰו1<7VYWɜ_jp;߄ _z.k}(`  <)JhK~epS~oµ(~9l>Bu7_9Q4 Aiz#釧ޑ|3to<_C)YVct#ŏ?P>}A6G%9;N{3=1 dya;A8ꇦ9Qs90?yOzW>n~"?sc>$$jxqO*}MTƝeN̜c3Nm;H/N͎~DsDxYV`~ј3 dLv9z~Ok!Oa!}E /\H_ lgpW@a~#sp'0L&]E߾iI''C<}8ӧYΞ{72v㽠Um6M=d u~C[q٪)N?8q?v? ;63'8s)X|aƓ;#M=Q.K߼Ǡ)=L~Q#Rh$gF9L?>?SG7Ƹo,2s8HON `0?4jmG[Aq%#dFe n :R?u:Aԏ|vgx;4h;A$z9ese[gMdaN|Y󈜹Ɣey:Slc1 =a›tmxAΚkGOwɝ;NΌӯ< ;3l#ŎPSv<*`-;a5g6QƟ: ᦓCՕMB {VEK u0Rim?~/[{@ABlwY49PmКtUT)Dm7$h/xrx/AQ,OUԔ\`ֳ6)p5UJo֥-ߦH ' >Y֦vl{xg=̞$?fgLӦ>֞'n0y&GXlrO=GNǹ>ǒ7'='==a'N;C?u7蟒~'Xsq;➸;cٛ,NsV|ѝlx쎢t3ܞg>~՝)>zϤ}I#Gƞ{)A->~q<ی'6j6cƽ, Cē+N=L|!ܘSdyvg2o6rVS>4xwI팗2wBhM/uhӺvFZQL?dX$5BB䆥`?IXj]F5jBVI#єyGҗ:YVRT)cHUUeeUAݯ JK eaB/W]U&ҰuecM]AqN H*01ߵ)h=DmR6۶To!̖ Jl6@QKܠlZ>Aj9p ;4*o]6Kdf5-kf,O- FLL8ɷdl5q [3bjg^VLU ʬ_ʱ(TjS]R* ʪ FT»~ILx3xi~?dbdd/Ž2ҟA=qߎ >9ntߜf:$'`~r&#1ݓ2H8#ܘG=Ry'=8ΔMg<=|Z;1fn{[Cz؟o@1DtAeuCB'%K1#9CP5 Gib hM8 _K jCN$sý Ձ0j `O)t=dž(ul?Dx' t03,hx?T5F:/*նk[ N= Κּ?~}xz~27r-ySH'~~0Þ;pc(əJZu&C͏|3|{|?sќ5G쟪9OuZ>cdm,'M/@OvcTšNtcP;YG''J?yG;xފ{QO? ~l0<[w0qǨ8C}#t>('vSLBV&S,O>_}u(@\wVkUx?#v8hhI3nRL儮S].ɮׄDD.x哜:wC9G?0Gh~XGS2<(?u| yX>?T xqGJ}1Gǝd@QG.p\>(7# Q?twQN\}OQGzs'=rwnVU'4Ox:qصJ2}şA=qp{Rx%}~>J|v)C4ʲZyg?>dt?,,&ae+˹\mJ,\C֜!<99w^=C-sqq·v*^paǢzJpG>U:RNx9PO`N;|)GxtguG=`:I<ާ[b'Rrys%tucŎUx;1ހCDžvC-b'|xSG?hUS̏=7`b<>lyqF:!4'{DQB>lEShOOˋ:< <?nG}"QLaE3 ّٜTSȔટx2xD:cOzC diXDZߞtg>ucCGǸ=0 ՜ܒwMټOT=I39;y9$T922%;S&T`P*R*`T@6Frh=QBy#9ose)0?lwGΔ'S08uMYQ꼾1~wsz,ͨ,s=nGF|1SyuoȞ%??=a*a2O8'9ɍcE)>A)03c'yߌ°ۏhMDqp䝚~o%,Z§3 J;:>Zz1'c~iO~{|c❉0?.wSNp's18_=\g>aGk?z{C?Μ#<ht=(}'z0z~~,ȳÝӥ:4S?GB}OJ{3՝D>uٝ;#δ䟍? RzsT/OPx<2Ιͪ{wĪM_M=i~_-f>Ѿ[Q~nd*}I~|؞wo Z+=!?P&N>3lzVߞʣ:t'JתҭɚI˞70Gޏ=؝85H'Oo\4 `xhCղcpW}] qbc7sߓ5诔sgt̔'jS4\~gDlh{D0nMAG{S'pnM{㟤 se냧#ևg,~{c|6D߹F}Oыۚ0 ' LFQFh)qL˜+Qkv@|90 v~g0{b" a'GEJN<1ГLxr\\UņǸqgų nnupt:3GBT(W1c63/mK?MdyD_ qYeYm=㻟C !o_6ěj!3y`h߰vj'J#aEV\`5`4gG8e|v9ޔlXS󱋌~{¤ά0c#)>s'zҧ>a?S$<|'`3L'8u 푤1d*'*̨)GX i'*eUGtpPQsoG,!xx,o^tё>0tcRLþ2Nvfwcj}pgu8q[4@*YK/KׯTme!v帷:MLI}1Lz*S94<@Y+}$1ua' 鐞|m~5qF)`HK/-y_t˚_.t\ kQ)""#rO d'u7z&%dv'49߇OḍdAk_`y;`2:iVWXž]:Y[%֮oe.9#vnxg5$<:HOVG"H(GS=Mzͯ="Y&sIb扯l&2kr  9rl"?Ai*PBb+pBf,%ūھ|>z /[H1u ^ 1 B]Bٲ;VnYȷ}K,*RfydždZT3Xؙ?4fW*wG(Gm%MI%ܯl:Jis8F|~2;s+Yc^nvxWvc<+2Wd7nSr:9D&bGCXxq6'37RjsSbV 9ú;x ;rOS9ffα7\^_KY49D`K*t ;6:N{>mq-[~-Ÿo'q+9GٍCwW=qP+h߬GK(d6!X +Q㆛RRk" 0Q9bUYDDKn֫(a+u٬iE>v @β|^_dMI|yH(IU:e59 ϑF};9#:twODL3qN1XV״f̠'*g9}\~O,9i0d~ŜB,, 17JbV Nf2L%YgY13=(r~(ǘdG i䦁5Z;Sc7;߫/i4*3%C& Mt讫] stzqhJ;Ч{ 9 ʞwsG(7vRRryAГ ̜q0<8 lpɴu Mq&'n8c`'4؇BMQq9J5TU=(S1. Nf;HqFFc~}t «汪oc7$ 㕝j9HsTj zNOnnO44虜ވ RtdS`qNLØttԳ~Ji&mOz͊a)n*#88ÚA!3؛`DzM1,< `)kdlcp@܍P:SdnRD`͸Fa3C`&Yl߆0=tw/YCuf]eGzD1lΙy"32㳲..ewG6t[mIxmKeTI! yimNW-m, LSAM[ann7oFh +P*rIÜC`Vrk% iF M",*#C)ʳ#f(SHdLՌPیP3 M;`@Xҟ+J9(݇ VVnsn2 cYbS:pl&)rl--rkhTq>97c0Q&͸Ɯb0ʍb27:-YJgY9 cHS`t#&s&8GD6B[\p(:0O)JsCL Ǔwrܧ&?))ΌS\9j⇉)G&:"nӒ (Cp(Z tB{ 3Jq&%)5&skܣӧFq MZ2NRӝL [r(H]92;g}˫37f{ḛ5ޏm‘;֞}nEV@fyD$&x pe >pT~6$5hV.b NA"dZເ0lN`=G s5ޜ; ;i;(wQpZLwRq1<˜HnG(v=cF:}ARdiLsD0;?IbJbPX3CrnڐN}jđ+;ILh4pw#C[-%G f!P::>*I%@=ګFY0Ɋ,r*ݸzSVw#<_?>\2b_d YYea@t㜞xt qY0U46Q}|ƗmDɹ՚|lIuF|~uSf85ĸ}GrK@N[̭WOiحYt}?km_p\ Jm~x=}?M4\ MEG~@CEN"L05{-Z]7þ1x':WTG=4x駕4My5 Ӱ!)lTZu{QNP]"R!w'rc.IY0oe풔N}S|15At31 gVb"]'$kocd 1x+n?@wtEf(H'XgXcEP1s>y` VnsӸFCu%;?7ݹ/g}9cti΍‡*->u12dYF8$xK gj4mczlpC=j9IL[qScrx:{sxt-i0Ū L7){y5%JD\uged[\V}qO \W &>a嗂GZF/Ȣ?L@k{jk"Pr{h=Y]fpn{Wy>}*#`付1#3HELfӔ۞xdϜSz$Mh/p V6mOO 4)(OPLL@9|@va; $VeVL\,IUers[s:Cqdɓ 0ɲ|N 3@ (\;=5ި|Pw'%3## Н٘#xmb7Gj߸Į5p'4rnL2n25[*SCX=ѾNT4qYdq:8%9pqMЛOϐ&,@r`=<}N,=oeҔMsw!m)-5qR%8(<x|SܐJa#ל9;;qdγTVvLϼ B,fb48wlPC{/ߦ[e%C^\}O:Ϸ jHw¼3+X n17ۮ囷Jw %feUq &΅9'~}clowܱA3TB#&H&X@S p߰iO~("µ^UNt|n⼶3178u^6HN(ڒurHuCđ~ ]_@}aLWpIDDI]#bdVS,eUV;mJx(=K?E=y;%8ZYVU ڪlGv fLѠIzoޔ *IY6QٲLY ЁPTDRQbƊZLcb(% &fc&RZUUUw=<tIG<g$g }T$]&W}5ș}vP_^>ְ[q ~/ &M0@ꇛ4V_6 %Q2ģJc$НIoC#Stir]"sLE5C\ؘUH锪{ToMMR A0AM~AD>SP*W152yJʽ8CѧFt)m՝J(ރP0*t$eo'<4na>:s0#LR?S38%;YK )ͧK(tQAee9T1(j!;F?E'F4=فJ;竟̧֟?rT5gE4s%25L!R;WBR)J)J()J(IJRR(RR2(uU=,K56fv6'ZC:XPȤ>!PdTI>z̵V*2K%&1jdH"fB$ ɳfe!$I),%M~7 'I;9xIl絓+oOA?|4F/ZҰ"LVefaq3G=GvR~(|G8ӜNpx:t#CvNjIA0#.Nk3ank&&Lie\?T?#0SϞ{f)J&76:OrrHM\*d3*alg&Da'7>a h2Mज़Bv11uݙeJLf|L$d3R5M'qbr$o82űjePOTK4& hUa-,5)2C#B^F0ihA0 c&nMI"iK36L%5 *FR4Y: DL”_-p7%. x@bןR3Ϻؐˇg|6V*g#ʑS ªRSJ=ith*`{:G0ELHRR1t wBǚfWqqڶ+1R/jRPovͻkLRAHdf*BB` (P@2D8 IE)IE)E(F "&F&`S9pYZX:\[4hݳwG Öe0كJR S"F h0dK3`R$h)eRQL)d)ehȣ"%`ӁB 1D#"( 0RȲY]5hUVGsG+VѳutѣC-ZYL2YuhCkgǏop9ݦ`(_-~׿`@ْF(($ _ƯƮ<Bd<@'ٌ0'="w%~v$BNC?aR| $EǶq;auN$h'+;[!Q?sW aVM&rwL;)^H6S=;'DdC Úy6ַGHCv`3H z~|u(UUBDJ|fBM1':&63\?{;ÓI'J3=Rq8G  t4Cچț;©6͓݅9 m)W?4Cas1`^ir+av/KݷJ(;uO+kR*? w<~?̛G߽)GdkQ`ag,|ok ȥ8haeYeK)m2W%' a~8Q㽜X83(f3qcYInɿ 'NdP0PvJWypuVR:ET XV%@!iMY夐n5ݩU蒾IPy7,)!RnSTSz7cxLM ٴ6&16s>"z^m-ΩG~I}'|}{"-AE;p1/9 y)""D&|a9Hjk4]9Cvnwa&uɏ2O?$Bdv`~0AHs3OOkM*d`S&7xoJ89އ1STº|ij\/{ڴ*jpAA:ȶ.33V)eȻ$N#w^s2:3 41DAC0#$Qod6fQfc#+)N)ݓrg|Mцi#+nH팒E pA OtmkF؃E-sÎ7aϯ?*sÞ\wS:׮b#γf,zۡ+^ڤ#);Z 0ȟ%~I'? zqGOsm=cۃ͕ڽG'TߓHz~)$1B|T&ܞe=d3[w&$%k}8RvX ͯ7V4xsC8>IC PRk3&nMѾ*+& 1߲ffdΞjHך(5Ӟ Ude9ŝXr\n95<0䜡8S7^!w%ޣ&ees#9') gyosmdF0ݱadwp{C>qRGeյőkJ]hhVRݑǡ^F-L%D $HY'C[[]،aj.KKnU,Uqc,I}l=`e?w~M2;>)'c2l#'>M;b^֛tJ$3̚έuHO4L9~^_OPM#͏8˛C'9tbNYjsFF C'D3p[DqDC +#Oƛ񊱺7p{l`o2n M&RI&Mg4|F&Okë5䪽ФԔK|tfܚ3ixn4͒OO>KjV+%ȿX$imS8!S#"Iֻv'`F~{Ǟ\zC Is37INm#3&3OH3 tg' :=9GHO`Z͙pyTˇn|19s7F'93jp1Ndw!h5sm8 J'=GR{+ KKLd±VAOՙNf=]k鲫,h6l#]sJf}țɒ[yc>|EUTUs@O:|; `,eɑ<,5 &RLĉd:̚MtI,ȒI~ RIII-'KK+zR*_4k}3fus[VyPo[BwL#.MӖnz! cCÜ#8mjVKV\Q˜a6MG*|a'~1 ˑ7r!ڤLs3I *4j$Н!1KWZ8I;ޛ⛲c7Rj˷[)nu슙2K%vܤɦYF1,Īc&0MCP7{m|чi]^m"H>tVVe110b2imSI_g& БO'ʍͶyW5ۉٰ1q6ywCCkzӪo:00e308xSnÓg/ˆ[YɧكZ[J A# @NYc12M8L>>x=T_BթF-ZY'=@H?н 'I58XƲ')(C911XL#K1UUUJZu└2&B0G~aFCOu73ۋ7%L78j2339",Zyܻt ٱCD3vmH19[ruL W9sMZ/\˹nmNJ4N9 MI+<%9ImШ"JQ"sYoӦQDDD/ Jtt;hZ:R/[!8u8ah݌6H(0m/1ef0œ`= [E iZ6IyEzm9m[EU뭑^8\1XU^衉1zr9OW֎OZxAYm‡$D@sIBDQR QĘ0A- 4X TlT&O2b}'=!14,ߥ$NTs:'ĝ~!G (HG ۉ$~F|ĝ~Į3OԻ.)Jf*ZTLQ%5y]s:bu`M:ůBu莐Mmj[mԆT5fgLtbi&#A~OrxHFP|"4wiyҍnYO? SC7,}ȏU,=F,#Cx|fiTgmRm8 $7Xt3FH\WD (70rp[m $'fbI78 new] gppL4L6)?7<O?F,kش2SC%$C>\E#OovLRざX3F)YΗ+t^GVڜ8fR҇EN)MxSJM`R&Qģ4c[eMz:H T<@S̳ S$ˈ &;SUQ#AQ4ǣXhM2"(*:Ԥ6Ŵ 2,5sIÊ0S "G=%LG6Nk{=I&jNtG'߁Mw\SP)Ұ<+ǟ}<ԕ?Y'N'2>߱ef1M) G~a `)2LɨjL#z6ō 3c@9͙VdRd4S)=N< xx 0z,-/ |rfnifQQ7S 2L5 XUcrNWRGuvUON䦓## qfc97d< (|W2a2wigM.E= ըTud!T:쏢5i }DUX[dZY4-.QnusssMpܛhֶQȄ)XjrfSK]-iXҢ[m~\3I䝾sR'_Y[NKN6 vf6lfSF 7"T6?!tj{%@"Ku{V&I5Jg1Zma0Q'U16NPv%E+ٜ/) ľ yS 0*R0oL`|f8%i޽Iz#8fnMf5 CP3='Z<) YzG=rR8&vJB߽fWr,7hi5j{iٓ8Nk qF͌Hymڙړ?]U<9*fu=)20&PI 1q[@Z3OM Lr<4Mb0ZےO>jlz"!x )|"}b)<#'f>GX:4in}uG zte2:TZF W1+(0L$S"7Frs/^ +1XťєSjkÆ8rU1n嵼Pm95EK+TjZDA(jSV D)B)1ees)HemƈP.^5ˆ.2򔖖y͹^,T}>CF rGXP$(ȑ2J%C>t87&>*pL<-4 SU4UQ'cEgBi@WcXµQ(LeÙ FDbahm2rdL.\ ũ*Yo"rCc0i6)\ 9EsG!dYdQGuND颺&c) Eq ~xu4WWM7m&$d$`pӆpǁVfd n\RT&w=E:S&l6f?Hg!';D /f̰aCד2xxqu$QQecjffl21Y&5RC2M3e#pm}O>ݙ)qԦ$8dh)ydujrxISIJ1,%:S}QѹQ;Ytv32U\!bj8caOa Δp 0q5ulXu<$Fqn:c:gu+Y͙jsdJk$$k46S#ʍ}#KHoDS퍦f|Th9BЀBP,ᾢSm;L4c#ֈSb٤Ш, [dާZ–?t 8O`7Шj`L2f6tcpfhK1bDՖ,^Kmj/_6<gqloǧ ' [ۑJ2)${!M:Y^=]ϸ%? '$^m-:BTJYԽ UJ"d&TpOBR}ng&ݷ`m٘o{5/SnTnBlz/-mYae3 4M P]my8w)J=Km8dLj;Kb81L{}P=X*щ5Myf0,eцj% Y9ndSFQD:i':_f]