From bf018c4521c762c450ec293f0fe853c5146ddd20 Mon Sep 17 00:00:00 2001 From: MoNTE48 Date: Sat, 18 May 2019 20:36:28 +0200 Subject: [PATCH] Replace old cart mod on boost_cart --- games/default/files/boost_cart/README.txt | 57 +++ .../default/files/boost_cart/cart_entity.lua | 475 ++++++++++++++++++ games/default/files/boost_cart/depends.txt | 4 + .../default/files/boost_cart/description.txt | 1 + games/default/files/boost_cart/detector.lua | 58 +++ games/default/files/boost_cart/functions.lua | 269 ++++++++++ games/default/files/boost_cart/init.lua | 45 ++ games/default/files/boost_cart/license.txt | 54 ++ games/default/files/boost_cart/mod.conf | 1 + .../files/boost_cart/models/carts_cart.b3d | Bin 0 -> 3008 bytes .../files/boost_cart/models/carts_cart.png | Bin 0 -> 989 bytes games/default/files/boost_cart/rails.lua | 153 ++++++ .../default/files/boost_cart/settingtypes.txt | 6 + .../files/boost_cart/sounds/cart_rail.1.ogg | Bin 0 -> 7543 bytes .../files/boost_cart/sounds/cart_rail.2.ogg | Bin 0 -> 8080 bytes .../files/boost_cart/sounds/cart_rail.3.ogg | Bin 0 -> 7232 bytes .../boost_cart/sounds/carts_cart_moving.1.ogg | Bin 0 -> 14761 bytes .../boost_cart/sounds/carts_cart_moving.2.ogg | Bin 0 -> 14749 bytes .../boost_cart/sounds/carts_cart_moving.3.ogg | Bin 0 -> 14989 bytes .../files/boost_cart/textures/cart_side.png | Bin 0 -> 376 bytes .../files/boost_cart/textures/cart_top.png | Bin 0 -> 398 bytes .../textures/carts_rail_crossing.png | Bin 0 -> 245 bytes .../textures/carts_rail_crossing_brk.png | Bin 0 -> 403 bytes .../textures/carts_rail_crossing_cp.png | Bin 0 -> 513 bytes .../textures/carts_rail_crossing_dtc.png | Bin 0 -> 577 bytes .../textures/carts_rail_crossing_dtc_on.png | Bin 0 -> 577 bytes .../textures/carts_rail_crossing_pwr.png | Bin 0 -> 397 bytes .../textures/carts_rail_crossing_ss.png | Bin 0 -> 579 bytes .../boost_cart/textures/carts_rail_curved.png | Bin 0 -> 240 bytes .../textures/carts_rail_curved_brk.png | Bin 0 -> 378 bytes .../textures/carts_rail_curved_cp.png | Bin 0 -> 417 bytes .../textures/carts_rail_curved_dtc.png | Bin 0 -> 457 bytes .../textures/carts_rail_curved_dtc_on.png | Bin 0 -> 458 bytes .../textures/carts_rail_curved_pwr.png | Bin 0 -> 371 bytes .../textures/carts_rail_curved_ss.png | Bin 0 -> 474 bytes .../textures/carts_rail_straight.png | Bin 0 -> 243 bytes .../textures/carts_rail_straight_brk.png | Bin 0 -> 439 bytes .../textures/carts_rail_straight_cp.png | Bin 0 -> 478 bytes .../textures/carts_rail_straight_dtc.png | Bin 0 -> 516 bytes .../textures/carts_rail_straight_dtc_on.png | Bin 0 -> 516 bytes .../textures/carts_rail_straight_pwr.png | Bin 0 -> 427 bytes .../textures/carts_rail_straight_ss.png | Bin 0 -> 518 bytes .../textures/carts_rail_t_junction.png | Bin 0 -> 415 bytes .../textures/carts_rail_t_junction_brk.png | Bin 0 -> 402 bytes .../textures/carts_rail_t_junction_cp.png | Bin 0 -> 501 bytes .../textures/carts_rail_t_junction_dtc.png | Bin 0 -> 526 bytes .../textures/carts_rail_t_junction_dtc_on.png | Bin 0 -> 528 bytes .../textures/carts_rail_t_junction_pwr.png | Bin 0 -> 402 bytes .../textures/carts_rail_t_junction_ss.png | Bin 0 -> 568 bytes games/default/files/railcart/LICENSE.txt | 21 - games/default/files/railcart/README.txt | 30 -- games/default/files/railcart/depends.txt | 1 - games/default/files/railcart/init.lua | 191 ------- .../files/railcart/models/railcart.b3d | Bin 5626 -> 0 bytes .../files/railcart/models/railcart.blend | Bin 480552 -> 0 bytes games/default/files/railcart/railcart.lua | 444 ---------------- .../files/railcart/textures/railcart.png | Bin 1466 -> 0 bytes .../railcart/textures/railcart_bottom.png | Bin 112 -> 0 bytes .../files/railcart/textures/railcart_side.png | Bin 680 -> 0 bytes .../files/railcart/textures/railcart_top.png | Bin 409 -> 0 bytes games/default/files/railtrack/LICENSE.txt | 14 - games/default/files/railtrack/README.txt | 72 --- games/default/files/railtrack/depends.txt | 1 - games/default/files/railtrack/init.lua | 200 -------- games/default/files/railtrack/railtrack.lua | 288 ----------- .../railtrack/textures/carts_rail_brk.png | Bin 395 -> 0 bytes .../textures/carts_rail_crossing_brk.png | Bin 358 -> 0 bytes .../textures/carts_rail_crossing_pwr.png | Bin 363 -> 0 bytes .../textures/carts_rail_crossing_sup.png | Bin 365 -> 0 bytes .../textures/carts_rail_crossing_swt.png | Bin 357 -> 0 bytes .../textures/carts_rail_curved_brk.png | Bin 351 -> 0 bytes .../textures/carts_rail_curved_pwr.png | Bin 355 -> 0 bytes .../textures/carts_rail_curved_sup.png | Bin 354 -> 0 bytes .../textures/carts_rail_curved_swt.png | Bin 350 -> 0 bytes .../railtrack/textures/carts_rail_pwr.png | Bin 390 -> 0 bytes .../railtrack/textures/carts_rail_sup.png | Bin 391 -> 0 bytes .../railtrack/textures/carts_rail_swt.png | Bin 385 -> 0 bytes .../textures/carts_rail_t_junction_brk.png | Bin 360 -> 0 bytes .../textures/carts_rail_t_junction_pwr.png | Bin 361 -> 0 bytes .../textures/carts_rail_t_junction_sup.png | Bin 362 -> 0 bytes .../textures/carts_rail_t_junction_swt.png | Bin 347 -> 0 bytes .../files/railtrack/textures/default_rail.png | Bin 242 -> 0 bytes .../railtrack/textures/railtrack_fixer.png | Bin 149 -> 0 bytes .../textures/railtrack_inspector.png | Bin 416 -> 0 bytes 84 files changed, 1123 insertions(+), 1262 deletions(-) create mode 100644 games/default/files/boost_cart/README.txt create mode 100644 games/default/files/boost_cart/cart_entity.lua create mode 100644 games/default/files/boost_cart/depends.txt create mode 100644 games/default/files/boost_cart/description.txt create mode 100644 games/default/files/boost_cart/detector.lua create mode 100644 games/default/files/boost_cart/functions.lua create mode 100644 games/default/files/boost_cart/init.lua create mode 100644 games/default/files/boost_cart/license.txt create mode 100644 games/default/files/boost_cart/mod.conf create mode 100644 games/default/files/boost_cart/models/carts_cart.b3d create mode 100644 games/default/files/boost_cart/models/carts_cart.png create mode 100644 games/default/files/boost_cart/rails.lua create mode 100644 games/default/files/boost_cart/settingtypes.txt create mode 100644 games/default/files/boost_cart/sounds/cart_rail.1.ogg create mode 100644 games/default/files/boost_cart/sounds/cart_rail.2.ogg create mode 100644 games/default/files/boost_cart/sounds/cart_rail.3.ogg create mode 100644 games/default/files/boost_cart/sounds/carts_cart_moving.1.ogg create mode 100644 games/default/files/boost_cart/sounds/carts_cart_moving.2.ogg create mode 100644 games/default/files/boost_cart/sounds/carts_cart_moving.3.ogg create mode 100644 games/default/files/boost_cart/textures/cart_side.png create mode 100644 games/default/files/boost_cart/textures/cart_top.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_crossing.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_crossing_brk.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_crossing_cp.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_crossing_dtc.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_crossing_dtc_on.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_crossing_pwr.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_crossing_ss.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_curved.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_curved_brk.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_curved_cp.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_curved_dtc.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_curved_dtc_on.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_curved_pwr.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_curved_ss.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_straight.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_straight_brk.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_straight_cp.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_straight_dtc.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_straight_dtc_on.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_straight_pwr.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_straight_ss.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_t_junction.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_t_junction_brk.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_t_junction_cp.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_t_junction_dtc.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_t_junction_dtc_on.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_t_junction_pwr.png create mode 100644 games/default/files/boost_cart/textures/carts_rail_t_junction_ss.png delete mode 100644 games/default/files/railcart/LICENSE.txt delete mode 100644 games/default/files/railcart/README.txt delete mode 100644 games/default/files/railcart/depends.txt delete mode 100644 games/default/files/railcart/init.lua delete mode 100644 games/default/files/railcart/models/railcart.b3d delete mode 100644 games/default/files/railcart/models/railcart.blend delete mode 100644 games/default/files/railcart/railcart.lua delete mode 100644 games/default/files/railcart/textures/railcart.png delete mode 100644 games/default/files/railcart/textures/railcart_bottom.png delete mode 100644 games/default/files/railcart/textures/railcart_side.png delete mode 100644 games/default/files/railcart/textures/railcart_top.png delete mode 100644 games/default/files/railtrack/LICENSE.txt delete mode 100644 games/default/files/railtrack/README.txt delete mode 100644 games/default/files/railtrack/depends.txt delete mode 100644 games/default/files/railtrack/init.lua delete mode 100644 games/default/files/railtrack/railtrack.lua delete mode 100644 games/default/files/railtrack/textures/carts_rail_brk.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_crossing_brk.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_crossing_pwr.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_crossing_sup.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_crossing_swt.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_curved_brk.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_curved_pwr.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_curved_sup.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_curved_swt.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_pwr.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_sup.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_swt.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_t_junction_brk.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_t_junction_pwr.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_t_junction_sup.png delete mode 100644 games/default/files/railtrack/textures/carts_rail_t_junction_swt.png delete mode 100644 games/default/files/railtrack/textures/default_rail.png delete mode 100644 games/default/files/railtrack/textures/railtrack_fixer.png delete mode 100644 games/default/files/railtrack/textures/railtrack_inspector.png diff --git a/games/default/files/boost_cart/README.txt b/games/default/files/boost_cart/README.txt new file mode 100644 index 000000000..88eec50ee --- /dev/null +++ b/games/default/files/boost_cart/README.txt @@ -0,0 +1,57 @@ + Minetest mod: boost_cart +========================== +Based on (and fully compatible with) the mod "carts" by PilzAdam +and the one contained in the subgame "minetest_game". +Target: Run smoothly as possible, even on laggy servers. + + + Features +---------- +- A fast cart for your railway or roller coaster +- Easily configurable cart speed using the Advanced Settings +- Boost and brake rails +- By mesecons controlled Start-Stop rails +- Detector rails that send a mesecons signal when the cart drives over them +- Rail junction switching with the 'right/left' walking keys +- Handbrake with the 'back' key +- Support for non-minetest_game subgames + + + Settings +---------- +This mod can be adjusted to fit the conditions of a player or server. +Use the Advanced Settings dialog in the main menu or tune your +minetest.conf file manually: + +boost_cart.speed_max = 10 + ^ Possible values: 1 ... 100 + ^ Maximal speed of the cart in m/s + +boost_cart.punch_speed_max = 7 + ^ Possible values: -1 ... 100 + ^ Maximal speed to which the driving player can accelerate the cart + by punching from inside the cart. -1 will disable this feature. + + +Carts, based almost entirely on the mod boost_cart [1], which +itself is based on (and fully compatible with) the carts mod [2]. + +The model was originally designed by stujones11 [3] (CC-0). + +Cart textures are based on original work from PixelBOX by Gambit (permissive +license). + +[1] https://github.com/SmallJoker/boost_cart/ +[2] https://github.com/PilzAdam/carts/ +[3] https://github.com/stujones11/railcart/ + + + Authors +--------- +Various authors + carts_rail_*.png + + +klankbeeld (CC-BY 3.0) + http://freesound.org/people/klankbeeld/sounds/174042/ + cart_rail.*.ogg diff --git a/games/default/files/boost_cart/cart_entity.lua b/games/default/files/boost_cart/cart_entity.lua new file mode 100644 index 000000000..6e1b8d519 --- /dev/null +++ b/games/default/files/boost_cart/cart_entity.lua @@ -0,0 +1,475 @@ + +local HAVE_MESECONS_ENABLED = minetest.global_exists("mesecon") + +function boost_cart:on_rail_step(entity, pos, distance) + -- Play rail sound + if entity.sound_counter <= 0 then + minetest.sound_play("cart_rail", { + pos = pos, + max_hear_distance = 40, + gain = 0.5 + }) + entity.sound_counter = math.random(4, 15) + end + entity.sound_counter = entity.sound_counter - distance + + if HAVE_MESECONS_ENABLED then + boost_cart:signal_detector_rail(pos) + end +end + +local cart_entity = { + initial_properties = { + physical = false, + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + visual = "mesh", + mesh = "carts_cart.b3d", + visual_size = {x=1, y=1}, + textures = {"carts_cart.png"}, + }, + + driver = nil, + punched = false, -- used to re-send velocity and position + velocity = {x=0, y=0, z=0}, -- only used on punch + old_dir = {x=1, y=0, z=0}, -- random value to start the cart on punch + old_pos = nil, + old_switch = 0, + sound_counter = 0, + railtype = nil, + attached_items = {} +} + +function cart_entity:on_rightclick(clicker) + if not clicker or not clicker:is_player() then + return + end + local player_name = clicker:get_player_name() + if self.driver and player_name == self.driver then + self.driver = nil + boost_cart:manage_attachment(clicker, nil) + elseif not self.driver then + self.driver = player_name + boost_cart:manage_attachment(clicker, self.object) + + if default.player_set_animation then + -- player_api(/default) does not update the animation + -- when the player is attached, reset to default animation + default.player_set_animation(clicker, "stand") + end + end +end + +function cart_entity:on_activate(staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) + self.sound_counter = math.random(4, 15) + + if string.sub(staticdata, 1, string.len("return")) ~= "return" then + return + end + local data = minetest.deserialize(staticdata) + if type(data) ~= "table" then + return + end + self.railtype = data.railtype + self.old_dir = data.old_dir or self.old_dir + self.old_pos = data.old_pos or self.old_pos + -- Correct the position when the cart drives further after the last 'step()' + if self.old_pos and boost_cart:is_rail(self.old_pos, self.railtype) then + self.object:set_pos(self.old_pos) + end +end + +function cart_entity:get_staticdata() + return minetest.serialize({ + railtype = self.railtype, + old_dir = self.old_dir, + old_pos = self.old_pos + }) +end + +-- 0.5.x and later: When the driver leaves +function cart_entity:on_detach_child(child) + if child and child:get_player_name() == self.driver then + self.driver = nil + end +end + +function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + local pos = self.object:get_pos() + local vel = self.object:get_velocity() + if not self.railtype or vector.equals(vel, {x=0, y=0, z=0}) then + local node = minetest.get_node(pos).name + self.railtype = minetest.get_item_group(node, "connect_to_raillike") + end + + if not puncher or not puncher:is_player() then + local cart_dir = boost_cart:get_rail_direction(pos, self.old_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + self.velocity = vector.multiply(cart_dir, 3) + self.punched = true + return + end + + if puncher:get_player_control().sneak then + -- Pick up cart: Drop all attachments + if self.driver then + if self.old_pos then + self.object:set_pos(self.old_pos) + end + local player = minetest.get_player_by_name(self.driver) + boost_cart:manage_attachment(player, nil) + end + for _, obj_ in pairs(self.attached_items) do + if obj_ then + obj_:set_detach() + end + end + + local leftover = puncher:get_inventory():add_item("main", "carts:cart") + if not leftover:is_empty() then + minetest.add_item(pos, leftover) + end + + self.object:remove() + return + end + + -- Driver punches to accelerate the cart + if puncher:get_player_name() == self.driver then + if math.abs(vel.x + vel.z) > boost_cart.punch_speed_max then + return + end + end + + local punch_dir = boost_cart:velocity_to_dir(puncher:get_look_dir()) + punch_dir.y = 0 + local cart_dir = boost_cart:get_rail_direction(pos, punch_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + + local punch_interval = 1 + if tool_capabilities and tool_capabilities.full_punch_interval then + punch_interval = tool_capabilities.full_punch_interval + end + time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval) + local f = 3 * (time_from_last_punch / punch_interval) + + self.velocity = vector.multiply(cart_dir, f) + self.old_dir = cart_dir + self.punched = true +end + +-- sound refresh interval = 1.0sec +local function rail_sound(self, dtime) + if not self.sound_ttl then + self.sound_ttl = 1.0 + return + elseif self.sound_ttl > 0 then + self.sound_ttl = self.sound_ttl - dtime + return + end + self.sound_ttl = 1.0 + if self.sound_handle then + local handle = self.sound_handle + self.sound_handle = nil + minetest.after(0.2, minetest.sound_stop, handle) + end + local vel = self.object:get_velocity() + local speed = vector.length(vel) + if speed > 0 then + self.sound_handle = minetest.sound_play( + "carts_cart_moving", { + object = self.object, + gain = (speed / boost_cart.speed_max) / 2, + loop = true, + }) + end +end + + +local v3_len = vector.length +function cart_entity:on_step(dtime) + rail_sound(self, dtime) + local vel = self.object:get_velocity() + if self.punched then + vel = vector.add(vel, self.velocity) + self.object:set_velocity(vel) + self.old_dir.y = 0 + elseif vector.equals(vel, {x=0, y=0, z=0}) then + return + end + + local pos = self.object:get_pos() + local cart_dir = boost_cart:velocity_to_dir(vel) + local same_dir = vector.equals(cart_dir, self.old_dir) + local update = {} + + if self.old_pos and not self.punched and same_dir then + local flo_pos = vector.round(pos) + local flo_old = vector.round(self.old_pos) + if vector.equals(flo_pos, flo_old) then + -- Do not check one node multiple times + return + end + end + + local ctrl, player + local distance = 1 + + -- Get player controls + if self.driver then + player = minetest.get_player_by_name(self.driver) + if player then + ctrl = player:get_player_control() + end + end + + local stop_wiggle = false + if self.old_pos and same_dir then + -- Detection for "skipping" nodes (perhaps use average dtime?) + -- It's sophisticated enough to take the acceleration in account + local acc = self.object:get_acceleration() + distance = dtime * (v3_len(vel) + 0.5 * dtime * v3_len(acc)) + + local new_pos, new_dir = boost_cart:pathfinder( + pos, self.old_pos, self.old_dir, distance, ctrl, + self.old_switch, self.railtype + ) + + if new_pos then + -- No rail found: set to the expected position + pos = new_pos + update.pos = true + cart_dir = new_dir + end + elseif self.old_pos and self.old_dir.y ~= 1 and not self.punched then + -- Stop wiggle + stop_wiggle = true + end + + -- dir: New moving direction of the cart + -- switch_keys: Currently pressed L(1) or R(2) key, + -- used to ignore the key on the next rail node + local dir, switch_keys = boost_cart:get_rail_direction( + pos, cart_dir, ctrl, self.old_switch, self.railtype + ) + local dir_changed = not vector.equals(dir, self.old_dir) + + local acc = 0 + if stop_wiggle or vector.equals(dir, {x=0, y=0, z=0}) then + vel = {x=0, y=0, z=0} + local pos_r = vector.round(pos) + if not boost_cart:is_rail(pos_r, self.railtype) + and self.old_pos then + pos = self.old_pos + elseif not stop_wiggle then + pos = pos_r + else + pos.y = math.floor(pos.y + 0.5) + end + update.pos = true + update.vel = true + else + -- Direction change detected + if dir_changed then + vel = vector.multiply(dir, math.abs(vel.x + vel.z)) + update.vel = true + if dir.y ~= self.old_dir.y then + pos = vector.round(pos) + update.pos = true + end + end + -- Center on the rail + if dir.z ~= 0 and math.floor(pos.x + 0.5) ~= pos.x then + pos.x = math.floor(pos.x + 0.5) + update.pos = true + end + if dir.x ~= 0 and math.floor(pos.z + 0.5) ~= pos.z then + pos.z = math.floor(pos.z + 0.5) + update.pos = true + end + + -- Calculate current cart acceleration + acc = nil + + local acc_meta = minetest.get_meta(pos):get_string("cart_acceleration") + if acc_meta == "halt" and not self.punched then + -- Stop rail + vel = {x=0, y=0, z=0} + acc = false + pos = vector.round(pos) + update.pos = true + update.vel = true + end + if acc == nil then + -- Meta speed modifier + local speed_mod = tonumber(acc_meta) + if speed_mod and speed_mod ~= 0 then + -- Try to make it similar to the original carts mod + acc = speed_mod * 10 + end + end + if acc == nil and boost_cart.mtg_compat then + -- MTG Cart API adaption + local rail_node = minetest.get_node(vector.round(pos)) + local railparam = carts.railparams[rail_node.name] + if railparam and railparam.acceleration then + acc = railparam.acceleration + end + end + if acc ~= false then + -- Handbrake + if ctrl and ctrl.down then + acc = (acc or 0) - 2 + elseif acc == nil then + acc = -0.4 + end + end + + if acc then + -- Slow down or speed up, depending on Y direction + acc = acc + dir.y * -2.1 + else + acc = 0 + end + end + + -- Limit cart speed + local vel_len = vector.length(vel) + if vel_len > boost_cart.speed_max then + vel = vector.multiply(vel, boost_cart.speed_max / vel_len) + update.vel = true + end + if vel_len >= boost_cart.speed_max and acc > 0 then + acc = 0 + end + + self.object:set_acceleration(vector.multiply(dir, acc)) + + self.old_pos = vector.round(pos) + local old_y_dir = self.old_dir.y + if not vector.equals(dir, {x=0, y=0, z=0}) and not stop_wiggle then + self.old_dir = dir + else + -- Cart stopped, set the animation to 0 + self.old_dir.y = 0 + end + self.old_switch = switch_keys + + boost_cart:on_rail_step(self, self.old_pos, distance) + + if self.punched then + -- Collect dropped items + for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do + if not obj_:is_player() and + obj_:get_luaentity() and + not obj_:get_luaentity().physical_state and + obj_:get_luaentity().name == "__builtin:item" then + + obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}) + self.attached_items[#self.attached_items + 1] = obj_ + end + end + self.punched = false + update.vel = true + end + + if not (update.vel or update.pos) then + return + end + -- Re-use "dir", localize self.old_dir + dir = self.old_dir + + local yaw = 0 + if dir.x < 0 then + yaw = 0.5 + elseif dir.x > 0 then + yaw = 1.5 + elseif dir.z < 0 then + yaw = 1 + end + self.object:set_yaw(yaw * math.pi) + + local anim = {x=0, y=0} + if dir.y == -1 then + anim = {x=1, y=1} + elseif dir.y == 1 then + anim = {x=2, y=2} + end + self.object:set_animation(anim, 1, 0) + + -- Change player model rotation, depending on the Y direction + if player and dir.y ~= old_y_dir then + local feet = {x=0, y=0, z=0} + local eye = {x=0, y=-4, z=0} + feet.y = boost_cart.old_player_model and 6 or -4 + if dir.y ~= 0 then + -- TODO: Find a better way to calculate this + if boost_cart.old_player_model then + feet.y = feet.y + 2 + feet.z = -dir.y * 6 + else + feet.y = feet.y + 4 + feet.z = -dir.y * 2 + end + eye.z = -dir.y * 8 + end + player:set_attach(self.object, "", feet, + {x=dir.y * -30, y=0, z=0}) + player:set_eye_offset(eye, eye) + end + + if update.vel then + self.object:set_velocity(vel) + end + if update.pos then + if dir_changed then + self.object:set_pos(pos) + else + self.object:move_to(pos) + end + end +end + +minetest.register_entity(":carts:cart", cart_entity) + +-- Register item to place the entity +if not boost_cart.mtg_compat then + minetest.register_craftitem(":carts:cart", { + description = "Cart (Sneak+Click to pick up)", + inventory_image = minetest.inventorycube( + "cart_top.png", + "cart_side.png", + "cart_side.png" + ), + wield_image = "cart_side.png", + on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing.type == "node" then + return + end + if boost_cart:is_rail(pointed_thing.under) then + minetest.add_entity(pointed_thing.under, "carts:cart") + elseif boost_cart:is_rail(pointed_thing.above) then + minetest.add_entity(pointed_thing.above, "carts:cart") + else + return + end + + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() + end + return itemstack + end, + }) + + minetest.register_craft({ + output = "carts:cart", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, + }) +end diff --git a/games/default/files/boost_cart/depends.txt b/games/default/files/boost_cart/depends.txt new file mode 100644 index 000000000..705a8eb75 --- /dev/null +++ b/games/default/files/boost_cart/depends.txt @@ -0,0 +1,4 @@ +default +mesecons? +moreores? +carts? \ No newline at end of file diff --git a/games/default/files/boost_cart/description.txt b/games/default/files/boost_cart/description.txt new file mode 100644 index 000000000..bbb244c3b --- /dev/null +++ b/games/default/files/boost_cart/description.txt @@ -0,0 +1 @@ +This mod offers improved minecarts and a few more rail types. \ No newline at end of file diff --git a/games/default/files/boost_cart/detector.lua b/games/default/files/boost_cart/detector.lua new file mode 100644 index 000000000..a6c64fdf9 --- /dev/null +++ b/games/default/files/boost_cart/detector.lua @@ -0,0 +1,58 @@ +local mesecons_rules = mesecon.rules.flat + +function boost_cart:turnoff_detector_rail(pos) + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "detector_rail") == 1 then + if node.name == "boost_cart:detectorrail_on" then --has not been dug + minetest.swap_node(pos, {name = "boost_cart:detectorrail", param2=node.param2}) + end + mesecon.receptor_off(pos, mesecons_rules) + end +end + +function boost_cart:signal_detector_rail(pos) + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "detector_rail") ~= 1 then + return + end + + if node.name == "boost_cart:detectorrail" then + minetest.swap_node(pos, {name = "boost_cart:detectorrail_on", param2=node.param2}) + end + mesecon.receptor_on(pos, mesecons_rules) + minetest.after(0.5, boost_cart.turnoff_detector_rail, boost_cart, pos) +end + +boost_cart:register_rail("boost_cart:detectorrail", { + description = "Detector rail", + tiles = { + "carts_rail_straight_dtc.png", "carts_rail_curved_dtc.png", + "carts_rail_t_junction_dtc.png", "carts_rail_crossing_dtc.png" + }, + groups = boost_cart:get_rail_groups({detector_rail = 1}), + + mesecons = {receptor = {state = "off", rules = mesecons_rules}}, +}) + +boost_cart:register_rail("boost_cart:detectorrail_on", { + description = "Detector rail ON (you hacker you)", + tiles = { + "carts_rail_straight_dtc_on.png", "carts_rail_curved_dtc_on.png", + "carts_rail_t_junction_dtc_on.png", "carts_rail_crossing_dtc_on.png" + }, + groups = boost_cart:get_rail_groups({ + detector_rail = 1, not_in_creative_inventory = 1 + }), + drop = "boost_cart:detectorrail", + + mesecons = {receptor = {state = "on", rules = mesecons_rules}}, +}) + +minetest.register_craft({ + output = "boost_cart:detectorrail 6", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "mesecons_pressureplates:pressure_plate_stone_off", "default:steel_ingot"}, + {"default:steel_ingot", "mesecons:wire_00000000_off", "default:steel_ingot"}, + }, +}) diff --git a/games/default/files/boost_cart/functions.lua b/games/default/files/boost_cart/functions.lua new file mode 100644 index 000000000..b77deea20 --- /dev/null +++ b/games/default/files/boost_cart/functions.lua @@ -0,0 +1,269 @@ +function boost_cart:get_sign(z) + if z == 0 then + return 0 + else + return z / math.abs(z) + end +end + +function boost_cart:manage_attachment(player, obj) + if not player then + return + end + local status = obj ~= nil + local player_name = player:get_player_name() + if default.player_attached[player_name] == status then + return + end + default.player_attached[player_name] = status + + if status then + local y_pos = self.old_player_model and 6 or -4 + if player:get_properties().visual == "upright_sprite" then + y_pos = -4 + end + player:set_attach(obj, "", {x=0, y=y_pos, z=0}, {x=0, y=0, z=0}) + player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0}) + else + player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + -- HACK in effect! Force updating the attachment rotation + player:set_properties({}) + end +end + +function boost_cart:velocity_to_dir(v) + if math.abs(v.x) > math.abs(v.z) then + return {x=self:get_sign(v.x), y=self:get_sign(v.y), z=0} + else + return {x=0, y=self:get_sign(v.y), z=self:get_sign(v.z)} + end +end + +local get_node = minetest.get_node +local get_item_group = minetest.get_item_group +function boost_cart:is_rail(pos, railtype) + local node = get_node(pos).name + if node == "ignore" then + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(pos, pos) + local area = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax, + } + local data = vm:get_data() + local vi = area:indexp(pos) + node = minetest.get_name_from_content_id(data[vi]) + end + if get_item_group(node, "rail") == 0 then + return false + end + if not railtype then + return true + end + return get_item_group(node, "connect_to_raillike") == railtype +end + +function boost_cart:check_front_up_down(pos, dir_, check_up, railtype) + local dir = vector.new(dir_) + local cur = nil + + -- Front + dir.y = 0 + cur = vector.add(pos, dir) + if self:is_rail(cur, railtype) then + return dir + end + -- Up + if check_up then + dir.y = 1 + cur = vector.add(pos, dir) + if self:is_rail(cur, railtype) then + return dir + end + end + -- Down + dir.y = -1 + cur = vector.add(pos, dir) + if self:is_rail(cur, railtype) then + return dir + end + return nil +end + +function boost_cart:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) + local pos = vector.round(pos_) + local cur = nil + local left_check, right_check = true, true + + -- Check left and right + local left = {x=0, y=0, z=0} + local right = {x=0, y=0, z=0} + if dir.z ~= 0 and dir.x == 0 then + left.x = -dir.z + right.x = dir.z + elseif dir.x ~= 0 and dir.z == 0 then + left.z = dir.x + right.z = -dir.x + end + + local straight_priority = ctrl and dir.y ~= 0 + + -- Normal, to disallow rail switching up- & downhill + if straight_priority then + cur = self:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + end + + if ctrl then + if old_switch == 1 then + left_check = false + elseif old_switch == 2 then + right_check = false + end + if ctrl.left and left_check then + cur = self:check_front_up_down(pos, left, false, railtype) + if cur then + return cur, 1 + end + left_check = false + end + if ctrl.right and right_check then + cur = self:check_front_up_down(pos, right, false, railtype) + if cur then + return cur, 2 + end + right_check = true + end + end + + -- Normal + if not straight_priority then + cur = self:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + end + + -- Left, if not already checked + if left_check then + cur = self:check_front_up_down(pos, left, false, railtype) + if cur then + return cur + end + end + + -- Right, if not already checked + if right_check then + cur = self:check_front_up_down(pos, right, false, railtype) + if cur then + return cur + end + end + + -- Backwards + if not old_switch then + cur = self:check_front_up_down(pos, { + x = -dir.x, + y = dir.y, + z = -dir.z + }, true, railtype) + if cur then + return cur + end + end + + return {x=0, y=0, z=0} +end + +function boost_cart:pathfinder(pos_, old_pos, old_dir, distance, ctrl, + pf_switch, railtype) + + local pos = vector.round(pos_) + if vector.equals(old_pos, pos) then + return + end + + local pf_pos = vector.round(old_pos) + local pf_dir = vector.new(old_dir) + distance = math.min(boost_cart.path_distance_max, + math.floor(distance + 1)) + + for i = 1, distance do + pf_dir, pf_switch = self:get_rail_direction( + pf_pos, pf_dir, ctrl, pf_switch or 0, railtype) + + if vector.equals(pf_dir, {x=0, y=0, z=0}) then + -- No way forwards + return pf_pos, pf_dir + end + + pf_pos = vector.add(pf_pos, pf_dir) + + if vector.equals(pf_pos, pos) then + -- Success! Cart moved on correctly + return + end + end + -- Not found. Put cart to predicted position + return pf_pos, pf_dir +end + +function boost_cart:boost_rail(pos, amount) + minetest.get_meta(pos):set_string("cart_acceleration", tostring(amount)) + for _,obj_ in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do + if not obj_:is_player() and + obj_:get_luaentity() and + obj_:get_luaentity().name == "carts:cart" then + obj_:get_luaentity():on_punch() + end + end +end + +function boost_cart:register_rail(name, def_overwrite) + local sound_func = default.node_sound_metal_defaults + or default.node_sound_defaults + + local def = { + drawtype = "raillike", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + sounds = sound_func() + } + for k, v in pairs(def_overwrite) do + def[k] = v + end + if not def.inventory_image then + def.wield_image = def.tiles[1] + def.inventory_image = def.tiles[1] + end + + minetest.register_node(name, def) +end + +function boost_cart:get_rail_groups(additional_groups) + -- Get the default rail groups and add more when a table is given + local groups = { + dig_immediate = 2, + attached_node = 1, + rail = 1, + connect_to_raillike = 1 + } + if minetest.raillike_group then + groups.connect_to_raillike = minetest.raillike_group("rail") + end + if type(additional_groups) == "table" then + for k, v in pairs(additional_groups) do + groups[k] = v + end + end + return groups +end diff --git a/games/default/files/boost_cart/init.lua b/games/default/files/boost_cart/init.lua new file mode 100644 index 000000000..217d4f749 --- /dev/null +++ b/games/default/files/boost_cart/init.lua @@ -0,0 +1,45 @@ +boost_cart = {} +boost_cart.modpath = minetest.get_modpath("boost_cart") + +local function getNum(setting) + return tonumber(minetest.settings:get(setting)) +end + +-- Maximal speed of the cart in m/s +boost_cart.speed_max = getNum("boost_cart.speed_max") or 12 +-- Set to -1 to disable punching the cart from inside +boost_cart.punch_speed_max = getNum("boost_cart.punch_speed_max") or 8 +-- Maximal distance for the path correction (for dtime peaks) +boost_cart.path_distance_max = 3 + +-- Support for non-default games +if not default.player_attached then + default.player_attached = {} +end + +minetest.after(0, function() + boost_cart.old_player_model = not minetest.global_exists("player_api") +end) + +dofile(boost_cart.modpath.."/functions.lua") +dofile(boost_cart.modpath.."/rails.lua") + +if minetest.global_exists("mesecon") then + dofile(boost_cart.modpath.."/detector.lua") +--else +-- minetest.register_alias("carts:powerrail", "boost_cart:detectorrail") +-- minetest.register_alias("carts:powerrail", "boost_cart:detectorrail_on") +end + +dofile(boost_cart.modpath.."/cart_entity.lua") + +-- Aliases +minetest.register_alias("railcart:cart", "carts:cart") +minetest.register_alias("railcart:cart_entity", "carts:cart") +minetest.register_alias("default:rail", "boost_cart:rail") +minetest.register_alias("railtrack:powerrail", "carts:powerrail") +minetest.register_alias("railtrack:superrail", "carts:powerrail") +minetest.register_alias("railtrack:brakerail", "carts:brakerail") +minetest.register_alias("railtrack:switchrail", "boost_cart:startstoprail") +minetest.register_alias("railtrack:fixer", "default:stick") +minetest.register_alias("railtrack:inspector", "default:stick") \ No newline at end of file diff --git a/games/default/files/boost_cart/license.txt b/games/default/files/boost_cart/license.txt new file mode 100644 index 000000000..6c5beb477 --- /dev/null +++ b/games/default/files/boost_cart/license.txt @@ -0,0 +1,54 @@ + +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 SmallJoker +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media +----------------- + +CC-0, see: https://creativecommons.org/share-your-work/public-domain/cc0/, except +if other license is mentioned. + + +Authors +--------- +Originally from PixelBOX (Gambit): + carts_cart_side.png + carts_cart_top.png + carts_cart_front.png* + carts_cart.png* + +sofar + stujones11: + carts_cart.b3d and carts_cart.blend + +hexafraction, modified by sofar + carts_rail_*.png + +http://www.freesound.org/people/YleArkisto/sounds/253159/ - YleArkisto - CC-BY-3.0 + carts_cart_moving.*.ogg diff --git a/games/default/files/boost_cart/mod.conf b/games/default/files/boost_cart/mod.conf new file mode 100644 index 000000000..7da19df8c --- /dev/null +++ b/games/default/files/boost_cart/mod.conf @@ -0,0 +1 @@ +name = boost_cart \ No newline at end of file diff --git a/games/default/files/boost_cart/models/carts_cart.b3d b/games/default/files/boost_cart/models/carts_cart.b3d new file mode 100644 index 0000000000000000000000000000000000000000..4e7eba363de4d01da5e924e7517eaa44879879be GIT binary patch literal 3008 zcmbW3OHUL*6om@}eBl$tw}MZ6A&Tf~rrVK8BnC(rG;v`}2rm;7jf#mYJ8?(iA8^C` z1rrypU=r8HpWhlv3+uu0V(H$iZ7#vXsp(SpR+p60 z?ZQTFwPH-U(qYQsz}KF24>e*UL0k@r*J`W8gIJt7jW}~+@pTuAf;Np4`=vU5t*xPW z}vLB_rO}>%3C20>U(3o>n-hk zT>X^&+5U8{Hb3Va%fGJDwtiCozP{!poj>&>?K4q78&BS!tsf+xkK12H|7rT#`t|iYVP{Pabfd9iq-KlVj_>csLl_Lm+vIlp$3 z^RfHO{r~>l`KH&e=Ck&ftdBeY^!}~B3Fk|H#&B-rXw}E{pSAz2`;n}#%b&i!nooH@ zBDJ6Le!2HAtA6tP>DDLz|FChBpD zA45Iuf;Y_;?=#*dbP64UKA+ad-XUxk^m#S#(Dc^~_za6~vP9P>W*N#TTWTsY-@?9)QO&?lS`@UhPe=Y+Gu1@B{D5-th@!e#Gc z^V8(2a7DQ0ee4?oKU0PT#Kp(HC5#9+h1=f8zB4g4&c1m#Ph*}J_!09_2VHnJ`^FA6 z|F{o=|L`@3^^q$~P82J3W#l_E3J{F>E_oCn3O-`N2nQn?j5si&!3YQ=9_*Tp0>r~d zNEi`e#DWnKMo<_rVMK!w6Gm7VQDMY`5fw&Y7;#}lgb^1;Xc&>p)?fVmhjmjb?Dd{p`* z3q8D?kxc)z=pVU2U1x(IDh~*1`hf>D#uN2^|FZVv-IBixjk%SCxq0Tg`|@vde*;IC B>mUFC literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/models/carts_cart.png b/games/default/files/boost_cart/models/carts_cart.png new file mode 100644 index 0000000000000000000000000000000000000000..770100686e84c2ffd394dd41132d36e9cbb14ad0 GIT binary patch literal 989 zcmV<310wv1P)6cnLVN^>4f_XE;Jb(sygMk4;nWz^VFllBJVGoKzGVEaz!qL$Y2EV-4xp3ja zcP};CFU0=+X!zUP2Okbg^>paZ_j=%~c@5+LJ{kV_S_>NF}I9bnH#(psY$XcR+ zd7ix9ym|A*^<0oi2qK$jU>X!m15~IFAZum-X8D-^ z-NXE6(+WE{Jw5$;-sBiR9aYHspZ9xTPOE^dB?_45$tyI-R*6!SrDenf;$by2Z)9Mw zm_!ILP*Nu+C!dVV2%$oK09i8wFk@Z`L4&;30QJ|q1`M{Z0E64NZ_5Bb=7|Mj%1vNT zXlbA`m^BSVYng})8rcZn(1m9i=nRkiR=cAOvsA4tI1skDv|4cpkECGbV-)1Edyd^FrY-`R0tYm*ZqKhi|eH$c=fpuwT;G;r4soCXTY$snRK0K}Yu3|#jE8IZVDchvLo zwFa*HfeyJ}igk=|*t?UB`Z5s{e$Q4q>;*>5@88{GMu+UWA23*kN-pX{h$rBcKL;~F z^-Y7YPrs?_exM;yvd+f?0%a+tf=q&-cN>D3uKR(m3KYwkFj*s1OoaehQ=dXIR8EHj zo*is-Rk-g5j>}Fw)|`3SeeZIhZVqcldOEkS>sq(J^|S}hSg%h3N!LXlmJhZN00000 LNkvXXu0mjf_$9<( literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/rails.lua b/games/default/files/boost_cart/rails.lua new file mode 100644 index 000000000..117798d4a --- /dev/null +++ b/games/default/files/boost_cart/rails.lua @@ -0,0 +1,153 @@ +-- Common rail registrations + +boost_cart:register_rail("boost_cart:rail", { + description = "Rail", + tiles = { + "carts_rail_straight.png", "carts_rail_curved.png", + "carts_rail_t_junction.png", "carts_rail_crossing.png" + }, + groups = boost_cart:get_rail_groups(), +}, {}) + +minetest.register_craft({ + output = "boost_cart:rail 16", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "group:stick", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + } +}) + +--[[ +-- Moreores' copper rail +if minetest.get_modpath("moreores") then + minetest.register_alias("carts:copperrail", "moreores:copper_rail") + + if minetest.raillike_group then + -- Ensure that this rail uses the same connect_to_raillike + local new_groups = minetest.registered_nodes["moreores:copper_rail"].groups + new_groups.connect_to_raillike = minetest.raillike_group("rail") + minetest.override_item("moreores:copper_rail", { + groups = new_groups + }) + end +else + boost_cart:register_rail(":carts:copperrail", { + description = "Copper rail", + tiles = { + "carts_rail_straight_cp.png", "carts_rail_curved_cp.png", + "carts_rail_t_junction_cp.png", "carts_rail_crossing_cp.png" + }, + groups = boost_cart:get_rail_groups() + }) + + minetest.register_craft({ + output = "carts:copperrail 12", + recipe = { + {"default:copper_ingot", "", "default:copper_ingot"}, + {"default:copper_ingot", "group:stick", "default:copper_ingot"}, + {"default:copper_ingot", "", "default:copper_ingot"}, + } + }) +end +]] +-- Power rail +boost_cart:register_rail(":carts:powerrail", { + description = "Powered rail", + tiles = { + "carts_rail_straight_pwr.png", "carts_rail_curved_pwr.png", + "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png" + }, + groups = boost_cart:get_rail_groups(), + after_place_node = function(pos, placer, itemstack) + if not mesecon then + minetest.get_meta(pos):set_string("cart_acceleration", "0.5") + end + end, + mesecons = { + effector = { + action_on = function(pos, node) + boost_cart:boost_rail(pos, 0.5) + end, + action_off = function(pos, node) + minetest.get_meta(pos):set_string("cart_acceleration", "0") + end, + }, + }, +}) + +minetest.register_craft({ + output = "carts:powerrail 6", + recipe = { + {"default:gold_ingot", "", "default:gold_ingot"}, + {"default:gold_ingot", "group:stick", "default:gold_ingot"}, + {"default:gold_ingot", "mesecons:wire_00000000_off", "default:gold_ingot"}, + } +}) + +-- Brake rail +boost_cart:register_rail(":carts:brakerail", { + description = "Brake rail", + tiles = { + "carts_rail_straight_brk.png", "carts_rail_curved_brk.png", + "carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png" + }, + groups = boost_cart:get_rail_groups(), + after_place_node = function(pos, placer, itemstack) + if not mesecon then + minetest.get_meta(pos):set_string("cart_acceleration", "-0.3") + end + end, + mesecons = { + effector = { + action_on = function(pos, node) + minetest.get_meta(pos):set_string("cart_acceleration", "-0.3") + end, + action_off = function(pos, node) + minetest.get_meta(pos):set_string("cart_acceleration", "0") + end, + }, + }, +}) + +minetest.register_craft({ + output = "carts:brakerail 6", + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "group:stick", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + } +}) + +boost_cart:register_rail("boost_cart:startstoprail", { + description = "Start-stop rail", + tiles = { + "carts_rail_straight_ss.png", "carts_rail_curved_ss.png", + "carts_rail_t_junction_ss.png", "carts_rail_crossing_ss.png" + }, + groups = boost_cart:get_rail_groups(), + after_place_node = function(pos, placer, itemstack) + if not mesecon then + minetest.get_meta(pos):set_string("cart_acceleration", "halt") + end + end, + mesecons = { + effector = { + action_on = function(pos, node) + boost_cart:boost_rail(pos, 0.5) + end, + action_off = function(pos, node) + minetest.get_meta(pos):set_string("cart_acceleration", "halt") + end, + }, + }, +}) + +minetest.register_craft({ + output = "boost_cart:startstoprail 2", + recipe = { + {"default:steel_ingot", "group:stick", "default:steel_ingot"}, + {"default:steel_ingot", "mesecons_torch:mesecon_torch_on", "default:steel_ingot"}, + {"default:steel_ingot", "group:stick", "default:steel_ingot"}, + } +}) diff --git a/games/default/files/boost_cart/settingtypes.txt b/games/default/files/boost_cart/settingtypes.txt new file mode 100644 index 000000000..d64d88a63 --- /dev/null +++ b/games/default/files/boost_cart/settingtypes.txt @@ -0,0 +1,6 @@ +# Maximal speed of the cart in m/s (min=1, max=100) +boost_cart.speed_max (Maximal speed) int 10 1 100 + +# Maximal speed to which the driving player can accelerate the cart by punching +# from inside the cart. -1 will disable this feature. (min=-1, max=100) +boost_cart.punch_speed_max (Maximal punch speed) int 7 -1 100 \ No newline at end of file diff --git a/games/default/files/boost_cart/sounds/cart_rail.1.ogg b/games/default/files/boost_cart/sounds/cart_rail.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ba2d9ef8c7bd373a2d927dc3bed66ed1d16f69ea GIT binary patch literal 7543 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 literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/sounds/cart_rail.2.ogg b/games/default/files/boost_cart/sounds/cart_rail.2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1b930f03e1fcd489c0a29a43f25faf2e828ae394 GIT binary patch literal 8080 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 literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/sounds/carts_cart_moving.1.ogg b/games/default/files/boost_cart/sounds/carts_cart_moving.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..869e765b84acb081468bba060ba973bff409dec5 GIT binary patch literal 14761 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 literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/sounds/carts_cart_moving.2.ogg b/games/default/files/boost_cart/sounds/carts_cart_moving.2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b4cc5084388f475ef3c47842a1593d6a1bb71604 GIT binary patch literal 14749 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 literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/sounds/carts_cart_moving.3.ogg b/games/default/files/boost_cart/sounds/carts_cart_moving.3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e19a782d85038a12ab273870ab8e2dc0a4eaa3c3 GIT binary patch literal 14989 zcmaiabyVCjv*2&acPl7ixg;aUtEg2yIXNBZpGaTMM|-^ zwD-IBzCYf1IobRsGs$E!nPet8t88JR20#Y%0%NY zb1D!O7Y8RV2PX$F72|qJz<+1pqfoerpMsUCnZ1*lsH7yTgf=TT8;2+Y356(#S~@#_ z5MpO{b#-MkcQi9|dJnUI$M)XQg8hTp`wzBe?Ao?w;*K^}PR{Sy|I(b;xp=ubc?H># zp8k{QwS=Sw65uTWKqo|=pgTn86h)nrArYj@ z`00BT6!6#~P}~haAVeIUI)F}8E5@He6afVZB5+oZI2?)p6w-p02&yD2NB@*R zrbJM(KZy4?X@G^e8{xk(XvO8C{87dGi34QB5fY#ZHsA*gi5HLtFbSel22k<5BLGAJ z02x_~Az6&ia7e430r~*|oVTj@eGX&;(PRUaWSHpBwVxtZ7J!auCl`_<7qKZ9L#rJ_ z_cw0`7qJXg{moo|yUPIpDymr04)|z)`@I7I&@%)=aF)F?Hx{o!#R9%DVApB!9ajbci!yWnPFH#PNg#_3t_$#PG!p;pq1LkCJ_f z!Pr?CrGhJ|8yVWz$>2&s@>IE6_n4HBM!}s_r_q7!RL)TZl$ENDm5gY&liHo3{p=sa zQ0e|XnduSdFuG@yirb5T=u6$BlEZ5e(9=?@h-CRn1SHq!4oQ)J#5p~(`djSx?2)Cu ze5@9zYseP0`oKcz)Xb&Sz%m5EY-t* z3!%f3YHVRF&Tbq@=F)D6njP5uhf*Po{oh1@y~Iw#g1fYEoc~M{v7mqt__BZP4OB%d zKS4V(!J_<&NBO0wD!%k24|JSBUzOiZmCtOFS6_`!AF5%e8E>as2U|=qTfFjG`CnNd z?e7%v005yF8eq(8V9bU<1TE;TWj_<(E$ZWr3|VK4*bs=J1;x-=#aOt<7bGR`C8aYJ z{cQrkd2I5SLh{@~3f)2q+#+^^Vl0#53ks8&2lEb_$`1a28S}4!(*gj_w6c!0vJhHn z2m<)4U0L zbs8c)tp@%7CB;b|#g_=hVmxlx4zhqz)`BPy25VvnV>j(CL>vvcJIdjgafK)7pW25n zC=t~g4+=B!@<`Hv)>FU&NHc}DQ zea2i;`B3s)eAAFhL?-|m;)j{}J&FM7Ej|G72?z2F_!(|83fzf;403LhK|%!cQ`JTV z8Pni{g7j&zc);9LQv@{?J__1Ojhz57BJ86B3GtI)d+-Z zD74;8_Yz?zuoZ5_c|z#)j3TrahNv#Z*)1jfH!J9@I#ibrI$g)B>a4E{HPc3Lb}^f+ zgKEye6!GCeE7i61%7PQ#!sFvA(U zl?0f+7X4qT^q~l;coCctQrRI`Y5teY(D@74G|W!_rS$A0XK84hKBDhRoY`NQAE|0E zn0}p|X`-DjkrF~?1l2fBe<=aBNNlfv6+Xgax9F^|&#$jJYp2iuMSIrEP#tQhX*SQV zp?!(ihn27uVj1W(OwHx9AKumaB5V!@D{sJNS8--;c8i+k`V7NOc4W=v+}_3rU(n(E1n|}u!z|;k zd87gW{!varK=f!6g!2P_#({(o`$q{f(3vWMfpoPhU~61c9HzdUccUPT+!}na6%an5 z1Ei}{0f&~>>ZsXNeu3y<=GJI|tvG8nOl?YggE%pgoFH5~IdF&$b8bz%plq&F6aK;{&IwZI-2j7&Dt~Uk}Mwd&f8^T&o?1YVA1qrT15JG`{gr=jo zrYZ+Qb#2)g4M7%2*FAo1T-H7?NjAUiOW8+0s#?H*&1TBltlaK7li|i%4V%A%m(b-dn3U8a27jL0tpzE3>``1f zOKds6RU;x!K0D$8Q=MELmGlUm|qat=^Y>XfpbpV`ehbkZnvO^XSqjQkz zuL8Eog~N41E8#H^8%{!muU|!YXe0l;?sdTDFC{1d2oeA*!c;rmBDu(VD1y#Cov|pd zc)yNDJDnkHftul@%YPTm8kb9JC>N6%~~+54F87DngvJh_K>k zO3{830#kK_S$r^9#j;pu|LWU*6C&cMvpX1cKs35(t0a@HE4yjpxb6LbICn)lkpKl9 zU#4-DLVA%gACJO!2oZa!-r+#{sR9uG6c_-9AY2kE832H+!1&~^*jb1(|8+_2jE-q3 zq6mG2Y)TO>^RM6he-=mp$V+ShtSpf6^xXCbLP)RW7 z_G73L_^;}u#Mz6eilb*fQXf6?BlR&59Y(CVKVn0sIbr_|NrnDW(W#yPRV5HH=-*iN z`+r5PnU9Sh<5whr?^A4qtKln&_yFM{)Os|f$2ie%!I6cNTTXDBg%5@LX(Ln)*i&OJ zL$cKXeMX(b^G=ELT~4=-Qz2pn0Dg$>)JOnS^k?P(-%g~i9jaXv^awrxKs;y|C-}?f z)t?!7RIl@peY;UU>j4TX8swTAeA%ApeeXdydvpmLKP|GiNEiYFYhM_ae+Ilt%}`U{ zr$X>Wcu>G95@59f@cMP~xBl;QtGhpc127Pd5s`=izX1RNDc_)=Z4NFTJ^>*Sv9}Tk zoA{S}eSQA|ZxN-h@4x#?hrwSI;PL+Q*sv!vft?h{++0^!TwGRBR#IG5QCwV6kyl(+ zSY2IOgg<`RK7OAODdm53aNo`{^d|Qzo8wtwXoKrXfB)1s!#BH2z3txL)g|#KTdjYz z4x*XkOj{m^h~%~3-n#@gXNTm+G|6tOO_#e{SEX{Qb)+wc}fX4{;1&nxr^8wAF^Sa<*WUskn5bOhCUN1{BG}Guz{4 zaSG*Uqf6j&VqN#rJW_}c3nkB33p}#YC*HyWcYs8v5>%0h3d(W|j^#e7h<1LI_!)m# zN<(7m?%psG2X`(yF5}Gtcmt1C3EcgzEBN-&y7a8^#ItLQz3l58lJp zjyAT|)^ztbv=vku?y6st~u$4~XU1db$$nrJW%&hU`KuygqtUlLD53`s2)Psf{|S zp91sKjDna{3 zLBiy_yelQH%!nx66OT#fQA_gEGPs5(JBiHfTjkyF{ul6LgZ#Fl6@L(y03;3s%FgXzOS6e-d6NCMQ`M-|%Lrl&&tzG41&f zCCcSgqz23Yjz5Usc-T`Y4ulTpQXk)vrWeHPOS9Mwd$3}J8%g9TGIJKV z=kzNoe>06xUN(v6i)AYo8B%EH1lQu6?=8fBtyzAc;vT#bAvBtg*yE~n$k};2^HJWB z)B77*=DI;RcwHKEL$4g?`TTo4c<$>yNc1SD4Rqv)Pmrz+Sh}0019Bfo`8As)ua^>u zbC_;Dm|q{0A(u`pq1R;@latVOHDGG6Po5CucD*sk)!Eg{Ylz0@6RL|HLLgl<6#7PS zwE>Mf@MuVhQpvxe7o7~P`Lw#!J4|UVU@FKQGGR z=N)W-3Z>n=hz*0|vH?pa-$reu@;EI`pT6eS6?Ji|r7i+1t4M7t{2Zb@SRSz9CK7%D zFko8RVm`oMql;kFmvj6${)-~5;EHE5?kWbQ=Rwldu{e&JyJ|Ykr;YscM)wH= zWsv3tO^e{Gp6G6L;oXFBDsc)LxM6a1$;YmQtB%+~njKb^S)SBzJwT%!o2m z-b`8>l_y{2LZP2r$(bCMrpgP)2iybGI+%Ycbp@JzC|cv($J}q}w6)^xNEK58X{fy4 zOYrE5V{a0SiN4Z15n%QRIr2r+Q+CjvHI{}u+XxW15FT4YiJ z>7-wcd=0)-kAhxk2#l{G{kUSBJOw7Kb1qQ3GQkRFa;&MwvPF1PN5!#iPH2TbLeC&Y z%6jTn$TrWljDLR(=}pP>^m{vU2J=x=3pXOLUoYMmPirF~r=H|B;0J#FU>FIihVLCX zDH2mKEp>7`X%PHWF(V=qE!t^|C~4*&(S6bpH7OUvfZTBH%5504{GP;X@~ZKAQBI^N z(Uf>#yn#fO$?ev};nj(k%rMi}B6s-BN4+$?aNcn4&M(hZ1qC$QKwBCd@4i-&LR3Dm z@8o^7govdKeb+lE4UOo3m-Dh%+)$qJ%d>KyW%AltQ)DpMl}7DDt->mm9CP)^*C2KF z^0~q!yLSp1Vlk~Sy+6G4Y7nG0U|Nu-c54GAMRrl|cqsLkJ&_|@Ta=iJfD$X)ylyPm zV%4oz&paYwTCvAM}+7nbrQ1hL)tuX^`R0Gi&ppcc^sd`^_Nj zTuX|jd(J|^85kof+Rjj{Ocgz++(hzt@mdJ3yssC3V|ULFRjfb7&XL)TU)E-Ce{cVI zX;%K6UPtkxuJw?++$vjnh`zmH0dDvH7^NN``g$Q|)sMbgqCg8wErd@<+hcYVbh?lz z|Fn8aMiSsI#?X})@Ujq^%PRwXadDrj{PnPxW7ba; z*>s_YE=_kJsd@TmOy*5|wGCtq12wbWvXiq`Y6gXL)rsR_!2li_P5mBL8D>e|KG@(6J$vlr71&v{VyiRQypJgahkLijTl2}2rH-{3 zJs3mvb5wG$URI`M^VBj6)yM9aPG5L!Jy+D3;gXGU`PJN%)*-y3gIB)6J11D>O#h8aG*dpH{~8vh?d4# zGg5Xe=KG$deUD`RAQ#J`6fl^SbfljKAjXuoDJ;_2s)e>%+m?Q!Bvf6ep{rGp#3v0$ zPBnL1BDdAU^M=j*xbNZ#3le7wl$W0G|M0>W#0$?JDV1>EJd_Pt{yeLq9YzkTv zRFkkj?9z6OEZO#c*@j6&q|r3?De|UxB{$AXK7u&Y2K9on!Fvcl;;_9C9{0cg{$68k zFFl#B+F;x%bP7`oT4l9Gr&1O-Nrq={a*O9=J!7a%ccW!~FWy1LA~BWJA*%`STBv7q z_u7=O$fn+UcYn0iK8pOobg)p-Og4B)fSs}APsRMY1QVCO(7md(7c1?#8wne)~s1miQmXpLWVREcp|ySn3T6-lyy*J{mVy)*nJ z3^ZH9<-V_QXD+lc}hi8ZVI=xF*Vu83v0p?j@41u_7j=UjD3Acx5%x!vU zY^o%0o`4l3%{u7>*ha&AyCmAbK>Q*EBtlEYzOB(ELP9_X&3*NpC%x^#dWsa3-V88v znUv6nu-l7we4c3~QYwo+@6kV(JkecEj3>$dQA1y&zNrcVEbFxHYC5BCO!5}Oy0i1g zwyC~fJmraMDx?Z;p?!P8U7|Z0&r~^j;uLr1q%keHUg(SWF-b3N{+?3KClpuM*TX>+VMifBeb1uClJ4L~JCsG< zl({9q=W|YphIL>WCY{C_O3Vv{TlikRCz{9}IRN^mW@FlCu6T&<2N3TOi!x(>VFF^6 z9cfQ%?=xjnd6-F$A`}f@@O$!OERH9(V7pIdAo#0JVz@cZS6&JGleWgr+)w>q4f9vT z=IQZrL_auRmItB96nSbx$g{8|+?V~zmvHbKzSQmEv%DeJO`#i9?z}OSeU*Q_GbJ2H z_PcEe9yz7wz_<_fc|(V-$UfBCBAvcfNy=SX^g-ftKsxZ~kif_9^5>^woQ_z|lvJ7t znVk}DJPBD#rk^nhD6EtB2P-ypcK6FNt>&6>iATSGm1|E#w>+j?$;UODtvz{e_f={s0#;$l!lL@U{wQeza(;R5~gJQOCw ztlHq-OM4OMlF%TuQZE{NUvj$0V`|ZO`i0$dc*EBZGq0dn?wmyIUelfzENrevyB`M% zP0~S|Fx!-rVAKU?MP{%7gRBw^H`f0(c6w7o?#R~>3a8)e>qn^`jb0v(?bUG>IFgpN z%5Z)B;*egKNKa#q@+mX4PkO;zw3L~4NG~7nVf~sO?7dqH^Hv+Xc)!j%L>N+;;==WV zGwm&R`BtoD@Lu!#=pM?hlnJhkC9}m7Ej_~m?fWau& zL)8!IhwKu||hFb4fP19ndgtCJ_ard2)^Svy){e<8(FbvZKR?=VN!v9j?&%443#MN~ai_y&s5ul^=;ZOr_E zYaA*?pRMh%v0Cbr3J#`-Cm_73gsE9?CfSKJ9;NVRbn7v049==-vrCPUupyh#-}%!& z9QMpnWyj{$u1gf=wRcd10Z^G4Cb|Np%7?fmvFiL5?~ok&yI!)r3FV`< z6~c>4YT!oeN-ZJs$Qm?cqHeRe))whwShdx6Y1@saKMgKwinGXD^XW`-EmT0ZXY09# z15urkr$nWsk*s1VyGBGyN|GJuWE*WT)hx+98QlC&UxCoPp7@FbRSThTsxB)j6$4&% z!43Lqn{g7a(Bug>wa;+DDn5V>r>g%Cjg%C!nr(j3F&RqJf4@K(q^Id z>DzC@*z|8>J<2SbZXdcHS`FJpn4KJ5DH*&Rtz(LNnoQ`WHAAMc;I;x1lGgR*+c~YC zWR0H5*BUUnPc$PZK2Nk@JJIv~b9kp}J(K7Gf<<31zq=EoU`eLZCwcvfljJ0~Vj??< zh!N*Q?REI}VPS3>p1r#>N?stKllYC0)Is}ty_nZ(!fI4K#_vZiJbe*CK)nC*O z5y*U`0I*DM`%E1z?kQ3g;PL0nH|TOW=!`QrFUxTvVyW_Ez#*i(p{G40gcQfV$!Y$z z-KY#7cmH)4!O0nj0L{J*z%yyKKm72XZJUIpvfKvF-TLuIX`dBE;LQ#_!8j%KE=ZkH z^y_jtKz&hkEcfawCT5Uu%8v!E6#w-=0J=+?BsKUcQC z+f#RL+QgR@`%=nJGzvh@Gv{ROD^+URYT9dJlA_BZ+eE-WuH+a#2C*z?&g{PStFIBZrL#tp+pga1wDbKs?P#I(P z*s=7>b(5CTj5~ACrxOkOPI(#v@UcO{)A)Vm2O%%yWkK@B$YEj2_VcP@sh=no3L;Io zx>ppm=<2y}AchXh(9y|ch|!J*h1RfZuSQHAz9CRn7L}+e1XXutY-s^qkkV%l-jVHx zGoW+QHec^V$G}7~Mn3AFd_wNf>9Yh+1C(oRnf(miPd(QQgq8G_wUxft-KY4*Rvoq= zu^aRB=|;BPYHpqY8O*iLoS5K(4s@quQAc0RkJb(pLgxM{8(9*)82Nc2j+#yl1K`c1 zzb8BSW=BsW$6t1q(*g)1<_3l5szFH(CP~GI^0=zWX~<{KHL%DnMDmRZ+k>Zre$ay= zqbKOGOpCQhgS0Rm3G(BlhR(P>%+0=p2cqg8n=jWka@iNXy{OVs+UAUU`Et%|WFczb z#95NlNy#0DApJvFQ@Y^=-dgR-OA`4*G%LciqBY!~wwrTXq0rj*1gxggt)W{S_GQq+ z6P2h?3r&t*OjKxjX8-QA<`aNH=u(gCB|nHAMtk#N?-Z4_7bnDJk~o+u9h3U@ z*s-rPSus7yw<|T<-}q!=?P2JPzQIBzh;6udIWA96K?iXK+GFO7b=SsT<$GniIV~Zj zWfmvS@}6`oOhiG}BMdPm7vzia?nPTvX*bvD+E zCPc00eH`*<&d0q!$KGrdIq3wB7y%(WJ1zg#*WRm*UX0H+VMO_t9 zE%8^ZCxhgs#sN2B^JS>vUf-+1J!4N1*Wsgk<{zDU)4lUjEXwC1UW4{YDbc#2Ur5!T za>YQt&rV*R_^^73Z&!O6tfz22v>)VBzCZqCT2Lo*+&#d*evj47JkO=2w$94qA1Yc9 zO0Y8>a{LQDQrL{T4lAi8{ugGKYDk{`qK-!LPRN9&Ud6zq?}PrJ|8BzP+AWH2-rjq; zRiZ1KqY@aYYVBu+(=jVK&q|hoQv@XvBKyrB-kptOef%nDt$RS1Dh~$$3=mH_x-Ugp zf4R=q4FAl!DB-U`{eqG-Yz2*>&5%9WmXCEV-}$Ba+FM=kW%OHg^}B+IR<2M2A&3#; zA!CrQGS9R4J58ioI}zT`LoC^uMr18lMQNA_*APDgYmTvJ4^ipP$RFoi)h>}mBDY2zm9r~Im%r#)aJ&Dgjj(WfVO`n%m-TJI(N6 zQA1$Tsj^e?L3kyYI5IHPG3;hC%HYfX_#`aMe7#!B+sI*g<0AmvGcBq&0hTK2kL~Z# zH>&3yu6?-W5ByC#YT3}}U&ihtKCRidEq*Q%KH503&pI|Ra?CU0Z0>T(W>l`!l$2J7 zab_dCw07z8c96c|DwaMfG^b1qM0>kc^Sn~f1Mx7jBn(5_OEBxeO$aM?*A8>%4@vfY&nk;age0Wn9s_pUcdxN-~vJ7az-Z@xXyBMTfl4Ce(Ty9-OQ$FTGD60{? z&Cx2OrX#LY(?`?(HI;(cjJ;Jin(b9W;+#YlMsFUy3Fe%)Fl|O_aG!U4G$i*!AAfllAEPj-OnkDwSVMz3E+qOg|Jo$m^l%X_6a=%9D_`xCuf zHkY(gJm5`-!iVV4aC^`-SFAH zWx3`(rYM&x?bI!4u<<|PNTAR#u|Idc=yk%@*Xa@k0%*I1!OzCBZgMhpsF-+8V}%53DD zc%NI@_EMieSJuKi?njA5OM_eM@vrYH^O=?HN14~FmA*6DU!OMc814;s@|Rrcvxf#L zTu)!tX@pJZV+RRT@j$#EHd&w)ICS4yI&8kH^yypFRZogJ$CmZV$I84HMpjEhI&j_L zN!5soDJpPb)AM>y)>WVtj7uKa{A`^n#+i%S)5X$-z^|5S8k^P(g&uK~+5JpwLt9JG z*)@Hg$RKpg`TS5^mk`ZqR0{}FN!~UGwYJy)FuPu^eGu!DTI8&tRGMqkr1RubCg-+T z3JI$t6Nte5qYC*b$9668M6Hoto2-a-1M|EXpJL`ZzW%j@JipVkEA8VY&Bi7gf$PJV zW4!!H>poE~ipZn>(_%hbdYA5QU1D}ESY2gD@B$jCCL3UV&T@@da;@W(_DQrpB3cyhvdZAfOR^GyzTYC zP`aY<`)g%I7=Qki>7Te*-eE9RcVV}2!$zh0Yo_?aLFt_V?OY?epy`cYT7A!(&Vt(E zkhjsOMs_E6*$=#?CP|-5Os>z(rart%`^Jx^Ieu>YqPo@9SQg+YB`J$3j zs^N}v=GVPR$F`EaB3LxjE=^ypE5<|sz8BFYu!n|tH!a=OFH<{IhRHm^kR3z(mk!wc z>Lmt>ZN;Dll{Rxh(Fu3b>$+oH3jlExR?SY5=+XdK@dHQXEBz5Qs%Y|8z9 zLJ0$ZVzr*LG%vegZDDDA5JDdq`6V90cP}I9ps_3JqDGjWym`*8S6P4Tz|X_Imm9cg zpfUcY>PO@&!;jL^o40le3Li>OaT_QHlbYYch)D)%ip6lL1Hg5k)vN~@D9u7Zam-xM z``k&yHCc3?H4E(*jZsAh=JFMoOtzSY7I%rt!nPD*;HUACAFOw1tNR8LyKJ`aa65KR z!U3C4j&gRsZs-fF8;B?P=xF6DSc271&$M(-ll#g<_Id%0pC@n+ug*2D3uTG}H@COO z($YgiGUNsqir*QxOI`S*0-qR}^N8^4Z}^W-+V1Y-+!q3W7TFk{k<918xkg9@^>Z4cBQwX_ppW_C7KyDFy7jHHyNyrziUd-{e&K&5X>S?` z;c20om5!X^0~M|gy*w=3K)0pN^*<*@CCP2d%6eZRG0Z*x{;QmNo}Xi#GJi#J)RTmE z9vz|W`~vH3)*D&_-HI>RU;VSVOpWcordiv{@!~M-*>+=}U~{Re;J#0B>8N|hTeLqD zJ3caFHT^6dNWRCct=wy!rftg}VGw{gQpL!rGx#&}bm`nNLUw4=Nxi){YN+~7U4;wS zddUnvZ_uP!B<`9qmpN4V;p;o*mxZ0>kDYDU%hA66lNv;^;S8bJv$+Yg@BppKIg*W= z1i;-K4=EbnsXm4Hru7hARc5hhxGpggnuT9Q9_Wum9JeevIpq!b;LcDo6rQj!j0)Bl ziEdVDA4?kTsBVq0CFdop=0dnN-d?FS^5FP}UjY6-N1*gQ{Lga)3IY@qtH{KwDy^t0 zC~q#P$t|reZmKFOFct%bcQY4Tgck^_ui`bD4#kpO@-bIf(P9W0CjY1&CC7Vy+6=26 zEcPic_h{Ks^SstC5h!Y5(kR}SJ+#A>%;5DjAH(8wo@cX?l6%ZH_3R6EDk;@X zVBw8pk7|20Wt=lYj(A?6bz9peM<7B2qR^JJaqnQ=2=)r2=yR6mKRX6CgF@4YBm#q7t2N`RXqx4O5 zn&D(f&2?R?15Q@vRHeAvFon`-m2M)o=) zM1-`vw9n*n!dazd?AB!v9&2UqHM8LR9HRCKnkwaIP&{cb=U+Id5oT zl@u)NNM{oKbf=hfi@8X}&j{kGkc6 z<+;AK#%jc9;0tJfzJ0k+i`RsVP%i5#jW^LoLauXB8d+<)Ybow)4XvEqX$eJL4bJF{ zi*(%f(1)e_Y%iIZe#f$5pZnla3G65CRemYS0)yR~feux|kRPtks}*h!-9iiQ3}G>g z=k~ZQP51_{JiCm^x@V|m`mv?KaI~YMz{+83Zs`?=Yrw#u5d)2~1*zRq`p>W`b&!vM zniX1JjXyH=#E%PtWD-VQyX>4VqznQiByY=wD*~MtZK2`i0@fX}&mN=u!|KvzboNR! z@^j?(X#9n`{rf1N(*2pP4L|F?;6j zfcKtWR&Tl1L(%3L&~vrUo@~IXVKH<)C!1wY0A+gWik=+)xr=1Zh8|hAmAfBpG}*lf z0uTeT{~fwNCpiO<;&Ufb z0zAF=I!tB6MbGFk8ErIcsmAcXPDopA)$ubx zI?!%6&Z&u1=T+a);d;`1$rwG?vm8`E?Wkq9V9^>nR@z$Ecv@`_uW{~du->FcVGR+) z^7d`$nK6=M4$4W+bUP!AjFg`+;!3JCpE8T8LXyxhYufI8)3@ z{-ilZMzLj6bYYr0o#f;&X)>m0$>H_PMazA20^F%kr&RD~M004-uk6fZ?7h0|*b$ZCPx4&>$*eBs zbtS<8=pMmMLB$mF*R%Mi{ED$am?`euezHQ`!0Pi-eiTIfnYP7z#I_JuK`TaYz5%p5t<4R{x@=g-BP~TO;5USq}PCSI|cG=2#;dCR}+G+PQH;Aj_JU zFWWI|S`?KSVyJ7IJ!`{fnzJ05b?ustPaG#-yiPmcNJ-OJy_h(m z0KDk=1&d~0z$-=KEs`ox{DyoyLO9IesjPgmB)OZl6P%B&pFeW z^_AaxFukueWw24@5?oW3W`)&(vO8*1lVp(x+rOB_LUQCgO)uS#-l=&;nCO!)p zP4Ebgb`e~8g*b6{eMwE3W8$V0zbRfpITC&@e{#SgYOVaH zrQzF1>b&yUe&b#yR$zMZnCy`{Il0MK(N~nE0S;ij>HIz^rfo_JvYa>X3~aL*>az!n z9N@P!{q;jX`d0d-JbN1G!aQqGxIg6-wg+aN=^l<>lxgmydN_HBvVeQlLjAmo1Dfz; zsLnlpHwz`aGL_eaCVmOed#{<_TKbz5c4T6Dor>`bvBAhsY3y7GDima%MSMLHbon;k z2qS-vGFR~~TgJd|rud?nb6}=yZ#w-(v+6uyGw{ldMQ^p}vxGr$;{4_DQZ+^=-;`c= zlov&}MSwe1$K69@E^4QGhEw!*(w+ytjE`0;>VT!ls7hX2`AA!!cFHC--4lHorArBR zi<9m-lGi^_a=aVT1>agtD5g68sH$w8`mv=%o_GiqXGM9J9g!Oes2|KOa#wr2FCDEj zo4**fCWo)VmI^=Gp$ScWFGW>+37=@fgC`gYteoZ@^G}S?`Y?{WrtdiR(tgA&*QFOF zD~vEHiMnd{(L|F(RS|^@(~9*_n080geHH+TtXhVjwRcGITb4f69>``fQCcb|j}$lZ zJe`v8@NOX`P&#zzYYkTVc-%EpFz`XCY3?}EGb-Bv>!S- z&NL*X>Ef~`56;E)1V_ZFbJ1qCeDbw<3Aks3?R(CcSG?&KujQWYOgOeqGNxgU(gXQf z*XiWaV9+#fK?UsL4J-1YrKw8C=M}=%jn0l z^&Ww0?X~QVs!LDHP8bQxx=<#RyG!SeU$v8`lpc^PLhr0BrCXwxEnKwY+|dE)*JPbE zZTuUPlCU^-u87D#&#JNZv6sZrv=j%1+Yb*cW1mCNX0Z9;)&%8ymk`IlPoi;F5ZqB9-6i zek1}_2ZcocIolOXqaP&R3fJ=tVfrw1@DSz9O<@t4CsNSL5?$t?UV8vmO$EOcd)f2*?7+2637=9{0r#?V zuGetv9VbS9WrB>ay#cGc&ple@F#&B1UXjhq*wXDjv(1uTD-12mLdrXPVU=l|N}(u9 z7IaddAOAs}VSjsi>v#8uXjzkg_I)hTA^)V8;@WhmOKHnX%33B9YSq?>yQ~(1%a^Qf U1LFgu%}!PAYO%eVzRv*v2hvqWL;wH) literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/cart_side.png b/games/default/files/boost_cart/textures/cart_side.png new file mode 100644 index 0000000000000000000000000000000000000000..d253ad6c5c9fe240dedf90464a3d15ad9a3a6a31 GIT binary patch literal 376 zcmV-;0f+vHP)~CHlX;Uo>G$V}F;TGZu3|Kz5$1KZwULP9msLP$t ze;-Vp&G!s8SN$E&p!?MU8s#tN-?m4#pd zc~~9htgD4Sx@J#i?w0!zT@^ya`Qw5C7bn=ZeYx06f++hSx)MPY6F-{nyk71D12zSe zvIe#an{_dWGffRsfW>n00{%PW?P{x`n3<40p79b$yW&E4aWerYQlOAm(A`k(6=3)i zf?b35U`sUyCz%OpZw5EHwb*S7B~8VIFoNUN&J~Hc>uK zF@APQ0WN6)PFW#NB{4o_FcQI#|UA~i`f4QX>tX**3xdo5WPU1@hcSzl9yAam7dTa9E_ zy?}s#kdTn@@bH+JnEd?wii(P+rl$7x_TJv!RjXF5S+i#S`t_SPZ{E3c=b=M~PM$n@ zx%BxIptI+Bx;TbNNU|RE^kX&@U^wtfE?v~|5d-@J<)8oaEgGi8&fGYAl|`7VpsUC& z3sr_=`&|G0skL3dJb(M?=YO5KZS(l1-&_@6ow4-%?$4LpuK%8L(`!e0t=R1CG8ZpR z;m?|_zh7__}$Cd|GPbGa-1| pb1n&mzULiET^iSN*9bElwl^1cJu%xvs}bl@22WQ%mvv4FO#lQUff)b* literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_crossing.png b/games/default/files/boost_cart/textures/carts_rail_crossing.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b635d9d91bde1043393228bc44fbbb614f5224 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!dVo)eE08{U@?>3IU1w+Ks#UAX zf~1yLn`V27&nhyi36ow}ZqlEnSL82wvr57TsFblJ$S;_|;n|HeAg9LD#WAGfmT$i! zAG09`Gq1!nl|TRY#)@1iW8vW2Cd{x%q9-Hc1H-(AP5wciiRJnRrnza`=5(nyZe7o! zSf%u>kLM}dh83ZK{pmA*ELp=G(znERmF=hJf;%7Yk@#G-W^3)w!lnI3gjaO#)!&rw p=#hH)^ljyrH-7wnyMU>NVV?zafTQ7*<3M*Xc)I$ztaD0e0szzlT4w+N literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_crossing_brk.png b/games/default/files/boost_cart/textures/carts_rail_crossing_brk.png new file mode 100644 index 0000000000000000000000000000000000000000..cb7d97bd8afd04e2235d0a2d552114dcc2a81a04 GIT binary patch literal 403 zcmV;E0c`$>P)B_!-c`Oo$#y&hn(-KD!MEC9u4eAVz)QHr z<{>%Z*AZ+Eda*v}0ZCjR@M5vYh483PMbw0~eh(Nrodp!pC94ou26v}xwZQs-8@I|p z(JII=Iauv;<37*=Gs3I2G6vovngiykyk&BKi?m{Qwiahg4LDk;Cv+oSuQwSSOxhg8 z#(W^idT`i-*tj3$;8-bd4taG1LE)fS8Tojf4VhRQ@ZdRAqKu`QMeZu?Ewg3CdOq@H x%yZEy1XS*OGj<*8O`_y<4MFO<4AoucoIc`?l=L(=NNh>fs91U2%tkh0O(-iL8 z`%Z4L7awjr`qXW!_)=wA0NFP`zmWW)bZVC1Al$$|l1r;P)*yhKB0(dTVQ|%~!1bp85u#yXvjMT^C9<;oSe+ikU4xc~_g^m@GvMn3KB?QFn!OSQy%X1-W_Zr|uQ zK8r=Ly1Kf=qKx?)&odwP1U;QS)b>3Lu^H#f(xt>my2E5$h+4(2p%KQ>b=(zGzD(P(%Sq*!e> z8?Dil=!Ge%N25_tfpEE8JONZ`Hk;{=2ESvMN+n|EC@|G(HJi<1iDua9?(WWHG8}Dc zY9dMMlTu1r;P)*yhKB0(dTVQ|%~!1bp85u#yXvjMT^C9<;oSe+ikU4xc~_g^m@GvMn3KB?QFn!OSQy%X1-W_Zr|uQ zK8r=Ly1Kf=qKx?)&odwP1U;QS)b>3Lu^H#f(xt>my2E5$h+4(2p%KQ>b=(zGzD(P(%Sq*!e> z8?Dil=!Ge%N25_tfpEE8JONZ`Hk;{=2ESvMN+n|EC@|G(HJi<1iDua9?(WWHG8}Dc zY9dMMlTu0)6FEX>I(+@}^sGCw={sYQTk!N3z~hTW(kHU0m-8bs3A;NO&R>q$sbd>IiGeOd5-Xc1yXAI0F482YiI zS0&2ehF2xTAgoORZ>TMCl_eHLR~EV4?1Zw$-&X_W1r{CyCyFcF0GEtSVK3oEva&dN zR}J*KglK6f%}+jvq1MgU9>{#_04rQGLv-*MIp89(l(5@>4JYG}~c zdC1_5w8H8e0%$nNdTYxZ-XNid9$SIEDF=`&FS0LkpRK)rgu~$-8g@OQ(L(1`tKaLA rxWeuyo3<{ozjka)vaBy(J!NJ19!o9t{adB~PZ*OaBYj$>aZEbDO&(ENE zH=J}cyu7@BTqc8HDr#zKc2ga`zP@->AA5UylWQupw6tA| z%gf7-W+iY<7oT@FYDW=@Mq5w-0004WQchC2+c1@tuF8N zO{>7~d$D0VAm;9|{VLI6jqy4opi#f`Uf=wU&9=YY@c?9tZkR;n;p!+bQEjq0N z-Wi!Xa_1LR$$-m*t~3B>mz?X#ZL#4`rpjmr;NkHpiK6H1r97SoLx5Pb#b!04={vIn zMz9R4&^M*IXe$!8ofv_v8*ZQu1nuL~UUp;vn#jI?fZspnq{uB}!W!`u_y@Fo7!;$R R4VnM|002ovPDHLkV1lIu2CV=9 literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_curved.png b/games/default/files/boost_cart/textures/carts_rail_curved.png new file mode 100644 index 0000000000000000000000000000000000000000..a406fc3df6da2ef5c0473339451fbc956031af1d GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZ1=6hv>I=$D3Ik+Uty*>R z2(2k9tk!#oC|obAFUNrM?jTDP33c%bocDy@ckW12 z32|RI4diICT<6AzvB`D3*o^zZ$P4gTfgZc9zSl)q=jLP;7OJdRdFI%hti(o>=WPM8 z&wRC~sWDb$#zDJZB(x^01kqQczZl)_3^fMxjo5CHV$*Ca)VLnM2lGuBFR|mfJ6mn3 zYEXAhyMv(i`UIsU*qN>t$@jw%oOA_o)G0+~U1!RzSgm)93+lz-5s0R$K0$%&{xFU@ z0=VLzQ5d>2G(;4a^1J=4OIsgCw literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_curved_cp.png b/games/default/files/boost_cart/textures/carts_rail_curved_cp.png new file mode 100644 index 0000000000000000000000000000000000000000..1746978ce7f041113f4e473e345da55dcff3cc4c GIT binary patch literal 417 zcmV;S0bc%zP)SMX4i8iW0MtzK0Z>ly} z4?+XfRhY&@*o|=-z!+FqX#wHZMybp$HbPOoJx&emO9ZHkR-Kk-vZxB-^?7BcAQsT} zNm-hElC^W(4bbc?50RUgsSgY{AR8FCAXh0TJAu3}>C=d1kv3HK7`SVV~-t2{*MSQn@Wzw<=r_ z=+Tvp4nWnw0PIQ8T2^NZRdFC)KfziBGg=yA)q&wt=wk|WGbA1WDEoJq*cE_|00000 LNkvXXu0mjffX}Ne literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_curved_dtc.png b/games/default/files/boost_cart/textures/carts_rail_curved_dtc.png new file mode 100644 index 0000000000000000000000000000000000000000..ce049f0cd96813c606e184cff4208bf50ff39a3f GIT binary patch literal 457 zcmV;)0XF`LP)^PhTRC(j3$Pft%*S63pDh{a+tnM@9c<5X~W zclY-8#^dqCVlku4ZH64VLL%X?6)ZAR_hmV76$k`MrBY84HwLcrQXJO+Gi1zQF!WT@ z#|?g}W5M_LH=E5?w*;Jwm0EsRwuf&C(`^MuM@L8+#)3LOMWgRLEye^56uaz6vuy=u zXJ-o`y+Mq8jceKq4@F-;l9Fx=ec#600000NkvXXu0mjf>}0^J literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_curved_dtc_on.png b/games/default/files/boost_cart/textures/carts_rail_curved_dtc_on.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb5bc5105b17d548b9f1d3b30d204d5195ab02f GIT binary patch literal 458 zcmV;*0X6=KP)Q^&TLGifJ@jCN%F{ z;9jpzh{a+|CR6$CkiPGEv0wi4?rASfBUfvgf`Gy2?1ll`0{nbB;SsW5HF39&t^V3@Al2HucqK}%GC|& zeV5BcrBaItFvhE0!`&CLY4`=74y_1pr(o{;{n#Q_17MbQrMPq$`WYi%QT{l@X0xG~ z)q^~dNCbvjd%LcTlFpz-qy+?R@z^|<`f8fxNV7R`%Rutu0!xwBKO-)VpKj1?uNfN0!$+%n_R#gV)YxHEg=gtW6@LtC z4dHhjC~u%O#WYgj+H2*=)SPG}|JTVp??Y#rsXy1T*~HQ(dNo%SWPtu$=V+1dx%?wq zl1<3%xKqIY+Bn0#b9<_Z*tdi7QHOBQ&Jp`jc&gO1TpObCy(kwpbg(u~f7vS?wDA|c z5=_wUOf!Ret>OIw>f-d3(fay$!%e@m)55_7LQ|3f@!#pstIb1LlHb)jb_cu?u;T|v R{+0j$002ovPDHLkV1nq~uf_lX literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_curved_ss.png b/games/default/files/boost_cart/textures/carts_rail_curved_ss.png new file mode 100644 index 0000000000000000000000000000000000000000..bdfccdb1050b1ca3f411b431f4fc21badac6287f GIT binary patch literal 474 zcmV<00VV#4P)G^v9|1$s)x`t_aCX=(Z4jnp_ zlao_aRKx%Vg?Qi#Gv1>SX>{wo2UQ?99+)@){ z@y0lfNm-ic8jc=43UoBk;F3V;_ITC#^qnCC2C)Hg4QlRaFIXNqdT3f4c6h zB13rKPRLM4(Qx?i;l#v52Bcu93Rj$2Xbw^b25rf@Ks!OwK+%br8o+RDYHDIY4Y%e5 zt*#`Eo)l%Ec(#Yo>Sia9bgq}k_U+q&;Rw{Wtj>03p#fY2M0Qq@MP;yfT3T9haWT|9 zNKgWU0%$K##iA-pAcA-rXm(w+YFSy?wr$%kT(|($uz&yl%F0T3z?TKfR)#46<78>A z4bTrIB_*3TZ*GZE+S20+I}YwQALt zR?Epb`m>9TmQ|T`rs~WuHO}&ut_YP+bd@X&kZp)oEHHd11=Pb>666=m;PC858jw@y z>Eakt!I+#Nki@_w%*Gb>{7c_Auc@p&cl^@t@2Ot@qoMI2rxI)G3Il@zj;XC-YeF~^ z9+X%8eRs$1Fh38^xdcrS)5w>JscPI3Kjz$f`}?zBDsv21)^sIi=H10dPW72gWnq(B kZk~T`ujx((6Luw51{HQimcrQDI-unYp00i_>zopr05eBY-~a#s literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_straight_brk.png b/games/default/files/boost_cart/textures/carts_rail_straight_brk.png new file mode 100644 index 0000000000000000000000000000000000000000..b64fcef09c7ec445bd7c9521474e9f8248757369 GIT binary patch literal 439 zcmV;o0Z9IdP))}@9*C~bJOGEi)?eO;13onjo7R;W4*?V-6kua&z2d`o$-S`!q2W$nYeM- zBfPLwY4n1WMyiAcB{XLI^NDj&xDsu|wK`6Na?+ucs>g!75Cy)D!aHI?{KR{!^W_E+ z3ny)MY}Q#g$AO$*IB2$Er@_i&WUA<|uz<}40C5x=Fs}89TJHM>>gy7;%>O(dG6NMt h#58~DNB_Zn3b*5IXr*0}o`L`X002ovPDHLkV1krM$vFT3 literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_straight_cp.png b/games/default/files/boost_cart/textures/carts_rail_straight_cp.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4d4c9cc7d2a0737265f4e9f25ab966b6a95dfa GIT binary patch literal 478 zcmV<40U`d0P)qIx-gTP15o zFM(btZAuh>Tqb>5BzaaKcvT;JSR%P#C~{93Z%Q+NT0_BTFur9iZb>q7O*X$~E|qO8 zyJ9MoY%8gOK)hoshGQ*yS0Qjs7idE)w_YY`L@mm3Im2o)q;6MczYc2cTSmYN=LlG+V)LbFUqC5LLRpsJ|Z%h6mkI0$~a;J_M5tU^;{O zQCiP~M!j>Kmrq(4l(M*Yx)}D8<=H5P^A*7K0$h#(+96zBXY0mI-n`A%S>+D*506E$ zjGl(ii*lI2<^|w&2Er-8+XjNocHNp+->bn#ZSsk)*(&-@qImHW)qV>IQ-Ji3e?dtQ Ux}96B$N&HU07*qoM6N<$g3edH=l}o! literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_straight_dtc.png b/games/default/files/boost_cart/textures/carts_rail_straight_dtc.png new file mode 100644 index 0000000000000000000000000000000000000000..a47fc0af76ce08a2cef372ad7dd26ea61a241a45 GIT binary patch literal 516 zcmV+f0{i`mP)U3@e14_kem?JNh5TNaeF-0o zOC`4*gyT}FbZTmktiLKOePy09mO~*Xl`z1GMO0!%gf7A0dRq6u~>>lH$$w8V8t&C zz*~@cq0{ji&zhf~FO%Nc5C9Z&cpyFBW+q$$tM=a+`Hy3U?DN7;2lQFzbUGbk#IYz+ zOG^uf!%2t4<#PM``{O+H_4Nsb!gKU3@e14_kem?JNh5TNaeF-0o zOC`4*gyT}FbZTmktiLKOePy09mOyzXl`z1GMO0!%gf7A0dRq6u~>>lH$$w8V8t&C zz*~@cq0{ji&zhf~FO%Nc5C9Z&cpyFBW+q$$tM=a+`Hy3U?DN7;2lQFzbUGbk#IYz+ zOG^uf!%2t4<#PM``{O+H_4Nsb!gKE8@_jafZ+7>^v%tU9QvFz;g9IDCw;F?dDf*q=~Q3!Yw_L+DJCq* zn1zDFc9qoNE@ALTw7Z_S7RI;N@SSyhxQYu@aG@%0s8vJ?C-}-)c?lZ+e$wv^bdnr8 z?N$@$?XY6qpYb%Re;qUIMwHim+T#w@v@L}i-X;uE!(dAyZD_0ET*XYJns2M&yXyE* zCFdz+{N*f8!o;B#@!Ls={&G_E7|we%gkd9)dDyO8^=0ft6d#kujX=g;n_|hGPAu)W zDW!&B1xp(O6)XU_OBr7oGu$F})bimvzE!?&4%b*Q-OAWY{PQt}K4Fc%zZ4kQa1t}0`F&>P4Re~L?S(6ta~lo{*b;FpC4pG=kAJEo_#o|~j_L#Z81n7F#M59qUosQ9mkB*n#T&%jcLUCsqrl+5tI&@?l z0H4n%zP_+J5&)S@*3MQwpC1SW>NLP+{6jkc8tQVuaBzvo;~@v<@bdfA)vpBGAm*$3 zpkrtm><0i1$fTM>Hk*a5@SbvFlHkfb$iSzzXSL+UBIVuX$RQL8VW%z!DwW#KRtklJ z3w0V$4QOZwbai!QGMOrX+9VPQHk*wfF4Br0rW4P(o6#sYc_nf{ATaRPuV2ts0#F#N zF%pdDU7CZ=Fwagm^sj^QSn@B=g*@0=rvX5Rdc(kf|Na#hBb>O~}%p zTVh<`FIyZWpXDP{6d+d+AeZSSJ*&uQeWT@)O0({C-PLs#%d5?&<{FfR$XA6cREH~6 zhAE`DOUF1$eAl><26QxINswPKgTpg0XO5?fV@L%f>%mSZ-T(&H13RC~?G=gAbp0(C zwe`n;e&c4rhR7cmc5aFIw_{Vp-zjy+rl;lBCKqS_e!aa%jQ7GhwTz~VDy?%T>Xgl{ zx$ph`Iv$4~)T`v14H!q$q?tb64`|1B3)g9RWGgb+3G)D$%oCG?W!PC{xWt~$( F695e^o`V1Y literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_t_junction_brk.png b/games/default/files/boost_cart/textures/carts_rail_t_junction_brk.png new file mode 100644 index 0000000000000000000000000000000000000000..8d77d96a34ea2a838b8435e352122d398e5ecf14 GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfq5z)|S0H`zrD zM(Z0bmsFZ{r|Yh+vshkjJ~h{%EJVI2K&~oWp)f$MI$WVLOd-WxI>u2#ZRf+8K*uqb z1o;IsI6S+N2IS21ba4!+VD#;0PCDu!;81@5%xnL%SGL{#9ltiv(9BD7ss^*mt<{#r z*Usqcn0cSxafvl7HMcgoc=g?T3$w%vvo4BQB~J-G@Sj{od_T1tY;(_dDK?-0;iucG{+D(7Ten2_?nzl%aNo*vt?*Lr__#T?s( tTc@N~R@PSkx5%=;y#8h1%i3Lk%r)P$Pt!4O@c_D%!PC{xWt~$(69A>-nRWmG literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_t_junction_cp.png b/games/default/files/boost_cart/textures/carts_rail_t_junction_cp.png new file mode 100644 index 0000000000000000000000000000000000000000..48414e886d059de010acda905e57846d5cf7c059 GIT binary patch literal 501 zcmVB^D{@UX#%(p2a4*AZGHyvSpm;ZxZ7h&zC!BOMqL0(S2K7Wg*!PszPY)1ySLwAzWwe! rKJ;<>@n-hvwRDIo+yq{-0#(T8qCcb4d z84|X{?@|Cs{dKR`OC%EcRhNV{SMbQKxFBt~A*#K~`hOO0aD_r4m&=8;6h^Ptb2yyh zmP{rS^5k+kgTW981WYC~6|h>ZBO@cZ0F6e2!Fqancsw3vz<)%u31+idB9Y)()o^8v z{|XI&48+NyRVtNEr^_pinfQD@V(PYge!su9wKaE3K;~@;hG{^F7@Ee2gB^EPc`q{n zGMQ{N8ViR*OYqX^bUZTuotYp$#vYRZPy_;jJOC%vN8R@={YhtI7NF*B=>%E0#<8UZK$T#d@yzddXu*U3K!GtY= z9%Q?+k2}&2xfuGNQ&Oo^tybe3rLu>^b;Nbo&_16Jr^J0y0E5Ah zD-A*QWxR>MPE1qoFLRzle8FIFj{Y+5aA>qxON!>(s@A)`y}hwm486f~3`C0yVN27^wg6Jbe=PN!qD z*@Yz;jYh=DWHLIP&gb(P3`Wvnu~hA8&HUcx+^90+(OvB-D#xdS^AH&AtkR)#pn88HfaHxOSS5SXXE%UK)>E!2{{<$<#8QD0wQG#W*1u$%$}L;7R_ SWA9S{0000Rm+voE z7%0~eqqMlvbVIY{mNu*UXvJ(FnLIz)hG?awRc3Qaj3#91&n+=7@RuzPlF#yy$@G$* zRb;fj(Q-+pS$Deb>N<<%)#g)k4a!2~ivr}T!W9Yw0@o&jCS zSQ6wH%;50sMjDVa&(p;*q=M16pE>EMgMdT%{WGuq&tBPf_jml-KtnSx&8Zs9F1J=& z7GFD~uVdzYddDT!u+-ez6`8*8zS7tsSy(aU zYsHJR66WlEhdKVU`)Mf&E>C}1DZWEMZ@r50hpL>DabZHr|Nbrt(Rg}n&tB{O^%Zk$ u7jB)BURhaN{of+X{_^^leJ^Ww{V~^k&pu7ZxWxnLQU*^~KbLh*2~7ZBhMRBz literal 0 HcmV?d00001 diff --git a/games/default/files/boost_cart/textures/carts_rail_t_junction_ss.png b/games/default/files/boost_cart/textures/carts_rail_t_junction_ss.png new file mode 100644 index 0000000000000000000000000000000000000000..7856418b1ef43c7691923fe5ff8e46ac7e227bc1 GIT binary patch literal 568 zcmV-80>}M{P)K}ZQIu4+O~Jcwr$(i>v&=(gYc7T(jA=eJa+f3TU}Kx@jjVMhSJhf01`+d zJn9t|7Q$dK1kQ}---ceVM_O7MCJXOkEbkTuGq0jG_9Ui??qML~3fkjOV<_tyva+&3 zKkG@kAV3N}AAwe@MP_CuGG6aN*4uqZezqNHFL$Bn>oL?uUF2H&tKEo?kB3gD!|d!V z91e#7A%K#S5-NmUfj%-CjmXQ(LsC)_v(3)V7PGV$HG%=uYBiirCsI>WnPF~jF0m!8 z0`)SR%{)ZKrl_;Lw??Bud3iYt=M|AOSY2HWWvNsueJio%72gai<)5CB5` z_wOICu&}Uz=;&zF{W-~wh$#jL&%k1_ASES*l`SYJ;DO9Hdr|T2F#6Iic|V|a!ZTQ0 zT=aU(T6pUOQuFILIup8hX*P(Dx4wjdf17{llA0<@U zkE{xtgY0+vUCF$_Kbe`C3AC~J+i{LE0kp-PLVx;Y3};^t0ZM(blNrXv#UVdGpXYr| zlgWhi^mHUX*~$^l|8y91Bb0x-1J4)>Y_(cJxlt$-0zjowAu1{=AYHK!Hu7zd26R*% z31{&C|9{Bkau?{OK!%f(lL8>jtNe2o8sJ;$Q&YZT5AJBII0000fet literal 0 HcmV?d00001 diff --git a/games/default/files/railcart/LICENSE.txt b/games/default/files/railcart/LICENSE.txt deleted file mode 100644 index f0170d68f..000000000 --- a/games/default/files/railcart/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -Minetest Mod - Railcart [railcart] -================================== - -License Source Code: LGPL v2.1 - -License of media (textures, sounds and models not otherwise specified): CC-0 - -Authors of media files: ------------------------ - -HybridDog: WTFPL - - cart.png - cart_bottom.png - cart_side.png - cart_top.png - -Zeg9: - - cart.x - diff --git a/games/default/files/railcart/README.txt b/games/default/files/railcart/README.txt deleted file mode 100644 index dd4d70ee9..000000000 --- a/games/default/files/railcart/README.txt +++ /dev/null @@ -1,30 +0,0 @@ -Minetest Mod - Railcart [railcart] -================================== - -Minetest version: 0.4.13 - -Depends: railtrack - -Proof of concept ground up re-write of the carts mod. Currently uses media files -borrowed from the original carts mod by PilzAdam. - -Please note, this mod makes heavy use of metadata so that carts are able to -travel through unloaded map chunks, therefor a 'carts' privilege is required -to place or pick up carts in multiplayer mode. - -Crafting --------- - -S = Steel Ingot [default:steel_ingot] -W = Wood [group:wood] - -Railcart: [railcart:cart] - -+---+---+---+ -| S | | S | -+---+---+---+ -| S | | S | -+---+---+---+ -| W | S | W | -+---+---+---+ - diff --git a/games/default/files/railcart/depends.txt b/games/default/files/railcart/depends.txt deleted file mode 100644 index e602f165c..000000000 --- a/games/default/files/railcart/depends.txt +++ /dev/null @@ -1 +0,0 @@ -railtrack diff --git a/games/default/files/railcart/init.lua b/games/default/files/railcart/init.lua deleted file mode 100644 index 7a5260e5d..000000000 --- a/games/default/files/railcart/init.lua +++ /dev/null @@ -1,191 +0,0 @@ -local modpath = minetest.get_modpath(minetest.get_current_modname()) - -dofile(modpath.."/railcart.lua") - -local worldpath = minetest.get_worldpath() - -local function create_detached_inventory(id) - local inv = minetest.create_detached_inventory("railcart_"..tostring(id), { - on_put = function(inv, listname, index, stack, player) - railcart:save() - end, - on_take = function(inv, listname, index, stack, player) - railcart:save() - end, - allow_put = function(inv, listname, index, stack, player) - return 1 - end, - allow_take = function(inv, listname, index, stack, player) - return stack:get_count() - end, - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - return count - end, - }) - --inv:set_size("main", 32) - return inv -end - -local input = io.open(worldpath.."/railcart.txt", "r") -if input then - local data = input:read('*all') - if data then - local carts = minetest.deserialize(data) or {} - for id, ref in pairs(carts) do - local cart = railcart.cart:new(ref) - if ref.inv then - local inv = create_detached_inventory(cart.id) - for i, stack in pairs(ref.inv) do - inv:set_stack("main", i, stack) - end - cart.inv = inv - end - railcart.allcarts[id] = cart - end - end - input = nil -end - -local function is_valid_player(object) - if object then - return object:is_player() - end -end - -railcart:register_entity("railcart:cart_entity", { - on_punch = function(self, puncher, _, _, direction) - if not is_valid_player(puncher) then - return - end - if puncher:get_player_control().sneak then - if self.cart then - if self.cart.id then - if self.cart.inv then - if not self.cart.inv:is_empty("main") then - return - end - end - railcart:remove_cart(self.cart.id) - end - end - self.object:remove() - local inv = puncher:get_inventory() - if minetest.setting_getbool("creative_mode") then - if not inv:contains_item("main", "railcart:cart") then - inv:add_item("main", "railcart:cart") - end - else - inv:add_item("main", "railcart:cart") - end - return - end - if self.cart and direction then - if self.driver then - direction = {x=0, y=0, z=0} - local ld = self.driver:get_look_dir() - if ld.y > -0.99 then - direction = { - x = railtrack:get_sign(ld.x), - z = railtrack:get_sign(ld.z), - y = self.cart.dir.y - } - end - end - local pos = vector.round(self.object:getpos()) - local dir = vector.round(vector.normalize(direction)) - local speed = railcart:velocity_to_speed(self.cart.vel) - self.timer = 0 - self.cart.target = nil - self.cart.prev = pos - self.cart.vel = vector.multiply(dir, 5) - self.cart.accel = railtrack:get_acceleration(pos) - self.object:setvelocity(self.cart.vel) - end - end, - on_rightclick = function(self, clicker) - if not is_valid_player(clicker) then - return - end - if clicker:get_player_control().sneak then - local name = clicker:get_player_name() - local cart = self.cart or {} - if cart.id and name then - local formspec = "size[8,9]".. - --default.gui_bg..default.gui_bg_img..default.gui_slots.. - "list[detached:railcart_"..cart.id..";main;0,0.3;8,4;]".. - "list[current_player;main;0,4.85;8,1;]".. - "list[current_player;main;0,6.08;8,3;8]".. - "listring[detached:railcart_"..cart.id..";main]".. - "listring[current_player;main]".. - --default.get_hotbar_bg(0,4.85) - minetest.show_formspec(name, "inventory", formspec) - end - return - end - if self.driver and clicker == self.driver then - self.driver = nil - clicker:set_detach() - elseif not self.driver then - self.driver = clicker - clicker:set_attach(self.object, "", {x=0,y=5,z=0}, {x=0,y=0,z=0}) - end - end, -}) - -minetest.register_craftitem("railcart:cart", { - description = "Railcart", - inventory_image = "railcart_side.png", - wield_image = "railcart_side.png", - on_place = function(itemstack, placer, pointed_thing) - local name = placer:get_player_name() - if not name or pointed_thing.type ~= "node" then - return - end - if not minetest.is_singleplayer() then - if not minetest.check_player_privs(name, {carts=true}) then - minetest.chat_send_player(name, "Requires carts privilege") - return - end - end - local pos = pointed_thing.under - if not railtrack:is_railnode(pos) then - return - end - local carts = railcart:get_carts_in_radius(pos, 0.9) - if #carts > 0 then - return - end - local id = railcart:get_new_id() - local ref = { - id = id, - inv = create_detached_inventory(id), - pos = vector.new(pos), - prev = vector.new(pos), - accel = railtrack:get_acceleration(pos), - dir = railcart:get_rail_direction(pos), - } - local cart = railcart.cart:new(ref) - table.insert(railcart.allcarts, cart) - railcart:save() - if not minetest.setting_getbool("creative_mode") then - itemstack:take_item() - end - return itemstack - end, -}) - -minetest.register_privilege("carts", "Player can pick-up and place carts.") - -minetest.register_craft({ - output = "railcart:cart", - recipe = { - {"default:steel_ingot", "", "default:steel_ingot"}, - {"default:steel_ingot", "", "default:steel_ingot"}, - {"group:wood", "default:steel_ingot", "group:wood"}, - }, -}) - -minetest.register_on_shutdown(function() - railcart:save() -end) - diff --git a/games/default/files/railcart/models/railcart.b3d b/games/default/files/railcart/models/railcart.b3d deleted file mode 100644 index 0918c2c7ec36eafea9f5307025809dccaff62997..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5626 zcmai2S#wlH6mCKSVIMXHMfQDP1q5a;Aprs;fg~a*vhQ045O>XG-}hImod2ND)>QdN z=E+y9e6SRe_@xt4B{j zO+RtLxio6OwY79@ug^Kxhi7kRch?Ui>^Cl02fXg)qsBu~6rV-qzRm zBbZOIFbHEf?zP!|qCfk+RQ{_v*V`hDFE{u#a)_&v$2izZ(eSFxxxZx_;@5Q;=iDoA zE0*i3wo2aCDVEKbtvAf#i)uFK>MgzqYm~8+U(ePlCNcY1n1kYroU`?mTZFu2W4*Xe z2|8ixS?)eQ*(&*0zJ9)5uobXIED)}&GvxT|&xi}Dh zKO*x*zkDn=?qw2-#a}FAT$I=_7jh~3vugACdRuyr`jiLu0KZl8oUgj{-}5qkH&(~R zg|G$=@zv(0$Axv_xESZp*RA}oKMz)e2F3icYU8CCm`7G!5?gwItu7^=E96GMj=4eh zH3TzXAGf#FS98l1OfHqpKgZt*kDwpPRM6S$@Mi<7l^-llo^NJU&|wj&tkUtLLanM-vOA<^Y3%(cW2C2TaRbMeCYnFk5_$gt(49CfGvz! z@3)|)S$$XeA~x2?`*2AO()osSozHDx4|DzAp_WJ3+ih-`8*N1Te%Rb_&uwlpjyc;r z+Ib(texKAJ-S2fKgLg7|lb>tvT>9nv$lh)CUSJQaQ8@6~cRD{V$A# zws=#r9(+Z9X3A!Fme%Z8lJ#`{u-<@oH%-;|W!gtF*Xm-iWZjwYuKK=K?VVU7VrZ7+=xP4eLUibKRY-UETHe zy(59u5ox8UcRhQ>Q!{7zK<3#z?0;4j2pI&jUAJI_0+j z{GH(@0B=jD{0=Y~m;}%tb;?r!KJNnW0n{l^6Hf(Cmri*WFcX*oa6Wa)bAZ_ZeKJ1k zl;;EUfVsc|>68}(i-3i)QK!5NSPCowmP@C+3RnrO09H$WphM5CM#(5ui?a3(y2`Ek4vKa}0lP z23n+3=9*k@E3i#EWsYqHwgWq)Q|8!Rz)qk|I^~f7>)j4?NTa~klsrj1S8tqfX)5O!oGsH8+v&6H-bHsDS^ThMT3&ab>i^Pk?OT$`WHvD}8ydM+9E-1suZwSpZ;Ee;Z;S7U?~3nB`Wf<2V34=D*ogloy^WlHl0N3gMi@unW3tyH89CwiUw=7x<9uPT Y8Dda`apgCR&2wx$2H}Z;=>Nw42W+Ov?*IS* diff --git a/games/default/files/railcart/models/railcart.blend b/games/default/files/railcart/models/railcart.blend deleted file mode 100644 index 2f41f53e8fc14d9e8d0c991d9ead9f56fc87f47f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480552 zcmeF43t$~(nf@ou>4l0Exd{~^LIf3|^dcZalQgHL&~j_bMZC0WPYRJVsY%MkRU74i zh^`j|MRqN6Ihxi|NL)c<1N?Y!%`xAVWZ_kq;^#+~u=Zs&hRZWYD= z?E?$XyJWAs7VPW(mpboB=U@B4;)|B=b$wu8^nX|9z0~>N+xo!1=Kn~~`*7#q`oP|D zU%0pXzhJ?Foh>abxSzB0I?|vF`tKao#IA|6{QajAj3y%ky68`5%jYV66GSJI;GG z=U@AP&ST-ea4h;??rV5Emz69>a{q7VJ83x<`oLK8e=MEXJ$>%WZ& zd-7|8vF3lNbM;(oAFcDR{a{agZ_QZr|G7BNrRp5b^S`Iw3#9&+z6Olu`9F6LeE&e| zf9Z3tW5V8k{`H!a`d_*a?Cs}&tog6ceo9@dpNs8#`}rSh{_oD${`HdFrKl{~j zA@#rdd$vmM^ODN!?q@&y!ucOd{_oE7-`Uxo!7oCzq4gU_mI#1>1(-4<~?ov zA4}K&=lcBn=UmUbKfkr>oukqZ_O$cAulqmTIrq=MvG#*Xy!Xo_UE7|oZTq7CIHO>1FjoB6V?FQu3wK`G-aX_#Y^2v-JKynTwda3V{lGuIJ?Z?9CI92s zu{XVG`H+4v+_)P*=l=R=oqxX{_^%O+wIA$B=YOpEAMXRBH71PK`PXYysq2)ETiR#O zmoY4<9nZ(MvFv|Ryeb_NDmnjlA6n{s>#^vZbewzAwy|{mA8Fjmy-yg)`M2|(^c>OL z9t-E&kKx|tzuz`vJty&dM!a6|{;r#J{zr1Y_oT7h+FR~&Z}dMY20A8aU$A>IUF!X! z_60rv!<}y}r}N%$zWvzj3;z4PyOF>-rxLu^~KcxeYX#!{_nfz-o~5M|9!U)r2g-_=RWm6J@={q zX&*?h|NCwqNd4b;&wYCRPtSdl|GG{4M!MWL;^1HZQ?C128iO_{8~QvTO+d^*U7R74yYNg>oxg<*Y#)a zy{SJqFc{YxNM=rJI0ygK1ZEu4gjIVs!rK#Rh-z>($+4uP1EIy zmM*EYGuPVQ9j>3WyuGy}7am9oX#~;;?Dhy;a&8bjC40^M{Ko!o>cEk31ect9Nn6Lc zEzzKnkY`t$;`L^x$oS;VwX7gB_XGX;^FPpU^%ai&P=DrobMLN`4dXalTB&9J%-3ux z%zn)#UDnGI{8YoHJZCGHZCcXwpseU|d@J7e4@-F&Lp5*rimukyDq4R+&>1{9;Wjj} zCKw<5rgps4S`)^)@ay;7r~9$VVzJ~6xAosryYOzEH~pevQ%>f>5jSi+M3&i~ZQfXa z!y_B5%;NKcV3VvAq%BX%QsbRJ&>er6XVJ`T-NkLKSJ%y3)81}d%Uj0JWBp%F-<1FJ z>6>yg7v|s8pZ)j^{hMUAT5%1Ml?k?C7fU@She#f+cTkqPzl?CanB~(n%Qq;;pygcN zQ*qI=e41wY3c^m{lVoKlx=pLT1M;Cym?8tynVu2wjguV_9(BWTi%?UA1&Kg zBCn=f-n_7u)x3$v;N|TTM%|KkP-Z<=o$Pou-Rdm}=XI8Rg@nACZh5s1EvtF^VtJQo z{nF2#mZiqb`kcl<^JF)Nf9aDf_oi_UoMaqs)K(WY~XQ zs%uNV>`2r9TQ=%Gvw!mP4YX%n-p87-tb3+--6fX%x0n6v2;|VRJER_4_BI58&N>Fx z)@FkJgUP|WCQij%vdXZ}CgpIWPmR>4EzxPJTa5C*+6Odl8Y_!i{?9JX*j4X+%|Y)K zg=n|EjkcbVjfXPflN=O3!1Wh#X=A0ObF(cpW{s02Q%x{2I7m+41gUX@L~w%@w4AZ! z(<}K#nQQI3l}%(?@@m{BzRkV`XvEsx^+Iw2M)%X1KWN2=DLEt-Bcd+pFQsCy%*D|^q%XrM?C&uVwC)e3~#z>iU3`*D|{P zkkqSnoxt+5mu8!0Uh~<3?#I60sO9hb#4l!_^pbP8^nB*REpiN7)?Bu>;hBfNJbT@1 z9@1l&{ozfk9)9oJ1{;1ne{i!L1CB}Sec8tLCOL+t+%sEdcl2D;(D=|i+5e(V-DjP* z`7J;B%9#tk_6s@Q8)trb^_p$>J@$ChPu7j!_N%|$G4RtZ>ww8XRbZn*p@Xh z(=hBnk=6EhwG7A0h zHN{JheBI)vv9h>nX^kUldE&Q>+uhPAG-cPN$qRdo6*qgnv5tS|cGzHfewF zZP4x|eX~}Uh+9q2DV=WkNuNo(SJTD$q9+|%s~+F@;tZp-X3s$MxyO@Iryg(SpmqKF zOvHAvcu`YF+p3nHw$6^=q?1pcZrjUQ#^W$3uTe7#ZtAa>x$it#-Y!mkqWWhbTJNA7 z7}{~RJj;(w+E4U;H6v-3uU=Woxva&{HjpL>T3=T3X*taoe+HsyR$orIKFp`Nr7ZWW zX_hZ9oMpZsh@Nfe@oAdn>l4l~pZ^R*^J$vpD+uSAubB^zY`>aj`38mi!hFU1)ileO zIp?N+EvLudJmGPiLaR^HEML7c^R1m&oDXSI9`TcWT2AW=g7@QJt1s)-mlM`ltrd*BEMEO}D%`VJ)k9 za|wAh-SXyzvzlM>XC+@!UQM^W znS~NpSdgyh zHLt{>KA~Psx4eDAIhnOx*@V2BZg~sBd71l44d2EQU&1kHy5%hh=QY3ND-SXB8Ygvs$ zQeI8Byjfu_o0q&9@k9HrPT~0A<;@9e*^KNzDX*qmy?NoR%)0-iyqa!#`-F2k%Q5sN zv`y13uO6G0%}c&QEblT&(|dxaWvK)4EyA)0wBC%&^)lyW)@?fZ_n=Al-37Vl);Y6N zo(BdS!g8*(ixHkxOS;`Z7UkQm_uc!Cx%+O7mBmeCs&Pha6Ysm1H3h-yrlk9B-KLX0 zJAD4{yWJ}#cT}VIuR6I*s?&b`v@ErcXa4C1cONYMdQj$!IFV%^&&vIry>|PdWX@#H zsCk?Z3hcFI=E)oTbb-N!ZE&Q)=~t<7>6GTCd%b+L7qTI%1|X(MDp#Cq?L zvhw#BTk+xLGuj{$eu|Z>Hano8g zj;Ou&R%z>;g6*kB)@y>FZP)b^q}&-iz(=@z6_?h>ZQatX9xnAcOyj%9YfJ6#F=y0l zt~o*GSWd25+;lamPA%=1jIaA?)v(45?~{-|sSiAhcFKw~)$HJTDjWU%FFJsoCkDa# zXcgDoWwNeLo8LXc>bu-u%hWH$6?$Cvh7 z)2*Ktkg5AFWXVP?h;G>YsUw_QC9r6Wuo8B6Q;^5xZ$2171bHrvnv@rI~u;G zSm82O&2NpB#Z8NA97Vl>Ab2Oo!TEDmKk}l1Kh1kbxSq5dYm@n{>+*Nh;H}84&x+>H z3EqD5d|kR{mvv3DqSH9>Au~y0*5%eq{;PFrT(z&nr+Df3dOUxn>l!!xV~O@j9qf|) zo>FP$yRqC_9=o<@nXr0l&JGHz!+Jd)6kqlJSFg)@cs9=dNE&`ltvs8qJ)@>8eofwQ zLw`o*`~-0=J}PZ}c3X6OdM|U&c3nS7&R2uX>g1*Dv?p?D&f2}qCEOm>qvW3V-Y)m5dM_h? zhsaEjtNf)kIv3}(HNUT%EG6PoykvYmp1;y{?c*w{_Q@?$Nz&ma9A2fn+im5(_fo#z zC}WS-c8$sYQcmlbBpY@60i3h{bUOZCeYdPD>jQmFb5l*A@6|h4R`f1ZS)a)o9}1FK z>wC&=`}KE6{8sn3GvvQMV$G|QZnp_}u8Q&$)_V2uZ*ZC?f6Tgmeg6;g%YJQ4({b!+ zY!8AZ|9nHgj&V5|$MP~4WNgcFO#8h2xk0Zj|0sFg`@U|j{ZOqt4!aM@A1LFQ%-P8@ zPch%@NF`1ZPrYB(baONR0xw_hTZ`{IdUM6=QB{fbVRlgWIz!9qn8sz|n09mR)IjIt z$#3(g6SBCH(S1nini2|^vB~15v9h=o_IGi1)l6v)8s`Tz(ytYg{< zj8FXiOSmqmMrnVM%aJfm#&ZgWO372S=`iTjicM!vGP8{WnO=a*6)-In`GAh^bz)t z4X#l5>_*r9bSB#(9ye+6rr?&^JA-$Z=x;hM>8x=}?r$2*=zU+dqtRYk+%#4eH{FNE zakTd}8ui)uRw`~c*Irc=@%Z{^97Db@df%7wLsF^h`a|FM)z|(Z?HfhYkuNNM-`6=m ztnPhZKlrYD-`CvO`@UYYi}!u?Ez34_Ui;aBzkEA--`8&reQNW`o1*u9o%Hb1*;5;$ z_kF!8`>uwYmK4A5Yrluuo8%apR`7ja7w~;we_Qyko4@wRwAq6PEsz-8c7JpGnr#m} z`gqe7|2%%%_x^mxz<76mC?8Py1k|J{@!@g3_ue$4BJNvh7$2PS8=L?6pqT`dk?@RB|z9^MD&ulMlsoTcn z`@SZ9NRHfp-`8K8i(BTe@qJ%Kqnn?e%o@LClBD;^cF#OZ-kYNL(Dibk+^6@O_nNhcU=Injz`*kk7NbXAx9eSOxYl^1ZH6?SfpYNTqd*oNg z*7Yb#PkMYh;huTm1Su=`%(hItXTEpb)IjIbleIbNp4pX*?wNa|$=N_^7NsErA3J)W!jb&H$E%HpQ|vbfJxzn{^nLHnA{rQ+sZ zEAPI0KaG{eP1~q(41xo<2En_ff2|*oxly;v`%-0Hx7Ri4nm%8${-(pYZY<5vK za(c(iRFG>!bg**d^18$(ZR;{w(L7DkP;IL{1F}5TF5~gDed=|}u37qiO1*~Z^(rUN zc=Eh%*}k=3TrU;rYpMPBzjxei<6NzF&B{-eYn9A}!{iyn5jLJ$>F7C+rke|y!@Ycs zZ;4%__Ka(mws~DVfYPkpe$A3tS== z9f?A@Yt|%5ch9cJ$u(<7@Xm2Ng7(Dxu5zvO4)ztdCHhxO``0YD9;J^Kh1V>JmBmf# zc73jHYY{X2t6P9Zz*!mD%1GXMg8eSZmMEt}BW~kr_9z)oWiGr#?zdiQ&PNAe z{an+npBLv_85>tWrQ=0o^uC>_t|U5}9pJ^9*xM&%_4zrMLthKXXJ^i-IUI9RZE_uu zYoES1N!zS*d~)|@`dYwx-f*uf;-yEvZgJCCS=_X=#&P7e?7p0S+>)MWYR~bf_`07~ zDQE7Ep35oQbGg%ZzOXS~=Vv~D@sMq|Hx)mZn_qJ-KHK=yTc5@xsIJe{Eyqr1rthQpe`rLmRhTx#g2v9-ltF zNsgiEkh9j!{?vcnHGA2XJH8|z7Mk&qty>?tar@>oUwhY$a=f?A`1>`7Zu{5q=zti-SSFD#~NT=s20^d1kYGb_ak#5tz@w>z3H=MWO zPn%yo>9WnW$8MDV>Ry{^owa{BJ@#DgnWh?C38Fo^aa`}CqDlW|rgh)@%*NUOaq{D{ zzxVzLMd_MT$0vLqQ^x+i<++@O2A{_aqUUn%UTO57%h_ku^z&&?V!v`vBi}dVe`n9) zMa`Y7R(E!{^|WeD6pYhT(%U3VwP|IP5!M!-uwqH%Nd|BnNzT$jHlM1wOPV#9vt#AL@ z;(VHB_2q@LVLr|6#slpKnr8WQyOz`CEOsb8zQbj`PqzO;mb%{p^XNIwgza&4YFTO}D(6 zE{U(K>oE)_nr?aX z!dcC)=Q$y-rd!@V;hfAmKIIbfYP#hu2S_kyD7=sFP~|WIe)b5uP$nX)~S>B6@4$3rrT?xqI~J+np~h_|61HM zRu(tSqH#plXI9OX`@I3M{__OBPe7^B|6G%vW1UKUuF29}F8kL#qvO3*_HvQOrE_VL&7*?}HLhs;x^EU4*(88zYe z%oX(e2xQJ2Bd#7>x{qtRovY$}|B%)C!{;NtcwQ2%Bdzp5=kO%qZ>K1$&r7rpS;{@X zo89wN`JOrXT+;&iWRlLwliz048O!EMMt?gkT~n-JnXA^vHC7fktwQ4{-FU$N+{28S z=WMAJ>EA4+JS+%C%`ho@9p`ED$?md9?+s;A~`?hf%)ofS_DGUsIOi#fYm%IkBhOlCpN zXJhXX&J4wCrdVxL8<%GtY|tG!%S;jDZOV&Z!b%~|UU&$Y7} zD~p?U8I7YZgFwfn=(C7B*M6$`?^|*OO_?nRcRml$-b1~B>%Oy^_vTvtcgUpAG#cM6 zk2<2yA}*-;NUhF8@?wKIt9?a3+!UYUCFASy{FSb2AAd>;YoF8yly;u{`VtP$Pu?Rr zdZr#7Ua8L_s?+B8_k`7Vz3;xbMEt0BEc% zZiQD#9}W9l^qzk`#^?Jp02Vjxj~|W)P1bk!X8<%-7B}@--wECZ<1N>@!rLAzd=|hyPoK}pN_=nA6!o+%X;*glTE?9YwiqIC-fyPrsI;%8n@*B zrUiH3`@l3-7B@XUjiWC2v`PEhaB(}n_M=4+kFSqLd-5BP3BUVQ`5~!PclxH*Uur)n znojy_uCZu?tn8_OYkbv&bqyC>^5O7rjowJ>jm&}ODS$Vtn({#J06sCFk z8uk5cI`JO4_bbKgF0tgldVD(J{&ty`m3wAeCf+m8lJD-&x%6ah{(3?Ob0wpD=HY89 zy^md`Sll#L7PriFxrdQB?yBtbnf?v-mH08Z_e<@*duEN5#ZCKV)aPc(yTuHt6 zb5rS>it8pIyzv#v+!_I&xT^Mc^7^L~BdgJ(|u;lYiQQ9^F&^k!FTTr{q8d}E2YX{NPO zXQ{YpY0YC(eBHKJyVST{AbnoPz;8-r2}6eb^xpF~X8YsBST<_qs}?tnmBlS{id?rO zj;IE|SM!Z<{0)Ky&0;auzabgyGikTlNsjIN>s&99j`4T0ocrim?!N~gt@(z`v5L5= zG1FP&x<|bBmRMQbv|omOZV!u_MRWML?Y`^1#>(QR$EJPG9b<2Ew7hOh&|A|O1Rvcj zf9s5mZ7x^*-~FX;=v1ozxYY9g9j?FaAA4pIUoUS@rE|m6S4x~@4AjqbBjN8$ zD#>|kNzduMWWi^ebp7^^e_USk%X`4cejU0!oze)T5lADDMj(wq8i6zdX#~;;q!CCX zkVYVlKpKHG0%-)&2&56%HzT0WCDZ4H`{ub%Tb)KAjX)ZKGy-V^(g>sxNF$I&AdNs8 zfiwbX1kwnk5lADDMqnfn82R%<{ak`S4SiRneP5$~N8^){RdZxtD&ONH-I=kV%?#?nxyal z)bHujdIx2x`^yV6OSrInnr8X>gteT@^fA0c*79kZzD$q2ADa2(o8aZ!S!(cIVA>8%vwZc+VSUB><-c@^7l)~hck ztmRz3;`%hr_L~>ZhWVbv=TEFYO|yJ`!a3%9U_x;|O|yIj;XL!n=L2;2VS6>r@(l|2 zF<*XsaXwA6d>QFGS`HNjXB3?`O|yLU%FOq@@x}R&CKVul+81Tk`X<#B?>Fn!r|DYG z<%{B{-|3i>?Z1#E`XBS;<=pj!=h?Mc^X9$0eZpE+^V+%A`ZeD8UP&)+LG#J1b!Ni$ zM|m~fj$u&q$*grI<<)e{o4HEjDeF1OTc1#`rd!^6VJ%xIkyq0#Z&p~#>i)9{^=i81 z%?a1*EctQ?c{Sbg=7qC5m&mK>mbXthCv!&f<`e4Gbjw>1&daQAOUkS1mUmFNPv%^S zdNtkhX0DbxHLuj$mv9W4Zh7m4wQRlQDQeI8BygA`|nFmW8gQi>F zyl__M67_1jkwX7a%QeI8BdIyF3WY*)&Ce*9xmRGMM zT2_xYDX*qmUOhG~tNV}VT_$OIJ$hP}>T&%i-E~QiA+K?hIV1a!Buo#;2MgXQqmNz@ zCQf`%K8vfRCdp?p#|8N(Yd012`ya>MurYs{9N%lBa`_j(_r8M68Y6uFqomtsKKy(^ z-Dk6IPxjfYAI8>QYN>zq_;kW&vwA-xW%YY_xE%7?tU$gSPurk#>B(<%JeQWdOk!Xk zShR>(zQT_uZpyspuDf-%ZKamEi*D)<{mqtD z^f!&`+Y@5zdTJECc+c(o$;jj8$0^PhH;t9`xBOS%*ROGOc~>{fuhti$afDb{}` z8=ql9ss8rc;nVS1z~b+9dnQ;>t8=u+I1N{)D=EJ)#6t0!^8X&iEwkYIjhXYWPxLUp z&-l8>Ug(4T^CP0D0OA$gv-SKwqyK^K$;!r>a>5|_%=ya^*5+8@{&Y;gKGTr+8yJMwhm)ixwN?H zs_oOyqNRshpEZh}$`3&Wdd=0}#IkdP>#(@0@nn|?GLL@-*Ptak-&1rg8vK33J^F15 z`uS=-4;cxB=KTumn=><8H}{&=on6(uDE5O9<7roPu4gjIVs!rK#Rh-z> z($+4uP1EIymM*DNKH%QoJuP+s>1rB*Gy-Ef0%rJ0%V*}&Hyw`YQ<)z8^AG`d^>;ho zPhQVQuQ1#;y)RfMsLuzUmZjcj+#;;c4(jFkKu+eo%msN~AW6aXa?@e2#eXg@@iLj2 zHBaLE$Mji&JdgN!?WW9I@*8!|{!YHj<@eWx_uGZTXQvc52&60aoaJ`h(X9ZjixtG@O(Vr>bp|5lDWNrSMv{&04pS0wg zyvW9D8vKzwD>zl2704Vf8($xM@eLd6j~f12fyT<>rsXw`s7K?}yMJ^qE$cOnGq8S) z#AGJpvV(1y$aTAywzye(?AQ`syUncm+Blu%7{=eQQGc0C?yeP~N4s+}A zX-(18BXP@r_{@7U<2P^2{6fCxy)7U1rR*W{_nnul>(8z@;+|aYh%;BGg=C<CY z7mIHcZw?lD>tQUU{b4LVDY1~)ShlDwEgd~=E$wYB-TLEqBc7@)-z0lIv8n9c79HOr z#^Q9@dWe^@*yAu3(*7_O8zdGI8_O28WmRX7bc&_R+t-vMO10$|x2#&--kPgB7kjUp zQ{LWPD^6!DbWLMnWA_r5jDN#eNc+QB+$ph;*jToxE!|hNNNg;d*Ot!io~5h1I#;xImoa2iTmAysYuyFq?$wUoEr0)iZtS$J z)-Nux4YCYlA?*)i@o9;L#Ky8kZRze2b#3#Am(`YET+v>O5AVlbEd24}QZHK=3u%8C zi@PKi5*y1FwWV`S&+0Wjwtb|_YRjKr(O!#>?iGy1?Zume*L&+>ETsKmEbf+ANNg-y z)RyHfSC%tSu!3sKpycJyv}pw};Si#c+cmo1Eiv_Fi+XCxL98_O28Wu<&qX?M@H z?d1ie+Vb-%+N&MCTmI#Lqw&Ib&gbk)`cr4jR>#x8ta0 z`5^DX>tmHH@YcgvNc+QBY?N3?Y%H6#Wp!8URc)tQUU{b4LVE3uH+ zST>7=-gS1C-z{+6R>vwWulJpm?AMN8mv7>D@p*rv@cG_)7z=5C7>mzIEF?CT&0?`) zO?OY{D!tcQ-CfS0QEmBV>{su$?LwbWfNt1Z9lJ?uJ%UPtu#W&Aoa$157fLfRk3 z;`0&W zEWTHqAAVWf%)-e;A8R5(|lqWeeNV+HqA|S7(Pj^XysL-gfyF zJtKRrQ*HUV(QfM&j(oRv_*foQA{O(!TwyGv{b4M=AhD3xShlb&Z5_F`uGST01wtyR zw*1-LZN-6*WB8g}N7NC04(|7hv#gP_3}Yef4`cDK5(|lqWeeMKc}tI6(`@sIm(`X( ztFqk|9p4PbB7WaF-^&%oLfRk3;sJ?;#Ky9PZCTaUUG~EZsifNS=T^2`JA5psG8Vex zzfL{d%N52#+8@T^L5YRL#)zNY?GIz|C5eN?CVy&iEcCC+ zYr0zHO^q#O{Y}7PQEB-lZohSl%iOQET9@ZB7Pc)DxLCZ-HpnvU7t;PP77t4-v~Rq& zI2KpQtHjo8mR{b~xn^}ay~AQrY59w>-@3EP-LKco;9nyZ$woBMm&HCrqyEq~F)b?3H})f0yv(}j#h-N_@NbM z4`U(i4`Z=K;vlifpIICW_VE>+?VVlabPbC|rRC{JbGiHVBl35-rm7?HSm>LGYzku` z?GIxyAhFQC(NG)1najBU@T5DlLCjtGtK3r|a6fY}vaG5Ac_ag>5iL8f}9t z!&pfB!&q#UI7n>rjY+ZKGrlrzGKynSe)-Y3*ZS6wSm?XPf}jcix_`o0Nc+QBY?D|> zY%E*Y7WclXr7K!iwRV-!H>xdf$5G8v@3np{73gbrf12s7gt3tJhq2f$v5?qUHfu|} zyg$jdm9wn2{K5+N>mTDWjKw?sjl#3M^)MFF{xB8=iG{?*vRPZo?GK|>zPZePX#4e- zo8&s8{lb60g{Hs8%M`{!+8@T^%MuHTjb$s2#nN2oN=q5pvg-1!t9!1f>s(nkudTJx zhkZ*K3;%vXkNy;|31KXx{b4M=BC(LzShjdu+PYV_x0La>fvU@wyF)v0Z}|-wJGEcD z-P@*ks<$4-LfRk3;;Rx1iH&6o+v5MNs0?AMEk7F9k^317Ym>cZKg~ACGK__^Ka9l= ziG{?*vRPZ?17vM0+gi)I&(b=oEq`u>`?cfOWi4Nu{m9=aJi}WLVW>~DY{IHdeFtOC%ijMcnhp~|Mhq3se<{-xQBU zPghGvx4x6lt6|p|#iFwEODfuH@o^n5{X(Dp#)r9Ac-g{ONc+QBd_!WPedAx_v5*g0 z_OvW5w?$DbDl4DWz1CG1ktvLYHQmMw`MJ$-3S%Md4`cDD#6e<{e;^)RMB3&Mhd=zu~=TbIXJ;v4`U(i4`cByiG#!@|HXJL%6_DUJw>sotbA1u zwAj`r#v=ZDhX)3+)?Q;;{&QUn-BLyIMv#ct)|Ptb90L$hRJhe6L<31sfR)+iGK{|J4IwETsKm zESe=25}W)$JQn=?$ZGim=LqAV`;KB!S$TeLw6(TNn#ze;A9b z#6tVVws^*C#!EW>^w?GIydj>JM@W7#Yg;VUak7~!(o z^5JW<5$-Q3o4#gON8+#9>%7ciETsKmEEY&CBsP{!^Z3`1mNK7TR9oJTqnc%@>&RhV zrC}_j{b4K?N-QKcmd)DIePwHVYtKmE)oG<&-_uxDT7Geb`;Cqu2=-&Y_?W*@_{H9O z7z=5C7>jcy77`oFX0fRBI#PA{QFv{3qr6U4N7}4WTpsSNhp~|Mhp{+MVj;1yY}OXN z$14AwC{e$twEP^|Z*}iP34#|e7V(?JBdn3K3}Yef4`Xq@#6n_Y*(?^TJG)!u{l3e) zTDsyxkY!C=R$E>^tJ^B?b1i$n{=xjgyQb=PyN*otGKH~__J^^!Kw=@Wv250s%de0R z5ZlHwmerO&tHS;Ihj=4nvDn`z{1R_HjD@s6jKzf#3yFqhqH{=EzHJgDk^XNc+QBES6YEY%H6_!oP1^TELS-?GIydk;Fn`W7+(+RPr&aYRiwtXRJQOYpQ+5${cxtHBy#gETsKm zEH0K0aHsVoiHXSsx;)w*2A>_G!m%%YMefuBjG_7g`2chOv9aF?C9O{R>s0Un`^N+z{?iKLfRk3;`I^>iH&9R+k)5aWqvhEwdL`e zeRYd`(bbu z?bvPk1;#?x{a74m8Dts8LfRk3;tdiDiH&9R+tS@#{!L%CAMZn6B) zPA}%=eAOA6@re?#u(B*sD|$yv(CmPN6sp#0(r%EXWCdM_55 zX5+;{UdAvM(*7_OZ<1I@Y%H7Kmd@4XzvrOZ^5<8uPdj#7euDR%k8y*=;$X`l%Pi)l~_n@ERWw7 z|22uF?`m0X`O$bias(Zz=fPSm4)qQ`jD@s6jKwmEg~Z0P4S9}T);pAQ zETsKmELKPyBsNyeYs;#Z)vL?CxK~?VK5SP0PVL~i{GNPYj=txh5ZmrPQR6m-{X*Iw z#v&)Nkl0u;uPtpIE8Ew|y>MACRI4q2b|pKtgXePP-&`y%_B(>4P4e=Ev5@wMv1pZ8 zNNg;d*Op2iUj)^bAC2c1v*bFW{o;$(C@%dk*A8PL?GIzIQeq*ov0`3Z%Ki+Z)=_Qw zsy=|oMjXjlSexvcT5B6*8OB1|AI9QxiG{?*vUzQ3Th(%TS$=38)s{cIlAYSYbNPf^ zN3>t~*9}dwm?(#_koJeMxI$tfvC(v$;%!;ltzSkw@*%X^@`yzpz5#jUJ9UR1{=0** zuniW2@wP#hVJxKmVJzf3=ra-<%QmDfWnN9HE$?Dc-PPpY60w+Ijr3z7?YCHHazV$S={CPn*dfvX)BLvZvT3t?crp3RpYz*sUD}VQrU|iM2xvZ|!dFsjLlJ-*ep# zJ$7qH{xJD{2wBg(GILM(+D=Y}{9UHIy|eO0$nED&ZOdp+^$R5K>{oj1){g9p*Y#_= zbbl9}t=*|zzWqnPEJB99rFuFlI}&S$Ei0=fxsBYe)VF zaYNQ~Qy#j{+Og&;xp;Liy-IHOx|g~Yt762<=jwdqe-fP!J$7qHcB=R>TszR35g&e- z(awi0!-OiK{y(C2=&@Tn^tWuZU0S{8d8KbH3XgKMk3Xzf!1|RQyR}2pwOxJnOqHEn!FwzRTuKDIw+X{>Y~ zTCeRRBfndu`;7K+Nk!j^8Q+K2Yx~gOM$&yo`#86ZcP3~A+!Wu3)@%FF9JKI`H~ zd&zD6gNt_Y8{`rzi59+#( zd7ni#{VikpZRxk)JYSdJeDqQIN{qTDS_ z#%rsWxOvILV$Tx!JvNz>GHHK%SQ4~PZkMI@xA^4$?L3~gr>w7)1JPqQXVp`4wntbU z&WWd4nKLry>8$-O-k@|){Vn*~+L<*UM@{ZG6zkR5zg)Lb=j@;4Hx&OIIh#H7z4sMl zHfJ^6`ktRJ2%c?raeAz&>fcZdLH8S6l0MzpFj+-%!-wdDk|_C;iRD7KwrN zh4^nMZhB0defeE?>l`l|UtemVRGJ`W<&Iz1%CK>;9D0xV>ugMxFibN!%wf+jK$cxarB!KDk8-v)M(}B%Icw z^gU@MzqWRh&h;;r{v_`&UM%lOTir9VBhY}fqQe*N7MzxC#bulM+>hzo1I z{O!^9{4wkL_3z2HucPEwTlKhgUq@rRvF0$=BQ~z}IOFknk0*FM(PRDnS*vG1k0*Ql z0+09i_=O%H;PDiX5A^s&9v|fK!5$ytu}0mF?J$pD?D63qAK~#-k6+^PksiO)K9v|y*y~i*2_&AS`_xKeaztZDZd3=J$ulD#vk5BS=n#U)Hoc1g0OZ!&8 z3eWrMzW$J}@wnIH8$G_wmZ91;!{a$7C?aWH85MFvnyt$7C?a zWH85MFvnyt$7C?aWH85MFvnyt$7C?aWH85MFvnyt$7C?aWH85MFx>%jOa^mI26IdX zb4&(vOa^mI26IdXb4&(vOa^mI26IdXb4&(vOa^mI26IdXb4&(vOa^mI26IdXb4&(v zOa^mI26IdXb4&(vOa^mI26IdXPxt!I43B4eJj>(PczlY-r+R#v$FKGHbdO)>@fjYU z>G5oj8$53GxXI%=9yfcO^>}W`=C$7c80$TfaYpW=l=U7qBlk<;cDdIIS?;fl^9M%t zWDbfre{jUvmqwgFI^t|y#F>|Q{PP>b`ZIFB7rHOwXXrkd?t|$*nC^q=KA7%<={}h5 zgXun)?t|$*nC^q=KA7%<={}h5gXun)?t|$*nC^q=KA7%<={}h5gXun)?t|$*nC^q= zKA7%<={}h5gXun)?t|$*nC^q=KA7%<={}h5gXun)?t|$*nC^q=KA7%<={}h5gXun) z?t|$*nC^q=KA7%<={}h5gXun)?t|$*nC^q=KA7%<={}h5gXun)?t|$*nC^q=J~(jW zfZTh89)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y z5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L z9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr< z=@FP7f$0&L9)al*m>z-Y5ttr<>5<&GhaQ3H5ttr<=@FP7f$0&L9)al*m>z-Y5ttr< z=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al* zm>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7 zf$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$7n0o=0GM1g1w| zdIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__sc zrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9N zV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U z1g1w|dIY9NV0yIP^9W3j!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_ z^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@ zOpn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk z!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@OposNJOa}rFg*g(BQQMz(<3lF0@EWf zJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz z(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7s zFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz)1!Mm zkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_ z^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@ zOpn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk z!1M@AkHGW@Opn0y2uzQ_^k~5I2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@A zkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_ z^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@ zOpn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@Ak9K$-f$0&L9)al*m>z-Y z5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L z9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr< z=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al* zm>z-Y(PN%RV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|m zM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w| zdIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__sc zrbl3U1g1w|dIY9NV0r|mM__scrbl3U^tk5{m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y z5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L z9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr< z=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7J>hu-rbl3U z1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|m zM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w| zdIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__sc zrbl3U1g1w|dIY9NPkA1J=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y z5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L z9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr< z=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)ao6Up$Y%^axCk!1M@AkHGW@Opn0y z2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@A zkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_ z^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGXu zK8K=b7oYV2(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF z0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g( zBQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWf zJp$7sFg*g(BQQMz(<3lF0@EWfJp$7s`3zU+5ttr<=@FP7f$0&L9)al*m>z-Y5ttr< z=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al* zm>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7 zf$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9?9n)Lyy4p z2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@A zkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_ z^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@ zOpn0y2uzQ_^axCk!1PEyI~;lhrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9N zV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U z1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|m zM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NcY7Xz=@FP7f$0&L9)al* zm>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7 zf$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y z5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L z9)ao6y`D#4dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9N zV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U z1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|mM__scrbl3U1g1w|dIY9NV0r|m zM__scrbl3U1g1w|dIY9NV0r|mM__vNpyv^o9)al*m>z-Y5ttr<=@FP7f$0&L9)al* zm>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7 zf$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y z5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttqgcpic25ttr< z=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al* zm>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7 zf$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y5ttr<=@FP7f$0&L9)al*m>z-Y z5ttr<=@FP7f$7l>&m%BB0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz z(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7s zFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF z0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg<$A^9W3j!1M@AkHGW@Opn0y2uzQ_ z^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@ zOpn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk z!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@OphM- zJOa}rFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz z(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7s zFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF z0@EWfJp$7sFg*g(BQQMz)1xOmkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_ z^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@ zOpn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^axCk z!1M@AkHGW@Opn0y2uzQ_^axCk!1M@AkHGW@Opn0y2uzQ_^yn$iBQQMz(<3lF0@EWf zJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz z(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7s zFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF0@EWfJp$7sFg*g(BQQMz(<3lF z0@EX~^GLr-SG%m;JK2Xo8^bIb>G%m;JK2Xo8^bIb>G%m;JK2Xo8^v%krA$cOz6%>D*ue*?3> zf!W`{>~CQ9H!%AfnEegR{sv}$1GB$@+26qIZ(#N}F#8*r{SD0i24;T)v%i7a-@xo| zVD>jK`x}`34b1)qW`6^-zk%7`!0c~e_BSy58<_nK%>D*ue*?3>f!W`{>~CQ9H!%Af znEegR{sv}$1GB$@+26qIZ(#N}F#8*r{SD0i24;T)&vK4{U*qv99-r#*X&%4UW8Pz+ z9^PYsd5;0+JqDQf7~lr4o<@&(kAXaMyzR{%XFZu@_4?-XM22(#|u1O=<&H8 zpXc%U9$(<`g&r^Rc(KPzJif@|i#@)?<4Zk$y~me%{05KT=<%C8ezV6*JznN9$0GR+ zi*PIgb1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^?^ zb1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXL zECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^?^ zb1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^?^b1VXL zECO>Z0&^?^b1VXLECO>Z0&^?^b1VXLECO>Z0&^^q-_QxiA~44yFvlV=$09JtA~44y zFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV= z$09JtA~44yFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV=$09Jt zA~44yFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV=$09JtA~44y zFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV= z$09JtA~44yFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV=$09JtA~44yFvlV=$09Jt zA~44yFvlV=$0D#Bi}W|VY%Fr@#v;dVEOP9|BFAnla_q(;$8Icg?8YL;ZY*-__N%`a zX8U!_F%a8127);Tf;k3)IR=6`27);Tf;k3)*)7qrG21J@xn}#- z-(L&c3ub%4Y%iGY1+%?iwinFyg4td$+bh5CX8YCOdb9mHW_z)n?FF;FV73>`_JY}7 zFxv}u`_EUOaA?g zCC_A!UtlbG!ejG}A=l)N4S!$A^={PP(_SWJdN$n9|1`?VvE6w?e@52(dN%YAc5mp< zuG!FEFS8_L(%;?wnvnkH{DcXUYBr72+9m~h+v z&)m?jbLNou-j_M_z4zJg#cR6#UVQd%_FM5%$v|yZ{*~#mCi(TqQ)M)5wsp50{$D*l zosQ6d1`dv_{5PVaHEGy z<*CC;?gtY$#miK(ZgJCCS=_W=7WKJGDt?a33?H}g;#(B0h=SmIqZ~JlmBme)tZ{Tr z@1>W$&0jiV`{wc6*Ejs(&5v#Qoqy8IY?!Bphr%am9mhMXH zlJW15f1YX5O}BsisxNF$I&AdNs8fiwbX1kwnk z5lADDMj(wq8i9Q?0{Xl$eO|b4p8K@bX#~;;q!CCXkVYVlKpKHG0%-)&2&556BalWQ zjX)ZKGy-V^MiPNxo*yUsz27t&;>x-{FfHz(8ec@01K+4Md!fl!OzVHVpObv7{J!zdQ^Vt?B)eny~k@}%cU``dI0 zOwze>C8KxKm#!(f{*i9AxM{2`Zdz93=;}B``qw0sVRt;<1&X5Z9 zz2IM!rH+90_pg`F_*@THHJF>N4c;X#y-DiJNFX%tS6JWqt6Mwj&R*4W zd21m5kN!06iq2K7)4F@sOv|-iHEmT}M{7@OcTWf>o_x}*lcvu+Q4&vFo||=YYwL_@ zS9f-`=enn@Y;WmlZ|TS_?Or|IZClkTo2`lyyIR`XrM79hT+z}cb#~@j+q&z}6~@VWL&VAM&oY_l z{wzD*?#(pQJLO(fr^lMs{QQIR`P!Or-EANK-&%fZ&V9Z%BW3mTwOl6N*Jj2|4RkI& zX`PQs@-GsyxRTN5Ylp8Xp@I=^vbbri?7lWXL0(5m99<*~(0V`XtGOqADAVV|2XaU0kg)hg=)ryy?8w$h~c$~yfxISvW0 zKX(K_8K<)=7ynoLn$D%-7XMsw>6+p-m$zl)_CbBI2(Wow{Yt{P9n3ms#TJ`jz%K?N7QqSzl1dr2Wm-EnOa-$X1!(e)IgDJJ+t26-;dg z(%RYw{(bxU764aicPoj-D2zrL5;nsqyWtm!X1 z|Lc?>cuTlGl7qU7yQPiz^vjKZdU-+I+ zL}I7$)bBFc(D)*EqTV+7WzL?jyDilQbSmBlSPMXrN>pR0a1qgI2CIm3-R@%yh)+i|QSi<`#E;-*|V#~#v|uV{^7CmD0u#ybKEhFJ5Yw~jMO;X zc&)E7hKpOgbbQ_Is``I5Zh9;k8KWgg81wY|o^TH)u4+8>yRDKYhA3Df-!YYx{(NuK zwk?x`(Bpfq?ziOHTr^of%pVx_!@`Sf%+stZ!|TQ4U${eFufI54FRG}-${QGT+;1(r zS<1@&mMw?eZ|yJNhxJBzt*&$FN$b2wk~)%Jh6%&h z6fZsUb&H$E%HozkRGtq>99=E5nuBHQy#98qTkrkA_B$nm{Xy^hJgXbHYwK^eZt1Zj zL)<1y`=kE0DfmI{oifLAa#bDGS>u+}-*)$PR%2yx(?ira@=*7vg^mlu#qE)rVlUl# zLdUG4RhfS|<{s^DOXS=tKO}YO9{OK?@BCg1M9jintB`dJN?9ge}2*N15bQ?#v{7@(uXF?druAf@ z8g>1qzueY5vml)o~mzuwZ~t4JbTyL7n?Sq5BRMbep}uBl2>P$dK>=h zjyq@n@)KumK4H}}vp;g*!iK?xziLF1{PUhQH|bj^hMl6nio~<^Hk|grS7zUL?v~l- zy&*H?7}c{^i(GmStDVkF*85w%m(X!bx6Pb6b4XeDy3yZXUDG!oT{v5YT})a|$Loyz zUJEzLLZ98}WJ|X;8vnZe$#Yt%tVaHwbohsa_MfBsa?gm~mMy)X1B1!>jh!W~C#A}1 z{FX_gesAp4vb6Z=cgpJb#_IRSX63tN3o>gR`~83R-UUvsqD&ha<} z5EaOUi$G?2W;$FXTucHemz{K`JIRol>2aoqB#5Sg=CX)#S-i1|5k`m!C`!B`Bm=aH zToheabl3gA=^;dW|%HT722TW?i8=dG&u)TwhC z441=hl5fa1GS&Vvo~9#4QEZg;?c7e2~{VaXK%n>qMR&(WU(x7EPy2z-Bc zHTs#pV)N3!Zri-{XRTt6dG$R9%trr=Zxw%j!=^I4mjQyfJ&%ww_}qxib$c{s?mtey z6H({vQx={xFWq_O(#}FY-!s@*7|8SuuE-DcGP4FZ(eg{{tS{W8y^(M^o-Kb2Vb04u zL{WQraSIFd-@~F8*aDl<=c2L5FTXI?Rj`DNL58uYxBS9vcOA7=HilS?yri)(0|P13 z6(jS+d3u5Vdsy@V3t;0OvQMO5tm+;t&aA16q*Ere_sBgg(0>n$0cuzBI`X4XLwC309v0}ohs6-E05-xF?n{4uFvkPql0Q~B(eh`azVYI~ zwh@av3>JLOV7uL{h=&FG?_qHfumCo~7VgXPfuUNKQYl_xx7J&}z0Uf)iVZ<5Xlrpz zJv4*`ZWBG{VS)a8SgZjSz($xNvFIEu4CGhWq#F}0zoh1xq{YFISkTrY7UEI$!~8ge}|` zZ5#Awy88;kQZ<}t`N^;^I?bB8UucZ%YPHQo74fh@|2-@|3@m_+u=#x%>>BFnFLY+t^%e5{d}LCSn`rrT zebrU8iCF9tgT>Akw}%D#?_qHXumCo~R?(Nib-lg0Ld|!o6D_~QRM&Jw)1rLWYH3!@ zA+h*dj19hvCB?%6{r9l=2(SP)!shoy@8yVn(V6crbm#lVyknYZd1YUmQCnToW;-Mn zWn*_X+Zmu`Jz=tk1^Vw{@ljv_Y@}GYFB#hguK|yVmiO$=apF-83wx{E!vg*Hu;{=Z zG_Z-oLhiZ8s~7c_SNH7W#DRSv7AG0K_@Z>mg!ZkPhXwlYVS&9a4Z7D>9MeFa%~^?k^jTJ1+Rkt(pL3nN;7)pXJ?0vCJKv_~ zKab~&e~Ew2rJmQIygg=F-ksjCg`q#@dNP9r%;33!3^wMORg;@&`6Yds{wCZc4dw@$ z3i+mvTwftKP_e6Ay(vG({Ivlr{@(LDD+-7XQExhZ}kO+|tdBw>iNlb$+QQV4(2%Fm)*Enco(a zTm>se>=?%V(%6^BGe7t3c;43rKL=~pf-7Qmr~v)h^1>K81R0`3?p!Ua)DYGo?@5H+ zlrd>vhsIZaqWhC<;3c?!;C1ft#_J&!?WPW?@r3?+Sj+>q#P`bZ8n_a(-e9g1-=gU1 z?x~O!m*8VDzVaujTAR+Suhw8|-f6JF%QR|DlxKb(G)VWbK>s}~<^u;{Q@SdQ#YNq@ zHS@Ba{R5m|3f;Nd)@dJ$ah6A|!JgG0+a32()QbkM^V5|Od$4&}p#L5gM*$1!#^1+a zfh{P^c{Mkv0*gA!&r6$Gw&ofu89()+#$uV5rLmai#Vx%+|2-^@1`fccbWIEveVN{R z%!3Ln>MVasAy?~h1gmF3@?3*OvzM%~kolO&o?f8;9u~&{3+l$TF<4}~2m5<6H9r`y zz@pCb>H4bkdTSHy1`A1Z%^3kKU!L=@K>s}~js*_Dru6X`Eb6=&s=%Vo@)Nz6VrOT^ zV4<}`!{K3p{(D%w7g$g?u8YBb&c06K}Gx z;JuaT#SDwd!vg*Hus9AlP&Ymq#$q{IvvMFmgfA#{tM5BmlHy4pi}96j_iEK&m8xy^ z3byBkzv{V@sWujodvfT%hsE*00oas26~@A|l{)hS-7uRo_3p{ZNvXQZd$v~78Fkbe z#NyW$7R-@zG`m`Co?f8;9u_A63t&^aK8%I254e$3$NcB(#rVpreW(depof_;5`LZ$ z`D_RM_ppFH?@~8ztb)ZLl;Wc9n$$HCi#p0HEZX`qJ?jQ*tI)dELVnli#o0*U7!en_ zhmZaX7UXk*jqv+@$rZX*b!KoBu}|`92`5^9$?9BB4s|wxKm%%+tt(r#SH;|^dBV@d zxi7-|*#AJbn5ewRt(5rkr))$6e+&aD?wpBF z9f!6s%X8J8;;7aQ9aCn@+{MQe4CNP6^**xEInuI((nO6Kv96P4ATO zo<_Y>a_l(XDIox3xV?{(?-lF&N44*Lpg+Hto2Tey6!bM?&|%H z;(ChWSR$@j^dnRhHcSpaYN~{F8^uc&1+Sa)phRWC#QQzpR{vZmfT3JVxSWyRylM9FXPvda^`@48zyII=;S-#f$8_H{5LY=S_7K!QMmK!QMmK!QMmK!QMmK!QMmK!QMmK!QMmK!QMB2-LoR z7(Ul8ry~98mYlA?N0ENpEt~i*4LRJmeUgisL7IZT_ zWk&HbUwBKP(}s66LN4=#cNlaQo_wys0$o!2#=bFMc*~$m^x$od;AOt>j)ESBr_3l` z<_oX;Ve|>{X2^|dFY|@B88pk1H%cz^g*OeFWy|1AN3@su!kY!%3}1@jWxnv1K&Ro^ zw)Z&FDA|mHt}1F6L2|9fjQC z2wvuk+-A^}O_@==%opA?XqFv@+;W6m<_m8YbTfPjd{Mm27hcs5#94oscNsFdCOm_X zV{;fZ0*7r#!)MtRc&5><$AJG;+e zE?v@pKdQQ z_m{3zc2G0MgA1RAFBu&_4C}Ax&}{(Abm!w;W60p*X6*Ky{{wF>e* z(4qTbbiBAZ7$2jPXPb+t-vPV}W%&-E2`ki7{u)p%rf~C*bKrZ_nb}Y>+FIhSs z=9+k1bevcTZj?$KmGt7R=xcjfYWmyuTRUFdUVeyi{=Viprh$KNLix>2(eZ_$e34^9 zzSkA{UDR_Lu4y-|2h4xQV{hjPE$U zQ{D%Z(*7F8e9_bLJ8ZtCq4E4ZGZ)L6=F5trqPr_s5+>wKXgt zGgPTA>91kcC4~yt5tZ>xtOPgWOB}VB^MPCcgT6?{zo*9cqe%Rv$&j)3uO=?zTjG-M z%Tbgb-&p7T?>YX`xu$_W#A!t-lek9Bi@K!i{p?_MNtVz$Nx_X+32qeO>D_a6$kV|K!?wZp#&{DRBTh|>vfr<%CV7aQq?6CH=%0d6C$yI{-^H+-+t zo$f5!>6!+5C8pvZuM_nx4!3a0aJ)j`I1`B5e3a!_=I^#dHCHgGtYW*di1c`01_sV6 zGRHgznsZK;wgWtEC-vsCFK-Vo&X1&QFd63?e0)AleWH54nqzjE zX3sGjoC_MSgAYs6apFe5&FD&)OTHtpquz%nR)QPb;^|!R8<>mXivOa*%l^?(`nGRj zXQOv2H};?CTNDnvJasUBBUk^vtN9UE*sRAi{#_$|v`EpnINZV|!|`aT^`}zbu16a= zmiaCAs5!>|7FJXZ2bx6rP84OhF|wk{Cus=+J_4deehPJT8KPXXWc}hZ0A(k0?J{c^ z*D{vkebY&plVtsBXlQi9>sNX%=2Uq1-SBg)b%_GtWFBU|%qQvhSbX8%IZhSLJW`vD z+`s_>r`9i37VDRUk?U6@eyNx~+Sz@MTEBEjfBlM=6fM8jRKbl{32vpsHO^WF*Q*oD zzPvr~&2t@>^^3ONyRZh)$$BMr4&!#dV)Fm#^$T%hBjc;E8=QAfyUy9)$n#k>Mcn9* z!5m0iC+r%W-ywI$eb0qh32x;hprfA7?TK~kM-NK-e!s$x+qlWcr{i#we34_qFmAAs zH#lpZ>zoxKMu`e;T)$*(lstwFD9vwp&+-x(pL{3!Myv!kj%VViYnu<;dM$m!H}@GY z-tf?EV33ddaSf!qRR`X^g~TP_WJ{oN0|x#**%s#pd}IFxBTpD55x9*F*vsqc?4x_Mguf^MrE6TLlcsai+fG2pjEQq%~BssI*tpcN{Topv}{qnKQ@n z9Y+?f!x6t_;HRA|HZzOUhUT8~Fg)$%VPi8hFAb2zW}Y@}VMEwvc8`V~2Va_pJ)ilN z>x8T+%$GGK$oE_a>v0@;Zp7yyR$ND7|FeB`%4RNp5oKXBOK9nm{&pmv8!g0>ANqJF zeU7r3bxGf5t}ZFQj_`62>Ag3Lp%s3k+TrwQDL6+TT~I`WHCWiRr1%IhsTJ$`y=)-9X%F=bh=oI&Kd!{4ZM zjFAIx*~Bx6B74c=iT{d(-%>5L#Iq+K#e50xUUuuICo!iMzC7_Wh?F~O`Y{Yz`XC{% zC9eVVgs%*m0=zj`=);$WZv0C-SnOn+@NG@T|q=W1jGpK&L&vHwWY~PxyvGXAPg@oEebEJmD*Y zE*ZY{GlG1~6TVT>`9$KvMqmIF| z1KDXI{49A{&@87q>fDW|Gya)S=1ILJ&}qZBenyawdBQggI&1jS(}TD$Pxx3L%P~w( z_vP`7SsCfSMaX`P8XoGP=ogZeE~xWp7O%Trk1g`L9_BtT^F?kmXv(I{<_KQq3vU`U z%Ti_(FY|>r3%VJ;1i7Q|Y%3kFIor#8;Vpqq8{Sex8<;P=!=SV9lsO#1%Y5N2gD%m7 zFN&A>!aE9j7~TbMIYKV;g}1o~9>kl$HyXjqeBn)lW?9ON;$^<@WnKdD~BV4XPi~wlwm(B|6bhBA0MydW#r4X3h)&_X|9z#>w0CJ zac1w--hl3=_kTy9aVA!R8yi6!aWr$paX#9i8+CH~2mWQ{gNOdZ$Gx~t5B`_yDEIM< z^FIG5#m4*gliQt3ZakUcCmT40au|6_Db_TC;2jbUj? zbjbG6>G8$!&Usowe;?QX-Ig@YbJE8<>GOpVEV`t>_f}m}gn$~81UF(OxRqP*+!Z)# z5&WI^XCL&%Azu6))f7)h{qt7KaNX#>pabvup~N4HQfhTJ5ofkB2L0!U8=S`*=#8L= zfHHprPhAN+U6RkMwcFq zeyD}5h*#jY*5Nbjct@G5;eQ>$qD%VEtE)?j5Kv>1;6|(jx6=PyxtTa>5yb6X_FsnRwQl<8{@TPcqhl2b`6JXc#+f1bCJ@Q6%uH-w@HaK@g^6PnF z1Nh@`)BB;kNL2P;}e>WZlllla#JzWj%pUK!7@;^ImQ0G2{i3d7dB@zJ?|OeSs({tybm}9AZta$dz_dDN;vy$}D&hGQ_2rzX?-~No36fM8jRKbl{32x=*HO{rl*pYn1 zjlRq1O1SO@=Uyc3xbu?4N^o;ufR5Ta7jE3k7`JgFc44PyBif(gSuo5wvAF0Pu@c-k zo{8hcBu`Cg&P(+1`bNBHf9@FEh?U^R9uvo@>G{N@%KR3G+gn|ZQ{RQ-e$M!*(syQg z=Osyh2cq;3oF`x{N3-U_$}kNzVw%e?tbZ{2c@UW*Z-yCo7+!nmv|CR zJ^}|#zoX*X)S4EhTUuvyJI~s6^tf<~&8yp9GS5p!JL;nNN)FEJJTFNbjU!u+vmhVS zqR&eP`51fru|+L%t0A&nb2g`vdva4)A3c}J@Oer5-YB}(J)K<~oNS6%W25XPE? z7%N9`BUXZ2+PO;Mtjh8oS!by?Z{jJK7q|D&=Eqbd@6N>JbACu!@5rjXprf!mr=QEj z2t{(-TC8n9ZV1Roi)S#_dj@AwY?~#pFlgb{BBFDs!`j=HrzPCAY~Tjx*<$6%knV50V3H}`C5S5`W`R$6YcWG zvAejjlG#gP9dWpAQ1`Z&Ee*GhdqpRWka0?^1UIf9#L?kiZSg$(rhCcEZ#pix-GfED z3~%G|b;RieH^%LJm1*{D_4;~p`}~uY!b*;C%HambsBvf8C1QN+;vC+1m-1mrwZ;7%%Bdfx z+_R;v^2*+`jh?aeo^7M^TG+Ft%_;UL&zRF5O~dA-4a)u6tYv?4U*v1h$&)bl_TIZV zKg_DI^% z=X{8j;O6d(bqzS`_V{*_AOGotq-}d(mCmdHAVOi5C*zEJdySP5?FU9hfsI>+^Yhn*QvxQ%sYfIX~^n{R(k`I!M=CAgJ# z#h3<;`U+6r>@x$5ztZ*1w?C&^--wmqR^APEJ8<-Hdj*{t&}|w^-#GD2y*`|=VKa-E`+bjBqg_7`&C@)n{{ta5gYG-ry2*M$kE|dVbjc#J7bSZqylX^>_(}wTG#-Kdr z3Ewd2tl>*fe@mbr%oDyc=#t@EKjSSy{474Ui{%);*y!WO_jgB;{#%6XoLe$|05(~J z50brieVH%3&7fH}4Zh(BUgisL8Z^sNW;ueF`NEq8-3(8eQM}9--V*3EJo!c=)!8e1qIf9q@!aE9jm_CM=`NHd7fwm&fwx%QGGGBO`L9;B| z8pX?e;Z1{PS++GBA(#2Wnn%CU|sH z@0a@hoh*uL0&yc&f*WNMXI013e@yGT%I!KXzx8riyZx?jN;Ad&){EpDHWO&Oo(3hJ z!%Rbnv%tj}ZIIFyWDLYaSM(P*0$HlGokD3-;fUKZ2&P_(j+a4G=Q$Qi@WTv^j*DH* zw!9g7&U-MuiuyY4rf?4ipWYkyVEe@DIP>LN1^FiN9<2C<4*kt86IPr-;WxW#y9av- z7nXevyB&TH222GvwuLzAHr9f?a!>Ht9vl$GoOvX3Iw2bfho3Gr& z@t(!FF2j#vY^MBR^oH_GlMNuc3F{t)fiY$vg76~KA_enTkMj!3$KHrRfhn+6zpD~M< z6fRj`TyP^+f?Ik&jkA`7XDqLv?^qKz`n}+(D`D5*{19mFxc4%MmEcy|A3Eykod4Zw zw(;fuj5z%J}|^mnX@mEgwlOdNHa@ZIX-C)E1k#hv|C{5B+Pf#)-ob*2xu zY9{Z@594;e$(BH^C%Yi#e>Z)Lb8+Ks&Z-DZScvlyJ#mZHHxAw%_g)6E65QB6;>hro z=45`0!|kMLZ2`o?@yY0qd;cu&y$sSkKgX-(IF;`;Jb%NZ70;&5YzV%W@hkIQM*5FG zX_@!6$G3j_miMbNC$8ykz3zP{wjBKK?{KMiZe9Ap`))rd*E)N_Xy9FkpZ!z*0o;wW zE<|~jxf^`sKMJxwf$}WF_;(*!XrLA8l;mzDBuXhU1eAGfu9 zwQyGJk&mB<`Uk)9?2=2j-ul76EO_osd$u~otB-nW)qdqGN>_EfW9K^_y86YF9-Mac ze(77zx$2?Ee{y@rr(a6m%OI9h{R>r#HGK(nK=0L+i_2PVC6a?wjc9lO$qYdZ2BqBB`5GLon9EiGStlvq?eK5u08_z@tssu7HL8!K7Hj;LeII?NyQgCwu36e#w;Yu$!p*IkAGPn3 zp1z`C9(;r_lSEzNy$E$B>{!}P3&-ueiO|%y10Y}+`<_2WXjdxqCEve6-4n7N^1BEn zO?a5T3K8lyKVu;2EF+FKV3gZEl*qQwx3si0g|c2((f)OXRr$X7F2DJ$*oT5A_RGM= zxk=_JKIi1TRl?lF`}#8cu$iZ1KW0BnrnH}@O*_8fA#=rKtw|pY`yamCg!`vi@$(e( zWxNIX!r$AU!1;+H%ktjdgpu=9ZF_g@^IZ6_lf64JfOR~~HSsvFmD-;Mrh*%#5=SjP z{Jnkl`LKtWCwq4sM;kS>w^tY5yOVswW&%A=1;4j{e8ZQq1Nh}2qZbohnFq|G?zO@t z!*Ng01PS6s6{SvYgRH3eCE~J9u-2(Be$&2pL|>{ZRZHKA3BR{b8R75kmp<=*Z=dw5 z?R)z&r*R&WIgOBTj%&s|Hq1E2uV6r7r33 zS5}u4U&mNEf*Y|C+=wr6RAtrg#_n16<#7K}$L)6#QZo7ajEa(X5@PaspJKlgtKPM1 z!|%ohcQZml5slji(WmJ6+tf1BD$7nrir_}91UJg{bnfZ?zLgDk3x zd(bVLcm`59mn=T(?52g;ZguEU66*}ZYFOsI(^Xg-;oZN-^LnhG*}Eow=8LPHE95Ld3B=f~~2=Kj1&xeWWG1ce8h?U@`@C1$u*k^keV$Xg=(fs$c zoDXwS_W3ZGcbP^f_uqXcF8MlF{zvT-7H2f#e3x)z0 zmZ1psT6CQ23U!`ioqAq^AGXHDkIfv&?|M$3u4hixDtk-q<=qFT~erU z9Z{JZh?U@$evigki#Z?n5B(4NA`xF!EHnNn{4Y%gf5?IEUv=Q=xWpyjWJ{p#$AaIL z|D`j{r5Bc9_#9N1xDi+CO4#X={&&9PC521Y7Z==!mEcCb^mI<$$7-CksYR-JobS<(Qs1QG-i1QG-i1QG-i1QG-i1QG-i z1QG-i1QG-i1QG-i1QG;ZUkGqtGTASDeO>dUw+R9X0to^M0to^M0to^M0to^M0to^M z0to^M0to^M0to{3AW-}M;Rc?AwOr+?NI8qn^XGCFodtL{o#)Sa4m}IsY|f(p1ZRuo zeIcGNZfN+bdW(l;ytC*>Rd6F#f?Im7##zhY?{3}s zkS`DMk>zE^?RSH(G5CDJFv|ND5|?~mj-u3=>fl-Q4bI1=(T6xql(_XnM{Yzs>MXi0 z$urg3ZK&Z?^6<}Ex6qp+H3h`&WN@}w*wwJX;kd`%=j)QZS!Qth|U}BUXYN=L+JetLAqSKdN+B;@h|B_-#m#?_o>-wz1K zC!-Ukky+k%5=nmtLOBOqz2RHbgOIEIcH#kV2!1E=eNQb?-y9t8cM_fbI!E{|JNZuH z2J@Z7`D1)1@xHr`PF>yk#clua`|qRO#n!KWa^Kb`{_^zJBe&@9ByPIsj@D~`^?{cC zTlIGmAO6ih-uI)=UEF%j(%^Rzv&$E!(1z4U&%UwctM|`pJ#+n=@twq`Ef4K+-`2}c zJ*wsBAK`Z&NA4LsE&ITpcl|K+jhmhydGya;82R`2ozwQG!?%un;KFB8@0qzF6#_1a zP9g#$XZ>IGj)^U@)->uy_&bTb-XiO>o&SEE&=OAicM@U$-3#INTI`qH4oMTC!e!j}cja+){ztpnx>UkP;D z@P)s1z&zm_2A%czv{b2=dBRr)T{3*(ZyhjC_(nkw8@}+j4wxr=F0u6ZW;U{Bsh4@e z*G$^*IZlsipzx_Yq$vEr$8uy?8v1rZ+LD(A&2mbR6RekcQf~=#+VCx%7UW}|@KFxS zFyPfU`fh{8I|`a*$vYgu%Y2dRehfGwPMPHhUgisL zGiW6{hL`!mn+DCYlsOt9m-)h*1>H;!J{N5v7IeH$>>Kliw*)#3KMdaH2wvt3?=a{r zJY}XMc$qJ}WzZ#f@?|4Jfpoig`V|bY_ye`H&%Myc9gk0teZ!>6?EyeIMUwG4? zS=NQjD7nlR-Yn>5ddh`Y;M(|Fyd}^qTLvHd7v^QY$Q=fqg&zfPHiDP=!dnJif*%HN zI)az^!pk~YmU6?q%aF(U^BII{+L|RfHqM-!m-3-ckO&*gH91@K-GApIoal^5t3u z_==x2*Gl#X<=RQymlZ{E4ASZSJ(k6up(COG)(G?UZ_M)djrdiS>R(m~%4BKZ>5~4Q zVRcDJ$ifPWx<%rakeue8A8E3SD(j#>8kO8Btb(PNfa32x;Ujk9jkCX7*~mZpjL z=1g&fY8v?FOwlNG4xHjwx~GuifaJ% zi6Q$$C+Un!z609{S*?1FaN6~^Qy*^cRwdLwtP#W0$I=kWjMKMp>2TbyYGM>|sxJj-W$U4KdMb;VaBXQl~8Z(SFrWs+@T4$DEuGtx5 zfX@gU8<$SoJM`Olqgys?qAx#$vHSzkNxvDQzswi?b-!oxeH7!JPHe%mLUElN_n+;f zQ?}vAQk3QMWD`a{PhN^=$@K9~`aBE$4m(}aw+*XH3YV@uF1QgZ!7crL=rVBBQa;FW z|DZ3C@xML9IKQ#<3wVy}zZeDi0cbi|XMV1uUcQN%K-<*U%+NM960y$w!g-;AKFDdu zDDz;WD|R|*T@n_$$*3+VT)OtS;6|(jH|k|j=W3TX)tuBd`Z(Nn^s`H1CAhKg#L;o~ ze86!o>%bG}5%?6-@wI5gnXc9hZ#|*DQSUA`V@K8*#zi0VZ@T~ASHmq_Ivi&YCc{zRsP~)$M-WC04+F(yR5#@^Zo=B&SAv!sdx2@}>oSDo zX+uZZS9$gTa#CCvKdF=Jl&o2-h-(T9?S&zwl%F^1&9Kw7V3+^Kp-^fwHHEP)v!MF&D31_=HL#UuBiF2Vx%)fx z(a!F3)S9JB`fFCaq-goIrV4JvN^na*s&Q5__+3e7`$N7wd{@%MA4Q^kkMnO~B`^gZ zF=0%;x;NSd*WbQ3da2=2=cO2V)D!ww%G^t=1UKrX*12ba*R#OsDuh>c}-Q{Jjyh^Ih%>4fIjc{4o}Xn=T1pjf|&8QNNDD?IpVe*n7K_Efk^@YHJJK+rY>#NI2ZxaM65Ww$^w~F`I zP+=>!*uT#=9c!wrxpy^o;v4tB@N5MaYps6yM%Hq%?TfALix!@qUbwh(u?j@CA8NbM zkH6NbBND^owSI|{{v`;+BhctH^6tcQ4UKY};w6oTNSQ*sH{?9M;`YrQ49B`p?8k4< zZ@5fP-%bCva3f2XzI@f!Wd>)wHs{|f+WgUL!%ph=KlwW;Sbtjnb&pfuQ7tkjlY=Ac|g)qhSP0IP9 zusF^`|L=eYtgE3i);Z20K8H`8p2sH41YA0|A~V!en1BQp_1Dod;7PdD}pzlDTJNKpgu;)c=%zhZz4lqo1hfRNF#~*d>2C1j*XVi zX0u9XnNDBC%P~ST#5CQe0`>1%kEYzuAdP!}UqGmNHRs}7Up694 zBnTu3)QbS-keNFuivNq#<)_1j2F+7S+&RCJzxXVp|UB?0%I&P3DL z-^~cwO8QFYW25u@xPF#e?2z>Tb&uNiKkiYj@Y_JQx}T{2j!0!)ucnmnwUoHu2V%_U zYsBHp0GE2DosXfU$k^d{k+GA$eB&mLrQq1Xc%Lh!>JOu?u}W(aS<(*)C0)Y!u~W*t zzQzvwJ5^(+IT<@@>=1`q#}3Dfj2&t#$5Q!ud)>jjz6$L)H3jUD!Ps>V(_ z89Qq15QnkG&N*k`Tcl8IzTe3+G`5bXuh3)XoHNeJ5A^Uf$@rZuH!NkK>&yk>e{gj3 z3F3o%m20M)?{u6dhi5y3ZbM3aYbTf}G33$px9L#+i``Y^`wp=8w9H+ey6t$)q0goH zHk-!FU)M#>9OxG+)IrfqTC zKyRinG>{8Rtvwzk*ZncR8vt)h3B*GO@TP&0a(r1nWy=tnxEu)<$~+ojHSYF&cAb

Wp?B@>(wf$#TCo?Ys#zbHnA*PiQ$j8bT-M;<>6pYm?P z{4y3klqvFg{a9aEe)^v)|eGMqT z35}p`ybF2M4R`bhTgex8NLOc)!|9E#+t2_R%O3v)*NoPA^Da-3=cP9sVCj>LM~tt( ze9cPtrNznFKK(~Fzmm;Tm%jKGk7it4oSgO3-kA~}?q>*n>5CumXh~xjCx@8v96!em z`FIWc^Mkp=m*b^}!SiNuPMvkZ;XV1TjG7h%V~&q0!gz%3Fmvh%DTA@185bAVCxh{b z;Y%S@w82=>Nb_8r9E0(QW>gp}+F)$bbuRzM$q|e>caX1Ej5$Y44aUV3+hNv<6e*3d zq%%dkxISr&iz9|D1zC#L7<=g^J02U2vG5aPkwZO}bWhBf7<2w4cdZz6o}3DdaZZ1m zZgr7o_7zQxh4yM~Mwsmw2EzgbL zo~ImXzsRgL6q}ymwJ^l^4&cX(Jbr)5mUBkC+8XE@VglABg%XEsC*=j;ZkGdSI_1gDcXS^qdk&2#5|dPHrL3nRz}@XLn~pcKqL?RREtrWpRa{`dO%lfp?Q7;S7b~y( ze9YjA_iN7L^hLckJUUk9!U#@BhKqeyi5KU;gl=1r6yN7JTqeyQ@9Hqkiy)?>>CNF)inJepBWD-+c~jIpyaK zTmSHt#s^p)`+qI%M?XJj@w9!_Q|2%K^0+xnYu);>ud}|#*EWCcvNg}n`4Q3>f8&wu z_k8x5cg-t2zPD*763sl#FO-NAilMz;fA?2=D$KZE|JTt?t=By`WUbc@zP-h>O~LgV zC_qdc)>7kGp|nW&L|)YO6CNElhn^z@bE9M7+M>ClQ#s%ASqAI<1VSZiB#Kx15S3S3 z8f_+CZ#*wNp|%oACl#wVk7Dlh=23h{#J=~zJc|1>r+-y$+)w2y=27>X`o5D}gAHqrYzK2_0AKPyDZ9Lmskq9>lN z7wue4dwC`+9A~nfX4A|I*I7>*WrgLjd_8IP@KUzz^gL*%kmk6kC5`QT5%cg9Nn3vV#H^Ou=Fy!XCJt*;Q6ONg!f(Qqv`853d`XKAvu9lI>33L) z+j#XRckb1j@NoMOyL6b(&KrxC`yS30a^DkvCOno5ov-hE&P0S`^=gE6yC!OnN*iR} zCr+=#dH-b7P`2}K(44QRlQtGJ5#P)3F_`GCm;4rr)DbsFTUFLXdTSTfD{t+>H?v%< zWg_5=_6eW+u2{Q7_AWx~;E-o?StaqD=-O3Z(>JtXjew7HdhOc2{R^oeM{s`OvmAaS zs*=Y}VVSVA(`?#tE_wDHTaG+&c?y0+m)bCL@tqf{GZ~D382N`IpPq5;q(9O=NtZBK zhfa-4Q}+H`@Z3W_*!FX2@8cRNn_QRWe_bBw?}VQZo_8{Br}(5~3J zW7aOI&k9qjrB;GmyQu48v4Jd~?yp_JocLI{ws_9U99auk?<;XFXf#ds=26U@-aLwL z6}p&LrB`|$ozOb~uef$1~q z8u#vP7jA=ZU3~4$Bjhx5YKk;n_WE;EE3Q9xp6011ZDRB2HUGKK z{bkIV*ZgW%HSb;fpZhG}ocZ^^+LiOCbJkB6A{_bJsneILdGL&Zf8O>d_o$IS-m@33 zNwIa~vunS*dg#=aM{oYNx|d#b?|xg)ylmkKPmN4h<^SA1W9zfKeBr)pE_sWR|DHdN zj@)?2hej^g^UM*JSM!C-nr1qBFXgp2k2b$d^C;_mRm`K9J7pfFCh$A14C%aiG-MU% z+?xKs;^tAl|H78<*m+dVp>2-S^k6({waufWkM27Ho7Bu_A}u^;h2!M2(`=e~O(XEM zM^lJY%%j`4A2=ZA)Z2t$?&V^@Qe;?=34;B0FWBF6AZ);hGdGwLXE?4pv{Y&xw=P{4I zZF!q2zr63HZ6CR^e_P*?A5-NUSV+yId>ewX*WNr@I_>4LM_KPHc^*A&q2t_#YtKDe z-cTuBpgvgcw1pGila7>YRiVf&zxnFM(zW=FxGUgWu)p<(cX{`e!t367z@6^<7jG*;+Hm6dGgV-%`a-cR`M{7Wv4r-R`yNGlCM#x z*?i#9d{Qs?TA$zE%CfCe$29OTo$^=%Wum>UtVgG<{}R(&@V#hoAs@?A7VD-w_CmL> z6~9TN`_cW2PapFALH2`XH3qyo4MqM>wX$wqhfX6;W2h~Z6>iH*;6obA!t1uo@cHbv zZ2N1dUS13K#jcli{#D6KZPU_}ZlE9R8`FpYpZW885SJ9N*J+IFHZzR~&=pO+scpKi zN;fd?5tr09{tkh5cxI}uM=m#&hxv`SvKN?xH#Ua3mnO;z%StK@B|l2@*h_hgm4(JFb*RmpQP z24k;ZmAvLEdGo8}rK{vEt&*3ml2@pbSE`bCQJ*AHOKT}#kBD`({xK^IYeMDTFqfnan_gq)?dOFK_Gia?Bvz)hq z*4xdq9PVlG-q~?xId8}Roea%ACgDF2w0_5AmeT}Uf7fG{dVfy%`A(mt?{D$H!Ajp9 zG~2|wSm(}$=C6M3VrbU0tDz4&vc&R@OfYiZWN2crm!a7|epA!|Qk1u^p&9OJ zXy!}$J3wnWP3j<_maqG$Wj3igMJ8qNTCxq~)q7I2lnnh|ouS zU5A5BIn!*?5+`)ltpG($;09P|+;owU}^ zCRJANY0XkHna37VUo_pMLg69Ky51&-c(OjWlX@XE^R;d?srnBi3uLlA(guc-PT4|p zj!|n3_C95;(K-#L7*xfosn6rfv2}y_ep$9x+N?sh6|UcEGil)o(?!G2e47@2zYSWhw4X7BMQBc-e8I%7 zi}FOK3dg9|E=yY4rb1Jew8#weOB)!fGHkHL&vH_hq3}=+`RGX7JT@&ns+{2`Ej)Hv z(!w96g`c5K3;%fJt1_YXGfm`^79N$x_QBb0a4de(${QY=7MYX9-*44Ry2!dsy*4fN zQU`?=K2?DKOj)I;7EQV0Y+B^lGD%ClEMwDBmOMhUPT}ELv1ywpiYC9LlipL>iBM=; zrrkEX4YnN0ld`0xJxsG{;j!zbOi3s0pbQ;(Z2IXI-V;C`cx<}3K&PuV8=7qpnWXJD z*tGC4j7n!&;UTSgXtRv$1e*o6-tlM=Z5H0o%z@`U4)0gkCfd!skK}y^?*;grV;6Xs zJL=xpMfi63Q{ZX;v-7l1$-{eB`UBxlhUdM)d*LaQw)qU>n-HD^&-;oK;CUa`0M9lY z1>XdJB0S}YOx_bv#?kNx!7qg8{mQZM%-bEFZD4!Z?le5_>3E;OezHI87wvi4((E(q zrQJ_H#+eR?R6E$7x4{z=_L;n_hxM`E4tTbM?P0rkpUHl*zwCEAJRR>j*|sJ_vkdPU z*e0g4PGZZxQU=@3GEMNTpJ$@z$j@@e!Sg<@4W8G5ZDX5BvyaEa9|E6(Cmy_4VxL)t z`Q#%%>!hb^fF}mLpJrLMgY98`Y%kmMZg}z#FJi%K$8@%r{Jg(n8;Ljh$j>_2Udkaq z%bj58R)nmJ?Pa@W!&8r_Plv*{z*8=H*e<5=8c|th>uZ^!#V-qW$)^Wcd|3Z8N(k8;@uV%rGM>p;9Ihw>g&h#`qv1Hvd;VFZ4&xhx=SP0K+!TMM)b&X}&ANK1+_$K%n#*>FK z*dDg)B={!yqu{5(?*vbrh!?Rs8J_j9KGsVfwu9|qyH0^8PQYE$bT%@z;WAxY<4 zCp6b6q32ulu@+6e7oLQ=Suqd7QM`(vlhL|qI)d5-=Yf^ zz1E^HvFM^jmn`~fi@w&Puea!%Ec!DR{W*)?V9~=Cz0soYwCKAndW%K3W08Cqi?iE5 zyy@#O3TPL&Ylk->@Lc=iwrti}HNGE^(^4A6-tdG537U3}yP}AndKrT=SZ>T%LnEyq z+wopXJSdYDnv9T*vE_^v=Q~3?7B6MQqFKbtuelN*w%qQ^)Zk@f zRV%Gqmi$i;NDxR6@DbRJWb48B=emBXP`iNOecOr^E6nfY`16fFw+VN2*x*l?T<<7{ zTOMjp;2;wsP-#r3)3W`#bgKO4Z)(PS+J)-3JF%{Ye?yJ?1HPkty2?;P!8&yQ?oWMm z+tK$wxPal|2-D`fa613B_TR?cru}{r<0BCz4*U%@Uv)ezTMoQpwZS*lif{fc(4{3G z`;20P!S3>Gu;TD0+GJ8w`{MSV{Bmbpzu{|S)MSH|Rwg!>ZMXQ>O0GXsgw|nVg9Y&j z<5L+o8kqzM0to^M0v-a&Dls;gzmiIJH5&{(W{nl@=#bAsjH}xQ+xsg&XtBMS*J`rC zxUNRoV7?v3Ih3w44BKE&;~l`mJGbA>@Lp+`wVO_*kn?Zw!xZ~6b8Ec2c0A5NO~P%ZTnz7 zi47LC9f+{42jO^Pg9Y)iv5KSX(AtDGK_Efkb%H>^2CL}vWY}PQcgeU|8*Iax)6Jfg z=9Keb6S2WutgBHr*feQP#QvAg;o=XfjtArZIZT^pqI9qh#;Ub}dC7UOdNJ3iCjS!z z5(E+id<6C+Ij%GL^XAP9*iF97Al0DWWKwCdHW+dz{Y*aB)hHXxZyo1Qy2>zYgN2_( zmJ%CGp9iaAgVp>j5_XqogKdNj2AfP@7iEJDFMo`EFk{1b?2&{& zUpjT$U=!L0!@3$}gZXPR=T5rHF#IgiJ`c7Y-=;_>HkdvSR>cOZ`Ak0SF3$!Vfei+m zOkWq;U?+C>^hj)6VQu?hgT>8zS}XgwY6=y4t=kj{UbWg@!WUAIB$^SXZNLFyAJuw7s;1%4dfkvLmmmme#hoXHR3Wn&jd`&T)k5(E+i5(G2?)_Jgq59L?i2XkuL z2iw_)y6$~2&U5CQ6!KjP$f)gEB-hm_8_a(m$+?oQGOV@_#&5Ki6B|sQ2b&BV40e}i zgFOKo3^tj*E@~gFCsQco`i|(x_Z0>*gN3>cv6^hK(nX047PKj3T!=jpjwd!)5HG>0 zS}0nbgb4x(0to_wz|`Ad{Jmb|cBl=;b#G{2dnv6B2JTOu4!Y_K3cHdb-8Xmt`M2qXw32nYgG zzYpe}2GidvsN*-gQ?S{@^E()x?*JX^z4KsLSEtGbDe-e}X`Qz-u1?|JxK1 zNAjI&&m#Tzv#O)i;6IG4+XnOJIlGS9Y_Jm6)hHXxm&Cb}t}+at$q#=g-@P|E52nt8 z0f)HrU^Raq40e}igFO!$3^tj*Ey710%DR5FKK_EfkwTu9N&2ehKO|h3OHs)ERpef&_U>J7w zeVZa^lX?4KSXZNLu*vu~MLMy;^m(ut5@ulIVEC znryJr`WU-!tulg^RbDuxx(pn>uypYK_EfkHIKmfZ7~0tNOh1J z{2TopYJ+iIohlowoY-LcJlJH|V6eM98|*W%!C;e#Mzt?KeJHzfB0t$(+nM~*Wr+A02H0S* z$@F#MKG>PveO;@LI4!fXuY1M1@w^{d+dfz+vB82ig^UZaC&KZ>1`FaPI8_TptCKK6 zAVDBOKoFRE8_eGZbL!j&OMzd!_gxBpqat8)h2vs_xmZ`H$_7g(HkdvSHW@Y;>@Lp+ z+Xx#BHkoK=`{E^C1DXEZ5ohKys|Uwpg4MVWc12=?1#Jpm0o$Gk#}gYYh>wj`94%U% zgb4x(0to_wz|`Ade7DlLI&CmLmyP$gib_~lr^*H^B{rBo4>lP#80;?32D=+J7;G|8 z7}{V%J^h9BKxU1k)fqPW`<{^{)n2H3Rbqn$Z3<##+Y;e;VuJ$^DUSwi} z>GNQdVS~Z$@@%kg!v=#*rmqX1MK0;hWv2cct);79UK`9GBepJ*u8jNVFeQI7LKz1l zYpi%;gVk$;iB2bBf;`?CtCFjA^c`)D*cOIqONBdVf zp%MfV1QG-^0`@*wB_{lgv zx*BDJ`R(CcNmm($ZLsi}{B&Z2>GNP!Y_OWoA06R^QxlZnb;A1uFu zKUH+(97(D-tjPv*KmPLCV9B#c$7yKvPYLLYY}++RS*TOV_44Cox2;xMw?FxxAdn!C zAmAggBc4TiGiJRun7IcJ+j=$bgJE5bvcdemi`>dEybl(B7FkYgFnu1ZiVartvq;!o zo(=YM*kG{9B@NWEHbgde0@o%1c3yB zS2qGX;2W*}!@nJBgK=G*DjUqbKRFMk&VvDm37-dp-R0R}Ps0X-O(tWieeu%V+6lZA z2{|>r7g@UD8mNkQuOQV=C>(2Fr)Z?VGWK=Y7_s>(?LOU9J3o0A8N@4yO>~~Q;7O1m zkRXsC;2{v$2b<|78=~5?$Q}7xMf^U6`9=lz20E&F`92ue)hHXxf8t@UHSDk-5ATCj zoCiy6Fnu1ZiVartc`(>ro(=W~*kG{9L=Rzuts3fGKF*_HN=i-pVD3M>yf&Eh*VaKz z`#LG{WFIWq2lMqMp%MfV1YX?;_~*g2-4X0fH5&|^+}9e@shu{>Rqs9+zsE|OEAY-F z;x*Y|TvwxPFn?RlUf(!mB>(>++2avQ94 zQ(}XevBvRc#BB};lxab~aR9)OWOyC;MHYn^q@#m?H^?mqm>AVz8(soDMc z?!H29z*#wvAL@55%Jk6BbqeeHbIu^n3^H8NlUeEXWqNbx9X;tDV7~?rg4;a2pDkcMS~?=h@kT zZj@Bf9RE9mtMY4B=hivBXdlG^F{eL2$Z(D`kn715P=NL4dUCza5b(Q5T{eALSkr)4 z(}23VnJnNM$gQAM78)!JoHq|(D7yRNobEX;18SSSVj$m3>0}=485-zc<#Z83*0hor z7@C~}TOP8}Lw(Jm6-qw_ojzs{I{N=?^aouW%=PrJYh4bgE@$>oUpC*ld}xKE2=+}8 zN>o?Ax1UPj^r}h+*}TDAZncvwtOW#vgV2Qm=vx1(jMLTA-H$7)!dze0fq+3LKTuee z?;PyPKrgcR__UGGH<%yjTnkZ(K-X4vuYg1qtaCniVrMqLBFh`n*&sTh4Tf_?cY(;C zcMNo3uq%hIuNXjY`v!D~`c|wM%oUtLBtunmo!z}?(7LW32k)Bq4)qkeJG=X`xwTGD zW*sgwd*ICO%5<#)hQ10qvon3&y|_pNyinjD7(5SJr^(L2o_qo22Me8c!eAbV=2W_B zl2hon%=M4?W|eV-L?cJx(n-+ zfbJDa5FuwA6PIcS#z~Lr!r-b*Hot~h7w7thlw=S{>SG!w7sUq6#l^z(q^`UPJ68>1 z!lasM{5eYJT%eXDHM`B`NW=`Z91GS34k87pBQ-L=Tt((xptM1Wya>v#r;NUQ0V5T& z)$-f`<}t0%STr)2xHtsWbg}|#9maj9Dl3seyx)kaZxGid+l>`ZH_ePvv|p{Un8vec zsM9~V4kZ3{s=1(3t5<$`AgY(;&cZ+rlZ7hYsTaq5_aMd)r^Y@->Q-vHyKhC$P_7R% zgN`rH40fAZ=dr^&mGG)TZDvZZ6CCI!O|=w@byt2lEeX?Su3H?egZUncQ+7kYK>`zZ zr&$=V2y(6&?9F45*4b>kraB1$N_MIV61Ea%#=$~&Pfw?w$uwx-@>hKp<~*z5%4)WJ zS1!|sQL9!yGbmN}6f{`cmk;$|lyv~ms6OWR!3;96hUWVmrSvP6rtu$42@C{P zws&Rc$qxSYWV(j>G6PU&#`0YSSUrP^)U!SkS7xxRbLHsF^yY_PnDh;Dg3#J@QD5hp zIS&8NRsZLy|MU63H@6m+7N$%T?Ipp%NjppRz`CM-qP~urIT`C*weiabafnVP4canCpXK z*$;#5B6y5QwUh<%&83gu?9;-C#+?lG)awWvpyhAM}dDKKVTxN#~jWS#iaqG z2b28Zs_Yt?N7*$i)qkwfps7k&mIqd@Q&$06o!5hugc6Pk6T0SLnw!Ia)aW5xdNqWx z7-j|?4qY^^7nbwjU||*huVPbjS(S?#j&fkGD9sqe1jxt=Xo}Go)m$dgKt}lgGxjC` zk{)IKe@)MX4J0HX1PqWsga}~>n%zx8KmysB*^BIEmz~Y#0y@((Ju}VDOi!lgTuzmn zaEJT85fOq02=@&U!l9y|BBG+AqDB!#MfrWc->2&B?%gE+|IR-BR@GZ?y>&i!)$2IO zx$e9rupxZyq$5=*Rs;O(L>)}X*hf$cy9#Y|gGbWD6y&g;Ygo!-D#7xw){IO=k6Z(~ zOgnv)Iy*7f?kvLwbXFGXP3k^LA?EE5Z@7ybnQbq%j=-hIiZLqd&?EG(9_vjd>dt7u zf@k`{BA@d@Q(hs3g^pIu#PWPy3$Zm-Vy%Vz1SGkhhh4cq7<@Qa>#{dhvvC4sR?<4T z!dkC{c?$Ls9zHi7{ISwmUYU>TDTA?aU{}WReDnJAbj>xJ;jb2#>I5YNh{wB7#6eU{ zRfT$XIzkfN+Jf|^=jb}6mfI>{)6`@&KT^`V*-J_;yl|&tmgXvTaS6_p zfl}}05n}j)snbB_L`EgZhSBhfYg8Uf^Br&sC35YK1CczI!EwdHpck8UMjd%7Fye49 zQs8E>tSsZ^Qfp!^*91O=<;O3}kKcwl7X8fVr;%Vimh|J$j6&)r79PBp9-xmr^To8V z)`N$qlYBEB5hKk6pNhVmTY=f0+(@hKxin+(g0?O+=a8brdRO6ktBR@oa)+?)1io8d zXKtz{1j@SC;>pClgdnsNVy+}_AZqD%OPXQjbo|l?DUa55y?di4s=K{w)DQM0ILAV( z)9xw2)Whv!gqPcXC`Q{TMJTX7XH2*yeu;61Nx)>8K&+Cq1wY7&5_jmO>HC4PRvO)u zMjJ%HQ}BzBc|?L7G_8)*CUmwWv$Uq+Tuan)W#mH07i$P|&L#A);2opQxj?PV+IkE% zqMOk8(o6#}&}&a9h&4DToH`Hj7Xk%;`KmcAtcWb+2~xsnC}w7Z&uYR3OtNwj$h35q z=Hb^SmJa*oFo}y=cL-DpX#z6)5H3w=OR!4zf^dFiidc1%cemGsBDVTDmQ9sYVdonT z-O2P)D=@_LY{3_4de%gBeZx1?)CR(e$XbV)70jYgh+-L=DA@EOQ7Bjmg<2Yl$Yumc zkRB~TBzMT1?h7wF;GR^9C>z`poy+{nIImEQ_QKpo^u6Yh>p*Whytu?Gg$`G#Ssunk zQPVo41#Uh>(@2?|YxA^aRp_+?R$82|#z{(ZHs43^Ex1K@7@oyx)GHFY=XjCUo~~Qc zbt~rDQK=wA@&jI8UljeE5^PDx(iDW|LcdmLSi(xfP3TR;hn+(mfj+CfOtERLMQ@16 zW>H(gOjE5X(}QWXDUL>UpFn0wYfV$P+0AKoOPb!Crup5PX3@4J7L3G8cRF)tuC=^E zD*CM!M43sWxvA2)P|Z53gT;mA&We9modI18HEPeT#AOvF2Gf2eF00n8toRr9>o5`u z565*i!8I=%&o7~Ivfxo-sKS<7Q|k$yZXvCu*|Y#1ro&L|1bSz2ElQE0^ysk&HJYo) z)(i}{mm&m_Y%c`oujj2;@!VRL5kKUw2*U8|wByb^{M964bCD%r<)z=DY`2s#0DnkT zwpl-0a{Hy=$bH}-vut4{@oVLp$#|?BvCVf#^h-Gc*zK>t^W^tf|Q9Rh&t*B{&z=Q%aBd#rE6= z7o`9c85V20Q2MZ>)GgFoi%W#5gQ`m!;gy9o>0nn8zL2~SyUtI| zPdVN?$HYA(DU?Jn90wU1U!qQ?=ZHyqT4wbep5 zqaMy|G01ZfZKySEE34LF)+<$8Nmzz_^FW!sF@6U{+@oT9qCLaS`O#2(<}1s>8YZdC zCf22;09m4|iSDLf(LRCH&}=F0mQa;C6Y3JCJu5c?#!yn;4u@7&!3ep% z(g`atkF?md;0=eEC87L)CtGy6YqX3WjT(3fnQgUdSUA28Tgya4hmRVHX{=E0aG1>; zDnlUhgi6xJ3KlnPY&=cFXO7^ZK6VET0tzA7=_@HqiUL>dGZmY zg;o+|t*agqUnbm1VY+OjjAhZ6EKzyh%Wz3w2=WYBTP-n{KZjm0n$?uL$dtsYAX$c* ztD_)oCK091G?$HY!{*ak@QP<8>HQkXVNYMsH489iGUaKoU`Cc__r<&&?l2yd0DI^j zE#c6pS&&ML%f6C>#jwsQbju5`9%)sqdqdbZmNPvc>z6>JsEugM z;jyXtGzkZrWC{!MOOG=+ZcNeQ%|OJ>tPD$4UupNKsp2thb7Ye7pQP`2UctcXaGNTE z*KI8HK20=gn=|+wgeNi9WUWn(1*z2An8rf641ixA*s{Ew7oX$g>6L{^<31}ng&Kq0 zI8?~QR1hZUbIamuEc1F5N8dP!sVCdEw0M@8zezZ*;}44}M2Svl!F4g{)3U9^tihnN zvVPDLC>POPWQUv0#WC0xbOw;)!$wpQ+_wn!)#BM>aZ#ad!b_PF6+8w@Ji{WThSFJi z(Fm(&6hd-Ou)Zq8gG@yANy|BbhhfstS*097U)YT-VF(hRh`FL%>q;}`b8Vy`$fy+= zPLU1;t@(*zD@DmH-Du41U@b#QfJ#*Yy$5@Z5v_xZ+LPk&&9Px9t*@cu#6AIYKY>PP z0bAE{M7uc1cS9_hoNX@_&F6G`Vjh&iv=Sm}aO84ea)rcQxjH>cUFA1PsVItb$j}4_ zf-a;Oh9uQXoDvFRJ>|eg@(V45X1s*{2kT{tU^psT>tKzcn;>qX8)^2ZCos>|Gsz#G z6s0o(krE>7*n|R>ny9d>6I4w0T-vxm%jg%!jz;26WF6N{j4?=~wg5@!!5*?2F`JK| zuThd7Dpa)OuNNv?brMvv-rB4N6xvarFqZ61X_Sw!k$sAblH1!VJlZNHirODv#^NlI+gKrS<4I^>))FN{>`V3-&ArJkAmgNfTK-X!k z(h-vS4Y7=2fym`2&@Lb((_6?C5f&v*O>+-Qh@h!sBnFmImtg5CBOX!ndNv7FvN(TYmgmFp}rt-Mxywi75jZ4S`uEf3)x0aNVrP7X571kMJu#3Gyo$hKrXc zh$a^TjxV%YZYenuOPpSj9u~70f(E`O4#=dA!FrYMm=~Ur)rW$muo#VX*h!)O)}UZR zVcKVwR|vHOI>${zt3gTwyf;utPFiI!l?@z1{bD>!k|R*K$|*>cQ;O1p_%Iw-L%3klGX&?}V3xL?; zmX!3Y_L7FH3;HB*mV7_V&3B{0;@HgGq!)zXFo~e>hlSQuSze+**>z|UiYKLZ(9BOR zYpP2L?anHJE#NX6jx=$k^^0D`l;i+z6CHen+Ka8p9a$%+nb4h)@|D3Lxr7f(n&ry` z5`XAax+pJQ77}KuVfsIJMWa2nQCS5Rqc%tiIOf3Nju)2-v8)j9p#7{;`4>%%83$?6 zI=Z8^fbWrBKZX#$SKT{_;iNq;X+FA}(ZUO)wE)44AWAzkFpHD;ak0Xv*IbMKr;6f- zrd+$gp1mpE2FqG09>w@KY>RX45N0SYv(}`9nnYqLT`ylJSo$oGdsOX_Lgi4d$z021 zLLb?hlEaLg!`y`h{V{S@m{=^Z+kq@aNTw#WTIup+@K50EBXBth#d8r&r!l!pgn?^7 zsNser(P{Y9H8?irxUih&xUV_A?mMs?x}nP=)rfK&@=}RJS}-4>&<)4^o-k(d$OW&EXkGm+`x zL4#VNfKrJt+%S82<%qN)(L}!xmPmuPe6{4?zd+@SnA z1tTkKM-eSDUs*%Gir)!_puBCI8LwM@ijYy z$rq(*cT5__D^bPsmguHoDZDLHyC3WpiIly7irE#WS6Kr1negKUsQ{~%Nz!Rd1~)N* z9^Ha3ZL&U5jfwzV-Ch1&0X}A^bQ!|zcw2to)H5|6PXBueY-*QAkCv=+D@fnsaJu&$Qbak8Au6h{wQf!i*a7%@Ujt?gacaDsK z2uLZ6h5>9W3OCob4_6^VW*TU~NP9iM7e5fcpgk#s$Gkm24`d9qeF0__cA%vNMqRWn zXTVG%L&_q_gdpjPIS9+?Iy19;%`5rQABu^Kz`-0Eb1kwupMqJePiFWpVn!u|O@p__d9(kf|-y>ozJw(}ZxM;JK zd;Ev0xRJ1#1tl#?=E~;hZhVr#LBtSIB~kp2qA(2hydnwTu$~xF|CYXt;?QODASd^9 zvD-wJ-HFby&YHM#hA$Hdxgz%YhGn2hi)4TinLzBtKo54Zl{j_KKqD&7E$)z~E|h9+ zk!6Ioce0UFCL573Jvr&M$aNQH1$ccV*-M)nJ4F1qgYvO#u9f*ewKlS`-0bXcE{z-C zb1Sd&wcR2Yb4_$)@emHLa;ToPiYE38Oisls;Ye9ku?Vk2lOR0kIjRU!4jz>W0_Ns==^;n@IS<4FkbA8 zK#t((2``r;$hJ65KY4LWq!6NB7^JBwhFs+HJ%|CTp3AWRip8YE~%-B?+Dz9ppX0R2uQt)eYA&|S7B^JX-#0iv^iSpZf;`70-O8R@n?g%FEMtc z;q~fRZ$5Mz;*_<%cti*&2jk^S%^7e8G%Uzj#N?ykxa3`^(vsb1@DH76%|#15cY6~k zI|>wblE@&86>==988#2%XEiZV=7xqMBQMXi<_0c;bY7UES@Bsr2=5z;*XDZ5y8>4` zScxlr?syB!eSU@~v|ON+bV0bW>;kDiRn&E1_MppW1f@|~YD#-R00W~!Hiemt zJET2^a+szMJ+$FL>2dc} zouDu1OeV1D<^*f(mRQp2&)7iV-%G z>TsYu{EL(d@>7VkJdkA!*^j%LEp)MwxR}JJ+AEFF*2Q`-Hkx3&g8iqmiyepwr#J}Y zWU!1YtJSq<{^lInG^8?GSkbjFN62sn1Ctg^EX@*=X%+@9R%$`&w%O1)@TDfa`1p8D zHqj$2EHl2@K3gKjZ+0+ZsOyjf{0oE5dj7C$uyYuE-b+p*p+Zf;cgbjS^bLp^4z|?| z+Jo1c1dCQX=gmpcmGQVSOWu?aDVDDTkM^Zkc&qpECDy5Yqr!`APK+$H*+MjOCnLkz>p__FyA>yThU@ZG(%wwN7_pmG0I?ViJ0xXyPm~GYz2}MMTrog>)76p4EX!jxi`#ZngC_MRT5i<*#r%R+ zV=g3Cwv)$th+z|Vn%$ek=it3T3JxQ1thhcCE1|CF)=gS&;~z{^M+$)7@*Xlj$RG>3 zSAtd)ms8==Fr>j&d-3(=FL!Q-3fyi9u`Q%Lb@V%-1*m~VF6kg$Y<-L)GYC;*Gex2BM85@T>yxUwVj3J+{?TBvflyeP8viTv_F5Ams+k))Ef;#kkMV zBfcQlp#ZZ&f{{h#))%QmR#0Vi)0S2m-85XLC@;q;Wg3@!)TSKtfT%TwV}NEh zd*=oSh__DJUUZhNN(E zR0_LNhMlNAuVKbO&uOJG)^v98(W#im<>MD>gW--GO~ZT1hmYW$dQ{aBOI2GO;^x_) zpXZS&`#v8%}R&H3_^BZcnTtJq_s4BO6FLUHxB&ryD zXRXGw2do4Rd`x5w!d|vm*O4^t3Gs8xaXH$?4g>|=kIPYU#t)=VXE{+nTiHY{K3(iM ziWluW=q8}W#C%fSS2X82BKgv{&3GW!%c+Txkx>TB6M~amtEeM}SyqvS2Mi+A8ZQkY z7=~KtMVHos=L%6@nSrK!zSLJ*EMaCS8?|+H4h7^`3PG7+S5RwVT|XNMPdrEBiZ&e; zJH8q|+C)JpX3~`oP6)^FkyK`Ni`;@*7-#$|{mjCbT&()ilqivC198szC{?O>k7 zv5;96vY#$szrv-F4X&)}kW;c3k7rL*XOc-kMcl11sbn)OxnuU>Y1h2wkvL`|$f19F zBtHMlA~|c)U~Mg6M+$eT1M>3GaS^S!A6hhRKMfzzjQ90`cgxT%HchOkae(OdO@7TBer9yT%Wwc2{_NQ214_A@(4ZG7#OE z{KXlO!*mAQ36TM5Q5&zR&@DyBxP_WxZ489qYy1nN@)%!cR#0_WJ*gFAt)y3xY`1x( z`Lz)?-NM2=d01N!^VKL#)i3-i=^6zJ>+uVP|LRZ30$G;3wdQ(yxiL3Q>p8QlXr(#n z0L29xRu^Q#LE}!K+x@F-ds3$JE za}y01a~1}&X>T|(2B|{iS1yEqxLgQWcttw>kdH1*ol5Xl+?s<;HHfi?dgK{)ybUINOP|#p-WJ;6^ z>(p{Nev4zJlt^Jdci&B<|E^Dglap^QE#f5)PCv|5-PKgo)s8ul9AVE{pi3vP$qHN=R$;Gi%Md)`(aZbh4VCGw^6Tf+1#?tTWQ?JF~cg67b1(;3t(WR2ddq&E-h{^Y~-hF(L!`HemmP{oZnf6}9 z6stGq8<;%QH_GPo1n_Q>8L&4VXkBcFmQ<{B#lj+sp-YT0Wo(qdkrMDi&@E4)*_KDa zBZn9u+O1K^@jTgjqR=ou3zHQTxx{eQwHs`Smnk52tY>z|T2Q74b>CUy`JFw{{7!YG z9(0FRRgGAFsEXuA+_6RiVw_`=$z6-dzv_+v=e1wN$ht@h_VXWrCWip3@Fs?BV!^ZIndjg;?rfO)=jb1oB~sYwAAto;}+T< z$PvaZxxOi%ltbm(liNBY*h!Zf5oubhoU+wsRO7n{iC9K;TX)K}r$8lh8ll@x?{koe zp98(S%x;R6h}|?lce`o4QQ1O~q)={QH$lFLS<$5Xp_OanO0>B6dUEQ`Pq+O_Qk^!%>nNOpU|B&nm1WKG`Oy z-jq^W&(N04xzO9WQ`(H$w8yuZ>7g1~4$DUYr4Z_M&o?6x;dw6L9nH$zYpk zZ$cInda}^d{fplcT*j{TAPJhGEXz=BEa1jSZ769~{8O;@9+C)}L_|=Ur<}pv9H~AK zAc8&_B!XUV5j43M$IB$cAE?{zZd&FkDZZPgX&VP`cGEtQ7;Kzygwg| zsSF(bi6N#bZN3dUuL9PlDHTadiFUwIz#16^tmRZ7_F*Yx-H3MqD~2N4*h;dH)Ve)* zCah4SEnJl)7QPxrStwXndwU=-T=>&5n)Y6S<^>t%Nz&$Z>?mf|>^ePzB%zQ&z zZrnAFS|6ka2F*g5&f$itBbAk^I4erb9x1)V5mb>)#im4Ap-(~5aI#3l?c`P$-A-~m zBVYc3`+4=8Q!6~vjrC{1uY@i5Zi}PL6JtH7EO2QM_hqz%%dmu499FmD_%EgxPc%+~Moz>`z@9x6A#_?o zmv$YA_y?*&C`ULKCE*Z=7s;~FO5%VQJg3vLS(}(Ud`z&|{>@(YZZ6DWod+eO zn|1PHfn>RNb0MLfSQ)G(!wRkHgQsN~CE7VI7lVM+WRRsAcUCYlXIOo*E%fNsxw) z`p<2}X{&*g3UWUl4jRR>u@UiVwuz^cv|gcmLX99NySQwDBM-HQtc@|!>hmn#ugk+q zZ#AZ$Lhp*NqQiE!btwCaI-HpoYJ*M+W*ZN82&!oUVyAXwEv!^#_|5%MPV~|oV(+!} z9J;!RQfzRrJ@ZpF6f@)qZZ}Lw>vWsz%}JwRXJww^Q!AaBW*`HC0$9f?C?vl&)IKxv zomiL^F^s)_Bs5p(JzSW&37jyC7L!|*ac{YSR%aRqDr&+)<0J=8qm5YLMOzT-v)XTk z3K4sZyP9h(R(B<_xU%pVDR=>`LBua{E$-H}d1>>q5m&mbs>|rHd29K?fj|pW%1(2K z;Tns00>;3<3`MUL%3VWHyCEGaJ&1czg41y&xaKo;LraUo*v|Ogs8ZKVK=(SsnbT+l zbm*eEEk9^+5yYfZX2bgeG*j2HC=5_;t)rOJGK%e*rBO9@mN8yR=d9q`1Vv}T-lj>G zM%izx8c}N-!#7`u$GI^i9FXTjUB%D0bijAg0V=%81Vo2cM*_P~wCnZgWDiVx2ChKI zx)&FmSf%RyQrVd~Ysv!WF=D7%bfUZZ_K|R{jfu)(qt|#|bp7;_*n#2&L-(MEXT3{> zE6i<*n7v)3u3Nxgn!OX?vT!Xx)WBMF%|+l@>;BAqth6$^kb^jfjo|5}bs3{@R2pi- z>B$xJ;2BMa+Rt819>&$y61$@jr{w2^dYvQhHAj@2I#}5miQ#!wCaltgzM`tVsn))D z32HBF*5VWgsw&={(8m7VW?P!IsZh+21EMKmJf!==V!qVW5OwnE0--Z`WK+VOOE+|7 zWiUl%OHv*GOZyV!EaCnTvO|?eOD%QQm`bvJQKTGBxkTS#E270}tE?8;@})0itWs${ zguwA+!<cLS7+PF04zB~AiCAQ9pBA_J8bAmRs8cf1sBKs~_X)^h^^RhQx5_ne=cHvZcT7 ziACAv6xMn}$6iK*Vtqy(b6B;D1RYcq9+`y&&NX5EY}V2kUfl|ukAVs0qO@IB`nnH8 zpXOi~t}{D{2*=3Ck-|+4WP|=WCM|~^gBr-9FM4P;=*pG_&5tO?CEB3LWR*v=Crwde zWjh^~F{otE27;BAKPe)U2K`+wa0koH8E8tb8$=6R5B3rTa+8nAE7t=#3Fo;K?Sx>J z^zdMXj}Z}L)VeH<(2f=Dne0pF-gB2$qRsL4dj?k99<&ob){GFlnuLna`@E;=?A9C> z$M!sk-An^&R+dsE%Yu5%W-O2%XIrCmTt*h39n7p)qmABvo&#%jGCQX-vJpZ*__uol zxxLPf1X)wMR{YU2HVRikv)UhG@Sjb#;HKk&fjC+Z88>N(9?1AQ8!7=#E~d zBU!NGAQq?_z}RfcwD~Ys2Be6fMcFbCveY1{*J;V=8!3FG$5w1{&AwIm;9zS-4Sk-K z19426l7a>+lpRHc^RMt(q70-C<6#{yhNW+MFDp1rkJ@i+dc-FmPmQtC($wSgeyPS~ z?NKOV8kf7+`fjp2w4sor4#5y9!DJ3E{P0nh+nU|8^eDJUn$Eq@fmkZz-q$Xqh|550 zYKQKIw{c)>zMzt=&2myVdWjRF=%V;~Lqx$q{Zlhyo=1zE{29U?tc;Ik0ZC+yb-m@C z4E8+8VIA7#8pkb$&qsarB!%uMXScl*)jp2&DoR!Zxg?08Mti4Kp!qMSJNf2Xxr~ki zKOOxt75w22xYQEWnSVMj1~mpNTCeg_!F5Gc1CJMybVp4S22*}rS#)z&i@`aV|M5YS zYPfQ$9$50lt|zu%!xuyRcx$W{1vF!}=sPY=yuv<0)nht;ASi@vQeG=k)ffG+$T=(lNC3PVr&{@QPy6hE zDw-kJeRqHkb8#R(xq=xF@dfq>4FHaq*vlaq`VtgZjtNdrZs#+F^#=plsRcqC*(ZRouHba_;m zS%l_z7UM77&X@JB;B3sX!j$n#cP`-K3vasY%rM1V&+JN8)v3wh7}hL#5S zwKs|qlCv@-n2TfTo+9Z*CLaPGaTxriFs0!qRW|150=3_!H>rz4#3+EIIBrkpxqu{z z=Tb>6A(*BpowO<>xA8nIj3}4_>>*^KzGL@fY}jH7qWqbuZx&*8h$FQ*?V_Z1!>pFJ z2D+N(_|N7!t9g1*cuBmJURFsL90yxXYLoDowEBgYDIg}_(%5t2RO&(okc#31Nygp_6U8heXXPR zX|BYENv3blw6M9jJ4+lblgW`Xo4g1>Gn#-A4mWxj_~~h6H19EK9R`WmU$1qTq0RWa z#lb=gIqXjg_*0NEiA4YG-pN#0-w1U|CI#8YRWH;>`&yGd3G@*@O(7(rQFn|!h_iY) zdib#UXRh{p6!oX@GF45K@Q=awK_~3<%|*tQrp1+gql)LEra>k4-vNh$aeT_25U;SV z)R2{mG&*_|iGGsQ@KEiqWEiaYsHV&;_QVwZVXzSpfjcZVxpW0=&7~@`*%6 zF%Wj<(LO*_WJ0Q2(I#Of4(}=^djy&o2z1)A#?nifA;|k_8JHZ>fxM6r@V>k)#KFbG ze@^-6~Vh;$8jFTT! zo)2)bpefF?$@~UiBh#_C`t^>y9Acm&6#lSiz*eu+&sF-lnxjjv1g-+E zRz3Der>d1ng{m-0#-)iJN1$q}-DPIi#`t!kYO3>d;F;Rs>sVkBjs@nA&cxOgK0gy_ zC9m|sDxl;q@pz^;=27a&%WUu_fxf4!l>B^OoD!-yuiYk|?FjYdhi+np`8?)vDRN{Y zz!%PwS)5?ez6PyxdhE~8iS2m>*-vu;O`o_dwo&HrdtUk1{4yFwM;x?a6(iQ@r{A=Ms1Pb;b@O^~+W|nkL zWH91xe8$EvH-FFP?4mw4@kyXX=#;WVgBpz@gOoe4TXSON+y;3sBO5Sut>6K|M_igq z?J3yEoKxs6-L}AOn?Y+LDqHe(YrdY(mk%%}%WOkGNp~u~3WJW$3`AnUQ+$P=#U;KQ zQPhU9pQgk(Zw{l>aC~TZ8Kzkjft@`19Pwads|MCZya@za^& zXN8{-LK*W2fW{*b>Kdz`!$uWkH2gwjQbhE%v?Jx7bRKk>y#w(dXL?N0yL4LRCXjil z>IN&Y3WHoBhThPlengEb57k8|i$7J`@wa>>tptPYV{~FtJ80Yt8VSywnHd3-Q8tpt zmk>ZQ5zz4`hnutE!NMqJEoNAIh-OV@wvWYT1BMB$yfz%zL%-9S;lNWb7F0h92j$a= zCt^&(1tdC9%qtQy$VU4B0&Bp-X46qQTt_LIJ|%7j*Tk9A9XQ-!c`Kj5fjP2x%W1m$ zNHQ}+M0a8il{3eya3VC^5bEf(zB#RLNgJEf267i)u_EqE#7I|+do-XDq#B1kbCFTm zcB0Yc3%%e|Z)@VsC{^iT9SoBiA@{(4!VaUV^tJ$hN>T+1(duY2pWSYXZDk*oOHwWg z(ZiyEVRgEOFpbY!RRFe74Zt)@N2ApxZi<0+MscZXbj4WhE1%-&IaA$Z0euT?nLZCF zLXCZdZx*7C1PLHn=`Bcj`ICiWui)q>=GgYh2Yjq1j$u?K;|bR{f;vC~q7hh5o`Bb- z4r>}r(-W>dW`nVJp_ z7)jkxloTae6y5eL#T?6gC!$@Zx2gXdbw5PkP5}D?FejVag=}1aK z`2vW~3<8Du049Cx0fn8&c=wD}t(>68W}mdVuJ?9>BiZcAAnYA9u_Vb#kO#rNhG!BZ z9i8G&WlOeZ=T_Nefj_*yS^^@#5{3$wnHvF_Y-5|9LeMxpD60s2jkPaM>R#F)^`j#Z z)}dGVv7UtdG%3?Us1~Ysccm1*;^$_LoFv@Dy(skz|W$oB7tSf zEr0g8L^6&2SePx^Kk*m`ja{C=oUQ z=BFJzq3B}l%oJ*knc^X=mOqnJij!;#caB)Lsz;pUq7Q|NX5s5+g-U2?p`1Q=)w=>X z??>kv6(4wJhIFg>LlVv*&6K3@Y=IA_>*4~y)>ZeWU!qx}gGht}MJBVCtPXzWkfZK) zKv6OXWjI`b?{%PweDFD9s6P=54#UW#=i#yg-$F^Ot!Qo+8wsxo50%ECZE)GHVU@nt)2HgsMtO9?ih_kN+4al6E-Gm7i@h|Tb&qH>^dy@7gy8IW~WysIbdP3Z2LQpLtf zdjso&I7e5_YD8ozHIIwW_Ycjvk6$otgGunzgoQ^+^#;xGVv!pXt3#2@j>~-JXXszu zLSvHO;7rUXMhZb)`Y897L$ZHGS{xZ0T9pXn_+vQ_j9~1-H~++#G}ySL4Gap%ML15~ zBM}!Er8yz1*A(}WYg}b3tRh_utS69vG*<|s77Mj;4qM&iwZJW(`3Z}iPsqb?;|beM zF#apI;V81haQ6{W3;Vy>d?=q|_$-JXm^}1S!o?sad99;mXZFdt(pBfc$)Yo4`9v}j zO<34LJo&5eDmZ4lL$JkKBU%?Kmf4ptu2| z0VS1B3xIjJC&6uo&!@&ECa1&L1axOhZ&IMQg z?kJ%g!mt;CeiW9jjaEQqjL&18AhCOzSyc`qup1;AcDyX*E;k8LguM1iyWLLsg2cYHI6WtR0pbQ{Klz_!=xe7C2r`E}*9Z|*N2qZtAdU6MZ%4X-D?U6|dm0V{~-=L{zl!r3tw zAtB;d-LvrY`VvbZLa>OCq^-m(Cw=-PCwSj>f0EC2&=^1_Y@V4+qi}s`bX5m+$FZpB ztQx#eY!9;o)XktP5cea9ep@PReIE;VDZXq@Z8NfF8ivB$ULcwWR*8oe)7XM1n6$nP zLNe=Lm)~YFE#~iBNwkzRF)l9oYca~K%43fkN8&Mopu3 zs$7^DLZZyaySa@y3?IM=?w-4)$tC8G<4IMssACHyaY!(i9OF*_AkO$}init3fh|#) z79WAu-c9 z%wi{0V^clZ4#O~qf459)`em-MgJCAhK1M2>-h68by= zF~Jxo_*@tJQ{{%})4;>_uT_HckUvMN7j$sT;DgWR!GjAnW5D8}ci?&C@?I&5700|P z5BUg!wK$WWMAwsyX4`pr)EkXvSN(~~856b8tj=N_w)v6<$eS%(3hjpLV5C$ECAeTz zZf(3-bA!#`&9_mXBDhH195vSt5zZKlQyE}98aYUX?M%-$v^d@aA%b%>%n{iowHqCF zYUUvIxNB&4YJEEu)F_OjvFN(duTA?rOeOlRYk?3C0j0BHrOGfBUtyF&i&l(kH5tiO zDJ&(aKylcgLmRi8+8u^LLs4i0D25MLLEMJXX=;|JQL({Y0}~lq)cqc96AoiYymIasE3QO*^zLRhYw_)M?&W1qlapO1bh?Vv(SF;21ibhzT5nkc05Fap_u$DC~O7#+2CRt|81CC0Mhz43+9;B2%{6tY$KAH%LXz{pKBInYmZn%rQC$HqJ9;e-Wb9+Ri4PpDuK zNZOWvmGndy6`(m$H^q9Ys%Y2gW{KTi;4swzqz!p3U4)(-Gm_@7G&%JNyNaN6H7jf6 z7FajLOdNXPUO}+HDnYq7r_iZ*Y93hhCAoz8a+cPS|h2IpWgL zYpNEkb-FJTX=i9mENDj}r##!jLV-y_CVVDLfmkNT#4Ys2V8^RFU{Qy$HFV-2Q!Qe@ ztlslIJiS~zYc8pZs;F*6h))@BuP_8pw5LID-6lq`BbL#u6YJAzt%zg>R(wcdX4hm~ zM1NkcvF$U`m{Ib2%1MjoiDoX^KYuDBIxO3RW#Sqi3e&1|MlFpzsz!@Sbf7-1AVypm zeb8k@Z7pH>=@yq_!FDi=)%hkYDznGubtg{N3wafv2#k|CLdG2GYIH2G<7<<*qD4(6S zlxxf>eGQ7yW*t|d=OA44)tbYQ1%J!VYtFizVv*IWR39sFHA@@#s%ZjS2k0@= zT;?G42zSekILps#CEwQM(?L8r>L*phF#lrC;mdGkbCp!GFdc=t4diboHdLMtN`ypL zFuejBm?h)*oClnYq;j+%@tLFUsi6kPDA2A-;sHf7E6LMgw`dp7$!SY}xgZbsV;H zXuz~9VNwW&e#X8Gp9%-Tr%=tr7WIilO6Q~EDDomGdLylO)~m+@VSSHqz5(M1bIOz2 z_nzN}Xe0Na63a!Ef3YBxm2wX{8+AoDOeEhqqFg_9RjiDc$fE zF_d0iadZJ4iGj;I)Rmf#{sUk4#y}%lk9eQv8xBTlw5_AV-$Wcr$K_-O)kj|HrNV&} z!CFFObB{*Y{m)6AcH1C_RH&4rZ5i`?xxVU*%1RrLQ58A?O2ILUxBONUdQ^IFX)RWG~5{8`TeKe9(%KQV7zz9Z-q(veUTtSY+ zjD`L%1G_i~x)NP%CdUgwgd)WHVYw4U8mj>&2g3+^LKNVRE}k}dPY)MHCV$faJx1_V z#oA#etG_{PqUm&W$eednsV3QD7UEl6XN9LrYS6&aLa}G^81nwQEZCG!w3kOhn<5Tb zegPHL%N2%iXmEzpk(hq=#f`=~*i&&)ZF&us&{tZi%0`53SsZZ5wsJU%IP5>z4H#YU zrIj;q6W|uCGWLnm4k7O>hIx@^MCem>rfETQaA)$e333!q$=Lvr+0Q}+%cnt*)2u1! z$uEH(w4_~Zpjg@59I?ft5|5_XqZcIJBoF@>lnT|C;4ON`(L7Ocw2l&5(Y@f9)c0Ut zQr6!@!En)w{yee+V(cm=IaB^H?B$3Ipp{O@ktoJNu?sOH^Brl*Y#!}pUo%edF*>~- zC=f4gMXDO#6W?NyVt5h8F;nM?@gN>Z-dQT%C9O4=%`8{MJKHC#co+afIniBb*?NjP z3z1a%FNZ_`g*o~7jkJ7xSyMt5=Kg40?sqrZCo)-ASM+O`L|51&CV4zm#-f-WXUVh< z3IkMO<}5;CnNOOWZW?ol-m0PzMA+qX;HDd%#Thq8GS05tS&^;Iy3_g!A58~>SqbSj zG|0kF?7#PNF$PBi;PV-?w$?YqTrsz#td`L4Ybe7*Dr3SaEnMWI6boa44~IEvITok( zA=4K!)FSL?&Pd{AAB8>(>1E>6N8@`P7KXD5vBxoYxO~1fpORjpd97Esv#!2;%bO0@ zfj;;`%4?Vf%6T)f7lfKu(;9ZG3M;*Xj8|;6+5*#`05#NF&cv5i;xf=~Y(dQ*2gmd* zSW{m)Cf3(sTlD?r-jtO^So@w7{6vn*qchz5^Bg%Q&yl`7s%`(fBBi$+rS!imQjX5k z|1RYz@5-v^u8~o@-?a9b^Th^PSr@xWM@lZanJahoSV^cJDhWr#t-!3Q53{nrT4r%a z^}78#dPZalGn_Y*b@TV8R#T@tOCd-)=0d#BbuIo&IAyDXwZ4+CXl0d4`&2d9 zgvf4E*wi_7T{bLmk0_H6R^=g}w?w~cI^+;(xl5FogMJ>W zFOyspF@-PK<{X}xSS&#$Z|NqNppv(ClL;b^__$%AVHvf>MVbqNHxNd|Yg;dH(NQSD zEl%C4)U7b(+CI*#vXKw!DA&uLc()_Ed1m-%U=#1-o@^;-`<1hHzE@=TFWi^ zc<w5M^6mXh&gPV&X@7{IyTyT} zo%=68n3=2Hi|w%`6ctNppUF@nVbl(FBl|_^(n#~jL0BP*;7+=F8Yn?7FjK6`nS-j+s3TmxqrL4}dFFRboGQM-G71n)05VJzz}+$`=1rKUq| z&Peg2`z8@JR1{mzr}*qMM^qCl`Eottp*`Y$4(Y(|W>u4&w6==y;C|6>w{kCr;%95?%0K9gwnj+!#6S-H*aQsgokGha~6y+Zwy|wHYje0LYw1eTozq3>FUlHGx+q*+MM$2qXdv`DNM8+lc%~Ut{ z!K{r-(dwF1v8eSJw1L9&TU_sMI9ib7eUWHFzO%>Xy}bwg>AbWPt+dUXy#{|oJp%oiNZ4Zv<%*MLx%e`MdH7HHS^(FNAJGqrg&fVFL*q3)ZU)BW)_NA4T z*O$1%4j!%kHY45$v`c=#r578omg0%=u}MOh|5O&ww*>?=xTuaU@lh;zYgIJ&}LG&AqFZM8MZ0-Q9NdAz=TCOyC%B~_iXW5?db=1e!+ zHhr_8$D6BhK?xqV*)e~|X>4U>fzQu3-`jN=Qlu5R#Hg%>Os%^6)- zNzr_)>KL;wUA~$Fhobm{NMt^H9<~FOQbjOS{Oryl{ zB+>QT;{#|)8;ftC1qz5v8RO}J-gZC%ie8xMA1J#W7amFLvCn{A+?NK%j~qvIJVXS)g)GF6^$F?Y|sMYJ9Xpn z6(;dSQKa}{b8ixEg6U<@^^GInx5%R(301UrA0m@oqMa6BGKzvM59Q)_k(tez6Z5%h z5@uMp`Us9Q=Wrz_7#BHKh^eF^XO$=sp*=o&m&Jy%j_M!?IYUl}hz1h@Z93o5=vM=s z>$cJ|mmimL>rGZ#<$8s`>*D#Tv+5$MnFZ!xH7jku4!WyiJEe_aw&#R{I;-{a-N{#1 zFM`7I&XO9w1y+_DT571}I-YBS*)%TtyvGN|UBT(UmsO`;CN&GZoEmhT&adNQVS=kU zY}bjEP0bFgl6I{y zq?mS&;>|}8!Dg8cyn5m&?z>ur$A~0BC?UrPFN95q%T?TH663Cf3M(*mvi<^b8#C;< zZOjSczS3bG%izphYolH%5tdY=&FOI^UY;*;xChSNX;&qU=_Ialla2{Cy(ApK@ubRn zz%CEnTh(JlyePNek7Va7(Q?fLg~wrPJgyDr4Y@A&;H1IlGJz`>&GzBa5iV8satgkq zC&}DU759V!yT{C`k{co-M?Y$U(#=wOs+)53188)*H$!dH6R)fh-83_D-Dq@RH=g^c zn;@#*jX^D2GFUEebkh#5wZ~YGXiBTa(?)%m$m3c3;|?24Ce0egV^TRzRLYcN(houML|wYgbioI9j^x_(yiFYi zhpw!WRhkZ2^pIE@%IQo+K?9aKl-G2)o9?GZP_)hZ(Hup!jMh=vw?mv3J4ib@?pz_I z>9%NoRrFY2Y{c99mnP==QX%c*IArKq7bQNY8?zqg4w9nj&O17bR%*gQaPyT{bxP2^ z9kHF+K;l~=%+hqnB=B=kjKgqa@XllU?4;_nlLHN-J_o_U@}^em9*Dlyhamvlz0TsveYy zl(pB*a+!1mbF#5?(=I<$#a9+aI8?b4<_S_m7ZMt8p0SXQY84`E>Do64TDte}_oSC+ z5zAcBSQ}m20~(n)muVNC-IBc^(pG~iJc5a>#2s-Tl$5NPF+C`0)#I5MmvrlgvRR`_ zldfWX|1RruD)GPEtrAp;DpKxR-c=Q|nyhCeN|qiy%B5pMpH1``sJZK|2dPBt9flDXgJ+21EqG zOV&7Xg4tHOBWC7~n7yJ2n(5kooWt@)LB|mUmw;DXx^%p5odG?pwG7c!_I=QF?bArR zr?yQkA4HL&73(Q`K)W$ChZNY^o|xNa!*NM*j71YNPL(luh&}kaQHyR~yBm(%F}@`3 zu-LAcdF-@f&*i(v>WCXx9K8I%$mM&sUpBfOVcJ_+x+;kfeJc$`sBau~GetT3Vp*Nn zmlhr3B(#8LPT>p?exbH#S^M(dUYhaP?G@ZbaQ%f;tFW(Vn%(0<*>|g_TG06Z!m=#U zmtQ@Iol-{a(hX92*|oAT|95aVyMm5~)94+Pk$O!9*}@dKGDo}=MG-+FLfHz2oZ#7d z`4vZ}^u!%BdbJIv8|~_grMuFUt?Z&suqLWXVzn|+Gxn(NSBtw!F`_TY^=)#PV5w;H zLzQKl95wDd%faINa_8ClUnX8dS{xbQ^2EA>civgfV_$t|x$n3Jc_RJ)sKL=W@4N;_ z=kBjT<(Y5??>+YZv2QyzPvHuy(Lj2Xm^#xP)MK*XUBVv3K%-S$FNT38X22x6Q> zQ_0-Ele~+_$`f;e+3z^p{^k-@bFR(uoMCQjDj)Oeo_uJ=?>OHG9F_dQn8p%OLA-aI z_h4%gJ3i?z0Ve`OzMhg!Nv9>w*-gvbIx(HY z{p-{9Lr+L&r(Nk;>3!*@bWu7zy(PVel=q!_NxEngS@?HJI&a|Gfz#9RgYO}BFzp|> zXlPFw8@N7QH29i(x}28IO^@bR zDLjxqk!~1J9SIMd<>yY}`O~?34rwP+j_zHXZcK~R@qPY%3+>Q*mebD$-a%Pu;793Z z>U~o>d*H@&$-uSgsg(SdbY42~xR(-I2NKVySI!$)Pp8+GDQT9!Zw=kdQ`e?jc;ct3 zPC9X5&%pD5#dIZq91jEBnAQiLN6wq6&yUi6y)oTD&7aB}PNVc2(#^E~{sWz$o6{*?3v za-Ko?i*Cy~X;)3Xb9%an(M##J<1Zrj@#)~8V)}RPz&X?-@x%}5554m{Zr6#_GckH6 zQnR7sA59MR#@P>j=4t1g_R`ujk2@zlf&Se;a6WIFWi%J*pHqg;O5dlRXHkz+(n|-w zSvw_t^L%PGc# d=oW3J^hq&5_9J!U-!GkXY=NZhK?UNg}R-aP8^yWJaOP1Lwft^ zF6}hZucaSu9Jp~{me47ruj?6dFte!R9^e*AJ>KD6=~k}KV(b>F=QFwc1aiKEvc_n~ zDa_zGT73q0G+MV3*9_BKQy-s8>E{jHLj6uj-yawvWj39|>^PU}4U}{v=?5uOf5%he z6g5)#G>1;4wC{RM&fpCPNxgxRU&`#go)XTd)@P;b`PDkpjEH~gu_4||4-5_Qdphq@ zZ?S%O{~45UqGsB0ryr-<9Z$_Kp`7CZ{q7>KX6Y9OzdQKT!7mJcYw)(gTe;qv|1P1# zOZYpF=k)BJpFHbC{~>ex zHPyZM5ITi=CrVP?g*jBK)486;yT3Vb1|z(Od373NaV5QW3!z!=jPced@WzWs)4w-> zHRzv#OIWSDsLwf!*DiYRG|lRPYbo)pblY)>ImDO^+)7RO3})IxX;)GXTagVMCQK@4 zgFALDWozv!r^5QvI$Z}+8b5eo^rD*Pe+|%eAl*F;0tpyMCy;&;Z~|#3Fj6NIuBGFE zyU@;B+C+F0;d^kugf|g7mAt~FL+P%--GCF)J^9^4+9uLAk+zAn(|qSd-f?$ACjlp? zdvWhxy#HRjUp<>By+(=2C8$sDMZS9jzrgR^C?x>{gij~sKE&?p{6pz}#ko>W^80OP=^JbRElm(yc+0TQ5bIs{xny2j;7dhsNe zozhjruLiCmQb>Lc_nc&(0CaL2Tv!lsa3=*FPW?b)wFyb0F)idV9Y_3O( zx;z;;49o%Zzyi<)7J=)4C7|QBoC(EA?6yg1mC-$k(Ou&m>%azZ1b7PfL<^q=JRKO} zJkbcrWl~W``aMJG zzexLU;D4C^KO^7&0{=(+=Rg{$r2(Keuqh1!L%?ysT?S~!z$2gw7kQ4|6$*Yg@|^(a zohNd=J8%*(!n;l$&^*|bP9fhtSiq-J#ytt220R^Xq?!IM`rux~?+uJFXC7Ov!%gWI z$bUL;AK<>g{eUxoGlBa94^Wu$&*J)vzypB?0cQih1Uwjc2yhPYP+%B%7fZ9>|d@K3S2QC0Eq<)V8E+Wq(fky#q?^9`o@KJYtgI~%2Xkd)hd-1@d z(qjgM=QOtJzw^^$2kx6*!B|~FKW-a%WE!DwMuAl@^WACB7|(78-cPy0|NZMnJj|xF zgZn#yUG%Z|_q$T|ZsOg((zD=T(k`Xmdw{(I7lYplo{M%0e_uvBv(>1jsQ;qo(en-cslS5;F-X$ z0l&_3zrlN-<*_+0J)8J*0FA?QJw6(@$G8ulNB-vnF92Q$To1emcrox2;HALJc=qMM zD}Wn-SCaNB;MKrufY%N@mY&v_45imG7Ow}yCk}aDz?Tt!BQOFseSXgvy@|3kj=kgZ zX3BdD@K)e$z}ta$0Ph6e1-u)05Ad77dx75q-Us|P@P6O}z>UBMf#0Exzf0Y2BK#rX z!@x&?n}Lr49|Jy49XTk2(bvBv{&zg{L*Va$e*pdw_z~$rx3;E#0=NA$`TqsD4ft2! z-?;x{;NQvn6W~7vG*8NU9!dY{d9o?}lzaaL{5SAFz|VN*e*vw7|0Di$Ak{X3R-ppG zATR_R2i&CwhYK8EgOBBUH{gxrKY{Csz}9pE*c$w{_Zik21k?y7ExGTJNZ^FNz_fjv>D*c^K{64^af%^ex0A~XC2ky=N z2XH;BwiCXt;Ej{gFY^8e0uQPQuWd_bLo$S?eu?rQ42Y(W@T~Bd=)7>*Ln!AQ;GxuS zxOSFt*u#jQ3p^b73C~{${4!rpE&ZfN}TjgVMp8`nR_)qb=&=%X$AH?p*;~N!eEszZ!TjVd0ExNPhzG zMAAwdpG3IM{cC{<*QEx}oKl1E7|%?Se+p;<)4&Wc3$%bI1BZb*o)up+&vgN41NWwk z#oA@*I?7pMZgzlWUAAHl((`IprsvnLN-wBgonBbGCS6~9 zLV6M9y}0(o^pe_>khY(cUIx4zcm;3+^|^p{yprpyfL8;r0bUEdj(Tzrao7{ zzMlJM(%v^v-x02FOpeq&BV9x7TjJtasNYSfkLKT7&CQ`e<#EXH)tZKOe76`QF=W zOO^b3=1vgueX}V|x;RUuK?tiE?fMeh>Hx@KxYe;A_Cw zfm4w}HRoPV|9*q`H*0g0ulCI|W|9ch29>)&82N+nsYsS&<%+C4u-Fs64j%71Qm=Cv zlJP`W|G>{n?v|{X(jV5A7_;lrw`!ZyAAv{yn8LnIp6>vEQtR**-K(WP1-=aY8E`f8 z^t-ha(x2Cs=_}n2zWko#{vOX?R9iVJy_Wuh^zYYJ^SkJK#^SFiOLXS1dDjnWYt=J< zL*8AvzNaD$-#x$MZ+Xw(0Y3!(p6CAo_(zumZKjNW0{$70Z2vE{ja(jbkKeN?{VUJ? zTkQyasXA{;KX%@y}{Br&7i}fztrdlzVZ#H}DI<>A-z}`vPNVB+C4{A8k0p z^$Z#COqcmw)>)|=+AN-V0B{y?I(dH)cp%{ik@ucxH3ppb`MFHZ?-!)A2VaO7vWNsn_K zhtj3w-vjK;?-)T-Q^s8SL&^4fx7LZq?=s5TH~6|dzp*Xk=N?b`0s8tqXn5jzw6(-# z!w?R;oa-UrYUa+xwKwE-_QrID`~FSU9KUk#%ygCVQQkF_{RF~K1jJ7~iEACW7Pz?f z=Bl0(#Ff7ROcKUqMtzm%EqUDEn#VQP)e*{?B5xCz2Gp(@uCqXkzEFFg%)1W{zO9;L zbEMA$3&08FYXe$KdXM2Z5US{!_5x{iEHK!<$GfadoKa2xMh<+=u}0~^2* zK)B&4z*8ynX~5HgX8_Lxguj1{`usZZ8|3)`>t>pAo<(>Bt;flJ@9p8}Gt;x_&*uzE zo{qMEk7u8o%lt9re!uo^aFXU*%(dt7jvrI@^Lge4)a!-7^}vgG=Ec14C4-x>8J(G4 zM)>8Vy@KlvgYT)zcqM7CBLAy_*ARX!@H*i2|DR?2W>v<|z=3a|+&A)`H{I!To6?)P z{}$J|mfkw}-i*h7E4^*-ed+C#A=);AmN4cdvMu@F3A~Fs-A4P>x0){_NEZbMzMFeW ze-GD-Yahtzniud^l=)s@1P(6n6EZR7y$=}UnF=oselX);crD6#Kk$9}{sXk>M#3ND z`a4{I7q}YucI|g4KgL1tmL1_H(mw=z82AWqGw@N~)8P6sKswEj6aNJ8N#Ik!r%8Vh z+Rw5EKSNzVtA60#=fDA``>_YT}-9w5e@IY?P$O?)Be(Hgk8_952lhtn4+Bjk+_ zqd6`-bq(34X4&UU`I#?sy#@F^Kz!|2sLxk{TY-Ov-h7REd>!}(@J-x{**y0bT)z+eCGc0Sk7TNkrN18hSo*=> z$J5`?hiEX;-wu8<{oUZF(hs2%Rh$ zW&e%qj{(WF|IStN^G~?`2k@W3Pl5je{u>Z&`yW8M+@DeA|I!YPm%ui~yES)qQqF@0zr_0f63>3g&z{S(dTtl@KEj&N`rS=^A4gp- z9eNG6+|SrP=e4Ic0H-r<`?&509uFJ<#(DlAa5-=YxB|EmxC*!$xCVFv@I>HAKpnUi zm;f5UBrpXufoWg{m<3wElYzs)954?o49TwY<zHzd=1N;z`*ApGChu8+Z=zT*`gk&{xy*dB+Qe zZlzr5aXy{y&$E)RUq~CS2VO)uF9u!$ycBpDX)gy}0o(w*5_lExYTz}%Yk}7RuLs@$ zyb*X4@MhpGz*~X00dJ?QcL47s{4U@gL!U+W6!m`h(AUy?hQ6MDlX{L&@AuM%-y+ZZ zi2pX%_X8gQZUjCE{0{KDz)ir1fDe=ZBjmlA>qm)y4EQ+lPw>8{@QzP%{S@~;4Sa^S zf0p>?fCIGq^W^;k@I~ND-2XCg3-EiuSAeeqw*p@SzCQGg^bPWT6Zn0`=nv@Aa|Ulo ze@OgWz#jpBOu644`lkE$J40`zjc-VQLfW4K(im!8{266^7x;7Xe~;^50N*G4mt6k} z_-n#H0R9H}Tb}zn;D^B91CpQqf$KkV??=Et0slO-FZ~N}8*Tnq;{OKxct|t?Jt}EG z0se!u|Kz!!a{VvhzX|^jpt1iM@&5(>k9z-{v+#3^ zK6d3UeG6Mg*a+^*{ks7t04D->2TlS`2Ba^Su3S3vQ;6RKI2E`ja2jwg;NHifGXB+vbU2LNXQzX&`Kco1;*|7+|lpsP6A20XhY_vUIs0s#WS-JOJ> zm*50^~UT2eW4%phXKeM z=zBp8^1Wz$TL$}@{nsIw(jOX%IShuwkEAyOMiOTfzemFuxUOGPV|_2HalTi04j0vU z+*0v;>gYP-an=KPN9B1>AfA-(MEobgWQao1DZW=3H%q)zYAVlU8s$IT_pF+MelpHA z+a%gee$Rs0FbC$w_f^<` z#_tzcjeQOLihV8ohJ6SOhIKF$)}#9d*oglokiOYw+_!+VTU#-=!FJdIJ7Je^klGD< zd;`^9U$@$a+kQBJz6aqD9ERVK_Xp;ma0HIRF~S{(6L1nv!D%>y-&r_^{XAU2ei1IA z+hycj!R;zUQ_k0LzYaI>y9u}8HryfHUBcXh`}jYAhu9y%W9&~bpTaZ3J;!_jFX0tL zrLj0v zTFN6G`I7b{J!S^Wecr=6DkHK*mrR(MAq!;1zr5y9*({k>6_*x%}922SO_og zLm%GRT!eq7o8P>v`a{|lQ(kV|^FUt91C@{Tvk^B;ApLOU=Z6R=V3GMSX`dhQ{6!yA z$AW|{guO6k5h!X2RUYINvpgoR67C84`>Mb6*KR_jrH(3Yr1zA1@RTS2G^U-SkBmGI zJ5CZ1PUbL5B3IUuW!zHvm2j(!Sp}*>HGWsOJXbZa z*TlZf_XXu@*1cN9tBrdds0;O=K5h-5A@)Yl7@9y+%S-l^JyFfbS98lF#)^+s3*1{m zD`-twwt;ZswuN@k9y;LH5%*5mJ3|);)9n+^I$$KfQ6LdB3KMd;3vW^g@&}9%g|>ztgt*&D=jb7D$6Ur`#$Pt!u=$v1O1<{m??x&P&^(Jy(e_VP^kS>CAqmaEJloKpvobr23wKM%w2@CW<} zM=WpEQDhv07wB}Ha3^TX0xh@HNlUakWs!0JU+T2wojPNYv8G*}wRpd&+0;49dv)IO zf%oqNweJIUUiRt8z8wkwQC&b^@4Bbd{fne?$nRC?Sm6YdIJg==sfZoo~r z1-C6F)E&zwb=UG)-LrgA_tE`EHM+ckw}gF%`5r!C{|KMpGkme=T3&W?F=44`!U1$vEu&`5CGCXrlE~!OCI8q zP9Ow<SblLSH`DQ?MNiLO*~%oJ9KN@*>sQd#BM`e-4v z-Z!BzDW zJc?UokN4(`Lw*fE^20;MjG1!_!OYyJtyzNF>HH175g<-_6jhx|_KN5EYjKqBu zjD|6|kA-nC9wwl}MBdR!Fd6?TFqJsdU^@OYU?%o3)}&_S3t11i7Z3GJbTZpRCDfL6cDu$*6-eCQhy`MV`#FE<@IG zYYKK(eovOSt_7SyHsLK>?fn!2$D zoqh$GPu<42Wv%htQvOFCBwe$9`7$?R)?L~0nuFos%g6h@+)mziKuzmMwbLr!({$8L zsjp`HA@AWX{C9(_@3`m_NZIe<_g=#7Bd=ZfPRO400Df=dja#%X4C@NAp1R;|+F!XZCIKmjNSg`hALfui7nVh{<%p#+qK zQcxPoKv^gUQBWQ#Kt-qom7xk$g=$b8YCuh>1+}3L)P;Ib9~wYIXatR+2{eUf&>UJo zOK1hHp$)W!cF-O=Ku72VouLcJxzeuC4Z1@Q=n1``H}rwN&=2~<02l~^U@#1Up)d@F z!;dfmM#3l<4P#&|jDzto0VcvEm<&^3DolgvFau`7ESL>*U@pvq`LF;M!Xj7+QtbmoU3Vw!PU^T3PUtul$2J2uwY=Dih2{ywP*b3WVJM4g+unTs>9={yM`?eQ* zR>(!2mo|$PEiEBX!;CiKqi;5CAN77e9Dsvx2oA&V@CW<}N8l(NgX3@lPQocT4QEL2 ztRHjr;8D4Fr*n};E+dWee(}`>zuf2}=NoeyZWqzX><8w--5iTaySbR}%_ZK;a6PXk zXW%YlzXDg`8eE4PF?os7@@ZX&dy_P8f%MI8W8OjbUAPDL;Q>5^NAMV)z*Bfe*yqT4 z0WaYdM8jY38oxL27T)puJ$%6a5kA3Z_yR0$^4(!9Vq*;y;(!nM+T6+lR`3HG*ueo# z8>a>d;|6~SfVdC{K@bn(+wy3^muB!Un~3`rmql9F~ZNRB-Pq=ZzE8qz>oNC)X5 z17sxKOpqC}fXqW?#XTEjha8X-a@jaD0(p>~m*4pyjNjpy=3D~(QtT17T&e)>1)&hX z3nQ}#$lQ5RF^OLcBJnQ{C9szyTq!6GWuPpSgD6{Gt-LKvle3D+_?B0ooGL;kP*#~I z%AhI}zlz91?+E6fsuHgnREHW+6KX+ir~`GO9(XtjRNv-M4Q%0zeZr}O;ncx!t)b0d zHNs!si}`wfzQ_6T%WwEKCTtV@_AobR_W2_?KN^951pWoIrnZ9gZE4%cXLD$QUM-;& zw1zgsZEK`$%5R6gJ#@gYqb)+~gg%{Zg&02+LS`Z3o#;a&{)aLvqHxHf=1 z4y4Qn*#bFv!;vZSGnhEuapVx}Qm#@yLrJeHc-T$QlxH%`crI==9P>w8aV;6U3HZ_= zU&b$iY6LPzej{rX_R%oLkjEOa&e#IGl#@Kau^`WE9E=AKtJ;#z1egeuU@}YrNpq@A z)25-%bjopttt9AkfZ6=*9HaVwQp3_z` z(kV|ohuTVh9pCDCKWkDyIH}!CWP{L;P|$%T7vdn-d%bI+l;w?-~&FvQOrlP3=+5t-^V;^f0E3=;6p$Q)QG zCltN9yC{=DdGmPTeji80EKw@#evl5lNVEdj}&w`OztYyvrHSXuTsc zLRA6W3PK@!C&s9qD1lC~&#Z8ajzutwf(N9WWbH19vXxyB#q8$20JAS$=YlnX$W!>PlG6A zd7oK%Nee{J3J^*fvR-QH)(zb{X%%so^{+~#Q`z3#cphwsLr2lO2jBHAstRFDncjEF z)V(V1)u1}a8TuNSH9^|WTGWf$_MS$&RR?=rs0a0-0W^e0(AeIK?~9rLCg>o~L-cHl zpV>Z3d)-rOhFsA>)}9;k?3>$r(<0N4r7oDdiM|z73!arc=a$581y0(4*2HZCve!>D z=5G4LzB`hhC+7Q++S1pkr?M_5&&8~#BDY_xj*^y?r;Be#TjaL`Sqtb-o@KA1>`QEq zTL+$dM|*$fBFwx=oif{@uVrV}6?rC-uK|>mq-E~)?}Uub;6i5!_nh`Bl+&{^w<0=7 z{g*l;?}C&;7s^iBsUL{b6}mxp%A$vT5beBI2lg})&Tf>E%q5T){Cbj~UiQJ{!hBzP z6Q&RJMMgj9PxwssA;vp2fP4+)cR}I|0`qyv`!Upb|3xQxpS|e}ChQRVFzTk%)#1jw z97a7ipBeoXiJ7p{CjsscClUpO|%dIx?ld;e8*@^Pb7K*+W=4 zfilDHP%~kceGKI^hIGe}uE=(%*`)UZ+1GWco#t3$4tW`X?78-_S`tn~GaEp78MBVn zQu9{NGxW2n`J}r57Q!Op$hyH|>`UM$SPD``Ql87O-^5&wxdK+gD)<@XOuW43zo5%q zPG5iB*X&lS?QXROenpqH_VL91-tEX%3IFXiT*oSC!e70!Tlz`_hRmYKyIawy0;(u0XPVUka-w>hd)5( zdjG^c0!QH(VUEKII0>ih6Sef5CTAukrYvQTtvqM*9Xd@M**koOvONpu;5>Q0K)lq% zxkwpYg3ET<>l~`C;C_{|lfBHchxrF$zE{!MJ&rIEAD^&FRq9NEsz^c;n3G+beeJNKCxMm`MzIp(<2N(n|*N-X_OP zfxr1}koS2GZHUBY?8GxniC?N1IjJ3UWBhzn8p=2=nC+10I*)c(;+Z<7G18m=9k&JF zaa(A#*V4X>@mYl3o0rA3qo&Ms=+ld`mvR`$TzYzRGQWeY6&qT*vtKu$yU3i|Dmk5F}yIxpXrT=?aNJdhXiK^TNXeu#)Eb7}j`e6BS5m9gckuc8iq zEpKTH3K(hq%=g4weym3$rx5Oip$Kw|f(MF0Bov1dP!dW(X($6_p`7EFm^7p;7>DS5 z`whKT^Nz5m3~XQr2b3pHg&4il=xhETVSfF8gjq{{_vXj^-qfRpNIj5#tcRO0#J?u` zRl{A*vB}xBis&Ne*ur$VB}2yd%=5?8&B~NT6`qCckErTcPq~V}S#LeureXQpZwV`9 zE8#ct%s29mZsZ;P`fgXlKLM#EB>gYEGt~*3ncFymjT;R&8DUL*>FZKHHI4UP>Y{nh zQqJK@J*|bD+E54Tf}ACiHMVN_)kEj{(13USah%QcS7grETer=&rXjK$L1SnFO`#bS z)VFAfxD|w1badIGHFrqc!5kj)q#x3fFlN7sHE`^$9b2_F_;sPr(H1@0IUK4z?j4{b zWoY(0*prLBvtx_a#j#EM!LeEE>e#Mj>mPvoVhonOJ4aZBvIaPN&ircRU-`IqypeQ@gw{m`dBdJjO( zKp2GEU>JgZC=4SX!yTMbg%L0kw^1;fc%j^oGRBb{y_px$cTp#jYceJsi@%3kQ+&BS zWgN1{^LqkJG|FKc^>-Wj-Dc!>5;{(%Jf^@@{H0y+utqI;Fz+eb6H^v@wP_C72P13N zZZ(~J%^rS*uo$Uu>+++;vtygj*411UOFG@Qc>;E%lYPPAr zlW+Pbjz5g?pU9JTbG747;+gO08pjddC-bf)*|(gA_V-uHaV`1qaI1{WT_xt-34z~` zyAIYH`8bB(QEh|csJ0O{!Djrnz*fg`o`=kV(dXm$cGv+s9VZNV;wN%<;U@K?4tex& zV~x0d-|rOq(pMziJ&x0~)nDgo2QY5ji>~{iIPNQ{r~8rXkK6;82XSvo4LC%eek1;2 z_}y`aZ#i>_`2Pv#2`lpqN3hoq=E!{BG2D+M$02=OZqbqRb|-L?`Ahb% z6Gp}cvLD>L_xl2Q;RJx=qB=!--ZLtvv3rc0cj#v#?<~I~2{+6~!qMl10s19FxAVxq z02e{-47r4P8LklTDqM41rf%!%I`$iI6K>&u8}7hexaYV+xp~X#A8udcn z_v`c#S&t&!hfs+5heybfGJQ<^C-4-WfwXh-yq-I5AjhFzP)}bvZqkP{_uR|4TFOn% z0*kEX{4R*zuZR;3a^CbW%-4pDTgG=KD{YBp0fhB%GmvB62dlLAa#`%e|@Xlco7WcHcr*nQL4*R{4C1=GmIKLRrA(*<7fyoci zJp-4&Nqx zhP(Hu+r^zB^y|#K151!bNy3%FER9(P%3?2v8HHIMvjXW<#H<9Bp$b&RuNru`4N>+I zo8Kq)I#7N!@R##czd7=$noik!ewlr>?0s-%Gfc)kl$Y#TqmM#Z*-P$WG#_q!+kEso zltT_@c2yVZIq$0a&OEAtQ_d~rQVpHHdLzc&d>#Zz`rYWgYF<@*n@CAp%?VV zP4>k1!QL18@w-0^fPpXw2Ez~->a?H@N`rjwM3-p&9(BhYs}6IrMu&_afquBo?7bR6 zypiPFoO7}2GUqS~|ItoAUGBY=Z@oF5;aM^U8H3+g7zZUOcXNKoX4KpL*7~ICr;o>P z0!)NSFxhF-rZ{c-RHt2+dc2l4i_K<~tE}%zd*+CBKhM15G<2E{G+4NYsu@m~9-nv{ z$j?mN!??9fzCE*$JsajY{gKGIBJA^EK4BKXLRe&k574=zoN@_3PwDfTcT}2vT~n95 z_PEH1OPIJZVdM;j`M$|{(=cvEBd>adk3(NfK9)EgdMdk9|B3V}ql@Gx1eWq!^jP*y z`pxlQj+@kj71S$9ccn8(kBht9C$@^Pv*2g=1y;iv_!ZW|Z?F#5!v^F?J=};KnY)P6 z;^{+T`)%>{O~~Esl(U*U^eu9jzwh%||Hr$FS^D^5ow%rg<8T5_!YMcnXW%UU za*pX7_VaK7F2dJ!EpzSa5^k5_3S5P2a2?%c&C3sNV84m1TW}k{Z`Z%>@cS;@gZuCR z9>ODd3{ODLzss|Fiv1ZphZi9CwZ265D~RUzU+@~NQ_fO*&sBfm_eb~y zpWzEIS*SG7ArAO}FId0|eqaMTIKb&*ei7U*Icv!-A|bO znbeg)PlhRTtcmz8$$Ep_Gmww^ogAG~pwDeujFgyC7p44DVNVTdAT2t`JY+h|^pJth zQAW&6kQuVL66#r9-gCvA?RUBL?8M6fIbDhLTrRmoCq&OpT6w@<8>P6%S|5ZCauzx- zZuvmkgHV3Ua|`3Q+$$H3nI9sc02G8mP#EM4brH;>;DHVN_MWjW#_vcd4ke%@x|9N$ zH!6);2EEHdIf#PtPys4JC8$gu!*qG?MpJ5u^(x4y3e`aFaIB7518N#F*$+dU+C0ZM zypMITOWP324T<0O{izYO&C<3=Ifv4Qh0;ES(mo}joi@+DzM-7!5Y+)_>G|n`Za}S&>UKjr|K|I+yIFGIfp8vY<;A zWM@IP^!lV-@Xp7W>r}m|DcgCc%z2=!#y5RE>283HV6Nw8GwQh9wYiBpwi&kIC;f~- zZrPOnfp=|C*8Sw(%^Z3T+{I>|+22YWGfYm(jPDrbupM^5PFF6%rBzFedFR~p6N1z( zt@pA9cZshbL{&U#l%4?*(*KlJm4r4NN%_SdkWNt^PeU$xv(l`Jj@1QFT zDf0IR!i@3`;`Y!(_#FnBJ1t<$e7V){#QTHt{S(;*a34;4Y34V-(T_P2t6v0tf(YbA zAW!D>!}WsHpvQ6KPX7G*QNqcc1qIMo>W`BV&M{=~!~G8KJs9sDCk>Br1CLTC@H^=$ zNEsDGWCB7nMaF(yBu+lk*)>lIf~`lCe&U(}FwmArLf|BKeMGqDu2M!i4{?71au;PV{$bn- zYsxa`YF@frJX_`#2=k0SPc%B0*UE6?YZ-JbW0cch5# z?#0ZQS@@k5vbo2o?BpYd+w5QG#4i`*#xD-ZHgD?%kO_oy+ z;I`vyaVqIeac}0X!n-4G^lkWELaWMq;!rIJ+Y%TLt5&$ThBo|e3$oVSj^FK}19XH= z(3v!)pVkHY56~658R?1MmGuzdq=wPtJ>h#Hr#J3>pgF%K&wVlb zNqEL<{n0`0;23~85cfg24|bdL@vU2KH#JCT+c$znT1=h5KxGWql6jT$l&*ao~dHEE8X>Yru7I{k8t#-aP#iF@TmHfw&=!PBjhuXZ{{zgCv#(~3FqNj}F7HoEKR`z`hLP3{JIPHxO*wTv`Za-Ty(U25WH zqkZv?k2ovGCTi(xouW?2d%hJNw!wDT0XtzAa-|J>Nd9(X-veLur$6J)q4ptXKkf%W z+P8yn2oA&V@CW<}N8l(NgX3@lPQocT4QGfidjQX&`B`M1gY)i{JgpV#f?L`*_70=d zB@mrFguU!ur4q*aOZ!)pk%+1D6=Z(Bh>28(1yCU!FBL22fuiz#1_Z_eMF zaWne7C$xNzWGu;3@%JdrU-Tp$|F3l@jz6h_FMje~<)W>%`0phxR%qGq;fJ5ptqL*o zMmB!iLFCBzTE?&re`d(AJ274027d^ExDcuKao&MB3I9+P6eG`@UOfCoR(#B0NB{{T z5rjZuNCKgd6p}%5NC7D!6{LnVkQUNGddL77(La-a3(BwsW!NI749&Wg89lOq?BmNy z-m^h=$N}75LYcMHbNaX9`L-f%E8@!7fwMNmiPA1Gs&=c~gq5*N9!$AIGB0W7gD`)$ z3ip>2sjZ3IIyPPD`%52R>i$Jb8=aA;ep=6^^83r}_F|VgXw%=rP4||+xzT4pb^+4j z?(UfI5|=&%6!P!zukfb3gzre-@>}`dIN!?bL|!F~>_zxiZf7GOrn^@^Z+wy6g}UyI z_fP+C<^S-F&SoA9`*;0Uz6<+z`&T}^`7Z3=o%c`DqF-c`Lyy?s@}2Z>)4!Pq`b?CG zj3sx|XXVDMSa)%gKA*>UX7U#SOnJp(!W-v-@soM1NaHUB{4f8$vFS$|`t*zaUEKKH zKlZn&-+OPN(6Y*oTayI2jgI*5KXpeEFU+E54gy1Wzh zpguH!hR_Ha 0 then - return - end - self.timer = OBJECT_UPDATE_TIME - local entity = railcart:get_cart_entity(self.id) - if entity.object then - return - end - if self:is_loaded() then - local object = minetest.add_entity(self.pos, self.name) - if object then - entity = object:get_luaentity() or {} - entity.cart = self - object:setvelocity(self.vel) - object:set_acceleration(self.acc) - end - else - self.timer = railcart:update(self, self.timer) - end -end - -function railcart:register_entity(name, def) - local ref = {} - for k, v in pairs(railcart.default_entity) do - ref[k] = def[k] or railtrack:copy(v) - end - ref.on_activate = function(self, staticdata, dtime_s) - if type(def.on_activate) == "function" then - def.on_activate(self, staticdata, dtime_s) - end - self.object:set_armor_groups({immortal=1}) - if staticdata == "expired" then - self.object:remove() - end - end - ref.on_step = function(self, dtime) - if type(def.on_step) == "function" then - def.on_step(self, dtime) - end - local cart = self.cart - local object = self.object - if not cart or not object then - return - end - self.timer = self.timer - dtime - if self.timer > 0 then - return - end - self.timer = railcart:update(cart, ENTITY_UPDATE_TIME, object) - if type(def.on_update) == "function" then - def.on_update(self) - end - end - ref.get_staticdata = function(self) - if type(def.get_staticdata) == "function" then - def.get_staticdata(self) - end - if self.cart then - if self.cart:is_loaded() == false then - self.cart.timer = 0 - self.object:remove() - end - end - return "expired" - end - for k, v in pairs(def) do - ref[k] = ref[k] or v - end - minetest.register_entity(name, ref) -end - -function railcart:save() - local carts = {} - for id, cart in pairs(railcart.allcarts) do - local ref = {} - for k, v in pairs(cart) do - ref[k] = v - end - local inv = {} - if ref.inv then - local list = ref.inv:get_list("main") - for i, stack in ipairs(list) do - inv[i] = stack:to_string() - end - end - ref.inv = inv - table.insert(carts, ref) - end - local output = io.open(minetest.get_worldpath().."/railcart.txt",'w') - if output then - output:write(minetest.serialize(carts)) - io.close(output) - end -end - -function railcart:remove_cart(id) - for i, cart in pairs(railcart.allcarts) do - if cart.id == id then - railcart.allcarts[i] = nil - railcart:save() - break - end - end -end - -function railcart:get_rail_direction(pos) - local target = nil - local cons = railtrack:get_connections(pos) - local ymax = pos.y - for _, con in pairs(cons) do - if con.y >= ymax then - ymax = con.y - target = con - end - end - if target then - if #cons == 1 then - target.y = pos.y - end - return railtrack:get_direction(target, pos) - end - return {x=0, y=0, z=0} -end - -function railcart:get_new_id() - local id = 0 - for _, cart in pairs(railcart.allcarts) do - if cart.id > id then - id = cart.id - end - end - return id + 1 -end - -function railcart:get_cart_ref(id) - for _, cart in pairs(railcart.allcarts) do - if cart.id == id then - return cart - end - end -end - -function railcart:get_cart_entity(id) - local cart_ref = {} - for _, ref in pairs(minetest.luaentities) do - if ref.cart then - if ref.cart.id == id then - cart_ref = ref - break - end - end - end - return cart_ref -end - -function railcart:get_carts_in_radius(pos, rad) - local carts = {} - for _, cart in pairs(railcart.allcarts) do - local px = pos.x - cart.pos.x - local py = pos.y - cart.pos.y - local pz = pos.z - cart.pos.z - if (px * px) + (py * py) + (pz * pz) <= rad * rad then - table.insert(carts, cart) - end - end - return carts -end - -function railcart:get_cart_in_sight(p1, p2) - local ref = nil - local dist = railtrack:get_distance(p1, p2) + 1 - local dir = railtrack:get_direction(p2, p1) - local carts = railcart:get_carts_in_radius(p1, dist) - for _, cart in pairs(carts) do - if not vector.equals(p1, cart.pos) then - local dc = railtrack:get_direction(cart.pos, p1) - if vector.equals(dc, dir) then - local d = railtrack:get_distance(p1, cart.pos) - if d < dist then - dist = d - ref = cart - end - end - end - end - return ref -end - -function railcart:get_delta_time(vel, acc, dist) - if vel > 0 then - if acc == 0 then - return dist / vel - end - local r = math.sqrt(vel * vel + 2 * acc * dist) - if r > 0 then - return (-vel + r) / acc - end - end - return 9999 --INF -end - -function railcart:velocity_to_dir(v) - if math.abs(v.x) > math.abs(v.z) then - return {x=railtrack:get_sign(v.x), y=railtrack:get_sign(v.y), z=0} - else - return {x=0, y=railtrack:get_sign(v.y), z=railtrack:get_sign(v.z)} - end -end - -function railcart:velocity_to_speed(vel) - local speed = math.max(math.abs(vel.x), math.abs(vel.z)) - if speed < SPEED_MIN then - speed = 0 - elseif speed > SPEED_MAX then - speed = SPEED_MAX - end - return speed -end - -function railcart:get_target(pos, vel) - local meta = minetest.get_meta(vector.round(pos)) - local dir = self:velocity_to_dir(vel) - local targets = {} - local rots = railtrack.rotations - local contype = meta:get_string("contype") or "" - local s_junc = meta:get_string("junctions") or "" - local s_cons = meta:get_string("connections") or "" - local s_rots = meta:get_string("rotations") or "" - if contype == "section" then - local junctions = minetest.deserialize(s_junc) or {} - for _, p in pairs(junctions) do - table.insert(targets, p) - end - else - local cons = minetest.deserialize(s_cons) or {} - for _, p in pairs(cons) do - table.insert(targets, p) - end - if s_rots ~= "" then - local fwd = false - for _, p in pairs(cons) do - if vector.equals(vector.add(pos, dir), p) then - fwd = true - end - end - if fwd == true or #cons == 1 then - rots = s_rots - end - end - end - local rotations = railtrack:get_rotations(rots, dir) - for _, r in ipairs(rotations) do - for _, t in pairs(targets) do - local d = railtrack:get_direction(t, pos) - if r.x == d.x and r.z == d.z then - return t - end - end - end -end - -function railcart:update(cart, time, object) - if object then - cart.pos = object:getpos() - cart.vel = object:get_velocity() - end - if not cart.target then - cart.pos = vector.new(cart.prev) - cart.target = railcart:get_target(cart.pos, cart.vel) - if object then - object:moveto(cart.pos) - end - end - local speed = railcart:velocity_to_speed(cart.vel) - if cart.target then - cart.dir = railtrack:get_direction(cart.target, cart.pos) - else - speed = 0 - end - if speed > SPEED_MIN then - local blocked = false - local cis = railcart:get_cart_in_sight(cart.pos, cart.target) - if cis then - if railcart:velocity_to_speed(cis.vel) == 0 then - cart.target = vector.subtract(cis.pos, cart.dir) - blocked = true - end - end ---[[ - if object then - local p1 = vector.add(cart.pos, {x=0, y=1, z=0}) - local p2 = vector.add(cart.target, {x=0, y=1, z=0}) - if minetest.get_node_or_nil(p2) then - local los, bp = minetest.line_of_sight(p1, p2) - if los == false then - bp.y = bp.y - 1 - cart.target = vector.subtract(bp, cart.dir) - blocked = true - end - end - end -]]-- - local d1 = railtrack:get_distance(cart.prev, cart.target) - local d2 = railtrack:get_distance(cart.prev, cart.pos) - local dist = d1 - d2 - if dist > SNAP_DISTANCE then - local accel = railtrack.accel_flat - if cart.dir.y == -1 then - accel = railtrack.accel_down - elseif cart.dir.y == 1 then - accel = railtrack.accel_up - end - accel = cart.accel or accel - if object then - dist = math.max(dist - SNAP_DISTANCE, 0) - end - local dt = railcart:get_delta_time(speed, accel, dist) - if dt < time then - time = dt - end - local dp = speed * time + 0.5 * accel * time * time - local vf = speed + accel * time - if object then - if vf <= 0 then - speed = 0 - accel = 0 - end - cart.vel = vector.multiply(cart.dir, speed) - cart.acc = vector.multiply(cart.dir, accel) - elseif dp > 0 then - cart.vel = vector.multiply(cart.dir, vf) - cart.pos = vector.add(cart.pos, vector.multiply(cart.dir, dp)) - end - else - if blocked and vector.equals(cart.target, cart.prev) then - cart.vel = {x=0, y=0, z=0} - cart.acc = {x=0, y=0, z=0} - else - cart.pos = vector.new(cart.target) - cart.prev = vector.new(cart.target) - cart.accel = railtrack:get_acceleration(cart.target) - cart.target = nil - return 0 - end - end - else - cart.dir = railcart:get_rail_direction(cart.pos) - cart.vel = {x=0, y=0, z=0} - cart.acc = {x=0, y=0, z=0} - end - if object then - if cart.dir.y == -1 then - object:set_animation({x=1, y=1}, 1, 0) - elseif cart.dir.y == 1 then - object:set_animation({x=2, y=2}, 1, 0) - else - object:set_animation({x=0, y=0}, 1, 0) - end - if cart.dir.x < 0 then - object:setyaw(math.pi / 2) - elseif cart.dir.x > 0 then - object:setyaw(3 * math.pi / 2) - elseif cart.dir.z < 0 then - object:setyaw(math.pi) - elseif cart.dir.z > 0 then - object:setyaw(0) - end - object:setvelocity(cart.vel) - object:set_acceleration(cart.acc) - end - return time -end - -minetest.register_globalstep(function(dtime) - for _, cart in pairs(railcart.allcarts) do - cart:on_step(dtime) - end - railcart.timer = railcart.timer + dtime - if railcart.timer > OBJECT_SAVE_TIME then - railcart:save() - railcart.timer = 0 - end -end) - diff --git a/games/default/files/railcart/textures/railcart.png b/games/default/files/railcart/textures/railcart.png deleted file mode 100644 index ea68544bdd37ab0bee1195f8bf08247d7337e863..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1466 zcmV;r1x5OaP)Z>)E(+zF&pt0-E}SGA9H*;rZTB#G2C zQdKEUBlHZdDCmr;aGNuBfa-Mu|b7OU}ov_vA2PN#XECupvHagk=Z)6r-=oeG(Z4I+FV zKr1Ri5XZf~-|vSxisuDEU>JtuxL_cF`O>m{Ivg@IeYsdn7K`p+XyX*c(h49^x7SOi zQm}n|d|as4&o3^3iF`E8G)Gq>f?+OiZvm(uAKOGx{5$}9vK&{bRN|==TCLVFYqe6d ziCG4N!Duwf$Z~%;OfuA9GMUa7)po~5>zU63NL>fu=;$bxPScW9Z#G)}J}fdHfIu*) z$nx;%5x2&(*16jfCbnOK3I%Oxnvh6-aLiZtygmzz93$a+T3W+zWi!^MJ3 zr#rpgWHy`3=J{+EVfFUEw;?k5<~EzpTU!ANAKsZgJu#xB8pibD;d(wt;EpaYC%3or z#R9=PTg-26Z*T7IF2>hslC-f_5{;LnykXql-!p=cq$tfWw2YoNO_pN?SvE`)*@v-M zESiNvp;$;FOi_!V5=NA0Ob{YKXdE-TjuBZxsVa$Es>X>TD@i6^HqC=TAjUP(+wjdWy(V=F7rV(-IINjLV0-$ns2F6zaczM_B{r>Z(XLncD z^+L6Z9*o6~3b@lIW-&Qv^mRDEL`u%*l?2SY!jRwAd z-+uo5>z{vq{Q9-y^Ti3mGC)>Uqg;kQe|`IQ;P;24QC~0^3Wr09M5SJ@w%fZt-|G50 z7KEHa###ozjVNBCrmb&mptyU3!D_2j?RF1Bp=_xHSwvOEvam6L4^ZPQ0}wD*vstE4 zh$a%Xc6;CN&*XB~(`hJ~9E``q@fdhX(*Vden}R4>280R12U#MKy-;XB7~J;x!s#@u z2NQ`nMa3uz#~6LF7-}-ESO(z3jfC}))l9Hvr;`kZN^C(`L8&mZ@C zc-S)F!0TOdI0BJK)-V7#%ID|z_r1XY6K}NJ8PjZbyRl?)|M2jrScINm0j${VsH*@( z5{WH`gBAps2B39vaxof7hT)Gyel0HpkYZWOfJijD;&2cQeb(zCWRbLKih`5j3_+48 ziXvzl+rn=@ez4 z_k)BUBM6woo<~p=QBfRjw=W+5A^;6iU<5$Wb;K)5cQ}>8sAn?xbinR^eQLe^3!{XD Uv#Zhy%>V!Z07*qoM6N<$f*t$LvH$=8 diff --git a/games/default/files/railcart/textures/railcart_bottom.png b/games/default/files/railcart/textures/railcart_bottom.png deleted file mode 100644 index 5e68ab3ed6970a72adafeb33f1528b58415a3786..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t{LIsWvQtx#l>Y-{!4*^ zN}eu`Ar*|t2?D%~k1kvg;Fu^XwQG`M_EoJUjtxmIaT@{|f)`0&EZlFm5U85L)78&q Iol`;+0HmNEy#N3J diff --git a/games/default/files/railcart/textures/railcart_side.png b/games/default/files/railcart/textures/railcart_side.png deleted file mode 100644 index 2e42ee55454d2334149166710dd591da4bb75f71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680 zcmV;Z0$2TsP)XIZ7Q2|JVnNzJ5sJ)Y_54i6hno@2JW{wH-Jdf-8 zd_H5&8Tb(OVR*e>{&VKIZBB+;zw9`Uu&nFvJc;=dBf@QF=GC<->|XAFqFz1)Q0;j=L#>SrJznviKi>B(l=Q_h)2M>>DiUAKC99W54dmW|hI0bE#~58Kz* z*XN=LPhbN2UblO7b#*o#J3+8sF2g)eDSiC=edTn@Kuh*MQCYRHx9|W?d?ky`NIi^Pe#$nX- zJaMsD{lC^+7bYx>dvNsotK~9a&E0g!E{#F zF(J_AcDGB5BBvCpOGyUii>fj_{}+I@E&OZ|imECuOWic!x7Y7!x?WZlbYImq=e%Yu zf8bsa2#?Rt@ZTK{XSHwb*S0K&E$jA%?EFi$a$;rXR z#R&vlARr(tEGR52Bn$!~A|gtfn#w?=rKO^-uBxG-1_YX#>gwtm8XDRL`nCZ9b^!qn z{{D{6j*cE4j=sK*0Rc{)-cEjgPJw~W{{GHEK`!3jE&&0qK0dC2fo{IO?tXqA{{Ehx zo?c#F-d^57;N#dh@vpmSGxx;TbNNU|O@ z3_D^V;BwGDD7!q;nSs;%;lFUjkID*6Jlj-#gO_eEGD~ZG(RFX%lKxcd_rYL3=foA^KJ(+C>&ZbeP28yL&0=8`}K@B9Ku$w<4>Him}}C7 l@7Yi8$0kpkywBw?dtOY`?ca<}Qb0#Dc)I$ztaD0e0sy(Afnxvw diff --git a/games/default/files/railtrack/LICENSE.txt b/games/default/files/railtrack/LICENSE.txt deleted file mode 100644 index 751b7ad7e..000000000 --- a/games/default/files/railtrack/LICENSE.txt +++ /dev/null @@ -1,14 +0,0 @@ -Minetest Mod - Railtrack [railtrack] -==================================== - -License Source Code: LGPL v2.1 - -License of media (textures, sounds and models not otherwise specified): CC-0 - -Authors of media files: ------------------------ - -rarkenin: - - cart_rail_*.png - diff --git a/games/default/files/railtrack/README.txt b/games/default/files/railtrack/README.txt deleted file mode 100644 index b371e2974..000000000 --- a/games/default/files/railtrack/README.txt +++ /dev/null @@ -1,72 +0,0 @@ -Minetest Mod - Railtrack [railtrack] -==================================== - -Minetest version: 0.4.13 - -Depends: default - -Proof of concept rail networking system which enables rail-carts to travel -through unloaded map chunks. - -Please note, this mod makes heavy use of metadata so that much of the processing -gets done as tracks are laid, for this reason a 'rails' privilege is required in -order to place rails when using multiplayer mode. - -Crafting --------- - -R = Rail [default:rail] -F = Mese Crystal Fragment [default:mese_crystal_fragment] -C = Coal Lump [default:coal_lump] -D = Diamond [default:diamond] -M = Mese Block [default:mese] - -Powered Rail: [railtrack:powerrail] - -By default these rails apply a positive acceleration during the time a cart -remains on a given section of track. When used with the mesecons mod the rails -will require power from a mesecon source to become active. - -+---+---+---+ -| R | F | R | -+---+---+---+ - -Braking Rail: [railtrack:brakerail] - -By default these rails apply a negative acceleration during the time a cart -remains on a given section of track. When used with the mesecons mod the rails -will require power from a mesecon source to become active. - -+---+---+---+ -| R | C | R | -+---+---+---+ - -Superconducting Rail: [railtrack:superrail] - -Zero friction rails that are easier to manage and are also a little less -cpu-intensive by avoiding the use of square root calculations. - -+---+---+---+ -| R | D | R | -+---+---+---+ - -Switching Rail: [railtrack:switchrail] - -Currently depends on mesecons to do much other than provide a convenient, zero -friction union to join long sections of superconducting rails. - -+---+---+---+ -| R | M | R | -+---+---+---+ - -Misc Items ----------- - -Rail Fixer: [railtrack:fixer] - -Only available in creative menu or with give(me) privileges. - -Rail Inspector [railtrack:inspector] - -Only available in creative menu or with give(me) privileges. - diff --git a/games/default/files/railtrack/depends.txt b/games/default/files/railtrack/depends.txt deleted file mode 100644 index 4ad96d515..000000000 --- a/games/default/files/railtrack/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/games/default/files/railtrack/init.lua b/games/default/files/railtrack/init.lua deleted file mode 100644 index 1906359ff..000000000 --- a/games/default/files/railtrack/init.lua +++ /dev/null @@ -1,200 +0,0 @@ -local modpath = minetest.get_modpath(minetest.get_current_modname()) - -dofile(modpath.."/railtrack.lua") - -railtrack:register_rail(":default:rail", { - description = "Rail", - tiles = {"default_rail.png", "default_rail_curved.png", - "default_rail_t_junction.png", "default_rail_crossing.png"}, - railtype = "rail", -}) - -railtrack:register_rail("railtrack:superrail", { - description = "Superconducting Rail", - tiles = {"carts_rail_sup.png", "carts_rail_curved_sup.png", - "carts_rail_t_junction_sup.png", "carts_rail_crossing_sup.png"}, - railtype = "superrail", - acceleration = 0, -}) - -railtrack:register_rail("railtrack:powerrail", { - description = "Powered Rail", - tiles = {"carts_rail_pwr.png", "carts_rail_curved_pwr.png", - "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png"}, - railtype = "powerrail", - acceleration = 4, - mesecons = { - effector = { - action_on = function(pos, node) - railtrack:set_acceleration(pos, 4) - end, - action_off = function(pos, node) - railtrack:set_acceleration(pos, nil) - end, - }, - }, -}) - -railtrack:register_rail("railtrack:brakerail", { - description = "Braking Rail", - tiles = {"carts_rail_brk.png", "carts_rail_curved_brk.png", - "carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png"}, - railtype = "brakerail", - acceleration = -4, - mesecons = { - effector = { - action_on = function(pos, node) - railtrack:set_acceleration(pos, -4) - end, - action_off = function(pos, node) - railtrack:set_acceleration(pos, nil) - end, - }, - }, -}) - -railtrack:register_rail("railtrack:switchrail", { - description = "Switching Rail", - tiles = {"carts_rail_swt.png", "carts_rail_curved_swt.png", - "carts_rail_t_junction_swt.png", "carts_rail_crossing_swt.png"}, - railtype = "switchrail", - acceleration = 0, - mesecons = { - effector = { - action_on = function(pos, node) - local meta = minetest.get_meta(pos) - meta:set_string("rotations", "RFLB") - end, - action_off = function(pos, node) - local meta = minetest.get_meta(pos) - meta:set_string("rotations", nil) - end, - }, - }, -}) - -minetest.register_privilege("rails", "Player can dig and place rails.") - -minetest.register_tool("railtrack:fixer", { - description = "Rail Fixer", - inventory_image = "railtrack_fixer.png", - wield_image = "railtrack_fixer.png", - on_use = function(itemstack, user, pointed_thing) - local pos = minetest.get_pointed_thing_position(pointed_thing, false) - local name = user:get_player_name() - if not pos or not name or pointed_thing.type ~= "node" then - return - end - if not railtrack:is_railnode(pos) then - minetest.chat_send_player(name, "Not a rail node!") - return - end - if not minetest.is_singleplayer() then - if not minetest.check_player_privs(name, {rails=true}) then - minetest.chat_send_player(name, "Requires rails privilege") - return - end - end - local node = minetest.get_node(pos) - if node then - minetest.remove_node(pos) - minetest.set_node(pos, node) - local def = minetest.registered_items[node.name] or {} - local itemstack = ItemStack(node.name) - if type(def.after_place_node) == "function" then - def.after_place_node(pos, user, itemstack) - end - end - end, -}) - -minetest.register_tool("railtrack:inspector", { - description = "Rail Inspector", - inventory_image = "railtrack_inspector.png", - wield_image = "railtrack_inspector.png", - on_use = function(itemstack, user, pointed_thing) - local name = user:get_player_name() - local pos = minetest.get_pointed_thing_position(pointed_thing, false) - if not name or not pos then - return - end - local node = minetest.get_node(pos) or {} - if not railtrack:is_railnode(pos) or not node.name then - minetest.chat_send_player(name, "Not a rail node!") - return - end - local ref = minetest.registered_items[node.name] or {} - local meta = minetest.get_meta(pos) - local form = "" - local size = 2.5 - form = form.."label[0.5,0.5;POS: "..minetest.pos_to_string(pos).."]" - local railtype = ref.railtype or "NIL" - form = form.."label[0.5,1.0;RAILTYPE: "..railtype.."]" - local contype = meta:get_string("contype") or "NIL" - form = form.."label[0.5,1.5;CONTYPE: "..contype.."]" - local accel = meta:get_string("acceleration") or "NIL" - form = form.."label[0.5,2.0;ACCEL: "..accel.."]" - local s_junc = meta:get_string("junctions") - if s_junc then - local junctions = minetest.deserialize(s_junc) - if junctions then - form = form.."label[0.5,2.5;JUNCTIONS:]" - for i, p in ipairs(junctions) do - size = size + 0.5 - form = form.."label[0.5,"..size..";#"..i.." " - ..minetest.pos_to_string(p).."]" - end - end - end - local s_cons = meta:get_string("connections") - if s_cons then - local cons = minetest.deserialize(s_cons) - if cons then - size = size + 0.5 - form = form.."label[0.5,"..size..";CONNECTIONS:]" - for i, p in pairs(cons) do - size = size + 0.5 - form = form.."label[0.5,"..size..";#"..i.." " - ..minetest.pos_to_string(p).."]" - end - end - end - local s_rots = meta:get_string("rotations") - if s_rots then - size = size + 0.5 - form = form.."label[0.5,"..size..";ROTATIONS: "..s_rots.."]" - end - form = form.."button_exit[3.0,"..(size + 1)..";2,0.5;;Ok]" - form = "size[8,"..(size + 2).."]"..form - minetest.show_formspec(name, "info", form) - end, -}) - -minetest.register_craft({ - output = "railtrack:powerrail 2", - recipe = { - {"default:rail", "default:mese_crystal_fragment", "default:rail"}, - } -}) - -minetest.register_craft({ - output = "railtrack:brakerail 2", - recipe = { - {"default:rail", "default:coal_lump", "default:rail"}, - } -}) - -minetest.register_craft({ - output = "railtrack:switchrail 2", - recipe = { - {"default:rail", "default:mese", "default:rail"}, - } -}) - -minetest.register_craft({ - output = "railtrack:superrail 2", - recipe = { - {"default:rail", "default:diamond", "default:rail"}, - } -}) - diff --git a/games/default/files/railtrack/railtrack.lua b/games/default/files/railtrack/railtrack.lua deleted file mode 100644 index 664300ff4..000000000 --- a/games/default/files/railtrack/railtrack.lua +++ /dev/null @@ -1,288 +0,0 @@ -local MAX_SECTION_LEN = 20 - -railtrack = { - rotations = "FLR", - accel_flat = -0.5, - accel_up = -2, - accel_down = 2, -} - -railtrack.default_rail = { - description = "Rail", - drawtype = "raillike", - tiles = {"default_rail.png", "default_rail_curved.png", - "default_rail_t_junction.png", "default_rail_crossing.png"}, - paramtype = "light", - sunlight_propagates = true, - walkable = false, - is_ground_content = false, - selection_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, - }, - groups = {bendy = 2, dig_immediate = 2, attached_node = 1, - connect_to_raillike = minetest.raillike_group("rail")}, - railtype = "rail", - after_place_node = function(pos, placer, itemstack) - local meta = minetest.get_meta(pos) - local def = itemstack:get_definition() or {} - if def.acceleration then - meta:set_string("acceleration", def.acceleration) - end - local junc = {} - local contype = meta:get_string("contype") or "" - local s_cons = meta:get_string("connections") or "" - if contype == "section" then - railtrack:limit_section_len(placer, pos, meta) - elseif s_cons ~= "" then - local cons = minetest.deserialize(s_cons) - for _, con in pairs(cons) do - if railtrack:limit_section_len(placer, con) then - break - end - end - end - end, - on_construct = function(pos) - railtrack:update_rails(pos) - end, - after_destruct = function(pos, oldnode) - local cons = railtrack:get_connections(pos) - for _, p in pairs(cons) do - railtrack:update_rails(p) - end - end, -} - -function railtrack:copy(t) - if type(t) ~= "table" then - return t - end - local copy = {} - for k, v in pairs(t) do - copy[k] = v - end - return copy -end - -function railtrack:register_rail(name, def) - local udef = {} - for k, v in pairs(railtrack.default_rail) do - if not def[k] then - def[k] = railtrack:copy(v) - end - udef[k] = railtrack:copy(def[k]) - end - def.inventory_image = def.inventory_image or def.tiles[1] - def.wield_image = def.wield_image or def.tiles[1] - minetest.register_node(name, def) - udef.drop = name - udef.railtype = udef.railtype.."_union" - udef.groups.not_in_creative_inventory=1 - minetest.register_node(name.."_union", udef) -end - -function railtrack:limit_section_len(player, pos, meta) - meta = meta or minetest.get_meta(pos) - local contype = meta:get_string("contype") or "" - if contype == "section" then - local s_junc = meta:get_string("junctions") or "" - if s_junc ~= "" then - local junc = minetest.deserialize(s_junc) - if #junc == 2 then - local dist = railtrack:get_distance(junc[1], junc[2]) - if dist > MAX_SECTION_LEN then - local node = minetest.get_node(pos) or {} - if node.name then - minetest.swap_node(pos, {name=node.name.."_union"}) - railtrack:update_rails(pos) - end - end - end - end - end -end - -function railtrack:is_railnode(pos) - local node = minetest.get_node(pos) - if node then - return minetest.get_item_group(node.name, "connect_to_raillike") > 0 - end -end - -function railtrack:get_sign(z) - if z == 0 then - return 0 - else - return z / math.abs(z) - end -end - -function railtrack:get_rotations(s_rots, dir) - local rots = {} - for i = 1, string.len(s_rots) do - local r = string.sub(s_rots, i, i) - local rot = nil - if r == "F" then - rot = {x=dir.x, z=dir.z} - elseif r == "L" then - rot = {x=-dir.z, z=dir.x} - elseif r == "R" then - rot = {x=dir.z, z=-dir.x} - elseif r == "B" then - rot = {x=-dir.x, z=-dir.z} - end - if rot then - table.insert(rots, rot) - end - end - return rots -end - -function railtrack:get_acceleration(pos) - local meta = minetest.get_meta(pos) - local accel = meta:get_string("acceleration") or "" - if accel ~= "" then - return tonumber(accel) - end -end - -function railtrack:get_direction(p1, p2) - local v = vector.subtract(p1, p2) - return { - x = railtrack:get_sign(v.x), - y = railtrack:get_sign(v.y), - z = railtrack:get_sign(v.z), - } -end - -function railtrack:get_distance(p1, p2) - local dx = p1.x - p2.x - local dz = p1.z - p2.z - return math.abs(dx) + math.abs(dz) -end - - -function railtrack:get_railtype(pos) - local node = minetest.get_node(pos) or {} - if node.name then - local ref = minetest.registered_items[node.name] or {} - return ref.railtype - end -end - -function railtrack:get_connection_type(pos, cons) - local railtype = railtrack:get_railtype(pos) - if #cons == 0 then - return "single" - elseif #cons == 1 then - return "junction" - elseif #cons == 2 then - if cons[1].x == cons[2].x or cons[1].z == cons[2].z then - if (cons[1].y == cons[2].y and cons[1].y == pos.y) or - (math.abs(cons[1].y - cons[2].y) == 2) then - if railtype == railtrack:get_railtype(cons[1]) and - railtype == railtrack:get_railtype(cons[2]) then - return "section" - end - end - end - end - return "junction" -end - -function railtrack:get_connections(pos) - local connections = {} - for y = 1, -1, -1 do - for x = -1, 1 do - for z = -1, 1 do - if math.abs(x) ~= math.abs(z) then - local p = vector.add(pos, {x=x, y=y, z=z}) - if railtrack:is_railnode(p) then - table.insert(connections, p) - end - end - end - end - end - return connections -end - -function railtrack:get_junctions(pos, last_pos, junctions) - junctions = junctions or {} - local cons = railtrack:get_connections(pos) - local contype = railtrack:get_connection_type(pos, cons) - if contype == "junction" then - table.insert(junctions, pos) - elseif contype == "section" then - if last_pos then - for i, p in pairs(cons) do - if vector.equals(p, last_pos) then - cons[i] = nil - end - end - end - for _, p in pairs(cons) do - railtrack:get_junctions(p, pos, junctions) - end - end - return junctions -end - -function railtrack:set_acceleration(pos, accel) - local meta = minetest.get_meta(pos) - local contype = meta:get_string("contype") - if contype == "section" then - local s_junc = meta:get_string("junctions") or "" - local junc = minetest.deserialize(s_junc) or {} - if #junc == 2 then - local p = vector.new(junc[2]) - local dir = railtrack:get_direction(junc[1], junc[2]) - local dist = railtrack:get_distance(junc[1], junc[2]) - for i = 0, dist do - local m = minetest.get_meta(p) - if m then - m:set_string("acceleration", tostring(accel)) - end - p = vector.add(dir, p) - end - end - else - meta:set_string("acceleration", tostring(accel)) - end -end - -function railtrack:update_rails(pos, last_pos, level) - local connections = {} - local junctions = {} - local meta = minetest.get_meta(pos) - local cons = railtrack:get_connections(pos) - local contype = railtrack:get_connection_type(pos, cons) - level = level or 0 - for i, p in pairs(cons) do - connections[i] = p - end - if contype == "junction" then - level = level + 1 - end - if contype == "section" or level < 2 then - if last_pos then - for i, p in pairs(cons) do - if vector.equals(p, last_pos) then - cons[i] = nil - end - end - end - for _, p in pairs(cons) do - railtrack:update_rails(p, pos, level) - end - end - if contype == "section" then - junctions = railtrack:get_junctions(pos) - connections = {} - end - meta:set_string("connections", minetest.serialize(connections)) - meta:set_string("junctions", minetest.serialize(junctions)) - meta:set_string("contype", contype) -end - diff --git a/games/default/files/railtrack/textures/carts_rail_brk.png b/games/default/files/railtrack/textures/carts_rail_brk.png deleted file mode 100644 index 93641296be5d2074b7ff1d1dba13e3427ed0dc01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmV;60d)R}P)rp=uFed%F#Qd3w;TAONBO`W?@R>pm=F)V8A9wr$(C{d>2wo9t|i zdd-vEnG6hIsU{M;t$v(#265aG#ATnT-)}bgFkTYMz(HHUM5+_*40PqVP#R}NTc!&g z*)BAvJJFEpL=&9{i@Xffr8pS)dW0_nCtX2~u+{9tT748AM`XN=D%ff9cIQ0QTxHPeZz1Up(XTy*V1C)J@T&54>MJL)O70Sp#;|5FXlx&@A~-VjYa z_G6_k3fnC{yicg~EDF1=J}g#8GO*X`H<89v2Llast>v$#%yr3j3{lqhEEk%o4vn-M zKvjb6KhtP` pTkF3*52dj-20j+!C_$Yt005Y0J2Zr!D`U~pmegjZXk$aXccCc5atrXObwWs+5QhRGgFVs^CU-R+>ad| z9lfjBa)HFM8E@%P9`el?Wj=;#0bcz7xLNx(K0{j?KHB1}Q^P_0woDLGQ&kl(OUAi8Kqc+sRFh8N86&KQtf zwTPo3gyu~YhzaP1DP%=(+uq9q;RPeEMWF2%gL6jQiuH1b7ojEsFDWumbzVpQYJW+M zV%yn^6W;(1JpILw0+->TG6tI^2AMUB`ij)!%O+&jt%|{+T#hc8DG(=v+Gy0~WtrvB zf(eg_x-n{hNSdE=-4tR{`;Mb5MtK)Mg^9W;X#Sml0rQB0t7KsSB>(^b07*qoM6N<$ Ef{0X~761SM diff --git a/games/default/files/railtrack/textures/carts_rail_crossing_pwr.png b/games/default/files/railtrack/textures/carts_rail_crossing_pwr.png deleted file mode 100644 index c9b3ba4053b07973bda7e42f3206bfc55ccec490..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 363 zcmV-x0hIoUP)vlL$IP1B-b0`=&C|L#$s0^Q?lpG5=?A7gqB#i=(IgFGQ z=vmi=up6iDgwe8^Z=C7T7^xDMqBhIlWld0@U#qu33nh}1Hvs;~D+9}6cdGyZ002ov JPDHLkV1m>%n*RU* diff --git a/games/default/files/railtrack/textures/carts_rail_crossing_sup.png b/games/default/files/railtrack/textures/carts_rail_crossing_sup.png deleted file mode 100644 index 468a0eb1d5e7a6f437a1ad34ca6ea49a98b38217..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 365 zcmV-z0h0cSP)nr!-^aGCJ!bCv zonhTL=jDHKazl}TEX&-;Mj|cI2Y4L@8h+uaZG@O}tUk3(!vHC7~@hmBCW@j5X+v`^NMbUtwq=BWzF!D`J^-s zcxZj~K;@oSSoIGr<9bqgkkjmB)N}wiE$hB}h<^3Z35j%&Gj%`T2}{(&Zbn`82>|No zVaQfePfI$8B@chw7`AocAGh#m47*hG^Bak8TfO|pz%u00!sGo3nu$i|&A66m00000 LNkvXXu0mjf<_)8* diff --git a/games/default/files/railtrack/textures/carts_rail_crossing_swt.png b/games/default/files/railtrack/textures/carts_rail_crossing_swt.png deleted file mode 100644 index c224fd2d20256b24fb96b71d4bc2872f1668a0fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357 zcmV-r0h<1aP)m z(fu0|L@kG>st3Sf-2PDZyw<&!Ip7vTy=XhmFQ4Tv1Yj#!u$RmfAvXXj|azIQ? z^P56zSq(SN@MyGFDL2R013zV*;qQ&lS)hdy$;lf4rHstSZjmG900000NkvXXu0mjf DkJFz3 diff --git a/games/default/files/railtrack/textures/carts_rail_curved_brk.png b/games/default/files/railtrack/textures/carts_rail_curved_brk.png deleted file mode 100644 index 5fa25ca2b2cf5d22c9dadffaf1a2c3951cc135db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmV-l0igbgP)m_l5O(}*|uH7Y}{wS`u+TUrZ+0=t+lnwZc(xu09^#wMw!w--|o-E;Yc3r1bSdwlceqZuU1I&^9>0);c|PD29EAl<8P$` zKg+shqw3js4({iRY(koSaglgc^9}I`ZdT!kFGoPAm1S7%NEX}nr|e{ZK_Ho~jmKhR x0wUX0_+ZO4Fx`?MIwcU;Ka%K9BluKqB?eC1?e(~s?%MzW002ovPDHLkV1i}QojL#j diff --git a/games/default/files/railtrack/textures/carts_rail_curved_pwr.png b/games/default/files/railtrack/textures/carts_rail_curved_pwr.png deleted file mode 100644 index 0bcd308991ea9114b8a5ac4e984a17c4c28c83c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmV-p0i6DcP)yKDWucnOLgXQ;*ECoxEH|BB z26YD9;La4yNjdr`5eLx#lmmufj<3v$8uR(3Cd+Hgfl@%TD?$~3vXH36?txrinG7$P zJU`jhb>_2+jUlQF17(5sqieuSc|dC+8s>mQ3;?-Kr#wf(PsjiO002ovPDHLkV1jhW Bk>mgX diff --git a/games/default/files/railtrack/textures/carts_rail_curved_sup.png b/games/default/files/railtrack/textures/carts_rail_curved_sup.png deleted file mode 100644 index 10902630824aad03e93c4de501b0cb3609faceff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmV-o0iFJdP)TBvOkj0y0 zm1h+hp{s_QT@WDGo31$#$<%@X*{S&kI5hy-CBgE|@#=F+j3H7*0dg??n5to*B2>OE zMs-FZ)Fr^M>dn*xvFc*fS`xJp8jwJ7kUY?Biz-Zk;yJ#uP|al_@(|T)8Y~u;o6awT zIsf&vOxRMHDIPZptTSUbHE`60LnVGE+Te<7ytkO07*qoM6N<$f;bb7 AcK`qY diff --git a/games/default/files/railtrack/textures/carts_rail_curved_swt.png b/games/default/files/railtrack/textures/carts_rail_curved_swt.png deleted file mode 100644 index 64bad36ae1ac39b2c5c2cdafb9a906c6ec29b1ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmV-k0iphhP)UK~CuuAyH-WH;(va^jyKC<@K%wM-ATba`(SwX_hF4hIwr$(CZ5(ndTbbDW z{a#zROaz3=DoTV41rv0*$bQ_L#9S%NRC!+~DFMZ>C)fHqMQe{?ti+DAG@Pq)9rh%& z1*BIS1HbdEG+(LnTo0#}f>8Hhp?$9-bkvi;{6Dds4J5S%{2ncFtTY7fMhW~KF0_L$ z6VzRwEOX4)`Ywmkyi;V~>xy&2e64@ADWVYY7%6r@-<~Ha`0mZKfy@cxr4FQj7ulx? z>S3HfTBvxdHFVsYkS!bvPzE#Dn`ix;Wgf=Jk69+uHz$_y7O^07*qoM6N<$f?0}~Gynhq diff --git a/games/default/files/railtrack/textures/carts_rail_pwr.png b/games/default/files/railtrack/textures/carts_rail_pwr.png deleted file mode 100644 index 04fecab106f04e84e948821d590768636ad9f909..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 390 zcmV;10eSw3P)O*tLI@kg4wRhjR@}`A=rxxPO>7nUkP%Dno1FD zNBJ!1)Dj4i4!T+OH)^Hhb~Vm3Ntq5>ug zL5JqwkJYdi;v%>%N)D1j$aTD}{5&T7JI4?zfR|Jr8%E>_c(@rMoU|<4% kBh{?@hrrkH`y(m60EUR$g%M3`W&i*H07*qoM6N<$f>TDF-v9sr diff --git a/games/default/files/railtrack/textures/carts_rail_sup.png b/games/default/files/railtrack/textures/carts_rail_sup.png deleted file mode 100644 index 600520128c0fc5e114780f94fe99568dbd752794..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcmV;20eJq2P)5Si&d(z>je?x*OMBs|wb( zqS|Y_wr$&dy`JPu(l~WA{Qg6D37_DH*H_QOas;zol^YS>K|-(>7o228aK94d4mFh` z*pBj9(5WR5Bpr0K>TlFa$L(~;O!D^#IDL}9q;x6`9-SkWD z2c+v^-f2d(8{?0*lp%N+lCmK0{f{7Gr8+c3*g{9Fbiz&tO;neT=rxcC3SQ2S)o_>+ zB3SZQZ%29aJymOA?$fYr$zQb*;m&kcBG`=ZSP(Fh2>eD83h2}kJ$j<(<-}}s$V3H9 z6oL-TzaOh%EyP7|U6dRog^=rbTlslTe4G}+b}jZ)A%J@pK&}WNvd`bay9?}002ovPDHLkV1mWAryc+R diff --git a/games/default/files/railtrack/textures/carts_rail_swt.png b/games/default/files/railtrack/textures/carts_rail_swt.png deleted file mode 100644 index 5a8563a67200fd8ab91b8eae39b86cdb4c5e2f8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmV-{0e=38P)oCFF z46z3riU8d732Bga<^u>Ai53OsH;@4%88MSy9nq%3IyE?ejFa(aIqb%`0Os7~>p|9Z zN7<5}dDkzRbC<0Im=mp~09FGm8hErg0Jj!L3AC!P4mFl_GD0TOrz1Q%0ziu*@6U2r z@-YFNX9YV^E{b)ysrWd>-;eXqbj@~@0YLXOK(PWq5yz~QS4YIHRMbMD4!E^My)+Mi ftL8s|&yDv3P&DndTjOlk00000NkvXXu0mjfV=kil diff --git a/games/default/files/railtrack/textures/carts_rail_t_junction_brk.png b/games/default/files/railtrack/textures/carts_rail_t_junction_brk.png deleted file mode 100644 index f7cbfef103910f16d76344807672782ebbdb0332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmV-u0hj)XP)rp=uET&^b9EM-T>4IOm9M`v|e^(%QDmv27=JeCw_q+w;G#{S_K1 ze#Et{509<^oSA!Zo;goVy|}dY;l$X3D{CJCjtt!(fPS))0FL=;L^tbUnyQ3vxfa%$ zD)?7wVV|ppcD#ZB#Zz_&C4$nEA0QL#F=vk_vkN>ezym*K3VGF>X&2iZm8^*WfQEAgF~ktg>cGP6QSES|Dj z*_?ssCMsc>sls1m1b5B>65HpiXq~KCu+CPYG=zIsKEyOkzD0f~HIi=t0000#q1X;Cjtji+dmK) zmmrXxm9^GY@d-(JQIVRGR+bc*8Chsli~u$smEat&28|V0zn-pvJ2993SFH#fAG z85b33Zs;h$pycM{pc~b##RWM6zwN+N$@@@r6B!6U0t|tJyT+BWSt&ytC?z#59jJ7hcf-jajP?Auc=E}300000NkvXX Hu0mjfSjUyP diff --git a/games/default/files/railtrack/textures/carts_rail_t_junction_sup.png b/games/default/files/railtrack/textures/carts_rail_t_junction_sup.png deleted file mode 100644 index 0d5e202a405148857458f277d240a0a89c3fe537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362 zcmV-w0hRuVP)V5<+)6V<6`y}BwO*oF@j`NiBC}zJ%IT1LB+Wvva zxCDXhtgN-Jicd(&i;C2gw6dhg%*aBcVg&Hw84~Dd4K6Cc7KLwc;h+MwRn2SJJBWfp zoiqg~%**h5&>jzfAN?KuZ!-Wo4=}*eGqSyq5!O^F07`yd-rLsS<=tEWWueN8^5%y2 zGUK8G%?%v|7#z7dIgE|Eti=U60>ACRQ_1^KbQ2laegqgc4!p*yGCnE!tot7d9;mUw zq~YQ!jl`rRJSIs_Nq?IDo17cdnOP}VJhhaXmJWt=n|Fiq2W4FrtybU0fB*mh07*qo IM6N<$g0;Y#v;Y7A diff --git a/games/default/files/railtrack/textures/carts_rail_t_junction_swt.png b/games/default/files/railtrack/textures/carts_rail_t_junction_swt.png deleted file mode 100644 index 1ac53b7e0fff5aeb9cb9f7d27cd97da7c337fe8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmV-h0i^zkP)=_CE3 z0AByVd)5kY5!ByBjmJLSiBEUr)tv?OhaT;DKo79**8Bt47z-dg!zru@yyL9o0xvMh zPA&36(;UYL69C5$Dy=oCWkZO5)s7a>HA>I;-U>1+qL-w(7DcEADBKESbDY-NdILOE zx1~RMTYpev!D-H}Lr!BlD4;Dm$E|EhZ==Ruprz@_1#W&_d=WCVg8aIq1=P04ESK8W zI;`<|F2GOG_Lwl=$Bm7KrXQfg#L>Up3g0`y`p8=EVo2Ze#`~r@1_RM7_`{@7x002ovPDHLkV1i>BoHYOd diff --git a/games/default/files/railtrack/textures/default_rail.png b/games/default/files/railtrack/textures/default_rail.png deleted file mode 100644 index 26fed02e4d613124407da7413b796ed034104f7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU1=6clt*Wc5D-4kB?Ce}t zWi~lS|K!P&vx|)?Lglx#TFx&u&hnOSh*s=O)k$=fWL|SaAE<}1B*-tA!Qt7BG$5zI z)5S4_<9c#}MiK*)I~$wc#GVTsc1L-6Y@9yp_U2yYm5^vr2nuLZVrI?`yuIpLZ5Ovh zMQcuvx_sIG0|ykCra1*pp1X0)*+ORK%@aO8oPDf|{XtN`?kkcK7B17?ar*}QBs>t= kv}I1t`yY%Md@fuJKOReZY@RFe6=*kur>mdKI;Vst07}+XIsgCw diff --git a/games/default/files/railtrack/textures/railtrack_fixer.png b/games/default/files/railtrack/textures/railtrack_fixer.png deleted file mode 100644 index fcf5273d54fb45c35271ff5870f092dc067032ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSj>;M1%J3Bj1o; zx-3tX13)Rpk|4ie28U-i(tsQjPZ!6Kid$1p?Br!IK-?sENE@p%glY?#Sg>18L! vxMaWXhmtjkQ;uEs+kM9D`?AwpWPUR^8ZmTDQDt!k>SyqD^>bP0l+XkKIvX?5 diff --git a/games/default/files/railtrack/textures/railtrack_inspector.png b/games/default/files/railtrack/textures/railtrack_inspector.png deleted file mode 100644 index cc0bc697de4d56a14f76c2337d832a4afc358a5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416 zcmV;R0bl-!P)YN=b6Xc27k+ zCj!R5tsd}pPWTt<{JAo-#gETDxMz2Gzpj_}S>i18YR%ngq5@Ar94T}C7T4eg;G1hj9!u=i9b&$60Ah!{vG#$zZrBP&iQ}ho+yu zg29p9CWiUTZBL~WZUU}SM-(h^+&Q)@d!^0}%shPs-Mt$S1myrY-GuyAAXta2#ilq= zyi>&=O@-dk8+!BItkb3hps^rfDtC0bmZpTVef3`f z9kuZAav*yB=kJ|Ae=h#|4O9w5Jyi{zsX9sSvN*M+r?=!3_M|2^K)CZujkmN~E~_#F zYGWV<6b8rwH2@J%C)^&wdVn@SEFnP;#BHSM0jh>-AQAwTLJ$C!S?k{xme(c#0000< KMNUMnLSTa8EVM%a