From f04f64aa8bee0f5f1388588d4aba89bcfa77e576 Mon Sep 17 00:00:00 2001 From: Lars Mueller Date: Thu, 26 Mar 2020 19:54:34 +0100 Subject: [PATCH] =?UTF-8?q?Initial=20release=20=F0=9F=A5=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 85 ++++ arena.lua | 712 ++++++++++++++++++++++++++++ chatcommands.lua | 694 +++++++++++++++++++++++++++ conf.lua | 39 ++ default_config.json | 41 ++ init.lua | 13 + main.lua | 498 +++++++++++++++++++ mod.conf | 6 + screenshot.png | Bin 0 -> 115159 bytes textures/cellestial_border.png | Bin 0 -> 131 bytes textures/cellestial_cell.png | Bin 0 -> 126 bytes textures/cellestial_edge.png | Bin 0 -> 120 bytes textures/cellestial_environment.png | Bin 0 -> 115 bytes textures/cellestial_fertility.png | Bin 0 -> 117 bytes textures/cellestial_fill.png | Bin 0 -> 117 bytes textures/cellestial_wand.png | Bin 0 -> 195 bytes 16 files changed, 2088 insertions(+) create mode 100644 Readme.md create mode 100644 arena.lua create mode 100644 chatcommands.lua create mode 100644 conf.lua create mode 100644 default_config.json create mode 100644 init.lua create mode 100644 main.lua create mode 100644 mod.conf create mode 100644 screenshot.png create mode 100644 textures/cellestial_border.png create mode 100644 textures/cellestial_cell.png create mode 100644 textures/cellestial_edge.png create mode 100644 textures/cellestial_environment.png create mode 100644 textures/cellestial_fertility.png create mode 100644 textures/cellestial_fill.png create mode 100644 textures/cellestial_wand.png diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..ce7f604 --- /dev/null +++ b/Readme.md @@ -0,0 +1,85 @@ +# 3D Cellular Automata (`cellestial`) + +An implementation of 3D Cellular Automata for Minetest. Resembles [Flux](https://forum.minetest.net/viewtopic.php?f=15&t=20498). + +## About + +Cellestial (**cell**-estial) is a mod implementing 3D Cellular Automata in Minetest. Media & code by Lars Mueller aka LMD or appguru(eu). Code licensed under the MIT license, media licensed as CC0. + +Part of the Cellestial Series: [`cellestial`](https://github.com/appgurueu/cellestial), [`cellestiall`](https://github.com/appgurueu/cellestiall) and [`cellestial_game`](https://github.com/appgurueu/cellestial_game) + +## Symbolic Representation + +![Screenshot](screenshot.png) + +## Features + +* High Performance +* Intuitive Interfaces +* Powerful API + +### Links + +* [GitHub](https://github.com/appgurueu/cellestial) +* [Discord](https://discordapp.com/invite/ysP74by) +* [ContentDB](https://content.minetest.net/packages/LMD/cellestial) +* [Minetest Forum](https://forum.minetest.net/viewtopic.php?f=9&t=24456) +* ["Candidates for the Game of Life in Three Dimensions" by Carter Bays](http://wpmedia.wolfram.com/uploads/sites/13/2018/02/01-3-1.pdf) + +## Instructions + +Available in-game through `/cells help`. + +## Configuration + +Below is the default configuration, located under `/config/cellestial.json`. It is mostly self-explaining. A few notes: + +* `r`, `g`, `b`: Red, green and blue color components +* `max_steps`: Maximum steps per item use / second +* `speedup`: Decrease processing time, but cache more +* `mapcache`: Cache the nodes of the area +* `arena_defaults`: Values used for arenas if not provided + +```json +{ + "colors": { + "cell": { + "edge": { + "r": 0, + "g": 128, + "b": 0 + }, + "fill": { + "r": 0, + "g": 255, + "b": 0 + } + }, + "border": { + "edge": { + "r": 51, + "g": 51, + "b": 51 + }, + "fill": { + "r": 77, + "g": 77, + "b": 77 + } + } + }, + "max_steps": 10, + "request_duration": 30, + "creative": true, + "place_inside_player": false, + "speedup": true, + "mapcache": false, + "arena_defaults": { + "name": "unnamed", + "dimension": {"x": 80, "y": 80, "z": 80}, + "search_origin": {"x": 0, "y": 0, "z": 0}, + "steps": 1, + "threshold": 0.5 + } +} +``` \ No newline at end of file diff --git a/arena.lua b/arena.lua new file mode 100644 index 0000000..15e300f --- /dev/null +++ b/arena.lua @@ -0,0 +1,712 @@ +local adv_chat = minetest.global_exists("adv_chat") and adv_chat +local speedup = cellestial.conf.speedup +local mapcache = cellestial.conf.mapcache +local c_cell = minetest.get_content_id("cellestial:cell") +local c_border = minetest.get_content_id("cellestial:border") +local c_air = minetest.CONTENT_AIR +local area_store = AreaStore() +local area_store_path = minetest.get_worldpath() .. "/data/cellestial.dat" +function load_store() + if modlib.file.exists(area_store_path) then + area_store:from_file(area_store_path) + end +end +load_store() +local delta = 0 +function store_store() + if delta > 0 then + area_store:to_file(area_store_path) + delta = 0 + end +end +modlib.minetest.register_globalstep(60, function() + if delta > 10 then + store_store() + end +end) +modlib.minetest.register_globalstep(600, store_store) +minetest.register_on_shutdown(store_store) +-- TODO use set_cell and the like for the performant step + +arenas = {} +function unload_arenas() + for id, arena in pairs(arenas) do + local owner_online = false + for _, owner in pairs(arena.meta.owners) do + if minetest.get_player_by_name(owner) then + owner_online = true + break + end + end + if not owner_online then + arenas[id] = nil + end + end +end +modlib.minetest.register_globalstep(60, unload_arenas) +simulating = {} +function calculate_offsets(voxelarea) + --[[ + Lua API: "Y stride and z stride of a flat array" + +x +1 + -x -1 + +y +ystride + -y -ystride + +z +zstride + -z -zstride + ]] + local ystride, zstride = voxelarea.ystride, voxelarea.zstride + local offsets = {} + for x = -1, 1, 1 do + for y = -ystride, ystride, ystride do + for z = -zstride, zstride, zstride do + local offset = x + y + z + if offset ~= 0 then + table.insert(offsets, offset) + end + end + end + end + return offsets +end + +function initialize_cells(self) + local cells = {} + self.cells = cells + for index, data in pairs(self.area) do + if data == c_cell then + cells[index] = true + end + end +end + +function read_from_map(self) + self.voxelmanip = minetest.get_voxel_manip(self.min, self.max) + local emin, emax = self.voxelmanip:read_from_map(self.min, self.max) + self.voxelarea = VoxelArea:new { MinEdge = emin, MaxEdge = emax } + self.offsets = calculate_offsets(self.voxelarea) + self.area = self.voxelmanip:get_data() +end + +function overlaps(min, max) + local areas = area_store:get_areas_in_area(min, max, true, true, false) + if not modlib.table.is_empty(areas) then + return true + end + return false +end + +function update(self) + read_from_map(self) + if speedup then + initialize_cells(self) + calculate_neighbors(self) + end + remove_area(self) +end + +function create_base(min, max) + local obj = { min = min, max = max } + update(obj) + return setmetatable(obj, { __index = getfenv(1), __call = getfenv(1) }) +end + +function create_role(self) + local role = "#" .. self.id + if adv_chat and not adv_chat.roles[role] then + adv_chat.register_role(role, { title = self.meta.name, color = cellestial.colors.cell.edge }) + for _, owner in pairs(self.meta.owners) do + if minetest.get_player_by_name(owner) then + adv_chat.add_role(owner, role) + end + end + end +end + +function new(min, max, meta) + local obj = create_base(min, max) + if not obj then + return obj + end + meta.name = meta.name or cellestial.conf.arena_defaults.name + obj.meta = meta + obj.id = store(obj) + create_role(obj) + modlib.table.foreach_value(meta.owners, modlib.func.curry(add_owner_to_meta, obj)) + arenas[obj.id] = obj + obj:reset() + store_store() + return obj +end + +function deserialize(self, data) + self.meta = minetest.parse_json(data) +end + +function load(id, min, max, data) + local obj = create_base(min, max) + obj.id = id + deserialize(obj, data) + arenas[id] = obj + create_role(obj) + return obj +end + +function create_from_area(area) + return load(area.id, area.min, area.max, area.data) +end + +function owner_info(self) + return table.concat(self.meta.owners, ", ") +end + +function info(self) + local dim = get_dim(self) + return ('Arena #%s "%s" by %s from (%s, %s, %s) to (%s, %s, %s) - %s wide, %s tall and %s long'):format( + self.id, + self.meta.name, + owner_info(self), + self.min.x, + self.min.y, + self.min.z, + self.max.x, + self.max.y, + self.max.z, + dim.x, + dim.y, + dim.z + ) +end + +function formspec_table_info(self) + local dim = get_dim(self) + return table.concat(modlib.table.map({ + cellestial.colors.cell.fill, + "#" .. self.id, + cellestial.colors.cell.edge, + self.meta.name, + "#FFFFFF", + owner_info(self), + table.concat({ self.min.x, self.min.y, self.min.z }, ", ") .. " - " .. table.concat({ self.max.x, self.max.y, self.max.z }, ", ") .. + " (" .. table.concat({ dim.x, dim.y, dim.z }, ", ") .. ")" + }, minetest.formspec_escape), ",") +end + +function serialize(self) + return minetest.write_json(self.meta) +end + +function store(self) + delta = delta + 1 + return area_store:insert_area(self.min, self.max, serialize(self), self.id) +end + +function is_owner(self, other_owner) + return modlib.table.contains(self.meta.owners, other_owner) +end + +function get_position(self, name) + if cellestial.is_cellestial(name) then + return 1 + end + return is_owner(self, name) +end + +function serialize_ids(ids) + return table.concat(ids, ",") +end + +function store_ids(meta, ids) + meta:set_string("cellestial_arena_ids", serialize_ids(ids)) +end + +function deserialize_ids(text) + return modlib.table.map(modlib.text.split(text, ","), tonumber) +end + +function load_ids(meta) + local ids = meta:get_string("cellestial_arena_ids") + return deserialize_ids(ids) +end + +function owner_action(func) + return function(self, name) + local player = minetest.get_player_by_name(name) + if not player then + return + end + local meta = player:get_meta() + local ids = load_ids(meta) + local index = modlib.table.binary_search(ids, self.id) + local err = func(self, ids, index) + if err ~= nil then + return err + end + store_ids(meta, ids) + return true + end +end + +add_owner_to_meta = owner_action( + function(self, ids, index) + if index > 0 then + return false + end + table.insert(ids, -index, self.id) + end +) +function add_owner(self, name, index) + local success = add_owner_to_meta(self, name) + if success == nil then + return + end + if adv_chat then + adv_chat.add_role(name, "#" .. self.id) + end + if not modlib.table.contains(self.meta.owners) then + table.insert(self.meta.owners, index or (#self.meta.owners + 1), name) + end + return success +end + +remove_owner_from_meta = owner_action( + function(self, ids, index) + if index < 1 then + return false + end + table.remove(ids, index) + end +) +function remove_owner(self, name) + local success = remove_owner_from_meta(self, name) + if success == nil then + return + end + if adv_chat then + adv_chat.remove_role(name, "#" .. self.id) + end + local owner_index = modlib.table.contains(self.meta.owners, name) + if owner_index then + table.remove(self.meta.owners, owner_index) + end +end + +function set_owners(self, owners) + local owner_set = modlib.table.set(owners) + local self_owner_set = modlib.table.set(self.owners) + local to_be_added = modlib.table.difference(owner_set, self_owner_set) + local to_be_removed = modlib.table.difference(self_owner_set, owner_set) + modlib.table.foreach_key(to_be_added, modlib.func.curry(add_owner, self)) + modlib.table.foreach_key(to_be_removed, modlib.func.curry(add_owner, self)) +end + +function get_dim(self) + return vector.subtract(self.max, self.min) +end + +function get_area(self) + if mapcache then + return self.area + end + read_from_map(self) + self.area = self.voxelmanip:get_data() + return self.area +end + +function get_area_temp(self) + if mapcache then + return self.area + end + return self.voxelmanip:get_data() +end + +function remove_area(self) + if not mapcache then + self.area = nil + end +end + +function set_area(self, min, dim) + local new_min = min or self.min + local new_max = self.max + if dim then + new_max = vector.add(new_min, dim) + end + local areas = area_store:get_areas_in_area(new_min, new_max, true, true) + areas[self.id] = nil + if modlib.table.is_empty(areas) then + self.min = new_min + self.max = new_max + update(self) + return true + end + return false +end + +function get(pos) + local areas = area_store:get_areas_for_pos(pos, true, true) + local id = next(areas) + if not id then + return + end + if next(areas, id) then + return + end + if arenas[id] then + return arenas[id] + end + local area = areas[id] + area.id = id + return create_from_area(area) +end + +local guaranteed_max = 128 +local cutoff_min_iteration = 4 +local cutoff_factor = 1.25 + +-- uses a monte-carlo like iterative tree level search +function create_free(meta, origin, dim) + dim = dim or modlib.table.copy(cellestial.conf.arena_defaults.dimension) + local visited_ids = {} + local current_level = { origin or modlib.table.copy(cellestial.conf.arena_defaults.search_origin) } + local iteration = 1 + local found_min + while true do + local new_level = {} + for _, min in pairs(current_level) do + local areas = area_store:get_areas_in_area(min, vector.add(min, dim), true, true, false) + if modlib.table.is_empty(areas) then + found_min = min + goto area_found + end + for id, area in pairs(modlib.table.shuffle(areas)) do + if not visited_ids[id] then + visited_ids[id] = true + end + for _, coord in pairs(modlib.table.shuffle({ "x", "y", "z" })) do + for _, new_value in pairs(modlib.table.shuffle({ area.min[coord] - dim[coord] - 1, area.max[coord] + 1 })) do + local new_min = modlib.table.copy(area.min) + new_min[coord] = new_value + if iteration <= cutoff_min_iteration or math.random() < 1 / math.pow(cutoff_factor, iteration - cutoff_min_iteration) then + table.insert(new_level, new_min) + if #new_level >= guaranteed_max then + goto next_level + end + end + end + end + end + end + :: next_level :: + modlib.table.shuffle(new_level) + current_level = new_level + iteration = iteration + 1 + end + :: area_found :: + local arena = new(found_min, vector.add(found_min, dim), meta) + return arena +end + +function get_by_id(id) + if arenas[id] then + return arenas[id] + end + local area = area_store:get_area(id, true, true) + if not area then + return + end + area.id = id + return create_from_area(area) +end + +function get_by_player(player) + return get(player:get_pos()) +end + +function get_by_name(name) + local player = minetest.get_player_by_name(name) + if not player then + return + end + return get_by_player(player) +end + +function list_ids_by_name(name) + local player = minetest.get_player_by_name(name) + if not player then + return + end + local arena_ids = load_ids(player:get_meta()) + return arena_ids +end + +function list_by_name(name) + local ids = list_ids_by_name(name) + if not ids then + return ids + end + return modlib.table.map(ids, get_by_id) +end + +function remove(self) + arenas[(type(self) == "table" and self.id) or self] = nil +end + +function get_cell(self, pos) + local index = self.voxelarea:indexp(pos) + if speedup then + return self.cells[index] == true + end + if self.area then + return self.area[index] == c_cell + end + return minetest.get_node(pos).name == "cellestial:cell" +end + +if speedup then + function __set_cell(self, index, cell) + local cell_or_nil = (cell or nil) + if self.cells[index] == cell_or_nil then + return true + end + self.cells[index] = cell_or_nil + local neighbors = self.neighbors + if cell then + neighbors[index] = neighbors[index] or 0 + end + local delta = (cell and 1) or -1 + for _, offset in pairs(self.offsets) do + local newindex = index + offset + neighbors[newindex] = (neighbors[newindex] or 0) + delta + end + end +end +-- does everything except setting the node +function _set_cell(self, pos, cell) + local index = self.voxelarea:indexp(pos) + if speedup then + if __set_cell(self, index, cell) then + return + end + else + if get_cell(self, pos) == (cell or false) then + return + end + end + if self.area then + self.area[index] = (cell and c_cell) or c_air + end + return true +end + +function set_cell(self, pos, cell) + if _set_cell(self, pos, cell) then + minetest.set_node(pos, { name = (cell and "cellestial:cell") or "air" }) + end +end + +function calculate_neighbors(self) + local cells = self.cells + local offsets = self.offsets + local neighbors = {} + self.neighbors = neighbors + for index, _ in pairs(cells) do + neighbors[index] = neighbors[index] or 0 + for _, offset in pairs(offsets) do + local new_index = index + offset + neighbors[new_index] = (neighbors[new_index] or 0) + 1 + end + end +end + +function apply_rules(self, rules) + local cells, area = self.cells, get_area(self) + local birth = rules.birth + local death = rules.death + local delta_cells = {} + for index, amount in pairs(self.neighbors) do + if cells[index] then + if death[amount] and area[index] == c_cell then + delta_cells[index] = false + end + elseif birth[amount] and area[index] == c_air then + delta_cells[index] = true + end + end + if birth[0] then + for index in iter_content(self) do + if not cells[index] then + delta_cells[index] = true + end + end + end + for index, cell in pairs(delta_cells) do + __set_cell(self, index, cell) + self.area[index] = (cell and c_cell) or c_air + end +end + +function write_to_map(self) + local vm = self.voxelmanip + vm:set_data(self.area) + vm:write_to_map() +end + +if speedup then + function next_step(self, rules) + apply_rules(self, rules) + write_to_map(self) + remove_area(self) + end +else + function next_step(self, rules) + local offsets = self.offsets + local birth = rules.birth + local death = rules.death + read_from_map(self) + local vm = self.voxelmanip + local data = vm:get_data() + local new_data = {} + for index, c_id in ipairs(data) do + new_data[index] = c_id + end + self.area = new_data + local min, max = self.min, self.max + for index in iter_content(self) do + local c_id = data[index] + local amount = 0 + for _, offset in pairs(offsets) do + if data[index + offset] == c_cell then + amount = amount + 1 + end + end + if c_id == c_cell then + if death[amount] then + c_id = c_air + end + elseif c_id == c_air and birth[amount] then + c_id = c_cell + end + new_data[index] = c_id + end + write_to_map(self) + end +end + +function iter_content(self) + return self.voxelarea:iter(self.min.x + 1, self.min.y + 1, self.min.z + 1, self.max.x - 1, self.max.y - 1, self.max.z - 1) +end + +function _clear(self) + for index in iter_content(self) do + self.area[index] = c_air + end + if speedup then + self.cells = {} + self.neighbors = {} + end +end + +function clear(self) + get_area(self) + _clear(self) + write_to_map(self) + remove_area(self) +end + +function reset(self) + local min, max = self.min, self.max + get_area(self) + _clear(self) + for coord = 1, 6 do + local coords = { min.x, min.y, min.z, max.x, max.y, max.z } + if coord > 3 then + coords[coord] = coords[coord - 3] + else + coords[coord] = coords[coord + 3] + end + for index in self.voxelarea:iter(unpack(coords)) do + self.area[index] = c_border + end + end + local light_data = self.voxelmanip:get_light_data() + for index in self.voxelarea:iter(min.x, min.y, min.z, max.x, max.y, max.z) do + light_data[index] = minetest.LIGHT_MAX + end + self.voxelmanip:set_light_data(light_data) + write_to_map(self) + remove_area(self) +end + +function randomize(self, threshold) + local rand = math.random(threshold) + local amount = (1 / math.sqrt(2 * math.pi)) * math.exp(-0.5 * rand * rand) + local min, max = self.min, self.max + self.cells = {} + for index in iter_content(self) do + if self.cells[index] then + self.area[index] = c_cell + else + self.area[index] = c_air + end + end +end + +function randomize_slow(self, threshold) + local min, max = self.min, self.max + self.cells = {} + for index in iter_content(self) do + if math.random() < threshold then + self.cells[index] = true + self.area[index] = c_cell + else + self.area[index] = c_air + end + end +end + +function next_steps(self, steps, rules) + for _ = 1, steps do + next_step(self, rules) + end +end + +function start(self, steps_per_second, rules) + simulating[self.id] = { arena = self, steps_per_second = steps_per_second, outstanding_steps = 0, rules = rules } +end + +function stop(self) + simulating[self.id] = nil +end + +function simulate(self, steps_per_second, rules) + if simulating[self.id] then + return stop(self) + end + return start(self, steps_per_second, rules) +end + +function teleport(self, player) + local area = get_area(self) + for index in iter_content(self) do + local c_id = area[index] + if c_id == c_air then + -- move to place with air + player:set_pos(vector.add(self.voxelarea:position(index), 0.5)) + return true + end + end + player:set_pos(vector.add(self.min, vector.divide(vector.subtract(self.max, self.min), 2))) -- move to center + return false +end + +minetest.register_globalstep( + function(dtime) + for _, sim in pairs(simulating) do + local outstanding_steps = sim.outstanding_steps + dtime * sim.steps_per_second + local steps = math.floor(outstanding_steps) + sim.arena:next_steps(steps, sim.rules) + sim.outstanding_steps = outstanding_steps - steps + end + end +) \ No newline at end of file diff --git a/chatcommands.lua b/chatcommands.lua new file mode 100644 index 0000000..e8d6586 --- /dev/null +++ b/chatcommands.lua @@ -0,0 +1,694 @@ +local function register_chatcommand(cmd, desc, func, param) + cmdlib.register_chatcommand( + "cells " .. cmd, + { + description = desc, + params = param, + func = function(name, params) + local arena = arena.get_by_name(name) + if not arena then + return false, "Not inside exactly one arena" + end + if not arena:is_owner(name) and not is_cellestial(name) then + return false, "Not an owner of the current arena" + end + return unpack({ func(arena, name, params) }) + end + } + ) +end +register_chatcommand( + "clear", + "Clear the current arena", + function(arena) + arena:clear() + return true, "Arena cleared" + end +) +register_chatcommand( + "update", + "Update the current arena", + function(arena) + arena:update() + return true, "Arena updated" + end +) +register_chatcommand( + "randomize", + "Randomize the current arena", + function(arena, _, params) + local threshold = conf.arena_defaults.threshold + if params.threshold then + threshold = tonumber(params.threshold) + if not threshold or threshold < 0 or threshold > 1 then + return false, "Threshold needs to be a number from 0 to 1" + end + end + arena:randomize(threshold) + return true, "Arena randomized" + end, + "[threshold]" +) +register_chatcommand( + "evolve", + "Evolve/simulate the cells inside the current arena", + function(arena, _, params) + local steps = conf.arena_defaults.steps + if params.steps then + steps = tonumber(params.steps) + if not steps or steps <= 0 or steps % 1 ~= 0 then + return false, "Steps need to be a positive integer number" + end + end + arena:next_steps(steps) + return true, "Simulated " .. steps .. " step" .. ((steps > 1 and "s") or "") + end, + "[steps]" +) +register_chatcommand( + "start", + "Start the simulation", + function(arena, _, params) + local steps_per_second = 1 + if params.steps_per_second then + steps_per_second = tonumber(params.steps_per_second) + if not steps_per_second or steps_per_second <= 0 then + return false, "Steps per second needs to be > 0" + end + end + arena:start(steps_per_second) + return true, "Started simulation with a speed of " .. steps_per_second .. " steps per second" + end, + "[steps_per_second]" +) +register_chatcommand( + "stop", + "Stop the simulation", + function(arena) + local s = arena:stop() + if not s then + return false, "Simulation not running" + end + return true, "Simulation stopped" + end +) +local assign = { + width_change = "x", + height_change = "y", + length_change = "z", + x_move = "x", + y_move = "y", + z_move = "z" +} +local human_names = { + width_change = "Width Change", + height_change = "Height Change", + length_change = "Length Change", + x_move = "X move", + y_move = "Y move", + z_move = "Z move" +} +local dim_human_names = { + width_change = "Width", + height_change = "Height", + length_change = "Length", + x_move = "X", + y_move = "Y", + z_move = "Z" +} +register_chatcommand( + "resize", + "Resize arena", + function(arena, _, params) + local dimensions = arena:get_dimensions() + for name, val in pairs(params) do + val = tonumber(val) + if not val or val % 1 ~= 0 then + return false, human_names[name] .. " needs to be an integer number" + end + local new_dim = dimensions[assign[name]] + val + if new_dim < 3 then + return false, dim_human_names[name] .. " needs to be at least 3 (as it includes the borders)" + end + dimensions[assign[name]] = new_dim + end + local s = arena:set_area(nil, dimensions) + if s then + return true, "Arena resized to " .. dimensions.x .. ", " .. dimensions.y .. ", " .. dimensions.z + end + return false, "Arena would collide with other arenas if resized" + end, + " [height_change] [length_change]" +) +register_chatcommand( + "move", + "Move arena", + function(arena, _, params) + local position = modlib.table.tablecopy(arena.min) + for name, val in pairs(params) do + val = tonumber(val) + if not val or val % 1 ~= 0 then + return false, human_names[name] .. " needs to be an integer number" + end + local new_dim = position[assign[name]] + val + position[assign[name]] = new_dim + end + local s = arena:set_area(position) + if s then + return true, "Arena moved to " .. position.x .. ", " .. position.y .. ", " .. position.z + end + return false, "Arena would collide with other arenas if moved" + end, + " [y_move] [z_move]" +) + +local function get_id(name, params) + local id = tonumber(params.id) + if not id or id % 1 ~= 0 or id < 0 then + return false, "ID needs to be a non-negative integer number" + end + local arena = arena.get_by_id(id) + if not arena then + return false, "No area with the ID #" .. params.id + end + return true, arena +end + +cmdlib.register_chatcommand( + "cells get id", + { + params = "", + description = "Get the arena with the corresponding ID", + func = function(name, params) + local success, arena = get_id(name, params) + if success then + return success, arena:info() + end + return success, arena + end + } +) + +cmdlib.register_chatcommand( + "cells teleport id", + { + params = "", + description = "Teleport to the arena with the corresponding ID", + func = function(name, params) + local success, arena = get_id(name, params) + if success then + local player = minetest.get_player_by_name(name) + if not player then + return false, "You need to be online to teleport" + end + if not arena:is_owner(name) then + return false, "Not an owner of the corresponding arena" + end + arena:teleport(player) + return success, "Teleporting to: " .. arena:info() + end + return success, arena + end + } +) + +cmdlib.register_chatcommand( + "cells get player", + { + params = "[name]", + description = "Get the arena the player is currently in", + func = function(name, params) + local arena = arena.get_by_name(params.name or name) + if not arena then + return false, "Not inside an arena" + end + return true, arena:info() + end + } +) + +local function get_pos(params) + local vector = {} + for _, param in ipairs({ "x", "y", "z" }) do + vector[param] = tonumber(params[param]) + if not vector[param] then + return false, param.upper() .. " needs to be a valid number" + end + end + local arena = arena.get(params) + if not arena then + return false, "Not inside an arena" + end + return true, arena, vector +end + +cmdlib.register_chatcommand( + "cells get pos", + { + params = " ", + description = "Get the arena at position", + func = function(_, params) + local success, arena = get_pos(params) + if success then + return success, arena:info() + end + return success, arena + end + } +) + +cmdlib.register_chatcommand( + "cells teleport pos", + { + params = " ", + description = "Teleport to the position", + func = function(name, params) + local success, arena, vector = get_pos(params) + if success then + local player = minetest.get_player_by_name(name) + if not player then + return false, "You need to be online to teleport" + end + if not arena:get_position(name) then + return false, "Not an owner of the arena" + end + player:set_pos(vector) + return success, ("Teleporting to (%s, %s, %s)"):format(vector) + end + return success, arena + end + } +) + +local function create_teleport_request(name, arena, property, value) + if teleport_requests[name] then + return false, "You already have a running request" + end + if arena:get_position(name) then + return false, "No need for a teleport request" + end + local sent_to = {} + local timers = {} + for _, owner in ipairs(arena.meta.owners) do + owner_ref = minetest.get_player_by_name(owner) + if owner_ref then + table.insert(sent_to, owner) + minetest.chat_send_player(owner, "Player " .. minetest.get_color_escape_sequence(colors.cell.fill) .. name .. " " .. + minetest.get_color_escape_sequence("#FFFFFF") .. " requests to teleport to (%s, %s, %s).") + timers[owner] = hud_timers.add_timer(owner, { name = name .. "'s request", duration = request_duration, color = colors.cell.fill:sub(2) }) + end + end + if #sent_to == 0 then + return false, ("No owner (none of %s) online"):format(arena:owner_info()) + end + local timer = hud_timers.add_timer(name, { name = "Teleport", duration = request_duration, color = colors.cell.edge:sub(2), on_complete = modlib.func.curry(remove_teleport_request, name) }) + local request = { timer = timer, timers = timers, [property] = value } + for _, owner in pairs(sent_to) do + teleport_requests_last[owner] = request + end + teleport_requests[name] = request + return true, "Teleport request sent to " .. table.concat(sent_to, ", ") +end + +request_duration = 30 +teleport_requests = {} +teleport_requests_last = {} + +local function remove_request_receivers(name) + local request = teleport_requests[name] + for owner_name, timer in pairs(request.timers) do + hud_timers.remove_timer_by_reference(owner_name, timer) + local last_requests = teleport_requests_last[owner_name] + local index = modlib.table.find(last_requests, name) + if index then + table.remove(last_requests, index) + end + end +end + +local function remove_teleport_request(name) + remove_request_receivers(name) + teleport_requests[name] = nil +end + +minetest.register_on_joinplayer(function(player) + teleport_requests_last[player:get_player_name()] = {} +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + local request = teleport_requests[name] + if request then + remove_teleport_request(name, request) + end + local last_requests = teleport_requests_last[name] + if last_requests then + for _, requester_name in pairs(teleport_requests_last) do + local request = teleport_requests[requester_name] + if request then + request.timers[name] = nil + if modlib.table.is_empty(request.timers) then + remove_teleport_request(requester_name) + end + end + end + teleport_requests_last[name] = nil + end +end) + +cmdlib.register_chatcommand( + "cells teleport request pos", + { + params = " ", + description = "Send teleport request to owners of the arena", + func = function(name, params) + local success, arena, vector = get_pos(params) + if success then + local player = minetest.get_player_by_name(name) + if not player then + return false, "You need to be online to teleport" + end + return unpack({create_teleport_request(name, arena, "pos", vector)}) + end + return success, arena + end + } +) + +cmdlib.register_chatcommand( + "cells teleport request id", + { + params = "", + description = "Send teleport request to owners of the arena", + func = function(name, params) + local id = tonumber(params.id) + if not id or id % 1 ~= 0 or id < 0 then + return false, "ID needs to be a non-negative integer number" + end + local arena = arena.get_by_id(id) + if not arena then + return false, "No arena with the ID #"..id + end + return unpack({create_teleport_request(name, arena, "id", id)}) + end + } +) + +cmdlib.register_chatcommand( + "cells teleport request player", + { + params = "", + description = "Send teleport request to player", + func = function(name, params) + local player = minetest.get_player_by_name(name) + if not player then + return false, "You need to be online to teleport" + end + if teleport_requests[name] then + return false, "You already have a running request" + end + local target = minetest.get_player_by_name(params.name) + if not target then + return false, "Player "..params.name.." is not online" + end + local request = { + name = params.name, + timer = hud_timers.add_timer(name, { name = "Teleport", duration = request_duration, color = colors.cell.edge:sub(2), on_complete = modlib.func.curry(remove_teleport_request, name) }), + timers = { [params.name] = hud_timers.add_timer(params.name, { name = name .. "'s request", duration = request_duration, color = colors.cell.fill:sub(2) }) }, + } + teleport_requests[name] = request + table.insert(teleport_requests_last[params.name], name) + end + } +) + +cmdlib.register_chatcommand( + "cells teleport accept", + { + params = "[name]", + description = "Accept teleport request of player or last request", + func = function(name, params) + local requester_name = params.name + if not requester_name then + requester_name = teleport_requests_last[name] + if not requester_name then + return false, "No outstanding last request" + end + end + local request = teleport_requests[params.name] + if params.name then + request = teleport_requests[params.name] + if not request or not request.timers[name] then + return false, "No outstanding request by player " .. params.name + end + else + request = teleport_requests_last[name] + if not request then + return false, "No outstanding last request" + end + end + remove_teleport_request(requester_name) + local pos, message + if request.pos then + pos = request.pos + message = ("Player %s teleported to %s, %s, %s"):format(requester_name, tonumber(request.pos.x), tonumber(request.pos.y), tonumber(request.pos.z)) + elseif request.name then + pos = minetest.get_player_by_name(request.name):get_pos() + message = ("Player %s teleported to %s"):format(requester_name, request.name) + else + arena.get_by_id(request.id):teleport(requester_name) + return true, ("Player %s teleported to %s"):format(requester_name, request.name) + end + minetest.get_player_by_name(requester_name):set_pos(pos) + return true, message + end + } +) + +function create_arena(sendername, params, nums) + for _, param in ipairs({ "x", "y", "z", "width", "height", "length" }) do + if not nums[param] then + local number = tonumber(params[param]) + if not number or number % 1 ~= 0 then + return false, modlib.text.upper_first(param) .. " needs to be a valid integer number" + end + nums[param] = number + end + end + for _, param in ipairs({ "width", "height", "length" }) do + if nums[param] < 3 then + return false, modlib.text.upper_first(param) .. " needs to be positive and at least 3" + end + end + local name = params.name + local owners = params.owners or { sendername } + for _, owner in ipairs(owners) do + if not minetest.get_player_by_name(owner) then + return false, "Player " .. owner .. " is not online. All owners need to be online." + end + end + local min = { x = nums.x, y = nums.y, z = nums.z } + local max = { x = nums.x + nums.width, y = nums.y + nums.height, z = nums.z + nums.length } + if arena.overlaps(min, max) then + return false, "Selected area intersects with existing arenas" + end + local arena = arena.new(min, max, { name = name, owners = owners }) + arena:teleport(minetest.get_player_by_name(owners[1])) + if arena then + return true, "Arena created" + end + return false, "Failed to create arena, would intersect with other arenas" +end + +cmdlib.register_chatcommand( + "cells create there", + { + params = " [name] {owners}", + description = "Create a new arena", + func = function(sendername, params) + return unpack({ create_arena(sendername, params, {}) }) + end + } +) + +cmdlib.register_chatcommand( + "cells create here", + { + params = " [name] {owners}", + description = "Create a new arena", + func = function(sendername, params) + local player = minetest.get_player_by_name(sendername) + if not player then + return false, "You need to be online in-game to use the command." + end + return unpack({ create_arena(sendername, params, vector.floor(player:get_pos())) }) + end + } +) + +cmdlib.register_chatcommand( + "cells arenas list", + { + params = "[name]", + description = "Lists all arenas of a player", + func = function(sendername, params) + local name = sendername or params.name + local ids = arena.list_by_name(name) + if not ids then + return false, "Player " .. name .. " is not online." + end + if #ids == 0 then + return true, "Player " .. name .. " does not have any arenas." + end + modlib.table.map(ids, arena.info) + table.insert(ids, 1, "Player " .. name .. " owns the following arenas:") + return true, table.concat(ids, "\n") + end + } +) + +function show_arenas_formspec(sendername, name) + local ids = arena.list_by_name(name) or {} + modlib.table.map(ids, arena.formspec_table_info) + local table_height = math.min(3, #ids * 0.35) + local message, fs_table + if #ids == 0 then + message = "Player " .. name .. " does not have any arenas." + fs_table = "" + table_height = 0.25 + else + message = "Player " .. name .. " owns the following arenas (double-click to teleport):" + fs_table = ([[ +tablecolumns[color;text,align=inline;color;text,align=inline;color;text,align=inline;text,align=inline] +tableoptions[background=#00000000;highlight=#00000000;border=false] +table[0.15,1.6;7.6,%s;arenas;%s] +]]):format(table_height, table.concat(ids, ",")) + table_height = table_height + 0.25 + end + minetest.show_formspec(sendername, "cellestial:arenas", + ([[ +size[8,%s] +real_coordinates[true] +box[0,0;8,1;%s] +label[0.25,0.5;Arenas of player] +field[2,0.25;2,0.5;player;;%s] +field_close_on_enter[player;false] +button[4.25,0.25;1,0.5;show;Show] +label[0.25,1.35;%s] +%simage_button_exit[7.25,0.25;0.5,0.5;cmdlib_cross.png;close;] +]]):format(table_height + 1.5, colors.cell.fill, minetest.formspec_escape(name), minetest.formspec_escape(message), fs_table)) +end + +cmdlib.register_chatcommand( + "cells arenas show", + { + params = "[name]", + description = "Shows all arenas of a player", + func = function(sendername, params) + show_arenas_formspec(sendername, params.name or sendername) + return true + end + } +) + +modlib.minetest.register_form_listener("cellestial:arenas", function(player, fields) + if fields.quit then + return + end + + local name + if fields.player then + -- not using key_enter_field + name = fields.player + end + if not name or name:len() == 0 then + name = player:get_player_name() + end + if fields.arenas then + local event = minetest.explode_table_event(fields.arenas) + if event.type == "DCL" then + local id = arena.list_ids_by_name(name)[event.row] + if id then + local arena = arena.get_by_id(id) + if arena:get_position(player:get_player_name()) then + arena:teleport(player) + else + create_teleport_request(player:get_player_name(), arena, "id", id) + end + end + end + end + show_arenas_formspec(player:get_player_name(), name) +end) + +cmdlib.register_chatcommand( + "cells help", + { + description = "Shows help", + func = function(name, _) + show_help(name) + end + } +) + +register_chatcommand( + "owner add", + "Add owner to the current arena", + function(arena, name, param) + local param_name = param.name or name + local namepos = arena:is_owner(name) + if not namepos and minetest.check_player_privs(name, { cellestial = true }) then + namepos = 1 + end + local position + if param.position then + position = tonumber(param.position) + if not position or position % 1 ~= 0 or position < namepos or position > #arena.meta.owners + 1 then + return false, "Position needs to be an integer number between " .. namepos .. " (your position) and " .. #arena.meta.owners + 1 + end + end + local success = arena:add_owner(name, position) + if success == false then + return false, "Player " .. param_name .. " is not online" + end + return true, "Added player " .. param_name .. " to arena #" .. arena.id .. ", owners now: " .. table.concat(arena.meta.owners, ", ") + end, + "[name] [position]" +) + +register_chatcommand( + "owner remove", + "Remove owner from current arena", + function(arena, name, param) + local param_name = param.name or name + local namepos = arena:is_owner(name) + if not namepos and minetest.check_player_privs(name, { cellestial = true }) then + namepos = 1 + end + if namepos > arena:is_owner(param_name) then + return false, "Player " .. param_name .. " is in a higher position" + end + local success = arena:remove_owner(param_name) + if success == false then + return false, "Player " .. param_name .. " is not online" + end + return true, "Removed player " .. param_name .. " from arena #" .. arena.id .. ", owners now: " .. table.concat(arena.meta.owners, ", ") + end, + "[name]" +) + +register_chatcommand( + "set_name", + "Set name of current arena", + function(arena, name, params) + local namepos = arena:is_owner(name) + if namepos > 1 then + return false, "Only the first owner can change the name." + end + local oldname = arena.meta.name + arena.meta.name = params.name + arena:store() + return true, ('Name changed from "%s" to "%s"'):format(oldname, arena.meta.name) + end, + "" +) \ No newline at end of file diff --git a/conf.lua b/conf.lua new file mode 100644 index 0000000..6de21dd --- /dev/null +++ b/conf.lua @@ -0,0 +1,39 @@ +local int = function(value) if value % 1 ~= 0 then return "Integer instead of float expected." end end +local pos_int = { type = "number", range = { 1 }, func = int } +local component = { type = "number", range = {0, 255}, func = int } +local color = { type = "table", children = {r = component, g = component, b = component} } +local node_colors = { fill = color, edge = color } +local vector = { type = "table", children = { x = pos_int, y = pos_int, z = pos_int } } +local conf_spec = { + type = "table", + children = { + colors = { + type = "table", + children = { + cell = node_colors, + border = node_colors + } + }, + max_steps = pos_int, + request_duration = pos_int, + arena_defaults = { + name = { type = "string" }, + dimension = vector, + search_origin = vector, + steps = pos_int, + threshold = { type = "number", range = {0, 1} } + }, + creative = { type = "boolean" }, + speedup = { type = "boolean" }, + mapcache = { type = "boolean" }, + place_inside_player = { type = "boolean" } + } +} + +conf = modlib.conf.import("cellestial", conf_spec) + +for _, colors in pairs(conf.colors) do + for prop, color in pairs(colors) do + colors[prop] = ("#%02X%02X%02X"):format(color.r, color.g, color.b) + end +end \ No newline at end of file diff --git a/default_config.json b/default_config.json new file mode 100644 index 0000000..2041047 --- /dev/null +++ b/default_config.json @@ -0,0 +1,41 @@ +{ + "colors": { + "cell": { + "edge": { + "r": 0, + "g": 128, + "b": 0 + }, + "fill": { + "r": 0, + "g": 255, + "b": 0 + } + }, + "border": { + "edge": { + "r": 51, + "g": 51, + "b": 51 + }, + "fill": { + "r": 77, + "g": 77, + "b": 77 + } + } + }, + "max_steps": 10, + "request_duration": 30, + "creative": true, + "place_inside_player": false, + "speedup": true, + "mapcache": false, + "arena_defaults": { + "name": "unnamed", + "dimension": {"x": 80, "y": 80, "z": 80}, + "search_origin": {"x": 0, "y": 0, "z": 0}, + "steps": 1, + "threshold": 0.5 + } +} \ No newline at end of file diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..b553c6f --- /dev/null +++ b/init.lua @@ -0,0 +1,13 @@ +if not minetest.features.area_store_persistent_ids then + error("Cellestial requires persistent area store IDs, upgrade to Minetest 5.1 or newer") +end +cellestial = {} -- to stop Minetest complaining about undeclared globals... +modlib.mod.extend("cellestial", "conf") +local cellestiall_init = modlib.mod.get_resource("cellestiall", "init.lua") +if cellestiall and modlib.file.exists(cellestiall_init) then + dofile(cellestiall_init) +end +modlib.mod.extend("cellestial", "main") +cellestial.arena = modlib.mod.loadfile_exports(modlib.mod.get_resource("cellestial", "arena.lua")) +modlib.mod.extend("cellestial", "chatcommands") +cellestiall.after_cellestial_loaded() \ No newline at end of file diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..7aee31f --- /dev/null +++ b/main.lua @@ -0,0 +1,498 @@ +minetest.register_privilege("cellestial", { + description = "Can manage cellestial arenas", + give_to_admin = true, + give_to_singleplayer = true +}) +function is_cellestial(name) + return minetest.check_player_privs(name, { cellestial = true }) +end +local creative = conf.creative +arenas = {} +colors = conf.colors +function add_area(params) + table.insert(arenas, arena.new(params)) +end + +function get_tile(name) + return "cellestial_fill.png^[multiply:" .. colors[name].fill .. "^(cellestial_edge.png^[multiply:" .. colors[name].edge .. ")" +end +local border = get_tile("border") +local cell = get_tile("cell") +local max_steps = conf.max_steps + +local ces = minetest.get_color_escape_sequence +local _help_content = { + 2, 1, "About", + 1, 2, 'A mod made by LMD aka appguru(eu)', + 2, 1, "Automata", + 1, 2, 'Cellular automata work using simple principles:', + 1, 2, '- the world is made out of cells, which are dead or alive', + 1, 2, '- based on their neighbors, cells die or new ones are born', + 2, 1, "Instructions", + 1, 2, [[How to simulate cellular automata using Cellestial. +Remember that you can open this dialog using "/cells help".]], + 3, 2, "Chat", + 1, 3, [[The chat is where you talk with others and send commands. +Start your message with @name to send it to a player. +Use @#id to send it to all owners of the arena.]], + 3, 2, "Commands", + 1, 3, + [[Use chatcommands to manage your arena and simulation. +Send "/help cells" in chat to see further help.]], + 3, 2, "Arenas", + 1, 3, + [[Arenas are areas delimited by undestructible borders. +Only their owners can modify them.]], + 3, 2, "Cells", + 1, 3, "Cells live in your arenas. You can place & dig them at any time.", + 3, 2, "Wand", + 1, 3, + [[A powerful tool controlling the simulation. +Right-click to configure, left-click to apply. +Possible modes / actions are: +- Advance: Simulates steps +- Simulate: Starts / stops simulation, steps per second +- Place: Living cell ray, steps are length +- Dig: Dead cell ray, steps are length +Rules work as follows: +- Short notation: As described by Bayes. Uses base 27. +- Neighbors: Numbers signify the amount of neighbors.]], +} +for i = 1, #_help_content, 3 do + _help_content[i] = ({ "#FFFFFF", colors.cell.fill, colors.cell.edge })[_help_content[i]] +end +local help_content = {} +for i = 1, #_help_content, 3 do + local parts = modlib.text.split(_help_content[i + 2], "\n") + for _, part in ipairs(parts) do + table.insert(help_content, _help_content[i]) + table.insert(help_content, _help_content[i + 1]) + table.insert(help_content, minetest.formspec_escape(part)) + end +end +help_formspec = ([[ +size[8,5] +real_coordinates[true] +box[0,0;8,1;%s] +label[0.25,0.35;%sCellestial%s - cellular automata for Minetest] +label[0.25,0.7;%shttps://appgurueu.github.io/cellestial] +tablecolumns[color;tree;text] +tableoptions[background=#00000000;highlight=#00000000;border=false;opendepth=2] +table[-0.15,1.25;7.9,3.5;help;%s] +image_button_exit[7.25,0.25;0.5,0.5;cmdlib_cross.png;close;] +]]):format(colors.cell.fill, ces(colors.cell.edge), ces("#FFFFFF"), ces(colors.cell.edge), table.concat(help_content, ",")) + +function show_help(name) + minetest.show_formspec(name, "cellestial:help", help_formspec) +end + +-- Almost indestructible borders +minetest.register_node("cellestial:border", { + description = "Arena Border", + post_effect_color = colors.border.fill, + sunlight_propagates = true, + light_source = minetest.LIGHT_MAX, + tiles = { border }, + groups = { not_in_creative_inventory = 1 }, + can_dig = function() + return false + end, + on_dig = function() + end, + on_place = function() + end, + on_use = function() + end, + on_secondary_use = function() + end +}) +-- Cells, item can be used for digging & placing +minetest.register_node("cellestial:cell", { + description = "Cell", + post_effect_color = colors.cell.fill, + sunlight_propagates = true, + light_source = minetest.LIGHT_MAX, + tiles = { cell }, + groups = { oddly_breakable_by_hand = 3 }, + range = (creative and 20) or 4, + on_dig = function(pos, node, digger) + if minetest.is_protected(pos, digger:get_player_name()) then + return + end + local arena = arena.get(pos) + if arena and arena:is_owner(digger:get_player_name()) then + arena:set_cell(pos) + else + minetest.set_node(pos, { name = "air" }) + end + if not creative then + local leftover = digger:get_inventory():add_item("main", "cellestial:cell") + if leftover then + minetest.add_item(pos, leftover) + end + end + end, + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + if not conf.place_inside_player then + for _, player in pairs(minetest.get_connected_players()) do + local ppos = player:get_pos() + ppos.y = ppos.y + player:get_properties().eye_height + if ppos.x >= pos.x and ppos.y >= pos.y and ppos.z >= pos.z and ppos.x <= pos.x +1 and ppos.y <= pos.y + 1 and ppos.z <= pos.z + 1 then + return itemstack + end + end + end + if minetest.is_protected(pos, placer:get_player_name()) then + return + end + local arena = arena.get(pos) + if arena and arena:is_owner(placer:get_player_name()) then + arena:set_cell(pos, true) + else + minetest.set_node(pos, { name = "cellestial:cell" }) + end + if not creative then + itemstack:take_item() + return itemstack + end + end +}) +local serialized_modes = { advance = "a", simulate = "s", place = "p", dig = "d" } +local function serialize_rule(rule) + local number = 0 + for i = 26, 0, -1 do + number = number * 2 + if rule[i] then + number = number + 1 + end + end + return modlib.number.tostring(number, 36) +end +function serialize_wand(wand, meta) + meta:set_string("mode", serialized_modes[wand.mode]) + meta:set_string("steps", modlib.number.tostring(wand.steps, 36)) + meta:set_string("death", serialize_rule(wand.rule.death)) + meta:set_string("birth", serialize_rule(wand.rule.birth)) +end +local deserialized_modes = modlib.table.flip(serialized_modes) +local function deserialize_rule(text) + local number = tonumber(text, 36) + local rule = {} + for i = 0, 26 do + local digit = math.floor(number % 2) + rule[i] = digit == 1 + number = math.floor(number / 2) + end + return rule +end +function deserialize_mode(meta) + return deserialized_modes[meta:get("mode")] +end +function deserialize_steps(meta) + return tonumber(meta:get("steps"), 36) +end +function deserialize_full_rule(meta) + return { death = deserialize_rule(meta:get("death")), birth = deserialize_rule(meta:get("birth")) } +end +function deserialize_wand(meta) + return { + mode = deserialize_mode(meta), + steps = deserialize_steps(meta), + rule = deserialize_full_rule(meta) + } +end +local c0, ca, cA = ("0"):byte(), ("a"):byte(), ("A"):byte() +function read_rule(text) + if text:len() ~= 4 then + return nil + end + local nums = { text:byte(1), text:byte(2), text:byte(3), text:byte(4) } + for i, num in pairs(nums) do + if num >= ca then + num = num - ca + 10 + elseif num >= cA then + num = num - cA + 10 + else + num = num - c0 + end + if num < 0 or num > 26 then + return nil + end + nums[i] = num + end + if nums[1] > nums[2] or nums[3] > nums[4] then + return nil + end + local min_env, max_env, min_birth, max_birth = unpack(nums) + local rule = { death = {}, birth = {} } + for i = 0, 26 do + rule.death[i] = not (i >= min_env and i <= max_env) + rule.birth[i] = i >= min_birth and i <= max_birth + end + return rule +end +local dfunc = modlib.number.default_digit_function +function find_rule(rule) + local death, birth = rule.death, rule.birth + -- Finding min. env. and max. env + local min_env, max_env + local i = 0 + while i <= 26 and death[i] do + i = i + 1 + end + min_env = i + while i <= 26 and not death[i + 1] do + i = i + 1 + end + max_env = i + for i = max_env + 1, 26 do + if not death[i] then + return + end + end + -- Finding min. birth and max. birth + local min_birth, max_birth + i = 0 + while i <= 26 and not birth[i] do + i = i + 1 + end + min_birth = i + while i <= 26 and birth[i + 1] do + i = i + 1 + end + max_birth = i + for i = max_birth + 1, 26 do + if birth[i] then + return + end + end + return dfunc(min_env) .. dfunc(max_env) .. dfunc(min_birth) .. dfunc(max_birth) +end +local default_wand = { + mode = "advance", + steps = 1, + rule = read_rule("5766") +} +local ray_steps = 10 +function ray_function(cell) + return function(steps, player, arena) + local eye_offset = player:get_eye_offset() + eye_offset.y = eye_offset.y + player:get_properties().eye_height + local lookdir = player:get_look_dir() + local start = vector.add(vector.add(player:get_pos(), eye_offset), lookdir) + local step = vector.multiply(lookdir, 1 / ray_steps) + local set = {} + local set_count = 0 + local pos = start + for _ = 1, ray_steps * steps * math.sqrt(3) do + local rounded = vector.round(pos) + local min, max = arena.min, arena.max + if rounded.x <= min.x or rounded.y <= min.y or rounded.z <= min.z or rounded.x >= max.x or rounded.y >= max.y or rounded.z >= max.z then + break + end + local index = arena.voxelarea:indexp(rounded) + if not set[index] then + set[index] = true + arena:set_cell(rounded, cell) + set_count = set_count + 1 + if set_count == steps then + break + end + end + pos = vector.add(pos, step) + end + end +end +actions = { + advance = function(steps, _, arena, meta) + arena:next_steps(steps, deserialize_full_rule(meta)) + end, + simulate = function(steps, _, arena, meta) + arena:simulate(steps, deserialize_full_rule(meta)) + end, + place = ray_function(true), + dig = ray_function() +} +function show_wand_formspec(name, wand) + local function get_image(n) + if wand.rule.death[n] then + if wand.rule.birth[n] then + return "cellestial_fertility.png" + end + return "cellestial_border.png" + else + if wand.rule.birth[n] then + return "cellestial_cell.png" + end + return "cellestial_environment.png" + end + end + local neighbor_buttons = { + "image_button[5.25,1.25;0.5,0.5;" .. get_image(0) .. ";n0;0;false;false]", + "image_button[6.25,1.25;0.5,0.5;" .. get_image(1) .. ";n1;1;false;false]", + "image_button[7.25,1.25;0.5,0.5;" .. get_image(2) .. ";n2;2;false;false]" + } + for y = 0, 2 do + for x = 0, 7 do + local n = y * 8 + x + 3 + local t = get_image(n) + table.insert(neighbor_buttons, ("image_button[%s,%s;0.5,0.5;%s;n%d;%d;false;false]"):format(tostring(0.25 + x * 1), tostring(2 + y * 0.75), t, n, n)) + end + end + neighbor_buttons = table.concat(neighbor_buttons, "\n") + minetest.show_formspec(name, "cellestial:wand", + ([[ +size[8,5] +real_coordinates[true] +box[0,0;8,1;%s] +label[0.25,0.5;Mode:] +dropdown[1,0.25;1.5,0.5;mode;Advance,Simulate,Place,Dig;%d] +label[2.75,0.5;Steps:] +button[3.5,0.25;0.5,0.5;steps_minus;-] +field[4,0.25;0.75,0.5;steps;;%d] +field_close_on_enter[steps;false] +button[4.75,0.25;0.5,0.5;steps_plus;+] +button[5.75,0.25;1,0.5;apply;Apply] +image_button_exit[7.25,0.25;0.5,0.5;cmdlib_cross.png;close;] +label[0.25,1.5;Rule:] +field[1,1.25;1,0.5;rule;;%s] +button[2.25,1.25;1,0.5;set;Set] +label[3.75,1.5;Neighbors:] +%s +image[0.25,4.25;0.5,0.5;cellestial_border.png] +label[1,4.5;Death] +image[2.25,4.25;0.5,0.5;cellestial_environment.png] +label[3,4.5;Survival] +image[4.25,4.25;0.5,0.5;cellestial_fertility.png] +label[5,4.5;Birth] +image[6.25,4.25;0.5,0.5;cellestial_cell.png] +label[7,4.5;Both] +]]):format(colors.cell.fill, ({ advance = 1, simulate = 2, place = 3, dig = 4 })[wand.mode], wand.steps, find_rule(wand.rule) or "", neighbor_buttons)) +end + +function ensure_wand(meta) + if not meta:get("mode") or not meta:get("steps") or not meta:get("death") or not meta:get("birth") then + serialize_wand(default_wand, meta) + return true + end +end + +function obtain_wand(meta) + local wand + if ensure_wand(meta) then + wand = modlib.table.tablecopy(default_wand) + else + wand = deserialize_wand(meta) + end + return wand +end + +function wand_on_secondary_use(itemstack, user, pointed_thing) + local name = user:get_player_name() + local meta = itemstack:get_meta() + show_wand_formspec(name, obtain_wand(meta)) + return itemstack +end + +-- Wand +minetest.register_tool("cellestial:wand", { + description = "Cellestial Wand", + inventory_image = "cellestial_wand.png", + on_use = function(itemstack, user, pointed_thing) + local name = user:get_player_name() + local arena = arena.get_by_name(name) + if arena and arena:is_owner(name) then + local meta = itemstack:get_meta() + ensure_wand(meta) + local mode = deserialize_mode(meta) + actions[mode](deserialize_steps(meta), user, arena, meta) + end + return itemstack + end, + on_secondary_use = wand_on_secondary_use, + on_place = wand_on_secondary_use +}) +modlib.minetest.register_form_listener("cellestial:wand", function(player, fields) + if fields.quit then + return + end + + local wielded_item = player:get_wielded_item() + local meta = wielded_item:get_meta() + local wand = obtain_wand(meta) + if fields.steps then + local steps = tonumber(fields.steps) + if steps then + wand.steps = steps + end + end + if fields.mode then + local lower = fields.mode:lower() + if serialized_modes[lower] then + wand.mode = lower + end + end + if fields.apply then + local arena = arena.get_by_player(player) + if arena and arena:is_owner(player:get_player_name()) then + actions[wand.mode](wand.steps, player, arena, meta) + end + elseif fields.set or fields.key_enter_field == "rule" then + local rule = read_rule(fields.rule) + if rule then + wand.rule = rule + end + elseif fields.steps_minus then + wand.steps = wand.steps - 1 + elseif fields.steps_plus then + wand.steps = wand.steps + 1 + else + for field, _ in pairs(fields) do + if modlib.text.starts_with(field, "n") then + local n = tonumber(field:sub(2)) + if n then + if wand.rule.birth[n] then + if wand.rule.death[n] then + wand.rule.death[n] = false + else + wand.rule.death[n] = true + wand.rule.birth[n] = false + end + else + if wand.rule.death[n] then + wand.rule.death[n] = false + else + wand.rule.death[n] = true + wand.rule.birth[n] = true + end + end + end + break + end + end + end + wand.steps = math.max(1, math.min(wand.steps, max_steps)) + serialize_wand(wand, meta) + player:set_wielded_item(wielded_item) + if not fields.close then + show_wand_formspec(player:get_player_name(), wand) + end +end) + +local adv_chat = minetest.global_exists("adv_chat") and adv_chat + +minetest.register_on_joinplayer(function(player) + arena.get(player:get_pos()) + local name = player:get_player_name() + for _, id in pairs(arena.list_ids_by_name(name)) do + local role = "#" .. id + if adv_chat and adv_chat.roles[role] then + adv_chat.add_role(name, role) + end + end +end) + +if adv_chat then + adv_chat.roles.minetest.color = colors.cell.fill +end \ No newline at end of file diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..494383c --- /dev/null +++ b/mod.conf @@ -0,0 +1,6 @@ +name = cellestial +title = Cellular Automata +description = Simulates 3D cellular automata +depends = modlib, cmdlib, hud_timers +optional_depends = adv_chat, cellestiall +author = LMD aka appguru(eu) diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..95c175039242e471639cb4148fa10abcc3aeeb82 GIT binary patch literal 115159 zcmaI7WmH>T6EGTRfl^$GyE_z$YjJmiyA?=q2wG_I;uI+bN^y4*T#IXQNRU$8Tip55 z=Uv~uKki!htehlgw#^>fvuDqV(biPLc}ejS007{qD9h^t02pEbz_aTYs7MG02Y3|# zpaZDLzt#84K3ut(*&GPoxp8ABdz+w@IbJY~=D0v)EqI9`(fwJ5 zMj3!fmw3g=(W=8n%z>r+{oB1h&<1jUP0di>^_2fEfu_SGw}rbSTZLGcZATyZO~~#@ z7?CPJk||Hmob1V>qpZ^M|5KQk{gxS7rSM;s|4&PD;|XCdvoA?;ZrC%0x>+;*1J7%v zq}WjCr0)$d0XMI|A#QBnf8`P`7OdWyMD5nwcl>beA%-N8_TMYk&rHK9xeft-Zw4jJYN-Nw1I^_Mm=x@Z} z%ajeu-3uii&*vcb}$PO5fW3HsOlj%a)sQ9Ar zVSvzE&!~4gq6mE8%Uu z_25<^vXR05CzgQZQFf}g4yD=A=~`Rr-yz)Tir6o&ku?E;T7Fp!z|bp4KQe-a^axuT zCwg?W`@iN$zJwCQkns^=OpQdl{P>=XJ=PaPgX~FWcnCiaa^UK;UFKB@y3d75+m--0yN|2SxsAX)|tkNHCI zUu~bMc{BhZJXN()UG#@)Q8tnkeN|iUu;%6dbpx=G`zMIN6lAd%n~(LC701Pg|AzRl zYF}tG2_V!%*U3wF;+HNv$A2@LRxrbocbwXG;Q-tI8~VRl(qXpQ4!(Ce;Qxp2ziZe0 ze*zx*8~k1)qOj&%MwE4CRONqS-~F4#?)jbr4pje>switgb~j4fgxxXKpSMJAwv!Or2zDJyfoT}r8 zTHU1+0N^{D9S#7dfc>e_jM#LJ$%T#Rj+*V|Ye@j0<@ey7j863156tb>2dDscdLVlG zkGy}=o{bBkJTrg62jqy-t;zl$1M%DRDY9iYMN&iQL{dp!8JejrDA2vYW&U^nBa90J zdPE<|Lh(m*3H;|#gh)sd20shnMMSfZqn$PKvHQ85Iv|O>Q%7cVmP6Gn_K1L!(NkYX zKB0>r#R^wyhCq~`MLvP!(@>F-0^=ta#x>-6!4!Uu^7ogU1d@jLg=AsH4EfFT(eo_7 z-;(~5IXbuJIMEo!WZIRB8}Jv&ODNGqj;u&{$bIH>I!&gFerJfJ2N))j606{VfrJBu z?5z8378qakLG9@qp8bOWWJFWc_HAQa_VA3je1q#2FOU^TIk&r_0F{w?Z;{W;$~^dQ z*$!`Q>JCT=)&BAMrMxblUEH&Fqr(6IV4JR*I!e>J|2KmEUw7Tx@3PZFEh_rUkwbIy zQL6-FUZSMPovR9_QDq)(5OK2Ru#0NE^S<7CnYpAUt|{o_lXJP*of7Xe~N12u}J zeSlCmi5@!1ueUQZ*BkPTb5IeHNP#^q-f0kpopeEQI*>thc>yPQi|64a> zgoU{pslNd2HvvB}29e`g)yHp`ynjVWmG!3iMVG^WCL4eHaww9I^HnAcQ6 zWk?cJ1tH1vqIdh(XX0eW>Wf}~e3>y3C1eXaLhpL41Q3Cd322AyH+)aTcH-@ms+AL! zwpZV!6Asb{^;x0<7<#T~dzhzmSNW@p0#HyqWKh)9etS^^0CBxL;`sPW4EXZi9WFPu z*vAW#;+Da^$x@-N;Oo8!A$|J zZ_GIqH2zsVI=MnM=2&U--jT&Se*{ zUs~$O*>uO(IKLz|JTdtSX0|=C)nI~!_Ow)C0jxCeK<1%3QZOGB{1+=dsspRMA|#mr;Hqo8xw58sz)x)3jKJt>kabO9$R_rG_uu-^{X^kzA>Q9qyZ=q#w~XfAjX47z z&1&HKxDyj2FV)k;yn@WU=BMlw(#I`G!h6|QJS^EG9!-@4^#8B&6iumcuQvA!eB zO*B7650!-l?kVVt7VQAuq$%07A-FAZ`$kG4?Y1K})<&S0A%*wB*_+d3~kR~0u!Rg}3bA62r@s@slf^o(GEK^J>G z2AsXi409tTAYe#xuczf;Dsi*_M+s!d;)72+)Mtj5(`u0sXe9@jqz4aKY^|n@K_y=;IkW ztPy**cfwsaYim5Zb1`5EdSwSEVqK!zAO6>!2Z4h$n4J?Zeh$-GT#G8x>n5fH)Cbn_ zh#AtGeb1InGPJKgsmGQV>WE$d<@As1?dZ1qfaT@Cn+DiMRg(4UA%FKwANMYqfm)55 zF*s;+tgp{aP-`3CiE{_2mX;1pD{wA!g@054ES+LXHTJ=z^a#EJq9X&OepeKx{2dPW zn0p579jP^l?5$(7)YNe&I-_NY_TXRw-Ebf(| z7ojg4*EA87YV|>G$#%PXzhjzkPLnDgOSBEBR{^P^cI1HiCTFv(pZ=nG`4r6O1g>2B zt93I68PENZI<5^q_a#CM^7uEF3r&J3nTvId6m}`9SybiKEFxiv9=03>poZWEyCLU5 zi0BBQk1@}oOh>j(Mpgmsm+jpu6f>uXh{GAET!25)LO$8i;B```M)N9$wH{5DkA@CR z?IyNJp|{Y3P~*+a!k?Mn?%dkz`y(z`lcKlY=wXNbPu9k zK#e9~G}+hmZe5b{9WKySf?;iHAQ5v~2lVXIwAuOby(C0b`a3}3Xb;D4c+dgezX?^- z^?03ShxrvQNP5sNa==aS#wwKHQW%z3s>Vm+bF#R1p;q6FEmq{<20AcAs=_sM zB7ZqosQpcXj7f}O-77*wBUzh*@EI550>z-1V-wO5Vv6X&#~0Ss?CYNYdBg&fO=L}V zA8D17#}!MPY?q>0_)S^Sv~;8l60q7g5Ko<>aL;-DoeA?HJ2{`{!+#(8iTnXy9O2(4 zfE$zblB?oA-#yAu!g%pZ70_n~8t`KB9ECI;O;@;wT5oiNfs?#WMv}J9M(VAW^ak?3 z%zuxzNS|Hi2cY2iVDYN>F6O9SbZDb1$M&o(T(eBHMbFNTu#Xf^jST*U2^RA;We(Re zHibIjh-nsBQVIxFt|VSyInS|^RZ#F&7Pa+t9ZrJ~A_Sg+w?mahljBCbe<(xFk7-@U zgw_vOf|+2$f5)8>{ms#4b;<_-z|dlPhYQgyBjZFq#b>1OytGq@(V^+u9NQqx&3lMr zTG?t^q-J19w9K}(JZTn%iN=6$i|wJ*cXzzFL5%gg85w)AXLwFXe})2GuG=9l1pfr- z7ra*?$9VIUC%SY3h9Tk>JXKVN+y##2_5#6x0)+4RWxWRivvtDK*YjH z0@6$IOxKof5s9Ukn;VFBA*dVcecSgPj0o_hr#eWOsE~O7H}g2@qrA@0&|3_IfY*Ev z^qS>QP)UGI#W-k(xOUD)SggXQTCIG<6U1}A)D$7n^$R1^rZ01zyx({>{5@`pwoZX8 z(vN++GPU>fypP#2IzOpt_#*wb{S6^PK77o%t-^g34PX~#b z#-2%#?Kq+*#7bIq*-tnlRA$tF6rkBM0x)A6 zBq<#cwB0ZvQA>ga2j&T_3=!#=A7?HOtf9h$_%T%+k&=YZ-3oy_Oii)T60hB!n_{17 z7M)vU+Pt`1j^QR)6k~CO8aym>*0hg6ZxN0pys9e|6nqI7-(wrLUO95U>V}C}wh%1X zP!8CJRw!Dr?+kDqzPr^R6V`U(n@nu{=7*6-7Wxb}^&w02GZEs^i@?laeAszB(5wo3 zD=19Xr(bM{IJB49n^3v5)Sa21n(CT45Y$@L5g5pxlf&R~?|&!i_?{yDGlW*6U0X};b6JtiYspCp#Rg@KGNaZdc; zZ3k5oCl-+tn$l4xkQE+V1=i&OyY5dPb+_1a*4wC_X4Cq771SJ|m%Nwtt3Izdv1P z9MRN3!HW9bWSz!UP8)X;O}plDHdsvY%>c}phSro14j`l(ILnHy_8{E9XjZx`s_#|P z^v%^q?OklCKMmU4+x}vys631N@kT6l#0_72*5^fvT+K(px#&vYX)kW^qSWAi2(}FW z3zQ`Ma?Utl!XY{KI-sD(hG27|wxx;|?nzE=SD>i{&)Tth>q<^>Rh+H?YFVCBM$V2T za$|9@%W*mP$ZYenGIk)`a3!`eKCW;zaD}C&aqhT~g6D z;35YY^YYX(g*Gmg0jw|?)OPVjn{M;s%#pnVx3u@EVB+1()(K6}-DE^>_8jbUac1?7 zYImg&@2pW}j4#e_`A4*UndiQA#m=!efj@N99nrg9fk8GEjz*i74cw`7z=56g?78{UIsj144sRbYU-=9>lCD>W zG%H_;QoiRlrb-~{H{a4r%SpfTS!a+js+UO9S~hmKs09kzBB3zuUDCPsXmv3N0g3Z5xveW6Sg0E zU(W=i3F5_NDPFNYK@q!O)+rjBbw~C?GxqvK2%wff)yjgJnNNntvoEvHV{+Cn@|HBB zK~5^=_{q=p0ClKP=%R|j5tk*mbMr9paWDNl8frS#eWB_4Kfn`9SIc5-UQM}OQ-!?m zifE34yf0k+%nMpVD`8mpR03xWkYdHG&&_WYcX*YMW6{MF`k`P?T*xzL%|%HA#4C08 z?McNZt1VTIsA7X55YZ8ko;Ca9WlWV*4jK!Lz#fVLxj2ZkKZ=25x7^gYy}~qG|A2jX z()C48tIUt$@Na6Ll59~?DV9n_<1T%*;OO24_v>MwO?5HcKU_i6Cmxt-gXf#C%2P`Z z_F~%#80;GK>irp076LI#Q@S25PC74W_pI88Cp)X*Hfqc;hB-}3r%0Po=ZcfAy}$|7 z9j5Q5V@-c0%@bzUvN&LgZ<-jRCup?( zJMp7Z)Kdz^npktxm++WL7BQYR>9dul#|=a|3uEwBTJXk46V;*>NRh!a6wsB zk_*FeHQv1<$z{2)izP|j@<20_tC0?L+=-^A-BI2yyKL#}oDXf&B!A;b&rtFz>##Vo-&9u*&SGM97QPY?OV)V}Ye4#haMo>H;5m2((o$ZouVb)YGO3=SNiwzNk)9%>D92TK>lz!I-i zn<8XrimY!Dy10ln*wx@e&@0NS8)F9Zd5t>q9aH}VSCCf!Sy@^jB~GUqeMhdv=q}%| zLk2n0u9>EJ9*l!Z;wKrqKMlEd%*bcW9jCS($w8y)ukA1ZsbFZXD-0bN zzxt$Vh83WIyu#7ck^qdu0q7&VfaS~yb_lD4 znRTo}znQzx8o{*JJ=hIFQEb+o;i_5MI?QEA;>;E()ofq&s9F8ErK?6G`D4@7J?QXrivW&X~CA|?klm#x@kYZape9&f4Y@fzZ3yUZ=``av9GC}d$2H9pAp98f3_7N!pl&suBsbd z1j?MXj6VFT&hZGLXZRQOVI0>i>z~i4UC3TtD<+QRV?o<5eUVGtq9sp=2|k%gNH7;x zQrqHNxEhsP$9?%bFZ0|QADfY0e}%SV&~k?_N6bVvWb?Vw34C5OIi$_*27sljU}Ya} zdFJukZH#`Aub2JZDLN2lZ5dR2bw^%qPYv6yDc0-+k*K&&`OBuAAR_PIYUqM3JP+z z{54uR8NDoU5(GM6cy2JbwU4(r_o;BM)HR&cIzmn+&A)YjqLvE{P?rZ4r!B*(tuN9t zbLoQ`DZ4suZlYI1%_UWQre`I`$UbMMxrepQ!jbbS}A z+7g%IjTf&4Awmq{#Rs-Q6hz<5ZZN>VOPY<4b^c}MX-eAP9Ts$zz{rlsKUnfTTF_se{b5WMMgyhTpgA<^{k$*xrv z`;Kc>Yiude#jc(X&K*%*MfFI9+VkE#Oi@c$^8|d{!G$0yOHp>=YQcO@+kCGHB?trS zS0PMo59R zKr8doY{zw}Z>8DFqw$XJ(oPpJ6gJl^h!v`C(u9=Ewbei>u6hf{Z|(E>d4ASVcBsl~ z0793PU+pmZZK|JBAVb;z^w*oVcY;Rk5HPwp z;EcSY=fC)t-P^Ri>Q%AU0z`5xFbYQc)qP(;)dmskDm*FtaK^5b*ju{H>lva~%eZoo zI48F>!R`)n^YwC;_P!8qxrlToLM*fi?(eKbU+%2t9Zd_bNW!xNhP5(rpI?>3@-M}t zZOmU%YFDVvWzE#c1$4p7`MDyAsgB2d6Z~UTZ=Y0y9KXyKA_Q`%P-F#Pe0cLrRxmUg zq=Q3-O^*`v)4`@>8U7PUO}XyFJa|(n#P@M^Nr*5ZNHwwayqSYAA-Wu5eEIfodl~V{ zJV-{c?jf7GD4xFVBF;NdfRUEw?NzOl!=`~`gU+`=pE6;k+2iyCOr{ckoUrebzRiAD zYnOkOa@~s|7rEL>FB~fp z{tfDz9S6#DINDH}sutnK{Za;*rr8Ii@@GY)ow=%MfTU}-8U}cpvKI1h-FG|MZZDm> zUeZ1rq@!O3G(E|UbU7#-BIs3V(>P6Xh$L2t%F z<#P3km?P3db}&d1d?FN4Yw&pyrqr~tHtu%CE?y)>B7yf|#GjOCR+51hd|WO#QtwaA zNT0OG((gUhJR#-d05!Pc5nHBYuG3H)rSktCftyDmBVURhZ{-0-r%dhg;hSn%SHPaF zBXB)P_*6^e-+@`q6CISdXHv=vtMh?%APDt?#d5yyOEH(WR#L*HxaueTMmv0eKXUN4 zzOpU2ZsxCIg(Z9-_}wD2wgN{~uI)KWjF1eIl64dqT~FIEra779mY%dk%FCGGUVUHS zdvPQ%8&b6SV0kRArGt*60F?#nGvM5!*8TZ{U#nO>7gywP{Ixsxm62_7zR0b}PKML~s4 z*Q5@(boDzXeDoi|WhHu|*}Ip}$^fF3*_tP|{CuB6YBId_)6tsQZQmz*>1W-j{O<~F zQ?dDRIKZCKE}v6-hHXw3#kx2wW9vlUz~X1OVS~^*g7>A^@9vnBd2evuwfQ@m3Rdgx zgv_TX_6sS06bsrJ>l4xsYiW!%|jmwXv28)F8xGAy0Qi(xs8BjGo!7mHsz!{YDu+=~S(d?Y9rmC>unQX^Gk zH?^J4v~A2rn_f<_Gku_#vuG_sK()W3fG?Vz-DMCKDQ#f0IT*ckMO^&%t5P2(V@|!O zddX?(kxTENc_1v1rr~AV{`p<1lMfZ5=Gv!fZU%9IhjI}NoxAobju8}#Jii0~vt|(0# zDd$-!C$zOF8%ZyYx?fBmnHb&Wd1BV{#s>KZ*|a^uk$1yv1*}ri|i(=-WA4 zqBOE4iQYvIrdQyFLE{k$OIZLL5WP+jeVtG-ZyL_Eh?MSl+%GtnAH+oOnBmKpB*|Bh zK}CG#y4IiPuc;7&z7G>H+QzXf6_D*ND6mF%d$p!_t}mU%CQ&Qu?VhXf#`*Zj7%j)E zUlq2k^OxH-z#D0+uj~xDSC6f|ux+1RIR^Dz!-+fs)vUg+L}E-j+h6NUbG#j2)j%^Bu~%$aZ%Nh6U-DuhYs8v z$V+#8i_G5yK1$+T95)@LK3UjXg)^@F^zGG#6$$dqod{{N&A^VnPlnX+H>|8!(h^PV z3qw!a#w#U4ipR@>SB*O`+zx_lJ!<$RcfQ(wsoB^30tsfe8M=cj#dnpRO!iVBPp}?J zy-xJgL*gsOMxEz`!n($i>#)C?Q`tn5N09-6W@cG$(Z+whse^FUbVjG09jkYoUk0cD zgvEn8h3Z|7SPYr&LZ_FsbDkpdc1Mz@tCyB8E$mxK%_Zyqs5!d1udU3g-z%4iu94AB zh@p2t=MX(9c&i|-%zK6Y{6VJ^-$dXe^8AV5wQW|9!Ae`yTm@k!!k{6Vn;d2IqEGRp zXX3%4-_NXYy4vh($-0SJKRP}Ty$6*){jGEAJUvX_2^kD>0?QX*mwWd93;L=Y1AE4V z3vpTQrMZ~U(p6gppv*O^-A|h4NDa<1@K!HBCA**l(ebJL! zi7m--`Ty1`HAfb4-|TSAi$U|p+sl%4*7s8<%n}Fpp70c^scpCMM}a3ZeU07AFZ?Ap z3#XTyci~5ZK_qf)+th_hjYkC*8@Pt>F8lAcB1t3^zc@$f8s82~i_upC;Y9%p#n6@y z{WwAl%W@2djazFK-U7tTjRrFnbz$_2Da%{=lhR;W)2ZnS(FdH1K3~kM=w(}#8mbuX zah0eM{;J9Lx=ii6#qyXVU|!YV;#+~eij13&5c_YJt#6kr)E9iD5^!NRj!-c*GRKoR z(P~TX;e~1Swx0Iy=Pu2i+4XH4M{B6sZeV4{Q0*7Oz=1uiBvcGJ!1ihTbg=sX;EJWF z#QI1{Bh=^ZW)Dj@#T;}#eUpa*UcR4cd5%>J4+$1q=kaJOVfS@oLnzs()aR2F+E=l_ z@B-}WZ84f~Ed0-IfG?r${`TRcMlU?T?bBk1GaN_tngP6JO}wCB zr+9dT+ceE>GXM9Zu(Q_rYA=O)>AL4~mQ``dZoUAw?mDEbAH?R zu9(|+iFNGYCo2b}-|wlEzj#E~E$X1UAi&b+mH%M*J5_)^gPDb~2`i#em2!ExS*U6} z1L!1>^fY{hj22Tr##>C%6PTPhwJu$vH+KAdZd9`EQzgiQFVuZYlq@|ZWXOD4^s@tZ zVYt>r${I-Tq`cKGew{?4XI3+IQ>U9jLyQhs%?dxS~gv>NbaZph$O!{^|K-5@G-ayH%ZORCqERt$P}9vk{MF5ySBiqH%P7b3@Lp+>8|%-H5{2O~fiUMayS(5w{pC12E`b~Y`CtI)y-(o0>+9?HM6^?qt-=#@xFl?@w%MKgcROSW z#D6vb9ofRrQPbs`vFYAB1t(SM!4-bP8-?D$QhO5HGT!0dc$YxAgTjVz;Hdjr{j~KM z^g{7PWM@s1l;ApNtWf8e-D)T=WN;;ky z=YIE%c}w^>^yZASg2`CGjaEmftso1GIo=hzu;s<{Ds9MTBxOHsP}7uQL9~D&90we~ zrq1Mnh-R-?X_Psrzl2|DO0h>m@lA*r?$jZ>fsRHBE|g?8j-?zDYV?L>Mf@ zm@RZXeqpnoXJkl>o3sv2S;kr^nZyRW?2pwb<~j!3O>4s<-f&a9&E%*xFZfq^Hg%jX z7OWZ{g|8Eww}q`&b}rI>T~&huadQ3rU`_Cp81Uy;z?HWBg3MEKi$+`+L$zkMS4|LF z(|6O(oYFX=Bb%q~{*bjbQ7@@}U4e4j`pH|=3_O|N{})qkAc+t;)>@lT)xMfj#%G{Y znCM=|=AzL^i2n27ObBN%-hrqzP!CZ2wRajH^bhv-3X6@<_A%tQj1lTJsf<~-J&2vZ2Fwz0%6(em% zw`-VE`RZD&+h3&hL|i(uVtTYbtKKx_2)DDNCoxFifCGkb+cwXpal-L%oo8?hL=HQHbe+5jQ2_iF(vp+@ z{xNSFQzz#M3hk|gjoB_SR0%LR4%BeFrP;&J*e_Nff-}gNl__UM&T`H@p1K zw&dXBU5L@oBlcYwEPZ_Apgw-tnTUy)Mw23DSlU_jq+Zbddx5`1_Pp5_npO{OzgtPa zB)z|MWjOUYi4eZmw0Uiy0CdqEbk~ZFUSCNZd70+u?+`J-RY}!JN+eJmg~hr(*CTD9 zC%n8hGWvzH0jK{LGVD!&4BGpxRjF+XH18pL64c0&`d+VpUdg* zgaq4h2|fvNEVi0rf=ifT3c($(g;=H&`yfIy(gwcs#)13?v{SeV@A*U&=UpCe5!7?+eH&d#G#C?+p`Osf8~FH=J!a83H>m82r;7s>NA6dAEPEz)0o4 zoljV^vNjxJLU8sv#&0h(KBO!~A+xD_|91WQ%c+}tE&7f%VH}8$DY}R4WmEW9p zUN1(j3$6JZCY2y$8d6m(enMT2m*=Y3P9v#eQPb@h(k~LV;Qgb=yc&?dmn1^(i9>kW zT9Ci$a240|ae28X{YO-qU&UgdFGcW={hQ)_NSc$a4W&@jMJAd0rPe#Iz5>;QgUruk z@W%@eJ3oRf7NfFO$Q;_sA?KaU%YwUOAvabrr;Jvk6TzHB2REyY=hWzVIX@v9dg1(# zkI|5=H+{?GxhgMYuu_4_NDm6dN&~rwaX1J)-!IXkBz$W*MgTAOlHYSM9W<@DsDM_D zr@QCyF`I$g1qJ+aGH=8vCSiG?1}zXZN(DGzLhU|*zbe7@Zq|gLsvx7fK=o=>lM*hb z3uiuE8aXE%Kt!eP-Ks@P7TrsUS7k}=L2``2FsD%zL&Bo%0HWXeYwEuGhej`QX+|zU z8x2Q9$NlGqAQHcc&f?{(u`!N;_K8m*M5x}sHf};8I(=7s%7@7X+@W*#D-YZ z>e$H@IuTHcj_3)GqhkoSV4xsRgMeiDSj$U+J5*!h5|>jqkOet{_5o#4yy?S znei$Irwple$~nG&tP-x@>3XaXOm8{1z4Ip^Xwl!iaCm%uWNzm)`=LO%Vnxf4HaKc1 z1hjpxznPIb!ewgsYjtY2Rd3V!s3Y6CGxJYP{+6&@&*QN0lnur7UFuj?z|40Ek>FWS}KwK>S?g9FIT^M zr%lyeYcrTB@y@C6vEn0%VwwCt*zXUr%$l8&Xc1>A+>n(^W6FN~;?_f3zPs2~H**qM#= z-V9o7w6R{z%so2a66N$aVveH1N`oGk1YPr-E8lxFF;&frgjV4$ZfX)cz4|iE!&)_s zuH$MJyCqM_<7Nd_OlDl$35vv7PmaiuRU6 zz{?y`5f&UfXEj=U-N}0zC7?j2F{EtP&|0bK&+>S~uLuCvRqaY}$x!9P~aj ze}p5ln&sp>6boASgtVLjIj5+}uYdP2R`^6TWI95Rg%^VLRX{82sTXxlQ&pz~(^*4l z8%t(Jpl< z9kwM=q@R{Xo_Qpg>(0gMfD+*h@YONZ%_fCMy{o+3nEQNX=2MO2oT0X?E!*g(Sxn@t zR5vxb-@gJUaOa-hL*V67@AfjkJQz*>p1N_-A388PJVKrfM1Gr$F*`7?IlqYoZX?>} zn!i113p7_bHo_|cu@pLdmZTP`3D|KFOW=E-`M+NZl>ATlUU#^X3x*6;)O0RuUIqA8Kp^5eoGk%O#v?&ZtX1V% zNSg+b0jrv2&6m74DN>-A$aI)!cOMK#&!{s#vKSD^H*lQydXLNoze(VKa%7kehh6-N zS>T~E5oMuDTxB_ph8gc$G(kAre&*y;JYA?j2dd@erI;8t-fMn~8}WyXzoH?!p(N1h z^jnOP;61J8c6JkA_dCCI6|7#{YwQC$lr&npvdm_R>5S}aNX(XOQK|9LR3Hypj! z&4)irs~@i>@`q)bBXw?PvdiS;nPA@j3e?fKz_WT)E-F!sp;qEcRP5Y@QimUM&Kqi2 z7dlE(2;()M+YOc*8bP=bRR=Fw+?qH!#;d6lKX8x44v-CXm{=-VbqhDz1 z-}6ODl2hL)l0=bPa!W(JzM;kt!lg9#@={}Sx0I!*AQh9Uf1Q`||}Yy9x_b0R{3pAFR4?7!ush znY18c-_5lpM8ga#^r%Kikjb}4`Pw&Do}#uUXvK|nSwBZ7m({prjB%R_Omm}wxq53= zfh@3=u_yepuRkwM;kOxIN?A0b_smaZL1)99n5X+Oo>ctDa&jTFPrC<_cIu#hMq^K| zGHK$VdpPS~976UR4~X zZU!zafXLbVV3@V~YkP_(*WdJ&gY%&NrkEf@`LBII%i$4&S&=+b9#85Ej`8!ZC*G&F zy3~YS`H&8oXN<(7Iq{b#Vq%M8&Z~_gajr4?b6<3%Q2;-|j|cv?q}}6c_O=JLA`RVr zP#F=TQ^u!EDPDS-y{c~mt&U={2wROEdBH}(OI@lltsRZ_8`|o<_-3|g+SVyAP00H$ zoCV4bkKSGzoVweFrvtZp#~B-A_jAk!jYRVuKf|YA3kR6NQ52B6PFkpFSnN4RxfCmC zjv87UGFP;-)H{!Rx0r)Q_ZA($qtP?7QI)d{X$R4hfll#AldoRUjeJGI2It>f9e-qB z-z^q8RxMH0Uo5@Zu1$#YmGcUKAaXwo+m{N|6r%FlhT3O!DZ}kGdbBGJiN0xt581q? zf|9x~9Tj`m3QCS%s?^kR_p^J%m8Voxw~AE_fYFQ6W?!m1g$-FTbxi9r0m=)M#zXkV zkU8n$?$d!PPXp77QZVFVl3>vk;OdfP+g<^s4X!tl{P|{_9M>x?jdI86v+*63ZBM(y zr#*A*ap9}RhZ@!{$FI3)N(&~rH$?M5(Wjj7Q0gDW!IQ$1MHv?J-wd*e^0T=wV)7h? zFV>!*{4a3#r(p%|BCLf{UDz6a)o#C_6S*M<@`~Xtil+Jtp*&spBlhJyfI@H{G3HYA zWfppQHFC%G?B9+nbAr2e!ik$}uwi+ssZT5yI6-?rbZ~2K#!Y2oPSC@} zS-{^!s+LM~b>o&BDEi4KAlBgW(Q@F$T*k$;#rvDIBX75MlPhy@GyHL-%kYHR@a9A9 zt}+&#N1?JZu>olw5=oyTXuhLRrlRD^V$%Ti3a(<~EmiP`M;Ge*E6%Rd0eAm&v7;>T zl10;a`)q##Rm&I|O54fhh|rm?)rKhZ^9dH3j!QX5!vg1 z@zaN#OST%S7hX+;EvyuNpAUuvWDH37D`LKlEan!>GHRlErR^mA#<$i%Mgh84aj$9o zEfxi!I=G;D5G&MXna|%&f4HyRERvX=#s%l0Fl(u*aS8O2D4+Bmn>wK=5nn126<9ff z59#KRfCD@&P0kKFA8%bcev@MzHY2zT@2c5OdV`vH8jrx+GSt$W;r!J1N#s<`z}yXk z$exwD^+(TkZ**vMBPKIez>6!~;waf_aTB8IKj@p>aI>;qmQBS{Y?*sh>`440f>%eP zrEmTh@q6*SrT5E@7o<3Cx5J(q?*>v8-1Eot$IZTsqp2;1sZW4sD5vTlxM|CJ%t{n? zQI7Y*+yR8t>i^~f6bLnahh4g*?LEQ9)Modt8c%3L9)3NMZeffp(|#d|pFNKc(0m{A z6zPt(G~HAa;)@JHTqX@2$&Dr{rj1^!)RcWSb#t&T|72}}eCe38yvy0-(}6jqqXKd7 z)@;u7wmJ==_2X$;gXPgLxdc%;bC;)#GdEqa%!Gq;j(QLfaqt(e=7y9s*^_m6ylY@E z=s|pu;uay~RY?u{pxmd&xyQD{`jr~JqWey{WzlLXNRwbGS1}*FZ56DK-iSOr)FGel zEgA@w+0P~U=FUS@n0T}}5DDjN#PL25NI3da3Jn;5tGgym`dS#~)~419gN>%|s$0Uq zCo6l94}uSthEjLchOT61*!%m6o{5=&3=DMvZqoJhJvH&XuBzMAcj64z|IbiAzv_`A z(@VXd%q$x*{9Dr2mw%$-#puiBfhWJlyPJ9+41rhjz~bh6Ui~SPVk55+=Y3w^LQ@O&3YpUT_i#=5rF01bps>riKo8 zON*jr7jHcAs2cM>6;dhen|5Z4BQi|@^yHsayh!KTXaX4zhucOH?cTO?$bHh-wP;-r z8U8;+y=7Qi-_r#eXmKkJ#i2z?aVzf7;uLo)p5X2jcP%ajN})h-g1ft0g1fux&F}r+ z``k}_;^gev`^=tMGiyz3n6%UuHmGg$;o9t8beLoeN?AR6PJ$zz@p;Od{jIBjalj!q z$a{KuLoW#KC|-YSMxWMR&zzpPo)me^P&2KzZIF&*L;jHHm3*Go4w02qef$!wa)lI) z(#YcVb#G2q0;P-&Y6d>Tx7SI1A60|C1Ny&&xALFd);fKCc1>bBMzPz_=v};-(rHBN z{=;i__>teW*6IQ)NAfsp;w&T;$+lvx(CC|j|0|TU;H2dAWKHpUrC^)2vK4Or=xyAR zy-&c_9JKj&b98W?7|D01VRCJ?+Wz->Se#t<+RV)5F`Biza?uvHy17K>Xyv=LBcSoR zkQzwXReB$P-?i&S|Ddn+vd-}sL+LTgqEeRVYsreF=CI*4(7nfiKibsWeY6o2n*Y-1 zyBOWPQy%o%?%T*x6{C8iKf5t}P#KuTKU7Ny>eH zQgmNHj?P$!1u1&6o@xUtjlj*eAp0?;E&JsC7xj*|+V1aH*reekOVy3sv^twmyJBpt%OlFW&x%kfJ2}gB*gv$7)fB8kjHJLNiMQK~( zHSe^*_6a&lc3f4};QTk8L0TzRXV5w>mv*eBD{b5qvNzXW1NPFAlJa|g$`l;Om`k1G zhPg*WyNiz84iYzrXP{0nzi2^%nHy(4YSz(jKp=`Jf|p1vhm>PKDw@*$vb3WIocuj5+6to^9;HoJlvkBj-CUKvMq z_f&3=+6Il3=1l>+H(v?CT!5Fa-NZbgOCo~#i-@|mRx=T;dAUgNdBKV>M>WgU-V8RI zvxJ^19K54GJOSFGftrKJ$VGVV*@FYeARsH)zC!b%a+;>o-De(i&6CLUlL738w{_v) z1)Jo(oxU6yKVBUa21bm_qJ4AK`RkXWqD(*Zqk9q+u$|Kt;jkhzIb$A2~#o8 zDk#T7JL0^&fPw8@0dJMCgeh5!!Ue4d`a`-Z4hl=F-k%9 zcrZBbSX@>3r>>qIEY5LX-BxAi8#N&fE2(mb(a^#;Qb!;gKxzRlA42U!iXEyVG1NxG zd&=I5=FmTo1M#vFTqsLhI&r{>_|5ir3>UWS=7HcUAZDb?KN3VA3JLXI&i^DIO>!h= z)Skf>*Cc!|coop4o3)E2upqO31I7s0YIvpmErTGIzC6)rrv@lm-mx7+ zMeB{6sE)9&zf(2-<&iCNRIuxq?h#TP0k$OTapo{9(%tll zE3dQny5{?nI~&Q{dZ-k|D=b7J0dv%#@SGEwWJ;v@cN}f8#uW}GIfedQLgS-GS2TTm zDpUsPVsnq#82~=SJg8y5(D(lq(!HHDy+lO4)=@Zx#+ds^to~nhp{&$t<=8P8@_>Ka zgaua31CMtd*q>kD$MQeZAi1@o)Rt))IV~BZu9(fZ8Mg9Gh}&arkj-SA%8B00dM%A5 zY#3JnB+_{>v5j7O=zj`3WpWzm`0>8QZQ4WZ*txr~R`mp~M0eLhdm4D-S}~%zKE+?_ zbc2>5Nw7uIRx_Y<_EMcD2IxAN^Q#e5wVT2UKf7#>d*NsJ0GyMv7-K5khg1hyf~arn zXEJ+(P+&$iu9byNYz4&m_x=h1p8i#at@y9vH!KcYfnVPSeaSS5UGkdWaTNODaWLMH zwDy!T4yKcY_5W?ND|}||Y?^Z;(!cI9-4s~JxR^0e+v(=p9|QIB-XO%M3*x-gGeAn2 zKL6lsTkc2BaoHL$Ut#OGx5@u7eidhL5D-q_Mvo9cY26ecyo#kfm+p|R9NEJ zJf>H?{PhY!=FIc^=Nx9+i4-MP{IiVZrIEwq?Y$8*kGaYChXd%)LlVj0C$2RBZ|8dG z8uA8I=th%L7JF)Knw_0hZM5{xRaKy=iwFQlB``tM5VwNF<)n%6q}{TflrF<^@}PW?k% zF!~~fQv+Nt$a&jwh03^vJj{PQS=E1QRp4(XI9!O5wib(>vP<0MzK_oky5wkC*ZpQ5 za{q6IW!`=%XeBsLXqgy~lz67ZJ!m;T6o~B6IBb^g_BEIh_k@RgI{_V(=Uzndz;VFNQevNPl!%OD!uq1f+0BNUM;8>Tfn^_BOZ>wVkO zi{tVbn%uAVqZQ&*OvT~L1 z*^V*p^`^i?3pMz9sY0aD6&HOvXT)B0C!WcCG#NJbQr2khk&rbqVqh5umzn4Y6p|<* z*}_eZDZ$a{tqWJ@ZGW$+c!#mFoIS^JnZkhuX0Ql`K*BXofu$?QqT*5lLEUcs5j?kr zzXHo{92Cbw^z%UV??NXr`*tB$!4!1EmtwjWh9Xt_#`31kAG-=jDEyLvXV4R3a4p(q zfsV(CZod_aXR8JPKqT2lKJ?_XNC-E4?!~~GS-h+-DsZ&@RW<~o99bI?>6PG4)kn3B z^QShuF*c{xrlCa99Z~;v0y1cb6Qu5&uQqg&W%vWwB(H)IK9CZ@;=6=h$QR(?$S@Kf zDqC!e5r%WeC6XnSkunpeQjDXrtxEL{2QI@vKi!lULV?$LcXb=pvg$o*V^vx{&DB9M zU*|Tj|9O~~q-%^_4-=u>OPJ%a$3zNtEN?sJ+5BdWvhC@Y79}Wm_V5NCacfDqt4mpR ziUW&sIof@nYt|!it8PICfX@Th>zsV`$Ft;9ummf=H-PHoeiZ$_Rlew0+slOlj)4MA zRVo>>#~>+LtHXUJOZ(5l9Tc!S$bLUGQ_yBj_jDcmAmT;?gdfVVUwCxWA?%Y+SD#%F zQDeZ@W4^P8pyPd_MS^F-Vdjq)sEs6AddX3RiOmZr94I)?k&Q>h%!ezgY-L&hJ+5AE z+SWxl#rMp;eOS%|+xS@74%sYE2W?U|Nb0$3GWRi9o6Wx;+8F@BEEU@j(i`9j*sk9; z+OCuK$TU2lq3cb9;i)2;Q|G+ll|{lXti{(AaRgEJi&0+N|E~ztO6?1@Jte!uSS*r- zT*hqDJgqJ_M;blW(fR3s`Bi7>yWA>&ojA{qwU;kx2Di+TEvu?c`eE>}R5$vroogBS zdQN$n3r%BN{mg#L4`F;=4mfgT zZUazjJEF$L$HM+l2q!nC1eeyRa5FK{v}_{9kumdFKPE1?+M-*Yd;B=r5W_~$J>)kL zyNwdh>eDtq1#o{E8wt;3A+a!d{;ezKJ*_5AX#T}@Oxo|0wnJc=K z;g7RVuh87Neu&#;TAS85rfVyQ8+cX%w(7C{{y7khn8=pu*igG{R3QdG3>Qp^a%-6H z8~Hs$DX>}mIQBP@gSEhd-(@N<30@wpC<66Uf^~|lHe8FP$N8&nIiZKX{&2r&vIdbl`VZyCf#nNtn;u`~7?^YEC_~Tq4-Ny0}gBoOeGOdYZQr&wOHb zd|TH%Yu};!X}Go>hW(NozmQlzc6~I5B({~a+yoFaal*o24-bC(tpL%!>yi#mi-iqr z;%A#R(*YmY{XwT1eu(>qFfPC2Cd2$Zjvut`3P9be>ej4kX?wb{+%VZmOw z`hppe0>AA?)3HP1${us0^&uiP%?uH78xLZD`ZjKn@y~qDVucM|Y^~4RS=Kv)|7^*; zL#nDurfM#fbckGx(E-7+*G*`&S9g7pVPetT}kw-t8#k^zP1x<;w8oF{5(u0 z3sbu5QA7*h-%<(@PmZ+l?ho2=uKKdU+li}H#xI-2UtY)wqK#AAg?H`i5!29fWy%C8 z-{OFTg_$o#PlgWtV?^gxNl!`GKGSmvEO>=NPEz+=O28DtUcXq1k=9E0jUSKLgxak6 zFYWhOcgx`7! zk~(Br+SQ2GhF(Z8y(aNnMD017XsgZbD&UM!l{b9`(rHijExldG{ocuBim#JH%Snof z5S3wgeTm9b!r{)hrIvUbZM`dMX>;LQnm*Cz(RwvC9IXRRth%{Wn}$23!=yeNj&hSx zMVi^I`bXpqIh#QBM!|*uFtXBLA0$(_o_HSZb?V8(4fQna)czQMjx9R~Lhd6~K zQU+4_)}138tU{cAhdH}r%hVw~5$87yA4P*8kxBmMGi?HbjZ_Xg z;mtdKZF;r$iYQi4RBx4p>xa@Y zMRoHprP+6Q4-0jN)bC_wPO5XMEV4p!oaWr_iuQ9%7(j8LpQHuSiZaiphB>^Qa2b9F-Z6Y=YL?? z@Bae)tR_g6771DNr`)229FHJbE0~CTQAH6|1nW|#+md|C(}lclr$EI|_McY@ak3Wn zmK2I8u>Xjs_Rsy&_^|K%<6H2;$__4n1XtI4GW+YcH(X1uKDNK~zgNP=dN>_qKV~}$ zm7JteW;e(7m&nZsm#lzNIG2tI&B$R~B5-$xBH%?@O5+3<=L%QB4x#}hWGvzjS+)%D z+s?hVio+{Me^=$OC18d%{ai8GoG0Rsdv~etSa=qgUJ;SBS$suUs~Jq?fJUC%=D3sN z`mGIe>GmT1i#xmD{40*L4qN<50*{W|qVLFq`CBz);lgf!g}06@$e3<^RjlzQR53J3 zVP)CVd+001%}P=k6La?4uBAKI^W&xNhl48yTJ>NgZ*S5XUC;f(Z~-^p+qqMq!CPaY zO{R^MpdO+Q@*mYvv`O%H=V%_dOtoTqF$NvdMoR|LX~Z-(OCVUV?zH3a)Vf|gVjYF& zZm>QN>jMsrzrHmlJB5gs zj~$(lN}aapQn?J+<%?F)w!;8)NJOV9a=O_?-6P5qcv$13E9he|{=_`};`udLb_b0sAUX5jcp*R{9>8m z>2v@^G&BK9ST+0nRd7hcfL3 z&oobPuKV4D^W=)YLVN1baT6jZj}b-^^xG8vTR^I&L|}w%6((XvdO{aogjC_P;7ucH z55f0jC_e?6?nA>#`D-L|xscDF1EI3zW24zB!2dVZwx zAyN4lmx@46el=)q-%6w!dU>8<>z~L9d%JFPjNt}kA(8S@OlVL}!~ZXQT-wGWVN!XP z_LqL(JLS{%wR@;OUWOK((Ernp?}5i~m@{_93f=&3D6htcd3 zJB1`%#IS4NNLL$o=wFAub|d3}m~NeDOGx=GPZ5)b92d~ZEJAbcVviE_b5U{<{M_n% zvjr;Vb%-gzHCp=q@4hjCPpfqhq{!KN{xi?7}@gsjf?-9fUh5upxm9kqq4tY4XR&Lnc=ZC?Ri4SD8`A zX;I$^3E9c~u@Wv2m?RjQ#LRxdeR=vCZ?KROZD*O636@4)b^8&J=aJe|*!_2c54ty+ zw!?%woc{EYJ5l-}B6y-4g*IWyQq~Cx(r9&vm>fHv=YiDzN4rA=lGGhLba8r=3bX2v znnE!qd|SqB7SwICTTV59)V|$5xT>trx2o={{*)e=MGilyytv5mwa?GQ-vT3f4%8L& zqa25XYt+Y@nOio3k#^dfPUXoVme3{5^o2#LYNb8foPc(@s)nQKm^-KLz_CWs(}cSl zq$x=j^hkR5!LOo$UmZTN>Z}xP1U2wBx~J&}UZ!-r9t-Q;bv7@J5pQYq-P8-e`!kPb zpw)DNk;&;To8Fq8GsJm(Pf%9ye&vYLD3rz)=C_$ySF&M+7|%5|9*~HEpTz920yleN z^(WsI$Ixy(N!sL$G%MWhu|;~&FQw3K>y{18{!ZTU z<(w?M7NyY0S43K)f*+njXne6YhZGR!Xz8lt?tt#l*(5~p00|T#SeC`**=cP+`+EgsI zUujo1Da+=xaJD{jgYXBZ{yB3oWby)4(X4rEmOnwbI8Y87(lR1Xx)8MRif?NXo2m$R5N_naJnk}Nn{L?!2AfU{jp~JbI{UUvP zFON(hTciX)eDvj=dOsWI3xdjm`HLuV3<`qdK!|Evy^Ut!p%Y^=R{sWiq9)o#{d*~wwId_fO_1Af>Fm$$CVo9X*v)T`0qv(Uk!%2B!=I?R8Ar?8r z|B~$>x$hb)(o>|W|2`)7Kp^=4;H?0OUTjnv4-1t0^bjr-59@5K+MF(7TBoH(F*gQ( zYU*P=6Ajv3D}Xl6J_BdGEzeGoikMZAv{IB1Ev;G8^cWSqN!RW1|NjICxh7 zSBScaZ~Yu#koGHII!Mnn3XpF%P_espTUBZv>2Hqey_fOgb5%#bram!{owPXm2E;7C zd=t(2KsF?s5g`;RHtB%fX>)Ppll1emGifsYj?Ks*h`CkQB-Yjp4vuRbw)E;V(_V)U z6s*tjeyWYB0#|=4mP>3-XhP1J@UqR(GM!M4f_L6Y@YO#z68YMB9~NfaYEO+T^J3J$ zLdIj}MtaarvRXqs1>WnyOhmQ1`m8F z-v)HNS4#83xLJ6~@rRc^Soe9?b$;F0&yd_w%RU5*+3>-})A00onwEv;X7KfXJxmmR zHgMTI1v1N-K34js^Q=g0Wuh%e?ZvgLywP~`)o3IF86p7=h}EsChG%?l)tAKg+KPSU zvEC^$8szpNW5jt~fk^dtN4UF1o36Djo?KhQ^>NG>M3*%!?X=+S?dg|tR*yOf;{uYf z;-)3Tca1P^ql_NNfg6~D+{~mK_Po426B`L96jxOX5Br!NgFd|AYFguqaqs!Rp{PR? zut9RsnM2=zf_~_vZv}$kq<+Cn*jr0@C^>1UD^NSDRro4+RJjh_feiJG-An*ox)j57 zQ|+cHg)4eeb8Ft#y^=59L0qj*A;A!h`ZzFM6IgH>K3)b(Kf%F|AJLJ`uWs?z0(mI{@_WcJFmvMJ>6zKfOhlv8 zNa}iJCgEU!8q`pIQU%a@-t>KAIcPgy)|LX-^5c-q zs-?7Pd6Cv>S`wzpa!HbT?i`w-$mcJe>UXz9d+~BILdB~(gOu~ zJ-F3(tl1U}a)9yJ-+r2weLMM$t2n0dzBbRiO}{oSQpI(5>&G>lpxXWW2p0fp)O}Kj zBo683gdV=*F|uj73Qdu3I|C$_`dr*H;Hs{8sMTb^4KWKfl@i^HRX? z{gT@KOewnq)=RpN*-!HFPXa8puF*;C?U~2Mrnd6N3{v&-ODC#sfnJMM=Ml&M)r=qb z0TQ0o-u21JbI&63i|BBKfb*QNGC@nl9zLQ$A=z?@d$+d-@9{OesMbtox3xY4LAfFr7JvhI78P@)zkWPq_ZEf&kpgsxBkAFO0yg zQ{e4Atv(IE!PPr=AfTEtNm9Ub@}x67QpN2=D89(g2p_-U0Jzg zPn#d_1#PO*>1c}UMIj#=joyo%bS~`i4jj`BT@?uf@emHBu zr!^@1@sdi;=W_beKspM+^IV{dIUc1Nak!pv^V_hN2eu1YF9lsc!k`ZerWB6Z;|UGl zOV#2PQZx_Is}~12+$rF{77&B!58NXB(3CJ8Yg@yQLrcX)CUG#mx{3vQo_|uG&ZJlO zhgo3#_wn8|8N-R@lm&Y{H(sEzxJ;=FlZ5Fp?wj1!Zk_(8`)AN=G1<(}A2^F~xqNZ; zhHj|O9v}7&4l9rC9Quy-OqUnV^~{^8?!RnFOARSna4=44G6Mk8-vrBJba?&I5+ZQU ztg#jM%wS&aQ*u<>`*x*mQ!fTmLZi3Y@$|qkgK0RT>$u}eJMT*MP=%+Tb2DtSyk4d} zBgk<3M3*4?eQ0&1jgtp4XKB?9dTeL@SRZjrS`i5_CL8C*=d;DZ-9ZFYmIL#DrFEBQ z@p3w{P}9=FZ!P5vi}H!CNuv$lQBYZtbdKtK;7i5HId6YhUZAY>nV8;LYPLJBYuroJ9Mli&@WBclc3DLiyI9$K)&+3;tN;dx*2b zyU$}hPj5GFr;RFQzSYl;%L3@2&4hd(`9{k=WTH=Yd7eH>LwqSiY5u>e0pBapfl5;VVkEW0X;`5dBEptYbi^7TL9{STV#Pd z3-;MM$DzGP?ry9>yV<=!t?%goVdOx~WwW_w-S9PFo+FU<%R!A`K985ye~XWHvJX_4 zv-IS7Cdd4CI<*4yeboKk<2E?~DKvCbPy~((+!}mc)=k_4Oe7@;7FxHCx7qXJ^ZnA( zlZlNzHf)-S38(oG0pRRovXktoOJkWQa^l&sTbRG_&%2FW;(poAA@tO=9svEG)}4ix z564CZ6c!uQ5()bp6utWWzt+d+FO@Fsi=O3OwM3AG9O8TB)Q-G*HT1aYS_$rT%UQE& z?3|9mz-N;=XZ1pXX6S8s`uOwgZv*h+KhWBv_1AGwWs%#Xowelqp0U=;bJHA5xJlfm z+Y7*+;8*v)VW5CES#9wgaEC53>&&paTH%oET6UG`V(cU<_tW6!rW&1Y?h8bO!WCt6 z5R!TRH;Y8S!~a{q&oWv9T=-|z3Rz)6`qF+pOj=}BfeM$O zjh5D%wqN?k!(hCKqb3tD{ixjuw(9SAv?|@aEK~Pz@8l1RSa)Mz|XZM z@~*#^u2}SsS{=Uq%vasnS%4Xu$qskTCt-eC@chJxiOZk%LY}sHN3210m`ZERfnwis zx&OxG*!Q_`U=U2F>u&W(^RcQ`eajUWP2__FI?eXb3f;w@@CH8sN3iop0Kuqee_Z=V zN`Ex(MCQs5+B;k5m?V?U@a)2Jqu|F2-N~G0`#W+42AL4ZuK_N)+?STGg&`2bjR*i- zb?#iE5EKjNiMP{TXbmm@$889Q%c12EHToHjH1(*dyE8_B4%NBJq%g(7RSQ&j_Yz#b z*3C1r#^E5wjvvdXnlCY2=yL!Wz?)n4+*`CSLg1^%baNgm=MI}vO$*( zhDODz*fJF2ts$#47xP1sqWJI~{s!M++(uRxY_fyKI+(QAYKX?D3Yudmym0^gph>@ov@+1P zNa|!sAjS3RQT$^SkLUKU)R@OIVtJ;^QNaaXs_=2vbZzbgQ)G1wgtiH+>i?#tWJU#3 z)727qNBtfbmH`QYGSNOZic7ut->lT?xNkO{8W^j)9uB1to@WW4>t3XNMKk!w(Nu58 zPx%2F%Q%%mqE}^Z`+Lg=t+iRrV3+GdwW4RVnP7^PoGih1d`8xv@0^8Fk^4f&R^$b0LLY(|eo#QqZYy0HHSAHlnEQ&JO@Xx{L$1<7RA3?!$Qge_^tRq@mi z>cC<)a#$8a@;+DoIQc@*(>OpYTFaZBlfJ0)EGxw_Np)T7uQ-F}OQve;&*j@xtLvDD z^~a^Q(6yZRF9MBO#yx#ih?DhM!8DmerRyiZeRUcTEF&&3TcZZeR?p^rk+fjh4NdL& ztmnVS?+9LU@K*^Ss#OXF1bo>cLsU#3;u_0*Fc2}SPL1J`%y0bI^j-jU;cXjLibx8H zL0%Tcs@PRl!pmxep^}tF;Vcr-!ZdL2RQOeZHw@p^u81ql7LkWN-Y|_~B$SR4YfvhN z=0l@i!Kaj8{E4%w4YWP&EL_c_6`0vYQvw&+`I)u znrIaT?Q`ks3kh`4N!UH>AkR zknvaFdL#M3y+k?0Kpqbg;+uTN&_m|9qoXQW3oDS&2*m2;EkpNVL|ftzgomAcRiJfu zSPjTz7ooKKgK|MeY6|IkaZ8mRs1ddJkI{9lrY6eHb-?2D#P)Wf?^E{)F|kwsLcM+S zo1-zm!KMHKnjivbnd-V}V~dY?_Gn_@r+Qk4ohD#MI^2qAJ|3VqZ#mr;))47RQ}$%T z+t!ADNDEkF1$M-}Flqveh>%G7UDzman+#tHI^$=f4TjzSDKiSmX)Mgh)aCbD>oqxU z{w19TaTm4i^&G0m_|&(*TVQe%Q(JEug^V{5u+rM-35d4urRv!SVv^1qp&q#;FVm$@ z$EnqhSVJMy^a53)(kVJ{!O^(~(?UxXrNC7T+~U# z^GGeIGf|ptKZnpF)Xrs*uszHCk#8Ya@N@gsR8-%Itld%r|BssbP`}u$$amvwibrc> z2k&%Rop&R@C@GIOA^FoPx&IvBD`|gLURZ@8pEq2j>|t!x_eqv6LO}kmK9dpic}?uy z9TLVx3kZrKQ4KeX^|`|S5hU+R8z(~fa5u+pXf{Q^m>g1C!yvYcC6AY97~S$h&#Y22 zb6&d0EWeQQ#SDHsfKjtZ0r79PbSp(07Dr7Lus1TJno=;$c8h=R^gH|t)1R#7(3hI| z8nym_4zlA6#$IKx?ad5}RlE8uCAFQsk1KIv!p}nkId!>S-`WBm(A>zR7c?n@p>9@6 z@<{*q3G_JKEeXpb3hPi)um%70T*^X1KN>LP&l#Pupq(M*^I86Yv2xvCE-vYID`+H-u2nr{i;Syco)Z0V|`w$_^-?H;Z6ejNLRGb@n6G$6oquM2j5=RM(Z+RDc$ z@WOpNf~$S_3DQPtBclu*WZIpa|9RWzsY+;#0a2Q{q_Aewt6~AA1fdfjgvy#6e!J*?&Z!QXIaSJ)+XH)-g!asRuafCLE0u5ounUT_Bu)bT889Ybfy zmNt!>J2xNt=x)%NDhq0LMW+}nC&r)#`3n}$a-pWoj(4@b7t#?EPW#Fu^rXX+8mFzd z76SMS?BH{EZ3bEfpr~3^_O>|Gf`Ao&THx`fXQi^5)<*VU6Mx}{zjb(G38rML2g17! zr8)cE7X}&On7x{9|BO{{cyf@)p>OayyM9lm;WRq2lnZEwM=sAqgvp)cRLE$|+O*$Z zoZ@4>N!)}uehTp1v#wZ8e05f8()sbePpKsBZm^B%-dP>HKV6HS<#*cZN#-=3PO|1u ztCp#(R+YJmGMm7O+KOf>q_4kzV3XFNyLbdk-)7r*PK$a?8P#3FO~3{8qi%B58+WPO84!Kq?u&Vq{S>_k}c0em`rBO)Jm8bqm%nP%+`&IV$S(c5QAS(`XS)b@ENEls6*JaXI>zyTl!AD_?~Z zc_aurlN*WUZnFhNi@({vHo~wmhM6JfVBFrhO2w?MU*c6aLxc_O5r~lv_u00$;8LBj zwfYhRi8JCdxj^9bI_j1@+F?T|+}##0Y{ zelSOIS7V296vQ}dKwJ8pWqREz+xY%sG3ig@8|IF6g~uPTMZ?iXY176z%ZB~TI7GQD zp%>u7cVLV`me7e!?E^@}DG+vi_qT~iJEE9ce zY)q$lcbXCKl&B75nzLZdTM*!kUzDqHtP8|9yo+lEIHqChpFd<~IdMfXqUr__47&R| z`3jzl_p#O{%a0=w=uuOB9WlPNO19#LmLcXjf%^`@lRM}C-N7XtHVUU3c(A<#si%Uv zmG&JQGQ-iq6#YBNQ>(w$bJW4YDEtWU3m_*u8;1VxN{e7tO+EkqK$g)`N`0Mo`F5)G zI9NwY1JKv)RZ%gu;FKfO%bVxGf9&9*f!-IPQgU7b;W^#SM=@Knn4-~8S*}ltJcc{^ zLe|lbLp6keQTQhyM*V3^Fwcnva1c@aHQ}jk2`T%RD$2w(Mv&Z$kjsWJ-3_3ASv&sIm zXay_9TaO$wvXabfs^iDH@{@Hi(cBe%TG-uH10MU1nr^SIt!qjBtG1BctJ0yVNg1H&t&bvZo#Q z8?2c73vq&vNOz*%g+v-N!W(zk-}lnC^4cca@}zL8$f&k+GjL_X>$cSqd9zc%dyF3} zKI7N7INv@-g7k@vgW@*K7@XORny^?IHf;*AvUsJ*3`SRlYd3o~=Zi8BAE)HmH2E9K zzpQ@aar6#6cmrzqSED8w$&ye?w5YQ&K9$H)L#2E88fl$I_vYR!r5SqKn{y|z&~8Yi zdPvUnA{cnJXmjx}x>NSS7v>H%rZ}&;hGB=Hi{kM5E;#M?zR*f@XCZ0%)Or%@0RGR? z005d*qHSm7|E|>HPBx;QijT;3OYQvsw*ZUKEeRDmGa0%`b9rM%0@PxwchXYx^IF|) zD*!r5EoKRf1?u~JDJ##R(}(``*fRN1{eUS%9SGo7RT?gelby2kv`LV%O$a;MfmYYa zSHafxC*44v!vb+xV3|eTBC3_QpHy0FIxTAaSzkLP<v}vj zi*e9amim5#?8PqC&_5(qi|>?{gxvM4eD>9lAJd^QOV0N!74cn>pcfcUC&)rje@cIM zKyN1@sI;_W*$8f-GpCzyD!&q6y4a?uCXJe!gv}`fPV>973)bv|;0ElYqh|a#c*b1G zyoF(kx2+3ES-Y3(H}S44v(QaWYkWUQG)^U&>`Plmpr`hwxO_oCRQYMG=e_OVBqHxX zLv{4b-vN$8qxzUptm8CQEBl6bK#XYdzp(vw>(m<}Q)lXT_tz(9qKELT?w+5Q$}My4 zM}R53lMC>5-Q1Q8Kv2ETga{8toY3iW`|sUdOm}RoA^Av$OBoQ?jXNj=^pHHkdF@Ss zAG2Be95B7)rOin+u;5tP!##K}ZMJPCS_hI0Q|ak$+bOX=Sn6IIf2zpMy1v6ubu>(v zeAAH?$)A!~JeydyJ;w9NPcuOTqw7x5%NBT{YaLnJ`$PnxiQyaQPe~64l|O4jZPXtr z2JJlJ`cz8t=$+#D$$T=qgabY=2-_b*lOboc>t56xsgzleOVIQpd8(V&dyrs*i>*8F zK$&T`jlZ^q>k3}gm#pB`=FKLbW$Y*oVL$-t*!XD@mG>SXGZlfCt^5Ao*JevMW|cH( zR1dEAKI;F=rtWo8^KGoWBC)h->}!nS;|G=wq2#=A3mXJ(%y=I)Ox@0czoQ%m;l+jP za{^^9R|hrMtb_D#>Fe)Zb*=puVa^D>DU2@xEV3*4hHx*+5(yc3?zFxS6?o^dAfV?A zk7ZkJ7iNJCu9;%#^1GtJm9ZXoA2~~G&x26BU903hi+xpq%=zlr0izhdCoKRS2gM1t z2*u-4->js;b9_Ogymo;{A%4#q6;0xowg?cH%!&ml4H8x9K}Ri~~LE%eY0*3JJ`x7z9i487=*~a)9H(9U!M`q1XLO za*5K`)y2ROhShmeQjMT{ zIpfaMk1N9_0>59ehM@9tcob^;9uok#_%GjG7VN3?Bn^grRw|zjmx<6R7{$Q-ZvCxD zQ+|=3e{yaPajIrkK)iaIP|v&8eyH;Vb*So3z2$d(a2`Pb`*{VNpz>)fTu9!aaHahd zj#?_k4bc-x-zM`JM}9r7>TgHhLRd2tmi`vC~O|Qrn=`0GFd~8qVGs(`}xRKyW z2`Nx`96pcKIDV@gNZ#f$_hm4Z=%u$}+TZYwxacx>ztI)T7*4G zKrRqIj!d@gAY-JmMN|GCCK5ccK_Xy=^sR5`cBC=c`jWc;-D8QDm%l>GPhqrtnng~b zi#Q*y3W*||mW7AxJEm@5jpOQ0sovpE=E`0^QRKHvUWwv9<3HGI&WUDDR(eh_+CLNL zQ@zIFxDWeDf%2xy*Ea;qGyws=08-q5-ia?pF*2F119k893}bjtQAH^$$vS+>jQn=J zbXk7=7*nPyn5ESG%LuV>Qm>-Gt&)DGKQNU4F~ZYTC(}Di3t@l5OMl2_^C~Af^KO~T z?N*EG#XqoZ|MOAE?mm@Ko9BJ5Fh9TEi!4G~`c)7en;*o0p%$V@3U^WD@gfM?m@%BR z+Q<}6EZU(I%fFJ?o}c&eG)JVl#4VoCY(d)-;N6IDzrBM|0(Bq`#!62e%Qcl(4v|*W zzHO)5U3ZP8|K7u>tsX*$%s^T}$|_s@iUP6be`b+qTV}aCXZY(%0swf5J-n5hWTdmH zB`u5EqSsB)k19a|INVJw*33-d7_{@}FW_-uNx+n?1bsE7e7?T{2D4?0JW9^vl!K4} znY2Q($8xxJA}qufQN=K%yR$7iskRfr=QUf7D&^ATE7gX`pJv?GQlcub z(*Bxc=$;-1UU2RUGXVln{wP-h%8v5g)!2Dz5I;+A|Tay(8M zOLDTZV$u$&DYf+YN8G$qzwMJAC$eP=U3R+<6X;28vZC80z1POo98p01oO^T{i8Wd9 z?5+vFG6OK-3;E9IYXk4`D@_=M70v4}2W*A{2q8GAbmGKH#Fl9tuXEh(oRydTpwBKDTYZ>92UsNSG7IJ-*S(cGrB?;Of-rMJ4~r za20)EFb5^Je`&r~L@@Sdj4q~VF#p`{%)=~3q<1`dy@o;hoAq4_KzvS{Ouai2HPP15 z0D;jM>h4N-CX{+t{=ybO2ffJv4wp}f2V<50h175RBkNHGAw;;03%PuP;F+^kn$5`0 zP_B~bOrry6#hek0T~)9Uv~k6qz%smS9GiK3@8m+Q9`CiD#p?w)%2Qz2+o+8FszCdv zX10|H8Ym)lw6+xJsoAWi`{k}EX50Pq4^)5{T_)8oA~ltI_rabQB8@@$tVYHsvFv)W z-~vOaOXcyd(KX646`2+pTFq!gX^1I?%O&fruoWW&pdhx+lGn+7l(G1vrwIUJGm;%5 zlKv5J*l$c=okvtbxU%AlV-VthW2skrT;pH@`RG`OTC7Q?=mBqI7h_Z?8ygR0W zWCob%6u_+;b+NwY>bro^Q(*z(v0P{?Io76(%?4bo2kNdDk0jxd9FZ8cboYw;jX#3G zh5wkr#E6CLl5s^x zVPG6VqvqeVR;mesfa`C_;=6HC1^FzvzAvYK|2?kEb8k-{1;ib6MBB)^rqk@T~vcD?$KPa{PhVk~VRJ3(Ft4>kA}Ci~!c* zKUv+g{xgP+w_emN8|B8M))Z>%gS^UKP+lLwh?@x7@WDxl>_kkfM9fIa`tZWZTM!1I zQ_Q6#HlIkjR=>2E906cEC8M>PaQ9M21HCYT@H^JI5lpi#9u)k zrXG$ENA5@3iBi_}|A(e;j*jd5-kvy(ZKtu(*l5zYv28SH&=`#y+xEn4Y^yP*QDfVB z@8|nl?;o?)tXXT$z2}^*v-k7t^SXlB(XUZRB63ffd-^ssxUd(t0$oeQe`X^Jsm0af z&ntjpKxwNIdR;WGt>SpQZ2|77a>?8KiRcu2WdCIn|9~vcj;Vphe+^NE=Tib93SW%J z$A1o@z-X_3J%og*s@?HTn#)wYd;BUWCF|C{WkVZ(%i&1buw|z1!3!YlF~*Pz@D4z9 zLf@p2sK%u?gTe0%ECU7q@a9~;JDm0%p1Wk%t5?^xT6p9V3xP&ft8f>HJoRACTOQiy zjtD}6ODUF3uD>8M$X&rx<4AP;JXtPqI{X`I?#I(=VCM>YU_o`MUaA@u2>p*WJ1pl2!ltH{;zmPxR8>36OzBpi;SRu z^i^oeWJ@CVr^?-j-Q6@<#2|{F(-4pRKb#=&Z1X(#>0b8L)l~>f1d*{;R_+F!;t&z4 zE!Bur&~y#kk{o@AZr+}qDR_*wY#c)iD6hP(I6kAa7M$iS>w-ZCLmKv?bFIF?K&0iV z2n{m7!hVIOl>|{;l6%8|{>iF*{kY5y9c|gaH;7?z_vFH&0!mV(NO#U_H_K&7}D*DETvZq z{XNW7SmLI<|6c>!`-JGr_)^0+KVM&IDSJ33)r!6qC;$!lHmyKu-DK<#MA@(MzY$^X zD}iDLNR~@5J{loVK+V1*0y1%EV zJZOZbdr73ue*-?nm+bJ`CvxS0QO7G;5u`v?NAh-D^LX^S@#EEN5d>1DXvCAHA(Z$< zpa+cSy=}pX`#BwO&0;}HExS?>mfB=7vN-vxz~O$WmKZw~``&LhM7EF~-YyAm?iXfq z#qD7%9x0YovayY8+JOb2{~QQZCUx+)Nem-13U=U2L=Z02HMJhxm8|16OUTeq1CBLO za#~xK8Fz{jst^%F@(~iOW{`GH94E07dMjHyP0>XCVK&Bi3FMjg4jL9Pry$$W_dj3h zkyIW^6SNyXtttpirkHU7RT2Xp!VkYk6CpdcL{I-6fdh^b&bek=$o%U z=z%JKejMaUI%B9;bV3Fh6Yj`@m{s)fV5Ct4%vsrtF#ava*+GGfEy-wCdxwVtymYrW z7-VV#O_6y^^oa zRU@DK3H1G9o;cU%n7osv@%G=pF4mrApe4E}2y_4)TV4Wcbzg$DMFUoq&bIpr735UL zY7bRQ^`EMuzdeUp;|(h@wtW~}RJ6BO#M>YQsAT8ax!DIs9;pqhrR94^0P$eJz%-B>yoKh$6%( zL@B5Ux`#85^DKH{M|Z0le*XHG9WgsXrVv94DmV*cG0>e>UHQM)V6IulvY>B91#DJZ zFETDD;808w)=S*g0qzehh&`tWK6kLL@D&o z9co`;ASsk~Zj+;~S?>kL3BtfuAYY%bl*@Ni0DO<55&M5G7=)u{hf?0u!WQug>)|2x zGbj2mk_80)MSy2l;ky{z%4rhq*RLvJ0rV%CC*fkcTigDC_0$Xpfh6K+mI_v&L1hTD z>>!4`^pTZRUH3QNKhkGt9z-raCL9LPwkgI6}NmG z7!@=ez1lAsmUqh0(O>N)HwgP*PLHUBIg+x%u>IE+14C-R^nf{Ijcu{3* zS^qIMVO`<@okWMooX<6q0jmoJymu%UcbLDsw$`6XnEGCN;9ylmscG@q^;CVpP`8%) zj*G9H43>L0AY2wY51txF52ViCVk*DG*v#vglctCM&if6x=nSNSxiw9hw_F+HgpP^4 zvl^|Y&hbt7V!$UQpnTJ}h3d0)Ie)uY0i2wt>+0EVj=z^zPOfKyX?yOzh8QImee+rA zfDdYF19cl|3lAv3l42-O5qj7#dqKkz2&bJq^j}q>YQ?otb^CtTp)$vcAc826OznF$ zFNOKdOjn1L=o4He-7#jm92I_?u%wl)KbV^z4-T5dEuXCfYQe#n)PC7q7UK)r(FH8- z57+N7^1)EhZp_*U`O867Scnx4ePH{yOZ2X;ch0wPNPs3ihz2bgJ@!?og}b7<0m zk;Jv2Gfm7g*gz1tNS0;B&f~qOJL^H7G6*!NXDZ+X#Pfl~8_m38BD@;T8=B}QC61wQ ztPu&6^1Gcj+mp<3TFoBnkIdm*c!v%4OR!TB3&>d99PJG%4UvR63Wo6-kzz>+x++3=p2od=_! ziR_N3Ud12q4Q8nBn{N`;Qo-AVc)a5pP*#0phT?**t3G^oI^Og$DF7 z84d@s)aBGINGKulLly-O;hHRfL5vIg&jshAciF9}v{!H`%1cJ?mBM^g!YBwERR1Vhvg@m30Dl{?> zs?fJobr1seEf<<1-}Ryxk#T9M09W3(!!vRb1RTK5Qvz{t%&cbD$jSfNh+p-IPW*AP zBr7<;@M-^BN*5eRk`yGESE3Q%=vvS(koS;?S*&yY8f&ul0D;`%sQaMv5O;AA{*xMh zqXi~)`%c>+uR1TUAHMSq|I}i z&C!7djZy(*Y9!{kf!GM{+4>7BE1Kj1o-YeXOe3jc0tl+4#j4lvbz+fu3PImOeO(7q zK?Xjco9h!%KU)WEP+G`gWEFVIFXan$-x`MOPC2hgYx9TOc)T*;osSFDEeyv`Qmd}O zv~rGS|3zq^T93SW5JhsyVGu%QegO|^lY`kJq{L>G=Qj}_>(^hh5HDHp7}iO$ysYc% z=Oj5s;2$)Lsemh{P;?6{Uxf0g_Ms#&A|e2AHa2e*lVtI(m-Qu5f`)b3oP>R}Y>TwY zNWkg9R>Lw46@*xqr4MctIq&`dYm9XmBB`DL?_F0Rn~Qukw4Io+-GjdHBVtuuwZo><}DniXKUQvsu zY0BrRB^l$2Q8cVn%mFyLh{jo_0yuD~GL7FA%T5ahqzxZ2o z%6TJ5O>(e(9UO@F#OwoMa*3sO7HX98JY|N?%xZ2A4$^uxvbhft>|RYBT2TO0~~UTJ*sxs_Ky*y6F9#UX7nAt(oR$0~z<0zX$l7#p|)e zqo(fd{4PE=|h;}yLhQ+=LxoAwz`Y96}w!;Y-3bdP-=;z(0K_`#NA z*P4FkZFa&uB!b$hOumhsip`}MqI`p|Rey2ALPcd8Vdzj=^P_GE^;1|lnP`m7Z+D_k zCFod9cNf14X`WK0=8YI|3;zY4nYt~7pf=DH#3GRW2w$*6A$yq%%Xt)$tb5f;(CyAL z?m62)4^1vHqI%k-8d4wrIvg5#9dBq))zo%cu|wa?pWYcbA?#cgrBvbg2RaE z8*t#b&uPm_)}l3;c8GpA{X?OuIoTjqA^$ED!?w4BKDjX|1GUHcqNz?{G0E61(q4Jp`)7R%(vpYC*;-8f&Sa4a7-6@&shh* z5r?WRYa0U6nOFaZC(5m3(Fctut=BPK&bi+O))6A+QHj| z4y)(GqAH4tEnkD2r3DOz$`x}ds0v!b`h|2fyS1gHZZ>m;rKDtL?x>-2`gf6=`nzL8 zZcB{L)>QHRaCTJG1ZYw<><1T1{#?&|l4Wde?!fQyp?BPSg@e+7@b=Vj?j3Ch`nE?F z+Mxx2MFgCkq-laH-P)!ens8kFvd?F5*5fg)j1_DhEx#NDR1{SFM z_dLD#aiSxKWXgfO(I>e?F0x-tir`o)g{0W>N30G zqVaiJE$;cf|M<|=g7_a`@7ITr=X{u-@{6B%_`9(xn5T|pP6q<-m8<#2J+A#GtQ);8|=I6H5gLfA0ALQ0@Vp_XCglKB9;ND)V~qbrmF zAwz#p<|ug=b+}EjBw*A!=gxG@&j6RKn^&~NF7Oy@D!83Eo3&!YhM`q6@P8m@%nY3F zHb-F->|{73%RRu?W~i8N|6In!5Yu*gFJi%Pf(uq1l*1w77sW$#C8|g^UrS-hy~o6y zsqyj*tvfJ#l~DCd5Yvi<-*$9T7HMmKaX{8lk4Jd_t77k8egwgqJ4R#Tdb};Wz48!J zx_Rr^{uLA*Z_im^2Pg6#r_~2kll!s%CN*g^u13g=Bw4rnzovL@cCONjJ=}_Ud7wwi z%-3fw_8mx*hv8kvN=aP zKuQ=afQvix9JOoI{%Yc@ zgwNROf+PK9+x4*tvVWJY*wf$L3*x&9&(8IIVMw^t{8J|05RPp(T)z9b*gdQrs`00O%;igftox0@BTR^Ym^l-o5FQBd; zi1kAY)z_gCbs|hG#LempEFK#s0L1yu^!4}ei9|2^UVh#yFw8UCN?qBWj%!t8!SB_L zMy;^%hifTw>!x_^)hv|n*ALE@bZz0fLOP=`ZFC?zC@9P*%dHY(ASnqg-}&l)uoxoj z*>{A5BS_}N)44%r@RCvY1ioWsVpNfq9LwcOLBJftEZoqlhE#vbBI`KN;_Uiri8r4( z}y-c6BwWkiQ}#@5%~2TJ~l>vuW@qn=sc)8_vpX%l`gz>&~0PE0GPsLq|pkvm26O zA0#Eln3IuzUtj(=`L5fGtnT1ZTPO@9SLF}%zITQ5Cm}kD)f!$7Nf|8BVUCbQx|iY#A93zE%pSEmBED_=%>F*$ z8ph4Z$w@tPnRn=ZX0Qv289qu&8ch0nKYc&mZF0`3o{M`de+YWBiU>bw=~zR6YLj&v zD;MOtB)}vr{N@f6=onENUgah0e0|~x?P()bVoaYi?`8!23O$5a9u_L*V%r{uF`rHt zr}?8Ae!q)W-3fOhwnkQ!FQ5_b&)E+1`wR7VqiH{L5e3-_j=w7!A5RlWuq4wr*f;C+ z+l$&(O|r}r!R}f`J@&!}oH0Og(~1!_j055MM~dz>&&^g|GOe7#{q>98?ISbf)!vH6 zc=5p=?^DH}M7usB1t~*xg9!?TeK_04jHE(j*ZL#|SvM5Un}OcuZe7glxuX)-%&4}>53Q5Lm+SA7Pw_fH z4^NSuyY?J`Az4;td1)T$x7QWF74$Ts0?ov+`N~*UPEU_+bhK4@j;0RT!}+Ziqgf47GY3vc3)^fHPP+%T8wB z$=x7J6D1HO{QTts|3$X<=IpR10jhl49h7tbjPP*3;c?NdK@!T~h2xRuD7oIxtA27> z*TbF{#OS2Bkl57)f06|-==nU)O`z)@(pg%bx2u^c)aq_}TBgB}G}1KB)T~+L;PKS* ziz9o&r~kf^#PS()H_eyn;KO9;ybTQ*yLYd*bose#{y&T1|Eg4e9Ms{gs$(p7^QZWVE*4bdIU+ z=c+lLZqY}zwJOqqi^<`Bwo#8v^s(JmHE3v$b4?4&=|y^y;I{X11a$m^b=sw+)HMmn ztiSK1R(XDZ?xSbjeKLu&XAAk;r`O?|b$?yc_eefn00b{;QM35e!u=hq|Iz=XW_^`= zV#<)fzMm$8pO|%KRoE+d@9q?TS*TA&078(5O8+TyK+n*Y$6OG^GcDj!bANS$vAfZDj{SdPWVF$I(aL#zPP2ej9#9jVbH*d+5WT@WLAxg(*?QSQR8M zH(_w2O|-a;6&gcFlrw7M+G{n)*?Mn{b(J#J0z&;xLN8SUJGw5mfq1QvC~QAl@wxs# z7QlrlYuBz9vFZN4bs+R0ck05&bRa(=&E=GwA<-`4;JAioXVp7e;mf-f-PzXWaGF{X;0{mAORE4#eyu0P(v|(F zJ(lAmV(X%;`Hn8#xz&`Yo4%e_8ROcn$7v`0(4a<@M3=sFawvIv`_A^b22AA-j*sqU zB!n)fphE3kd3JfU`N;)Lmjy%v8_h+ms;h><4-3%SreB=SNpc>Q3XwW^&B7Mkz#F`p ziaWnFvnR>X?N5)+D<|J>GK2E8wv3u5eXN#U-kBHsoPqvD z>rLTWv1M>Dp)Kz{TI-t*JW~;BHid*8r~l>qK>;||V@+}klB+5D;Hi@t7Z&hB{h_iE z0ra;ir?tl>{-l+i?rtmczdJJtYTB6YH`1L?LSeLmro()ghwc=WTamL3n%Gq(CvVSz z|Edb~SlIh`x2qKVyk49oigK;d!b5H;DMNE z?VI~Px&7~Ty3?;MOINR&^b#A`hyX8&B~C!*D3&b8n?9S$OXYU{cKe%0wH(<;UZcX{ zb?#({OX9U&=_;Lw@UiLhIm{5di117m-O`wNw5!FNAYZK7D)`wyhU(%2Tk-d14>_zV ziKZS`Z*K{`^fS^v7jKy!-L=lqKO><@z*(90x{FE!#;E7$!1kCC)!T1-L-6I*Xl7>} z#>oFxi?FKstRcAVT?ErwdSi$thE}c3moq!0G~LrPr=Lhk#QVnX3L(M8;ffA;anPw) zwM9?I8WUDpdGq9mnPvDcVtE_P`|hm~e|7LYctPfBs(X7LJb^h5{Q!-J`6(wrx*Y1x zblWE}F2I6HyZX}yTWzeYtk-+&K|p6Dn=`#{onPH;vuz!|#8D#Uyjs zhGzSptZcldG!;Vsds$}j>mC?KeF!`#=Hu=vN>$1~;nyPlWAleqVw79WkO1keR_H{c zlwgho>Mtn5E}BDBtj^L+eM^{#BFx6R&6FgGxV>FWsttL7Tjt%0f&NDP-^30em+$lnS55lx zblh!QHST&S7An^^%ZL-bC3z^_t5a?BYZmeDm4Dd<#zIV%Y)oCqw? zTBynhCFCUyeafG~wDduJnLmBIx~U<`Rd;< zkI9AJ*l&ON4za?&+Yh^KgLfVq&evmLyx&d)e|-1#g-knnd7Wj;mnD$3gaQnHRGrCG zVd(aDRTJ6rmHqvDhr>+P)KoS^HmBkqWihmiL`)#eU`+d1x@STE9P#_Fj$4^BRQ4}& z(&Vs4`Vx1Ld~ZN*klAx5%A*YG?e%Tt2rvPqE(T#c=?%2!7egQKJiekhZ)WG~J)Q0Y zdzZhNI-gY0-a8-uk#3Aif6-zt$+7U7i6*8CInv;iRP-FjYlz9pF|0jwF=i1JY`-9H zXjMA&a`W+yN2lXzWb68|WIu{<)_Ff5O3EL6^PZ$4zn!FCu>}b<6G;Cnq~9E&>%i%3 z106VxZWILhUjx5LAb!|BoZ_dZEqDzD2y!2$kOCt)T=OH9EcBe!6GA(v(4 zG40<+`UaPrSv6J~ZZ4%X9;>#cUqnUHDUQDJrqIOms8Ia9bqMv}zdJ1ghxv-m&o_(~ zglm7hjmerySQ2%{`m1r3#dFd>@YJ!tqcANe8JJm1bU?6y_N$`REwBL9yT~|o*7m1N zfF|fGQ+#|k zsq8WO?Iaz>qDn3)c4RRGK};1HkN&^>dsDahW($>XBgGD?e9>qx=wS+_H2bszJh3ttNZ~SK!Hk5rw+=0 zMM1G@_Jfz~Y4DsNy_2Eir=*NU`9?0+np41^_>wo4=(pn(wzD{*_bGEGFos z_a{#V>m9pyT;ha^ze*ABIuDWSHeV~(ya#p)=_C2Ic}|S1&r&fX^~+(`=|^j(WqqXV zj&{6!1oWLXaRNHJWB1SY`c=NL2JG;|*`BByntx4W1CFETz1sF#CUlghns&H2&O@f| zPR&C(-13#b{O}%o2$gqb`9R)Vqd$RpR|o(M%!Bsn#rXb1Q!Ia?IW?;Vr!O_2kWsoV zn?Yx`+Qj%sb1TZnfJgHyH@2;&CH8VXSh5;un@N^kj%A<^ z7er`&9~pJ91||V&NjTjj;5mOxd~Q1VZ)cBf)xXcAGCEbc*-@=RaZ~F#=|N+iGhOMM zVTt-L?yCyt)X`6xFS$m|y`~KI%jgJEIJ&u%hmdyXGwLX1 z_M3X5J6V%ELZbGYN;$0~h?Z8WQa0-8WQm{~OI*Vi*3Whr_MqqpO}zx1-W>5kX1GL3 z?L3AgMJ^Tzo*%)X$TO&<0AbaUY0!}821_481Z%Y-<@K)U`YD}~Z!@;?j$!?`yK=2z zHp*1NrE}A8nG+k)xK7i_iB*7xZ2huk(#tF63 zolea8X1*{sdVA6@h?;Z=@Q=DQ9-;}fuAnBKFTn7A%W~yXT;Vo3r`bSd*ggHSPdA+o ze&F$-e3^@QrE1g#1qfi2AO+W2yRu~YnKWx}c35xTn|9tz4D6is8qxwyb#S+>CEh2{ zIXp{M=)6Lh`iIDHbimk!TFp}BiP*eIsCKOJOcHmv&RVx`gciem4GjWoEt3Vu3!{kdC6Wf1v2aN}&u)`MEwe(EA2$E6CODS^8 zHh+*F;aQp64DBMv<>V!kmY34l|7q5z{e%)jC7G{b6Fkv?koscGS#Mi(0rrjL3RX0i z{pS<=4aP}H35;OHK=%)_^YkXP-o@|hM0Ke}i)Y;i*$TT6Y-O^P)-2C(9OeX3A$hvZ zj@p>dIl#~IILIscI!`2^GO0a<0(YhrU89RS)GYRO6JClEJsfVH#k=N4Pk#D<2mdwE zm^hC{KdlML2d@>c8m1)98Jk7LUZ>No-c(P{))qE{?^b+~PxPZ@xwl4Ec*QRrvoNu% z;kaM%IU8m?HO-v0O4ZRC1C@ErxK#YZmsbinv=Z&9Q@WC&S~3evNRzsA z5&?{`B_LlP6O~P3n3*P<%}c5;jLnw=d3ju!rt*oyk2q*%Ut+KAe(4!a{Q$dEPFH>cZSEF9Opa?)g- zrqzR3+x8vM1pLiqh+%!#4u(a;S(tk8T|)r6p$kb&1Ksy_E-z z<%0k5AK8f5@E_IH56hBpy9VLZmht-w>AgBlLys5@3E=+*FZA6{TMf5E!ZnPb=m#e% z)1rx*Ro+ElD>U%a(IW4%b1&;j{31_8ZA` z_m9+?qpu-TH3g(6w9FImyqXDmxL8w0|4w_4RgImUVrd(bt7P6#`CVSxK4EVE1{RnN z1?fLIK>i7BrNi2Wr-sBlA%fJAPC_|O9yso)VAYb7ZBS%yKx17jKl55bX?HrA3A6MUYb{ zOQ@#gYDkDzx5Fk4aUlO+l%Na;JM^Ec^_*r^2jMh({_UYrRwUBSj6UB46@8XEgn3DY zrW@%|RYzcF64!GqTm>BU!HTr3rGP)_SrZ?@UyxrC1o9sL3>iHRY8fTJWdWBJ2rI_jU)mS4*_@T0b~@0!0%Wli*W3(EH1e}Tqg86^Hb9lgei1SbtKi^SXWL;EUS z7CoDW{8fkN?bjb$gS;x{|656rI>PrQ+GUxj3ikxe`cJr!Ew{d}ku2g9jJs!Rc7j{% zeopIYZddB$?-ST9R7v~;%=L^o8WDK0kveVk7!BM}clToY6I4^D^5nIoT3=ezaO?l1 z+E>VsN|a@Pu2+`ekLKt2W?zN%{g9MP3j5BfG-vAg6jNS%YKpakfpf^N>4fH|CQvy> z=DHuQ3FxncLu~7ofl5HMU=UzU_hDM^Kti8I0sKtq1dsWo=mELOa_5*6 z6|1FAe?F1vB1i9`@J5GcA0aJbutl^n+9#6}K2cH@G>%`z_N=jk{qH+;i4yL^x{SuK5o4;)ao6FkuZ@y-nh>L`LmYHzsVejbqrjxdv%P z(~~oP>-$m7V(W$BdCk(|q8k}$yNdTS9IKtB!w!M^301rrxD8oWZZU)vd|n1y-@`-J z^o&OD<{LW}3lX13>mXhperNNk{7P1SS8JISB4uUpjjJKzCzMVBUWj)QFGEg`ZJx?& z{rMJ{K~6Hc*j?9Scbu(RyCedAC#>xwsAeRK(_|(>0LVoG*f$wc>asPjVg4HwTq$296)%Fj%s}TVnG* zyo{EXtk@qr@GPbKomJLDvdJTJV*Ymb9w(fgCV!deER5z)lUt7VY$@%b`L3D$%lXK*ZGR*Z8 zo3oWX&z_%L>-$dur^(y-7ApN=QL@sMUb}x<%d_k9vyf8aLnk*k$l+qWDcDG{bzt)h z6rhUXjToS?2hNPMGedO55DzF?7ci`It5@XYGR76$E4@G%pl2Vsx00wGtQ@oApzBD( zC48CJbQuOl;=jd!^f{l@`H?*jr9Da#kvxmduE4hOB5sB2oD?F~mx$z{h&o0Dp(8W& zhnUX_%cZY$S}_u3(`pyD}$nJ$%)Y`ZPl1 zsl?|eg!ZfcHH&=5QF-*J>}>r6a;HqML0| zOdQjsHW}X22OF2v;y}(q9coNu1h)F0iduEZub&DjF3FsOJWhyO$0$tAYV?WL<(s7a z=GrL-IXBsYTKZQflCNKf&Qd4hw{ObPsr>u^PRsV>4{%~Hv0{~Gbb_0oh$YY{Zk{ov z;`#>}krTB@{6EtaADVczdiri*a!NNv_NK-76w7bp^28Skq8>4hHIcMCZpCM(&)X-845tJ$BgSorUx7+;m=>7G=I9Fj$ z=GOG}=liIag@Tk`rk*bf&Y`&J2Sc92x${VMk;^@2qNYU;WVjy-P1&O% zM(czdH>yw_)M|%I-TfFRo)}pdO~)ful{~a>6tZV{Lk{{Wzke0BE z!ZRBwE6kn5GW|CNXs7$+$;dqJC7BgYWukKx5#t7K^>9Ey_%QTo(_Gni)Bg+Gja_o3 zVNRhdu1>MbJHj}71yrfi%kRZsKU`e!eh`LRhn|g5DJme$w{jnCan;WXY32vq_Gh3Cmt$VCc-tIxpYtp$uOFu z;|q+GpWKVlz}4AKResGy8nbc2+|>Z7_hZ`1&@aK9H~c4t`j^Lpt@yoc`k9WOy9_7k zar?`|3xA5U`dO^puljZFGb@_*!JFxSoFXjuZXMtO7vZfX_1haiP9`-dhJr)9wl9WD3&WO}n@-HdZ1%pnkHF)oE7pUL@&%W$5~C*m|h zesR6fP6PLf_s)T`U_HIm*G`0*YHew_Vd*wP9z8}r0|RP?T9w2GvYbWi4I8{CNr+PO zBqhk!6KpNqe=8BSw0<>{DsIgqoDl!JjICfG-A9wtY+0n!1@A-?zEHvrJz|YG*++Ks zLp=RFd>`eiBYRo+5lR@)&@~4xw|$21AWmnNC5IA%CTYF}O>%^9QSka7tIZnxl$yK;3+0VBMSFhcSn^vtYE%4DmwJ85(zVKfGWPKtVPEhAp#p;mnFqg2n5K2k8 zIs+o5Q91O7(TrCoQ8~>Sz70hvFqVh?Rqki0BxY}!1poYOP~%zm++2eVjQ62cr}A?t8or3!AfjL(M-A1A?1W&vMZk z@Pfc1?Od2t(-MIF1f>m;On<}x^e|Yoxga^&*RZaMTF{)Kxyv<~nvXfTXp0|sUim!+<7>1+qq|q_Na+3 z(v^i=T$^Y_N_VNDhqAjO4VBTH0gK}oOLO@Cy+=9`wLz87Gk*aZK3E}W5{3=|K&__8 z{K)FDj?S4}iCa`j=ok03{&T0i-dZiJ*Kh$cqYk%e54pHax)u_@ z{_c)j3g66?93Jk#!Z(#sPTwDG{V;?I5#Uoz;`=&I(tC~It=y=vSf__#Akzf`5kpB_ z!>4Ig`d`Sy8CrjC%Ace@q|s{wsv)y&XuBj=b0xrq$Nlb!uV;8 zW=uDOxDakFq>X8~4&0inIR9}#;!G0dG*e*YZF|JgoE1~3l&PV)*4@7#>xdFT`aY-V=8e#2Yz{q#-}eEY#B;0Kdh(=x zgsQvD>fjK7B%-Y%+$*&ss;Cns;KIWAQAJk2t|@qGw^Yt4dMxuYniS5!$SBmTo*Pr8 z{$HC0GYrOOUmE#0>-VRp1daM3q^8EauwQI{DZqM$;-k7#%L451u^A|VqVql@j*{Bu zX{0_ApM8kQ&W$4Yiob^Y;$UuHUEMuChG{^E;)??|oC8+QjrnB@@6Bkr73QIn(&!DwGInzBO zUS(65=Ytn)FP)-wt890`j9xQf1gKiQKOf!ICca2<6)l>^UirapF;UPIN`vp*BJj;Ltbl zJ*&Gu)swR`fpl3w$T0bYAh&tk3}7 zItd6s+ZE;0k3UgSwM0Miwf_p^opE>8Aw%1v7+&E0EVSd~y^k#LJ8bOj$m?#QaG)Re zw_u|#2DG?S4}t_2NFzWWc~NFU*e}Yo9S_@xB}o*ktF6r(0Y0wo?lbqYQzn!S@a;Nd`^wkqYO1r8C3a z-tS5T-#g*rONYnDlZ`(=nG!?L#1vaczB#B9(VKdrHDOw8tev}T16L}Dt-W;u7@uC3@I$bf z^jSC;1DvjRuu&;nIEmWnSzWit$avv_T?V)>QquW^iIkwtLfJYR);lNUb6l??3+634 z`oA5B63lEwkYf`yPQ0|3ZHQmmXSKhXsDxV;yK4xt@IP!TD_hmXYh>heb4(jk;;36BUqA}Uq91 zt3mLe!$0};Wv0n%V>@7Xym0Yq@9L_#AjW=7GZu+j z2N;#0Mvh)Mgj&GI2O+!-Biq}9mfsQ1z;GS!%{0y^!9ecb)B5W!u<2s>b73}e2wsie zJa4BrDhU0;% zK-EdrcV%b zA*{}7k^lf7g^LcB*}jF}K`qbL$g{yg#;*18ya6Z~Ak%Vyr2PD*D&ob00H*MXBJnI& z`Mrx)FIneO^_8+57Q?}_=Am)mA=G-@CNp2#izQWAcW9PN_l%p_@Fq1@^|nef;&MVr z$?I>sq=#AA11s!*3K4SYQq}xzF6Dm~Dl0trelW8nBnqyPT}Ry5oH-k4`qoW&<>h>yj>f*Z3wm;C5Hr1NV#$N(3x||X^G@< z3CMr?Y_fo45en$EL-uo?uVBzSoE?~e2dn3a|3nkRdgbb=c7Y}+2Y#sy2!+#rdm-L< zT3_YAU)l)CTy;r9eTirxZ>I&dnhlhJ zX&5+T0ShNqmpmQ0(fUD=jQ)L2(2J!s;L^L91Ze-(x*3BeAr=6_4nzj*pEmJnOMzyL zDa3b|3i{b0V8;*((RV?t>#}P%+my)&WtOSuut}c{C|onVs3=B_kK-o^Ot}6}=->vD zn#4w7Kmon*t5OVJNX9x^-&Yc_=JN+!N=&|T2;Heiq@Y<;*Jro-KEpktH6V_!9kTxc zF=Ge^!UED12hV%;Rh{8ea;HNrJaJj^#od=36zAk)hMniu$Q<6%QtqqqtmaL2)+?3` zsscx42YJAsjQ!H?dFj7aQcQ|8B*(TaJ)gSDS|MY4;4P}!XY?BqM-3qnVMb3W!1|g ze*90NUiL#SRoN_{=CQjR1%(}p?Z(V#-}-27f|@0l&fxhLuZe}V4>sEP`1n`Pz!N^^ z|39X#fjbT^+D>evv2CYmY_s76jT+mw)woGxr?F;Y+qN2~aT@#0_ttuAy&sUt%)R$` zpS|gRS#uLeld)(haZQTZqKY_BoF`-6hb~ilqxXWUv0s<5uf>`O zD}zPbF2%V`YNNs|LJo4G)1Kp;1+C+B%uWPL6i-hsXw9*9E?d-8{P%Ia{~))!PnBu*KV8<@(P7_} zfhab7Xy6}evvSzG0s69Hv^cl)`nN4`*pxP`zxA0?s?Zv7y0aG`IE8ArC=nY(@dtD6 zt6Oh?&BV%D-!_yk_7VPS^>15U-H7G}Aaelu!{XTSUHVL_?Izv8N(hMu@n59f39JRw zR{S8EUu`s5OLb9lgX4|(Ejc>F2|-rpZoCi*Ek2zB6DR~W2CdALMyUbZ7QvZ>SE7?h zOb=z{5tp2|A@Lv&hob6oMqLP7S=I+NVXVu`JxZHM%{qAh5e9c%U}Y=z3BV%5+lrqI zYdpL0rFp1ZcA)L~KBNwj2)_=gv!Zlr+CSeU7)o1pH8g{&&U;y}O{&fSTY{&m%Q(j} zJHWZJ9gxtgg0edR;cEI>XUkGi8T4hZV5J7pR1<3a{`QTr#)xIvq3TSo?ipUYm>h6= z?Dm=TBBx`4&Q_^=5UftLF`hM3w-n53h~y)My%T_i?03V>W~w5s6iUchGA1~#Xk@UH zfD4sg8-lu*B4N*<&a>5izUgB&?qt8tw+{~`*H#^JH&eLcpxO`J*dQFaTGrKFG>XZ0 zSZmCOUSu|JVt(65cz>^vb)%5QfTn0UONLp~<%~gdkBPbe)Lxeq+J9fsLu5BS?N7iN z?r-T0Hy;E5^Y^8S*V+Hod1`K0`QaJ;-D_w&CkaPKQEDn)>(G!_GC9$Ym1Z4(;1cGR zyDmwIo^!P<0~5LHx9`HGexz~jJzyIPSxKTwpun0=~;ZYO3*uwSr#!U6%I$z1k+t{c-S_P2HeEF zX^o9Hm6eLzgZ_BK36%$Hguzj~O2QClG&KxEHGY8+Kx?X_} zu>qoVsoDc$q0wktJU$wv36F>h zqV53t*(cE)&TgGz6Uq~gtQ8QVETP>F7ntY&qYV1Dbm#nL*x32#tC7%2+V$ z?KPv2q*TCWeaX6K=L)besAi#$3}#gk-BG(cn<)JF9QyaO1sGU z!*(bhhmy#OANKV%W7pDY!)O&PE~-2}qMJ7$RMp8#%+1@|w;x&Ey&=?Q6D<8L)^vVb zvf3k}Dm_f^97rY*#Z`*fnT|8-jak$Nbx*b2_Z3RfDxdhozDiJY zglt7$&^wcMFT)D$Z&3;{pWQODmH92j{O1t(Z~S(4zxti(*Co=W6e%O=t#p5_re*9- zx}?+=W0HtO`qj=Hi^BNCe;fVhwQgFHotyj3aImYpxbmtUp>1nV^~gGLwN5OevVU>W zp7t9bIwi0^{29Iikmjd-vNYd00$PW0x8o9*FS8%~`!Ww#B^JYC2NmlQQpfPQ?-P_n zaE#oucb<#xd4IjuNF(QpReo{5;~`^s*f_nU()HH~t-Amb4h4Bi^&LkS7AT6K8#nsy z2P<;v=Gx(x80~&jQGPf*hC6h}mK_I(5FD;P)kHNqfWabL!AQI&+~G6xoLhf2=DbZw z(wV-iV>t7rF#;?L@@?ZXa-RZz!%1ab?)6is(p`YVoV0z|HtY|94%mHNjWLA+vG1la zg}&N+(hA6wuV^E(O8#!ZxT+-??n6eNjZ!y*bEd-c)m7=o)10~44VcCuHK=nC8Y6f? zSlv->iWR9hxiKW)qK*pAg>?hh4z4S7$J4yX8^6@pcskc;b5)2t)5xIco2CAv!r(Vb z*i}2D9tGVcK|i4yeCTwK$NaT=(-;HKX|bkci9+HOSRYpUcgiMwZT>84rH0Fjw_o)> z?(VG$2y>Jd(+O{(34ByF>9KejS&RM_mreGH3q0|nP!b09gPLGp1g57dG1|+OJ9ETx zGCuEw4XZy2(7;3ly6MGi3u2HJZuIf zCodKgYXKA#ushRJT=sNmNHvKa?N`_uf-D+Q_uTKQj&g!a;d4eO`$okg=?^Fe(_0?y z^H=bp?$9(%9GRZj_JKTTl@tvt?$#ic;WgDA->sw~#^7_RVQT7;GY@uh_i_ggvt7dO z*HO&`cnv6Kyf3z8)CI`FVgi6RDY#+vOE(btZ^;+ndPWaJFtXAOp z;^H}8s11FD+%aBVO>OP#K!@ilgGg@eW;hd*{NF(`vT1fA_hvDjBFyb~&ci;E$i1_Uce5mksVs z2d>TCOIV*I;Z&I4-d z8PZwr8!%$S=UP!+Lp@hnD2!RBsnT^Gd62Ulgj+FG1IpA&JDvG(2 z=#Za38TAu9NjnGH)h8azC24ma_~m|s6Qkqq1YjNtXPVqwHdPU?dT&GzjK#Au$0%%eVQMP?JBWsSmM^W$4|n47Hkw5IyRUA(+n+b3%kJrr0Odf;ck;@ zmyx4VVP(~7H3mRy>55Hr795P?*7R9Ie_M5Gqd?!@y+j5mjPd*_LNd_#C+Ust-xX2t zGDULD$=fpa2a{t5aqCE;`RI)6eeg|`TCvqM8h)=nsW+&dK}TFwnHr7rC}FrI(|X+1=={+0a4WBriZBC&cHqSQZswsk`n|0Eh3UQaQP$ku1IEtzxSpJwn9EjfPU!qf2;@^aSpXN~gBG*s54p zX4IF(Dy6zDW%b-VuivGrK-OA@?JxdaVInIZGVhvjCuPq(d%GI)m@KC*? zdkI32WoMX3l#cbkONU-OT}QO0PL>v!zl0&+i>617Yh_PQo4(q~8U-nwzr14XLyJ~q zpypX>rln5I&8Ro18;Joh)g#mtd5K6M%~j7D9>4y1M#7sKexE`-qXpU`?|PkJnT>ie zUB}6sv2>U2Dt)mv|w?wk8MYCedEM<%RIU|138 zt9=!YnH-ars{c_~=p&7F6zOx2@}x`kPUK}1CXg#UFdJtKuY>X2_66es&BHvE(66h# z6=H_Oz1Aj&wob3q80)d|Mlr^Ut4rBdgN{ZOU_O^vewZOITAWMpy^BQs`Fz336ttTp zrs)y3=svLEY?ZMw+7{FWII%FF@2B2D_W!N7SUD4C#x!(anl!4HXMxzg#&{#|$ZH_1 z^IL0Y2mQX4!|^L!Xpm5A%!7ABN&U&v|ZkRV`_e{(4E?CVT|y<-`?&% zuUT6H%?d(H$4d}?0QMViI8@b={HndjU05sTWq#)`MkF|S>jiox#>E|f%{M|L;VsR+ zVs@nYhELA<^)W4?xd-tijUb^&WO#I35}h(^2QQAzy$)brQ6H%oTji|^gGL{&r zT5YMTi^~@lRnLFsN{Mr=Scg_Kr6UZfr?1YNG?^y0TPoJ{e_pMLU(Oyw@3sAjqF}0tM!y4{6IaY_;R9M6LRb9bA;$O50zA0+$ffdx zvwcoz33s@!yRA;1f3gr27Y>&GPP8( z>Y7q^qDtKAp_e6Pu~OpJuyVAnLQkjK z+2FIa?+z-$wzpL()4hrF5Hl!8v&eTjnnr|9HoArEZa8cF`?h|Yvq9=;@wrvBqsqmo zowCwo8V8bV>pK3t*da^k#o@*MC%u`;gR8NX-2bSRVdvcuE^m<$;H#y7%O<($ST?XI z1Cer^L=g~{?>MiC-4WT9uf)MyU%`snD7(wDoSq{tA1BLI{jbXw1f`rI8?3z!4*1rZ zQ@EH=2zr?xUhHc3J2PswSDd{7ZRdeQtE=uV=+C+l?cPg1E;d@t^70K+XXh`mH3&1D z69TO#wA4br6-!a)Y*(Xr1MO`;Mu$09oYk8(ruX;XX~(&Q)nc_cR=qw;=8P`eyu zv$wm4iii96P{}@zj^^m+iVGsM9e@vGW6M?-!;!rMDFthZerrH5G1q+%D= zF1~xB_wd|hvUUejmNu;mI(a#x>a4n!rz;BWn>#W;$x_rtT;L#57^j569wR(-?mCRPskFZATVNDxJN^hBSLq@ zuk@sQq1C0`9F@}LrkQqr>5kL;uXfAY(fuz?MzEMql_m53`=7n@H2&Q9hW}Kb&>Fjg z?4)oJ(%!&^InStdw5;7OAnX}saO~OWJ4}fKvHrIxkfmYy|hC5Y4_~x_2eXZooe$RW~r$@Hf7e!HRm2(nh2!l zEfLz=7nfvP;1yDWm>_wyWHV_9f#hOazy~_CUccrDE>E$I1^dwE-O9P3AMpodkQ$v- zLywp1;1U^0bRstv$68z}ImPD~$T?d{{vI1T^z?`Z*hmgd<$ zS}vjo+-lxgjf4g1-&-Csll2Y_)8g)n$G8g;C7LZYTUM1~Ak>~h&}zXk&HoB`ZE5J1 zcU?lXAf7Biu&*3_K*HbFbm&I>@7Q!z%=ZQ60i*bQxypZEhknpRl6Uz&_!OT*>uPmU zIhF(NVopXGoVQghR=VP_6PW(3-w*6H_ko3178>sXiN#G^7Du&@3_O{=hIfH&Gmo>H zPf$k`lB5rgznbg}&ae6p%8J30-ED0`5a7pp3@k(jVR`wiKaCnfNO~B&#F9A)(JPcv z--4~mUo`r*jZVTe`o$z7i*Q;;y_N}%0DGYl5+bPXY`}?mx)DK~&p|%4gwyTVICE-f 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

r$`Pg+f~d0Y08fGK>t&Vwrl*fKTB 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 P_qV#TmQuBXW!V1%TLFzf literal 0 HcmV?d00001 diff --git a/textures/cellestial_border.png b/textures/cellestial_border.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc4a3bc77c527e7f69c884cf4432861153ca478 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP|(!V z#WBR9H`&C@?B96@#)QO#goFu`CMkJ;-kg43Vur@Xxs8p9R~iDD-FO?A#Msz8)+vcI ZFsLqL&&$oYW(zcc!PC{xWt~$(69Ck^BNYGu literal 0 HcmV?d00001 diff --git a/textures/cellestial_cell.png b/textures/cellestial_cell.png new file mode 100644 index 0000000000000000000000000000000000000000..75e67344fca1cd1c5b10f14faf9d2461dedc845c GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP|(2B z#WBR9H#sFE;m3Ig#)QNKAXuRuT&~Q_EUdcC*q}$sAnU*iMgxYEy}eI>I@E2MRc8GW R`vcU=;OXk;vd$@?2>{u1AbS7+ literal 0 HcmV?d00001 diff --git a/textures/cellestial_edge.png b/textures/cellestial_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..0c44dada216ee02982f40cf7aa8404ee72fad6e4 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP*BU$ z#WBR9H~G*1|NraRycks3KrDM<*KNiI20c;+SqD}y3LNmrEMsHXYA?Xcv1)fCP#1%z LtDnm{r-UW|vGyTw literal 0 HcmV?d00001 diff --git a/textures/cellestial_environment.png b/textures/cellestial_environment.png new file mode 100644 index 0000000000000000000000000000000000000000..800f7f6c1a81960500c7dc725b7ab387d9035862 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP*By= z#WBR9H#uQ}fPs+#5d2C1;lC`;P0cITAnU*i#>H#_oD2+SRxruzb1--e)WG2B>gTe~ HDWM4fbKxAN literal 0 HcmV?d00001 diff --git a/textures/cellestial_fertility.png b/textures/cellestial_fertility.png new file mode 100644 index 0000000000000000000000000000000000000000..3c230cd10de452352d5f2c405046f9c29fcc8114 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP*B~| z#WBR9H#sFE;m3Ig!39Se*xLU4Ou2dPfI-%Q6^x7792k_B-jrlm&C4dq$J4MHsD;7P L)z4*}Q$iB}FNz